summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
m---------3rdparty0
-rw-r--r--apps/encryption/js/encryption.js8
-rw-r--r--apps/encryption/js/settings-personal.js8
-rw-r--r--apps/encryption/l10n/th_TH.js2
-rw-r--r--apps/encryption/l10n/th_TH.json2
-rw-r--r--apps/encryption/lib/migration.php30
-rw-r--r--apps/encryption/tests/lib/MigrationTest.php37
-rw-r--r--apps/files/ajax/download.php11
-rw-r--r--apps/files/appinfo/application.php9
-rw-r--r--apps/files/appinfo/routes.php9
-rw-r--r--apps/files/css/detailsView.css55
-rw-r--r--apps/files/css/files.css30
-rw-r--r--apps/files/index.php6
-rw-r--r--apps/files/js/detailfileinfoview.js96
-rw-r--r--apps/files/js/detailsview.js251
-rw-r--r--apps/files/js/detailtabview.js136
-rw-r--r--apps/files/js/fileactions.js35
-rw-r--r--apps/files/js/filelist.js144
-rw-r--r--apps/files/js/files.js27
-rw-r--r--apps/files/js/mainfileinfodetailview.js98
-rw-r--r--apps/files/l10n/lt_LT.js12
-rw-r--r--apps/files/l10n/lt_LT.json12
-rw-r--r--apps/files/l10n/ro.js4
-rw-r--r--apps/files/l10n/ro.json4
-rw-r--r--apps/files/lib/capabilities.php37
-rw-r--r--apps/files/tests/js/detailsviewSpec.js105
-rw-r--r--apps/files/tests/js/favoritespluginspec.js2
-rw-r--r--apps/files/tests/js/fileactionsSpec.js4
-rw-r--r--apps/files/tests/js/filelistSpec.js56
-rw-r--r--apps/files/tests/js/mainfileinfodetailviewSpec.js104
-rw-r--r--apps/files_external/appinfo/application.php2
-rw-r--r--apps/files_external/appinfo/routes.php2
-rw-r--r--apps/files_external/controller/ajaxcontroller.php5
-rw-r--r--apps/files_external/lib/amazons3.php5
-rw-r--r--apps/files_external/lib/config.php19
-rw-r--r--apps/files_external/lib/dropbox.php5
-rw-r--r--apps/files_external/lib/google.php5
-rw-r--r--apps/files_external/lib/sftp.php18
-rw-r--r--apps/files_external/lib/sftp_key.php17
-rw-r--r--apps/files_external/lib/streamwrapper.php5
-rw-r--r--apps/files_external/lib/swift.php4
-rw-r--r--apps/files_sharing/appinfo/app.php1
-rw-r--r--apps/files_sharing/appinfo/application.php9
-rw-r--r--apps/files_sharing/appinfo/routes.php5
-rw-r--r--apps/files_sharing/css/authenticate.css1
-rw-r--r--apps/files_sharing/css/sharetabview.css3
-rw-r--r--apps/files_sharing/js/public.js3
-rw-r--r--apps/files_sharing/js/share.js4
-rw-r--r--apps/files_sharing/js/sharetabview.js67
-rw-r--r--apps/files_sharing/l10n/gl.js8
-rw-r--r--apps/files_sharing/l10n/gl.json8
-rw-r--r--apps/files_sharing/l10n/lt_LT.js1
-rw-r--r--apps/files_sharing/l10n/lt_LT.json1
-rw-r--r--apps/files_sharing/lib/cache.php4
-rw-r--r--apps/files_sharing/lib/capabilities.php32
-rw-r--r--apps/files_sharing/lib/propagation/recipientpropagator.php4
-rw-r--r--apps/files_sharing/lib/share/file.php26
-rw-r--r--apps/files_sharing/lib/sharedstorage.php4
-rw-r--r--apps/files_sharing/templates/authenticate.php3
-rw-r--r--apps/files_sharing/tests/capabilities.php7
-rw-r--r--apps/files_sharing/tests/etagpropagation.php19
-rw-r--r--apps/files_sharing/tests/js/appSpec.js2
-rw-r--r--apps/files_sharing/tests/sharedstorage.php39
-rw-r--r--apps/files_trashbin/appinfo/application.php37
-rw-r--r--apps/files_trashbin/appinfo/routes.php11
-rw-r--r--apps/files_trashbin/command/cleanup.php2
-rw-r--r--apps/files_trashbin/l10n/lt_LT.js1
-rw-r--r--apps/files_trashbin/l10n/lt_LT.json1
-rw-r--r--apps/files_trashbin/lib/capabilities.php22
-rw-r--r--apps/files_trashbin/lib/helper.php2
-rw-r--r--apps/files_trashbin/tests/command/cleanuptest.php2
-rw-r--r--apps/files_versions/appinfo/application.php37
-rw-r--r--apps/files_versions/appinfo/routes.php8
-rw-r--r--apps/files_versions/lib/capabilities.php25
-rw-r--r--apps/user_ldap/appinfo/update.php26
-rw-r--r--apps/user_ldap/lib/connection.php8
-rw-r--r--apps/user_ldap/lib/user/user.php8
-rw-r--r--apps/user_ldap/tests/integration/abstractintegrationtest.php137
-rw-r--r--apps/user_ldap/tests/integration/data/avatar-invalid.gifbin0 -> 48702 bytes
-rw-r--r--apps/user_ldap/tests/integration/data/avatar-valid.jpgbin0 -> 95495 bytes
-rw-r--r--apps/user_ldap/tests/integration/fakemanager.php33
-rw-r--r--apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php128
-rw-r--r--apps/user_ldap/tests/integration/lib/integrationtestuserhome.php159
-rw-r--r--apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php128
-rwxr-xr-xapps/user_ldap/tests/integration/run-test.sh2
-rw-r--r--apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php2
-rw-r--r--apps/user_ldap/user_ldap.php7
-rwxr-xr-xautotest.sh55
-rw-r--r--bower.json7
-rw-r--r--config/config.sample.php2
-rw-r--r--core/avatar/avatarcontroller.php8
-rw-r--r--core/command/db/converttype.php5
-rw-r--r--core/command/maintenance/install.php5
-rw-r--r--core/css/apps.css79
-rw-r--r--core/css/mobile.css4
-rw-r--r--core/css/styles.css8
-rw-r--r--core/js/apps.js20
-rw-r--r--core/js/core.json1
-rw-r--r--core/js/js.js36
-rw-r--r--core/js/oc-backbone.js12
-rw-r--r--core/js/setup.js5
-rw-r--r--core/js/share.js21
-rw-r--r--core/js/tests/specHelper.js2
-rw-r--r--core/js/tests/specs/shareSpec.js16
-rw-r--r--core/l10n/cs_CZ.js1
-rw-r--r--core/l10n/cs_CZ.json1
-rw-r--r--core/l10n/da.js1
-rw-r--r--core/l10n/da.json1
-rw-r--r--core/l10n/es.js1
-rw-r--r--core/l10n/es.json1
-rw-r--r--core/l10n/fi_FI.js1
-rw-r--r--core/l10n/fi_FI.json1
-rw-r--r--core/l10n/gl.js1
-rw-r--r--core/l10n/gl.json1
-rw-r--r--core/l10n/it.js1
-rw-r--r--core/l10n/it.json1
-rw-r--r--core/l10n/lt_LT.js13
-rw-r--r--core/l10n/lt_LT.json13
-rw-r--r--core/l10n/pt_BR.js1
-rw-r--r--core/l10n/pt_BR.json1
-rw-r--r--core/l10n/th_TH.js3
-rw-r--r--core/l10n/th_TH.json3
-rw-r--r--core/templates/installation.php3
-rw-r--r--core/templates/layout.base.php1
-rw-r--r--core/templates/layout.guest.php1
-rw-r--r--core/templates/layout.user.php1
-rw-r--r--core/vendor/.gitignore4
-rw-r--r--core/vendor/backbone/.bower.json33
-rw-r--r--core/vendor/backbone/LICENSE22
-rw-r--r--core/vendor/backbone/backbone.js1873
-rw-r--r--core/vendor/moment/.bower.json19
-rw-r--r--core/vendor/moment/LICENSE2
-rw-r--r--core/vendor/moment/min/moment-with-locales.js7547
-rw-r--r--core/vendor/underscore/.bower.json18
-rw-r--r--core/vendor/underscore/LICENSE2
-rw-r--r--core/vendor/underscore/underscore.js1307
-rw-r--r--db_structure.xml12
-rw-r--r--lib/base.php6
-rw-r--r--lib/l10n/ar.js10
-rw-r--r--lib/l10n/ar.json10
-rw-r--r--lib/l10n/ast.js12
-rw-r--r--lib/l10n/ast.json12
-rw-r--r--lib/l10n/az.js6
-rw-r--r--lib/l10n/az.json6
-rw-r--r--lib/l10n/bg_BG.js12
-rw-r--r--lib/l10n/bg_BG.json12
-rw-r--r--lib/l10n/ca.js12
-rw-r--r--lib/l10n/ca.json12
-rw-r--r--lib/l10n/cs_CZ.js12
-rw-r--r--lib/l10n/cs_CZ.json12
-rw-r--r--lib/l10n/cy_GB.js5
-rw-r--r--lib/l10n/cy_GB.json5
-rw-r--r--lib/l10n/da.js12
-rw-r--r--lib/l10n/da.json12
-rw-r--r--lib/l10n/de.js12
-rw-r--r--lib/l10n/de.json12
-rw-r--r--lib/l10n/de_DE.js12
-rw-r--r--lib/l10n/de_DE.json12
-rw-r--r--lib/l10n/el.js12
-rw-r--r--lib/l10n/el.json12
-rw-r--r--lib/l10n/en_GB.js12
-rw-r--r--lib/l10n/en_GB.json12
-rw-r--r--lib/l10n/eo.js6
-rw-r--r--lib/l10n/eo.json6
-rw-r--r--lib/l10n/es.js12
-rw-r--r--lib/l10n/es.json12
-rw-r--r--lib/l10n/es_AR.js7
-rw-r--r--lib/l10n/es_AR.json7
-rw-r--r--lib/l10n/es_MX.js7
-rw-r--r--lib/l10n/es_MX.json7
-rw-r--r--lib/l10n/et_EE.js21
-rw-r--r--lib/l10n/et_EE.json21
-rw-r--r--lib/l10n/eu.js12
-rw-r--r--lib/l10n/eu.json12
-rw-r--r--lib/l10n/fa.js7
-rw-r--r--lib/l10n/fa.json7
-rw-r--r--lib/l10n/fi_FI.js10
-rw-r--r--lib/l10n/fi_FI.json10
-rw-r--r--lib/l10n/fr.js12
-rw-r--r--lib/l10n/fr.json12
-rw-r--r--lib/l10n/gl.js12
-rw-r--r--lib/l10n/gl.json12
-rw-r--r--lib/l10n/hr.js12
-rw-r--r--lib/l10n/hr.json12
-rw-r--r--lib/l10n/hu_HU.js12
-rw-r--r--lib/l10n/hu_HU.json12
-rw-r--r--lib/l10n/id.js12
-rw-r--r--lib/l10n/id.json12
-rw-r--r--lib/l10n/it.js12
-rw-r--r--lib/l10n/it.json12
-rw-r--r--lib/l10n/ja.js12
-rw-r--r--lib/l10n/ja.json12
-rw-r--r--lib/l10n/ka_GE.js5
-rw-r--r--lib/l10n/ka_GE.json5
-rw-r--r--lib/l10n/km.js2
-rw-r--r--lib/l10n/km.json2
-rw-r--r--lib/l10n/ko.js12
-rw-r--r--lib/l10n/ko.json12
-rw-r--r--lib/l10n/lt_LT.js7
-rw-r--r--lib/l10n/lt_LT.json7
-rw-r--r--lib/l10n/lv.js7
-rw-r--r--lib/l10n/lv.json7
-rw-r--r--lib/l10n/mk.js2
-rw-r--r--lib/l10n/mk.json2
-rw-r--r--lib/l10n/nb_NO.js12
-rw-r--r--lib/l10n/nb_NO.json12
-rw-r--r--lib/l10n/nl.js12
-rw-r--r--lib/l10n/nl.json12
-rw-r--r--lib/l10n/pl.js12
-rw-r--r--lib/l10n/pl.json12
-rw-r--r--lib/l10n/pt_BR.js12
-rw-r--r--lib/l10n/pt_BR.json12
-rw-r--r--lib/l10n/pt_PT.js12
-rw-r--r--lib/l10n/pt_PT.json12
-rw-r--r--lib/l10n/ro.js8
-rw-r--r--lib/l10n/ro.json8
-rw-r--r--lib/l10n/ru.js12
-rw-r--r--lib/l10n/ru.json12
-rw-r--r--lib/l10n/sk_SK.js12
-rw-r--r--lib/l10n/sk_SK.json12
-rw-r--r--lib/l10n/sl.js12
-rw-r--r--lib/l10n/sl.json12
-rw-r--r--lib/l10n/sq.js5
-rw-r--r--lib/l10n/sq.json5
-rw-r--r--lib/l10n/sr.js12
-rw-r--r--lib/l10n/sr.json12
-rw-r--r--lib/l10n/sv.js12
-rw-r--r--lib/l10n/sv.json12
-rw-r--r--lib/l10n/th_TH.js12
-rw-r--r--lib/l10n/th_TH.json12
-rw-r--r--lib/l10n/tr.js12
-rw-r--r--lib/l10n/tr.json12
-rw-r--r--lib/l10n/uk.js12
-rw-r--r--lib/l10n/uk.json12
-rw-r--r--lib/l10n/zh_CN.js12
-rw-r--r--lib/l10n/zh_CN.json12
-rw-r--r--lib/l10n/zh_TW.js12
-rw-r--r--lib/l10n/zh_TW.json12
-rw-r--r--lib/private/api.php113
-rw-r--r--lib/private/app.php13
-rw-r--r--lib/private/appframework/dependencyinjection/dicontainer.php18
-rw-r--r--lib/private/appframework/http/request.php8
-rw-r--r--lib/private/capabilitiesmanager.php64
-rw-r--r--lib/private/connector/sabre/exceptionloggerplugin.php1
-rw-r--r--lib/private/connector/sabre/file.php3
-rw-r--r--lib/private/db.php2
-rw-r--r--lib/private/db/connectionfactory.php6
-rw-r--r--lib/private/db/mdb2schemamanager.php3
-rw-r--r--lib/private/db/querybuilder/querybuilder.php42
-rw-r--r--lib/private/defaults.php19
-rw-r--r--lib/private/files/cache/storage.php48
-rw-r--r--lib/private/files/mount/mountpoint.php7
-rw-r--r--lib/private/files/objectstore/objectstorestorage.php5
-rw-r--r--lib/private/files/storage/common.php21
-rw-r--r--lib/private/files/storage/dav.php5
-rw-r--r--lib/private/files/storage/local.php1
-rw-r--r--lib/private/files/storage/wrapper/availability.php462
-rw-r--r--lib/private/files/storage/wrapper/encryption.php9
-rw-r--r--lib/private/files/storage/wrapper/wrapper.php18
-rw-r--r--lib/private/files/view.php6
-rw-r--r--lib/private/installer.php4
-rw-r--r--lib/private/ocs.php145
-rw-r--r--lib/private/ocs/cloud.php9
-rw-r--r--lib/private/ocs/corecapabilities.php56
-rw-r--r--lib/private/ocs/exception.php (renamed from lib/private/db/mssqlmigrator.php)17
-rw-r--r--lib/private/ocs/result.php45
-rw-r--r--lib/private/route/router.php6
-rw-r--r--lib/private/security/crypto.php17
-rw-r--r--lib/private/server.php17
-rw-r--r--lib/private/setup.php63
-rw-r--r--lib/private/setup/abstractdatabase.php47
-rw-r--r--lib/private/setup/mssql.php203
-rw-r--r--lib/private/setup/mysql.php187
-rw-r--r--lib/private/setup/oci.php38
-rw-r--r--lib/private/setup/postgresql.php40
-rw-r--r--lib/private/share/share.php4
-rw-r--r--lib/private/template.php4
-rw-r--r--lib/private/util.php11
-rw-r--r--lib/public/appframework/http/ocsresponse.php28
-rw-r--r--lib/public/appframework/iappcontainer.php7
-rw-r--r--lib/public/appframework/ocscontroller.php11
-rw-r--r--lib/public/capabilities/icapability.php46
-rw-r--r--lib/public/db/querybuilder/iquerybuilder.php9
-rw-r--r--lib/public/files/storage.php20
-rw-r--r--lib/public/iservercontainer.php1
-rw-r--r--lib/repair/cleantags.php12
-rw-r--r--lib/repair/filletags.php2
-rw-r--r--ocs/v1.php2
-rw-r--r--ocs/v2.php22
-rw-r--r--settings/admin.php7
-rw-r--r--settings/application.php3
-rw-r--r--settings/controller/certificatecontroller.php34
-rw-r--r--settings/css/settings.css6
-rw-r--r--settings/js/admin.js7
-rw-r--r--settings/js/personal.js34
-rw-r--r--settings/js/users/filter.js57
-rw-r--r--settings/js/users/groups.js6
-rw-r--r--settings/js/users/users.js12
-rw-r--r--settings/l10n/ar.js1
-rw-r--r--settings/l10n/ar.json1
-rw-r--r--settings/l10n/ast.js1
-rw-r--r--settings/l10n/ast.json1
-rw-r--r--settings/l10n/az.js1
-rw-r--r--settings/l10n/az.json1
-rw-r--r--settings/l10n/bg_BG.js1
-rw-r--r--settings/l10n/bg_BG.json1
-rw-r--r--settings/l10n/bs.js1
-rw-r--r--settings/l10n/bs.json1
-rw-r--r--settings/l10n/ca.js4
-rw-r--r--settings/l10n/ca.json4
-rw-r--r--settings/l10n/cs_CZ.js11
-rw-r--r--settings/l10n/cs_CZ.json11
-rw-r--r--settings/l10n/da.js10
-rw-r--r--settings/l10n/da.json10
-rw-r--r--settings/l10n/de.js6
-rw-r--r--settings/l10n/de.json6
-rw-r--r--settings/l10n/de_DE.js6
-rw-r--r--settings/l10n/de_DE.json6
-rw-r--r--settings/l10n/el.js6
-rw-r--r--settings/l10n/el.json6
-rw-r--r--settings/l10n/en_GB.js2
-rw-r--r--settings/l10n/en_GB.json2
-rw-r--r--settings/l10n/eo.js1
-rw-r--r--settings/l10n/eo.json1
-rw-r--r--settings/l10n/es.js11
-rw-r--r--settings/l10n/es.json11
-rw-r--r--settings/l10n/es_AR.js1
-rw-r--r--settings/l10n/es_AR.json1
-rw-r--r--settings/l10n/es_MX.js1
-rw-r--r--settings/l10n/es_MX.json1
-rw-r--r--settings/l10n/et_EE.js2
-rw-r--r--settings/l10n/et_EE.json2
-rw-r--r--settings/l10n/eu.js1
-rw-r--r--settings/l10n/eu.json1
-rw-r--r--settings/l10n/fa.js1
-rw-r--r--settings/l10n/fa.json1
-rw-r--r--settings/l10n/fi_FI.js9
-rw-r--r--settings/l10n/fi_FI.json9
-rw-r--r--settings/l10n/fr.js8
-rw-r--r--settings/l10n/fr.json8
-rw-r--r--settings/l10n/gl.js13
-rw-r--r--settings/l10n/gl.json13
-rw-r--r--settings/l10n/hr.js1
-rw-r--r--settings/l10n/hr.json1
-rw-r--r--settings/l10n/hu_HU.js1
-rw-r--r--settings/l10n/hu_HU.json1
-rw-r--r--settings/l10n/id.js6
-rw-r--r--settings/l10n/id.json6
-rw-r--r--settings/l10n/it.js11
-rw-r--r--settings/l10n/it.json11
-rw-r--r--settings/l10n/ja.js2
-rw-r--r--settings/l10n/ja.json2
-rw-r--r--settings/l10n/ko.js11
-rw-r--r--settings/l10n/ko.json11
-rw-r--r--settings/l10n/lt_LT.js1
-rw-r--r--settings/l10n/lt_LT.json1
-rw-r--r--settings/l10n/mk.js1
-rw-r--r--settings/l10n/mk.json1
-rw-r--r--settings/l10n/nb_NO.js6
-rw-r--r--settings/l10n/nb_NO.json6
-rw-r--r--settings/l10n/nl.js6
-rw-r--r--settings/l10n/nl.json6
-rw-r--r--settings/l10n/nn_NO.js1
-rw-r--r--settings/l10n/nn_NO.json1
-rw-r--r--settings/l10n/oc.js1
-rw-r--r--settings/l10n/oc.json1
-rw-r--r--settings/l10n/pl.js1
-rw-r--r--settings/l10n/pl.json1
-rw-r--r--settings/l10n/pt_BR.js11
-rw-r--r--settings/l10n/pt_BR.json11
-rw-r--r--settings/l10n/pt_PT.js1
-rw-r--r--settings/l10n/pt_PT.json1
-rw-r--r--settings/l10n/ro.js1
-rw-r--r--settings/l10n/ro.json1
-rw-r--r--settings/l10n/ru.js6
-rw-r--r--settings/l10n/ru.json6
-rw-r--r--settings/l10n/sk_SK.js6
-rw-r--r--settings/l10n/sk_SK.json6
-rw-r--r--settings/l10n/sl.js2
-rw-r--r--settings/l10n/sl.json2
-rw-r--r--settings/l10n/sr.js6
-rw-r--r--settings/l10n/sr.json6
-rw-r--r--settings/l10n/sv.js1
-rw-r--r--settings/l10n/sv.json1
-rw-r--r--settings/l10n/th_TH.js12
-rw-r--r--settings/l10n/th_TH.json12
-rw-r--r--settings/l10n/tr.js6
-rw-r--r--settings/l10n/tr.json6
-rw-r--r--settings/l10n/uk.js1
-rw-r--r--settings/l10n/uk.json1
-rw-r--r--settings/l10n/zh_CN.js2
-rw-r--r--settings/l10n/zh_CN.json2
-rw-r--r--settings/l10n/zh_TW.js1
-rw-r--r--settings/l10n/zh_TW.json1
-rw-r--r--settings/personal.php18
-rw-r--r--settings/templates/admin.php38
-rw-r--r--settings/templates/personal.php4
-rw-r--r--settings/templates/users/part.createuser.php3
-rw-r--r--tests/core/avatar/avatarcontrollertest.php21
-rw-r--r--tests/lib/appframework/controller/OCSControllerTest.php12
-rw-r--r--tests/lib/appframework/http/OCSResponseTest.php5
-rw-r--r--tests/lib/appframework/http/RequestTest.php95
-rw-r--r--tests/lib/appframework/utility/SimpleContainerTest.php6
-rw-r--r--tests/lib/capabilitiesmanager.php164
-rw-r--r--tests/lib/db/mdb2schemamanager.php4
-rw-r--r--tests/lib/db/migrator.php6
-rw-r--r--tests/lib/db/querybuilder/querybuildertest.php98
-rw-r--r--tests/lib/dbschema.php3
-rw-r--r--tests/lib/files/cache/watcher.php3
-rw-r--r--tests/lib/files/mount/mountpoint.php21
-rw-r--r--tests/lib/files/pathverificationtest.php4
-rw-r--r--tests/lib/files/storage/wrapper/availability.php149
-rw-r--r--tests/lib/files/storage/wrapper/encryption.php8
-rw-r--r--tests/lib/files/view.php63
-rw-r--r--tests/lib/repair/cleantags.php34
-rw-r--r--tests/lib/server.php4
-rw-r--r--tests/lib/setup.php35
-rw-r--r--tests/lib/share/searchresultsorter.php7
-rw-r--r--tests/lib/share/share.php4
-rw-r--r--tests/ocs/response.php42
-rw-r--r--tests/settings/controller/CertificateControllerTest.php25
-rw-r--r--themes/example/defaults.php6
422 files changed, 11848 insertions, 6240 deletions
diff --git a/3rdparty b/3rdparty
-Subproject c45d817921543d2f0562ac4f3be61404b1d4a35
+Subproject b94f7d38f6e13825fd34c7113827d3c369a689a
diff --git a/apps/encryption/js/encryption.js b/apps/encryption/js/encryption.js
index a6c1bea89b2..361347b44b7 100644
--- a/apps/encryption/js/encryption.js
+++ b/apps/encryption/js/encryption.js
@@ -5,15 +5,11 @@
* See the COPYING-README file.
*/
-if (!OC.Encryption) {
- OC.Encryption = {};
-}
-
/**
* @namespace
* @memberOf OC
*/
-OC.Encryption = {
+OC.Encryption = _.extend(OC.Encryption || {}, {
displayEncryptionWarning: function () {
if (!OC.currentUser || !OC.Notification.isHidden()) {
return;
@@ -28,7 +24,7 @@ OC.Encryption = {
}
);
}
-};
+});
$(document).ready(function() {
// wait for other apps/extensions to register their event handlers and file actions
// in the "ready" clause
diff --git a/apps/encryption/js/settings-personal.js b/apps/encryption/js/settings-personal.js
index fa94bea6bc5..75ebab5059c 100644
--- a/apps/encryption/js/settings-personal.js
+++ b/apps/encryption/js/settings-personal.js
@@ -4,11 +4,7 @@
* See the COPYING-README file.
*/
-if (!OC.Encryption) {
- OC.Encryption = {};
-}
-
-OC.Encryption = {
+OC.Encryption = _.extend(OC.Encryption || {}, {
updatePrivateKeyPassword: function () {
var oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val();
var newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val();
@@ -26,7 +22,7 @@ OC.Encryption = {
OC.msg.finishedError('#ocDefaultEncryptionModule .msg', JSON.parse(jqXHR.responseText).message);
});
}
-};
+});
$(document).ready(function () {
diff --git a/apps/encryption/l10n/th_TH.js b/apps/encryption/l10n/th_TH.js
index 0d4b3eaebbb..d6a2d00d123 100644
--- a/apps/encryption/l10n/th_TH.js
+++ b/apps/encryption/l10n/th_TH.js
@@ -40,7 +40,7 @@ OC.L10N.register(
"ownCloud basic encryption module" : "ownCloud โมดูลการเข้ารหัสขั้นพื้นฐาน",
"Your private key password no longer matches your log-in password." : "รหัสการเข้ารหัสผ่านส่วนตัวของคุณไม่ตรงกับรหัสผ่านในการเข้าสู่ระบบของคุณ",
"Set your old private key password to your current log-in password:" : "ตั้งรหัสการเข้ารหัสผ่านส่วนตัวเก่าของคุณเพื่อเข้าสู่ระบบในปัจจุบันของคุณ:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "ถ้าคุณลืมรหัสผ่านเก่าของคุณคุณสามารถขอให้ผู้ดูแลระบบกู้คืนไฟล์ของคุณ",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "ถ้าคุณลืมรหัสผ่านเก่าของคุณ คุณสามารถขอให้ผู้ดูแลระบบกู้คืนไฟล์ของคุณ",
"Old log-in password" : "เข้าสู่ระบบด้วยรหัสผ่านเก่า",
"Current log-in password" : "เข้าสู่ระบบด้วยรหัสผ่านปัจจุบัน",
"Update Private Key Password" : "อัพเดทรหัสการเข้ารหัสผ่านส่วนตัว",
diff --git a/apps/encryption/l10n/th_TH.json b/apps/encryption/l10n/th_TH.json
index 3546042dee9..5c904340983 100644
--- a/apps/encryption/l10n/th_TH.json
+++ b/apps/encryption/l10n/th_TH.json
@@ -38,7 +38,7 @@
"ownCloud basic encryption module" : "ownCloud โมดูลการเข้ารหัสขั้นพื้นฐาน",
"Your private key password no longer matches your log-in password." : "รหัสการเข้ารหัสผ่านส่วนตัวของคุณไม่ตรงกับรหัสผ่านในการเข้าสู่ระบบของคุณ",
"Set your old private key password to your current log-in password:" : "ตั้งรหัสการเข้ารหัสผ่านส่วนตัวเก่าของคุณเพื่อเข้าสู่ระบบในปัจจุบันของคุณ:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "ถ้าคุณลืมรหัสผ่านเก่าของคุณคุณสามารถขอให้ผู้ดูแลระบบกู้คืนไฟล์ของคุณ",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "ถ้าคุณลืมรหัสผ่านเก่าของคุณ คุณสามารถขอให้ผู้ดูแลระบบกู้คืนไฟล์ของคุณ",
"Old log-in password" : "เข้าสู่ระบบด้วยรหัสผ่านเก่า",
"Current log-in password" : "เข้าสู่ระบบด้วยรหัสผ่านปัจจุบัน",
"Update Private Key Password" : "อัพเดทรหัสการเข้ารหัสผ่านส่วนตัว",
diff --git a/apps/encryption/lib/migration.php b/apps/encryption/lib/migration.php
index 789f5f77757..5396a7db627 100644
--- a/apps/encryption/lib/migration.php
+++ b/apps/encryption/lib/migration.php
@@ -37,9 +37,10 @@ class Migration {
private $connection;
/** @var IConfig */
private $config;
-
/** @var ILogger */
private $logger;
+ /** @var string*/
+ protected $installedVersion;
/**
* @param IConfig $config
@@ -54,6 +55,7 @@ class Migration {
$this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
$this->config = $config;
$this->logger = $logger;
+ $this->installedVersion = $this->config->getAppValue('files_encryption', 'installed_version', '-1');
}
public function finalCleanUp() {
@@ -66,12 +68,16 @@ class Migration {
* update file cache, copy unencrypted_size to the 'size' column
*/
private function updateFileCache() {
- $query = $this->connection->getQueryBuilder();
- $query->update('*PREFIX*filecache')
- ->set('size', 'unencrypted_size')
- ->where($query->expr()->eq('encrypted', $query->createParameter('encrypted')))
- ->setParameter('encrypted', 1);
- $query->execute();
+ // make sure that we don't update the file cache multiple times
+ // only update during the first run
+ if ($this->installedVersion !== '-1') {
+ $query = $this->connection->getQueryBuilder();
+ $query->update('filecache')
+ ->set('size', 'unencrypted_size')
+ ->where($query->expr()->eq('encrypted', $query->createParameter('encrypted')))
+ ->setParameter('encrypted', 1);
+ $query->execute();
+ }
}
/**
@@ -144,6 +150,12 @@ class Migration {
*/
public function updateDB() {
+ // make sure that we don't update the file cache multiple times
+ // only update during the first run
+ if ($this->installedVersion === '-1') {
+ return;
+ }
+
// delete left-over from old encryption which is no longer needed
$this->config->deleteAppValue('files_encryption', 'ocsid');
$this->config->deleteAppValue('files_encryption', 'types');
@@ -151,7 +163,7 @@ class Migration {
$oldAppValues = $this->connection->getQueryBuilder();
$oldAppValues->select('*')
- ->from('*PREFIX*appconfig')
+ ->from('appconfig')
->where($oldAppValues->expr()->eq('appid', $oldAppValues->createParameter('appid')))
->setParameter('appid', 'files_encryption');
$appSettings = $oldAppValues->execute();
@@ -166,7 +178,7 @@ class Migration {
$oldPreferences = $this->connection->getQueryBuilder();
$oldPreferences->select('*')
- ->from('*PREFIX*preferences')
+ ->from('preferences')
->where($oldPreferences->expr()->eq('appid', $oldPreferences->createParameter('appid')))
->setParameter('appid', 'files_encryption');
$preferenceSettings = $oldPreferences->execute();
diff --git a/apps/encryption/tests/lib/MigrationTest.php b/apps/encryption/tests/lib/MigrationTest.php
index a05418c5f26..bb1f0a310a2 100644
--- a/apps/encryption/tests/lib/MigrationTest.php
+++ b/apps/encryption/tests/lib/MigrationTest.php
@@ -291,12 +291,12 @@ class MigrationTest extends \Test\TestCase {
/** @var \OCP\IDBConnection $connection */
$connection = \OC::$server->getDatabaseConnection();
$query = $connection->getQueryBuilder();
- $query->delete('*PREFIX*appconfig')
+ $query->delete('appconfig')
->where($query->expr()->eq('appid', $query->createParameter('appid')))
->setParameter('appid', 'encryption');
$query->execute();
$query = $connection->getQueryBuilder();
- $query->delete('*PREFIX*preferences')
+ $query->delete('preferences')
->where($query->expr()->eq('appid', $query->createParameter('appid')))
->setParameter('appid', 'encryption');
$query->execute();
@@ -306,12 +306,13 @@ class MigrationTest extends \Test\TestCase {
$this->prepareDB();
$m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection(), $this->logger);
+ $this->invokePrivate($m, 'installedVersion', ['0.7']);
$m->updateDB();
- $this->verifyDB('*PREFIX*appconfig', 'files_encryption', 0);
- $this->verifyDB('*PREFIX*preferences', 'files_encryption', 0);
- $this->verifyDB('*PREFIX*appconfig', 'encryption', 3);
- $this->verifyDB('*PREFIX*preferences', 'encryption', 1);
+ $this->verifyDB('appconfig', 'files_encryption', 0);
+ $this->verifyDB('preferences', 'files_encryption', 0);
+ $this->verifyDB('appconfig', 'encryption', 3);
+ $this->verifyDB('preferences', 'encryption', 1);
}
@@ -325,19 +326,20 @@ class MigrationTest extends \Test\TestCase {
$config->setUserValue(self::TEST_ENCRYPTION_MIGRATION_USER1, 'encryption', 'recoverKeyEnabled', '9');
$m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection(), $this->logger);
+ $this->invokePrivate($m, 'installedVersion', ['0.7']);
$m->updateDB();
- $this->verifyDB('*PREFIX*appconfig', 'files_encryption', 0);
- $this->verifyDB('*PREFIX*preferences', 'files_encryption', 0);
- $this->verifyDB('*PREFIX*appconfig', 'encryption', 3);
- $this->verifyDB('*PREFIX*preferences', 'encryption', 1);
+ $this->verifyDB('appconfig', 'files_encryption', 0);
+ $this->verifyDB('preferences', 'files_encryption', 0);
+ $this->verifyDB('appconfig', 'encryption', 3);
+ $this->verifyDB('preferences', 'encryption', 1);
// check if the existing values where overwritten correctly
/** @var \OC\DB\Connection $connection */
$connection = \OC::$server->getDatabaseConnection();
$query = $connection->getQueryBuilder();
$query->select('configvalue')
- ->from('*PREFIX*appconfig')
+ ->from('appconfig')
->where($query->expr()->andX(
$query->expr()->eq('appid', $query->createParameter('appid')),
$query->expr()->eq('configkey', $query->createParameter('configkey'))
@@ -351,7 +353,7 @@ class MigrationTest extends \Test\TestCase {
$query = $connection->getQueryBuilder();
$query->select('configvalue')
- ->from('*PREFIX*preferences')
+ ->from('preferences')
->where($query->expr()->andX(
$query->expr()->eq('appid', $query->createParameter('appid')),
$query->expr()->eq('configkey', $query->createParameter('configkey')),
@@ -388,6 +390,7 @@ class MigrationTest extends \Test\TestCase {
public function testUpdateFileCache() {
$this->prepareFileCache();
$m = new Migration(\OC::$server->getConfig(), new \OC\Files\View(), \OC::$server->getDatabaseConnection(), $this->logger);
+ $this->invokePrivate($m, 'installedVersion', ['0.7']);
self::invokePrivate($m, 'updateFileCache');
// check results
@@ -396,7 +399,7 @@ class MigrationTest extends \Test\TestCase {
$connection = \OC::$server->getDatabaseConnection();
$query = $connection->getQueryBuilder();
$query->select('*')
- ->from('*PREFIX*filecache');
+ ->from('filecache');
$result = $query->execute();
$entries = $result->fetchAll();
foreach($entries as $entry) {
@@ -414,15 +417,15 @@ class MigrationTest extends \Test\TestCase {
/** @var \OCP\IDBConnection $connection */
$connection = \OC::$server->getDatabaseConnection();
$query = $connection->getQueryBuilder();
- $query->delete('*PREFIX*filecache');
+ $query->delete('filecache');
$query->execute();
$query = $connection->getQueryBuilder();
$result = $query->select('fileid')
- ->from('*PREFIX*filecache')
+ ->from('filecache')
->setMaxResults(1)->execute()->fetchAll();
$this->assertEmpty($result);
$query = $connection->getQueryBuilder();
- $query->insert('*PREFIX*filecache')
+ $query->insert('filecache')
->values(
array(
'storage' => $query->createParameter('storage'),
@@ -444,7 +447,7 @@ class MigrationTest extends \Test\TestCase {
}
$query = $connection->getQueryBuilder();
$result = $query->select('fileid')
- ->from('*PREFIX*filecache')
+ ->from('filecache')
->execute()->fetchAll();
$this->assertSame(19, count($result));
}
diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php
index e67635ab853..26bab8837b4 100644
--- a/apps/files/ajax/download.php
+++ b/apps/files/ajax/download.php
@@ -39,4 +39,15 @@ if (!is_array($files_list)) {
$files_list = array($files);
}
+/**
+ * this sets a cookie to be able to recognize the start of the download
+ * the content must not be longer than 32 characters and must only contain
+ * alphanumeric characters
+ */
+if(isset($_GET['downloadStartSecret'])
+ && !isset($_GET['downloadStartSecret'][32])
+ && preg_match('!^[a-zA-Z0-9]+$!', $_GET['downloadStartSecret']) === 1) {
+ setcookie('ocDownloadStarted', $_GET['downloadStartSecret'], time() + 20, '/');
+}
+
OC_Files::get($dir, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD');
diff --git a/apps/files/appinfo/application.php b/apps/files/appinfo/application.php
index c8aaf375d96..6ba77e09556 100644
--- a/apps/files/appinfo/application.php
+++ b/apps/files/appinfo/application.php
@@ -1,6 +1,5 @@
<?php
/**
- * @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Tobias Kaminsky <tobias@kaminsky.me>
* @author Vincent Petry <pvince81@owncloud.com>
@@ -21,8 +20,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-
-namespace OCA\Files\Appinfo;
+namespace OCA\Files\AppInfo;
use OCA\Files\Controller\ApiController;
use OCP\AppFramework\App;
@@ -68,5 +66,10 @@ class Application extends App {
$homeFolder
);
});
+
+ /*
+ * Register capabilities
+ */
+ $container->registerCapability('OCA\Files\Capabilities');
}
}
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php
index 5aa52f17a29..d1b8954d5ce 100644
--- a/apps/files/appinfo/routes.php
+++ b/apps/files/appinfo/routes.php
@@ -1,9 +1,9 @@
<?php
/**
* @author Bart Visscher <bartv@thisnet.nl>
- * @author Joas Schilling <nickvergessen@owncloud.com>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Tobias Kaminsky <tobias@kaminsky.me>
* @author Tom Needham <tom@owncloud.com>
* @author Vincent Petry <pvince81@owncloud.com>
@@ -24,8 +24,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-
-namespace OCA\Files\Appinfo;
+namespace OCA\Files\AppInfo;
$application = new Application();
$application->registerRoutes(
@@ -82,6 +81,4 @@ $this->create('files_ajax_upload', 'ajax/upload.php')
$this->create('download', 'download{file}')
->requirements(array('file' => '.*'))
->actionInclude('files/download.php');
-
-// Register with the capabilities API
-\OCP\API::register('get', '/cloud/capabilities', array('OCA\Files\Capabilities', 'getCapabilities'), 'files', \OCP\API::USER_AUTH);
+
diff --git a/apps/files/css/detailsView.css b/apps/files/css/detailsView.css
new file mode 100644
index 00000000000..76629cb790f
--- /dev/null
+++ b/apps/files/css/detailsView.css
@@ -0,0 +1,55 @@
+#app-sidebar .detailFileInfoContainer {
+ min-height: 50px;
+ padding: 15px;
+}
+
+#app-sidebar .detailFileInfoContainer > div {
+ clear: both;
+}
+
+#app-sidebar .mainFileInfoView {
+ margin-right: 20px; /* accomodate for close icon */
+}
+
+#app-sidebar .thumbnail {
+ width: 50px;
+ height: 50px;
+ float: left;
+ margin-right: 10px;
+ background-size: 50px;
+}
+
+#app-sidebar .ellipsis {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+#app-sidebar .fileName {
+ font-size: 16px;
+ padding-top: 3px;
+}
+
+#app-sidebar .file-details {
+ margin-top: 3px;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ opacity: .5;
+}
+#app-sidebar .action-favorite {
+ vertical-align: text-bottom;
+ padding: 10px;
+ margin: -10px;
+}
+
+#app-sidebar .detailList {
+ float: left;
+}
+
+#app-sidebar .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 15px;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+ opacity: .5;
+}
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index e4bf791761d..7e3318a962b 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -103,6 +103,10 @@
min-height: 100%;
}
+.app-files #app-content {
+ overflow-x: hidden;
+}
+
/* icons for sidebar */
.nav-icon-files {
background-image: url('../img/folder.svg');
@@ -143,6 +147,7 @@
#filestable tbody tr:active {
background-color: rgb(240,240,240);
}
+#filestable tbody tr.highlighted,
#filestable tbody tr.selected {
background-color: rgb(230,230,230);
}
@@ -583,14 +588,23 @@ a.action>img {
#fileList tr:focus a.action,
#fileList a.action.permanent,
#fileList tr:hover a.action.no-permission:hover,
-#fileList tr:focus a.action.no-permission:focus
-/*#fileList .name:focus .action*/ {
+#fileList tr:focus a.action.no-permission:focus,
+/*#fileList .name:focus .action,*/
+/* also enforce the low opacity for disabled links that are hovered/focused */
+.ie8 #fileList a.action.disabled:hover img,
+#fileList tr:hover a.action.disabled:hover,
+#fileList tr:focus a.action.disabled:focus,
+#fileList .name:focus a.action.disabled:focus,
+#fileList a.action.disabled img {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
filter: alpha(opacity=50);
opacity: .5;
display:inline;
}
.ie8 #fileList a.action:hover img,
+#fileList tr a.action.disabled.action-download,
+#fileList tr:hover a.action.disabled.action-download:hover,
+#fileList tr:focus a.action.disabled.action-download:focus,
#fileList tr:hover a.action:hover,
#fileList tr:focus a.action:focus,
#fileList .name:focus a.action:focus {
@@ -599,6 +613,18 @@ a.action>img {
opacity: 1;
display:inline;
}
+#fileList tr a.action.disabled {
+ background: none;
+}
+
+#selectedActionsList a.download.disabled,
+#fileList tr a.action.action-download.disabled {
+ color: #000000;
+}
+
+#fileList tr:hover a.action.disabled:hover * {
+ cursor: default;
+}
.summary {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
diff --git a/apps/files/index.php b/apps/files/index.php
index 4f103f975cb..dca3e5ae74d 100644
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -50,6 +50,12 @@ OCP\Util::addscript('files', 'search');
\OCP\Util::addScript('files', 'tagsplugin');
\OCP\Util::addScript('files', 'favoritesplugin');
+\OCP\Util::addScript('files', 'detailfileinfoview');
+\OCP\Util::addScript('files', 'detailtabview');
+\OCP\Util::addScript('files', 'mainfileinfodetailview');
+\OCP\Util::addScript('files', 'detailsview');
+\OCP\Util::addStyle('files', 'detailsView');
+
\OC_Util::addVendorScript('core', 'handlebars/handlebars');
OCP\App::setActiveNavigationEntry('files_index');
diff --git a/apps/files/js/detailfileinfoview.js b/apps/files/js/detailfileinfoview.js
new file mode 100644
index 00000000000..9a88b5e2d8a
--- /dev/null
+++ b/apps/files/js/detailfileinfoview.js
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+ /**
+ * @class OCA.Files.DetailFileInfoView
+ * @classdesc
+ *
+ * Displays a block of details about the file info.
+ *
+ */
+ var DetailFileInfoView = function() {
+ this.initialize();
+ };
+ /**
+ * @memberof OCA.Files
+ */
+ DetailFileInfoView.prototype = {
+ /**
+ * jQuery element
+ */
+ $el: null,
+
+ _template: null,
+
+ /**
+ * Currently displayed file info
+ *
+ * @type OCA.Files.FileInfo
+ */
+ _fileInfo: null,
+
+ /**
+ * Initialize the details view
+ */
+ initialize: function() {
+ this.$el = $('<div class="detailFileInfoView"></div>');
+ },
+
+ /**
+ * returns the jQuery object for HTML output
+ *
+ * @returns {jQuery}
+ */
+ get$: function() {
+ return this.$el;
+ },
+
+ /**
+ * Destroy / uninitialize this instance.
+ */
+ destroy: function() {
+ if (this.$el) {
+ this.$el.remove();
+ }
+ },
+
+ /**
+ * Renders this details view
+ *
+ * @abstract
+ */
+ render: function() {
+ // to be implemented in subclass
+ },
+
+ /**
+ * Sets the file info to be displayed in the view
+ *
+ * @param {OCA.Files.FileInfo} fileInfo file info to set
+ */
+ setFileInfo: function(fileInfo) {
+ this._fileInfo = fileInfo;
+ this.render();
+ },
+
+ /**
+ * Returns the file info.
+ *
+ * @return {OCA.Files.FileInfo} file info
+ */
+ getFileInfo: function() {
+ return this._fileInfo;
+ }
+ };
+
+ OCA.Files.DetailFileInfoView = DetailFileInfoView;
+})();
+
diff --git a/apps/files/js/detailsview.js b/apps/files/js/detailsview.js
new file mode 100644
index 00000000000..7b7bd013f9e
--- /dev/null
+++ b/apps/files/js/detailsview.js
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+
+ var TEMPLATE =
+ '<div>' +
+ ' <div class="detailFileInfoContainer">' +
+ ' </div>' +
+ ' <div>' +
+ ' <ul class="tabHeaders">' +
+ ' </ul>' +
+ ' <div class="tabsContainer">' +
+ ' </div>' +
+ ' </div>' +
+ ' <a class="close icon-close" href="#" alt="{{closeLabel}}"></a>' +
+ '</div>';
+
+ var TEMPLATE_TAB_HEADER =
+ '<li class="tabHeader {{#if selected}}selected{{/if}}" data-tabid="{{tabId}}" data-tabindex="{{tabIndex}}"><a href="#">{{label}}</a></li>';
+
+ /**
+ * @class OCA.Files.DetailsView
+ * @classdesc
+ *
+ * The details view show details about a selected file.
+ *
+ */
+ var DetailsView = function() {
+ this.initialize();
+ };
+
+ /**
+ * @memberof OCA.Files
+ */
+ DetailsView.prototype = {
+
+ /**
+ * jQuery element
+ */
+ $el: null,
+
+ _template: null,
+ _templateTabHeader: null,
+
+ /**
+ * Currently displayed file info
+ *
+ * @type OCA.Files.FileInfo
+ */
+ _fileInfo: null,
+
+ /**
+ * List of detail tab views
+ *
+ * @type Array<OCA.Files.DetailTabView>
+ */
+ _tabViews: [],
+
+ /**
+ * List of detail file info views
+ *
+ * @type Array<OCA.Files.DetailFileInfoView>
+ */
+ _detailFileInfoViews: [],
+
+ /**
+ * Id of the currently selected tab
+ *
+ * @type string
+ */
+ _currentTabId: null,
+
+ /**
+ * Initialize the details view
+ */
+ initialize: function() {
+ this.$el = $('<div id="app-sidebar"></div>');
+ this.fileInfo = null;
+ this._tabViews = [];
+ this._detailFileInfoViews = [];
+
+ this.$el.on('click', 'a.close', function(event) {
+ OC.Apps.hideAppSidebar();
+ event.preventDefault();
+ });
+
+ this.$el.on('click', '.tabHeaders .tabHeader', _.bind(this._onClickTab, this));
+
+ // uncomment to add some dummy tabs for testing
+ //this._addTestTabs();
+ },
+
+ /**
+ * Destroy / uninitialize this instance.
+ */
+ destroy: function() {
+ if (this.$el) {
+ this.$el.remove();
+ }
+ },
+
+ _onClickTab: function(e) {
+ var $target = $(e.target);
+ if (!$target.hasClass('tabHeader')) {
+ $target = $target.closest('.tabHeader');
+ }
+ var tabIndex = $target.attr('data-tabindex');
+ var targetTab;
+ if (_.isUndefined(tabIndex)) {
+ return;
+ }
+
+ this.$el.find('.tabsContainer .tab').addClass('hidden');
+ targetTab = this._tabViews[tabIndex];
+ targetTab.$el.removeClass('hidden');
+
+ this.$el.find('.tabHeaders li').removeClass('selected');
+ $target.addClass('selected');
+
+ e.preventDefault();
+ },
+
+ _addTestTabs: function() {
+ for (var j = 0; j < 2; j++) {
+ var testView = new OCA.Files.DetailTabView('testtab' + j);
+ testView.index = j;
+ testView.getLabel = function() { return 'Test tab ' + this.index; };
+ testView.render = function() {
+ this.$el.empty();
+ for (var i = 0; i < 100; i++) {
+ this.$el.append('<div>Test tab ' + this.index + ' row ' + i + '</div>');
+ }
+ };
+ this._tabViews.push(testView);
+ }
+ },
+
+ /**
+ * Renders this details view
+ */
+ render: function() {
+ var self = this;
+ this.$el.empty();
+
+ if (!this._template) {
+ this._template = Handlebars.compile(TEMPLATE);
+ }
+
+ if (!this._templateTabHeader) {
+ this._templateTabHeader = Handlebars.compile(TEMPLATE_TAB_HEADER);
+ }
+
+ var $el = $(this._template({
+ closeLabel: t('files', 'Close')
+ }));
+ var $tabsContainer = $el.find('.tabsContainer');
+ var $tabHeadsContainer = $el.find('.tabHeaders');
+ var $detailsContainer = $el.find('.detailFileInfoContainer');
+
+ // render details
+ _.each(this._detailFileInfoViews, function(detailView) {
+ $detailsContainer.append(detailView.get$());
+ });
+
+ if (this._tabViews.length > 0) {
+ if (!this._currentTab) {
+ this._currentTab = this._tabViews[0].getId();
+ }
+
+ // render tabs
+ _.each(this._tabViews, function(tabView, i) {
+ // hidden by default
+ var $el = tabView.get$();
+ var isCurrent = (tabView.getId() === self._currentTab);
+ if (!isCurrent) {
+ $el.addClass('hidden');
+ }
+ $tabsContainer.append($el);
+
+ $tabHeadsContainer.append(self._templateTabHeader({
+ tabId: tabView.getId(),
+ tabIndex: i,
+ label: tabView.getLabel(),
+ selected: isCurrent
+ }));
+ });
+ }
+
+ // TODO: select current tab
+
+ this.$el.append($el);
+ },
+
+ /**
+ * Sets the file info to be displayed in the view
+ *
+ * @param {OCA.Files.FileInfo} fileInfo file info to set
+ */
+ setFileInfo: function(fileInfo) {
+ this._fileInfo = fileInfo;
+
+ this.render();
+
+ // notify all panels
+ _.each(this._tabViews, function(tabView) {
+ tabView.setFileInfo(fileInfo);
+ });
+ _.each(this._detailFileInfoViews, function(detailView) {
+ detailView.setFileInfo(fileInfo);
+ });
+ },
+
+ /**
+ * Returns the file info.
+ *
+ * @return {OCA.Files.FileInfo} file info
+ */
+ getFileInfo: function() {
+ return this._fileInfo;
+ },
+
+ /**
+ * Adds a tab in the tab view
+ *
+ * @param {OCA.Files.DetailTabView} tab view
+ */
+ addTabView: function(tabView) {
+ this._tabViews.push(tabView);
+ },
+
+ /**
+ * Adds a detail view for file info.
+ *
+ * @param {OCA.Files.DetailFileInfoView} detail view
+ */
+ addDetailView: function(detailView) {
+ this._detailFileInfoViews.push(detailView);
+ }
+ };
+
+ OCA.Files.DetailsView = DetailsView;
+})();
+
diff --git a/apps/files/js/detailtabview.js b/apps/files/js/detailtabview.js
new file mode 100644
index 00000000000..b9b1dda2ccc
--- /dev/null
+++ b/apps/files/js/detailtabview.js
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+
+ /**
+ * @class OCA.Files.DetailTabView
+ * @classdesc
+ *
+ * Base class for tab views to display file information.
+ *
+ */
+ var DetailTabView = function(id) {
+ this.initialize(id);
+ };
+
+ /**
+ * @memberof OCA.Files
+ */
+ DetailTabView.prototype = {
+ /**
+ * jQuery element
+ */
+ $el: null,
+
+ /**
+ * Tab id
+ */
+ _id: null,
+
+ /**
+ * Tab label
+ */
+ _label: null,
+
+ _template: null,
+
+ /**
+ * Currently displayed file info
+ *
+ * @type OCA.Files.FileInfo
+ */
+ _fileInfo: null,
+
+ /**
+ * Initialize the details view
+ *
+ * @param {string} id tab id
+ */
+ initialize: function(id) {
+ if (!id) {
+ throw 'Argument "id" is required';
+ }
+ this._id = id;
+ this.$el = $('<div class="tab"></div>');
+ this.$el.attr('data-tabid', id);
+ },
+
+ /**
+ * Destroy / uninitialize this instance.
+ */
+ destroy: function() {
+ if (this.$el) {
+ this.$el.remove();
+ }
+ },
+
+ /**
+ * Returns the tab element id
+ *
+ * @return {string} tab id
+ */
+ getId: function() {
+ return this._id;
+ },
+
+ /**
+ * Returns the tab label
+ *
+ * @return {String} label
+ */
+ getLabel: function() {
+ return 'Tab ' + this._id;
+ },
+
+ /**
+ * returns the jQuery object for HTML output
+ *
+ * @returns {jQuery}
+ */
+ get$: function() {
+ return this.$el;
+ },
+
+ /**
+ * Renders this details view
+ *
+ * @abstract
+ */
+ render: function() {
+ // to be implemented in subclass
+ // FIXME: code is only for testing
+ this.$el.empty();
+ this.$el.append('<div>Hello ' + this._id + '</div>');
+ },
+
+ /**
+ * Sets the file info to be displayed in the view
+ *
+ * @param {OCA.Files.FileInfo} fileInfo file info to set
+ */
+ setFileInfo: function(fileInfo) {
+ this._fileInfo = fileInfo;
+ this.render();
+ },
+
+ /**
+ * Returns the file info.
+ *
+ * @return {OCA.Files.FileInfo} file info
+ */
+ getFileInfo: function() {
+ return this._fileInfo;
+ }
+ };
+
+ OCA.Files.DetailTabView = DetailTabView;
+})();
+
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 1956fda0077..8dd26d71c3e 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -478,8 +478,21 @@
}, function (filename, context) {
var dir = context.dir || context.fileList.getCurrentDirectory();
var url = context.fileList.getDownloadUrl(filename, dir);
+
+ var downloadFileaction = $(context.$file).find('.fileactions .action-download');
+
+ // don't allow a second click on the download action
+ if(downloadFileaction.hasClass('disabled')) {
+ return;
+ }
+
if (url) {
- OC.redirect(url);
+ var disableLoadingState = function(){
+ OCA.Files.FileActions.updateFileActionSpinner(downloadFileaction, false);
+ };
+
+ OCA.Files.FileActions.updateFileActionSpinner(downloadFileaction, true);
+ OCA.Files.Files.handleDownload(url, disableLoadingState);
}
}, t('files', 'Download'));
}
@@ -488,6 +501,26 @@
OCA.Files.FileActions = FileActions;
/**
+ * Replaces the download icon with a loading spinner and vice versa
+ * - also adds the class disabled to the passed in element
+ *
+ * @param downloadButtonElement download fileaction
+ * @param {boolean} showIt whether to show the spinner(true) or to hide it(false)
+ */
+ OCA.Files.FileActions.updateFileActionSpinner = function(downloadButtonElement, showIt) {
+ var icon = downloadButtonElement.find('img'),
+ sourceImage = icon.attr('src');
+
+ if(showIt) {
+ downloadButtonElement.addClass('disabled');
+ icon.attr('src', sourceImage.replace('actions/download.svg', 'loading-small.gif'));
+ } else {
+ downloadButtonElement.removeClass('disabled');
+ icon.attr('src', sourceImage.replace('loading-small.gif', 'actions/download.svg'));
+ }
+ };
+
+ /**
* File action attributes.
*
* @todo make this a real class in the future
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 8236ef3b4ac..f5629ecd2c3 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -23,6 +23,7 @@
* @param [options.scrollContainer] scrollable container, defaults to $(window)
* @param [options.dragOptions] drag options, disabled by default
* @param [options.folderDropOptions] folder drop options, disabled by default
+ * @param [options.detailsViewEnabled=true] whether to enable details view
*/
var FileList = function($el, options) {
this.initialize($el, options);
@@ -65,6 +66,11 @@
fileSummary: null,
/**
+ * @type OCA.Files.DetailsView
+ */
+ _detailsView: null,
+
+ /**
* Whether the file list was initialized already.
* @type boolean
*/
@@ -205,6 +211,13 @@
}
this.breadcrumb = new OCA.Files.BreadCrumb(breadcrumbOptions);
+ if (_.isUndefined(options.detailsViewEnabled) || options.detailsViewEnabled) {
+ this._detailsView = new OCA.Files.DetailsView();
+ this._detailsView.addDetailView(new OCA.Files.MainFileInfoDetailView());
+ this._detailsView.$el.insertBefore(this.$el);
+ this._detailsView.$el.addClass('disappear');
+ }
+
this.$el.find('#controls').prepend(this.breadcrumb.$el);
this.$el.find('thead th .columntitle').click(_.bind(this._onClickHeader, this));
@@ -216,6 +229,13 @@
this.updateSearch();
+ this.$el.on('click', function(event) {
+ var $target = $(event.target);
+ // click outside file row ?
+ if (!$target.closest('tbody').length && !$target.closest('#app-sidebar').length) {
+ self._updateDetailsView(null);
+ }
+ });
this.$fileList.on('click','td.filename>a.name', _.bind(this._onClickFile, this));
this.$fileList.on('change', 'td.filename>.selectCheckBox', _.bind(this._onClickFileCheckbox, this));
this.$el.on('urlChanged', _.bind(this._onUrlChanged, this));
@@ -263,6 +283,37 @@
},
/**
+ * Update the details view to display the given file
+ *
+ * @param {OCA.Files.FileInfo} fileInfo file info to display
+ */
+ _updateDetailsView: function(fileInfo) {
+ if (!this._detailsView) {
+ return;
+ }
+
+ var self = this;
+ var oldFileInfo = this._detailsView.getFileInfo();
+ if (oldFileInfo) {
+ // TODO: use more efficient way, maybe track the highlight
+ this.$fileList.children().filterAttr('data-id', '' + oldFileInfo.id).removeClass('highlighted');
+ }
+
+ if (!fileInfo) {
+ OC.Apps.hideAppSidebar();
+ this._detailsView.setFileInfo(null);
+ return;
+ }
+
+ this.$fileList.children().filterAttr('data-id', '' + fileInfo.id).addClass('highlighted');
+ this._detailsView.setFileInfo(_.extend({
+ path: this.getCurrentDirectory()
+ }, fileInfo));
+ this._detailsView.$el.scrollTop(0);
+ _.defer(OC.Apps.showAppSidebar);
+ },
+
+ /**
* Event handler for when the window size changed
*/
_onResize: function() {
@@ -315,6 +366,12 @@
delete this._selectedFiles[$tr.data('id')];
this._selectionSummary.remove(data);
}
+ if (this._selectionSummary.getTotal() === 1) {
+ this._updateDetailsView(_.values(this._selectedFiles)[0]);
+ } else {
+ // show nothing when multiple files are selected
+ this._updateDetailsView(null);
+ }
this.$el.find('.select-all').prop('checked', this._selectionSummary.getTotal() === this.files.length);
},
@@ -350,27 +407,34 @@
this._selectFileEl($tr, !$checkbox.prop('checked'));
this.updateSelectionSummary();
} else {
- var filename = $tr.attr('data-file');
- var renaming = $tr.data('renaming');
- if (!renaming) {
- this.fileActions.currentFile = $tr.find('td');
- var mime = this.fileActions.getCurrentMimeType();
- var type = this.fileActions.getCurrentType();
- var permissions = this.fileActions.getCurrentPermissions();
- var action = this.fileActions.getDefault(mime,type, permissions);
- if (action) {
- event.preventDefault();
- // also set on global object for legacy apps
- window.FileActions.currentFile = this.fileActions.currentFile;
- action(filename, {
- $file: $tr,
- fileList: this,
- fileActions: this.fileActions,
- dir: $tr.attr('data-path') || this.getCurrentDirectory()
- });
+ // clicked directly on the name
+ if (!this._detailsView || $(event.target).is('.nametext') || $(event.target).closest('.nametext').length) {
+ var filename = $tr.attr('data-file');
+ var renaming = $tr.data('renaming');
+ if (!renaming) {
+ this.fileActions.currentFile = $tr.find('td');
+ var mime = this.fileActions.getCurrentMimeType();
+ var type = this.fileActions.getCurrentType();
+ var permissions = this.fileActions.getCurrentPermissions();
+ var action = this.fileActions.getDefault(mime,type, permissions);
+ if (action) {
+ event.preventDefault();
+ // also set on global object for legacy apps
+ window.FileActions.currentFile = this.fileActions.currentFile;
+ action(filename, {
+ $file: $tr,
+ fileList: this,
+ fileActions: this.fileActions,
+ dir: $tr.attr('data-path') || this.getCurrentDirectory()
+ });
+ }
+ // deselect row
+ $(event.target).closest('a').blur();
}
- // deselect row
- $(event.target).closest('a').blur();
+ } else {
+ var fileInfo = this.files[$tr.index()];
+ this._updateDetailsView(fileInfo);
+ event.preventDefault();
}
}
},
@@ -417,7 +481,21 @@
else {
files = _.pluck(this.getSelectedFiles(), 'name');
}
- OC.redirect(this.getDownloadUrl(files, dir));
+
+ var downloadFileaction = $('#selectedActionsList').find('.download');
+
+ // don't allow a second click on the download action
+ if(downloadFileaction.hasClass('disabled')) {
+ event.preventDefault();
+ return;
+ }
+
+ var disableLoadingState = function(){
+ OCA.Files.FileActions.updateFileActionSpinner(downloadFileaction, false);
+ };
+
+ OCA.Files.FileActions.updateFileActionSpinner(downloadFileaction, true);
+ OCA.Files.Files.handleDownload(this.getDownloadUrl(files, dir), disableLoadingState);
return false;
},
@@ -811,7 +889,7 @@
var formatted;
var text;
if (mtime > 0) {
- formatted = formatDate(mtime);
+ formatted = OC.Util.formatDate(mtime);
text = OC.Util.relativeModifiedDate(mtime);
} else {
formatted = t('files', 'Unable to determine date');
@@ -1225,6 +1303,12 @@
ready(iconURL); // set mimeicon URL
urlSpec.file = OCA.Files.Files.fixPath(path);
+ if (options.x) {
+ urlSpec.x = options.x;
+ }
+ if (options.y) {
+ urlSpec.y = options.y;
+ }
if (etag){
// use etag as cache buster
@@ -1507,6 +1591,7 @@
tr.remove();
tr = self.add(fileInfo, {updateSummary: false, silent: true});
self.$fileList.trigger($.Event('fileActionsReady', {fileList: self, $files: $(tr)}));
+ self._updateDetailsView(fileInfo);
}
});
} else {
@@ -1663,6 +1748,7 @@
}
this.$table.addClass('hidden');
+ this.$el.find('#emptycontent').addClass('hidden');
$mask = $('<div class="mask transparent"></div>');
@@ -2162,6 +2248,20 @@
}
});
+ },
+
+ /**
+ * Register a tab view to be added to all views
+ */
+ registerTabView: function(tabView) {
+ this._detailsView.addTabView(tabView);
+ },
+
+ /**
+ * Register a detail view to be added to all views
+ */
+ registerDetailView: function(detailView) {
+ this._detailsView.addDetailView(detailView);
}
};
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 034045ee40b..19cc3b26e44 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -271,8 +271,33 @@
FileList.scrollTo(getURLParameter('scrollto'));
}
*/
+ },
+
+ /**
+ * Handles the download and calls the callback function once the download has started
+ * - browser sends download request and adds parameter with a token
+ * - server notices this token and adds a set cookie to the download response
+ * - browser now adds this cookie for the domain
+ * - JS periodically checks for this cookie and then knows when the download has started to call the callback
+ *
+ * @param {string} url download URL
+ * @param {function} callback function to call once the download has started
+ */
+ handleDownload: function(url, callback) {
+ var randomToken = Math.random().toString(36).substring(2),
+ checkForDownloadCookie = function() {
+ if (!OC.Util.isCookieSetToValue('ocDownloadStarted', randomToken)){
+ return false;
+ } else {
+ callback();
+ return true;
+ }
+ };
+
+ OC.redirect(url + '&downloadStartSecret=' + randomToken);
+ OC.Util.waitFor(checkForDownloadCookie, 500);
}
- }
+ };
Files._updateStorageStatisticsDebounced = _.debounce(Files._updateStorageStatistics, 250);
OCA.Files.Files = Files;
diff --git a/apps/files/js/mainfileinfodetailview.js b/apps/files/js/mainfileinfodetailview.js
new file mode 100644
index 00000000000..a00d907d0d6
--- /dev/null
+++ b/apps/files/js/mainfileinfodetailview.js
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+ var TEMPLATE =
+ '<div class="thumbnail"></div><div title="{{name}}" class="fileName ellipsis">{{name}}</div>' +
+ '<div class="file-details ellipsis">' +
+ ' <a href="#" ' +
+ ' alt="{{starAltText}}"' +
+ ' class="action action-favorite favorite">' +
+ ' <img class="svg" src="{{starIcon}}" />' +
+ ' </a>' +
+ ' <span class="size" title="{{altSize}}">{{size}}</span>, <span class="date" title="{{altDate}}">{{date}}</span>' +
+ '</div>';
+
+ /**
+ * @class OCA.Files.MainFileInfoDetailView
+ * @classdesc
+ *
+ * Displays main details about a file
+ *
+ */
+ var MainFileInfoDetailView = function() {
+ this.initialize();
+ };
+ /**
+ * @memberof OCA.Files
+ */
+ MainFileInfoDetailView.prototype = _.extend({}, OCA.Files.DetailFileInfoView.prototype,
+ /** @lends OCA.Files.MainFileInfoDetailView.prototype */ {
+ _template: null,
+
+ /**
+ * Initialize the details view
+ */
+ initialize: function() {
+ this.$el = $('<div class="mainFileInfoView"></div>');
+ },
+
+ /**
+ * Renders this details view
+ */
+ render: function() {
+ this.$el.empty();
+
+ if (!this._template) {
+ this._template = Handlebars.compile(TEMPLATE);
+ }
+
+ if (this._fileInfo) {
+ var isFavorite = (this._fileInfo.tags || []).indexOf(OC.TAG_FAVORITE) >= 0;
+ this.$el.append(this._template({
+ nameLabel: t('files', 'Name'),
+ name: this._fileInfo.name,
+ pathLabel: t('files', 'Path'),
+ path: this._fileInfo.path,
+ sizeLabel: t('files', 'Size'),
+ size: OC.Util.humanFileSize(this._fileInfo.size, true),
+ altSize: n('files', '%n byte', '%n bytes', this._fileInfo.size),
+ dateLabel: t('files', 'Modified'),
+ altDate: OC.Util.formatDate(this._fileInfo.mtime),
+ date: OC.Util.relativeModifiedDate(this._fileInfo.mtime),
+ starAltText: isFavorite ? t('files', 'Favorited') : t('files', 'Favorite'),
+ starIcon: OC.imagePath('core', isFavorite ? 'actions/starred' : 'actions/star')
+ }));
+
+ // TODO: we really need OC.Previews
+ var $iconDiv = this.$el.find('.thumbnail');
+ if (this._fileInfo.mimetype !== 'httpd/unix-directory') {
+ // TODO: inject utility class?
+ FileList.lazyLoadPreview({
+ path: this._fileInfo.path + '/' + this._fileInfo.name,
+ mime: this._fileInfo.mimetype,
+ etag: this._fileInfo.etag,
+ x: 50,
+ y: 50,
+ callback: function(previewUrl) {
+ $iconDiv.css('background-image', 'url("' + previewUrl + '")');
+ }
+ });
+ } else {
+ // TODO: special icons / shared / external
+ $iconDiv.css('background-image', 'url("' + OC.MimeType.getIconUrl('dir') + '")');
+ }
+ this.$el.find('[title]').tooltip({placement: 'bottom'});
+ }
+ }
+ });
+
+ OCA.Files.MainFileInfoDetailView = MainFileInfoDetailView;
+})();
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index 376e0d84f67..2106a985350 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -42,15 +42,19 @@ OC.L10N.register(
"Delete" : "Ištrinti",
"Disconnect storage" : "Atjungti saugyklą",
"Unshare" : "Nebesidalinti",
+ "No permission to delete" : "Neturite leidimų ištrinti",
"Download" : "Atsisiųsti",
"Select" : "Pasirinkiti",
"Pending" : "Laukiantis",
"Unable to determine date" : "Nepavyksta nustatyti datos",
+ "This operation is forbidden" : "Ši operacija yra uždrausta",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi",
"Error moving file." : "Klaida perkeliant failą.",
"Error moving file" : "Klaida perkeliant failą",
"Error" : "Klaida",
"Could not rename file" : "Neįmanoma pervadinti failo",
"Error deleting file." : "Klaida trinant failą.",
+ "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“",
"Name" : "Pavadinimas",
"Size" : "Dydis",
"Modified" : "Pakeista",
@@ -60,13 +64,18 @@ OC.L10N.register(
"_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"],
"\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas failo pavadinime.",
"File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} saugykla yra pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
"Your storage is full, files can not be updated or synced anymore!" : "Jūsų visa vieta serveryje užimta",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} saugykla yra beveik pilna ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
+ "_matches '{filter}'_::_match '{filter}'_" : ["atitikmuo „{filter}“","atitikmenys „{filter}“","atitikmenų „{filter}“"],
"{dirs} and {files}" : "{dirs} ir {files}",
"Favorited" : "Pažymėta mėgstamu",
"Favorite" : "Mėgiamas",
+ "An error occurred while trying to update the tags" : "Bandant atnaujinti žymes įvyko klaida",
"A new file or folder has been <strong>created</strong>" : "Naujas failas ar aplankas buvo <strong>sukurtas</strong>",
"A file or folder has been <strong>changed</strong>" : "Failas ar aplankas buvo <strong>pakeistas</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Riboti pranešimus apie sukūrimą ir pokyčius jūsų <strong>mėgiamuose failuose</strong> <em>(Tik srautas)</em>",
"A file or folder has been <strong>deleted</strong>" : "Failas ar aplankas buvo <strong>ištrintas</strong>",
"A file or folder has been <strong>restored</strong>" : "Failas ar aplankas buvo <strong>atkurtas</strong>",
"You created %1$s" : "Jūs sukūrėte %1$s",
@@ -85,6 +94,7 @@ OC.L10N.register(
"Maximum upload size" : "Maksimalus įkeliamo failo dydis",
"max. possible: " : "maks. galima:",
"Save" : "Išsaugoti",
+ "Can not be edited from here due to insufficient permissions." : "Negali būti redaguojamas iš čia dėl leidimų trūkumo.",
"Settings" : "Nustatymai",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>",
@@ -95,7 +105,9 @@ OC.L10N.register(
"Folder" : "Katalogas",
"Upload" : "Įkelti",
"Cancel upload" : "Atšaukti siuntimą",
+ "No files in here" : "Čia nėra failų",
"Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!",
+ "No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Upload too large" : "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje",
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index b8e296a0d43..b4758b4a9bb 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -40,15 +40,19 @@
"Delete" : "Ištrinti",
"Disconnect storage" : "Atjungti saugyklą",
"Unshare" : "Nebesidalinti",
+ "No permission to delete" : "Neturite leidimų ištrinti",
"Download" : "Atsisiųsti",
"Select" : "Pasirinkiti",
"Pending" : "Laukiantis",
"Unable to determine date" : "Nepavyksta nustatyti datos",
+ "This operation is forbidden" : "Ši operacija yra uždrausta",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi",
"Error moving file." : "Klaida perkeliant failą.",
"Error moving file" : "Klaida perkeliant failą",
"Error" : "Klaida",
"Could not rename file" : "Neįmanoma pervadinti failo",
"Error deleting file." : "Klaida trinant failą.",
+ "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“",
"Name" : "Pavadinimas",
"Size" : "Dydis",
"Modified" : "Pakeista",
@@ -58,13 +62,18 @@
"_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"],
"\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas failo pavadinime.",
"File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} saugykla yra pilna, failai daugiau nebegali būti atnaujinti arba sinchronizuojami!",
"Your storage is full, files can not be updated or synced anymore!" : "Jūsų visa vieta serveryje užimta",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} saugykla yra beveik pilna ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
+ "_matches '{filter}'_::_match '{filter}'_" : ["atitikmuo „{filter}“","atitikmenys „{filter}“","atitikmenų „{filter}“"],
"{dirs} and {files}" : "{dirs} ir {files}",
"Favorited" : "Pažymėta mėgstamu",
"Favorite" : "Mėgiamas",
+ "An error occurred while trying to update the tags" : "Bandant atnaujinti žymes įvyko klaida",
"A new file or folder has been <strong>created</strong>" : "Naujas failas ar aplankas buvo <strong>sukurtas</strong>",
"A file or folder has been <strong>changed</strong>" : "Failas ar aplankas buvo <strong>pakeistas</strong>",
+ "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Riboti pranešimus apie sukūrimą ir pokyčius jūsų <strong>mėgiamuose failuose</strong> <em>(Tik srautas)</em>",
"A file or folder has been <strong>deleted</strong>" : "Failas ar aplankas buvo <strong>ištrintas</strong>",
"A file or folder has been <strong>restored</strong>" : "Failas ar aplankas buvo <strong>atkurtas</strong>",
"You created %1$s" : "Jūs sukūrėte %1$s",
@@ -83,6 +92,7 @@
"Maximum upload size" : "Maksimalus įkeliamo failo dydis",
"max. possible: " : "maks. galima:",
"Save" : "Išsaugoti",
+ "Can not be edited from here due to insufficient permissions." : "Negali būti redaguojamas iš čia dėl leidimų trūkumo.",
"Settings" : "Nustatymai",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>",
@@ -93,7 +103,9 @@
"Folder" : "Katalogas",
"Upload" : "Įkelti",
"Cancel upload" : "Atšaukti siuntimą",
+ "No files in here" : "Čia nėra failų",
"Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!",
+ "No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Upload too large" : "Įkėlimui failas per didelis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje",
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 16699e084f6..541ff6e444a 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -30,7 +30,7 @@ OC.L10N.register(
"Favorites" : "Favorite",
"Home" : "Acasă",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
- "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de incarcare de {size2}",
+ "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de încărcare de {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
"Upload cancelled." : "Încărcare anulată.",
"Could not get result from server." : "Nu se poate obține rezultatul de la server.",
@@ -55,7 +55,7 @@ OC.L10N.register(
"Modified" : "Modificat",
"_%n folder_::_%n folders_" : ["%n director","%n directoare","%n directoare"],
"_%n file_::_%n files_" : ["%n fișier","%n fișiere","%n fișiere"],
- "You don’t have permission to upload or create files here" : "Nu aveti permisiunea de a incarca sau crea fisiere aici",
+ "You don’t have permission to upload or create files here" : "Nu aveți permisiunea de a încărca sau crea fișiere aici",
"_Uploading %n file_::_Uploading %n files_" : ["Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."],
"\"{name}\" is an invalid file name." : "\"{name}\" este un nume de fișier nevalid.",
"File name cannot be empty." : "Numele fișierului nu poate rămâne gol.",
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index d09af6ba759..6c4536d5357 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -28,7 +28,7 @@
"Favorites" : "Favorite",
"Home" : "Acasă",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți",
- "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de incarcare de {size2}",
+ "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de încărcare de {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas",
"Upload cancelled." : "Încărcare anulată.",
"Could not get result from server." : "Nu se poate obține rezultatul de la server.",
@@ -53,7 +53,7 @@
"Modified" : "Modificat",
"_%n folder_::_%n folders_" : ["%n director","%n directoare","%n directoare"],
"_%n file_::_%n files_" : ["%n fișier","%n fișiere","%n fișiere"],
- "You don’t have permission to upload or create files here" : "Nu aveti permisiunea de a incarca sau crea fisiere aici",
+ "You don’t have permission to upload or create files here" : "Nu aveți permisiunea de a încărca sau crea fișiere aici",
"_Uploading %n file_::_Uploading %n files_" : ["Se încarcă %n fișier.","Se încarcă %n fișiere.","Se încarcă %n fișiere."],
"\"{name}\" is an invalid file name." : "\"{name}\" este un nume de fișier nevalid.",
"File name cannot be empty." : "Numele fișierului nu poate rămâne gol.",
diff --git a/apps/files/lib/capabilities.php b/apps/files/lib/capabilities.php
index 05d12864dca..2e19283e4d6 100644
--- a/apps/files/lib/capabilities.php
+++ b/apps/files/lib/capabilities.php
@@ -1,7 +1,7 @@
<?php
/**
* @author Christopher Schäpers <kondou@ts.unde.re>
- * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Tom Needham <tom@owncloud.com>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -20,19 +20,28 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-
-namespace OCA\Files;
-class Capabilities {
-
- public static function getCapabilities() {
- return new \OC_OCS_Result(array(
- 'capabilities' => array(
- 'files' => array(
- 'bigfilechunking' => true,
- ),
- ),
- ));
+namespace OCA\Files;
+
+use OCP\Capabilities\ICapability;
+
+/**
+ * Class Capabilities
+ *
+ * @package OCA\Files
+ */
+class Capabilities implements ICapability {
+
+ /**
+ * Return this classes capabilities
+ *
+ * @return array
+ */
+ public function getCapabilities() {
+ return [
+ 'files' => [
+ 'bigfilechunking' => true,
+ ],
+ ];
}
-
}
diff --git a/apps/files/tests/js/detailsviewSpec.js b/apps/files/tests/js/detailsviewSpec.js
new file mode 100644
index 00000000000..db1e24fd68e
--- /dev/null
+++ b/apps/files/tests/js/detailsviewSpec.js
@@ -0,0 +1,105 @@
+/**
+* ownCloud
+*
+* @author Vincent Petry
+* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+describe('OCA.Files.DetailsView tests', function() {
+ var detailsView;
+
+ beforeEach(function() {
+ detailsView = new OCA.Files.DetailsView();
+ });
+ afterEach(function() {
+ detailsView.destroy();
+ detailsView = undefined;
+ });
+ it('renders itself empty when nothing registered', function() {
+ detailsView.render();
+ expect(detailsView.$el.find('.detailFileInfoContainer').length).toEqual(1);
+ expect(detailsView.$el.find('.tabsContainer').length).toEqual(1);
+ });
+ describe('file info detail view', function() {
+ it('renders registered view', function() {
+ var testView = new OCA.Files.DetailFileInfoView();
+ var testView2 = new OCA.Files.DetailFileInfoView();
+ detailsView.addDetailView(testView);
+ detailsView.addDetailView(testView2);
+ detailsView.render();
+
+ expect(detailsView.$el.find('.detailFileInfoContainer .detailFileInfoView').length).toEqual(2);
+ });
+ it('updates registered tabs when fileinfo is updated', function() {
+ var viewRenderStub = sinon.stub(OCA.Files.DetailFileInfoView.prototype, 'render');
+ var testView = new OCA.Files.DetailFileInfoView();
+ var testView2 = new OCA.Files.DetailFileInfoView();
+ detailsView.addDetailView(testView);
+ detailsView.addDetailView(testView2);
+ detailsView.render();
+
+ var fileInfo = {id: 5, name: 'test.txt'};
+ viewRenderStub.reset();
+ detailsView.setFileInfo(fileInfo);
+
+ expect(testView.getFileInfo()).toEqual(fileInfo);
+ expect(testView2.getFileInfo()).toEqual(fileInfo);
+
+ expect(viewRenderStub.callCount).toEqual(2);
+ viewRenderStub.restore();
+ });
+ });
+ describe('tabs', function() {
+ var testView, testView2;
+
+ beforeEach(function() {
+ testView = new OCA.Files.DetailTabView('test1');
+ testView2 = new OCA.Files.DetailTabView('test2');
+ detailsView.addTabView(testView);
+ detailsView.addTabView(testView2);
+ detailsView.render();
+ });
+ it('renders registered tabs', function() {
+ expect(detailsView.$el.find('.tab').length).toEqual(2);
+ });
+ it('updates registered tabs when fileinfo is updated', function() {
+ var tabRenderStub = sinon.stub(OCA.Files.DetailTabView.prototype, 'render');
+ var fileInfo = {id: 5, name: 'test.txt'};
+ tabRenderStub.reset();
+ detailsView.setFileInfo(fileInfo);
+
+ expect(testView.getFileInfo()).toEqual(fileInfo);
+ expect(testView2.getFileInfo()).toEqual(fileInfo);
+
+ expect(tabRenderStub.callCount).toEqual(2);
+ tabRenderStub.restore();
+ });
+ it('selects the first tab by default', function() {
+ expect(detailsView.$el.find('.tabHeader').eq(0).hasClass('selected')).toEqual(true);
+ expect(detailsView.$el.find('.tabHeader').eq(1).hasClass('selected')).toEqual(false);
+ expect(detailsView.$el.find('.tab').eq(0).hasClass('hidden')).toEqual(false);
+ expect(detailsView.$el.find('.tab').eq(1).hasClass('hidden')).toEqual(true);
+ });
+ it('switches the current tab when clicking on tab header', function() {
+ detailsView.$el.find('.tabHeader').eq(1).click();
+ expect(detailsView.$el.find('.tabHeader').eq(0).hasClass('selected')).toEqual(false);
+ expect(detailsView.$el.find('.tabHeader').eq(1).hasClass('selected')).toEqual(true);
+ expect(detailsView.$el.find('.tab').eq(0).hasClass('hidden')).toEqual(true);
+ expect(detailsView.$el.find('.tab').eq(1).hasClass('hidden')).toEqual(false);
+ });
+ });
+});
diff --git a/apps/files/tests/js/favoritespluginspec.js b/apps/files/tests/js/favoritespluginspec.js
index 90b40ede74b..1b144c28707 100644
--- a/apps/files/tests/js/favoritespluginspec.js
+++ b/apps/files/tests/js/favoritespluginspec.js
@@ -113,7 +113,7 @@ describe('OCA.Files.FavoritesPlugin tests', function() {
shareOwner: 'user2'
}]);
- fileList.findFileEl('testdir').find('td a.name').click();
+ fileList.findFileEl('testdir').find('td .nametext').click();
expect(OCA.Files.App.fileList.getCurrentDirectory()).toEqual('/somewhere/inside/subdir/testdir');
diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js
index 53fa8707674..e420ab828af 100644
--- a/apps/files/tests/js/fileactionsSpec.js
+++ b/apps/files/tests/js/fileactionsSpec.js
@@ -105,7 +105,7 @@ describe('OCA.Files.FileActions tests', function() {
$tr.find('.action-download').click();
expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toEqual(
+ expect(redirectStub.getCall(0).args[0]).toContain(
OC.webroot +
'/index.php/apps/files/ajax/download.php' +
'?dir=%2Fsubdir&files=testName.txt');
@@ -129,7 +129,7 @@ describe('OCA.Files.FileActions tests', function() {
$tr.find('.action-download').click();
expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toEqual(
+ expect(redirectStub.getCall(0).args[0]).toContain(
OC.webroot + '/index.php/apps/files/ajax/download.php' +
'?dir=%2Fanotherpath%2Fthere&files=testName.txt'
);
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 316df0281e9..5c0c8c96bc5 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -77,8 +77,8 @@ describe('OCA.Files.FileList tests', function() {
'<th id="headerName" class="hidden column-name">' +
'<input type="checkbox" id="select_all_files" class="select-all">' +
'<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
- '<span class="selectedActions hidden">' +
- '<a href class="download">Download</a>' +
+ '<span id="selectedActionsList" class="selectedActions hidden">' +
+ '<a href class="download"><img src="actions/download.svg">Download</a>' +
'<a href class="delete-selected">Delete</a></span>' +
'</th>' +
'<th class="hidden column-size"><a class="columntitle" data-sort="size"><span class="sort-indicator"></span></a></th>' +
@@ -1775,7 +1775,7 @@ describe('OCA.Files.FileList tests', function() {
var redirectStub = sinon.stub(OC, 'redirect');
$('.selectedActions .download').click();
expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22One.txt%22%2C%22Three.pdf%22%2C%22somedir%22%5D');
+ expect(redirectStub.getCall(0).args[0]).toContain(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2Fsubdir&files=%5B%22One.txt%22%2C%22Three.pdf%22%2C%22somedir%22%5D');
redirectStub.restore();
});
it('Downloads root folder when all selected in root folder', function() {
@@ -1784,7 +1784,7 @@ describe('OCA.Files.FileList tests', function() {
var redirectStub = sinon.stub(OC, 'redirect');
$('.selectedActions .download').click();
expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=');
+ expect(redirectStub.getCall(0).args[0]).toContain(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=');
redirectStub.restore();
});
it('Downloads parent folder when all selected in subfolder', function() {
@@ -1792,7 +1792,7 @@ describe('OCA.Files.FileList tests', function() {
var redirectStub = sinon.stub(OC, 'redirect');
$('.selectedActions .download').click();
expect(redirectStub.calledOnce).toEqual(true);
- expect(redirectStub.getCall(0).args[0]).toEqual(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=subdir');
+ expect(redirectStub.getCall(0).args[0]).toContain(OC.webroot + '/index.php/apps/files/ajax/download.php?dir=%2F&files=subdir');
redirectStub.restore();
});
});
@@ -1870,6 +1870,50 @@ describe('OCA.Files.FileList tests', function() {
});
})
});
+ describe('Details sidebar', function() {
+ beforeEach(function() {
+ fileList.setFiles(testFiles);
+ });
+ it('Clicking on a file row will trigger file action if no details view configured', function() {
+ fileList._detailsView = null;
+ var updateDetailsViewStub = sinon.stub(fileList, '_updateDetailsView');
+ var actionStub = sinon.stub();
+ fileList.setFiles(testFiles);
+ fileList.fileActions.register(
+ 'text/plain',
+ 'Test',
+ OC.PERMISSION_ALL,
+ function() {
+ // Specify icon for hitory button
+ return OC.imagePath('core','actions/history');
+ },
+ actionStub
+ );
+ fileList.fileActions.setDefault('text/plain', 'Test');
+ var $tr = fileList.findFileEl('One.txt');
+ $tr.find('td.filename>a.name').click();
+ expect(actionStub.calledOnce).toEqual(true);
+ expect(updateDetailsViewStub.notCalled).toEqual(true);
+ updateDetailsViewStub.restore();
+ });
+ it('Clicking on a file row will trigger details sidebar', function() {
+ fileList.fileActions.setDefault('text/plain', 'Test');
+ var $tr = fileList.findFileEl('One.txt');
+ $tr.find('td.filename>a.name').click();
+ expect($tr.hasClass('highlighted')).toEqual(true);
+
+ expect(fileList._detailsView.getFileInfo().id).toEqual(1);
+ });
+ it('Clicking outside to deselect a file row will trigger details sidebar', function() {
+ var $tr = fileList.findFileEl('One.txt');
+ $tr.find('td.filename>a.name').click();
+
+ fileList.$el.find('tfoot').click();
+
+ expect($tr.hasClass('highlighted')).toEqual(false);
+ expect(fileList._detailsView.getFileInfo()).toEqual(null);
+ });
+ });
describe('File actions', function() {
it('Clicking on a file name will trigger default action', function() {
var actionStub = sinon.stub();
@@ -1886,7 +1930,7 @@ describe('OCA.Files.FileList tests', function() {
);
fileList.fileActions.setDefault('text/plain', 'Test');
var $tr = fileList.findFileEl('One.txt');
- $tr.find('td.filename>a.name').click();
+ $tr.find('td.filename .nametext').click();
expect(actionStub.calledOnce).toEqual(true);
expect(actionStub.getCall(0).args[0]).toEqual('One.txt');
var context = actionStub.getCall(0).args[1];
diff --git a/apps/files/tests/js/mainfileinfodetailviewSpec.js b/apps/files/tests/js/mainfileinfodetailviewSpec.js
new file mode 100644
index 00000000000..10ad38097c6
--- /dev/null
+++ b/apps/files/tests/js/mainfileinfodetailviewSpec.js
@@ -0,0 +1,104 @@
+/**
+* ownCloud
+*
+* @author Vincent Petry
+* @copyright 2015 Vincent Petry <pvince81@owncloud.com>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+describe('OCA.Files.MainFileInfoDetailView tests', function() {
+ var view, tooltipStub, previewStub, fncLazyLoadPreview, fileListMock;
+
+ beforeEach(function() {
+ tooltipStub = sinon.stub($.fn, 'tooltip');
+ fileListMock = sinon.mock(OCA.Files.FileList.prototype);
+ view = new OCA.Files.MainFileInfoDetailView();
+ });
+ afterEach(function() {
+ view.destroy();
+ view = undefined;
+ tooltipStub.restore();
+ fileListMock.restore();
+
+ });
+ describe('rendering', function() {
+ var testFileInfo;
+ beforeEach(function() {
+ view = new OCA.Files.MainFileInfoDetailView();
+ testFileInfo = {
+ id: 5,
+ name: 'One.txt',
+ path: '/subdir',
+ size: 123456789,
+ mtime: Date.UTC(2015, 6, 17, 1, 2, 0, 0)
+ };
+ });
+ it('displays basic info', function() {
+ var clock = sinon.useFakeTimers(Date.UTC(2015, 6, 17, 1, 2, 0, 3));
+ var dateExpected = OC.Util.formatDate(Date(Date.UTC(2015, 6, 17, 1, 2, 0, 0)));
+ view.setFileInfo(testFileInfo);
+ expect(view.$el.find('.fileName').text()).toEqual('One.txt');
+ expect(view.$el.find('.fileName').attr('title')).toEqual('One.txt');
+ expect(view.$el.find('.size').text()).toEqual('117.7 MB');
+ expect(view.$el.find('.size').attr('title')).toEqual('123456789 bytes');
+ expect(view.$el.find('.date').text()).toEqual('a few seconds ago');
+ expect(view.$el.find('.date').attr('title')).toEqual(dateExpected);
+ clock.restore();
+ });
+ it('displays favorite icon', function() {
+ view.setFileInfo(_.extend(testFileInfo, {
+ tags: [OC.TAG_FAVORITE]
+ }));
+ expect(view.$el.find('.favorite img').attr('src'))
+ .toEqual(OC.imagePath('core', 'actions/starred'));
+
+ view.setFileInfo(_.extend(testFileInfo, {
+ tags: []
+ }));
+ expect(view.$el.find('.favorite img').attr('src'))
+ .toEqual(OC.imagePath('core', 'actions/star'));
+ });
+ it('displays mime icon', function() {
+ // File
+ view.setFileInfo(_.extend(testFileInfo, {
+ mimetype: 'text/calendar'
+ }));
+
+ expect(view.$el.find('.thumbnail').css('background-image'))
+ .toContain('filetypes/text-calendar.svg');
+
+ // Folder
+ view.setFileInfo(_.extend(testFileInfo, {
+ mimetype: 'httpd/unix-directory'
+ }));
+
+ expect(view.$el.find('.thumbnail').css('background-image'))
+ .toContain('filetypes/folder.svg');
+ });
+ it('displays thumbnail', function() {
+ view.setFileInfo(_.extend(testFileInfo, {
+ mimetype: 'text/plain'
+ }));
+
+ var expectation = fileListMock.expects('lazyLoadPreview');
+ expectation.once();
+
+ view.setFileInfo(testFileInfo);
+
+ fileListMock.verify();
+ });
+ });
+});
diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php
index 62d4d142ba6..d77a302466c 100644
--- a/apps/files_external/appinfo/application.php
+++ b/apps/files_external/appinfo/application.php
@@ -21,7 +21,7 @@
*
*/
-namespace OCA\Files_External\Appinfo;
+namespace OCA\Files_External\AppInfo;
use \OCA\Files_External\Controller\AjaxController;
use \OCP\AppFramework\App;
diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php
index 97eb1353b1e..bc4b0e98c91 100644
--- a/apps/files_external/appinfo/routes.php
+++ b/apps/files_external/appinfo/routes.php
@@ -23,7 +23,7 @@
*
*/
-namespace OCA\Files_External\Appinfo;
+namespace OCA\Files_External\AppInfo;
/**
* @var $this \OC\Route\Router
diff --git a/apps/files_external/controller/ajaxcontroller.php b/apps/files_external/controller/ajaxcontroller.php
index 6225cd0b619..cb2de432286 100644
--- a/apps/files_external/controller/ajaxcontroller.php
+++ b/apps/files_external/controller/ajaxcontroller.php
@@ -25,6 +25,7 @@ namespace OCA\Files_External\Controller;
use OCP\AppFramework\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\JSONResponse;
+use phpseclib\Crypt\RSA;
class AjaxController extends Controller {
public function __construct($appName, IRequest $request) {
@@ -32,8 +33,8 @@ class AjaxController extends Controller {
}
private function generateSshKeys() {
- $rsa = new \Crypt_RSA();
- $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH);
+ $rsa = new RSA();
+ $rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_OPENSSH);
$rsa->setPassword(\OC::$server->getConfig()->getSystemValue('secret', ''));
$key = $rsa->createKey();
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php
index 02a02710a14..b956a607eba 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/amazons3.php
@@ -40,6 +40,7 @@ require 'aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
+use Icewind\Streams\IteratorDirectory;
class AmazonS3 extends \OC\Files\Storage\Common {
@@ -284,9 +285,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
$files[] = $file;
}
- \OC\Files\Stream\Dir::register('amazons3' . $path, $files);
-
- return opendir('fakedir://amazons3' . $path);
+ return IteratorDirectory::wrap($files);
} catch (S3Exception $e) {
\OCP\Util::logException('files_external', $e);
return false;
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 5dc6d06ae06..8fcf39cc767 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -31,6 +31,8 @@
*
*/
+use phpseclib\Crypt\AES;
+
/**
* Class to configure mount.json globally and for users
*/
@@ -494,8 +496,16 @@ class OC_Mount_Config {
if (class_exists($class)) {
try {
$storage = new $class($options);
- if ($storage->test($isPersonal)) {
- return self::STATUS_SUCCESS;
+
+ try {
+ $result = $storage->test($isPersonal);
+ $storage->setAvailability($result);
+ if ($result) {
+ return self::STATUS_SUCCESS;
+ }
+ } catch (\Exception $e) {
+ $storage->setAvailability(false);
+ throw $e;
}
} catch (Exception $exception) {
\OCP\Util::logException('files_external', $exception);
@@ -895,10 +905,7 @@ class OC_Mount_Config {
* Returns the encryption cipher
*/
private static function getCipher() {
- if (!class_exists('Crypt_AES', false)) {
- include('Crypt/AES.php');
- }
- $cipher = new Crypt_AES(CRYPT_AES_MODE_CBC);
+ $cipher = new AES(AES::MODE_CBC);
$cipher->setKey(\OC::$server->getConfig()->getSystemValue('passwordsalt', null));
return $cipher;
}
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index 78219f8f06e..2d1aea1afc8 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -29,6 +29,8 @@
namespace OC\Files\Storage;
+use Icewind\Streams\IteratorDirectory;
+
require_once __DIR__ . '/../3rdparty/Dropbox/autoload.php';
class Dropbox extends \OC\Files\Storage\Common {
@@ -156,8 +158,7 @@ class Dropbox extends \OC\Files\Storage\Common {
foreach ($contents as $file) {
$files[] = basename($file['path']);
}
- \OC\Files\Stream\Dir::register('dropbox'.$path, $files);
- return opendir('fakedir://dropbox'.$path);
+ return IteratorDirectory::wrap($files);
}
return false;
}
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index 8199d97eacb..2ca550dfe7c 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -32,6 +32,8 @@
namespace OC\Files\Storage;
+use Icewind\Streams\IteratorDirectory;
+
set_include_path(get_include_path().PATH_SEPARATOR.
\OC_App::getAppPath('files_external').'/3rdparty/google-api-php-client/src');
require_once 'Google/Client.php';
@@ -291,8 +293,7 @@ class Google extends \OC\Files\Storage\Common {
}
$pageToken = $children->getNextPageToken();
}
- \OC\Files\Stream\Dir::register('google'.$path, $files);
- return opendir('fakedir://google'.$path);
+ return IteratorDirectory::wrap($files);
} else {
return false;
}
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php
index cbe090311a9..7f921b5342f 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/sftp.php
@@ -29,9 +29,12 @@
*
*/
namespace OC\Files\Storage;
+use Icewind\Streams\IteratorDirectory;
+
+use phpseclib\Net\SFTP\Stream;
/**
-* Uses phpseclib's Net_SFTP class and the Net_SFTP_Stream stream wrapper to
+* Uses phpseclib's Net\SFTP class and the Net\SFTP\Stream stream wrapper to
* provide access to SFTP servers.
*/
class SFTP extends \OC\Files\Storage\Common {
@@ -42,7 +45,7 @@ class SFTP extends \OC\Files\Storage\Common {
private $port = 22;
/**
- * @var \Net_SFTP
+ * @var SFTP
*/
protected $client;
@@ -51,10 +54,10 @@ class SFTP extends \OC\Files\Storage\Common {
*/
public function __construct($params) {
// Register sftp://
- \Net_SFTP_Stream::register();
+ Stream::register();
$this->host = $params['host'];
-
+
//deals with sftp://server example
$proto = strpos($this->host, '://');
if ($proto != false) {
@@ -87,7 +90,7 @@ class SFTP extends \OC\Files\Storage\Common {
/**
* Returns the connection.
*
- * @return \Net_SFTP connected client instance
+ * @return \phpseclib\Net\SFTP connected client instance
* @throws \Exception when the connection failed
*/
public function getConnection() {
@@ -96,7 +99,7 @@ class SFTP extends \OC\Files\Storage\Common {
}
$hostKeys = $this->readHostKeys();
- $this->client = new \Net_SFTP($this->host, $this->port);
+ $this->client = new \phpseclib\Net\SFTP($this->host, $this->port);
// The SSH Host Key MUST be verified before login().
$currentHostKey = $this->client->getServerPublicHostKey();
@@ -278,8 +281,7 @@ class SFTP extends \OC\Files\Storage\Common {
$dirStream[] = $file;
}
}
- \OC\Files\Stream\Dir::register($id, $dirStream);
- return opendir('fakedir://' . $id);
+ return IteratorDirectory::wrap($dirStream);
} catch(\Exception $e) {
return false;
}
diff --git a/apps/files_external/lib/sftp_key.php b/apps/files_external/lib/sftp_key.php
index 1bcea6bc96d..a193b323678 100644
--- a/apps/files_external/lib/sftp_key.php
+++ b/apps/files_external/lib/sftp_key.php
@@ -22,14 +22,15 @@
*/
namespace OC\Files\Storage;
-/**
-* Uses phpseclib's Net_SFTP class and the Net_SFTP_Stream stream wrapper to
-* provide access to SFTP servers.
-*/
+use phpseclib\Crypt\RSA;
+
class SFTP_Key extends \OC\Files\Storage\SFTP {
private $publicKey;
private $privateKey;
+ /**
+ * {@inheritdoc}
+ */
public function __construct($params) {
parent::__construct($params);
$this->publicKey = $params['public_key'];
@@ -39,7 +40,7 @@ class SFTP_Key extends \OC\Files\Storage\SFTP {
/**
* Returns the connection.
*
- * @return \Net_SFTP connected client instance
+ * @return \phpseclib\Net\SFTP connected client instance
* @throws \Exception when the connection failed
*/
public function getConnection() {
@@ -48,7 +49,7 @@ class SFTP_Key extends \OC\Files\Storage\SFTP {
}
$hostKeys = $this->readHostKeys();
- $this->client = new \Net_SFTP($this->getHost());
+ $this->client = new \phpseclib\Net\SFTP($this->getHost());
// The SSH Host Key MUST be verified before login().
$currentHostKey = $this->client->getServerPublicHostKey();
@@ -74,10 +75,10 @@ class SFTP_Key extends \OC\Files\Storage\SFTP {
/**
* Returns the private key to be used for authentication to the remote server.
*
- * @return \Crypt_RSA instance or null in case of a failure to load the key.
+ * @return RSA instance or null in case of a failure to load the key.
*/
private function getPrivateKey() {
- $key = new \Crypt_RSA();
+ $key = new RSA();
$key->setPassword(\OC::$server->getConfig()->getSystemValue('secret', ''));
if (!$key->loadKey($this->privateKey)) {
// Should this exception rather than return null?
diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php
index f2438a5487b..387667a81a9 100644
--- a/apps/files_external/lib/streamwrapper.php
+++ b/apps/files_external/lib/streamwrapper.php
@@ -40,8 +40,11 @@ abstract class StreamWrapper extends Common {
}
public function rmdir($path) {
- if ($this->file_exists($path) && $this->isDeletable($path)) {
+ if ($this->is_dir($path) && $this->isDeletable($path)) {
$dh = $this->opendir($path);
+ if (!is_resource($dh)) {
+ return false;
+ }
while (($file = readdir($dh)) !== false) {
if ($this->is_dir($path . '/' . $file)) {
$this->rmdir($path . '/' . $file);
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php
index 50f0d40805a..d8107e58fed 100644
--- a/apps/files_external/lib/swift.php
+++ b/apps/files_external/lib/swift.php
@@ -32,6 +32,7 @@
namespace OC\Files\Storage;
use Guzzle\Http\Exception\ClientErrorResponseException;
+use Icewind\Streams\IteratorDirectory;
use OpenCloud;
use OpenCloud\Common\Exceptions;
use OpenCloud\OpenStack;
@@ -222,8 +223,7 @@ class Swift extends \OC\Files\Storage\Common {
}
}
- \OC\Files\Stream\Dir::register('swift' . $path, $files);
- return opendir('fakedir://swift' . $path);
+ return IteratorDirectory::wrap($files);
} catch (\Exception $e) {
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR);
return false;
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index f72f5024622..9000fafd8dd 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -56,6 +56,7 @@ $application->setupPropagation();
\OCP\Util::addScript('files_sharing', 'share');
\OCP\Util::addScript('files_sharing', 'external');
+\OCP\Util::addStyle('files_sharing', 'sharetabview');
// FIXME: registering a job here will cause additional useless SQL queries
// when the route is not cron.php, needs a better way
diff --git a/apps/files_sharing/appinfo/application.php b/apps/files_sharing/appinfo/application.php
index b9c2844d78c..2fe9019d54e 100644
--- a/apps/files_sharing/appinfo/application.php
+++ b/apps/files_sharing/appinfo/application.php
@@ -2,6 +2,7 @@
/**
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <icewind@owncloud.com>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -20,7 +21,7 @@
*
*/
-namespace OCA\Files_Sharing\Appinfo;
+namespace OCA\Files_Sharing\AppInfo;
use OCA\Files_Sharing\Helper;
use OCA\Files_Sharing\MountProvider;
@@ -31,6 +32,7 @@ use OCA\Files_Sharing\Controllers\ExternalSharesController;
use OCA\Files_Sharing\Controllers\ShareController;
use OCA\Files_Sharing\Middleware\SharingCheckMiddleware;
use \OCP\IContainer;
+use OCA\Files_Sharing\Capabilities;
class Application extends App {
public function __construct(array $urlParams = array()) {
@@ -122,6 +124,11 @@ class Application extends App {
$server->getConfig()
);
});
+
+ /*
+ * Register capabilities
+ */
+ $container->registerCapability('OCA\Files_Sharing\Capabilities');
}
public function registerMountProviders() {
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 21d21a83441..1e99267a43a 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -97,8 +97,3 @@ API::register('delete',
array('\OCA\Files_Sharing\API\Remote', 'declineShare'),
'files_sharing');
-// Register with the capabilities API
-API::register('get',
- '/cloud/capabilities',
- array('OCA\Files_Sharing\Capabilities', 'getCapabilities'),
- 'files_sharing', API::USER_AUTH);
diff --git a/apps/files_sharing/css/authenticate.css b/apps/files_sharing/css/authenticate.css
index 15e3e7a2fc5..ac76d4c6870 100644
--- a/apps/files_sharing/css/authenticate.css
+++ b/apps/files_sharing/css/authenticate.css
@@ -1,5 +1,4 @@
#password {
- width: 190px !important;
padding: 10px;
margin: 6px;
}
diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css
new file mode 100644
index 00000000000..42c9bee7173
--- /dev/null
+++ b/apps/files_sharing/css/sharetabview.css
@@ -0,0 +1,3 @@
+.app-files .shareTabView {
+ min-height: 100px;
+}
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 5923e426f05..1993efe7d73 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -57,7 +57,8 @@ OCA.Sharing.PublicApp = {
scrollContainer: $(window),
dragOptions: dragOptions,
folderDropOptions: folderDropOptions,
- fileActions: fileActions
+ fileActions: fileActions,
+ detailsViewEnabled: false
}
);
this.files = OCA.Files.Files;
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index e7823454c53..12bec0e8c9a 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -140,6 +140,10 @@
}
});
}, t('files_sharing', 'Share'));
+
+ OC.addScript('files_sharing', 'sharetabview').done(function() {
+ fileList.registerTabView(new OCA.Sharing.ShareTabView('shareTabView'));
+ });
},
/**
diff --git a/apps/files_sharing/js/sharetabview.js b/apps/files_sharing/js/sharetabview.js
new file mode 100644
index 00000000000..e02de923751
--- /dev/null
+++ b/apps/files_sharing/js/sharetabview.js
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+ var TEMPLATE =
+ '<div>Owner: {{owner}}';
+
+ /**
+ * @class OCA.Sharing.ShareTabView
+ * @classdesc
+ *
+ * Displays sharing information
+ *
+ */
+ var ShareTabView = function(id) {
+ this.initialize(id);
+ };
+ /**
+ * @memberof OCA.Sharing
+ */
+ ShareTabView.prototype = _.extend({}, OCA.Files.DetailTabView.prototype,
+ /** @lends OCA.Sharing.ShareTabView.prototype */ {
+ _template: null,
+
+ /**
+ * Initialize the details view
+ */
+ initialize: function() {
+ OCA.Files.DetailTabView.prototype.initialize.apply(this, arguments);
+ this.$el.addClass('shareTabView');
+ },
+
+ getLabel: function() {
+ return t('files_sharing', 'Sharing');
+ },
+
+ /**
+ * Renders this details view
+ */
+ render: function() {
+ this.$el.empty();
+
+ if (!this._template) {
+ this._template = Handlebars.compile(TEMPLATE);
+ }
+
+ if (this._fileInfo) {
+ this.$el.append(this._template({
+ owner: this._fileInfo.shareOwner || OC.currentUser
+ }));
+
+ } else {
+ // TODO: render placeholder text?
+ }
+ }
+ });
+
+ OCA.Sharing.ShareTabView = ShareTabView;
+})();
+
diff --git a/apps/files_sharing/l10n/gl.js b/apps/files_sharing/l10n/gl.js
index 390befe6ffe..40694fc0d30 100644
--- a/apps/files_sharing/l10n/gl.js
+++ b/apps/files_sharing/l10n/gl.js
@@ -41,8 +41,8 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "%2$s compartiu %1$s con vostede",
"You shared %1$s via link" : "Vostede compartiu %1$s mediante ligazón",
"Shares" : "Comparticións",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartido comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Compartido comigo a través do meu ID da nube federada do #ownCloud",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
"This share is password-protected" : "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." : "O contrasinal é incorrecto. Ténteo de novo.",
"Password" : "Contrasinal",
@@ -59,7 +59,7 @@ OC.L10N.register(
"Download" : "Descargar",
"Download %s" : "Descargar %s",
"Direct link" : "Ligazón directa",
- "Federated Cloud Sharing" : "Compartición de nube federada",
+ "Federated Cloud Sharing" : "Nube federada compartida",
"Open documentation" : "Abrir a documentación",
"Allow users on this server to send shares to other servers" : "Permitir aos usuarios deste servidor enviar comparticións a outros servidores",
"Allow users on this server to receive shares from other servers" : "Permitir aos usuarios deste servidor recibir comparticións de outros servidores",
@@ -67,7 +67,7 @@ OC.L10N.register(
"Your Federated Cloud ID:" : "ID da súa nube federada:",
"Share it:" : "Compártao:",
"Add it to your website:" : "Engádao o seu sitio web:",
- "Share with me via ownCloud" : "Compartido comigo a través do ownCloud",
+ "Share with me via ownCloud" : "Comparte comigo a través do ownCloud",
"HTML Code:" : "Código HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/gl.json b/apps/files_sharing/l10n/gl.json
index b00e3d621b0..97eb5d14bf4 100644
--- a/apps/files_sharing/l10n/gl.json
+++ b/apps/files_sharing/l10n/gl.json
@@ -39,8 +39,8 @@
"%2$s shared %1$s with you" : "%2$s compartiu %1$s con vostede",
"You shared %1$s via link" : "Vostede compartiu %1$s mediante ligazón",
"Shares" : "Comparticións",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartido comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Compartido comigo a través do meu ID da nube federada do #ownCloud",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
"This share is password-protected" : "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." : "O contrasinal é incorrecto. Ténteo de novo.",
"Password" : "Contrasinal",
@@ -57,7 +57,7 @@
"Download" : "Descargar",
"Download %s" : "Descargar %s",
"Direct link" : "Ligazón directa",
- "Federated Cloud Sharing" : "Compartición de nube federada",
+ "Federated Cloud Sharing" : "Nube federada compartida",
"Open documentation" : "Abrir a documentación",
"Allow users on this server to send shares to other servers" : "Permitir aos usuarios deste servidor enviar comparticións a outros servidores",
"Allow users on this server to receive shares from other servers" : "Permitir aos usuarios deste servidor recibir comparticións de outros servidores",
@@ -65,7 +65,7 @@
"Your Federated Cloud ID:" : "ID da súa nube federada:",
"Share it:" : "Compártao:",
"Add it to your website:" : "Engádao o seu sitio web:",
- "Share with me via ownCloud" : "Compartido comigo a través do ownCloud",
+ "Share with me via ownCloud" : "Comparte comigo a través do ownCloud",
"HTML Code:" : "Código HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/lt_LT.js b/apps/files_sharing/l10n/lt_LT.js
index 3f9926144ad..61860ef2f43 100644
--- a/apps/files_sharing/l10n/lt_LT.js
+++ b/apps/files_sharing/l10n/lt_LT.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"This share is password-protected" : "Turinys apsaugotas slaptažodžiu",
"The password is wrong. Try again." : "Netinka slaptažodis: Bandykite dar kartą.",
"Password" : "Slaptažodis",
+ "No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Name" : "Pavadinimas",
"Sorry, this link doesn’t seem to work anymore." : "Atleiskite, panašu, kad nuoroda yra neveiksni.",
"Reasons might be:" : "Galimos priežastys:",
diff --git a/apps/files_sharing/l10n/lt_LT.json b/apps/files_sharing/l10n/lt_LT.json
index c6d3b846ea4..8e42e1ca947 100644
--- a/apps/files_sharing/l10n/lt_LT.json
+++ b/apps/files_sharing/l10n/lt_LT.json
@@ -11,6 +11,7 @@
"This share is password-protected" : "Turinys apsaugotas slaptažodžiu",
"The password is wrong. Try again." : "Netinka slaptažodis: Bandykite dar kartą.",
"Password" : "Slaptažodis",
+ "No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Name" : "Pavadinimas",
"Sorry, this link doesn’t seem to work anymore." : "Atleiskite, panašu, kad nuoroda yra neveiksni.",
"Reasons might be:" : "Galimos priežastys:",
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index bb62e8078ad..c25dc92409f 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -60,7 +60,7 @@ class Shared_Cache extends Cache {
if ($target === false || $target === $this->storage->getMountPoint()) {
$target = '';
}
- $source = \OC_Share_Backend_File::getSource($target, $this->storage->getMountPoint(), $this->storage->getItemType());
+ $source = \OC_Share_Backend_File::getSource($target, $this->storage->getShare());
if (isset($source['path']) && isset($source['fileOwner'])) {
\OC\Files\Filesystem::initMountPoints($source['fileOwner']);
$mounts = \OC\Files\Filesystem::getMountByNumericId($source['storage']);
@@ -242,7 +242,7 @@ class Shared_Cache extends Cache {
*/
protected function getMoveInfo($path) {
$cache = $this->getSourceCache($path);
- $file = \OC_Share_Backend_File::getSource($path, $this->storage->getMountPoint(), $this->storage->getItemType());
+ $file = \OC_Share_Backend_File::getSource($path, $this->storage->getShare());
return [$cache->getNumericStorageId(), $file['path']];
}
diff --git a/apps/files_sharing/lib/capabilities.php b/apps/files_sharing/lib/capabilities.php
index ac6454c3433..ef69a40078b 100644
--- a/apps/files_sharing/lib/capabilities.php
+++ b/apps/files_sharing/lib/capabilities.php
@@ -20,6 +20,7 @@
*/
namespace OCA\Files_Sharing;
+use OCP\Capabilities\ICapability;
use \OCP\IConfig;
/**
@@ -27,32 +28,21 @@ use \OCP\IConfig;
*
* @package OCA\Files_Sharing
*/
-class Capabilities {
+class Capabilities implements ICapability {
/** @var IConfig */
private $config;
- /**
- * @param IConfig $config
- */
public function __construct(IConfig $config) {
$this->config = $config;
}
/**
- * @return \OC_OCS_Result
- */
- public static function getCapabilities() {
- $config = \OC::$server->getConfig();
- $cap = new Capabilities($config);
- return $cap->getCaps();
- }
-
-
- /**
- * @return \OC_OCS_Result
+ * Return this classes capabilities
+ *
+ * @return array
*/
- public function getCaps() {
+ public function getCapabilities() {
$res = [];
$public = [];
@@ -76,12 +66,8 @@ class Capabilities {
$res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes';
-
- return new \OC_OCS_Result([
- 'capabilities' => [
- 'files_sharing' => $res
- ],
- ]);
+ return [
+ 'files_sharing' => $res,
+ ];
}
-
}
diff --git a/apps/files_sharing/lib/propagation/recipientpropagator.php b/apps/files_sharing/lib/propagation/recipientpropagator.php
index 97ea452aa6c..11764106861 100644
--- a/apps/files_sharing/lib/propagation/recipientpropagator.php
+++ b/apps/files_sharing/lib/propagation/recipientpropagator.php
@@ -133,8 +133,8 @@ class RecipientPropagator {
$this->markDirty($share, microtime(true));
// propagate up the share tree
- $user = $share['uid_owner'];
- if($user !== $this->userId) {
+ if ($share['share_with'] === $this->userId) {
+ $user = $share['uid_owner'];
$view = new View('/' . $user . '/files');
$path = $view->getPath($share['file_source']);
$watcher = new ChangeWatcher($view, $this->manager->getSharePropagator($user));
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index 9c09e05408b..7bbc2083702 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -206,27 +206,15 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
/**
* @param string $target
- * @param string $mountPoint
- * @param string $itemType
+ * @param array $share
* @return array|false source item
*/
- public static function getSource($target, $mountPoint, $itemType) {
- if ($itemType === 'folder') {
- $source = \OCP\Share::getItemSharedWith('folder', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
- if ($source && $target !== '') {
- // note: in case of ext storage mount points the path might be empty
- // which would cause a leading slash to appear
- $source['path'] = ltrim($source['path'] . '/' . $target, '/');
- }
- } else {
- $source = \OCP\Share::getItemSharedWith('file', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
- }
- if ($source) {
- return self::resolveReshares($source);
+ public static function getSource($target, $share) {
+ if ($share['item_type'] === 'folder' && $target !== '') {
+ // note: in case of ext storage mount points the path might be empty
+ // which would cause a leading slash to appear
+ $share['path'] = ltrim($share['path'] . '/' . $target, '/');
}
-
- \OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
- return false;
+ return self::resolveReshares($share);
}
-
}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index ff01489d77b..66803db1425 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -83,14 +83,14 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
if (!isset($this->files[$target])) {
// Check for partial files
if (pathinfo($target, PATHINFO_EXTENSION) === 'part') {
- $source = \OC_Share_Backend_File::getSource(substr($target, 0, -5), $this->getMountPoint(), $this->getItemType());
+ $source = \OC_Share_Backend_File::getSource(substr($target, 0, -5), $this->getShare());
if ($source) {
$source['path'] .= '.part';
// All partial files have delete permission
$source['permissions'] |= \OCP\Constants::PERMISSION_DELETE;
}
} else {
- $source = \OC_Share_Backend_File::getSource($target, $this->getMountPoint(), $this->getItemType());
+ $source = \OC_Share_Backend_File::getSource($target, $this->getShare());
}
$this->files[$target] = $source;
}
diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php
index e3aa62b9ece..769b7929144 100644
--- a/apps/files_sharing/templates/authenticate.php
+++ b/apps/files_sharing/templates/authenticate.php
@@ -19,7 +19,8 @@
autocomplete="off" autocapitalize="off" autocorrect="off"
autofocus />
<img class="svg" id="password-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt=""/>
- <input type="submit" value="" class="svg icon-confirm" />
+ <input type="submit" value=""
+ class="svg icon-confirm input-button-inline" />
</p>
</fieldset>
</form>
diff --git a/apps/files_sharing/tests/capabilities.php b/apps/files_sharing/tests/capabilities.php
index a7c487bf589..b0f6390b013 100644
--- a/apps/files_sharing/tests/capabilities.php
+++ b/apps/files_sharing/tests/capabilities.php
@@ -36,9 +36,8 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
* @return string[]
*/
private function getFilesSharingPart(array $data) {
- $this->assertArrayHasKey('capabilities', $data);
- $this->assertArrayHasKey('files_sharing', $data['capabilities']);
- return $data['capabilities']['files_sharing'];
+ $this->assertArrayHasKey('files_sharing', $data);
+ return $data['files_sharing'];
}
/**
@@ -53,7 +52,7 @@ class FilesSharingCapabilitiesTest extends \Test\TestCase {
$stub = $this->getMockBuilder('\OCP\IConfig')->disableOriginalConstructor()->getMock();
$stub->method('getAppValue')->will($this->returnValueMap($map));
$cap = new Capabilities($stub);
- $result = $this->getFilesSharingPart($cap->getCaps()->getData());
+ $result = $this->getFilesSharingPart($cap->getCapabilities());
return $result;
}
diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php
index d978daf200c..8da4e6f29bd 100644
--- a/apps/files_sharing/tests/etagpropagation.php
+++ b/apps/files_sharing/tests/etagpropagation.php
@@ -266,15 +266,15 @@ class EtagPropagation extends TestCase {
\OCP\Share::unshare(
'folder',
$folderId,
- \OCP\Share::SHARE_TYPE_USER,
+ \OCP\Share::SHARE_TYPE_USER,
self::TEST_FILES_SHARING_API_USER2
)
);
$this->assertEtagsForFoldersChanged([
// direct recipient affected
- self::TEST_FILES_SHARING_API_USER2,
+ self::TEST_FILES_SHARING_API_USER2,
// reshare recipient affected
- self::TEST_FILES_SHARING_API_USER4,
+ self::TEST_FILES_SHARING_API_USER4,
]);
$this->assertAllUnchaged();
@@ -287,9 +287,9 @@ class EtagPropagation extends TestCase {
);
$this->assertEtagsForFoldersChanged([
// direct recipient affected
- self::TEST_FILES_SHARING_API_USER2,
+ self::TEST_FILES_SHARING_API_USER2,
// reshare recipient affected
- self::TEST_FILES_SHARING_API_USER4,
+ self::TEST_FILES_SHARING_API_USER4,
]);
$this->assertAllUnchaged();
@@ -398,4 +398,13 @@ class EtagPropagation extends TestCase {
$this->assertAllUnchaged();
}
+
+ public function testRecipientUploadInDirectReshare() {
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ Filesystem::file_put_contents('/directReshare/test.txt', 'sad');
+ $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER3]);
+ $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]);
+
+ $this->assertAllUnchaged();
+ }
}
diff --git a/apps/files_sharing/tests/js/appSpec.js b/apps/files_sharing/tests/js/appSpec.js
index 49bca568001..133bd44f750 100644
--- a/apps/files_sharing/tests/js/appSpec.js
+++ b/apps/files_sharing/tests/js/appSpec.js
@@ -132,7 +132,7 @@ describe('OCA.Sharing.App tests', function() {
shareOwner: 'user2'
}]);
- fileListIn.findFileEl('testdir').find('td a.name').click();
+ fileListIn.findFileEl('testdir').find('td .nametext').click();
expect(OCA.Files.App.fileList.getCurrentDirectory()).toEqual('/somewhere/inside/subdir/testdir');
diff --git a/apps/files_sharing/tests/sharedstorage.php b/apps/files_sharing/tests/sharedstorage.php
index 7c28d0431e1..de510cf1eec 100644
--- a/apps/files_sharing/tests/sharedstorage.php
+++ b/apps/files_sharing/tests/sharedstorage.php
@@ -441,4 +441,43 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
$this->view->unlink($this->folder);
}
+
+ public function testNameConflict() {
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $view1 = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
+ $view1->mkdir('foo');
+ $folderInfo1 = $view1->getFileInfo('foo');
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
+ $view3 = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
+ $view3->mkdir('foo');
+ $folderInfo2 = $view3->getFileInfo('foo');
+
+ // share a folder with the same name from two different users to the same user
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+ \OCP\Share::shareItem('folder', $folderInfo1['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
+ self::TEST_FILES_SHARING_API_GROUP1, 31);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
+
+ \OCP\Share::shareItem('folder', $folderInfo2['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
+ self::TEST_FILES_SHARING_API_GROUP1, 31);
+
+ self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+ $view2 = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
+
+ $this->assertTrue($view2->file_exists('/foo'));
+ $this->assertTrue($view2->file_exists('/foo (2)'));
+
+ $mount = $view2->getMount('/foo');
+ $this->assertInstanceOf('\OCA\Files_Sharing\SharedMount', $mount);
+ /** @var \OC\Files\Storage\Shared $storage */
+ $storage = $mount->getStorage();
+
+ $source = $storage->getFile('');
+ $this->assertEquals(self::TEST_FILES_SHARING_API_USER1, $source['uid_owner']);
+ }
}
diff --git a/apps/files_trashbin/appinfo/application.php b/apps/files_trashbin/appinfo/application.php
new file mode 100644
index 00000000000..8d76d40f639
--- /dev/null
+++ b/apps/files_trashbin/appinfo/application.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Trashbin\AppInfo;
+
+use OCP\AppFramework\App;
+
+class Application extends App {
+ public function __construct(array $urlParams = array()) {
+ parent::__construct('files_trashbin', $urlParams);
+
+ $container = $this->getContainer();
+
+ /*
+ * Register capabilities
+ */
+ $container->registerCapability('OCA\Files_Trashbin\Capabilities');
+ }
+}
diff --git a/apps/files_trashbin/appinfo/routes.php b/apps/files_trashbin/appinfo/routes.php
index 99a03d6b969..cf3d7b77ec2 100644
--- a/apps/files_trashbin/appinfo/routes.php
+++ b/apps/files_trashbin/appinfo/routes.php
@@ -1,9 +1,8 @@
<?php
/**
* @author Georg Ehrke <georg@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
* @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Vincent Petry <pvince81@owncloud.com>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -22,6 +21,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+
+namespace OCA\Files_Trashbin\AppInfo;
+
+$application = new Application();
+
$this->create('core_ajax_trashbin_preview', 'ajax/preview.php')
->actionInclude('files_trashbin/ajax/preview.php');
$this->create('files_trashbin_ajax_delete', 'ajax/delete.php')
@@ -33,6 +37,3 @@ $this->create('files_trashbin_ajax_list', 'ajax/list.php')
$this->create('files_trashbin_ajax_undelete', 'ajax/undelete.php')
->actionInclude('files_trashbin/ajax/undelete.php');
-
-// Register with the capabilities API
-\OCP\API::register('get', '/cloud/capabilities', array('OCA\Files_Trashbin\Capabilities', 'getCapabilities'), 'files_trashbin', \OCP\API::USER_AUTH);
diff --git a/apps/files_trashbin/command/cleanup.php b/apps/files_trashbin/command/cleanup.php
index 0cc94912339..60717abac18 100644
--- a/apps/files_trashbin/command/cleanup.php
+++ b/apps/files_trashbin/command/cleanup.php
@@ -108,7 +108,7 @@ class CleanUp extends Command {
if ($this->rootFolder->nodeExists('/' . $uid . '/files_trashbin')) {
$this->rootFolder->get('/' . $uid . '/files_trashbin')->delete();
$query = $this->dbConnection->getQueryBuilder();
- $query->delete('*PREFIX*files_trash')
+ $query->delete('files_trash')
->where($query->expr()->eq('user', $query->createParameter('uid')))
->setParameter('uid', $uid);
$query->execute();
diff --git a/apps/files_trashbin/l10n/lt_LT.js b/apps/files_trashbin/l10n/lt_LT.js
index 3c075536079..afe317ca20a 100644
--- a/apps/files_trashbin/l10n/lt_LT.js
+++ b/apps/files_trashbin/l10n/lt_LT.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"restored" : "atstatyta",
"No deleted files" : "Nėra ištrintų failų",
"You will be able to recover deleted files from here" : "Jūs galėsite atkurti ištrintus failus iš čia",
+ "No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Name" : "Pavadinimas",
"Deleted" : "Ištrinti",
diff --git a/apps/files_trashbin/l10n/lt_LT.json b/apps/files_trashbin/l10n/lt_LT.json
index 0be508aeb21..bf2cb31b588 100644
--- a/apps/files_trashbin/l10n/lt_LT.json
+++ b/apps/files_trashbin/l10n/lt_LT.json
@@ -8,6 +8,7 @@
"restored" : "atstatyta",
"No deleted files" : "Nėra ištrintų failų",
"You will be able to recover deleted files from here" : "Jūs galėsite atkurti ištrintus failus iš čia",
+ "No entries found in this folder" : "Nerasta įrašų šiame aplanke",
"Select all" : "Pažymėti viską",
"Name" : "Pavadinimas",
"Deleted" : "Ištrinti",
diff --git a/apps/files_trashbin/lib/capabilities.php b/apps/files_trashbin/lib/capabilities.php
index 89b268489b5..c991cc8be65 100644
--- a/apps/files_trashbin/lib/capabilities.php
+++ b/apps/files_trashbin/lib/capabilities.php
@@ -2,6 +2,7 @@
/**
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -22,25 +23,26 @@
namespace OCA\Files_Trashbin;
+use OCP\Capabilities\ICapability;
/**
* Class Capabilities
*
* @package OCA\Files_Trashbin
*/
-class Capabilities {
+class Capabilities implements ICapability {
/**
- * @return \OC_OCS_Result
+ * Return this classes capabilities
+ *
+ * @return array
*/
- public static function getCapabilities() {
- return new \OC_OCS_Result(array(
- 'capabilities' => array(
- 'files' => array(
- 'undelete' => true,
- ),
- ),
- ));
+ public function getCapabilities() {
+ return [
+ 'files' => [
+ 'undelete' => true
+ ]
+ ];
}
}
diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php
index 42412d5d4c9..f51185712a9 100644
--- a/apps/files_trashbin/lib/helper.php
+++ b/apps/files_trashbin/lib/helper.php
@@ -83,7 +83,7 @@ class Helper
$i = array(
'name' => $id,
'mtime' => $timestamp,
- 'mimetype' => \OC_Helper::getFileNameMimeType($id),
+ 'mimetype' => $view->is_dir($dir . '/' . $entryName) ? 'httpd/unix-directory' : \OC_Helper::getFileNameMimeType($id),
'type' => $view->is_dir($dir . '/' . $entryName) ? 'dir' : 'file',
'directory' => ($dir === '/') ? '' : $dir,
);
diff --git a/apps/files_trashbin/tests/command/cleanuptest.php b/apps/files_trashbin/tests/command/cleanuptest.php
index a7400e901fa..d4cccee448e 100644
--- a/apps/files_trashbin/tests/command/cleanuptest.php
+++ b/apps/files_trashbin/tests/command/cleanuptest.php
@@ -43,7 +43,7 @@ class CleanUpTest extends TestCase {
protected $dbConnection;
/** @var string */
- protected $trashTable = '*PREFIX*files_trash';
+ protected $trashTable = 'files_trash';
/** @var string */
protected $user0 = 'user0';
diff --git a/apps/files_versions/appinfo/application.php b/apps/files_versions/appinfo/application.php
new file mode 100644
index 00000000000..bab36b48510
--- /dev/null
+++ b/apps/files_versions/appinfo/application.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Versions\AppInfo;
+
+use OCP\AppFramework\App;
+
+class Application extends App {
+ public function __construct(array $urlParams = array()) {
+ parent::__construct('files_versions', $urlParams);
+
+ $container = $this->getContainer();
+
+ /*
+ * Register capabilities
+ */
+ $container->registerCapability('OCA\Files_Versions\Capabilities');
+ }
+}
diff --git a/apps/files_versions/appinfo/routes.php b/apps/files_versions/appinfo/routes.php
index 5dbed1f93eb..9bab86d9224 100644
--- a/apps/files_versions/appinfo/routes.php
+++ b/apps/files_versions/appinfo/routes.php
@@ -1,10 +1,10 @@
<?php
/**
* @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Tom Needham <tom@owncloud.com>
*
@@ -25,6 +25,10 @@
*
*/
+namespace OCA\Files_Versions\AppInfo;
+
+$application = new Application();
+
/** @var $this \OCP\Route\IRouter */
$this->create('core_ajax_versions_preview', '/preview')->action(
function() {
@@ -38,5 +42,3 @@ $this->create('files_versions_ajax_getVersions', 'ajax/getVersions.php')
$this->create('files_versions_ajax_rollbackVersion', 'ajax/rollbackVersion.php')
->actionInclude('files_versions/ajax/rollbackVersion.php');
-// Register with the capabilities API
-\OCP\API::register('get', '/cloud/capabilities', array('OCA\Files_Versions\Capabilities', 'getCapabilities'), 'files_versions', \OCP\API::USER_AUTH);
diff --git a/apps/files_versions/lib/capabilities.php b/apps/files_versions/lib/capabilities.php
index aea31b25240..11b98038f46 100644
--- a/apps/files_versions/lib/capabilities.php
+++ b/apps/files_versions/lib/capabilities.php
@@ -2,6 +2,7 @@
/**
* @author Christopher Schäpers <kondou@ts.unde.re>
* @author Morris Jobke <hey@morrisjobke.de>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Tom Needham <tom@owncloud.com>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -23,16 +24,20 @@
namespace OCA\Files_Versions;
-class Capabilities {
+use OCP\Capabilities\ICapability;
+
+class Capabilities implements ICapability {
- public static function getCapabilities() {
- return new \OC_OCS_Result(array(
- 'capabilities' => array(
- 'files' => array(
- 'versioning' => true,
- ),
- ),
- ));
+ /**
+ * Return this classes capabilities
+ *
+ * @return array
+ */
+ public function getCapabilities() {
+ return [
+ 'files' => [
+ 'versioning' => true
+ ]
+ ];
}
-
}
diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php
new file mode 100644
index 00000000000..b904bce072e
--- /dev/null
+++ b/apps/user_ldap/appinfo/update.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+$installedVersion = \OC::$server->getConfig()->getAppValue('user_ldap', 'installed_version');
+
+if (version_compare($installedVersion, '0.6.1', '<')) {
+ \OC::$server->getConfig()->setAppValue('user_ldap', 'enforce_home_folder_naming_rule', false);
+}
diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php
index 2bb2e1f8cb6..6f2fdce1b5f 100644
--- a/apps/user_ldap/lib/connection.php
+++ b/apps/user_ldap/lib/connection.php
@@ -341,14 +341,6 @@ class Connection extends LDAPUtility {
}
}
- $groupFilter = $this->configuration->ldapGroupFilter;
- if(empty($groupFilter)) {
- \OCP\Util::writeLog('user_ldap',
- 'No group filter is specified, LDAP group '.
- 'feature will not be used.',
- \OCP\Util::INFO);
- }
-
foreach(array('ldapExpertUUIDUserAttr' => 'ldapUuidUserAttribute',
'ldapExpertUUIDGroupAttr' => 'ldapUuidGroupAttribute')
as $expertSetting => $effectiveSetting) {
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
index 54ee7a9b543..ac5d8f5a374 100644
--- a/apps/user_ldap/lib/user/user.php
+++ b/apps/user_ldap/lib/user/user.php
@@ -342,7 +342,13 @@ class User {
}
$avatar = $this->avatarManager->getAvatar($this->uid);
- $avatar->set($this->image);
+ try {
+ $avatar->set($this->image);
+ } catch (\Exception $e) {
+ \OC::$server->getLogger()->notice(
+ 'Could not set avatar for ' . $this->dn . ', because: ' . $e->getMessage(),
+ ['app' => 'user_ldap']);
+ }
}
}
diff --git a/apps/user_ldap/tests/integration/abstractintegrationtest.php b/apps/user_ldap/tests/integration/abstractintegrationtest.php
new file mode 100644
index 00000000000..f0f5e2de0a4
--- /dev/null
+++ b/apps/user_ldap/tests/integration/abstractintegrationtest.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\user_ldap\tests\integration;
+
+use OCA\user_ldap\lib\Access;
+use OCA\user_ldap\lib\Connection;
+use OCA\user_ldap\lib\LDAP;
+use OCA\user_ldap\lib\user\Manager;
+
+abstract class AbstractIntegrationTest {
+ /** @var LDAP */
+ protected $ldap;
+
+ /** @var Connection */
+ protected $connection;
+
+ /** @var Access */
+ protected $access;
+
+ /** @var Manager */
+ protected $userManager;
+
+ /** @var string */
+ protected $base;
+
+ /** @var string[] */
+ protected $server;
+
+ public function __construct($host, $port, $bind, $pwd, $base) {
+ $this->base = $base;
+ $this->server = [
+ 'host' => $host,
+ 'port' => $port,
+ 'dn' => $bind,
+ 'pwd' => $pwd
+ ];
+ }
+
+ /**
+ * prepares the LDAP environment and sets up a test configuration for
+ * the LDAP backend.
+ */
+ public function init() {
+ $this->initLDAPWrapper();
+ $this->initConnection();
+ $this->initUserManager();
+ $this->initAccess();
+
+ }
+
+ /**
+ * initializes the test LDAP wrapper
+ */
+ protected function initLDAPWrapper() {
+ $this->ldap = new LDAP();
+ }
+
+ /**
+ * sets up the LDAP configuration to be used for the test
+ */
+ protected function initConnection() {
+ $this->connection = new Connection($this->ldap, '', null);
+ $this->connection->setConfiguration([
+ 'ldapHost' => $this->server['host'],
+ 'ldapPort' => $this->server['port'],
+ 'ldapBase' => $this->base,
+ 'ldapAgentName' => $this->server['dn'],
+ 'ldapAgentPassword' => $this->server['pwd'],
+ 'ldapUserFilter' => 'objectclass=inetOrgPerson',
+ 'ldapUserDisplayName' => 'cn',
+ 'ldapGroupDisplayName' => 'cn',
+ 'ldapLoginFilter' => '(|(uid=%uid)(samaccountname=%uid))',
+ 'ldapCacheTTL' => 0,
+ 'ldapConfigurationActive' => 1,
+ ]);
+ }
+
+ /**
+ * initializes an LDAP user manager instance
+ * @return Manager
+ */
+ protected function initUserManager() {
+ $this->userManager = new FakeManager();
+ }
+
+ /**
+ * initializes the Access test instance
+ */
+ protected function initAccess() {
+ $this->access = new Access($this->connection, $this->ldap, $this->userManager);
+ }
+
+ /**
+ * runs the test cases while outputting progress and result information
+ *
+ * If a test failed, the script is exited with return code 1.
+ */
+ public function run() {
+ $methods = get_class_methods($this);
+ $atLeastOneCaseRan = false;
+ foreach($methods as $method) {
+ if(strpos($method, 'case') === 0) {
+ print("running $method " . PHP_EOL);
+ if(!$this->$method()) {
+ print(PHP_EOL . '>>> !!! Test ' . $method . ' FAILED !!! <<<' . PHP_EOL . PHP_EOL);
+ exit(1);
+ }
+ $atLeastOneCaseRan = true;
+ }
+ }
+ if($atLeastOneCaseRan) {
+ print('Tests succeeded' . PHP_EOL);
+ } else {
+ print('No Test was available.' . PHP_EOL);
+ exit(1);
+ }
+ }
+}
diff --git a/apps/user_ldap/tests/integration/data/avatar-invalid.gif b/apps/user_ldap/tests/integration/data/avatar-invalid.gif
new file mode 100644
index 00000000000..000108834d8
--- /dev/null
+++ b/apps/user_ldap/tests/integration/data/avatar-invalid.gif
Binary files differ
diff --git a/apps/user_ldap/tests/integration/data/avatar-valid.jpg b/apps/user_ldap/tests/integration/data/avatar-valid.jpg
new file mode 100644
index 00000000000..61b5ec2e730
--- /dev/null
+++ b/apps/user_ldap/tests/integration/data/avatar-valid.jpg
Binary files differ
diff --git a/apps/user_ldap/tests/integration/fakemanager.php b/apps/user_ldap/tests/integration/fakemanager.php
new file mode 100644
index 00000000000..afc9c552a98
--- /dev/null
+++ b/apps/user_ldap/tests/integration/fakemanager.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\user_ldap\tests\integration;
+
+/**
+ * Class FakeManager
+ *
+ * this is a mock of \OCA\user_ldap\lib\user\Manager which is a dependency of
+ * Access, that pulls plenty more things in. Because it is not needed in the
+ * scope of these tests, we replace it with a mock.
+ */
+class FakeManager extends \OCA\user_ldap\lib\user\Manager {
+ public function __construct() {}
+}
diff --git a/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php b/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php
index 92035d94b4b..17d046187e8 100644
--- a/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php
+++ b/apps/user_ldap/tests/integration/lib/IntegrationTestAccessGroupsMatchFilter.php
@@ -1,72 +1,42 @@
<?php
/**
- * Created by PhpStorm.
- * User: blizzz
- * Date: 26.06.15
- * Time: 18:13
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
*/
-use OCA\user_ldap\lib\LDAP;
-
-require_once __DIR__ . '/../../../../../lib/base.php';
-
-class IntegrationTestAccessGroupsMatchFilter {
- /** @var LDAP */
- protected $ldap;
+namespace OCA\user_ldap\tests\integration\lib;
- /** @var \OCA\user_ldap\lib\Connection */
- protected $connection;
+use OCA\user_ldap\lib\Connection;
+use OCA\user_ldap\tests\integration\AbstractIntegrationTest;
- /** @var \OCA\user_ldap\lib\Access */
- protected $access;
-
- /** @var string */
- protected $base;
-
- /** @var string[] */
- protected $server;
+require_once __DIR__ . '/../../../../../lib/base.php';
- public function __construct($host, $port, $bind, $pwd, $base) {
- $this->base = $base;
- $this->server = [
- 'host' => $host,
- 'port' => $port,
- 'dn' => $bind,
- 'pwd' => $pwd
- ];
- }
+class IntegrationTestAccessGroupsMatchFilter extends AbstractIntegrationTest {
/**
- * prepares the LDAP environement and sets up a test configuration for
+ * prepares the LDAP environment and sets up a test configuration for
* the LDAP backend.
*/
public function init() {
- require('setup-scripts/createExplicitUsers.php');
- require('setup-scripts/createExplicitGroups.php');
- require('setup-scripts/createExplicitGroupsDifferentOU.php');
-
- $this->initLDAPWrapper();
- $this->initConnection();
- $this->initAccess();
- }
-
- /**
- * runs the test cases while outputting progress and result information
- *
- * If a test failed, the script is exited with return code 1.
- */
- public function run() {
- $cases = ['case1', 'case2', 'case3'];
-
- foreach ($cases as $case) {
- print("running $case " . PHP_EOL);
- if (!$this->$case()) {
- print(PHP_EOL . '>>> !!! Test ' . $case . ' FAILED !!! <<<' . PHP_EOL . PHP_EOL);
- exit(1);
- }
- }
-
- print('Tests succeeded' . PHP_EOL);
+ require(__DIR__ . '/../setup-scripts/createExplicitUsers.php');
+ require(__DIR__ . '/../setup-scripts/createExplicitGroups.php');
+ require(__DIR__ . '/../setup-scripts/createExplicitGroupsDifferentOU.php');
+ parent::init();
}
/**
@@ -75,7 +45,7 @@ class IntegrationTestAccessGroupsMatchFilter {
*
* @return bool
*/
- private function case1() {
+ protected function case1() {
$this->connection->setConfiguration(['ldapGroupFilter' => 'cn=RedGroup']);
$dns = ['cn=RedGroup,ou=Groups,' . $this->base];
@@ -89,7 +59,7 @@ class IntegrationTestAccessGroupsMatchFilter {
*
* @return bool
*/
- private function case2() {
+ protected function case2() {
$this->connection->setConfiguration(['ldapGroupFilter' => '(|(cn=RedGroup)(cn=PurpleGroup))']);
$dns = [
@@ -113,7 +83,7 @@ class IntegrationTestAccessGroupsMatchFilter {
*
* @return bool
*/
- private function case3() {
+ protected function case3() {
$this->connection->setConfiguration(['ldapGroupFilter' => '(objectclass=groupOfNames)']);
$dns = [
@@ -132,53 +102,21 @@ class IntegrationTestAccessGroupsMatchFilter {
}
/**
- * initializes the Access test instance
- */
- private function initAccess() {
- $this->access = new \OCA\user_ldap\lib\Access($this->connection, $this->ldap, new FakeManager());
- }
-
- /**
- * initializes the test LDAP wrapper
- */
- private function initLDAPWrapper() {
- $this->ldap = new LDAP();
- }
-
- /**
* sets up the LDAP configuration to be used for the test
*/
- private function initConnection() {
- $this->connection = new \OCA\user_ldap\lib\Connection($this->ldap, '', null);
+ protected function initConnection() {
+ parent::initConnection();
$this->connection->setConfiguration([
- 'ldapHost' => $this->server['host'],
- 'ldapPort' => $this->server['port'],
- 'ldapBase' => $this->base,
'ldapBaseGroups' => 'ou=Groups,' . $this->base,
- 'ldapAgentName' => $this->server['dn'],
- 'ldapAgentPassword' => $this->server['pwd'],
'ldapUserFilter' => 'objectclass=inetOrgPerson',
'ldapUserDisplayName' => 'displayName',
'ldapGroupDisplayName' => 'cn',
'ldapLoginFilter' => 'uid=%uid',
- 'ldapCacheTTL' => 0,
- 'ldapConfigurationActive' => 1,
]);
}
}
-/**
- * Class FakeManager
- *
- * this is a mock of \OCA\user_ldap\lib\user\Manager which is a dependency of
- * Access, that pulls plenty more things in. Because it is not needed in the
- * scope of these tests, we replace it with a mock.
- */
-class FakeManager extends \OCA\user_ldap\lib\user\Manager {
- public function __construct() {}
-}
-
-require_once('setup-scripts/config.php');
+require_once(__DIR__ . '/../setup-scripts/config.php');
$test = new IntegrationTestAccessGroupsMatchFilter($host, $port, $adn, $apwd, $bdn);
$test->init();
$test->run();
diff --git a/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php b/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php
new file mode 100644
index 00000000000..f34fca81c2d
--- /dev/null
+++ b/apps/user_ldap/tests/integration/lib/integrationtestuserhome.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: blizzz
+ * Date: 06.08.15
+ * Time: 08:19
+ */
+
+namespace OCA\user_ldap\tests\integration\lib;
+
+use OCA\user_ldap\lib\user\Manager as LDAPUserManager;
+use OCA\user_ldap\tests\integration\AbstractIntegrationTest;
+use OCA\User_LDAP\Mapping\UserMapping;
+use OCA\user_ldap\USER_LDAP;
+
+require_once __DIR__ . '/../../../../../lib/base.php';
+
+class IntegrationTestUserHome extends AbstractIntegrationTest {
+ /** @var UserMapping */
+ protected $mapping;
+
+ /** @var USER_LDAP */
+ protected $backend;
+
+ /**
+ * prepares the LDAP environment and sets up a test configuration for
+ * the LDAP backend.
+ */
+ public function init() {
+ require(__DIR__ . '/../setup-scripts/createExplicitUsers.php');
+ parent::init();
+
+ $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
+ $this->mapping->clear();
+ $this->access->setUserMapper($this->mapping);
+ $this->backend = new \OCA\user_ldap\USER_LDAP($this->access, \OC::$server->getConfig());
+ }
+
+ /**
+ * sets up the LDAP configuration to be used for the test
+ */
+ protected function initConnection() {
+ parent::initConnection();
+ $this->connection->setConfiguration([
+ 'homeFolderNamingRule' => 'homeDirectory',
+ ]);
+ }
+
+ /**
+ * initializes an LDAP user manager instance
+ * @return LDAPUserManager
+ */
+ protected function initUserManager() {
+ $this->userManager = new LDAPUserManager(
+ \OC::$server->getConfig(),
+ new \OCA\user_ldap\lib\FilesystemHelper(),
+ new \OCA\user_ldap\lib\LogWrapper(),
+ \OC::$server->getAvatarManager(),
+ new \OCP\Image(),
+ \OC::$server->getDatabaseConnection()
+ );
+ }
+
+ /**
+ * homeDirectory on LDAP is empty. Return values of getHome should be
+ * identical to user name, following ownCloud default.
+ *
+ * @return bool
+ */
+ protected function case1() {
+ \OC::$server->getConfig()->setAppValue('user_ldap', 'enforce_home_folder_naming_rule', false);
+ $userManager = \oc::$server->getUserManager();
+ $userManager->clearBackends();
+ $userManager->registerBackend($this->backend);
+ $users = $userManager->search('', 5, 0);
+
+ foreach($users as $user) {
+ $home = $user->getHome();
+ $uid = $user->getUID();
+ $posFound = strpos($home, '/' . $uid);
+ $posExpected = strlen($home) - (strlen($uid) + 1);
+ if($posFound === false || $posFound !== $posExpected) {
+ print('"' . $user->getUID() . '" was not found in "' . $home . '" or does not end with it.' . PHP_EOL);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * homeDirectory on LDAP is empty. Having the attributes set is enforced.
+ *
+ * @return bool
+ */
+ protected function case2() {
+ \OC::$server->getConfig()->setAppValue('user_ldap', 'enforce_home_folder_naming_rule', true);
+ $userManager = \oc::$server->getUserManager();
+ // clearing backends is critical, otherwise the userManager will have
+ // the user objects cached and the value from case1 returned
+ $userManager->clearBackends();
+ $userManager->registerBackend($this->backend);
+ $users = $userManager->search('', 5, 0);
+
+ try {
+ foreach ($users as $user) {
+ $user->getHome();
+ print('User home was retrieved without throwing an Exception!' . PHP_EOL);
+ return false;
+ }
+ } catch (\Exception $e) {
+ if(strpos($e->getMessage(), 'Home dir attribute') === 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * homeDirectory on LDAP is set to "attr:" which is effectively empty.
+ * Return values of getHome should be ownCloud default.
+ *
+ * @return bool
+ */
+ protected function case3() {
+ \OC::$server->getConfig()->setAppValue('user_ldap', 'enforce_home_folder_naming_rule', true);
+ $this->connection->setConfiguration([
+ 'homeFolderNamingRule' => 'attr:',
+ ]);
+ $userManager = \oc::$server->getUserManager();
+ $userManager->clearBackends();
+ $userManager->registerBackend($this->backend);
+ $users = $userManager->search('', 5, 0);
+
+ try {
+ foreach ($users as $user) {
+ $home = $user->getHome();
+ $uid = $user->getUID();
+ $posFound = strpos($home, '/' . $uid);
+ $posExpected = strlen($home) - (strlen($uid) + 1);
+ if ($posFound === false || $posFound !== $posExpected) {
+ print('"' . $user->getUID() . '" was not found in "' . $home . '" or does not end with it.' . PHP_EOL);
+ return false;
+ }
+ }
+ } catch (\Exception $e) {
+ print("Unexpected Exception: " . $e->getMessage() . PHP_EOL);
+ return false;
+ }
+
+ return true;
+ }
+}
+
+require_once(__DIR__ . '/../setup-scripts/config.php');
+$test = new IntegrationTestUserHome($host, $port, $adn, $apwd, $bdn);
+$test->init();
+$test->run();
diff --git a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php
new file mode 100644
index 00000000000..a03d6b0c0c6
--- /dev/null
+++ b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php
@@ -0,0 +1,128 @@
+<?php
+
+use OCA\user_ldap\lib\user\User;
+use OCA\User_LDAP\Mapping\UserMapping;
+use OCA\user_ldap\tests\integration\AbstractIntegrationTest;
+
+require_once __DIR__ . '/../../../../../../lib/base.php';
+
+class IntegrationTestUserAvatar extends AbstractIntegrationTest {
+ /** @var UserMapping */
+ protected $mapping;
+
+ /**
+ * prepares the LDAP environment and sets up a test configuration for
+ * the LDAP backend.
+ */
+ public function init() {
+ require(__DIR__ . '/../../setup-scripts/createExplicitUsers.php');
+ parent::init();
+ $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection());
+ $this->mapping->clear();
+ $this->access->setUserMapper($this->mapping);
+ $userBackend = new OCA\user_ldap\USER_LDAP($this->access, \OC::$server->getConfig());
+ \OC_User::useBackend($userBackend);
+ }
+
+ /**
+ * A method that does the common steps of test cases 1 and 2. The evaluation
+ * is not happening here.
+ *
+ * @param string $dn
+ * @param string $username
+ * @param string $image
+ */
+ private function execFetchTest($dn, $username, $image) {
+ $this->setJpegPhotoAttribute($dn, $image);
+
+ // assigns our self-picked oc username to the dn
+ $this->mapping->map($dn, $username, 'fakeUUID-' . $username);
+
+ // initialize home folder and make sure that the user will update
+ // also remove an possibly existing avatar
+ \OC_Util::tearDownFS();
+ \OC_Util::setupFS($username);
+ \OC::$server->getUserFolder($username);
+ \OC::$server->getConfig()->deleteUserValue($username, 'user_ldap', User::USER_PREFKEY_LASTREFRESH);
+ if(\OC::$server->getAvatarManager()->getAvatar($username)->exists()) {
+ \OC::$server->getAvatarManager()->getAvatar($username)->remove();
+ }
+
+ // finally attempt to get the avatar set
+ $user = $this->userManager->get($dn);
+ $user->updateAvatar();
+ }
+
+ /**
+ * tests whether an avatar can be retrieved from LDAP and stored correctly
+ *
+ * @return bool
+ */
+ protected function case1() {
+ $image = file_get_contents(__DIR__ . '/../../data/avatar-valid.jpg');
+ $dn = 'uid=alice,ou=Users,' . $this->base;
+ $username = 'alice1337';
+
+ $this->execFetchTest($dn, $username, $image);
+
+ return \OC::$server->getAvatarManager()->getAvatar($username)->exists();
+ }
+
+ /**
+ * tests whether an image received from LDAP which is of an invalid file
+ * type is dealt with properly (i.e. not set and not dying).
+ *
+ * @return bool
+ */
+ protected function case2() {
+ // gif by Pmspinner from https://commons.wikimedia.org/wiki/File:Avatar2469_3.gif
+ $image = file_get_contents(__DIR__ . '/../../data/avatar-invalid.gif');
+ $dn = 'uid=boris,ou=Users,' . $this->base;
+ $username = 'boris7844';
+
+ $this->execFetchTest($dn, $username, $image);
+
+ return !\OC::$server->getAvatarManager()->getAvatar($username)->exists();
+ }
+
+ /**
+ * This writes an image to the 'jpegPhoto' attribute on LDAP.
+ *
+ * @param string $dn
+ * @param string $image An image read via file_get_contents
+ * @throws \OC\ServerNotAvailableException
+ */
+ private function setJpegPhotoAttribute($dn, $image) {
+ $changeSet = ['jpegphoto' => $image];
+ ldap_mod_add($this->connection->getConnectionResource(), $dn, $changeSet);
+ }
+
+ protected function initUserManager() {
+ $this->userManager = new \OCA\user_ldap\lib\user\Manager(
+ \OC::$server->getConfig(),
+ new \OCA\user_ldap\lib\FilesystemHelper(),
+ new \OCA\user_ldap\lib\LogWrapper(),
+ \OC::$server->getAvatarManager(),
+ new \OCP\Image(),
+ \OC::$server->getDatabaseConnection()
+ );
+ }
+
+ /**
+ * sets up the LDAP configuration to be used for the test
+ */
+ protected function initConnection() {
+ parent::initConnection();
+ $this->connection->setConfiguration([
+ 'ldapUserFilter' => 'objectclass=inetOrgPerson',
+ 'ldapUserDisplayName' => 'displayName',
+ 'ldapGroupDisplayName' => 'cn',
+ 'ldapLoginFilter' => 'uid=%uid',
+ ]);
+ }
+}
+
+require_once(__DIR__ . '/../../setup-scripts/config.php');
+$test = new IntegrationTestUserAvatar($host, $port, $adn, $apwd, $bdn);
+$test->init();
+$test->run();
diff --git a/apps/user_ldap/tests/integration/run-test.sh b/apps/user_ldap/tests/integration/run-test.sh
index e07e9b43408..7a29db25670 100755
--- a/apps/user_ldap/tests/integration/run-test.sh
+++ b/apps/user_ldap/tests/integration/run-test.sh
@@ -13,5 +13,5 @@ fi
# sleep is necessary, otherwise the LDAP server cannot be connected to, yet.
-setup-scripts/start.sh && sleep 2 && php -f "$TESTSCRIPT"
+setup-scripts/start.sh && sleep 5 && php -f "$TESTSCRIPT"
setup-scripts/stop.sh
diff --git a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
index ac21d48fd16..bb784d60f7b 100644
--- a/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
+++ b/apps/user_ldap/tests/integration/setup-scripts/createExplicitUsers.php
@@ -30,7 +30,7 @@ if (true) {
}
}
-$users = ['alice'];
+$users = ['alice', 'boris'];
foreach ($users as $uid) {
$newDN = 'uid=' . $uid . ',' . $ouDN;
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index caff30a0e60..a2f4b4ee9e5 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -266,7 +266,8 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
if($this->access->connection->isCached($cacheKey)) {
return $this->access->connection->getFromCache($cacheKey);
}
- if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0) {
+ if(strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0 &&
+ $this->access->connection->homeFolderNamingRule !== 'attr:') {
$attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:'));
$homedir = $this->access->readAttribute(
$this->access->username2dn($uid), $attr);
@@ -293,6 +294,10 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
//TODO: if home directory changes, the old one needs to be removed.
return $homedir;
}
+ if($this->ocConfig->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', true)) {
+ // a naming rule attribute is defined, but it doesn't exist for that LDAP user
+ throw new \Exception('Home dir attribute can\'t be read from LDAP for uid: ' . $uid);
+ }
}
//false will apply default behaviour as defined and done by OC_User
diff --git a/autotest.sh b/autotest.sh
index e9327c8f83e..0e112bfda32 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -21,7 +21,7 @@ DATABASEHOST=localhost
ADMINLOGIN=admin$EXECUTOR_NUMBER
BASEDIR=$PWD
-DBCONFIGS="sqlite mysql pgsql oci"
+DBCONFIGS="sqlite mysql mariadb pgsql oci"
# $PHP_EXE is run through 'which' and as such e.g. 'php' or 'hhvm' is usually
# sufficient. Due to the behaviour of 'which', $PHP_EXE may also be a path
@@ -127,7 +127,8 @@ fi
echo "Using database $DATABASENAME"
function execute_tests {
- echo "Setup environment for $1 testing ..."
+ DB=$1
+ echo "Setup environment for $DB testing ..."
# back to root folder
cd "$BASEDIR"
@@ -140,11 +141,43 @@ function execute_tests {
cp tests/preseed-config.php config/config.php
+ _DB=$DB
+
# drop database
- if [ "$1" == "mysql" ] ; then
+ if [ "$DB" == "mysql" ] ; then
mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
fi
- if [ "$1" == "pgsql" ] ; then
+ if [ "$DB" == "mariadb" ] ; then
+ if [ ! -z "$USEDOCKER" ] ; then
+ echo "Fire up the mariadb docker"
+ DOCKER_CONTAINER_ID=$(docker run \
+ -e MYSQL_ROOT_PASSWORD=owncloud \
+ -e MYSQL_USER="$DATABASEUSER" \
+ -e MYSQL_PASSWORD=owncloud \
+ -e MYSQL_DATABASE="$DATABASENAME" \
+ -d rullzer/mariadb-owncloud)
+ DATABASEHOST=$(docker inspect "$DOCKER_CONTAINER_ID" | grep IPAddress | cut -d '"' -f 4)
+
+ echo "Waiting for MariaDB initialisation ..."
+
+ # grep exits on the first match and then the script continues
+ timeout 30 docker logs -f $DOCKER_CONTAINER_ID 2>&1 | grep -q "mysqld: ready for connections."
+
+ echo "MariaDB is up."
+
+ else
+ if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ] ; then
+ echo "Your mysql binary is not provided by MariaDB"
+ echo "To use the docker container set the USEDOCKER enviroment variable"
+ exit -1
+ fi
+ mysql -u "$DATABASEUSER" -powncloud -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
+ fi
+
+ #Reset _DB to mysql since that is what we use internally
+ _DB="mysql"
+ fi
+ if [ "$DB" == "pgsql" ] ; then
if [ ! -z "$USEDOCKER" ] ; then
echo "Fire up the postgres docker"
DOCKER_CONTAINER_ID=$(docker run -e POSTGRES_USER="$DATABASEUSER" -e POSTGRES_PASSWORD=owncloud -d postgres)
@@ -160,7 +193,7 @@ function execute_tests {
dropdb -U "$DATABASEUSER" "$DATABASENAME" || true
fi
fi
- if [ "$1" == "oci" ] ; then
+ if [ "$DB" == "oci" ] ; then
echo "Fire up the oracle docker"
DOCKER_CONTAINER_ID=$(docker run -d deepdiver/docker-oracle-xe-11g)
DATABASEHOST=$(docker inspect "$DOCKER_CONTAINER_ID" | grep IPAddress | cut -d '"' -f 4)
@@ -176,20 +209,20 @@ function execute_tests {
# trigger installation
echo "Installing ...."
- "$PHP" ./occ maintenance:install --database="$1" --database-name="$DATABASENAME" --database-host="$DATABASEHOST" --database-user="$DATABASEUSER" --database-pass=owncloud --database-table-prefix=oc_ --admin-user="$ADMINLOGIN" --admin-pass=admin --data-dir="$DATADIR"
+ "$PHP" ./occ maintenance:install --database="$_DB" --database-name="$DATABASENAME" --database-host="$DATABASEHOST" --database-user="$DATABASEUSER" --database-pass=owncloud --database-table-prefix=oc_ --admin-user="$ADMINLOGIN" --admin-pass=admin --data-dir="$DATADIR"
#test execution
- echo "Testing with $1 ..."
+ echo "Testing with $DB ..."
cd tests
- rm -rf "coverage-html-$1"
- mkdir "coverage-html-$1"
+ rm -rf "coverage-html-$DB"
+ mkdir "coverage-html-$DB"
"$PHP" -f enable_all.php | grep -i -C9999 error && echo "Error during setup" && exit 101
if [ -z "$NOCOVERAGE" ]; then
- "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$1.xml" --coverage-clover "autotest-clover-$1.xml" --coverage-html "coverage-html-$1" "$2" "$3"
+ "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$DB.xml" --coverage-clover "autotest-clover-$DB.xml" --coverage-html "coverage-html-$DB" "$2" "$3"
RESULT=$?
else
echo "No coverage"
- "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$1.xml" "$2" "$3"
+ "${PHPUNIT[@]}" --configuration phpunit-autotest.xml --log-junit "autotest-results-$DB.xml" "$2" "$3"
RESULT=$?
fi
diff --git a/bower.json b/bower.json
index 1dc737b01ed..1fe270d9f3c 100644
--- a/bower.json
+++ b/bower.json
@@ -20,12 +20,13 @@
"jquery-migrate": "~1.2.1",
"jquery-ui": "1.10.0",
"jsTimezoneDetect": "~1.0.5",
- "moment": "~2.8.3",
+ "moment": "~2.10.0",
"select2": "~3.4.8",
"zxcvbn": "*",
"snapjs": "~2.0.0-rc1",
"strengthify": "0.4.1",
- "underscore": "~1.6.0",
- "bootstrap": "~3.3.5"
+ "underscore": "~1.8.0",
+ "bootstrap": "~3.3.5",
+ "backbone": "~1.2.1"
}
}
diff --git a/config/config.sample.php b/config/config.sample.php
index deecbec1ecb..3b5632087f6 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -975,7 +975,7 @@ $CONFIG = array(
* 2 -> Check every time the filesystem is used, causes a performance hit when
* using external storages, not recommended for regular use.
*/
-'filesystem_check_changes' => 1,
+'filesystem_check_changes' => 0,
/**
* All css and js files will be served by the web server statically in one js
diff --git a/core/avatar/avatarcontroller.php b/core/avatar/avatarcontroller.php
index 95baf23f4fa..2c4be827738 100644
--- a/core/avatar/avatarcontroller.php
+++ b/core/avatar/avatarcontroller.php
@@ -134,6 +134,10 @@ class AvatarController extends Controller {
if (isset($path)) {
$path = stripslashes($path);
$view = new \OC\Files\View('/'.$userId.'/files');
+ if ($view->filesize($path) > 20*1024*1024) {
+ return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]],
+ Http::STATUS_BAD_REQUEST);
+ }
$fileName = $view->getLocalFile($path);
} elseif (!is_null($files)) {
if (
@@ -141,6 +145,10 @@ class AvatarController extends Controller {
is_uploaded_file($files['tmp_name'][0]) &&
!\OC\Files\Filesystem::isFileBlacklisted($files['tmp_name'][0])
) {
+ if ($files['size'][0] > 20*1024*1024) {
+ return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]],
+ Http::STATUS_BAD_REQUEST);
+ }
$this->cache->set('avatar_upload', file_get_contents($files['tmp_name'][0]), 7200);
$view = new \OC\Files\View('/'.$userId.'/cache');
$fileName = $view->getLocalFile('avatar_upload');
diff --git a/core/command/db/converttype.php b/core/command/db/converttype.php
index e6c0f5caa35..dd91d86b8d7 100644
--- a/core/command/db/converttype.php
+++ b/core/command/db/converttype.php
@@ -115,11 +115,6 @@ class ConvertType extends Command {
'Converting to SQLite (sqlite3) is currently not supported.'
);
}
- if ($type === 'mssql') {
- throw new \InvalidArgumentException(
- 'Converting to Microsoft SQL Server (mssql) is currently not supported.'
- );
- }
if ($type === $this->config->getSystemValue('dbtype', '')) {
throw new \InvalidArgumentException(sprintf(
'Can not convert from %1$s to %1$s.',
diff --git a/core/command/maintenance/install.php b/core/command/maintenance/install.php
index 2fea5add438..7f5d9cae647 100644
--- a/core/command/maintenance/install.php
+++ b/core/command/maintenance/install.php
@@ -61,7 +61,10 @@ class Install extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
// validate the environment
- $setupHelper = new Setup($this->config, \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults());
+ $server = \OC::$server;
+ $setupHelper = new Setup($this->config, $server->getIniWrapper(),
+ $server->getL10N('lib'), new \OC_Defaults(), $server->getLogger(),
+ $server->getSecureRandom());
$sysInfo = $setupHelper->getSystemInfo(true);
$errors = $sysInfo['errors'];
if (count($errors) > 0) {
diff --git a/core/css/apps.css b/core/css/apps.css
index 57133729f15..5769120c5ed 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -417,7 +417,39 @@
min-height: 100%;
}
+/* APP-SIDEBAR ----------------------------------------------------------------*/
+
+/*
+ Sidebar: a sidebar to be used within #app-content
+ have it as first element within app-content in order to shrink other
+ sibling containers properly. Compare Files app for example.
+*/
+#app-sidebar {
+ position: fixed;
+ top: 45px;
+ right: 0;
+ left: auto;
+ bottom: 0;
+ width: 27%;
+ display: block;
+ background: #eee;
+ -webkit-transition: margin-right 300ms;
+ -moz-transition: margin-right 300ms;
+ -o-transition: margin-right 300ms;
+ transition: margin-right 300ms;
+ overflow-x: hidden;
+ overflow-y: auto;
+ visibility: visible;
+ z-index: 500;
+}
+#app-content.with-app-sidebar {
+ margin-right: 27%;
+}
+
+#app-sidebar.disappear {
+ visibility: hidden;
+}
/* APP-SETTINGS ---------------------------------------------------------------*/
@@ -556,3 +588,50 @@ em {
padding:16px;
}
+/* generic tab styles */
+.tabHeaders {
+ margin: 15px;
+ background-color: #1D2D44;
+}
+
+.tabHeaders .tabHeader {
+ float: left;
+ border: 1px solid #ddd;
+ padding: 5px;
+ cursor: pointer;
+ background-color: #f8f8f8;
+ font-weight: bold;
+}
+.tabHeaders .tabHeader, .tabHeaders .tabHeader a {
+ color: #888;
+}
+
+.tabHeaders .tabHeader:first-child {
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+
+.tabHeaders .tabHeader:last-child {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+
+.tabHeaders .tabHeader.selected,
+.tabHeaders .tabHeader:hover {
+ background-color: #e8e8e8;
+}
+
+.tabHeaders .tabHeader.selected,
+.tabHeaders .tabHeader.selected a,
+.tabHeaders .tabHeader:hover,
+.tabHeaders .tabHeader:hover a {
+ color: #000;
+}
+
+.tabsContainer {
+ clear: left;
+}
+
+.tabsContainer .tab {
+ padding: 15px;
+}
diff --git a/core/css/mobile.css b/core/css/mobile.css
index 80217d7069c..2256d821d73 100644
--- a/core/css/mobile.css
+++ b/core/css/mobile.css
@@ -103,6 +103,10 @@
z-index: 1000;
}
+#app-sidebar{
+ width: 100%;
+}
+
/* allow horizontal scrollbar in settings
otherwise user management is not usable on mobile */
#body-settings #app-content {
diff --git a/core/css/styles.css b/core/css/styles.css
index e019b874f61..db81f850303 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -278,6 +278,14 @@ input[type="submit"].enabled {
border: 1px solid #5e5;
}
+.input-button-inline {
+ position: absolute !important;
+ right: 0;
+ background-color: transparent !important;
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
+ opacity: .3;
+}
+
/* CONTENT ------------------------------------------------------------------ */
diff --git a/core/js/apps.js b/core/js/apps.js
index 71170bbc23a..d0d351f5147 100644
--- a/core/js/apps.js
+++ b/core/js/apps.js
@@ -21,6 +21,26 @@
};
/**
+ * Shows the #app-sidebar and add .with-app-sidebar to subsequent siblings
+ */
+ exports.Apps.showAppSidebar = function() {
+ var $appSidebar = $('#app-sidebar');
+ $appSidebar.removeClass('disappear')
+ $('#app-content').addClass('with-app-sidebar');
+
+ };
+
+ /**
+ * Shows the #app-sidebar and removes .with-app-sidebar from subsequent
+ * siblings
+ */
+ exports.Apps.hideAppSidebar = function() {
+ var $appSidebar = $('#app-sidebar');
+ $appSidebar.addClass('disappear');
+ $('#app-content').removeClass('with-app-sidebar');
+ };
+
+ /**
* Provides a way to slide down a target area through a button and slide it
* up if the user clicks somewhere else. Used for the news app settings and
* add new field.
diff --git a/core/js/core.json b/core/js/core.json
index 0f052b798a9..1053debaa99 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -20,6 +20,7 @@
"oc-dialogs.js",
"js.js",
"l10n.js",
+ "apps.js",
"share.js",
"octemplate.js",
"eventsource.js",
diff --git a/core/js/js.js b/core/js/js.js
index 8380d56e31e..72d4edd28dd 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1366,13 +1366,13 @@ function initCore() {
// if there is a scrollbar …
if($('#app-content').get(0).scrollHeight > $('#app-content').height()) {
if($(window).width() > 768) {
- controlsWidth = $('#content').width() - $('#app-navigation').width() - getScrollBarWidth();
+ controlsWidth = $('#content').width() - $('#app-navigation').width() - $('#app-sidebar').width() - getScrollBarWidth();
} else {
controlsWidth = $('#content').width() - getScrollBarWidth();
}
} else { // if there is none
if($(window).width() > 768) {
- controlsWidth = $('#content').width() - $('#app-navigation').width();
+ controlsWidth = $('#content').width() - $('#app-navigation').width() - $('#app-sidebar').width();
} else {
controlsWidth = $('#content').width();
}
@@ -1609,8 +1609,38 @@ OC.Util = {
}
}
return aa.length - bb.length;
+ },
+ /**
+ * Calls the callback in a given interval until it returns true
+ * @param {function} callback
+ * @param {integer} interval in milliseconds
+ */
+ waitFor: function(callback, interval) {
+ var internalCallback = function() {
+ if(callback() !== true) {
+ setTimeout(internalCallback, interval);
+ }
+ };
+
+ internalCallback();
+ },
+ /**
+ * Checks if a cookie with the given name is present and is set to the provided value.
+ * @param {string} name name of the cookie
+ * @param {string} value value of the cookie
+ * @return {boolean} true if the cookie with the given name has the given value
+ */
+ isCookieSetToValue: function(name, value) {
+ var cookies = document.cookie.split(';');
+ for (var i=0; i < cookies.length; i++) {
+ var cookie = cookies[i].split('=');
+ if (cookie[0].trim() === name && cookie[1].trim() === value) {
+ return true;
+ }
+ }
+ return false;
}
-}
+};
/**
* Utility class for the history API,
diff --git a/core/js/oc-backbone.js b/core/js/oc-backbone.js
new file mode 100644
index 00000000000..75a40979340
--- /dev/null
+++ b/core/js/oc-backbone.js
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2015
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+if(!_.isUndefined(Backbone)) {
+ OC.Backbone = Backbone.noConflict();
+}
diff --git a/core/js/setup.js b/core/js/setup.js
index cfa11a99c3a..cb299597451 100644
--- a/core/js/setup.js
+++ b/core/js/setup.js
@@ -4,8 +4,7 @@ $(document).ready(function() {
sqlite:!!$('#hasSQLite').val(),
mysql:!!$('#hasMySQL').val(),
postgresql:!!$('#hasPostgreSQL').val(),
- oracle:!!$('#hasOracle').val(),
- mssql:!!$('#hasMSSQL').val()
+ oracle:!!$('#hasOracle').val()
};
$('#selectDbType').buttonset();
@@ -28,7 +27,7 @@ $(document).ready(function() {
$('#dbname').attr('pattern','[0-9a-zA-Z$_-]+');
});
- $('#mysql,#pgsql,#mssql').click(function() {
+ $('#mysql,#pgsql').click(function() {
$('#use_other_db').slideDown(250);
$('#use_oracle_db').slideUp(250);
$('#sqliteInformation').hide();
diff --git a/core/js/share.js b/core/js/share.js
index d730d3bbf6e..99fd08c6411 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -820,6 +820,25 @@ OC.Share={
return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, '');
},
/**
+ * Parses a string to an valid integer (unix timestamp)
+ * @param time
+ * @returns {*}
+ * @internal Only used to work around a bug in the backend
+ */
+ _parseTime: function(time) {
+ if (_.isString(time)) {
+ // skip empty strings and hex values
+ if (time === '' || (time.length > 1 && time[0] === '0' && time[1] === 'x')) {
+ return null;
+ }
+ time = parseInt(time, 10);
+ if(isNaN(time)) {
+ time = null;
+ }
+ }
+ return time;
+ },
+ /**
* Displays the expiration date field
*
* @param {Date} date current expiration date
@@ -834,6 +853,8 @@ OC.Share={
minDate: minDate,
maxDate: null
};
+ // TODO: hack: backend returns string instead of integer
+ shareTime = OC.Share._parseTime(shareTime);
if (_.isNumber(shareTime)) {
shareTime = new Date(shareTime * 1000);
}
diff --git a/core/js/tests/specHelper.js b/core/js/tests/specHelper.js
index 29293e89bcb..dbe005ba2e9 100644
--- a/core/js/tests/specHelper.js
+++ b/core/js/tests/specHelper.js
@@ -121,6 +121,8 @@ window.isPhantom = /phantom/i.test(navigator.userAgent);
OC.TestUtil = TestUtil;
}
+ moment.locale('en');
+
// reset plugins
OC.Plugins._plugins = [];
diff --git a/core/js/tests/specs/shareSpec.js b/core/js/tests/specs/shareSpec.js
index 4e12f3bb0cf..3dc25134f59 100644
--- a/core/js/tests/specs/shareSpec.js
+++ b/core/js/tests/specs/shareSpec.js
@@ -1316,5 +1316,21 @@ describe('OC.Share tests', function() {
});
});
});
+ describe('OC.Share utils', function() {
+ it('parseTime should properly parse strings', function() {
+
+ _.each([
+ [ '123456', 123456],
+ [ 123456 , 123456],
+ ['0123456', 123456],
+ ['abcdefg', null],
+ ['0x12345', null],
+ [ '', null],
+ ], function(value) {
+ expect(OC.Share._parseTime(value[0])).toEqual(value[1]);
+ });
+
+ });
+ });
});
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index df8c8036a13..3e24ec26330 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Chyba opravy:",
"Following incompatible apps have been disabled: %s" : "Následující nekompatibilní aplikace byly zakázány: %s",
"Following apps have been disabled: %s" : "Následující aplikace byly vypnuty: %s",
+ "File is too big" : "Soubor je příliš velký",
"Invalid file provided" : "Zadán neplatný soubor",
"No image or file provided" : "Soubor nebo obrázek nebyl zadán",
"Unknown filetype" : "Neznámý typ souboru",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index c4d112e44b6..4069b611b5c 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -11,6 +11,7 @@
"Repair error: " : "Chyba opravy:",
"Following incompatible apps have been disabled: %s" : "Následující nekompatibilní aplikace byly zakázány: %s",
"Following apps have been disabled: %s" : "Následující aplikace byly vypnuty: %s",
+ "File is too big" : "Soubor je příliš velký",
"Invalid file provided" : "Zadán neplatný soubor",
"No image or file provided" : "Soubor nebo obrázek nebyl zadán",
"Unknown filetype" : "Neznámý typ souboru",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index c6f27c7124a..8c244641c34 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Reparationsfejl:",
"Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s",
"Following apps have been disabled: %s" : "Følgende apps er blevet deaktiveret: %s",
+ "File is too big" : "Filen er for stor",
"Invalid file provided" : "Der er angivet en ugyldig fil",
"No image or file provided" : "Ingen fil eller billede givet",
"Unknown filetype" : "Ukendt filtype",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index 9688cb28ed7..0b79a2731b4 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -11,6 +11,7 @@
"Repair error: " : "Reparationsfejl:",
"Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s",
"Following apps have been disabled: %s" : "Følgende apps er blevet deaktiveret: %s",
+ "File is too big" : "Filen er for stor",
"Invalid file provided" : "Der er angivet en ugyldig fil",
"No image or file provided" : "Ingen fil eller billede givet",
"Unknown filetype" : "Ukendt filtype",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index 6b206f8bb96..982e5383f07 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Error que reparar:",
"Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles se han deshabilitado: %s",
"Following apps have been disabled: %s" : "Siguiendo aplicaciones ha sido deshabilitado: %s",
+ "File is too big" : "El archivo es demasiado grande",
"Invalid file provided" : "Archivo inválido",
"No image or file provided" : "No se especificó ningún archivo o imagen",
"Unknown filetype" : "Tipo de archivo desconocido",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index ce593dac652..bf73857e4e9 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -11,6 +11,7 @@
"Repair error: " : "Error que reparar:",
"Following incompatible apps have been disabled: %s" : "Las siguientes apps incompatibles se han deshabilitado: %s",
"Following apps have been disabled: %s" : "Siguiendo aplicaciones ha sido deshabilitado: %s",
+ "File is too big" : "El archivo es demasiado grande",
"Invalid file provided" : "Archivo inválido",
"No image or file provided" : "No se especificó ningún archivo o imagen",
"Unknown filetype" : "Tipo de archivo desconocido",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index 52d8364c747..fbb7098a9c3 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Korjausvirhe:",
"Following incompatible apps have been disabled: %s" : "Seuraavat yhteensopimattomat sovellukset on poistettu käytöstä: %s",
"Following apps have been disabled: %s" : "Seuraavat sovellukset on poistettu käytöstä: %s",
+ "File is too big" : "Tiedosto on liian suuri",
"Invalid file provided" : "Määritetty virheellinen tiedosto",
"No image or file provided" : "Kuvaa tai tiedostoa ei määritelty",
"Unknown filetype" : "Tuntematon tiedostotyyppi",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 1738aeed31f..4dc72a9bef1 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -11,6 +11,7 @@
"Repair error: " : "Korjausvirhe:",
"Following incompatible apps have been disabled: %s" : "Seuraavat yhteensopimattomat sovellukset on poistettu käytöstä: %s",
"Following apps have been disabled: %s" : "Seuraavat sovellukset on poistettu käytöstä: %s",
+ "File is too big" : "Tiedosto on liian suuri",
"Invalid file provided" : "Määritetty virheellinen tiedosto",
"No image or file provided" : "Kuvaa tai tiedostoa ei määritelty",
"Unknown filetype" : "Tuntematon tiedostotyyppi",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index 0d37512f4f5..5bf08ff8613 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Arranxar o erro:",
"Following incompatible apps have been disabled: %s" : "As seguintes aplicacións incompatíbeis foron desactivadas: %s",
"Following apps have been disabled: %s" : "As seguintes aplicacións foron desactivadas: %s",
+ "File is too big" : "O ficheiro é grande de máis",
"Invalid file provided" : "O ficheiro fornecido non é válido",
"No image or file provided" : "Non forneceu ningunha imaxe ou ficheiro",
"Unknown filetype" : "Tipo de ficheiro descoñecido",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index b32d636ecd2..fc303761900 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -11,6 +11,7 @@
"Repair error: " : "Arranxar o erro:",
"Following incompatible apps have been disabled: %s" : "As seguintes aplicacións incompatíbeis foron desactivadas: %s",
"Following apps have been disabled: %s" : "As seguintes aplicacións foron desactivadas: %s",
+ "File is too big" : "O ficheiro é grande de máis",
"Invalid file provided" : "O ficheiro fornecido non é válido",
"No image or file provided" : "Non forneceu ningunha imaxe ou ficheiro",
"Unknown filetype" : "Tipo de ficheiro descoñecido",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 0651fca572a..67438dc4c98 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Errore di riparazione:",
"Following incompatible apps have been disabled: %s" : "Le seguenti applicazioni incompatibili sono state disabilitate: %s",
"Following apps have been disabled: %s" : "Le seguenti applicazioni sono state disabilitate: %s",
+ "File is too big" : "Il file è troppo grande",
"Invalid file provided" : "File non valido fornito",
"No image or file provided" : "Non è stata fornita alcun immagine o file",
"Unknown filetype" : "Tipo di file sconosciuto",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index e89883fbedf..05f260041d8 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -11,6 +11,7 @@
"Repair error: " : "Errore di riparazione:",
"Following incompatible apps have been disabled: %s" : "Le seguenti applicazioni incompatibili sono state disabilitate: %s",
"Following apps have been disabled: %s" : "Le seguenti applicazioni sono state disabilitate: %s",
+ "File is too big" : "Il file è troppo grande",
"Invalid file provided" : "File non valido fornito",
"No image or file provided" : "Non è stata fornita alcun immagine o file",
"Unknown filetype" : "Tipo di file sconosciuto",
diff --git a/core/l10n/lt_LT.js b/core/l10n/lt_LT.js
index 7c27d780e38..64f62a8762b 100644
--- a/core/l10n/lt_LT.js
+++ b/core/l10n/lt_LT.js
@@ -4,6 +4,7 @@ OC.L10N.register(
"Couldn't send mail to following users: %s " : "Nepavyko nusiųsti el. pašto šiems naudotojams: %s ",
"Turned on maintenance mode" : "Įjungta priežiūros veiksena",
"Turned off maintenance mode" : "Išjungta priežiūros veiksena",
+ "Maintenance mode is kept active" : "Priežiūros veiksena yra aktyvi",
"Updated database" : "Atnaujinta duomenų bazė",
"No image or file provided" : "Nenurodytas paveikslėlis ar failas",
"Unknown filetype" : "Nežinomas failo tipas",
@@ -37,6 +38,7 @@ OC.L10N.register(
"Error loading file picker template: {error}" : "Klaida įkeliant failo parinkimo ruošinį: {error}",
"Ok" : "Gerai",
"Error loading message template: {error}" : "Klaida įkeliant žinutės ruošinį: {error}",
+ "read-only" : "tik skaitymui",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"],
"One file conflict" : "Vienas failo konfliktas",
"Which files do you want to keep?" : "Kuriuos failus norite laikyti?",
@@ -55,6 +57,7 @@ OC.L10N.register(
"Shared with you and the group {group} by {owner}" : "Pasidalino su Jumis ir {group} grupe {owner}",
"Shared with you by {owner}" : "Pasidalino su Jumis {owner}",
"Share link" : "Dalintis nuoroda",
+ "Link" : "Nuoroda",
"Password protect" : "Apsaugotas slaptažodžiu",
"Password" : "Slaptažodis",
"Email link to person" : "Nusiųsti nuorodą paštu",
@@ -63,6 +66,7 @@ OC.L10N.register(
"Expiration" : "Galiojimo laikas",
"Expiration date" : "Galiojimo laikas",
"group" : "grupė",
+ "remote" : "nutolęs",
"Resharing is not allowed" : "Dalijinasis išnaujo negalimas",
"Shared in {item} with {user}" : "Pasidalino {item} su {user}",
"Unshare" : "Nebesidalinti",
@@ -71,6 +75,7 @@ OC.L10N.register(
"can edit" : "gali redaguoti",
"access control" : "priėjimo kontrolė",
"create" : "sukurti",
+ "change" : "keisti",
"delete" : "ištrinti",
"Password protected" : "Apsaugota slaptažodžiu",
"Error unsetting expiration date" : "Klaida nuimant galiojimo laiką",
@@ -85,11 +90,14 @@ OC.L10N.register(
"Edit tags" : "Redaguoti žymes",
"Error loading dialog template: {error}" : "Klaida įkeliant dialogo ruošinį: {error}",
"No tags selected for deletion." : "Trynimui nepasirinkta jokia žymė.",
+ "Hello world!" : "Sveikas pasauli!",
+ "sunny" : "saulėta",
"Please reload the page." : "Prašome perkrauti puslapį.",
"The update was successful. Redirecting you to ownCloud now." : "Atnaujinimas buvo sėkmingas. Nukreipiame į jūsų ownCloud.",
"%s password reset" : "%s slaptažodžio atnaujinimas",
"Use the following link to reset your password: {link}" : "Slaptažodio atkūrimui naudokite šią nuorodą: {link}",
"New password" : "Naujas slaptažodis",
+ "New Password" : "Naujas slaptažodis",
"Reset password" : "Atkurti slaptažodį",
"Personal" : "Asmeniniai",
"Users" : "Vartotojai",
@@ -104,9 +112,14 @@ OC.L10N.register(
"Error favoriting" : "Klaida įtraukiant į mėgstamus.",
"Error unfavoriting" : "Klaida pašalinant iš mėgstamų.",
"Access forbidden" : "Priėjimas draudžiamas",
+ "File not found" : "Failas nerastas",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Labas,\n\nInformuojame, kad %s pasidalino su Jumis %s.\nPažiūrėti tai: %s\n",
"The share will expire on %s." : "Bendrinimo laikas baigsis %s.",
"Cheers!" : "Sveikinimai!",
+ "Internal Server Error" : "Vidinė serverio klaida",
+ "Technical details" : "Techniniai duomenys",
+ "Trace" : "Sekti",
+ "Security warning" : "Saugumo perspėjimas",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Jūsų failai yra tikriausiai prieinami per internetą nes .htaccess failas neveikia.",
"For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Kad gauti informaciją apie tai kaip tinkamai sukonfigūruoti savo serverį, prašome skaityti <a href=\"%s\" target=\"_blank\">dokumentaciją</a>.",
"Create an <strong>admin account</strong>" : "Sukurti <strong>administratoriaus paskyrą</strong>",
diff --git a/core/l10n/lt_LT.json b/core/l10n/lt_LT.json
index 79184dfdb27..0dae47445c6 100644
--- a/core/l10n/lt_LT.json
+++ b/core/l10n/lt_LT.json
@@ -2,6 +2,7 @@
"Couldn't send mail to following users: %s " : "Nepavyko nusiųsti el. pašto šiems naudotojams: %s ",
"Turned on maintenance mode" : "Įjungta priežiūros veiksena",
"Turned off maintenance mode" : "Išjungta priežiūros veiksena",
+ "Maintenance mode is kept active" : "Priežiūros veiksena yra aktyvi",
"Updated database" : "Atnaujinta duomenų bazė",
"No image or file provided" : "Nenurodytas paveikslėlis ar failas",
"Unknown filetype" : "Nežinomas failo tipas",
@@ -35,6 +36,7 @@
"Error loading file picker template: {error}" : "Klaida įkeliant failo parinkimo ruošinį: {error}",
"Ok" : "Gerai",
"Error loading message template: {error}" : "Klaida įkeliant žinutės ruošinį: {error}",
+ "read-only" : "tik skaitymui",
"_{count} file conflict_::_{count} file conflicts_" : ["{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"],
"One file conflict" : "Vienas failo konfliktas",
"Which files do you want to keep?" : "Kuriuos failus norite laikyti?",
@@ -53,6 +55,7 @@
"Shared with you and the group {group} by {owner}" : "Pasidalino su Jumis ir {group} grupe {owner}",
"Shared with you by {owner}" : "Pasidalino su Jumis {owner}",
"Share link" : "Dalintis nuoroda",
+ "Link" : "Nuoroda",
"Password protect" : "Apsaugotas slaptažodžiu",
"Password" : "Slaptažodis",
"Email link to person" : "Nusiųsti nuorodą paštu",
@@ -61,6 +64,7 @@
"Expiration" : "Galiojimo laikas",
"Expiration date" : "Galiojimo laikas",
"group" : "grupė",
+ "remote" : "nutolęs",
"Resharing is not allowed" : "Dalijinasis išnaujo negalimas",
"Shared in {item} with {user}" : "Pasidalino {item} su {user}",
"Unshare" : "Nebesidalinti",
@@ -69,6 +73,7 @@
"can edit" : "gali redaguoti",
"access control" : "priėjimo kontrolė",
"create" : "sukurti",
+ "change" : "keisti",
"delete" : "ištrinti",
"Password protected" : "Apsaugota slaptažodžiu",
"Error unsetting expiration date" : "Klaida nuimant galiojimo laiką",
@@ -83,11 +88,14 @@
"Edit tags" : "Redaguoti žymes",
"Error loading dialog template: {error}" : "Klaida įkeliant dialogo ruošinį: {error}",
"No tags selected for deletion." : "Trynimui nepasirinkta jokia žymė.",
+ "Hello world!" : "Sveikas pasauli!",
+ "sunny" : "saulėta",
"Please reload the page." : "Prašome perkrauti puslapį.",
"The update was successful. Redirecting you to ownCloud now." : "Atnaujinimas buvo sėkmingas. Nukreipiame į jūsų ownCloud.",
"%s password reset" : "%s slaptažodžio atnaujinimas",
"Use the following link to reset your password: {link}" : "Slaptažodio atkūrimui naudokite šią nuorodą: {link}",
"New password" : "Naujas slaptažodis",
+ "New Password" : "Naujas slaptažodis",
"Reset password" : "Atkurti slaptažodį",
"Personal" : "Asmeniniai",
"Users" : "Vartotojai",
@@ -102,9 +110,14 @@
"Error favoriting" : "Klaida įtraukiant į mėgstamus.",
"Error unfavoriting" : "Klaida pašalinant iš mėgstamų.",
"Access forbidden" : "Priėjimas draudžiamas",
+ "File not found" : "Failas nerastas",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Labas,\n\nInformuojame, kad %s pasidalino su Jumis %s.\nPažiūrėti tai: %s\n",
"The share will expire on %s." : "Bendrinimo laikas baigsis %s.",
"Cheers!" : "Sveikinimai!",
+ "Internal Server Error" : "Vidinė serverio klaida",
+ "Technical details" : "Techniniai duomenys",
+ "Trace" : "Sekti",
+ "Security warning" : "Saugumo perspėjimas",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Jūsų failai yra tikriausiai prieinami per internetą nes .htaccess failas neveikia.",
"For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Kad gauti informaciją apie tai kaip tinkamai sukonfigūruoti savo serverį, prašome skaityti <a href=\"%s\" target=\"_blank\">dokumentaciją</a>.",
"Create an <strong>admin account</strong>" : "Sukurti <strong>administratoriaus paskyrą</strong>",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index 08cda274ab7..3d4843bcb81 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "Reparação de erro:",
"Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s",
"Following apps have been disabled: %s" : "Os seguintes aplicativos foram desabilitados: %s",
+ "File is too big" : "O arquivo é muito grande",
"Invalid file provided" : "Arquivo fornecido inválido",
"No image or file provided" : "Nenhuma imagem ou arquivo fornecido",
"Unknown filetype" : "Tipo de arquivo desconhecido",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index ddce0d164c1..d4e2fe1fd3f 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -11,6 +11,7 @@
"Repair error: " : "Reparação de erro:",
"Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s",
"Following apps have been disabled: %s" : "Os seguintes aplicativos foram desabilitados: %s",
+ "File is too big" : "O arquivo é muito grande",
"Invalid file provided" : "Arquivo fornecido inválido",
"No image or file provided" : "Nenhuma imagem ou arquivo fornecido",
"Unknown filetype" : "Tipo de arquivo desconhecido",
diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js
index d40f2890fbc..9e56c2e84d1 100644
--- a/core/l10n/th_TH.js
+++ b/core/l10n/th_TH.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"Repair error: " : "เกิดข้อผิดพลาดในการซ่อมแซม:",
"Following incompatible apps have been disabled: %s" : "แอพพลิเคชันต่อไปนี้เข้ากันไม่ได้มันจะถูกปิดการใช้งาน: %s",
"Following apps have been disabled: %s" : "แอพฯดังต่อไปนี้ถูกปิดการใช้งาน: %s",
+ "File is too big" : "ไฟล์มีขนาดใหญ่เกินไป",
"Invalid file provided" : "ระบุไฟล์ไม่ถูกต้อง",
"No image or file provided" : "ไม่มีรูปภาพหรือไฟล์ที่ระบุ",
"Unknown filetype" : "ไม่รู้จักชนิดของไฟล์",
@@ -217,7 +218,7 @@ OC.L10N.register(
"An internal error occured." : "เกิดข้อผิดพลาดภายใน",
"Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบ",
"Forgot your password? Reset it!" : "ลืมรหัสผ่าน?",
- "remember" : "จำรหัสผ่าน",
+ "remember" : "จดจำฉัน",
"Log in" : "เข้าสู่ระบบ",
"Alternative Logins" : "ทางเลือกการเข้าสู่ระบบ",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "นี่คุณ,<br><br>อยากให้คุณทราบว่า %s ได้แชร์ <strong>%s</strong> กับคุณ <br><a href=\"%s\">คลิกดูที่นี่</a><br><br>",
diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json
index f5a93c5a335..8dc55d8f0e7 100644
--- a/core/l10n/th_TH.json
+++ b/core/l10n/th_TH.json
@@ -11,6 +11,7 @@
"Repair error: " : "เกิดข้อผิดพลาดในการซ่อมแซม:",
"Following incompatible apps have been disabled: %s" : "แอพพลิเคชันต่อไปนี้เข้ากันไม่ได้มันจะถูกปิดการใช้งาน: %s",
"Following apps have been disabled: %s" : "แอพฯดังต่อไปนี้ถูกปิดการใช้งาน: %s",
+ "File is too big" : "ไฟล์มีขนาดใหญ่เกินไป",
"Invalid file provided" : "ระบุไฟล์ไม่ถูกต้อง",
"No image or file provided" : "ไม่มีรูปภาพหรือไฟล์ที่ระบุ",
"Unknown filetype" : "ไม่รู้จักชนิดของไฟล์",
@@ -215,7 +216,7 @@
"An internal error occured." : "เกิดข้อผิดพลาดภายใน",
"Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบ",
"Forgot your password? Reset it!" : "ลืมรหัสผ่าน?",
- "remember" : "จำรหัสผ่าน",
+ "remember" : "จดจำฉัน",
"Log in" : "เข้าสู่ระบบ",
"Alternative Logins" : "ทางเลือกการเข้าสู่ระบบ",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "นี่คุณ,<br><br>อยากให้คุณทราบว่า %s ได้แชร์ <strong>%s</strong> กับคุณ <br><a href=\"%s\">คลิกดูที่นี่</a><br><br>",
diff --git a/core/templates/installation.php b/core/templates/installation.php
index b686a1ca68c..8db55e4bdab 100644
--- a/core/templates/installation.php
+++ b/core/templates/installation.php
@@ -8,7 +8,6 @@ script('core', [
<input type='hidden' id='hasSQLite' value='<?php p($_['hasSQLite']) ?>'>
<input type='hidden' id='hasPostgreSQL' value='<?php p($_['hasPostgreSQL']) ?>'>
<input type='hidden' id='hasOracle' value='<?php p($_['hasOracle']) ?>'>
-<input type='hidden' id='hasMSSQL' value='<?php p($_['hasMSSQL']) ?>'>
<form action="index.php" method="post">
<input type="hidden" name="install" value="true">
<?php if(count($_['errors']) > 0): ?>
@@ -79,7 +78,7 @@ script('core', [
<?php if(!$_['dbIsSet'] OR count($_['errors']) > 0): ?>
<fieldset id='databaseBackend'>
- <?php if($_['hasMySQL'] or $_['hasPostgreSQL'] or $_['hasOracle'] or $_['hasMSSQL'])
+ <?php if($_['hasMySQL'] or $_['hasPostgreSQL'] or $_['hasOracle'])
$hasOtherDB = true; else $hasOtherDB =false; //other than SQLite ?>
<legend><?php p($l->t( 'Configure the database' )); ?></legend>
<div id="selectDbType">
diff --git a/core/templates/layout.base.php b/core/templates/layout.base.php
index a5336b1585a..43d692c0364 100644
--- a/core/templates/layout.base.php
+++ b/core/templates/layout.base.php
@@ -9,6 +9,7 @@
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
+ <meta name="theme-color" content="<?php p($theme->getMailHeaderColor()); ?>">
<link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path('', 'favicon.png')); ?>">
<link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>">
<?php foreach ($_['cssfiles'] as $cssfile): ?>
diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php
index 0557e89ce71..0fd7521271d 100644
--- a/core/templates/layout.guest.php
+++ b/core/templates/layout.guest.php
@@ -10,6 +10,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-itunes-app" content="app-id=<?php p($theme->getiTunesAppId()); ?>">
+ <meta name="theme-color" content="<?php p($theme->getMailHeaderColor()); ?>">
<link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path('', 'favicon.png')); ?>">
<link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path('', 'favicon-touch.png')); ?>">
<?php foreach($_['cssfiles'] as $cssfile): ?>
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 61f164719d0..2f93a30ba6a 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -21,6 +21,7 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="<?php p((!empty($_['application']) && $_['appid']!='files')? $_['application']:'ownCloud'); ?>">
<meta name="mobile-web-app-capable" content="yes">
+ <meta name="theme-color" content="<?php p($theme->getMailHeaderColor()); ?>">
<link rel="shortcut icon" type="image/png" href="<?php print_unescaped(image_path($_['appid'], 'favicon.png')); ?>">
<link rel="apple-touch-icon-precomposed" href="<?php print_unescaped(image_path($_['appid'], 'favicon-touch.png')); ?>">
<?php foreach($_['cssfiles'] as $cssfile): ?>
diff --git a/core/vendor/.gitignore b/core/vendor/.gitignore
index 95ad4d67ea6..bcbb59b6f24 100644
--- a/core/vendor/.gitignore
+++ b/core/vendor/.gitignore
@@ -30,6 +30,7 @@ moment/locale
moment/min/**
moment/moment.js
moment/scripts
+moment/templates
!moment/min/moment-with-locales.js
# jquery
@@ -118,3 +119,6 @@ bootstrap/**
!bootstrap/js
bootstrap/js/*
!bootstrap/js/tooltip.js
+
+# backbone
+backbone/backbone-min*
diff --git a/core/vendor/backbone/.bower.json b/core/vendor/backbone/.bower.json
new file mode 100644
index 00000000000..578c8ffb669
--- /dev/null
+++ b/core/vendor/backbone/.bower.json
@@ -0,0 +1,33 @@
+{
+ "name": "backbone",
+ "version": "1.2.1",
+ "main": "backbone.js",
+ "dependencies": {
+ "underscore": ">=1.7.0"
+ },
+ "ignore": [
+ "docs",
+ "examples",
+ "test",
+ "*.yml",
+ "*.html",
+ "*.ico",
+ "*.md",
+ "CNAME",
+ ".*",
+ "karma.*",
+ "component.json",
+ "package.json"
+ ],
+ "homepage": "https://github.com/jashkenas/backbone",
+ "_release": "1.2.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "1.2.1",
+ "commit": "938a8ff934fd4de4f0009f68d43f500f5920b490"
+ },
+ "_source": "git://github.com/jashkenas/backbone.git",
+ "_target": "~1.2.1",
+ "_originalSource": "backbone",
+ "_direct": true
+} \ No newline at end of file
diff --git a/core/vendor/backbone/LICENSE b/core/vendor/backbone/LICENSE
new file mode 100644
index 00000000000..184d1b99645
--- /dev/null
+++ b/core/vendor/backbone/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2010-2015 Jeremy Ashkenas, DocumentCloud
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/core/vendor/backbone/backbone.js b/core/vendor/backbone/backbone.js
new file mode 100644
index 00000000000..58800425c70
--- /dev/null
+++ b/core/vendor/backbone/backbone.js
@@ -0,0 +1,1873 @@
+// Backbone.js 1.2.1
+
+// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://backbonejs.org
+
+(function(factory) {
+
+ // Establish the root object, `window` (`self`) in the browser, or `global` on the server.
+ // We use `self` instead of `window` for `WebWorker` support.
+ var root = (typeof self == 'object' && self.self == self && self) ||
+ (typeof global == 'object' && global.global == global && global);
+
+ // Set up Backbone appropriately for the environment. Start with AMD.
+ if (typeof define === 'function' && define.amd) {
+ define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
+ // Export global even in AMD case in case this script is loaded with
+ // others that may still expect a global Backbone.
+ root.Backbone = factory(root, exports, _, $);
+ });
+
+ // Next for Node.js or CommonJS. jQuery may not be needed as a module.
+ } else if (typeof exports !== 'undefined') {
+ var _ = require('underscore'), $;
+ try { $ = require('jquery'); } catch(e) {}
+ factory(root, exports, _, $);
+
+ // Finally, as a browser global.
+ } else {
+ root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));
+ }
+
+}(function(root, Backbone, _, $) {
+
+ // Initial Setup
+ // -------------
+
+ // Save the previous value of the `Backbone` variable, so that it can be
+ // restored later on, if `noConflict` is used.
+ var previousBackbone = root.Backbone;
+
+ // Create a local reference to a common array method we'll want to use later.
+ var slice = [].slice;
+
+ // Current version of the library. Keep in sync with `package.json`.
+ Backbone.VERSION = '1.2.1';
+
+ // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
+ // the `$` variable.
+ Backbone.$ = $;
+
+ // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable
+ // to its previous owner. Returns a reference to this Backbone object.
+ Backbone.noConflict = function() {
+ root.Backbone = previousBackbone;
+ return this;
+ };
+
+ // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option
+ // will fake `"PATCH"`, `"PUT"` and `"DELETE"` requests via the `_method` parameter and
+ // set a `X-Http-Method-Override` header.
+ Backbone.emulateHTTP = false;
+
+ // Turn on `emulateJSON` to support legacy servers that can't deal with direct
+ // `application/json` requests ... this will encode the body as
+ // `application/x-www-form-urlencoded` instead and will send the model in a
+ // form param named `model`.
+ Backbone.emulateJSON = false;
+
+ // Proxy Underscore methods to a Backbone class' prototype using a
+ // particular attribute as the data argument
+ var addMethod = function(length, method, attribute) {
+ switch (length) {
+ case 1: return function() {
+ return _[method](this[attribute]);
+ };
+ case 2: return function(value) {
+ return _[method](this[attribute], value);
+ };
+ case 3: return function(iteratee, context) {
+ return _[method](this[attribute], iteratee, context);
+ };
+ case 4: return function(iteratee, defaultVal, context) {
+ return _[method](this[attribute], iteratee, defaultVal, context);
+ };
+ default: return function() {
+ var args = slice.call(arguments);
+ args.unshift(this[attribute]);
+ return _[method].apply(_, args);
+ };
+ }
+ };
+ var addUnderscoreMethods = function(Class, methods, attribute) {
+ _.each(methods, function(length, method) {
+ if (_[method]) Class.prototype[method] = addMethod(length, method, attribute);
+ });
+ };
+
+ // Backbone.Events
+ // ---------------
+
+ // A module that can be mixed in to *any object* in order to provide it with
+ // custom events. You may bind with `on` or remove with `off` callback
+ // functions to an event; `trigger`-ing an event fires all callbacks in
+ // succession.
+ //
+ // var object = {};
+ // _.extend(object, Backbone.Events);
+ // object.on('expand', function(){ alert('expanded'); });
+ // object.trigger('expand');
+ //
+ var Events = Backbone.Events = {};
+
+ // Regular expression used to split event strings.
+ var eventSplitter = /\s+/;
+
+ // Iterates over the standard `event, callback` (as well as the fancy multiple
+ // space-separated events `"change blur", callback` and jQuery-style event
+ // maps `{event: callback}`), reducing them by manipulating `memo`.
+ // Passes a normalized single event name and callback, as well as any
+ // optional `opts`.
+ var eventsApi = function(iteratee, memo, name, callback, opts) {
+ var i = 0, names;
+ if (name && typeof name === 'object') {
+ // Handle event maps.
+ if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback;
+ for (names = _.keys(name); i < names.length ; i++) {
+ memo = iteratee(memo, names[i], name[names[i]], opts);
+ }
+ } else if (name && eventSplitter.test(name)) {
+ // Handle space separated event names.
+ for (names = name.split(eventSplitter); i < names.length; i++) {
+ memo = iteratee(memo, names[i], callback, opts);
+ }
+ } else {
+ memo = iteratee(memo, name, callback, opts);
+ }
+ return memo;
+ };
+
+ // Bind an event to a `callback` function. Passing `"all"` will bind
+ // the callback to all events fired.
+ Events.on = function(name, callback, context) {
+ return internalOn(this, name, callback, context);
+ };
+
+ // An internal use `on` function, used to guard the `listening` argument from
+ // the public API.
+ var internalOn = function(obj, name, callback, context, listening) {
+ obj._events = eventsApi(onApi, obj._events || {}, name, callback, {
+ context: context,
+ ctx: obj,
+ listening: listening
+ });
+
+ if (listening) {
+ var listeners = obj._listeners || (obj._listeners = {});
+ listeners[listening.id] = listening;
+ }
+
+ return obj;
+ };
+
+ // Inversion-of-control versions of `on`. Tell *this* object to listen to
+ // an event in another object... keeping track of what it's listening to.
+ Events.listenTo = function(obj, name, callback) {
+ if (!obj) return this;
+ var id = obj._listenId || (obj._listenId = _.uniqueId('l'));
+ var listeningTo = this._listeningTo || (this._listeningTo = {});
+ var listening = listeningTo[id];
+
+ // This object is not listening to any other events on `obj` yet.
+ // Setup the necessary references to track the listening callbacks.
+ if (!listening) {
+ var thisId = this._listenId || (this._listenId = _.uniqueId('l'));
+ listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0};
+ }
+
+ // Bind callbacks on obj, and keep track of them on listening.
+ internalOn(obj, name, callback, this, listening);
+ return this;
+ };
+
+ // The reducing API that adds a callback to the `events` object.
+ var onApi = function(events, name, callback, options) {
+ if (callback) {
+ var handlers = events[name] || (events[name] = []);
+ var context = options.context, ctx = options.ctx, listening = options.listening;
+ if (listening) listening.count++;
+
+ handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening });
+ }
+ return events;
+ };
+
+ // Remove one or many callbacks. If `context` is null, removes all
+ // callbacks with that function. If `callback` is null, removes all
+ // callbacks for the event. If `name` is null, removes all bound
+ // callbacks for all events.
+ Events.off = function(name, callback, context) {
+ if (!this._events) return this;
+ this._events = eventsApi(offApi, this._events, name, callback, {
+ context: context,
+ listeners: this._listeners
+ });
+ return this;
+ };
+
+ // Tell this object to stop listening to either specific events ... or
+ // to every object it's currently listening to.
+ Events.stopListening = function(obj, name, callback) {
+ var listeningTo = this._listeningTo;
+ if (!listeningTo) return this;
+
+ var ids = obj ? [obj._listenId] : _.keys(listeningTo);
+
+ for (var i = 0; i < ids.length; i++) {
+ var listening = listeningTo[ids[i]];
+
+ // If listening doesn't exist, this object is not currently
+ // listening to obj. Break out early.
+ if (!listening) break;
+
+ listening.obj.off(name, callback, this);
+ }
+ if (_.isEmpty(listeningTo)) this._listeningTo = void 0;
+
+ return this;
+ };
+
+ // The reducing API that removes a callback from the `events` object.
+ var offApi = function(events, name, callback, options) {
+ // No events to consider.
+ if (!events) return;
+
+ var i = 0, listening;
+ var context = options.context, listeners = options.listeners;
+
+ // Delete all events listeners and "drop" events.
+ if (!name && !callback && !context) {
+ var ids = _.keys(listeners);
+ for (; i < ids.length; i++) {
+ listening = listeners[ids[i]];
+ delete listeners[listening.id];
+ delete listening.listeningTo[listening.objId];
+ }
+ return;
+ }
+
+ var names = name ? [name] : _.keys(events);
+ for (; i < names.length; i++) {
+ name = names[i];
+ var handlers = events[name];
+
+ // Bail out if there are no events stored.
+ if (!handlers) break;
+
+ // Replace events if there are any remaining. Otherwise, clean up.
+ var remaining = [];
+ for (var j = 0; j < handlers.length; j++) {
+ var handler = handlers[j];
+ if (
+ callback && callback !== handler.callback &&
+ callback !== handler.callback._callback ||
+ context && context !== handler.context
+ ) {
+ remaining.push(handler);
+ } else {
+ listening = handler.listening;
+ if (listening && --listening.count === 0) {
+ delete listeners[listening.id];
+ delete listening.listeningTo[listening.objId];
+ }
+ }
+ }
+
+ // Update tail event if the list has any events. Otherwise, clean up.
+ if (remaining.length) {
+ events[name] = remaining;
+ } else {
+ delete events[name];
+ }
+ }
+ if (_.size(events)) return events;
+ };
+
+ // Bind an event to only be triggered a single time. After the first time
+ // the callback is invoked, it will be removed. When multiple events are
+ // passed in using the space-separated syntax, the event will fire once for every
+ // event you passed in, not once for a combination of all events
+ Events.once = function(name, callback, context) {
+ // Map the event into a `{event: once}` object.
+ var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));
+ return this.on(events, void 0, context);
+ };
+
+ // Inversion-of-control versions of `once`.
+ Events.listenToOnce = function(obj, name, callback) {
+ // Map the event into a `{event: once}` object.
+ var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj));
+ return this.listenTo(obj, events);
+ };
+
+ // Reduces the event callbacks into a map of `{event: onceWrapper}`.
+ // `offer` unbinds the `onceWrapper` after it has been called.
+ var onceMap = function(map, name, callback, offer) {
+ if (callback) {
+ var once = map[name] = _.once(function() {
+ offer(name, once);
+ callback.apply(this, arguments);
+ });
+ once._callback = callback;
+ }
+ return map;
+ };
+
+ // Trigger one or many events, firing all bound callbacks. Callbacks are
+ // passed the same arguments as `trigger` is, apart from the event name
+ // (unless you're listening on `"all"`, which will cause your callback to
+ // receive the true name of the event as the first argument).
+ Events.trigger = function(name) {
+ if (!this._events) return this;
+
+ var length = Math.max(0, arguments.length - 1);
+ var args = Array(length);
+ for (var i = 0; i < length; i++) args[i] = arguments[i + 1];
+
+ eventsApi(triggerApi, this._events, name, void 0, args);
+ return this;
+ };
+
+ // Handles triggering the appropriate event callbacks.
+ var triggerApi = function(objEvents, name, cb, args) {
+ if (objEvents) {
+ var events = objEvents[name];
+ var allEvents = objEvents.all;
+ if (events && allEvents) allEvents = allEvents.slice();
+ if (events) triggerEvents(events, args);
+ if (allEvents) triggerEvents(allEvents, [name].concat(args));
+ }
+ return objEvents;
+ };
+
+ // A difficult-to-believe, but optimized internal dispatch function for
+ // triggering events. Tries to keep the usual cases speedy (most internal
+ // Backbone events have 3 arguments).
+ var triggerEvents = function(events, args) {
+ var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
+ switch (args.length) {
+ case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
+ case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
+ case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
+ case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
+ default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;
+ }
+ };
+
+ // Aliases for backwards compatibility.
+ Events.bind = Events.on;
+ Events.unbind = Events.off;
+
+ // Allow the `Backbone` object to serve as a global event bus, for folks who
+ // want global "pubsub" in a convenient place.
+ _.extend(Backbone, Events);
+
+ // Backbone.Model
+ // --------------
+
+ // Backbone **Models** are the basic data object in the framework --
+ // frequently representing a row in a table in a database on your server.
+ // A discrete chunk of data and a bunch of useful, related methods for
+ // performing computations and transformations on that data.
+
+ // Create a new model with the specified attributes. A client id (`cid`)
+ // is automatically generated and assigned for you.
+ var Model = Backbone.Model = function(attributes, options) {
+ var attrs = attributes || {};
+ options || (options = {});
+ this.cid = _.uniqueId(this.cidPrefix);
+ this.attributes = {};
+ if (options.collection) this.collection = options.collection;
+ if (options.parse) attrs = this.parse(attrs, options) || {};
+ attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
+ this.set(attrs, options);
+ this.changed = {};
+ this.initialize.apply(this, arguments);
+ };
+
+ // Attach all inheritable methods to the Model prototype.
+ _.extend(Model.prototype, Events, {
+
+ // A hash of attributes whose current and previous value differ.
+ changed: null,
+
+ // The value returned during the last failed validation.
+ validationError: null,
+
+ // The default name for the JSON `id` attribute is `"id"`. MongoDB and
+ // CouchDB users may want to set this to `"_id"`.
+ idAttribute: 'id',
+
+ // The prefix is used to create the client id which is used to identify models locally.
+ // You may want to override this if you're experiencing name clashes with model ids.
+ cidPrefix: 'c',
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize: function(){},
+
+ // Return a copy of the model's `attributes` object.
+ toJSON: function(options) {
+ return _.clone(this.attributes);
+ },
+
+ // Proxy `Backbone.sync` by default -- but override this if you need
+ // custom syncing semantics for *this* particular model.
+ sync: function() {
+ return Backbone.sync.apply(this, arguments);
+ },
+
+ // Get the value of an attribute.
+ get: function(attr) {
+ return this.attributes[attr];
+ },
+
+ // Get the HTML-escaped value of an attribute.
+ escape: function(attr) {
+ return _.escape(this.get(attr));
+ },
+
+ // Returns `true` if the attribute contains a value that is not null
+ // or undefined.
+ has: function(attr) {
+ return this.get(attr) != null;
+ },
+
+ // Special-cased proxy to underscore's `_.matches` method.
+ matches: function(attrs) {
+ return !!_.iteratee(attrs, this)(this.attributes);
+ },
+
+ // Set a hash of model attributes on the object, firing `"change"`. This is
+ // the core primitive operation of a model, updating the data and notifying
+ // anyone who needs to know about the change in state. The heart of the beast.
+ set: function(key, val, options) {
+ if (key == null) return this;
+
+ // Handle both `"key", value` and `{key: value}` -style arguments.
+ var attrs;
+ if (typeof key === 'object') {
+ attrs = key;
+ options = val;
+ } else {
+ (attrs = {})[key] = val;
+ }
+
+ options || (options = {});
+
+ // Run validation.
+ if (!this._validate(attrs, options)) return false;
+
+ // Extract attributes and options.
+ var unset = options.unset;
+ var silent = options.silent;
+ var changes = [];
+ var changing = this._changing;
+ this._changing = true;
+
+ if (!changing) {
+ this._previousAttributes = _.clone(this.attributes);
+ this.changed = {};
+ }
+
+ var current = this.attributes;
+ var changed = this.changed;
+ var prev = this._previousAttributes;
+
+ // Check for changes of `id`.
+ if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
+
+ // For each `set` attribute, update or delete the current value.
+ for (var attr in attrs) {
+ val = attrs[attr];
+ if (!_.isEqual(current[attr], val)) changes.push(attr);
+ if (!_.isEqual(prev[attr], val)) {
+ changed[attr] = val;
+ } else {
+ delete changed[attr];
+ }
+ unset ? delete current[attr] : current[attr] = val;
+ }
+
+ // Trigger all relevant attribute changes.
+ if (!silent) {
+ if (changes.length) this._pending = options;
+ for (var i = 0; i < changes.length; i++) {
+ this.trigger('change:' + changes[i], this, current[changes[i]], options);
+ }
+ }
+
+ // You might be wondering why there's a `while` loop here. Changes can
+ // be recursively nested within `"change"` events.
+ if (changing) return this;
+ if (!silent) {
+ while (this._pending) {
+ options = this._pending;
+ this._pending = false;
+ this.trigger('change', this, options);
+ }
+ }
+ this._pending = false;
+ this._changing = false;
+ return this;
+ },
+
+ // Remove an attribute from the model, firing `"change"`. `unset` is a noop
+ // if the attribute doesn't exist.
+ unset: function(attr, options) {
+ return this.set(attr, void 0, _.extend({}, options, {unset: true}));
+ },
+
+ // Clear all attributes on the model, firing `"change"`.
+ clear: function(options) {
+ var attrs = {};
+ for (var key in this.attributes) attrs[key] = void 0;
+ return this.set(attrs, _.extend({}, options, {unset: true}));
+ },
+
+ // Determine if the model has changed since the last `"change"` event.
+ // If you specify an attribute name, determine if that attribute has changed.
+ hasChanged: function(attr) {
+ if (attr == null) return !_.isEmpty(this.changed);
+ return _.has(this.changed, attr);
+ },
+
+ // Return an object containing all the attributes that have changed, or
+ // false if there are no changed attributes. Useful for determining what
+ // parts of a view need to be updated and/or what attributes need to be
+ // persisted to the server. Unset attributes will be set to undefined.
+ // You can also pass an attributes object to diff against the model,
+ // determining if there *would be* a change.
+ changedAttributes: function(diff) {
+ if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
+ var old = this._changing ? this._previousAttributes : this.attributes;
+ var changed = {};
+ for (var attr in diff) {
+ var val = diff[attr];
+ if (_.isEqual(old[attr], val)) continue;
+ changed[attr] = val;
+ }
+ return _.size(changed) ? changed : false;
+ },
+
+ // Get the previous value of an attribute, recorded at the time the last
+ // `"change"` event was fired.
+ previous: function(attr) {
+ if (attr == null || !this._previousAttributes) return null;
+ return this._previousAttributes[attr];
+ },
+
+ // Get all of the attributes of the model at the time of the previous
+ // `"change"` event.
+ previousAttributes: function() {
+ return _.clone(this._previousAttributes);
+ },
+
+ // Fetch the model from the server, merging the response with the model's
+ // local attributes. Any changed attributes will trigger a "change" event.
+ fetch: function(options) {
+ options = _.extend({parse: true}, options);
+ var model = this;
+ var success = options.success;
+ options.success = function(resp) {
+ var serverAttrs = options.parse ? model.parse(resp, options) : resp;
+ if (!model.set(serverAttrs, options)) return false;
+ if (success) success.call(options.context, model, resp, options);
+ model.trigger('sync', model, resp, options);
+ };
+ wrapError(this, options);
+ return this.sync('read', this, options);
+ },
+
+ // Set a hash of model attributes, and sync the model to the server.
+ // If the server returns an attributes hash that differs, the model's
+ // state will be `set` again.
+ save: function(key, val, options) {
+ // Handle both `"key", value` and `{key: value}` -style arguments.
+ var attrs;
+ if (key == null || typeof key === 'object') {
+ attrs = key;
+ options = val;
+ } else {
+ (attrs = {})[key] = val;
+ }
+
+ options = _.extend({validate: true, parse: true}, options);
+ var wait = options.wait;
+
+ // If we're not waiting and attributes exist, save acts as
+ // `set(attr).save(null, opts)` with validation. Otherwise, check if
+ // the model will be valid when the attributes, if any, are set.
+ if (attrs && !wait) {
+ if (!this.set(attrs, options)) return false;
+ } else {
+ if (!this._validate(attrs, options)) return false;
+ }
+
+ // After a successful server-side save, the client is (optionally)
+ // updated with the server-side state.
+ var model = this;
+ var success = options.success;
+ var attributes = this.attributes;
+ options.success = function(resp) {
+ // Ensure attributes are restored during synchronous saves.
+ model.attributes = attributes;
+ var serverAttrs = options.parse ? model.parse(resp, options) : resp;
+ if (wait) serverAttrs = _.extend({}, attrs, serverAttrs);
+ if (serverAttrs && !model.set(serverAttrs, options)) return false;
+ if (success) success.call(options.context, model, resp, options);
+ model.trigger('sync', model, resp, options);
+ };
+ wrapError(this, options);
+
+ // Set temporary attributes if `{wait: true}` to properly find new ids.
+ if (attrs && wait) this.attributes = _.extend({}, attributes, attrs);
+
+ var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
+ if (method === 'patch' && !options.attrs) options.attrs = attrs;
+ var xhr = this.sync(method, this, options);
+
+ // Restore attributes.
+ this.attributes = attributes;
+
+ return xhr;
+ },
+
+ // Destroy this model on the server if it was already persisted.
+ // Optimistically removes the model from its collection, if it has one.
+ // If `wait: true` is passed, waits for the server to respond before removal.
+ destroy: function(options) {
+ options = options ? _.clone(options) : {};
+ var model = this;
+ var success = options.success;
+ var wait = options.wait;
+
+ var destroy = function() {
+ model.stopListening();
+ model.trigger('destroy', model, model.collection, options);
+ };
+
+ options.success = function(resp) {
+ if (wait) destroy();
+ if (success) success.call(options.context, model, resp, options);
+ if (!model.isNew()) model.trigger('sync', model, resp, options);
+ };
+
+ var xhr = false;
+ if (this.isNew()) {
+ _.defer(options.success);
+ } else {
+ wrapError(this, options);
+ xhr = this.sync('delete', this, options);
+ }
+ if (!wait) destroy();
+ return xhr;
+ },
+
+ // Default URL for the model's representation on the server -- if you're
+ // using Backbone's restful methods, override this to change the endpoint
+ // that will be called.
+ url: function() {
+ var base =
+ _.result(this, 'urlRoot') ||
+ _.result(this.collection, 'url') ||
+ urlError();
+ if (this.isNew()) return base;
+ var id = this.get(this.idAttribute);
+ return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id);
+ },
+
+ // **parse** converts a response into the hash of attributes to be `set` on
+ // the model. The default implementation is just to pass the response along.
+ parse: function(resp, options) {
+ return resp;
+ },
+
+ // Create a new model with identical attributes to this one.
+ clone: function() {
+ return new this.constructor(this.attributes);
+ },
+
+ // A model is new if it has never been saved to the server, and lacks an id.
+ isNew: function() {
+ return !this.has(this.idAttribute);
+ },
+
+ // Check if the model is currently in a valid state.
+ isValid: function(options) {
+ return this._validate({}, _.defaults({validate: true}, options));
+ },
+
+ // Run validation against the next complete set of model attributes,
+ // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
+ _validate: function(attrs, options) {
+ if (!options.validate || !this.validate) return true;
+ attrs = _.extend({}, this.attributes, attrs);
+ var error = this.validationError = this.validate(attrs, options) || null;
+ if (!error) return true;
+ this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
+ return false;
+ }
+
+ });
+
+ // Underscore methods that we want to implement on the Model.
+ var modelMethods = { keys: 1, values: 1, pairs: 1, invert: 1, pick: 0,
+ omit: 0, chain: 1, isEmpty: 1 };
+
+ // Mix in each Underscore method as a proxy to `Model#attributes`.
+ addUnderscoreMethods(Model, modelMethods, 'attributes');
+
+ // Backbone.Collection
+ // -------------------
+
+ // If models tend to represent a single row of data, a Backbone Collection is
+ // more analogous to a table full of data ... or a small slice or page of that
+ // table, or a collection of rows that belong together for a particular reason
+ // -- all of the messages in this particular folder, all of the documents
+ // belonging to this particular author, and so on. Collections maintain
+ // indexes of their models, both in order, and for lookup by `id`.
+
+ // Create a new **Collection**, perhaps to contain a specific type of `model`.
+ // If a `comparator` is specified, the Collection will maintain
+ // its models in sort order, as they're added and removed.
+ var Collection = Backbone.Collection = function(models, options) {
+ options || (options = {});
+ if (options.model) this.model = options.model;
+ if (options.comparator !== void 0) this.comparator = options.comparator;
+ this._reset();
+ this.initialize.apply(this, arguments);
+ if (models) this.reset(models, _.extend({silent: true}, options));
+ };
+
+ // Default options for `Collection#set`.
+ var setOptions = {add: true, remove: true, merge: true};
+ var addOptions = {add: true, remove: false};
+
+ // Define the Collection's inheritable methods.
+ _.extend(Collection.prototype, Events, {
+
+ // The default model for a collection is just a **Backbone.Model**.
+ // This should be overridden in most cases.
+ model: Model,
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize: function(){},
+
+ // The JSON representation of a Collection is an array of the
+ // models' attributes.
+ toJSON: function(options) {
+ return this.map(function(model) { return model.toJSON(options); });
+ },
+
+ // Proxy `Backbone.sync` by default.
+ sync: function() {
+ return Backbone.sync.apply(this, arguments);
+ },
+
+ // Add a model, or list of models to the set.
+ add: function(models, options) {
+ return this.set(models, _.extend({merge: false}, options, addOptions));
+ },
+
+ // Remove a model, or a list of models from the set.
+ remove: function(models, options) {
+ options = _.extend({}, options);
+ var singular = !_.isArray(models);
+ models = singular ? [models] : _.clone(models);
+ var removed = this._removeModels(models, options);
+ if (!options.silent && removed) this.trigger('update', this, options);
+ return singular ? removed[0] : removed;
+ },
+
+ // Update a collection by `set`-ing a new list of models, adding new ones,
+ // removing models that are no longer present, and merging models that
+ // already exist in the collection, as necessary. Similar to **Model#set**,
+ // the core operation for updating the data contained by the collection.
+ set: function(models, options) {
+ options = _.defaults({}, options, setOptions);
+ if (options.parse && !this._isModel(models)) models = this.parse(models, options);
+ var singular = !_.isArray(models);
+ models = singular ? (models ? [models] : []) : models.slice();
+ var id, model, attrs, existing, sort;
+ var at = options.at;
+ if (at != null) at = +at;
+ if (at < 0) at += this.length + 1;
+ var sortable = this.comparator && (at == null) && options.sort !== false;
+ var sortAttr = _.isString(this.comparator) ? this.comparator : null;
+ var toAdd = [], toRemove = [], modelMap = {};
+ var add = options.add, merge = options.merge, remove = options.remove;
+ var order = !sortable && add && remove ? [] : false;
+ var orderChanged = false;
+
+ // Turn bare objects into model references, and prevent invalid models
+ // from being added.
+ for (var i = 0; i < models.length; i++) {
+ attrs = models[i];
+
+ // If a duplicate is found, prevent it from being added and
+ // optionally merge it into the existing model.
+ if (existing = this.get(attrs)) {
+ if (remove) modelMap[existing.cid] = true;
+ if (merge && attrs !== existing) {
+ attrs = this._isModel(attrs) ? attrs.attributes : attrs;
+ if (options.parse) attrs = existing.parse(attrs, options);
+ existing.set(attrs, options);
+ if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
+ }
+ models[i] = existing;
+
+ // If this is a new, valid model, push it to the `toAdd` list.
+ } else if (add) {
+ model = models[i] = this._prepareModel(attrs, options);
+ if (!model) continue;
+ toAdd.push(model);
+ this._addReference(model, options);
+ }
+
+ // Do not add multiple models with the same `id`.
+ model = existing || model;
+ if (!model) continue;
+ id = this.modelId(model.attributes);
+ if (order && (model.isNew() || !modelMap[id])) {
+ order.push(model);
+
+ // Check to see if this is actually a new model at this index.
+ orderChanged = orderChanged || !this.models[i] || model.cid !== this.models[i].cid;
+ }
+
+ modelMap[id] = true;
+ }
+
+ // Remove nonexistent models if appropriate.
+ if (remove) {
+ for (var i = 0; i < this.length; i++) {
+ if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
+ }
+ if (toRemove.length) this._removeModels(toRemove, options);
+ }
+
+ // See if sorting is needed, update `length` and splice in new models.
+ if (toAdd.length || orderChanged) {
+ if (sortable) sort = true;
+ this.length += toAdd.length;
+ if (at != null) {
+ for (var i = 0; i < toAdd.length; i++) {
+ this.models.splice(at + i, 0, toAdd[i]);
+ }
+ } else {
+ if (order) this.models.length = 0;
+ var orderedModels = order || toAdd;
+ for (var i = 0; i < orderedModels.length; i++) {
+ this.models.push(orderedModels[i]);
+ }
+ }
+ }
+
+ // Silently sort the collection if appropriate.
+ if (sort) this.sort({silent: true});
+
+ // Unless silenced, it's time to fire all appropriate add/sort events.
+ if (!options.silent) {
+ var addOpts = at != null ? _.clone(options) : options;
+ for (var i = 0; i < toAdd.length; i++) {
+ if (at != null) addOpts.index = at + i;
+ (model = toAdd[i]).trigger('add', model, this, addOpts);
+ }
+ if (sort || orderChanged) this.trigger('sort', this, options);
+ if (toAdd.length || toRemove.length) this.trigger('update', this, options);
+ }
+
+ // Return the added (or merged) model (or models).
+ return singular ? models[0] : models;
+ },
+
+ // When you have more items than you want to add or remove individually,
+ // you can reset the entire set with a new list of models, without firing
+ // any granular `add` or `remove` events. Fires `reset` when finished.
+ // Useful for bulk operations and optimizations.
+ reset: function(models, options) {
+ options = options ? _.clone(options) : {};
+ for (var i = 0; i < this.models.length; i++) {
+ this._removeReference(this.models[i], options);
+ }
+ options.previousModels = this.models;
+ this._reset();
+ models = this.add(models, _.extend({silent: true}, options));
+ if (!options.silent) this.trigger('reset', this, options);
+ return models;
+ },
+
+ // Add a model to the end of the collection.
+ push: function(model, options) {
+ return this.add(model, _.extend({at: this.length}, options));
+ },
+
+ // Remove a model from the end of the collection.
+ pop: function(options) {
+ var model = this.at(this.length - 1);
+ return this.remove(model, options);
+ },
+
+ // Add a model to the beginning of the collection.
+ unshift: function(model, options) {
+ return this.add(model, _.extend({at: 0}, options));
+ },
+
+ // Remove a model from the beginning of the collection.
+ shift: function(options) {
+ var model = this.at(0);
+ return this.remove(model, options);
+ },
+
+ // Slice out a sub-array of models from the collection.
+ slice: function() {
+ return slice.apply(this.models, arguments);
+ },
+
+ // Get a model from the set by id.
+ get: function(obj) {
+ if (obj == null) return void 0;
+ var id = this.modelId(this._isModel(obj) ? obj.attributes : obj);
+ return this._byId[obj] || this._byId[id] || this._byId[obj.cid];
+ },
+
+ // Get the model at the given index.
+ at: function(index) {
+ if (index < 0) index += this.length;
+ return this.models[index];
+ },
+
+ // Return models with matching attributes. Useful for simple cases of
+ // `filter`.
+ where: function(attrs, first) {
+ var matches = _.matches(attrs);
+ return this[first ? 'find' : 'filter'](function(model) {
+ return matches(model.attributes);
+ });
+ },
+
+ // Return the first model with matching attributes. Useful for simple cases
+ // of `find`.
+ findWhere: function(attrs) {
+ return this.where(attrs, true);
+ },
+
+ // Force the collection to re-sort itself. You don't need to call this under
+ // normal circumstances, as the set will maintain sort order as each item
+ // is added.
+ sort: function(options) {
+ if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
+ options || (options = {});
+
+ // Run sort based on type of `comparator`.
+ if (_.isString(this.comparator) || this.comparator.length === 1) {
+ this.models = this.sortBy(this.comparator, this);
+ } else {
+ this.models.sort(_.bind(this.comparator, this));
+ }
+
+ if (!options.silent) this.trigger('sort', this, options);
+ return this;
+ },
+
+ // Pluck an attribute from each model in the collection.
+ pluck: function(attr) {
+ return _.invoke(this.models, 'get', attr);
+ },
+
+ // Fetch the default set of models for this collection, resetting the
+ // collection when they arrive. If `reset: true` is passed, the response
+ // data will be passed through the `reset` method instead of `set`.
+ fetch: function(options) {
+ options = _.extend({parse: true}, options);
+ var success = options.success;
+ var collection = this;
+ options.success = function(resp) {
+ var method = options.reset ? 'reset' : 'set';
+ collection[method](resp, options);
+ if (success) success.call(options.context, collection, resp, options);
+ collection.trigger('sync', collection, resp, options);
+ };
+ wrapError(this, options);
+ return this.sync('read', this, options);
+ },
+
+ // Create a new instance of a model in this collection. Add the model to the
+ // collection immediately, unless `wait: true` is passed, in which case we
+ // wait for the server to agree.
+ create: function(model, options) {
+ options = options ? _.clone(options) : {};
+ var wait = options.wait;
+ model = this._prepareModel(model, options);
+ if (!model) return false;
+ if (!wait) this.add(model, options);
+ var collection = this;
+ var success = options.success;
+ options.success = function(model, resp, callbackOpts) {
+ if (wait) collection.add(model, callbackOpts);
+ if (success) success.call(callbackOpts.context, model, resp, callbackOpts);
+ };
+ model.save(null, options);
+ return model;
+ },
+
+ // **parse** converts a response into a list of models to be added to the
+ // collection. The default implementation is just to pass it through.
+ parse: function(resp, options) {
+ return resp;
+ },
+
+ // Create a new collection with an identical list of models as this one.
+ clone: function() {
+ return new this.constructor(this.models, {
+ model: this.model,
+ comparator: this.comparator
+ });
+ },
+
+ // Define how to uniquely identify models in the collection.
+ modelId: function (attrs) {
+ return attrs[this.model.prototype.idAttribute || 'id'];
+ },
+
+ // Private method to reset all internal state. Called when the collection
+ // is first initialized or reset.
+ _reset: function() {
+ this.length = 0;
+ this.models = [];
+ this._byId = {};
+ },
+
+ // Prepare a hash of attributes (or other model) to be added to this
+ // collection.
+ _prepareModel: function(attrs, options) {
+ if (this._isModel(attrs)) {
+ if (!attrs.collection) attrs.collection = this;
+ return attrs;
+ }
+ options = options ? _.clone(options) : {};
+ options.collection = this;
+ var model = new this.model(attrs, options);
+ if (!model.validationError) return model;
+ this.trigger('invalid', this, model.validationError, options);
+ return false;
+ },
+
+ // Internal method called by both remove and set.
+ // Returns removed models, or false if nothing is removed.
+ _removeModels: function(models, options) {
+ var removed = [];
+ for (var i = 0; i < models.length; i++) {
+ var model = this.get(models[i]);
+ if (!model) continue;
+
+ var index = this.indexOf(model);
+ this.models.splice(index, 1);
+ this.length--;
+
+ if (!options.silent) {
+ options.index = index;
+ model.trigger('remove', model, this, options);
+ }
+
+ removed.push(model);
+ this._removeReference(model, options);
+ }
+ return removed.length ? removed : false;
+ },
+
+ // Method for checking whether an object should be considered a model for
+ // the purposes of adding to the collection.
+ _isModel: function (model) {
+ return model instanceof Model;
+ },
+
+ // Internal method to create a model's ties to a collection.
+ _addReference: function(model, options) {
+ this._byId[model.cid] = model;
+ var id = this.modelId(model.attributes);
+ if (id != null) this._byId[id] = model;
+ model.on('all', this._onModelEvent, this);
+ },
+
+ // Internal method to sever a model's ties to a collection.
+ _removeReference: function(model, options) {
+ delete this._byId[model.cid];
+ var id = this.modelId(model.attributes);
+ if (id != null) delete this._byId[id];
+ if (this === model.collection) delete model.collection;
+ model.off('all', this._onModelEvent, this);
+ },
+
+ // Internal method called every time a model in the set fires an event.
+ // Sets need to update their indexes when models change ids. All other
+ // events simply proxy through. "add" and "remove" events that originate
+ // in other collections are ignored.
+ _onModelEvent: function(event, model, collection, options) {
+ if ((event === 'add' || event === 'remove') && collection !== this) return;
+ if (event === 'destroy') this.remove(model, options);
+ if (event === 'change') {
+ var prevId = this.modelId(model.previousAttributes());
+ var id = this.modelId(model.attributes);
+ if (prevId !== id) {
+ if (prevId != null) delete this._byId[prevId];
+ if (id != null) this._byId[id] = model;
+ }
+ }
+ this.trigger.apply(this, arguments);
+ }
+
+ });
+
+ // Underscore methods that we want to implement on the Collection.
+ // 90% of the core usefulness of Backbone Collections is actually implemented
+ // right here:
+ var collectionMethods = { forEach: 3, each: 3, map: 3, collect: 3, reduce: 4,
+ foldl: 4, inject: 4, reduceRight: 4, foldr: 4, find: 3, detect: 3, filter: 3,
+ select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 2,
+ contains: 2, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3,
+ head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3,
+ without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3,
+ isEmpty: 1, chain: 1, sample: 3, partition: 3 };
+
+ // Mix in each Underscore method as a proxy to `Collection#models`.
+ addUnderscoreMethods(Collection, collectionMethods, 'models');
+
+ // Underscore methods that take a property name as an argument.
+ var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];
+
+ // Use attributes instead of properties.
+ _.each(attributeMethods, function(method) {
+ if (!_[method]) return;
+ Collection.prototype[method] = function(value, context) {
+ var iterator = _.isFunction(value) ? value : function(model) {
+ return model.get(value);
+ };
+ return _[method](this.models, iterator, context);
+ };
+ });
+
+ // Backbone.View
+ // -------------
+
+ // Backbone Views are almost more convention than they are actual code. A View
+ // is simply a JavaScript object that represents a logical chunk of UI in the
+ // DOM. This might be a single item, an entire list, a sidebar or panel, or
+ // even the surrounding frame which wraps your whole app. Defining a chunk of
+ // UI as a **View** allows you to define your DOM events declaratively, without
+ // having to worry about render order ... and makes it easy for the view to
+ // react to specific changes in the state of your models.
+
+ // Creating a Backbone.View creates its initial element outside of the DOM,
+ // if an existing element is not provided...
+ var View = Backbone.View = function(options) {
+ this.cid = _.uniqueId('view');
+ _.extend(this, _.pick(options, viewOptions));
+ this._ensureElement();
+ this.initialize.apply(this, arguments);
+ };
+
+ // Cached regex to split keys for `delegate`.
+ var delegateEventSplitter = /^(\S+)\s*(.*)$/;
+
+ // List of view options to be merged as properties.
+ var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
+
+ // Set up all inheritable **Backbone.View** properties and methods.
+ _.extend(View.prototype, Events, {
+
+ // The default `tagName` of a View's element is `"div"`.
+ tagName: 'div',
+
+ // jQuery delegate for element lookup, scoped to DOM elements within the
+ // current view. This should be preferred to global lookups where possible.
+ $: function(selector) {
+ return this.$el.find(selector);
+ },
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize: function(){},
+
+ // **render** is the core function that your view should override, in order
+ // to populate its element (`this.el`), with the appropriate HTML. The
+ // convention is for **render** to always return `this`.
+ render: function() {
+ return this;
+ },
+
+ // Remove this view by taking the element out of the DOM, and removing any
+ // applicable Backbone.Events listeners.
+ remove: function() {
+ this._removeElement();
+ this.stopListening();
+ return this;
+ },
+
+ // Remove this view's element from the document and all event listeners
+ // attached to it. Exposed for subclasses using an alternative DOM
+ // manipulation API.
+ _removeElement: function() {
+ this.$el.remove();
+ },
+
+ // Change the view's element (`this.el` property) and re-delegate the
+ // view's events on the new element.
+ setElement: function(element) {
+ this.undelegateEvents();
+ this._setElement(element);
+ this.delegateEvents();
+ return this;
+ },
+
+ // Creates the `this.el` and `this.$el` references for this view using the
+ // given `el`. `el` can be a CSS selector or an HTML string, a jQuery
+ // context or an element. Subclasses can override this to utilize an
+ // alternative DOM manipulation API and are only required to set the
+ // `this.el` property.
+ _setElement: function(el) {
+ this.$el = el instanceof Backbone.$ ? el : Backbone.$(el);
+ this.el = this.$el[0];
+ },
+
+ // Set callbacks, where `this.events` is a hash of
+ //
+ // *{"event selector": "callback"}*
+ //
+ // {
+ // 'mousedown .title': 'edit',
+ // 'click .button': 'save',
+ // 'click .open': function(e) { ... }
+ // }
+ //
+ // pairs. Callbacks will be bound to the view, with `this` set properly.
+ // Uses event delegation for efficiency.
+ // Omitting the selector binds the event to `this.el`.
+ delegateEvents: function(events) {
+ events || (events = _.result(this, 'events'));
+ if (!events) return this;
+ this.undelegateEvents();
+ for (var key in events) {
+ var method = events[key];
+ if (!_.isFunction(method)) method = this[method];
+ if (!method) continue;
+ var match = key.match(delegateEventSplitter);
+ this.delegate(match[1], match[2], _.bind(method, this));
+ }
+ return this;
+ },
+
+ // Add a single event listener to the view's element (or a child element
+ // using `selector`). This only works for delegate-able events: not `focus`,
+ // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer.
+ delegate: function(eventName, selector, listener) {
+ this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener);
+ return this;
+ },
+
+ // Clears all callbacks previously bound to the view by `delegateEvents`.
+ // You usually don't need to use this, but may wish to if you have multiple
+ // Backbone views attached to the same DOM element.
+ undelegateEvents: function() {
+ if (this.$el) this.$el.off('.delegateEvents' + this.cid);
+ return this;
+ },
+
+ // A finer-grained `undelegateEvents` for removing a single delegated event.
+ // `selector` and `listener` are both optional.
+ undelegate: function(eventName, selector, listener) {
+ this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);
+ return this;
+ },
+
+ // Produces a DOM element to be assigned to your view. Exposed for
+ // subclasses using an alternative DOM manipulation API.
+ _createElement: function(tagName) {
+ return document.createElement(tagName);
+ },
+
+ // Ensure that the View has a DOM element to render into.
+ // If `this.el` is a string, pass it through `$()`, take the first
+ // matching element, and re-assign it to `el`. Otherwise, create
+ // an element from the `id`, `className` and `tagName` properties.
+ _ensureElement: function() {
+ if (!this.el) {
+ var attrs = _.extend({}, _.result(this, 'attributes'));
+ if (this.id) attrs.id = _.result(this, 'id');
+ if (this.className) attrs['class'] = _.result(this, 'className');
+ this.setElement(this._createElement(_.result(this, 'tagName')));
+ this._setAttributes(attrs);
+ } else {
+ this.setElement(_.result(this, 'el'));
+ }
+ },
+
+ // Set attributes from a hash on this view's element. Exposed for
+ // subclasses using an alternative DOM manipulation API.
+ _setAttributes: function(attributes) {
+ this.$el.attr(attributes);
+ }
+
+ });
+
+ // Backbone.sync
+ // -------------
+
+ // Override this function to change the manner in which Backbone persists
+ // models to the server. You will be passed the type of request, and the
+ // model in question. By default, makes a RESTful Ajax request
+ // to the model's `url()`. Some possible customizations could be:
+ //
+ // * Use `setTimeout` to batch rapid-fire updates into a single request.
+ // * Send up the models as XML instead of JSON.
+ // * Persist models via WebSockets instead of Ajax.
+ //
+ // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests
+ // as `POST`, with a `_method` parameter containing the true HTTP method,
+ // as well as all requests with the body as `application/x-www-form-urlencoded`
+ // instead of `application/json` with the model in a param named `model`.
+ // Useful when interfacing with server-side languages like **PHP** that make
+ // it difficult to read the body of `PUT` requests.
+ Backbone.sync = function(method, model, options) {
+ var type = methodMap[method];
+
+ // Default options, unless specified.
+ _.defaults(options || (options = {}), {
+ emulateHTTP: Backbone.emulateHTTP,
+ emulateJSON: Backbone.emulateJSON
+ });
+
+ // Default JSON-request options.
+ var params = {type: type, dataType: 'json'};
+
+ // Ensure that we have a URL.
+ if (!options.url) {
+ params.url = _.result(model, 'url') || urlError();
+ }
+
+ // Ensure that we have the appropriate request data.
+ if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
+ params.contentType = 'application/json';
+ params.data = JSON.stringify(options.attrs || model.toJSON(options));
+ }
+
+ // For older servers, emulate JSON by encoding the request into an HTML-form.
+ if (options.emulateJSON) {
+ params.contentType = 'application/x-www-form-urlencoded';
+ params.data = params.data ? {model: params.data} : {};
+ }
+
+ // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
+ // And an `X-HTTP-Method-Override` header.
+ if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {
+ params.type = 'POST';
+ if (options.emulateJSON) params.data._method = type;
+ var beforeSend = options.beforeSend;
+ options.beforeSend = function(xhr) {
+ xhr.setRequestHeader('X-HTTP-Method-Override', type);
+ if (beforeSend) return beforeSend.apply(this, arguments);
+ };
+ }
+
+ // Don't process data on a non-GET request.
+ if (params.type !== 'GET' && !options.emulateJSON) {
+ params.processData = false;
+ }
+
+ // Pass along `textStatus` and `errorThrown` from jQuery.
+ var error = options.error;
+ options.error = function(xhr, textStatus, errorThrown) {
+ options.textStatus = textStatus;
+ options.errorThrown = errorThrown;
+ if (error) error.call(options.context, xhr, textStatus, errorThrown);
+ };
+
+ // Make the request, allowing the user to override any Ajax options.
+ var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
+ model.trigger('request', model, xhr, options);
+ return xhr;
+ };
+
+ // Map from CRUD to HTTP for our default `Backbone.sync` implementation.
+ var methodMap = {
+ 'create': 'POST',
+ 'update': 'PUT',
+ 'patch': 'PATCH',
+ 'delete': 'DELETE',
+ 'read': 'GET'
+ };
+
+ // Set the default implementation of `Backbone.ajax` to proxy through to `$`.
+ // Override this if you'd like to use a different library.
+ Backbone.ajax = function() {
+ return Backbone.$.ajax.apply(Backbone.$, arguments);
+ };
+
+ // Backbone.Router
+ // ---------------
+
+ // Routers map faux-URLs to actions, and fire events when routes are
+ // matched. Creating a new one sets its `routes` hash, if not set statically.
+ var Router = Backbone.Router = function(options) {
+ options || (options = {});
+ if (options.routes) this.routes = options.routes;
+ this._bindRoutes();
+ this.initialize.apply(this, arguments);
+ };
+
+ // Cached regular expressions for matching named param parts and splatted
+ // parts of route strings.
+ var optionalParam = /\((.*?)\)/g;
+ var namedParam = /(\(\?)?:\w+/g;
+ var splatParam = /\*\w+/g;
+ var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g;
+
+ // Set up all inheritable **Backbone.Router** properties and methods.
+ _.extend(Router.prototype, Events, {
+
+ // Initialize is an empty function by default. Override it with your own
+ // initialization logic.
+ initialize: function(){},
+
+ // Manually bind a single named route to a callback. For example:
+ //
+ // this.route('search/:query/p:num', 'search', function(query, num) {
+ // ...
+ // });
+ //
+ route: function(route, name, callback) {
+ if (!_.isRegExp(route)) route = this._routeToRegExp(route);
+ if (_.isFunction(name)) {
+ callback = name;
+ name = '';
+ }
+ if (!callback) callback = this[name];
+ var router = this;
+ Backbone.history.route(route, function(fragment) {
+ var args = router._extractParameters(route, fragment);
+ if (router.execute(callback, args, name) !== false) {
+ router.trigger.apply(router, ['route:' + name].concat(args));
+ router.trigger('route', name, args);
+ Backbone.history.trigger('route', router, name, args);
+ }
+ });
+ return this;
+ },
+
+ // Execute a route handler with the provided parameters. This is an
+ // excellent place to do pre-route setup or post-route cleanup.
+ execute: function(callback, args, name) {
+ if (callback) callback.apply(this, args);
+ },
+
+ // Simple proxy to `Backbone.history` to save a fragment into the history.
+ navigate: function(fragment, options) {
+ Backbone.history.navigate(fragment, options);
+ return this;
+ },
+
+ // Bind all defined routes to `Backbone.history`. We have to reverse the
+ // order of the routes here to support behavior where the most general
+ // routes can be defined at the bottom of the route map.
+ _bindRoutes: function() {
+ if (!this.routes) return;
+ this.routes = _.result(this, 'routes');
+ var route, routes = _.keys(this.routes);
+ while ((route = routes.pop()) != null) {
+ this.route(route, this.routes[route]);
+ }
+ },
+
+ // Convert a route string into a regular expression, suitable for matching
+ // against the current location hash.
+ _routeToRegExp: function(route) {
+ route = route.replace(escapeRegExp, '\\$&')
+ .replace(optionalParam, '(?:$1)?')
+ .replace(namedParam, function(match, optional) {
+ return optional ? match : '([^/?]+)';
+ })
+ .replace(splatParam, '([^?]*?)');
+ return new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$');
+ },
+
+ // Given a route, and a URL fragment that it matches, return the array of
+ // extracted decoded parameters. Empty or unmatched parameters will be
+ // treated as `null` to normalize cross-browser behavior.
+ _extractParameters: function(route, fragment) {
+ var params = route.exec(fragment).slice(1);
+ return _.map(params, function(param, i) {
+ // Don't decode the search params.
+ if (i === params.length - 1) return param || null;
+ return param ? decodeURIComponent(param) : null;
+ });
+ }
+
+ });
+
+ // Backbone.History
+ // ----------------
+
+ // Handles cross-browser history management, based on either
+ // [pushState](http://diveintohtml5.info/history.html) and real URLs, or
+ // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)
+ // and URL fragments. If the browser supports neither (old IE, natch),
+ // falls back to polling.
+ var History = Backbone.History = function() {
+ this.handlers = [];
+ _.bindAll(this, 'checkUrl');
+
+ // Ensure that `History` can be used outside of the browser.
+ if (typeof window !== 'undefined') {
+ this.location = window.location;
+ this.history = window.history;
+ }
+ };
+
+ // Cached regex for stripping a leading hash/slash and trailing space.
+ var routeStripper = /^[#\/]|\s+$/g;
+
+ // Cached regex for stripping leading and trailing slashes.
+ var rootStripper = /^\/+|\/+$/g;
+
+ // Cached regex for stripping urls of hash.
+ var pathStripper = /#.*$/;
+
+ // Has the history handling already been started?
+ History.started = false;
+
+ // Set up all inheritable **Backbone.History** properties and methods.
+ _.extend(History.prototype, Events, {
+
+ // The default interval to poll for hash changes, if necessary, is
+ // twenty times a second.
+ interval: 50,
+
+ // Are we at the app root?
+ atRoot: function() {
+ var path = this.location.pathname.replace(/[^\/]$/, '$&/');
+ return path === this.root && !this.getSearch();
+ },
+
+ // Does the pathname match the root?
+ matchRoot: function() {
+ var path = this.decodeFragment(this.location.pathname);
+ var root = path.slice(0, this.root.length - 1) + '/';
+ return root === this.root;
+ },
+
+ // Unicode characters in `location.pathname` are percent encoded so they're
+ // decoded for comparison. `%25` should not be decoded since it may be part
+ // of an encoded parameter.
+ decodeFragment: function(fragment) {
+ return decodeURI(fragment.replace(/%25/g, '%2525'));
+ },
+
+ // In IE6, the hash fragment and search params are incorrect if the
+ // fragment contains `?`.
+ getSearch: function() {
+ var match = this.location.href.replace(/#.*/, '').match(/\?.+/);
+ return match ? match[0] : '';
+ },
+
+ // Gets the true hash value. Cannot use location.hash directly due to bug
+ // in Firefox where location.hash will always be decoded.
+ getHash: function(window) {
+ var match = (window || this).location.href.match(/#(.*)$/);
+ return match ? match[1] : '';
+ },
+
+ // Get the pathname and search params, without the root.
+ getPath: function() {
+ var path = this.decodeFragment(
+ this.location.pathname + this.getSearch()
+ ).slice(this.root.length - 1);
+ return path.charAt(0) === '/' ? path.slice(1) : path;
+ },
+
+ // Get the cross-browser normalized URL fragment from the path or hash.
+ getFragment: function(fragment) {
+ if (fragment == null) {
+ if (this._usePushState || !this._wantsHashChange) {
+ fragment = this.getPath();
+ } else {
+ fragment = this.getHash();
+ }
+ }
+ return fragment.replace(routeStripper, '');
+ },
+
+ // Start the hash change handling, returning `true` if the current URL matches
+ // an existing route, and `false` otherwise.
+ start: function(options) {
+ if (History.started) throw new Error('Backbone.history has already been started');
+ History.started = true;
+
+ // Figure out the initial configuration. Do we need an iframe?
+ // Is pushState desired ... is it available?
+ this.options = _.extend({root: '/'}, this.options, options);
+ this.root = this.options.root;
+ this._wantsHashChange = this.options.hashChange !== false;
+ this._hasHashChange = 'onhashchange' in window;
+ this._useHashChange = this._wantsHashChange && this._hasHashChange;
+ this._wantsPushState = !!this.options.pushState;
+ this._hasPushState = !!(this.history && this.history.pushState);
+ this._usePushState = this._wantsPushState && this._hasPushState;
+ this.fragment = this.getFragment();
+
+ // Normalize root to always include a leading and trailing slash.
+ this.root = ('/' + this.root + '/').replace(rootStripper, '/');
+
+ // Transition from hashChange to pushState or vice versa if both are
+ // requested.
+ if (this._wantsHashChange && this._wantsPushState) {
+
+ // If we've started off with a route from a `pushState`-enabled
+ // browser, but we're currently in a browser that doesn't support it...
+ if (!this._hasPushState && !this.atRoot()) {
+ var root = this.root.slice(0, -1) || '/';
+ this.location.replace(root + '#' + this.getPath());
+ // Return immediately as browser will do redirect to new url
+ return true;
+
+ // Or if we've started out with a hash-based route, but we're currently
+ // in a browser where it could be `pushState`-based instead...
+ } else if (this._hasPushState && this.atRoot()) {
+ this.navigate(this.getHash(), {replace: true});
+ }
+
+ }
+
+ // Proxy an iframe to handle location events if the browser doesn't
+ // support the `hashchange` event, HTML5 history, or the user wants
+ // `hashChange` but not `pushState`.
+ if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) {
+ this.iframe = document.createElement('iframe');
+ this.iframe.src = 'javascript:0';
+ this.iframe.style.display = 'none';
+ this.iframe.tabIndex = -1;
+ var body = document.body;
+ // Using `appendChild` will throw on IE < 9 if the document is not ready.
+ var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow;
+ iWindow.document.open();
+ iWindow.document.close();
+ iWindow.location.hash = '#' + this.fragment;
+ }
+
+ // Add a cross-platform `addEventListener` shim for older browsers.
+ var addEventListener = window.addEventListener || function (eventName, listener) {
+ return attachEvent('on' + eventName, listener);
+ };
+
+ // Depending on whether we're using pushState or hashes, and whether
+ // 'onhashchange' is supported, determine how we check the URL state.
+ if (this._usePushState) {
+ addEventListener('popstate', this.checkUrl, false);
+ } else if (this._useHashChange && !this.iframe) {
+ addEventListener('hashchange', this.checkUrl, false);
+ } else if (this._wantsHashChange) {
+ this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
+ }
+
+ if (!this.options.silent) return this.loadUrl();
+ },
+
+ // Disable Backbone.history, perhaps temporarily. Not useful in a real app,
+ // but possibly useful for unit testing Routers.
+ stop: function() {
+ // Add a cross-platform `removeEventListener` shim for older browsers.
+ var removeEventListener = window.removeEventListener || function (eventName, listener) {
+ return detachEvent('on' + eventName, listener);
+ };
+
+ // Remove window listeners.
+ if (this._usePushState) {
+ removeEventListener('popstate', this.checkUrl, false);
+ } else if (this._useHashChange && !this.iframe) {
+ removeEventListener('hashchange', this.checkUrl, false);
+ }
+
+ // Clean up the iframe if necessary.
+ if (this.iframe) {
+ document.body.removeChild(this.iframe);
+ this.iframe = null;
+ }
+
+ // Some environments will throw when clearing an undefined interval.
+ if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);
+ History.started = false;
+ },
+
+ // Add a route to be tested when the fragment changes. Routes added later
+ // may override previous routes.
+ route: function(route, callback) {
+ this.handlers.unshift({route: route, callback: callback});
+ },
+
+ // Checks the current URL to see if it has changed, and if it has,
+ // calls `loadUrl`, normalizing across the hidden iframe.
+ checkUrl: function(e) {
+ var current = this.getFragment();
+
+ // If the user pressed the back button, the iframe's hash will have
+ // changed and we should use that for comparison.
+ if (current === this.fragment && this.iframe) {
+ current = this.getHash(this.iframe.contentWindow);
+ }
+
+ if (current === this.fragment) return false;
+ if (this.iframe) this.navigate(current);
+ this.loadUrl();
+ },
+
+ // Attempt to load the current URL fragment. If a route succeeds with a
+ // match, returns `true`. If no defined routes matches the fragment,
+ // returns `false`.
+ loadUrl: function(fragment) {
+ // If the root doesn't match, no routes can match either.
+ if (!this.matchRoot()) return false;
+ fragment = this.fragment = this.getFragment(fragment);
+ return _.any(this.handlers, function(handler) {
+ if (handler.route.test(fragment)) {
+ handler.callback(fragment);
+ return true;
+ }
+ });
+ },
+
+ // Save a fragment into the hash history, or replace the URL state if the
+ // 'replace' option is passed. You are responsible for properly URL-encoding
+ // the fragment in advance.
+ //
+ // The options object can contain `trigger: true` if you wish to have the
+ // route callback be fired (not usually desirable), or `replace: true`, if
+ // you wish to modify the current URL without adding an entry to the history.
+ navigate: function(fragment, options) {
+ if (!History.started) return false;
+ if (!options || options === true) options = {trigger: !!options};
+
+ // Normalize the fragment.
+ fragment = this.getFragment(fragment || '');
+
+ // Don't include a trailing slash on the root.
+ var root = this.root;
+ if (fragment === '' || fragment.charAt(0) === '?') {
+ root = root.slice(0, -1) || '/';
+ }
+ var url = root + fragment;
+
+ // Strip the hash and decode for matching.
+ fragment = this.decodeFragment(fragment.replace(pathStripper, ''));
+
+ if (this.fragment === fragment) return;
+ this.fragment = fragment;
+
+ // If pushState is available, we use it to set the fragment as a real URL.
+ if (this._usePushState) {
+ this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);
+
+ // If hash changes haven't been explicitly disabled, update the hash
+ // fragment to store history.
+ } else if (this._wantsHashChange) {
+ this._updateHash(this.location, fragment, options.replace);
+ if (this.iframe && (fragment !== this.getHash(this.iframe.contentWindow))) {
+ var iWindow = this.iframe.contentWindow;
+
+ // Opening and closing the iframe tricks IE7 and earlier to push a
+ // history entry on hash-tag change. When replace is true, we don't
+ // want this.
+ if (!options.replace) {
+ iWindow.document.open();
+ iWindow.document.close();
+ }
+
+ this._updateHash(iWindow.location, fragment, options.replace);
+ }
+
+ // If you've told us that you explicitly don't want fallback hashchange-
+ // based history, then `navigate` becomes a page refresh.
+ } else {
+ return this.location.assign(url);
+ }
+ if (options.trigger) return this.loadUrl(fragment);
+ },
+
+ // Update the hash location, either replacing the current entry, or adding
+ // a new one to the browser history.
+ _updateHash: function(location, fragment, replace) {
+ if (replace) {
+ var href = location.href.replace(/(javascript:|#).*$/, '');
+ location.replace(href + '#' + fragment);
+ } else {
+ // Some browsers require that `hash` contains a leading #.
+ location.hash = '#' + fragment;
+ }
+ }
+
+ });
+
+ // Create the default Backbone.history.
+ Backbone.history = new History;
+
+ // Helpers
+ // -------
+
+ // Helper function to correctly set up the prototype chain for subclasses.
+ // Similar to `goog.inherits`, but uses a hash of prototype properties and
+ // class properties to be extended.
+ var extend = function(protoProps, staticProps) {
+ var parent = this;
+ var child;
+
+ // The constructor function for the new subclass is either defined by you
+ // (the "constructor" property in your `extend` definition), or defaulted
+ // by us to simply call the parent constructor.
+ if (protoProps && _.has(protoProps, 'constructor')) {
+ child = protoProps.constructor;
+ } else {
+ child = function(){ return parent.apply(this, arguments); };
+ }
+
+ // Add static properties to the constructor function, if supplied.
+ _.extend(child, parent, staticProps);
+
+ // Set the prototype chain to inherit from `parent`, without calling
+ // `parent` constructor function.
+ var Surrogate = function(){ this.constructor = child; };
+ Surrogate.prototype = parent.prototype;
+ child.prototype = new Surrogate;
+
+ // Add prototype properties (instance properties) to the subclass,
+ // if supplied.
+ if (protoProps) _.extend(child.prototype, protoProps);
+
+ // Set a convenience property in case the parent's prototype is needed
+ // later.
+ child.__super__ = parent.prototype;
+
+ return child;
+ };
+
+ // Set up inheritance for the model, collection, router, view and history.
+ Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;
+
+ // Throw an error when a URL is needed, and none is supplied.
+ var urlError = function() {
+ throw new Error('A "url" property or function must be specified');
+ };
+
+ // Wrap an optional error callback with a fallback error event.
+ var wrapError = function(model, options) {
+ var error = options.error;
+ options.error = function(resp) {
+ if (error) error.call(options.context, model, resp, options);
+ model.trigger('error', model, resp, options);
+ };
+ };
+
+ return Backbone;
+
+}));
diff --git a/core/vendor/moment/.bower.json b/core/vendor/moment/.bower.json
index e9bdc9bda6f..3d09c660400 100644
--- a/core/vendor/moment/.bower.json
+++ b/core/vendor/moment/.bower.json
@@ -1,30 +1,33 @@
{
"name": "moment",
- "version": "2.8.4",
+ "version": "2.10.3",
"main": "moment.js",
"ignore": [
"**/.*",
- "node_modules",
+ "benchmarks",
"bower_components",
- "test",
- "tests",
+ "meteor",
+ "node_modules",
+ "scripts",
"tasks",
+ "test",
"component.json",
"composer.json",
"CONTRIBUTING.md",
"ender.js",
"Gruntfile.js",
+ "Moment.js.nuspec",
"package.js",
"package.json"
],
"homepage": "https://github.com/moment/moment",
- "_release": "2.8.4",
+ "_release": "2.10.3",
"_resolution": {
"type": "version",
- "tag": "2.8.4",
- "commit": "7ae59de2fc3a1298ae829f6369fe3589b2cd87f8"
+ "tag": "2.10.3",
+ "commit": "6fa444238494318e3c488c81d8520ad2eba8bae7"
},
"_source": "git://github.com/moment/moment.git",
- "_target": "~2.8.3",
+ "_target": "~2.10.0",
"_originalSource": "moment"
} \ No newline at end of file
diff --git a/core/vendor/moment/LICENSE b/core/vendor/moment/LICENSE
index bd172467a6b..34f5b3707a9 100644
--- a/core/vendor/moment/LICENSE
+++ b/core/vendor/moment/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors
+Copyright (c) 2011-2015 Tim Wood, Iskren Chernev, Moment.js contributors
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
diff --git a/core/vendor/moment/min/moment-with-locales.js b/core/vendor/moment/min/moment-with-locales.js
index 23d06ef3551..61145c0ff75 100644
--- a/core/vendor/moment/min/moment-with-locales.js
+++ b/core/vendor/moment/min/moment-with-locales.js
@@ -1,442 +1,121 @@
-//! moment.js
-//! version : 2.8.3
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
-//! license : MIT
-//! momentjs.com
-
-(function (undefined) {
- /************************************
- Constants
- ************************************/
-
- var moment,
- VERSION = '2.8.3',
- // the global-scope this is NOT the global object in Node.js
- globalScope = typeof global !== 'undefined' ? global : this,
- oldGlobalMoment,
- round = Math.round,
- hasOwnProperty = Object.prototype.hasOwnProperty,
- i,
-
- YEAR = 0,
- MONTH = 1,
- DATE = 2,
- HOUR = 3,
- MINUTE = 4,
- SECOND = 5,
- MILLISECOND = 6,
-
- // internal storage for locale config files
- locales = {},
-
- // extra moment internal properties (plugins register props here)
- momentProperties = [],
-
- // check for nodeJS
- hasModule = (typeof module !== 'undefined' && module.exports),
-
- // ASP.NET json date format regex
- aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
- aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
-
- // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
- // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
- isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
-
- // format tokens
- formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
- localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
-
- // parsing token regexes
- parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
- parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
- parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
- parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
- parseTokenDigits = /\d+/, // nonzero number of digits
- parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
- parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
- parseTokenT = /T/i, // T (ISO separator)
- parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
- parseTokenOrdinal = /\d{1,2}/,
-
- //strict parsing regexes
- parseTokenOneDigit = /\d/, // 0 - 9
- parseTokenTwoDigits = /\d\d/, // 00 - 99
- parseTokenThreeDigits = /\d{3}/, // 000 - 999
- parseTokenFourDigits = /\d{4}/, // 0000 - 9999
- parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
- parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
-
- // iso 8601 regex
- // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
- isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
-
- isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
-
- isoDates = [
- ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
- ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
- ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
- ['GGGG-[W]WW', /\d{4}-W\d{2}/],
- ['YYYY-DDD', /\d{4}-\d{3}/]
- ],
-
- // iso time formats and regexes
- isoTimes = [
- ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
- ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
- ['HH:mm', /(T| )\d\d:\d\d/],
- ['HH', /(T| )\d\d/]
- ],
-
- // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']
- parseTimezoneChunker = /([\+\-]|\d\d)/gi,
-
- // getter and setter names
- proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
- unitMillisecondFactors = {
- 'Milliseconds' : 1,
- 'Seconds' : 1e3,
- 'Minutes' : 6e4,
- 'Hours' : 36e5,
- 'Days' : 864e5,
- 'Months' : 2592e6,
- 'Years' : 31536e6
- },
-
- unitAliases = {
- ms : 'millisecond',
- s : 'second',
- m : 'minute',
- h : 'hour',
- d : 'day',
- D : 'date',
- w : 'week',
- W : 'isoWeek',
- M : 'month',
- Q : 'quarter',
- y : 'year',
- DDD : 'dayOfYear',
- e : 'weekday',
- E : 'isoWeekday',
- gg: 'weekYear',
- GG: 'isoWeekYear'
- },
-
- camelFunctions = {
- dayofyear : 'dayOfYear',
- isoweekday : 'isoWeekday',
- isoweek : 'isoWeek',
- weekyear : 'weekYear',
- isoweekyear : 'isoWeekYear'
- },
-
- // format function strings
- formatFunctions = {},
-
- // default relative time thresholds
- relativeTimeThresholds = {
- s: 45, // seconds to minute
- m: 45, // minutes to hour
- h: 22, // hours to day
- d: 26, // days to month
- M: 11 // months to year
- },
-
- // tokens to ordinalize and pad
- ordinalizeTokens = 'DDD w W M D d'.split(' '),
- paddedTokens = 'M D H h m s w W'.split(' '),
-
- formatTokenFunctions = {
- M : function () {
- return this.month() + 1;
- },
- MMM : function (format) {
- return this.localeData().monthsShort(this, format);
- },
- MMMM : function (format) {
- return this.localeData().months(this, format);
- },
- D : function () {
- return this.date();
- },
- DDD : function () {
- return this.dayOfYear();
- },
- d : function () {
- return this.day();
- },
- dd : function (format) {
- return this.localeData().weekdaysMin(this, format);
- },
- ddd : function (format) {
- return this.localeData().weekdaysShort(this, format);
- },
- dddd : function (format) {
- return this.localeData().weekdays(this, format);
- },
- w : function () {
- return this.week();
- },
- W : function () {
- return this.isoWeek();
- },
- YY : function () {
- return leftZeroFill(this.year() % 100, 2);
- },
- YYYY : function () {
- return leftZeroFill(this.year(), 4);
- },
- YYYYY : function () {
- return leftZeroFill(this.year(), 5);
- },
- YYYYYY : function () {
- var y = this.year(), sign = y >= 0 ? '+' : '-';
- return sign + leftZeroFill(Math.abs(y), 6);
- },
- gg : function () {
- return leftZeroFill(this.weekYear() % 100, 2);
- },
- gggg : function () {
- return leftZeroFill(this.weekYear(), 4);
- },
- ggggg : function () {
- return leftZeroFill(this.weekYear(), 5);
- },
- GG : function () {
- return leftZeroFill(this.isoWeekYear() % 100, 2);
- },
- GGGG : function () {
- return leftZeroFill(this.isoWeekYear(), 4);
- },
- GGGGG : function () {
- return leftZeroFill(this.isoWeekYear(), 5);
- },
- e : function () {
- return this.weekday();
- },
- E : function () {
- return this.isoWeekday();
- },
- a : function () {
- return this.localeData().meridiem(this.hours(), this.minutes(), true);
- },
- A : function () {
- return this.localeData().meridiem(this.hours(), this.minutes(), false);
- },
- H : function () {
- return this.hours();
- },
- h : function () {
- return this.hours() % 12 || 12;
- },
- m : function () {
- return this.minutes();
- },
- s : function () {
- return this.seconds();
- },
- S : function () {
- return toInt(this.milliseconds() / 100);
- },
- SS : function () {
- return leftZeroFill(toInt(this.milliseconds() / 10), 2);
- },
- SSS : function () {
- return leftZeroFill(this.milliseconds(), 3);
- },
- SSSS : function () {
- return leftZeroFill(this.milliseconds(), 3);
- },
- Z : function () {
- var a = -this.zone(),
- b = '+';
- if (a < 0) {
- a = -a;
- b = '-';
- }
- return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);
- },
- ZZ : function () {
- var a = -this.zone(),
- b = '+';
- if (a < 0) {
- a = -a;
- b = '-';
- }
- return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
- },
- z : function () {
- return this.zoneAbbr();
- },
- zz : function () {
- return this.zoneName();
- },
- X : function () {
- return this.unix();
- },
- Q : function () {
- return this.quarter();
- }
- },
-
- deprecations = {},
-
- lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.moment = factory()
+}(this, function () { 'use strict';
- // Pick the first defined of two or three arguments. dfl comes from
- // default.
- function dfl(a, b, c) {
- switch (arguments.length) {
- case 2: return a != null ? a : b;
- case 3: return a != null ? a : b != null ? b : c;
- default: throw new Error('Implement me');
- }
- }
+ var hookCallback;
- function hasOwnProp(a, b) {
- return hasOwnProperty.call(a, b);
+ function utils_hooks__hooks () {
+ return hookCallback.apply(null, arguments);
}
- function defaultParsingFlags() {
- // We need to deep clone this object, and es5 standard is not very
- // helpful.
- return {
- empty : false,
- unusedTokens : [],
- unusedInput : [],
- overflow : -2,
- charsLeftOver : 0,
- nullInput : false,
- invalidMonth : null,
- invalidFormat : false,
- userInvalidated : false,
- iso: false
- };
+ // This is done to register the method called with moment()
+ // without creating circular dependencies.
+ function setHookCallback (callback) {
+ hookCallback = callback;
}
- function printMsg(msg) {
- if (moment.suppressDeprecationWarnings === false &&
- typeof console !== 'undefined' && console.warn) {
- console.warn('Deprecation warning: ' + msg);
- }
+ function isArray(input) {
+ return Object.prototype.toString.call(input) === '[object Array]';
}
- function deprecate(msg, fn) {
- var firstTime = true;
- return extend(function () {
- if (firstTime) {
- printMsg(msg);
- firstTime = false;
- }
- return fn.apply(this, arguments);
- }, fn);
+ function isDate(input) {
+ return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
}
- function deprecateSimple(name, msg) {
- if (!deprecations[name]) {
- printMsg(msg);
- deprecations[name] = true;
+ function map(arr, fn) {
+ var res = [], i;
+ for (i = 0; i < arr.length; ++i) {
+ res.push(fn(arr[i], i));
}
+ return res;
}
- function padToken(func, count) {
- return function (a) {
- return leftZeroFill(func.call(this, a), count);
- };
- }
- function ordinalizeToken(func, period) {
- return function (a) {
- return this.localeData().ordinal(func.call(this, a), period);
- };
+ function hasOwnProp(a, b) {
+ return Object.prototype.hasOwnProperty.call(a, b);
}
- while (ordinalizeTokens.length) {
- i = ordinalizeTokens.pop();
- formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
- }
- while (paddedTokens.length) {
- i = paddedTokens.pop();
- formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
- }
- formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
+ function extend(a, b) {
+ for (var i in b) {
+ if (hasOwnProp(b, i)) {
+ a[i] = b[i];
+ }
+ }
+ if (hasOwnProp(b, 'toString')) {
+ a.toString = b.toString;
+ }
- /************************************
- Constructors
- ************************************/
+ if (hasOwnProp(b, 'valueOf')) {
+ a.valueOf = b.valueOf;
+ }
- function Locale() {
+ return a;
}
- // Moment prototype object
- function Moment(config, skipOverflow) {
- if (skipOverflow !== false) {
- checkOverflow(config);
- }
- copyConfig(this, config);
- this._d = new Date(+config._d);
+ function create_utc__createUTC (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, true).utc();
}
- // Duration Constructor
- function Duration(duration) {
- var normalizedInput = normalizeObjectUnits(duration),
- years = normalizedInput.year || 0,
- quarters = normalizedInput.quarter || 0,
- months = normalizedInput.month || 0,
- weeks = normalizedInput.week || 0,
- days = normalizedInput.day || 0,
- hours = normalizedInput.hour || 0,
- minutes = normalizedInput.minute || 0,
- seconds = normalizedInput.second || 0,
- milliseconds = normalizedInput.millisecond || 0;
-
- // representation for dateAddRemove
- this._milliseconds = +milliseconds +
- seconds * 1e3 + // 1000
- minutes * 6e4 + // 1000 * 60
- hours * 36e5; // 1000 * 60 * 60
- // Because of dateAddRemove treats 24 hours as different from a
- // day when working around DST, we need to store them separately
- this._days = +days +
- weeks * 7;
- // It is impossible translate months into days without knowing
- // which months you are are talking about, so we have to store
- // it separately.
- this._months = +months +
- quarters * 3 +
- years * 12;
-
- this._data = {};
-
- this._locale = moment.localeData();
-
- this._bubble();
+ function defaultParsingFlags() {
+ // We need to deep clone this object.
+ return {
+ empty : false,
+ unusedTokens : [],
+ unusedInput : [],
+ overflow : -2,
+ charsLeftOver : 0,
+ nullInput : false,
+ invalidMonth : null,
+ invalidFormat : false,
+ userInvalidated : false,
+ iso : false
+ };
}
- /************************************
- Helpers
- ************************************/
+ function getParsingFlags(m) {
+ if (m._pf == null) {
+ m._pf = defaultParsingFlags();
+ }
+ return m._pf;
+ }
+ function valid__isValid(m) {
+ if (m._isValid == null) {
+ var flags = getParsingFlags(m);
+ m._isValid = !isNaN(m._d.getTime()) &&
+ flags.overflow < 0 &&
+ !flags.empty &&
+ !flags.invalidMonth &&
+ !flags.nullInput &&
+ !flags.invalidFormat &&
+ !flags.userInvalidated;
- function extend(a, b) {
- for (var i in b) {
- if (hasOwnProp(b, i)) {
- a[i] = b[i];
+ if (m._strict) {
+ m._isValid = m._isValid &&
+ flags.charsLeftOver === 0 &&
+ flags.unusedTokens.length === 0 &&
+ flags.bigHour === undefined;
}
}
+ return m._isValid;
+ }
- if (hasOwnProp(b, 'toString')) {
- a.toString = b.toString;
+ function valid__createInvalid (flags) {
+ var m = create_utc__createUTC(NaN);
+ if (flags != null) {
+ extend(getParsingFlags(m), flags);
}
-
- if (hasOwnProp(b, 'valueOf')) {
- a.valueOf = b.valueOf;
+ else {
+ getParsingFlags(m).userInvalidated = true;
}
- return a;
+ return m;
}
+ var momentProperties = utils_hooks__hooks.momentProperties = [];
+
function copyConfig(to, from) {
var i, prop, val;
@@ -465,7 +144,7 @@
to._offset = from._offset;
}
if (typeof from._pf !== 'undefined') {
- to._pf = from._pf;
+ to._pf = getParsingFlags(from);
}
if (typeof from._locale !== 'undefined') {
to._locale = from._locale;
@@ -484,102 +163,40 @@
return to;
}
- function absRound(number) {
- if (number < 0) {
- return Math.ceil(number);
- } else {
- return Math.floor(number);
- }
- }
+ var updateInProgress = false;
- // left zero fill a number
- // see http://jsperf.com/left-zero-filling for performance comparison
- function leftZeroFill(number, targetLength, forceSign) {
- var output = '' + Math.abs(number),
- sign = number >= 0;
-
- while (output.length < targetLength) {
- output = '0' + output;
+ // Moment prototype object
+ function Moment(config) {
+ copyConfig(this, config);
+ this._d = new Date(+config._d);
+ // Prevent infinite loop in case updateOffset creates new moment
+ // objects.
+ if (updateInProgress === false) {
+ updateInProgress = true;
+ utils_hooks__hooks.updateOffset(this);
+ updateInProgress = false;
}
- return (sign ? (forceSign ? '+' : '') : '-') + output;
}
- function positiveMomentsDifference(base, other) {
- var res = {milliseconds: 0, months: 0};
-
- res.months = other.month() - base.month() +
- (other.year() - base.year()) * 12;
- if (base.clone().add(res.months, 'M').isAfter(other)) {
- --res.months;
- }
-
- res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
-
- return res;
+ function isMoment (obj) {
+ return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
}
- function momentsDifference(base, other) {
- var res;
- other = makeAs(other, base);
- if (base.isBefore(other)) {
- res = positiveMomentsDifference(base, other);
- } else {
- res = positiveMomentsDifference(other, base);
- res.milliseconds = -res.milliseconds;
- res.months = -res.months;
- }
-
- return res;
- }
+ function toInt(argumentForCoercion) {
+ var coercedNumber = +argumentForCoercion,
+ value = 0;
- // TODO: remove 'name' arg after deprecation is removed
- function createAdder(direction, name) {
- return function (val, period) {
- var dur, tmp;
- //invert the arguments, but complain about it
- if (period !== null && !isNaN(+period)) {
- deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
- tmp = val; val = period; period = tmp;
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+ if (coercedNumber >= 0) {
+ value = Math.floor(coercedNumber);
+ } else {
+ value = Math.ceil(coercedNumber);
}
-
- val = typeof val === 'string' ? +val : val;
- dur = moment.duration(val, period);
- addOrSubtractDurationFromMoment(this, dur, direction);
- return this;
- };
- }
-
- function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {
- var milliseconds = duration._milliseconds,
- days = duration._days,
- months = duration._months;
- updateOffset = updateOffset == null ? true : updateOffset;
-
- if (milliseconds) {
- mom._d.setTime(+mom._d + milliseconds * isAdding);
- }
- if (days) {
- rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);
- }
- if (months) {
- rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);
}
- if (updateOffset) {
- moment.updateOffset(mom, days || months);
- }
- }
- // check if is an array
- function isArray(input) {
- return Object.prototype.toString.call(input) === '[object Array]';
- }
-
- function isDate(input) {
- return Object.prototype.toString.call(input) === '[object Date]' ||
- input instanceof Date;
+ return value;
}
- // compare two arrays, return the number of differences
function compareArrays(array1, array2, dontConvert) {
var len = Math.min(array1.length, array2.length),
lengthDiff = Math.abs(array1.length - array2.length),
@@ -594,142 +211,11 @@
return diffs + lengthDiff;
}
- function normalizeUnits(units) {
- if (units) {
- var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
- units = unitAliases[units] || camelFunctions[lowered] || lowered;
- }
- return units;
- }
-
- function normalizeObjectUnits(inputObject) {
- var normalizedInput = {},
- normalizedProp,
- prop;
-
- for (prop in inputObject) {
- if (hasOwnProp(inputObject, prop)) {
- normalizedProp = normalizeUnits(prop);
- if (normalizedProp) {
- normalizedInput[normalizedProp] = inputObject[prop];
- }
- }
- }
-
- return normalizedInput;
- }
-
- function makeList(field) {
- var count, setter;
-
- if (field.indexOf('week') === 0) {
- count = 7;
- setter = 'day';
- }
- else if (field.indexOf('month') === 0) {
- count = 12;
- setter = 'month';
- }
- else {
- return;
- }
-
- moment[field] = function (format, index) {
- var i, getter,
- method = moment._locale[field],
- results = [];
-
- if (typeof format === 'number') {
- index = format;
- format = undefined;
- }
-
- getter = function (i) {
- var m = moment().utc().set(setter, i);
- return method.call(moment._locale, m, format || '');
- };
-
- if (index != null) {
- return getter(index);
- }
- else {
- for (i = 0; i < count; i++) {
- results.push(getter(i));
- }
- return results;
- }
- };
- }
-
- function toInt(argumentForCoercion) {
- var coercedNumber = +argumentForCoercion,
- value = 0;
-
- if (coercedNumber !== 0 && isFinite(coercedNumber)) {
- if (coercedNumber >= 0) {
- value = Math.floor(coercedNumber);
- } else {
- value = Math.ceil(coercedNumber);
- }
- }
-
- return value;
- }
-
- function daysInMonth(year, month) {
- return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
- }
-
- function weeksInYear(year, dow, doy) {
- return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;
- }
-
- function daysInYear(year) {
- return isLeapYear(year) ? 366 : 365;
- }
-
- function isLeapYear(year) {
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
- }
-
- function checkOverflow(m) {
- var overflow;
- if (m._a && m._pf.overflow === -2) {
- overflow =
- m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
- m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
- m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
- m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
- m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
- m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
- -1;
-
- if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
- overflow = DATE;
- }
-
- m._pf.overflow = overflow;
- }
+ function Locale() {
}
- function isValid(m) {
- if (m._isValid == null) {
- m._isValid = !isNaN(m._d.getTime()) &&
- m._pf.overflow < 0 &&
- !m._pf.empty &&
- !m._pf.invalidMonth &&
- !m._pf.nullInput &&
- !m._pf.invalidFormat &&
- !m._pf.userInvalidated;
-
- if (m._strict) {
- m._isValid = m._isValid &&
- m._pf.charsLeftOver === 0 &&
- m._pf.unusedTokens.length === 0;
- }
- }
- return m._isValid;
- }
+ var locales = {};
+ var globalLocale;
function normalizeLocale(key) {
return key ? key.toLowerCase().replace('_', '-') : key;
@@ -764,215 +250,193 @@
function loadLocale(name) {
var oldLocale = null;
- if (!locales[name] && hasModule) {
+ // TODO: Find a better way to register and load all the locales in Node
+ if (!locales[name] && typeof module !== 'undefined' &&
+ module && module.exports) {
try {
- oldLocale = moment.locale();
+ oldLocale = globalLocale._abbr;
require('./locale/' + name);
- // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales
- moment.locale(oldLocale);
+ // because defineLocale currently also sets the global locale, we
+ // want to undo that for lazy loaded locales
+ locale_locales__getSetGlobalLocale(oldLocale);
} catch (e) { }
}
return locales[name];
}
- // Return a moment from input, that is local/utc/zone equivalent to model.
- function makeAs(input, model) {
- return model._isUTC ? moment(input).zone(model._offset || 0) :
- moment(input).local();
- }
-
- /************************************
- Locale
- ************************************/
+ // This function will load locale and then set the global locale. If
+ // no arguments are passed in, it will simply return the current global
+ // locale key.
+ function locale_locales__getSetGlobalLocale (key, values) {
+ var data;
+ if (key) {
+ if (typeof values === 'undefined') {
+ data = locale_locales__getLocale(key);
+ }
+ else {
+ data = defineLocale(key, values);
+ }
+ if (data) {
+ // moment.duration._locale = moment._locale = data;
+ globalLocale = data;
+ }
+ }
- extend(Locale.prototype, {
+ return globalLocale._abbr;
+ }
- set : function (config) {
- var prop, i;
- for (i in config) {
- prop = config[i];
- if (typeof prop === 'function') {
- this[i] = prop;
- } else {
- this['_' + i] = prop;
- }
+ function defineLocale (name, values) {
+ if (values !== null) {
+ values.abbr = name;
+ if (!locales[name]) {
+ locales[name] = new Locale();
}
- },
+ locales[name].set(values);
- _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
- months : function (m) {
- return this._months[m.month()];
- },
+ // backwards compat for now: also set the locale
+ locale_locales__getSetGlobalLocale(name);
- _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
- monthsShort : function (m) {
- return this._monthsShort[m.month()];
- },
+ return locales[name];
+ } else {
+ // useful for testing
+ delete locales[name];
+ return null;
+ }
+ }
- monthsParse : function (monthName) {
- var i, mom, regex;
+ // returns locale data
+ function locale_locales__getLocale (key) {
+ var locale;
- if (!this._monthsParse) {
- this._monthsParse = [];
- }
+ if (key && key._locale && key._locale._abbr) {
+ key = key._locale._abbr;
+ }
- for (i = 0; i < 12; i++) {
- // make the regex if we don't have it already
- if (!this._monthsParse[i]) {
- mom = moment.utc([2000, i]);
- regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
- this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
- // test the regex
- if (this._monthsParse[i].test(monthName)) {
- return i;
- }
+ if (!key) {
+ return globalLocale;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ locale = loadLocale(key);
+ if (locale) {
+ return locale;
}
- },
+ key = [key];
+ }
- _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
- weekdays : function (m) {
- return this._weekdays[m.day()];
- },
+ return chooseLocale(key);
+ }
- _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
- weekdaysShort : function (m) {
- return this._weekdaysShort[m.day()];
- },
+ var aliases = {};
- _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
- weekdaysMin : function (m) {
- return this._weekdaysMin[m.day()];
- },
+ function addUnitAlias (unit, shorthand) {
+ var lowerCase = unit.toLowerCase();
+ aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+ }
- weekdaysParse : function (weekdayName) {
- var i, mom, regex;
+ function normalizeUnits(units) {
+ return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+ }
- if (!this._weekdaysParse) {
- this._weekdaysParse = [];
- }
+ function normalizeObjectUnits(inputObject) {
+ var normalizedInput = {},
+ normalizedProp,
+ prop;
- for (i = 0; i < 7; i++) {
- // make the regex if we don't have it already
- if (!this._weekdaysParse[i]) {
- mom = moment([2000, 1]).day(i);
- regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
- this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
- // test the regex
- if (this._weekdaysParse[i].test(weekdayName)) {
- return i;
+ for (prop in inputObject) {
+ if (hasOwnProp(inputObject, prop)) {
+ normalizedProp = normalizeUnits(prop);
+ if (normalizedProp) {
+ normalizedInput[normalizedProp] = inputObject[prop];
}
}
- },
-
- _longDateFormat : {
- LT : 'h:mm A',
- L : 'MM/DD/YYYY',
- LL : 'MMMM D, YYYY',
- LLL : 'MMMM D, YYYY LT',
- LLLL : 'dddd, MMMM D, YYYY LT'
- },
- longDateFormat : function (key) {
- var output = this._longDateFormat[key];
- if (!output && this._longDateFormat[key.toUpperCase()]) {
- output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
- return val.slice(1);
- });
- this._longDateFormat[key] = output;
- }
- return output;
- },
+ }
- isPM : function (input) {
- // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
- // Using charAt should be more compatible.
- return ((input + '').toLowerCase().charAt(0) === 'p');
- },
+ return normalizedInput;
+ }
- _meridiemParse : /[ap]\.?m?\.?/i,
- meridiem : function (hours, minutes, isLower) {
- if (hours > 11) {
- return isLower ? 'pm' : 'PM';
+ function makeGetSet (unit, keepTime) {
+ return function (value) {
+ if (value != null) {
+ get_set__set(this, unit, value);
+ utils_hooks__hooks.updateOffset(this, keepTime);
+ return this;
} else {
- return isLower ? 'am' : 'AM';
+ return get_set__get(this, unit);
}
- },
-
- _calendar : {
- sameDay : '[Today at] LT',
- nextDay : '[Tomorrow at] LT',
- nextWeek : 'dddd [at] LT',
- lastDay : '[Yesterday at] LT',
- lastWeek : '[Last] dddd [at] LT',
- sameElse : 'L'
- },
- calendar : function (key, mom) {
- var output = this._calendar[key];
- return typeof output === 'function' ? output.apply(mom) : output;
- },
+ };
+ }
- _relativeTime : {
- future : 'in %s',
- past : '%s ago',
- s : 'a few seconds',
- m : 'a minute',
- mm : '%d minutes',
- h : 'an hour',
- hh : '%d hours',
- d : 'a day',
- dd : '%d days',
- M : 'a month',
- MM : '%d months',
- y : 'a year',
- yy : '%d years'
- },
+ function get_set__get (mom, unit) {
+ return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
+ }
- relativeTime : function (number, withoutSuffix, string, isFuture) {
- var output = this._relativeTime[string];
- return (typeof output === 'function') ?
- output(number, withoutSuffix, string, isFuture) :
- output.replace(/%d/i, number);
- },
+ function get_set__set (mom, unit, value) {
+ return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+ }
- pastFuture : function (diff, output) {
- var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
- return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
- },
+ // MOMENTS
- ordinal : function (number) {
- return this._ordinal.replace('%d', number);
- },
- _ordinal : '%d',
+ function getSet (units, value) {
+ var unit;
+ if (typeof units === 'object') {
+ for (unit in units) {
+ this.set(unit, units[unit]);
+ }
+ } else {
+ units = normalizeUnits(units);
+ if (typeof this[units] === 'function') {
+ return this[units](value);
+ }
+ }
+ return this;
+ }
- preparse : function (string) {
- return string;
- },
+ function zeroFill(number, targetLength, forceSign) {
+ var output = '' + Math.abs(number),
+ sign = number >= 0;
- postformat : function (string) {
- return string;
- },
+ while (output.length < targetLength) {
+ output = '0' + output;
+ }
+ return (sign ? (forceSign ? '+' : '') : '-') + output;
+ }
- week : function (mom) {
- return weekOfYear(mom, this._week.dow, this._week.doy).week;
- },
+ var formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g;
- _week : {
- dow : 0, // Sunday is the first day of the week.
- doy : 6 // The week that contains Jan 1st is the first week of the year.
- },
+ var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
- _invalidDate: 'Invalid date',
- invalidDate: function () {
- return this._invalidDate;
- }
- });
+ var formatFunctions = {};
- /************************************
- Formatting
- ************************************/
+ var formatTokenFunctions = {};
+ // token: 'M'
+ // padded: ['MM', 2]
+ // ordinal: 'Mo'
+ // callback: function () { this.month() + 1 }
+ function addFormatToken (token, padded, ordinal, callback) {
+ var func = callback;
+ if (typeof callback === 'string') {
+ func = function () {
+ return this[callback]();
+ };
+ }
+ if (token) {
+ formatTokenFunctions[token] = func;
+ }
+ if (padded) {
+ formatTokenFunctions[padded[0]] = function () {
+ return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+ };
+ }
+ if (ordinal) {
+ formatTokenFunctions[ordinal] = function () {
+ return this.localeData().ordinal(func.apply(this, arguments), token);
+ };
+ }
+ }
function removeFormattingTokens(input) {
if (input.match(/\[[\s\S]/)) {
@@ -1033,292 +497,549 @@
return format;
}
+ var match1 = /\d/; // 0 - 9
+ var match2 = /\d\d/; // 00 - 99
+ var match3 = /\d{3}/; // 000 - 999
+ var match4 = /\d{4}/; // 0000 - 9999
+ var match6 = /[+-]?\d{6}/; // -999999 - 999999
+ var match1to2 = /\d\d?/; // 0 - 99
+ var match1to3 = /\d{1,3}/; // 0 - 999
+ var match1to4 = /\d{1,4}/; // 0 - 9999
+ var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
- /************************************
- Parsing
- ************************************/
-
-
- // get the regex to find the next token
- function getParseRegexForToken(token, config) {
- var a, strict = config._strict;
- switch (token) {
- case 'Q':
- return parseTokenOneDigit;
- case 'DDDD':
- return parseTokenThreeDigits;
- case 'YYYY':
- case 'GGGG':
- case 'gggg':
- return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
- case 'Y':
- case 'G':
- case 'g':
- return parseTokenSignedNumber;
- case 'YYYYYY':
- case 'YYYYY':
- case 'GGGGG':
- case 'ggggg':
- return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
- case 'S':
- if (strict) {
- return parseTokenOneDigit;
- }
- /* falls through */
- case 'SS':
- if (strict) {
- return parseTokenTwoDigits;
- }
- /* falls through */
- case 'SSS':
- if (strict) {
- return parseTokenThreeDigits;
- }
- /* falls through */
- case 'DDD':
- return parseTokenOneToThreeDigits;
- case 'MMM':
- case 'MMMM':
- case 'dd':
- case 'ddd':
- case 'dddd':
- return parseTokenWord;
- case 'a':
- case 'A':
- return config._locale._meridiemParse;
- case 'X':
- return parseTokenTimestampMs;
- case 'Z':
- case 'ZZ':
- return parseTokenTimezone;
- case 'T':
- return parseTokenT;
- case 'SSSS':
- return parseTokenDigits;
- case 'MM':
- case 'DD':
- case 'YY':
- case 'GG':
- case 'gg':
- case 'HH':
- case 'hh':
- case 'mm':
- case 'ss':
- case 'ww':
- case 'WW':
- return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
- case 'M':
- case 'D':
- case 'd':
- case 'H':
- case 'h':
- case 'm':
- case 's':
- case 'w':
- case 'W':
- case 'e':
- case 'E':
- return parseTokenOneOrTwoDigits;
- case 'Do':
- return parseTokenOrdinal;
- default :
- a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));
- return a;
+ var matchUnsigned = /\d+/; // 0 - inf
+ var matchSigned = /[+-]?\d+/; // -inf - inf
+
+ var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+
+ var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+ // any word (or two) characters or numbers including two/three word month in arabic.
+ var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
+
+ var regexes = {};
+
+ function addRegexToken (token, regex, strictRegex) {
+ regexes[token] = typeof regex === 'function' ? regex : function (isStrict) {
+ return (isStrict && strictRegex) ? strictRegex : regex;
+ };
+ }
+
+ function getParseRegexForToken (token, config) {
+ if (!hasOwnProp(regexes, token)) {
+ return new RegExp(unescapeFormat(token));
}
+
+ return regexes[token](config._strict, config._locale);
}
- function timezoneMinutesFromString(string) {
- string = string || '';
- var possibleTzMatches = (string.match(parseTokenTimezone) || []),
- tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
- parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
- minutes = +(parts[1] * 60) + toInt(parts[2]);
+ // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+ function unescapeFormat(s) {
+ return s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+ return p1 || p2 || p3 || p4;
+ }).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+ }
- return parts[0] === '+' ? -minutes : minutes;
+ var tokens = {};
+
+ function addParseToken (token, callback) {
+ var i, func = callback;
+ if (typeof token === 'string') {
+ token = [token];
+ }
+ if (typeof callback === 'number') {
+ func = function (input, array) {
+ array[callback] = toInt(input);
+ };
+ }
+ for (i = 0; i < token.length; i++) {
+ tokens[token[i]] = func;
+ }
+ }
+
+ function addWeekParseToken (token, callback) {
+ addParseToken(token, function (input, array, config, token) {
+ config._w = config._w || {};
+ callback(input, config._w, config, token);
+ });
}
- // function to convert string input to date
function addTimeToArrayFromToken(token, input, config) {
- var a, datePartArray = config._a;
+ if (input != null && hasOwnProp(tokens, token)) {
+ tokens[token](input, config._a, config, token);
+ }
+ }
- switch (token) {
- // QUARTER
- case 'Q':
- if (input != null) {
- datePartArray[MONTH] = (toInt(input) - 1) * 3;
- }
- break;
- // MONTH
- case 'M' : // fall through to MM
- case 'MM' :
- if (input != null) {
- datePartArray[MONTH] = toInt(input) - 1;
- }
- break;
- case 'MMM' : // fall through to MMMM
- case 'MMMM' :
- a = config._locale.monthsParse(input);
- // if we didn't find a month name, mark the date as invalid.
- if (a != null) {
- datePartArray[MONTH] = a;
- } else {
- config._pf.invalidMonth = input;
+ var YEAR = 0;
+ var MONTH = 1;
+ var DATE = 2;
+ var HOUR = 3;
+ var MINUTE = 4;
+ var SECOND = 5;
+ var MILLISECOND = 6;
+
+ function daysInMonth(year, month) {
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+ }
+
+ // FORMATTING
+
+ addFormatToken('M', ['MM', 2], 'Mo', function () {
+ return this.month() + 1;
+ });
+
+ addFormatToken('MMM', 0, 0, function (format) {
+ return this.localeData().monthsShort(this, format);
+ });
+
+ addFormatToken('MMMM', 0, 0, function (format) {
+ return this.localeData().months(this, format);
+ });
+
+ // ALIASES
+
+ addUnitAlias('month', 'M');
+
+ // PARSING
+
+ addRegexToken('M', match1to2);
+ addRegexToken('MM', match1to2, match2);
+ addRegexToken('MMM', matchWord);
+ addRegexToken('MMMM', matchWord);
+
+ addParseToken(['M', 'MM'], function (input, array) {
+ array[MONTH] = toInt(input) - 1;
+ });
+
+ addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+ var month = config._locale.monthsParse(input, token, config._strict);
+ // if we didn't find a month name, mark the date as invalid.
+ if (month != null) {
+ array[MONTH] = month;
+ } else {
+ getParsingFlags(config).invalidMonth = input;
+ }
+ });
+
+ // LOCALES
+
+ var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+ function localeMonths (m) {
+ return this._months[m.month()];
+ }
+
+ var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+ function localeMonthsShort (m) {
+ return this._monthsShort[m.month()];
+ }
+
+ function localeMonthsParse (monthName, format, strict) {
+ var i, mom, regex;
+
+ if (!this._monthsParse) {
+ this._monthsParse = [];
+ this._longMonthsParse = [];
+ this._shortMonthsParse = [];
+ }
+
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ mom = create_utc__createUTC([2000, i]);
+ if (strict && !this._longMonthsParse[i]) {
+ this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+ this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
}
- break;
- // DAY OF MONTH
- case 'D' : // fall through to DD
- case 'DD' :
- if (input != null) {
- datePartArray[DATE] = toInt(input);
+ if (!strict && !this._monthsParse[i]) {
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
}
- break;
- case 'Do' :
- if (input != null) {
- datePartArray[DATE] = toInt(parseInt(input, 10));
+ // test the regex
+ if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+ return i;
+ } else if (!strict && this._monthsParse[i].test(monthName)) {
+ return i;
}
- break;
- // DAY OF YEAR
- case 'DDD' : // fall through to DDDD
- case 'DDDD' :
- if (input != null) {
- config._dayOfYear = toInt(input);
+ }
+ }
+
+ // MOMENTS
+
+ function setMonth (mom, value) {
+ var dayOfMonth;
+
+ // TODO: Move this out of here!
+ if (typeof value === 'string') {
+ value = mom.localeData().monthsParse(value);
+ // TODO: Another silent failure?
+ if (typeof value !== 'number') {
+ return mom;
}
+ }
- break;
- // YEAR
- case 'YY' :
- datePartArray[YEAR] = moment.parseTwoDigitYear(input);
- break;
- case 'YYYY' :
- case 'YYYYY' :
- case 'YYYYYY' :
- datePartArray[YEAR] = toInt(input);
- break;
- // AM / PM
- case 'a' : // fall through to A
- case 'A' :
- config._isPm = config._locale.isPM(input);
- break;
- // 24 HOUR
- case 'H' : // fall through to hh
- case 'HH' : // fall through to hh
- case 'h' : // fall through to hh
- case 'hh' :
- datePartArray[HOUR] = toInt(input);
- break;
- // MINUTE
- case 'm' : // fall through to mm
- case 'mm' :
- datePartArray[MINUTE] = toInt(input);
- break;
- // SECOND
- case 's' : // fall through to ss
- case 'ss' :
- datePartArray[SECOND] = toInt(input);
- break;
- // MILLISECOND
- case 'S' :
- case 'SS' :
- case 'SSS' :
- case 'SSSS' :
- datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
- break;
- // UNIX TIMESTAMP WITH MS
- case 'X':
- config._d = new Date(parseFloat(input) * 1000);
- break;
- // TIMEZONE
- case 'Z' : // fall through to ZZ
- case 'ZZ' :
- config._useUTC = true;
- config._tzm = timezoneMinutesFromString(input);
- break;
- // WEEKDAY - human
- case 'dd':
- case 'ddd':
- case 'dddd':
- a = config._locale.weekdaysParse(input);
- // if we didn't get a weekday name, mark the date as invalid
- if (a != null) {
- config._w = config._w || {};
- config._w['d'] = a;
- } else {
- config._pf.invalidWeekday = input;
+ dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+ return mom;
+ }
+
+ function getSetMonth (value) {
+ if (value != null) {
+ setMonth(this, value);
+ utils_hooks__hooks.updateOffset(this, true);
+ return this;
+ } else {
+ return get_set__get(this, 'Month');
+ }
+ }
+
+ function getDaysInMonth () {
+ return daysInMonth(this.year(), this.month());
+ }
+
+ function checkOverflow (m) {
+ var overflow;
+ var a = m._a;
+
+ if (a && getParsingFlags(m).overflow === -2) {
+ overflow =
+ a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
+ a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+ a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+ a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
+ a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
+ a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+ -1;
+
+ if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+ overflow = DATE;
}
- break;
- // WEEK, WEEK DAY - numeric
- case 'w':
- case 'ww':
- case 'W':
- case 'WW':
- case 'd':
- case 'e':
- case 'E':
- token = token.substr(0, 1);
- /* falls through */
- case 'gggg':
- case 'GGGG':
- case 'GGGGG':
- token = token.substr(0, 2);
- if (input) {
- config._w = config._w || {};
- config._w[token] = toInt(input);
+
+ getParsingFlags(m).overflow = overflow;
+ }
+
+ return m;
+ }
+
+ function warn(msg) {
+ if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {
+ console.warn('Deprecation warning: ' + msg);
+ }
+ }
+
+ function deprecate(msg, fn) {
+ var firstTime = true,
+ msgWithStack = msg + '\n' + (new Error()).stack;
+
+ return extend(function () {
+ if (firstTime) {
+ warn(msgWithStack);
+ firstTime = false;
}
- break;
- case 'gg':
- case 'GG':
- config._w = config._w || {};
- config._w[token] = moment.parseTwoDigitYear(input);
+ return fn.apply(this, arguments);
+ }, fn);
+ }
+
+ var deprecations = {};
+
+ function deprecateSimple(name, msg) {
+ if (!deprecations[name]) {
+ warn(msg);
+ deprecations[name] = true;
}
}
- function dayOfYearFromWeekInfo(config) {
- var w, weekYear, week, weekday, dow, doy, temp;
+ utils_hooks__hooks.suppressDeprecationWarnings = false;
- w = config._w;
- if (w.GG != null || w.W != null || w.E != null) {
- dow = 1;
- doy = 4;
+ var from_string__isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
- // TODO: We need to take the current isoWeekYear, but that depends on
- // how we interpret now (local, utc, fixed offset). So create
- // a now version of current config (take local/utc/offset flags, and
- // create now).
- weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);
- week = dfl(w.W, 1);
- weekday = dfl(w.E, 1);
- } else {
- dow = config._locale._week.dow;
- doy = config._locale._week.doy;
+ var isoDates = [
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
+ ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
+ ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
+ ['GGGG-[W]WW', /\d{4}-W\d{2}/],
+ ['YYYY-DDD', /\d{4}-\d{3}/]
+ ];
- weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);
- week = dfl(w.w, 1);
+ // iso time formats and regexes
+ var isoTimes = [
+ ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
+ ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
+ ['HH:mm', /(T| )\d\d:\d\d/],
+ ['HH', /(T| )\d\d/]
+ ];
- if (w.d != null) {
- // weekday -- low day numbers are considered next week
- weekday = w.d;
- if (weekday < dow) {
- ++week;
+ var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+ // date from iso format
+ function configFromISO(config) {
+ var i, l,
+ string = config._i,
+ match = from_string__isoRegex.exec(string);
+
+ if (match) {
+ getParsingFlags(config).iso = true;
+ for (i = 0, l = isoDates.length; i < l; i++) {
+ if (isoDates[i][1].exec(string)) {
+ // match[5] should be 'T' or undefined
+ config._f = isoDates[i][0] + (match[6] || ' ');
+ break;
}
- } else if (w.e != null) {
- // local weekday -- counting starts from begining of week
- weekday = w.e + dow;
- } else {
- // default to begining of week
- weekday = dow;
}
+ for (i = 0, l = isoTimes.length; i < l; i++) {
+ if (isoTimes[i][1].exec(string)) {
+ config._f += isoTimes[i][0];
+ break;
+ }
+ }
+ if (string.match(matchOffset)) {
+ config._f += 'Z';
+ }
+ configFromStringAndFormat(config);
+ } else {
+ config._isValid = false;
}
- temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
+ }
- config._a[YEAR] = temp.year;
- config._dayOfYear = temp.dayOfYear;
+ // date from iso format or fallback
+ function configFromString(config) {
+ var matched = aspNetJsonRegex.exec(config._i);
+
+ if (matched !== null) {
+ config._d = new Date(+matched[1]);
+ return;
+ }
+
+ configFromISO(config);
+ if (config._isValid === false) {
+ delete config._isValid;
+ utils_hooks__hooks.createFromInputFallback(config);
+ }
+ }
+
+ utils_hooks__hooks.createFromInputFallback = deprecate(
+ 'moment construction falls back to js Date. This is ' +
+ 'discouraged and will be removed in upcoming major ' +
+ 'release. Please refer to ' +
+ 'https://github.com/moment/moment/issues/1407 for more info.',
+ function (config) {
+ config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+ }
+ );
+
+ function createDate (y, m, d, h, M, s, ms) {
+ //can't just apply() to create a date:
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+ var date = new Date(y, m, d, h, M, s, ms);
+
+ //the date constructor doesn't accept years < 1970
+ if (y < 1970) {
+ date.setFullYear(y);
+ }
+ return date;
+ }
+
+ function createUTCDate (y) {
+ var date = new Date(Date.UTC.apply(null, arguments));
+ if (y < 1970) {
+ date.setUTCFullYear(y);
+ }
+ return date;
+ }
+
+ addFormatToken(0, ['YY', 2], 0, function () {
+ return this.year() % 100;
+ });
+
+ addFormatToken(0, ['YYYY', 4], 0, 'year');
+ addFormatToken(0, ['YYYYY', 5], 0, 'year');
+ addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
+
+ // ALIASES
+
+ addUnitAlias('year', 'y');
+
+ // PARSING
+
+ addRegexToken('Y', matchSigned);
+ addRegexToken('YY', match1to2, match2);
+ addRegexToken('YYYY', match1to4, match4);
+ addRegexToken('YYYYY', match1to6, match6);
+ addRegexToken('YYYYYY', match1to6, match6);
+
+ addParseToken(['YYYY', 'YYYYY', 'YYYYYY'], YEAR);
+ addParseToken('YY', function (input, array) {
+ array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);
+ });
+
+ // HELPERS
+
+ function daysInYear(year) {
+ return isLeapYear(year) ? 366 : 365;
+ }
+
+ function isLeapYear(year) {
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+ }
+
+ // HOOKS
+
+ utils_hooks__hooks.parseTwoDigitYear = function (input) {
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+ };
+
+ // MOMENTS
+
+ var getSetYear = makeGetSet('FullYear', false);
+
+ function getIsLeapYear () {
+ return isLeapYear(this.year());
+ }
+
+ addFormatToken('w', ['ww', 2], 'wo', 'week');
+ addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
+
+ // ALIASES
+
+ addUnitAlias('week', 'w');
+ addUnitAlias('isoWeek', 'W');
+
+ // PARSING
+
+ addRegexToken('w', match1to2);
+ addRegexToken('ww', match1to2, match2);
+ addRegexToken('W', match1to2);
+ addRegexToken('WW', match1to2, match2);
+
+ addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+ week[token.substr(0, 1)] = toInt(input);
+ });
+
+ // HELPERS
+
+ // firstDayOfWeek 0 = sun, 6 = sat
+ // the day of the week that starts the week
+ // (usually sunday or monday)
+ // firstDayOfWeekOfYear 0 = sun, 6 = sat
+ // the first week is the week that contains the first
+ // of this day of the week
+ // (eg. ISO weeks use thursday (4))
+ function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
+ var end = firstDayOfWeekOfYear - firstDayOfWeek,
+ daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
+ adjustedMoment;
+
+
+ if (daysToDayOfWeek > end) {
+ daysToDayOfWeek -= 7;
+ }
+
+ if (daysToDayOfWeek < end - 7) {
+ daysToDayOfWeek += 7;
+ }
+
+ adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd');
+ return {
+ week: Math.ceil(adjustedMoment.dayOfYear() / 7),
+ year: adjustedMoment.year()
+ };
+ }
+
+ // LOCALES
+
+ function localeWeek (mom) {
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
+ }
+
+ var defaultLocaleWeek = {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ };
+
+ function localeFirstDayOfWeek () {
+ return this._week.dow;
+ }
+
+ function localeFirstDayOfYear () {
+ return this._week.doy;
+ }
+
+ // MOMENTS
+
+ function getSetWeek (input) {
+ var week = this.localeData().week(this);
+ return input == null ? week : this.add((input - week) * 7, 'd');
+ }
+
+ function getSetISOWeek (input) {
+ var week = weekOfYear(this, 1, 4).week;
+ return input == null ? week : this.add((input - week) * 7, 'd');
+ }
+
+ addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
+
+ // ALIASES
+
+ addUnitAlias('dayOfYear', 'DDD');
+
+ // PARSING
+
+ addRegexToken('DDD', match1to3);
+ addRegexToken('DDDD', match3);
+ addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+ config._dayOfYear = toInt(input);
+ });
+
+ // HELPERS
+
+ //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+ function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
+ var d = createUTCDate(year, 0, 1).getUTCDay();
+ var daysToAdd;
+ var dayOfYear;
+
+ d = d === 0 ? 7 : d;
+ weekday = weekday != null ? weekday : firstDayOfWeek;
+ daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
+ dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+
+ return {
+ year : dayOfYear > 0 ? year : year - 1,
+ dayOfYear : dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear
+ };
+ }
+
+ // MOMENTS
+
+ function getSetDayOfYear (input) {
+ var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+ return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+ }
+
+ // Pick the first defined of two or three arguments.
+ function defaults(a, b, c) {
+ if (a != null) {
+ return a;
+ }
+ if (b != null) {
+ return b;
+ }
+ return c;
+ }
+
+ function currentDateArray(config) {
+ var now = new Date();
+ if (config._useUTC) {
+ return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()];
+ }
+ return [now.getFullYear(), now.getMonth(), now.getDate()];
}
// convert an array to a date.
// the array should mirror the parameters below
// note: all values past the year are optional and will default to the lowest possible value.
// [year, month, day , hour, minute, second, millisecond]
- function dateFromConfig(config) {
+ function configFromArray (config) {
var i, date, input = [], currentDate, yearToUse;
if (config._d) {
@@ -1334,13 +1055,13 @@
//if the day of the year is set, figure out what it is
if (config._dayOfYear) {
- yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);
+ yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
if (config._dayOfYear > daysInYear(yearToUse)) {
- config._pf._overflowDayOfYear = true;
+ getParsingFlags(config)._overflowDayOfYear = true;
}
- date = makeUTCDate(yearToUse, 0, config._dayOfYear);
+ date = createUTCDate(yearToUse, 0, config._dayOfYear);
config._a[MONTH] = date.getUTCMonth();
config._a[DATE] = date.getUTCDate();
}
@@ -1359,57 +1080,81 @@
config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
}
- config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
- // Apply timezone offset from input. The actual zone can be changed
+ // Check for 24:00:00.000
+ if (config._a[HOUR] === 24 &&
+ config._a[MINUTE] === 0 &&
+ config._a[SECOND] === 0 &&
+ config._a[MILLISECOND] === 0) {
+ config._nextDay = true;
+ config._a[HOUR] = 0;
+ }
+
+ config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+ // Apply timezone offset from input. The actual utcOffset can be changed
// with parseZone.
if (config._tzm != null) {
- config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm);
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
}
- }
-
- function dateFromObject(config) {
- var normalizedInput;
- if (config._d) {
- return;
+ if (config._nextDay) {
+ config._a[HOUR] = 24;
}
+ }
- normalizedInput = normalizeObjectUnits(config._i);
- config._a = [
- normalizedInput.year,
- normalizedInput.month,
- normalizedInput.day,
- normalizedInput.hour,
- normalizedInput.minute,
- normalizedInput.second,
- normalizedInput.millisecond
- ];
+ function dayOfYearFromWeekInfo(config) {
+ var w, weekYear, week, weekday, dow, doy, temp;
- dateFromConfig(config);
- }
+ w = config._w;
+ if (w.GG != null || w.W != null || w.E != null) {
+ dow = 1;
+ doy = 4;
- function currentDateArray(config) {
- var now = new Date();
- if (config._useUTC) {
- return [
- now.getUTCFullYear(),
- now.getUTCMonth(),
- now.getUTCDate()
- ];
+ // TODO: We need to take the current isoWeekYear, but that depends on
+ // how we interpret now (local, utc, fixed offset). So create
+ // a now version of current config (take local/utc/offset flags, and
+ // create now).
+ weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);
+ week = defaults(w.W, 1);
+ weekday = defaults(w.E, 1);
} else {
- return [now.getFullYear(), now.getMonth(), now.getDate()];
+ dow = config._locale._week.dow;
+ doy = config._locale._week.doy;
+
+ weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);
+ week = defaults(w.w, 1);
+
+ if (w.d != null) {
+ // weekday -- low day numbers are considered next week
+ weekday = w.d;
+ if (weekday < dow) {
+ ++week;
+ }
+ } else if (w.e != null) {
+ // local weekday -- counting starts from begining of week
+ weekday = w.e + dow;
+ } else {
+ // default to begining of week
+ weekday = dow;
+ }
}
+ temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
+
+ config._a[YEAR] = temp.year;
+ config._dayOfYear = temp.dayOfYear;
}
+ utils_hooks__hooks.ISO_8601 = function () {};
+
// date from string and format string
- function makeDateFromStringAndFormat(config) {
- if (config._f === moment.ISO_8601) {
- parseISO(config);
+ function configFromStringAndFormat(config) {
+ // TODO: Move this to another part of the creation flow to prevent circular deps
+ if (config._f === utils_hooks__hooks.ISO_8601) {
+ configFromISO(config);
return;
}
config._a = [];
- config._pf.empty = true;
+ getParsingFlags(config).empty = true;
// This array is used to make a Date, either with `new Date` or `Date.UTC`
var string = '' + config._i,
@@ -1425,7 +1170,7 @@
if (parsedInput) {
skipped = string.substr(0, string.indexOf(parsedInput));
if (skipped.length > 0) {
- config._pf.unusedInput.push(skipped);
+ getParsingFlags(config).unusedInput.push(skipped);
}
string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
totalParsedInputLength += parsedInput.length;
@@ -1433,50 +1178,64 @@
// don't parse if it's not a known token
if (formatTokenFunctions[token]) {
if (parsedInput) {
- config._pf.empty = false;
+ getParsingFlags(config).empty = false;
}
else {
- config._pf.unusedTokens.push(token);
+ getParsingFlags(config).unusedTokens.push(token);
}
addTimeToArrayFromToken(token, parsedInput, config);
}
else if (config._strict && !parsedInput) {
- config._pf.unusedTokens.push(token);
+ getParsingFlags(config).unusedTokens.push(token);
}
}
// add remaining unparsed input length to the string
- config._pf.charsLeftOver = stringLength - totalParsedInputLength;
+ getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
if (string.length > 0) {
- config._pf.unusedInput.push(string);
+ getParsingFlags(config).unusedInput.push(string);
}
- // handle am pm
- if (config._isPm && config._a[HOUR] < 12) {
- config._a[HOUR] += 12;
- }
- // if is 12 am, change hours to 0
- if (config._isPm === false && config._a[HOUR] === 12) {
- config._a[HOUR] = 0;
+ // clear _12h flag if hour is <= 12
+ if (getParsingFlags(config).bigHour === true &&
+ config._a[HOUR] <= 12 &&
+ config._a[HOUR] > 0) {
+ getParsingFlags(config).bigHour = undefined;
}
+ // handle meridiem
+ config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
- dateFromConfig(config);
+ configFromArray(config);
checkOverflow(config);
}
- function unescapeFormat(s) {
- return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
- return p1 || p2 || p3 || p4;
- });
- }
- // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
- function regexpEscape(s) {
- return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+ function meridiemFixWrap (locale, hour, meridiem) {
+ var isPm;
+
+ if (meridiem == null) {
+ // nothing to do
+ return hour;
+ }
+ if (locale.meridiemHour != null) {
+ return locale.meridiemHour(hour, meridiem);
+ } else if (locale.isPM != null) {
+ // Fallback
+ isPm = locale.isPM(meridiem);
+ if (isPm && hour < 12) {
+ hour += 12;
+ }
+ if (!isPm && hour === 12) {
+ hour = 0;
+ }
+ return hour;
+ } else {
+ // this is not supposed to happen
+ return hour;
+ }
}
- // date from string and array of format strings
- function makeDateFromStringAndArray(config) {
+ function configFromStringAndArray(config) {
var tempConfig,
bestMoment,
@@ -1485,7 +1244,7 @@
currentScore;
if (config._f.length === 0) {
- config._pf.invalidFormat = true;
+ getParsingFlags(config).invalidFormat = true;
config._d = new Date(NaN);
return;
}
@@ -1496,21 +1255,20 @@
if (config._useUTC != null) {
tempConfig._useUTC = config._useUTC;
}
- tempConfig._pf = defaultParsingFlags();
tempConfig._f = config._f[i];
- makeDateFromStringAndFormat(tempConfig);
+ configFromStringAndFormat(tempConfig);
- if (!isValid(tempConfig)) {
+ if (!valid__isValid(tempConfig)) {
continue;
}
// if there is any input that was not parsed add a penalty for that format
- currentScore += tempConfig._pf.charsLeftOver;
+ currentScore += getParsingFlags(tempConfig).charsLeftOver;
//or tokens
- currentScore += tempConfig._pf.unusedTokens.length * 10;
+ currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
- tempConfig._pf.score = currentScore;
+ getParsingFlags(tempConfig).score = currentScore;
if (scoreToBeat == null || currentScore < scoreToBeat) {
scoreToBeat = currentScore;
@@ -1521,341 +1279,400 @@
extend(config, bestMoment || tempConfig);
}
- // date from iso format
- function parseISO(config) {
- var i, l,
- string = config._i,
- match = isoRegex.exec(string);
-
- if (match) {
- config._pf.iso = true;
- for (i = 0, l = isoDates.length; i < l; i++) {
- if (isoDates[i][1].exec(string)) {
- // match[5] should be 'T' or undefined
- config._f = isoDates[i][0] + (match[6] || ' ');
- break;
- }
- }
- for (i = 0, l = isoTimes.length; i < l; i++) {
- if (isoTimes[i][1].exec(string)) {
- config._f += isoTimes[i][0];
- break;
- }
- }
- if (string.match(parseTokenTimezone)) {
- config._f += 'Z';
- }
- makeDateFromStringAndFormat(config);
- } else {
- config._isValid = false;
+ function configFromObject(config) {
+ if (config._d) {
+ return;
}
+
+ var i = normalizeObjectUnits(config._i);
+ config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond];
+
+ configFromArray(config);
}
- // date from iso format or fallback
- function makeDateFromString(config) {
- parseISO(config);
- if (config._isValid === false) {
- delete config._isValid;
- moment.createFromInputFallback(config);
+ function createFromConfig (config) {
+ var input = config._i,
+ format = config._f,
+ res;
+
+ config._locale = config._locale || locale_locales__getLocale(config._l);
+
+ if (input === null || (format === undefined && input === '')) {
+ return valid__createInvalid({nullInput: true});
}
- }
- function map(arr, fn) {
- var res = [], i;
- for (i = 0; i < arr.length; ++i) {
- res.push(fn(arr[i], i));
+ if (typeof input === 'string') {
+ config._i = input = config._locale.preparse(input);
+ }
+
+ if (isMoment(input)) {
+ return new Moment(checkOverflow(input));
+ } else if (isArray(format)) {
+ configFromStringAndArray(config);
+ } else if (format) {
+ configFromStringAndFormat(config);
+ } else if (isDate(input)) {
+ config._d = input;
+ } else {
+ configFromInput(config);
}
+
+ res = new Moment(checkOverflow(config));
+ if (res._nextDay) {
+ // Adding is smart enough around DST
+ res.add(1, 'd');
+ res._nextDay = undefined;
+ }
+
return res;
}
- function makeDateFromInput(config) {
- var input = config._i, matched;
+ function configFromInput(config) {
+ var input = config._i;
if (input === undefined) {
config._d = new Date();
} else if (isDate(input)) {
config._d = new Date(+input);
- } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {
- config._d = new Date(+matched[1]);
} else if (typeof input === 'string') {
- makeDateFromString(config);
+ configFromString(config);
} else if (isArray(input)) {
config._a = map(input.slice(0), function (obj) {
return parseInt(obj, 10);
});
- dateFromConfig(config);
+ configFromArray(config);
} else if (typeof(input) === 'object') {
- dateFromObject(config);
+ configFromObject(config);
} else if (typeof(input) === 'number') {
// from milliseconds
config._d = new Date(input);
} else {
- moment.createFromInputFallback(config);
+ utils_hooks__hooks.createFromInputFallback(config);
}
}
- function makeDate(y, m, d, h, M, s, ms) {
- //can't just apply() to create a date:
- //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
- var date = new Date(y, m, d, h, M, s, ms);
+ function createLocalOrUTC (input, format, locale, strict, isUTC) {
+ var c = {};
- //the date constructor doesn't accept years < 1970
- if (y < 1970) {
- date.setFullYear(y);
+ if (typeof(locale) === 'boolean') {
+ strict = locale;
+ locale = undefined;
}
- return date;
+ // object construction must be done this way.
+ // https://github.com/moment/moment/issues/1423
+ c._isAMomentObject = true;
+ c._useUTC = c._isUTC = isUTC;
+ c._l = locale;
+ c._i = input;
+ c._f = format;
+ c._strict = strict;
+
+ return createFromConfig(c);
}
- function makeUTCDate(y) {
- var date = new Date(Date.UTC.apply(null, arguments));
- if (y < 1970) {
- date.setUTCFullYear(y);
- }
- return date;
+ function local__createLocal (input, format, locale, strict) {
+ return createLocalOrUTC(input, format, locale, strict, false);
}
- function parseWeekday(input, locale) {
- if (typeof input === 'string') {
- if (!isNaN(input)) {
- input = parseInt(input, 10);
- }
- else {
- input = locale.weekdaysParse(input);
- if (typeof input !== 'number') {
- return null;
- }
+ var prototypeMin = deprecate(
+ 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
+ function () {
+ var other = local__createLocal.apply(null, arguments);
+ return other < this ? this : other;
+ }
+ );
+
+ var prototypeMax = deprecate(
+ 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
+ function () {
+ var other = local__createLocal.apply(null, arguments);
+ return other > this ? this : other;
+ }
+ );
+
+ // Pick a moment m from moments so that m[fn](other) is true for all
+ // other. This relies on the function fn to be transitive.
+ //
+ // moments should either be an array of moment objects or an array, whose
+ // first element is an array of moment objects.
+ function pickBy(fn, moments) {
+ var res, i;
+ if (moments.length === 1 && isArray(moments[0])) {
+ moments = moments[0];
+ }
+ if (!moments.length) {
+ return local__createLocal();
+ }
+ res = moments[0];
+ for (i = 1; i < moments.length; ++i) {
+ if (moments[i][fn](res)) {
+ res = moments[i];
}
}
- return input;
+ return res;
}
- /************************************
- Relative Time
- ************************************/
+ // TODO: Use [].sort instead?
+ function min () {
+ var args = [].slice.call(arguments, 0);
+
+ return pickBy('isBefore', args);
+ }
+ function max () {
+ var args = [].slice.call(arguments, 0);
- // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
- function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
- return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+ return pickBy('isAfter', args);
}
- function relativeTime(posNegDuration, withoutSuffix, locale) {
- var duration = moment.duration(posNegDuration).abs(),
- seconds = round(duration.as('s')),
- minutes = round(duration.as('m')),
- hours = round(duration.as('h')),
- days = round(duration.as('d')),
- months = round(duration.as('M')),
- years = round(duration.as('y')),
+ function Duration (duration) {
+ var normalizedInput = normalizeObjectUnits(duration),
+ years = normalizedInput.year || 0,
+ quarters = normalizedInput.quarter || 0,
+ months = normalizedInput.month || 0,
+ weeks = normalizedInput.week || 0,
+ days = normalizedInput.day || 0,
+ hours = normalizedInput.hour || 0,
+ minutes = normalizedInput.minute || 0,
+ seconds = normalizedInput.second || 0,
+ milliseconds = normalizedInput.millisecond || 0;
- args = seconds < relativeTimeThresholds.s && ['s', seconds] ||
- minutes === 1 && ['m'] ||
- minutes < relativeTimeThresholds.m && ['mm', minutes] ||
- hours === 1 && ['h'] ||
- hours < relativeTimeThresholds.h && ['hh', hours] ||
- days === 1 && ['d'] ||
- days < relativeTimeThresholds.d && ['dd', days] ||
- months === 1 && ['M'] ||
- months < relativeTimeThresholds.M && ['MM', months] ||
- years === 1 && ['y'] || ['yy', years];
+ // representation for dateAddRemove
+ this._milliseconds = +milliseconds +
+ seconds * 1e3 + // 1000
+ minutes * 6e4 + // 1000 * 60
+ hours * 36e5; // 1000 * 60 * 60
+ // Because of dateAddRemove treats 24 hours as different from a
+ // day when working around DST, we need to store them separately
+ this._days = +days +
+ weeks * 7;
+ // It is impossible translate months into days without knowing
+ // which months you are are talking about, so we have to store
+ // it separately.
+ this._months = +months +
+ quarters * 3 +
+ years * 12;
- args[2] = withoutSuffix;
- args[3] = +posNegDuration > 0;
- args[4] = locale;
- return substituteTimeAgo.apply({}, args);
- }
+ this._data = {};
+ this._locale = locale_locales__getLocale();
- /************************************
- Week of Year
- ************************************/
+ this._bubble();
+ }
+ function isDuration (obj) {
+ return obj instanceof Duration;
+ }
- // firstDayOfWeek 0 = sun, 6 = sat
- // the day of the week that starts the week
- // (usually sunday or monday)
- // firstDayOfWeekOfYear 0 = sun, 6 = sat
- // the first week is the week that contains the first
- // of this day of the week
- // (eg. ISO weeks use thursday (4))
- function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
- var end = firstDayOfWeekOfYear - firstDayOfWeek,
- daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
- adjustedMoment;
+ function offset (token, separator) {
+ addFormatToken(token, 0, 0, function () {
+ var offset = this.utcOffset();
+ var sign = '+';
+ if (offset < 0) {
+ offset = -offset;
+ sign = '-';
+ }
+ return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+ });
+ }
+ offset('Z', ':');
+ offset('ZZ', '');
- if (daysToDayOfWeek > end) {
- daysToDayOfWeek -= 7;
- }
+ // PARSING
- if (daysToDayOfWeek < end - 7) {
- daysToDayOfWeek += 7;
- }
+ addRegexToken('Z', matchOffset);
+ addRegexToken('ZZ', matchOffset);
+ addParseToken(['Z', 'ZZ'], function (input, array, config) {
+ config._useUTC = true;
+ config._tzm = offsetFromString(input);
+ });
- adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');
- return {
- week: Math.ceil(adjustedMoment.dayOfYear() / 7),
- year: adjustedMoment.year()
- };
- }
+ // HELPERS
- //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
- function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
- var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
+ // timezone chunker
+ // '+10:00' > ['10', '00']
+ // '-1530' > ['-15', '30']
+ var chunkOffset = /([\+\-]|\d\d)/gi;
- d = d === 0 ? 7 : d;
- weekday = weekday != null ? weekday : firstDayOfWeek;
- daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
- dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+ function offsetFromString(string) {
+ var matches = ((string || '').match(matchOffset) || []);
+ var chunk = matches[matches.length - 1] || [];
+ var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+ var minutes = +(parts[1] * 60) + toInt(parts[2]);
- return {
- year: dayOfYear > 0 ? year : year - 1,
- dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear
- };
+ return parts[0] === '+' ? minutes : -minutes;
}
- /************************************
- Top Level Functions
- ************************************/
+ // Return a moment from input, that is local/utc/zone equivalent to model.
+ function cloneWithOffset(input, model) {
+ var res, diff;
+ if (model._isUTC) {
+ res = model.clone();
+ diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res);
+ // Use low-level api, because this fn is low-level api.
+ res._d.setTime(+res._d + diff);
+ utils_hooks__hooks.updateOffset(res, false);
+ return res;
+ } else {
+ return local__createLocal(input).local();
+ }
+ return model._isUTC ? local__createLocal(input).zone(model._offset || 0) : local__createLocal(input).local();
+ }
- function makeMoment(config) {
- var input = config._i,
- format = config._f;
+ function getDateOffset (m) {
+ // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+ // https://github.com/moment/moment/pull/1871
+ return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+ }
- config._locale = config._locale || moment.localeData(config._l);
+ // HOOKS
- if (input === null || (format === undefined && input === '')) {
- return moment.invalid({nullInput: true});
- }
+ // This function will be called whenever a moment is mutated.
+ // It is intended to keep the offset in sync with the timezone.
+ utils_hooks__hooks.updateOffset = function () {};
- if (typeof input === 'string') {
- config._i = input = config._locale.preparse(input);
- }
+ // MOMENTS
- if (moment.isMoment(input)) {
- return new Moment(input, true);
- } else if (format) {
- if (isArray(format)) {
- makeDateFromStringAndArray(config);
- } else {
- makeDateFromStringAndFormat(config);
+ // keepLocalTime = true means only change the timezone, without
+ // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+ // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+ // +0200, so we adjust the time as needed, to be valid.
+ //
+ // Keeping the time actually adds/subtracts (one hour)
+ // from the actual represented time. That is why we call updateOffset
+ // a second time. In case it wants us to change the offset again
+ // _changeInProgress == true case, then we have to adjust, because
+ // there is no such time in the given timezone.
+ function getSetOffset (input, keepLocalTime) {
+ var offset = this._offset || 0,
+ localAdjust;
+ if (input != null) {
+ if (typeof input === 'string') {
+ input = offsetFromString(input);
+ }
+ if (Math.abs(input) < 16) {
+ input = input * 60;
+ }
+ if (!this._isUTC && keepLocalTime) {
+ localAdjust = getDateOffset(this);
+ }
+ this._offset = input;
+ this._isUTC = true;
+ if (localAdjust != null) {
+ this.add(localAdjust, 'm');
+ }
+ if (offset !== input) {
+ if (!keepLocalTime || this._changeInProgress) {
+ add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);
+ } else if (!this._changeInProgress) {
+ this._changeInProgress = true;
+ utils_hooks__hooks.updateOffset(this, true);
+ this._changeInProgress = null;
+ }
}
+ return this;
} else {
- makeDateFromInput(config);
+ return this._isUTC ? offset : getDateOffset(this);
}
-
- return new Moment(config);
}
- moment = function (input, format, locale, strict) {
- var c;
+ function getSetZone (input, keepLocalTime) {
+ if (input != null) {
+ if (typeof input !== 'string') {
+ input = -input;
+ }
- if (typeof(locale) === 'boolean') {
- strict = locale;
- locale = undefined;
+ this.utcOffset(input, keepLocalTime);
+
+ return this;
+ } else {
+ return -this.utcOffset();
}
- // object construction must be done this way.
- // https://github.com/moment/moment/issues/1423
- c = {};
- c._isAMomentObject = true;
- c._i = input;
- c._f = format;
- c._l = locale;
- c._strict = strict;
- c._isUTC = false;
- c._pf = defaultParsingFlags();
+ }
- return makeMoment(c);
- };
+ function setOffsetToUTC (keepLocalTime) {
+ return this.utcOffset(0, keepLocalTime);
+ }
- moment.suppressDeprecationWarnings = false;
+ function setOffsetToLocal (keepLocalTime) {
+ if (this._isUTC) {
+ this.utcOffset(0, keepLocalTime);
+ this._isUTC = false;
- moment.createFromInputFallback = deprecate(
- 'moment construction falls back to js Date. This is ' +
- 'discouraged and will be removed in upcoming major ' +
- 'release. Please refer to ' +
- 'https://github.com/moment/moment/issues/1407 for more info.',
- function (config) {
- config._d = new Date(config._i);
+ if (keepLocalTime) {
+ this.subtract(getDateOffset(this), 'm');
+ }
}
- );
+ return this;
+ }
- // Pick a moment m from moments so that m[fn](other) is true for all
- // other. This relies on the function fn to be transitive.
- //
- // moments should either be an array of moment objects or an array, whose
- // first element is an array of moment objects.
- function pickBy(fn, moments) {
- var res, i;
- if (moments.length === 1 && isArray(moments[0])) {
- moments = moments[0];
+ function setOffsetToParsedOffset () {
+ if (this._tzm) {
+ this.utcOffset(this._tzm);
+ } else if (typeof this._i === 'string') {
+ this.utcOffset(offsetFromString(this._i));
}
- if (!moments.length) {
- return moment();
+ return this;
+ }
+
+ function hasAlignedHourOffset (input) {
+ if (!input) {
+ input = 0;
}
- res = moments[0];
- for (i = 1; i < moments.length; ++i) {
- if (moments[i][fn](res)) {
- res = moments[i];
- }
+ else {
+ input = local__createLocal(input).utcOffset();
}
- return res;
+
+ return (this.utcOffset() - input) % 60 === 0;
}
- moment.min = function () {
- var args = [].slice.call(arguments, 0);
+ function isDaylightSavingTime () {
+ return (
+ this.utcOffset() > this.clone().month(0).utcOffset() ||
+ this.utcOffset() > this.clone().month(5).utcOffset()
+ );
+ }
- return pickBy('isBefore', args);
- };
+ function isDaylightSavingTimeShifted () {
+ if (this._a) {
+ var other = this._isUTC ? create_utc__createUTC(this._a) : local__createLocal(this._a);
+ return this.isValid() && compareArrays(this._a, other.toArray()) > 0;
+ }
- moment.max = function () {
- var args = [].slice.call(arguments, 0);
+ return false;
+ }
- return pickBy('isAfter', args);
- };
+ function isLocal () {
+ return !this._isUTC;
+ }
- // creating with utc
- moment.utc = function (input, format, locale, strict) {
- var c;
+ function isUtcOffset () {
+ return this._isUTC;
+ }
- if (typeof(locale) === 'boolean') {
- strict = locale;
- locale = undefined;
- }
- // object construction must be done this way.
- // https://github.com/moment/moment/issues/1423
- c = {};
- c._isAMomentObject = true;
- c._useUTC = true;
- c._isUTC = true;
- c._l = locale;
- c._i = input;
- c._f = format;
- c._strict = strict;
- c._pf = defaultParsingFlags();
+ function isUtc () {
+ return this._isUTC && this._offset === 0;
+ }
- return makeMoment(c).utc();
- };
+ var aspNetRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/;
- // creating with unix timestamp (in seconds)
- moment.unix = function (input) {
- return moment(input * 1000);
- };
+ // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+ // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+ var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;
- // duration
- moment.duration = function (input, key) {
+ function create__createDuration (input, key) {
var duration = input,
// matching against regexp is expensive, do it on demand
match = null,
sign,
ret,
- parseIso,
diffRes;
- if (moment.isDuration(input)) {
+ if (isDuration(input)) {
duration = {
- ms: input._milliseconds,
- d: input._days,
- M: input._months
+ ms : input._milliseconds,
+ d : input._days,
+ M : input._months
};
} else if (typeof input === 'number') {
duration = {};
@@ -1864,38 +1681,31 @@
} else {
duration.milliseconds = input;
}
- } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
+ } else if (!!(match = aspNetRegex.exec(input))) {
sign = (match[1] === '-') ? -1 : 1;
duration = {
- y: 0,
- d: toInt(match[DATE]) * sign,
- h: toInt(match[HOUR]) * sign,
- m: toInt(match[MINUTE]) * sign,
- s: toInt(match[SECOND]) * sign,
- ms: toInt(match[MILLISECOND]) * sign
+ y : 0,
+ d : toInt(match[DATE]) * sign,
+ h : toInt(match[HOUR]) * sign,
+ m : toInt(match[MINUTE]) * sign,
+ s : toInt(match[SECOND]) * sign,
+ ms : toInt(match[MILLISECOND]) * sign
};
- } else if (!!(match = isoDurationRegex.exec(input))) {
+ } else if (!!(match = create__isoRegex.exec(input))) {
sign = (match[1] === '-') ? -1 : 1;
- parseIso = function (inp) {
- // We'd normally use ~~inp for this, but unfortunately it also
- // converts floats to ints.
- // inp may be undefined, so careful calling replace on it.
- var res = inp && parseFloat(inp.replace(',', '.'));
- // apply sign while we're at it
- return (isNaN(res) ? 0 : res) * sign;
- };
duration = {
- y: parseIso(match[2]),
- M: parseIso(match[3]),
- d: parseIso(match[4]),
- h: parseIso(match[5]),
- m: parseIso(match[6]),
- s: parseIso(match[7]),
- w: parseIso(match[8])
+ y : parseIso(match[2], sign),
+ M : parseIso(match[3], sign),
+ d : parseIso(match[4], sign),
+ h : parseIso(match[5], sign),
+ m : parseIso(match[6], sign),
+ s : parseIso(match[7], sign),
+ w : parseIso(match[8], sign)
};
- } else if (typeof duration === 'object' &&
- ('from' in duration || 'to' in duration)) {
- diffRes = momentsDifference(moment(duration.from), moment(duration.to));
+ } else if (duration == null) {// checks for null or undefined
+ duration = {};
+ } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+ diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));
duration = {};
duration.ms = diffRes.milliseconds;
@@ -1904,906 +1714,1036 @@
ret = new Duration(duration);
- if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {
+ if (isDuration(input) && hasOwnProp(input, '_locale')) {
ret._locale = input._locale;
}
return ret;
- };
+ }
- // version number
- moment.version = VERSION;
+ create__createDuration.fn = Duration.prototype;
- // default format
- moment.defaultFormat = isoFormat;
+ function parseIso (inp, sign) {
+ // We'd normally use ~~inp for this, but unfortunately it also
+ // converts floats to ints.
+ // inp may be undefined, so careful calling replace on it.
+ var res = inp && parseFloat(inp.replace(',', '.'));
+ // apply sign while we're at it
+ return (isNaN(res) ? 0 : res) * sign;
+ }
- // constant that refers to the ISO standard
- moment.ISO_8601 = function () {};
+ function positiveMomentsDifference(base, other) {
+ var res = {milliseconds: 0, months: 0};
- // Plugins that add properties should also add the key here (null value),
- // so we can properly clone ourselves.
- moment.momentProperties = momentProperties;
+ res.months = other.month() - base.month() +
+ (other.year() - base.year()) * 12;
+ if (base.clone().add(res.months, 'M').isAfter(other)) {
+ --res.months;
+ }
- // This function will be called whenever a moment is mutated.
- // It is intended to keep the offset in sync with the timezone.
- moment.updateOffset = function () {};
+ res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
- // This function allows you to set a threshold for relative time strings
- moment.relativeTimeThreshold = function (threshold, limit) {
- if (relativeTimeThresholds[threshold] === undefined) {
- return false;
- }
- if (limit === undefined) {
- return relativeTimeThresholds[threshold];
- }
- relativeTimeThresholds[threshold] = limit;
- return true;
- };
+ return res;
+ }
- moment.lang = deprecate(
- 'moment.lang is deprecated. Use moment.locale instead.',
- function (key, value) {
- return moment.locale(key, value);
+ function momentsDifference(base, other) {
+ var res;
+ other = cloneWithOffset(other, base);
+ if (base.isBefore(other)) {
+ res = positiveMomentsDifference(base, other);
+ } else {
+ res = positiveMomentsDifference(other, base);
+ res.milliseconds = -res.milliseconds;
+ res.months = -res.months;
}
- );
- // This function will load locale and then set the global locale. If
- // no arguments are passed in, it will simply return the current global
- // locale key.
- moment.locale = function (key, values) {
- var data;
- if (key) {
- if (typeof(values) !== 'undefined') {
- data = moment.defineLocale(key, values);
- }
- else {
- data = moment.localeData(key);
- }
+ return res;
+ }
- if (data) {
- moment.duration._locale = moment._locale = data;
+ function createAdder(direction, name) {
+ return function (val, period) {
+ var dur, tmp;
+ //invert the arguments, but complain about it
+ if (period !== null && !isNaN(+period)) {
+ deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
+ tmp = val; val = period; period = tmp;
}
+
+ val = typeof val === 'string' ? +val : val;
+ dur = create__createDuration(val, period);
+ add_subtract__addSubtract(this, dur, direction);
+ return this;
+ };
+ }
+
+ function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {
+ var milliseconds = duration._milliseconds,
+ days = duration._days,
+ months = duration._months;
+ updateOffset = updateOffset == null ? true : updateOffset;
+
+ if (milliseconds) {
+ mom._d.setTime(+mom._d + milliseconds * isAdding);
}
+ if (days) {
+ get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);
+ }
+ if (months) {
+ setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);
+ }
+ if (updateOffset) {
+ utils_hooks__hooks.updateOffset(mom, days || months);
+ }
+ }
- return moment._locale._abbr;
- };
+ var add_subtract__add = createAdder(1, 'add');
+ var add_subtract__subtract = createAdder(-1, 'subtract');
- moment.defineLocale = function (name, values) {
- if (values !== null) {
- values.abbr = name;
- if (!locales[name]) {
- locales[name] = new Locale();
- }
- locales[name].set(values);
+ function moment_calendar__calendar (time) {
+ // We want to compare the start of today, vs this.
+ // Getting start-of-today depends on whether we're local/utc/offset or not.
+ var now = time || local__createLocal(),
+ sod = cloneWithOffset(now, this).startOf('day'),
+ diff = this.diff(sod, 'days', true),
+ format = diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' : 'sameElse';
+ return this.format(this.localeData().calendar(format, this, local__createLocal(now)));
+ }
- // backwards compat for now: also set the locale
- moment.locale(name);
+ function clone () {
+ return new Moment(this);
+ }
- return locales[name];
+ function isAfter (input, units) {
+ var inputMs;
+ units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
+ if (units === 'millisecond') {
+ input = isMoment(input) ? input : local__createLocal(input);
+ return +this > +input;
} else {
- // useful for testing
- delete locales[name];
- return null;
+ inputMs = isMoment(input) ? +input : +local__createLocal(input);
+ return inputMs < +this.clone().startOf(units);
}
- };
+ }
- moment.langData = deprecate(
- 'moment.langData is deprecated. Use moment.localeData instead.',
- function (key) {
- return moment.localeData(key);
+ function isBefore (input, units) {
+ var inputMs;
+ units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
+ if (units === 'millisecond') {
+ input = isMoment(input) ? input : local__createLocal(input);
+ return +this < +input;
+ } else {
+ inputMs = isMoment(input) ? +input : +local__createLocal(input);
+ return +this.clone().endOf(units) < inputMs;
}
- );
+ }
- // returns locale data
- moment.localeData = function (key) {
- var locale;
+ function isBetween (from, to, units) {
+ return this.isAfter(from, units) && this.isBefore(to, units);
+ }
- if (key && key._locale && key._locale._abbr) {
- key = key._locale._abbr;
+ function isSame (input, units) {
+ var inputMs;
+ units = normalizeUnits(units || 'millisecond');
+ if (units === 'millisecond') {
+ input = isMoment(input) ? input : local__createLocal(input);
+ return +this === +input;
+ } else {
+ inputMs = +local__createLocal(input);
+ return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units));
}
+ }
- if (!key) {
- return moment._locale;
+ function absFloor (number) {
+ if (number < 0) {
+ return Math.ceil(number);
+ } else {
+ return Math.floor(number);
}
+ }
- if (!isArray(key)) {
- //short-circuit everything else
- locale = loadLocale(key);
- if (locale) {
- return locale;
+ function diff (input, units, asFloat) {
+ var that = cloneWithOffset(input, this),
+ zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4,
+ delta, output;
+
+ units = normalizeUnits(units);
+
+ if (units === 'year' || units === 'month' || units === 'quarter') {
+ output = monthDiff(this, that);
+ if (units === 'quarter') {
+ output = output / 3;
+ } else if (units === 'year') {
+ output = output / 12;
}
- key = [key];
+ } else {
+ delta = this - that;
+ output = units === 'second' ? delta / 1e3 : // 1000
+ units === 'minute' ? delta / 6e4 : // 1000 * 60
+ units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
+ units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+ units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+ delta;
+ }
+ return asFloat ? output : absFloor(output);
+ }
+
+ function monthDiff (a, b) {
+ // difference in months
+ var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+ // b is in (anchor - 1 month, anchor + 1 month)
+ anchor = a.clone().add(wholeMonthDiff, 'months'),
+ anchor2, adjust;
+
+ if (b - anchor < 0) {
+ anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor - anchor2);
+ } else {
+ anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+ // linear across the month
+ adjust = (b - anchor) / (anchor2 - anchor);
}
- return chooseLocale(key);
- };
+ return -(wholeMonthDiff + adjust);
+ }
- // compare moment object
- moment.isMoment = function (obj) {
- return obj instanceof Moment ||
- (obj != null && hasOwnProp(obj, '_isAMomentObject'));
- };
+ utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
- // for typechecking Duration objects
- moment.isDuration = function (obj) {
- return obj instanceof Duration;
- };
+ function toString () {
+ return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+ }
- for (i = lists.length - 1; i >= 0; --i) {
- makeList(lists[i]);
+ function moment_format__toISOString () {
+ var m = this.clone().utc();
+ if (0 < m.year() && m.year() <= 9999) {
+ if ('function' === typeof Date.prototype.toISOString) {
+ // native implementation is ~50x faster, use it when we can
+ return this.toDate().toISOString();
+ } else {
+ return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
+ } else {
+ return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ }
}
- moment.normalizeUnits = function (units) {
- return normalizeUnits(units);
- };
+ function moment_format__format (inputString) {
+ var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat);
+ return this.localeData().postformat(output);
+ }
- moment.invalid = function (flags) {
- var m = moment.utc(NaN);
- if (flags != null) {
- extend(m._pf, flags);
+ function from (time, withoutSuffix) {
+ if (!this.isValid()) {
+ return this.localeData().invalidDate();
}
- else {
- m._pf.userInvalidated = true;
+ return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+ }
+
+ function fromNow (withoutSuffix) {
+ return this.from(local__createLocal(), withoutSuffix);
+ }
+
+ function to (time, withoutSuffix) {
+ if (!this.isValid()) {
+ return this.localeData().invalidDate();
}
+ return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+ }
- return m;
- };
+ function toNow (withoutSuffix) {
+ return this.to(local__createLocal(), withoutSuffix);
+ }
- moment.parseZone = function () {
- return moment.apply(null, arguments).parseZone();
- };
+ function locale (key) {
+ var newLocaleData;
- moment.parseTwoDigitYear = function (input) {
- return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
- };
+ if (key === undefined) {
+ return this._locale._abbr;
+ } else {
+ newLocaleData = locale_locales__getLocale(key);
+ if (newLocaleData != null) {
+ this._locale = newLocaleData;
+ }
+ return this;
+ }
+ }
- /************************************
- Moment Prototype
- ************************************/
+ var lang = deprecate(
+ 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+ function (key) {
+ if (key === undefined) {
+ return this.localeData();
+ } else {
+ return this.locale(key);
+ }
+ }
+ );
+ function localeData () {
+ return this._locale;
+ }
- extend(moment.fn = Moment.prototype, {
+ function startOf (units) {
+ units = normalizeUnits(units);
+ // the following switch intentionally omits break keywords
+ // to utilize falling through the cases.
+ switch (units) {
+ case 'year':
+ this.month(0);
+ /* falls through */
+ case 'quarter':
+ case 'month':
+ this.date(1);
+ /* falls through */
+ case 'week':
+ case 'isoWeek':
+ case 'day':
+ this.hours(0);
+ /* falls through */
+ case 'hour':
+ this.minutes(0);
+ /* falls through */
+ case 'minute':
+ this.seconds(0);
+ /* falls through */
+ case 'second':
+ this.milliseconds(0);
+ }
- clone : function () {
- return moment(this);
- },
+ // weeks are a special case
+ if (units === 'week') {
+ this.weekday(0);
+ }
+ if (units === 'isoWeek') {
+ this.isoWeekday(1);
+ }
- valueOf : function () {
- return +this._d + ((this._offset || 0) * 60000);
- },
+ // quarters are also special
+ if (units === 'quarter') {
+ this.month(Math.floor(this.month() / 3) * 3);
+ }
- unix : function () {
- return Math.floor(+this / 1000);
- },
+ return this;
+ }
- toString : function () {
- return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
- },
+ function endOf (units) {
+ units = normalizeUnits(units);
+ if (units === undefined || units === 'millisecond') {
+ return this;
+ }
+ return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+ }
- toDate : function () {
- return this._offset ? new Date(+this) : this._d;
- },
+ function to_type__valueOf () {
+ return +this._d - ((this._offset || 0) * 60000);
+ }
- toISOString : function () {
- var m = moment(this).utc();
- if (0 < m.year() && m.year() <= 9999) {
- return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- } else {
- return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
- }
- },
+ function unix () {
+ return Math.floor(+this / 1000);
+ }
- toArray : function () {
- var m = this;
- return [
- m.year(),
- m.month(),
- m.date(),
- m.hours(),
- m.minutes(),
- m.seconds(),
- m.milliseconds()
- ];
- },
+ function toDate () {
+ return this._offset ? new Date(+this) : this._d;
+ }
- isValid : function () {
- return isValid(this);
- },
+ function toArray () {
+ var m = this;
+ return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+ }
- isDSTShifted : function () {
- if (this._a) {
- return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
- }
+ function moment_valid__isValid () {
+ return valid__isValid(this);
+ }
- return false;
- },
+ function parsingFlags () {
+ return extend({}, getParsingFlags(this));
+ }
- parsingFlags : function () {
- return extend({}, this._pf);
- },
+ function invalidAt () {
+ return getParsingFlags(this).overflow;
+ }
- invalidAt: function () {
- return this._pf.overflow;
- },
+ addFormatToken(0, ['gg', 2], 0, function () {
+ return this.weekYear() % 100;
+ });
- utc : function (keepLocalTime) {
- return this.zone(0, keepLocalTime);
- },
+ addFormatToken(0, ['GG', 2], 0, function () {
+ return this.isoWeekYear() % 100;
+ });
- local : function (keepLocalTime) {
- if (this._isUTC) {
- this.zone(0, keepLocalTime);
- this._isUTC = false;
+ function addWeekYearFormatToken (token, getter) {
+ addFormatToken(0, [token, token.length], 0, getter);
+ }
- if (keepLocalTime) {
- this.add(this._dateTzOffset(), 'm');
- }
- }
- return this;
- },
+ addWeekYearFormatToken('gggg', 'weekYear');
+ addWeekYearFormatToken('ggggg', 'weekYear');
+ addWeekYearFormatToken('GGGG', 'isoWeekYear');
+ addWeekYearFormatToken('GGGGG', 'isoWeekYear');
- format : function (inputString) {
- var output = formatMoment(this, inputString || moment.defaultFormat);
- return this.localeData().postformat(output);
- },
+ // ALIASES
- add : createAdder(1, 'add'),
+ addUnitAlias('weekYear', 'gg');
+ addUnitAlias('isoWeekYear', 'GG');
- subtract : createAdder(-1, 'subtract'),
+ // PARSING
- diff : function (input, units, asFloat) {
- var that = makeAs(input, this),
- zoneDiff = (this.zone() - that.zone()) * 6e4,
- diff, output, daysAdjust;
+ addRegexToken('G', matchSigned);
+ addRegexToken('g', matchSigned);
+ addRegexToken('GG', match1to2, match2);
+ addRegexToken('gg', match1to2, match2);
+ addRegexToken('GGGG', match1to4, match4);
+ addRegexToken('gggg', match1to4, match4);
+ addRegexToken('GGGGG', match1to6, match6);
+ addRegexToken('ggggg', match1to6, match6);
- units = normalizeUnits(units);
+ addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+ week[token.substr(0, 2)] = toInt(input);
+ });
- if (units === 'year' || units === 'month') {
- // average number of days in the months in the given dates
- diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
- // difference in months
- output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
- // adjust by taking difference in days, average number of days
- // and dst in the given months.
- daysAdjust = (this - moment(this).startOf('month')) -
- (that - moment(that).startOf('month'));
- // same as above but with zones, to negate all dst
- daysAdjust -= ((this.zone() - moment(this).startOf('month').zone()) -
- (that.zone() - moment(that).startOf('month').zone())) * 6e4;
- output += daysAdjust / diff;
- if (units === 'year') {
- output = output / 12;
- }
- } else {
- diff = (this - that);
- output = units === 'second' ? diff / 1e3 : // 1000
- units === 'minute' ? diff / 6e4 : // 1000 * 60
- units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
- units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
- units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
- diff;
- }
- return asFloat ? output : absRound(output);
- },
+ addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+ week[token] = utils_hooks__hooks.parseTwoDigitYear(input);
+ });
- from : function (time, withoutSuffix) {
- return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
- },
+ // HELPERS
- fromNow : function (withoutSuffix) {
- return this.from(moment(), withoutSuffix);
- },
+ function weeksInYear(year, dow, doy) {
+ return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week;
+ }
- calendar : function (time) {
- // We want to compare the start of today, vs this.
- // Getting start-of-today depends on whether we're zone'd or not.
- var now = time || moment(),
- sod = makeAs(now, this).startOf('day'),
- diff = this.diff(sod, 'days', true),
- format = diff < -6 ? 'sameElse' :
- diff < -1 ? 'lastWeek' :
- diff < 0 ? 'lastDay' :
- diff < 1 ? 'sameDay' :
- diff < 2 ? 'nextDay' :
- diff < 7 ? 'nextWeek' : 'sameElse';
- return this.format(this.localeData().calendar(format, this));
- },
+ // MOMENTS
- isLeapYear : function () {
- return isLeapYear(this.year());
- },
+ function getSetWeekYear (input) {
+ var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
+ return input == null ? year : this.add((input - year), 'y');
+ }
- isDST : function () {
- return (this.zone() < this.clone().month(0).zone() ||
- this.zone() < this.clone().month(5).zone());
- },
+ function getSetISOWeekYear (input) {
+ var year = weekOfYear(this, 1, 4).year;
+ return input == null ? year : this.add((input - year), 'y');
+ }
- day : function (input) {
- var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
- if (input != null) {
- input = parseWeekday(input, this.localeData());
- return this.add(input - day, 'd');
- } else {
- return day;
- }
- },
+ function getISOWeeksInYear () {
+ return weeksInYear(this.year(), 1, 4);
+ }
- month : makeAccessor('Month', true),
+ function getWeeksInYear () {
+ var weekInfo = this.localeData()._week;
+ return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+ }
- startOf : function (units) {
- units = normalizeUnits(units);
- // the following switch intentionally omits break keywords
- // to utilize falling through the cases.
- switch (units) {
- case 'year':
- this.month(0);
- /* falls through */
- case 'quarter':
- case 'month':
- this.date(1);
- /* falls through */
- case 'week':
- case 'isoWeek':
- case 'day':
- this.hours(0);
- /* falls through */
- case 'hour':
- this.minutes(0);
- /* falls through */
- case 'minute':
- this.seconds(0);
- /* falls through */
- case 'second':
- this.milliseconds(0);
- /* falls through */
- }
-
- // weeks are a special case
- if (units === 'week') {
- this.weekday(0);
- } else if (units === 'isoWeek') {
- this.isoWeekday(1);
- }
-
- // quarters are also special
- if (units === 'quarter') {
- this.month(Math.floor(this.month() / 3) * 3);
- }
+ addFormatToken('Q', 0, 0, 'quarter');
- return this;
- },
+ // ALIASES
- endOf: function (units) {
- units = normalizeUnits(units);
- return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
- },
+ addUnitAlias('quarter', 'Q');
- isAfter: function (input, units) {
- units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
- if (units === 'millisecond') {
- input = moment.isMoment(input) ? input : moment(input);
- return +this > +input;
- } else {
- return +this.clone().startOf(units) > +moment(input).startOf(units);
- }
- },
+ // PARSING
- isBefore: function (input, units) {
- units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond');
- if (units === 'millisecond') {
- input = moment.isMoment(input) ? input : moment(input);
- return +this < +input;
- } else {
- return +this.clone().startOf(units) < +moment(input).startOf(units);
- }
- },
+ addRegexToken('Q', match1);
+ addParseToken('Q', function (input, array) {
+ array[MONTH] = (toInt(input) - 1) * 3;
+ });
- isSame: function (input, units) {
- units = normalizeUnits(units || 'millisecond');
- if (units === 'millisecond') {
- input = moment.isMoment(input) ? input : moment(input);
- return +this === +input;
- } else {
- return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
- }
- },
+ // MOMENTS
- min: deprecate(
- 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
- function (other) {
- other = moment.apply(null, arguments);
- return other < this ? this : other;
- }
- ),
+ function getSetQuarter (input) {
+ return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+ }
- max: deprecate(
- 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
- function (other) {
- other = moment.apply(null, arguments);
- return other > this ? this : other;
- }
- ),
-
- // keepLocalTime = true means only change the timezone, without
- // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]-->
- // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone
- // +0200, so we adjust the time as needed, to be valid.
- //
- // Keeping the time actually adds/subtracts (one hour)
- // from the actual represented time. That is why we call updateOffset
- // a second time. In case it wants us to change the offset again
- // _changeInProgress == true case, then we have to adjust, because
- // there is no such time in the given timezone.
- zone : function (input, keepLocalTime) {
- var offset = this._offset || 0,
- localAdjust;
- if (input != null) {
- if (typeof input === 'string') {
- input = timezoneMinutesFromString(input);
- }
- if (Math.abs(input) < 16) {
- input = input * 60;
- }
- if (!this._isUTC && keepLocalTime) {
- localAdjust = this._dateTzOffset();
- }
- this._offset = input;
- this._isUTC = true;
- if (localAdjust != null) {
- this.subtract(localAdjust, 'm');
- }
- if (offset !== input) {
- if (!keepLocalTime || this._changeInProgress) {
- addOrSubtractDurationFromMoment(this,
- moment.duration(offset - input, 'm'), 1, false);
- } else if (!this._changeInProgress) {
- this._changeInProgress = true;
- moment.updateOffset(this, true);
- this._changeInProgress = null;
- }
- }
- } else {
- return this._isUTC ? offset : this._dateTzOffset();
- }
- return this;
- },
+ addFormatToken('D', ['DD', 2], 'Do', 'date');
- zoneAbbr : function () {
- return this._isUTC ? 'UTC' : '';
- },
+ // ALIASES
- zoneName : function () {
- return this._isUTC ? 'Coordinated Universal Time' : '';
- },
+ addUnitAlias('date', 'D');
- parseZone : function () {
- if (this._tzm) {
- this.zone(this._tzm);
- } else if (typeof this._i === 'string') {
- this.zone(this._i);
- }
- return this;
- },
+ // PARSING
- hasAlignedHourOffset : function (input) {
- if (!input) {
- input = 0;
- }
- else {
- input = moment(input).zone();
- }
+ addRegexToken('D', match1to2);
+ addRegexToken('DD', match1to2, match2);
+ addRegexToken('Do', function (isStrict, locale) {
+ return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
+ });
- return (this.zone() - input) % 60 === 0;
- },
+ addParseToken(['D', 'DD'], DATE);
+ addParseToken('Do', function (input, array) {
+ array[DATE] = toInt(input.match(match1to2)[0], 10);
+ });
- daysInMonth : function () {
- return daysInMonth(this.year(), this.month());
- },
+ // MOMENTS
- dayOfYear : function (input) {
- var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
- return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
- },
+ var getSetDayOfMonth = makeGetSet('Date', true);
- quarter : function (input) {
- return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
- },
+ addFormatToken('d', 0, 'do', 'day');
- weekYear : function (input) {
- var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
- return input == null ? year : this.add((input - year), 'y');
- },
+ addFormatToken('dd', 0, 0, function (format) {
+ return this.localeData().weekdaysMin(this, format);
+ });
- isoWeekYear : function (input) {
- var year = weekOfYear(this, 1, 4).year;
- return input == null ? year : this.add((input - year), 'y');
- },
+ addFormatToken('ddd', 0, 0, function (format) {
+ return this.localeData().weekdaysShort(this, format);
+ });
- week : function (input) {
- var week = this.localeData().week(this);
- return input == null ? week : this.add((input - week) * 7, 'd');
- },
+ addFormatToken('dddd', 0, 0, function (format) {
+ return this.localeData().weekdays(this, format);
+ });
- isoWeek : function (input) {
- var week = weekOfYear(this, 1, 4).week;
- return input == null ? week : this.add((input - week) * 7, 'd');
- },
+ addFormatToken('e', 0, 0, 'weekday');
+ addFormatToken('E', 0, 0, 'isoWeekday');
- weekday : function (input) {
- var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
- return input == null ? weekday : this.add(input - weekday, 'd');
- },
+ // ALIASES
- isoWeekday : function (input) {
- // behaves the same as moment#day except
- // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
- // as a setter, sunday should belong to the previous week.
- return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
- },
+ addUnitAlias('day', 'd');
+ addUnitAlias('weekday', 'e');
+ addUnitAlias('isoWeekday', 'E');
- isoWeeksInYear : function () {
- return weeksInYear(this.year(), 1, 4);
- },
+ // PARSING
- weeksInYear : function () {
- var weekInfo = this.localeData()._week;
- return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
- },
+ addRegexToken('d', match1to2);
+ addRegexToken('e', match1to2);
+ addRegexToken('E', match1to2);
+ addRegexToken('dd', matchWord);
+ addRegexToken('ddd', matchWord);
+ addRegexToken('dddd', matchWord);
- get : function (units) {
- units = normalizeUnits(units);
- return this[units]();
- },
+ addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) {
+ var weekday = config._locale.weekdaysParse(input);
+ // if we didn't get a weekday name, mark the date as invalid
+ if (weekday != null) {
+ week.d = weekday;
+ } else {
+ getParsingFlags(config).invalidWeekday = input;
+ }
+ });
- set : function (units, value) {
- units = normalizeUnits(units);
- if (typeof this[units] === 'function') {
- this[units](value);
- }
- return this;
- },
+ addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+ week[token] = toInt(input);
+ });
- // If passed a locale key, it will set the locale for this
- // instance. Otherwise, it will return the locale configuration
- // variables for this instance.
- locale : function (key) {
- var newLocaleData;
+ // HELPERS
- if (key === undefined) {
- return this._locale._abbr;
- } else {
- newLocaleData = moment.localeData(key);
- if (newLocaleData != null) {
- this._locale = newLocaleData;
+ function parseWeekday(input, locale) {
+ if (typeof input === 'string') {
+ if (!isNaN(input)) {
+ input = parseInt(input, 10);
+ }
+ else {
+ input = locale.weekdaysParse(input);
+ if (typeof input !== 'number') {
+ return null;
}
- return this;
}
- },
+ }
+ return input;
+ }
- lang : deprecate(
- 'moment().lang() is deprecated. Use moment().localeData() instead.',
- function (key) {
- if (key === undefined) {
- return this.localeData();
- } else {
- return this.locale(key);
- }
+ // LOCALES
+
+ var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+ function localeWeekdays (m) {
+ return this._weekdays[m.day()];
+ }
+
+ var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+ function localeWeekdaysShort (m) {
+ return this._weekdaysShort[m.day()];
+ }
+
+ var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+ function localeWeekdaysMin (m) {
+ return this._weekdaysMin[m.day()];
+ }
+
+ function localeWeekdaysParse (weekdayName) {
+ var i, mom, regex;
+
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ }
+
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+ if (!this._weekdaysParse[i]) {
+ mom = local__createLocal([2000, 1]).day(i);
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (this._weekdaysParse[i].test(weekdayName)) {
+ return i;
}
- ),
+ }
+ }
- localeData : function () {
- return this._locale;
- },
+ // MOMENTS
- _dateTzOffset : function () {
- // On Firefox.24 Date#getTimezoneOffset returns a floating point.
- // https://github.com/moment/moment/pull/1871
- return Math.round(this._d.getTimezoneOffset() / 15) * 15;
+ function getSetDayOfWeek (input) {
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+ if (input != null) {
+ input = parseWeekday(input, this.localeData());
+ return this.add(input - day, 'd');
+ } else {
+ return day;
}
+ }
+
+ function getSetLocaleDayOfWeek (input) {
+ var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+ return input == null ? weekday : this.add(input - weekday, 'd');
+ }
+
+ function getSetISODayOfWeek (input) {
+ // behaves the same as moment#day except
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+ // as a setter, sunday should belong to the previous week.
+ return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
+ }
+
+ addFormatToken('H', ['HH', 2], 0, 'hour');
+ addFormatToken('h', ['hh', 2], 0, function () {
+ return this.hours() % 12 || 12;
});
- function rawMonthSetter(mom, value) {
- var dayOfMonth;
+ function meridiem (token, lowercase) {
+ addFormatToken(token, 0, 0, function () {
+ return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+ });
+ }
- // TODO: Move this out of here!
- if (typeof value === 'string') {
- value = mom.localeData().monthsParse(value);
- // TODO: Another silent failure?
- if (typeof value !== 'number') {
- return mom;
- }
- }
+ meridiem('a', true);
+ meridiem('A', false);
- dayOfMonth = Math.min(mom.date(),
- daysInMonth(mom.year(), value));
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
- return mom;
+ // ALIASES
+
+ addUnitAlias('hour', 'h');
+
+ // PARSING
+
+ function matchMeridiem (isStrict, locale) {
+ return locale._meridiemParse;
}
- function rawGetter(mom, unit) {
- return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
+ addRegexToken('a', matchMeridiem);
+ addRegexToken('A', matchMeridiem);
+ addRegexToken('H', match1to2);
+ addRegexToken('h', match1to2);
+ addRegexToken('HH', match1to2, match2);
+ addRegexToken('hh', match1to2, match2);
+
+ addParseToken(['H', 'HH'], HOUR);
+ addParseToken(['a', 'A'], function (input, array, config) {
+ config._isPm = config._locale.isPM(input);
+ config._meridiem = input;
+ });
+ addParseToken(['h', 'hh'], function (input, array, config) {
+ array[HOUR] = toInt(input);
+ getParsingFlags(config).bigHour = true;
+ });
+
+ // LOCALES
+
+ function localeIsPM (input) {
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+ // Using charAt should be more compatible.
+ return ((input + '').toLowerCase().charAt(0) === 'p');
}
- function rawSetter(mom, unit, value) {
- if (unit === 'Month') {
- return rawMonthSetter(mom, value);
+ var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+ function localeMeridiem (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'pm' : 'PM';
} else {
- return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+ return isLower ? 'am' : 'AM';
}
}
- function makeAccessor(unit, keepTime) {
- return function (value) {
- if (value != null) {
- rawSetter(this, unit, value);
- moment.updateOffset(this, keepTime);
- return this;
- } else {
- return rawGetter(this, unit);
- }
- };
- }
- moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);
- moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);
- moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);
+ // MOMENTS
+
// Setting the hour should keep the time, because the user explicitly
// specified which hour he wants. So trying to maintain the same hour (in
// a new timezone) makes sense. Adding/subtracting hours does not follow
// this rule.
- moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);
- // moment.fn.month is defined separately
- moment.fn.date = makeAccessor('Date', true);
- moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));
- moment.fn.year = makeAccessor('FullYear', true);
- moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));
+ var getSetHour = makeGetSet('Hours', true);
- // add plural methods
- moment.fn.days = moment.fn.day;
- moment.fn.months = moment.fn.month;
- moment.fn.weeks = moment.fn.week;
- moment.fn.isoWeeks = moment.fn.isoWeek;
- moment.fn.quarters = moment.fn.quarter;
+ addFormatToken('m', ['mm', 2], 0, 'minute');
- // add aliased format methods
- moment.fn.toJSON = moment.fn.toISOString;
+ // ALIASES
- /************************************
- Duration Prototype
- ************************************/
+ addUnitAlias('minute', 'm');
+ // PARSING
- function daysToYears (days) {
- // 400 years have 146097 days (taking into account leap year rules)
- return days * 400 / 146097;
- }
+ addRegexToken('m', match1to2);
+ addRegexToken('mm', match1to2, match2);
+ addParseToken(['m', 'mm'], MINUTE);
- function yearsToDays (years) {
- // years * 365 + absRound(years / 4) -
- // absRound(years / 100) + absRound(years / 400);
- return years * 146097 / 400;
- }
-
- extend(moment.duration.fn = Duration.prototype, {
+ // MOMENTS
- _bubble : function () {
- var milliseconds = this._milliseconds,
- days = this._days,
- months = this._months,
- data = this._data,
- seconds, minutes, hours, years = 0;
+ var getSetMinute = makeGetSet('Minutes', false);
- // The following code bubbles up values, see the tests for
- // examples of what that means.
- data.milliseconds = milliseconds % 1000;
+ addFormatToken('s', ['ss', 2], 0, 'second');
- seconds = absRound(milliseconds / 1000);
- data.seconds = seconds % 60;
+ // ALIASES
- minutes = absRound(seconds / 60);
- data.minutes = minutes % 60;
+ addUnitAlias('second', 's');
- hours = absRound(minutes / 60);
- data.hours = hours % 24;
+ // PARSING
- days += absRound(hours / 24);
+ addRegexToken('s', match1to2);
+ addRegexToken('ss', match1to2, match2);
+ addParseToken(['s', 'ss'], SECOND);
- // Accurately convert days to years, assume start from year 0.
- years = absRound(daysToYears(days));
- days -= absRound(yearsToDays(years));
+ // MOMENTS
- // 30 days to a month
- // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
- months += absRound(days / 30);
- days %= 30;
+ var getSetSecond = makeGetSet('Seconds', false);
- // 12 months -> 1 year
- years += absRound(months / 12);
- months %= 12;
+ addFormatToken('S', 0, 0, function () {
+ return ~~(this.millisecond() / 100);
+ });
- data.days = days;
- data.months = months;
- data.years = years;
- },
+ addFormatToken(0, ['SS', 2], 0, function () {
+ return ~~(this.millisecond() / 10);
+ });
- abs : function () {
- this._milliseconds = Math.abs(this._milliseconds);
- this._days = Math.abs(this._days);
- this._months = Math.abs(this._months);
+ function millisecond__milliseconds (token) {
+ addFormatToken(0, [token, 3], 0, 'millisecond');
+ }
- this._data.milliseconds = Math.abs(this._data.milliseconds);
- this._data.seconds = Math.abs(this._data.seconds);
- this._data.minutes = Math.abs(this._data.minutes);
- this._data.hours = Math.abs(this._data.hours);
- this._data.months = Math.abs(this._data.months);
- this._data.years = Math.abs(this._data.years);
+ millisecond__milliseconds('SSS');
+ millisecond__milliseconds('SSSS');
- return this;
- },
+ // ALIASES
- weeks : function () {
- return absRound(this.days() / 7);
- },
+ addUnitAlias('millisecond', 'ms');
- valueOf : function () {
- return this._milliseconds +
- this._days * 864e5 +
- (this._months % 12) * 2592e6 +
- toInt(this._months / 12) * 31536e6;
- },
+ // PARSING
- humanize : function (withSuffix) {
- var output = relativeTime(this, !withSuffix, this.localeData());
+ addRegexToken('S', match1to3, match1);
+ addRegexToken('SS', match1to3, match2);
+ addRegexToken('SSS', match1to3, match3);
+ addRegexToken('SSSS', matchUnsigned);
+ addParseToken(['S', 'SS', 'SSS', 'SSSS'], function (input, array) {
+ array[MILLISECOND] = toInt(('0.' + input) * 1000);
+ });
- if (withSuffix) {
- output = this.localeData().pastFuture(+this, output);
- }
+ // MOMENTS
+
+ var getSetMillisecond = makeGetSet('Milliseconds', false);
+
+ addFormatToken('z', 0, 0, 'zoneAbbr');
+ addFormatToken('zz', 0, 0, 'zoneName');
+
+ // MOMENTS
+
+ function getZoneAbbr () {
+ return this._isUTC ? 'UTC' : '';
+ }
+
+ function getZoneName () {
+ return this._isUTC ? 'Coordinated Universal Time' : '';
+ }
+
+ var momentPrototype__proto = Moment.prototype;
+
+ momentPrototype__proto.add = add_subtract__add;
+ momentPrototype__proto.calendar = moment_calendar__calendar;
+ momentPrototype__proto.clone = clone;
+ momentPrototype__proto.diff = diff;
+ momentPrototype__proto.endOf = endOf;
+ momentPrototype__proto.format = moment_format__format;
+ momentPrototype__proto.from = from;
+ momentPrototype__proto.fromNow = fromNow;
+ momentPrototype__proto.to = to;
+ momentPrototype__proto.toNow = toNow;
+ momentPrototype__proto.get = getSet;
+ momentPrototype__proto.invalidAt = invalidAt;
+ momentPrototype__proto.isAfter = isAfter;
+ momentPrototype__proto.isBefore = isBefore;
+ momentPrototype__proto.isBetween = isBetween;
+ momentPrototype__proto.isSame = isSame;
+ momentPrototype__proto.isValid = moment_valid__isValid;
+ momentPrototype__proto.lang = lang;
+ momentPrototype__proto.locale = locale;
+ momentPrototype__proto.localeData = localeData;
+ momentPrototype__proto.max = prototypeMax;
+ momentPrototype__proto.min = prototypeMin;
+ momentPrototype__proto.parsingFlags = parsingFlags;
+ momentPrototype__proto.set = getSet;
+ momentPrototype__proto.startOf = startOf;
+ momentPrototype__proto.subtract = add_subtract__subtract;
+ momentPrototype__proto.toArray = toArray;
+ momentPrototype__proto.toDate = toDate;
+ momentPrototype__proto.toISOString = moment_format__toISOString;
+ momentPrototype__proto.toJSON = moment_format__toISOString;
+ momentPrototype__proto.toString = toString;
+ momentPrototype__proto.unix = unix;
+ momentPrototype__proto.valueOf = to_type__valueOf;
+
+ // Year
+ momentPrototype__proto.year = getSetYear;
+ momentPrototype__proto.isLeapYear = getIsLeapYear;
+
+ // Week Year
+ momentPrototype__proto.weekYear = getSetWeekYear;
+ momentPrototype__proto.isoWeekYear = getSetISOWeekYear;
+
+ // Quarter
+ momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;
+
+ // Month
+ momentPrototype__proto.month = getSetMonth;
+ momentPrototype__proto.daysInMonth = getDaysInMonth;
+
+ // Week
+ momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek;
+ momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek;
+ momentPrototype__proto.weeksInYear = getWeeksInYear;
+ momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;
+
+ // Day
+ momentPrototype__proto.date = getSetDayOfMonth;
+ momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek;
+ momentPrototype__proto.weekday = getSetLocaleDayOfWeek;
+ momentPrototype__proto.isoWeekday = getSetISODayOfWeek;
+ momentPrototype__proto.dayOfYear = getSetDayOfYear;
+
+ // Hour
+ momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;
+
+ // Minute
+ momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;
+
+ // Second
+ momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;
+
+ // Millisecond
+ momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;
+
+ // Offset
+ momentPrototype__proto.utcOffset = getSetOffset;
+ momentPrototype__proto.utc = setOffsetToUTC;
+ momentPrototype__proto.local = setOffsetToLocal;
+ momentPrototype__proto.parseZone = setOffsetToParsedOffset;
+ momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;
+ momentPrototype__proto.isDST = isDaylightSavingTime;
+ momentPrototype__proto.isDSTShifted = isDaylightSavingTimeShifted;
+ momentPrototype__proto.isLocal = isLocal;
+ momentPrototype__proto.isUtcOffset = isUtcOffset;
+ momentPrototype__proto.isUtc = isUtc;
+ momentPrototype__proto.isUTC = isUtc;
+
+ // Timezone
+ momentPrototype__proto.zoneAbbr = getZoneAbbr;
+ momentPrototype__proto.zoneName = getZoneName;
+
+ // Deprecations
+ momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+ momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+ momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+ momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone);
+
+ var momentPrototype = momentPrototype__proto;
+
+ function moment_moment__createUnix (input) {
+ return local__createLocal(input * 1000);
+ }
+
+ function moment_moment__createInZone () {
+ return local__createLocal.apply(null, arguments).parseZone();
+ }
+
+ var defaultCalendar = {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ };
- return this.localeData().postformat(output);
- },
+ function locale_calendar__calendar (key, mom, now) {
+ var output = this._calendar[key];
+ return typeof output === 'function' ? output.call(mom, now) : output;
+ }
- add : function (input, val) {
- // supports only 2.0-style add(1, 's') or add(moment)
- var dur = moment.duration(input, val);
+ var defaultLongDateFormat = {
+ LTS : 'h:mm:ss A',
+ LT : 'h:mm A',
+ L : 'MM/DD/YYYY',
+ LL : 'MMMM D, YYYY',
+ LLL : 'MMMM D, YYYY LT',
+ LLLL : 'dddd, MMMM D, YYYY LT'
+ };
- this._milliseconds += dur._milliseconds;
- this._days += dur._days;
- this._months += dur._months;
+ function longDateFormat (key) {
+ var output = this._longDateFormat[key];
+ if (!output && this._longDateFormat[key.toUpperCase()]) {
+ output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
+ return val.slice(1);
+ });
+ this._longDateFormat[key] = output;
+ }
+ return output;
+ }
- this._bubble();
+ var defaultInvalidDate = 'Invalid date';
- return this;
- },
+ function invalidDate () {
+ return this._invalidDate;
+ }
- subtract : function (input, val) {
- var dur = moment.duration(input, val);
+ var defaultOrdinal = '%d';
+ var defaultOrdinalParse = /\d{1,2}/;
- this._milliseconds -= dur._milliseconds;
- this._days -= dur._days;
- this._months -= dur._months;
+ function ordinal (number) {
+ return this._ordinal.replace('%d', number);
+ }
- this._bubble();
+ function preParsePostFormat (string) {
+ return string;
+ }
- return this;
- },
+ var defaultRelativeTime = {
+ future : 'in %s',
+ past : '%s ago',
+ s : 'a few seconds',
+ m : 'a minute',
+ mm : '%d minutes',
+ h : 'an hour',
+ hh : '%d hours',
+ d : 'a day',
+ dd : '%d days',
+ M : 'a month',
+ MM : '%d months',
+ y : 'a year',
+ yy : '%d years'
+ };
- get : function (units) {
- units = normalizeUnits(units);
- return this[units.toLowerCase() + 's']();
- },
+ function relative__relativeTime (number, withoutSuffix, string, isFuture) {
+ var output = this._relativeTime[string];
+ return (typeof output === 'function') ?
+ output(number, withoutSuffix, string, isFuture) :
+ output.replace(/%d/i, number);
+ }
- as : function (units) {
- var days, months;
- units = normalizeUnits(units);
+ function pastFuture (diff, output) {
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+ return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
+ }
- if (units === 'month' || units === 'year') {
- days = this._days + this._milliseconds / 864e5;
- months = this._months + daysToYears(days) * 12;
- return units === 'month' ? months : months / 12;
+ function locale_set__set (config) {
+ var prop, i;
+ for (i in config) {
+ prop = config[i];
+ if (typeof prop === 'function') {
+ this[i] = prop;
} else {
- // handle milliseconds separately because of floating point math errors (issue #1867)
- days = this._days + yearsToDays(this._months / 12);
- switch (units) {
- case 'week': return days / 7 + this._milliseconds / 6048e5;
- case 'day': return days + this._milliseconds / 864e5;
- case 'hour': return days * 24 + this._milliseconds / 36e5;
- case 'minute': return days * 24 * 60 + this._milliseconds / 6e4;
- case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000;
- // Math.floor prevents floating point math errors here
- case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds;
- default: throw new Error('Unknown unit ' + units);
- }
+ this['_' + i] = prop;
}
- },
+ }
+ // Lenient ordinal parsing accepts just a number in addition to
+ // number + (possibly) stuff coming from _ordinalParseLenient.
+ this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
+ }
- lang : moment.fn.lang,
- locale : moment.fn.locale,
+ var prototype__proto = Locale.prototype;
- toIsoString : deprecate(
- 'toIsoString() is deprecated. Please use toISOString() instead ' +
- '(notice the capitals)',
- function () {
- return this.toISOString();
- }
- ),
+ prototype__proto._calendar = defaultCalendar;
+ prototype__proto.calendar = locale_calendar__calendar;
+ prototype__proto._longDateFormat = defaultLongDateFormat;
+ prototype__proto.longDateFormat = longDateFormat;
+ prototype__proto._invalidDate = defaultInvalidDate;
+ prototype__proto.invalidDate = invalidDate;
+ prototype__proto._ordinal = defaultOrdinal;
+ prototype__proto.ordinal = ordinal;
+ prototype__proto._ordinalParse = defaultOrdinalParse;
+ prototype__proto.preparse = preParsePostFormat;
+ prototype__proto.postformat = preParsePostFormat;
+ prototype__proto._relativeTime = defaultRelativeTime;
+ prototype__proto.relativeTime = relative__relativeTime;
+ prototype__proto.pastFuture = pastFuture;
+ prototype__proto.set = locale_set__set;
- toISOString : function () {
- // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
- var years = Math.abs(this.years()),
- months = Math.abs(this.months()),
- days = Math.abs(this.days()),
- hours = Math.abs(this.hours()),
- minutes = Math.abs(this.minutes()),
- seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+ // Month
+ prototype__proto.months = localeMonths;
+ prototype__proto._months = defaultLocaleMonths;
+ prototype__proto.monthsShort = localeMonthsShort;
+ prototype__proto._monthsShort = defaultLocaleMonthsShort;
+ prototype__proto.monthsParse = localeMonthsParse;
- if (!this.asSeconds()) {
- // this is the same as C#'s (Noda) and python (isodate)...
- // but not other JS (goog.date)
- return 'P0D';
- }
+ // Week
+ prototype__proto.week = localeWeek;
+ prototype__proto._week = defaultLocaleWeek;
+ prototype__proto.firstDayOfYear = localeFirstDayOfYear;
+ prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;
- return (this.asSeconds() < 0 ? '-' : '') +
- 'P' +
- (years ? years + 'Y' : '') +
- (months ? months + 'M' : '') +
- (days ? days + 'D' : '') +
- ((hours || minutes || seconds) ? 'T' : '') +
- (hours ? hours + 'H' : '') +
- (minutes ? minutes + 'M' : '') +
- (seconds ? seconds + 'S' : '');
- },
+ // Day of Week
+ prototype__proto.weekdays = localeWeekdays;
+ prototype__proto._weekdays = defaultLocaleWeekdays;
+ prototype__proto.weekdaysMin = localeWeekdaysMin;
+ prototype__proto._weekdaysMin = defaultLocaleWeekdaysMin;
+ prototype__proto.weekdaysShort = localeWeekdaysShort;
+ prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort;
+ prototype__proto.weekdaysParse = localeWeekdaysParse;
- localeData : function () {
- return this._locale;
+ // Hours
+ prototype__proto.isPM = localeIsPM;
+ prototype__proto._meridiemParse = defaultLocaleMeridiemParse;
+ prototype__proto.meridiem = localeMeridiem;
+
+ function lists__get (format, index, field, setter) {
+ var locale = locale_locales__getLocale();
+ var utc = create_utc__createUTC().set(setter, index);
+ return locale[field](utc, format);
+ }
+
+ function list (format, index, field, count, setter) {
+ if (typeof format === 'number') {
+ index = format;
+ format = undefined;
}
- });
- moment.duration.fn.toString = moment.duration.fn.toISOString;
+ format = format || '';
- function makeDurationGetter(name) {
- moment.duration.fn[name] = function () {
- return this._data[name];
- };
- }
+ if (index != null) {
+ return lists__get(format, index, field, setter);
+ }
- for (i in unitMillisecondFactors) {
- if (hasOwnProp(unitMillisecondFactors, i)) {
- makeDurationGetter(i.toLowerCase());
+ var i;
+ var out = [];
+ for (i = 0; i < count; i++) {
+ out[i] = lists__get(format, i, field, setter);
}
+ return out;
}
- moment.duration.fn.asMilliseconds = function () {
- return this.as('ms');
- };
- moment.duration.fn.asSeconds = function () {
- return this.as('s');
- };
- moment.duration.fn.asMinutes = function () {
- return this.as('m');
- };
- moment.duration.fn.asHours = function () {
- return this.as('h');
- };
- moment.duration.fn.asDays = function () {
- return this.as('d');
- };
- moment.duration.fn.asWeeks = function () {
- return this.as('weeks');
- };
- moment.duration.fn.asMonths = function () {
- return this.as('M');
- };
- moment.duration.fn.asYears = function () {
- return this.as('y');
- };
+ function lists__listMonths (format, index) {
+ return list(format, index, 'months', 12, 'month');
+ }
- /************************************
- Default Locale
- ************************************/
+ function lists__listMonthsShort (format, index) {
+ return list(format, index, 'monthsShort', 12, 'month');
+ }
+ function lists__listWeekdays (format, index) {
+ return list(format, index, 'weekdays', 7, 'day');
+ }
- // Set default locale, other locale will inherit from English.
- moment.locale('en', {
+ function lists__listWeekdaysShort (format, index) {
+ return list(format, index, 'weekdaysShort', 7, 'day');
+ }
+
+ function lists__listWeekdaysMin (format, index) {
+ return list(format, index, 'weekdaysMin', 7, 'day');
+ }
+
+ locale_locales__getSetGlobalLocale('en', {
+ ordinalParse: /\d{1,2}(th|st|nd|rd)/,
ordinal : function (number) {
var b = number % 10,
output = (toInt(number % 100 / 10) === 1) ? 'th' :
@@ -2814,19 +2754,373 @@
}
});
- // moment.js locale configuration
-// locale : afrikaans (af)
-// author : Werner Mollentze : https://github.com/wernerm
+ // Side effect imports
+ utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);
+ utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);
+
+ var mathAbs = Math.abs;
+
+ function duration_abs__abs () {
+ var data = this._data;
+
+ this._milliseconds = mathAbs(this._milliseconds);
+ this._days = mathAbs(this._days);
+ this._months = mathAbs(this._months);
+
+ data.milliseconds = mathAbs(data.milliseconds);
+ data.seconds = mathAbs(data.seconds);
+ data.minutes = mathAbs(data.minutes);
+ data.hours = mathAbs(data.hours);
+ data.months = mathAbs(data.months);
+ data.years = mathAbs(data.years);
+
+ return this;
+ }
+
+ function duration_add_subtract__addSubtract (duration, input, value, direction) {
+ var other = create__createDuration(input, value);
+
+ duration._milliseconds += direction * other._milliseconds;
+ duration._days += direction * other._days;
+ duration._months += direction * other._months;
+
+ return duration._bubble();
+ }
+
+ // supports only 2.0-style add(1, 's') or add(duration)
+ function duration_add_subtract__add (input, value) {
+ return duration_add_subtract__addSubtract(this, input, value, 1);
+ }
+
+ // supports only 2.0-style subtract(1, 's') or subtract(duration)
+ function duration_add_subtract__subtract (input, value) {
+ return duration_add_subtract__addSubtract(this, input, value, -1);
+ }
+
+ function bubble () {
+ var milliseconds = this._milliseconds;
+ var days = this._days;
+ var months = this._months;
+ var data = this._data;
+ var seconds, minutes, hours, years = 0;
+
+ // The following code bubbles up values, see the tests for
+ // examples of what that means.
+ data.milliseconds = milliseconds % 1000;
+
+ seconds = absFloor(milliseconds / 1000);
+ data.seconds = seconds % 60;
+
+ minutes = absFloor(seconds / 60);
+ data.minutes = minutes % 60;
+
+ hours = absFloor(minutes / 60);
+ data.hours = hours % 24;
+
+ days += absFloor(hours / 24);
+
+ // Accurately convert days to years, assume start from year 0.
+ years = absFloor(daysToYears(days));
+ days -= absFloor(yearsToDays(years));
+
+ // 30 days to a month
+ // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
+ months += absFloor(days / 30);
+ days %= 30;
+
+ // 12 months -> 1 year
+ years += absFloor(months / 12);
+ months %= 12;
+
+ data.days = days;
+ data.months = months;
+ data.years = years;
+
+ return this;
+ }
+
+ function daysToYears (days) {
+ // 400 years have 146097 days (taking into account leap year rules)
+ return days * 400 / 146097;
+ }
+
+ function yearsToDays (years) {
+ // years * 365 + absFloor(years / 4) -
+ // absFloor(years / 100) + absFloor(years / 400);
+ return years * 146097 / 400;
+ }
+
+ function as (units) {
+ var days;
+ var months;
+ var milliseconds = this._milliseconds;
+
+ units = normalizeUnits(units);
+
+ if (units === 'month' || units === 'year') {
+ days = this._days + milliseconds / 864e5;
+ months = this._months + daysToYears(days) * 12;
+ return units === 'month' ? months : months / 12;
+ } else {
+ // handle milliseconds separately because of floating point math errors (issue #1867)
+ days = this._days + Math.round(yearsToDays(this._months / 12));
+ switch (units) {
+ case 'week' : return days / 7 + milliseconds / 6048e5;
+ case 'day' : return days + milliseconds / 864e5;
+ case 'hour' : return days * 24 + milliseconds / 36e5;
+ case 'minute' : return days * 1440 + milliseconds / 6e4;
+ case 'second' : return days * 86400 + milliseconds / 1000;
+ // Math.floor prevents floating point math errors here
+ case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+ default: throw new Error('Unknown unit ' + units);
+ }
+ }
+ }
+
+ // TODO: Use this.as('ms')?
+ function duration_as__valueOf () {
+ return (
+ this._milliseconds +
+ this._days * 864e5 +
+ (this._months % 12) * 2592e6 +
+ toInt(this._months / 12) * 31536e6
+ );
+ }
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('af', {
+ function makeAs (alias) {
+ return function () {
+ return this.as(alias);
+ };
+ }
+
+ var asMilliseconds = makeAs('ms');
+ var asSeconds = makeAs('s');
+ var asMinutes = makeAs('m');
+ var asHours = makeAs('h');
+ var asDays = makeAs('d');
+ var asWeeks = makeAs('w');
+ var asMonths = makeAs('M');
+ var asYears = makeAs('y');
+
+ function duration_get__get (units) {
+ units = normalizeUnits(units);
+ return this[units + 's']();
+ }
+
+ function makeGetter(name) {
+ return function () {
+ return this._data[name];
+ };
+ }
+
+ var duration_get__milliseconds = makeGetter('milliseconds');
+ var seconds = makeGetter('seconds');
+ var minutes = makeGetter('minutes');
+ var hours = makeGetter('hours');
+ var days = makeGetter('days');
+ var duration_get__months = makeGetter('months');
+ var years = makeGetter('years');
+
+ function weeks () {
+ return absFloor(this.days() / 7);
+ }
+
+ var round = Math.round;
+ var thresholds = {
+ s: 45, // seconds to minute
+ m: 45, // minutes to hour
+ h: 22, // hours to day
+ d: 26, // days to month
+ M: 11 // months to year
+ };
+
+ // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+ function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+ return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+ }
+
+ function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {
+ var duration = create__createDuration(posNegDuration).abs();
+ var seconds = round(duration.as('s'));
+ var minutes = round(duration.as('m'));
+ var hours = round(duration.as('h'));
+ var days = round(duration.as('d'));
+ var months = round(duration.as('M'));
+ var years = round(duration.as('y'));
+
+ var a = seconds < thresholds.s && ['s', seconds] ||
+ minutes === 1 && ['m'] ||
+ minutes < thresholds.m && ['mm', minutes] ||
+ hours === 1 && ['h'] ||
+ hours < thresholds.h && ['hh', hours] ||
+ days === 1 && ['d'] ||
+ days < thresholds.d && ['dd', days] ||
+ months === 1 && ['M'] ||
+ months < thresholds.M && ['MM', months] ||
+ years === 1 && ['y'] || ['yy', years];
+
+ a[2] = withoutSuffix;
+ a[3] = +posNegDuration > 0;
+ a[4] = locale;
+ return substituteTimeAgo.apply(null, a);
+ }
+
+ // This function allows you to set a threshold for relative time strings
+ function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {
+ if (thresholds[threshold] === undefined) {
+ return false;
+ }
+ if (limit === undefined) {
+ return thresholds[threshold];
+ }
+ thresholds[threshold] = limit;
+ return true;
+ }
+
+ function humanize (withSuffix) {
+ var locale = this.localeData();
+ var output = duration_humanize__relativeTime(this, !withSuffix, locale);
+
+ if (withSuffix) {
+ output = locale.pastFuture(+this, output);
+ }
+
+ return locale.postformat(output);
+ }
+
+ var iso_string__abs = Math.abs;
+
+ function iso_string__toISOString() {
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+ var Y = iso_string__abs(this.years());
+ var M = iso_string__abs(this.months());
+ var D = iso_string__abs(this.days());
+ var h = iso_string__abs(this.hours());
+ var m = iso_string__abs(this.minutes());
+ var s = iso_string__abs(this.seconds() + this.milliseconds() / 1000);
+ var total = this.asSeconds();
+
+ if (!total) {
+ // this is the same as C#'s (Noda) and python (isodate)...
+ // but not other JS (goog.date)
+ return 'P0D';
+ }
+
+ return (total < 0 ? '-' : '') +
+ 'P' +
+ (Y ? Y + 'Y' : '') +
+ (M ? M + 'M' : '') +
+ (D ? D + 'D' : '') +
+ ((h || m || s) ? 'T' : '') +
+ (h ? h + 'H' : '') +
+ (m ? m + 'M' : '') +
+ (s ? s + 'S' : '');
+ }
+
+ var duration_prototype__proto = Duration.prototype;
+
+ duration_prototype__proto.abs = duration_abs__abs;
+ duration_prototype__proto.add = duration_add_subtract__add;
+ duration_prototype__proto.subtract = duration_add_subtract__subtract;
+ duration_prototype__proto.as = as;
+ duration_prototype__proto.asMilliseconds = asMilliseconds;
+ duration_prototype__proto.asSeconds = asSeconds;
+ duration_prototype__proto.asMinutes = asMinutes;
+ duration_prototype__proto.asHours = asHours;
+ duration_prototype__proto.asDays = asDays;
+ duration_prototype__proto.asWeeks = asWeeks;
+ duration_prototype__proto.asMonths = asMonths;
+ duration_prototype__proto.asYears = asYears;
+ duration_prototype__proto.valueOf = duration_as__valueOf;
+ duration_prototype__proto._bubble = bubble;
+ duration_prototype__proto.get = duration_get__get;
+ duration_prototype__proto.milliseconds = duration_get__milliseconds;
+ duration_prototype__proto.seconds = seconds;
+ duration_prototype__proto.minutes = minutes;
+ duration_prototype__proto.hours = hours;
+ duration_prototype__proto.days = days;
+ duration_prototype__proto.weeks = weeks;
+ duration_prototype__proto.months = duration_get__months;
+ duration_prototype__proto.years = years;
+ duration_prototype__proto.humanize = humanize;
+ duration_prototype__proto.toISOString = iso_string__toISOString;
+ duration_prototype__proto.toString = iso_string__toISOString;
+ duration_prototype__proto.toJSON = iso_string__toISOString;
+ duration_prototype__proto.locale = locale;
+ duration_prototype__proto.localeData = localeData;
+
+ // Deprecations
+ duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);
+ duration_prototype__proto.lang = lang;
+
+ // Side effect imports
+
+ addFormatToken('X', 0, 0, 'unix');
+ addFormatToken('x', 0, 0, 'valueOf');
+
+ // PARSING
+
+ addRegexToken('x', matchSigned);
+ addRegexToken('X', matchTimestamp);
+ addParseToken('X', function (input, array, config) {
+ config._d = new Date(parseFloat(input, 10) * 1000);
+ });
+ addParseToken('x', function (input, array, config) {
+ config._d = new Date(toInt(input));
+ });
+
+ // Side effect imports
+
+ ;
+
+ //! moment.js
+ //! version : 2.10.3
+ //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+ //! license : MIT
+ //! momentjs.com
+
+ utils_hooks__hooks.version = '2.10.3';
+
+ setHookCallback(local__createLocal);
+
+ utils_hooks__hooks.fn = momentPrototype;
+ utils_hooks__hooks.min = min;
+ utils_hooks__hooks.max = max;
+ utils_hooks__hooks.utc = create_utc__createUTC;
+ utils_hooks__hooks.unix = moment_moment__createUnix;
+ utils_hooks__hooks.months = lists__listMonths;
+ utils_hooks__hooks.isDate = isDate;
+ utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale;
+ utils_hooks__hooks.invalid = valid__createInvalid;
+ utils_hooks__hooks.duration = create__createDuration;
+ utils_hooks__hooks.isMoment = isMoment;
+ utils_hooks__hooks.weekdays = lists__listWeekdays;
+ utils_hooks__hooks.parseZone = moment_moment__createInZone;
+ utils_hooks__hooks.localeData = locale_locales__getLocale;
+ utils_hooks__hooks.isDuration = isDuration;
+ utils_hooks__hooks.monthsShort = lists__listMonthsShort;
+ utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin;
+ utils_hooks__hooks.defineLocale = defineLocale;
+ utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort;
+ utils_hooks__hooks.normalizeUnits = normalizeUnits;
+ utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;
+
+ var _moment__default = utils_hooks__hooks;
+
+ //! moment.js locale configuration
+ //! locale : afrikaans (af)
+ //! author : Werner Mollentze : https://github.com/wernerm
+
+ var af = _moment__default.defineLocale('af', {
months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+ meridiemParse: /vm|nm/i,
+ isPM : function (input) {
+ return /^nm$/i.test(input);
+ },
meridiem : function (hours, minutes, isLower) {
if (hours < 12) {
return isLower ? 'vm' : 'VM';
@@ -2836,6 +3130,7 @@
},
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -2864,6 +3159,7 @@
y : '\'n jaar',
yy : '%d jaar'
},
+ ordinalParse: /\d{1,2}(ste|de)/,
ordinal : function (number) {
return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter
},
@@ -2872,16 +3168,13 @@
doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
}
});
-}));
-// moment.js locale configuration
-// locale : Moroccan Arabic (ar-ma)
-// author : ElFadili Yassine : https://github.com/ElFadiliY
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('ar-ma', {
+
+ //! moment.js locale configuration
+ //! locale : Moroccan Arabic (ar-ma)
+ //! author : ElFadili Yassine : https://github.com/ElFadiliY
+ //! author : Abdel Said : https://github.com/abdelsaid
+
+ var ar_ma = _moment__default.defineLocale('ar-ma', {
months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
@@ -2889,6 +3182,7 @@
weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -2922,15 +3216,12 @@
doy : 12 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Arabic Saudi Arabia (ar-sa)
-// author : Suhail Alkowaileet : https://github.com/xsoh
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : Arabic Saudi Arabia (ar-sa)
+ //! author : Suhail Alkowaileet : https://github.com/xsoh
+
+ var ar_sa__symbolMap = {
'1': '١',
'2': '٢',
'3': '٣',
@@ -2941,7 +3232,7 @@
'8': '٨',
'9': '٩',
'0': '٠'
- }, numberMap = {
+ }, ar_sa__numberMap = {
'١': '1',
'٢': '2',
'٣': '3',
@@ -2954,7 +3245,7 @@
'٠': '0'
};
- return moment.defineLocale('ar-sa', {
+ var ar_sa = _moment__default.defineLocale('ar-sa', {
months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
@@ -2962,11 +3253,16 @@
weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
LLLL : 'dddd D MMMM YYYY LT'
},
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 12) {
return 'ص';
@@ -2998,13 +3294,13 @@
yy : '%d سنوات'
},
preparse: function (string) {
- return string.replace(/[۰-۹]/g, function (match) {
- return numberMap[match];
+ return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return ar_sa__numberMap[match];
}).replace(/،/g, ',');
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return ar_sa__symbolMap[match];
}).replace(/,/g, '،');
},
week : {
@@ -3012,17 +3308,60 @@
doy : 12 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// Locale: Arabic (ar)
-// Author: Abdel Said: https://github.com/abdelsaid
-// Changes in months, weekdays: Ahmed Elkhatib
-// Native plural forms: forabi https://github.com/forabi
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : Tunisian Arabic (ar-tn)
+
+ var ar_tn = _moment__default.defineLocale('ar-tn', {
+ months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+ weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+ weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+ weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+ longDateFormat: {
+ LT: 'HH:mm',
+ LTS: 'LT:ss',
+ L: 'DD/MM/YYYY',
+ LL: 'D MMMM YYYY',
+ LLL: 'D MMMM YYYY LT',
+ LLLL: 'dddd D MMMM YYYY LT'
+ },
+ calendar: {
+ sameDay: '[اليوم على الساعة] LT',
+ nextDay: '[غدا على الساعة] LT',
+ nextWeek: 'dddd [على الساعة] LT',
+ lastDay: '[أمس على الساعة] LT',
+ lastWeek: 'dddd [على الساعة] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: 'في %s',
+ past: 'منذ %s',
+ s: 'ثوان',
+ m: 'دقيقة',
+ mm: '%d دقائق',
+ h: 'ساعة',
+ hh: '%d ساعات',
+ d: 'يوم',
+ dd: '%d أيام',
+ M: 'شهر',
+ MM: '%d أشهر',
+ y: 'سنة',
+ yy: '%d سنوات'
+ },
+ week: {
+ dow: 1, // Monday is the first day of the week.
+ doy: 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+
+ //! moment.js locale configuration
+ //! Locale: Arabic (ar)
+ //! Author: Abdel Said: https://github.com/abdelsaid
+ //! Changes in months, weekdays: Ahmed Elkhatib
+ //! Native plural forms: forabi https://github.com/forabi
+
+ var ar__symbolMap = {
'1': '١',
'2': '٢',
'3': '٣',
@@ -3033,7 +3372,7 @@
'8': '٨',
'9': '٩',
'0': '٠'
- }, numberMap = {
+ }, ar__numberMap = {
'١': '1',
'٢': '2',
'٣': '3',
@@ -3062,7 +3401,7 @@
}
return str.replace(/%d/i, number);
};
- }, months = [
+ }, ar__months = [
'كانون الثاني يناير',
'شباط فبراير',
'آذار مارس',
@@ -3077,19 +3416,24 @@
'كانون الأول ديسمبر'
];
- return moment.defineLocale('ar', {
- months : months,
- monthsShort : months,
+ var ar = _moment__default.defineLocale('ar', {
+ months : ar__months,
+ monthsShort : ar__months,
weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'),
longDateFormat : {
LT : 'HH:mm',
- L : 'DD/MM/YYYY',
+ LTS : 'HH:mm:ss',
+ L : 'D/\u200FM/\u200FYYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
LLLL : 'dddd D MMMM YYYY LT'
},
+ meridiemParse: /ص|م/,
+ isPM : function (input) {
+ return 'م' === input;
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 12) {
return 'ص';
@@ -3121,13 +3465,13 @@
yy : pluralize('y')
},
preparse: function (string) {
- return string.replace(/[۰-۹]/g, function (match) {
- return numberMap[match];
+ return string.replace(/\u200f/g, '').replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+ return ar__numberMap[match];
}).replace(/،/g, ',');
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return ar__symbolMap[match];
}).replace(/,/g, '،');
},
week : {
@@ -3135,40 +3479,33 @@
doy : 12 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : azerbaijani (az)
-// author : topchiyev : https://github.com/topchiyev
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var suffixes = {
+
+ //! moment.js locale configuration
+ //! locale : azerbaijani (az)
+ //! author : topchiyev : https://github.com/topchiyev
+
+ var az__suffixes = {
1: '-inci',
5: '-inci',
8: '-inci',
70: '-inci',
80: '-inci',
-
2: '-nci',
7: '-nci',
20: '-nci',
50: '-nci',
-
3: '-üncü',
4: '-üncü',
100: '-üncü',
-
6: '-ncı',
-
9: '-uncu',
10: '-uncu',
30: '-uncu',
-
60: '-ıncı',
90: '-ıncı'
};
- return moment.defineLocale('az', {
+
+ var az = _moment__default.defineLocale('az', {
months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'),
monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'),
@@ -3176,6 +3513,7 @@
weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -3204,6 +3542,10 @@
y : 'bir il',
yy : '%d il'
},
+ meridiemParse: /gecə|səhər|gündüz|axşam/,
+ isPM : function (input) {
+ return /^(gündüz|axşam)$/.test(input);
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'gecə';
@@ -3215,6 +3557,7 @@
return 'axşam';
}
},
+ ordinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
ordinal : function (number) {
if (number === 0) { // special case for zero
return number + '-ıncı';
@@ -3222,30 +3565,25 @@
var a = number % 10,
b = number % 100 - a,
c = number >= 100 ? 100 : null;
-
- return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ return number + (az__suffixes[a] || az__suffixes[b] || az__suffixes[c]);
},
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : belarusian (be)
-// author : Dmitry Demidov : https://github.com/demidov91
-// author: Praleska: http://praleska.pro/
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function plural(word, num) {
+
+ //! moment.js locale configuration
+ //! locale : belarusian (be)
+ //! author : Dmitry Demidov : https://github.com/demidov91
+ //! author: Praleska: http://praleska.pro/
+ //! Author : Menelion Elensúle : https://github.com/Oire
+
+ function be__plural(word, num) {
var forms = word.split('_');
return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
}
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
+ function be__relativeTimeWithPlural(number, withoutSuffix, key) {
var format = {
'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
@@ -3260,44 +3598,39 @@
return withoutSuffix ? 'гадзіна' : 'гадзіну';
}
else {
- return number + ' ' + plural(format[key], +number);
+ return number + ' ' + be__plural(format[key], +number);
}
}
-
- function monthsCaseReplace(m, format) {
+ function be__monthsCaseReplace(m, format) {
var months = {
'nominative': 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_'),
'accusative': 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_')
},
-
nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
'accusative' :
'nominative';
-
return months[nounCase][m.month()];
}
-
- function weekdaysCaseReplace(m, format) {
+ function be__weekdaysCaseReplace(m, format) {
var weekdays = {
'nominative': 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'),
'accusative': 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_')
},
-
nounCase = (/\[ ?[Вв] ?(?:мінулую|наступную)? ?\] ?dddd/).test(format) ?
'accusative' :
'nominative';
-
return weekdays[nounCase][m.day()];
}
- return moment.defineLocale('be', {
- months : monthsCaseReplace,
+ var be = _moment__default.defineLocale('be', {
+ months : be__monthsCaseReplace,
monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
- weekdays : weekdaysCaseReplace,
+ weekdays : be__weekdaysCaseReplace,
weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY г.',
LLL : 'D MMMM YYYY г., LT',
@@ -3329,19 +3662,21 @@
future : 'праз %s',
past : '%s таму',
s : 'некалькі секунд',
- m : relativeTimeWithPlural,
- mm : relativeTimeWithPlural,
- h : relativeTimeWithPlural,
- hh : relativeTimeWithPlural,
+ m : be__relativeTimeWithPlural,
+ mm : be__relativeTimeWithPlural,
+ h : be__relativeTimeWithPlural,
+ hh : be__relativeTimeWithPlural,
d : 'дзень',
- dd : relativeTimeWithPlural,
+ dd : be__relativeTimeWithPlural,
M : 'месяц',
- MM : relativeTimeWithPlural,
+ MM : be__relativeTimeWithPlural,
y : 'год',
- yy : relativeTimeWithPlural
+ yy : be__relativeTimeWithPlural
+ },
+ meridiemParse: /ночы|раніцы|дня|вечара/,
+ isPM : function (input) {
+ return /^(дня|вечара)$/.test(input);
},
-
-
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'ночы';
@@ -3353,7 +3688,7 @@
return 'вечара';
}
},
-
+ ordinalParse: /\d{1,2}-(і|ы|га)/,
ordinal: function (number, period) {
switch (period) {
case 'M':
@@ -3368,21 +3703,17 @@
return number;
}
},
-
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : bulgarian (bg)
-// author : Krasen Borisov : https://github.com/kraz
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('bg', {
+
+ //! moment.js locale configuration
+ //! locale : bulgarian (bg)
+ //! author : Krasen Borisov : https://github.com/kraz
+
+ var bg = _moment__default.defineLocale('bg', {
months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
@@ -3390,6 +3721,7 @@
weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'D.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -3430,6 +3762,7 @@
y : 'година',
yy : '%d години'
},
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
ordinal : function (number) {
var lastDigit = number % 10,
last2Digits = number % 100;
@@ -3454,15 +3787,12 @@
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Bengali (bn)
-// author : Kaushik Gandhi : https://github.com/kaushikgandhi
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : Bengali (bn)
+ //! author : Kaushik Gandhi : https://github.com/kaushikgandhi
+
+ var bn__symbolMap = {
'1': '১',
'2': '২',
'3': '৩',
@@ -3474,7 +3804,7 @@
'9': '৯',
'0': '০'
},
- numberMap = {
+ bn__numberMap = {
'১': '1',
'২': '2',
'৩': '3',
@@ -3487,7 +3817,7 @@
'০': '0'
};
- return moment.defineLocale('bn', {
+ var bn = _moment__default.defineLocale('bn', {
months : 'জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
monthsShort : 'জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্'.split('_'),
weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার'.split('_'),
@@ -3495,6 +3825,7 @@
weekdaysMin : 'রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি'.split('_'),
longDateFormat : {
LT : 'A h:mm সময়',
+ LTS : 'A h:mm:ss সময়',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -3525,14 +3856,18 @@
},
preparse: function (string) {
return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
- return numberMap[match];
+ return bn__numberMap[match];
});
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return bn__symbolMap[match];
});
},
+ meridiemParse: /রাত|শকাল|দুপুর|বিকেল|রাত/,
+ isPM: function (input) {
+ return /^(দুপুর|বিকেল|রাত)$/.test(input);
+ },
//Bengali is a vast language its spoken
//in different forms in various parts of the world.
//I have just generalized with most common one used
@@ -3554,15 +3889,12 @@
doy : 6 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : tibetan (bo)
-// author : Thupten N. Chakrishar : https://github.com/vajradog
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : tibetan (bo)
+ //! author : Thupten N. Chakrishar : https://github.com/vajradog
+
+ var bo__symbolMap = {
'1': '༡',
'2': '༢',
'3': '༣',
@@ -3574,7 +3906,7 @@
'9': '༩',
'0': '༠'
},
- numberMap = {
+ bo__numberMap = {
'༡': '1',
'༢': '2',
'༣': '3',
@@ -3587,7 +3919,7 @@
'༠': '0'
};
- return moment.defineLocale('bo', {
+ var bo = _moment__default.defineLocale('bo', {
months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
@@ -3595,6 +3927,7 @@
weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
longDateFormat : {
LT : 'A h:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -3625,14 +3958,18 @@
},
preparse: function (string) {
return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
- return numberMap[match];
+ return bo__numberMap[match];
});
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return bo__symbolMap[match];
});
},
+ meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
+ isPM: function (input) {
+ return /^(ཉིན་གུང|དགོང་དག|མཚན་མོ)$/.test(input);
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'མཚན་མོ';
@@ -3651,14 +3988,11 @@
doy : 6 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : breton (br)
-// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
+
+ //! moment.js locale configuration
+ //! locale : breton (br)
+ //! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
function relativeTimeWithMutation(number, withoutSuffix, key) {
var format = {
'mm': 'munutenn',
@@ -3667,7 +4001,6 @@
};
return number + ' ' + mutation(format[key], number);
}
-
function specialMutationForYears(number) {
switch (lastNumber(number)) {
case 1:
@@ -3680,21 +4013,18 @@
return number + ' vloaz';
}
}
-
function lastNumber(number) {
if (number > 9) {
return lastNumber(number % 10);
}
return number;
}
-
function mutation(text, number) {
if (number === 2) {
return softMutation(text);
}
return text;
}
-
function softMutation(text) {
var mutationTable = {
'm': 'v',
@@ -3707,7 +4037,7 @@
return mutationTable[text.charAt(0)] + text.substring(1);
}
- return moment.defineLocale('br', {
+ var br = _moment__default.defineLocale('br', {
months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'),
@@ -3715,6 +4045,7 @@
weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
longDateFormat : {
LT : 'h[e]mm A',
+ LTS : 'h[e]mm:ss A',
L : 'DD/MM/YYYY',
LL : 'D [a viz] MMMM YYYY',
LLL : 'D [a viz] MMMM YYYY LT',
@@ -3743,6 +4074,7 @@
y : 'ur bloaz',
yy : specialMutationForYears
},
+ ordinalParse: /\d{1,2}(añ|vet)/,
ordinal : function (number) {
var output = (number === 1) ? 'añ' : 'vet';
return number + output;
@@ -3752,16 +4084,13 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : bosnian (bs)
-// author : Nedim Cholich : https://github.com/frontyard
-// based on (hr) translation by Bojan Marković
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function translate(number, withoutSuffix, key) {
+
+ //! moment.js locale configuration
+ //! locale : bosnian (bs)
+ //! author : Nedim Cholich : https://github.com/frontyard
+ //! based on (hr) translation by Bojan Marković
+
+ function bs__translate(number, withoutSuffix, key) {
var result = number + ' ';
switch (key) {
case 'm':
@@ -3814,14 +4143,15 @@
}
}
- return moment.defineLocale('bs', {
- months : 'januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar'.split('_'),
- monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
+ var bs = _moment__default.defineLocale('bs', {
+ months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+ monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD. MM. YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
@@ -3830,7 +4160,6 @@
calendar : {
sameDay : '[danas u] LT',
nextDay : '[sutra u] LT',
-
nextWeek : function () {
switch (this.day()) {
case 0:
@@ -3867,32 +4196,30 @@
future : 'za %s',
past : 'prije %s',
s : 'par sekundi',
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
+ m : bs__translate,
+ mm : bs__translate,
+ h : bs__translate,
+ hh : bs__translate,
d : 'dan',
- dd : translate,
+ dd : bs__translate,
M : 'mjesec',
- MM : translate,
+ MM : bs__translate,
y : 'godinu',
- yy : translate
+ yy : bs__translate
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : catalan (ca)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('ca', {
+
+ //! moment.js locale configuration
+ //! locale : catalan (ca)
+ //! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+ var ca = _moment__default.defineLocale('ca', {
months : 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'),
monthsShort : 'gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.'.split('_'),
weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'),
@@ -3900,6 +4227,7 @@
weekdaysMin : 'Dg_Dl_Dt_Dc_Dj_Dv_Ds'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -3938,28 +4266,33 @@
y : 'un any',
yy : '%d anys'
},
- ordinal : '%dº',
+ ordinalParse: /\d{1,2}(r|n|t|è|a)/,
+ ordinal : function (number, period) {
+ var output = (number === 1) ? 'r' :
+ (number === 2) ? 'n' :
+ (number === 3) ? 'r' :
+ (number === 4) ? 't' : 'è';
+ if (period === 'w' || period === 'W') {
+ output = 'a';
+ }
+ return number + output;
+ },
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : czech (cs)
-// author : petrbela : https://github.com/petrbela
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
- monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
-
- function plural(n) {
+
+ //! moment.js locale configuration
+ //! locale : czech (cs)
+ //! author : petrbela : https://github.com/petrbela
+
+ var cs__months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'),
+ cs__monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_');
+ function cs__plural(n) {
return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
}
-
- function translate(number, withoutSuffix, key, isFuture) {
+ function cs__translate(number, withoutSuffix, key, isFuture) {
var result = number + ' ';
switch (key) {
case 's': // a few seconds / in a few seconds / a few seconds ago
@@ -3968,7 +4301,7 @@
return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'minuty' : 'minut');
+ return result + (cs__plural(number) ? 'minuty' : 'minut');
} else {
return result + 'minutami';
}
@@ -3977,7 +4310,7 @@
return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
case 'hh': // 9 hours / in 9 hours / 9 hours ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'hodiny' : 'hodin');
+ return result + (cs__plural(number) ? 'hodiny' : 'hodin');
} else {
return result + 'hodinami';
}
@@ -3986,7 +4319,7 @@
return (withoutSuffix || isFuture) ? 'den' : 'dnem';
case 'dd': // 9 days / in 9 days / 9 days ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'dny' : 'dní');
+ return result + (cs__plural(number) ? 'dny' : 'dní');
} else {
return result + 'dny';
}
@@ -3995,7 +4328,7 @@
return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
case 'MM': // 9 months / in 9 months / 9 months ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'měsíce' : 'měsíců');
+ return result + (cs__plural(number) ? 'měsíce' : 'měsíců');
} else {
return result + 'měsíci';
}
@@ -4004,7 +4337,7 @@
return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
case 'yy': // 9 years / in 9 years / 9 years ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'roky' : 'let');
+ return result + (cs__plural(number) ? 'roky' : 'let');
} else {
return result + 'lety';
}
@@ -4012,9 +4345,9 @@
}
}
- return moment.defineLocale('cs', {
- months : months,
- monthsShort : monthsShort,
+ var cs = _moment__default.defineLocale('cs', {
+ months : cs__months,
+ monthsShort : cs__monthsShort,
monthsParse : (function (months, monthsShort) {
var i, _monthsParse = [];
for (i = 0; i < 12; i++) {
@@ -4022,13 +4355,14 @@
_monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
}
return _monthsParse;
- }(months, monthsShort)),
+ }(cs__months, cs__monthsShort)),
weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'),
weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'),
longDateFormat : {
LT: 'H:mm',
- L : 'DD. MM. YYYY',
+ LTS : 'LT:ss',
+ L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
LLLL : 'dddd D. MMMM YYYY LT'
@@ -4075,86 +4409,83 @@
relativeTime : {
future : 'za %s',
past : 'před %s',
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
+ s : cs__translate,
+ m : cs__translate,
+ mm : cs__translate,
+ h : cs__translate,
+ hh : cs__translate,
+ d : cs__translate,
+ dd : cs__translate,
+ M : cs__translate,
+ MM : cs__translate,
+ y : cs__translate,
+ yy : cs__translate
+ },
+ ordinalParse : /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : chuvash (cv)
-// author : Anatoly Mironov : https://github.com/mirontoli
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('cv', {
- months : 'кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав'.split('_'),
- monthsShort : 'кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш'.split('_'),
- weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун'.split('_'),
- weekdaysShort : 'выр_тун_ытл_юн_кĕç_эрн_шăм'.split('_'),
- weekdaysMin : 'вр_тн_ыт_юн_кç_эр_шм'.split('_'),
+
+ //! moment.js locale configuration
+ //! locale : chuvash (cv)
+ //! author : Anatoly Mironov : https://github.com/mirontoli
+
+ var cv = _moment__default.defineLocale('cv', {
+ months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+ monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+ weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+ weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+ weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD-MM-YYYY',
- LL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]',
- LLL : 'YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT',
- LLLL : 'dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT'
+ LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+ LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], LT',
+ LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], LT'
},
calendar : {
sameDay: '[Паян] LT [сехетре]',
nextDay: '[Ыран] LT [сехетре]',
- lastDay: '[Ĕнер] LT [сехетре]',
- nextWeek: '[Çитес] dddd LT [сехетре]',
- lastWeek: '[Иртнĕ] dddd LT [сехетре]',
+ lastDay: '[Ӗнер] LT [сехетре]',
+ nextWeek: '[Ҫитес] dddd LT [сехетре]',
+ lastWeek: '[Иртнӗ] dddd LT [сехетре]',
sameElse: 'L'
},
relativeTime : {
future : function (output) {
- var affix = /сехет$/i.exec(output) ? 'рен' : /çул$/i.exec(output) ? 'тан' : 'ран';
+ var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран';
return output + affix;
},
past : '%s каялла',
- s : 'пĕр-ик çеккунт',
- m : 'пĕр минут',
+ s : 'пӗр-ик ҫеккунт',
+ m : 'пӗр минут',
mm : '%d минут',
- h : 'пĕр сехет',
+ h : 'пӗр сехет',
hh : '%d сехет',
- d : 'пĕр кун',
+ d : 'пӗр кун',
dd : '%d кун',
- M : 'пĕр уйăх',
- MM : '%d уйăх',
- y : 'пĕр çул',
- yy : '%d çул'
+ M : 'пӗр уйӑх',
+ MM : '%d уйӑх',
+ y : 'пӗр ҫул',
+ yy : '%d ҫул'
},
- ordinal : '%d-мĕш',
+ ordinalParse: /\d{1,2}-мӗш/,
+ ordinal : '%d-мӗш',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Welsh (cy)
-// author : Robert Allen
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('cy', {
+
+ //! moment.js locale configuration
+ //! locale : Welsh (cy)
+ //! author : Robert Allen
+
+ var cy = _moment__default.defineLocale('cy', {
months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
@@ -4163,6 +4494,7 @@
// time formats are the same as en-gb
longDateFormat: {
LT: 'HH:mm',
+ LTS : 'LT:ss',
L: 'DD/MM/YYYY',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY LT',
@@ -4191,6 +4523,7 @@
y: 'blwyddyn',
yy: '%d flynedd'
},
+ ordinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
// traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
ordinal: function (number) {
var b = number,
@@ -4199,7 +4532,6 @@
'', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
];
-
if (b > 20) {
if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
output = 'fed'; // not 30ain, 70ain or 90ain
@@ -4209,7 +4541,6 @@
} else if (b > 0) {
output = lookup[b];
}
-
return number + output;
},
week : {
@@ -4217,15 +4548,12 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : danish (da)
-// author : Ulrik Nielsen : https://github.com/mrbase
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('da', {
+
+ //! moment.js locale configuration
+ //! locale : danish (da)
+ //! author : Ulrik Nielsen : https://github.com/mrbase
+
+ var da = _moment__default.defineLocale('da', {
months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
@@ -4233,6 +4561,7 @@
weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
@@ -4261,23 +4590,21 @@
y : 'et år',
yy : '%d år'
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : austrian german (de-at)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-// author : Martin Groller : https://github.com/MadMG
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function processRelativeTime(number, withoutSuffix, key, isFuture) {
+
+ //! moment.js locale configuration
+ //! locale : austrian german (de-at)
+ //! author : lluchs : https://github.com/lluchs
+ //! author: Menelion Elensúle: https://github.com/Oire
+ //! author : Martin Groller : https://github.com/MadMG
+
+ function de_at__processRelativeTime(number, withoutSuffix, key, isFuture) {
var format = {
'm': ['eine Minute', 'einer Minute'],
'h': ['eine Stunde', 'einer Stunde'],
@@ -4291,58 +4618,57 @@
return withoutSuffix ? format[key][0] : format[key][1];
}
- return moment.defineLocale('de-at', {
+ var de_at = _moment__default.defineLocale('de-at', {
months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
monthsShort : 'Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
longDateFormat : {
- LT: 'HH:mm [Uhr]',
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
LLLL : 'dddd, D. MMMM YYYY LT'
},
calendar : {
- sameDay: '[Heute um] LT',
+ sameDay: '[Heute um] LT [Uhr]',
sameElse: 'L',
- nextDay: '[Morgen um] LT',
- nextWeek: 'dddd [um] LT',
- lastDay: '[Gestern um] LT',
- lastWeek: '[letzten] dddd [um] LT'
+ nextDay: '[Morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[Gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
},
relativeTime : {
future : 'in %s',
past : 'vor %s',
s : 'ein paar Sekunden',
- m : processRelativeTime,
+ m : de_at__processRelativeTime,
mm : '%d Minuten',
- h : processRelativeTime,
+ h : de_at__processRelativeTime,
hh : '%d Stunden',
- d : processRelativeTime,
- dd : processRelativeTime,
- M : processRelativeTime,
- MM : processRelativeTime,
- y : processRelativeTime,
- yy : processRelativeTime
- },
+ d : de_at__processRelativeTime,
+ dd : de_at__processRelativeTime,
+ M : de_at__processRelativeTime,
+ MM : de_at__processRelativeTime,
+ y : de_at__processRelativeTime,
+ yy : de_at__processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : german (de)
-// author : lluchs : https://github.com/lluchs
-// author: Menelion Elensúle: https://github.com/Oire
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function processRelativeTime(number, withoutSuffix, key, isFuture) {
+
+ //! moment.js locale configuration
+ //! locale : german (de)
+ //! author : lluchs : https://github.com/lluchs
+ //! author: Menelion Elensúle: https://github.com/Oire
+
+ function de__processRelativeTime(number, withoutSuffix, key, isFuture) {
var format = {
'm': ['eine Minute', 'einer Minute'],
'h': ['eine Stunde', 'einer Stunde'],
@@ -4356,57 +4682,56 @@
return withoutSuffix ? format[key][0] : format[key][1];
}
- return moment.defineLocale('de', {
+ var de = _moment__default.defineLocale('de', {
months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
longDateFormat : {
- LT: 'HH:mm [Uhr]',
+ LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
LLLL : 'dddd, D. MMMM YYYY LT'
},
calendar : {
- sameDay: '[Heute um] LT',
+ sameDay: '[Heute um] LT [Uhr]',
sameElse: 'L',
- nextDay: '[Morgen um] LT',
- nextWeek: 'dddd [um] LT',
- lastDay: '[Gestern um] LT',
- lastWeek: '[letzten] dddd [um] LT'
+ nextDay: '[Morgen um] LT [Uhr]',
+ nextWeek: 'dddd [um] LT [Uhr]',
+ lastDay: '[Gestern um] LT [Uhr]',
+ lastWeek: '[letzten] dddd [um] LT [Uhr]'
},
relativeTime : {
future : 'in %s',
past : 'vor %s',
s : 'ein paar Sekunden',
- m : processRelativeTime,
+ m : de__processRelativeTime,
mm : '%d Minuten',
- h : processRelativeTime,
+ h : de__processRelativeTime,
hh : '%d Stunden',
- d : processRelativeTime,
- dd : processRelativeTime,
- M : processRelativeTime,
- MM : processRelativeTime,
- y : processRelativeTime,
- yy : processRelativeTime
- },
+ d : de__processRelativeTime,
+ dd : de__processRelativeTime,
+ M : de__processRelativeTime,
+ MM : de__processRelativeTime,
+ y : de__processRelativeTime,
+ yy : de__processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : modern greek (el)
-// author : Aggelos Karalias : https://github.com/mehiel
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('el', {
+
+ //! moment.js locale configuration
+ //! locale : modern greek (el)
+ //! author : Aggelos Karalias : https://github.com/mehiel
+
+ var el = _moment__default.defineLocale('el', {
monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'),
monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'),
months : function (momentToFormat, format) {
@@ -4433,6 +4758,7 @@
meridiemParse : /[ΠΜ]\.?Μ?\.?/i,
longDateFormat : {
LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -4456,17 +4782,15 @@
calendar : function (key, mom) {
var output = this._calendarEl[key],
hours = mom && mom.hours();
-
if (typeof output === 'function') {
output = output.apply(mom);
}
-
return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις'));
},
relativeTime : {
future : 'σε %s',
past : '%s πριν',
- s : 'δευτερόλεπτα',
+ s : 'λίγα δευτερόλεπτα',
m : 'ένα λεπτό',
mm : '%d λεπτά',
h : 'μία ώρα',
@@ -4478,22 +4802,18 @@
y : 'ένας χρόνος',
yy : '%d χρόνια'
},
- ordinal : function (number) {
- return number + 'η';
- },
+ ordinalParse: /\d{1,2}η/,
+ ordinal: '%dη',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : australian english (en-au)
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('en-au', {
+
+ //! moment.js locale configuration
+ //! locale : australian english (en-au)
+
+ var en_au = _moment__default.defineLocale('en-au', {
months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -4501,6 +4821,7 @@
weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
longDateFormat : {
LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -4529,6 +4850,7 @@
y : 'a year',
yy : '%d years'
},
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
ordinal : function (number) {
var b = number % 10,
output = (~~(number % 100 / 10) === 1) ? 'th' :
@@ -4542,15 +4864,12 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : canadian english (en-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('en-ca', {
+
+ //! moment.js locale configuration
+ //! locale : canadian english (en-ca)
+ //! author : Jonathan Abourbih : https://github.com/jonbca
+
+ var en_ca = _moment__default.defineLocale('en-ca', {
months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -4558,6 +4877,7 @@
weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
longDateFormat : {
LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
L : 'YYYY-MM-DD',
LL : 'D MMMM, YYYY',
LLL : 'D MMMM, YYYY LT',
@@ -4586,6 +4906,7 @@
y : 'a year',
yy : '%d years'
},
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
ordinal : function (number) {
var b = number % 10,
output = (~~(number % 100 / 10) === 1) ? 'th' :
@@ -4595,15 +4916,12 @@
return number + output;
}
});
-}));
-// moment.js locale configuration
-// locale : great britain english (en-gb)
-// author : Chris Gedrim : https://github.com/chrisgedrim
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('en-gb', {
+
+ //! moment.js locale configuration
+ //! locale : great britain english (en-gb)
+ //! author : Chris Gedrim : https://github.com/chrisgedrim
+
+ var en_gb = _moment__default.defineLocale('en-gb', {
months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
@@ -4611,6 +4929,7 @@
weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -4639,6 +4958,7 @@
y : 'a year',
yy : '%d years'
},
+ ordinalParse: /\d{1,2}(st|nd|rd|th)/,
ordinal : function (number) {
var b = number % 10,
output = (~~(number % 100 / 10) === 1) ? 'th' :
@@ -4652,17 +4972,14 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : esperanto (eo)
-// author : Colin Dean : https://github.com/colindean
-// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
-// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('eo', {
+
+ //! moment.js locale configuration
+ //! locale : esperanto (eo)
+ //! author : Colin Dean : https://github.com/colindean
+ //! komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+ //! Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+ var eo = _moment__default.defineLocale('eo', {
months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'),
monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'),
weekdays : 'Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato'.split('_'),
@@ -4670,11 +4987,16 @@
weekdaysMin : 'Di_Lu_Ma_Me_Ĵa_Ve_Sa'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'YYYY-MM-DD',
LL : 'D[-an de] MMMM, YYYY',
LLL : 'D[-an de] MMMM, YYYY LT',
LLLL : 'dddd, [la] D[-an de] MMMM, YYYY LT'
},
+ meridiemParse: /[ap]\.t\.m/i,
+ isPM: function (input) {
+ return input.charAt(0).toLowerCase() === 'p';
+ },
meridiem : function (hours, minutes, isLower) {
if (hours > 11) {
return isLower ? 'p.t.m.' : 'P.T.M.';
@@ -4705,37 +5027,36 @@
y : 'jaro',
yy : '%d jaroj'
},
+ ordinalParse: /\d{1,2}a/,
ordinal : '%da',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : spanish (es)
-// author : Julio Napurí : https://github.com/julionc
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),
- monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
-
- return moment.defineLocale('es', {
- months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
+
+ //! moment.js locale configuration
+ //! locale : spanish (es)
+ //! author : Julio Napurí : https://github.com/julionc
+
+ var monthsShortDot = 'Ene._Feb._Mar._Abr._May._Jun._Jul._Ago._Sep._Oct._Nov._Dic.'.split('_'),
+ es__monthsShort = 'Ene_Feb_Mar_Abr_May_Jun_Jul_Ago_Sep_Oct_Nov_Dic'.split('_');
+
+ var es = _moment__default.defineLocale('es', {
+ months : 'Enero_Febrero_Marzo_Abril_Mayo_Junio_Julio_Agosto_Septiembre_Octubre_Noviembre_Diciembre'.split('_'),
monthsShort : function (m, format) {
if (/-MMM-/.test(format)) {
- return monthsShort[m.month()];
+ return es__monthsShort[m.month()];
} else {
return monthsShortDot[m.month()];
}
},
- weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
- weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
+ weekdays : 'Domingo_Lunes_Martes_Miércoles_Jueves_Viernes_Sábado'.split('_'),
+ weekdaysShort : 'Dom._Lun._Mar._Mié._Jue._Vie._Sáb.'.split('_'),
weekdaysMin : 'Do_Lu_Ma_Mi_Ju_Vi_Sá'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D [de] MMMM [de] YYYY',
LLL : 'D [de] MMMM [de] YYYY LT',
@@ -4774,22 +5095,20 @@
y : 'un año',
yy : '%d años'
},
+ ordinalParse : /\d{1,2}º/,
ordinal : '%dº',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : estonian (et)
-// author : Henry Kehlmann : https://github.com/madhenry
-// improvements : Illimar Tambek : https://github.com/ragulka
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function processRelativeTime(number, withoutSuffix, key, isFuture) {
+
+ //! moment.js locale configuration
+ //! locale : estonian (et)
+ //! author : Henry Kehlmann : https://github.com/madhenry
+ //! improvements : Illimar Tambek : https://github.com/ragulka
+
+ function et__processRelativeTime(number, withoutSuffix, key, isFuture) {
var format = {
's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
'm' : ['ühe minuti', 'üks minut'],
@@ -4808,7 +5127,7 @@
return isFuture ? format[key][0] : format[key][1];
}
- return moment.defineLocale('et', {
+ var et = _moment__default.defineLocale('et', {
months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'),
monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'),
@@ -4816,6 +5135,7 @@
weekdaysMin : 'P_E_T_K_N_R_L'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
@@ -4832,33 +5152,31 @@
relativeTime : {
future : '%s pärast',
past : '%s tagasi',
- s : processRelativeTime,
- m : processRelativeTime,
- mm : processRelativeTime,
- h : processRelativeTime,
- hh : processRelativeTime,
- d : processRelativeTime,
+ s : et__processRelativeTime,
+ m : et__processRelativeTime,
+ mm : et__processRelativeTime,
+ h : et__processRelativeTime,
+ hh : et__processRelativeTime,
+ d : et__processRelativeTime,
dd : '%d päeva',
- M : processRelativeTime,
- MM : processRelativeTime,
- y : processRelativeTime,
- yy : processRelativeTime
+ M : et__processRelativeTime,
+ MM : et__processRelativeTime,
+ y : et__processRelativeTime,
+ yy : et__processRelativeTime
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : euskara (eu)
-// author : Eneko Illarramendi : https://github.com/eillarra
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('eu', {
+
+ //! moment.js locale configuration
+ //! locale : euskara (eu)
+ //! author : Eneko Illarramendi : https://github.com/eillarra
+
+ var eu = _moment__default.defineLocale('eu', {
months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'),
monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'),
weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'),
@@ -4866,6 +5184,7 @@
weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'YYYY-MM-DD',
LL : 'YYYY[ko] MMMM[ren] D[a]',
LLL : 'YYYY[ko] MMMM[ren] D[a] LT',
@@ -4898,21 +5217,19 @@
y : 'urte bat',
yy : '%d urte'
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Persian (fa)
-// author : Ebrahim Byagowi : https://github.com/ebraminio
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : Persian (fa)
+ //! author : Ebrahim Byagowi : https://github.com/ebraminio
+
+ var fa__symbolMap = {
'1': '۱',
'2': '۲',
'3': '۳',
@@ -4923,7 +5240,7 @@
'8': '۸',
'9': '۹',
'0': '۰'
- }, numberMap = {
+ }, fa__numberMap = {
'۱': '1',
'۲': '2',
'۳': '3',
@@ -4936,7 +5253,7 @@
'۰': '0'
};
- return moment.defineLocale('fa', {
+ var fa = _moment__default.defineLocale('fa', {
months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
@@ -4944,11 +5261,16 @@
weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
LLLL : 'dddd, D MMMM YYYY LT'
},
+ meridiemParse: /قبل از ظهر|بعد از ظهر/,
+ isPM: function (input) {
+ return /بعد از ظهر/.test(input);
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 12) {
return 'قبل از ظهر';
@@ -4981,35 +5303,32 @@
},
preparse: function (string) {
return string.replace(/[۰-۹]/g, function (match) {
- return numberMap[match];
+ return fa__numberMap[match];
}).replace(/،/g, ',');
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return fa__symbolMap[match];
}).replace(/,/g, '،');
},
+ ordinalParse: /\d{1,2}م/,
ordinal : '%dم',
week : {
dow : 6, // Saturday is the first day of the week.
doy : 12 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : finnish (fi)
-// author : Tarmo Aidantausta : https://github.com/bleadof
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
+
+ //! moment.js locale configuration
+ //! locale : finnish (fi)
+ //! author : Tarmo Aidantausta : https://github.com/bleadof
+
var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
numbersFuture = [
'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
numbersPast[7], numbersPast[8], numbersPast[9]
];
-
- function translate(number, withoutSuffix, key, isFuture) {
+ function fi__translate(number, withoutSuffix, key, isFuture) {
var result = '';
switch (key) {
case 's':
@@ -5043,12 +5362,11 @@
result = verbalNumber(number, isFuture) + ' ' + result;
return result;
}
-
function verbalNumber(number, isFuture) {
return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number;
}
- return moment.defineLocale('fi', {
+ var fi = _moment__default.defineLocale('fi', {
months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'),
monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'),
weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'),
@@ -5056,6 +5374,7 @@
weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'),
longDateFormat : {
LT : 'HH.mm',
+ LTS : 'HH.mm.ss',
L : 'DD.MM.YYYY',
LL : 'Do MMMM[ta] YYYY',
LLL : 'Do MMMM[ta] YYYY, [klo] LT',
@@ -5076,33 +5395,31 @@
relativeTime : {
future : '%s päästä',
past : '%s sitten',
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
+ s : fi__translate,
+ m : fi__translate,
+ mm : fi__translate,
+ h : fi__translate,
+ hh : fi__translate,
+ d : fi__translate,
+ dd : fi__translate,
+ M : fi__translate,
+ MM : fi__translate,
+ y : fi__translate,
+ yy : fi__translate
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : faroese (fo)
-// author : Ragnar Johannesen : https://github.com/ragnar123
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('fo', {
+
+ //! moment.js locale configuration
+ //! locale : faroese (fo)
+ //! author : Ragnar Johannesen : https://github.com/ragnar123
+
+ var fo = _moment__default.defineLocale('fo', {
months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'),
@@ -5110,6 +5427,7 @@
weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -5138,21 +5456,19 @@
y : 'eitt ár',
yy : '%d ár'
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : canadian french (fr-ca)
-// author : Jonathan Abourbih : https://github.com/jonbca
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('fr-ca', {
+
+ //! moment.js locale configuration
+ //! locale : canadian french (fr-ca)
+ //! author : Jonathan Abourbih : https://github.com/jonbca
+
+ var fr_ca = _moment__default.defineLocale('fr-ca', {
months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
@@ -5160,6 +5476,7 @@
weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'YYYY-MM-DD',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -5188,19 +5505,17 @@
y : 'un an',
yy : '%d ans'
},
+ ordinalParse: /\d{1,2}(er|)/,
ordinal : function (number) {
return number + (number === 1 ? 'er' : '');
}
});
-}));
-// moment.js locale configuration
-// locale : french (fr)
-// author : John Fischer : https://github.com/jfroffice
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('fr', {
+
+ //! moment.js locale configuration
+ //! locale : french (fr)
+ //! author : John Fischer : https://github.com/jfroffice
+
+ var fr = _moment__default.defineLocale('fr', {
months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
@@ -5208,6 +5523,7 @@
weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -5236,6 +5552,7 @@
y : 'un an',
yy : '%d ans'
},
+ ordinalParse: /\d{1,2}(er|)/,
ordinal : function (number) {
return number + (number === 1 ? 'er' : '');
},
@@ -5244,15 +5561,72 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : galician (gl)
-// author : Juan G. Hurtado : https://github.com/juanghurtado
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('gl', {
+
+ //! moment.js locale configuration
+ //! locale : frisian (fy)
+ //! author : Robin van der Vliet : https://github.com/robin0van0der0v
+
+ var fy__monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
+ fy__monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');
+
+ var fy = _moment__default.defineLocale('fy', {
+ months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return fy__monthsShortWithoutDots[m.month()];
+ } else {
+ return fy__monthsShortWithDots[m.month()];
+ }
+ },
+ weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'),
+ weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'),
+ weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ LTS : 'LT:ss',
+ L : 'DD-MM-YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY LT',
+ LLLL : 'dddd D MMMM YYYY LT'
+ },
+ calendar : {
+ sameDay: '[hjoed om] LT',
+ nextDay: '[moarn om] LT',
+ nextWeek: 'dddd [om] LT',
+ lastDay: '[juster om] LT',
+ lastWeek: '[ôfrûne] dddd [om] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : 'oer %s',
+ past : '%s lyn',
+ s : 'in pear sekonden',
+ m : 'ien minút',
+ mm : '%d minuten',
+ h : 'ien oere',
+ hh : '%d oeren',
+ d : 'ien dei',
+ dd : '%d dagen',
+ M : 'ien moanne',
+ MM : '%d moannen',
+ y : 'ien jier',
+ yy : '%d jierren'
+ },
+ ordinalParse: /\d{1,2}(ste|de)/,
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+
+ //! moment.js locale configuration
+ //! locale : galician (gl)
+ //! author : Juan G. Hurtado : https://github.com/juanghurtado
+
+ var gl = _moment__default.defineLocale('gl', {
months : 'Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro'.split('_'),
monthsShort : 'Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.'.split('_'),
weekdays : 'Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado'.split('_'),
@@ -5260,6 +5634,7 @@
weekdaysMin : 'Do_Lu_Ma_Mé_Xo_Ve_Sá'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -5303,23 +5678,21 @@
y : 'un ano',
yy : '%d anos'
},
+ ordinalParse : /\d{1,2}º/,
ordinal : '%dº',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Hebrew (he)
-// author : Tomer Cohen : https://github.com/tomer
-// author : Moshe Simantov : https://github.com/DevelopmentIL
-// author : Tal Ater : https://github.com/TalAter
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('he', {
+
+ //! moment.js locale configuration
+ //! locale : Hebrew (he)
+ //! author : Tomer Cohen : https://github.com/tomer
+ //! author : Moshe Simantov : https://github.com/DevelopmentIL
+ //! author : Tal Ater : https://github.com/TalAter
+
+ var he = _moment__default.defineLocale('he', {
months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
@@ -5327,6 +5700,7 @@
weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D [ב]MMMM YYYY',
LLL : 'D [ב]MMMM YYYY LT',
@@ -5375,20 +5749,19 @@
yy : function (number) {
if (number === 2) {
return 'שנתיים';
+ } else if (number % 10 === 0 && number !== 10) {
+ return number + ' שנה';
}
return number + ' שנים';
}
}
});
-}));
-// moment.js locale configuration
-// locale : hindi (hi)
-// author : Mayank Singhal : https://github.com/mayanksinghal
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : hindi (hi)
+ //! author : Mayank Singhal : https://github.com/mayanksinghal
+
+ var hi__symbolMap = {
'1': '१',
'2': '२',
'3': '३',
@@ -5400,7 +5773,7 @@
'9': '९',
'0': '०'
},
- numberMap = {
+ hi__numberMap = {
'१': '1',
'२': '2',
'३': '3',
@@ -5413,7 +5786,7 @@
'०': '0'
};
- return moment.defineLocale('hi', {
+ var hi = _moment__default.defineLocale('hi', {
months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'),
monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
@@ -5421,6 +5794,7 @@
weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
longDateFormat : {
LT : 'A h:mm बजे',
+ LTS : 'A h:mm:ss बजे',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -5451,16 +5825,31 @@
},
preparse: function (string) {
return string.replace(/[१२३४५६७८९०]/g, function (match) {
- return numberMap[match];
+ return hi__numberMap[match];
});
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return hi__symbolMap[match];
});
},
// Hindi notation for meridiems are quite fuzzy in practice. While there exists
// a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiemParse: /रात|सुबह|दोपहर|शाम/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सुबह') {
+ return hour;
+ } else if (meridiem === 'दोपहर') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'शाम') {
+ return hour + 12;
+ }
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'रात';
@@ -5479,17 +5868,12 @@
doy : 6 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : hrvatski (hr)
-// author : Bojan Marković : https://github.com/bmarkovic
-// based on (sl) translation by Robert Sedovšek
+ //! moment.js locale configuration
+ //! locale : hrvatski (hr)
+ //! author : Bojan Marković : https://github.com/bmarkovic
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function translate(number, withoutSuffix, key) {
+ function hr__translate(number, withoutSuffix, key) {
var result = number + ' ';
switch (key) {
case 'm':
@@ -5542,14 +5926,15 @@
}
}
- return moment.defineLocale('hr', {
- months : 'sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'),
- monthsShort : 'sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
+ var hr = _moment__default.defineLocale('hr', {
+ months : 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_'),
+ monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'),
weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD. MM. YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
@@ -5558,7 +5943,6 @@
calendar : {
sameDay : '[danas u] LT',
nextDay : '[sutra u] LT',
-
nextWeek : function () {
switch (this.day()) {
case 0:
@@ -5595,37 +5979,33 @@
future : 'za %s',
past : 'prije %s',
s : 'par sekundi',
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
+ m : hr__translate,
+ mm : hr__translate,
+ h : hr__translate,
+ hh : hr__translate,
d : 'dan',
- dd : translate,
+ dd : hr__translate,
M : 'mjesec',
- MM : translate,
+ MM : hr__translate,
y : 'godinu',
- yy : translate
+ yy : hr__translate
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : hungarian (hu)
-// author : Adam Brunner : https://github.com/adambrunner
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
- function translate(number, withoutSuffix, key, isFuture) {
+ //! moment.js locale configuration
+ //! locale : hungarian (hu)
+ //! author : Adam Brunner : https://github.com/adambrunner
+
+ var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+ function hu__translate(number, withoutSuffix, key, isFuture) {
var num = number,
suffix;
-
switch (key) {
case 's':
return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
@@ -5650,15 +6030,13 @@
case 'yy':
return num + (isFuture || withoutSuffix ? ' év' : ' éve');
}
-
return '';
}
-
function week(isFuture) {
return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
}
- return moment.defineLocale('hu', {
+ var hu = _moment__default.defineLocale('hu', {
months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'),
monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'),
weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
@@ -5666,11 +6044,16 @@
weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'YYYY.MM.DD.',
LL : 'YYYY. MMMM D.',
LLL : 'YYYY. MMMM D., LT',
LLLL : 'YYYY. MMMM D., dddd LT'
},
+ meridiemParse: /de|du/i,
+ isPM: function (input) {
+ return input.charAt(1).toLowerCase() === 'u';
+ },
meridiem : function (hours, minutes, isLower) {
if (hours < 12) {
return isLower === true ? 'de' : 'DE';
@@ -5693,65 +6076,58 @@
relativeTime : {
future : '%s múlva',
past : '%s',
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
+ s : hu__translate,
+ m : hu__translate,
+ mm : hu__translate,
+ h : hu__translate,
+ hh : hu__translate,
+ d : hu__translate,
+ dd : hu__translate,
+ M : hu__translate,
+ MM : hu__translate,
+ y : hu__translate,
+ yy : hu__translate
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Armenian (hy-am)
-// author : Armendarabyan : https://github.com/armendarabyan
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function monthsCaseReplace(m, format) {
+
+ //! moment.js locale configuration
+ //! locale : Armenian (hy-am)
+ //! author : Armendarabyan : https://github.com/armendarabyan
+
+ function hy_am__monthsCaseReplace(m, format) {
var months = {
'nominative': 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_'),
'accusative': 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_')
},
-
nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
'accusative' :
'nominative';
-
return months[nounCase][m.month()];
}
-
- function monthsShortCaseReplace(m, format) {
+ function hy_am__monthsShortCaseReplace(m, format) {
var monthsShort = 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_');
-
return monthsShort[m.month()];
}
-
- function weekdaysCaseReplace(m, format) {
+ function hy_am__weekdaysCaseReplace(m, format) {
var weekdays = 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_');
-
return weekdays[m.day()];
}
- return moment.defineLocale('hy-am', {
- months : monthsCaseReplace,
- monthsShort : monthsShortCaseReplace,
- weekdays : weekdaysCaseReplace,
+ var hy_am = _moment__default.defineLocale('hy-am', {
+ months : hy_am__monthsCaseReplace,
+ monthsShort : hy_am__monthsShortCaseReplace,
+ weekdays : hy_am__weekdaysCaseReplace,
weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY թ.',
LLL : 'D MMMM YYYY թ., LT',
@@ -5784,7 +6160,10 @@
y : 'տարի',
yy : '%d տարի'
},
-
+ meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
+ isPM: function (input) {
+ return /^(ցերեկվա|երեկոյան)$/.test(input);
+ },
meridiem : function (hour) {
if (hour < 4) {
return 'գիշերվա';
@@ -5796,7 +6175,7 @@
return 'երեկոյան';
}
},
-
+ ordinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
ordinal: function (number, period) {
switch (period) {
case 'DDD':
@@ -5811,22 +6190,18 @@
return number;
}
},
-
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Bahasa Indonesia (id)
-// author : Mohammad Satrio Utomo : https://github.com/tyok
-// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('id', {
+
+ //! moment.js locale configuration
+ //! locale : Bahasa Indonesia (id)
+ //! author : Mohammad Satrio Utomo : https://github.com/tyok
+ //! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+ var id = _moment__default.defineLocale('id', {
months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des'.split('_'),
weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
@@ -5834,11 +6209,25 @@
weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
longDateFormat : {
LT : 'HH.mm',
+ LTS : 'LT.ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY [pukul] LT',
LLLL : 'dddd, D MMMM YYYY [pukul] LT'
},
+ meridiemParse: /pagi|siang|sore|malam/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'siang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sore' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
meridiem : function (hours, minutes, isLower) {
if (hours < 11) {
return 'pagi';
@@ -5878,15 +6267,12 @@
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : icelandic (is)
-// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function plural(n) {
+
+ //! moment.js locale configuration
+ //! locale : icelandic (is)
+ //! author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+ function is__plural(n) {
if (n % 100 === 11) {
return true;
} else if (n % 10 === 1) {
@@ -5894,8 +6280,7 @@
}
return true;
}
-
- function translate(number, withoutSuffix, key, isFuture) {
+ function is__translate(number, withoutSuffix, key, isFuture) {
var result = number + ' ';
switch (key) {
case 's':
@@ -5903,14 +6288,14 @@
case 'm':
return withoutSuffix ? 'mínúta' : 'mínútu';
case 'mm':
- if (plural(number)) {
+ if (is__plural(number)) {
return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
} else if (withoutSuffix) {
return result + 'mínúta';
}
return result + 'mínútu';
case 'hh':
- if (plural(number)) {
+ if (is__plural(number)) {
return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
}
return result + 'klukkustund';
@@ -5920,7 +6305,7 @@
}
return isFuture ? 'dag' : 'degi';
case 'dd':
- if (plural(number)) {
+ if (is__plural(number)) {
if (withoutSuffix) {
return result + 'dagar';
}
@@ -5935,7 +6320,7 @@
}
return isFuture ? 'mánuð' : 'mánuði';
case 'MM':
- if (plural(number)) {
+ if (is__plural(number)) {
if (withoutSuffix) {
return result + 'mánuðir';
}
@@ -5947,14 +6332,14 @@
case 'y':
return withoutSuffix || isFuture ? 'ár' : 'ári';
case 'yy':
- if (plural(number)) {
+ if (is__plural(number)) {
return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
}
return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
}
}
- return moment.defineLocale('is', {
+ var is = _moment__default.defineLocale('is', {
months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'),
monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'),
@@ -5962,6 +6347,7 @@
weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY [kl.] LT',
@@ -5978,34 +6364,32 @@
relativeTime : {
future : 'eftir %s',
past : 'fyrir %s síðan',
- s : translate,
- m : translate,
- mm : translate,
+ s : is__translate,
+ m : is__translate,
+ mm : is__translate,
h : 'klukkustund',
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
+ hh : is__translate,
+ d : is__translate,
+ dd : is__translate,
+ M : is__translate,
+ MM : is__translate,
+ y : is__translate,
+ yy : is__translate
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : italian (it)
-// author : Lorenzo : https://github.com/aliem
-// author: Mattia Larentis: https://github.com/nostalgiaz
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('it', {
+
+ //! moment.js locale configuration
+ //! locale : italian (it)
+ //! author : Lorenzo : https://github.com/aliem
+ //! author: Mattia Larentis: https://github.com/nostalgiaz
+
+ var it = _moment__default.defineLocale('it', {
months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),
monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
weekdays : 'Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato'.split('_'),
@@ -6013,6 +6397,7 @@
weekdaysMin : 'D_L_Ma_Me_G_V_S'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -6023,7 +6408,14 @@
nextDay: '[Domani alle] LT',
nextWeek: 'dddd [alle] LT',
lastDay: '[Ieri alle] LT',
- lastWeek: '[lo scorso] dddd [alle] LT',
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[la scorsa] dddd [alle] LT';
+ default:
+ return '[lo scorso] dddd [alle] LT';
+ }
+ },
sameElse: 'L'
},
relativeTime : {
@@ -6043,21 +6435,19 @@
y : 'un anno',
yy : '%d anni'
},
+ ordinalParse : /\d{1,2}º/,
ordinal: '%dº',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : japanese (ja)
-// author : LI Long : https://github.com/baryon
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('ja', {
+
+ //! moment.js locale configuration
+ //! locale : japanese (ja)
+ //! author : LI Long : https://github.com/baryon
+
+ var ja = _moment__default.defineLocale('ja', {
months : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
@@ -6065,11 +6455,16 @@
weekdaysMin : '日_月_火_水_木_金_土'.split('_'),
longDateFormat : {
LT : 'Ah時m分',
+ LTS : 'LTs秒',
L : 'YYYY/MM/DD',
LL : 'YYYY年M月D日',
LLL : 'YYYY年M月D日LT',
LLLL : 'YYYY年M月D日LT dddd'
},
+ meridiemParse: /午前|午後/i,
+ isPM : function (input) {
+ return input === '午後';
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 12) {
return '午前';
@@ -6101,48 +6496,113 @@
yy : '%d年'
}
});
-}));
-// moment.js locale configuration
-// locale : Georgian (ka)
-// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function monthsCaseReplace(m, format) {
+
+ //! moment.js locale configuration
+ //! locale : Boso Jowo (jv)
+ //! author : Rony Lantip : https://github.com/lantip
+ //! reference: http://jv.wikipedia.org/wiki/Basa_Jawa
+
+ var jv = _moment__default.defineLocale('jv', {
+ months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'),
+ monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
+ weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
+ weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
+ weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
+ longDateFormat : {
+ LT : 'HH.mm',
+ LTS : 'LT.ss',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY [pukul] LT',
+ LLLL : 'dddd, D MMMM YYYY [pukul] LT'
+ },
+ meridiemParse: /enjing|siyang|sonten|ndalu/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'enjing') {
+ return hour;
+ } else if (meridiem === 'siyang') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
+ return hour + 12;
+ }
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'enjing';
+ } else if (hours < 15) {
+ return 'siyang';
+ } else if (hours < 19) {
+ return 'sonten';
+ } else {
+ return 'ndalu';
+ }
+ },
+ calendar : {
+ sameDay : '[Dinten puniko pukul] LT',
+ nextDay : '[Mbenjang pukul] LT',
+ nextWeek : 'dddd [pukul] LT',
+ lastDay : '[Kala wingi pukul] LT',
+ lastWeek : 'dddd [kepengker pukul] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'wonten ing %s',
+ past : '%s ingkang kepengker',
+ s : 'sawetawis detik',
+ m : 'setunggal menit',
+ mm : '%d menit',
+ h : 'setunggal jam',
+ hh : '%d jam',
+ d : 'sedinten',
+ dd : '%d dinten',
+ M : 'sewulan',
+ MM : '%d wulan',
+ y : 'setaun',
+ yy : '%d taun'
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+
+ //! moment.js locale configuration
+ //! locale : Georgian (ka)
+ //! author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+ function ka__monthsCaseReplace(m, format) {
var months = {
'nominative': 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
'accusative': 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_')
},
-
nounCase = (/D[oD] *MMMM?/).test(format) ?
'accusative' :
'nominative';
-
return months[nounCase][m.month()];
}
-
- function weekdaysCaseReplace(m, format) {
+ function ka__weekdaysCaseReplace(m, format) {
var weekdays = {
'nominative': 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
'accusative': 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_')
},
-
nounCase = (/(წინა|შემდეგ)/).test(format) ?
'accusative' :
'nominative';
-
return weekdays[nounCase][m.day()];
}
- return moment.defineLocale('ka', {
- months : monthsCaseReplace,
+ var ka = _moment__default.defineLocale('ka', {
+ months : ka__monthsCaseReplace,
monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
- weekdays : weekdaysCaseReplace,
+ weekdays : ka__weekdaysCaseReplace,
weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
longDateFormat : {
LT : 'h:mm A',
+ LTS : 'h:mm:ss A',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -6182,19 +6642,17 @@
y : 'წელი',
yy : '%d წელი'
},
+ ordinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
ordinal : function (number) {
if (number === 0) {
return number;
}
-
if (number === 1) {
return number + '-ლი';
}
-
if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
return 'მე-' + number;
}
-
return number + '-ე';
},
week : {
@@ -6202,15 +6660,12 @@
doy : 7
}
});
-}));
-// moment.js locale configuration
-// locale : khmer (km)
-// author : Kruy Vanna : https://github.com/kruyvanna
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('km', {
+
+ //! moment.js locale configuration
+ //! locale : khmer (km)
+ //! author : Kruy Vanna : https://github.com/kruyvanna
+
+ var km = _moment__default.defineLocale('km', {
months: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
monthsShort: 'មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split('_'),
weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
@@ -6218,6 +6673,7 @@
weekdaysMin: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
longDateFormat: {
LT: 'HH:mm',
+ LTS : 'LT:ss',
L: 'DD/MM/YYYY',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY LT',
@@ -6251,18 +6707,16 @@
doy: 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : korean (ko)
-//
-// authors
-//
-// - Kyungwook, Park : https://github.com/kyungw00k
-// - Jeeeyul Lee <jeeeyul@gmail.com>
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('ko', {
+
+ //! moment.js locale configuration
+ //! locale : korean (ko)
+ //!
+ //! authors
+ //!
+ //! - Kyungwook, Park : https://github.com/kyungw00k
+ //! - Jeeeyul Lee <jeeeyul@gmail.com>
+
+ var ko = _moment__default.defineLocale('ko', {
months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
@@ -6270,14 +6724,12 @@
weekdaysMin : '일_월_화_수_목_금_토'.split('_'),
longDateFormat : {
LT : 'A h시 m분',
+ LTS : 'A h시 m분 s초',
L : 'YYYY.MM.DD',
LL : 'YYYY년 MMMM D일',
LLL : 'YYYY년 MMMM D일 LT',
LLLL : 'YYYY년 MMMM D일 dddd LT'
},
- meridiem : function (hour, minute, isUpper) {
- return hour < 12 ? '오전' : '오후';
- },
calendar : {
sameDay : '오늘 LT',
nextDay : '내일 LT',
@@ -6302,25 +6754,22 @@
y : '일년',
yy : '%d년'
},
+ ordinalParse : /\d{1,2}일/,
ordinal : '%d일',
- meridiemParse : /(오전|오후)/,
+ meridiemParse : /오전|오후/,
isPM : function (token) {
return token === '오후';
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
}
});
-}));
-// moment.js locale configuration
-// locale : Luxembourgish (lb)
-// author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
-
-// Note: Luxembourgish has a very particular phonological rule ('Eifeler Regel') that causes the
-// deletion of the final 'n' in certain contexts. That's what the 'eifelerRegelAppliesToWeekday'
-// and 'eifelerRegelAppliesToNumber' methods are meant for
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function processRelativeTime(number, withoutSuffix, key, isFuture) {
+
+ //! moment.js locale configuration
+ //! locale : Luxembourgish (lb)
+ //! author : mweimerskirch : https://github.com/mweimerskirch, David Raison : https://github.com/kwisatz
+
+ function lb__processRelativeTime(number, withoutSuffix, key, isFuture) {
var format = {
'm': ['eng Minutt', 'enger Minutt'],
'h': ['eng Stonn', 'enger Stonn'],
@@ -6330,7 +6779,6 @@
};
return withoutSuffix ? format[key][0] : format[key][1];
}
-
function processFutureTime(string) {
var number = string.substr(0, string.indexOf(' '));
if (eifelerRegelAppliesToNumber(number)) {
@@ -6338,7 +6786,6 @@
}
return 'an ' + string;
}
-
function processPastTime(string) {
var number = string.substr(0, string.indexOf(' '));
if (eifelerRegelAppliesToNumber(number)) {
@@ -6346,7 +6793,6 @@
}
return 'virun ' + string;
}
-
/**
* Returns true if the word before the given number loses the '-n' ending.
* e.g. 'an 10 Deeg' but 'a 5 Deeg'
@@ -6388,7 +6834,7 @@
}
}
- return moment.defineLocale('lb', {
+ var lb = _moment__default.defineLocale('lb', {
months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'),
@@ -6396,6 +6842,7 @@
weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
longDateFormat: {
LT: 'H:mm [Auer]',
+ LTS: 'H:mm:ss [Auer]',
L: 'DD.MM.YYYY',
LL: 'D. MMMM YYYY',
LLL: 'D. MMMM YYYY LT',
@@ -6422,32 +6869,30 @@
future : processFutureTime,
past : processPastTime,
s : 'e puer Sekonnen',
- m : processRelativeTime,
+ m : lb__processRelativeTime,
mm : '%d Minutten',
- h : processRelativeTime,
+ h : lb__processRelativeTime,
hh : '%d Stonnen',
- d : processRelativeTime,
+ d : lb__processRelativeTime,
dd : '%d Deeg',
- M : processRelativeTime,
+ M : lb__processRelativeTime,
MM : '%d Méint',
- y : processRelativeTime,
+ y : lb__processRelativeTime,
yy : '%d Joer'
},
+ ordinalParse: /\d{1,2}\./,
ordinal: '%d.',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Lithuanian (lt)
-// author : Mindaugas Mozūras : https://github.com/mmozuras
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var units = {
+
+ //! moment.js locale configuration
+ //! locale : Lithuanian (lt)
+ //! author : Mindaugas Mozūras : https://github.com/mmozuras
+
+ var lt__units = {
'm' : 'minutė_minutės_minutę',
'mm': 'minutės_minučių_minutes',
'h' : 'valanda_valandos_valandą',
@@ -6460,7 +6905,6 @@
'yy': 'metai_metų_metus'
},
weekDays = 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_');
-
function translateSeconds(number, withoutSuffix, key, isFuture) {
if (withoutSuffix) {
return 'kelios sekundės';
@@ -6468,20 +6912,16 @@
return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
}
}
-
function translateSingular(number, withoutSuffix, key, isFuture) {
return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
}
-
function special(number) {
return number % 10 === 0 || (number > 10 && number < 20);
}
-
function forms(key) {
- return units[key].split('_');
+ return lt__units[key].split('_');
}
-
- function translate(number, withoutSuffix, key, isFuture) {
+ function lt__translate(number, withoutSuffix, key, isFuture) {
var result = number + ' ';
if (number === 1) {
return result + translateSingular(number, withoutSuffix, key[0], isFuture);
@@ -6495,15 +6935,13 @@
}
}
}
-
function relativeWeekDay(moment, format) {
var nominative = format.indexOf('dddd HH:mm') === -1,
weekDay = weekDays[moment.day()];
-
return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + 'į';
}
- return moment.defineLocale('lt', {
+ var lt = _moment__default.defineLocale('lt', {
months : 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
weekdays : relativeWeekDay,
@@ -6511,6 +6949,7 @@
weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'YYYY-MM-DD',
LL : 'YYYY [m.] MMMM D [d.]',
LLL : 'YYYY [m.] MMMM D [d.], LT [val.]',
@@ -6533,16 +6972,17 @@
past : 'prieš %s',
s : translateSeconds,
m : translateSingular,
- mm : translate,
+ mm : lt__translate,
h : translateSingular,
- hh : translate,
+ hh : lt__translate,
d : translateSingular,
- dd : translate,
+ dd : lt__translate,
M : translateSingular,
- MM : translate,
+ MM : lt__translate,
y : translateSingular,
- yy : translate
+ yy : lt__translate
},
+ ordinalParse: /\d{1,2}-oji/,
ordinal : function (number) {
return number + '-oji';
},
@@ -6551,36 +6991,48 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : latvian (lv)
-// author : Kristaps Karlsons : https://github.com/skakri
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var units = {
- 'mm': 'minūti_minūtes_minūte_minūtes',
- 'hh': 'stundu_stundas_stunda_stundas',
- 'dd': 'dienu_dienas_diena_dienas',
- 'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
- 'yy': 'gadu_gadus_gads_gadi'
- };
- function format(word, number, withoutSuffix) {
- var forms = word.split('_');
+ //! moment.js locale configuration
+ //! locale : latvian (lv)
+ //! author : Kristaps Karlsons : https://github.com/skakri
+ //! author : Jānis Elmeris : https://github.com/JanisE
+
+ var lv__units = {
+ 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'),
+ 'h': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'hh': 'stundas_stundām_stunda_stundas'.split('_'),
+ 'd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'dd': 'dienas_dienām_diena_dienas'.split('_'),
+ 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
+ 'y': 'gada_gadiem_gads_gadi'.split('_'),
+ 'yy': 'gada_gadiem_gads_gadi'.split('_')
+ };
+ /**
+ * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
+ */
+ function lv__format(forms, number, withoutSuffix) {
if (withoutSuffix) {
+ // E.g. "21 minūte", "3 minūtes".
return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
} else {
+ // E.g. "21 minūtes" as in "pēc 21 minūtes".
+ // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
}
}
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
- return number + ' ' + format(units[key], number, withoutSuffix);
+ function lv__relativeTimeWithPlural(number, withoutSuffix, key) {
+ return number + ' ' + lv__format(lv__units[key], number, withoutSuffix);
+ }
+ function relativeTimeWithSingular(number, withoutSuffix, key) {
+ return lv__format(lv__units[key], number, withoutSuffix);
+ }
+ function relativeSeconds(number, withoutSuffix) {
+ return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
}
- return moment.defineLocale('lv', {
+ var lv = _moment__default.defineLocale('lv', {
months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'),
monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'),
@@ -6588,7 +7040,8 @@
weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'),
longDateFormat : {
LT : 'HH:mm',
- L : 'DD.MM.YYYY',
+ LTS : 'LT:ss',
+ L : 'DD.MM.YYYY.',
LL : 'YYYY. [gada] D. MMMM',
LLL : 'YYYY. [gada] D. MMMM, LT',
LLLL : 'YYYY. [gada] D. MMMM, dddd, LT'
@@ -6602,35 +7055,131 @@
sameElse : 'L'
},
relativeTime : {
- future : '%s vēlāk',
- past : '%s agrāk',
- s : 'dažas sekundes',
- m : 'minūti',
- mm : relativeTimeWithPlural,
- h : 'stundu',
- hh : relativeTimeWithPlural,
- d : 'dienu',
- dd : relativeTimeWithPlural,
- M : 'mēnesi',
- MM : relativeTimeWithPlural,
- y : 'gadu',
- yy : relativeTimeWithPlural
- },
+ future : 'pēc %s',
+ past : 'pirms %s',
+ s : relativeSeconds,
+ m : relativeTimeWithSingular,
+ mm : lv__relativeTimeWithPlural,
+ h : relativeTimeWithSingular,
+ hh : lv__relativeTimeWithPlural,
+ d : relativeTimeWithSingular,
+ dd : lv__relativeTimeWithPlural,
+ M : relativeTimeWithSingular,
+ MM : lv__relativeTimeWithPlural,
+ y : relativeTimeWithSingular,
+ yy : lv__relativeTimeWithPlural
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : macedonian (mk)
-// author : Borislav Mickov : https://github.com/B0k0
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('mk', {
+
+ //! moment.js locale configuration
+ //! locale : Montenegrin (me)
+ //! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac
+
+ var me__translator = {
+ words: { //Different grammatical cases
+ m: ['jedan minut', 'jednog minuta'],
+ mm: ['minut', 'minuta', 'minuta'],
+ h: ['jedan sat', 'jednog sata'],
+ hh: ['sat', 'sata', 'sati'],
+ dd: ['dan', 'dana', 'dana'],
+ MM: ['mjesec', 'mjeseca', 'mjeseci'],
+ yy: ['godina', 'godine', 'godina']
+ },
+ correctGrammaticalCase: function (number, wordKey) {
+ return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
+ },
+ translate: function (number, withoutSuffix, key) {
+ var wordKey = me__translator.words[key];
+ if (key.length === 1) {
+ return withoutSuffix ? wordKey[0] : wordKey[1];
+ } else {
+ return number + ' ' + me__translator.correctGrammaticalCase(number, wordKey);
+ }
+ }
+ };
+
+ var me = _moment__default.defineLocale('me', {
+ months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
+ monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
+ weekdays: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],
+ weekdaysShort: ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'],
+ weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
+ longDateFormat: {
+ LT: 'H:mm',
+ LTS : 'LT:ss',
+ L: 'DD. MM. YYYY',
+ LL: 'D. MMMM YYYY',
+ LLL: 'D. MMMM YYYY LT',
+ LLLL: 'dddd, D. MMMM YYYY LT'
+ },
+ calendar: {
+ sameDay: '[danas u] LT',
+ nextDay: '[sjutra u] LT',
+
+ nextWeek: function () {
+ switch (this.day()) {
+ case 0:
+ return '[u] [nedjelju] [u] LT';
+ case 3:
+ return '[u] [srijedu] [u] LT';
+ case 6:
+ return '[u] [subotu] [u] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[u] dddd [u] LT';
+ }
+ },
+ lastDay : '[juče u] LT',
+ lastWeek : function () {
+ var lastWeekDays = [
+ '[prošle] [nedjelje] [u] LT',
+ '[prošlog] [ponedjeljka] [u] LT',
+ '[prošlog] [utorka] [u] LT',
+ '[prošle] [srijede] [u] LT',
+ '[prošlog] [četvrtka] [u] LT',
+ '[prošlog] [petka] [u] LT',
+ '[prošle] [subote] [u] LT'
+ ];
+ return lastWeekDays[this.day()];
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : 'za %s',
+ past : 'prije %s',
+ s : 'nekoliko sekundi',
+ m : me__translator.translate,
+ mm : me__translator.translate,
+ h : me__translator.translate,
+ hh : me__translator.translate,
+ d : 'dan',
+ dd : me__translator.translate,
+ M : 'mjesec',
+ MM : me__translator.translate,
+ y : 'godinu',
+ yy : me__translator.translate
+ },
+ ordinalParse: /\d{1,2}\./,
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+
+ //! moment.js locale configuration
+ //! locale : macedonian (mk)
+ //! author : Borislav Mickov : https://github.com/B0k0
+
+ var mk = _moment__default.defineLocale('mk', {
months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'),
monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'),
@@ -6638,6 +7187,7 @@
weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'D.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -6678,6 +7228,7 @@
y : 'година',
yy : '%d години'
},
+ ordinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
ordinal : function (number) {
var lastDigit = number % 10,
last2Digits = number % 100;
@@ -6702,15 +7253,12 @@
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : malayalam (ml)
-// author : Floyd Pink : https://github.com/floydpink
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('ml', {
+
+ //! moment.js locale configuration
+ //! locale : malayalam (ml)
+ //! author : Floyd Pink : https://github.com/floydpink
+
+ var ml = _moment__default.defineLocale('ml', {
months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'),
monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'),
weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'),
@@ -6718,6 +7266,7 @@
weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
longDateFormat : {
LT : 'A h:mm -നു',
+ LTS : 'A h:mm:ss -നു',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -6746,6 +7295,10 @@
y : 'ഒരു വർഷം',
yy : '%d വർഷം'
},
+ meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
+ isPM : function (input) {
+ return /^(ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി)$/.test(input);
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'രാത്രി';
@@ -6760,15 +7313,12 @@
}
}
});
-}));
-// moment.js locale configuration
-// locale : Marathi (mr)
-// author : Harshad Kale : https://github.com/kalehv
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : Marathi (mr)
+ //! author : Harshad Kale : https://github.com/kalehv
+
+ var mr__symbolMap = {
'1': '१',
'2': '२',
'3': '३',
@@ -6780,7 +7330,7 @@
'9': '९',
'0': '०'
},
- numberMap = {
+ mr__numberMap = {
'१': '1',
'२': '2',
'३': '3',
@@ -6793,7 +7343,7 @@
'०': '0'
};
- return moment.defineLocale('mr', {
+ var mr = _moment__default.defineLocale('mr', {
months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'),
monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'),
weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
@@ -6801,6 +7351,7 @@
weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'),
longDateFormat : {
LT : 'A h:mm वाजता',
+ LTS : 'A h:mm:ss वाजता',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -6831,16 +7382,30 @@
},
preparse: function (string) {
return string.replace(/[१२३४५६७८९०]/g, function (match) {
- return numberMap[match];
+ return mr__numberMap[match];
});
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return mr__symbolMap[match];
});
},
- meridiem: function (hour, minute, isLower)
- {
+ meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'रात्री') {
+ return hour < 4 ? hour : hour + 12;
+ } else if (meridiem === 'सकाळी') {
+ return hour;
+ } else if (meridiem === 'दुपारी') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'सायंकाळी') {
+ return hour + 12;
+ }
+ },
+ meridiem: function (hour, minute, isLower) {
if (hour < 4) {
return 'रात्री';
} else if (hour < 10) {
@@ -6858,15 +7423,12 @@
doy : 6 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Bahasa Malaysia (ms-MY)
-// author : Weldan Jamili : https://github.com/weldan
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('ms-my', {
+
+ //! moment.js locale configuration
+ //! locale : Bahasa Malaysia (ms-MY)
+ //! author : Weldan Jamili : https://github.com/weldan
+
+ var ms_my = _moment__default.defineLocale('ms-my', {
months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'),
monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
@@ -6874,11 +7436,25 @@
weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
longDateFormat : {
LT : 'HH.mm',
+ LTS : 'LT.ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY [pukul] LT',
LLLL : 'dddd, D MMMM YYYY [pukul] LT'
},
+ meridiemParse: /pagi|tengahari|petang|malam/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'pagi') {
+ return hour;
+ } else if (meridiem === 'tengahari') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === 'petang' || meridiem === 'malam') {
+ return hour + 12;
+ }
+ },
meridiem : function (hours, minutes, isLower) {
if (hours < 11) {
return 'pagi';
@@ -6918,15 +7494,12 @@
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Burmese (my)
-// author : Squar team, mysquar.com
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : Burmese (my)
+ //! author : Squar team, mysquar.com
+
+ var my__symbolMap = {
'1': '၁',
'2': '၂',
'3': '၃',
@@ -6937,7 +7510,7 @@
'8': '၈',
'9': '၉',
'0': '၀'
- }, numberMap = {
+ }, my__numberMap = {
'၁': '1',
'၂': '2',
'၃': '3',
@@ -6949,14 +7522,17 @@
'၉': '9',
'၀': '0'
};
- return moment.defineLocale('my', {
+
+ var my = _moment__default.defineLocale('my', {
months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'),
monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'),
- weekdaysShort: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
- weekdaysMin: 'နွေ_လာ_င်္ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+ weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+ weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
+
longDateFormat: {
LT: 'HH:mm',
+ LTS: 'HH:mm:ss',
L: 'DD/MM/YYYY',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY LT',
@@ -6987,12 +7563,12 @@
},
preparse: function (string) {
return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
- return numberMap[match];
+ return my__numberMap[match];
});
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return my__symbolMap[match];
});
},
week: {
@@ -7000,16 +7576,13 @@
doy: 4 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : norwegian bokmål (nb)
-// authors : Espen Hovlandsdal : https://github.com/rexxars
-// Sigurd Gartmann : https://github.com/sigurdga
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('nb', {
+
+ //! moment.js locale configuration
+ //! locale : norwegian bokmål (nb)
+ //! authors : Espen Hovlandsdal : https://github.com/rexxars
+ //! Sigurd Gartmann : https://github.com/sigurdga
+
+ var nb = _moment__default.defineLocale('nb', {
months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
@@ -7017,6 +7590,7 @@
weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'),
longDateFormat : {
LT : 'H.mm',
+ LTS : 'LT.ss',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY [kl.] LT',
@@ -7045,21 +7619,19 @@
y : 'ett år',
yy : '%d år'
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : nepali/nepalese
-// author : suvash : https://github.com/suvash
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var symbolMap = {
+
+ //! moment.js locale configuration
+ //! locale : nepali/nepalese
+ //! author : suvash : https://github.com/suvash
+
+ var ne__symbolMap = {
'1': '१',
'2': '२',
'3': '३',
@@ -7071,7 +7643,7 @@
'9': '९',
'0': '०'
},
- numberMap = {
+ ne__numberMap = {
'१': '1',
'२': '2',
'३': '3',
@@ -7084,7 +7656,7 @@
'०': '0'
};
- return moment.defineLocale('ne', {
+ var ne = _moment__default.defineLocale('ne', {
months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'),
monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'),
weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'),
@@ -7092,6 +7664,7 @@
weekdaysMin : 'आइ._सो._मङ्_बु._बि._शु._श.'.split('_'),
longDateFormat : {
LT : 'Aको h:mm बजे',
+ LTS : 'Aको h:mm:ss बजे',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -7099,14 +7672,29 @@
},
preparse: function (string) {
return string.replace(/[१२३४५६७८९०]/g, function (match) {
- return numberMap[match];
+ return ne__numberMap[match];
});
},
postformat: function (string) {
return string.replace(/\d/g, function (match) {
- return symbolMap[match];
+ return ne__symbolMap[match];
});
},
+ meridiemParse: /राती|बिहान|दिउँसो|बेलुका|साँझ|राती/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'राती') {
+ return hour < 3 ? hour : hour + 12;
+ } else if (meridiem === 'बिहान') {
+ return hour;
+ } else if (meridiem === 'दिउँसो') {
+ return hour >= 10 ? hour : hour + 12;
+ } else if (meridiem === 'बेलुका' || meridiem === 'साँझ') {
+ return hour + 12;
+ }
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 3) {
return 'राती';
@@ -7150,24 +7738,21 @@
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : dutch (nl)
-// author : Joris Röling : https://github.com/jjupiter
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
- monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
-
- return moment.defineLocale('nl', {
+
+ //! moment.js locale configuration
+ //! locale : dutch (nl)
+ //! author : Joris Röling : https://github.com/jjupiter
+
+ var nl__monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+ nl__monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_');
+
+ var nl = _moment__default.defineLocale('nl', {
months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'),
monthsShort : function (m, format) {
if (/-MMM-/.test(format)) {
- return monthsShortWithoutDots[m.month()];
+ return nl__monthsShortWithoutDots[m.month()];
} else {
- return monthsShortWithDots[m.month()];
+ return nl__monthsShortWithDots[m.month()];
}
},
weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
@@ -7175,6 +7760,7 @@
weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD-MM-YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -7203,6 +7789,7 @@
y : 'één jaar',
yy : '%d jaar'
},
+ ordinalParse: /\d{1,2}(ste|de)/,
ordinal : function (number) {
return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
},
@@ -7211,15 +7798,12 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : norwegian nynorsk (nn)
-// author : https://github.com/mechuwind
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('nn', {
+
+ //! moment.js locale configuration
+ //! locale : norwegian nynorsk (nn)
+ //! author : https://github.com/mechuwind
+
+ var nn = _moment__default.defineLocale('nn', {
months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'),
monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
@@ -7227,6 +7811,7 @@
weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -7255,48 +7840,49 @@
y : 'eit år',
yy : '%d år'
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : polish (pl)
-// author : Rafal Hirsz : https://github.com/evoL
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
+
+ //! moment.js locale configuration
+ //! locale : polish (pl)
+ //! author : Rafal Hirsz : https://github.com/evoL
+
var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'),
monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_');
-
- function plural(n) {
+ function pl__plural(n) {
return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1);
}
-
- function translate(number, withoutSuffix, key) {
+ function pl__translate(number, withoutSuffix, key) {
var result = number + ' ';
switch (key) {
case 'm':
return withoutSuffix ? 'minuta' : 'minutę';
case 'mm':
- return result + (plural(number) ? 'minuty' : 'minut');
+ return result + (pl__plural(number) ? 'minuty' : 'minut');
case 'h':
return withoutSuffix ? 'godzina' : 'godzinę';
case 'hh':
- return result + (plural(number) ? 'godziny' : 'godzin');
+ return result + (pl__plural(number) ? 'godziny' : 'godzin');
case 'MM':
- return result + (plural(number) ? 'miesiące' : 'miesięcy');
+ return result + (pl__plural(number) ? 'miesiące' : 'miesięcy');
case 'yy':
- return result + (plural(number) ? 'lata' : 'lat');
+ return result + (pl__plural(number) ? 'lata' : 'lat');
}
}
- return moment.defineLocale('pl', {
+ var pl = _moment__default.defineLocale('pl', {
months : function (momentToFormat, format) {
- if (/D MMMM/.test(format)) {
+ if (format === '') {
+ // Hack: if format empty we know this is used to generate
+ // RegExp by moment. Give then back both valid forms of months
+ // in RegExp ready format.
+ return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')';
+ } else if (/D MMMM/.test(format)) {
return monthsSubjective[momentToFormat.month()];
} else {
return monthsNominative[momentToFormat.month()];
@@ -7308,6 +7894,7 @@
weekdaysMin : 'N_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -7336,39 +7923,38 @@
future : 'za %s',
past : '%s temu',
s : 'kilka sekund',
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
+ m : pl__translate,
+ mm : pl__translate,
+ h : pl__translate,
+ hh : pl__translate,
d : '1 dzień',
dd : '%d dni',
M : 'miesiąc',
- MM : translate,
+ MM : pl__translate,
y : 'rok',
- yy : translate
+ yy : pl__translate
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : brazilian portuguese (pt-br)
-// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('pt-br', {
- months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
- monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
- weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
- weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
- weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+
+ //! moment.js locale configuration
+ //! locale : brazilian portuguese (pt-br)
+ //! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+ var pt_br = _moment__default.defineLocale('pt-br', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D [de] MMMM [de] YYYY',
LLL : 'D [de] MMMM [de] YYYY [às] LT',
@@ -7401,24 +7987,23 @@
y : 'um ano',
yy : '%d anos'
},
+ ordinalParse: /\d{1,2}º/,
ordinal : '%dº'
});
-}));
-// moment.js locale configuration
-// locale : portuguese (pt)
-// author : Jefferson : https://github.com/jalex79
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('pt', {
- months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
- monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
- weekdays : 'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split('_'),
- weekdaysShort : 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
- weekdaysMin : 'dom_2ª_3ª_4ª_5ª_6ª_sáb'.split('_'),
+
+ //! moment.js locale configuration
+ //! locale : portuguese (pt)
+ //! author : Jefferson : https://github.com/jalex79
+
+ var pt = _moment__default.defineLocale('pt', {
+ months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
+ monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
+ weekdays : 'Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado'.split('_'),
+ weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
+ weekdaysMin : 'Dom_2ª_3ª_4ª_5ª_6ª_Sáb'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D [de] MMMM [de] YYYY',
LLL : 'D [de] MMMM [de] YYYY LT',
@@ -7451,22 +8036,20 @@
y : 'um ano',
yy : '%d anos'
},
+ ordinalParse: /\d{1,2}º/,
ordinal : '%dº',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : romanian (ro)
-// author : Vlad Gurdiga : https://github.com/gurdiga
-// author : Valentin Agachi : https://github.com/avaly
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function relativeTimeWithPlural(number, withoutSuffix, key) {
+
+ //! moment.js locale configuration
+ //! locale : romanian (ro)
+ //! author : Vlad Gurdiga : https://github.com/gurdiga
+ //! author : Valentin Agachi : https://github.com/avaly
+
+ function ro__relativeTimeWithPlural(number, withoutSuffix, key) {
var format = {
'mm': 'minute',
'hh': 'ore',
@@ -7478,11 +8061,10 @@
if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
separator = ' de ';
}
-
return number + separator + format[key];
}
- return moment.defineLocale('ro', {
+ var ro = _moment__default.defineLocale('ro', {
months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'),
monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'),
weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
@@ -7490,6 +8072,7 @@
weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY H:mm',
@@ -7508,36 +8091,32 @@
past : '%s în urmă',
s : 'câteva secunde',
m : 'un minut',
- mm : relativeTimeWithPlural,
+ mm : ro__relativeTimeWithPlural,
h : 'o oră',
- hh : relativeTimeWithPlural,
+ hh : ro__relativeTimeWithPlural,
d : 'o zi',
- dd : relativeTimeWithPlural,
+ dd : ro__relativeTimeWithPlural,
M : 'o lună',
- MM : relativeTimeWithPlural,
+ MM : ro__relativeTimeWithPlural,
y : 'un an',
- yy : relativeTimeWithPlural
+ yy : ro__relativeTimeWithPlural
},
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : russian (ru)
-// author : Viktorminator : https://github.com/Viktorminator
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function plural(word, num) {
+
+ //! moment.js locale configuration
+ //! locale : russian (ru)
+ //! author : Viktorminator : https://github.com/Viktorminator
+ //! Author : Menelion Elensúle : https://github.com/Oire
+
+ function ru__plural(word, num) {
var forms = word.split('_');
return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
}
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
+ function ru__relativeTimeWithPlural(number, withoutSuffix, key) {
var format = {
'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
'hh': 'час_часа_часов',
@@ -7549,58 +8128,50 @@
return withoutSuffix ? 'минута' : 'минуту';
}
else {
- return number + ' ' + plural(format[key], +number);
+ return number + ' ' + ru__plural(format[key], +number);
}
}
-
- function monthsCaseReplace(m, format) {
+ function ru__monthsCaseReplace(m, format) {
var months = {
'nominative': 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
'accusative': 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_')
},
-
nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
'accusative' :
'nominative';
-
return months[nounCase][m.month()];
}
-
- function monthsShortCaseReplace(m, format) {
+ function ru__monthsShortCaseReplace(m, format) {
var monthsShort = {
- 'nominative': 'янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
+ 'nominative': 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'),
'accusative': 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_')
},
-
nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
'accusative' :
'nominative';
-
return monthsShort[nounCase][m.month()];
}
-
- function weekdaysCaseReplace(m, format) {
+ function ru__weekdaysCaseReplace(m, format) {
var weekdays = {
'nominative': 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
'accusative': 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_')
},
-
- nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/).test(format) ?
+ nounCase = (/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/).test(format) ?
'accusative' :
'nominative';
-
return weekdays[nounCase][m.day()];
}
- return moment.defineLocale('ru', {
- months : monthsCaseReplace,
- monthsShort : monthsShortCaseReplace,
- weekdays : weekdaysCaseReplace,
+ var ru = _moment__default.defineLocale('ru', {
+ months : ru__monthsCaseReplace,
+ monthsShort : ru__monthsShortCaseReplace,
+ weekdays : ru__weekdaysCaseReplace,
weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
monthsParse : [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|я]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i],
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY г.',
LLL : 'D MMMM YYYY г., LT',
@@ -7613,18 +8184,26 @@
nextWeek: function () {
return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
},
- lastWeek: function () {
- switch (this.day()) {
- case 0:
- return '[В прошлое] dddd [в] LT';
- case 1:
- case 2:
- case 4:
- return '[В прошлый] dddd [в] LT';
- case 3:
- case 5:
- case 6:
- return '[В прошлую] dddd [в] LT';
+ lastWeek: function (now) {
+ if (now.week() !== this.week()) {
+ switch (this.day()) {
+ case 0:
+ return '[В прошлое] dddd [в] LT';
+ case 1:
+ case 2:
+ case 4:
+ return '[В прошлый] dddd [в] LT';
+ case 3:
+ case 5:
+ case 6:
+ return '[В прошлую] dddd [в] LT';
+ }
+ } else {
+ if (this.day() === 2) {
+ return '[Во] dddd [в] LT';
+ } else {
+ return '[В] dddd [в] LT';
+ }
}
},
sameElse: 'L'
@@ -7633,23 +8212,21 @@
future : 'через %s',
past : '%s назад',
s : 'несколько секунд',
- m : relativeTimeWithPlural,
- mm : relativeTimeWithPlural,
+ m : ru__relativeTimeWithPlural,
+ mm : ru__relativeTimeWithPlural,
h : 'час',
- hh : relativeTimeWithPlural,
+ hh : ru__relativeTimeWithPlural,
d : 'день',
- dd : relativeTimeWithPlural,
+ dd : ru__relativeTimeWithPlural,
M : 'месяц',
- MM : relativeTimeWithPlural,
+ MM : ru__relativeTimeWithPlural,
y : 'год',
- yy : relativeTimeWithPlural
+ yy : ru__relativeTimeWithPlural
},
-
meridiemParse: /ночи|утра|дня|вечера/i,
isPM : function (input) {
return /^(дня|вечера)$/.test(input);
},
-
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'ночи';
@@ -7661,7 +8238,7 @@
return 'вечера';
}
},
-
+ ordinalParse: /\d{1,2}-(й|го|я)/,
ordinal: function (number, period) {
switch (period) {
case 'M':
@@ -7677,29 +8254,77 @@
return number;
}
},
-
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : slovak (sk)
-// author : Martin Minka : https://github.com/k2s
-// based on work of petrbela : https://github.com/petrbela
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
- monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
-
- function plural(n) {
+
+ //! moment.js locale configuration
+ //! locale : Sinhalese (si)
+ //! author : Sampath Sitinamaluwa : https://github.com/sampathsris
+
+ var si = _moment__default.defineLocale('si', {
+ months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'),
+ monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'),
+ weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'),
+ weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
+ weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
+ longDateFormat : {
+ LT : 'a h:mm',
+ LTS : 'a h:mm:ss',
+ L : 'YYYY/MM/DD',
+ LL : 'YYYY MMMM D',
+ LLL : 'YYYY MMMM D, LT',
+ LLLL : 'YYYY MMMM D [වැනි] dddd, LTS'
+ },
+ calendar : {
+ sameDay : '[අද] LT[ට]',
+ nextDay : '[හෙට] LT[ට]',
+ nextWeek : 'dddd LT[ට]',
+ lastDay : '[ඊයේ] LT[ට]',
+ lastWeek : '[පසුගිය] dddd LT[ට]',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : '%sකින්',
+ past : '%sකට පෙර',
+ s : 'තත්පර කිහිපය',
+ m : 'මිනිත්තුව',
+ mm : 'මිනිත්තු %d',
+ h : 'පැය',
+ hh : 'පැය %d',
+ d : 'දිනය',
+ dd : 'දින %d',
+ M : 'මාසය',
+ MM : 'මාස %d',
+ y : 'වසර',
+ yy : 'වසර %d'
+ },
+ ordinalParse: /\d{1,2} වැනි/,
+ ordinal : function (number) {
+ return number + ' වැනි';
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'ප.ව.' : 'පස් වරු';
+ } else {
+ return isLower ? 'පෙ.ව.' : 'පෙර වරු';
+ }
+ }
+ });
+
+ //! moment.js locale configuration
+ //! locale : slovak (sk)
+ //! author : Martin Minka : https://github.com/k2s
+ //! based on work of petrbela : https://github.com/petrbela
+
+ var sk__months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'),
+ sk__monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
+ function sk__plural(n) {
return (n > 1) && (n < 5);
}
-
- function translate(number, withoutSuffix, key, isFuture) {
+ function sk__translate(number, withoutSuffix, key, isFuture) {
var result = number + ' ';
switch (key) {
case 's': // a few seconds / in a few seconds / a few seconds ago
@@ -7708,7 +8333,7 @@
return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'minúty' : 'minút');
+ return result + (sk__plural(number) ? 'minúty' : 'minút');
} else {
return result + 'minútami';
}
@@ -7717,7 +8342,7 @@
return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
case 'hh': // 9 hours / in 9 hours / 9 hours ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'hodiny' : 'hodín');
+ return result + (sk__plural(number) ? 'hodiny' : 'hodín');
} else {
return result + 'hodinami';
}
@@ -7726,7 +8351,7 @@
return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
case 'dd': // 9 days / in 9 days / 9 days ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'dni' : 'dní');
+ return result + (sk__plural(number) ? 'dni' : 'dní');
} else {
return result + 'dňami';
}
@@ -7735,7 +8360,7 @@
return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
case 'MM': // 9 months / in 9 months / 9 months ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'mesiace' : 'mesiacov');
+ return result + (sk__plural(number) ? 'mesiace' : 'mesiacov');
} else {
return result + 'mesiacmi';
}
@@ -7744,7 +8369,7 @@
return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
case 'yy': // 9 years / in 9 years / 9 years ago
if (withoutSuffix || isFuture) {
- return result + (plural(number) ? 'roky' : 'rokov');
+ return result + (sk__plural(number) ? 'roky' : 'rokov');
} else {
return result + 'rokmi';
}
@@ -7752,9 +8377,9 @@
}
}
- return moment.defineLocale('sk', {
- months : months,
- monthsShort : monthsShort,
+ var sk = _moment__default.defineLocale('sk', {
+ months : sk__months,
+ monthsShort : sk__monthsShort,
monthsParse : (function (months, monthsShort) {
var i, _monthsParse = [];
for (i = 0; i < 12; i++) {
@@ -7762,12 +8387,13 @@
_monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
}
return _monthsParse;
- }(months, monthsShort)),
+ }(sk__months, sk__monthsShort)),
weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'),
weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'),
longDateFormat : {
LT: 'H:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
@@ -7815,94 +8441,102 @@
relativeTime : {
future : 'za %s',
past : 'pred %s',
- s : translate,
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : translate,
- dd : translate,
- M : translate,
- MM : translate,
- y : translate,
- yy : translate
- },
+ s : sk__translate,
+ m : sk__translate,
+ mm : sk__translate,
+ h : sk__translate,
+ hh : sk__translate,
+ d : sk__translate,
+ dd : sk__translate,
+ M : sk__translate,
+ MM : sk__translate,
+ y : sk__translate,
+ yy : sk__translate
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : slovenian (sl)
-// author : Robert Sedovšek : https://github.com/sedovsek
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function translate(number, withoutSuffix, key) {
+
+ //! moment.js locale configuration
+ //! locale : slovenian (sl)
+ //! author : Robert Sedovšek : https://github.com/sedovsek
+
+ function sl__processRelativeTime(number, withoutSuffix, key, isFuture) {
var result = number + ' ';
switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami';
case 'm':
return withoutSuffix ? 'ena minuta' : 'eno minuto';
case 'mm':
if (number === 1) {
- result += 'minuta';
+ result += withoutSuffix ? 'minuta' : 'minuto';
} else if (number === 2) {
- result += 'minuti';
- } else if (number === 3 || number === 4) {
- result += 'minute';
+ result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'minute' : 'minutami';
} else {
- result += 'minut';
+ result += withoutSuffix || isFuture ? 'minut' : 'minutami';
}
return result;
case 'h':
return withoutSuffix ? 'ena ura' : 'eno uro';
case 'hh':
if (number === 1) {
- result += 'ura';
+ result += withoutSuffix ? 'ura' : 'uro';
} else if (number === 2) {
- result += 'uri';
- } else if (number === 3 || number === 4) {
- result += 'ure';
+ result += withoutSuffix || isFuture ? 'uri' : 'urama';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'ure' : 'urami';
} else {
- result += 'ur';
+ result += withoutSuffix || isFuture ? 'ur' : 'urami';
}
return result;
+ case 'd':
+ return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
case 'dd':
if (number === 1) {
- result += 'dan';
+ result += withoutSuffix || isFuture ? 'dan' : 'dnem';
+ } else if (number === 2) {
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
} else {
- result += 'dni';
+ result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
}
return result;
+ case 'M':
+ return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
case 'MM':
if (number === 1) {
- result += 'mesec';
+ result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
} else if (number === 2) {
- result += 'meseca';
- } else if (number === 3 || number === 4) {
- result += 'mesece';
+ result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
} else {
- result += 'mesecev';
+ result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
}
return result;
+ case 'y':
+ return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
case 'yy':
if (number === 1) {
- result += 'leto';
+ result += withoutSuffix || isFuture ? 'leto' : 'letom';
} else if (number === 2) {
- result += 'leti';
- } else if (number === 3 || number === 4) {
- result += 'leta';
+ result += withoutSuffix || isFuture ? 'leti' : 'letoma';
+ } else if (number < 5) {
+ result += withoutSuffix || isFuture ? 'leta' : 'leti';
} else {
- result += 'let';
+ result += withoutSuffix || isFuture ? 'let' : 'leti';
}
return result;
}
}
- return moment.defineLocale('sl', {
+ var sl = _moment__default.defineLocale('sl', {
months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'),
monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'),
weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
@@ -7910,6 +8544,7 @@
weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'),
longDateFormat : {
LT : 'H:mm',
+ LTS : 'LT:ss',
L : 'DD. MM. YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY LT',
@@ -7938,9 +8573,11 @@
lastWeek : function () {
switch (this.day()) {
case 0:
+ return '[prejšnjo] [nedeljo] [ob] LT';
case 3:
+ return '[prejšnjo] [sredo] [ob] LT';
case 6:
- return '[prejšnja] dddd [ob] LT';
+ return '[prejšnjo] [soboto] [ob] LT';
case 1:
case 2:
case 4:
@@ -7952,46 +8589,49 @@
},
relativeTime : {
future : 'čez %s',
- past : '%s nazaj',
- s : 'nekaj sekund',
- m : translate,
- mm : translate,
- h : translate,
- hh : translate,
- d : 'en dan',
- dd : translate,
- M : 'en mesec',
- MM : translate,
- y : 'eno leto',
- yy : translate
- },
+ past : 'pred %s',
+ s : sl__processRelativeTime,
+ m : sl__processRelativeTime,
+ mm : sl__processRelativeTime,
+ h : sl__processRelativeTime,
+ hh : sl__processRelativeTime,
+ d : sl__processRelativeTime,
+ dd : sl__processRelativeTime,
+ M : sl__processRelativeTime,
+ MM : sl__processRelativeTime,
+ y : sl__processRelativeTime,
+ yy : sl__processRelativeTime
+ },
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Albanian (sq)
-// author : Flakërim Ismani : https://github.com/flakerimi
-// author: Menelion Elensúle: https://github.com/Oire (tests)
-// author : Oerd Cukalla : https://github.com/oerd (fixes)
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('sq', {
+
+ //! moment.js locale configuration
+ //! locale : Albanian (sq)
+ //! author : Flakërim Ismani : https://github.com/flakerimi
+ //! author: Menelion Elensúle: https://github.com/Oire (tests)
+ //! author : Oerd Cukalla : https://github.com/oerd (fixes)
+
+ var sq = _moment__default.defineLocale('sq', {
months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'),
monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'),
weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'),
+ meridiemParse: /PD|MD/,
+ isPM: function (input) {
+ return input.charAt(0) === 'M';
+ },
meridiem : function (hours, minutes, isLower) {
return hours < 12 ? 'PD' : 'MD';
},
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -8020,21 +8660,19 @@
y : 'një vit',
yy : '%d vite'
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Serbian-cyrillic (sr-cyrl)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var translator = {
+
+ //! moment.js locale configuration
+ //! locale : Serbian-cyrillic (sr-cyrl)
+ //! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+ var sr_cyrl__translator = {
words: { //Different grammatical cases
m: ['један минут', 'једне минуте'],
mm: ['минут', 'минуте', 'минута'],
@@ -8048,16 +8686,16 @@
return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
},
translate: function (number, withoutSuffix, key) {
- var wordKey = translator.words[key];
+ var wordKey = sr_cyrl__translator.words[key];
if (key.length === 1) {
return withoutSuffix ? wordKey[0] : wordKey[1];
} else {
- return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ return number + ' ' + sr_cyrl__translator.correctGrammaticalCase(number, wordKey);
}
}
};
- return moment.defineLocale('sr-cyrl', {
+ var sr_cyrl = _moment__default.defineLocale('sr-cyrl', {
months: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],
monthsShort: ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'],
weekdays: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],
@@ -8065,6 +8703,7 @@
weekdaysMin: ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'],
longDateFormat: {
LT: 'H:mm',
+ LTS : 'LT:ss',
L: 'DD. MM. YYYY',
LL: 'D. MMMM YYYY',
LLL: 'D. MMMM YYYY LT',
@@ -8073,7 +8712,6 @@
calendar: {
sameDay: '[данас у] LT',
nextDay: '[сутра у] LT',
-
nextWeek: function () {
switch (this.day()) {
case 0:
@@ -8108,32 +8746,30 @@
future : 'за %s',
past : 'пре %s',
s : 'неколико секунди',
- m : translator.translate,
- mm : translator.translate,
- h : translator.translate,
- hh : translator.translate,
+ m : sr_cyrl__translator.translate,
+ mm : sr_cyrl__translator.translate,
+ h : sr_cyrl__translator.translate,
+ hh : sr_cyrl__translator.translate,
d : 'дан',
- dd : translator.translate,
+ dd : sr_cyrl__translator.translate,
M : 'месец',
- MM : translator.translate,
+ MM : sr_cyrl__translator.translate,
y : 'годину',
- yy : translator.translate
+ yy : sr_cyrl__translator.translate
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Serbian-latin (sr)
-// author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var translator = {
+
+ //! moment.js locale configuration
+ //! locale : Serbian-latin (sr)
+ //! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
+
+ var sr__translator = {
words: { //Different grammatical cases
m: ['jedan minut', 'jedne minute'],
mm: ['minut', 'minute', 'minuta'],
@@ -8147,16 +8783,16 @@
return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]);
},
translate: function (number, withoutSuffix, key) {
- var wordKey = translator.words[key];
+ var wordKey = sr__translator.words[key];
if (key.length === 1) {
return withoutSuffix ? wordKey[0] : wordKey[1];
} else {
- return number + ' ' + translator.correctGrammaticalCase(number, wordKey);
+ return number + ' ' + sr__translator.correctGrammaticalCase(number, wordKey);
}
}
};
- return moment.defineLocale('sr', {
+ var sr = _moment__default.defineLocale('sr', {
months: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],
monthsShort: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],
weekdays: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],
@@ -8164,6 +8800,7 @@
weekdaysMin: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],
longDateFormat: {
LT: 'H:mm',
+ LTS : 'LT:ss',
L: 'DD. MM. YYYY',
LL: 'D. MMMM YYYY',
LLL: 'D. MMMM YYYY LT',
@@ -8172,7 +8809,6 @@
calendar: {
sameDay: '[danas u] LT',
nextDay: '[sutra u] LT',
-
nextWeek: function () {
switch (this.day()) {
case 0:
@@ -8207,32 +8843,30 @@
future : 'za %s',
past : 'pre %s',
s : 'nekoliko sekundi',
- m : translator.translate,
- mm : translator.translate,
- h : translator.translate,
- hh : translator.translate,
+ m : sr__translator.translate,
+ mm : sr__translator.translate,
+ h : sr__translator.translate,
+ hh : sr__translator.translate,
d : 'dan',
- dd : translator.translate,
+ dd : sr__translator.translate,
M : 'mesec',
- MM : translator.translate,
+ MM : sr__translator.translate,
y : 'godinu',
- yy : translator.translate
+ yy : sr__translator.translate
},
+ ordinalParse: /\d{1,2}\./,
ordinal : '%d.',
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : swedish (sv)
-// author : Jens Alm : https://github.com/ulmus
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('sv', {
+
+ //! moment.js locale configuration
+ //! locale : swedish (sv)
+ //! author : Jens Alm : https://github.com/ulmus
+
+ var sv = _moment__default.defineLocale('sv', {
months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'),
monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
@@ -8240,6 +8874,7 @@
weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'YYYY-MM-DD',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -8249,8 +8884,8 @@
sameDay: '[Idag] LT',
nextDay: '[Imorgon] LT',
lastDay: '[Igår] LT',
- nextWeek: 'dddd LT',
- lastWeek: '[Förra] dddd[en] LT',
+ nextWeek: '[På] dddd LT',
+ lastWeek: '[I] dddd[s] LT',
sameElse: 'L'
},
relativeTime : {
@@ -8268,6 +8903,7 @@
y : 'ett år',
yy : '%d år'
},
+ ordinalParse: /\d{1,2}(e|a)/,
ordinal : function (number) {
var b = number % 10,
output = (~~(number % 100 / 10) === 1) ? 'e' :
@@ -8281,40 +8917,12 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : tamil (ta)
-// author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- /*var symbolMap = {
- '1': '௧',
- '2': '௨',
- '3': '௩',
- '4': '௪',
- '5': '௫',
- '6': '௬',
- '7': '௭',
- '8': '௮',
- '9': '௯',
- '0': '௦'
- },
- numberMap = {
- '௧': '1',
- '௨': '2',
- '௩': '3',
- '௪': '4',
- '௫': '5',
- '௬': '6',
- '௭': '7',
- '௮': '8',
- '௯': '9',
- '௦': '0'
- }; */
-
- return moment.defineLocale('ta', {
+
+ //! moment.js locale configuration
+ //! locale : tamil (ta)
+ //! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404
+
+ var ta = _moment__default.defineLocale('ta', {
months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'),
weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'),
@@ -8322,6 +8930,7 @@
weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY, LT',
@@ -8350,36 +8959,41 @@
y : 'ஒரு வருடம்',
yy : '%d ஆண்டுகள்'
},
-/* preparse: function (string) {
- return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
- return numberMap[match];
- });
- },
- postformat: function (string) {
- return string.replace(/\d/g, function (match) {
- return symbolMap[match];
- });
- },*/
+ ordinalParse: /\d{1,2}வது/,
ordinal : function (number) {
return number + 'வது';
},
-
-
// refer http://ta.wikipedia.org/s/1er1
-
+ meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
meridiem : function (hour, minute, isLower) {
- if (hour >= 6 && hour <= 10) {
- return ' காலை';
- } else if (hour >= 10 && hour <= 14) {
- return ' நண்பகல்';
- } else if (hour >= 14 && hour <= 18) {
- return ' எற்பாடு';
- } else if (hour >= 18 && hour <= 20) {
- return ' மாலை';
- } else if (hour >= 20 && hour <= 24) {
- return ' இரவு';
- } else if (hour >= 0 && hour <= 6) {
- return ' வைகறை';
+ if (hour < 2) {
+ return ' யாமம்';
+ } else if (hour < 6) {
+ return ' வைகறை'; // வைகறை
+ } else if (hour < 10) {
+ return ' காலை'; // காலை
+ } else if (hour < 14) {
+ return ' நண்பகல்'; // நண்பகல்
+ } else if (hour < 18) {
+ return ' எற்பாடு'; // எற்பாடு
+ } else if (hour < 22) {
+ return ' மாலை'; // மாலை
+ } else {
+ return ' யாமம்';
+ }
+ },
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === 'யாமம்') {
+ return hour < 2 ? hour : hour + 12;
+ } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
+ return hour;
+ } else if (meridiem === 'நண்பகல்') {
+ return hour >= 10 ? hour : hour + 12;
+ } else {
+ return hour + 12;
}
},
week : {
@@ -8387,15 +9001,12 @@
doy : 6 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : thai (th)
-// author : Kridsada Thanabulpong : https://github.com/sirn
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('th', {
+
+ //! moment.js locale configuration
+ //! locale : thai (th)
+ //! author : Kridsada Thanabulpong : https://github.com/sirn
+
+ var th = _moment__default.defineLocale('th', {
months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'),
monthsShort : 'มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา'.split('_'),
weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
@@ -8403,11 +9014,16 @@
weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
longDateFormat : {
LT : 'H นาฬิกา m นาที',
+ LTS : 'LT s วินาที',
L : 'YYYY/MM/DD',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY เวลา LT',
LLLL : 'วันddddที่ D MMMM YYYY เวลา LT'
},
+ meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
+ isPM: function (input) {
+ return input === 'หลังเที่ยง';
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 12) {
return 'ก่อนเที่ยง';
@@ -8439,15 +9055,12 @@
yy : '%d ปี'
}
});
-}));
-// moment.js locale configuration
-// locale : Tagalog/Filipino (tl-ph)
-// author : Dan Hagman
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('tl-ph', {
+
+ //! moment.js locale configuration
+ //! locale : Tagalog/Filipino (tl-ph)
+ //! author : Dan Hagman
+
+ var tl_ph = _moment__default.defineLocale('tl-ph', {
months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'),
monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'),
@@ -8455,6 +9068,7 @@
weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'MM/D/YYYY',
LL : 'MMMM D, YYYY',
LLL : 'MMMM D, YYYY LT',
@@ -8483,6 +9097,7 @@
y : 'isang taon',
yy : '%d taon'
},
+ ordinalParse: /\d{1,2}/,
ordinal : function (number) {
return number;
},
@@ -8491,42 +9106,34 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : turkish (tr)
-// authors : Erhan Gundogan : https://github.com/erhangundogan,
-// Burak Yiğit Kaya: https://github.com/BYK
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- var suffixes = {
+
+ //! moment.js locale configuration
+ //! locale : turkish (tr)
+ //! authors : Erhan Gundogan : https://github.com/erhangundogan,
+ //! Burak Yiğit Kaya: https://github.com/BYK
+
+ var tr__suffixes = {
1: '\'inci',
5: '\'inci',
8: '\'inci',
70: '\'inci',
80: '\'inci',
-
2: '\'nci',
7: '\'nci',
20: '\'nci',
50: '\'nci',
-
3: '\'üncü',
4: '\'üncü',
100: '\'üncü',
-
6: '\'ncı',
-
9: '\'uncu',
10: '\'uncu',
30: '\'uncu',
-
60: '\'ıncı',
90: '\'ıncı'
};
- return moment.defineLocale('tr', {
+ var tr = _moment__default.defineLocale('tr', {
months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'),
monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'),
@@ -8534,6 +9141,7 @@
weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -8562,6 +9170,7 @@
y : 'bir yıl',
yy : '%d yıl'
},
+ ordinalParse: /\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,
ordinal : function (number) {
if (number === 0) { // special case for zero
return number + '\'ıncı';
@@ -8569,23 +9178,19 @@
var a = number % 10,
b = number % 100 - a,
c = number >= 100 ? 100 : null;
-
- return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ return number + (tr__suffixes[a] || tr__suffixes[b] || tr__suffixes[c]);
},
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('tzm-latn', {
+
+ //! moment.js locale configuration
+ //! locale : Morocco Central Atlas Tamaziɣt in Latin (tzm-latn)
+ //! author : Abdel Said : https://github.com/abdelsaid
+
+ var tzm_latn = _moment__default.defineLocale('tzm-latn', {
months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'),
weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
@@ -8593,6 +9198,7 @@
weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -8626,15 +9232,12 @@
doy : 12 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : Morocco Central Atlas Tamaziɣt (tzm)
-// author : Abdel Said : https://github.com/abdelsaid
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('tzm', {
+
+ //! moment.js locale configuration
+ //! locale : Morocco Central Atlas Tamaziɣt (tzm)
+ //! author : Abdel Said : https://github.com/abdelsaid
+
+ var tzm = _moment__default.defineLocale('tzm', {
months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'),
weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
@@ -8642,6 +9245,7 @@
weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS: 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -8675,21 +9279,17 @@
doy : 12 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : ukrainian (uk)
-// author : zemlanin : https://github.com/zemlanin
-// Author : Menelion Elensúle : https://github.com/Oire
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- function plural(word, num) {
+
+ //! moment.js locale configuration
+ //! locale : ukrainian (uk)
+ //! author : zemlanin : https://github.com/zemlanin
+ //! Author : Menelion Elensúle : https://github.com/Oire
+
+ function uk__plural(word, num) {
var forms = word.split('_');
return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
}
-
- function relativeTimeWithPlural(number, withoutSuffix, key) {
+ function uk__relativeTimeWithPlural(number, withoutSuffix, key) {
var format = {
'mm': 'хвилина_хвилини_хвилин',
'hh': 'година_години_годин',
@@ -8704,53 +9304,47 @@
return withoutSuffix ? 'година' : 'годину';
}
else {
- return number + ' ' + plural(format[key], +number);
+ return number + ' ' + uk__plural(format[key], +number);
}
}
-
- function monthsCaseReplace(m, format) {
+ function uk__monthsCaseReplace(m, format) {
var months = {
'nominative': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'),
'accusative': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_')
},
-
nounCase = (/D[oD]? *MMMM?/).test(format) ?
'accusative' :
'nominative';
-
return months[nounCase][m.month()];
}
-
- function weekdaysCaseReplace(m, format) {
+ function uk__weekdaysCaseReplace(m, format) {
var weekdays = {
'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'),
'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'),
'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_')
},
-
nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
'accusative' :
((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ?
'genitive' :
'nominative');
-
return weekdays[nounCase][m.day()];
}
-
function processHoursFunction(str) {
return function () {
return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
};
}
- return moment.defineLocale('uk', {
- months : monthsCaseReplace,
+ var uk = _moment__default.defineLocale('uk', {
+ months : uk__monthsCaseReplace,
monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'),
- weekdays : weekdaysCaseReplace,
+ weekdays : uk__weekdaysCaseReplace,
weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD.MM.YYYY',
LL : 'D MMMM YYYY р.',
LLL : 'D MMMM YYYY р., LT',
@@ -8780,20 +9374,22 @@
future : 'за %s',
past : '%s тому',
s : 'декілька секунд',
- m : relativeTimeWithPlural,
- mm : relativeTimeWithPlural,
+ m : uk__relativeTimeWithPlural,
+ mm : uk__relativeTimeWithPlural,
h : 'годину',
- hh : relativeTimeWithPlural,
+ hh : uk__relativeTimeWithPlural,
d : 'день',
- dd : relativeTimeWithPlural,
+ dd : uk__relativeTimeWithPlural,
M : 'місяць',
- MM : relativeTimeWithPlural,
+ MM : uk__relativeTimeWithPlural,
y : 'рік',
- yy : relativeTimeWithPlural
+ yy : uk__relativeTimeWithPlural
},
-
// M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
-
+ meridiemParse: /ночі|ранку|дня|вечора/,
+ isPM: function (input) {
+ return /^(дня|вечора)$/.test(input);
+ },
meridiem : function (hour, minute, isLower) {
if (hour < 4) {
return 'ночі';
@@ -8805,7 +9401,7 @@
return 'вечора';
}
},
-
+ ordinalParse: /\d{1,2}-(й|го)/,
ordinal: function (number, period) {
switch (period) {
case 'M':
@@ -8820,21 +9416,17 @@
return number;
}
},
-
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : uzbek (uz)
-// author : Sardor Muminov : https://github.com/muminoff
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('uz', {
+
+ //! moment.js locale configuration
+ //! locale : uzbek (uz)
+ //! author : Sardor Muminov : https://github.com/muminoff
+
+ var uz = _moment__default.defineLocale('uz', {
months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
@@ -8842,6 +9434,7 @@
weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM YYYY',
LLL : 'D MMMM YYYY LT',
@@ -8875,15 +9468,12 @@
doy : 7 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : vietnamese (vi)
-// author : Bang Nguyen : https://github.com/bangnk
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('vi', {
+
+ //! moment.js locale configuration
+ //! locale : vietnamese (vi)
+ //! author : Bang Nguyen : https://github.com/bangnk
+
+ var vi = _moment__default.defineLocale('vi', {
months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'),
monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'),
weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'),
@@ -8891,6 +9481,7 @@
weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
longDateFormat : {
LT : 'HH:mm',
+ LTS : 'LT:ss',
L : 'DD/MM/YYYY',
LL : 'D MMMM [năm] YYYY',
LLL : 'D MMMM [năm] YYYY LT',
@@ -8923,6 +9514,7 @@
y : 'một năm',
yy : '%d năm'
},
+ ordinalParse: /\d{1,2}/,
ordinal : function (number) {
return number;
},
@@ -8931,23 +9523,21 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : chinese (zh-cn)
-// author : suupic : https://github.com/suupic
-// author : Zeno Zeng : https://github.com/zenozeng
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('zh-cn', {
+
+ //! moment.js locale configuration
+ //! locale : chinese (zh-cn)
+ //! author : suupic : https://github.com/suupic
+ //! author : Zeno Zeng : https://github.com/zenozeng
+
+ var zh_cn = _moment__default.defineLocale('zh-cn', {
months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),
weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
longDateFormat : {
- LT : 'Ah点mm',
+ LT : 'Ah点mm分',
+ LTS : 'Ah点m分s秒',
L : 'YYYY-MM-DD',
LL : 'YYYY年MMMD日',
LLL : 'YYYY年MMMD日LT',
@@ -8957,6 +9547,21 @@
lll : 'YYYY年MMMD日LT',
llll : 'YYYY年MMMD日ddddLT'
},
+ meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
+ meridiemHour: function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '凌晨' || meridiem === '早上' ||
+ meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ } else {
+ // '中午'
+ return hour >= 11 ? hour : hour + 12;
+ }
+ },
meridiem : function (hour, minute, isLower) {
var hm = hour * 100 + minute;
if (hm < 600) {
@@ -8985,18 +9590,19 @@
},
nextWeek : function () {
var startOfWeek, prefix;
- startOfWeek = moment().startOf('week');
+ startOfWeek = _moment__default().startOf('week');
prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
},
lastWeek : function () {
var startOfWeek, prefix;
- startOfWeek = moment().startOf('week');
+ startOfWeek = _moment__default().startOf('week');
prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
},
sameElse : 'LL'
},
+ ordinalParse: /\d{1,2}(日|月|周)/,
ordinal : function (number, period) {
switch (period) {
case 'd':
@@ -9016,16 +9622,16 @@
future : '%s内',
past : '%s前',
s : '几秒',
- m : '1分钟',
- mm : '%d分钟',
- h : '1小时',
- hh : '%d小时',
- d : '1天',
- dd : '%d天',
- M : '1个月',
- MM : '%d个月',
- y : '1年',
- yy : '%d年'
+ m : '1 分钟',
+ mm : '%d 分钟',
+ h : '1 小时',
+ hh : '%d 小时',
+ d : '1 天',
+ dd : '%d 天',
+ M : '1 个月',
+ MM : '%d 个月',
+ y : '1 年',
+ yy : '%d 年'
},
week : {
// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
@@ -9033,22 +9639,20 @@
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});
-}));
-// moment.js locale configuration
-// locale : traditional chinese (zh-tw)
-// author : Ben : https://github.com/ben-lin
-
-(function (factory) {
- factory(moment);
-}(function (moment) {
- return moment.defineLocale('zh-tw', {
+
+ //! moment.js locale configuration
+ //! locale : traditional chinese (zh-tw)
+ //! author : Ben : https://github.com/ben-lin
+
+ var zh_tw = _moment__default.defineLocale('zh-tw', {
months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'),
weekdaysMin : '日_一_二_三_四_五_六'.split('_'),
longDateFormat : {
- LT : 'Ah點mm',
+ LT : 'Ah點mm分',
+ LTS : 'Ah點m分s秒',
L : 'YYYY年MMMD日',
LL : 'YYYY年MMMD日',
LLL : 'YYYY年MMMD日LT',
@@ -9058,6 +9662,19 @@
lll : 'YYYY年MMMD日LT',
llll : 'YYYY年MMMD日ddddLT'
},
+ meridiemParse: /早上|上午|中午|下午|晚上/,
+ meridiemHour : function (hour, meridiem) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ if (meridiem === '早上' || meridiem === '上午') {
+ return hour;
+ } else if (meridiem === '中午') {
+ return hour >= 11 ? hour : hour + 12;
+ } else if (meridiem === '下午' || meridiem === '晚上') {
+ return hour + 12;
+ }
+ },
meridiem : function (hour, minute, isLower) {
var hm = hour * 100 + minute;
if (hm < 900) {
@@ -9080,6 +9697,7 @@
lastWeek : '[上]ddddLT',
sameElse : 'L'
},
+ ordinalParse: /\d{1,2}(日|月|週)/,
ordinal : function (number, period) {
switch (period) {
case 'd' :
@@ -9111,46 +9729,9 @@
yy : '%d年'
}
});
-}));
-
- moment.locale('en');
+ var moment_with_locales = _moment__default;
- /************************************
- Exposing Moment
- ************************************/
+ return moment_with_locales;
- function makeGlobal(shouldDeprecate) {
- /*global ender:false */
- if (typeof ender !== 'undefined') {
- return;
- }
- oldGlobalMoment = globalScope.moment;
- if (shouldDeprecate) {
- globalScope.moment = deprecate(
- 'Accessing Moment through the global scope is ' +
- 'deprecated, and will be removed in an upcoming ' +
- 'release.',
- moment);
- } else {
- globalScope.moment = moment;
- }
- }
-
- // CommonJS module is defined
- if (hasModule) {
- module.exports = moment;
- } else if (typeof define === 'function' && define.amd) {
- define('moment', function (require, exports, module) {
- if (module.config && module.config() && module.config().noGlobal === true) {
- // release the global variable
- globalScope.moment = oldGlobalMoment;
- }
-
- return moment;
- });
- makeGlobal(true);
- } else {
- makeGlobal();
- }
-}).call(this);
+})); \ No newline at end of file
diff --git a/core/vendor/underscore/.bower.json b/core/vendor/underscore/.bower.json
index 2389206fd47..aafb969ae90 100644
--- a/core/vendor/underscore/.bower.json
+++ b/core/vendor/underscore/.bower.json
@@ -1,6 +1,6 @@
{
"name": "underscore",
- "version": "1.6.0",
+ "version": "1.8.3",
"main": "underscore.js",
"keywords": [
"util",
@@ -10,24 +10,26 @@
"browser"
],
"ignore": [
- "underscore-min.js",
"docs",
"test",
"*.yml",
- "*.map",
"CNAME",
"index.html",
"favicon.ico",
- "CONTRIBUTING.md"
+ "CONTRIBUTING.md",
+ ".*",
+ "component.json",
+ "package.json",
+ "karma.*"
],
"homepage": "https://github.com/jashkenas/underscore",
- "_release": "1.6.0",
+ "_release": "1.8.3",
"_resolution": {
"type": "version",
- "tag": "1.6.0",
- "commit": "1f4bf626f23a99f7a676f5076dc1b1475554c8f7"
+ "tag": "1.8.3",
+ "commit": "e4743ab712b8ab42ad4ccb48b155034d02394e4d"
},
"_source": "git://github.com/jashkenas/underscore.git",
- "_target": "~1.6.0",
+ "_target": "~1.8.0",
"_originalSource": "underscore"
} \ No newline at end of file
diff --git a/core/vendor/underscore/LICENSE b/core/vendor/underscore/LICENSE
index 0d6b8739d95..ad0e71bc4ba 100644
--- a/core/vendor/underscore/LICENSE
+++ b/core/vendor/underscore/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative
+Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative
Reporters & Editors
Permission is hereby granted, free of charge, to any person
diff --git a/core/vendor/underscore/underscore.js b/core/vendor/underscore/underscore.js
index 9a4cabecf7f..b29332f945b 100644
--- a/core/vendor/underscore/underscore.js
+++ b/core/vendor/underscore/underscore.js
@@ -1,6 +1,6 @@
-// Underscore.js 1.6.0
+// Underscore.js 1.8.3
// http://underscorejs.org
-// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
// Underscore may be freely distributed under the MIT license.
(function() {
@@ -14,9 +14,6 @@
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
- // Establish the object that gets returned to break out of a loop iteration.
- var breaker = {};
-
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
@@ -24,25 +21,19 @@
var
push = ArrayProto.push,
slice = ArrayProto.slice,
- concat = ArrayProto.concat,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
- nativeForEach = ArrayProto.forEach,
- nativeMap = ArrayProto.map,
- nativeReduce = ArrayProto.reduce,
- nativeReduceRight = ArrayProto.reduceRight,
- nativeFilter = ArrayProto.filter,
- nativeEvery = ArrayProto.every,
- nativeSome = ArrayProto.some,
- nativeIndexOf = ArrayProto.indexOf,
- nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
- nativeBind = FuncProto.bind;
+ nativeBind = FuncProto.bind,
+ nativeCreate = Object.create;
+
+ // Naked function reference for surrogate-prototype-swapping.
+ var Ctor = function(){};
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) {
@@ -53,8 +44,7 @@
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
- // the browser, add `_` as a global object via a string identifier,
- // for Closure Compiler "advanced" mode.
+ // the browser, add `_` as a global object.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
@@ -65,161 +55,217 @@
}
// Current version.
- _.VERSION = '1.6.0';
+ _.VERSION = '1.8.3';
+
+ // Internal function that returns an efficient (for current engines) version
+ // of the passed-in callback, to be repeatedly applied in other Underscore
+ // functions.
+ var optimizeCb = function(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ case 2: return function(value, other) {
+ return func.call(context, value, other);
+ };
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+ };
+
+ // A mostly-internal function to generate callbacks that can be applied
+ // to each element in a collection, returning the desired result — either
+ // identity, an arbitrary callback, a property matcher, or a property accessor.
+ var cb = function(value, context, argCount) {
+ if (value == null) return _.identity;
+ if (_.isFunction(value)) return optimizeCb(value, context, argCount);
+ if (_.isObject(value)) return _.matcher(value);
+ return _.property(value);
+ };
+ _.iteratee = function(value, context) {
+ return cb(value, context, Infinity);
+ };
+
+ // An internal function for creating assigner functions.
+ var createAssigner = function(keysFunc, undefinedOnly) {
+ return function(obj) {
+ var length = arguments.length;
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+ };
+
+ // An internal function for creating a new object that inherits from another.
+ var baseCreate = function(prototype) {
+ if (!_.isObject(prototype)) return {};
+ if (nativeCreate) return nativeCreate(prototype);
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+ };
+
+ var property = function(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+ };
+
+ // Helper for collection methods to determine whether a collection
+ // should be iterated as an array or as an object
+ // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+ var getLength = property('length');
+ var isArrayLike = function(collection) {
+ var length = getLength(collection);
+ return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
+ };
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
- // Handles objects with the built-in `forEach`, arrays, and raw objects.
- // Delegates to **ECMAScript 5**'s native `forEach` if available.
- var each = _.each = _.forEach = function(obj, iterator, context) {
- if (obj == null) return obj;
- if (nativeForEach && obj.forEach === nativeForEach) {
- obj.forEach(iterator, context);
- } else if (obj.length === +obj.length) {
- for (var i = 0, length = obj.length; i < length; i++) {
- if (iterator.call(context, obj[i], i, obj) === breaker) return;
+ // Handles raw objects in addition to array-likes. Treats all
+ // sparse array-likes as if they were dense.
+ _.each = _.forEach = function(obj, iteratee, context) {
+ iteratee = optimizeCb(iteratee, context);
+ var i, length;
+ if (isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
- for (var i = 0, length = keys.length; i < length; i++) {
- if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
+ for (i = 0, length = keys.length; i < length; i++) {
+ iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};
- // Return the results of applying the iterator to each element.
- // Delegates to **ECMAScript 5**'s native `map` if available.
- _.map = _.collect = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
- each(obj, function(value, index, list) {
- results.push(iterator.call(context, value, index, list));
- });
+ // Return the results of applying the iteratee to each element.
+ _.map = _.collect = function(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = keys ? keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
return results;
};
- var reduceError = 'Reduce of empty array with no initial value';
-
- // **Reduce** builds up a single result from a list of values, aka `inject`,
- // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
- _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
- var initial = arguments.length > 2;
- if (obj == null) obj = [];
- if (nativeReduce && obj.reduce === nativeReduce) {
- if (context) iterator = _.bind(iterator, context);
- return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+ // Create a reducing function iterating left or right.
+ function createReduce(dir) {
+ // Optimized iterator function as using arguments.length
+ // in the main function will deoptimize the, see #1991.
+ function iterator(obj, iteratee, memo, keys, index, length) {
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = keys ? keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
}
- each(obj, function(value, index, list) {
- if (!initial) {
- memo = value;
- initial = true;
- } else {
- memo = iterator.call(context, memo, value, index, list);
+
+ return function(obj, iteratee, memo, context) {
+ iteratee = optimizeCb(iteratee, context, 4);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ // Determine the initial value if none is provided.
+ if (arguments.length < 3) {
+ memo = obj[keys ? keys[index] : index];
+ index += dir;
}
- });
- if (!initial) throw new TypeError(reduceError);
- return memo;
- };
+ return iterator(obj, iteratee, memo, keys, index, length);
+ };
+ }
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`.
+ _.reduce = _.foldl = _.inject = createReduce(1);
// The right-associative version of reduce, also known as `foldr`.
- // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
- _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
- var initial = arguments.length > 2;
- if (obj == null) obj = [];
- if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
- if (context) iterator = _.bind(iterator, context);
- return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
- }
- var length = obj.length;
- if (length !== +length) {
- var keys = _.keys(obj);
- length = keys.length;
- }
- each(obj, function(value, index, list) {
- index = keys ? keys[--length] : --length;
- if (!initial) {
- memo = obj[index];
- initial = true;
- } else {
- memo = iterator.call(context, memo, obj[index], index, list);
- }
- });
- if (!initial) throw new TypeError(reduceError);
- return memo;
- };
+ _.reduceRight = _.foldr = createReduce(-1);
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, predicate, context) {
- var result;
- any(obj, function(value, index, list) {
- if (predicate.call(context, value, index, list)) {
- result = value;
- return true;
- }
- });
- return result;
+ var key;
+ if (isArrayLike(obj)) {
+ key = _.findIndex(obj, predicate, context);
+ } else {
+ key = _.findKey(obj, predicate, context);
+ }
+ if (key !== void 0 && key !== -1) return obj[key];
};
// Return all the elements that pass a truth test.
- // Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, predicate, context) {
var results = [];
- if (obj == null) return results;
- if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
- each(obj, function(value, index, list) {
- if (predicate.call(context, value, index, list)) results.push(value);
+ predicate = cb(predicate, context);
+ _.each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, predicate, context) {
- return _.filter(obj, function(value, index, list) {
- return !predicate.call(context, value, index, list);
- }, context);
+ return _.filter(obj, _.negate(cb(predicate)), context);
};
// Determine whether all of the elements match a truth test.
- // Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, predicate, context) {
- predicate || (predicate = _.identity);
- var result = true;
- if (obj == null) return result;
- if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
- each(obj, function(value, index, list) {
- if (!(result = result && predicate.call(context, value, index, list))) return breaker;
- });
- return !!result;
+ predicate = cb(predicate, context);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = keys ? keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
};
// Determine if at least one element in the object matches a truth test.
- // Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
- var any = _.some = _.any = function(obj, predicate, context) {
- predicate || (predicate = _.identity);
- var result = false;
- if (obj == null) return result;
- if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
- each(obj, function(value, index, list) {
- if (result || (result = predicate.call(context, value, index, list))) return breaker;
- });
- return !!result;
+ _.some = _.any = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = keys ? keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
};
- // Determine if the array or object contains a given value (using `===`).
- // Aliased as `include`.
- _.contains = _.include = function(obj, target) {
- if (obj == null) return false;
- if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
- return any(obj, function(value) {
- return value === target;
- });
+ // Determine if the array or object contains a given item (using `===`).
+ // Aliased as `includes` and `include`.
+ _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
+ if (!isArrayLike(obj)) obj = _.values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return _.indexOf(obj, item, fromIndex) >= 0;
};
// Invoke a method (with arguments) on every item in a collection.
@@ -227,7 +273,8 @@
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
- return (isFunc ? method : value[method]).apply(value, args);
+ var func = isFunc ? method : value[method];
+ return func == null ? func : func.apply(value, args);
});
};
@@ -239,60 +286,76 @@
// Convenience version of a common use case of `filter`: selecting only objects
// containing specific `key:value` pairs.
_.where = function(obj, attrs) {
- return _.filter(obj, _.matches(attrs));
+ return _.filter(obj, _.matcher(attrs));
};
// Convenience version of a common use case of `find`: getting the first object
// containing specific `key:value` pairs.
_.findWhere = function(obj, attrs) {
- return _.find(obj, _.matches(attrs));
+ return _.find(obj, _.matcher(attrs));
};
- // Return the maximum element or (element-based computation).
- // Can't optimize arrays of integers longer than 65,535 elements.
- // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
- _.max = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
- return Math.max.apply(Math, obj);
- }
- var result = -Infinity, lastComputed = -Infinity;
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- if (computed > lastComputed) {
- result = value;
- lastComputed = computed;
+ // Return the maximum element (or element-based computation).
+ _.max = function(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null && obj != null) {
+ obj = isArrayLike(obj) ? obj : _.values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value > result) {
+ result = value;
+ }
}
- });
+ } else {
+ iteratee = cb(iteratee, context);
+ _.each(obj, function(value, index, list) {
+ computed = iteratee(value, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = value;
+ lastComputed = computed;
+ }
+ });
+ }
return result;
};
// Return the minimum element (or element-based computation).
- _.min = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
- return Math.min.apply(Math, obj);
- }
- var result = Infinity, lastComputed = Infinity;
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- if (computed < lastComputed) {
- result = value;
- lastComputed = computed;
+ _.min = function(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null && obj != null) {
+ obj = isArrayLike(obj) ? obj : _.values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value < result) {
+ result = value;
+ }
}
- });
+ } else {
+ iteratee = cb(iteratee, context);
+ _.each(obj, function(value, index, list) {
+ computed = iteratee(value, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = value;
+ lastComputed = computed;
+ }
+ });
+ }
return result;
};
- // Shuffle an array, using the modern version of the
+ // Shuffle a collection, using the modern version of the
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
_.shuffle = function(obj) {
- var rand;
- var index = 0;
- var shuffled = [];
- each(obj, function(value) {
- rand = _.random(index++);
- shuffled[index - 1] = shuffled[rand];
- shuffled[rand] = value;
- });
+ var set = isArrayLike(obj) ? obj : _.values(obj);
+ var length = set.length;
+ var shuffled = Array(length);
+ for (var index = 0, rand; index < length; index++) {
+ rand = _.random(0, index);
+ if (rand !== index) shuffled[index] = shuffled[rand];
+ shuffled[rand] = set[index];
+ }
return shuffled;
};
@@ -301,27 +364,20 @@
// The internal `guard` argument allows it to work with `map`.
_.sample = function(obj, n, guard) {
if (n == null || guard) {
- if (obj.length !== +obj.length) obj = _.values(obj);
+ if (!isArrayLike(obj)) obj = _.values(obj);
return obj[_.random(obj.length - 1)];
}
return _.shuffle(obj).slice(0, Math.max(0, n));
};
- // An internal function to generate lookup iterators.
- var lookupIterator = function(value) {
- if (value == null) return _.identity;
- if (_.isFunction(value)) return value;
- return _.property(value);
- };
-
- // Sort the object's values by a criterion produced by an iterator.
- _.sortBy = function(obj, iterator, context) {
- iterator = lookupIterator(iterator);
+ // Sort the object's values by a criterion produced by an iteratee.
+ _.sortBy = function(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
- criteria: iterator.call(context, value, index, list)
+ criteria: iteratee(value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
@@ -336,12 +392,12 @@
// An internal function used for aggregate "group by" operations.
var group = function(behavior) {
- return function(obj, iterator, context) {
+ return function(obj, iteratee, context) {
var result = {};
- iterator = lookupIterator(iterator);
- each(obj, function(value, index) {
- var key = iterator.call(context, value, index, obj);
- behavior(result, key, value);
+ iteratee = cb(iteratee, context);
+ _.each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
});
return result;
};
@@ -349,48 +405,46 @@
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
- _.groupBy = group(function(result, key, value) {
- _.has(result, key) ? result[key].push(value) : result[key] = [value];
+ _.groupBy = group(function(result, value, key) {
+ if (_.has(result, key)) result[key].push(value); else result[key] = [value];
});
// Indexes the object's values by a criterion, similar to `groupBy`, but for
// when you know that your index values will be unique.
- _.indexBy = group(function(result, key, value) {
+ _.indexBy = group(function(result, value, key) {
result[key] = value;
});
// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
- _.countBy = group(function(result, key) {
- _.has(result, key) ? result[key]++ : result[key] = 1;
+ _.countBy = group(function(result, value, key) {
+ if (_.has(result, key)) result[key]++; else result[key] = 1;
});
- // Use a comparator function to figure out the smallest index at which
- // an object should be inserted so as to maintain order. Uses binary search.
- _.sortedIndex = function(array, obj, iterator, context) {
- iterator = lookupIterator(iterator);
- var value = iterator.call(context, obj);
- var low = 0, high = array.length;
- while (low < high) {
- var mid = (low + high) >>> 1;
- iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
- }
- return low;
- };
-
// Safely create a real, live array from anything iterable.
_.toArray = function(obj) {
if (!obj) return [];
if (_.isArray(obj)) return slice.call(obj);
- if (obj.length === +obj.length) return _.map(obj, _.identity);
+ if (isArrayLike(obj)) return _.map(obj, _.identity);
return _.values(obj);
};
// Return the number of elements in an object.
_.size = function(obj) {
if (obj == null) return 0;
- return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
+ return isArrayLike(obj) ? obj.length : _.keys(obj).length;
+ };
+
+ // Split a collection into two arrays: one whose elements all satisfy the given
+ // predicate, and one whose elements all do not satisfy the predicate.
+ _.partition = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var pass = [], fail = [];
+ _.each(obj, function(value, key, obj) {
+ (predicate(value, key, obj) ? pass : fail).push(value);
+ });
+ return [pass, fail];
};
// Array Functions
@@ -401,33 +455,30 @@
// allows it to work with `_.map`.
_.first = _.head = _.take = function(array, n, guard) {
if (array == null) return void 0;
- if ((n == null) || guard) return array[0];
- if (n < 0) return [];
- return slice.call(array, 0, n);
+ if (n == null || guard) return array[0];
+ return _.initial(array, array.length - n);
};
// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
- // the array, excluding the last N. The **guard** check allows it to work with
- // `_.map`.
+ // the array, excluding the last N.
_.initial = function(array, n, guard) {
- return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
};
// Get the last element of an array. Passing **n** will return the last N
- // values in the array. The **guard** check allows it to work with `_.map`.
+ // values in the array.
_.last = function(array, n, guard) {
if (array == null) return void 0;
- if ((n == null) || guard) return array[array.length - 1];
- return slice.call(array, Math.max(array.length - n, 0));
+ if (n == null || guard) return array[array.length - 1];
+ return _.rest(array, Math.max(0, array.length - n));
};
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
// Especially useful on the arguments object. Passing an **n** will return
- // the rest N values in the array. The **guard**
- // check allows it to work with `_.map`.
+ // the rest N values in the array.
_.rest = _.tail = _.drop = function(array, n, guard) {
- return slice.call(array, (n == null) || guard ? 1 : n);
+ return slice.call(array, n == null || guard ? 1 : n);
};
// Trim out all falsy values from an array.
@@ -436,23 +487,28 @@
};
// Internal implementation of a recursive `flatten` function.
- var flatten = function(input, shallow, output) {
- if (shallow && _.every(input, _.isArray)) {
- return concat.apply(output, input);
- }
- each(input, function(value) {
- if (_.isArray(value) || _.isArguments(value)) {
- shallow ? push.apply(output, value) : flatten(value, shallow, output);
- } else {
- output.push(value);
+ var flatten = function(input, shallow, strict, startIndex) {
+ var output = [], idx = 0;
+ for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
+ var value = input[i];
+ if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
+ //flatten current level of array or arguments object
+ if (!shallow) value = flatten(value, shallow, strict);
+ var j = 0, len = value.length;
+ output.length += len;
+ while (j < len) {
+ output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
}
- });
+ }
return output;
};
// Flatten out an array, either recursively (by default), or just one level.
_.flatten = function(array, shallow) {
- return flatten(array, shallow, []);
+ return flatten(array, shallow, false);
};
// Return a version of the array that does not contain the specified value(s).
@@ -460,79 +516,91 @@
return _.difference(array, slice.call(arguments, 1));
};
- // Split an array into two arrays: one whose elements all satisfy the given
- // predicate, and one whose elements all do not satisfy the predicate.
- _.partition = function(array, predicate) {
- var pass = [], fail = [];
- each(array, function(elem) {
- (predicate(elem) ? pass : fail).push(elem);
- });
- return [pass, fail];
- };
-
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
- _.uniq = _.unique = function(array, isSorted, iterator, context) {
- if (_.isFunction(isSorted)) {
- context = iterator;
- iterator = isSorted;
+ _.uniq = _.unique = function(array, isSorted, iteratee, context) {
+ if (!_.isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
isSorted = false;
}
- var initial = iterator ? _.map(array, iterator, context) : array;
- var results = [];
+ if (iteratee != null) iteratee = cb(iteratee, context);
+ var result = [];
var seen = [];
- each(initial, function(value, index) {
- if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
- seen.push(value);
- results.push(array[index]);
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!_.contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!_.contains(result, value)) {
+ result.push(value);
}
- });
- return results;
+ }
+ return result;
};
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
- return _.uniq(_.flatten(arguments, true));
+ return _.uniq(flatten(arguments, true, true));
};
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersection = function(array) {
- var rest = slice.call(arguments, 1);
- return _.filter(_.uniq(array), function(item) {
- return _.every(rest, function(other) {
- return _.contains(other, item);
- });
- });
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var item = array[i];
+ if (_.contains(result, item)) continue;
+ for (var j = 1; j < argsLength; j++) {
+ if (!_.contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
};
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
- var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
- return _.filter(array, function(value){ return !_.contains(rest, value); });
+ var rest = flatten(arguments, true, true, 1);
+ return _.filter(array, function(value){
+ return !_.contains(rest, value);
+ });
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
- var length = _.max(_.pluck(arguments, 'length').concat(0));
- var results = new Array(length);
- for (var i = 0; i < length; i++) {
- results[i] = _.pluck(arguments, '' + i);
+ return _.unzip(arguments);
+ };
+
+ // Complement of _.zip. Unzip accepts an array of arrays and groups
+ // each array's elements on shared indices
+ _.unzip = function(array) {
+ var length = array && _.max(array, getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = _.pluck(array, index);
}
- return results;
+ return result;
};
// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values.
_.object = function(list, values) {
- if (list == null) return {};
var result = {};
- for (var i = 0, length = list.length; i < length; i++) {
+ for (var i = 0, length = getLength(list); i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
@@ -542,57 +610,83 @@
return result;
};
- // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
- // we need this function. Return the position of the first occurrence of an
- // item in an array, or -1 if the item is not included in the array.
- // Delegates to **ECMAScript 5**'s native `indexOf` if available.
- // If the array is large and already in sort order, pass `true`
- // for **isSorted** to use binary search.
- _.indexOf = function(array, item, isSorted) {
- if (array == null) return -1;
- var i = 0, length = array.length;
- if (isSorted) {
- if (typeof isSorted == 'number') {
- i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
- } else {
- i = _.sortedIndex(array, item);
- return array[i] === item ? i : -1;
+ // Generator function to create the findIndex and findLastIndex functions
+ function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = cb(predicate, context);
+ var length = getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
}
- }
- if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
- for (; i < length; i++) if (array[i] === item) return i;
- return -1;
- };
+ return -1;
+ };
+ }
+
+ // Returns the first index on an array-like that passes a predicate test
+ _.findIndex = createPredicateIndexFinder(1);
+ _.findLastIndex = createPredicateIndexFinder(-1);
- // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
- _.lastIndexOf = function(array, item, from) {
- if (array == null) return -1;
- var hasIndex = from != null;
- if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
- return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = function(array, obj, iteratee, context) {
+ iteratee = cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
}
- var i = (hasIndex ? from : array.length);
- while (i--) if (array[i] === item) return i;
- return -1;
+ return low;
};
+ // Generator function to create the indexOf and lastIndexOf functions
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(slice.call(array, i, length), _.isNaN);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+ }
+
+ // Return the position of the first occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
+ _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
+
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
- if (arguments.length <= 1) {
+ if (stop == null) {
stop = start || 0;
start = 0;
}
- step = arguments[2] || 1;
+ step = step || 1;
var length = Math.max(Math.ceil((stop - start) / step), 0);
- var idx = 0;
- var range = new Array(length);
+ var range = Array(length);
- while(idx < length) {
- range[idx++] = start;
- start += step;
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
}
return range;
@@ -601,26 +695,27 @@
// Function (ahem) Functions
// ------------------
- // Reusable constructor function for prototype setting.
- var ctor = function(){};
+ // Determines whether to execute a function as a constructor
+ // or a normal function with the provided arguments
+ var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (_.isObject(result)) return result;
+ return self;
+ };
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
// available.
_.bind = function(func, context) {
- var args, bound;
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
- if (!_.isFunction(func)) throw new TypeError;
- args = slice.call(arguments, 2);
- return bound = function() {
- if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
- ctor.prototype = func.prototype;
- var self = new ctor;
- ctor.prototype = null;
- var result = func.apply(self, args.concat(slice.call(arguments)));
- if (Object(result) === result) return result;
- return self;
+ if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
+ var args = slice.call(arguments, 2);
+ var bound = function() {
+ return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
};
+ return bound;
};
// Partially apply a function by creating a version that has had some of its
@@ -628,49 +723,55 @@
// as a placeholder, allowing any combination of arguments to be pre-filled.
_.partial = function(func) {
var boundArgs = slice.call(arguments, 1);
- return function() {
- var position = 0;
- var args = boundArgs.slice();
- for (var i = 0, length = args.length; i < length; i++) {
- if (args[i] === _) args[i] = arguments[position++];
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
}
while (position < arguments.length) args.push(arguments[position++]);
- return func.apply(this, args);
+ return executeBound(func, bound, this, this, args);
};
+ return bound;
};
// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
_.bindAll = function(obj) {
- var funcs = slice.call(arguments, 1);
- if (funcs.length === 0) throw new Error('bindAll must be passed function names');
- each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+ var i, length = arguments.length, key;
+ if (length <= 1) throw new Error('bindAll must be passed function names');
+ for (i = 1; i < length; i++) {
+ key = arguments[i];
+ obj[key] = _.bind(obj[key], obj);
+ }
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
- var memo = {};
- hasher || (hasher = _.identity);
- return function() {
- var key = hasher.apply(this, arguments);
- return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
};
+ memoize.cache = {};
+ return memoize;
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
- return setTimeout(function(){ return func.apply(null, args); }, wait);
+ return setTimeout(function(){
+ return func.apply(null, args);
+ }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
- _.defer = function(func) {
- return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
- };
+ _.defer = _.partial(_.delay, _, 1);
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
@@ -681,12 +782,12 @@
var context, args, result;
var timeout = null;
var previous = 0;
- options || (options = {});
+ if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : _.now();
timeout = null;
result = func.apply(context, args);
- context = args = null;
+ if (!timeout) context = args = null;
};
return function() {
var now = _.now();
@@ -694,12 +795,14 @@
var remaining = wait - (now - previous);
context = this;
args = arguments;
- if (remaining <= 0) {
- clearTimeout(timeout);
- timeout = null;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
previous = now;
result = func.apply(context, args);
- context = args = null;
+ if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
@@ -716,13 +819,14 @@
var later = function() {
var last = _.now() - timestamp;
- if (last < wait) {
+
+ if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) {
result = func.apply(context, args);
- context = args = null;
+ if (!timeout) context = args = null;
}
}
};
@@ -732,9 +836,7 @@
args = arguments;
timestamp = _.now();
var callNow = immediate && !timeout;
- if (!timeout) {
- timeout = setTimeout(later, wait);
- }
+ if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
@@ -744,19 +846,6 @@
};
};
- // Returns a function that will be executed at most one time, no matter how
- // often you call it. Useful for lazy initialization.
- _.once = function(func) {
- var ran = false, memo;
- return function() {
- if (ran) return memo;
- ran = true;
- memo = func.apply(this, arguments);
- func = null;
- return memo;
- };
- };
-
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
@@ -764,20 +853,27 @@
return _.partial(wrapper, func);
};
+ // Returns a negated version of the passed-in predicate.
+ _.negate = function(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+ };
+
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
- var funcs = arguments;
+ var args = arguments;
+ var start = args.length - 1;
return function() {
- var args = arguments;
- for (var i = funcs.length - 1; i >= 0; i--) {
- args = [funcs[i].apply(this, args)];
- }
- return args[0];
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
};
};
- // Returns a function that will only be executed after being called N times.
+ // Returns a function that will only be executed on and after the Nth call.
_.after = function(times, func) {
return function() {
if (--times < 1) {
@@ -786,16 +882,66 @@
};
};
+ // Returns a function that will only be executed up to (but not including) the Nth call.
+ _.before = function(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+ };
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ _.once = _.partial(_.before, 2);
+
// Object Functions
// ----------------
- // Retrieve the names of an object's properties.
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+ function collectNonEnumProps(obj, keys) {
+ var nonEnumIdx = nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
+ keys.push(prop);
+ }
+ }
+ }
+
+ // Retrieve the names of an object's own properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = function(obj) {
if (!_.isObject(obj)) return [];
if (nativeKeys) return nativeKeys(obj);
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ };
+
+ // Retrieve all the property names of an object.
+ _.allKeys = function(obj) {
+ if (!_.isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
return keys;
};
@@ -803,18 +949,33 @@
_.values = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
- var values = new Array(length);
+ var values = Array(length);
for (var i = 0; i < length; i++) {
values[i] = obj[keys[i]];
}
return values;
};
+ // Returns the results of applying the iteratee to each element of the object
+ // In contrast to _.map it returns an object
+ _.mapObject = function(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var keys = _.keys(obj),
+ length = keys.length,
+ results = {},
+ currentKey;
+ for (var index = 0; index < length; index++) {
+ currentKey = keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ };
+
// Convert an object into a list of `[key, value]` pairs.
_.pairs = function(obj) {
var keys = _.keys(obj);
var length = keys.length;
- var pairs = new Array(length);
+ var pairs = Array(length);
for (var i = 0; i < length; i++) {
pairs[i] = [keys[i], obj[keys[i]]];
}
@@ -842,47 +1003,65 @@
};
// Extend a given object with all the properties in passed-in object(s).
- _.extend = function(obj) {
- each(slice.call(arguments, 1), function(source) {
- if (source) {
- for (var prop in source) {
- obj[prop] = source[prop];
- }
- }
- });
- return obj;
+ _.extend = createAssigner(_.allKeys);
+
+ // Assigns a given object with all the own properties in the passed-in object(s)
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ _.extendOwn = _.assign = createAssigner(_.keys);
+
+ // Returns the first key on an object that passes a predicate test
+ _.findKey = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var keys = _.keys(obj), key;
+ for (var i = 0, length = keys.length; i < length; i++) {
+ key = keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
};
// Return a copy of the object only containing the whitelisted properties.
- _.pick = function(obj) {
- var copy = {};
- var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
- each(keys, function(key) {
- if (key in obj) copy[key] = obj[key];
- });
- return copy;
+ _.pick = function(object, oiteratee, context) {
+ var result = {}, obj = object, iteratee, keys;
+ if (obj == null) return result;
+ if (_.isFunction(oiteratee)) {
+ keys = _.allKeys(obj);
+ iteratee = optimizeCb(oiteratee, context);
+ } else {
+ keys = flatten(arguments, false, false, 1);
+ iteratee = function(value, key, obj) { return key in obj; };
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
};
// Return a copy of the object without the blacklisted properties.
- _.omit = function(obj) {
- var copy = {};
- var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
- for (var key in obj) {
- if (!_.contains(keys, key)) copy[key] = obj[key];
+ _.omit = function(obj, iteratee, context) {
+ if (_.isFunction(iteratee)) {
+ iteratee = _.negate(iteratee);
+ } else {
+ var keys = _.map(flatten(arguments, false, false, 1), String);
+ iteratee = function(value, key) {
+ return !_.contains(keys, key);
+ };
}
- return copy;
+ return _.pick(obj, iteratee, context);
};
// Fill in a given object with default properties.
- _.defaults = function(obj) {
- each(slice.call(arguments, 1), function(source) {
- if (source) {
- for (var prop in source) {
- if (obj[prop] === void 0) obj[prop] = source[prop];
- }
- }
- });
- return obj;
+ _.defaults = createAssigner(_.allKeys, true);
+
+ // Creates an object that inherits from the given prototype object.
+ // If additional properties are provided then they will be added to the
+ // created object.
+ _.create = function(prototype, props) {
+ var result = baseCreate(prototype);
+ if (props) _.extendOwn(result, props);
+ return result;
};
// Create a (shallow-cloned) duplicate of an object.
@@ -899,11 +1078,24 @@
return obj;
};
+ // Returns whether an object has a given set of `key:value` pairs.
+ _.isMatch = function(object, attrs) {
+ var keys = _.keys(attrs), length = keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+ };
+
+
// Internal recursive comparison function for `isEqual`.
var eq = function(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
- if (a === b) return a !== 0 || 1 / a == 1 / b;
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
@@ -911,98 +1103,98 @@
if (b instanceof _) b = b._wrapped;
// Compare `[[Class]]` names.
var className = toString.call(a);
- if (className != toString.call(b)) return false;
+ if (className !== toString.call(b)) return false;
switch (className) {
- // Strings, numbers, dates, and booleans are compared by value.
+ // Strings, numbers, regular expressions, dates, and booleans are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
- return a == String(b);
+ return '' + a === '' + b;
case '[object Number]':
- // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
- // other numeric values.
- return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
- return +a == +b;
- // RegExps are compared by their source patterns and flags.
- case '[object RegExp]':
- return a.source == b.source &&
- a.global == b.global &&
- a.multiline == b.multiline &&
- a.ignoreCase == b.ignoreCase;
+ return +a === +b;
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
+ _.isFunction(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
}
- if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
- if (aStack[length] == a) return bStack[length] == b;
- }
- // Objects with different constructors are not equivalent, but `Object`s
- // from different frames are.
- var aCtor = a.constructor, bCtor = b.constructor;
- if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
- _.isFunction(bCtor) && (bCtor instanceof bCtor))
- && ('constructor' in a && 'constructor' in b)) {
- return false;
+ if (aStack[length] === a) return bStack[length] === b;
}
+
// Add the first object to the stack of traversed objects.
aStack.push(a);
bStack.push(b);
- var size = 0, result = true;
+
// Recursively compare objects and arrays.
- if (className == '[object Array]') {
+ if (areArrays) {
// Compare array lengths to determine if a deep comparison is necessary.
- size = a.length;
- result = size == b.length;
- if (result) {
- // Deep compare the contents, ignoring non-numeric properties.
- while (size--) {
- if (!(result = eq(a[size], b[size], aStack, bStack))) break;
- }
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
}
} else {
// Deep compare objects.
- for (var key in a) {
- if (_.has(a, key)) {
- // Count the expected number of properties.
- size++;
- // Deep compare each member.
- if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
- }
- }
- // Ensure that both objects contain the same number of properties.
- if (result) {
- for (key in b) {
- if (_.has(b, key) && !(size--)) break;
- }
- result = !size;
+ var keys = _.keys(a), key;
+ length = keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (_.keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = keys[length];
+ if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
}
}
// Remove the first object from the stack of traversed objects.
aStack.pop();
bStack.pop();
- return result;
+ return true;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
- return eq(a, b, [], []);
+ return eq(a, b);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (obj == null) return true;
- if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
- for (var key in obj) if (_.has(obj, key)) return false;
- return true;
+ if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
+ return _.keys(obj).length === 0;
};
// Is a given value a DOM element?
@@ -1013,33 +1205,35 @@
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
- return toString.call(obj) == '[object Array]';
+ return toString.call(obj) === '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
- return obj === Object(obj);
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
};
- // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
- each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
+ _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
_['is' + name] = function(obj) {
- return toString.call(obj) == '[object ' + name + ']';
+ return toString.call(obj) === '[object ' + name + ']';
};
});
- // Define a fallback version of the method in browsers (ahem, IE), where
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
// there isn't any inspectable "Arguments" type.
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
- return !!(obj && _.has(obj, 'callee'));
+ return _.has(obj, 'callee');
};
}
- // Optimize `isFunction` if appropriate.
- if (typeof (/./) !== 'function') {
+ // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
+ // IE 11 (#1621), and in Safari 8 (#1929).
+ if (typeof /./ != 'function' && typeof Int8Array != 'object') {
_.isFunction = function(obj) {
- return typeof obj === 'function';
+ return typeof obj == 'function' || false;
};
}
@@ -1050,12 +1244,12 @@
// Is the given value `NaN`? (NaN is the only number which does not equal itself).
_.isNaN = function(obj) {
- return _.isNumber(obj) && obj != +obj;
+ return _.isNumber(obj) && obj !== +obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
- return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
};
// Is a given value equal to null?
@@ -1071,7 +1265,7 @@
// Shortcut function for checking if an object has a given property directly
// on itself (in other words, not on a prototype).
_.has = function(obj, key) {
- return hasOwnProperty.call(obj, key);
+ return obj != null && hasOwnProperty.call(obj, key);
};
// Utility Functions
@@ -1084,39 +1278,43 @@
return this;
};
- // Keep the identity function around for default iterators.
+ // Keep the identity function around for default iteratees.
_.identity = function(value) {
return value;
};
+ // Predicate-generating functions. Often useful outside of Underscore.
_.constant = function(value) {
- return function () {
+ return function() {
return value;
};
};
- _.property = function(key) {
- return function(obj) {
+ _.noop = function(){};
+
+ _.property = property;
+
+ // Generates a function for a given object that returns a given property.
+ _.propertyOf = function(obj) {
+ return obj == null ? function(){} : function(key) {
return obj[key];
};
};
- // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
- _.matches = function(attrs) {
+ // Returns a predicate for checking whether an object has a given set of
+ // `key:value` pairs.
+ _.matcher = _.matches = function(attrs) {
+ attrs = _.extendOwn({}, attrs);
return function(obj) {
- if (obj === attrs) return true; //avoid comparing an object to itself.
- for (var key in attrs) {
- if (attrs[key] !== obj[key])
- return false;
- }
- return true;
- }
+ return _.isMatch(obj, attrs);
+ };
};
// Run a function **n** times.
- _.times = function(n, iterator, context) {
+ _.times = function(n, iteratee, context) {
var accum = Array(Math.max(0, n));
- for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+ iteratee = optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
return accum;
};
@@ -1130,56 +1328,48 @@
};
// A (possibly faster) way to get the current timestamp as an integer.
- _.now = Date.now || function() { return new Date().getTime(); };
-
- // List of HTML entities for escaping.
- var entityMap = {
- escape: {
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;',
- '"': '&quot;',
- "'": '&#x27;'
- }
+ _.now = Date.now || function() {
+ return new Date().getTime();
};
- entityMap.unescape = _.invert(entityMap.escape);
- // Regexes containing the keys and values listed immediately above.
- var entityRegexes = {
- escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
- unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+ // List of HTML entities for escaping.
+ var escapeMap = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;',
+ '`': '&#x60;'
};
+ var unescapeMap = _.invert(escapeMap);
// Functions for escaping and unescaping strings to/from HTML interpolation.
- _.each(['escape', 'unescape'], function(method) {
- _[method] = function(string) {
- if (string == null) return '';
- return ('' + string).replace(entityRegexes[method], function(match) {
- return entityMap[method][match];
- });
+ var createEscaper = function(map) {
+ var escaper = function(match) {
+ return map[match];
};
- });
+ // Regexes for identifying a key that needs to be escaped
+ var source = '(?:' + _.keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+ };
+ _.escape = createEscaper(escapeMap);
+ _.unescape = createEscaper(unescapeMap);
// If the value of the named `property` is a function then invoke it with the
// `object` as context; otherwise, return it.
- _.result = function(object, property) {
- if (object == null) return void 0;
- var value = object[property];
+ _.result = function(object, property, fallback) {
+ var value = object == null ? void 0 : object[property];
+ if (value === void 0) {
+ value = fallback;
+ }
return _.isFunction(value) ? value.call(object) : value;
};
- // Add your own custom functions to the Underscore object.
- _.mixin = function(obj) {
- each(_.functions(obj), function(name) {
- var func = _[name] = obj[name];
- _.prototype[name] = function() {
- var args = [this._wrapped];
- push.apply(args, arguments);
- return result.call(this, func.apply(_, args));
- };
- });
- };
-
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
@@ -1208,22 +1398,26 @@
'\\': '\\',
'\r': 'r',
'\n': 'n',
- '\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
- var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+ var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
+
+ var escapeChar = function(match) {
+ return '\\' + escapes[match];
+ };
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
- _.template = function(text, data, settings) {
- var render;
+ // NB: `oldSettings` only exists for backwards compatibility.
+ _.template = function(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
- var matcher = new RegExp([
+ var matcher = RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
@@ -1233,19 +1427,18 @@
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
- source += text.slice(index, offset)
- .replace(escaper, function(match) { return '\\' + escapes[match]; });
+ source += text.slice(index, offset).replace(escaper, escapeChar);
+ index = offset + match.length;
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
- }
- if (interpolate) {
+ } else if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
- }
- if (evaluate) {
+ } else if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
- index = offset + match.length;
+
+ // Adobe VMs need the match returned to produce the correct offest.
return match;
});
source += "';\n";
@@ -1255,29 +1448,31 @@
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
- source + "return __p;\n";
+ source + 'return __p;\n';
try {
- render = new Function(settings.variable || 'obj', '_', source);
+ var render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
- if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
- // Provide the compiled function source as a convenience for precompilation.
- template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+ // Provide the compiled source as a convenience for precompilation.
+ var argument = settings.variable || 'obj';
+ template.source = 'function(' + argument + '){\n' + source + '}';
return template;
};
- // Add a "chain" function, which will delegate to the wrapper.
+ // Add a "chain" function. Start chaining a wrapped Underscore object.
_.chain = function(obj) {
- return _(obj).chain();
+ var instance = _(obj);
+ instance._chain = true;
+ return instance;
};
// OOP
@@ -1287,46 +1482,56 @@
// underscore functions. Wrapped objects may be chained.
// Helper function to continue chaining intermediate results.
- var result = function(obj) {
- return this._chain ? _(obj).chain() : obj;
+ var result = function(instance, obj) {
+ return instance._chain ? _(obj).chain() : obj;
+ };
+
+ // Add your own custom functions to the Underscore object.
+ _.mixin = function(obj) {
+ _.each(_.functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return result(this, func.apply(_, args));
+ };
+ });
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
- each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
var obj = this._wrapped;
method.apply(obj, arguments);
- if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
- return result.call(this, obj);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
+ return result(this, obj);
};
});
// Add all accessor Array functions to the wrapper.
- each(['concat', 'join', 'slice'], function(name) {
+ _.each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
_.prototype[name] = function() {
- return result.call(this, method.apply(this._wrapped, arguments));
+ return result(this, method.apply(this._wrapped, arguments));
};
});
- _.extend(_.prototype, {
-
- // Start chaining a wrapped Underscore object.
- chain: function() {
- this._chain = true;
- return this;
- },
+ // Extracts the result from a wrapped and chained object.
+ _.prototype.value = function() {
+ return this._wrapped;
+ };
- // Extracts the result from a wrapped and chained object.
- value: function() {
- return this._wrapped;
- }
+ // Provide unwrapping proxy for some methods used in engine operations
+ // such as arithmetic and JSON stringification.
+ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
- });
+ _.prototype.toString = function() {
+ return '' + this._wrapped;
+ };
// AMD registration happens at the end for compatibility with AMD loaders
// that may not enforce next-turn semantics on modules. Even though general
@@ -1340,4 +1545,4 @@
return _;
});
}
-}).call(this);
+}.call(this));
diff --git a/db_structure.xml b/db_structure.xml
index 6d1cf6973c5..870c0ab018d 100644
--- a/db_structure.xml
+++ b/db_structure.xml
@@ -102,6 +102,18 @@
<length>4</length>
</field>
+ <field>
+ <name>available</name>
+ <type>boolean</type>
+ <default>true</default>
+ <notnull>true</notnull>
+ </field>
+
+ <field>
+ <name>last_checked</name>
+ <type>integer</type>
+ </field>
+
<index>
<name>storages_id_index</name>
<unique>true</unique>
diff --git a/lib/base.php b/lib/base.php
index fde67839560..c0f3e50142e 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -407,6 +407,8 @@ class OC {
OC_Util::addScript('mimetype');
OC_Util::addScript('mimetypelist');
OC_Util::addVendorScript('snapjs/dist/latest/snap');
+ OC_Util::addVendorScript('core', 'backbone/backbone');
+ OC_Util::addScript('oc-backbone');
// avatars
if (\OC::$server->getSystemConfig()->getValue('enable_avatars', true) === true) {
@@ -835,7 +837,9 @@ class OC {
// Check if ownCloud is installed or in maintenance (update) mode
if (!$systemConfig->getValue('installed', false)) {
\OC::$server->getSession()->clear();
- $setupHelper = new OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults());
+ $setupHelper = new OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(),
+ \OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(),
+ \OC::$server->getSecureRandom());
$controller = new OC\Core\Setup\Controller($setupHelper);
$controller->run($_POST);
exit();
diff --git a/lib/l10n/ar.js b/lib/l10n/ar.js
index 48fa1ef0f84..9ec243672e1 100644
--- a/lib/l10n/ar.js
+++ b/lib/l10n/ar.js
@@ -26,15 +26,11 @@ OC.L10N.register(
"%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.",
"%s enter the database name." : "%s ادخل اسم فاعدة البيانات",
"%s you may not use dots in the database name" : "%s لا يسمح لك باستخدام نقطه (.) في اسم قاعدة البيانات",
- "MS SQL username and/or password not valid: %s" : "اسم المستخدم و/أو كلمة المرور لنظام MS SQL غير صحيح : %s",
- "You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.",
- "MySQL/MariaDB username and/or password not valid" : "اسم مستخدم أو كلمة مرور MySQL/MariaDB غير صحيحين",
- "DB Error: \"%s\"" : "خطأ في قواعد البيانات : \"%s\"",
- "Offending command was: \"%s\"" : "الأمر المخالف كان : \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "مستخدم MySQL/MariaDB '%s'@'localhost' موجود مسبقا",
- "Drop this user from MySQL/MariaDB." : "حذف هذا المستخدم من MySQL/MariaDB",
"Oracle connection could not be established" : "لم تنجح محاولة اتصال Oracle",
"Oracle username and/or password not valid" : "اسم المستخدم و/أو كلمة المرور لنظام Oracle غير صحيح",
+ "DB Error: \"%s\"" : "خطأ في قواعد البيانات : \"%s\"",
+ "Offending command was: \"%s\"" : "الأمر المخالف كان : \"%s\"",
+ "You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.",
"Offending command was: \"%s\", name: %s, password: %s" : "الأمر المخالف كان : \"%s\", اسم المستخدم : %s, كلمة المرور: %s",
"PostgreSQL username and/or password not valid" : "اسم المستخدم / أو كلمة المرور الخاصة بـPostgreSQL غير صحيحة",
"Set an admin username." : "اعداد اسم مستخدم للمدير",
diff --git a/lib/l10n/ar.json b/lib/l10n/ar.json
index 16ba66ec65a..06d47dc255a 100644
--- a/lib/l10n/ar.json
+++ b/lib/l10n/ar.json
@@ -24,15 +24,11 @@
"%s enter the database username." : "%s ادخل اسم المستخدم الخاص بقاعدة البيانات.",
"%s enter the database name." : "%s ادخل اسم فاعدة البيانات",
"%s you may not use dots in the database name" : "%s لا يسمح لك باستخدام نقطه (.) في اسم قاعدة البيانات",
- "MS SQL username and/or password not valid: %s" : "اسم المستخدم و/أو كلمة المرور لنظام MS SQL غير صحيح : %s",
- "You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.",
- "MySQL/MariaDB username and/or password not valid" : "اسم مستخدم أو كلمة مرور MySQL/MariaDB غير صحيحين",
- "DB Error: \"%s\"" : "خطأ في قواعد البيانات : \"%s\"",
- "Offending command was: \"%s\"" : "الأمر المخالف كان : \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "مستخدم MySQL/MariaDB '%s'@'localhost' موجود مسبقا",
- "Drop this user from MySQL/MariaDB." : "حذف هذا المستخدم من MySQL/MariaDB",
"Oracle connection could not be established" : "لم تنجح محاولة اتصال Oracle",
"Oracle username and/or password not valid" : "اسم المستخدم و/أو كلمة المرور لنظام Oracle غير صحيح",
+ "DB Error: \"%s\"" : "خطأ في قواعد البيانات : \"%s\"",
+ "Offending command was: \"%s\"" : "الأمر المخالف كان : \"%s\"",
+ "You need to enter either an existing account or the administrator." : "انت بحاجة لكتابة اسم مستخدم موجود أو حساب المدير.",
"Offending command was: \"%s\", name: %s, password: %s" : "الأمر المخالف كان : \"%s\", اسم المستخدم : %s, كلمة المرور: %s",
"PostgreSQL username and/or password not valid" : "اسم المستخدم / أو كلمة المرور الخاصة بـPostgreSQL غير صحيحة",
"Set an admin username." : "اعداد اسم مستخدم للمدير",
diff --git a/lib/l10n/ast.js b/lib/l10n/ast.js
index 65fc143fbe4..3fb120b255b 100644
--- a/lib/l10n/ast.js
+++ b/lib/l10n/ast.js
@@ -45,17 +45,11 @@ OC.L10N.register(
"%s enter the database username." : "%s introducir l'usuariu de la base de datos.",
"%s enter the database name." : "%s introducir nome de la base de datos.",
"%s you may not use dots in the database name" : "%s nun pues usar puntos nel nome de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Nome d'usuariu o contraseña MS SQL non válidos: %s",
- "You need to enter either an existing account or the administrator." : "Tienes d'inxertar una cuenta esistente o la del alministrador.",
- "MySQL/MariaDB username and/or password not valid" : "Nome d'usuariu o contraseña MySQL/MariaDB non válidos",
- "DB Error: \"%s\"" : "Fallu BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comandu infractor: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "usuariu MySQL/MariaDB '%s'@'localhost' yá esiste.",
- "Drop this user from MySQL/MariaDB" : "Desaniciar esti usuariu de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Yá esiste l'usuariu de MySQL/MariaDB '%s'@'%%'",
- "Drop this user from MySQL/MariaDB." : "Desaniciar esti usuariu de MySQL/MariaDB",
"Oracle connection could not be established" : "Nun pudo afitase la conexón d'Oracle",
"Oracle username and/or password not valid" : "Nome d'usuariu o contraseña d'Oracle non válidos",
+ "DB Error: \"%s\"" : "Fallu BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comandu infractor: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tienes d'inxertar una cuenta esistente o la del alministrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "El comandu infractor foi: \"%s\", nome: %s, contraseña: %s",
"PostgreSQL username and/or password not valid" : "Nome d'usuariu o contraseña PostgreSQL non válidos",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nun ta sofitáu y %s nun furrulará afayadizamente nesta plataforma. ¡Úsalu baxo'l to riesgu!",
diff --git a/lib/l10n/ast.json b/lib/l10n/ast.json
index 675451858e9..f51d08ad731 100644
--- a/lib/l10n/ast.json
+++ b/lib/l10n/ast.json
@@ -43,17 +43,11 @@
"%s enter the database username." : "%s introducir l'usuariu de la base de datos.",
"%s enter the database name." : "%s introducir nome de la base de datos.",
"%s you may not use dots in the database name" : "%s nun pues usar puntos nel nome de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Nome d'usuariu o contraseña MS SQL non válidos: %s",
- "You need to enter either an existing account or the administrator." : "Tienes d'inxertar una cuenta esistente o la del alministrador.",
- "MySQL/MariaDB username and/or password not valid" : "Nome d'usuariu o contraseña MySQL/MariaDB non válidos",
- "DB Error: \"%s\"" : "Fallu BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comandu infractor: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "usuariu MySQL/MariaDB '%s'@'localhost' yá esiste.",
- "Drop this user from MySQL/MariaDB" : "Desaniciar esti usuariu de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Yá esiste l'usuariu de MySQL/MariaDB '%s'@'%%'",
- "Drop this user from MySQL/MariaDB." : "Desaniciar esti usuariu de MySQL/MariaDB",
"Oracle connection could not be established" : "Nun pudo afitase la conexón d'Oracle",
"Oracle username and/or password not valid" : "Nome d'usuariu o contraseña d'Oracle non válidos",
+ "DB Error: \"%s\"" : "Fallu BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comandu infractor: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tienes d'inxertar una cuenta esistente o la del alministrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "El comandu infractor foi: \"%s\", nome: %s, contraseña: %s",
"PostgreSQL username and/or password not valid" : "Nome d'usuariu o contraseña PostgreSQL non válidos",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nun ta sofitáu y %s nun furrulará afayadizamente nesta plataforma. ¡Úsalu baxo'l to riesgu!",
diff --git a/lib/l10n/az.js b/lib/l10n/az.js
index fa7a457a1c2..de944f63c0e 100644
--- a/lib/l10n/az.js
+++ b/lib/l10n/az.js
@@ -24,13 +24,9 @@ OC.L10N.register(
"Unknown user" : "Istifadəçi tanınmır ",
"%s enter the database username." : "Verilənlər bazası istifadəçi adını %s daxil et.",
"%s enter the database name." : "Verilənlər bazası adını %s daxil et.",
- "MS SQL username and/or password not valid: %s" : "MS SQL istifadəçi adı və/ya şifrəsi düzgün deyil : %s",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB istifadəçi adı və/ya şifrəsi düzgün deyil :",
- "DB Error: \"%s\"" : "DB səhvi: \"%s\"",
- "Drop this user from MySQL/MariaDB" : "Bu istifadəçini MySQL/MariaDB-dən sil",
- "Drop this user from MySQL/MariaDB." : "Bu istifadəçini MySQL/MariaDB-dən sil.",
"Oracle connection could not be established" : "Oracle qoşulması alınmır",
"Oracle username and/or password not valid" : "Oracle istifadəçi adı və/ya şifrəsi düzgün deyil",
+ "DB Error: \"%s\"" : "DB səhvi: \"%s\"",
"Set an admin username." : "İnzibatçı istifadəçi adını təyin et.",
"Set an admin password." : "İnzibatçı şifrəsini təyin et.",
"%s shared »%s« with you" : "%s yayımlandı »%s« sizinlə",
diff --git a/lib/l10n/az.json b/lib/l10n/az.json
index 0b10e9b3794..1c1fb247747 100644
--- a/lib/l10n/az.json
+++ b/lib/l10n/az.json
@@ -22,13 +22,9 @@
"Unknown user" : "Istifadəçi tanınmır ",
"%s enter the database username." : "Verilənlər bazası istifadəçi adını %s daxil et.",
"%s enter the database name." : "Verilənlər bazası adını %s daxil et.",
- "MS SQL username and/or password not valid: %s" : "MS SQL istifadəçi adı və/ya şifrəsi düzgün deyil : %s",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB istifadəçi adı və/ya şifrəsi düzgün deyil :",
- "DB Error: \"%s\"" : "DB səhvi: \"%s\"",
- "Drop this user from MySQL/MariaDB" : "Bu istifadəçini MySQL/MariaDB-dən sil",
- "Drop this user from MySQL/MariaDB." : "Bu istifadəçini MySQL/MariaDB-dən sil.",
"Oracle connection could not be established" : "Oracle qoşulması alınmır",
"Oracle username and/or password not valid" : "Oracle istifadəçi adı və/ya şifrəsi düzgün deyil",
+ "DB Error: \"%s\"" : "DB səhvi: \"%s\"",
"Set an admin username." : "İnzibatçı istifadəçi adını təyin et.",
"Set an admin password." : "İnzibatçı şifrəsini təyin et.",
"%s shared »%s« with you" : "%s yayımlandı »%s« sizinlə",
diff --git a/lib/l10n/bg_BG.js b/lib/l10n/bg_BG.js
index fd78bc865c3..a02d35061ef 100644
--- a/lib/l10n/bg_BG.js
+++ b/lib/l10n/bg_BG.js
@@ -52,17 +52,11 @@ OC.L10N.register(
"%s enter the database username." : "%s въведи потребителско име за базата данни.",
"%s enter the database name." : "%s въведи име на базата данни.",
"%s you may not use dots in the database name" : "%s, не може да ползваш точки в името на базата данни.",
- "MS SQL username and/or password not valid: %s" : "Невалидно MS SQL потребителско име и/или парола: %s.",
- "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB потребителското име и/или паролата са невалидни.",
- "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".",
- "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB потребител '%s'@'localhost' вече съществува.",
- "Drop this user from MySQL/MariaDB" : "Премахни този потребител от MySQL/MariaDB.",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB потребител '%s'@'%%' вече съществува.",
- "Drop this user from MySQL/MariaDB." : "Премахни този потребител от MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle връзка не можа да се осъществи.",
"Oracle username and/or password not valid" : "Невалидно Oracle потребителско име и/или парола.",
+ "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".",
+ "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".",
+ "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.",
"Offending command was: \"%s\", name: %s, password: %s" : "Проблемната команда беше: \"%s\", име: %s, парола: %s.",
"PostgreSQL username and/or password not valid" : "Невалидно PostgreSQL потребителско име и/или парола.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не се подържа и %s няма да работи правилно на тази платформа. Използвайте го на свой собствен риск!",
diff --git a/lib/l10n/bg_BG.json b/lib/l10n/bg_BG.json
index 51b5d562bbd..3b9b899e53f 100644
--- a/lib/l10n/bg_BG.json
+++ b/lib/l10n/bg_BG.json
@@ -50,17 +50,11 @@
"%s enter the database username." : "%s въведи потребителско име за базата данни.",
"%s enter the database name." : "%s въведи име на базата данни.",
"%s you may not use dots in the database name" : "%s, не може да ползваш точки в името на базата данни.",
- "MS SQL username and/or password not valid: %s" : "Невалидно MS SQL потребителско име и/или парола: %s.",
- "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB потребителското име и/или паролата са невалидни.",
- "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".",
- "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB потребител '%s'@'localhost' вече съществува.",
- "Drop this user from MySQL/MariaDB" : "Премахни този потребител от MySQL/MariaDB.",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB потребител '%s'@'%%' вече съществува.",
- "Drop this user from MySQL/MariaDB." : "Премахни този потребител от MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle връзка не можа да се осъществи.",
"Oracle username and/or password not valid" : "Невалидно Oracle потребителско име и/или парола.",
+ "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".",
+ "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".",
+ "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.",
"Offending command was: \"%s\", name: %s, password: %s" : "Проблемната команда беше: \"%s\", име: %s, парола: %s.",
"PostgreSQL username and/or password not valid" : "Невалидно PostgreSQL потребителско име и/или парола.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не се подържа и %s няма да работи правилно на тази платформа. Използвайте го на свой собствен риск!",
diff --git a/lib/l10n/ca.js b/lib/l10n/ca.js
index d7c908fee30..1a2b29e088b 100644
--- a/lib/l10n/ca.js
+++ b/lib/l10n/ca.js
@@ -44,17 +44,11 @@ OC.L10N.register(
"%s enter the database username." : "%s escriviu el nom d'usuari de la base de dades.",
"%s enter the database name." : "%s escriviu el nom de la base de dades.",
"%s you may not use dots in the database name" : "%s no podeu usar punts en el nom de la base de dades",
- "MS SQL username and/or password not valid: %s" : "Nom d'usuari i/o contrasenya MS SQL no vàlids: %s",
- "You need to enter either an existing account or the administrator." : "Heu d'escriure un compte existent o el d'administrador.",
- "MySQL/MariaDB username and/or password not valid" : "El nom d'usuari i/o la contrasenya de MySQL/MariaDB no són vàlids",
- "DB Error: \"%s\"" : "Error DB: \"%s\"",
- "Offending command was: \"%s\"" : "L'ordre en conflicte és: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "L'usuari MySQL/MariaDB '%s'@'localhost' ja existeix.",
- "Drop this user from MySQL/MariaDB" : "Esborreu aquest usuari de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "L'usuari MySQL/MariaDB '%s'@'%%' ja existeix",
- "Drop this user from MySQL/MariaDB." : "Esborreu aquest usuari de MySQL/MariaDB.",
"Oracle connection could not be established" : "No s'ha pogut establir la connexió Oracle",
"Oracle username and/or password not valid" : "Nom d'usuari i/o contrasenya Oracle no vàlids",
+ "DB Error: \"%s\"" : "Error DB: \"%s\"",
+ "Offending command was: \"%s\"" : "L'ordre en conflicte és: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Heu d'escriure un compte existent o el d'administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "L'ordre en conflicte és: \"%s\", nom: %s, contrasenya: %s",
"PostgreSQL username and/or password not valid" : "Nom d'usuari i/o contrasenya PostgreSQL no vàlids",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no té suport i %s no funcionarà correctament en aquesta plataforma. Useu-ho al vostre risc!",
diff --git a/lib/l10n/ca.json b/lib/l10n/ca.json
index 0622ea4e2eb..2fac46f86a0 100644
--- a/lib/l10n/ca.json
+++ b/lib/l10n/ca.json
@@ -42,17 +42,11 @@
"%s enter the database username." : "%s escriviu el nom d'usuari de la base de dades.",
"%s enter the database name." : "%s escriviu el nom de la base de dades.",
"%s you may not use dots in the database name" : "%s no podeu usar punts en el nom de la base de dades",
- "MS SQL username and/or password not valid: %s" : "Nom d'usuari i/o contrasenya MS SQL no vàlids: %s",
- "You need to enter either an existing account or the administrator." : "Heu d'escriure un compte existent o el d'administrador.",
- "MySQL/MariaDB username and/or password not valid" : "El nom d'usuari i/o la contrasenya de MySQL/MariaDB no són vàlids",
- "DB Error: \"%s\"" : "Error DB: \"%s\"",
- "Offending command was: \"%s\"" : "L'ordre en conflicte és: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "L'usuari MySQL/MariaDB '%s'@'localhost' ja existeix.",
- "Drop this user from MySQL/MariaDB" : "Esborreu aquest usuari de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "L'usuari MySQL/MariaDB '%s'@'%%' ja existeix",
- "Drop this user from MySQL/MariaDB." : "Esborreu aquest usuari de MySQL/MariaDB.",
"Oracle connection could not be established" : "No s'ha pogut establir la connexió Oracle",
"Oracle username and/or password not valid" : "Nom d'usuari i/o contrasenya Oracle no vàlids",
+ "DB Error: \"%s\"" : "Error DB: \"%s\"",
+ "Offending command was: \"%s\"" : "L'ordre en conflicte és: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Heu d'escriure un compte existent o el d'administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "L'ordre en conflicte és: \"%s\", nom: %s, contrasenya: %s",
"PostgreSQL username and/or password not valid" : "Nom d'usuari i/o contrasenya PostgreSQL no vàlids",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no té suport i %s no funcionarà correctament en aquesta plataforma. Useu-ho al vostre risc!",
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index da6cb13a00e..8885ecd6e10 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "Zadejte uživatelské jméno %s databáze.",
"%s enter the database name." : "Zadejte název databáze pro %s databáze.",
"%s you may not use dots in the database name" : "V názvu databáze %s nesmíte používat tečky.",
- "MS SQL username and/or password not valid: %s" : "Uživatelské jméno či heslo MSSQL není platné: %s",
- "You need to enter either an existing account or the administrator." : "Musíte zadat existující účet či správce.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB uživatelské jméno a/nebo heslo je neplatné",
- "DB Error: \"%s\"" : "Chyba databáze: \"%s\"",
- "Offending command was: \"%s\"" : "Příslušný příkaz byl: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB uživatel '%s'@'localhost' již existuje.",
- "Drop this user from MySQL/MariaDB" : "Smazat tohoto uživatele z MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB uživatel '%s'@'%%' již existuje",
- "Drop this user from MySQL/MariaDB." : "Smazat tohoto uživatele z MySQL/MariaDB.",
"Oracle connection could not be established" : "Spojení s Oracle nemohlo být navázáno",
"Oracle username and/or password not valid" : "Uživatelské jméno či heslo Oracle není platné",
+ "DB Error: \"%s\"" : "Chyba databáze: \"%s\"",
+ "Offending command was: \"%s\"" : "Příslušný příkaz byl: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Musíte zadat existující účet či správce.",
"Offending command was: \"%s\", name: %s, password: %s" : "Příslušný příkaz byl: \"%s\", jméno: %s, heslo: %s",
"PostgreSQL username and/or password not valid" : "Uživatelské jméno či heslo PostgreSQL není platné",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X není podporován a %s nebude na této platformě správně fungovat. Používejte pouze na vlastní nebezpečí!",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index c493b357d35..c5f50a73848 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "Zadejte uživatelské jméno %s databáze.",
"%s enter the database name." : "Zadejte název databáze pro %s databáze.",
"%s you may not use dots in the database name" : "V názvu databáze %s nesmíte používat tečky.",
- "MS SQL username and/or password not valid: %s" : "Uživatelské jméno či heslo MSSQL není platné: %s",
- "You need to enter either an existing account or the administrator." : "Musíte zadat existující účet či správce.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB uživatelské jméno a/nebo heslo je neplatné",
- "DB Error: \"%s\"" : "Chyba databáze: \"%s\"",
- "Offending command was: \"%s\"" : "Příslušný příkaz byl: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB uživatel '%s'@'localhost' již existuje.",
- "Drop this user from MySQL/MariaDB" : "Smazat tohoto uživatele z MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB uživatel '%s'@'%%' již existuje",
- "Drop this user from MySQL/MariaDB." : "Smazat tohoto uživatele z MySQL/MariaDB.",
"Oracle connection could not be established" : "Spojení s Oracle nemohlo být navázáno",
"Oracle username and/or password not valid" : "Uživatelské jméno či heslo Oracle není platné",
+ "DB Error: \"%s\"" : "Chyba databáze: \"%s\"",
+ "Offending command was: \"%s\"" : "Příslušný příkaz byl: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Musíte zadat existující účet či správce.",
"Offending command was: \"%s\", name: %s, password: %s" : "Příslušný příkaz byl: \"%s\", jméno: %s, heslo: %s",
"PostgreSQL username and/or password not valid" : "Uživatelské jméno či heslo PostgreSQL není platné",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X není podporován a %s nebude na této platformě správně fungovat. Používejte pouze na vlastní nebezpečí!",
diff --git a/lib/l10n/cy_GB.js b/lib/l10n/cy_GB.js
index 79f51f98af8..851e37b43ae 100644
--- a/lib/l10n/cy_GB.js
+++ b/lib/l10n/cy_GB.js
@@ -17,11 +17,10 @@ OC.L10N.register(
"%s enter the database username." : "%s rhowch enw defnyddiwr y gronfa ddata.",
"%s enter the database name." : "%s rhowch enw'r gronfa ddata.",
"%s you may not use dots in the database name" : "%s does dim hawl defnyddio dot yn enw'r gronfa ddata",
- "MS SQL username and/or password not valid: %s" : "Enw a/neu gyfrinair MS SQL annilys: %s",
- "You need to enter either an existing account or the administrator." : "Rhaid i chi naill ai gyflwyno cyfrif presennol neu'r gweinyddwr.",
+ "Oracle username and/or password not valid" : "Enw a/neu gyfrinair Oracle annilys",
"DB Error: \"%s\"" : "Gwall DB: \"%s\"",
"Offending command was: \"%s\"" : "Y gorchymyn wnaeth beri tramgwydd oedd: \"%s\"",
- "Oracle username and/or password not valid" : "Enw a/neu gyfrinair Oracle annilys",
+ "You need to enter either an existing account or the administrator." : "Rhaid i chi naill ai gyflwyno cyfrif presennol neu'r gweinyddwr.",
"Offending command was: \"%s\", name: %s, password: %s" : "Y gorchymyn wnaeth beri tramgwydd oedd: \"%s\", enw: %s, cyfrinair: %s",
"PostgreSQL username and/or password not valid" : "Enw a/neu gyfrinair PostgreSQL annilys",
"Set an admin username." : "Creu enw defnyddiwr i'r gweinyddwr.",
diff --git a/lib/l10n/cy_GB.json b/lib/l10n/cy_GB.json
index 8290a0ea0e4..2088b3c2f9d 100644
--- a/lib/l10n/cy_GB.json
+++ b/lib/l10n/cy_GB.json
@@ -15,11 +15,10 @@
"%s enter the database username." : "%s rhowch enw defnyddiwr y gronfa ddata.",
"%s enter the database name." : "%s rhowch enw'r gronfa ddata.",
"%s you may not use dots in the database name" : "%s does dim hawl defnyddio dot yn enw'r gronfa ddata",
- "MS SQL username and/or password not valid: %s" : "Enw a/neu gyfrinair MS SQL annilys: %s",
- "You need to enter either an existing account or the administrator." : "Rhaid i chi naill ai gyflwyno cyfrif presennol neu'r gweinyddwr.",
+ "Oracle username and/or password not valid" : "Enw a/neu gyfrinair Oracle annilys",
"DB Error: \"%s\"" : "Gwall DB: \"%s\"",
"Offending command was: \"%s\"" : "Y gorchymyn wnaeth beri tramgwydd oedd: \"%s\"",
- "Oracle username and/or password not valid" : "Enw a/neu gyfrinair Oracle annilys",
+ "You need to enter either an existing account or the administrator." : "Rhaid i chi naill ai gyflwyno cyfrif presennol neu'r gweinyddwr.",
"Offending command was: \"%s\", name: %s, password: %s" : "Y gorchymyn wnaeth beri tramgwydd oedd: \"%s\", enw: %s, cyfrinair: %s",
"PostgreSQL username and/or password not valid" : "Enw a/neu gyfrinair PostgreSQL annilys",
"Set an admin username." : "Creu enw defnyddiwr i'r gweinyddwr.",
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index c086fd058ed..877f97ad8b1 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s indtast database brugernavnet.",
"%s enter the database name." : "%s indtast database navnet.",
"%s you may not use dots in the database name" : "%s du må ikke bruge punktummer i databasenavnet.",
- "MS SQL username and/or password not valid: %s" : "MS SQL brugernavn og/eller adgangskode ikke er gyldigt: %s",
- "You need to enter either an existing account or the administrator." : "Du bliver nødt til at indtaste en eksisterende bruger eller en administrator.",
- "MySQL/MariaDB username and/or password not valid" : "Ugyldigt MySQL/MariaDB brugernavn og/eller kodeord ",
- "DB Error: \"%s\"" : "Databasefejl: \"%s\"",
- "Offending command was: \"%s\"" : "Fejlende kommando var: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB bruger '%s'@'localhost' eksistere allerede.",
- "Drop this user from MySQL/MariaDB" : "Slet denne bruger fra MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB bruger '%s'@'%%' eksistere allerede",
- "Drop this user from MySQL/MariaDB." : "Drop denne bruger fra MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle forbindelsen kunne ikke etableres",
"Oracle username and/or password not valid" : "Oracle brugernavn og/eller kodeord er ikke gyldigt.",
+ "DB Error: \"%s\"" : "Databasefejl: \"%s\"",
+ "Offending command was: \"%s\"" : "Fejlende kommando var: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du bliver nødt til at indtaste en eksisterende bruger eller en administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Fejlende kommando var: \"%s\", navn: %s, password: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL brugernavn og/eller kodeord er ikke gyldigt.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X understøttes ikke og %s vil ikke virke optimalt på denne platform. Anvend på eget ansvar!",
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index 15e48886c46..bf5429d002e 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s indtast database brugernavnet.",
"%s enter the database name." : "%s indtast database navnet.",
"%s you may not use dots in the database name" : "%s du må ikke bruge punktummer i databasenavnet.",
- "MS SQL username and/or password not valid: %s" : "MS SQL brugernavn og/eller adgangskode ikke er gyldigt: %s",
- "You need to enter either an existing account or the administrator." : "Du bliver nødt til at indtaste en eksisterende bruger eller en administrator.",
- "MySQL/MariaDB username and/or password not valid" : "Ugyldigt MySQL/MariaDB brugernavn og/eller kodeord ",
- "DB Error: \"%s\"" : "Databasefejl: \"%s\"",
- "Offending command was: \"%s\"" : "Fejlende kommando var: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB bruger '%s'@'localhost' eksistere allerede.",
- "Drop this user from MySQL/MariaDB" : "Slet denne bruger fra MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB bruger '%s'@'%%' eksistere allerede",
- "Drop this user from MySQL/MariaDB." : "Drop denne bruger fra MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle forbindelsen kunne ikke etableres",
"Oracle username and/or password not valid" : "Oracle brugernavn og/eller kodeord er ikke gyldigt.",
+ "DB Error: \"%s\"" : "Databasefejl: \"%s\"",
+ "Offending command was: \"%s\"" : "Fejlende kommando var: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du bliver nødt til at indtaste en eksisterende bruger eller en administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Fejlende kommando var: \"%s\", navn: %s, password: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL brugernavn og/eller kodeord er ikke gyldigt.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X understøttes ikke og %s vil ikke virke optimalt på denne platform. Anvend på eget ansvar!",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index c094d461ecd..f4341e53b4d 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s gib den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s gib den Datenbanknamen an.",
"%s you may not use dots in the database name" : "%s Der Datenbankname darf keine Punkte enthalten",
- "MS SQL username and/or password not valid: %s" : "MS SQL-Benutzername und/oder -Passwort ungültig: %s",
- "You need to enter either an existing account or the administrator." : "Du musst entweder ein existierendes Benutzerkonto oder das Administratorenkonto angeben.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-Benutzername und/oder -Passwort sind nicht gültig",
- "DB Error: \"%s\"" : "DB-Fehler: „%s“",
- "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB Benutzer '%s'@'localhost' existiert bereits.",
- "Drop this user from MySQL/MariaDB" : "Diesen Benutzer aus MySQL/MariaDB löschen",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-Benutzer '%s'@'%%' existiert bereits",
- "Drop this user from MySQL/MariaDB." : "Diesen Benutzer aus MySQL/MariaDB löschen.",
"Oracle connection could not be established" : "Es konnte keine Verbindung zur Oracle-Datenbank hergestellt werden",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
+ "DB Error: \"%s\"" : "DB-Fehler: „%s“",
+ "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
+ "You need to enter either an existing account or the administrator." : "Du musst entweder ein existierendes Benutzerkonto oder das Administratorenkonto angeben.",
"Offending command was: \"%s\", name: %s, password: %s" : "Fehlerhafter Befehl war: „%s“, Name: %s, Passwort: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-Benutzername und/oder -Passwort ungültig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X wird nicht unterstützt und %s wird auf dieser Plattform nicht richtig funktionieren. Die Benutzung erfolgt auf eigene Gefahr!",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index f8097ba0bf9..18dbd51317e 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s gib den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s gib den Datenbanknamen an.",
"%s you may not use dots in the database name" : "%s Der Datenbankname darf keine Punkte enthalten",
- "MS SQL username and/or password not valid: %s" : "MS SQL-Benutzername und/oder -Passwort ungültig: %s",
- "You need to enter either an existing account or the administrator." : "Du musst entweder ein existierendes Benutzerkonto oder das Administratorenkonto angeben.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-Benutzername und/oder -Passwort sind nicht gültig",
- "DB Error: \"%s\"" : "DB-Fehler: „%s“",
- "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB Benutzer '%s'@'localhost' existiert bereits.",
- "Drop this user from MySQL/MariaDB" : "Diesen Benutzer aus MySQL/MariaDB löschen",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-Benutzer '%s'@'%%' existiert bereits",
- "Drop this user from MySQL/MariaDB." : "Diesen Benutzer aus MySQL/MariaDB löschen.",
"Oracle connection could not be established" : "Es konnte keine Verbindung zur Oracle-Datenbank hergestellt werden",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
+ "DB Error: \"%s\"" : "DB-Fehler: „%s“",
+ "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
+ "You need to enter either an existing account or the administrator." : "Du musst entweder ein existierendes Benutzerkonto oder das Administratorenkonto angeben.",
"Offending command was: \"%s\", name: %s, password: %s" : "Fehlerhafter Befehl war: „%s“, Name: %s, Passwort: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-Benutzername und/oder -Passwort ungültig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X wird nicht unterstützt und %s wird auf dieser Plattform nicht richtig funktionieren. Die Benutzung erfolgt auf eigene Gefahr!",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index ec4fd632552..9eda034348f 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s geben Sie den Datenbank-Namen an.",
"%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten",
- "MS SQL username and/or password not valid: %s" : "MS SQL-Benutzername und/oder -Passwort ungültig: %s",
- "You need to enter either an existing account or the administrator." : "Sie müssen entweder ein existierendes Benutzerkonto oder das Administratoren-Konto angeben.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-Benutzername und/oder -Passwort sind nicht gültig",
- "DB Error: \"%s\"" : "DB-Fehler: „%s“",
- "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB Benutzer '%s'@'localhost' existiert bereits.",
- "Drop this user from MySQL/MariaDB" : "Löschen Sie diesen Benutzer von MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-Benutzer '%s'@'%%' existiert bereits",
- "Drop this user from MySQL/MariaDB." : "Löschen Sie diesen Benutzer von MySQL/MariaDB.",
"Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
+ "DB Error: \"%s\"" : "DB-Fehler: „%s“",
+ "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
+ "You need to enter either an existing account or the administrator." : "Sie müssen entweder ein existierendes Benutzerkonto oder das Administratoren-Konto angeben.",
"Offending command was: \"%s\", name: %s, password: %s" : "Fehlerhafter Befehl war: „%s“, Name: %s, Passwort: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-Benutzername und/oder -Passwort ungültig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X wird nicht unterstützt und %s wird auf dieser Plattform nicht richtig funktionieren. Die Benutzung erfolgt auf eigene Gefahr!",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 44d5cab7ca3..9a9b4341a56 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s geben Sie den Datenbank-Namen an.",
"%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten",
- "MS SQL username and/or password not valid: %s" : "MS SQL-Benutzername und/oder -Passwort ungültig: %s",
- "You need to enter either an existing account or the administrator." : "Sie müssen entweder ein existierendes Benutzerkonto oder das Administratoren-Konto angeben.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-Benutzername und/oder -Passwort sind nicht gültig",
- "DB Error: \"%s\"" : "DB-Fehler: „%s“",
- "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB Benutzer '%s'@'localhost' existiert bereits.",
- "Drop this user from MySQL/MariaDB" : "Löschen Sie diesen Benutzer von MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-Benutzer '%s'@'%%' existiert bereits",
- "Drop this user from MySQL/MariaDB." : "Löschen Sie diesen Benutzer von MySQL/MariaDB.",
"Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
+ "DB Error: \"%s\"" : "DB-Fehler: „%s“",
+ "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
+ "You need to enter either an existing account or the administrator." : "Sie müssen entweder ein existierendes Benutzerkonto oder das Administratoren-Konto angeben.",
"Offending command was: \"%s\", name: %s, password: %s" : "Fehlerhafter Befehl war: „%s“, Name: %s, Passwort: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-Benutzername und/oder -Passwort ungültig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X wird nicht unterstützt und %s wird auf dieser Plattform nicht richtig funktionieren. Die Benutzung erfolgt auf eigene Gefahr!",
diff --git a/lib/l10n/el.js b/lib/l10n/el.js
index d687c1eb851..2e47db30473 100644
--- a/lib/l10n/el.js
+++ b/lib/l10n/el.js
@@ -63,17 +63,11 @@ OC.L10N.register(
"%s enter the database username." : "%s εισάγετε το όνομα χρήστη της βάσης δεδομένων.",
"%s enter the database name." : "%s εισάγετε το όνομα της βάσης δεδομένων.",
"%s you may not use dots in the database name" : "%s μάλλον δεν χρησιμοποιείτε τελείες στο όνομα της βάσης δεδομένων",
- "MS SQL username and/or password not valid: %s" : "Το όνομα χρήστη και/ή ο κωδικός της MS SQL δεν είναι έγκυρα: %s",
- "You need to enter either an existing account or the administrator." : "Χρειάζεται να εισάγετε είτε έναν υπάρχον λογαριασμό ή του διαχειριστή.",
- "MySQL/MariaDB username and/or password not valid" : "Μη έγκυρο όνομα χρήστη ή/και συνθηματικό της MySQL/MariaDB",
- "DB Error: \"%s\"" : "Σφάλμα Βάσης Δεδομένων: \"%s\"",
- "Offending command was: \"%s\"" : "Η εντολη παραβατικοτητας ηταν: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Υπάρχει ήδη ο χρήστης '%s'@'localhost' της MySQL/MariaDB",
- "Drop this user from MySQL/MariaDB" : "Κατάργηση του χρήστη από MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Υπάρχει ήδη ο χρήστης '%s'@'%%' της MySQL/MariaDB",
- "Drop this user from MySQL/MariaDB." : "Κατάργηση του χρήστη από MySQL/MariaDB.",
"Oracle connection could not be established" : "Αδυναμία σύνδεσης Oracle",
"Oracle username and/or password not valid" : "Μη έγκυρος χρήστης και/ή συνθηματικό της Oracle",
+ "DB Error: \"%s\"" : "Σφάλμα Βάσης Δεδομένων: \"%s\"",
+ "Offending command was: \"%s\"" : "Η εντολη παραβατικοτητας ηταν: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Χρειάζεται να εισάγετε είτε έναν υπάρχον λογαριασμό ή του διαχειριστή.",
"Offending command was: \"%s\", name: %s, password: %s" : "Η εντολη παραβατικοτητας ηταν: \"%s\", ονομα: %s, κωδικος: %s",
"PostgreSQL username and/or password not valid" : "Μη έγκυρος χρήστης και/ή συνθηματικό της PostgreSQL",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Το Mac OS X δεν υποστηρίζεται και το %s δεν θα λειτουργήσει σωστά σε αυτή την πλατφόρμα. Χρησιμοποιείτε με δική σας ευθύνη!",
diff --git a/lib/l10n/el.json b/lib/l10n/el.json
index 05ca5aa4a2f..7b0b9b149ad 100644
--- a/lib/l10n/el.json
+++ b/lib/l10n/el.json
@@ -61,17 +61,11 @@
"%s enter the database username." : "%s εισάγετε το όνομα χρήστη της βάσης δεδομένων.",
"%s enter the database name." : "%s εισάγετε το όνομα της βάσης δεδομένων.",
"%s you may not use dots in the database name" : "%s μάλλον δεν χρησιμοποιείτε τελείες στο όνομα της βάσης δεδομένων",
- "MS SQL username and/or password not valid: %s" : "Το όνομα χρήστη και/ή ο κωδικός της MS SQL δεν είναι έγκυρα: %s",
- "You need to enter either an existing account or the administrator." : "Χρειάζεται να εισάγετε είτε έναν υπάρχον λογαριασμό ή του διαχειριστή.",
- "MySQL/MariaDB username and/or password not valid" : "Μη έγκυρο όνομα χρήστη ή/και συνθηματικό της MySQL/MariaDB",
- "DB Error: \"%s\"" : "Σφάλμα Βάσης Δεδομένων: \"%s\"",
- "Offending command was: \"%s\"" : "Η εντολη παραβατικοτητας ηταν: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Υπάρχει ήδη ο χρήστης '%s'@'localhost' της MySQL/MariaDB",
- "Drop this user from MySQL/MariaDB" : "Κατάργηση του χρήστη από MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Υπάρχει ήδη ο χρήστης '%s'@'%%' της MySQL/MariaDB",
- "Drop this user from MySQL/MariaDB." : "Κατάργηση του χρήστη από MySQL/MariaDB.",
"Oracle connection could not be established" : "Αδυναμία σύνδεσης Oracle",
"Oracle username and/or password not valid" : "Μη έγκυρος χρήστης και/ή συνθηματικό της Oracle",
+ "DB Error: \"%s\"" : "Σφάλμα Βάσης Δεδομένων: \"%s\"",
+ "Offending command was: \"%s\"" : "Η εντολη παραβατικοτητας ηταν: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Χρειάζεται να εισάγετε είτε έναν υπάρχον λογαριασμό ή του διαχειριστή.",
"Offending command was: \"%s\", name: %s, password: %s" : "Η εντολη παραβατικοτητας ηταν: \"%s\", ονομα: %s, κωδικος: %s",
"PostgreSQL username and/or password not valid" : "Μη έγκυρος χρήστης και/ή συνθηματικό της PostgreSQL",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Το Mac OS X δεν υποστηρίζεται και το %s δεν θα λειτουργήσει σωστά σε αυτή την πλατφόρμα. Χρησιμοποιείτε με δική σας ευθύνη!",
diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js
index f14cbbfdfea..0e252700f5a 100644
--- a/lib/l10n/en_GB.js
+++ b/lib/l10n/en_GB.js
@@ -63,17 +63,11 @@ OC.L10N.register(
"%s enter the database username." : "%s enter the database username.",
"%s enter the database name." : "%s enter the database name.",
"%s you may not use dots in the database name" : "%s you may not use dots in the database name",
- "MS SQL username and/or password not valid: %s" : "MS SQL username and/or password not valid: %s",
- "You need to enter either an existing account or the administrator." : "You need to enter either an existing account or the administrator.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB username and/or password not valid",
- "DB Error: \"%s\"" : "DB Error: \"%s\"",
- "Offending command was: \"%s\"" : "Offending command was: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB user '%s'@'localhost' exists already.",
- "Drop this user from MySQL/MariaDB" : "Drop this user from MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB user '%s'@'%%' already exists",
- "Drop this user from MySQL/MariaDB." : "Drop this user from MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle connection could not be established",
"Oracle username and/or password not valid" : "Oracle username and/or password not valid",
+ "DB Error: \"%s\"" : "DB Error: \"%s\"",
+ "Offending command was: \"%s\"" : "Offending command was: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "You need to enter either an existing account or the administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Offending command was: \"%s\", name: %s, password: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL username and/or password not valid",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! ",
diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json
index d50562272d0..9c57df59762 100644
--- a/lib/l10n/en_GB.json
+++ b/lib/l10n/en_GB.json
@@ -61,17 +61,11 @@
"%s enter the database username." : "%s enter the database username.",
"%s enter the database name." : "%s enter the database name.",
"%s you may not use dots in the database name" : "%s you may not use dots in the database name",
- "MS SQL username and/or password not valid: %s" : "MS SQL username and/or password not valid: %s",
- "You need to enter either an existing account or the administrator." : "You need to enter either an existing account or the administrator.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB username and/or password not valid",
- "DB Error: \"%s\"" : "DB Error: \"%s\"",
- "Offending command was: \"%s\"" : "Offending command was: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB user '%s'@'localhost' exists already.",
- "Drop this user from MySQL/MariaDB" : "Drop this user from MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB user '%s'@'%%' already exists",
- "Drop this user from MySQL/MariaDB." : "Drop this user from MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle connection could not be established",
"Oracle username and/or password not valid" : "Oracle username and/or password not valid",
+ "DB Error: \"%s\"" : "DB Error: \"%s\"",
+ "Offending command was: \"%s\"" : "Offending command was: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "You need to enter either an existing account or the administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Offending command was: \"%s\", name: %s, password: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL username and/or password not valid",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! ",
diff --git a/lib/l10n/eo.js b/lib/l10n/eo.js
index b672c053740..df94b174599 100644
--- a/lib/l10n/eo.js
+++ b/lib/l10n/eo.js
@@ -37,13 +37,9 @@ OC.L10N.register(
"%s enter the database username." : "%s enigu la uzantonomon de la datumbazo.",
"%s enter the database name." : "%s enigu la nomon de la datumbazo.",
"%s you may not use dots in the database name" : "%s vi ne povas uzi punktojn en la nomo de la datumbazo",
- "MS SQL username and/or password not valid: %s" : "La uzantonomo de MS SQL aŭ la pasvorto ne validas: %s",
- "MySQL/MariaDB username and/or password not valid" : "La MySQL/MariaDB-uzantonomo kajaŭ pasvorto ne validas.",
- "DB Error: \"%s\"" : "Datumbaza eraro: “%s”",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "La MySQL/MariaDB-uzanto '%s'@'localhost' jam ekzistas.",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "La MySQL/MariaDB-uzanto '%s'@'%%' jam ekzistas",
"Oracle connection could not be established" : "Konekto al Oracle ne povas stariĝi",
"Oracle username and/or password not valid" : "La uzantonomo de Oracle aŭ la pasvorto ne validas",
+ "DB Error: \"%s\"" : "Datumbaza eraro: “%s”",
"PostgreSQL username and/or password not valid" : "La uzantonomo de PostgreSQL aŭ la pasvorto ne validas",
"Set an admin username." : "Starigi administran uzantonomon.",
"Set an admin password." : "Starigi administran pasvorton.",
diff --git a/lib/l10n/eo.json b/lib/l10n/eo.json
index d3877595272..8140c421d57 100644
--- a/lib/l10n/eo.json
+++ b/lib/l10n/eo.json
@@ -35,13 +35,9 @@
"%s enter the database username." : "%s enigu la uzantonomon de la datumbazo.",
"%s enter the database name." : "%s enigu la nomon de la datumbazo.",
"%s you may not use dots in the database name" : "%s vi ne povas uzi punktojn en la nomo de la datumbazo",
- "MS SQL username and/or password not valid: %s" : "La uzantonomo de MS SQL aŭ la pasvorto ne validas: %s",
- "MySQL/MariaDB username and/or password not valid" : "La MySQL/MariaDB-uzantonomo kajaŭ pasvorto ne validas.",
- "DB Error: \"%s\"" : "Datumbaza eraro: “%s”",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "La MySQL/MariaDB-uzanto '%s'@'localhost' jam ekzistas.",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "La MySQL/MariaDB-uzanto '%s'@'%%' jam ekzistas",
"Oracle connection could not be established" : "Konekto al Oracle ne povas stariĝi",
"Oracle username and/or password not valid" : "La uzantonomo de Oracle aŭ la pasvorto ne validas",
+ "DB Error: \"%s\"" : "Datumbaza eraro: “%s”",
"PostgreSQL username and/or password not valid" : "La uzantonomo de PostgreSQL aŭ la pasvorto ne validas",
"Set an admin username." : "Starigi administran uzantonomon.",
"Set an admin password." : "Starigi administran pasvorton.",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 71f3a8aa8bf..d071dc624e0 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s ingresar el usuario de la base de datos.",
"%s enter the database name." : "%s ingresar el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Usuario y/o contraseña de MS SQL no válidos: %s",
- "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
- "MySQL/MariaDB username and/or password not valid" : "Nombre de usuario y/o contraseña de MySQL/MariaDB inválidos",
- "DB Error: \"%s\"" : "Error BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "El usuario de MySQL/MariaDB '%s'@'localhost' ya existe.",
- "Drop this user from MySQL/MariaDB" : "Eliminar este usuario de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "El usuario de MySQL/MariaDB '%s'@'%%' ya existe",
- "Drop this user from MySQL/MariaDB." : "Eliminar este usuario de MySQL/MariaDB.",
"Oracle connection could not be established" : "No se pudo establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "Usuario y/o contraseña de Oracle no válidos",
+ "DB Error: \"%s\"" : "Error BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "Comando infractor: \"%s\", nombre: %s, contraseña: %s",
"PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no está soportado y %s no funcionará bien en esta plataforma. ¡Úsela bajo su propio riesgo! ",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 1259ff53b49..28655f2c92d 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s ingresar el usuario de la base de datos.",
"%s enter the database name." : "%s ingresar el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Usuario y/o contraseña de MS SQL no válidos: %s",
- "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
- "MySQL/MariaDB username and/or password not valid" : "Nombre de usuario y/o contraseña de MySQL/MariaDB inválidos",
- "DB Error: \"%s\"" : "Error BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "El usuario de MySQL/MariaDB '%s'@'localhost' ya existe.",
- "Drop this user from MySQL/MariaDB" : "Eliminar este usuario de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "El usuario de MySQL/MariaDB '%s'@'%%' ya existe",
- "Drop this user from MySQL/MariaDB." : "Eliminar este usuario de MySQL/MariaDB.",
"Oracle connection could not be established" : "No se pudo establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "Usuario y/o contraseña de Oracle no válidos",
+ "DB Error: \"%s\"" : "Error BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "Comando infractor: \"%s\", nombre: %s, contraseña: %s",
"PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no está soportado y %s no funcionará bien en esta plataforma. ¡Úsela bajo su propio riesgo! ",
diff --git a/lib/l10n/es_AR.js b/lib/l10n/es_AR.js
index b662e05e823..572933980cb 100644
--- a/lib/l10n/es_AR.js
+++ b/lib/l10n/es_AR.js
@@ -35,12 +35,11 @@ OC.L10N.register(
"%s enter the database username." : "%s Entrá el usuario de la base de datos",
"%s enter the database name." : "%s Entrá el nombre de la base de datos.",
"%s you may not use dots in the database name" : "%s no podés usar puntos en el nombre de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Nombre de usuario y contraseña de MS SQL no son válidas: %s",
- "You need to enter either an existing account or the administrator." : "Tenés que ingresar una cuenta existente o el administrador.",
- "DB Error: \"%s\"" : "Error DB: \"%s\"",
- "Offending command was: \"%s\"" : "El comando no comprendido es: \"%s\"",
"Oracle connection could not be established" : "No fue posible establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "El nombre de usuario y/o contraseña no son válidos",
+ "DB Error: \"%s\"" : "Error DB: \"%s\"",
+ "Offending command was: \"%s\"" : "El comando no comprendido es: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tenés que ingresar una cuenta existente o el administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "El comando no comprendido es: \"%s\", nombre: \"%s\", contraseña: \"%s\"",
"PostgreSQL username and/or password not valid" : "Nombre de usuario o contraseña PostgradeSQL inválido.",
"Set an admin username." : "Configurar un nombre de administrador.",
diff --git a/lib/l10n/es_AR.json b/lib/l10n/es_AR.json
index 65852ea6351..9a459d7117d 100644
--- a/lib/l10n/es_AR.json
+++ b/lib/l10n/es_AR.json
@@ -33,12 +33,11 @@
"%s enter the database username." : "%s Entrá el usuario de la base de datos",
"%s enter the database name." : "%s Entrá el nombre de la base de datos.",
"%s you may not use dots in the database name" : "%s no podés usar puntos en el nombre de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Nombre de usuario y contraseña de MS SQL no son válidas: %s",
- "You need to enter either an existing account or the administrator." : "Tenés que ingresar una cuenta existente o el administrador.",
- "DB Error: \"%s\"" : "Error DB: \"%s\"",
- "Offending command was: \"%s\"" : "El comando no comprendido es: \"%s\"",
"Oracle connection could not be established" : "No fue posible establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "El nombre de usuario y/o contraseña no son válidos",
+ "DB Error: \"%s\"" : "Error DB: \"%s\"",
+ "Offending command was: \"%s\"" : "El comando no comprendido es: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tenés que ingresar una cuenta existente o el administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "El comando no comprendido es: \"%s\", nombre: \"%s\", contraseña: \"%s\"",
"PostgreSQL username and/or password not valid" : "Nombre de usuario o contraseña PostgradeSQL inválido.",
"Set an admin username." : "Configurar un nombre de administrador.",
diff --git a/lib/l10n/es_MX.js b/lib/l10n/es_MX.js
index 13dcbad5488..253b5fce3ab 100644
--- a/lib/l10n/es_MX.js
+++ b/lib/l10n/es_MX.js
@@ -41,12 +41,11 @@ OC.L10N.register(
"%s enter the database username." : "%s ingresar el usuario de la base de datos.",
"%s enter the database name." : "%s ingresar el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Usuario y/o contraseña de MS SQL no válidos: %s",
- "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
- "DB Error: \"%s\"" : "Error BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
"Oracle connection could not be established" : "No se pudo establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "Usuario y/o contraseña de Oracle no válidos",
+ "DB Error: \"%s\"" : "Error BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "Comando infractor: \"%s\", nombre: %s, contraseña: %s",
"PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos",
"Set an admin username." : "Configurar un nombre de usuario del administrador",
diff --git a/lib/l10n/es_MX.json b/lib/l10n/es_MX.json
index 0ab3bd211e2..0bd876d2e70 100644
--- a/lib/l10n/es_MX.json
+++ b/lib/l10n/es_MX.json
@@ -39,12 +39,11 @@
"%s enter the database username." : "%s ingresar el usuario de la base de datos.",
"%s enter the database name." : "%s ingresar el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
- "MS SQL username and/or password not valid: %s" : "Usuario y/o contraseña de MS SQL no válidos: %s",
- "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
- "DB Error: \"%s\"" : "Error BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
"Oracle connection could not be established" : "No se pudo establecer la conexión a Oracle",
"Oracle username and/or password not valid" : "Usuario y/o contraseña de Oracle no válidos",
+ "DB Error: \"%s\"" : "Error BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comando infractor: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Tiene que ingresar una cuenta existente o la del administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "Comando infractor: \"%s\", nombre: %s, contraseña: %s",
"PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos",
"Set an admin username." : "Configurar un nombre de usuario del administrador",
diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js
index 0329ffd9319..9ab86b3a415 100644
--- a/lib/l10n/et_EE.js
+++ b/lib/l10n/et_EE.js
@@ -8,6 +8,12 @@ OC.L10N.register(
"Sample configuration detected" : "Tuvastati näidisseaded",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Tuvastati, et kopeeriti näidisseaded. See võib lõhkuda sinu saidi ja see pole toetatud. Palun loe enne faili config.php muutmist dokumentatsiooni",
"PHP %s or higher is required." : "PHP %s või uuem on nõutav.",
+ "PHP with a version lower than %s is required." : "Nõutud on PHP madalama versiooniga kui %s.",
+ "Following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
+ "The command line tool %s could not be found" : "Käsurea töövahendit %s ei leitud",
+ "The library %s is not available." : "Teek %s pole saadaval.",
+ "Following platforms are supported: %s" : "Toetatud on järgnevad platformid: %s",
+ "ownCloud %s or higher is required." : "ownCloud %s või uuem on nõutav.",
"Help" : "Abiinfo",
"Personal" : "Isiklik",
"Users" : "Kasutajad",
@@ -48,17 +54,11 @@ OC.L10N.register(
"%s enter the database username." : "%s sisesta andmebaasi kasutajatunnus.",
"%s enter the database name." : "%s sisesta andmebaasi nimi.",
"%s you may not use dots in the database name" : "%s punktide kasutamine andmebaasi nimes pole lubatud",
- "MS SQL username and/or password not valid: %s" : "MS SQL kasutajatunnus ja/või parool pole õiged: %s",
- "You need to enter either an existing account or the administrator." : "Sisesta kas juba olemasolev konto või administrator.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB kasutajatunnus ja/või parool pole õiged",
- "DB Error: \"%s\"" : "Andmebaasi viga: \"%s\"",
- "Offending command was: \"%s\"" : "Tõrkuv käsk oli: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB kasutaja '%s'@'localhost' on juba olemas.",
- "Drop this user from MySQL/MariaDB" : "Kustuta see MySQL/MariaDB kasutaja",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB user '%s'@'%%' on juba olemas",
- "Drop this user from MySQL/MariaDB." : "Kustuta see MySQL/MariaDB kasutaja.",
"Oracle connection could not be established" : "Ei suuda luua ühendust Oracle baasiga",
"Oracle username and/or password not valid" : "Oracle kasutajatunnus ja/või parool pole õiged",
+ "DB Error: \"%s\"" : "Andmebaasi viga: \"%s\"",
+ "Offending command was: \"%s\"" : "Tõrkuv käsk oli: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Sisesta kas juba olemasolev konto või administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Tõrkuv käsk oli: \"%s\", nimi: %s, parool: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL kasutajatunnus ja/või parool pole õiged",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X ei ole toetatud ja %s ei pruugi korralikult toimida sellel platvormil. Kasuta seda omal vastutusel!",
@@ -67,6 +67,7 @@ OC.L10N.register(
"Set an admin password." : "Määra admini parool.",
"Can't create or write into the data directory %s" : "Ei suuda luua või kirjutada andmete kataloogi %s",
"%s shared »%s« with you" : "%s jagas sinuga »%s«",
+ "%s via %s" : "%s läbi %s",
"Sharing %s failed, because the file does not exist" : "%s jagamine ebaõnnestus, kuna faili pole olemas",
"You are not allowed to share %s" : "Sul pole lubatud %s jagada",
"Sharing %s failed, because the user %s is the item owner" : "%s jagamine ebaõnnestus, kuna kuna kasutaja %s on üksuse omanik",
@@ -82,6 +83,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Lubade seadistus %s jaoks ebaõnnestus, kuna üksust ei leitud",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Aegumise kuupäeva ei saa määrata. Jagamised ei saa aeguda hiljem kui %s peale jagamist.",
"Cannot set expiration date. Expiration date is in the past" : "Aegumiskuupäeva ei saa määrata. Aegumise kuupäev on minevikus",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Aegumise kuupäeva ei saa tühjendada. Jagamistel peab olema aegumise kuupäev.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Jagamise tagarakend %s peab kasutusele võtma OCP\\Share_Backend liidese",
"Sharing backend %s not found" : "Jagamise tagarakendit %s ei leitud",
"Sharing backend for %s not found" : "Jagamise tagarakendit %s jaoks ei leitud",
@@ -96,6 +98,7 @@ OC.L10N.register(
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
"The username is already being used" : "Kasutajanimi on juba kasutuses",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Ühtegi andmebaasi (sqlite, mysql või postgresql) draiverit pole paigaldatud.",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows platform pole toetatud",
"Cannot write into \"config\" directory" : "Ei saa kirjutada \"config\" kataloogi",
"Cannot write into \"apps\" directory" : "Ei saa kirjutada \"apps\" kataloogi!",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Tavaliselt saab selle lahendada %s andes veebiserverile rakendite kataloogile kirjutusõigused %s või keelates seadetes rakendikogu.",
diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json
index f4aec4e1c50..acbb36fe431 100644
--- a/lib/l10n/et_EE.json
+++ b/lib/l10n/et_EE.json
@@ -6,6 +6,12 @@
"Sample configuration detected" : "Tuvastati näidisseaded",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Tuvastati, et kopeeriti näidisseaded. See võib lõhkuda sinu saidi ja see pole toetatud. Palun loe enne faili config.php muutmist dokumentatsiooni",
"PHP %s or higher is required." : "PHP %s või uuem on nõutav.",
+ "PHP with a version lower than %s is required." : "Nõutud on PHP madalama versiooniga kui %s.",
+ "Following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
+ "The command line tool %s could not be found" : "Käsurea töövahendit %s ei leitud",
+ "The library %s is not available." : "Teek %s pole saadaval.",
+ "Following platforms are supported: %s" : "Toetatud on järgnevad platformid: %s",
+ "ownCloud %s or higher is required." : "ownCloud %s või uuem on nõutav.",
"Help" : "Abiinfo",
"Personal" : "Isiklik",
"Users" : "Kasutajad",
@@ -46,17 +52,11 @@
"%s enter the database username." : "%s sisesta andmebaasi kasutajatunnus.",
"%s enter the database name." : "%s sisesta andmebaasi nimi.",
"%s you may not use dots in the database name" : "%s punktide kasutamine andmebaasi nimes pole lubatud",
- "MS SQL username and/or password not valid: %s" : "MS SQL kasutajatunnus ja/või parool pole õiged: %s",
- "You need to enter either an existing account or the administrator." : "Sisesta kas juba olemasolev konto või administrator.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB kasutajatunnus ja/või parool pole õiged",
- "DB Error: \"%s\"" : "Andmebaasi viga: \"%s\"",
- "Offending command was: \"%s\"" : "Tõrkuv käsk oli: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB kasutaja '%s'@'localhost' on juba olemas.",
- "Drop this user from MySQL/MariaDB" : "Kustuta see MySQL/MariaDB kasutaja",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB user '%s'@'%%' on juba olemas",
- "Drop this user from MySQL/MariaDB." : "Kustuta see MySQL/MariaDB kasutaja.",
"Oracle connection could not be established" : "Ei suuda luua ühendust Oracle baasiga",
"Oracle username and/or password not valid" : "Oracle kasutajatunnus ja/või parool pole õiged",
+ "DB Error: \"%s\"" : "Andmebaasi viga: \"%s\"",
+ "Offending command was: \"%s\"" : "Tõrkuv käsk oli: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Sisesta kas juba olemasolev konto või administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Tõrkuv käsk oli: \"%s\", nimi: %s, parool: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL kasutajatunnus ja/või parool pole õiged",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X ei ole toetatud ja %s ei pruugi korralikult toimida sellel platvormil. Kasuta seda omal vastutusel!",
@@ -65,6 +65,7 @@
"Set an admin password." : "Määra admini parool.",
"Can't create or write into the data directory %s" : "Ei suuda luua või kirjutada andmete kataloogi %s",
"%s shared »%s« with you" : "%s jagas sinuga »%s«",
+ "%s via %s" : "%s läbi %s",
"Sharing %s failed, because the file does not exist" : "%s jagamine ebaõnnestus, kuna faili pole olemas",
"You are not allowed to share %s" : "Sul pole lubatud %s jagada",
"Sharing %s failed, because the user %s is the item owner" : "%s jagamine ebaõnnestus, kuna kuna kasutaja %s on üksuse omanik",
@@ -80,6 +81,7 @@
"Setting permissions for %s failed, because the item was not found" : "Lubade seadistus %s jaoks ebaõnnestus, kuna üksust ei leitud",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Aegumise kuupäeva ei saa määrata. Jagamised ei saa aeguda hiljem kui %s peale jagamist.",
"Cannot set expiration date. Expiration date is in the past" : "Aegumiskuupäeva ei saa määrata. Aegumise kuupäev on minevikus",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Aegumise kuupäeva ei saa tühjendada. Jagamistel peab olema aegumise kuupäev.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "Jagamise tagarakend %s peab kasutusele võtma OCP\\Share_Backend liidese",
"Sharing backend %s not found" : "Jagamise tagarakendit %s ei leitud",
"Sharing backend for %s not found" : "Jagamise tagarakendit %s jaoks ei leitud",
@@ -94,6 +96,7 @@
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
"The username is already being used" : "Kasutajanimi on juba kasutuses",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Ühtegi andmebaasi (sqlite, mysql või postgresql) draiverit pole paigaldatud.",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows platform pole toetatud",
"Cannot write into \"config\" directory" : "Ei saa kirjutada \"config\" kataloogi",
"Cannot write into \"apps\" directory" : "Ei saa kirjutada \"apps\" kataloogi!",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Tavaliselt saab selle lahendada %s andes veebiserverile rakendite kataloogile kirjutusõigused %s või keelates seadetes rakendikogu.",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index b9093d1bf41..6bf5d8f0315 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -54,17 +54,11 @@ OC.L10N.register(
"%s enter the database username." : "%s sartu datu basearen erabiltzaile izena.",
"%s enter the database name." : "%s sartu datu basearen izena.",
"%s you may not use dots in the database name" : "%s ezin duzu punturik erabili datu basearen izenean.",
- "MS SQL username and/or password not valid: %s" : "MS SQL erabiltzaile izena edota pasahitza ez dira egokiak: %s",
- "You need to enter either an existing account or the administrator." : "Existitzen den kontu bat edo administradorearena jarri behar duzu.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB erabiltzaile edota pasahitza ez dira egokiak",
- "DB Error: \"%s\"" : "DB errorea: \"%s\"",
- "Offending command was: \"%s\"" : "Errorea komando honek sortu du: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB '%s'@'localhost' erabiltzailea dagoeneko existitzen da.",
- "Drop this user from MySQL/MariaDB" : "Ezabatu erabiltzaile hau MySQL/MariaDBtik",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB '%s'@'%%' erabiltzailea dagoeneko existitzen da",
- "Drop this user from MySQL/MariaDB." : "Ezabatu erabiltzaile hau MySQL/MariaDBtik.",
"Oracle connection could not be established" : "Ezin da Oracle konexioa sortu",
"Oracle username and/or password not valid" : "Oracle erabiltzaile edota pasahitza ez dira egokiak.",
+ "DB Error: \"%s\"" : "DB errorea: \"%s\"",
+ "Offending command was: \"%s\"" : "Errorea komando honek sortu du: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Existitzen den kontu bat edo administradorearena jarri behar duzu.",
"Offending command was: \"%s\", name: %s, password: %s" : "Errorea komando honek sortu du: \"%s\", izena: %s, pasahitza: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL erabiltzaile edota pasahitza ez dira egokiak.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X-ek ez du sostengurik eta %s gaizki ibili daiteke plataforma honetan. Erabiltzekotan, zure ardurapean.",
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index b921d8dd28b..2f9c4033615 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -52,17 +52,11 @@
"%s enter the database username." : "%s sartu datu basearen erabiltzaile izena.",
"%s enter the database name." : "%s sartu datu basearen izena.",
"%s you may not use dots in the database name" : "%s ezin duzu punturik erabili datu basearen izenean.",
- "MS SQL username and/or password not valid: %s" : "MS SQL erabiltzaile izena edota pasahitza ez dira egokiak: %s",
- "You need to enter either an existing account or the administrator." : "Existitzen den kontu bat edo administradorearena jarri behar duzu.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB erabiltzaile edota pasahitza ez dira egokiak",
- "DB Error: \"%s\"" : "DB errorea: \"%s\"",
- "Offending command was: \"%s\"" : "Errorea komando honek sortu du: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB '%s'@'localhost' erabiltzailea dagoeneko existitzen da.",
- "Drop this user from MySQL/MariaDB" : "Ezabatu erabiltzaile hau MySQL/MariaDBtik",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB '%s'@'%%' erabiltzailea dagoeneko existitzen da",
- "Drop this user from MySQL/MariaDB." : "Ezabatu erabiltzaile hau MySQL/MariaDBtik.",
"Oracle connection could not be established" : "Ezin da Oracle konexioa sortu",
"Oracle username and/or password not valid" : "Oracle erabiltzaile edota pasahitza ez dira egokiak.",
+ "DB Error: \"%s\"" : "DB errorea: \"%s\"",
+ "Offending command was: \"%s\"" : "Errorea komando honek sortu du: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Existitzen den kontu bat edo administradorearena jarri behar duzu.",
"Offending command was: \"%s\", name: %s, password: %s" : "Errorea komando honek sortu du: \"%s\", izena: %s, pasahitza: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL erabiltzaile edota pasahitza ez dira egokiak.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X-ek ez du sostengurik eta %s gaizki ibili daiteke plataforma honetan. Erabiltzekotan, zure ardurapean.",
diff --git a/lib/l10n/fa.js b/lib/l10n/fa.js
index bdfa8e3d87c..8e3a0c6071f 100644
--- a/lib/l10n/fa.js
+++ b/lib/l10n/fa.js
@@ -22,12 +22,11 @@ OC.L10N.register(
"%s enter the database username." : "%s نام کاربری پایگاه داده را وارد نمایید.",
"%s enter the database name." : "%s نام پایگاه داده را وارد نمایید.",
"%s you may not use dots in the database name" : "%s شما نباید از نقطه در نام پایگاه داده استفاده نمایید.",
- "MS SQL username and/or password not valid: %s" : "نام کاربری و / یا رمزعبور MS SQL معتبر نیست: %s",
- "You need to enter either an existing account or the administrator." : "شما نیاز به وارد کردن یک حساب کاربری موجود یا حساب مدیریتی دارید.",
- "DB Error: \"%s\"" : "خطای پایگاه داده: \"%s\"",
- "Offending command was: \"%s\"" : "دستور متخلف عبارت است از: \"%s\"",
"Oracle connection could not be established" : "ارتباط اراکل نمیتواند برقرار باشد.",
"Oracle username and/or password not valid" : "نام کاربری و / یا رمزعبور اراکل معتبر نیست.",
+ "DB Error: \"%s\"" : "خطای پایگاه داده: \"%s\"",
+ "Offending command was: \"%s\"" : "دستور متخلف عبارت است از: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "شما نیاز به وارد کردن یک حساب کاربری موجود یا حساب مدیریتی دارید.",
"Offending command was: \"%s\", name: %s, password: %s" : "دستور متخلف عبارت است از: \"%s\"، نام: \"%s\"، رمزعبور:\"%s\"",
"PostgreSQL username and/or password not valid" : "PostgreSQL نام کاربری و / یا رمزعبور معتبر نیست.",
"Set an admin username." : "یک نام کاربری برای مدیر تنظیم نمایید.",
diff --git a/lib/l10n/fa.json b/lib/l10n/fa.json
index 5b4aab4b595..f434f6517af 100644
--- a/lib/l10n/fa.json
+++ b/lib/l10n/fa.json
@@ -20,12 +20,11 @@
"%s enter the database username." : "%s نام کاربری پایگاه داده را وارد نمایید.",
"%s enter the database name." : "%s نام پایگاه داده را وارد نمایید.",
"%s you may not use dots in the database name" : "%s شما نباید از نقطه در نام پایگاه داده استفاده نمایید.",
- "MS SQL username and/or password not valid: %s" : "نام کاربری و / یا رمزعبور MS SQL معتبر نیست: %s",
- "You need to enter either an existing account or the administrator." : "شما نیاز به وارد کردن یک حساب کاربری موجود یا حساب مدیریتی دارید.",
- "DB Error: \"%s\"" : "خطای پایگاه داده: \"%s\"",
- "Offending command was: \"%s\"" : "دستور متخلف عبارت است از: \"%s\"",
"Oracle connection could not be established" : "ارتباط اراکل نمیتواند برقرار باشد.",
"Oracle username and/or password not valid" : "نام کاربری و / یا رمزعبور اراکل معتبر نیست.",
+ "DB Error: \"%s\"" : "خطای پایگاه داده: \"%s\"",
+ "Offending command was: \"%s\"" : "دستور متخلف عبارت است از: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "شما نیاز به وارد کردن یک حساب کاربری موجود یا حساب مدیریتی دارید.",
"Offending command was: \"%s\", name: %s, password: %s" : "دستور متخلف عبارت است از: \"%s\"، نام: \"%s\"، رمزعبور:\"%s\"",
"PostgreSQL username and/or password not valid" : "PostgreSQL نام کاربری و / یا رمزعبور معتبر نیست.",
"Set an admin username." : "یک نام کاربری برای مدیر تنظیم نمایید.",
diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js
index 5724595dbda..3a06e5e4f6e 100644
--- a/lib/l10n/fi_FI.js
+++ b/lib/l10n/fi_FI.js
@@ -63,16 +63,10 @@ OC.L10N.register(
"%s enter the database username." : "%s anna tietokannan käyttäjätunnus.",
"%s enter the database name." : "%s anna tietokannan nimi.",
"%s you may not use dots in the database name" : "%s et voi käyttää pisteitä tietokannan nimessä",
- "MS SQL username and/or password not valid: %s" : "MS SQL -käyttäjätunnus ja/tai -salasana on väärin: %s",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-käyttäjätunnus ja/tai salasana on virheellinen",
- "DB Error: \"%s\"" : "Tietokantavirhe: \"%s\"",
- "Offending command was: \"%s\"" : "Loukkaava komento oli: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB-käyttäjä '%s'@'localhost' on jo olemassa.",
- "Drop this user from MySQL/MariaDB" : "Pudota tämä käyttäjä MySQL/MariaDB:stä",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-käyttäjä '%s'@'%%' on jo olemassa",
- "Drop this user from MySQL/MariaDB." : "Pudota tämä käyttäjä MySQL/MariaDB:stä.",
"Oracle connection could not be established" : "Oracle-yhteyttä ei voitu muodostaa",
"Oracle username and/or password not valid" : "Oraclen käyttäjätunnus ja/tai salasana on väärin",
+ "DB Error: \"%s\"" : "Tietokantavirhe: \"%s\"",
+ "Offending command was: \"%s\"" : "Loukkaava komento oli: \"%s\"",
"Offending command was: \"%s\", name: %s, password: %s" : "Loukkaava komento oli: \"%s\", nimi: %s, salasana: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL:n käyttäjätunnus ja/tai salasana on väärin",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X ei ole tuettu, joten %s ei toimi kunnolla tällä alustalla. Käytä omalla vastuulla!",
diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json
index 223429b7f88..27fe7745881 100644
--- a/lib/l10n/fi_FI.json
+++ b/lib/l10n/fi_FI.json
@@ -61,16 +61,10 @@
"%s enter the database username." : "%s anna tietokannan käyttäjätunnus.",
"%s enter the database name." : "%s anna tietokannan nimi.",
"%s you may not use dots in the database name" : "%s et voi käyttää pisteitä tietokannan nimessä",
- "MS SQL username and/or password not valid: %s" : "MS SQL -käyttäjätunnus ja/tai -salasana on väärin: %s",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-käyttäjätunnus ja/tai salasana on virheellinen",
- "DB Error: \"%s\"" : "Tietokantavirhe: \"%s\"",
- "Offending command was: \"%s\"" : "Loukkaava komento oli: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB-käyttäjä '%s'@'localhost' on jo olemassa.",
- "Drop this user from MySQL/MariaDB" : "Pudota tämä käyttäjä MySQL/MariaDB:stä",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-käyttäjä '%s'@'%%' on jo olemassa",
- "Drop this user from MySQL/MariaDB." : "Pudota tämä käyttäjä MySQL/MariaDB:stä.",
"Oracle connection could not be established" : "Oracle-yhteyttä ei voitu muodostaa",
"Oracle username and/or password not valid" : "Oraclen käyttäjätunnus ja/tai salasana on väärin",
+ "DB Error: \"%s\"" : "Tietokantavirhe: \"%s\"",
+ "Offending command was: \"%s\"" : "Loukkaava komento oli: \"%s\"",
"Offending command was: \"%s\", name: %s, password: %s" : "Loukkaava komento oli: \"%s\", nimi: %s, salasana: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL:n käyttäjätunnus ja/tai salasana on väärin",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X ei ole tuettu, joten %s ei toimi kunnolla tällä alustalla. Käytä omalla vastuulla!",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index 5743b7ff283..8e7de3462a3 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -65,17 +65,11 @@ OC.L10N.register(
"%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
"%s enter the database name." : "%s entrez le nom de la base de données.",
"%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
- "MS SQL username and/or password not valid: %s" : "Nom d'utilisateur et/ou le mot de passe MS SQL non valide : %s",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
- "MySQL/MariaDB username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe MySQL/MariaDB non valide",
- "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
- "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "L'utilisateur MySQL/MariaDB '%s'@'localhost' existe déjà.",
- "Drop this user from MySQL/MariaDB" : "Supprimez cet utilisateur de la base MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "L'utilisateur MySQL/MariaDB '%s'@'%%' existe déjà",
- "Drop this user from MySQL/MariaDB." : "Supprimez cet utilisateur de la base MySQL/MariaDB.",
"Oracle connection could not be established" : "La connexion Oracle ne peut être établie",
"Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
+ "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
+ "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
"Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
"PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index fa2881ca6aa..25bcf5b17ee 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -63,17 +63,11 @@
"%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
"%s enter the database name." : "%s entrez le nom de la base de données.",
"%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
- "MS SQL username and/or password not valid: %s" : "Nom d'utilisateur et/ou le mot de passe MS SQL non valide : %s",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
- "MySQL/MariaDB username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe MySQL/MariaDB non valide",
- "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
- "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "L'utilisateur MySQL/MariaDB '%s'@'localhost' existe déjà.",
- "Drop this user from MySQL/MariaDB" : "Supprimez cet utilisateur de la base MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "L'utilisateur MySQL/MariaDB '%s'@'%%' existe déjà",
- "Drop this user from MySQL/MariaDB." : "Supprimez cet utilisateur de la base MySQL/MariaDB.",
"Oracle connection could not be established" : "La connexion Oracle ne peut être établie",
"Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
+ "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
+ "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
"Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
"PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js
index 7ba4fff42ff..bc2afd3f6e5 100644
--- a/lib/l10n/gl.js
+++ b/lib/l10n/gl.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s introduza o nome de usuario da base de datos",
"%s enter the database name." : "%s introduza o nome da base de datos",
"%s you may not use dots in the database name" : "%s non se poden empregar puntos na base de datos",
- "MS SQL username and/or password not valid: %s" : "Nome de usuario e/ou contrasinal de MS SQL incorrecto: %s",
- "You need to enter either an existing account or the administrator." : "Deberá introducir unha conta existente ou o administrador.",
- "MySQL/MariaDB username and/or password not valid" : "O nome e/ou o contrasinal do usuario de MySQL/MariaDB non é correcto",
- "DB Error: \"%s\"" : "Produciuse un erro na base de datos: «%s»",
- "Offending command was: \"%s\"" : "A orde infractora foi: «%s»",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Xa existe o usuario «%s»@«localhost» no MySQL/MariaDB.",
- "Drop this user from MySQL/MariaDB" : "Eliminar este usuario do MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Xa existe o usuario «%s»@«%%» no MySQL/MariaDB",
- "Drop this user from MySQL/MariaDB." : "Eliminar este usuario do MySQL/MariaDB.",
"Oracle connection could not be established" : "Non foi posíbel estabelecer a conexión con Oracle",
"Oracle username and/or password not valid" : "O nome de usuario e/ou contrasinal de Oracle é incorrecto",
+ "DB Error: \"%s\"" : "Produciuse un erro na base de datos: «%s»",
+ "Offending command was: \"%s\"" : "A orde infractora foi: «%s»",
+ "You need to enter either an existing account or the administrator." : "Deberá introducir unha conta existente ou o administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "A orde infractora foi: «%s», nome: %s, contrasinal: %s",
"PostgreSQL username and/or password not valid" : "Nome de usuario e/ou contrasinal de PostgreSQL incorrecto",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non é compatíbel e %s non funcionará correctamente nesta plataforma. Utilíceo baixo a súa responsabilidade!",
diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json
index 57c29347f33..9607f9fad18 100644
--- a/lib/l10n/gl.json
+++ b/lib/l10n/gl.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s introduza o nome de usuario da base de datos",
"%s enter the database name." : "%s introduza o nome da base de datos",
"%s you may not use dots in the database name" : "%s non se poden empregar puntos na base de datos",
- "MS SQL username and/or password not valid: %s" : "Nome de usuario e/ou contrasinal de MS SQL incorrecto: %s",
- "You need to enter either an existing account or the administrator." : "Deberá introducir unha conta existente ou o administrador.",
- "MySQL/MariaDB username and/or password not valid" : "O nome e/ou o contrasinal do usuario de MySQL/MariaDB non é correcto",
- "DB Error: \"%s\"" : "Produciuse un erro na base de datos: «%s»",
- "Offending command was: \"%s\"" : "A orde infractora foi: «%s»",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Xa existe o usuario «%s»@«localhost» no MySQL/MariaDB.",
- "Drop this user from MySQL/MariaDB" : "Eliminar este usuario do MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Xa existe o usuario «%s»@«%%» no MySQL/MariaDB",
- "Drop this user from MySQL/MariaDB." : "Eliminar este usuario do MySQL/MariaDB.",
"Oracle connection could not be established" : "Non foi posíbel estabelecer a conexión con Oracle",
"Oracle username and/or password not valid" : "O nome de usuario e/ou contrasinal de Oracle é incorrecto",
+ "DB Error: \"%s\"" : "Produciuse un erro na base de datos: «%s»",
+ "Offending command was: \"%s\"" : "A orde infractora foi: «%s»",
+ "You need to enter either an existing account or the administrator." : "Deberá introducir unha conta existente ou o administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "A orde infractora foi: «%s», nome: %s, contrasinal: %s",
"PostgreSQL username and/or password not valid" : "Nome de usuario e/ou contrasinal de PostgreSQL incorrecto",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non é compatíbel e %s non funcionará correctamente nesta plataforma. Utilíceo baixo a súa responsabilidade!",
diff --git a/lib/l10n/hr.js b/lib/l10n/hr.js
index c1fb29d4169..16ac6ff2821 100644
--- a/lib/l10n/hr.js
+++ b/lib/l10n/hr.js
@@ -49,17 +49,11 @@ OC.L10N.register(
"%s enter the database username." : "%s unesite naziva korisnika baze podataka.",
"%s enter the database name." : "%s unesite naziv baze podataka",
"%s you may not use dots in the database name" : "%s ne smijete koristiti točke u nazivu baze podataka",
- "MS SQL username and/or password not valid: %s" : "MS SQL korisničko ime i/ili lozinka neispravni: %s",
- "You need to enter either an existing account or the administrator." : "Trebate unijeti neki postojeći račun ili administratora.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB korisničko ime i/ili lozinka neispravni",
- "DB Error: \"%s\"" : "DB pogreška: \"%s\"",
- "Offending command was: \"%s\"" : "Neispravna naredba je bila: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB korisnik '%s'@'localhost' već postoji.",
- "Drop this user from MySQL/MariaDB" : "Ispustite ovog korisnika iz MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB korisnik '%s'@'%%' već postoji",
- "Drop this user from MySQL/MariaDB." : "Ispustite ovog korisnika iz MySQL/MariaDB.",
"Oracle connection could not be established" : "Vezu Oracle nije moguće uspostaviti",
"Oracle username and/or password not valid" : "Korisničko ime i/ili lozinka Oracle neispravni",
+ "DB Error: \"%s\"" : "DB pogreška: \"%s\"",
+ "Offending command was: \"%s\"" : "Neispravna naredba je bila: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Trebate unijeti neki postojeći račun ili administratora.",
"Offending command was: \"%s\", name: %s, password: %s" : "Neispravna naredba je bila: \"%s\", ime: %s, lozinka: %s",
"PostgreSQL username and/or password not valid" : "Korisničko ime i/ili lozinka PostgreSQL neispravni",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s na ovoj platformi neće raditi kako treba.",
diff --git a/lib/l10n/hr.json b/lib/l10n/hr.json
index 4e22f203bf5..291e59261ba 100644
--- a/lib/l10n/hr.json
+++ b/lib/l10n/hr.json
@@ -47,17 +47,11 @@
"%s enter the database username." : "%s unesite naziva korisnika baze podataka.",
"%s enter the database name." : "%s unesite naziv baze podataka",
"%s you may not use dots in the database name" : "%s ne smijete koristiti točke u nazivu baze podataka",
- "MS SQL username and/or password not valid: %s" : "MS SQL korisničko ime i/ili lozinka neispravni: %s",
- "You need to enter either an existing account or the administrator." : "Trebate unijeti neki postojeći račun ili administratora.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB korisničko ime i/ili lozinka neispravni",
- "DB Error: \"%s\"" : "DB pogreška: \"%s\"",
- "Offending command was: \"%s\"" : "Neispravna naredba je bila: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB korisnik '%s'@'localhost' već postoji.",
- "Drop this user from MySQL/MariaDB" : "Ispustite ovog korisnika iz MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB korisnik '%s'@'%%' već postoji",
- "Drop this user from MySQL/MariaDB." : "Ispustite ovog korisnika iz MySQL/MariaDB.",
"Oracle connection could not be established" : "Vezu Oracle nije moguće uspostaviti",
"Oracle username and/or password not valid" : "Korisničko ime i/ili lozinka Oracle neispravni",
+ "DB Error: \"%s\"" : "DB pogreška: \"%s\"",
+ "Offending command was: \"%s\"" : "Neispravna naredba je bila: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Trebate unijeti neki postojeći račun ili administratora.",
"Offending command was: \"%s\", name: %s, password: %s" : "Neispravna naredba je bila: \"%s\", ime: %s, lozinka: %s",
"PostgreSQL username and/or password not valid" : "Korisničko ime i/ili lozinka PostgreSQL neispravni",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nije podržan i %s na ovoj platformi neće raditi kako treba.",
diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js
index d8c67ec5cdf..6c0d797441e 100644
--- a/lib/l10n/hu_HU.js
+++ b/lib/l10n/hu_HU.js
@@ -43,17 +43,11 @@ OC.L10N.register(
"%s enter the database username." : "%s adja meg az adatbázist elérő felhasználó login nevét.",
"%s enter the database name." : "%s adja meg az adatbázis nevét.",
"%s you may not use dots in the database name" : "%s az adatbázis neve nem tartalmazhat pontot",
- "MS SQL username and/or password not valid: %s" : "Az MS SQL felhasználónév és/vagy jelszó érvénytelen: %s",
- "You need to enter either an existing account or the administrator." : "Vagy egy létező felhasználó vagy az adminisztrátor bejelentkezési nevét kell megadnia",
- "MySQL/MariaDB username and/or password not valid" : "A MySQL/MariaDB felhasználónév és/vagy jelszó nem megfelelő",
- "DB Error: \"%s\"" : "Adatbázis hiba: \"%s\"",
- "Offending command was: \"%s\"" : "A hibát ez a parancs okozta: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "A MySQL/MariaDB felhasználó '%s'@'localhost' már létezik.",
- "Drop this user from MySQL/MariaDB" : "Töröljük ez a felhasználót a MySQL/MariaDB-rendszerből",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "A MySQL/MariaDB felhasználó '%s'@'%%' már létezik.",
- "Drop this user from MySQL/MariaDB." : "Töröljük ez a felhasználót a MySQL/MariaDB-rendszerből.",
"Oracle connection could not be established" : "Az Oracle kapcsolat nem hozható létre",
"Oracle username and/or password not valid" : "Az Oracle felhasználói név és/vagy jelszó érvénytelen",
+ "DB Error: \"%s\"" : "Adatbázis hiba: \"%s\"",
+ "Offending command was: \"%s\"" : "A hibát ez a parancs okozta: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Vagy egy létező felhasználó vagy az adminisztrátor bejelentkezési nevét kell megadnia",
"Offending command was: \"%s\", name: %s, password: %s" : "A hibát okozó parancs ez volt: \"%s\", login név: %s, jelszó: %s",
"PostgreSQL username and/or password not valid" : "A PostgreSQL felhasználói név és/vagy jelszó érvénytelen",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "A Mac OS X nem támogatott és %s nem lesz teljesen működőképes. Csak saját felelősségre használja!",
diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json
index 8f281ecb3fe..1c717e6a4cf 100644
--- a/lib/l10n/hu_HU.json
+++ b/lib/l10n/hu_HU.json
@@ -41,17 +41,11 @@
"%s enter the database username." : "%s adja meg az adatbázist elérő felhasználó login nevét.",
"%s enter the database name." : "%s adja meg az adatbázis nevét.",
"%s you may not use dots in the database name" : "%s az adatbázis neve nem tartalmazhat pontot",
- "MS SQL username and/or password not valid: %s" : "Az MS SQL felhasználónév és/vagy jelszó érvénytelen: %s",
- "You need to enter either an existing account or the administrator." : "Vagy egy létező felhasználó vagy az adminisztrátor bejelentkezési nevét kell megadnia",
- "MySQL/MariaDB username and/or password not valid" : "A MySQL/MariaDB felhasználónév és/vagy jelszó nem megfelelő",
- "DB Error: \"%s\"" : "Adatbázis hiba: \"%s\"",
- "Offending command was: \"%s\"" : "A hibát ez a parancs okozta: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "A MySQL/MariaDB felhasználó '%s'@'localhost' már létezik.",
- "Drop this user from MySQL/MariaDB" : "Töröljük ez a felhasználót a MySQL/MariaDB-rendszerből",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "A MySQL/MariaDB felhasználó '%s'@'%%' már létezik.",
- "Drop this user from MySQL/MariaDB." : "Töröljük ez a felhasználót a MySQL/MariaDB-rendszerből.",
"Oracle connection could not be established" : "Az Oracle kapcsolat nem hozható létre",
"Oracle username and/or password not valid" : "Az Oracle felhasználói név és/vagy jelszó érvénytelen",
+ "DB Error: \"%s\"" : "Adatbázis hiba: \"%s\"",
+ "Offending command was: \"%s\"" : "A hibát ez a parancs okozta: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Vagy egy létező felhasználó vagy az adminisztrátor bejelentkezési nevét kell megadnia",
"Offending command was: \"%s\", name: %s, password: %s" : "A hibát okozó parancs ez volt: \"%s\", login név: %s, jelszó: %s",
"PostgreSQL username and/or password not valid" : "A PostgreSQL felhasználói név és/vagy jelszó érvénytelen",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "A Mac OS X nem támogatott és %s nem lesz teljesen működőképes. Csak saját felelősségre használja!",
diff --git a/lib/l10n/id.js b/lib/l10n/id.js
index 14355271356..432ea5c0192 100644
--- a/lib/l10n/id.js
+++ b/lib/l10n/id.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s masukkan nama pengguna basis data.",
"%s enter the database name." : "%s masukkan nama basis data.",
"%s you may not use dots in the database name" : "%s anda tidak boleh menggunakan karakter titik pada nama basis data",
- "MS SQL username and/or password not valid: %s" : "Nama pengguna dan/atau sandi MySQL tidak sah: %s",
- "You need to enter either an existing account or the administrator." : "Anda harus memasukkan akun yang sudah ada atau administrator.",
- "MySQL/MariaDB username and/or password not valid" : "Nama pengguna dan/atau sandi MySQL/MariaDB tidak sah",
- "DB Error: \"%s\"" : "Kesalahan Basis Data: \"%s\"",
- "Offending command was: \"%s\"" : "Perintah yang bermasalah: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "'%s'@'localhost' pengguna MySQL/MariaDB sudah ada.",
- "Drop this user from MySQL/MariaDB" : "Drop pengguna ini dari MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "'%s'@'%%' pengguna MySQL/MariaDB sudah ada.",
- "Drop this user from MySQL/MariaDB." : "Drop pengguna ini dari MySQL/MariaDB.",
"Oracle connection could not be established" : "Koneksi Oracle tidak dapat dibuat",
"Oracle username and/or password not valid" : "Nama pengguna dan/atau sandi Oracle tidak sah",
+ "DB Error: \"%s\"" : "Kesalahan Basis Data: \"%s\"",
+ "Offending command was: \"%s\"" : "Perintah yang bermasalah: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Anda harus memasukkan akun yang sudah ada atau administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Perintah yang bermasalah: \"%s\", nama pengguna: %s, sandi: %s",
"PostgreSQL username and/or password not valid" : "Nama pengguna dan/atau sandi PostgreSQL tidak valid",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X tidak didukung dan %s tidak akan bekerja dengan baik pada platform ini. Gunakan dengan resiko Anda sendiri!",
diff --git a/lib/l10n/id.json b/lib/l10n/id.json
index ac6429bce9a..6aeffa363da 100644
--- a/lib/l10n/id.json
+++ b/lib/l10n/id.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s masukkan nama pengguna basis data.",
"%s enter the database name." : "%s masukkan nama basis data.",
"%s you may not use dots in the database name" : "%s anda tidak boleh menggunakan karakter titik pada nama basis data",
- "MS SQL username and/or password not valid: %s" : "Nama pengguna dan/atau sandi MySQL tidak sah: %s",
- "You need to enter either an existing account or the administrator." : "Anda harus memasukkan akun yang sudah ada atau administrator.",
- "MySQL/MariaDB username and/or password not valid" : "Nama pengguna dan/atau sandi MySQL/MariaDB tidak sah",
- "DB Error: \"%s\"" : "Kesalahan Basis Data: \"%s\"",
- "Offending command was: \"%s\"" : "Perintah yang bermasalah: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "'%s'@'localhost' pengguna MySQL/MariaDB sudah ada.",
- "Drop this user from MySQL/MariaDB" : "Drop pengguna ini dari MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "'%s'@'%%' pengguna MySQL/MariaDB sudah ada.",
- "Drop this user from MySQL/MariaDB." : "Drop pengguna ini dari MySQL/MariaDB.",
"Oracle connection could not be established" : "Koneksi Oracle tidak dapat dibuat",
"Oracle username and/or password not valid" : "Nama pengguna dan/atau sandi Oracle tidak sah",
+ "DB Error: \"%s\"" : "Kesalahan Basis Data: \"%s\"",
+ "Offending command was: \"%s\"" : "Perintah yang bermasalah: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Anda harus memasukkan akun yang sudah ada atau administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Perintah yang bermasalah: \"%s\", nama pengguna: %s, sandi: %s",
"PostgreSQL username and/or password not valid" : "Nama pengguna dan/atau sandi PostgreSQL tidak valid",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X tidak didukung dan %s tidak akan bekerja dengan baik pada platform ini. Gunakan dengan resiko Anda sendiri!",
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index 7f7335a9341..df79ffed2ed 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s digita il nome utente del database.",
"%s enter the database name." : "%s digita il nome del database.",
"%s you may not use dots in the database name" : "%s non dovresti utilizzare punti nel nome del database",
- "MS SQL username and/or password not valid: %s" : "Nome utente e/o password MS SQL non validi: %s",
- "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
- "MySQL/MariaDB username and/or password not valid" : "Nome utente e/o password di MySQL/MariaDB non validi",
- "DB Error: \"%s\"" : "Errore DB: \"%s\"",
- "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "L'utente MySQL/MariaDB '%s'@'localhost' esiste già.",
- "Drop this user from MySQL/MariaDB" : "Elimina questo utente da MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "L'utente MySQL/MariaDB '%s'@'%%' esiste già",
- "Drop this user from MySQL/MariaDB." : "Elimina questo utente da MySQL/MariaDB.",
"Oracle connection could not be established" : "La connessione a Oracle non può essere stabilita",
"Oracle username and/or password not valid" : "Nome utente e/o password di Oracle non validi",
+ "DB Error: \"%s\"" : "Errore DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
"Offending command was: \"%s\", name: %s, password: %s" : "Il comando non consentito era: \"%s\", nome: %s, password: %s",
"PostgreSQL username and/or password not valid" : "Nome utente e/o password di PostgreSQL non validi",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non è supportato e %s non funzionerà correttamente su questa piattaforma. Usalo a tuo rischio!",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 14b8b05d98c..8f5681d5964 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s digita il nome utente del database.",
"%s enter the database name." : "%s digita il nome del database.",
"%s you may not use dots in the database name" : "%s non dovresti utilizzare punti nel nome del database",
- "MS SQL username and/or password not valid: %s" : "Nome utente e/o password MS SQL non validi: %s",
- "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
- "MySQL/MariaDB username and/or password not valid" : "Nome utente e/o password di MySQL/MariaDB non validi",
- "DB Error: \"%s\"" : "Errore DB: \"%s\"",
- "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "L'utente MySQL/MariaDB '%s'@'localhost' esiste già.",
- "Drop this user from MySQL/MariaDB" : "Elimina questo utente da MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "L'utente MySQL/MariaDB '%s'@'%%' esiste già",
- "Drop this user from MySQL/MariaDB." : "Elimina questo utente da MySQL/MariaDB.",
"Oracle connection could not be established" : "La connessione a Oracle non può essere stabilita",
"Oracle username and/or password not valid" : "Nome utente e/o password di Oracle non validi",
+ "DB Error: \"%s\"" : "Errore DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
"Offending command was: \"%s\", name: %s, password: %s" : "Il comando non consentito era: \"%s\", nome: %s, password: %s",
"PostgreSQL username and/or password not valid" : "Nome utente e/o password di PostgreSQL non validi",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non è supportato e %s non funzionerà correttamente su questa piattaforma. Usalo a tuo rischio!",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index ca7558b7141..20ad385491c 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s のデータベースのユーザー名を入力してください。",
"%s enter the database name." : "%s のデータベース名を入力してください。",
"%s you may not use dots in the database name" : "%s ではデータベース名にドットを利用できないかもしれません。",
- "MS SQL username and/or password not valid: %s" : "MS SQL Serverのユーザー名/パスワードが正しくありません: %s",
- "You need to enter either an existing account or the administrator." : "既存のアカウントもしくは管理者のどちらかを入力する必要があります。",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB のユーザー名及び/またはパスワードが無効",
- "DB Error: \"%s\"" : "DBエラー: \"%s\"",
- "Offending command was: \"%s\"" : "違反コマンド: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB のユーザー '%s'@'localhost' はすでに存在します。",
- "Drop this user from MySQL/MariaDB" : "MySQL/MariaDB からこのユーザーを削除",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB のユーザー '%s'@'%%' はすでに存在します",
- "Drop this user from MySQL/MariaDB." : "MySQL/MariaDB からこのユーザーを削除。",
"Oracle connection could not be established" : "Oracleへの接続が確立できませんでした。",
"Oracle username and/or password not valid" : "Oracleのユーザー名もしくはパスワードは有効ではありません",
+ "DB Error: \"%s\"" : "DBエラー: \"%s\"",
+ "Offending command was: \"%s\"" : "違反コマンド: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "既存のアカウントもしくは管理者のどちらかを入力する必要があります。",
"Offending command was: \"%s\", name: %s, password: %s" : "違反コマンド: \"%s\"、名前: %s、パスワード: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQLのユーザー名もしくはパスワードは有効ではありません",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X では、サポートされていません。このOSでは、%sは正常に動作しないかもしれません。ご自身の責任においてご利用ください。",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index b2020de8590..0bb7269a52e 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s のデータベースのユーザー名を入力してください。",
"%s enter the database name." : "%s のデータベース名を入力してください。",
"%s you may not use dots in the database name" : "%s ではデータベース名にドットを利用できないかもしれません。",
- "MS SQL username and/or password not valid: %s" : "MS SQL Serverのユーザー名/パスワードが正しくありません: %s",
- "You need to enter either an existing account or the administrator." : "既存のアカウントもしくは管理者のどちらかを入力する必要があります。",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB のユーザー名及び/またはパスワードが無効",
- "DB Error: \"%s\"" : "DBエラー: \"%s\"",
- "Offending command was: \"%s\"" : "違反コマンド: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB のユーザー '%s'@'localhost' はすでに存在します。",
- "Drop this user from MySQL/MariaDB" : "MySQL/MariaDB からこのユーザーを削除",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB のユーザー '%s'@'%%' はすでに存在します",
- "Drop this user from MySQL/MariaDB." : "MySQL/MariaDB からこのユーザーを削除。",
"Oracle connection could not be established" : "Oracleへの接続が確立できませんでした。",
"Oracle username and/or password not valid" : "Oracleのユーザー名もしくはパスワードは有効ではありません",
+ "DB Error: \"%s\"" : "DBエラー: \"%s\"",
+ "Offending command was: \"%s\"" : "違反コマンド: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "既存のアカウントもしくは管理者のどちらかを入力する必要があります。",
"Offending command was: \"%s\", name: %s, password: %s" : "違反コマンド: \"%s\"、名前: %s、パスワード: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQLのユーザー名もしくはパスワードは有効ではありません",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X では、サポートされていません。このOSでは、%sは正常に動作しないかもしれません。ご自身の責任においてご利用ください。",
diff --git a/lib/l10n/ka_GE.js b/lib/l10n/ka_GE.js
index 62d1058d94e..1259cf83dbb 100644
--- a/lib/l10n/ka_GE.js
+++ b/lib/l10n/ka_GE.js
@@ -17,11 +17,10 @@ OC.L10N.register(
"%s enter the database username." : "%s შეიყვანეთ ბაზის იუზერნეიმი.",
"%s enter the database name." : "%s შეიყვანეთ ბაზის სახელი.",
"%s you may not use dots in the database name" : "%s არ მიუთითოთ წერტილი ბაზის სახელში",
- "MS SQL username and/or password not valid: %s" : "MS SQL მომხმარებელი და/ან პაროლი არ არის მართებული: %s",
- "You need to enter either an existing account or the administrator." : "თქვენ უნდა შეიყვანოთ არსებული მომხმარებელის სახელი ან ადმინისტრატორი.",
+ "Oracle username and/or password not valid" : "Oracle იუზერნეიმი და/ან პაროლი არ არის სწორი",
"DB Error: \"%s\"" : "DB შეცდომა: \"%s\"",
"Offending command was: \"%s\"" : "Offending ბრძანება იყო: \"%s\"",
- "Oracle username and/or password not valid" : "Oracle იუზერნეიმი და/ან პაროლი არ არის სწორი",
+ "You need to enter either an existing account or the administrator." : "თქვენ უნდა შეიყვანოთ არსებული მომხმარებელის სახელი ან ადმინისტრატორი.",
"Offending command was: \"%s\", name: %s, password: %s" : "Offending ბრძანება იყო: \"%s\", სახელი: %s, პაროლი: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL იუზერნეიმი და/ან პაროლი არ არის სწორი",
"Set an admin username." : "დააყენეთ ადმინისტრატორის სახელი.",
diff --git a/lib/l10n/ka_GE.json b/lib/l10n/ka_GE.json
index cc1aff1dd67..d32642f460b 100644
--- a/lib/l10n/ka_GE.json
+++ b/lib/l10n/ka_GE.json
@@ -15,11 +15,10 @@
"%s enter the database username." : "%s შეიყვანეთ ბაზის იუზერნეიმი.",
"%s enter the database name." : "%s შეიყვანეთ ბაზის სახელი.",
"%s you may not use dots in the database name" : "%s არ მიუთითოთ წერტილი ბაზის სახელში",
- "MS SQL username and/or password not valid: %s" : "MS SQL მომხმარებელი და/ან პაროლი არ არის მართებული: %s",
- "You need to enter either an existing account or the administrator." : "თქვენ უნდა შეიყვანოთ არსებული მომხმარებელის სახელი ან ადმინისტრატორი.",
+ "Oracle username and/or password not valid" : "Oracle იუზერნეიმი და/ან პაროლი არ არის სწორი",
"DB Error: \"%s\"" : "DB შეცდომა: \"%s\"",
"Offending command was: \"%s\"" : "Offending ბრძანება იყო: \"%s\"",
- "Oracle username and/or password not valid" : "Oracle იუზერნეიმი და/ან პაროლი არ არის სწორი",
+ "You need to enter either an existing account or the administrator." : "თქვენ უნდა შეიყვანოთ არსებული მომხმარებელის სახელი ან ადმინისტრატორი.",
"Offending command was: \"%s\", name: %s, password: %s" : "Offending ბრძანება იყო: \"%s\", სახელი: %s, პაროლი: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL იუზერნეიმი და/ან პაროლი არ არის სწორი",
"Set an admin username." : "დააყენეთ ადმინისტრატორის სახელი.",
diff --git a/lib/l10n/km.js b/lib/l10n/km.js
index e37b1b80571..ad68233cf62 100644
--- a/lib/l10n/km.js
+++ b/lib/l10n/km.js
@@ -25,8 +25,8 @@ OC.L10N.register(
"%s enter the database username." : "%s វាយ​បញ្ចូល​ឈ្មោះ​អ្នក​ប្រើ​មូលដ្ឋាន​ទិន្នន័យ។",
"%s enter the database name." : "%s វាយ​បញ្ចូល​ឈ្មោះ​មូលដ្ឋាន​ទិន្នន័យ។",
"%s you may not use dots in the database name" : "%s អ្នក​អាច​មិន​ប្រើ​សញ្ញា​ចុច​នៅ​ក្នុង​ឈ្មោះ​មូលដ្ឋាន​ទិន្នន័យ",
- "DB Error: \"%s\"" : "កំហុស DB៖ \"%s\"",
"Oracle connection could not be established" : "មិន​អាច​បង្កើត​ការ​តភ្ជាប់ Oracle",
+ "DB Error: \"%s\"" : "កំហុស DB៖ \"%s\"",
"PostgreSQL username and/or password not valid" : "ឈ្មោះ​អ្នក​ប្រើ និង/ឬ ពាក្យ​សម្ងាត់ PostgreSQL គឺ​មិន​ត្រូវ​ទេ",
"Set an admin username." : "កំណត់​ឈ្មោះ​អ្នក​គ្រប់គ្រង។",
"Set an admin password." : "កំណត់​ពាក្យ​សម្ងាត់​អ្នក​គ្រប់គ្រង។",
diff --git a/lib/l10n/km.json b/lib/l10n/km.json
index 2f9399ff3bf..9133d012c1e 100644
--- a/lib/l10n/km.json
+++ b/lib/l10n/km.json
@@ -23,8 +23,8 @@
"%s enter the database username." : "%s វាយ​បញ្ចូល​ឈ្មោះ​អ្នក​ប្រើ​មូលដ្ឋាន​ទិន្នន័យ។",
"%s enter the database name." : "%s វាយ​បញ្ចូល​ឈ្មោះ​មូលដ្ឋាន​ទិន្នន័យ។",
"%s you may not use dots in the database name" : "%s អ្នក​អាច​មិន​ប្រើ​សញ្ញា​ចុច​នៅ​ក្នុង​ឈ្មោះ​មូលដ្ឋាន​ទិន្នន័យ",
- "DB Error: \"%s\"" : "កំហុស DB៖ \"%s\"",
"Oracle connection could not be established" : "មិន​អាច​បង្កើត​ការ​តភ្ជាប់ Oracle",
+ "DB Error: \"%s\"" : "កំហុស DB៖ \"%s\"",
"PostgreSQL username and/or password not valid" : "ឈ្មោះ​អ្នក​ប្រើ និង/ឬ ពាក្យ​សម្ងាត់ PostgreSQL គឺ​មិន​ត្រូវ​ទេ",
"Set an admin username." : "កំណត់​ឈ្មោះ​អ្នក​គ្រប់គ្រង។",
"Set an admin password." : "កំណត់​ពាក្យ​សម្ងាត់​អ្នក​គ្រប់គ្រង។",
diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js
index e16b479b5ff..a2ec230d59f 100644
--- a/lib/l10n/ko.js
+++ b/lib/l10n/ko.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s 데이터베이스 사용자 이름을 입력해 주십시오.",
"%s enter the database name." : "%s 데이터베이스 이름을 입력하십시오.",
"%s you may not use dots in the database name" : "%s 데이터베이스 이름에는 마침표를 사용할 수 없습니다",
- "MS SQL username and/or password not valid: %s" : "MS SQL 사용자 이름이나 암호가 잘못되었습니다: %s",
- "You need to enter either an existing account or the administrator." : "기존 계정이나 administrator(관리자)를 입력해야 합니다.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB 사용자 이름이나 암호가 올바르지 않습니다",
- "DB Error: \"%s\"" : "DB 오류: \"%s\"",
- "Offending command was: \"%s\"" : "잘못된 명령: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB '%s'@'localhost' 사용자가 이미 존재합니다",
- "Drop this user from MySQL/MariaDB" : "MySQL/MariaDB에서 이 사용자 삭제하기",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB '%s'@'%%' 사용자가 이미 존재합니다",
- "Drop this user from MySQL/MariaDB." : "MySQL/MariaDB에서 이 사용자를 삭제합니다.",
"Oracle connection could not be established" : "Oracle 연결을 수립할 수 없습니다.",
"Oracle username and/or password not valid" : "Oracle 사용자 이름이나 암호가 잘못되었습니다.",
+ "DB Error: \"%s\"" : "DB 오류: \"%s\"",
+ "Offending command was: \"%s\"" : "잘못된 명령: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "기존 계정이나 administrator(관리자)를 입력해야 합니다.",
"Offending command was: \"%s\", name: %s, password: %s" : "잘못된 명령: \"%s\", 이름: %s, 암호: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL 사용자 이름 또는 암호가 잘못되었습니다",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X은 지원하지 않으며 %s이(가) 이 플랫폼에서 올바르게 작동하지 않을 수도 있습니다. 본인 책임으로 사용하십시오! ",
diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json
index 9919a2d96f5..fa52b9a8f05 100644
--- a/lib/l10n/ko.json
+++ b/lib/l10n/ko.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s 데이터베이스 사용자 이름을 입력해 주십시오.",
"%s enter the database name." : "%s 데이터베이스 이름을 입력하십시오.",
"%s you may not use dots in the database name" : "%s 데이터베이스 이름에는 마침표를 사용할 수 없습니다",
- "MS SQL username and/or password not valid: %s" : "MS SQL 사용자 이름이나 암호가 잘못되었습니다: %s",
- "You need to enter either an existing account or the administrator." : "기존 계정이나 administrator(관리자)를 입력해야 합니다.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB 사용자 이름이나 암호가 올바르지 않습니다",
- "DB Error: \"%s\"" : "DB 오류: \"%s\"",
- "Offending command was: \"%s\"" : "잘못된 명령: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB '%s'@'localhost' 사용자가 이미 존재합니다",
- "Drop this user from MySQL/MariaDB" : "MySQL/MariaDB에서 이 사용자 삭제하기",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB '%s'@'%%' 사용자가 이미 존재합니다",
- "Drop this user from MySQL/MariaDB." : "MySQL/MariaDB에서 이 사용자를 삭제합니다.",
"Oracle connection could not be established" : "Oracle 연결을 수립할 수 없습니다.",
"Oracle username and/or password not valid" : "Oracle 사용자 이름이나 암호가 잘못되었습니다.",
+ "DB Error: \"%s\"" : "DB 오류: \"%s\"",
+ "Offending command was: \"%s\"" : "잘못된 명령: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "기존 계정이나 administrator(관리자)를 입력해야 합니다.",
"Offending command was: \"%s\", name: %s, password: %s" : "잘못된 명령: \"%s\", 이름: %s, 암호: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL 사용자 이름 또는 암호가 잘못되었습니다",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X은 지원하지 않으며 %s이(가) 이 플랫폼에서 올바르게 작동하지 않을 수도 있습니다. 본인 책임으로 사용하십시오! ",
diff --git a/lib/l10n/lt_LT.js b/lib/l10n/lt_LT.js
index f13097e6964..e37141e9bef 100644
--- a/lib/l10n/lt_LT.js
+++ b/lib/l10n/lt_LT.js
@@ -35,12 +35,11 @@ OC.L10N.register(
"%s enter the database username." : "%s įrašykite duombazės naudotojo vardą.",
"%s enter the database name." : "%s įrašykite duombazės pavadinimą.",
"%s you may not use dots in the database name" : "%s negalite naudoti taškų duombazės pavadinime",
- "MS SQL username and/or password not valid: %s" : "MS SQL naudotojo vardas ir/arba slaptažodis netinka: %s",
- "You need to enter either an existing account or the administrator." : "Turite prisijungti su egzistuojančia paskyra arba su administratoriumi.",
- "DB Error: \"%s\"" : "DB klaida: \"%s\"",
- "Offending command was: \"%s\"" : "Vykdyta komanda buvo: \"%s\"",
"Oracle connection could not be established" : "Nepavyko sukurti Oracle ryšio",
"Oracle username and/or password not valid" : "Neteisingas Oracle naudotojo vardas ir/arba slaptažodis",
+ "DB Error: \"%s\"" : "DB klaida: \"%s\"",
+ "Offending command was: \"%s\"" : "Vykdyta komanda buvo: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Turite prisijungti su egzistuojančia paskyra arba su administratoriumi.",
"Offending command was: \"%s\", name: %s, password: %s" : "Vykdyta komanda buvo: \"%s\", name: %s, password: %s",
"PostgreSQL username and/or password not valid" : "Neteisingas PostgreSQL naudotojo vardas ir/arba slaptažodis",
"Set an admin username." : "Nustatyti administratoriaus naudotojo vardą.",
diff --git a/lib/l10n/lt_LT.json b/lib/l10n/lt_LT.json
index 9561e9ac36e..c823af258cd 100644
--- a/lib/l10n/lt_LT.json
+++ b/lib/l10n/lt_LT.json
@@ -33,12 +33,11 @@
"%s enter the database username." : "%s įrašykite duombazės naudotojo vardą.",
"%s enter the database name." : "%s įrašykite duombazės pavadinimą.",
"%s you may not use dots in the database name" : "%s negalite naudoti taškų duombazės pavadinime",
- "MS SQL username and/or password not valid: %s" : "MS SQL naudotojo vardas ir/arba slaptažodis netinka: %s",
- "You need to enter either an existing account or the administrator." : "Turite prisijungti su egzistuojančia paskyra arba su administratoriumi.",
- "DB Error: \"%s\"" : "DB klaida: \"%s\"",
- "Offending command was: \"%s\"" : "Vykdyta komanda buvo: \"%s\"",
"Oracle connection could not be established" : "Nepavyko sukurti Oracle ryšio",
"Oracle username and/or password not valid" : "Neteisingas Oracle naudotojo vardas ir/arba slaptažodis",
+ "DB Error: \"%s\"" : "DB klaida: \"%s\"",
+ "Offending command was: \"%s\"" : "Vykdyta komanda buvo: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Turite prisijungti su egzistuojančia paskyra arba su administratoriumi.",
"Offending command was: \"%s\", name: %s, password: %s" : "Vykdyta komanda buvo: \"%s\", name: %s, password: %s",
"PostgreSQL username and/or password not valid" : "Neteisingas PostgreSQL naudotojo vardas ir/arba slaptažodis",
"Set an admin username." : "Nustatyti administratoriaus naudotojo vardą.",
diff --git a/lib/l10n/lv.js b/lib/l10n/lv.js
index 08994917388..5505d0cd7cc 100644
--- a/lib/l10n/lv.js
+++ b/lib/l10n/lv.js
@@ -20,12 +20,11 @@ OC.L10N.register(
"%s enter the database username." : "%s ievadiet datubāzes lietotājvārdu.",
"%s enter the database name." : "%s ievadiet datubāzes nosaukumu.",
"%s you may not use dots in the database name" : "%s datubāžu nosaukumos nedrīkst izmantot punktus",
- "MS SQL username and/or password not valid: %s" : "Nav derīga MySQL parole un/vai lietotājvārds — %s",
- "You need to enter either an existing account or the administrator." : "Jums jāievada vai nu esošs vai administratora konts.",
- "DB Error: \"%s\"" : "DB kļūda — “%s”",
- "Offending command was: \"%s\"" : "Vainīgā komanda bija “%s”",
"Oracle connection could not be established" : "Nevar izveidot savienojumu ar Oracle",
"Oracle username and/or password not valid" : "Nav derīga Oracle parole un/vai lietotājvārds",
+ "DB Error: \"%s\"" : "DB kļūda — “%s”",
+ "Offending command was: \"%s\"" : "Vainīgā komanda bija “%s”",
+ "You need to enter either an existing account or the administrator." : "Jums jāievada vai nu esošs vai administratora konts.",
"Offending command was: \"%s\", name: %s, password: %s" : "Vainīgā komanda bija \"%s\", vārds: %s, parole: %s",
"PostgreSQL username and/or password not valid" : "Nav derīga PostgreSQL parole un/vai lietotājvārds",
"Set an admin username." : "Iestatiet administratora lietotājvārdu.",
diff --git a/lib/l10n/lv.json b/lib/l10n/lv.json
index d72a99f7d96..13b38a73a2c 100644
--- a/lib/l10n/lv.json
+++ b/lib/l10n/lv.json
@@ -18,12 +18,11 @@
"%s enter the database username." : "%s ievadiet datubāzes lietotājvārdu.",
"%s enter the database name." : "%s ievadiet datubāzes nosaukumu.",
"%s you may not use dots in the database name" : "%s datubāžu nosaukumos nedrīkst izmantot punktus",
- "MS SQL username and/or password not valid: %s" : "Nav derīga MySQL parole un/vai lietotājvārds — %s",
- "You need to enter either an existing account or the administrator." : "Jums jāievada vai nu esošs vai administratora konts.",
- "DB Error: \"%s\"" : "DB kļūda — “%s”",
- "Offending command was: \"%s\"" : "Vainīgā komanda bija “%s”",
"Oracle connection could not be established" : "Nevar izveidot savienojumu ar Oracle",
"Oracle username and/or password not valid" : "Nav derīga Oracle parole un/vai lietotājvārds",
+ "DB Error: \"%s\"" : "DB kļūda — “%s”",
+ "Offending command was: \"%s\"" : "Vainīgā komanda bija “%s”",
+ "You need to enter either an existing account or the administrator." : "Jums jāievada vai nu esošs vai administratora konts.",
"Offending command was: \"%s\", name: %s, password: %s" : "Vainīgā komanda bija \"%s\", vārds: %s, parole: %s",
"PostgreSQL username and/or password not valid" : "Nav derīga PostgreSQL parole un/vai lietotājvārds",
"Set an admin username." : "Iestatiet administratora lietotājvārdu.",
diff --git a/lib/l10n/mk.js b/lib/l10n/mk.js
index 82b2d09f392..197a25c2172 100644
--- a/lib/l10n/mk.js
+++ b/lib/l10n/mk.js
@@ -21,9 +21,9 @@ OC.L10N.register(
"%s enter the database username." : "%s внеси го корисничкото име за базата.",
"%s enter the database name." : "%s внеси го името на базата.",
"%s you may not use dots in the database name" : "%s не можеш да користиш точки во името на базата",
+ "Oracle username and/or password not valid" : "Oracle корисничкото име и/или лозинката не се валидни",
"DB Error: \"%s\"" : "DB грешка: \"%s\"",
"Offending command was: \"%s\"" : "Навредувшката команда беше: \"%s\"",
- "Oracle username and/or password not valid" : "Oracle корисничкото име и/или лозинката не се валидни",
"PostgreSQL username and/or password not valid" : "PostgreSQL корисничкото име и/или лозинка не се валидни",
"Set an admin username." : "Постави администраторско корисничко име",
"Set an admin password." : "Постави администраторска лозинка.",
diff --git a/lib/l10n/mk.json b/lib/l10n/mk.json
index f48e88a2bcb..2b396044a21 100644
--- a/lib/l10n/mk.json
+++ b/lib/l10n/mk.json
@@ -19,9 +19,9 @@
"%s enter the database username." : "%s внеси го корисничкото име за базата.",
"%s enter the database name." : "%s внеси го името на базата.",
"%s you may not use dots in the database name" : "%s не можеш да користиш точки во името на базата",
+ "Oracle username and/or password not valid" : "Oracle корисничкото име и/или лозинката не се валидни",
"DB Error: \"%s\"" : "DB грешка: \"%s\"",
"Offending command was: \"%s\"" : "Навредувшката команда беше: \"%s\"",
- "Oracle username and/or password not valid" : "Oracle корисничкото име и/или лозинката не се валидни",
"PostgreSQL username and/or password not valid" : "PostgreSQL корисничкото име и/или лозинка не се валидни",
"Set an admin username." : "Постави администраторско корисничко име",
"Set an admin password." : "Постави администраторска лозинка.",
diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js
index 168fe4ad25c..d09fa5ca6e8 100644
--- a/lib/l10n/nb_NO.js
+++ b/lib/l10n/nb_NO.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s legg inn brukernavn for databasen.",
"%s enter the database name." : "%s legg inn navnet på databasen.",
"%s you may not use dots in the database name" : "%s du kan ikke bruke punktum i databasenavnet",
- "MS SQL username and/or password not valid: %s" : "MS SQL-brukernavn og/eller passord ikke gyldig: %s",
- "You need to enter either an existing account or the administrator." : "Du må legge inn enten en eksisterende konto eller administratoren.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-brukernavn og/eller -passord ikke gyldig",
- "DB Error: \"%s\"" : "Databasefeil: \"%s\"",
- "Offending command was: \"%s\"" : "Kommandoen som feilet: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB-bruker '%s'@'localhost' finnes allerede.",
- "Drop this user from MySQL/MariaDB" : "Fjern denne brukeren fra MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-bruker '%s'@'%%' finnes allerede",
- "Drop this user from MySQL/MariaDB." : "Fjern denne brukeren fra MySQL/MariaDB.",
"Oracle connection could not be established" : "Klarte ikke å etablere forbindelse til Oracle",
"Oracle username and/or password not valid" : "Oracle-brukernavn og/eller passord er ikke gyldig",
+ "DB Error: \"%s\"" : "Databasefeil: \"%s\"",
+ "Offending command was: \"%s\"" : "Kommandoen som feilet: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du må legge inn enten en eksisterende konto eller administratoren.",
"Offending command was: \"%s\", name: %s, password: %s" : "Kommando som feilet: \"%s\", navn: %s, passord: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-brukernavn og/eller passord er ikke gyldig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X støttes ikke og %s vil ikke fungere korrekt på denne plattformen. Bruk på egen risiko!",
diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json
index b72d709a022..665ae866969 100644
--- a/lib/l10n/nb_NO.json
+++ b/lib/l10n/nb_NO.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s legg inn brukernavn for databasen.",
"%s enter the database name." : "%s legg inn navnet på databasen.",
"%s you may not use dots in the database name" : "%s du kan ikke bruke punktum i databasenavnet",
- "MS SQL username and/or password not valid: %s" : "MS SQL-brukernavn og/eller passord ikke gyldig: %s",
- "You need to enter either an existing account or the administrator." : "Du må legge inn enten en eksisterende konto eller administratoren.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB-brukernavn og/eller -passord ikke gyldig",
- "DB Error: \"%s\"" : "Databasefeil: \"%s\"",
- "Offending command was: \"%s\"" : "Kommandoen som feilet: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB-bruker '%s'@'localhost' finnes allerede.",
- "Drop this user from MySQL/MariaDB" : "Fjern denne brukeren fra MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB-bruker '%s'@'%%' finnes allerede",
- "Drop this user from MySQL/MariaDB." : "Fjern denne brukeren fra MySQL/MariaDB.",
"Oracle connection could not be established" : "Klarte ikke å etablere forbindelse til Oracle",
"Oracle username and/or password not valid" : "Oracle-brukernavn og/eller passord er ikke gyldig",
+ "DB Error: \"%s\"" : "Databasefeil: \"%s\"",
+ "Offending command was: \"%s\"" : "Kommandoen som feilet: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du må legge inn enten en eksisterende konto eller administratoren.",
"Offending command was: \"%s\", name: %s, password: %s" : "Kommando som feilet: \"%s\", navn: %s, passord: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-brukernavn og/eller passord er ikke gyldig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X støttes ikke og %s vil ikke fungere korrekt på denne plattformen. Bruk på egen risiko!",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index b62443f9117..c7a68c9000f 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s opgeven database gebruikersnaam.",
"%s enter the database name." : "%s opgeven databasenaam.",
"%s you may not use dots in the database name" : "%s er mogen geen puntjes in de databasenaam voorkomen",
- "MS SQL username and/or password not valid: %s" : "MS SQL gebruikersnaam en/of wachtwoord niet geldig: %s",
- "You need to enter either an existing account or the administrator." : "Geef of een bestaand account op of het beheerdersaccount.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB gebruikersnaam en/of wachtwoord ongeldig",
- "DB Error: \"%s\"" : "DB Fout: \"%s\"",
- "Offending command was: \"%s\"" : "Onjuiste commande was: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB gebruiker '%s'@'localhost' bestaat al.",
- "Drop this user from MySQL/MariaDB" : "Verwijder deze gebruiker uit MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB gebruiker '%s'@'%%' bestaat al",
- "Drop this user from MySQL/MariaDB." : "Verwijder deze gebruiker uit MySQL/MariaDB.",
"Oracle connection could not be established" : "Er kon geen verbinding met Oracle worden bereikt",
"Oracle username and/or password not valid" : "Oracle gebruikersnaam en/of wachtwoord ongeldig",
+ "DB Error: \"%s\"" : "DB Fout: \"%s\"",
+ "Offending command was: \"%s\"" : "Onjuiste commande was: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Geef of een bestaand account op of het beheerdersaccount.",
"Offending command was: \"%s\", name: %s, password: %s" : "Onjuiste commando was: \"%s\", naam: %s, wachtwoord: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL gebruikersnaam en/of wachtwoord ongeldig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OSX wordt niet ondersteund en %s zal niet goed werken op dit platform. Gebruik het op uw eigen risico!",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 26dd33f54fc..560e20fbd4f 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s opgeven database gebruikersnaam.",
"%s enter the database name." : "%s opgeven databasenaam.",
"%s you may not use dots in the database name" : "%s er mogen geen puntjes in de databasenaam voorkomen",
- "MS SQL username and/or password not valid: %s" : "MS SQL gebruikersnaam en/of wachtwoord niet geldig: %s",
- "You need to enter either an existing account or the administrator." : "Geef of een bestaand account op of het beheerdersaccount.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB gebruikersnaam en/of wachtwoord ongeldig",
- "DB Error: \"%s\"" : "DB Fout: \"%s\"",
- "Offending command was: \"%s\"" : "Onjuiste commande was: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB gebruiker '%s'@'localhost' bestaat al.",
- "Drop this user from MySQL/MariaDB" : "Verwijder deze gebruiker uit MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB gebruiker '%s'@'%%' bestaat al",
- "Drop this user from MySQL/MariaDB." : "Verwijder deze gebruiker uit MySQL/MariaDB.",
"Oracle connection could not be established" : "Er kon geen verbinding met Oracle worden bereikt",
"Oracle username and/or password not valid" : "Oracle gebruikersnaam en/of wachtwoord ongeldig",
+ "DB Error: \"%s\"" : "DB Fout: \"%s\"",
+ "Offending command was: \"%s\"" : "Onjuiste commande was: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Geef of een bestaand account op of het beheerdersaccount.",
"Offending command was: \"%s\", name: %s, password: %s" : "Onjuiste commando was: \"%s\", naam: %s, wachtwoord: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL gebruikersnaam en/of wachtwoord ongeldig",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OSX wordt niet ondersteund en %s zal niet goed werken op dit platform. Gebruik het op uw eigen risico!",
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index 6d568685359..611a0b4c6f1 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -54,17 +54,11 @@ OC.L10N.register(
"%s enter the database username." : "%s wpisz nazwę użytkownika do bazy",
"%s enter the database name." : "%s wpisz nazwę bazy.",
"%s you may not use dots in the database name" : "%s nie można używać kropki w nazwie bazy danych",
- "MS SQL username and/or password not valid: %s" : "Nazwa i/lub hasło serwera MS SQL jest niepoprawne: %s.",
- "You need to enter either an existing account or the administrator." : "Należy wprowadzić istniejące konto użytkownika lub administratora.",
- "MySQL/MariaDB username and/or password not valid" : "Użytkownik i/lub hasło do MySQL/MariaDB są niepoprawne",
- "DB Error: \"%s\"" : "Błąd DB: \"%s\"",
- "Offending command was: \"%s\"" : "Niepoprawna komenda: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Użytkownik '%s'@'localhost' MySQL/MariaDB już istnieje.",
- "Drop this user from MySQL/MariaDB" : "Usuń tego użytkownika z MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Użytkownik '%s'@'%%' MySQL/MariaDB już istnieje.",
- "Drop this user from MySQL/MariaDB." : "Usuń tego użytkownika z MySQL/MariaDB",
"Oracle connection could not be established" : "Nie można ustanowić połączenia z bazą Oracle",
"Oracle username and/or password not valid" : "Oracle: Nazwa użytkownika i/lub hasło jest niepoprawne",
+ "DB Error: \"%s\"" : "Błąd DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Niepoprawna komenda: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Należy wprowadzić istniejące konto użytkownika lub administratora.",
"Offending command was: \"%s\", name: %s, password: %s" : "Niepoprawne polecania: \"%s\", nazwa: %s, hasło: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL: Nazwa użytkownika i/lub hasło jest niepoprawne",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie jest wspierany i %s nie będzie działać poprawnie na tej platformie. Używasz na własne ryzyko!",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index ec89fc3acbd..2e96f414a66 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -52,17 +52,11 @@
"%s enter the database username." : "%s wpisz nazwę użytkownika do bazy",
"%s enter the database name." : "%s wpisz nazwę bazy.",
"%s you may not use dots in the database name" : "%s nie można używać kropki w nazwie bazy danych",
- "MS SQL username and/or password not valid: %s" : "Nazwa i/lub hasło serwera MS SQL jest niepoprawne: %s.",
- "You need to enter either an existing account or the administrator." : "Należy wprowadzić istniejące konto użytkownika lub administratora.",
- "MySQL/MariaDB username and/or password not valid" : "Użytkownik i/lub hasło do MySQL/MariaDB są niepoprawne",
- "DB Error: \"%s\"" : "Błąd DB: \"%s\"",
- "Offending command was: \"%s\"" : "Niepoprawna komenda: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Użytkownik '%s'@'localhost' MySQL/MariaDB już istnieje.",
- "Drop this user from MySQL/MariaDB" : "Usuń tego użytkownika z MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Użytkownik '%s'@'%%' MySQL/MariaDB już istnieje.",
- "Drop this user from MySQL/MariaDB." : "Usuń tego użytkownika z MySQL/MariaDB",
"Oracle connection could not be established" : "Nie można ustanowić połączenia z bazą Oracle",
"Oracle username and/or password not valid" : "Oracle: Nazwa użytkownika i/lub hasło jest niepoprawne",
+ "DB Error: \"%s\"" : "Błąd DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Niepoprawna komenda: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Należy wprowadzić istniejące konto użytkownika lub administratora.",
"Offending command was: \"%s\", name: %s, password: %s" : "Niepoprawne polecania: \"%s\", nazwa: %s, hasło: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL: Nazwa użytkownika i/lub hasło jest niepoprawne",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie jest wspierany i %s nie będzie działać poprawnie na tej platformie. Używasz na własne ryzyko!",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index e5940fb577e..d348ac705f3 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s insira o nome de usuário do banco de dados.",
"%s enter the database name." : "%s insira o nome do banco de dados.",
"%s you may not use dots in the database name" : "%s você não pode usar pontos no nome do banco de dados",
- "MS SQL username and/or password not valid: %s" : "Nome de usuário e/ou senha MS SQL inválido(s): %s",
- "You need to enter either an existing account or the administrator." : "Você precisa inserir uma conta existente ou a do administrador.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB nome de usuário e/ou senha não é válida",
- "DB Error: \"%s\"" : "Erro no BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comando ofensivo era: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB usuário '%s'@'localhost' já existe.",
- "Drop this user from MySQL/MariaDB" : "Eliminar esse usuário de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB usuário '%s'@'%%' já existe",
- "Drop this user from MySQL/MariaDB." : "Eliminar esse usuário de MySQL/MariaDB",
"Oracle connection could not be established" : "Conexão Oracle não pode ser estabelecida",
"Oracle username and/or password not valid" : "Nome de usuário e/ou senha Oracle inválido(s)",
+ "DB Error: \"%s\"" : "Erro no BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comando ofensivo era: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Você precisa inserir uma conta existente ou a do administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "Comando ofensivo era: \"%s\", nome: %s, senha: %s",
"PostgreSQL username and/or password not valid" : "Nome de usuário e/ou senha PostgreSQL inválido(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X não é suportado e %s não funcionará corretamente nesta plataforma. Use-o por sua conta e risco!",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index ba29f32e22d..63192f8a5bd 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s insira o nome de usuário do banco de dados.",
"%s enter the database name." : "%s insira o nome do banco de dados.",
"%s you may not use dots in the database name" : "%s você não pode usar pontos no nome do banco de dados",
- "MS SQL username and/or password not valid: %s" : "Nome de usuário e/ou senha MS SQL inválido(s): %s",
- "You need to enter either an existing account or the administrator." : "Você precisa inserir uma conta existente ou a do administrador.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB nome de usuário e/ou senha não é válida",
- "DB Error: \"%s\"" : "Erro no BD: \"%s\"",
- "Offending command was: \"%s\"" : "Comando ofensivo era: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB usuário '%s'@'localhost' já existe.",
- "Drop this user from MySQL/MariaDB" : "Eliminar esse usuário de MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB usuário '%s'@'%%' já existe",
- "Drop this user from MySQL/MariaDB." : "Eliminar esse usuário de MySQL/MariaDB",
"Oracle connection could not be established" : "Conexão Oracle não pode ser estabelecida",
"Oracle username and/or password not valid" : "Nome de usuário e/ou senha Oracle inválido(s)",
+ "DB Error: \"%s\"" : "Erro no BD: \"%s\"",
+ "Offending command was: \"%s\"" : "Comando ofensivo era: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Você precisa inserir uma conta existente ou a do administrador.",
"Offending command was: \"%s\", name: %s, password: %s" : "Comando ofensivo era: \"%s\", nome: %s, senha: %s",
"PostgreSQL username and/or password not valid" : "Nome de usuário e/ou senha PostgreSQL inválido(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X não é suportado e %s não funcionará corretamente nesta plataforma. Use-o por sua conta e risco!",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index 5c9f84ee0df..75149346f0b 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -59,17 +59,11 @@ OC.L10N.register(
"%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
"%s enter the database name." : "%s introduza o nome da base de dados",
"%s you may not use dots in the database name" : "%s não é permitido utilizar pontos (.) no nome da base de dados",
- "MS SQL username and/or password not valid: %s" : "Nome de utilizador/password do MySQL é inválido: %s",
- "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
- "MySQL/MariaDB username and/or password not valid" : "Nome de utilizador/password do MySQL/Maria DB inválida",
- "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
- "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "O utilizador '%s'@'localhost' do MySQL/MariaDB já existe.",
- "Drop this user from MySQL/MariaDB" : "Eliminar este utilizador do MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "O utilizador '%s'@'%%' do MySQL/MariaDB já existe",
- "Drop this user from MySQL/MariaDB." : "Eliminar este utilizador do MySQL/MariaDB",
"Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
"Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
+ "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
+ "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
"Offending command was: \"%s\", name: %s, password: %s" : "O comando gerador de erro foi: \"%s\", nome: %s, password: %s",
"PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Esta plataforma não suporta o sistema operativo Mac OS X e o %s poderá não funcionar correctamente. Utilize por sua conta e risco.",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index cf78d6fa9ab..21a3b857230 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -57,17 +57,11 @@
"%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
"%s enter the database name." : "%s introduza o nome da base de dados",
"%s you may not use dots in the database name" : "%s não é permitido utilizar pontos (.) no nome da base de dados",
- "MS SQL username and/or password not valid: %s" : "Nome de utilizador/password do MySQL é inválido: %s",
- "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
- "MySQL/MariaDB username and/or password not valid" : "Nome de utilizador/password do MySQL/Maria DB inválida",
- "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
- "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "O utilizador '%s'@'localhost' do MySQL/MariaDB já existe.",
- "Drop this user from MySQL/MariaDB" : "Eliminar este utilizador do MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "O utilizador '%s'@'%%' do MySQL/MariaDB já existe",
- "Drop this user from MySQL/MariaDB." : "Eliminar este utilizador do MySQL/MariaDB",
"Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
"Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
+ "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
+ "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
"Offending command was: \"%s\", name: %s, password: %s" : "O comando gerador de erro foi: \"%s\", nome: %s, password: %s",
"PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Esta plataforma não suporta o sistema operativo Mac OS X e o %s poderá não funcionar correctamente. Utilize por sua conta e risco.",
diff --git a/lib/l10n/ro.js b/lib/l10n/ro.js
index 24a42ef68c0..ba7d11cdfb1 100644
--- a/lib/l10n/ro.js
+++ b/lib/l10n/ro.js
@@ -32,14 +32,8 @@ OC.L10N.register(
"Token expired. Please reload page." : "Token expirat. Te rugăm să reîncarci pagina.",
"Unknown user" : "Utilizator necunoscut",
"%s enter the database name." : "%s introduceți numele bazei de date",
- "MS SQL username and/or password not valid: %s" : "Nume utilizator și/sau parolă MS SQL greșită: %s",
- "MySQL/MariaDB username and/or password not valid" : "Nume utilizator și/sau parolă MySQL/MariaDB greșită",
- "DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Utilizatorul MySQL/MariaDB '%s'@'localhost' deja există.",
- "Drop this user from MySQL/MariaDB" : "Șterge acest utilizator din MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Utilizatorul MySQL/MariaDB '%s'@'%%' deja există.",
- "Drop this user from MySQL/MariaDB." : "Șterge acest utilizator din MySQL/MariaDB.",
"Oracle connection could not be established" : "Conexiunea Oracle nu a putut fi stabilită",
+ "DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"",
"PostgreSQL username and/or password not valid" : "Nume utilizator și/sau parolă PostgreSQL greșită",
"Set an admin username." : "Setează un nume de administrator.",
"Set an admin password." : "Setează o parolă de administrator.",
diff --git a/lib/l10n/ro.json b/lib/l10n/ro.json
index 23c946b93e3..8e85455c50c 100644
--- a/lib/l10n/ro.json
+++ b/lib/l10n/ro.json
@@ -30,14 +30,8 @@
"Token expired. Please reload page." : "Token expirat. Te rugăm să reîncarci pagina.",
"Unknown user" : "Utilizator necunoscut",
"%s enter the database name." : "%s introduceți numele bazei de date",
- "MS SQL username and/or password not valid: %s" : "Nume utilizator și/sau parolă MS SQL greșită: %s",
- "MySQL/MariaDB username and/or password not valid" : "Nume utilizator și/sau parolă MySQL/MariaDB greșită",
- "DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Utilizatorul MySQL/MariaDB '%s'@'localhost' deja există.",
- "Drop this user from MySQL/MariaDB" : "Șterge acest utilizator din MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Utilizatorul MySQL/MariaDB '%s'@'%%' deja există.",
- "Drop this user from MySQL/MariaDB." : "Șterge acest utilizator din MySQL/MariaDB.",
"Oracle connection could not be established" : "Conexiunea Oracle nu a putut fi stabilită",
+ "DB Error: \"%s\"" : "Eroare Bază de Date: \"%s\"",
"PostgreSQL username and/or password not valid" : "Nume utilizator și/sau parolă PostgreSQL greșită",
"Set an admin username." : "Setează un nume de administrator.",
"Set an admin password." : "Setează o parolă de administrator.",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index d245bec5b19..16331c5cd76 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s введите имя пользователя базы данных.",
"%s enter the database name." : "%s введите имя базы данных.",
"%s you may not use dots in the database name" : "%s Вы не можете использовать точки в имени базы данных",
- "MS SQL username and/or password not valid: %s" : "Неверное имя пользователя и/или пароль MS SQL: %s",
- "You need to enter either an existing account or the administrator." : "Вы должны войти или в существующий аккаунт или под администратором.",
- "MySQL/MariaDB username and/or password not valid" : "Неверное имя пользователя и/или пароль MySQL/MariaDB",
- "DB Error: \"%s\"" : "Ошибка БД: \"%s\"",
- "Offending command was: \"%s\"" : "Вызываемая команда была: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Пользователь MySQL/MariaDB '%s'@'localhost' уже существует.",
- "Drop this user from MySQL/MariaDB" : "Удалить данного участника из MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Пользователь MySQL/MariaDB '%s'@'%%' уже существует.",
- "Drop this user from MySQL/MariaDB." : "Удалить данного участника из MySQL/MariaDB.",
"Oracle connection could not be established" : "Соединение с Oracle не может быть установлено",
"Oracle username and/or password not valid" : "Неверное имя пользователя и/или пароль Oracle",
+ "DB Error: \"%s\"" : "Ошибка БД: \"%s\"",
+ "Offending command was: \"%s\"" : "Вызываемая команда была: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Вы должны войти или в существующий аккаунт или под администратором.",
"Offending command was: \"%s\", name: %s, password: %s" : "Вызываемая команда была: \"%s\", имя: %s, пароль: %s",
"PostgreSQL username and/or password not valid" : "Неверное имя пользователя и/или пароль PostgreSQL",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не поддерживается и %s может работать некорректно на данной платформе. Используйте на свой страх и риск!",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index 511f43789f4..c295748adab 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s введите имя пользователя базы данных.",
"%s enter the database name." : "%s введите имя базы данных.",
"%s you may not use dots in the database name" : "%s Вы не можете использовать точки в имени базы данных",
- "MS SQL username and/or password not valid: %s" : "Неверное имя пользователя и/или пароль MS SQL: %s",
- "You need to enter either an existing account or the administrator." : "Вы должны войти или в существующий аккаунт или под администратором.",
- "MySQL/MariaDB username and/or password not valid" : "Неверное имя пользователя и/или пароль MySQL/MariaDB",
- "DB Error: \"%s\"" : "Ошибка БД: \"%s\"",
- "Offending command was: \"%s\"" : "Вызываемая команда была: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Пользователь MySQL/MariaDB '%s'@'localhost' уже существует.",
- "Drop this user from MySQL/MariaDB" : "Удалить данного участника из MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Пользователь MySQL/MariaDB '%s'@'%%' уже существует.",
- "Drop this user from MySQL/MariaDB." : "Удалить данного участника из MySQL/MariaDB.",
"Oracle connection could not be established" : "Соединение с Oracle не может быть установлено",
"Oracle username and/or password not valid" : "Неверное имя пользователя и/или пароль Oracle",
+ "DB Error: \"%s\"" : "Ошибка БД: \"%s\"",
+ "Offending command was: \"%s\"" : "Вызываемая команда была: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Вы должны войти или в существующий аккаунт или под администратором.",
"Offending command was: \"%s\", name: %s, password: %s" : "Вызываемая команда была: \"%s\", имя: %s, пароль: %s",
"PostgreSQL username and/or password not valid" : "Неверное имя пользователя и/или пароль PostgreSQL",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не поддерживается и %s может работать некорректно на данной платформе. Используйте на свой страх и риск!",
diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js
index a8d53af8702..ca0beaf334a 100644
--- a/lib/l10n/sk_SK.js
+++ b/lib/l10n/sk_SK.js
@@ -58,17 +58,11 @@ OC.L10N.register(
"%s enter the database username." : "Zadajte používateľské meno %s databázy.",
"%s enter the database name." : "Zadajte názov databázy pre %s databázy.",
"%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky",
- "MS SQL username and/or password not valid: %s" : "Používateľské meno, alebo heslo MS SQL nie je platné: %s",
- "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.",
- "MySQL/MariaDB username and/or password not valid" : "Používateľské meno a/alebo heslo pre MySQL/MariaDB databázu je neplatné",
- "DB Error: \"%s\"" : "Chyba DB: \"%s\"",
- "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Používateľ '%s'@'localhost' už v MySQL/MariaDB existuje.",
- "Drop this user from MySQL/MariaDB" : "Zahodiť používateľa z MySQL/MariaDB.",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Používateľ '%s'@'%%' už v MySQL/MariaDB existuje",
- "Drop this user from MySQL/MariaDB." : "Zahodiť používateľa z MySQL/MariaDB.",
"Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle",
"Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné",
+ "DB Error: \"%s\"" : "Chyba DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.",
"Offending command was: \"%s\", name: %s, password: %s" : "Podozrivý príkaz bol: \"%s\", meno: %s, heslo: %s",
"PostgreSQL username and/or password not valid" : "Používateľské meno a/alebo heslo pre PostgreSQL databázu je neplatné",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie je podporovaný a %s nebude správne fungovať na tejto platforme. Použite ho na vlastné riziko!",
diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json
index d223183f974..65334f58988 100644
--- a/lib/l10n/sk_SK.json
+++ b/lib/l10n/sk_SK.json
@@ -56,17 +56,11 @@
"%s enter the database username." : "Zadajte používateľské meno %s databázy.",
"%s enter the database name." : "Zadajte názov databázy pre %s databázy.",
"%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky",
- "MS SQL username and/or password not valid: %s" : "Používateľské meno, alebo heslo MS SQL nie je platné: %s",
- "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.",
- "MySQL/MariaDB username and/or password not valid" : "Používateľské meno a/alebo heslo pre MySQL/MariaDB databázu je neplatné",
- "DB Error: \"%s\"" : "Chyba DB: \"%s\"",
- "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Používateľ '%s'@'localhost' už v MySQL/MariaDB existuje.",
- "Drop this user from MySQL/MariaDB" : "Zahodiť používateľa z MySQL/MariaDB.",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Používateľ '%s'@'%%' už v MySQL/MariaDB existuje",
- "Drop this user from MySQL/MariaDB." : "Zahodiť používateľa z MySQL/MariaDB.",
"Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle",
"Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné",
+ "DB Error: \"%s\"" : "Chyba DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.",
"Offending command was: \"%s\", name: %s, password: %s" : "Podozrivý príkaz bol: \"%s\", meno: %s, heslo: %s",
"PostgreSQL username and/or password not valid" : "Používateľské meno a/alebo heslo pre PostgreSQL databázu je neplatné",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie je podporovaný a %s nebude správne fungovať na tejto platforme. Použite ho na vlastné riziko!",
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index 4630fa87dee..48df48d71c6 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -60,17 +60,11 @@ OC.L10N.register(
"%s enter the database username." : "%s - vnos uporabniškega imena podatkovne zbirke.",
"%s enter the database name." : "%s - vnos imena podatkovne zbirke.",
"%s you may not use dots in the database name" : "%s - v imenu podatkovne zbirke ni dovoljeno uporabljati pik.",
- "MS SQL username and/or password not valid: %s" : "Uporabniško ime ali geslo MS SQL ni veljavno: %s",
- "You need to enter either an existing account or the administrator." : "Prijaviti se je treba v obstoječi ali pa skrbniški račun.",
- "MySQL/MariaDB username and/or password not valid" : "Uporabniško ime ali geslo za MySQL/MariaDB ni veljavno",
- "DB Error: \"%s\"" : "Napaka podatkovne zbirke: \"%s\"",
- "Offending command was: \"%s\"" : "Napačni ukaz je: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Uporabnik podatkovne zbirke MySQL/MariaDB '%s'@'localhost' že obstaja.",
- "Drop this user from MySQL/MariaDB" : "Odstrani uporabnika iz podatkovne zbirke MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Uporabnik podatkovne zbirke MySQL/MariaDB '%s'@'%%' že obstaja.",
- "Drop this user from MySQL/MariaDB." : "Odstrani uporabnika iz podatkovne zbirke MySQL/MariaDB.",
"Oracle connection could not be established" : "Povezave s sistemom Oracle ni mogoče vzpostaviti.",
"Oracle username and/or password not valid" : "Uporabniško ime ali geslo Oracle ni veljavno",
+ "DB Error: \"%s\"" : "Napaka podatkovne zbirke: \"%s\"",
+ "Offending command was: \"%s\"" : "Napačni ukaz je: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Prijaviti se je treba v obstoječi ali pa skrbniški račun.",
"Offending command was: \"%s\", name: %s, password: %s" : "Napačni ukaz je: \"%s\", ime: %s, geslo: %s",
"PostgreSQL username and/or password not valid" : "Uporabniško ime ali geslo PostgreSQL ni veljavno",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s v tem okolju ne bo deloval zanesljivo. Program uporabljate na lastno odgovornost! ",
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index ca40bc3cb12..8507e1194d9 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -58,17 +58,11 @@
"%s enter the database username." : "%s - vnos uporabniškega imena podatkovne zbirke.",
"%s enter the database name." : "%s - vnos imena podatkovne zbirke.",
"%s you may not use dots in the database name" : "%s - v imenu podatkovne zbirke ni dovoljeno uporabljati pik.",
- "MS SQL username and/or password not valid: %s" : "Uporabniško ime ali geslo MS SQL ni veljavno: %s",
- "You need to enter either an existing account or the administrator." : "Prijaviti se je treba v obstoječi ali pa skrbniški račun.",
- "MySQL/MariaDB username and/or password not valid" : "Uporabniško ime ali geslo za MySQL/MariaDB ni veljavno",
- "DB Error: \"%s\"" : "Napaka podatkovne zbirke: \"%s\"",
- "Offending command was: \"%s\"" : "Napačni ukaz je: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Uporabnik podatkovne zbirke MySQL/MariaDB '%s'@'localhost' že obstaja.",
- "Drop this user from MySQL/MariaDB" : "Odstrani uporabnika iz podatkovne zbirke MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Uporabnik podatkovne zbirke MySQL/MariaDB '%s'@'%%' že obstaja.",
- "Drop this user from MySQL/MariaDB." : "Odstrani uporabnika iz podatkovne zbirke MySQL/MariaDB.",
"Oracle connection could not be established" : "Povezave s sistemom Oracle ni mogoče vzpostaviti.",
"Oracle username and/or password not valid" : "Uporabniško ime ali geslo Oracle ni veljavno",
+ "DB Error: \"%s\"" : "Napaka podatkovne zbirke: \"%s\"",
+ "Offending command was: \"%s\"" : "Napačni ukaz je: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Prijaviti se je treba v obstoječi ali pa skrbniški račun.",
"Offending command was: \"%s\", name: %s, password: %s" : "Napačni ukaz je: \"%s\", ime: %s, geslo: %s",
"PostgreSQL username and/or password not valid" : "Uporabniško ime ali geslo PostgreSQL ni veljavno",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Sistem Mac OS X ni podprt, zato %s v tem okolju ne bo deloval zanesljivo. Program uporabljate na lastno odgovornost! ",
diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js
index f4057220c03..fbf1b58beee 100644
--- a/lib/l10n/sq.js
+++ b/lib/l10n/sq.js
@@ -20,11 +20,10 @@ OC.L10N.register(
"%s enter the database username." : "% shkruani përdoruesin e database-it.",
"%s enter the database name." : "%s shkruani emrin e database-it.",
"%s you may not use dots in the database name" : "%s nuk mund të përdorni pikat tek emri i database-it",
- "MS SQL username and/or password not valid: %s" : "Përdoruesi dhe/apo kodi i MS SQL i pavlefshëm: %s",
- "You need to enter either an existing account or the administrator." : "Duhet të përdorni një llogari ekzistuese ose llogarinë e administratorit.",
+ "Oracle username and/or password not valid" : "Përdoruesi dhe/apo kodi i Oracle-it i pavlefshëm",
"DB Error: \"%s\"" : "Veprim i gabuar i DB-it: \"%s\"",
"Offending command was: \"%s\"" : "Komanda e gabuar ishte: \"%s\"",
- "Oracle username and/or password not valid" : "Përdoruesi dhe/apo kodi i Oracle-it i pavlefshëm",
+ "You need to enter either an existing account or the administrator." : "Duhet të përdorni një llogari ekzistuese ose llogarinë e administratorit.",
"Offending command was: \"%s\", name: %s, password: %s" : "Komanda e gabuar ishte: \"%s\", përdoruesi: %s, kodi: %s",
"PostgreSQL username and/or password not valid" : "Përdoruesi dhe/apo kodi i PostgreSQL i pavlefshëm",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk është i mbështetur dhe %s nuk do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj!",
diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json
index 6798d9cee77..b0a23493d40 100644
--- a/lib/l10n/sq.json
+++ b/lib/l10n/sq.json
@@ -18,11 +18,10 @@
"%s enter the database username." : "% shkruani përdoruesin e database-it.",
"%s enter the database name." : "%s shkruani emrin e database-it.",
"%s you may not use dots in the database name" : "%s nuk mund të përdorni pikat tek emri i database-it",
- "MS SQL username and/or password not valid: %s" : "Përdoruesi dhe/apo kodi i MS SQL i pavlefshëm: %s",
- "You need to enter either an existing account or the administrator." : "Duhet të përdorni një llogari ekzistuese ose llogarinë e administratorit.",
+ "Oracle username and/or password not valid" : "Përdoruesi dhe/apo kodi i Oracle-it i pavlefshëm",
"DB Error: \"%s\"" : "Veprim i gabuar i DB-it: \"%s\"",
"Offending command was: \"%s\"" : "Komanda e gabuar ishte: \"%s\"",
- "Oracle username and/or password not valid" : "Përdoruesi dhe/apo kodi i Oracle-it i pavlefshëm",
+ "You need to enter either an existing account or the administrator." : "Duhet të përdorni një llogari ekzistuese ose llogarinë e administratorit.",
"Offending command was: \"%s\", name: %s, password: %s" : "Komanda e gabuar ishte: \"%s\", përdoruesi: %s, kodi: %s",
"PostgreSQL username and/or password not valid" : "Përdoruesi dhe/apo kodi i PostgreSQL i pavlefshëm",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk është i mbështetur dhe %s nuk do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj!",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index cb36007723b..286856622c7 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s унеси корисничко име базе података.",
"%s enter the database name." : "%s унеси име базе података.",
"%s you may not use dots in the database name" : "%s не можете користити тачке у имену базе података",
- "MS SQL username and/or password not valid: %s" : "MS SQL корисничко име и/или лозинка нису исправни: %s",
- "You need to enter either an existing account or the administrator." : "Потребно је да унесете или постојећи налог или администраторски.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB корисничко име и/или лозинка нису исправни",
- "DB Error: \"%s\"" : "Грешка базе података: \"%s\"",
- "Offending command was: \"%s\"" : "Неисправна команда је: „%s“",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB корисник '%s'@'localhost' већ постоји.",
- "Drop this user from MySQL/MariaDB" : "Обришите овог корисника из MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB корисник '%s'@'%%' већ постоји",
- "Drop this user from MySQL/MariaDB." : "Обришите овог корисника из MySQL/MariaDB.",
"Oracle connection could not be established" : "Веза са базом података Oracle не може бити успостављена",
"Oracle username and/or password not valid" : "Oracle корисничко име и/или лозинка нису исправни",
+ "DB Error: \"%s\"" : "Грешка базе података: \"%s\"",
+ "Offending command was: \"%s\"" : "Неисправна команда је: „%s“",
+ "You need to enter either an existing account or the administrator." : "Потребно је да унесете или постојећи налог или администраторски.",
"Offending command was: \"%s\", name: %s, password: %s" : "Неисправна команда је: „%s“, назив: %s, лозинка: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL корисничко име и/или лозинка нису исправни",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Мек ОС Икс није подржан и %s неће радити исправно на овој платформи. Користите га на сопствени ризик!",
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index 2cc9f4de390..2e76f5e9000 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s унеси корисничко име базе података.",
"%s enter the database name." : "%s унеси име базе података.",
"%s you may not use dots in the database name" : "%s не можете користити тачке у имену базе података",
- "MS SQL username and/or password not valid: %s" : "MS SQL корисничко име и/или лозинка нису исправни: %s",
- "You need to enter either an existing account or the administrator." : "Потребно је да унесете или постојећи налог или администраторски.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB корисничко име и/или лозинка нису исправни",
- "DB Error: \"%s\"" : "Грешка базе података: \"%s\"",
- "Offending command was: \"%s\"" : "Неисправна команда је: „%s“",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB корисник '%s'@'localhost' већ постоји.",
- "Drop this user from MySQL/MariaDB" : "Обришите овог корисника из MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB корисник '%s'@'%%' већ постоји",
- "Drop this user from MySQL/MariaDB." : "Обришите овог корисника из MySQL/MariaDB.",
"Oracle connection could not be established" : "Веза са базом података Oracle не може бити успостављена",
"Oracle username and/or password not valid" : "Oracle корисничко име и/или лозинка нису исправни",
+ "DB Error: \"%s\"" : "Грешка базе података: \"%s\"",
+ "Offending command was: \"%s\"" : "Неисправна команда је: „%s“",
+ "You need to enter either an existing account or the administrator." : "Потребно је да унесете или постојећи налог или администраторски.",
"Offending command was: \"%s\", name: %s, password: %s" : "Неисправна команда је: „%s“, назив: %s, лозинка: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL корисничко име и/или лозинка нису исправни",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Мек ОС Икс није подржан и %s неће радити исправно на овој платформи. Користите га на сопствени ризик!",
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
index 59122082c7d..c3b2d0655df 100644
--- a/lib/l10n/sv.js
+++ b/lib/l10n/sv.js
@@ -54,17 +54,11 @@ OC.L10N.register(
"%s enter the database username." : "%s ange databasanvändare.",
"%s enter the database name." : "%s ange databasnamn",
"%s you may not use dots in the database name" : "%s du får inte använda punkter i databasnamnet",
- "MS SQL username and/or password not valid: %s" : "MS SQL-användaren och/eller lösenordet var inte giltigt: %s",
- "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB användarnamn och/eller lösenord är felaktigt",
- "DB Error: \"%s\"" : "DB fel: \"%s\"",
- "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB användare '%s'@'localhost' existerar redan.",
- "Drop this user from MySQL/MariaDB" : "Radera denna användare från MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB användare '%s'@'%%' existerar redan",
- "Drop this user from MySQL/MariaDB." : "Radera denna användare från MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle-anslutning kunde inte etableras",
"Oracle username and/or password not valid" : "Oracle-användarnamnet och/eller lösenordet är felaktigt",
+ "DB Error: \"%s\"" : "DB fel: \"%s\"",
+ "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.",
"Offending command was: \"%s\", name: %s, password: %s" : "Det felande kommandot var: \"%s\", name: %s, password: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-användarnamnet och/eller lösenordet är felaktigt",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X stöds inte och %s kommer inte att fungera korrekt på denna plattform. Använd på egen risk!",
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
index fcf8eb9b858..5b53e335a79 100644
--- a/lib/l10n/sv.json
+++ b/lib/l10n/sv.json
@@ -52,17 +52,11 @@
"%s enter the database username." : "%s ange databasanvändare.",
"%s enter the database name." : "%s ange databasnamn",
"%s you may not use dots in the database name" : "%s du får inte använda punkter i databasnamnet",
- "MS SQL username and/or password not valid: %s" : "MS SQL-användaren och/eller lösenordet var inte giltigt: %s",
- "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB användarnamn och/eller lösenord är felaktigt",
- "DB Error: \"%s\"" : "DB fel: \"%s\"",
- "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB användare '%s'@'localhost' existerar redan.",
- "Drop this user from MySQL/MariaDB" : "Radera denna användare från MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB användare '%s'@'%%' existerar redan",
- "Drop this user from MySQL/MariaDB." : "Radera denna användare från MySQL/MariaDB.",
"Oracle connection could not be established" : "Oracle-anslutning kunde inte etableras",
"Oracle username and/or password not valid" : "Oracle-användarnamnet och/eller lösenordet är felaktigt",
+ "DB Error: \"%s\"" : "DB fel: \"%s\"",
+ "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.",
"Offending command was: \"%s\", name: %s, password: %s" : "Det felande kommandot var: \"%s\", name: %s, password: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL-användarnamnet och/eller lösenordet är felaktigt",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X stöds inte och %s kommer inte att fungera korrekt på denna plattform. Använd på egen risk!",
diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js
index 816af4506bb..c2d327e22d5 100644
--- a/lib/l10n/th_TH.js
+++ b/lib/l10n/th_TH.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s ใส่ชื่อผู้ใช้ฐานข้อมูล",
"%s enter the database name." : "%s ใส่ชื่อฐานข้อมูล",
"%s you may not use dots in the database name" : "%s บางที่คุณไม่ควรใช้จุดในชื่อฐานข้อมูล",
- "MS SQL username and/or password not valid: %s" : "ชื่อผู้ใช้หรือรหัสผ่าน MS SQLไม่ถูกต้อง: %s",
- "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
- "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
- "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB มีผู้ใช้งาน '%s'@'localhost' อยู่แล้ว",
- "Drop this user from MySQL/MariaDB" : "ลดจำนวนผู้ใช้ลงจาก MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB มีผู้ใช้งาน '%s'@'%%' อยู่แล้ว",
- "Drop this user from MySQL/MariaDB." : "ลดจำนวนผู้ใช้ลงจาก MySQL/MariaDB",
"Oracle connection could not be established" : "ไม่สามารถสร้างการเชื่อมต่อกับ Oracle ",
"Oracle username and/or password not valid" : "Oracle ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
+ "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
+ "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
"Offending command was: \"%s\", name: %s, password: %s" : "คำสั่งที่กระทำผิดคือ: \"%s\", ชื่อผู้ใช้: %s, รหัสผ่าน: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "ระบบปฏิบัติการ Mac OS X ไม่ได้รับการสนับสนุนและ %s จะไม่ทำงานบนแพลตฟอร์มนี้ ใช้มันบนความเสี่ยงของคุณเอง!",
diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json
index eca70c531a2..d6ffcb5f73d 100644
--- a/lib/l10n/th_TH.json
+++ b/lib/l10n/th_TH.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s ใส่ชื่อผู้ใช้ฐานข้อมูล",
"%s enter the database name." : "%s ใส่ชื่อฐานข้อมูล",
"%s you may not use dots in the database name" : "%s บางที่คุณไม่ควรใช้จุดในชื่อฐานข้อมูล",
- "MS SQL username and/or password not valid: %s" : "ชื่อผู้ใช้หรือรหัสผ่าน MS SQLไม่ถูกต้อง: %s",
- "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
- "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
- "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB มีผู้ใช้งาน '%s'@'localhost' อยู่แล้ว",
- "Drop this user from MySQL/MariaDB" : "ลดจำนวนผู้ใช้ลงจาก MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB มีผู้ใช้งาน '%s'@'%%' อยู่แล้ว",
- "Drop this user from MySQL/MariaDB." : "ลดจำนวนผู้ใช้ลงจาก MySQL/MariaDB",
"Oracle connection could not be established" : "ไม่สามารถสร้างการเชื่อมต่อกับ Oracle ",
"Oracle username and/or password not valid" : "Oracle ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
+ "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
+ "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
"Offending command was: \"%s\", name: %s, password: %s" : "คำสั่งที่กระทำผิดคือ: \"%s\", ชื่อผู้ใช้: %s, รหัสผ่าน: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "ระบบปฏิบัติการ Mac OS X ไม่ได้รับการสนับสนุนและ %s จะไม่ทำงานบนแพลตฟอร์มนี้ ใช้มันบนความเสี่ยงของคุณเอง!",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index 7f3a5096b0a..d26505b4a1e 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -66,17 +66,11 @@ OC.L10N.register(
"%s enter the database username." : "%s veritabanı kullanıcı adını girin.",
"%s enter the database name." : "%s veritabanı adını girin.",
"%s you may not use dots in the database name" : "%s veritabanı adında nokta kullanamayabilirsiniz",
- "MS SQL username and/or password not valid: %s" : "MS SQL kullanıcı adı ve/veya parolası geçersiz: %s",
- "You need to enter either an existing account or the administrator." : "Mevcut bit hesap ya da yönetici hesabını girmelisiniz.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB kullanıcı adı ve/veya parolası geçersiz",
- "DB Error: \"%s\"" : "VT Hatası: \"%s\"",
- "Offending command was: \"%s\"" : "Saldırgan komut: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB kullanıcı '%s'@'localhost' zaten mevcut.",
- "Drop this user from MySQL/MariaDB" : "Bu kullanıcıyı MySQL/MariaDB'dan at (drop)",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB kullanıcısı '%s'@'%%' zaten mevcut",
- "Drop this user from MySQL/MariaDB." : "Bu kullanıcıyı MySQL/MariaDB'dan at (drop).",
"Oracle connection could not be established" : "Oracle bağlantısı kurulamadı",
"Oracle username and/or password not valid" : "Oracle kullanıcı adı ve/veya parolası geçerli değil",
+ "DB Error: \"%s\"" : "VT Hatası: \"%s\"",
+ "Offending command was: \"%s\"" : "Saldırgan komut: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Mevcut bit hesap ya da yönetici hesabını girmelisiniz.",
"Offending command was: \"%s\", name: %s, password: %s" : "Hatalı komut: \"%s\", ad: %s, parola: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL kullanıcı adı ve/veya parolası geçerli değil",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X desteklenmiyor ve %s bu platformda düzgün çalışmayacak. Kendi riskinizle kullanın!",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index fe9556ffea5..4170115682d 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -64,17 +64,11 @@
"%s enter the database username." : "%s veritabanı kullanıcı adını girin.",
"%s enter the database name." : "%s veritabanı adını girin.",
"%s you may not use dots in the database name" : "%s veritabanı adında nokta kullanamayabilirsiniz",
- "MS SQL username and/or password not valid: %s" : "MS SQL kullanıcı adı ve/veya parolası geçersiz: %s",
- "You need to enter either an existing account or the administrator." : "Mevcut bit hesap ya da yönetici hesabını girmelisiniz.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB kullanıcı adı ve/veya parolası geçersiz",
- "DB Error: \"%s\"" : "VT Hatası: \"%s\"",
- "Offending command was: \"%s\"" : "Saldırgan komut: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB kullanıcı '%s'@'localhost' zaten mevcut.",
- "Drop this user from MySQL/MariaDB" : "Bu kullanıcıyı MySQL/MariaDB'dan at (drop)",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB kullanıcısı '%s'@'%%' zaten mevcut",
- "Drop this user from MySQL/MariaDB." : "Bu kullanıcıyı MySQL/MariaDB'dan at (drop).",
"Oracle connection could not be established" : "Oracle bağlantısı kurulamadı",
"Oracle username and/or password not valid" : "Oracle kullanıcı adı ve/veya parolası geçerli değil",
+ "DB Error: \"%s\"" : "VT Hatası: \"%s\"",
+ "Offending command was: \"%s\"" : "Saldırgan komut: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Mevcut bit hesap ya da yönetici hesabını girmelisiniz.",
"Offending command was: \"%s\", name: %s, password: %s" : "Hatalı komut: \"%s\", ad: %s, parola: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL kullanıcı adı ve/veya parolası geçerli değil",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X desteklenmiyor ve %s bu platformda düzgün çalışmayacak. Kendi riskinizle kullanın!",
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 8ebc66be6dd..7c90934c71f 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -60,17 +60,11 @@ OC.L10N.register(
"%s enter the database username." : "%s введіть ім'я користувача бази даних.",
"%s enter the database name." : "%s введіть назву бази даних.",
"%s you may not use dots in the database name" : "%s не можна використовувати крапки в назві бази даних",
- "MS SQL username and/or password not valid: %s" : "MS SQL ім'я користувача та/або пароль не дійсні: %s",
- "You need to enter either an existing account or the administrator." : "Вам потрібно ввести або існуючий обліковий запис або administrator.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB ім'я користувача та/або пароль не дійсні",
- "DB Error: \"%s\"" : "Помилка БД: \"%s\"",
- "Offending command was: \"%s\"" : "Команда, що викликала проблему: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Користувач MySQL/MariaDB '%s'@'localhost' вже існує.",
- "Drop this user from MySQL/MariaDB" : "Видалити цього користувача з MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Користувач MySQL/MariaDB '%s'@'%%' вже існує",
- "Drop this user from MySQL/MariaDB." : "Видалити цього користувача з MySQL/MariaDB.",
"Oracle connection could not be established" : "Не можемо з'єднатися з Oracle ",
"Oracle username and/or password not valid" : "Oracle ім'я користувача та/або пароль не дійсні",
+ "DB Error: \"%s\"" : "Помилка БД: \"%s\"",
+ "Offending command was: \"%s\"" : "Команда, що викликала проблему: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Вам потрібно ввести або існуючий обліковий запис або administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Команда, що викликала проблему: \"%s\", ім'я: %s, пароль: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL ім'я користувача та/або пароль не дійсні",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не підтримується і %s не буде коректно працювати на цій платформі. Випробовуєте на свій риск!",
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index a9f29cbfce2..f0ca3a30641 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -58,17 +58,11 @@
"%s enter the database username." : "%s введіть ім'я користувача бази даних.",
"%s enter the database name." : "%s введіть назву бази даних.",
"%s you may not use dots in the database name" : "%s не можна використовувати крапки в назві бази даних",
- "MS SQL username and/or password not valid: %s" : "MS SQL ім'я користувача та/або пароль не дійсні: %s",
- "You need to enter either an existing account or the administrator." : "Вам потрібно ввести або існуючий обліковий запис або administrator.",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB ім'я користувача та/або пароль не дійсні",
- "DB Error: \"%s\"" : "Помилка БД: \"%s\"",
- "Offending command was: \"%s\"" : "Команда, що викликала проблему: \"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "Користувач MySQL/MariaDB '%s'@'localhost' вже існує.",
- "Drop this user from MySQL/MariaDB" : "Видалити цього користувача з MySQL/MariaDB",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "Користувач MySQL/MariaDB '%s'@'%%' вже існує",
- "Drop this user from MySQL/MariaDB." : "Видалити цього користувача з MySQL/MariaDB.",
"Oracle connection could not be established" : "Не можемо з'єднатися з Oracle ",
"Oracle username and/or password not valid" : "Oracle ім'я користувача та/або пароль не дійсні",
+ "DB Error: \"%s\"" : "Помилка БД: \"%s\"",
+ "Offending command was: \"%s\"" : "Команда, що викликала проблему: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Вам потрібно ввести або існуючий обліковий запис або administrator.",
"Offending command was: \"%s\", name: %s, password: %s" : "Команда, що викликала проблему: \"%s\", ім'я: %s, пароль: %s",
"PostgreSQL username and/or password not valid" : "PostgreSQL ім'я користувача та/або пароль не дійсні",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не підтримується і %s не буде коректно працювати на цій платформі. Випробовуєте на свій риск!",
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
index 2046655f20d..9ec40a93aab 100644
--- a/lib/l10n/zh_CN.js
+++ b/lib/l10n/zh_CN.js
@@ -39,17 +39,11 @@ OC.L10N.register(
"%s enter the database username." : "%s 输入数据库用户名。",
"%s enter the database name." : "%s 输入数据库名称。",
"%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。",
- "MS SQL username and/or password not valid: %s" : "MS SQL 用户名和/或密码无效:%s",
- "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB 数据库用户名和/或密码无效",
- "DB Error: \"%s\"" : "数据库错误:\"%s\"",
- "Offending command was: \"%s\"" : "冲突命令为:\"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB 用户 '%s'@'localhost' 已存在。",
- "Drop this user from MySQL/MariaDB" : "建议从 MySQL/MariaDB 数据库中删除此用户",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB 用户 '%s'@'%%' 已存在",
- "Drop this user from MySQL/MariaDB." : "建议从 MySQL/MariaDB 数据库中删除此用户。",
"Oracle connection could not be established" : "不能建立甲骨文连接",
"Oracle username and/or password not valid" : "Oracle 数据库用户名和/或密码无效",
+ "DB Error: \"%s\"" : "数据库错误:\"%s\"",
+ "Offending command was: \"%s\"" : "冲突命令为:\"%s\"",
+ "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。",
"Offending command was: \"%s\", name: %s, password: %s" : "冲突命令为:\"%s\",名称:%s,密码:%s",
"PostgreSQL username and/or password not valid" : "PostgreSQL 数据库用户名和/或密码无效",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X 不被支持并且 %s 在这个平台上无法正常工作。请自行承担风险!",
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
index e96f07d198c..1d9fbf2ae3c 100644
--- a/lib/l10n/zh_CN.json
+++ b/lib/l10n/zh_CN.json
@@ -37,17 +37,11 @@
"%s enter the database username." : "%s 输入数据库用户名。",
"%s enter the database name." : "%s 输入数据库名称。",
"%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。",
- "MS SQL username and/or password not valid: %s" : "MS SQL 用户名和/或密码无效:%s",
- "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB 数据库用户名和/或密码无效",
- "DB Error: \"%s\"" : "数据库错误:\"%s\"",
- "Offending command was: \"%s\"" : "冲突命令为:\"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB 用户 '%s'@'localhost' 已存在。",
- "Drop this user from MySQL/MariaDB" : "建议从 MySQL/MariaDB 数据库中删除此用户",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB 用户 '%s'@'%%' 已存在",
- "Drop this user from MySQL/MariaDB." : "建议从 MySQL/MariaDB 数据库中删除此用户。",
"Oracle connection could not be established" : "不能建立甲骨文连接",
"Oracle username and/or password not valid" : "Oracle 数据库用户名和/或密码无效",
+ "DB Error: \"%s\"" : "数据库错误:\"%s\"",
+ "Offending command was: \"%s\"" : "冲突命令为:\"%s\"",
+ "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。",
"Offending command was: \"%s\", name: %s, password: %s" : "冲突命令为:\"%s\",名称:%s,密码:%s",
"PostgreSQL username and/or password not valid" : "PostgreSQL 数据库用户名和/或密码无效",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X 不被支持并且 %s 在这个平台上无法正常工作。请自行承担风险!",
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index 1458f4637b8..d9a7dd965d6 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -44,17 +44,11 @@ OC.L10N.register(
"%s enter the database username." : "%s 輸入資料庫使用者名稱。",
"%s enter the database name." : "%s 輸入資料庫名稱。",
"%s you may not use dots in the database name" : "%s 資料庫名稱不能包含小數點",
- "MS SQL username and/or password not valid: %s" : "MS SQL 使用者和/或密碼無效:%s",
- "You need to enter either an existing account or the administrator." : "您必須輸入一個現有的帳號或管理員帳號。",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB 使用者或密碼不正確",
- "DB Error: \"%s\"" : "資料庫錯誤:\"%s\"",
- "Offending command was: \"%s\"" : "有問題的指令是:\"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB 使用者 '%s'@'localhost' 已經存在",
- "Drop this user from MySQL/MariaDB" : "自 MySQL/MariaDB 刪除這個使用者",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB 使用者 '%s'@'%%' 已經存在",
- "Drop this user from MySQL/MariaDB." : "自 MySQL/MariaDB 刪除這個使用者",
"Oracle connection could not be established" : "無法建立 Oracle 資料庫連線",
"Oracle username and/or password not valid" : "Oracle 用戶名和/或密碼無效",
+ "DB Error: \"%s\"" : "資料庫錯誤:\"%s\"",
+ "Offending command was: \"%s\"" : "有問題的指令是:\"%s\"",
+ "You need to enter either an existing account or the administrator." : "您必須輸入一個現有的帳號或管理員帳號。",
"Offending command was: \"%s\", name: %s, password: %s" : "有問題的指令是:\"%s\" ,使用者:\"%s\",密碼:\"%s\"",
"PostgreSQL username and/or password not valid" : "PostgreSQL 用戶名和/或密碼無效",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "不支援 Mac OS X 而且 %s 在這個平台上面無法正常運作,請自行衡量風險!",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index ce93965013f..3544bde0b1e 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -42,17 +42,11 @@
"%s enter the database username." : "%s 輸入資料庫使用者名稱。",
"%s enter the database name." : "%s 輸入資料庫名稱。",
"%s you may not use dots in the database name" : "%s 資料庫名稱不能包含小數點",
- "MS SQL username and/or password not valid: %s" : "MS SQL 使用者和/或密碼無效:%s",
- "You need to enter either an existing account or the administrator." : "您必須輸入一個現有的帳號或管理員帳號。",
- "MySQL/MariaDB username and/or password not valid" : "MySQL/MariaDB 使用者或密碼不正確",
- "DB Error: \"%s\"" : "資料庫錯誤:\"%s\"",
- "Offending command was: \"%s\"" : "有問題的指令是:\"%s\"",
- "MySQL/MariaDB user '%s'@'localhost' exists already." : "MySQL/MariaDB 使用者 '%s'@'localhost' 已經存在",
- "Drop this user from MySQL/MariaDB" : "自 MySQL/MariaDB 刪除這個使用者",
- "MySQL/MariaDB user '%s'@'%%' already exists" : "MySQL/MariaDB 使用者 '%s'@'%%' 已經存在",
- "Drop this user from MySQL/MariaDB." : "自 MySQL/MariaDB 刪除這個使用者",
"Oracle connection could not be established" : "無法建立 Oracle 資料庫連線",
"Oracle username and/or password not valid" : "Oracle 用戶名和/或密碼無效",
+ "DB Error: \"%s\"" : "資料庫錯誤:\"%s\"",
+ "Offending command was: \"%s\"" : "有問題的指令是:\"%s\"",
+ "You need to enter either an existing account or the administrator." : "您必須輸入一個現有的帳號或管理員帳號。",
"Offending command was: \"%s\", name: %s, password: %s" : "有問題的指令是:\"%s\" ,使用者:\"%s\",密碼:\"%s\"",
"PostgreSQL username and/or password not valid" : "PostgreSQL 用戶名和/或密碼無效",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "不支援 Mac OS X 而且 %s 在這個平台上面無法正常運作,請自行衡量風險!",
diff --git a/lib/private/api.php b/lib/private/api.php
index 8e483b7efe9..fb2110471b2 100644
--- a/lib/private/api.php
+++ b/lib/private/api.php
@@ -1,4 +1,7 @@
<?php
+use OCP\API;
+use OCP\AppFramework\Http;
+
/**
* @author Bart Visscher <bartv@thisnet.nl>
* @author Bernhard Posselt <dev@bernhard-posselt.com>
@@ -82,7 +85,7 @@ class OC_API {
* @param array $requirements
*/
public static function register($method, $url, $action, $app,
- $authLevel = \OCP\API::USER_AUTH,
+ $authLevel = API::USER_AUTH,
$defaults = array(),
$requirements = array()) {
$name = strtolower($method).$url;
@@ -123,7 +126,7 @@ class OC_API {
if(!self::isAuthorised($action)) {
$responses[] = array(
'app' => $action['app'],
- 'response' => new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED, 'Unauthorised'),
+ 'response' => new OC_OCS_Result(null, API::RESPOND_UNAUTHORISED, 'Unauthorised'),
'shipped' => OC_App::isShipped($action['app']),
);
continue;
@@ -131,7 +134,7 @@ class OC_API {
if(!is_callable($action['action'])) {
$responses[] = array(
'app' => $action['app'],
- 'response' => new OC_OCS_Result(null, \OCP\API::RESPOND_NOT_FOUND, 'Api method not found'),
+ 'response' => new OC_OCS_Result(null, API::RESPOND_NOT_FOUND, 'Api method not found'),
'shipped' => OC_App::isShipped($action['app']),
);
continue;
@@ -252,15 +255,15 @@ class OC_API {
private static function isAuthorised($action) {
$level = $action['authlevel'];
switch($level) {
- case \OCP\API::GUEST_AUTH:
+ case API::GUEST_AUTH:
// Anyone can access
return true;
break;
- case \OCP\API::USER_AUTH:
+ case API::USER_AUTH:
// User required
return self::loginUser();
break;
- case \OCP\API::SUBADMIN_AUTH:
+ case API::SUBADMIN_AUTH:
// Check for subadmin
$user = self::loginUser();
if(!$user) {
@@ -275,7 +278,7 @@ class OC_API {
}
}
break;
- case \OCP\API::ADMIN_AUTH:
+ case API::ADMIN_AUTH:
// Check for admin
$user = self::loginUser();
if(!$user) {
@@ -342,28 +345,25 @@ class OC_API {
*/
public static function respond($result, $format='xml') {
// Send 401 headers if unauthorised
- if($result->getStatusCode() === \OCP\API::RESPOND_UNAUTHORISED) {
+ if($result->getStatusCode() === API::RESPOND_UNAUTHORISED) {
header('WWW-Authenticate: Basic realm="Authorisation Required"');
header('HTTP/1.0 401 Unauthorized');
}
- $response = array(
- 'ocs' => array(
- 'meta' => $result->getMeta(),
- 'data' => $result->getData(),
- ),
- );
- if ($format == 'json') {
- OC_JSON::encodedPrint($response);
- } else if ($format == 'xml') {
- header('Content-type: text/xml; charset=UTF-8');
- $writer = new XMLWriter();
- $writer->openMemory();
- $writer->setIndent( true );
- $writer->startDocument();
- self::toXML($response, $writer);
- $writer->endDocument();
- echo $writer->outputMemory(true);
+
+ foreach($result->getHeaders() as $name => $value) {
+ header($name . ': ' . $value);
}
+
+ if (self::isV2()) {
+ $statusCode = self::mapStatusCodes($result->getStatusCode());
+ if (!is_null($statusCode)) {
+ OC_Response::setStatus($statusCode);
+ }
+ }
+
+ self::setContentType($format);
+ $body = self::renderResult($result, $format);
+ echo $body;
}
/**
@@ -400,8 +400,8 @@ class OC_API {
/**
* Based on the requested format the response content type is set
*/
- public static function setContentType() {
- $format = self::requestedFormat();
+ public static function setContentType($format = null) {
+ $format = is_null($format) ? self::requestedFormat() : $format;
if ($format === 'xml') {
header('Content-type: text/xml; charset=UTF-8');
return;
@@ -415,5 +415,64 @@ class OC_API {
header('Content-Type: application/octet-stream; charset=utf-8');
}
+ /**
+ * @return boolean
+ */
+ private static function isV2() {
+ $request = \OC::$server->getRequest();
+ $script = $request->getScriptName();
+
+ return $script === '/ocs/v2.php';
+ }
+
+ /**
+ * @param integer $sc
+ * @return int
+ */
+ public static function mapStatusCodes($sc) {
+ switch ($sc) {
+ case API::RESPOND_NOT_FOUND:
+ return Http::STATUS_NOT_FOUND;
+ case API::RESPOND_SERVER_ERROR:
+ return Http::STATUS_INTERNAL_SERVER_ERROR;
+ case API::RESPOND_UNKNOWN_ERROR:
+ return Http::STATUS_INTERNAL_SERVER_ERROR;
+ case API::RESPOND_UNAUTHORISED:
+ // already handled for v1
+ return null;
+ case 100:
+ return Http::STATUS_OK;
+ }
+ // any 2xx, 4xx and 5xx will be used as is
+ if ($sc >= 200 && $sc < 600) {
+ return $sc;
+ }
+
+ return Http::STATUS_BAD_REQUEST;
+ }
+ /**
+ * @param OC_OCS_Result $result
+ * @param string $format
+ * @return string
+ */
+ public static function renderResult($result, $format) {
+ $response = array(
+ 'ocs' => array(
+ 'meta' => $result->getMeta(),
+ 'data' => $result->getData(),
+ ),
+ );
+ if ($format == 'json') {
+ return OC_JSON::encode($response);
+ }
+
+ $writer = new XMLWriter();
+ $writer->openMemory();
+ $writer->setIndent(true);
+ $writer->startDocument();
+ self::toXML($response, $writer);
+ $writer->endDocument();
+ return $writer->outputMemory(true);
+ }
}
diff --git a/lib/private/app.php b/lib/private/app.php
index 6c6f79dfa9d..e51fe73cb19 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -74,6 +74,16 @@ class OC_App {
}
/**
+ * Check if an app is loaded
+ *
+ * @param string $app
+ * @return bool
+ */
+ public static function isAppLoaded($app) {
+ return in_array($app, self::$loadedApps, true);
+ }
+
+ /**
* loads all apps
*
* @param array $types
@@ -421,6 +431,7 @@ class OC_App {
*/
public static function getSettingsNavigation() {
$l = \OC::$server->getL10N('lib');
+ $defaults = new OC_Defaults();
$settings = array();
// by default, settings only contain the help menu
@@ -431,7 +442,7 @@ class OC_App {
array(
"id" => "help",
"order" => 1000,
- "href" => OC_Helper::linkToRoute("settings_help"),
+ "href" => $defaults->getKnowledgeBaseUrl(),
"name" => $l->t("Help"),
"icon" => OC_Helper::imagePath("settings", "help.svg")
)
diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php
index c7ce6545972..c66b792064d 100644
--- a/lib/private/appframework/dependencyinjection/dicontainer.php
+++ b/lib/private/appframework/dependencyinjection/dicontainer.php
@@ -96,6 +96,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $this->getServer()->getMemCacheFactory();
});
+ $this->registerService('OC\\CapabilitiesManager', function($c) {
+ return $this->getServer()->getCapabilitiesManager();
+ });
+
$this->registerService('OCP\\IConfig', function($c) {
return $this->getServer()->getConfig();
});
@@ -212,6 +216,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $this->getServer()->getUserSession();
});
+ $this->registerService('OCP\\ISession', function($c) {
+ return $this->getServer()->getSession();
+ });
+
$this->registerService('ServerContainer', function ($c) {
return $this->getServer();
});
@@ -386,5 +394,15 @@ class DIContainer extends SimpleContainer implements IAppContainer {
\OCP\Util::writeLog($this->getAppName(), $message, $level);
}
+ /**
+ * Register a capability
+ *
+ * @param string $serviceName e.g. 'OCA\Files\Capabilities'
+ */
+ public function registerCapability($serviceName) {
+ $this->query('OC\CapabilitiesManager')->registerCapability(function() use ($serviceName) {
+ return $this->query($serviceName);
+ });
+ }
}
diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php
index baf2f0c4745..43f01dfde3f 100644
--- a/lib/private/appframework/http/request.php
+++ b/lib/private/appframework/http/request.php
@@ -416,12 +416,10 @@ class Request implements \ArrayAccess, \Countable, IRequest {
}
// Check if the token is valid
- if($token !== $this->items['requesttoken']) {
- // Not valid
- return false;
- } else {
- // Valid token
+ if(\OCP\Security\StringUtils::equals($token, $this->items['requesttoken'])) {
return true;
+ } else {
+ return false;
}
}
diff --git a/lib/private/capabilitiesmanager.php b/lib/private/capabilitiesmanager.php
new file mode 100644
index 00000000000..74154f2c631
--- /dev/null
+++ b/lib/private/capabilitiesmanager.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC;
+
+
+use OCP\Capabilities\ICapability;
+
+class CapabilitiesManager {
+
+ /**
+ * @var \Closure[]
+ */
+ private $capabilities = array();
+
+ /**
+ * Get an array of al the capabilities that are registered at this manager
+ *
+ * @throws \InvalidArgumentException
+ * @return array
+ */
+ public function getCapabilities() {
+ $capabilities = [];
+ foreach($this->capabilities as $capability) {
+ $c = $capability();
+ if ($c instanceof ICapability) {
+ $capabilities = array_replace_recursive($capabilities, $c->getCapabilities());
+ } else {
+ throw new \InvalidArgumentException('The given Capability (' . get_class($c) . ') does not implement the ICapability interface');
+ }
+ }
+
+ return $capabilities;
+ }
+
+ /**
+ * In order to improve lazy loading a closure can be registered which will be called in case
+ * capabilities are actually requested
+ *
+ * $callable has to return an instance of OCP\Capabilities\ICapability
+ *
+ * @param \Closure $callable
+ */
+ public function registerCapability(\Closure $callable) {
+ array_push($this->capabilities, $callable);
+ }
+}
diff --git a/lib/private/connector/sabre/exceptionloggerplugin.php b/lib/private/connector/sabre/exceptionloggerplugin.php
index 0b89ae4aef6..741ba4d3e05 100644
--- a/lib/private/connector/sabre/exceptionloggerplugin.php
+++ b/lib/private/connector/sabre/exceptionloggerplugin.php
@@ -95,6 +95,7 @@ class ExceptionLoggerPlugin extends \Sabre\DAV\ServerPlugin {
$exception = [
'Message' => $message,
+ 'Exception' => $exceptionClass,
'Code' => $ex->getCode(),
'Trace' => $ex->getTraceAsString(),
'File' => $ex->getFile(),
diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php
index 18bd3b8d91d..fa2f5ce18d7 100644
--- a/lib/private/connector/sabre/file.php
+++ b/lib/private/connector/sabre/file.php
@@ -208,10 +208,9 @@ class File extends Node implements IFile {
}
// since we skipped the view we need to scan and emit the hooks ourselves
- $partStorage->getScanner()->scanFile($internalPath);
+ $this->fileView->getUpdater()->update($this->path);
if ($view) {
- $this->fileView->getUpdater()->propagate($hookPath);
if (!$exists) {
\OC_Hook::emit(\OC\Files\Filesystem::CLASSNAME, \OC\Files\Filesystem::signal_post_create, array(
\OC\Files\Filesystem::signal_param_path => $hookPath
diff --git a/lib/private/db.php b/lib/private/db.php
index 1e93eb1892e..a4a7b7d17d4 100644
--- a/lib/private/db.php
+++ b/lib/private/db.php
@@ -121,7 +121,7 @@ class OC_DB {
if (is_string($stmt)) {
// convert to an array with 'sql'
if (stripos($stmt, 'LIMIT') !== false) { //OFFSET requires LIMIT, so we only need to check for LIMIT
- // TODO try to convert LIMIT OFFSET notation to parameters, see fixLimitClauseForMSSQL
+ // TODO try to convert LIMIT OFFSET notation to parameters
$message = 'LIMIT and OFFSET are forbidden for portability reasons,'
. ' pass an array with \'limit\' and \'offset\' instead';
throw new \OC\DatabaseException($message);
diff --git a/lib/private/db/connectionfactory.php b/lib/private/db/connectionfactory.php
index 83a59cddd7f..b6c3396e147 100644
--- a/lib/private/db/connectionfactory.php
+++ b/lib/private/db/connectionfactory.php
@@ -39,12 +39,6 @@ class ConnectionFactory {
* \Doctrine\DBAL\DriverManager::getConnection().
*/
protected $defaultConnectionParams = array(
- 'mssql' => array(
- 'adapter' => '\OC\DB\AdapterSQLSrv',
- 'charset' => 'UTF8',
- 'driver' => 'pdo_sqlsrv',
- 'wrapperClass' => 'OC\DB\Connection',
- ),
'mysql' => array(
'adapter' => '\OC\DB\AdapterMySQL',
'charset' => 'UTF8',
diff --git a/lib/private/db/mdb2schemamanager.php b/lib/private/db/mdb2schemamanager.php
index 6b9888d361b..aef485ed686 100644
--- a/lib/private/db/mdb2schemamanager.php
+++ b/lib/private/db/mdb2schemamanager.php
@@ -32,7 +32,6 @@ use Doctrine\DBAL\Platforms\MySqlPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
-use Doctrine\DBAL\Platforms\SQLServerPlatform;
class MDB2SchemaManager {
/**
@@ -85,8 +84,6 @@ class MDB2SchemaManager {
return new OracleMigrator($this->conn, $random, $config);
} else if ($platform instanceof MySqlPlatform) {
return new MySQLMigrator($this->conn, $random, $config);
- } else if ($platform instanceof SQLServerPlatform) {
- return new MsSqlMigrator($this->conn, $random, $config);
} else if ($platform instanceof PostgreSqlPlatform) {
return new Migrator($this->conn, $random, $config);
} else {
diff --git a/lib/private/db/querybuilder/querybuilder.php b/lib/private/db/querybuilder/querybuilder.php
index 1a1408876f1..1d97faf77cc 100644
--- a/lib/private/db/querybuilder/querybuilder.php
+++ b/lib/private/db/querybuilder/querybuilder.php
@@ -37,6 +37,9 @@ class QueryBuilder implements IQueryBuilder {
/** @var QuoteHelper */
private $helper;
+ /** @var bool */
+ private $automaticTablePrefix = true;
+
/**
* Initializes a new QueryBuilder.
*
@@ -49,6 +52,17 @@ class QueryBuilder implements IQueryBuilder {
}
/**
+ * Enable/disable automatic prefixing of table names with the oc_ prefix
+ *
+ * @param bool $enabled If set to true table names will be prefixed with the
+ * owncloud database prefix automatically.
+ * @since 8.2.0
+ */
+ public function automaticTablePrefix($enabled) {
+ $this->automaticTablePrefix = (bool) $enabled;
+ }
+
+ /**
* Gets an ExpressionBuilder used for object-oriented construction of query expressions.
* This producer method is intended for convenient inline usage. Example:
*
@@ -329,7 +343,7 @@ class QueryBuilder implements IQueryBuilder {
*/
public function delete($delete = null, $alias = null) {
$this->queryBuilder->delete(
- $this->helper->quoteColumnName($delete),
+ $this->getTableName($delete),
$alias
);
@@ -354,7 +368,7 @@ class QueryBuilder implements IQueryBuilder {
*/
public function update($update = null, $alias = null) {
$this->queryBuilder->update(
- $this->helper->quoteColumnName($update),
+ $this->getTableName($update),
$alias
);
@@ -382,7 +396,7 @@ class QueryBuilder implements IQueryBuilder {
*/
public function insert($insert = null) {
$this->queryBuilder->insert(
- $this->helper->quoteColumnName($insert)
+ $this->getTableName($insert)
);
return $this;
@@ -405,7 +419,7 @@ class QueryBuilder implements IQueryBuilder {
*/
public function from($from, $alias = null) {
$this->queryBuilder->from(
- $this->helper->quoteColumnName($from),
+ $this->getTableName($from),
$alias
);
@@ -432,7 +446,7 @@ class QueryBuilder implements IQueryBuilder {
public function join($fromAlias, $join, $alias, $condition = null) {
$this->queryBuilder->join(
$fromAlias,
- $this->helper->quoteColumnName($join),
+ $this->getTableName($join),
$alias,
$condition
);
@@ -460,7 +474,7 @@ class QueryBuilder implements IQueryBuilder {
public function innerJoin($fromAlias, $join, $alias, $condition = null) {
$this->queryBuilder->innerJoin(
$fromAlias,
- $this->helper->quoteColumnName($join),
+ $this->getTableName($join),
$alias,
$condition
);
@@ -488,7 +502,7 @@ class QueryBuilder implements IQueryBuilder {
public function leftJoin($fromAlias, $join, $alias, $condition = null) {
$this->queryBuilder->leftJoin(
$fromAlias,
- $this->helper->quoteColumnName($join),
+ $this->getTableName($join),
$alias,
$condition
);
@@ -516,7 +530,7 @@ class QueryBuilder implements IQueryBuilder {
public function rightJoin($fromAlias, $join, $alias, $condition = null) {
$this->queryBuilder->rightJoin(
$fromAlias,
- $this->helper->quoteColumnName($join),
+ $this->getTableName($join),
$alias,
$condition
);
@@ -984,4 +998,16 @@ class QueryBuilder implements IQueryBuilder {
public function createFunction($call) {
return new QueryFunction($call);
}
+
+ /**
+ * @param string $table
+ * @return string
+ */
+ private function getTableName($table) {
+ if ($this->automaticTablePrefix === false || strpos($table, '*PREFIX*') === 0) {
+ return $this->helper->quoteColumnName($table);
+ }
+
+ return $this->helper->quoteColumnName('*PREFIX*' . $table);
+ }
}
diff --git a/lib/private/defaults.php b/lib/private/defaults.php
index 16f45943f54..b86805357bd 100644
--- a/lib/private/defaults.php
+++ b/lib/private/defaults.php
@@ -46,9 +46,11 @@ class OC_Defaults {
private $defaultSlogan;
private $defaultLogoClaim;
private $defaultMailHeaderColor;
+ private $defaultKnowledgeBaseUrl;
function __construct() {
$this->l = \OC::$server->getL10N('lib');
+ $urlGenerator = \OC::$server->getURLGenerator();
$version = OC_Util::getVersion();
$this->defaultEntity = 'ownCloud'; /* e.g. company name, used for footers and copyright notices */
@@ -64,6 +66,7 @@ class OC_Defaults {
$this->defaultSlogan = $this->l->t('web services under your control');
$this->defaultLogoClaim = '';
$this->defaultMailHeaderColor = '#1d2d44'; /* header color of mail notifications */
+ $this->defaultKnowledgeBaseUrl = $urlGenerator->linkToRoute('settings_help');
$themePath = OC::$SERVERROOT . '/themes/' . OC_Util::getTheme() . '/defaults.php';
if (file_exists($themePath)) {
@@ -79,6 +82,7 @@ class OC_Defaults {
/**
* @param string $method
+ * @return bool
*/
private function themeExist($method) {
if (isset($this->theme) && method_exists($this->theme, $method)) {
@@ -280,4 +284,19 @@ class OC_Defaults {
}
}
+ /**
+ * get knowledge base URL, will be used for the "Help"-Link in the top
+ * right menu
+ *
+ * @return string
+ */
+ public function getKnowledgeBaseUrl() {
+ if ($this->themeExist('getKnowledgeBaseUrl')) {
+ return $this->theme->getKnowledgeBaseUrl();
+ } else {
+ return $this->defaultKnowledgeBaseUrl;
+ }
+
+ }
+
}
diff --git a/lib/private/files/cache/storage.php b/lib/private/files/cache/storage.php
index ebef245f399..338d8308281 100644
--- a/lib/private/files/cache/storage.php
+++ b/lib/private/files/cache/storage.php
@@ -43,9 +43,10 @@ class Storage {
/**
* @param \OC\Files\Storage\Storage|string $storage
+ * @param bool $isAvailable
* @throws \RuntimeException
*/
- public function __construct($storage) {
+ public function __construct($storage, $isAvailable = true) {
if ($storage instanceof \OC\Files\Storage\Storage) {
$this->storageId = $storage->getId();
} else {
@@ -53,17 +54,14 @@ class Storage {
}
$this->storageId = self::adjustStorageId($this->storageId);
- $sql = 'SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?';
- $result = \OC_DB::executeAudited($sql, array($this->storageId));
- if ($row = $result->fetchRow()) {
+ if ($row = self::getStorageById($this->storageId)) {
$this->numericId = $row['numeric_id'];
} else {
$connection = \OC_DB::getConnection();
- if ($connection->insertIfNotExist('*PREFIX*storages', ['id' => $this->storageId])) {
+ if ($connection->insertIfNotExist('*PREFIX*storages', ['id' => $this->storageId, 'available' => $isAvailable])) {
$this->numericId = \OC_DB::insertid('*PREFIX*storages');
} else {
- $result = \OC_DB::executeAudited($sql, array($this->storageId));
- if ($row = $result->fetchRow()) {
+ if ($row = self::getStorageById($this->storageId)) {
$this->numericId = $row['numeric_id'];
} else {
throw new \RuntimeException('Storage could neither be inserted nor be selected from the database');
@@ -73,6 +71,16 @@ class Storage {
}
/**
+ * @param string $storageId
+ * @return array|null
+ */
+ public static function getStorageById($storageId) {
+ $sql = 'SELECT * FROM `*PREFIX*storages` WHERE `id` = ?';
+ $result = \OC_DB::executeAudited($sql, array($storageId));
+ return $result->fetchRow();
+ }
+
+ /**
* Adjusts the storage id to use md5 if too long
* @param string $storageId storage id
* @return string unchanged $storageId if its length is less than 64 characters,
@@ -120,9 +128,7 @@ class Storage {
public static function getNumericStorageId($storageId) {
$storageId = self::adjustStorageId($storageId);
- $sql = 'SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?';
- $result = \OC_DB::executeAudited($sql, array($storageId));
- if ($row = $result->fetchRow()) {
+ if ($row = self::getStorageById($storageId)) {
return $row['numeric_id'];
} else {
return null;
@@ -130,6 +136,28 @@ class Storage {
}
/**
+ * @return array|null [ available, last_checked ]
+ */
+ public function getAvailability() {
+ if ($row = self::getStorageById($this->storageId)) {
+ return [
+ 'available' => $row['available'],
+ 'last_checked' => $row['last_checked']
+ ];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @param bool $isAvailable
+ */
+ public function setAvailability($isAvailable) {
+ $sql = 'UPDATE `*PREFIX*storages` SET `available` = ?, `last_checked` = ? WHERE `id` = ?';
+ \OC_DB::executeAudited($sql, array($isAvailable, time(), $this->storageId));
+ }
+
+ /**
* Check if a string storage id is known
*
* @param string $storageId
diff --git a/lib/private/files/mount/mountpoint.php b/lib/private/files/mount/mountpoint.php
index 2871bbd9083..5e4949aa9dd 100644
--- a/lib/private/files/mount/mountpoint.php
+++ b/lib/private/files/mount/mountpoint.php
@@ -29,6 +29,7 @@ namespace OC\Files\Mount;
use \OC\Files\Filesystem;
use OC\Files\Storage\StorageFactory;
use OC\Files\Storage\Storage;
+use OC\Files\Storage\Wrapper\Wrapper;
use OCP\Files\Mount\IMountPoint;
class MountPoint implements IMountPoint {
@@ -92,7 +93,11 @@ class MountPoint implements IMountPoint {
$this->mountPoint = $mountpoint;
if ($storage instanceof Storage) {
$this->class = get_class($storage);
- $this->storage = $this->loader->wrap($this, $storage);
+ $this->storage = $storage;
+ // only wrap if not already wrapped
+ if (!($this->storage instanceof Wrapper)) {
+ $this->storage = $this->loader->wrap($this, $this->storage);
+ }
} else {
// Update old classes to new namespace
if (strpos($storage, 'OC_Filestorage_') !== false) {
diff --git a/lib/private/files/objectstore/objectstorestorage.php b/lib/private/files/objectstore/objectstorestorage.php
index 24398649727..a85553186ae 100644
--- a/lib/private/files/objectstore/objectstorestorage.php
+++ b/lib/private/files/objectstore/objectstorestorage.php
@@ -24,6 +24,7 @@
namespace OC\Files\ObjectStore;
+use Icewind\Streams\IteratorDirectory;
use OCP\Files\ObjectStore\IObjectStore;
class ObjectStoreStorage extends \OC\Files\Storage\Common {
@@ -216,9 +217,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
$files[] = $file['name'];
}
- \OC\Files\Stream\Dir::register('objectstore' . $path . '/', $files);
-
- return opendir('fakedir://objectstore' . $path . '/');
+ return IteratorDirectory::wrap($files);
} catch (\Exception $e) {
\OCP\Util::writeLog('objectstore', $e->getMessage(), \OCP\Util::ERROR);
return false;
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 847cb8492fe..a5ed5fd3996 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -338,7 +338,7 @@ abstract class Common implements Storage {
}
if (!isset($this->watcher)) {
$this->watcher = new Watcher($storage);
- $globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_ONCE);
+ $globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_NEVER);
$this->watcher->setPolicy((int)$this->getMountOption('filesystem_check_changes', $globalPolicy));
}
return $this->watcher;
@@ -404,6 +404,11 @@ abstract class Common implements Storage {
return implode('/', $output);
}
+ /**
+ * Test a storage for availability
+ *
+ * @return bool
+ */
public function test() {
if ($this->stat('')) {
return true;
@@ -650,4 +655,18 @@ abstract class Common implements Storage {
public function changeLock($path, $type, ILockingProvider $provider) {
$provider->changeLock('files/' . md5($this->getId() . '::' . trim($path, '/')), $type);
}
+
+ /**
+ * @return array [ available, last_checked ]
+ */
+ public function getAvailability() {
+ return $this->getStorageCache()->getAvailability();
+ }
+
+ /**
+ * @param bool $isAvailable
+ */
+ public function setAvailability($isAvailable) {
+ $this->getStorageCache()->setAvailability($isAvailable);
+ }
}
diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php
index 24cf3c29209..6e89dcccbcd 100644
--- a/lib/private/files/storage/dav.php
+++ b/lib/private/files/storage/dav.php
@@ -38,7 +38,7 @@ namespace OC\Files\Storage;
use Exception;
use OC\Files\Filesystem;
use OC\Files\Stream\Close;
-use OC\Files\Stream\Dir;
+use Icewind\Streams\IteratorDirectory;
use OC\MemCache\ArrayCache;
use OCP\Constants;
use OCP\Files;
@@ -211,8 +211,7 @@ class DAV extends Common {
$file = basename($file);
$content[] = $file;
}
- Dir::register($id, $content);
- return opendir('fakedir://' . $id);
+ return IteratorDirectory::wrap($content);
} catch (ClientHttpException $e) {
if ($e->getHttpStatus() === 404) {
$this->statCache->clear($path . '/');
diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php
index b7272b7d1f0..3676fe69131 100644
--- a/lib/private/files/storage/local.php
+++ b/lib/private/files/storage/local.php
@@ -35,7 +35,6 @@
*/
namespace OC\Files\Storage;
-
/**
* for local filestore, we only have to map the paths
*/
diff --git a/lib/private/files/storage/wrapper/availability.php b/lib/private/files/storage/wrapper/availability.php
new file mode 100644
index 00000000000..37319a8f7d1
--- /dev/null
+++ b/lib/private/files/storage/wrapper/availability.php
@@ -0,0 +1,462 @@
+<?php
+/**
+ * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Files\Storage\Wrapper;
+
+/**
+ * Availability checker for storages
+ *
+ * Throws a StorageNotAvailableException for storages with known failures
+ */
+class Availability extends Wrapper {
+ const RECHECK_TTL_SEC = 600; // 10 minutes
+
+ /**
+ * @return bool
+ */
+ private function updateAvailability() {
+ try {
+ $result = $this->test();
+ } catch (\Exception $e) {
+ $result = false;
+ }
+ $this->setAvailability($result);
+ return $result;
+ }
+
+ /**
+ * @return bool
+ */
+ private function isAvailable() {
+ $availability = $this->getAvailability();
+ if (!$availability['available']) {
+ // trigger a recheck if TTL reached
+ if ((time() - $availability['last_checked']) > self::RECHECK_TTL_SEC) {
+ return $this->updateAvailability();
+ }
+ }
+ return $availability['available'];
+ }
+
+ /**
+ * @throws \OCP\Files\StorageNotAvailableException
+ */
+ private function checkAvailability() {
+ if (!$this->isAvailable()) {
+ throw new \OCP\Files\StorageNotAvailableException();
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function mkdir($path) {
+ $this->checkAvailability();
+ try {
+ return parent::mkdir($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function rmdir($path) {
+ $this->checkAvailability();
+ try {
+ return parent::rmdir($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function opendir($path) {
+ $this->checkAvailability();
+ try {
+ return parent::opendir($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function is_dir($path) {
+ $this->checkAvailability();
+ try {
+ return parent::is_dir($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function is_file($path) {
+ $this->checkAvailability();
+ try {
+ return parent::is_file($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function stat($path) {
+ $this->checkAvailability();
+ try {
+ return parent::stat($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function filetype($path) {
+ $this->checkAvailability();
+ try {
+ return parent::filetype($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function filesize($path) {
+ $this->checkAvailability();
+ try {
+ return parent::filesize($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function isCreatable($path) {
+ $this->checkAvailability();
+ try {
+ return parent::isCreatable($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function isReadable($path) {
+ $this->checkAvailability();
+ try {
+ return parent::isReadable($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function isUpdatable($path) {
+ $this->checkAvailability();
+ try {
+ return parent::isUpdatable($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function isDeletable($path) {
+ $this->checkAvailability();
+ try {
+ return parent::isDeletable($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function isSharable($path) {
+ $this->checkAvailability();
+ try {
+ return parent::isSharable($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getPermissions($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getPermissions($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function file_exists($path) {
+ $this->checkAvailability();
+ try {
+ return parent::file_exists($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function filemtime($path) {
+ $this->checkAvailability();
+ try {
+ return parent::filemtime($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function file_get_contents($path) {
+ $this->checkAvailability();
+ try {
+ return parent::file_get_contents($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function file_put_contents($path, $data) {
+ $this->checkAvailability();
+ try {
+ return parent::file_put_contents($path, $data);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function unlink($path) {
+ $this->checkAvailability();
+ try {
+ return parent::unlink($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function rename($path1, $path2) {
+ $this->checkAvailability();
+ try {
+ return parent::rename($path1, $path2);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function copy($path1, $path2) {
+ $this->checkAvailability();
+ try {
+ return parent::copy($path1, $path2);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function fopen($path, $mode) {
+ $this->checkAvailability();
+ try {
+ return parent::fopen($path, $mode);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getMimeType($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getMimeType($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function hash($type, $path, $raw = false) {
+ $this->checkAvailability();
+ try {
+ return parent::hash($type, $path, $raw);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function free_space($path) {
+ $this->checkAvailability();
+ try {
+ return parent::free_space($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function search($query) {
+ $this->checkAvailability();
+ try {
+ return parent::search($query);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function touch($path, $mtime = null) {
+ $this->checkAvailability();
+ try {
+ return parent::touch($path, $mtime);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getLocalFile($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getLocalFile($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getLocalFolder($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getLocalFolder($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function hasUpdated($path, $time) {
+ $this->checkAvailability();
+ try {
+ return parent::hasUpdated($path, $time);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getOwner($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getOwner($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getETag($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getETag($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getDirectDownload($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getDirectDownload($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
+ $this->checkAvailability();
+ try {
+ return parent::copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function moveFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
+ $this->checkAvailability();
+ try {
+ return parent::moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+
+ /** {@inheritdoc} */
+ public function getMetaData($path) {
+ $this->checkAvailability();
+ try {
+ return parent::getMetaData($path);
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ $this->setAvailability(false);
+ throw $e;
+ }
+ }
+}
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 51aa13065c1..4ba9b21ddb4 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -127,12 +127,11 @@ class Encryption extends Wrapper {
$info = $this->getCache()->get($path);
if (isset($this->unencryptedSize[$fullPath])) {
$size = $this->unencryptedSize[$fullPath];
+ // update file cache
+ $info['encrypted'] = true;
+ $info['size'] = $size;
+ $this->getCache()->put($path, $info);
- if (isset($info['fileid'])) {
- $info['encrypted'] = true;
- $info['size'] = $size;
- $this->getCache()->put($path, $info);
- }
return $size;
}
diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php
index d1414880beb..b43dd4fe142 100644
--- a/lib/private/files/storage/wrapper/wrapper.php
+++ b/lib/private/files/storage/wrapper/wrapper.php
@@ -498,6 +498,24 @@ class Wrapper implements \OC\Files\Storage\Storage {
}
/**
+ * Get availability of the storage
+ *
+ * @return array [ available, last_checked ]
+ */
+ public function getAvailability() {
+ return $this->storage->getAvailability();
+ }
+
+ /**
+ * Set availability of the storage
+ *
+ * @param bool $isAvailable
+ */
+ public function setAvailability($isAvailable) {
+ $this->storage->setAvailability($isAvailable);
+ }
+
+ /**
* @param string $path the path of the target folder
* @param string $fileName the name of the file itself
* @return void
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index cb3c05d2bca..dc6e8aaa719 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -1354,7 +1354,7 @@ class View {
// if sharing was disabled for the user we remove the share permissions
if (\OCP\Util::isSharingDisabledForUser()) {
- $content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE;
+ $rootEntry['permissions'] = $rootEntry['permissions'] & ~\OCP\Constants::PERMISSION_SHARE;
}
$files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount);
@@ -1656,11 +1656,11 @@ class View {
}
// verify database - e.g. mysql only 3-byte chars
- if (preg_match('%^(?:
+ if (preg_match('%(?:
\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
-)*$%xs', $fileName)) {
+)%xs', $fileName)) {
throw new InvalidPathException($l10n->t('4-byte characters are not supported in file names'));
}
diff --git a/lib/private/installer.php b/lib/private/installer.php
index 37af8d0edcb..392dc1c0817 100644
--- a/lib/private/installer.php
+++ b/lib/private/installer.php
@@ -107,6 +107,10 @@ class OC_Installer{
}
$extractDir .= '/' . $info['id'];
+ if(!file_exists($extractDir)) {
+ OC_Helper::rmdirr($basedir);
+ throw new \Exception($l->t("Archive does not contain a directory named %s", $info['id']));
+ }
OC_Helper::copyr($extractDir, $basedir);
//remove temporary files
diff --git a/lib/private/ocs.php b/lib/private/ocs.php
index 6d166f8adb0..bb1aabf8f18 100644
--- a/lib/private/ocs.php
+++ b/lib/private/ocs.php
@@ -28,6 +28,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+use OCP\API;
/**
* Class to handle open collaboration services API requests
@@ -64,8 +65,7 @@ class OC_OCS {
}
}
if ($data === false) {
- echo self::generateXml('', 'fail', 400, 'Bad request. Please provide a valid '.$key);
- exit();
+ throw new \OC\OCS\Exception(new OC_OCS_Result(null, 400, 'Bad request. Please provide a valid '.$key));
} else {
// NOTE: Is the raw type necessary? It might be a little risky without sanitization
if ($type == 'raw') return $data;
@@ -78,23 +78,12 @@ class OC_OCS {
}
public static function notFound() {
- if($_SERVER['REQUEST_METHOD'] == 'GET') {
- $method='get';
- }elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
- $method='put';
- }elseif($_SERVER['REQUEST_METHOD'] == 'POST') {
- $method='post';
- }else{
- echo('internal server error: method not supported');
- exit();
- }
-
- $format = self::readData($method, 'format', 'text', '');
+ $format = OC_API::requestedFormat();
$txt='Invalid query, please check the syntax. API specifications are here:'
.' http://www.freedesktop.org/wiki/Specifications/open-collaboration-services. DEBUG OUTPUT:'."\n";
$txt.=OC_OCS::getDebugOutput();
- echo(OC_OCS::generateXml($format, 'failed', 999, $txt));
+ OC_API::respond(new OC_OCS_Result(null, API::RESPOND_UNKNOWN_ERROR, $txt), $format);
}
/**
@@ -110,130 +99,4 @@ class OC_OCS {
if(isset($_POST)) foreach($_POST as $key=>$value) $txt.='post parameter: '.$key.'->'.$value."\n";
return($txt);
}
-
-
- /**
- * generates the xml or json response for the API call from an multidimenional data array.
- * @param string $format
- * @param string $status
- * @param string $statuscode
- * @param string $message
- * @param array $data
- * @param string $tag
- * @param string $tagattribute
- * @param int $dimension
- * @param int|string $itemscount
- * @param int|string $itemsperpage
- * @return string xml/json
- */
- public static function generateXml($format, $status, $statuscode,
- $message, $data=array(), $tag='', $tagattribute='', $dimension=-1, $itemscount='', $itemsperpage='') {
- if($format=='json') {
- $json=array();
- $json['status']=$status;
- $json['statuscode']=$statuscode;
- $json['message']=$message;
- $json['totalitems']=$itemscount;
- $json['itemsperpage']=$itemsperpage;
- $json['data']=$data;
- return(json_encode($json));
- }else{
- $txt='';
- $writer = xmlwriter_open_memory();
- xmlwriter_set_indent( $writer, 2 );
- xmlwriter_start_document($writer );
- xmlwriter_start_element($writer, 'ocs');
- xmlwriter_start_element($writer, 'meta');
- xmlwriter_write_element($writer, 'status', $status);
- xmlwriter_write_element($writer, 'statuscode', $statuscode);
- xmlwriter_write_element($writer, 'message', $message);
- if($itemscount<>'') xmlwriter_write_element($writer, 'totalitems', $itemscount);
- if(!empty($itemsperpage)) xmlwriter_write_element($writer, 'itemsperpage', $itemsperpage);
- xmlwriter_end_element($writer);
- if($dimension=='0') {
- // 0 dimensions
- xmlwriter_write_element($writer, 'data', $data);
-
- }elseif($dimension=='1') {
- xmlwriter_start_element($writer, 'data');
- foreach($data as $key=>$entry) {
- xmlwriter_write_element($writer, $key, $entry);
- }
- xmlwriter_end_element($writer);
-
- }elseif($dimension=='2') {
- xmlwriter_start_element($writer, 'data');
- foreach($data as $entry) {
- xmlwriter_start_element($writer, $tag);
- if(!empty($tagattribute)) {
- xmlwriter_write_attribute($writer, 'details', $tagattribute);
- }
- foreach($entry as $key=>$value) {
- if(is_array($value)) {
- foreach($value as $k=>$v) {
- xmlwriter_write_element($writer, $k, $v);
- }
- } else {
- xmlwriter_write_element($writer, $key, $value);
- }
- }
- xmlwriter_end_element($writer);
- }
- xmlwriter_end_element($writer);
-
- }elseif($dimension=='3') {
- xmlwriter_start_element($writer, 'data');
- foreach($data as $entrykey=>$entry) {
- xmlwriter_start_element($writer, $tag);
- if(!empty($tagattribute)) {
- xmlwriter_write_attribute($writer, 'details', $tagattribute);
- }
- foreach($entry as $key=>$value) {
- if(is_array($value)) {
- xmlwriter_start_element($writer, $entrykey);
- foreach($value as $k=>$v) {
- xmlwriter_write_element($writer, $k, $v);
- }
- xmlwriter_end_element($writer);
- } else {
- xmlwriter_write_element($writer, $key, $value);
- }
- }
- xmlwriter_end_element($writer);
- }
- xmlwriter_end_element($writer);
- }elseif($dimension=='dynamic') {
- xmlwriter_start_element($writer, 'data');
- OC_OCS::toxml($writer, $data, 'comment');
- xmlwriter_end_element($writer);
- }
-
- xmlwriter_end_element($writer);
-
- xmlwriter_end_document( $writer );
- $txt.=xmlwriter_output_memory( $writer );
- unset($writer);
- return($txt);
- }
- }
-
- /**
- * @param resource $writer
- * @param array $data
- * @param string $node
- */
- public static function toXml($writer, $data, $node) {
- foreach($data as $key => $value) {
- if (is_numeric($key)) {
- $key = $node;
- }
- if (is_array($value)) {
- xmlwriter_start_element($writer, $key);
- OC_OCS::toxml($writer, $value, $node);
- xmlwriter_end_element($writer);
- }else{
- xmlwriter_write_element($writer, $key, $value);
- }
- }
- }
}
diff --git a/lib/private/ocs/cloud.php b/lib/private/ocs/cloud.php
index f662bde2858..8f4f1769e9c 100644
--- a/lib/private/ocs/cloud.php
+++ b/lib/private/ocs/cloud.php
@@ -3,6 +3,7 @@
* @author Bart Visscher <bartv@thisnet.nl>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin McCorkell <rmccorkell@karoshi.org.uk>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Tom Needham <tom@owncloud.com>
*
@@ -36,12 +37,8 @@ class OC_OCS_Cloud {
'edition' => OC_Util::getEditionString(),
);
- $result['capabilities'] = array(
- 'core' => array(
- 'pollinterval' => OC_Config::getValue('pollinterval', 60),
- ),
- );
-
+ $result['capabilities'] = \OC::$server->getCapabilitiesManager()->getCapabilities();
+
return new OC_OCS_Result($result);
}
diff --git a/lib/private/ocs/corecapabilities.php b/lib/private/ocs/corecapabilities.php
new file mode 100644
index 00000000000..6b620ab0a84
--- /dev/null
+++ b/lib/private/ocs/corecapabilities.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\OCS;
+
+use OCP\Capabilities\ICapability;
+use OCP\IConfig;
+
+/**
+ * Class Capabilities
+ *
+ * @package OC\OCS
+ */
+class CoreCapabilities implements ICapability {
+
+ /** @var IConfig */
+ private $config;
+
+ /**
+ * @param IConfig $config
+ */
+ public function __construct(IConfig $config) {
+ $this->config = $config;
+ }
+
+ /**
+ * Return this classes capabilities
+ *
+ * @return array
+ */
+ public function getCapabilities() {
+ return [
+ 'core' => [
+ 'pollinterval' => $this->config->getSystemValue('pollinterval', 60)
+ ]
+ ];
+ }
+}
diff --git a/lib/private/db/mssqlmigrator.php b/lib/private/ocs/exception.php
index bedb5bac6c4..93bee773771 100644
--- a/lib/private/db/mssqlmigrator.php
+++ b/lib/private/ocs/exception.php
@@ -1,6 +1,5 @@
<?php
/**
- * @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
@@ -20,18 +19,16 @@
*
*/
-namespace OC\DB;
+namespace OC\OCS;
-use Doctrine\DBAL\Schema\Schema;
+class Exception extends \Exception {
-class MsSqlMigrator extends Migrator {
+ public function __construct(\OC_OCS_Result $result) {
+ $this->result = $result;
+ }
- /**
- * @param \Doctrine\DBAL\Schema\Schema $targetSchema
- */
- public function migrate(Schema $targetSchema) {
- throw new MigrationException('',
- 'Database migration is required to continue operation. This feature is provided within the Enterprise Edition.');
+ public function getResult() {
+ return $this->result;
}
}
diff --git a/lib/private/ocs/result.php b/lib/private/ocs/result.php
index 1ee2982ac4a..c4b0fbf33f3 100644
--- a/lib/private/ocs/result.php
+++ b/lib/private/ocs/result.php
@@ -27,7 +27,23 @@
class OC_OCS_Result{
- protected $data, $message, $statusCode, $items, $perPage;
+ /** @var array */
+ protected $data;
+
+ /** @var null|string */
+ protected $message;
+
+ /** @var int */
+ protected $statusCode;
+
+ /** @var integer */
+ protected $items;
+
+ /** @var integer */
+ protected $perPage;
+
+ /** @var array */
+ private $headers = [];
/**
* create the OCS_Result object
@@ -106,5 +122,32 @@ class OC_OCS_Result{
return ($this->statusCode == 100);
}
+ /**
+ * Adds a new header to the response
+ * @param string $name The name of the HTTP header
+ * @param string $value The value, null will delete it
+ * @return $this
+ */
+ public function addHeader($name, $value) {
+ $name = trim($name); // always remove leading and trailing whitespace
+ // to be able to reliably check for security
+ // headers
+
+ if(is_null($value)) {
+ unset($this->headers[$name]);
+ } else {
+ $this->headers[$name] = $value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns the set headers
+ * @return array the headers
+ */
+ public function getHeaders() {
+ return $this->headers;
+ }
}
diff --git a/lib/private/route/router.php b/lib/private/route/router.php
index 48992366092..33669452f2d 100644
--- a/lib/private/route/router.php
+++ b/lib/private/route/router.php
@@ -150,6 +150,12 @@ class Router implements IRouter {
\OC::$server->getEventLogger()->start('loadroutes' . $requestedApp, 'Loading Routes');
foreach ($routingFiles as $app => $file) {
if (!isset($this->loadedApps[$app])) {
+ if (!\OC_App::isAppLoaded($app)) {
+ // app MUST be loaded before app routes
+ // try again next time loadRoutes() is called
+ $this->loaded = false;
+ continue;
+ }
$this->loadedApps[$app] = true;
$this->useCollection($app);
$this->requireRouteFile($file, $app);
diff --git a/lib/private/security/crypto.php b/lib/private/security/crypto.php
index bca0f08090d..9bae1d6992c 100644
--- a/lib/private/security/crypto.php
+++ b/lib/private/security/crypto.php
@@ -23,11 +23,10 @@
namespace OC\Security;
-use Crypt_AES;
-use Crypt_Hash;
+use phpseclib\Crypt\AES;
+use phpseclib\Crypt\Hash;
use OCP\Security\ICrypto;
use OCP\Security\ISecureRandom;
-use OCP\Security\StringUtils;
use OCP\IConfig;
/**
@@ -41,7 +40,7 @@ use OCP\IConfig;
* @package OC\Security
*/
class Crypto implements ICrypto {
- /** @var Crypt_AES $cipher */
+ /** @var AES $cipher */
private $cipher;
/** @var int */
private $ivLength = 16;
@@ -50,8 +49,12 @@ class Crypto implements ICrypto {
/** @var ISecureRandom */
private $random;
+ /**
+ * @param IConfig $config
+ * @param ISecureRandom $random
+ */
function __construct(IConfig $config, ISecureRandom $random) {
- $this->cipher = new Crypt_AES();
+ $this->cipher = new AES();
$this->config = $config;
$this->random = $random;
}
@@ -69,7 +72,7 @@ class Crypto implements ICrypto {
// Append an "a" behind the password and hash it to prevent reusing the same password as for encryption
$password = hash('sha512', $password . 'a');
- $hash = new Crypt_Hash('sha512');
+ $hash = new Hash('sha512');
$hash->setKey($password);
return $hash->hash($message);
}
@@ -119,7 +122,7 @@ class Crypto implements ICrypto {
$this->cipher->setIV($iv);
- if(!StringUtils::equals($this->calculateHMAC($parts[0].$parts[1], $password), $hmac)) {
+ if(!\OCP\Security\StringUtils::equals($this->calculateHMAC($parts[0].$parts[1], $password), $hmac)) {
throw new \Exception('HMAC does not match.');
}
diff --git a/lib/private/server.php b/lib/private/server.php
index 12981fe7f19..9503cf16ff7 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -449,6 +449,14 @@ class Server extends SimpleContainer implements IServerContainer {
$c->getURLGenerator(),
\OC::$configDir);
});
+ $this->registerService('CapabilitiesManager', function (Server $c) {
+ $manager = new \OC\CapabilitiesManager();
+ $manager->registerCapability(function() use ($c) {
+ return new \OC\OCS\CoreCapabilities($c->getConfig());
+ });
+ return $manager;
+ });
+
}
/**
@@ -945,4 +953,13 @@ class Server extends SimpleContainer implements IServerContainer {
public function getMimeTypeDetector() {
return $this->query('MimeTypeDetector');
}
+
+ /**
+ * Get the manager of all the capabilities
+ *
+ * @return \OC\CapabilitiesManager
+ */
+ public function getCapabilitiesManager() {
+ return $this->query('CapabilitiesManager');
+ }
}
diff --git a/lib/private/setup.php b/lib/private/setup.php
index 50bf0dceafc..8f1ae389e45 100644
--- a/lib/private/setup.php
+++ b/lib/private/setup.php
@@ -39,6 +39,8 @@ use bantu\IniGetWrapper\IniGetWrapper;
use Exception;
use OCP\IConfig;
use OCP\IL10N;
+use OCP\ILogger;
+use OCP\Security\ISecureRandom;
class Setup {
/** @var \OCP\IConfig */
@@ -49,6 +51,10 @@ class Setup {
protected $l10n;
/** @var \OC_Defaults */
protected $defaults;
+ /** @var ILogger */
+ protected $logger;
+ /** @var ISecureRandom */
+ protected $random;
/**
* @param IConfig $config
@@ -58,18 +64,22 @@ class Setup {
function __construct(IConfig $config,
IniGetWrapper $iniWrapper,
IL10N $l10n,
- \OC_Defaults $defaults) {
+ \OC_Defaults $defaults,
+ ILogger $logger,
+ ISecureRandom $random
+ ) {
$this->config = $config;
$this->iniWrapper = $iniWrapper;
$this->l10n = $l10n;
$this->defaults = $defaults;
+ $this->logger = $logger;
+ $this->random = $random;
}
static $dbSetupClasses = array(
'mysql' => '\OC\Setup\MySQL',
'pgsql' => '\OC\Setup\PostgreSQL',
'oci' => '\OC\Setup\OCI',
- 'mssql' => '\OC\Setup\MSSQL',
'sqlite' => '\OC\Setup\Sqlite',
'sqlite3' => '\OC\Setup\Sqlite',
);
@@ -79,7 +89,7 @@ class Setup {
* @param string $name
* @return bool
*/
- public function class_exists($name) {
+ protected function class_exists($name) {
return class_exists($name);
}
@@ -88,11 +98,20 @@ class Setup {
* @param string $name
* @return bool
*/
- public function is_callable($name) {
+ protected function is_callable($name) {
return is_callable($name);
}
/**
+ * Wrapper around \PDO::getAvailableDrivers
+ *
+ * @return array
+ */
+ protected function getAvailableDbDriversForPdo() {
+ return \PDO::getAvailableDrivers();
+ }
+
+ /**
* Get the available and supported databases of this instance
*
* @param bool $allowAllDatabases
@@ -107,8 +126,8 @@ class Setup {
'name' => 'SQLite'
),
'mysql' => array(
- 'type' => 'function',
- 'call' => 'mysql_connect',
+ 'type' => 'pdo',
+ 'call' => 'mysql',
'name' => 'MySQL/MariaDB'
),
'pgsql' => array(
@@ -120,11 +139,6 @@ class Setup {
'type' => 'function',
'call' => 'oci_connect',
'name' => 'Oracle'
- ),
- 'mssql' => array(
- 'type' => 'function',
- 'call' => 'sqlsrv_connect',
- 'name' => 'MS SQL'
)
);
if ($allowAllDatabases) {
@@ -142,10 +156,15 @@ class Setup {
foreach($configuredDatabases as $database) {
if(array_key_exists($database, $availableDatabases)) {
$working = false;
- if($availableDatabases[$database]['type'] === 'class') {
- $working = $this->class_exists($availableDatabases[$database]['call']);
- } elseif ($availableDatabases[$database]['type'] === 'function') {
- $working = $this->is_callable($availableDatabases[$database]['call']);
+ $type = $availableDatabases[$database]['type'];
+ $call = $availableDatabases[$database]['call'];
+
+ if($type === 'class') {
+ $working = $this->class_exists($call);
+ } elseif ($type === 'function') {
+ $working = $this->is_callable($call);
+ } elseif($type === 'pdo') {
+ $working = in_array($call, $this->getAvailableDbDriversForPdo(), TRUE);
}
if($working) {
$supportedDatabases[$database] = $availableDatabases[$database]['name'];
@@ -218,7 +237,6 @@ class Setup {
'hasMySQL' => isset($databases['mysql']),
'hasPostgreSQL' => isset($databases['pgsql']),
'hasOracle' => isset($databases['oci']),
- 'hasMSSQL' => isset($databases['mssql']),
'databases' => $databases,
'directory' => $dataDir,
'htaccessWorking' => $htAccessWorking,
@@ -256,7 +274,8 @@ class Setup {
$class = self::$dbSetupClasses[$dbType];
/** @var \OC\Setup\AbstractDatabase $dbSetup */
- $dbSetup = new $class($l, 'db_structure.xml');
+ $dbSetup = new $class($l, 'db_structure.xml', $this->config,
+ $this->logger, $this->random);
$error = array_merge($error, $dbSetup->validate($options));
// validate the data directory
@@ -291,9 +310,9 @@ class Setup {
}
//generate a random salt that is used to salt the local user passwords
- $salt = \OC::$server->getSecureRandom()->getLowStrengthGenerator()->generate(30);
+ $salt = $this->random->getLowStrengthGenerator()->generate(30);
// generate a secret
- $secret = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(48);
+ $secret = $this->random->getMediumStrengthGenerator()->generate(48);
//write the config file
$this->config->setSystemValues([
@@ -358,7 +377,7 @@ class Setup {
//try to write logtimezone
if (date_default_timezone_get()) {
- \OC_Config::setValue('logtimezone', date_default_timezone_get());
+ $config->setSystemValue('logtimezone', date_default_timezone_get());
}
//and we are done
@@ -396,7 +415,9 @@ class Setup {
* @throws \OC\HintException If .htaccess does not include the current version
*/
public static function updateHtaccess() {
- $setupHelper = new \OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults());
+ $setupHelper = new \OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(),
+ \OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(),
+ \OC::$server->getSecureRandom());
if(!$setupHelper->isCurrentHtaccess()) {
throw new \OC\HintException('.htaccess file has the wrong version. Please upload the correct version. Maybe you forgot to replace it after updating?');
}
diff --git a/lib/private/setup/abstractdatabase.php b/lib/private/setup/abstractdatabase.php
index 13daf1782fc..1ec853c3b02 100644
--- a/lib/private/setup/abstractdatabase.php
+++ b/lib/private/setup/abstractdatabase.php
@@ -22,22 +22,39 @@
*/
namespace OC\Setup;
+use OCP\IConfig;
+use OCP\ILogger;
+use OCP\Security\ISecureRandom;
+
abstract class AbstractDatabase {
- /**
- * @var \OC_L10N
- */
+ /** @var \OC_L10N */
protected $trans;
+ /** @var string */
protected $dbDefinitionFile;
- protected $dbuser;
- protected $dbpassword;
- protected $dbname;
- protected $dbhost;
- protected $tableprefix;
+ /** @var string */
+ protected $dbUser;
+ /** @var string */
+ protected $dbPassword;
+ /** @var string */
+ protected $dbName;
+ /** @var string */
+ protected $dbHost;
+ /** @var string */
+ protected $tablePrefix;
+ /** @var IConfig */
+ protected $config;
+ /** @var ILogger */
+ protected $logger;
+ /** @var ISecureRandom */
+ protected $random;
- public function __construct($trans, $dbDefinitionFile) {
+ public function __construct($trans, $dbDefinitionFile, IConfig $config, ILogger $logger, ISecureRandom $random) {
$this->trans = $trans;
$this->dbDefinitionFile = $dbDefinitionFile;
+ $this->config = $config;
+ $this->logger = $logger;
+ $this->random = $random;
}
public function validate($config) {
@@ -61,17 +78,17 @@ abstract class AbstractDatabase {
$dbHost = !empty($config['dbhost']) ? $config['dbhost'] : 'localhost';
$dbTablePrefix = isset($config['dbtableprefix']) ? $config['dbtableprefix'] : 'oc_';
- \OC_Config::setValues([
+ $this->config->setSystemValues([
'dbname' => $dbName,
'dbhost' => $dbHost,
'dbtableprefix' => $dbTablePrefix,
]);
- $this->dbuser = $dbUser;
- $this->dbpassword = $dbPass;
- $this->dbname = $dbName;
- $this->dbhost = $dbHost;
- $this->tableprefix = $dbTablePrefix;
+ $this->dbUser = $dbUser;
+ $this->dbPassword = $dbPass;
+ $this->dbName = $dbName;
+ $this->dbHost = $dbHost;
+ $this->tablePrefix = $dbTablePrefix;
}
abstract public function setupDatabase($userName);
diff --git a/lib/private/setup/mssql.php b/lib/private/setup/mssql.php
deleted file mode 100644
index 0ae02d6cbcc..00000000000
--- a/lib/private/setup/mssql.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-/**
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OC\Setup;
-
-class MSSQL extends AbstractDatabase {
- public $dbprettyname = 'MS SQL Server';
-
- public function setupDatabase($username) {
- //check if the database user has admin right
- $masterConnectionInfo = array( "Database" => "master", "UID" => $this->dbuser, "PWD" => $this->dbpassword);
-
- $masterConnection = @sqlsrv_connect($this->dbhost, $masterConnectionInfo);
- if(!$masterConnection) {
- $entry = '';
- if( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- }
- throw new \OC\DatabaseSetupException($this->trans->t('MS SQL username and/or password not valid: %s', array($entry)),
- $this->trans->t('You need to enter either an existing account or the administrator.'));
- }
-
- \OC_Config::setValues([
- 'dbuser' => $this->dbuser,
- 'dbpassword' => $this->dbpassword,
- ]);
-
- $this->createDBLogin($masterConnection);
-
- $this->createDatabase($masterConnection);
-
- $this->createDBUser($masterConnection);
-
- sqlsrv_close($masterConnection);
-
- $this->createDatabaseStructure();
- }
-
- private function createDBLogin($connection) {
- $query = "SELECT * FROM master.sys.server_principals WHERE name = '".$this->dbuser."';";
- $result = sqlsrv_query($connection, $query);
- if ($result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- } else {
- $row = sqlsrv_fetch_array($result);
-
- if ($row === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- } else {
- if ($row == null) {
- $query = "CREATE LOGIN [".$this->dbuser."] WITH PASSWORD = '".$this->dbpassword."';";
- $result = sqlsrv_query($connection, $query);
- if (!$result or $result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- }
- }
- }
- }
- }
-
- private function createDBUser($connection) {
- $query = "SELECT * FROM [".$this->dbname."].sys.database_principals WHERE name = '".$this->dbuser."';";
- $result = sqlsrv_query($connection, $query);
- if ($result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- } else {
- $row = sqlsrv_fetch_array($result);
-
- if ($row === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- } else {
- if ($row == null) {
- $query = "USE [".$this->dbname."]; CREATE USER [".$this->dbuser."] FOR LOGIN [".$this->dbuser."];";
- $result = sqlsrv_query($connection, $query);
- if (!$result || $result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry = 'DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- }
- }
-
- $query = "USE [".$this->dbname."]; EXEC sp_addrolemember 'db_owner', '".$this->dbuser."';";
- $result = sqlsrv_query($connection, $query);
- if (!$result || $result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- }
- }
- }
- }
-
- private function createDatabase($connection) {
- $query = "CREATE DATABASE [".$this->dbname."];";
- $result = sqlsrv_query($connection, $query);
- if (!$result || $result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- }
- }
-
- private function createDatabaseStructure() {
- $connectionInfo = array( "Database" => $this->dbname, "UID" => $this->dbuser, "PWD" => $this->dbpassword);
-
- $connection = @sqlsrv_connect($this->dbhost, $connectionInfo);
-
- //fill the database if needed
- $query = "SELECT * FROM INFORMATION_SCHEMA.TABLES"
- ." WHERE TABLE_SCHEMA = '".$this->dbname."'"
- ." AND TABLE_NAME = '".$this->tableprefix."users'";
- $result = sqlsrv_query($connection, $query);
- if ($result === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- } else {
- $row = sqlsrv_fetch_array($result);
-
- if ($row === false) {
- if ( ($errors = sqlsrv_errors() ) != null) {
- $entry='DB Error: "'.print_r(sqlsrv_errors()).'"<br />';
- } else {
- $entry = '';
- }
- $entry.='Offending command was: '.$query.'<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- } else {
- if ($row == null) {
- \OC_DB::createDbFromStructure($this->dbDefinitionFile);
- }
- }
- }
-
- sqlsrv_close($connection);
- }
-}
diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php
index c01ff724b80..5597592f21e 100644
--- a/lib/private/setup/mysql.php
+++ b/lib/private/setup/mysql.php
@@ -23,110 +23,139 @@
*/
namespace OC\Setup;
+use OC\DB\ConnectionFactory;
+use OCP\IDBConnection;
+
class MySQL extends AbstractDatabase {
public $dbprettyname = 'MySQL/MariaDB';
public function setupDatabase($username) {
//check if the database user has admin right
- $connection = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword);
- if(!$connection) {
- throw new \OC\DatabaseSetupException($this->trans->t('MySQL/MariaDB username and/or password not valid'),
- $this->trans->t('You need to enter either an existing account or the administrator.'));
- }
- //user already specified in config
- $oldUser=\OC_Config::getValue('dbuser', false);
-
- //we don't have a dbuser specified in config
- if($this->dbuser!=$oldUser) {
- //add prefix to the admin username to prevent collisions
- $adminUser=substr('oc_'.$username, 0, 16);
-
- $i = 1;
- while(true) {
- //this should be enough to check for admin rights in mysql
- $query="SELECT user FROM mysql.user WHERE user='$adminUser'";
-
- $result = mysql_query($query, $connection);
+ $connection = $this->connect();
- //current dbuser has admin rights
- if($result) {
- //new dbuser does not exist
- if(mysql_num_rows($result) === 0) {
- //use the admin login data for the new database user
- $this->dbuser=$adminUser;
-
- //create a random password so we don't need to store the admin password in the config file
- $this->dbpassword=\OC_Util::generateRandomBytes(30);
-
- $this->createDBUser($connection);
-
- break;
- } else {
- //repeat with different username
- $length=strlen((string)$i);
- $adminUser=substr('oc_'.$username, 0, 16 - $length).$i;
- $i++;
- }
- } else {
- break;
- }
- };
-
- \OC_Config::setValues([
- 'dbuser' => $this->dbuser,
- 'dbpassword' => $this->dbpassword,
- ]);
- }
+ $this->createSpecificUser($username, $connection);
//create the database
$this->createDatabase($connection);
//fill the database if needed
- $query='select count(*) from information_schema.tables'
- ." where table_schema='".$this->dbname."' AND table_name = '".$this->tableprefix."users';";
- $result = mysql_query($query, $connection);
- if($result) {
- $row=mysql_fetch_row($result);
- }
+ $query='select count(*) from information_schema.tables where table_schema=? AND table_name = ?';
+ $result = $connection->executeQuery($query, [$this->dbName, $this->tablePrefix.'users']);
+ $row = $result->fetch();
if(!$result or $row[0]==0) {
\OC_DB::createDbFromStructure($this->dbDefinitionFile);
}
- mysql_close($connection);
}
+ /**
+ * @param \OC\DB\Connection $connection
+ */
private function createDatabase($connection) {
- $name = $this->dbname;
- $user = $this->dbuser;
- //we cant use OC_BD functions here because we need to connect as the administrative user.
- $query = "CREATE DATABASE IF NOT EXISTS `$name` CHARACTER SET utf8 COLLATE utf8_bin;";
- $result = mysql_query($query, $connection);
- if(!$result) {
- $entry = $this->trans->t('DB Error: "%s"', array(mysql_error($connection))) . '<br />';
- $entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />';
- \OCP\Util::writeLog('setup.mssql', $entry, \OCP\Util::WARN);
- }
- $query="GRANT ALL PRIVILEGES ON `$name` . * TO '$user'";
+ try{
+ $name = $this->dbName;
+ $user = $this->dbUser;
+ //we cant use OC_BD functions here because we need to connect as the administrative user.
+ $query = "CREATE DATABASE IF NOT EXISTS `$name` CHARACTER SET utf8 COLLATE utf8_bin;";
+ $connection->executeUpdate($query);
- //this query will fail if there aren't the right permissions, ignore the error
- mysql_query($query, $connection);
+ //this query will fail if there aren't the right permissions, ignore the error
+ $query="GRANT ALL PRIVILEGES ON `$name` . * TO '$user'";
+ $connection->executeUpdate($query);
+ } catch (\Exception $ex) {
+ $this->logger->error('Database creation failed: {error}', [
+ 'app' => 'mysql.setup',
+ 'error' => $ex->getMessage()
+ ]);
+ }
}
+ /**
+ * @param IDbConnection $connection
+ * @throws \OC\DatabaseSetupException
+ */
private function createDBUser($connection) {
- $name = $this->dbuser;
- $password = $this->dbpassword;
+ $name = $this->dbUser;
+ $password = $this->dbPassword;
// we need to create 2 accounts, one for global use and one for local user. if we don't specify the local one,
// the anonymous user would take precedence when there is one.
$query = "CREATE USER '$name'@'localhost' IDENTIFIED BY '$password'";
- $result = mysql_query($query, $connection);
- if (!$result) {
- throw new \OC\DatabaseSetupException($this->trans->t("MySQL/MariaDB user '%s'@'localhost' exists already.", array($name)),
- $this->trans->t("Drop this user from MySQL/MariaDB", array($name)));
- }
+ $connection->executeUpdate($query);
$query = "CREATE USER '$name'@'%' IDENTIFIED BY '$password'";
- $result = mysql_query($query, $connection);
- if (!$result) {
- throw new \OC\DatabaseSetupException($this->trans->t("MySQL/MariaDB user '%s'@'%%' already exists", array($name)),
- $this->trans->t("Drop this user from MySQL/MariaDB."));
+ $connection->executeUpdate($query);
+ }
+
+ /**
+ * @return \OC\DB\Connection
+ * @throws \OC\DatabaseSetupException
+ */
+ private function connect() {
+ $type = 'mysql';
+ $connectionParams = array(
+ 'host' => $this->dbHost,
+ 'user' => $this->dbUser,
+ 'password' => $this->dbPassword,
+ 'tablePrefix' => $this->tablePrefix,
+ );
+ $cf = new ConnectionFactory();
+ return $cf->getConnection($type, $connectionParams);
+ }
+
+ /**
+ * @param $username
+ * @param IDBConnection $connection
+ * @return array
+ */
+ private function createSpecificUser($username, $connection) {
+ try {
+ //user already specified in config
+ $oldUser = $this->config->getSystemValue('dbuser', false);
+
+ //we don't have a dbuser specified in config
+ if ($this->dbUser !== $oldUser) {
+ //add prefix to the admin username to prevent collisions
+ $adminUser = substr('oc_' . $username, 0, 16);
+
+ $i = 1;
+ while (true) {
+ //this should be enough to check for admin rights in mysql
+ $query = 'SELECT user FROM mysql.user WHERE user=?';
+ $result = $connection->executeQuery($query, [$adminUser]);
+
+ //current dbuser has admin rights
+ if ($result) {
+ $data = $result->fetchAll();
+ //new dbuser does not exist
+ if (count($data) === 0) {
+ //use the admin login data for the new database user
+ $this->dbUser = $adminUser;
+
+ //create a random password so we don't need to store the admin password in the config file
+ $this->dbPassword = $this->random->getMediumStrengthGenerator()->generate(30);
+
+ $this->createDBUser($connection);
+
+ break;
+ } else {
+ //repeat with different username
+ $length = strlen((string)$i);
+ $adminUser = substr('oc_' . $username, 0, 16 - $length) . $i;
+ $i++;
+ }
+ } else {
+ break;
+ }
+ };
+ }
+ } catch (\Exception $ex) {
+ $this->logger->error('Specific user creation failed: {error}', [
+ 'app' => 'mysql.setup',
+ 'error' => $ex->getMessage()
+ ]);
}
+
+ $this->config->setSystemValues([
+ 'dbuser' => $this->dbUser,
+ 'dbpassword' => $this->dbPassword,
+ ]);
}
}
diff --git a/lib/private/setup/oci.php b/lib/private/setup/oci.php
index d46d5529da0..1e1eb1ff54e 100644
--- a/lib/private/setup/oci.php
+++ b/lib/private/setup/oci.php
@@ -38,10 +38,10 @@ class OCI extends AbstractDatabase {
$this->dbtablespace = 'USERS';
}
// allow empty hostname for oracle
- $this->dbhost = $config['dbhost'];
+ $this->dbHost = $config['dbhost'];
\OC_Config::setValues([
- 'dbhost' => $this->dbhost,
+ 'dbhost' => $this->dbHost,
'dbtablespace' => $this->dbtablespace,
]);
}
@@ -58,8 +58,8 @@ class OCI extends AbstractDatabase {
}
public function setupDatabase($username) {
- $e_host = addslashes($this->dbhost);
- $e_dbname = addslashes($this->dbname);
+ $e_host = addslashes($this->dbHost);
+ $e_dbname = addslashes($this->dbName);
//check if the database user has admin right
if ($e_host == '') {
$easy_connect_string = $e_dbname; // use dbname as easy connect name
@@ -67,7 +67,7 @@ class OCI extends AbstractDatabase {
$easy_connect_string = '//'.$e_host.'/'.$e_dbname;
}
\OCP\Util::writeLog('setup oracle', 'connect string: ' . $easy_connect_string, \OCP\Util::DEBUG);
- $connection = @oci_connect($this->dbuser, $this->dbpassword, $easy_connect_string);
+ $connection = @oci_connect($this->dbUser, $this->dbPassword, $easy_connect_string);
if(!$connection) {
$errorMessage = $this->getLastError();
if ($errorMessage) {
@@ -103,23 +103,23 @@ class OCI extends AbstractDatabase {
//use the admin login data for the new database user
//add prefix to the oracle user name to prevent collisions
- $this->dbuser='oc_'.$username;
+ $this->dbUser='oc_'.$username;
//create a new password so we don't need to store the admin config in the config file
- $this->dbpassword=\OC_Util::generateRandomBytes(30);
+ $this->dbPassword=\OC_Util::generateRandomBytes(30);
//oracle passwords are treated as identifiers:
// must start with alphanumeric char
// needs to be shortened to 30 bytes, as the two " needed to escape the identifier count towards the identifier length.
- $this->dbpassword=substr($this->dbpassword, 0, 30);
+ $this->dbPassword=substr($this->dbPassword, 0, 30);
$this->createDBUser($connection);
}
}
\OC_Config::setValues([
- 'dbuser' => $this->dbuser,
- 'dbname' => $this->dbname,
- 'dbpassword' => $this->dbpassword,
+ 'dbuser' => $this->dbUser,
+ 'dbname' => $this->dbName,
+ 'dbpassword' => $this->dbPassword,
]);
//create the database not necessary, oracle implies user = schema
@@ -131,26 +131,26 @@ class OCI extends AbstractDatabase {
oci_close($connection);
// connect to the oracle database (schema=$this->dbuser) an check if the schema needs to be filled
- $this->dbuser = \OC_Config::getValue('dbuser');
+ $this->dbUser = \OC_Config::getValue('dbuser');
//$this->dbname = \OC_Config::getValue('dbname');
- $this->dbpassword = \OC_Config::getValue('dbpassword');
+ $this->dbPassword = \OC_Config::getValue('dbpassword');
- $e_host = addslashes($this->dbhost);
- $e_dbname = addslashes($this->dbname);
+ $e_host = addslashes($this->dbHost);
+ $e_dbname = addslashes($this->dbName);
if ($e_host == '') {
$easy_connect_string = $e_dbname; // use dbname as easy connect name
} else {
$easy_connect_string = '//'.$e_host.'/'.$e_dbname;
}
- $connection = @oci_connect($this->dbuser, $this->dbpassword, $easy_connect_string);
+ $connection = @oci_connect($this->dbUser, $this->dbPassword, $easy_connect_string);
if(!$connection) {
throw new \OC\DatabaseSetupException($this->trans->t('Oracle username and/or password not valid'),
$this->trans->t('You need to enter either an existing account or the administrator.'));
}
$query = "SELECT count(*) FROM user_tables WHERE table_name = :un";
$stmt = oci_parse($connection, $query);
- $un = $this->tableprefix.'users';
+ $un = $this->tablePrefix.'users';
oci_bind_by_name($stmt, ':un', $un);
if (!$stmt) {
$entry = $this->trans->t('DB Error: "%s"', array($this->getLastError($connection))) . '<br />';
@@ -171,8 +171,8 @@ class OCI extends AbstractDatabase {
* @param resource $connection
*/
private function createDBUser($connection) {
- $name = $this->dbuser;
- $password = $this->dbpassword;
+ $name = $this->dbUser;
+ $password = $this->dbPassword;
$query = "SELECT * FROM all_users WHERE USERNAME = :un";
$stmt = oci_parse($connection, $query);
if (!$stmt) {
diff --git a/lib/private/setup/postgresql.php b/lib/private/setup/postgresql.php
index c8fd3b98fe4..319b6676ef8 100644
--- a/lib/private/setup/postgresql.php
+++ b/lib/private/setup/postgresql.php
@@ -27,9 +27,9 @@ class PostgreSQL extends AbstractDatabase {
public $dbprettyname = 'PostgreSQL';
public function setupDatabase($username) {
- $e_host = addslashes($this->dbhost);
- $e_user = addslashes($this->dbuser);
- $e_password = addslashes($this->dbpassword);
+ $e_host = addslashes($this->dbHost);
+ $e_user = addslashes($this->dbUser);
+ $e_password = addslashes($this->dbPassword);
// Fix database with port connection
if(strpos($e_host, ':')) {
@@ -43,7 +43,7 @@ class PostgreSQL extends AbstractDatabase {
$connection = @pg_connect($connection_string);
if(!$connection) {
// Try if we can connect to the DB with the specified name
- $e_dbname = addslashes($this->dbname);
+ $e_dbname = addslashes($this->dbName);
$connection_string = "host='$e_host' dbname='$e_dbname' user='$e_user' port='$port' password='$e_password'";
$connection = @pg_connect($connection_string);
@@ -51,7 +51,7 @@ class PostgreSQL extends AbstractDatabase {
throw new \OC\DatabaseSetupException($this->trans->t('PostgreSQL username and/or password not valid'),
$this->trans->t('You need to enter either an existing account or the administrator.'));
}
- $e_user = pg_escape_string($this->dbuser);
+ $e_user = pg_escape_string($this->dbUser);
//check for roles creation rights in postgresql
$query="SELECT 1 FROM pg_roles WHERE rolcreaterole=TRUE AND rolname='$e_user'";
$result = pg_query($connection, $query);
@@ -59,16 +59,16 @@ class PostgreSQL extends AbstractDatabase {
//use the admin login data for the new database user
//add prefix to the postgresql user name to prevent collisions
- $this->dbuser='oc_'.$username;
+ $this->dbUser='oc_'.$username;
//create a new password so we don't need to store the admin config in the config file
- $this->dbpassword=\OC_Util::generateRandomBytes(30);
+ $this->dbPassword=\OC_Util::generateRandomBytes(30);
$this->createDBUser($connection);
}
\OC_Config::setValues([
- 'dbuser' => $this->dbuser,
- 'dbpassword' => $this->dbpassword,
+ 'dbuser' => $this->dbUser,
+ 'dbpassword' => $this->dbPassword,
]);
//create the database
@@ -78,13 +78,13 @@ class PostgreSQL extends AbstractDatabase {
pg_close($connection);
// connect to the ownCloud database (dbname=$this->dbname) and check if it needs to be filled
- $this->dbuser = \OC_Config::getValue('dbuser');
- $this->dbpassword = \OC_Config::getValue('dbpassword');
+ $this->dbUser = \OC_Config::getValue('dbuser');
+ $this->dbPassword = \OC_Config::getValue('dbpassword');
- $e_host = addslashes($this->dbhost);
- $e_dbname = addslashes($this->dbname);
- $e_user = addslashes($this->dbuser);
- $e_password = addslashes($this->dbpassword);
+ $e_host = addslashes($this->dbHost);
+ $e_dbname = addslashes($this->dbName);
+ $e_user = addslashes($this->dbUser);
+ $e_password = addslashes($this->dbPassword);
// Fix database with port connection
if(strpos($e_host, ':')) {
@@ -99,7 +99,7 @@ class PostgreSQL extends AbstractDatabase {
throw new \OC\DatabaseSetupException($this->trans->t('PostgreSQL username and/or password not valid'),
$this->trans->t('You need to enter either an existing account or the administrator.'));
}
- $query = "select count(*) FROM pg_class WHERE relname='".$this->tableprefix."users' limit 1";
+ $query = "select count(*) FROM pg_class WHERE relname='".$this->tablePrefix."users' limit 1";
$result = pg_query($connection, $query);
if($result) {
$row = pg_fetch_row($result);
@@ -111,8 +111,8 @@ class PostgreSQL extends AbstractDatabase {
private function createDatabase($connection) {
//we cant use OC_BD functions here because we need to connect as the administrative user.
- $e_name = pg_escape_string($this->dbname);
- $e_user = pg_escape_string($this->dbuser);
+ $e_name = pg_escape_string($this->dbName);
+ $e_user = pg_escape_string($this->dbUser);
$query = "select datname from pg_database where datname = '$e_name'";
$result = pg_query($connection, $query);
if(!$result) {
@@ -137,8 +137,8 @@ class PostgreSQL extends AbstractDatabase {
}
private function createDBUser($connection) {
- $e_name = pg_escape_string($this->dbuser);
- $e_password = pg_escape_string($this->dbpassword);
+ $e_name = pg_escape_string($this->dbUser);
+ $e_password = pg_escape_string($this->dbPassword);
$query = "select * from pg_roles where rolname='$e_name';";
$result = pg_query($connection, $query);
if(!$result) {
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 40fcc59f219..9aea4677b5b 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -1218,7 +1218,7 @@ class Share extends Constants {
$qb = $connection->getQueryBuilder();
$qb->select('uid_owner')
- ->from('*PREFIX*share')
+ ->from('share')
->where($qb->expr()->eq('id', $qb->createParameter('shareId')))
->setParameter(':shareId', $shareId);
$result = $qb->execute();
@@ -1269,7 +1269,7 @@ class Share extends Constants {
self::verifyPassword($password);
$qb = $connection->getQueryBuilder();
- $qb->update('*PREFIX*share')
+ $qb->update('share')
->set('share_with', $qb->createParameter('pass'))
->where($qb->expr()->eq('id', $qb->createParameter('shareId')))
->setParameter(':pass', is_null($password) ? null : \OC::$server->getHasher()->hash($password))
diff --git a/lib/private/template.php b/lib/private/template.php
index ca689729f80..e7acc778de3 100644
--- a/lib/private/template.php
+++ b/lib/private/template.php
@@ -222,9 +222,9 @@ class OC_Template extends \OC\Template\Base {
/**
* print error page using Exception details
- * @param Exception $exception
+ * @param Exception|Error $exception
*/
- public static function printExceptionErrorPage(Exception $exception) {
+ public static function printExceptionErrorPage($exception) {
$request = \OC::$server->getRequest();
$content = new \OC_Template('', 'exception', 'error', false);
$content->assign('errorClass', get_class($exception));
diff --git a/lib/private/util.php b/lib/private/util.php
index 39d64952dc6..501dbf5c4c5 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -143,6 +143,14 @@ class OC_Util {
return $storage;
});
+ // install storage availability wrapper, before most other wrappers
+ \OC\Files\Filesystem::addStorageWrapper('oc_availability', function ($mountPoint, $storage) {
+ if (!$storage->isLocal()) {
+ return new \OC\Files\Storage\Wrapper\Availability(['storage' => $storage]);
+ }
+ return $storage;
+ });
+
\OC\Files\Filesystem::addStorageWrapper('oc_quota', function ($mountPoint, $storage) {
// set up quota for home storages, even for other users
// which can happen when using sharing
@@ -567,7 +575,8 @@ class OC_Util {
}
$webServerRestart = false;
- $setup = new \OC\Setup($config, \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults());
+ $setup = new \OC\Setup($config, \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'),
+ new \OC_Defaults(), \OC::$server->getLogger(), \OC::$server->getSecureRandom());
$availableDatabases = $setup->getSupportedDatabases();
if (empty($availableDatabases)) {
$errors[] = array(
diff --git a/lib/public/appframework/http/ocsresponse.php b/lib/public/appframework/http/ocsresponse.php
index 52d3c2fa665..2e788a52bb9 100644
--- a/lib/public/appframework/http/ocsresponse.php
+++ b/lib/public/appframework/http/ocsresponse.php
@@ -41,38 +41,26 @@ class OCSResponse extends Response {
private $format;
private $statuscode;
private $message;
- private $tag;
- private $tagattribute;
- private $dimension;
private $itemscount;
private $itemsperpage;
/**
* generates the xml or json response for the API call from an multidimenional data array.
* @param string $format
- * @param string $status
- * @param string $statuscode
+ * @param int $statuscode
* @param string $message
* @param array $data
- * @param string $tag
- * @param string $tagattribute
- * @param int $dimension
* @param int|string $itemscount
* @param int|string $itemsperpage
* @since 8.1.0
*/
- public function __construct($format, $status, $statuscode, $message,
- $data=[], $tag='', $tagattribute='',
- $dimension=-1, $itemscount='',
+ public function __construct($format, $statuscode, $message,
+ $data=[], $itemscount='',
$itemsperpage='') {
$this->format = $format;
- $this->setStatus($status);
$this->statuscode = $statuscode;
$this->message = $message;
$this->data = $data;
- $this->tag = $tag;
- $this->tagattribute = $tagattribute;
- $this->dimension = $dimension;
$this->itemscount = $itemscount;
$this->itemsperpage = $itemsperpage;
@@ -93,11 +81,11 @@ class OCSResponse extends Response {
* @since 8.1.0
*/
public function render() {
- return OC_OCS::generateXml(
- $this->format, $this->getStatus(), $this->statuscode, $this->message,
- $this->data, $this->tag, $this->tagattribute, $this->dimension,
- $this->itemscount, $this->itemsperpage
- );
+ $r = new \OC_OCS_Result($this->data, $this->statuscode, $this->message);
+ $r->setTotalItems($this->itemscount);
+ $r->setItemsPerPage($this->itemsperpage);
+
+ return \OC_API::renderResult($r, $this->format);
}
diff --git a/lib/public/appframework/iappcontainer.php b/lib/public/appframework/iappcontainer.php
index 64b1082aa97..7338dbd858d 100644
--- a/lib/public/appframework/iappcontainer.php
+++ b/lib/public/appframework/iappcontainer.php
@@ -86,4 +86,11 @@ interface IAppContainer extends IContainer {
*/
function log($message, $level);
+ /**
+ * Register a capability
+ *
+ * @param string $serviceName e.g. 'OCA\Files\Capabilities'
+ * @since 8.2.0
+ */
+ public function registerCapability($serviceName);
}
diff --git a/lib/public/appframework/ocscontroller.php b/lib/public/appframework/ocscontroller.php
index 602731fe761..55ba518020a 100644
--- a/lib/public/appframework/ocscontroller.php
+++ b/lib/public/appframework/ocscontroller.php
@@ -42,7 +42,7 @@ abstract class OCSController extends ApiController {
* constructor of the controller
* @param string $appName the name of the app
* @param IRequest $request an instance of the request
- * @param string $corsMethods comma seperated string of HTTP verbs which
+ * @param string $corsMethods comma separated string of HTTP verbs which
* should be allowed for websites or webapps when calling your API, defaults to
* 'PUT, POST, GET, DELETE, PATCH'
* @param string $corsAllowedHeaders comma seperated string of HTTP headers
@@ -80,13 +80,9 @@ abstract class OCSController extends ApiController {
}
$params = [
- 'status' => 'OK',
'statuscode' => 100,
'message' => 'OK',
'data' => [],
- 'tag' => '',
- 'tagattribute' => '',
- 'dimension' => 'dynamic',
'itemscount' => '',
'itemsperpage' => ''
];
@@ -96,9 +92,8 @@ abstract class OCSController extends ApiController {
}
return new OCSResponse(
- $format, $params['status'], $params['statuscode'],
- $params['message'], $params['data'], $params['tag'],
- $params['tagattribute'], $params['dimension'],
+ $format, $params['statuscode'],
+ $params['message'], $params['data'],
$params['itemscount'], $params['itemsperpage']
);
}
diff --git a/lib/public/capabilities/icapability.php b/lib/public/capabilities/icapability.php
new file mode 100644
index 00000000000..71a56128d26
--- /dev/null
+++ b/lib/public/capabilities/icapability.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\Capabilities;
+
+/**
+ * Minimal interface that has to be implemented for a class to be considered
+ * a capability.
+ *
+ * In an application use:
+ * $this->getContainer()->registerCapability('OCA\MY_APP\Capabilities');
+ * To register capabilities.
+ *
+ * The class 'OCA\MY_APP\Capabilities' must then implement ICapability
+ *
+ * @since 8.2.0
+ */
+interface ICapability {
+
+ /**
+ * Function an app uses to return the capabilities
+ *
+ * @return array Array containing the apps capabilities
+ * @since 8.2.0
+ */
+ public function getCapabilities();
+}
+
diff --git a/lib/public/db/querybuilder/iquerybuilder.php b/lib/public/db/querybuilder/iquerybuilder.php
index 09d5d199bef..3fc07af1a47 100644
--- a/lib/public/db/querybuilder/iquerybuilder.php
+++ b/lib/public/db/querybuilder/iquerybuilder.php
@@ -27,6 +27,15 @@ namespace OCP\DB\QueryBuilder;
*/
interface IQueryBuilder {
/**
+ * Enable/disable automatic prefixing of table names with the oc_ prefix
+ *
+ * @param bool $enabled If set to true table names will be prefixed with the
+ * owncloud database prefix automatically.
+ * @since 8.2.0
+ */
+ public function automaticTablePrefix($enabled);
+
+ /**
* Gets an ExpressionBuilder used for object-oriented construction of query expressions.
* This producer method is intended for convenient inline usage. Example:
*
diff --git a/lib/public/files/storage.php b/lib/public/files/storage.php
index 41218996382..ac3603e48d4 100644
--- a/lib/public/files/storage.php
+++ b/lib/public/files/storage.php
@@ -439,4 +439,24 @@ interface Storage {
* @since 8.1.0
*/
public function changeLock($path, $type, ILockingProvider $provider);
+
+ /**
+ * Test a storage for availability
+ *
+ * @since 8.2.0
+ * @return bool
+ */
+ public function test();
+
+ /**
+ * @since 8.2.0
+ * @return array [ available, last_checked ]
+ */
+ public function getAvailability();
+
+ /**
+ * @since 8.2.0
+ * @param bool $isAvailable
+ */
+ public function setAvailability($isAvailable);
}
diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php
index f3165db33da..ab1729da255 100644
--- a/lib/public/iservercontainer.php
+++ b/lib/public/iservercontainer.php
@@ -438,4 +438,5 @@ interface IServerContainer {
* @since 8.2.0
*/
public function getMimeTypeDetector();
+
}
diff --git a/lib/repair/cleantags.php b/lib/repair/cleantags.php
index 2bda1047081..d16a49fbca7 100644
--- a/lib/repair/cleantags.php
+++ b/lib/repair/cleantags.php
@@ -65,8 +65,8 @@ class CleanTags extends BasicEmitter implements RepairStep {
protected function deleteOrphanFileEntries() {
$this->deleteOrphanEntries(
'%d tags for delete files have been removed.',
- '*PREFIX*vcategory_to_object', 'objid',
- '*PREFIX*filecache', 'fileid', 'path_hash'
+ 'vcategory_to_object', 'objid',
+ 'filecache', 'fileid', 'path_hash'
);
}
@@ -76,8 +76,8 @@ class CleanTags extends BasicEmitter implements RepairStep {
protected function deleteOrphanTagEntries() {
$this->deleteOrphanEntries(
'%d tag entries for deleted tags have been removed.',
- '*PREFIX*vcategory_to_object', 'categoryid',
- '*PREFIX*vcategory', 'id', 'uid'
+ 'vcategory_to_object', 'categoryid',
+ 'vcategory', 'id', 'uid'
);
}
@@ -87,8 +87,8 @@ class CleanTags extends BasicEmitter implements RepairStep {
protected function deleteOrphanCategoryEntries() {
$this->deleteOrphanEntries(
'%d tags with no entries have been removed.',
- '*PREFIX*vcategory', 'id',
- '*PREFIX*vcategory_to_object', 'categoryid', 'type'
+ 'vcategory', 'id',
+ 'vcategory_to_object', 'categoryid', 'type'
);
}
diff --git a/lib/repair/filletags.php b/lib/repair/filletags.php
index f1bb2c896c4..40072209982 100644
--- a/lib/repair/filletags.php
+++ b/lib/repair/filletags.php
@@ -42,7 +42,7 @@ class FillETags extends BasicEmitter implements \OC\RepairStep {
public function run() {
$qb = $this->connection->getQueryBuilder();
- $qb->update('*PREFIX*filecache')
+ $qb->update('filecache')
->set('etag', $qb->expr()->literal('xxx'))
->where($qb->expr()->eq('etag', $qb->expr()->literal('')))
->orWhere($qb->expr()->isNull('etag'));
diff --git a/ocs/v1.php b/ocs/v1.php
index 2829cf08c57..c5c18d20b8a 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -56,5 +56,7 @@ try {
} catch (MethodNotAllowedException $e) {
OC_API::setContentType();
OC_Response::setStatus(405);
+} catch (\OC\OCS\Exception $ex) {
+ OC_API::respond($ex->getResult(), OC_API::requestedFormat());
}
diff --git a/ocs/v2.php b/ocs/v2.php
new file mode 100644
index 00000000000..b2e3b259727
--- /dev/null
+++ b/ocs/v2.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+require_once 'v1.php';
diff --git a/settings/admin.php b/settings/admin.php
index 551608b5d25..8410a6671ef 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -46,7 +46,10 @@ $entriesRemaining = count($entries) > $numEntriesToLoad;
$entries = array_slice($entries, 0, $numEntriesToLoad);
$logFilePath = OC_Log_Owncloud::getLogFilePath();
$doesLogFileExist = file_exists($logFilePath);
-$logFileSize = filesize($logFilePath);
+$logFileSize = 0;
+if($doesLogFileExist) {
+ $logFileSize = filesize($logFilePath);
+}
$config = \OC::$server->getConfig();
$appConfig = \OC::$server->getAppConfig();
$request = \OC::$server->getRequest();
@@ -220,7 +223,7 @@ $formsAndMore = array_merge($formsAndMore, $formsMap);
$formsAndMore[] = ['anchor' => 'backgroundjobs', 'section-name' => $l->t('Cron')];
$formsAndMore[] = ['anchor' => 'mail_general_settings', 'section-name' => $l->t('Email server')];
$formsAndMore[] = ['anchor' => 'log-section', 'section-name' => $l->t('Log')];
-$formsAndMore[] = ['anchor' => 'server-status', 'section-name' => $l->t('Server Status')];
+$formsAndMore[] = ['anchor' => 'server-status', 'section-name' => $l->t('Server status')];
$formsAndMore[] = ['anchor' => 'admin-tips', 'section-name' => $l->t('Tips & tricks')];
if ($updaterAppPanel) {
$formsAndMore[] = ['anchor' => 'updater', 'section-name' => $l->t('Updates')];
diff --git a/settings/application.php b/settings/application.php
index 8da835c18d2..155cc39d041 100644
--- a/settings/application.php
+++ b/settings/application.php
@@ -107,7 +107,8 @@ class Application extends App {
$c->query('AppName'),
$c->query('Request'),
$c->query('CertificateManager'),
- $c->query('L10N')
+ $c->query('L10N'),
+ $c->query('IAppManager')
);
});
$container->registerService('GroupsController', function(IContainer $c) {
diff --git a/settings/controller/certificatecontroller.php b/settings/controller/certificatecontroller.php
index ea20b7c587f..92d0961efb7 100644
--- a/settings/controller/certificatecontroller.php
+++ b/settings/controller/certificatecontroller.php
@@ -21,6 +21,7 @@
namespace OC\Settings\Controller;
+use OCP\App\IAppManager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
@@ -36,20 +37,25 @@ class CertificateController extends Controller {
private $certificateManager;
/** @var IL10N */
private $l10n;
+ /** @var IAppManager */
+ private $appManager;
/**
* @param string $appName
* @param IRequest $request
* @param ICertificateManager $certificateManager
* @param IL10N $l10n
+ * @param IAppManager $appManager
*/
public function __construct($appName,
IRequest $request,
ICertificateManager $certificateManager,
- IL10N $l10n) {
+ IL10N $l10n,
+ IAppManager $appManager) {
parent::__construct($appName, $request);
$this->certificateManager = $certificateManager;
$this->l10n = $l10n;
+ $this->appManager = $appManager;
}
/**
@@ -60,6 +66,11 @@ class CertificateController extends Controller {
* @return array
*/
public function addPersonalRootCertificate() {
+
+ if ($this->isCertificateImportAllowed() === false) {
+ return new DataResponse('Individual certificate management disabled', Http::STATUS_FORBIDDEN);
+ }
+
$file = $this->request->getUploadedFile('rootcert_import');
if(empty($file)) {
return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY);
@@ -92,8 +103,29 @@ class CertificateController extends Controller {
* @return DataResponse
*/
public function removePersonalRootCertificate($certificateIdentifier) {
+
+ if ($this->isCertificateImportAllowed() === false) {
+ return new DataResponse('Individual certificate management disabled', Http::STATUS_FORBIDDEN);
+ }
+
$this->certificateManager->removeCertificate($certificateIdentifier);
return new DataResponse();
}
+ /**
+ * check if certificate import is allowed
+ *
+ * @return bool
+ */
+ protected function isCertificateImportAllowed() {
+ $externalStorageEnabled = $this->appManager->isEnabledForUser('files_external');
+ if ($externalStorageEnabled) {
+ $backends = \OC_Mount_Config::getPersonalBackends();
+ if (!empty($backends)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
diff --git a/settings/css/settings.css b/settings/css/settings.css
index e0fe9b446be..0af63821627 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -386,6 +386,12 @@ table.grid td.date{
display: inline-block;
}
+#encryptionAPI li {
+ list-style-type: initial;
+ margin-left: 20px;
+ padding: 5px 0;
+}
+
.mail_settings p label:first-child {
display: inline-block;
width: 300px;
diff --git a/settings/js/admin.js b/settings/js/admin.js
index 8f705b9048d..3e17d7cc182 100644
--- a/settings/js/admin.js
+++ b/settings/js/admin.js
@@ -85,6 +85,13 @@ $(document).ready(function(){
});
});
+ $('#shareapiExpireAfterNDays').change(function() {
+ var value = $(this).val();
+ if (value <= 0) {
+ $(this).val("1");
+ }
+ });
+
$('#shareAPI input:not(#excludedGroups)').change(function() {
var value = $(this).val();
if ($(this).attr('type') === 'checkbox') {
diff --git a/settings/js/personal.js b/settings/js/personal.js
index ac18f525809..9e4dd54090d 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -234,6 +234,20 @@ $(document).ready(function () {
var uploadparms = {
done: function (e, data) {
avatarResponseHandler(data.result);
+ },
+ fail: function (e, data){
+ var msg = data.jqXHR.statusText + ' (' + data.jqXHR.status + ')';
+ if (!_.isUndefined(data.jqXHR.responseJSON) &&
+ !_.isUndefined(data.jqXHR.responseJSON.data) &&
+ !_.isUndefined(data.jqXHR.responseJSON.data.message)
+ ) {
+ msg = data.jqXHR.responseJSON.data.message;
+ }
+ avatarResponseHandler({
+ data: {
+ message: t('settings', 'An error occurred: {message}', { message: msg })
+ }
+ });
}
};
@@ -247,7 +261,25 @@ $(document).ready(function () {
OC.dialogs.filepicker(
t('settings', "Select a profile picture"),
function (path) {
- $.post(OC.generateUrl('/avatar/'), {path: path}, avatarResponseHandler);
+ $.ajax({
+ type: "POST",
+ url: OC.generateUrl('/avatar/'),
+ data: { path: path }
+ }).done(avatarResponseHandler)
+ .fail(function(jqXHR, status){
+ var msg = jqXHR.statusText + ' (' + jqXHR.status + ')';
+ if (!_.isUndefined(jqXHR.responseJSON) &&
+ !_.isUndefined(jqXHR.responseJSON.data) &&
+ !_.isUndefined(jqXHR.responseJSON.data.message)
+ ) {
+ msg = jqXHR.responseJSON.data.message;
+ }
+ avatarResponseHandler({
+ data: {
+ message: t('settings', 'An error occurred: {message}', { message: msg })
+ }
+ });
+ });
},
false,
["image/png", "image/jpeg"]
diff --git a/settings/js/users/filter.js b/settings/js/users/filter.js
index 72f2cfc6d24..339d6ad5ec7 100644
--- a/settings/js/users/filter.js
+++ b/settings/js/users/filter.js
@@ -7,16 +7,13 @@
/**
* @brief this object takes care of the filter functionality on the user
* management page
- * @param jQuery input element that works as the user text input field
- * @param object the UserList object
+ * @param {UserList} userList the UserList object
+ * @param {GroupList} groupList the GroupList object
*/
-function UserManagementFilter(filterInput, userList, groupList) {
- this.filterInput = filterInput;
+function UserManagementFilter (userList, groupList) {
this.userList = userList;
this.groupList = groupList;
- this.filterGroups = false;
- this.thread = undefined;
- this.oldval = this.filterInput.val();
+ this.oldFilter = '';
this.init();
}
@@ -24,39 +21,23 @@ function UserManagementFilter(filterInput, userList, groupList) {
/**
* @brief sets up when the filter action shall be triggered
*/
-UserManagementFilter.prototype.init = function() {
- var umf = this;
- this.filterInput.keyup(function(e) {
- //we want to react on any printable letter, plus on modifying stuff like
- //Backspace and Delete. extended https://stackoverflow.com/a/12467610
- var valid =
- e.keyCode === 0 || e.keyCode === 8 || // like ö or ж; backspace
- e.keyCode === 9 || e.keyCode === 46 || // tab; delete
- e.keyCode === 32 || // space
- (e.keyCode > 47 && e.keyCode < 58) || // number keys
- (e.keyCode > 64 && e.keyCode < 91) || // letter keys
- (e.keyCode > 95 && e.keyCode < 112) || // numpad keys
- (e.keyCode > 185 && e.keyCode < 193) || // ;=,-./` (in order)
- (e.keyCode > 218 && e.keyCode < 223); // [\]' (in order)
-
- //besides the keys, the value must have been changed compared to last
- //time
- if(valid && umf.oldVal !== umf.getPattern()) {
- umf.run();
- }
-
- umf.oldVal = umf.getPattern();
- });
+UserManagementFilter.prototype.init = function () {
+ OC.Plugins.register('OCA.Search', this);
};
/**
* @brief the filter action needs to be done, here the accurate steps are being
* taken care of
*/
-UserManagementFilter.prototype.run = _.debounce(function() {
+UserManagementFilter.prototype.run = _.debounce(function (filter) {
+ if (filter === this.oldFilter) {
+ return;
+ }
+ this.oldFilter = filter;
+ this.userList.filter = filter;
this.userList.empty();
this.userList.update(GroupList.getCurrentGID());
- if(this.filterGroups) {
+ if (this.groupList.filterGroups) {
// user counts are being updated nevertheless
this.groupList.empty();
}
@@ -69,12 +50,12 @@ UserManagementFilter.prototype.run = _.debounce(function() {
* @brief returns the filter String
* @returns string
*/
-UserManagementFilter.prototype.getPattern = function() {
+UserManagementFilter.prototype.getPattern = function () {
var input = this.filterInput.val(),
html = $('html'),
isIE8or9 = html.hasClass('lte9');
// FIXME - TODO - once support for IE8 and IE9 is dropped
- if(isIE8or9 && input == this.filterInput.attr('placeholder')) {
+ if (isIE8or9 && input == this.filterInput.attr('placeholder')) {
input = '';
}
return input;
@@ -84,10 +65,14 @@ UserManagementFilter.prototype.getPattern = function() {
* @brief adds reset functionality to an HTML element
* @param jQuery the jQuery representation of that element
*/
-UserManagementFilter.prototype.addResetButton = function(button) {
+UserManagementFilter.prototype.addResetButton = function (button) {
var umf = this;
- button.click(function(){
+ button.click(function () {
umf.filterInput.val('');
umf.run();
});
};
+
+UserManagementFilter.prototype.attach = function (search) {
+ search.setFilter('settings', this.run.bind(this));
+};
diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js
index d205e915508..322db6c1b45 100644
--- a/settings/js/users/groups.js
+++ b/settings/js/users/groups.js
@@ -12,6 +12,8 @@ var GroupList;
GroupList = {
activeGID: '',
everyoneGID: '_everyone',
+ filter: '',
+ filterGroups: false,
addGroup: function (gid, usercount) {
var $li = $userGroupList.find('.isgroup:last-child').clone();
@@ -145,8 +147,8 @@ GroupList = {
$.get(
OC.generateUrl('/settings/users/groups'),
{
- pattern: filter.getPattern(),
- filterGroups: filter.filterGroups ? 1 : 0,
+ pattern: this.filter,
+ filterGroups: this.filterGroups ? 1 : 0,
sortGroups: $sortGroupBy
},
function (result) {
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index 5fd4e9d235b..6f29d6fe25b 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -8,13 +8,13 @@
var $userList;
var $userListBody;
-var filter;
var UserList = {
availableGroups: [],
offset: 0,
usersToLoad: 10, //So many users will be loaded when user scrolls down
currentGid: '',
+ filter: '',
/**
* Initializes the user list
@@ -229,7 +229,7 @@ var UserList = {
return aa.length - bb.length;
},
preSortSearchString: function(a, b) {
- var pattern = filter.getPattern();
+ var pattern = this.filter;
if(typeof pattern === 'undefined') {
return undefined;
}
@@ -398,7 +398,7 @@ var UserList = {
gid = '';
}
UserList.currentGid = gid;
- var pattern = filter.getPattern();
+ var pattern = this.filter;
$.get(
OC.generateUrl('/settings/users/users'),
{ offset: UserList.offset, limit: limit, gid: gid, pattern: pattern },
@@ -612,7 +612,7 @@ $(document).ready(function () {
UserList.initDeleteHandling();
// Implements User Search
- filter = new UserManagementFilter($('#usersearchform input'), UserList, GroupList);
+ OCA.Search.users= new UserManagementFilter(UserList, GroupList);
UserList.doSort();
UserList.availableGroups = $userList.data('groups');
@@ -880,4 +880,8 @@ $(document).ready(function () {
// trigger loading of users on startup
UserList.update(UserList.currentGid, initialUserCountLimit);
+ _.defer(function() {
+ $('#app-content').trigger($.Event('apprendered'));
+ });
+
});
diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js
index 111af05f050..a4e9705f3ac 100644
--- a/settings/l10n/ar.js
+++ b/settings/l10n/ar.js
@@ -95,7 +95,6 @@ OC.L10N.register(
"Upload new" : "رفع الان",
"Select new from Files" : "اختر جديد من الملفات ",
"Remove image" : "إزالة الصورة",
- "Either png or jpg. Ideally square but you will be able to crop it." : "سواء png او jpg. بامكانك قص الصورة ",
"Your avatar is provided by your original account." : "صورتك الرمزية يتم توفيرها عن طريق حسابك الاصلي.",
"Cancel" : "الغاء",
"Choose as profile image" : "اختر صورة الملف الشخصي",
diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json
index 1564605d7e0..1bd8a54f022 100644
--- a/settings/l10n/ar.json
+++ b/settings/l10n/ar.json
@@ -93,7 +93,6 @@
"Upload new" : "رفع الان",
"Select new from Files" : "اختر جديد من الملفات ",
"Remove image" : "إزالة الصورة",
- "Either png or jpg. Ideally square but you will be able to crop it." : "سواء png او jpg. بامكانك قص الصورة ",
"Your avatar is provided by your original account." : "صورتك الرمزية يتم توفيرها عن طريق حسابك الاصلي.",
"Cancel" : "الغاء",
"Choose as profile image" : "اختر صورة الملف الشخصي",
diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js
index 09b417233f5..af3beefd277 100644
--- a/settings/l10n/ast.js
+++ b/settings/l10n/ast.js
@@ -138,7 +138,6 @@ OC.L10N.register(
"Upload new" : "Xubir otra",
"Select new from Files" : "Esbillar otra dende Ficheros",
"Remove image" : "Desaniciar imaxe",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ficheru PNG o JPG. Preferiblemente cuadráu, pero vas poder retayalu.",
"Your avatar is provided by your original account." : "L'avatar ta proporcionáu pola to cuenta orixinal.",
"Cancel" : "Encaboxar",
"Choose as profile image" : "Esbillar como imaxe de perfil",
diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json
index a2f71a157b1..b78e4342d0d 100644
--- a/settings/l10n/ast.json
+++ b/settings/l10n/ast.json
@@ -136,7 +136,6 @@
"Upload new" : "Xubir otra",
"Select new from Files" : "Esbillar otra dende Ficheros",
"Remove image" : "Desaniciar imaxe",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ficheru PNG o JPG. Preferiblemente cuadráu, pero vas poder retayalu.",
"Your avatar is provided by your original account." : "L'avatar ta proporcionáu pola to cuenta orixinal.",
"Cancel" : "Encaboxar",
"Choose as profile image" : "Esbillar como imaxe de perfil",
diff --git a/settings/l10n/az.js b/settings/l10n/az.js
index 23805b8c88b..eb6dc71bc61 100644
--- a/settings/l10n/az.js
+++ b/settings/l10n/az.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Upload new" : "Yenisini yüklə",
"Select new from Files" : "Fayllardan yenisini seç",
"Remove image" : "Şəkili sil",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Həmçinin png yada jpg. İdealda sahədir ancaq, siz onu kəsə bilərsiniz.",
"Your avatar is provided by your original account." : "Sizin avatar sizin original hesab tərəfindən təqdim edilib.",
"Cancel" : "Dayandır",
"Choose as profile image" : "Profayl şəklini seçin",
diff --git a/settings/l10n/az.json b/settings/l10n/az.json
index 84ad2602e15..68ed9c3926a 100644
--- a/settings/l10n/az.json
+++ b/settings/l10n/az.json
@@ -189,7 +189,6 @@
"Upload new" : "Yenisini yüklə",
"Select new from Files" : "Fayllardan yenisini seç",
"Remove image" : "Şəkili sil",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Həmçinin png yada jpg. İdealda sahədir ancaq, siz onu kəsə bilərsiniz.",
"Your avatar is provided by your original account." : "Sizin avatar sizin original hesab tərəfindən təqdim edilib.",
"Cancel" : "Dayandır",
"Choose as profile image" : "Profayl şəklini seçin",
diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js
index 148fd9ba723..13ac183a120 100644
--- a/settings/l10n/bg_BG.js
+++ b/settings/l10n/bg_BG.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Upload new" : "Качи нов",
"Select new from Files" : "Избери нов от Файловете",
"Remove image" : "Премахни изображението",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Png или jpg. Най-добре в квадратни размери, но ще имаш възможност да го изрежеш.",
"Your avatar is provided by your original account." : "Твоят аватар е взет от оригиналния ти профил.",
"Cancel" : "Отказ",
"Choose as profile image" : "Избери като аватар",
diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json
index 3df09bddd72..639998e8410 100644
--- a/settings/l10n/bg_BG.json
+++ b/settings/l10n/bg_BG.json
@@ -189,7 +189,6 @@
"Upload new" : "Качи нов",
"Select new from Files" : "Избери нов от Файловете",
"Remove image" : "Премахни изображението",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Png или jpg. Най-добре в квадратни размери, но ще имаш възможност да го изрежеш.",
"Your avatar is provided by your original account." : "Твоят аватар е взет от оригиналния ти профил.",
"Cancel" : "Отказ",
"Choose as profile image" : "Избери като аватар",
diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js
index fd219c3a1c5..bcf27bd82fa 100644
--- a/settings/l10n/bs.js
+++ b/settings/l10n/bs.js
@@ -159,7 +159,6 @@ OC.L10N.register(
"Upload new" : "Učitaj novu",
"Select new from Files" : "Odaberi novu iz datoteka",
"Remove image" : "Ukloni sliku",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ili png ili jpg. Idealno bi bilo da je kvadratna, ali moći ćete je obrezati",
"Your avatar is provided by your original account." : "Vaš avatar je isporučen od strane vašeg izvornog računa.",
"Cancel" : "Odustani",
"Choose as profile image" : "Izaberi kao sliku profila",
diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json
index 776be894a47..5a8f070ad6a 100644
--- a/settings/l10n/bs.json
+++ b/settings/l10n/bs.json
@@ -157,7 +157,6 @@
"Upload new" : "Učitaj novu",
"Select new from Files" : "Odaberi novu iz datoteka",
"Remove image" : "Ukloni sliku",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ili png ili jpg. Idealno bi bilo da je kvadratna, ali moći ćete je obrezati",
"Your avatar is provided by your original account." : "Vaš avatar je isporučen od strane vašeg izvornog računa.",
"Cancel" : "Odustani",
"Choose as profile image" : "Izaberi kao sliku profila",
diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js
index 42d623fe264..23ea923f42e 100644
--- a/settings/l10n/ca.js
+++ b/settings/l10n/ca.js
@@ -3,14 +3,13 @@ OC.L10N.register(
{
"APCu" : "APCu",
"Redis" : "Redis",
- "Security & setup warnings" : "Seguretat i configuració de alertes",
+ "Security & setup warnings" : "Avisos de seguretat i configuració",
"Sharing" : "Compartir",
"Server-side encryption" : "Xifrat del costat del servidor",
"External Storage" : "Emmagatzemament extern",
"Cron" : "Cron",
"Email server" : "Servidor de correu electrònic",
"Log" : "Registre",
- "Server Status" : "Estat del servidor",
"Tips & tricks" : "Consells i trucs",
"Updates" : "Actualitzacions",
"Authentication error" : "Error d'autenticació",
@@ -215,7 +214,6 @@ OC.L10N.register(
"Upload new" : "Puja'n una de nova",
"Select new from Files" : "Selecciona'n una de nova dels fitxers",
"Remove image" : "Elimina imatge",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Pot ser png o jpg. Idealment quadrada, però podreu retallar-la.",
"Your avatar is provided by your original account." : "El vostre compte original proporciona l'avatar.",
"Cancel" : "Cancel·la",
"Choose as profile image" : "Selecciona com a imatge de perfil",
diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json
index cb172fa503a..1d6b383d1d2 100644
--- a/settings/l10n/ca.json
+++ b/settings/l10n/ca.json
@@ -1,14 +1,13 @@
{ "translations": {
"APCu" : "APCu",
"Redis" : "Redis",
- "Security & setup warnings" : "Seguretat i configuració de alertes",
+ "Security & setup warnings" : "Avisos de seguretat i configuració",
"Sharing" : "Compartir",
"Server-side encryption" : "Xifrat del costat del servidor",
"External Storage" : "Emmagatzemament extern",
"Cron" : "Cron",
"Email server" : "Servidor de correu electrònic",
"Log" : "Registre",
- "Server Status" : "Estat del servidor",
"Tips & tricks" : "Consells i trucs",
"Updates" : "Actualitzacions",
"Authentication error" : "Error d'autenticació",
@@ -213,7 +212,6 @@
"Upload new" : "Puja'n una de nova",
"Select new from Files" : "Selecciona'n una de nova dels fitxers",
"Remove image" : "Elimina imatge",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Pot ser png o jpg. Idealment quadrada, però podreu retallar-la.",
"Your avatar is provided by your original account." : "El vostre compte original proporciona l'avatar.",
"Cancel" : "Cancel·la",
"Choose as profile image" : "Selecciona com a imatge de perfil",
diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js
index 87ca48a0e9e..482c62b012d 100644
--- a/settings/l10n/cs_CZ.js
+++ b/settings/l10n/cs_CZ.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Emailový server",
"Log" : "Záznam",
- "Server Status" : "Stav serveru",
+ "Server status" : "Stav serveru",
"Tips & tricks" : "Tipy a triky",
"Updates" : "Aktualizace",
"Authentication error" : "Chyba přihlášení",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "Změna hesla se nezdařila",
"Enabled" : "Povoleno",
"Not enabled" : "Vypnuto",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "Instalovat a aktualizovat aplikace pomocí obchodu nebo Sdíleného Cloudového Úložiště",
"Federated Cloud Sharing" : "Propojené cloudové sdílení",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL používá zastaralou %s verzi (%s). Aktualizujte prosím svůj operační systém, jinak funkce jako %s nemusí spolehlivě pracovat.",
"A problem occurred, please check your log files (Error: %s)" : "Došlo k chybě, zkontrolujte prosím log (Chyba: %s)",
"Migration Completed" : "Migrace dokončena",
"Group already exists." : "Skupina již existuje.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "Probíhá odinstalace ...",
"Error while uninstalling app" : "Chyba při odinstalaci aplikace",
"Uninstall" : "Odinstalovat",
+ "An error occurred: {message}" : "Nastala chyba: {message}",
"Select a profile picture" : "Vyberte profilový obrázek",
"Very weak password" : "Velmi slabé heslo",
"Weak password" : "Slabé heslo",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "Více",
"Less" : "Méně",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Soubor logu je větší než 100 MB. Jeho stažení zabere nějaký čas!",
+ "Transactional File Locking is enabled." : "Transakční zamykání souboru je povoleno.",
+ "Transactional File Locking is disabled." : "Transakční zamykání souboru není povoleno.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Je použita databáze SQLite. Pro větší instalace doporučujeme přejít na robustnější databázi.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Obzvláště při používání klientské aplikace pro synchronizaci s desktopem není SQLite doporučeno.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Pro migraci na jinou databázi lze použít aplikaci pro příkazový řádek: 'occ db:convert-type', nebo nahlédněte do <a target=\"_blank\" href=\"%s\">dokumentace ↗</a>.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "Vylepšení souboru config.php",
"Theming" : "Vzhledy",
"Hardening and security guidance" : "Průvodce vylepšením bezpečnosti",
- "Transactional File Locking is enabled." : "Transakční zamykání souboru je povoleno.",
- "Transactional File Locking is disabled." : "Transakční zamykání souboru není povoleno.",
"Version" : "Verze",
"Developer documentation" : "Vývojářská dokumentace",
"Experimental applications ahead" : "Experimentální aplikace v pořadí",
@@ -236,7 +239,7 @@ OC.L10N.register(
"Upload new" : "Nahrát nový",
"Select new from Files" : "Vyberte nový ze souborů",
"Remove image" : "Odebrat obrázek",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png nebo jpg, nejlépe čtvercový, ale budete mít možnost jej oříznout.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Buď png nebo jpg. Nejlépe čtvercový, ale budete mít možnost jej oříznout. Soubor nesmí být větší než 20 MB.",
"Your avatar is provided by your original account." : "Váš avatar je poskytován Vaším původním účtem.",
"Cancel" : "Zrušit",
"Choose as profile image" : "Vybrat jako profilový obrázek",
diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json
index 523be1eaba6..630bf5e6353 100644
--- a/settings/l10n/cs_CZ.json
+++ b/settings/l10n/cs_CZ.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "Emailový server",
"Log" : "Záznam",
- "Server Status" : "Stav serveru",
+ "Server status" : "Stav serveru",
"Tips & tricks" : "Tipy a triky",
"Updates" : "Aktualizace",
"Authentication error" : "Chyba přihlášení",
@@ -29,7 +29,9 @@
"Unable to change password" : "Změna hesla se nezdařila",
"Enabled" : "Povoleno",
"Not enabled" : "Vypnuto",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "Instalovat a aktualizovat aplikace pomocí obchodu nebo Sdíleného Cloudového Úložiště",
"Federated Cloud Sharing" : "Propojené cloudové sdílení",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL používá zastaralou %s verzi (%s). Aktualizujte prosím svůj operační systém, jinak funkce jako %s nemusí spolehlivě pracovat.",
"A problem occurred, please check your log files (Error: %s)" : "Došlo k chybě, zkontrolujte prosím log (Chyba: %s)",
"Migration Completed" : "Migrace dokončena",
"Group already exists." : "Skupina již existuje.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "Probíhá odinstalace ...",
"Error while uninstalling app" : "Chyba při odinstalaci aplikace",
"Uninstall" : "Odinstalovat",
+ "An error occurred: {message}" : "Nastala chyba: {message}",
"Select a profile picture" : "Vyberte profilový obrázek",
"Very weak password" : "Velmi slabé heslo",
"Weak password" : "Slabé heslo",
@@ -176,6 +179,8 @@
"More" : "Více",
"Less" : "Méně",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Soubor logu je větší než 100 MB. Jeho stažení zabere nějaký čas!",
+ "Transactional File Locking is enabled." : "Transakční zamykání souboru je povoleno.",
+ "Transactional File Locking is disabled." : "Transakční zamykání souboru není povoleno.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Je použita databáze SQLite. Pro větší instalace doporučujeme přejít na robustnější databázi.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Obzvláště při používání klientské aplikace pro synchronizaci s desktopem není SQLite doporučeno.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Pro migraci na jinou databázi lze použít aplikaci pro příkazový řádek: 'occ db:convert-type', nebo nahlédněte do <a target=\"_blank\" href=\"%s\">dokumentace ↗</a>.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "Vylepšení souboru config.php",
"Theming" : "Vzhledy",
"Hardening and security guidance" : "Průvodce vylepšením bezpečnosti",
- "Transactional File Locking is enabled." : "Transakční zamykání souboru je povoleno.",
- "Transactional File Locking is disabled." : "Transakční zamykání souboru není povoleno.",
"Version" : "Verze",
"Developer documentation" : "Vývojářská dokumentace",
"Experimental applications ahead" : "Experimentální aplikace v pořadí",
@@ -234,7 +237,7 @@
"Upload new" : "Nahrát nový",
"Select new from Files" : "Vyberte nový ze souborů",
"Remove image" : "Odebrat obrázek",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png nebo jpg, nejlépe čtvercový, ale budete mít možnost jej oříznout.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Buď png nebo jpg. Nejlépe čtvercový, ale budete mít možnost jej oříznout. Soubor nesmí být větší než 20 MB.",
"Your avatar is provided by your original account." : "Váš avatar je poskytován Vaším původním účtem.",
"Cancel" : "Zrušit",
"Choose as profile image" : "Vybrat jako profilový obrázek",
diff --git a/settings/l10n/da.js b/settings/l10n/da.js
index 27d146c46d6..8aa7e3f7b59 100644
--- a/settings/l10n/da.js
+++ b/settings/l10n/da.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-mailserver",
"Log" : "Log",
- "Server Status" : "Serverstatus",
+ "Server status" : "ServerStatus",
"Tips & tricks" : "Tips & tricks",
"Updates" : "Opdateringer",
"Authentication error" : "Adgangsfejl",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "Kunne ikke ændre kodeord",
"Enabled" : "Aktiveret",
"Not enabled" : "Slået fra",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "installation og opdatering af apps via app-butikken eller Federated Cloud Sharing",
"Federated Cloud Sharing" : "Sammensluttet Cloud deling",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL bruger en forældet %s version (%s). Husk at opdatere dit styresystem ellers vil funktioner såsom %s ikke fungere pålideligt.",
"A problem occurred, please check your log files (Error: %s)" : "Der opstod en fejl - tjek venligst dine logfiler (fejl: %s)",
"Migration Completed" : "Overflytning blev fuldført",
"Group already exists." : "Gruppen findes allerede.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "Afinstallerer...",
"Error while uninstalling app" : "Fejl under afinstallering af app",
"Uninstall" : "Afinstallér",
+ "An error occurred: {message}" : "En fejl opstod:{message}",
"Select a profile picture" : "Vælg et profilbillede",
"Very weak password" : "Meget svagt kodeord",
"Weak password" : "Svagt kodeord",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "Mere",
"Less" : "Mindre",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen er større end 100 MB. Det kan tage en del tid at hente den!",
+ "Transactional File Locking is enabled." : "Transaktionel fillåsning er slået til.",
+ "Transactional File Locking is disabled." : "Transaktionel fillåsning er slået fra.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite bruges som database. Til større installationer anbefaler vi at skifte til en anden database-backend.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Brug af SQLite frarådes især når skrivebordsklienten anvendes til filsynkronisering.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For at migrere til en anden database, så brug kommandolinjeværktøjet: \"occ db:convert-type\" eller se <a target=\"_blank\" href=\"%s\">dokumentationen ↗</a>.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "Forbedring af config.php",
"Theming" : "Temaer",
"Hardening and security guidance" : "Modstanddygtighed og sikkerheds vejledning",
- "Transactional File Locking is enabled." : "Transaktionel fillåsning er slået til.",
- "Transactional File Locking is disabled." : "Transaktionel fillåsning er slået fra.",
"Version" : "Version",
"Developer documentation" : "Dokumentation for udviklere",
"Experimental applications ahead" : "Kommende eksperimentale programmer",
@@ -236,7 +239,6 @@ OC.L10N.register(
"Upload new" : "Upload nyt",
"Select new from Files" : "Vælg nyt fra Filer",
"Remove image" : "Fjern billede",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Enten png eller jpg. Ideelt kvadratisk men du har mulighed for at beskære det. ",
"Your avatar is provided by your original account." : "Din avatar kommer fra din oprindelige konto.",
"Cancel" : "Annuller",
"Choose as profile image" : "Vælg som profilbillede",
diff --git a/settings/l10n/da.json b/settings/l10n/da.json
index 9b343d50b28..eef597ae56f 100644
--- a/settings/l10n/da.json
+++ b/settings/l10n/da.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "E-mailserver",
"Log" : "Log",
- "Server Status" : "Serverstatus",
+ "Server status" : "ServerStatus",
"Tips & tricks" : "Tips & tricks",
"Updates" : "Opdateringer",
"Authentication error" : "Adgangsfejl",
@@ -29,7 +29,9 @@
"Unable to change password" : "Kunne ikke ændre kodeord",
"Enabled" : "Aktiveret",
"Not enabled" : "Slået fra",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "installation og opdatering af apps via app-butikken eller Federated Cloud Sharing",
"Federated Cloud Sharing" : "Sammensluttet Cloud deling",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL bruger en forældet %s version (%s). Husk at opdatere dit styresystem ellers vil funktioner såsom %s ikke fungere pålideligt.",
"A problem occurred, please check your log files (Error: %s)" : "Der opstod en fejl - tjek venligst dine logfiler (fejl: %s)",
"Migration Completed" : "Overflytning blev fuldført",
"Group already exists." : "Gruppen findes allerede.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "Afinstallerer...",
"Error while uninstalling app" : "Fejl under afinstallering af app",
"Uninstall" : "Afinstallér",
+ "An error occurred: {message}" : "En fejl opstod:{message}",
"Select a profile picture" : "Vælg et profilbillede",
"Very weak password" : "Meget svagt kodeord",
"Weak password" : "Svagt kodeord",
@@ -176,6 +179,8 @@
"More" : "Mere",
"Less" : "Mindre",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Logfilen er større end 100 MB. Det kan tage en del tid at hente den!",
+ "Transactional File Locking is enabled." : "Transaktionel fillåsning er slået til.",
+ "Transactional File Locking is disabled." : "Transaktionel fillåsning er slået fra.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite bruges som database. Til større installationer anbefaler vi at skifte til en anden database-backend.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Brug af SQLite frarådes især når skrivebordsklienten anvendes til filsynkronisering.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For at migrere til en anden database, så brug kommandolinjeværktøjet: \"occ db:convert-type\" eller se <a target=\"_blank\" href=\"%s\">dokumentationen ↗</a>.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "Forbedring af config.php",
"Theming" : "Temaer",
"Hardening and security guidance" : "Modstanddygtighed og sikkerheds vejledning",
- "Transactional File Locking is enabled." : "Transaktionel fillåsning er slået til.",
- "Transactional File Locking is disabled." : "Transaktionel fillåsning er slået fra.",
"Version" : "Version",
"Developer documentation" : "Dokumentation for udviklere",
"Experimental applications ahead" : "Kommende eksperimentale programmer",
@@ -234,7 +237,6 @@
"Upload new" : "Upload nyt",
"Select new from Files" : "Vælg nyt fra Filer",
"Remove image" : "Fjern billede",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Enten png eller jpg. Ideelt kvadratisk men du har mulighed for at beskære det. ",
"Your avatar is provided by your original account." : "Din avatar kommer fra din oprindelige konto.",
"Cancel" : "Annuller",
"Choose as profile image" : "Vælg som profilbillede",
diff --git a/settings/l10n/de.js b/settings/l10n/de.js
index 4d3d3e09b74..2f0127cf578 100644
--- a/settings/l10n/de.js
+++ b/settings/l10n/de.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-Mail-Server",
"Log" : "Log",
- "Server Status" : "Serverstatus",
"Tips & tricks" : "Tipps & Tricks",
"Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Mehr",
"Less" : "Weniger",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Die Logdatei ist größer als 100 MB. Es kann etwas Zeit beanspruchen, sie herunterzuladen!",
+ "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
+ "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die <a target=\"_blank\" href=\"%s\">Dokumentation ↗</a> schauen.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Die config.php optimieren",
"Theming" : "Themes verwenden",
"Hardening and security guidance" : "Systemhärtung und Sicherheitsempfehlungen",
- "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
- "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"Version" : "Version",
"Developer documentation" : "Dokumentation für Entwickler",
"Experimental applications ahead" : "Experimentelle Apps nachfolgend",
@@ -236,7 +235,6 @@ OC.L10N.register(
"Upload new" : "Neues hochladen",
"Select new from Files" : "Neues aus den Dateien wählen",
"Remove image" : "Bild entfernen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Entweder PNG oder JPG. Im Idealfall quadratisch, Du kannst es aber beschneiden.",
"Your avatar is provided by your original account." : "Dein Avatar wird von Deinem ursprünglichen Konto bereitgestellt.",
"Cancel" : "Abbrechen",
"Choose as profile image" : "Als Profilbild wählen",
diff --git a/settings/l10n/de.json b/settings/l10n/de.json
index e1bfd5ae679..5850b609eab 100644
--- a/settings/l10n/de.json
+++ b/settings/l10n/de.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "E-Mail-Server",
"Log" : "Log",
- "Server Status" : "Serverstatus",
"Tips & tricks" : "Tipps & Tricks",
"Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
@@ -176,6 +175,8 @@
"More" : "Mehr",
"Less" : "Weniger",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Die Logdatei ist größer als 100 MB. Es kann etwas Zeit beanspruchen, sie herunterzuladen!",
+ "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
+ "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die <a target=\"_blank\" href=\"%s\">Dokumentation ↗</a> schauen.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Die config.php optimieren",
"Theming" : "Themes verwenden",
"Hardening and security guidance" : "Systemhärtung und Sicherheitsempfehlungen",
- "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
- "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"Version" : "Version",
"Developer documentation" : "Dokumentation für Entwickler",
"Experimental applications ahead" : "Experimentelle Apps nachfolgend",
@@ -234,7 +233,6 @@
"Upload new" : "Neues hochladen",
"Select new from Files" : "Neues aus den Dateien wählen",
"Remove image" : "Bild entfernen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Entweder PNG oder JPG. Im Idealfall quadratisch, Du kannst es aber beschneiden.",
"Your avatar is provided by your original account." : "Dein Avatar wird von Deinem ursprünglichen Konto bereitgestellt.",
"Cancel" : "Abbrechen",
"Choose as profile image" : "Als Profilbild wählen",
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index aa2d887a914..3c28e3cb52f 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-Mail-Server",
"Log" : "Log",
- "Server Status" : "Serverstatus",
"Tips & tricks" : "Tipps & Tricks",
"Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Mehr",
"Less" : "Weniger",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Die Logdatei ist größer als 100 MB. Es kann etwas Zeit beanspruchen, sie herunterzuladen!",
+ "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
+ "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Um auf eine andere Datenbank zu migrieren, benutzen Sie bitte die Kommandozeile: „occ db:convert-type“ oder konsultieren Sie die <a target=\"_blank\" href=\"%s\">Dokumentation ↗</a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Die config.php optimieren",
"Theming" : "Themes verwenden",
"Hardening and security guidance" : "Systemhärtung und Sicherheitsempfehlungen",
- "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
- "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"Version" : "Version",
"Developer documentation" : "Dokumentation für Entwickler",
"Experimental applications ahead" : "Experimentelle Apps nachfolgend",
@@ -236,7 +235,6 @@ OC.L10N.register(
"Upload new" : "Neues hochladen",
"Select new from Files" : "Neues aus Dateien wählen",
"Remove image" : "Bild entfernen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Entweder PNG oder JPG. Im Idealfall quadratisch, Sie können es aber beschneiden.",
"Your avatar is provided by your original account." : "Ihr Avatar wird von Ihrem Ursprungskonto verwendet.",
"Cancel" : "Abbrechen",
"Choose as profile image" : "Als Profilbild wählen",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index e064a689a4a..e912d745253 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "E-Mail-Server",
"Log" : "Log",
- "Server Status" : "Serverstatus",
"Tips & tricks" : "Tipps & Tricks",
"Updates" : "Updates",
"Authentication error" : "Authentifizierungsfehler",
@@ -176,6 +175,8 @@
"More" : "Mehr",
"Less" : "Weniger",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Die Logdatei ist größer als 100 MB. Es kann etwas Zeit beanspruchen, sie herunterzuladen!",
+ "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
+ "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Um auf eine andere Datenbank zu migrieren, benutzen Sie bitte die Kommandozeile: „occ db:convert-type“ oder konsultieren Sie die <a target=\"_blank\" href=\"%s\">Dokumentation ↗</a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Die config.php optimieren",
"Theming" : "Themes verwenden",
"Hardening and security guidance" : "Systemhärtung und Sicherheitsempfehlungen",
- "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.",
- "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.",
"Version" : "Version",
"Developer documentation" : "Dokumentation für Entwickler",
"Experimental applications ahead" : "Experimentelle Apps nachfolgend",
@@ -234,7 +233,6 @@
"Upload new" : "Neues hochladen",
"Select new from Files" : "Neues aus Dateien wählen",
"Remove image" : "Bild entfernen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Entweder PNG oder JPG. Im Idealfall quadratisch, Sie können es aber beschneiden.",
"Your avatar is provided by your original account." : "Ihr Avatar wird von Ihrem Ursprungskonto verwendet.",
"Cancel" : "Abbrechen",
"Choose as profile image" : "Als Profilbild wählen",
diff --git a/settings/l10n/el.js b/settings/l10n/el.js
index cb425992190..9c7cf9afd4b 100644
--- a/settings/l10n/el.js
+++ b/settings/l10n/el.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Διακομιστής Email",
"Log" : "Καταγραφές",
- "Server Status" : "Κατάσταση διακομιστή",
"Tips & tricks" : "Συμβουλές & τεχνάσματα",
"Updates" : "Ενημερώσεις",
"Authentication error" : "Σφάλμα πιστοποίησης",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Περισσότερα",
"Less" : "Λιγότερα",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Το αρχείο ιστορικού είναι μεγαλύτερο από 100ΜΒ. Η λήψη του ίσως πάρει λίγη ώρα!",
+ "Transactional File Locking is enabled." : "Το μεταβατικό κλείδωμα αρχείων είναι ενεργοποιημένο.",
+ "Transactional File Locking is disabled." : "Το μεταβατικό κλείδωμα αρχείων είναι απενεργοποιημένο.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Ως βάση δεδομένων χρησιμοποιείται η SQLite. Για μεγαλύτερες εγκαταστάσεις συνιστούμε να επιλέξετε ένα διαφορετικό σύστημα υποστήριξης βάσης δεδομένων.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Για να μετακινηθείτε σε άλλη βάση δεδομένων χρησιμοποιήσετε το εργαλείο στη γραμμή εντολών:'occ db:convert-type', ή ανατρέξτε <a target=\"_blank\" href=\"%s\"> στις οδηγίες ↗ </a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Βελτίωση του config.php",
"Theming" : "Θέματα",
"Hardening and security guidance" : "Οδηγίες ασφάλειας και θωράκισης",
- "Transactional File Locking is enabled." : "Το μεταβατικό κλείδωμα αρχείων είναι ενεργοποιημένο.",
- "Transactional File Locking is disabled." : "Το μεταβατικό κλείδωμα αρχείων είναι απενεργοποιημένο.",
"Version" : "Έκδοση",
"Developer documentation" : "Τεκμηρίωση προγραμματιστή",
"Experimental applications ahead" : "Πειραματικές εφαρμογές",
@@ -235,7 +234,6 @@ OC.L10N.register(
"Upload new" : "Μεταφόρτωση νέου",
"Select new from Files" : "Επιλογή νέου από τα Αρχεία",
"Remove image" : "Αφαίρεση εικόνας",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Είτε png ή jpg. Ιδανικά τετράγωνη αλλά θα είστε σε θέση να την περικόψετε.",
"Your avatar is provided by your original account." : "Το άβατάρ σας παρέχεται από τον αρχικό σας λογαριασμό.",
"Cancel" : "Άκυρο",
"Choose as profile image" : "Επιλογή εικόνας προφίλ",
diff --git a/settings/l10n/el.json b/settings/l10n/el.json
index 962d6f3f60b..5c08bef36d0 100644
--- a/settings/l10n/el.json
+++ b/settings/l10n/el.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "Διακομιστής Email",
"Log" : "Καταγραφές",
- "Server Status" : "Κατάσταση διακομιστή",
"Tips & tricks" : "Συμβουλές & τεχνάσματα",
"Updates" : "Ενημερώσεις",
"Authentication error" : "Σφάλμα πιστοποίησης",
@@ -176,6 +175,8 @@
"More" : "Περισσότερα",
"Less" : "Λιγότερα",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Το αρχείο ιστορικού είναι μεγαλύτερο από 100ΜΒ. Η λήψη του ίσως πάρει λίγη ώρα!",
+ "Transactional File Locking is enabled." : "Το μεταβατικό κλείδωμα αρχείων είναι ενεργοποιημένο.",
+ "Transactional File Locking is disabled." : "Το μεταβατικό κλείδωμα αρχείων είναι απενεργοποιημένο.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Ως βάση δεδομένων χρησιμοποιείται η SQLite. Για μεγαλύτερες εγκαταστάσεις συνιστούμε να επιλέξετε ένα διαφορετικό σύστημα υποστήριξης βάσης δεδομένων.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Για να μετακινηθείτε σε άλλη βάση δεδομένων χρησιμοποιήσετε το εργαλείο στη γραμμή εντολών:'occ db:convert-type', ή ανατρέξτε <a target=\"_blank\" href=\"%s\"> στις οδηγίες ↗ </a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Βελτίωση του config.php",
"Theming" : "Θέματα",
"Hardening and security guidance" : "Οδηγίες ασφάλειας και θωράκισης",
- "Transactional File Locking is enabled." : "Το μεταβατικό κλείδωμα αρχείων είναι ενεργοποιημένο.",
- "Transactional File Locking is disabled." : "Το μεταβατικό κλείδωμα αρχείων είναι απενεργοποιημένο.",
"Version" : "Έκδοση",
"Developer documentation" : "Τεκμηρίωση προγραμματιστή",
"Experimental applications ahead" : "Πειραματικές εφαρμογές",
@@ -233,7 +232,6 @@
"Upload new" : "Μεταφόρτωση νέου",
"Select new from Files" : "Επιλογή νέου από τα Αρχεία",
"Remove image" : "Αφαίρεση εικόνας",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Είτε png ή jpg. Ιδανικά τετράγωνη αλλά θα είστε σε θέση να την περικόψετε.",
"Your avatar is provided by your original account." : "Το άβατάρ σας παρέχεται από τον αρχικό σας λογαριασμό.",
"Cancel" : "Άκυρο",
"Choose as profile image" : "Επιλογή εικόνας προφίλ",
diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js
index da437fa2a25..a64b8a8bd0a 100644
--- a/settings/l10n/en_GB.js
+++ b/settings/l10n/en_GB.js
@@ -8,7 +8,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Email server",
"Log" : "Log",
- "Server Status" : "Server Status",
"Tips & tricks" : "Tips & tricks",
"Updates" : "Updates",
"Authentication error" : "Authentication error",
@@ -229,7 +228,6 @@ OC.L10N.register(
"Upload new" : "Upload new",
"Select new from Files" : "Select new from Files",
"Remove image" : "Remove image",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Either png or jpg. Ideally square but you will be able to crop it.",
"Your avatar is provided by your original account." : "Your avatar is provided by your original account.",
"Cancel" : "Cancel",
"Choose as profile image" : "Choose as profile image",
diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json
index 6983ecaac1c..ca340dce2ee 100644
--- a/settings/l10n/en_GB.json
+++ b/settings/l10n/en_GB.json
@@ -6,7 +6,6 @@
"Cron" : "Cron",
"Email server" : "Email server",
"Log" : "Log",
- "Server Status" : "Server Status",
"Tips & tricks" : "Tips & tricks",
"Updates" : "Updates",
"Authentication error" : "Authentication error",
@@ -227,7 +226,6 @@
"Upload new" : "Upload new",
"Select new from Files" : "Select new from Files",
"Remove image" : "Remove image",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Either png or jpg. Ideally square but you will be able to crop it.",
"Your avatar is provided by your original account." : "Your avatar is provided by your original account.",
"Cancel" : "Cancel",
"Choose as profile image" : "Choose as profile image",
diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js
index 4feb4c4b835..196fcff74d2 100644
--- a/settings/l10n/eo.js
+++ b/settings/l10n/eo.js
@@ -101,7 +101,6 @@ OC.L10N.register(
"Upload new" : "Alŝuti novan",
"Select new from Files" : "Elekti novan el dosieroj",
"Remove image" : "Forigi bildon",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Aŭ PNG aŭ JPG. Prefere ĝi kvadratu, sed vi povos stuci ĝin.",
"Cancel" : "Nuligi",
"Choose as profile image" : "Elekti kiel profilan bildon",
"Language" : "Lingvo",
diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json
index d0e71295ff0..791dca9b499 100644
--- a/settings/l10n/eo.json
+++ b/settings/l10n/eo.json
@@ -99,7 +99,6 @@
"Upload new" : "Alŝuti novan",
"Select new from Files" : "Elekti novan el dosieroj",
"Remove image" : "Forigi bildon",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Aŭ PNG aŭ JPG. Prefere ĝi kvadratu, sed vi povos stuci ĝin.",
"Cancel" : "Nuligi",
"Choose as profile image" : "Elekti kiel profilan bildon",
"Language" : "Lingvo",
diff --git a/settings/l10n/es.js b/settings/l10n/es.js
index f6ad23bfe92..e8836f169c9 100644
--- a/settings/l10n/es.js
+++ b/settings/l10n/es.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Servidor de correo electrónico",
"Log" : "Registro",
- "Server Status" : "Estado del servidor",
+ "Server status" : "Estado del servidor",
"Tips & tricks" : "Sugerencias y trucos",
"Updates" : "Actualizaciones",
"Authentication error" : "Error de autenticación",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "No se ha podido cambiar la contraseña",
"Enabled" : "Habilitado",
"Not enabled" : "No habilitado",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando y actualizando aplicaciones via app store o Nube compartida Federada",
"Federated Cloud Sharing" : "Compartido en Cloud Federado",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está usando una versión desactualizada %s (%s). Por favor, actualice su sistema operativo o funciones tales como %s no funcionará de forma fiable.",
"A problem occurred, please check your log files (Error: %s)" : "Ocurrió un problema, por favor verifique los archivos de registro (Error: %s)",
"Migration Completed" : "Migración finalizada",
"Group already exists." : "El grupo ya existe.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "Desinstalando...",
"Error while uninstalling app" : "Error al desinstalar la aplicación",
"Uninstall" : "Desinstalar",
+ "An error occurred: {message}" : "Ocurrió un error: {message}",
"Select a profile picture" : "Seleccionar una imagen de perfil",
"Very weak password" : "Contraseña muy débil",
"Weak password" : "Contraseña débil",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "Más",
"Less" : "Menos",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "El archivo de registro es mayor de 100 MB. Descargarlo puede tardar.",
+ "Transactional File Locking is enabled." : "Bloqueo de archivos transaccional está habilitado.",
+ "Transactional File Locking is disabled." : "Bloqueo de archivos transaccional está deshabilitado.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Se utiliza SQLite como base de datos. Para instalaciones mas grandes se recomiende cambiar a otro sistema de base de datos. ",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "El uso de SQLite está desaconsejado especialmente cuando se usa el cliente de escritorio para sincronizar los ficheros.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar a otra base de datos use la herramienta de línea de comandos: 'occ db:convert-type', o consulte la <a target=\"_blank\" href=\"%s\">documentación ↗</a>.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "Mejorar el config.php",
"Theming" : "Personalizar el tema",
"Hardening and security guidance" : "Guía de protección y seguridad",
- "Transactional File Locking is enabled." : "Bloqueo de archivos transaccional está habilitado.",
- "Transactional File Locking is disabled." : "Bloqueo de archivos transaccional está deshabilitado.",
"Version" : "Versión",
"Developer documentation" : "Documentación de desarrollador",
"Experimental applications ahead" : "Aplicaciones experimentales más adelante",
@@ -236,7 +239,7 @@ OC.L10N.register(
"Upload new" : "Subir otra",
"Select new from Files" : "Seleccionar otra desde Archivos",
"Remove image" : "Borrar imagen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Archivo PNG o JPG. Preferiblemente cuadrado, pero tendrás la posibilidad de recortarlo.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Sea en png o jpg. Preferiblemente que su forma sea cuadrada, pero tendrá la posibilidad de recortarlo. El archivo no puede exceder los 20 MB.",
"Your avatar is provided by your original account." : "Su avatar es proporcionado por su cuenta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Seleccionar como imagen de perfil",
diff --git a/settings/l10n/es.json b/settings/l10n/es.json
index 79139bc4cbd..69573d70a10 100644
--- a/settings/l10n/es.json
+++ b/settings/l10n/es.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "Servidor de correo electrónico",
"Log" : "Registro",
- "Server Status" : "Estado del servidor",
+ "Server status" : "Estado del servidor",
"Tips & tricks" : "Sugerencias y trucos",
"Updates" : "Actualizaciones",
"Authentication error" : "Error de autenticación",
@@ -29,7 +29,9 @@
"Unable to change password" : "No se ha podido cambiar la contraseña",
"Enabled" : "Habilitado",
"Not enabled" : "No habilitado",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando y actualizando aplicaciones via app store o Nube compartida Federada",
"Federated Cloud Sharing" : "Compartido en Cloud Federado",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está usando una versión desactualizada %s (%s). Por favor, actualice su sistema operativo o funciones tales como %s no funcionará de forma fiable.",
"A problem occurred, please check your log files (Error: %s)" : "Ocurrió un problema, por favor verifique los archivos de registro (Error: %s)",
"Migration Completed" : "Migración finalizada",
"Group already exists." : "El grupo ya existe.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "Desinstalando...",
"Error while uninstalling app" : "Error al desinstalar la aplicación",
"Uninstall" : "Desinstalar",
+ "An error occurred: {message}" : "Ocurrió un error: {message}",
"Select a profile picture" : "Seleccionar una imagen de perfil",
"Very weak password" : "Contraseña muy débil",
"Weak password" : "Contraseña débil",
@@ -176,6 +179,8 @@
"More" : "Más",
"Less" : "Menos",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "El archivo de registro es mayor de 100 MB. Descargarlo puede tardar.",
+ "Transactional File Locking is enabled." : "Bloqueo de archivos transaccional está habilitado.",
+ "Transactional File Locking is disabled." : "Bloqueo de archivos transaccional está deshabilitado.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Se utiliza SQLite como base de datos. Para instalaciones mas grandes se recomiende cambiar a otro sistema de base de datos. ",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "El uso de SQLite está desaconsejado especialmente cuando se usa el cliente de escritorio para sincronizar los ficheros.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar a otra base de datos use la herramienta de línea de comandos: 'occ db:convert-type', o consulte la <a target=\"_blank\" href=\"%s\">documentación ↗</a>.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "Mejorar el config.php",
"Theming" : "Personalizar el tema",
"Hardening and security guidance" : "Guía de protección y seguridad",
- "Transactional File Locking is enabled." : "Bloqueo de archivos transaccional está habilitado.",
- "Transactional File Locking is disabled." : "Bloqueo de archivos transaccional está deshabilitado.",
"Version" : "Versión",
"Developer documentation" : "Documentación de desarrollador",
"Experimental applications ahead" : "Aplicaciones experimentales más adelante",
@@ -234,7 +237,7 @@
"Upload new" : "Subir otra",
"Select new from Files" : "Seleccionar otra desde Archivos",
"Remove image" : "Borrar imagen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Archivo PNG o JPG. Preferiblemente cuadrado, pero tendrás la posibilidad de recortarlo.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Sea en png o jpg. Preferiblemente que su forma sea cuadrada, pero tendrá la posibilidad de recortarlo. El archivo no puede exceder los 20 MB.",
"Your avatar is provided by your original account." : "Su avatar es proporcionado por su cuenta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Seleccionar como imagen de perfil",
diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js
index dbcf81e88ce..fa4a506fab0 100644
--- a/settings/l10n/es_AR.js
+++ b/settings/l10n/es_AR.js
@@ -108,7 +108,6 @@ OC.L10N.register(
"Upload new" : "Subir nuevo",
"Select new from Files" : "Seleccionar nuevo desde archivos",
"Remove image" : "Remover imagen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Sólo png o jpg. Lo ideal que sea cuadrada sino luego podrás recortarlo.",
"Your avatar is provided by your original account." : "Su avatar es proveído por su cuenta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Elegir como imagen de perfil",
diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json
index 45249889091..e8098e575c5 100644
--- a/settings/l10n/es_AR.json
+++ b/settings/l10n/es_AR.json
@@ -106,7 +106,6 @@
"Upload new" : "Subir nuevo",
"Select new from Files" : "Seleccionar nuevo desde archivos",
"Remove image" : "Remover imagen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Sólo png o jpg. Lo ideal que sea cuadrada sino luego podrás recortarlo.",
"Your avatar is provided by your original account." : "Su avatar es proveído por su cuenta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Elegir como imagen de perfil",
diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js
index 29b7706b6f2..0453a78f842 100644
--- a/settings/l10n/es_MX.js
+++ b/settings/l10n/es_MX.js
@@ -80,7 +80,6 @@ OC.L10N.register(
"Upload new" : "Subir otra",
"Select new from Files" : "Seleccionar otra desde Archivos",
"Remove image" : "Borrar imagen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Archivo PNG o JPG. Preferiblemente cuadrado, pero tendrás la posibilidad de recortarlo.",
"Your avatar is provided by your original account." : "Su avatar es proporcionado por su cuenta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Seleccionar como imagen de perfil",
diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json
index 6e163f2c629..5bba876327a 100644
--- a/settings/l10n/es_MX.json
+++ b/settings/l10n/es_MX.json
@@ -78,7 +78,6 @@
"Upload new" : "Subir otra",
"Select new from Files" : "Seleccionar otra desde Archivos",
"Remove image" : "Borrar imagen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Archivo PNG o JPG. Preferiblemente cuadrado, pero tendrás la posibilidad de recortarlo.",
"Your avatar is provided by your original account." : "Su avatar es proporcionado por su cuenta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Seleccionar como imagen de perfil",
diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js
index 8ff9a761956..f150878c1a2 100644
--- a/settings/l10n/et_EE.js
+++ b/settings/l10n/et_EE.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-kirjade server",
"Log" : "Logi",
- "Server Status" : "Serveri olek",
"Tips & tricks" : "Nõuanded ja trikid",
"Updates" : "Uuendused",
"Authentication error" : "Autentimise viga",
@@ -198,7 +197,6 @@ OC.L10N.register(
"Upload new" : "Laadi uus üles",
"Select new from Files" : "Vali failidest uus",
"Remove image" : "Eemalda pilt",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Kas png või jpg. Võimalikult ruudukujuline, kuid sul on võimalus seda veel lõigata.",
"Your avatar is provided by your original account." : "Sinu avatari pakub sinu algne konto.",
"Cancel" : "Loobu",
"Choose as profile image" : "Vali profiilipildiks",
diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json
index 7281a11573c..91badcd9fef 100644
--- a/settings/l10n/et_EE.json
+++ b/settings/l10n/et_EE.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "E-kirjade server",
"Log" : "Logi",
- "Server Status" : "Serveri olek",
"Tips & tricks" : "Nõuanded ja trikid",
"Updates" : "Uuendused",
"Authentication error" : "Autentimise viga",
@@ -196,7 +195,6 @@
"Upload new" : "Laadi uus üles",
"Select new from Files" : "Vali failidest uus",
"Remove image" : "Eemalda pilt",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Kas png või jpg. Võimalikult ruudukujuline, kuid sul on võimalus seda veel lõigata.",
"Your avatar is provided by your original account." : "Sinu avatari pakub sinu algne konto.",
"Cancel" : "Loobu",
"Choose as profile image" : "Vali profiilipildiks",
diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js
index 94ea7e6312a..9075fe73299 100644
--- a/settings/l10n/eu.js
+++ b/settings/l10n/eu.js
@@ -169,7 +169,6 @@ OC.L10N.register(
"Upload new" : "Igo berria",
"Select new from Files" : "Hautatu berria Fitxategietatik",
"Remove image" : "Irudia ezabatu",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png edo jpg. Hobe karratua baina mozteko aukera izango duzu.",
"Your avatar is provided by your original account." : "Zure jatorrizko kontuak ezarri du zure avatar.",
"Cancel" : "Ezeztatu",
"Choose as profile image" : "Profil irudi bezala aukeratu",
diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json
index ce14381a46c..631adb886cb 100644
--- a/settings/l10n/eu.json
+++ b/settings/l10n/eu.json
@@ -167,7 +167,6 @@
"Upload new" : "Igo berria",
"Select new from Files" : "Hautatu berria Fitxategietatik",
"Remove image" : "Irudia ezabatu",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png edo jpg. Hobe karratua baina mozteko aukera izango duzu.",
"Your avatar is provided by your original account." : "Zure jatorrizko kontuak ezarri du zure avatar.",
"Cancel" : "Ezeztatu",
"Choose as profile image" : "Profil irudi bezala aukeratu",
diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js
index 15dc40a68b0..ca8d2b41081 100644
--- a/settings/l10n/fa.js
+++ b/settings/l10n/fa.js
@@ -123,7 +123,6 @@ OC.L10N.register(
"Upload new" : "بارگذاری جدید",
"Select new from Files" : "انتخاب جدید از میان فایل ها",
"Remove image" : "تصویر پاک شود",
- "Either png or jpg. Ideally square but you will be able to crop it." : "هردوی jpg و png ها مربع گونه می‌باشند. با این حال شما می‌توانید آنها را برش بزنید.",
"Cancel" : "منصرف شدن",
"Choose as profile image" : "یک تصویر پروفایل انتخاب کنید",
"Language" : "زبان",
diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json
index 56d135690fc..9dc390ea8cc 100644
--- a/settings/l10n/fa.json
+++ b/settings/l10n/fa.json
@@ -121,7 +121,6 @@
"Upload new" : "بارگذاری جدید",
"Select new from Files" : "انتخاب جدید از میان فایل ها",
"Remove image" : "تصویر پاک شود",
- "Either png or jpg. Ideally square but you will be able to crop it." : "هردوی jpg و png ها مربع گونه می‌باشند. با این حال شما می‌توانید آنها را برش بزنید.",
"Cancel" : "منصرف شدن",
"Choose as profile image" : "یک تصویر پروفایل انتخاب کنید",
"Language" : "زبان",
diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js
index c5399c6149f..34baad85135 100644
--- a/settings/l10n/fi_FI.js
+++ b/settings/l10n/fi_FI.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Sähköpostipalvelin",
"Log" : "Loki",
- "Server Status" : "Palvelimen tila",
+ "Server status" : "Palvelimen tila",
"Tips & tricks" : "Vinkit",
"Updates" : "Päivitykset",
"Authentication error" : "Tunnistautumisvirhe",
@@ -32,6 +32,7 @@ OC.L10N.register(
"Enabled" : "Käytössä",
"Not enabled" : "Ei käytössä",
"Federated Cloud Sharing" : "Federoitu pilvijakaminen",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL käyttää vanhentunutta %s-versiota (%s). Päivitä käyttöjärjestelmäsi tai ominaisuudet kuten %s eivät toimi luotettavasti.",
"A problem occurred, please check your log files (Error: %s)" : "Tapahtui virhe, tarkista lokitiedostot (Virhe: %s)",
"Migration Completed" : "Migraatio valmistui",
"Group already exists." : "Ryhmä on jo olemassa.",
@@ -76,6 +77,7 @@ OC.L10N.register(
"Uninstalling ...." : "Poistetaan asennusta....",
"Error while uninstalling app" : "Virhe sovellusta poistaessa",
"Uninstall" : "Poista asennus",
+ "An error occurred: {message}" : "Tapahtui virhe: {message}",
"Select a profile picture" : "Valitse profiilikuva",
"Very weak password" : "Erittäin heikko salasana",
"Weak password" : "Heikko salasana",
@@ -169,6 +171,8 @@ OC.L10N.register(
"More" : "Enemmän",
"Less" : "Vähemmän",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Lokitiedosto on kooltaan yli 100 megatavua. Sen lataaminen saattaa kestää hetken.",
+ "Transactional File Locking is enabled." : "Transaktiopohjainen tiedostolukitus käytössä.",
+ "Transactional File Locking is disabled." : "Transaktiopohjainen tiedostolukitus on pois käytöstä.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLitea käytetään tietokantana. Suuria asennuksia varten on suositeltavaa vaihtaa muuhun tietokantaan.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Varsinkin työpöytäsovelluksen tiedostosynkronointia käyttäessä SQLiten käyttö ei ole suositeltavaa.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Käytä komentorivityökalua toiseen tietokantaan migraation yhteydessä: 'occ db:convert-type', tai <a target=\"_blank\" href=\"%s\">lue toki myös dokumentaatio ↗</a>.",
@@ -178,8 +182,6 @@ OC.L10N.register(
"Improving the config.php" : "Config.php-tiedoston parantaminen",
"Theming" : "Teemojen käyttö",
"Hardening and security guidance" : "Turvaamis- ja tietoturvaopas",
- "Transactional File Locking is enabled." : "Transaktiopohjainen tiedostolukitus käytössä.",
- "Transactional File Locking is disabled." : "Transaktiopohjainen tiedostolukitus on pois käytöstä.",
"Version" : "Versio",
"Developer documentation" : "Kehittäjädokumentaatio",
"Experimental applications ahead" : "Kokeellisia sovelluksia edessä",
@@ -227,7 +229,6 @@ OC.L10N.register(
"Upload new" : "Lähetä uusi",
"Select new from Files" : "Valitse uusi tiedostoista",
"Remove image" : "Poista kuva",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Joko png- tai jpg-kuva. Mieluiten neliö, voit kuitenkin rajata kuvaa.",
"Your avatar is provided by your original account." : "Avatar-kuvasi pohjautuu alkuperäiseen tiliisi.",
"Cancel" : "Peru",
"Choose as profile image" : "Valitse profiilikuvaksi",
diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json
index cd20309e2b7..a0c610c94a8 100644
--- a/settings/l10n/fi_FI.json
+++ b/settings/l10n/fi_FI.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "Sähköpostipalvelin",
"Log" : "Loki",
- "Server Status" : "Palvelimen tila",
+ "Server status" : "Palvelimen tila",
"Tips & tricks" : "Vinkit",
"Updates" : "Päivitykset",
"Authentication error" : "Tunnistautumisvirhe",
@@ -30,6 +30,7 @@
"Enabled" : "Käytössä",
"Not enabled" : "Ei käytössä",
"Federated Cloud Sharing" : "Federoitu pilvijakaminen",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL käyttää vanhentunutta %s-versiota (%s). Päivitä käyttöjärjestelmäsi tai ominaisuudet kuten %s eivät toimi luotettavasti.",
"A problem occurred, please check your log files (Error: %s)" : "Tapahtui virhe, tarkista lokitiedostot (Virhe: %s)",
"Migration Completed" : "Migraatio valmistui",
"Group already exists." : "Ryhmä on jo olemassa.",
@@ -74,6 +75,7 @@
"Uninstalling ...." : "Poistetaan asennusta....",
"Error while uninstalling app" : "Virhe sovellusta poistaessa",
"Uninstall" : "Poista asennus",
+ "An error occurred: {message}" : "Tapahtui virhe: {message}",
"Select a profile picture" : "Valitse profiilikuva",
"Very weak password" : "Erittäin heikko salasana",
"Weak password" : "Heikko salasana",
@@ -167,6 +169,8 @@
"More" : "Enemmän",
"Less" : "Vähemmän",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Lokitiedosto on kooltaan yli 100 megatavua. Sen lataaminen saattaa kestää hetken.",
+ "Transactional File Locking is enabled." : "Transaktiopohjainen tiedostolukitus käytössä.",
+ "Transactional File Locking is disabled." : "Transaktiopohjainen tiedostolukitus on pois käytöstä.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLitea käytetään tietokantana. Suuria asennuksia varten on suositeltavaa vaihtaa muuhun tietokantaan.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Varsinkin työpöytäsovelluksen tiedostosynkronointia käyttäessä SQLiten käyttö ei ole suositeltavaa.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Käytä komentorivityökalua toiseen tietokantaan migraation yhteydessä: 'occ db:convert-type', tai <a target=\"_blank\" href=\"%s\">lue toki myös dokumentaatio ↗</a>.",
@@ -176,8 +180,6 @@
"Improving the config.php" : "Config.php-tiedoston parantaminen",
"Theming" : "Teemojen käyttö",
"Hardening and security guidance" : "Turvaamis- ja tietoturvaopas",
- "Transactional File Locking is enabled." : "Transaktiopohjainen tiedostolukitus käytössä.",
- "Transactional File Locking is disabled." : "Transaktiopohjainen tiedostolukitus on pois käytöstä.",
"Version" : "Versio",
"Developer documentation" : "Kehittäjädokumentaatio",
"Experimental applications ahead" : "Kokeellisia sovelluksia edessä",
@@ -225,7 +227,6 @@
"Upload new" : "Lähetä uusi",
"Select new from Files" : "Valitse uusi tiedostoista",
"Remove image" : "Poista kuva",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Joko png- tai jpg-kuva. Mieluiten neliö, voit kuitenkin rajata kuvaa.",
"Your avatar is provided by your original account." : "Avatar-kuvasi pohjautuu alkuperäiseen tiliisi.",
"Cancel" : "Peru",
"Choose as profile image" : "Valitse profiilikuvaksi",
diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js
index 2cbde857389..5c772570ba0 100644
--- a/settings/l10n/fr.js
+++ b/settings/l10n/fr.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Serveur e-mail",
"Log" : "Log",
- "Server Status" : "Statut du serveur",
"Tips & tricks" : "Trucs et astuces",
"Updates" : "Mises à jour",
"Authentication error" : "Erreur d'authentification",
@@ -31,7 +30,9 @@ OC.L10N.register(
"Unable to change password" : "Impossible de modifier le mot de passe",
"Enabled" : "Activées",
"Not enabled" : "Désactivées",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "le partage Federated Cloud ou l'installation et la mise à jour d'applications par l'app store",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL utilise %s %s, qui est une version obsolète. Veuillez mettre à jour votre système d'exploitation, ou des fonctionnalités telles que %s ne fonctionneront pas correctement.",
"A problem occurred, please check your log files (Error: %s)" : "Une erreur est survenue, veuillez vérifier vos fichiers de log (Erreur: %s)",
"Migration Completed" : "Migration terminée",
"Group already exists." : "Ce groupe existe déjà.",
@@ -178,6 +179,8 @@ OC.L10N.register(
"More" : "Plus",
"Less" : "Moins",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "La taille du fichier journal excède 100 Mo. Le télécharger peut prendre un certain temps!",
+ "Transactional File Locking is enabled." : "Le verrouillage transactionnel de fichiers est activé",
+ "Transactional File Locking is disabled." : "Le verrouillage transactionnel de fichiers est désactivé",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite est actuellement utilisé comme gestionnaire de base de données. Pour des installations plus volumineuses, nous vous conseillons d'utiliser un autre gestionnaire de base de données.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "L'utilisation de SQLite est particulièrement déconseillée si vous utilisez le client de bureau pour synchroniser vos données.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Pour migrer vers un autre type de base de données, utilisez la ligne de commande : 'occ db:convert-type' ou consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a>.",
@@ -187,8 +190,6 @@ OC.L10N.register(
"Improving the config.php" : "Amélioration du config.php ",
"Theming" : "Personnalisation de l'apparence",
"Hardening and security guidance" : "Guide pour le renforcement et la sécurité",
- "Transactional File Locking is enabled." : "Le verrouillage transactionnel de fichiers est activé",
- "Transactional File Locking is disabled." : "Le verrouillage transactionnel de fichiers est désactivé",
"Version" : "Version",
"Developer documentation" : "Documentation pour développeurs",
"Experimental applications ahead" : "Attention! Applications expérimentales",
@@ -235,7 +236,6 @@ OC.L10N.register(
"Upload new" : "Nouvelle depuis votre ordinateur",
"Select new from Files" : "Nouvelle depuis les Fichiers",
"Remove image" : "Supprimer l'image",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Format png ou jpg. Idéalement carrée, mais vous pourrez la recadrer.",
"Your avatar is provided by your original account." : "Votre avatar est fourni par votre compte original.",
"Cancel" : "Annuler",
"Choose as profile image" : "Choisir en tant que photo de profil ",
diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json
index 85a45b36867..62a39a64852 100644
--- a/settings/l10n/fr.json
+++ b/settings/l10n/fr.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "Serveur e-mail",
"Log" : "Log",
- "Server Status" : "Statut du serveur",
"Tips & tricks" : "Trucs et astuces",
"Updates" : "Mises à jour",
"Authentication error" : "Erreur d'authentification",
@@ -29,7 +28,9 @@
"Unable to change password" : "Impossible de modifier le mot de passe",
"Enabled" : "Activées",
"Not enabled" : "Désactivées",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "le partage Federated Cloud ou l'installation et la mise à jour d'applications par l'app store",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL utilise %s %s, qui est une version obsolète. Veuillez mettre à jour votre système d'exploitation, ou des fonctionnalités telles que %s ne fonctionneront pas correctement.",
"A problem occurred, please check your log files (Error: %s)" : "Une erreur est survenue, veuillez vérifier vos fichiers de log (Erreur: %s)",
"Migration Completed" : "Migration terminée",
"Group already exists." : "Ce groupe existe déjà.",
@@ -176,6 +177,8 @@
"More" : "Plus",
"Less" : "Moins",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "La taille du fichier journal excède 100 Mo. Le télécharger peut prendre un certain temps!",
+ "Transactional File Locking is enabled." : "Le verrouillage transactionnel de fichiers est activé",
+ "Transactional File Locking is disabled." : "Le verrouillage transactionnel de fichiers est désactivé",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite est actuellement utilisé comme gestionnaire de base de données. Pour des installations plus volumineuses, nous vous conseillons d'utiliser un autre gestionnaire de base de données.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "L'utilisation de SQLite est particulièrement déconseillée si vous utilisez le client de bureau pour synchroniser vos données.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Pour migrer vers un autre type de base de données, utilisez la ligne de commande : 'occ db:convert-type' ou consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a>.",
@@ -185,8 +188,6 @@
"Improving the config.php" : "Amélioration du config.php ",
"Theming" : "Personnalisation de l'apparence",
"Hardening and security guidance" : "Guide pour le renforcement et la sécurité",
- "Transactional File Locking is enabled." : "Le verrouillage transactionnel de fichiers est activé",
- "Transactional File Locking is disabled." : "Le verrouillage transactionnel de fichiers est désactivé",
"Version" : "Version",
"Developer documentation" : "Documentation pour développeurs",
"Experimental applications ahead" : "Attention! Applications expérimentales",
@@ -233,7 +234,6 @@
"Upload new" : "Nouvelle depuis votre ordinateur",
"Select new from Files" : "Nouvelle depuis les Fichiers",
"Remove image" : "Supprimer l'image",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Format png ou jpg. Idéalement carrée, mais vous pourrez la recadrer.",
"Your avatar is provided by your original account." : "Votre avatar est fourni par votre compte original.",
"Cancel" : "Annuler",
"Choose as profile image" : "Choisir en tant que photo de profil ",
diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js
index 947436001a8..34bc57bfbf2 100644
--- a/settings/l10n/gl.js
+++ b/settings/l10n/gl.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Servidor de correo",
"Log" : "Rexistro",
- "Server Status" : "Estado do servidor",
+ "Server status" : "Estado do servidor",
"Tips & tricks" : "Trucos e consellos",
"Updates" : "Actualizacións",
"Authentication error" : "Produciuse un erro de autenticación",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "Non é posíbel cambiar o contrasinal",
"Enabled" : "Activado",
"Not enabled" : "Non activado",
- "Federated Cloud Sharing" : "Compartición de nube federada",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e actualizando aplicacións a través da tenda de aplicacións ou da nube federada compartida",
+ "Federated Cloud Sharing" : "Nube federada compartida",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está utilizando unha versión obsoleta %s (%s). Actualice o seu sistema operativo, caso contrario características como %s non funcionarán de xeito fiábel.",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu un problema revise os ficheiros de rexistro (Erro: %s)",
"Migration Completed" : "Completouse a migración",
"Group already exists." : "Xa existe o grupo.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "Desinstalando ...",
"Error while uninstalling app" : "Produciuse un erro ao desinstalar o aplicatvo",
"Uninstall" : "Desinstalar",
+ "An error occurred: {message}" : "Produciuse un erro: {message}",
"Select a profile picture" : "Seleccione unha imaxe para o perfil",
"Very weak password" : "Contrasinal moi feble",
"Weak password" : "Contrasinal feble",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "Máis",
"Less" : "Menos",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "O ficheiro de rexistro é maior de 100 MB. Pódelle levar un anaco descargalo!",
+ "Transactional File Locking is enabled." : "O bloque transaccional de ficheiros está activado.",
+ "Transactional File Locking is disabled." : "O bloque transaccional de ficheiros está desactivado.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Empregase SQLite como base de datos. Para instalacións grandes recomendámoslle que cambie a unha infraestrutura de base de datos diferente.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Concretamente, se emprega o cliente de escritorio para sincronización, desaconsellámoslle o uso de SQLite",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar cara outra base de datos, empregue a ferramenta en liña de ordes: «occ db:convert-type», ou vexa a <a target=\"_blank\" href=\"%s\">documentación ↗</a>.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "Mellorando o config.php",
"Theming" : "Tematización",
"Hardening and security guidance" : "Orientacións sobre fortificación e seguridade",
- "Transactional File Locking is enabled." : "O bloque transaccional de ficheiros está activado.",
- "Transactional File Locking is disabled." : "O bloque transaccional de ficheiros está desactivado.",
"Version" : "Versión",
"Developer documentation" : "Documentación do desenvolvedor",
"Experimental applications ahead" : "Ante as aplicacións experimentais",
@@ -236,7 +239,7 @@ OC.L10N.register(
"Upload new" : "Novo envío",
"Select new from Files" : "Seleccionar outra nova desde Ficheiros",
"Remove image" : "Retirar a imaxe",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Calquera png ou jpg. É preferíbel que sexa cadrada, mais poderá recortala.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Calquera png ou jpg. É preferíbel que sexa cadrada, mais poderá recortala. O ficheiro non pode exceder do tamaño máximo de 20MB.",
"Your avatar is provided by your original account." : "O seu avatar é fornecido pola súa conta orixinal.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Escolla unha imaxe para o perfil",
diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json
index dbe24dc7df8..43d8f93a0cc 100644
--- a/settings/l10n/gl.json
+++ b/settings/l10n/gl.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "Servidor de correo",
"Log" : "Rexistro",
- "Server Status" : "Estado do servidor",
+ "Server status" : "Estado do servidor",
"Tips & tricks" : "Trucos e consellos",
"Updates" : "Actualizacións",
"Authentication error" : "Produciuse un erro de autenticación",
@@ -29,7 +29,9 @@
"Unable to change password" : "Non é posíbel cambiar o contrasinal",
"Enabled" : "Activado",
"Not enabled" : "Non activado",
- "Federated Cloud Sharing" : "Compartición de nube federada",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e actualizando aplicacións a través da tenda de aplicacións ou da nube federada compartida",
+ "Federated Cloud Sharing" : "Nube federada compartida",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está utilizando unha versión obsoleta %s (%s). Actualice o seu sistema operativo, caso contrario características como %s non funcionarán de xeito fiábel.",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu un problema revise os ficheiros de rexistro (Erro: %s)",
"Migration Completed" : "Completouse a migración",
"Group already exists." : "Xa existe o grupo.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "Desinstalando ...",
"Error while uninstalling app" : "Produciuse un erro ao desinstalar o aplicatvo",
"Uninstall" : "Desinstalar",
+ "An error occurred: {message}" : "Produciuse un erro: {message}",
"Select a profile picture" : "Seleccione unha imaxe para o perfil",
"Very weak password" : "Contrasinal moi feble",
"Weak password" : "Contrasinal feble",
@@ -176,6 +179,8 @@
"More" : "Máis",
"Less" : "Menos",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "O ficheiro de rexistro é maior de 100 MB. Pódelle levar un anaco descargalo!",
+ "Transactional File Locking is enabled." : "O bloque transaccional de ficheiros está activado.",
+ "Transactional File Locking is disabled." : "O bloque transaccional de ficheiros está desactivado.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Empregase SQLite como base de datos. Para instalacións grandes recomendámoslle que cambie a unha infraestrutura de base de datos diferente.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Concretamente, se emprega o cliente de escritorio para sincronización, desaconsellámoslle o uso de SQLite",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar cara outra base de datos, empregue a ferramenta en liña de ordes: «occ db:convert-type», ou vexa a <a target=\"_blank\" href=\"%s\">documentación ↗</a>.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "Mellorando o config.php",
"Theming" : "Tematización",
"Hardening and security guidance" : "Orientacións sobre fortificación e seguridade",
- "Transactional File Locking is enabled." : "O bloque transaccional de ficheiros está activado.",
- "Transactional File Locking is disabled." : "O bloque transaccional de ficheiros está desactivado.",
"Version" : "Versión",
"Developer documentation" : "Documentación do desenvolvedor",
"Experimental applications ahead" : "Ante as aplicacións experimentais",
@@ -234,7 +237,7 @@
"Upload new" : "Novo envío",
"Select new from Files" : "Seleccionar outra nova desde Ficheiros",
"Remove image" : "Retirar a imaxe",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Calquera png ou jpg. É preferíbel que sexa cadrada, mais poderá recortala.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Calquera png ou jpg. É preferíbel que sexa cadrada, mais poderá recortala. O ficheiro non pode exceder do tamaño máximo de 20MB.",
"Your avatar is provided by your original account." : "O seu avatar é fornecido pola súa conta orixinal.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Escolla unha imaxe para o perfil",
diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js
index 257acdf06ec..e32b8aa6608 100644
--- a/settings/l10n/hr.js
+++ b/settings/l10n/hr.js
@@ -136,7 +136,6 @@ OC.L10N.register(
"Upload new" : "Učitajte novu",
"Select new from Files" : "Odaberite novu iz datoteka",
"Remove image" : "Uklonite sliku",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ili png ili jpg. Idealno bi bilo da je kvadratna, ali moći ćete je obrezati",
"Your avatar is provided by your original account." : "Vaš avatar je isporučen od strane vašeg izvornog računa",
"Cancel" : "Odustanite",
"Choose as profile image" : "Odaberite kao sliku profila",
diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json
index 23d1a9c4b02..6cee1ef82aa 100644
--- a/settings/l10n/hr.json
+++ b/settings/l10n/hr.json
@@ -134,7 +134,6 @@
"Upload new" : "Učitajte novu",
"Select new from Files" : "Odaberite novu iz datoteka",
"Remove image" : "Uklonite sliku",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ili png ili jpg. Idealno bi bilo da je kvadratna, ali moći ćete je obrezati",
"Your avatar is provided by your original account." : "Vaš avatar je isporučen od strane vašeg izvornog računa",
"Cancel" : "Odustanite",
"Choose as profile image" : "Odaberite kao sliku profila",
diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js
index 23ffd4adf4c..4ce16798ef8 100644
--- a/settings/l10n/hu_HU.js
+++ b/settings/l10n/hu_HU.js
@@ -141,7 +141,6 @@ OC.L10N.register(
"Upload new" : "Új feltöltése",
"Select new from Files" : "Új kiválasztása a Fájlokból",
"Remove image" : "A kép eltávolítása",
- "Either png or jpg. Ideally square but you will be able to crop it." : "A kép png vagy jpg formátumban legyen. Legjobb, ha négyzet alakú, de később még átszabható.",
"Your avatar is provided by your original account." : "A kép az eredeti bejelentkezési adatai alapján lett beállítva.",
"Cancel" : "Mégsem",
"Choose as profile image" : "Válasszuk ki profilképnek",
diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json
index fdb1c9d3ee1..b3c60fd5f3e 100644
--- a/settings/l10n/hu_HU.json
+++ b/settings/l10n/hu_HU.json
@@ -139,7 +139,6 @@
"Upload new" : "Új feltöltése",
"Select new from Files" : "Új kiválasztása a Fájlokból",
"Remove image" : "A kép eltávolítása",
- "Either png or jpg. Ideally square but you will be able to crop it." : "A kép png vagy jpg formátumban legyen. Legjobb, ha négyzet alakú, de később még átszabható.",
"Your avatar is provided by your original account." : "A kép az eredeti bejelentkezési adatai alapján lett beállítva.",
"Cancel" : "Mégsem",
"Choose as profile image" : "Válasszuk ki profilképnek",
diff --git a/settings/l10n/id.js b/settings/l10n/id.js
index 20e07bfb90f..083c068e14a 100644
--- a/settings/l10n/id.js
+++ b/settings/l10n/id.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Server email",
"Log" : "Log",
- "Server Status" : "Status Server",
"Tips & tricks" : "Tips & trik",
"Updates" : "Pembaruan",
"Authentication error" : "Terjadi kesalahan saat otentikasi",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Lainnya",
"Less" : "Ciutkan",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Berkas log lebih besar dari 100MB. Pengunduhan ini memerlukan beberapa saat!",
+ "Transactional File Locking is enabled." : "Penguncian Berkas Transaksional diaktifkan.",
+ "Transactional File Locking is disabled." : "Penguncian Berkas Transaksional dinonaktifkan.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite digunakan sebagai basis data. Untuk instalasi yang lebih besar, kami menyarankan untuk beralih ke backend basis data yang berbeda.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Terutama saat menggunakan klien desktop untuk sinkronisasi berkas, penggunaan SQLite tidak disarankan.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Untuk migrasi ke basis data lainnya, gunakan alat baris perintah: 'occ db:convert-type', atau lihat <a target=\"_blank\" href=\"%s\">dokumentasi ↗</a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Memperbaiki config.php",
"Theming" : "Tema",
"Hardening and security guidance" : "Panduan Keselamatan dan Keamanan",
- "Transactional File Locking is enabled." : "Penguncian Berkas Transaksional diaktifkan.",
- "Transactional File Locking is disabled." : "Penguncian Berkas Transaksional dinonaktifkan.",
"Version" : "Versi",
"Developer documentation" : "Dokumentasi pengembang",
"Experimental applications ahead" : "Aplikasi percobaan terdepan",
@@ -236,7 +235,6 @@ OC.L10N.register(
"Upload new" : "Unggah baru",
"Select new from Files" : "Pilih baru dari Berkas",
"Remove image" : "Hapus gambar",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Boleh png atau jpg. Idealnya berbentuk persegi tetapi jika tidak, Anda bisa memotongnya nanti.",
"Your avatar is provided by your original account." : "Avatar disediakan oleh akun asli Anda.",
"Cancel" : "Batal",
"Choose as profile image" : "Pilih sebagai gambar profil",
diff --git a/settings/l10n/id.json b/settings/l10n/id.json
index c150230b468..f2464e75a17 100644
--- a/settings/l10n/id.json
+++ b/settings/l10n/id.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "Server email",
"Log" : "Log",
- "Server Status" : "Status Server",
"Tips & tricks" : "Tips & trik",
"Updates" : "Pembaruan",
"Authentication error" : "Terjadi kesalahan saat otentikasi",
@@ -176,6 +175,8 @@
"More" : "Lainnya",
"Less" : "Ciutkan",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Berkas log lebih besar dari 100MB. Pengunduhan ini memerlukan beberapa saat!",
+ "Transactional File Locking is enabled." : "Penguncian Berkas Transaksional diaktifkan.",
+ "Transactional File Locking is disabled." : "Penguncian Berkas Transaksional dinonaktifkan.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite digunakan sebagai basis data. Untuk instalasi yang lebih besar, kami menyarankan untuk beralih ke backend basis data yang berbeda.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Terutama saat menggunakan klien desktop untuk sinkronisasi berkas, penggunaan SQLite tidak disarankan.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Untuk migrasi ke basis data lainnya, gunakan alat baris perintah: 'occ db:convert-type', atau lihat <a target=\"_blank\" href=\"%s\">dokumentasi ↗</a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Memperbaiki config.php",
"Theming" : "Tema",
"Hardening and security guidance" : "Panduan Keselamatan dan Keamanan",
- "Transactional File Locking is enabled." : "Penguncian Berkas Transaksional diaktifkan.",
- "Transactional File Locking is disabled." : "Penguncian Berkas Transaksional dinonaktifkan.",
"Version" : "Versi",
"Developer documentation" : "Dokumentasi pengembang",
"Experimental applications ahead" : "Aplikasi percobaan terdepan",
@@ -234,7 +233,6 @@
"Upload new" : "Unggah baru",
"Select new from Files" : "Pilih baru dari Berkas",
"Remove image" : "Hapus gambar",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Boleh png atau jpg. Idealnya berbentuk persegi tetapi jika tidak, Anda bisa memotongnya nanti.",
"Your avatar is provided by your original account." : "Avatar disediakan oleh akun asli Anda.",
"Cancel" : "Batal",
"Choose as profile image" : "Pilih sebagai gambar profil",
diff --git a/settings/l10n/it.js b/settings/l10n/it.js
index 3258ab1a9a2..c7a2105f7cf 100644
--- a/settings/l10n/it.js
+++ b/settings/l10n/it.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Server di posta",
"Log" : "Log",
- "Server Status" : "Stato del server",
+ "Server status" : "Stato del server",
"Tips & tricks" : "Suggerimenti e trucchi",
"Updates" : "Aggiornamenti",
"Authentication error" : "Errore di autenticazione",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "Impossibile cambiare la password",
"Enabled" : "Abilitata",
"Not enabled" : "Non abilitata",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "installazione e aggiornamento delle applicazioni tramite il negozio delle applicazioni o condivisione cloud federata",
"Federated Cloud Sharing" : "Condivisione cloud federata",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL utilizza una versione %s datata (%s). Aggiorna il tuo sistema operativo o funzionalità come %s non funzioneranno correttamente.",
"A problem occurred, please check your log files (Error: %s)" : "Si è verificato un problema, controlla i tuoi file di log (Errore: %s)",
"Migration Completed" : "Migrazione completata",
"Group already exists." : "Il gruppo esiste già.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "Disinstallazione...",
"Error while uninstalling app" : "Errore durante la disinstallazione dell'applicazione",
"Uninstall" : "Disinstalla",
+ "An error occurred: {message}" : "Si è verificato un errore: {message}",
"Select a profile picture" : "Seleziona un'immagine del profilo",
"Very weak password" : "Password molto debole",
"Weak password" : "Password debole",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "Altro",
"Less" : "Meno",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Il file di log è più grande di 100MB. Scaricarlo potrebbe richiedere del tempo!",
+ "Transactional File Locking is enabled." : "Il blocco file transazionale è abilitato.",
+ "Transactional File Locking is disabled." : "Il blocco file transazionale è disabilitato.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite è utilizzato come database. Per installazioni più grandi consigliamo di passare a un motore di database diverso.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "In particolar modo, quando si utilizza il client desktop per la sincronizzazione dei file, l'uso di SQLite è sconsigliato.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Per migrare a un altro database, usa lo strumento da riga di comando: 'occ db:convert-type', o leggi la <a target=\"_blank\" href=\"%s\">documentazione ↗</a>.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "Ottimizzare il config.php",
"Theming" : "Temi",
"Hardening and security guidance" : "Guida alla messa in sicurezza",
- "Transactional File Locking is enabled." : "Il blocco file transazionale è abilitato.",
- "Transactional File Locking is disabled." : "Il blocco file transazionale è disabilitato.",
"Version" : "Versione",
"Developer documentation" : "Documentazione dello sviluppatore",
"Experimental applications ahead" : "Prima le applicazioni sperimentali",
@@ -236,7 +239,7 @@ OC.L10N.register(
"Upload new" : "Carica nuova",
"Select new from Files" : "Seleziona nuova da file",
"Remove image" : "Rimuovi immagine",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Sia png che jpg. Preferibilmente quadrata, ma potrai ritagliarla.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Sia png che jpg. Preferibilmente quadrata, ma potrai ritagliarla. Il file non può superare la dimensione massima di 20 MB.",
"Your avatar is provided by your original account." : "Il tuo avatar è ottenuto dal tuo account originale.",
"Cancel" : "Annulla",
"Choose as profile image" : "Scegli come immagine del profilo",
diff --git a/settings/l10n/it.json b/settings/l10n/it.json
index ae2c56ba7eb..c7bd9878087 100644
--- a/settings/l10n/it.json
+++ b/settings/l10n/it.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "Server di posta",
"Log" : "Log",
- "Server Status" : "Stato del server",
+ "Server status" : "Stato del server",
"Tips & tricks" : "Suggerimenti e trucchi",
"Updates" : "Aggiornamenti",
"Authentication error" : "Errore di autenticazione",
@@ -29,7 +29,9 @@
"Unable to change password" : "Impossibile cambiare la password",
"Enabled" : "Abilitata",
"Not enabled" : "Non abilitata",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "installazione e aggiornamento delle applicazioni tramite il negozio delle applicazioni o condivisione cloud federata",
"Federated Cloud Sharing" : "Condivisione cloud federata",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL utilizza una versione %s datata (%s). Aggiorna il tuo sistema operativo o funzionalità come %s non funzioneranno correttamente.",
"A problem occurred, please check your log files (Error: %s)" : "Si è verificato un problema, controlla i tuoi file di log (Errore: %s)",
"Migration Completed" : "Migrazione completata",
"Group already exists." : "Il gruppo esiste già.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "Disinstallazione...",
"Error while uninstalling app" : "Errore durante la disinstallazione dell'applicazione",
"Uninstall" : "Disinstalla",
+ "An error occurred: {message}" : "Si è verificato un errore: {message}",
"Select a profile picture" : "Seleziona un'immagine del profilo",
"Very weak password" : "Password molto debole",
"Weak password" : "Password debole",
@@ -176,6 +179,8 @@
"More" : "Altro",
"Less" : "Meno",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Il file di log è più grande di 100MB. Scaricarlo potrebbe richiedere del tempo!",
+ "Transactional File Locking is enabled." : "Il blocco file transazionale è abilitato.",
+ "Transactional File Locking is disabled." : "Il blocco file transazionale è disabilitato.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite è utilizzato come database. Per installazioni più grandi consigliamo di passare a un motore di database diverso.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "In particolar modo, quando si utilizza il client desktop per la sincronizzazione dei file, l'uso di SQLite è sconsigliato.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Per migrare a un altro database, usa lo strumento da riga di comando: 'occ db:convert-type', o leggi la <a target=\"_blank\" href=\"%s\">documentazione ↗</a>.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "Ottimizzare il config.php",
"Theming" : "Temi",
"Hardening and security guidance" : "Guida alla messa in sicurezza",
- "Transactional File Locking is enabled." : "Il blocco file transazionale è abilitato.",
- "Transactional File Locking is disabled." : "Il blocco file transazionale è disabilitato.",
"Version" : "Versione",
"Developer documentation" : "Documentazione dello sviluppatore",
"Experimental applications ahead" : "Prima le applicazioni sperimentali",
@@ -234,7 +237,7 @@
"Upload new" : "Carica nuova",
"Select new from Files" : "Seleziona nuova da file",
"Remove image" : "Rimuovi immagine",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Sia png che jpg. Preferibilmente quadrata, ma potrai ritagliarla.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Sia png che jpg. Preferibilmente quadrata, ma potrai ritagliarla. Il file non può superare la dimensione massima di 20 MB.",
"Your avatar is provided by your original account." : "Il tuo avatar è ottenuto dal tuo account originale.",
"Cancel" : "Annulla",
"Choose as profile image" : "Scegli come immagine del profilo",
diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js
index 6d36075e713..41ee4af3aca 100644
--- a/settings/l10n/ja.js
+++ b/settings/l10n/ja.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "メールサーバー",
"Log" : "ログ",
- "Server Status" : "サーバーステータス",
"Tips & tricks" : "Tips & tricks",
"Updates" : "アップデート",
"Authentication error" : "認証エラー",
@@ -219,7 +218,6 @@ OC.L10N.register(
"Upload new" : "新たにアップロード",
"Select new from Files" : "新しいファイルを選択",
"Remove image" : "画像を削除",
- "Either png or jpg. Ideally square but you will be able to crop it." : "pngまたはjpg形式。正方形が理想ですが、切り取って加工することもできます。",
"Your avatar is provided by your original account." : "あなたのアバターは、あなたのオリジナルのアカウントで提供されています。",
"Cancel" : "キャンセル",
"Choose as profile image" : "プロファイル画像として選択",
diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json
index 771c4787b98..6533043c799 100644
--- a/settings/l10n/ja.json
+++ b/settings/l10n/ja.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "メールサーバー",
"Log" : "ログ",
- "Server Status" : "サーバーステータス",
"Tips & tricks" : "Tips & tricks",
"Updates" : "アップデート",
"Authentication error" : "認証エラー",
@@ -217,7 +216,6 @@
"Upload new" : "新たにアップロード",
"Select new from Files" : "新しいファイルを選択",
"Remove image" : "画像を削除",
- "Either png or jpg. Ideally square but you will be able to crop it." : "pngまたはjpg形式。正方形が理想ですが、切り取って加工することもできます。",
"Your avatar is provided by your original account." : "あなたのアバターは、あなたのオリジナルのアカウントで提供されています。",
"Cancel" : "キャンセル",
"Choose as profile image" : "プロファイル画像として選択",
diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js
index dd7a09bff39..9ea90377bc1 100644
--- a/settings/l10n/ko.js
+++ b/settings/l10n/ko.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "이메일 서버",
"Log" : "로그",
- "Server Status" : "서버 상태",
+ "Server status" : "서버 상태",
"Tips & tricks" : "팁과 추가 정보",
"Updates" : "업데이트",
"Authentication error" : "인증 오류",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "암호를 변경할 수 없음",
"Enabled" : "활성",
"Not enabled" : "비활성",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "앱 스토어 및 연합 클라우드 공유로 앱 설치 및 업데이트",
"Federated Cloud Sharing" : "클라우드 연합 공유",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL이 오래된 %s 버전을 사용하고 있습니다(%s). 운영 체제나 기능을 업데이트하지 않으면 %s 등을 안정적으로 사용할 수 없습니다.",
"A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)",
"Migration Completed" : "이전 완료됨",
"Group already exists." : "그룹이 이미 존재합니다.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "제거 하는 중 ....",
"Error while uninstalling app" : "앱을 제거하는 중 오류 발생",
"Uninstall" : "제거",
+ "An error occurred: {message}" : "오류 발생: {message}",
"Select a profile picture" : "프로필 사진 선택",
"Very weak password" : "매우 약한 암호",
"Weak password" : "약한 암호",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "더 중요함",
"Less" : "덜 중요함",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "로그 파일이 100MB보다 큽니다. 다운로드하는 데 시간이 걸릴 수 있습니다!",
+ "Transactional File Locking is enabled." : "트랜잭션 기반 파일 잠금이 활성화 되었습니다.",
+ "Transactional File Locking is disabled." : "트랜잭션 기반 파일 잠금이 비활성화 되었습니다.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "데이터베이스로 SQLite를 사용하고 있습니다. 대규모의 파일을 관리하려고 한다면 다른 데이터베이스 백엔드로 전환할 것을 권장합니다.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "특히 파일 동기화를 위해 데스크톱 클라이언트를 사용할 예정이면, SQLite를 사용하지 않는 것이 좋습니다.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "다른 데이터베이스로 이전하려면 다음 명령을 사용하십시오: 'occ db:convert-type' 다른 명령을 알아보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "config.php 개선",
"Theming" : "테마 꾸미기",
"Hardening and security guidance" : "보안 강화 지침",
- "Transactional File Locking is enabled." : "트랜잭션 기반 파일 잠금이 활성화 되었습니다.",
- "Transactional File Locking is disabled." : "트랜잭션 기반 파일 잠금이 비활성화 되었습니다.",
"Version" : "버전",
"Developer documentation" : "개발자 문서",
"Experimental applications ahead" : "실험적인 앱 사용 예정",
@@ -236,7 +239,7 @@ OC.L10N.register(
"Upload new" : "새로 업로드",
"Select new from Files" : "파일에서 선택",
"Remove image" : "그림 삭제",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png나 jpg를 사용하십시오. 정사각형 형태가 가장 좋지만 잘라낼 수 있습니다.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "PNG나 JPG 파일입니다. 정사각형을 사용하는 것이 가장 좋지만 잘라낼 수 있습니다. 파일 최대 크기는 20MB입니다.",
"Your avatar is provided by your original account." : "원본 계정의 아바타를 사용합니다.",
"Cancel" : "취소",
"Choose as profile image" : "프로필 이미지로 사용",
diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json
index 955396bff17..429d75dc93c 100644
--- a/settings/l10n/ko.json
+++ b/settings/l10n/ko.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "이메일 서버",
"Log" : "로그",
- "Server Status" : "서버 상태",
+ "Server status" : "서버 상태",
"Tips & tricks" : "팁과 추가 정보",
"Updates" : "업데이트",
"Authentication error" : "인증 오류",
@@ -29,7 +29,9 @@
"Unable to change password" : "암호를 변경할 수 없음",
"Enabled" : "활성",
"Not enabled" : "비활성",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "앱 스토어 및 연합 클라우드 공유로 앱 설치 및 업데이트",
"Federated Cloud Sharing" : "클라우드 연합 공유",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL이 오래된 %s 버전을 사용하고 있습니다(%s). 운영 체제나 기능을 업데이트하지 않으면 %s 등을 안정적으로 사용할 수 없습니다.",
"A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)",
"Migration Completed" : "이전 완료됨",
"Group already exists." : "그룹이 이미 존재합니다.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "제거 하는 중 ....",
"Error while uninstalling app" : "앱을 제거하는 중 오류 발생",
"Uninstall" : "제거",
+ "An error occurred: {message}" : "오류 발생: {message}",
"Select a profile picture" : "프로필 사진 선택",
"Very weak password" : "매우 약한 암호",
"Weak password" : "약한 암호",
@@ -176,6 +179,8 @@
"More" : "더 중요함",
"Less" : "덜 중요함",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "로그 파일이 100MB보다 큽니다. 다운로드하는 데 시간이 걸릴 수 있습니다!",
+ "Transactional File Locking is enabled." : "트랜잭션 기반 파일 잠금이 활성화 되었습니다.",
+ "Transactional File Locking is disabled." : "트랜잭션 기반 파일 잠금이 비활성화 되었습니다.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "데이터베이스로 SQLite를 사용하고 있습니다. 대규모의 파일을 관리하려고 한다면 다른 데이터베이스 백엔드로 전환할 것을 권장합니다.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "특히 파일 동기화를 위해 데스크톱 클라이언트를 사용할 예정이면, SQLite를 사용하지 않는 것이 좋습니다.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "다른 데이터베이스로 이전하려면 다음 명령을 사용하십시오: 'occ db:convert-type' 다른 명령을 알아보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "config.php 개선",
"Theming" : "테마 꾸미기",
"Hardening and security guidance" : "보안 강화 지침",
- "Transactional File Locking is enabled." : "트랜잭션 기반 파일 잠금이 활성화 되었습니다.",
- "Transactional File Locking is disabled." : "트랜잭션 기반 파일 잠금이 비활성화 되었습니다.",
"Version" : "버전",
"Developer documentation" : "개발자 문서",
"Experimental applications ahead" : "실험적인 앱 사용 예정",
@@ -234,7 +237,7 @@
"Upload new" : "새로 업로드",
"Select new from Files" : "파일에서 선택",
"Remove image" : "그림 삭제",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png나 jpg를 사용하십시오. 정사각형 형태가 가장 좋지만 잘라낼 수 있습니다.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "PNG나 JPG 파일입니다. 정사각형을 사용하는 것이 가장 좋지만 잘라낼 수 있습니다. 파일 최대 크기는 20MB입니다.",
"Your avatar is provided by your original account." : "원본 계정의 아바타를 사용합니다.",
"Cancel" : "취소",
"Choose as profile image" : "프로필 이미지로 사용",
diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js
index 08676dd9156..bf13c23f2af 100644
--- a/settings/l10n/lt_LT.js
+++ b/settings/l10n/lt_LT.js
@@ -78,7 +78,6 @@ OC.L10N.register(
"Upload new" : "Įkelti naują",
"Select new from Files" : "Pasirinkti naują iš failų",
"Remove image" : "Pašalinti paveikslėlį",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Arba png arba jpg. Geriausia kvadratinį, bet galėsite jį apkarpyti.",
"Cancel" : "Atšaukti",
"Choose as profile image" : "Pasirinkite profilio paveiksliuką",
"Language" : "Kalba",
diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json
index bff0df74f08..fe387dabec5 100644
--- a/settings/l10n/lt_LT.json
+++ b/settings/l10n/lt_LT.json
@@ -76,7 +76,6 @@
"Upload new" : "Įkelti naują",
"Select new from Files" : "Pasirinkti naują iš failų",
"Remove image" : "Pašalinti paveikslėlį",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Arba png arba jpg. Geriausia kvadratinį, bet galėsite jį apkarpyti.",
"Cancel" : "Atšaukti",
"Choose as profile image" : "Pasirinkite profilio paveiksliuką",
"Language" : "Kalba",
diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js
index 1695d5d5aeb..f4ce5676543 100644
--- a/settings/l10n/mk.js
+++ b/settings/l10n/mk.js
@@ -126,7 +126,6 @@ OC.L10N.register(
"Upload new" : "Префрли нова",
"Select new from Files" : "Одбери нова од датотеките",
"Remove image" : "Отстрани ја фотографијата",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Мора де биде png или jpg. Идеално квадрат, но ќе бидете во можност да ја исечете.",
"Your avatar is provided by your original account." : "Вашиот аватар е креиран со вашата оригинална сметка",
"Cancel" : "Откажи",
"Choose as profile image" : "Одбери фотографија за профилот",
diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json
index 5a5db7ccc7e..c93ae59e35c 100644
--- a/settings/l10n/mk.json
+++ b/settings/l10n/mk.json
@@ -124,7 +124,6 @@
"Upload new" : "Префрли нова",
"Select new from Files" : "Одбери нова од датотеките",
"Remove image" : "Отстрани ја фотографијата",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Мора де биде png или jpg. Идеално квадрат, но ќе бидете во можност да ја исечете.",
"Your avatar is provided by your original account." : "Вашиот аватар е креиран со вашата оригинална сметка",
"Cancel" : "Откажи",
"Choose as profile image" : "Одбери фотографија за профилот",
diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js
index 805f1f0c328..4fffe8d620f 100644
--- a/settings/l10n/nb_NO.js
+++ b/settings/l10n/nb_NO.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-postserver",
"Log" : "Logg",
- "Server Status" : "Server-status",
"Tips & tricks" : "Tips og triks",
"Updates" : "Oppdateringer",
"Authentication error" : "Autentiseringsfeil",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Mer",
"Less" : "Mindre",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Loggfilen er over 100 MB, nedlastingen kan ta en stund!",
+ "Transactional File Locking is enabled." : "Transaksjonsbasert fil-låsing er aktivert.",
+ "Transactional File Locking is disabled." : "Transaksjonsbasert fil-låsing er deaktivert.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite brukes som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Forbedring av config.php",
"Theming" : "Temaer",
"Hardening and security guidance" : "Herding og sikkerhetsveiledning",
- "Transactional File Locking is enabled." : "Transaksjonsbasert fil-låsing er aktivert.",
- "Transactional File Locking is disabled." : "Transaksjonsbasert fil-låsing er deaktivert.",
"Version" : "Versjon",
"Developer documentation" : "Utviklerdokumentasjon",
"Experimental applications ahead" : "Eksperimentelle applikasjoner forut",
@@ -235,7 +234,6 @@ OC.L10N.register(
"Upload new" : "Last opp nytt",
"Select new from Files" : "Velg nytt fra Filer",
"Remove image" : "Fjern bilde",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Enten png eller jpg. Helst kvadratisk, men du kan beskjære det.",
"Your avatar is provided by your original account." : "Avataren din kommer fra din opprinnelige konto.",
"Cancel" : "Avbryt",
"Choose as profile image" : "Velg som profilbilde",
diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json
index 3e92a23ec75..17a4bfce9f4 100644
--- a/settings/l10n/nb_NO.json
+++ b/settings/l10n/nb_NO.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "E-postserver",
"Log" : "Logg",
- "Server Status" : "Server-status",
"Tips & tricks" : "Tips og triks",
"Updates" : "Oppdateringer",
"Authentication error" : "Autentiseringsfeil",
@@ -176,6 +175,8 @@
"More" : "Mer",
"Less" : "Mindre",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Loggfilen er over 100 MB, nedlastingen kan ta en stund!",
+ "Transactional File Locking is enabled." : "Transaksjonsbasert fil-låsing er aktivert.",
+ "Transactional File Locking is disabled." : "Transaksjonsbasert fil-låsing er deaktivert.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite brukes som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Forbedring av config.php",
"Theming" : "Temaer",
"Hardening and security guidance" : "Herding og sikkerhetsveiledning",
- "Transactional File Locking is enabled." : "Transaksjonsbasert fil-låsing er aktivert.",
- "Transactional File Locking is disabled." : "Transaksjonsbasert fil-låsing er deaktivert.",
"Version" : "Versjon",
"Developer documentation" : "Utviklerdokumentasjon",
"Experimental applications ahead" : "Eksperimentelle applikasjoner forut",
@@ -233,7 +232,6 @@
"Upload new" : "Last opp nytt",
"Select new from Files" : "Velg nytt fra Filer",
"Remove image" : "Fjern bilde",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Enten png eller jpg. Helst kvadratisk, men du kan beskjære det.",
"Your avatar is provided by your original account." : "Avataren din kommer fra din opprinnelige konto.",
"Cancel" : "Avbryt",
"Choose as profile image" : "Velg som profilbilde",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index 2898cf5d5a6..51aadc8c161 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-mailserver",
"Log" : "Log",
- "Server Status" : "Server Status",
"Tips & tricks" : "Tips & trucs",
"Updates" : "Updates",
"Authentication error" : "Authenticatie fout",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Meer",
"Less" : "Minder",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Het logbestand is groter dan 100MB. Downloaden kost even tijd!",
+ "Transactional File Locking is enabled." : "Transactionele File Locking is ingeschakeld.",
+ "Transactional File Locking is disabled." : "Transactionele File Locking is uitgeschakeld.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wordt gebruikt als database. Voor grotere installaties adviseren we om te schakelen naar een andere database engine.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Vooral wanneer de desktop client wordt gebruik voor bestandssynchronisatie wordt gebruik van sqlite afgeraden.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Om te migreren naar een andere database moet u de commandoregel tool gebruiken: 'occ db:convert-type', lees de <a target=\"_blank\" href=\"%s\">documentatie ↗</a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "config.php verbeteren",
"Theming" : "Thema's",
"Hardening and security guidance" : "Hardening en security advies",
- "Transactional File Locking is enabled." : "Transactionele File Locking is ingeschakeld.",
- "Transactional File Locking is disabled." : "Transactionele File Locking is uitgeschakeld.",
"Version" : "Versie",
"Developer documentation" : "Ontwikkelaarsdocumentatie",
"Experimental applications ahead" : "Experimentele applicaties vooraan",
@@ -235,7 +234,6 @@ OC.L10N.register(
"Upload new" : "Upload een nieuwe",
"Select new from Files" : "Selecteer een nieuwe vanuit bestanden",
"Remove image" : "Afbeelding verwijderen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Of png, of jpg. Bij voorkeur vierkant, maar u kunt de afbeelding bijsnijden.",
"Your avatar is provided by your original account." : "Uw avatar is verstrekt door uw originele account.",
"Cancel" : "Annuleer",
"Choose as profile image" : "Kies als profielafbeelding",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index 5f4b4dc208b..4e184bdcb2e 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "E-mailserver",
"Log" : "Log",
- "Server Status" : "Server Status",
"Tips & tricks" : "Tips & trucs",
"Updates" : "Updates",
"Authentication error" : "Authenticatie fout",
@@ -176,6 +175,8 @@
"More" : "Meer",
"Less" : "Minder",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Het logbestand is groter dan 100MB. Downloaden kost even tijd!",
+ "Transactional File Locking is enabled." : "Transactionele File Locking is ingeschakeld.",
+ "Transactional File Locking is disabled." : "Transactionele File Locking is uitgeschakeld.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wordt gebruikt als database. Voor grotere installaties adviseren we om te schakelen naar een andere database engine.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Vooral wanneer de desktop client wordt gebruik voor bestandssynchronisatie wordt gebruik van sqlite afgeraden.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Om te migreren naar een andere database moet u de commandoregel tool gebruiken: 'occ db:convert-type', lees de <a target=\"_blank\" href=\"%s\">documentatie ↗</a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "config.php verbeteren",
"Theming" : "Thema's",
"Hardening and security guidance" : "Hardening en security advies",
- "Transactional File Locking is enabled." : "Transactionele File Locking is ingeschakeld.",
- "Transactional File Locking is disabled." : "Transactionele File Locking is uitgeschakeld.",
"Version" : "Versie",
"Developer documentation" : "Ontwikkelaarsdocumentatie",
"Experimental applications ahead" : "Experimentele applicaties vooraan",
@@ -233,7 +232,6 @@
"Upload new" : "Upload een nieuwe",
"Select new from Files" : "Selecteer een nieuwe vanuit bestanden",
"Remove image" : "Afbeelding verwijderen",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Of png, of jpg. Bij voorkeur vierkant, maar u kunt de afbeelding bijsnijden.",
"Your avatar is provided by your original account." : "Uw avatar is verstrekt door uw originele account.",
"Cancel" : "Annuleer",
"Choose as profile image" : "Kies als profielafbeelding",
diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js
index 3d93e9839fc..fb3c45debb4 100644
--- a/settings/l10n/nn_NO.js
+++ b/settings/l10n/nn_NO.js
@@ -67,7 +67,6 @@ OC.L10N.register(
"Upload new" : "Last opp ny",
"Select new from Files" : "Vel ny frå Filer",
"Remove image" : "Fjern bilete",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Anten PNG eller JPG. Helst kvadratisk, men du får moglegheita til å beskjera det.",
"Cancel" : "Avbryt",
"Choose as profile image" : "Vel som profilbilete",
"Language" : "Språk",
diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json
index fa2e96fdc9e..b1bcc62ea32 100644
--- a/settings/l10n/nn_NO.json
+++ b/settings/l10n/nn_NO.json
@@ -65,7 +65,6 @@
"Upload new" : "Last opp ny",
"Select new from Files" : "Vel ny frå Filer",
"Remove image" : "Fjern bilete",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Anten PNG eller JPG. Helst kvadratisk, men du får moglegheita til å beskjera det.",
"Cancel" : "Avbryt",
"Choose as profile image" : "Vel som profilbilete",
"Language" : "Språk",
diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js
index a22ac790df6..af849ff4a65 100644
--- a/settings/l10n/oc.js
+++ b/settings/l10n/oc.js
@@ -223,7 +223,6 @@ OC.L10N.register(
"Upload new" : "Novèla dempuèi vòstre ordenador",
"Select new from Files" : "Novèla dempuèi los Fichièrs",
"Remove image" : "Suprimir l'imatge",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Format png o jpg. Idealament carrada, mas la poiretz requadrar.",
"Your avatar is provided by your original account." : "Vòstre avatar es provesit per vòstre compte original.",
"Cancel" : "Anullar",
"Choose as profile image" : "Causir en tant que fòto de perfil",
diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json
index 201a2e6e75c..6921ed2bebd 100644
--- a/settings/l10n/oc.json
+++ b/settings/l10n/oc.json
@@ -221,7 +221,6 @@
"Upload new" : "Novèla dempuèi vòstre ordenador",
"Select new from Files" : "Novèla dempuèi los Fichièrs",
"Remove image" : "Suprimir l'imatge",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Format png o jpg. Idealament carrada, mas la poiretz requadrar.",
"Your avatar is provided by your original account." : "Vòstre avatar es provesit per vòstre compte original.",
"Cancel" : "Anullar",
"Choose as profile image" : "Causir en tant que fòto de perfil",
diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js
index d5e7bb45bab..1b89a64339f 100644
--- a/settings/l10n/pl.js
+++ b/settings/l10n/pl.js
@@ -179,7 +179,6 @@ OC.L10N.register(
"Upload new" : "Wczytaj nowe",
"Select new from Files" : "Wybierz nowe z plików",
"Remove image" : "Usuń zdjęcie",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Png lub jpg. Idealnie kwadratowy, ale będzie można je przyciąć.",
"Your avatar is provided by your original account." : "Twój awatar jest ustawiony jako domyślny.",
"Cancel" : "Anuluj",
"Choose as profile image" : "Wybierz zdjęcie profilu",
diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json
index 85475b35803..1424924907a 100644
--- a/settings/l10n/pl.json
+++ b/settings/l10n/pl.json
@@ -177,7 +177,6 @@
"Upload new" : "Wczytaj nowe",
"Select new from Files" : "Wybierz nowe z plików",
"Remove image" : "Usuń zdjęcie",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Png lub jpg. Idealnie kwadratowy, ale będzie można je przyciąć.",
"Your avatar is provided by your original account." : "Twój awatar jest ustawiony jako domyślny.",
"Cancel" : "Anuluj",
"Choose as profile image" : "Wybierz zdjęcie profilu",
diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js
index 2d76cb44f6c..3e77c6a3772 100644
--- a/settings/l10n/pt_BR.js
+++ b/settings/l10n/pt_BR.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Servidor de Email",
"Log" : "Registro",
- "Server Status" : "Status do Servidor",
+ "Server status" : "Status do servidor",
"Tips & tricks" : "Dicas & Truques",
"Updates" : "Atualizações",
"Authentication error" : "Erro de autenticação",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "Impossível modificar senha",
"Enabled" : "Habilitado",
"Not enabled" : "Desabilitado",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e atualizando aplicativos via app store ou Núvem Compartilhada Federada",
"Federated Cloud Sharing" : "Compartilhamento de Nuvem Conglomerada",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está usando um desatualizado %s versão (%s). Por favor, atualize seu sistema operacional ou recursos como %s não vai funcionar de forma confiável.",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)",
"Migration Completed" : "Migração Concluida",
"Group already exists." : "O Grupo já existe.",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "Desinstalando ...",
"Error while uninstalling app" : "Erro enquanto desinstalava aplicativo",
"Uninstall" : "Desinstalar",
+ "An error occurred: {message}" : "Ocorreu um erro: {message}",
"Select a profile picture" : "Selecione uma imagem para o perfil",
"Very weak password" : "Senha muito fraca",
"Weak password" : "Senha fraca",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "Mais",
"Less" : "Menos",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "O arquivo de log é maior que 100 MB. Baixar esse arquivo requer algum tempo!",
+ "Transactional File Locking is enabled." : "Bloqueio de Arquivo Transacional está habilitado.",
+ "Transactional File Locking is disabled." : "Bloqueio de Arquivo Transacional está desabilitado.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é usada como base de dados. Para instalações maiores recomendamos mudar para um backend de banco de dados diferente.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'db occ: converter-type', verifique a <a target=\"_blank\" href=\"%s\">documentação ↗</a>.",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "Melhorando o config.php",
"Theming" : "Elaborar um tema",
"Hardening and security guidance" : "Orientações de proteção e segurança",
- "Transactional File Locking is enabled." : "Bloqueio de Arquivo Transacional está habilitado.",
- "Transactional File Locking is disabled." : "Bloqueio de Arquivo Transacional está desabilitado.",
"Version" : "Versão",
"Developer documentation" : "Documentação do desenvolvedor",
"Experimental applications ahead" : "Aplicações experimentais à frente",
@@ -236,7 +239,7 @@ OC.L10N.register(
"Upload new" : "Enviar nova foto",
"Select new from Files" : "Selecinar uma nova dos Arquivos",
"Remove image" : "Remover imagem",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ou png ou jpg. O ideal é quadrado, mas você vai ser capaz de cortá-la.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Ou png ou jpg. Idealmente quadrada, mas você será capaz de cortá-la. O arquivo não pode exceder o tamanho máximo de 20 MB.",
"Your avatar is provided by your original account." : "Seu avatar é fornecido por sua conta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Escolha como imagem para o perfil",
diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json
index f9df769ac35..73a9cf67b58 100644
--- a/settings/l10n/pt_BR.json
+++ b/settings/l10n/pt_BR.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "Servidor de Email",
"Log" : "Registro",
- "Server Status" : "Status do Servidor",
+ "Server status" : "Status do servidor",
"Tips & tricks" : "Dicas & Truques",
"Updates" : "Atualizações",
"Authentication error" : "Erro de autenticação",
@@ -29,7 +29,9 @@
"Unable to change password" : "Impossível modificar senha",
"Enabled" : "Habilitado",
"Not enabled" : "Desabilitado",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e atualizando aplicativos via app store ou Núvem Compartilhada Federada",
"Federated Cloud Sharing" : "Compartilhamento de Nuvem Conglomerada",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está usando um desatualizado %s versão (%s). Por favor, atualize seu sistema operacional ou recursos como %s não vai funcionar de forma confiável.",
"A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)",
"Migration Completed" : "Migração Concluida",
"Group already exists." : "O Grupo já existe.",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "Desinstalando ...",
"Error while uninstalling app" : "Erro enquanto desinstalava aplicativo",
"Uninstall" : "Desinstalar",
+ "An error occurred: {message}" : "Ocorreu um erro: {message}",
"Select a profile picture" : "Selecione uma imagem para o perfil",
"Very weak password" : "Senha muito fraca",
"Weak password" : "Senha fraca",
@@ -176,6 +179,8 @@
"More" : "Mais",
"Less" : "Menos",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "O arquivo de log é maior que 100 MB. Baixar esse arquivo requer algum tempo!",
+ "Transactional File Locking is enabled." : "Bloqueio de Arquivo Transacional está habilitado.",
+ "Transactional File Locking is disabled." : "Bloqueio de Arquivo Transacional está desabilitado.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é usada como base de dados. Para instalações maiores recomendamos mudar para um backend de banco de dados diferente.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especialmente quando se utiliza o cliente de desktop para sincronização de arquivos o uso de SQLite é desencorajado.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados usar a ferramenta de linha de comando: 'db occ: converter-type', verifique a <a target=\"_blank\" href=\"%s\">documentação ↗</a>.",
@@ -185,8 +190,6 @@
"Improving the config.php" : "Melhorando o config.php",
"Theming" : "Elaborar um tema",
"Hardening and security guidance" : "Orientações de proteção e segurança",
- "Transactional File Locking is enabled." : "Bloqueio de Arquivo Transacional está habilitado.",
- "Transactional File Locking is disabled." : "Bloqueio de Arquivo Transacional está desabilitado.",
"Version" : "Versão",
"Developer documentation" : "Documentação do desenvolvedor",
"Experimental applications ahead" : "Aplicações experimentais à frente",
@@ -234,7 +237,7 @@
"Upload new" : "Enviar nova foto",
"Select new from Files" : "Selecinar uma nova dos Arquivos",
"Remove image" : "Remover imagem",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Ou png ou jpg. O ideal é quadrado, mas você vai ser capaz de cortá-la.",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "Ou png ou jpg. Idealmente quadrada, mas você será capaz de cortá-la. O arquivo não pode exceder o tamanho máximo de 20 MB.",
"Your avatar is provided by your original account." : "Seu avatar é fornecido por sua conta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Escolha como imagem para o perfil",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index d2ab73ce4ed..0e40df28081 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -212,7 +212,6 @@ OC.L10N.register(
"Upload new" : "Carregar novo",
"Select new from Files" : "Seleccionar novo a partir dos ficheiros",
"Remove image" : "Remover imagem",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Apenas png ou jpg. Idealmente quadrada, mas poderá corta-la depois.",
"Your avatar is provided by your original account." : "O seu avatar é fornecido pela sua conta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Escolha uma fotografia de perfil",
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index 1ab8808031e..bcdcd1bdd97 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -210,7 +210,6 @@
"Upload new" : "Carregar novo",
"Select new from Files" : "Seleccionar novo a partir dos ficheiros",
"Remove image" : "Remover imagem",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Apenas png ou jpg. Idealmente quadrada, mas poderá corta-la depois.",
"Your avatar is provided by your original account." : "O seu avatar é fornecido pela sua conta original.",
"Cancel" : "Cancelar",
"Choose as profile image" : "Escolha uma fotografia de perfil",
diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js
index a50e73b0ce5..b969fae1b60 100644
--- a/settings/l10n/ro.js
+++ b/settings/l10n/ro.js
@@ -104,7 +104,6 @@ OC.L10N.register(
"Upload new" : "Încarcă una nouă",
"Select new from Files" : "Selectează una din Fișiere",
"Remove image" : "Înlătură imagine",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Doar png sau jpg de formă pătrată. ",
"Cancel" : "Anulare",
"Choose as profile image" : "Alege drept imagine de profil",
"Language" : "Limba",
diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json
index 0ceb936877f..83c2572901d 100644
--- a/settings/l10n/ro.json
+++ b/settings/l10n/ro.json
@@ -102,7 +102,6 @@
"Upload new" : "Încarcă una nouă",
"Select new from Files" : "Selectează una din Fișiere",
"Remove image" : "Înlătură imagine",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Doar png sau jpg de formă pătrată. ",
"Cancel" : "Anulare",
"Choose as profile image" : "Alege drept imagine de profil",
"Language" : "Limba",
diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js
index 64df7664ee4..1aae8b2a97b 100644
--- a/settings/l10n/ru.js
+++ b/settings/l10n/ru.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron (планировщик задач)",
"Email server" : "Почтовый сервер",
"Log" : "Журнал",
- "Server Status" : "Статус сервера",
"Tips & tricks" : "Советы и трюки",
"Updates" : "Обновления",
"Authentication error" : "Ошибка аутентификации",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Больше",
"Less" : "Меньше",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Лог-файл - больше 100 мб. Его скачивание может занять некоторое время!",
+ "Transactional File Locking is enabled." : "Транзакционная блокировка файлов включена.",
+ "Transactional File Locking is disabled." : "Транзакционная блокировка файлов отключена.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В качестве базы данных используется SQLite. Для больших установок мы рекомендуем переключиться на другую серверную базу данных.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особенно вызывает сомнение использование SQLite при синхронизации файлов с использование клиента для ПК.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Для перехода на другую базу данных используйте команду: 'occ db:convert-type' или ознакомьтесь с <a target=\"_blank\" href=\"%s\">документацией ↗</a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Улучшение config.php",
"Theming" : "Темы оформления",
"Hardening and security guidance" : "Руководство по безопасности и защите",
- "Transactional File Locking is enabled." : "Транзакционная блокировка файлов включена.",
- "Transactional File Locking is disabled." : "Транзакционная блокировка файлов отключена.",
"Version" : "Версия",
"Developer documentation" : "Документация для разработчиков",
"Experimental applications ahead" : "Экспериментальные приложения",
@@ -235,7 +234,6 @@ OC.L10N.register(
"Upload new" : "Загрузить новый",
"Select new from Files" : "Выберите новый из файлов",
"Remove image" : "Удалить аватар",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Допустимые форматы: png и jpg. Если изображение не квадратное, то вам будет предложено обрезать его.",
"Your avatar is provided by your original account." : "Будет использован аватар вашей оригинальной учетной записи.",
"Cancel" : "Отмена",
"Choose as profile image" : "Установить как аватар",
diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json
index 7dc52767c7b..ef73320cbf7 100644
--- a/settings/l10n/ru.json
+++ b/settings/l10n/ru.json
@@ -8,7 +8,6 @@
"Cron" : "Cron (планировщик задач)",
"Email server" : "Почтовый сервер",
"Log" : "Журнал",
- "Server Status" : "Статус сервера",
"Tips & tricks" : "Советы и трюки",
"Updates" : "Обновления",
"Authentication error" : "Ошибка аутентификации",
@@ -176,6 +175,8 @@
"More" : "Больше",
"Less" : "Меньше",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Лог-файл - больше 100 мб. Его скачивание может занять некоторое время!",
+ "Transactional File Locking is enabled." : "Транзакционная блокировка файлов включена.",
+ "Transactional File Locking is disabled." : "Транзакционная блокировка файлов отключена.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "В качестве базы данных используется SQLite. Для больших установок мы рекомендуем переключиться на другую серверную базу данных.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Особенно вызывает сомнение использование SQLite при синхронизации файлов с использование клиента для ПК.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Для перехода на другую базу данных используйте команду: 'occ db:convert-type' или ознакомьтесь с <a target=\"_blank\" href=\"%s\">документацией ↗</a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Улучшение config.php",
"Theming" : "Темы оформления",
"Hardening and security guidance" : "Руководство по безопасности и защите",
- "Transactional File Locking is enabled." : "Транзакционная блокировка файлов включена.",
- "Transactional File Locking is disabled." : "Транзакционная блокировка файлов отключена.",
"Version" : "Версия",
"Developer documentation" : "Документация для разработчиков",
"Experimental applications ahead" : "Экспериментальные приложения",
@@ -233,7 +232,6 @@
"Upload new" : "Загрузить новый",
"Select new from Files" : "Выберите новый из файлов",
"Remove image" : "Удалить аватар",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Допустимые форматы: png и jpg. Если изображение не квадратное, то вам будет предложено обрезать его.",
"Your avatar is provided by your original account." : "Будет использован аватар вашей оригинальной учетной записи.",
"Cancel" : "Отмена",
"Choose as profile image" : "Установить как аватар",
diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js
index b09ea77607e..67457a3021c 100644
--- a/settings/l10n/sk_SK.js
+++ b/settings/l10n/sk_SK.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "Email server",
"Log" : "Záznam",
- "Server Status" : "Stav servera",
"Tips & tricks" : "Tipy a triky",
"Updates" : "Aktualizácie",
"Authentication error" : "Chyba autentifikácie",
@@ -165,6 +164,8 @@ OC.L10N.register(
"More" : "Viac",
"Less" : "Menej",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Súbor protokolu je väčší ako 100 MB. Jeho sťahovanie môže chvíľu trvať!",
+ "Transactional File Locking is enabled." : "Transakčné zamykanie súboru je povolené.",
+ "Transactional File Locking is disabled." : "Transakčné zamykanie súboru je zakázané.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Ako databáza je použitá SQLite. Pre veľké inštalácie odporúčame prejsť na inú databázu.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Najmä pri používaní aplikácie na synchronizáciu s desktopom nie je databáza SQLite doporučená.",
"How to do backups" : "Ako vytvárať zálohy",
@@ -173,8 +174,6 @@ OC.L10N.register(
"Improving the config.php" : "Zlepšenie config.php",
"Theming" : "Vzhľady tém",
"Hardening and security guidance" : "Sprievodca vylepšením bezpečnosti",
- "Transactional File Locking is enabled." : "Transakčné zamykanie súboru je povolené.",
- "Transactional File Locking is disabled." : "Transakčné zamykanie súboru je zakázané.",
"Version" : "Verzia",
"Developer documentation" : "Dokumentácia vývojára",
"Experimental applications ahead" : "Experimentálna aplikácia v poradí",
@@ -221,7 +220,6 @@ OC.L10N.register(
"Upload new" : "Nahrať nový",
"Select new from Files" : "Vyberte nový zo súborov",
"Remove image" : "Zmazať obrázok",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Formát súboru png alebo jpg. V ideálnom prípade štvorec, ale budete mať možnosť ho orezať.",
"Your avatar is provided by your original account." : "Váš avatar je použitý z pôvodného účtu.",
"Cancel" : "Zrušiť",
"Choose as profile image" : "Vybrať ako avatara",
diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json
index 0d11a98c6e1..f08db3ba0ad 100644
--- a/settings/l10n/sk_SK.json
+++ b/settings/l10n/sk_SK.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "Email server",
"Log" : "Záznam",
- "Server Status" : "Stav servera",
"Tips & tricks" : "Tipy a triky",
"Updates" : "Aktualizácie",
"Authentication error" : "Chyba autentifikácie",
@@ -163,6 +162,8 @@
"More" : "Viac",
"Less" : "Menej",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Súbor protokolu je väčší ako 100 MB. Jeho sťahovanie môže chvíľu trvať!",
+ "Transactional File Locking is enabled." : "Transakčné zamykanie súboru je povolené.",
+ "Transactional File Locking is disabled." : "Transakčné zamykanie súboru je zakázané.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Ako databáza je použitá SQLite. Pre veľké inštalácie odporúčame prejsť na inú databázu.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Najmä pri používaní aplikácie na synchronizáciu s desktopom nie je databáza SQLite doporučená.",
"How to do backups" : "Ako vytvárať zálohy",
@@ -171,8 +172,6 @@
"Improving the config.php" : "Zlepšenie config.php",
"Theming" : "Vzhľady tém",
"Hardening and security guidance" : "Sprievodca vylepšením bezpečnosti",
- "Transactional File Locking is enabled." : "Transakčné zamykanie súboru je povolené.",
- "Transactional File Locking is disabled." : "Transakčné zamykanie súboru je zakázané.",
"Version" : "Verzia",
"Developer documentation" : "Dokumentácia vývojára",
"Experimental applications ahead" : "Experimentálna aplikácia v poradí",
@@ -219,7 +218,6 @@
"Upload new" : "Nahrať nový",
"Select new from Files" : "Vyberte nový zo súborov",
"Remove image" : "Zmazať obrázok",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Formát súboru png alebo jpg. V ideálnom prípade štvorec, ale budete mať možnosť ho orezať.",
"Your avatar is provided by your original account." : "Váš avatar je použitý z pôvodného účtu.",
"Cancel" : "Zrušiť",
"Choose as profile image" : "Vybrať ako avatara",
diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js
index e4fc35cd30a..b1ccf3058a3 100644
--- a/settings/l10n/sl.js
+++ b/settings/l10n/sl.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Periodično opravilo",
"Email server" : "Poštni strežnik",
"Log" : "Dnevnik",
- "Server Status" : "Stanje strežnika",
"Tips & tricks" : "Nasveti in triki",
"Updates" : "Posodobitve",
"Authentication error" : "Napaka med overjanjem",
@@ -208,7 +207,6 @@ OC.L10N.register(
"Upload new" : "Pošlji novo",
"Select new from Files" : "Izberi novo iz menija datotek",
"Remove image" : "Odstrani sliko",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Slika je lahko png ali jpg. Slika naj bo kvadratna, ni pa to pogoj, saj jo bo mogoče obrezati.",
"Your avatar is provided by your original account." : "Podoba je podana v izvornem računu.",
"Cancel" : "Prekliči",
"Choose as profile image" : "Izberi kot sliko profila",
diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json
index 3d01ae0bc55..09dc9ad37f1 100644
--- a/settings/l10n/sl.json
+++ b/settings/l10n/sl.json
@@ -8,7 +8,6 @@
"Cron" : "Periodično opravilo",
"Email server" : "Poštni strežnik",
"Log" : "Dnevnik",
- "Server Status" : "Stanje strežnika",
"Tips & tricks" : "Nasveti in triki",
"Updates" : "Posodobitve",
"Authentication error" : "Napaka med overjanjem",
@@ -206,7 +205,6 @@
"Upload new" : "Pošlji novo",
"Select new from Files" : "Izberi novo iz menija datotek",
"Remove image" : "Odstrani sliko",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Slika je lahko png ali jpg. Slika naj bo kvadratna, ni pa to pogoj, saj jo bo mogoče obrezati.",
"Your avatar is provided by your original account." : "Podoba je podana v izvornem računu.",
"Cancel" : "Prekliči",
"Choose as profile image" : "Izberi kot sliko profila",
diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js
index ea20901670c..4a48261c8de 100644
--- a/settings/l10n/sr.js
+++ b/settings/l10n/sr.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Крон",
"Email server" : "Сервер е-поште",
"Log" : "Бележење",
- "Server Status" : "Стање сервера",
"Tips & tricks" : "Савети и трикови",
"Updates" : "Ажурирања",
"Authentication error" : "Грешка при провери идентитета",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Више",
"Less" : "Мање",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Фајл записника је већи од 100МБ. Преузимање може потрајати!",
+ "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.",
+ "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite се користи као базе података. За веће инсталације препоручујемо да се пребаците на други модел базе података.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "За миграцију на другу базу користите командну линију: 'occ db:convert-type', или погледајте <a target=\"_blank\" href=\"%s\">документацију ↗</a>.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "Побољшање фајла поставки",
"Theming" : "Теме",
"Hardening and security guidance" : "Ојачавање система и безбедносне препоруке",
- "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.",
- "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.",
"Version" : "Верзија",
"Developer documentation" : "Програмерска документација",
"Experimental applications ahead" : "Експериментална апликација",
@@ -236,7 +235,6 @@ OC.L10N.register(
"Upload new" : "Отпреми нову",
"Select new from Files" : "Изабери нову из фајлова",
"Remove image" : "Уклони слику",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Или ПНГ или ЈПГ. Идеално би било квадратну али моћи ћете да је опсечете.",
"Your avatar is provided by your original account." : "Ваш аватар је добијен са оригиналног налога.",
"Cancel" : "Одустани",
"Choose as profile image" : "Изаберите слику профила",
diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json
index 7ba90354f39..4dc73a2df7a 100644
--- a/settings/l10n/sr.json
+++ b/settings/l10n/sr.json
@@ -8,7 +8,6 @@
"Cron" : "Крон",
"Email server" : "Сервер е-поште",
"Log" : "Бележење",
- "Server Status" : "Стање сервера",
"Tips & tricks" : "Савети и трикови",
"Updates" : "Ажурирања",
"Authentication error" : "Грешка при провери идентитета",
@@ -176,6 +175,8 @@
"More" : "Више",
"Less" : "Мање",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Фајл записника је већи од 100МБ. Преузимање може потрајати!",
+ "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.",
+ "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite се користи као базе података. За веће инсталације препоручујемо да се пребаците на други модел базе података.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Нарочито ако се користи клијент програм у графичком окружењу, коришћење СКуЛајта није препоручљиво.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "За миграцију на другу базу користите командну линију: 'occ db:convert-type', или погледајте <a target=\"_blank\" href=\"%s\">документацију ↗</a>.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "Побољшање фајла поставки",
"Theming" : "Теме",
"Hardening and security guidance" : "Ојачавање система и безбедносне препоруке",
- "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.",
- "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.",
"Version" : "Верзија",
"Developer documentation" : "Програмерска документација",
"Experimental applications ahead" : "Експериментална апликација",
@@ -234,7 +233,6 @@
"Upload new" : "Отпреми нову",
"Select new from Files" : "Изабери нову из фајлова",
"Remove image" : "Уклони слику",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Или ПНГ или ЈПГ. Идеално би било квадратну али моћи ћете да је опсечете.",
"Your avatar is provided by your original account." : "Ваш аватар је добијен са оригиналног налога.",
"Cancel" : "Одустани",
"Choose as profile image" : "Изаберите слику профила",
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index dc6e5a5393b..703add8fac2 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -167,7 +167,6 @@ OC.L10N.register(
"Upload new" : "Ladda upp ny",
"Select new from Files" : "Välj ny från filer",
"Remove image" : "Radera bild",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Antingen png eller jpg. Helst fyrkantig, men du kommer att kunna beskära den.",
"Your avatar is provided by your original account." : "Din avatar tillhandahålls av ditt ursprungliga konto.",
"Cancel" : "Avbryt",
"Choose as profile image" : "Välj som profilbild",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index 94401b23ded..c7d0a8eba44 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -165,7 +165,6 @@
"Upload new" : "Ladda upp ny",
"Select new from Files" : "Välj ny från filer",
"Remove image" : "Radera bild",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Antingen png eller jpg. Helst fyrkantig, men du kommer att kunna beskära den.",
"Your avatar is provided by your original account." : "Din avatar tillhandahålls av ditt ursprungliga konto.",
"Cancel" : "Avbryt",
"Choose as profile image" : "Välj som profilbild",
diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js
index 2ceba16a84b..7eef1519b89 100644
--- a/settings/l10n/th_TH.js
+++ b/settings/l10n/th_TH.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "อีเมลเซิร์ฟเวอร์",
"Log" : "บันทึกการเปลี่ยนแปลง",
- "Server Status" : "สถานะของเซิร์ฟเวอร์",
+ "Server status" : "สถานะเซิฟเวอร์",
"Tips & tricks" : "เคล็ดลับและเทคนิค",
"Updates" : "อัพเดท",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
@@ -31,7 +31,9 @@ OC.L10N.register(
"Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน",
"Enabled" : "เปิดการใช้งาน",
"Not enabled" : "ใช้งานไม่ได้",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "กำลังติดตั้งและอัพเดทแอพพลิเคชันผ่าแอพสโตร์หรือคลาวด์ในเครือ",
"Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL รุ่น %s เป็นรุ่นเก่า (%s)โปรดอัพเดทระบบปฏิบัติการหรือคุณสมบัติเป็น %s เพื่อการทำงานที่มีประสิทธิภาพ",
"A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)",
"Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์",
"Group already exists." : "มีกลุ่มนี้อยู่แล้ว",
@@ -76,6 +78,7 @@ OC.L10N.register(
"Uninstalling ...." : "กำลังถอนการติดตั้ง ...",
"Error while uninstalling app" : "เกิดข้อผิดพลาดขณะถอนการติดตั้งแอพพลิเคชัน",
"Uninstall" : "ถอนการติดตั้ง",
+ "An error occurred: {message}" : "เกิดข้อผิดพลาด: {message}",
"Select a profile picture" : "เลือกรูปภาพโปรไฟล์",
"Very weak password" : "รหัสผ่านระดับต่ำมาก",
"Weak password" : "รหัสผ่านระดับต่ำ",
@@ -178,6 +181,8 @@ OC.L10N.register(
"More" : "มาก",
"Less" : "น้อย",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "ไฟล์บันทึกมีขนาดใหญ่กว่า 100 เมกะไบต์ มันอาจจะใช้เวลาดาวน์โหลดนาน!",
+ "Transactional File Locking is enabled." : "เปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
+ "Transactional File Locking is disabled." : "ปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "จะใช้ SQLite เป็นฐานข้อมูล สำหรับการติดตั้งขนาดใหญ่เราขอแนะนำเพื่อสลับไปยังฐานข้อมูลแบ็กเอนด์ที่แตกต่างกัน",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "โดยเฉพาะอย่างยิ่งเมื่อใช้ไคลเอนต์เดสก์ทอปสำหรับการผสานข้อมูลโดย SQLite",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "การโยกย้ายไปยังฐานข้อมูลอื่นใช้เครื่องมือบรรทัดคำสั่ง: 'occ db:convert-type' หรือดูที่ <a target=\"_blank\" href=\"%s\">เอกสาร</a>",
@@ -187,8 +192,6 @@ OC.L10N.register(
"Improving the config.php" : "ปรับปรุงไฟล์ config.php",
"Theming" : "ชุดรูปแบบ",
"Hardening and security guidance" : "คำแนะนำการรักษาความปลอดภัย",
- "Transactional File Locking is enabled." : "เปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
- "Transactional File Locking is disabled." : "ปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
"Version" : "รุ่น",
"Developer documentation" : "เอกสารสำหรับนักพัฒนา",
"Experimental applications ahead" : "การใช้งานก่อนการทดลอง",
@@ -197,6 +200,7 @@ OC.L10N.register(
"licensed" : "ได้รับใบอนุญาต",
"Documentation:" : "เอกสาร:",
"User documentation" : "เอกสารสำหรับผู้ใช้",
+ "Admin documentation" : "เอกสารผู้ดูแลระบบ",
"Show description …" : "แสดงรายละเอียด ...",
"Hide description …" : "ซ่อนรายละเอียด ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "ไม่สามารถติดตั้งแอพฯนี้เพราะไม่มีตัวอ้างอิงต่อไปนี้:",
@@ -235,7 +239,7 @@ OC.L10N.register(
"Upload new" : "อัพโหลดใหม่",
"Select new from Files" : "เลือกใหม่จากไฟล์",
"Remove image" : "ลบรูปภาพ",
- "Either png or jpg. Ideally square but you will be able to crop it." : "ไฟล์ PNG และ JPG ควรจะเป็นสี่เหลี่ยม แต่คุณจะสามารถที่จะครอบตัดมัน",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "การครอบตัดรูปภาพ .PNG หรือ .JPG ให้รูปเป็นสี่เหลี่ยม ไฟล์ต้องมีขนาดไม่เกิน 20 เมกะไบต์",
"Your avatar is provided by your original account." : "อวตาลของคุณถูกระบุโดยบัญชีเดิมของคุณ",
"Cancel" : "ยกเลิก",
"Choose as profile image" : "เลือกรูปภาพโปรไฟล์",
diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json
index c0fbabfc5b7..8659b55d528 100644
--- a/settings/l10n/th_TH.json
+++ b/settings/l10n/th_TH.json
@@ -8,7 +8,7 @@
"Cron" : "Cron",
"Email server" : "อีเมลเซิร์ฟเวอร์",
"Log" : "บันทึกการเปลี่ยนแปลง",
- "Server Status" : "สถานะของเซิร์ฟเวอร์",
+ "Server status" : "สถานะเซิฟเวอร์",
"Tips & tricks" : "เคล็ดลับและเทคนิค",
"Updates" : "อัพเดท",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
@@ -29,7 +29,9 @@
"Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน",
"Enabled" : "เปิดการใช้งาน",
"Not enabled" : "ใช้งานไม่ได้",
+ "installing and updating apps via the app store or Federated Cloud Sharing" : "กำลังติดตั้งและอัพเดทแอพพลิเคชันผ่าแอพสโตร์หรือคลาวด์ในเครือ",
"Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL รุ่น %s เป็นรุ่นเก่า (%s)โปรดอัพเดทระบบปฏิบัติการหรือคุณสมบัติเป็น %s เพื่อการทำงานที่มีประสิทธิภาพ",
"A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)",
"Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์",
"Group already exists." : "มีกลุ่มนี้อยู่แล้ว",
@@ -74,6 +76,7 @@
"Uninstalling ...." : "กำลังถอนการติดตั้ง ...",
"Error while uninstalling app" : "เกิดข้อผิดพลาดขณะถอนการติดตั้งแอพพลิเคชัน",
"Uninstall" : "ถอนการติดตั้ง",
+ "An error occurred: {message}" : "เกิดข้อผิดพลาด: {message}",
"Select a profile picture" : "เลือกรูปภาพโปรไฟล์",
"Very weak password" : "รหัสผ่านระดับต่ำมาก",
"Weak password" : "รหัสผ่านระดับต่ำ",
@@ -176,6 +179,8 @@
"More" : "มาก",
"Less" : "น้อย",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "ไฟล์บันทึกมีขนาดใหญ่กว่า 100 เมกะไบต์ มันอาจจะใช้เวลาดาวน์โหลดนาน!",
+ "Transactional File Locking is enabled." : "เปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
+ "Transactional File Locking is disabled." : "ปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "จะใช้ SQLite เป็นฐานข้อมูล สำหรับการติดตั้งขนาดใหญ่เราขอแนะนำเพื่อสลับไปยังฐานข้อมูลแบ็กเอนด์ที่แตกต่างกัน",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "โดยเฉพาะอย่างยิ่งเมื่อใช้ไคลเอนต์เดสก์ทอปสำหรับการผสานข้อมูลโดย SQLite",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "การโยกย้ายไปยังฐานข้อมูลอื่นใช้เครื่องมือบรรทัดคำสั่ง: 'occ db:convert-type' หรือดูที่ <a target=\"_blank\" href=\"%s\">เอกสาร</a>",
@@ -185,8 +190,6 @@
"Improving the config.php" : "ปรับปรุงไฟล์ config.php",
"Theming" : "ชุดรูปแบบ",
"Hardening and security guidance" : "คำแนะนำการรักษาความปลอดภัย",
- "Transactional File Locking is enabled." : "เปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
- "Transactional File Locking is disabled." : "ปิดใช้งานล็อคไฟล์ขณะทำธุรกรรม",
"Version" : "รุ่น",
"Developer documentation" : "เอกสารสำหรับนักพัฒนา",
"Experimental applications ahead" : "การใช้งานก่อนการทดลอง",
@@ -195,6 +198,7 @@
"licensed" : "ได้รับใบอนุญาต",
"Documentation:" : "เอกสาร:",
"User documentation" : "เอกสารสำหรับผู้ใช้",
+ "Admin documentation" : "เอกสารผู้ดูแลระบบ",
"Show description …" : "แสดงรายละเอียด ...",
"Hide description …" : "ซ่อนรายละเอียด ...",
"This app cannot be installed because the following dependencies are not fulfilled:" : "ไม่สามารถติดตั้งแอพฯนี้เพราะไม่มีตัวอ้างอิงต่อไปนี้:",
@@ -233,7 +237,7 @@
"Upload new" : "อัพโหลดใหม่",
"Select new from Files" : "เลือกใหม่จากไฟล์",
"Remove image" : "ลบรูปภาพ",
- "Either png or jpg. Ideally square but you will be able to crop it." : "ไฟล์ PNG และ JPG ควรจะเป็นสี่เหลี่ยม แต่คุณจะสามารถที่จะครอบตัดมัน",
+ "Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB." : "การครอบตัดรูปภาพ .PNG หรือ .JPG ให้รูปเป็นสี่เหลี่ยม ไฟล์ต้องมีขนาดไม่เกิน 20 เมกะไบต์",
"Your avatar is provided by your original account." : "อวตาลของคุณถูกระบุโดยบัญชีเดิมของคุณ",
"Cancel" : "ยกเลิก",
"Choose as profile image" : "เลือกรูปภาพโปรไฟล์",
diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js
index bd6e254d3ec..a6afbd1f65a 100644
--- a/settings/l10n/tr.js
+++ b/settings/l10n/tr.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"Cron" : "Cron",
"Email server" : "E-posta sunucusu",
"Log" : "Günlük",
- "Server Status" : "Sunucu Durumu",
"Tips & tricks" : "İpuçları ve hileler",
"Updates" : "Güncellemeler",
"Authentication error" : "Kimlik doğrulama hatası",
@@ -178,6 +177,8 @@ OC.L10N.register(
"More" : "Daha fazla",
"Less" : "Daha az",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Günlük dosyası 100 MB'dan daha büyük. İndirmek zaman alabilir!",
+ "Transactional File Locking is enabled." : "İşlemsel Dosya Kilidi etkin.",
+ "Transactional File Locking is disabled." : "İşlemsel Dosya Kilidi devre dışı.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Veritabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veritabanı arka ucuna geçmenizi öneriyoruz.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Başka bir veritabanına geçmek için komut satırı aracını kullanın: 'occ db:convert-type' veya <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.",
@@ -187,8 +188,6 @@ OC.L10N.register(
"Improving the config.php" : "config.php iyileştirme",
"Theming" : "Tema",
"Hardening and security guidance" : "Sağlamlaştırma ve güvenlik rehberliği",
- "Transactional File Locking is enabled." : "İşlemsel Dosya Kilidi etkin.",
- "Transactional File Locking is disabled." : "İşlemsel Dosya Kilidi devre dışı.",
"Version" : "Sürüm",
"Developer documentation" : "Geliştirici belgelendirmesi",
"Experimental applications ahead" : "İlerideki deneysel uygulamalar",
@@ -235,7 +234,6 @@ OC.L10N.register(
"Upload new" : "Yeni yükle",
"Select new from Files" : "Dosyalardan seç",
"Remove image" : "Resmi kaldır",
- "Either png or jpg. Ideally square but you will be able to crop it." : "PNG veya JPG. Genellikle karedir ancak kesebileceksiniz.",
"Your avatar is provided by your original account." : "Görüntü resminiz, özgün hesabınız tarafından sağlanıyor.",
"Cancel" : "İptal",
"Choose as profile image" : "Profil resmi olarak seç",
diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json
index f4a8fb93b57..79923ef74f0 100644
--- a/settings/l10n/tr.json
+++ b/settings/l10n/tr.json
@@ -8,7 +8,6 @@
"Cron" : "Cron",
"Email server" : "E-posta sunucusu",
"Log" : "Günlük",
- "Server Status" : "Sunucu Durumu",
"Tips & tricks" : "İpuçları ve hileler",
"Updates" : "Güncellemeler",
"Authentication error" : "Kimlik doğrulama hatası",
@@ -176,6 +175,8 @@
"More" : "Daha fazla",
"Less" : "Daha az",
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Günlük dosyası 100 MB'dan daha büyük. İndirmek zaman alabilir!",
+ "Transactional File Locking is enabled." : "İşlemsel Dosya Kilidi etkin.",
+ "Transactional File Locking is disabled." : "İşlemsel Dosya Kilidi devre dışı.",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Veritabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veritabanı arka ucuna geçmenizi öneriyoruz.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.",
"To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Başka bir veritabanına geçmek için komut satırı aracını kullanın: 'occ db:convert-type' veya <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.",
@@ -185,8 +186,6 @@
"Improving the config.php" : "config.php iyileştirme",
"Theming" : "Tema",
"Hardening and security guidance" : "Sağlamlaştırma ve güvenlik rehberliği",
- "Transactional File Locking is enabled." : "İşlemsel Dosya Kilidi etkin.",
- "Transactional File Locking is disabled." : "İşlemsel Dosya Kilidi devre dışı.",
"Version" : "Sürüm",
"Developer documentation" : "Geliştirici belgelendirmesi",
"Experimental applications ahead" : "İlerideki deneysel uygulamalar",
@@ -233,7 +232,6 @@
"Upload new" : "Yeni yükle",
"Select new from Files" : "Dosyalardan seç",
"Remove image" : "Resmi kaldır",
- "Either png or jpg. Ideally square but you will be able to crop it." : "PNG veya JPG. Genellikle karedir ancak kesebileceksiniz.",
"Your avatar is provided by your original account." : "Görüntü resminiz, özgün hesabınız tarafından sağlanıyor.",
"Cancel" : "İptal",
"Choose as profile image" : "Profil resmi olarak seç",
diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js
index 093e9a57e57..51a7e526365 100644
--- a/settings/l10n/uk.js
+++ b/settings/l10n/uk.js
@@ -220,7 +220,6 @@ OC.L10N.register(
"Upload new" : "Завантажити нове",
"Select new from Files" : "Обрати із завантажених файлів",
"Remove image" : "Видалити зображення",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Допустимі формати: png і jpg. Якщо зображення не квадратне, то ви зможете його обрізати.",
"Your avatar is provided by your original account." : "Буде використано аватар вашого оригінального облікового запису.",
"Cancel" : "Відмінити",
"Choose as profile image" : "Обрати зображенням облікового запису",
diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json
index d63210e88e3..29002db8d02 100644
--- a/settings/l10n/uk.json
+++ b/settings/l10n/uk.json
@@ -218,7 +218,6 @@
"Upload new" : "Завантажити нове",
"Select new from Files" : "Обрати із завантажених файлів",
"Remove image" : "Видалити зображення",
- "Either png or jpg. Ideally square but you will be able to crop it." : "Допустимі формати: png і jpg. Якщо зображення не квадратне, то ви зможете його обрізати.",
"Your avatar is provided by your original account." : "Буде використано аватар вашого оригінального облікового запису.",
"Cancel" : "Відмінити",
"Choose as profile image" : "Обрати зображенням облікового запису",
diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js
index f769e00142d..e8703fa98ff 100644
--- a/settings/l10n/zh_CN.js
+++ b/settings/l10n/zh_CN.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"Cron" : "计划任务",
"Email server" : "电子邮件服务器",
"Log" : "日志",
- "Server Status" : "服务器状态",
"Tips & tricks" : "技巧提示",
"Updates" : "更新",
"Authentication error" : "认证错误",
@@ -160,7 +159,6 @@ OC.L10N.register(
"Upload new" : "上传新的",
"Select new from Files" : "从文件中选择一个新的",
"Remove image" : "移除图片",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png 或 jpg。正方形比较理想但你也可以之后对其进行裁剪。",
"Your avatar is provided by your original account." : "您的头像由您的原始账户所提供。",
"Cancel" : "取消",
"Choose as profile image" : "用作头像",
diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json
index d70e7045458..140962eabad 100644
--- a/settings/l10n/zh_CN.json
+++ b/settings/l10n/zh_CN.json
@@ -5,7 +5,6 @@
"Cron" : "计划任务",
"Email server" : "电子邮件服务器",
"Log" : "日志",
- "Server Status" : "服务器状态",
"Tips & tricks" : "技巧提示",
"Updates" : "更新",
"Authentication error" : "认证错误",
@@ -158,7 +157,6 @@
"Upload new" : "上传新的",
"Select new from Files" : "从文件中选择一个新的",
"Remove image" : "移除图片",
- "Either png or jpg. Ideally square but you will be able to crop it." : "png 或 jpg。正方形比较理想但你也可以之后对其进行裁剪。",
"Your avatar is provided by your original account." : "您的头像由您的原始账户所提供。",
"Cancel" : "取消",
"Choose as profile image" : "用作头像",
diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js
index e023bded57f..69298cb94e5 100644
--- a/settings/l10n/zh_TW.js
+++ b/settings/l10n/zh_TW.js
@@ -113,7 +113,6 @@ OC.L10N.register(
"Upload new" : "上傳新的",
"Select new from Files" : "從已上傳的檔案中選一個",
"Remove image" : "移除圖片",
- "Either png or jpg. Ideally square but you will be able to crop it." : "可以使用 png 或 jpg 格式,最好是方形的,但是您之後也可以裁剪它",
"Your avatar is provided by your original account." : "您的圖像是由您原來的帳號所提供的。",
"Cancel" : "取消",
"Choose as profile image" : "設定為大頭貼",
diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json
index 307ae041b63..2d7122fd2bc 100644
--- a/settings/l10n/zh_TW.json
+++ b/settings/l10n/zh_TW.json
@@ -111,7 +111,6 @@
"Upload new" : "上傳新的",
"Select new from Files" : "從已上傳的檔案中選一個",
"Remove image" : "移除圖片",
- "Either png or jpg. Ideally square but you will be able to crop it." : "可以使用 png 或 jpg 格式,最好是方形的,但是您之後也可以裁剪它",
"Your avatar is provided by your original account." : "您的圖像是由您原來的帳號所提供的。",
"Cancel" : "取消",
"Choose as profile image" : "設定為大頭貼",
diff --git a/settings/personal.php b/settings/personal.php
index 8823102e01a..203c9f68af8 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -104,6 +104,17 @@ $clients = array(
'ios' => $config->getSystemValue('customclient_ios', $defaults->getiOSClientUrl())
);
+// only show root certificate import if external storages are enabled
+$enableCertImport = false;
+$externalStorageEnabled = \OC::$server->getAppManager()->isEnabledForUser('files_external');
+if ($externalStorageEnabled) {
+ $backends = OC_Mount_Config::getPersonalBackends();
+ if (!empty($backends)) {
+ $enableCertImport = true;
+ }
+}
+
+
// Return template
$tmpl = new OC_Template( 'settings', 'personal', 'user');
$tmpl->assign('usage', OC_Helper::humanFileSize($storageInfo['used']));
@@ -120,6 +131,7 @@ $tmpl->assign('displayName', OC_User::getDisplayName());
$tmpl->assign('enableAvatars', $config->getSystemValue('enable_avatars', true));
$tmpl->assign('avatarChangeSupported', OC_User::canUserChangeAvatar(OC_User::getUser()));
$tmpl->assign('certs', $certificateManager->listCertificates());
+$tmpl->assign('showCertificates', $enableCertImport);
$tmpl->assign('urlGenerator', $urlGenerator);
// Get array of group ids for this user
@@ -157,7 +169,11 @@ $formsMap = array_map(function($form){
$formsAndMore = array_merge($formsAndMore, $formsMap);
// add bottom hardcoded forms from the template
-$formsAndMore[]= array( 'anchor' => 'ssl-root-certificates', 'section-name' => $l->t('SSL root certificates') );
+if($enableCertImport) {
+ $formsAndMore[]= array( 'anchor' => 'ssl-root-certificates', 'section-name' => $l->t('SSL root certificates') );
+}
+
+
$tmpl->assign('forms', $formsAndMore);
$tmpl->printPage();
diff --git a/settings/templates/admin.php b/settings/templates/admin.php
index a55071bdf84..ff8a2f0c953 100644
--- a/settings/templates/admin.php
+++ b/settings/templates/admin.php
@@ -326,10 +326,17 @@ if ($_['cronErrors']) {
</p>
<div id="EncryptionWarning" class="warning hidden">
- <?php p($l->t('Encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date. This is the final warning: Do you really want to enable encryption?')) ?>
- <input type="button"
+ <p><?php p($l->t('Please read carefully before activating server-side encryption: ')); ?></p>
+ <ul>
+ <li><?php p($l->t('Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date')); ?></li>
+ <li><?php p($l->t('Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage.')); ?></li>
+ <li><?php p($l->t('Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)')); ?></li>
+ <li><?php p($l->t('You should regularly backup all encryption keys to prevent permanent data loss (data/<user>/files_encryption and data/files_encryption)')); ?></li>
+ </ul>
+
+ <p><?php p($l->t('This is the final warning: Do you really want to enable encryption?')) ?> <input type="button"
id="reallyEnableEncryption"
- value="<?php p($l->t("Enable encryption")); ?>" />
+ value="<?php p($l->t("Enable encryption")); ?>" /></p>
</div>
<div id="EncryptionSettingsArea" class="<?php if (!$_['encryptionEnabled']) p('hidden'); ?>">
@@ -507,6 +514,19 @@ if ($_['cronErrors']) {
<?php endif; ?>
</div>
+<div class="section" id="server-status">
+ <h2><?php p($l->t('Server status'));?></h2>
+ <ul>
+ <li>
+ <?php if ($_['fileLockingEnabled']) {
+ p($l->t('Transactional File Locking is enabled.'));
+ } else {
+ p($l->t('Transactional File Locking is disabled.'));
+ } ?>
+ </li>
+ </ul>
+</div>
+
<div class="section" id="admin-tips">
<h2><?php p($l->t('Tips & tricks'));?></h2>
<ul>
@@ -528,18 +548,6 @@ if ($_['cronErrors']) {
<li><a target="_blank" href="<?php p(link_to_docs('admin-security')); ?>"><?php p($l->t('Hardening and security guidance'));?> ↗</a></li>
</ul>
</div>
-<div class="section" id="server-status">
- <h2><?php p($l->t('Server Status'));?></h2>
- <ul>
- <li>
- <?php if ($_['fileLockingEnabled']) {
- p($l->t('Transactional File Locking is enabled.'));
- } else {
- p($l->t('Transactional File Locking is disabled.'));
- } ?>
- </li>
- </ul>
-</div>
<div class="section">
<h2><?php p($l->t('Version'));?></h2>
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index 02ee261cd1d..490133c9f25 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -159,7 +159,7 @@ if($_['passwordChangeSupported']) {
<input type="file" class="hidden" name="files[]" id="uploadavatar">
<div class="inlineblock button" id="selectavatar"><?php p($l->t('Select new from Files')); ?></div>
<div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div><br>
- <?php p($l->t('Either png or jpg. Ideally square but you will be able to crop it.')); ?>
+ <?php p($l->t('Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB.')); ?>
<?php else: ?>
<?php p($l->t('Your avatar is provided by your original account.')); ?>
<?php endif; ?>
@@ -205,6 +205,7 @@ if($_['passwordChangeSupported']) {
<?php }
};?>
+<?php if($_['showCertificates']) : ?>
<div id="ssl-root-certificates" class="section">
<h2><?php p($l->t('SSL root certificates')); ?></h2>
<table id="sslCertificate" class="grid">
@@ -242,6 +243,7 @@ if($_['passwordChangeSupported']) {
<input type="button" id="rootcert_import_button" value="<?php p($l->t('Import root certificate')); ?>"/>
</form>
</div>
+<?php endif; ?>
<div class="section">
<h2><?php p($l->t('Version'));?></h2>
diff --git a/settings/templates/users/part.createuser.php b/settings/templates/users/part.createuser.php
index 9d9886f694c..0fc5a2bdeaa 100644
--- a/settings/templates/users/part.createuser.php
+++ b/settings/templates/users/part.createuser.php
@@ -31,7 +31,4 @@
alt="<?php p($l->t('Enter the recovery password in order to recover the users files during password change'))?>"/>
</div>
<?php endif; ?>
- <form autocomplete="off" id="usersearchform">
- <input type="text" class="input userFilter" placeholder="<?php p($l->t('Search Users')); ?>" />
- </form>
</div>
diff --git a/tests/core/avatar/avatarcontrollertest.php b/tests/core/avatar/avatarcontrollertest.php
index 0a85fbb27f1..952e013bb8f 100644
--- a/tests/core/avatar/avatarcontrollertest.php
+++ b/tests/core/avatar/avatarcontrollertest.php
@@ -23,7 +23,6 @@ namespace OC\Core\Avatar;
use OC;
use OC\Core\Application;
use OCP\AppFramework\IAppContainer;
-use OCP\Security\ISecureRandom;
use OC\Files\Filesystem;
use OCP\AppFramework\Http;
use OCP\Image;
@@ -264,7 +263,7 @@ class AvatarControllerTest extends \Test\TestCase {
$view->file_put_contents('avatar_upload', file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
//Create request return
- $reqRet = ['error' => [0], 'tmp_name' => [$fileName]];
+ $reqRet = ['error' => [0], 'tmp_name' => [$fileName], 'size' => [filesize(OC::$SERVERROOT.'/tests/data/testimage.jpg')]];
$this->container['Request']->method('getUploadedFile')->willReturn($reqRet);
$response = $this->avatarController->postAvatar(null);
@@ -303,7 +302,7 @@ class AvatarControllerTest extends \Test\TestCase {
$view->file_put_contents('avatar_upload', file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'));
//Create request return
- $reqRet = ['error' => [0], 'tmp_name' => [$fileName]];
+ $reqRet = ['error' => [0], 'tmp_name' => [$fileName], 'size' => filesize(OC::$SERVERROOT.'/tests/data/testimage.gif')];
$this->container['Request']->method('getUploadedFile')->willReturn($reqRet);
$response = $this->avatarController->postAvatar(null);
@@ -330,7 +329,7 @@ class AvatarControllerTest extends \Test\TestCase {
}
/**
- * Test invalid crop argment
+ * Test invalid crop argument
*/
public function testPostCroppedAvatarInvalidCrop() {
$response = $this->avatarController->postCroppedAvatar([]);
@@ -372,4 +371,18 @@ class AvatarControllerTest extends \Test\TestCase {
$this->assertEquals('success', $response->getData()['status']);
}
+ /**
+ * Check for proper reply on proper crop argument
+ */
+ public function testFileTooBig() {
+ $fileName = OC::$SERVERROOT.'/tests/data/testimage.jpg';
+ //Create request return
+ $reqRet = ['error' => [0], 'tmp_name' => [$fileName], 'size' => [21*1024*1024]];
+ $this->container['Request']->method('getUploadedFile')->willReturn($reqRet);
+
+ $response = $this->avatarController->postAvatar(null);
+
+ $this->assertEquals('File is too big', $response->getData()['data']['message']);
+ }
+
}
diff --git a/tests/lib/appframework/controller/OCSControllerTest.php b/tests/lib/appframework/controller/OCSControllerTest.php
index 11a9d45eb92..92b092cf0e9 100644
--- a/tests/lib/appframework/controller/OCSControllerTest.php
+++ b/tests/lib/appframework/controller/OCSControllerTest.php
@@ -69,9 +69,11 @@ class OCSControllerTest extends \Test\TestCase {
$expected = "<?xml version=\"1.0\"?>\n" .
"<ocs>\n" .
" <meta>\n" .
- " <status>OK</status>\n" .
+ " <status>failure</status>\n" .
" <statuscode>400</statuscode>\n" .
" <message>OK</message>\n" .
+ " <totalitems></totalitems>\n" .
+ " <itemsperpage></itemsperpage>\n" .
" </meta>\n" .
" <data>\n" .
" <test>hi</test>\n" .
@@ -99,9 +101,11 @@ class OCSControllerTest extends \Test\TestCase {
$expected = "<?xml version=\"1.0\"?>\n" .
"<ocs>\n" .
" <meta>\n" .
- " <status>OK</status>\n" .
+ " <status>failure</status>\n" .
" <statuscode>400</statuscode>\n" .
" <message>OK</message>\n" .
+ " <totalitems></totalitems>\n" .
+ " <itemsperpage></itemsperpage>\n" .
" </meta>\n" .
" <data>\n" .
" <test>hi</test>\n" .
@@ -126,8 +130,8 @@ class OCSControllerTest extends \Test\TestCase {
$this->getMock('\OCP\Security\ISecureRandom'),
$this->getMock('\OCP\IConfig')
));
- $expected = '{"status":"OK","statuscode":400,"message":"OK",' .
- '"totalitems":"","itemsperpage":"","data":{"test":"hi"}}';
+ $expected = '{"ocs":{"meta":{"status":"failure","statuscode":400,"message":"OK",' .
+ '"totalitems":"","itemsperpage":""},"data":{"test":"hi"}}}';
$params = [
'data' => [
'test' => 'hi'
diff --git a/tests/lib/appframework/http/OCSResponseTest.php b/tests/lib/appframework/http/OCSResponseTest.php
index 111dc7ad0a3..1ca3e330bad 100644
--- a/tests/lib/appframework/http/OCSResponseTest.php
+++ b/tests/lib/appframework/http/OCSResponseTest.php
@@ -47,14 +47,13 @@ class OCSResponseTest extends \Test\TestCase {
public function testRender() {
$response = new OCSResponse(
- 'xml', 'status', 2, 'message', ['test' => 'hi'], 'tag', 'abc',
- 'dynamic', 3, 4
+ 'xml', 2, 'message', ['test' => 'hi'], 3, 4
);
$out = $response->render();
$expected = "<?xml version=\"1.0\"?>\n" .
"<ocs>\n" .
" <meta>\n" .
- " <status>status</status>\n" .
+ " <status>failure</status>\n" .
" <statuscode>2</statuscode>\n" .
" <message>message</message>\n" .
" <totalitems>3</totalitems>\n" .
diff --git a/tests/lib/appframework/http/RequestTest.php b/tests/lib/appframework/http/RequestTest.php
index 6e86f3d7041..10a9e486c97 100644
--- a/tests/lib/appframework/http/RequestTest.php
+++ b/tests/lib/appframework/http/RequestTest.php
@@ -1156,4 +1156,99 @@ class RequestTest extends \Test\TestCase {
$this->assertSame($expectedUri, $request->getRequestUri());
}
+ public function testPassesCSRFCheckWithGet() {
+ /** @var Request $request */
+ $request = $this->getMockBuilder('\OC\AppFramework\Http\Request')
+ ->setMethods(['getScriptName'])
+ ->setConstructorArgs([
+ [
+ 'get' => [
+ 'requesttoken' => 'MyStoredRequestToken',
+ ],
+ 'requesttoken' => 'MyStoredRequestToken',
+ ],
+ $this->secureRandom,
+ $this->config,
+ $this->stream
+ ])
+ ->getMock();
+
+ $this->assertTrue($request->passesCSRFCheck());
+ }
+
+ public function testPassesCSRFCheckWithPost() {
+ /** @var Request $request */
+ $request = $this->getMockBuilder('\OC\AppFramework\Http\Request')
+ ->setMethods(['getScriptName'])
+ ->setConstructorArgs([
+ [
+ 'post' => [
+ 'requesttoken' => 'MyStoredRequestToken',
+ ],
+ 'requesttoken' => 'MyStoredRequestToken',
+ ],
+ $this->secureRandom,
+ $this->config,
+ $this->stream
+ ])
+ ->getMock();
+
+ $this->assertTrue($request->passesCSRFCheck());
+ }
+
+ public function testPassesCSRFCheckWithHeader() {
+ /** @var Request $request */
+ $request = $this->getMockBuilder('\OC\AppFramework\Http\Request')
+ ->setMethods(['getScriptName'])
+ ->setConstructorArgs([
+ [
+ 'server' => [
+ 'HTTP_REQUESTTOKEN' => 'MyStoredRequestToken',
+ ],
+ 'requesttoken' => 'MyStoredRequestToken',
+ ],
+ $this->secureRandom,
+ $this->config,
+ $this->stream
+ ])
+ ->getMock();
+
+ $this->assertTrue($request->passesCSRFCheck());
+ }
+
+ public function testPassesCSRFCheckWithInvalidToken() {
+ /** @var Request $request */
+ $request = $this->getMockBuilder('\OC\AppFramework\Http\Request')
+ ->setMethods(['getScriptName'])
+ ->setConstructorArgs([
+ [
+ 'server' => [
+ 'HTTP_REQUESTTOKEN' => 'MyInvalidSentToken',
+ ],
+ 'requesttoken' => 'MyStoredRequestToken',
+ ],
+ $this->secureRandom,
+ $this->config,
+ $this->stream
+ ])
+ ->getMock();
+
+ $this->assertFalse($request->passesCSRFCheck());
+ }
+
+ public function testPassesCSRFCheckWithoutTokenFail() {
+ /** @var Request $request */
+ $request = $this->getMockBuilder('\OC\AppFramework\Http\Request')
+ ->setMethods(['getScriptName'])
+ ->setConstructorArgs([
+ [],
+ $this->secureRandom,
+ $this->config,
+ $this->stream
+ ])
+ ->getMock();
+
+ $this->assertFalse($request->passesCSRFCheck());
+ }
+
}
diff --git a/tests/lib/appframework/utility/SimpleContainerTest.php b/tests/lib/appframework/utility/SimpleContainerTest.php
index 09857808b9f..7ff579a85fc 100644
--- a/tests/lib/appframework/utility/SimpleContainerTest.php
+++ b/tests/lib/appframework/utility/SimpleContainerTest.php
@@ -136,8 +136,7 @@ class SimpleContainerTest extends \Test\TestCase {
}
- public function tesOverrideService() {
- $this->container->registerParameter('test', 'abc');
+ public function testOverrideService() {
$this->container->registerService(
'Test\AppFramework\Utility\IInterfaceConstructor', function ($c) {
return $c->query('Test\AppFramework\Utility\ClassSimpleConstructor');
@@ -147,10 +146,9 @@ class SimpleContainerTest extends \Test\TestCase {
return $c->query('Test\AppFramework\Utility\ClassEmptyConstructor');
});
$object = $this->container->query(
- 'Test\AppFramework\Utility\ClassInterfaceConstructor'
+ 'Test\AppFramework\Utility\IInterfaceConstructor'
);
$this->assertTrue($object instanceof ClassEmptyConstructor);
- $this->assertEquals('abc', $object->test);
}
public function testRegisterAliasParamter() {
diff --git a/tests/lib/capabilitiesmanager.php b/tests/lib/capabilitiesmanager.php
new file mode 100644
index 00000000000..b5dac80ee51
--- /dev/null
+++ b/tests/lib/capabilitiesmanager.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace Test;
+
+use OC\CapabilitiesManager;
+
+class CapabilitiesManagerTest extends TestCase {
+
+ /**
+ * Test no capabilities
+ */
+ public function testNoCapabilities() {
+ $manager = new \OC\CapabilitiesManager();
+ $res = $manager->getCapabilities();
+ $this->assertEmpty($res);
+ }
+
+ /**
+ * Test a valid capabilitie
+ */
+ public function testValidCapability() {
+ $manager = new \OC\CapabilitiesManager();
+
+ $manager->registerCapability(function() {
+ return new SimpleCapability();
+ });
+
+ $res = $manager->getCapabilities();
+ $this->assertEquals(['foo' => 1], $res);
+ }
+
+ /**
+ * Test that we need something that implents ICapability
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage The given Capability (Test\NoCapability) does not implement the ICapability interface
+ */
+ public function testNoICapability() {
+ $manager = new \OC\CapabilitiesManager();
+
+ $manager->registerCapability(function() {
+ return new NoCapability();
+ });
+
+ $res = $manager->getCapabilities();
+ $this->assertEquals([], $res);
+ }
+
+ /**
+ * Test a bunch of merged Capabilities
+ */
+ public function testMergedCapabilities() {
+ $manager = new \OC\CapabilitiesManager();
+
+ $manager->registerCapability(function() {
+ return new SimpleCapability();
+ });
+ $manager->registerCapability(function() {
+ return new SimpleCapability2();
+ });
+ $manager->registerCapability(function() {
+ return new SimpleCapability3();
+ });
+
+ $res = $manager->getCapabilities();
+ $expected = [
+ 'foo' => 1,
+ 'bar' => [
+ 'x' => 1,
+ 'y' => 2
+ ]
+ ];
+
+ $this->assertEquals($expected, $res);
+ }
+
+ /**
+ * Test deep identical capabilities
+ */
+ public function testDeepIdenticalCapabilities() {
+ $manager = new \OC\CapabilitiesManager();
+
+ $manager->registerCapability(function() {
+ return new DeepCapability();
+ });
+ $manager->registerCapability(function() {
+ return new DeepCapability();
+ });
+
+ $res = $manager->getCapabilities();
+ $expected = [
+ 'foo' => [
+ 'bar' => [
+ 'baz' => true
+ ]
+ ]
+ ];
+
+ $this->assertEquals($expected, $res);
+ }
+}
+
+class SimpleCapability implements \OCP\Capabilities\ICapability {
+ public function getCapabilities() {
+ return [
+ 'foo' => 1
+ ];
+ }
+}
+
+class SimpleCapability2 implements \OCP\Capabilities\ICapability {
+ public function getCapabilities() {
+ return [
+ 'bar' => ['x' => 1]
+ ];
+ }
+}
+
+class SimpleCapability3 implements \OCP\Capabilities\ICapability {
+ public function getCapabilities() {
+ return [
+ 'bar' => ['y' => 2]
+ ];
+ }
+}
+
+class NoCapability {
+ public function getCapabilities() {
+ return [
+ 'baz' => 'z'
+ ];
+ }
+}
+
+class DeepCapability implements \OCP\Capabilities\ICapability {
+ public function getCapabilities() {
+ return [
+ 'foo' => [
+ 'bar' => [
+ 'baz' => true
+ ]
+ ]
+ ];
+ }
+}
+
diff --git a/tests/lib/db/mdb2schemamanager.php b/tests/lib/db/mdb2schemamanager.php
index e20f4c421b8..8ce6febf3ac 100644
--- a/tests/lib/db/mdb2schemamanager.php
+++ b/tests/lib/db/mdb2schemamanager.php
@@ -10,7 +10,6 @@
namespace Test\DB;
use Doctrine\DBAL\Platforms\OraclePlatform;
-use Doctrine\DBAL\Platforms\SQLServerPlatform;
class MDB2SchemaManager extends \Test\TestCase {
@@ -30,9 +29,6 @@ class MDB2SchemaManager extends \Test\TestCase {
if ($connection->getDatabasePlatform() instanceof OraclePlatform) {
$this->markTestSkipped('Adding auto increment columns in Oracle is not supported.');
}
- if ($connection->getDatabasePlatform() instanceof SQLServerPlatform) {
- $this->markTestSkipped('DB migration tests are not supported on MSSQL');
- }
$manager = new \OC\DB\MDB2SchemaManager($connection);
diff --git a/tests/lib/db/migrator.php b/tests/lib/db/migrator.php
index 6bde68c2d20..4d558909743 100644
--- a/tests/lib/db/migrator.php
+++ b/tests/lib/db/migrator.php
@@ -11,9 +11,9 @@ namespace Test\DB;
use \Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Platforms\OraclePlatform;
-use Doctrine\DBAL\Platforms\SQLServerPlatform;
use \Doctrine\DBAL\Schema\Schema;
use \Doctrine\DBAL\Schema\SchemaConfig;
+use OCP\IConfig;
class Migrator extends \Test\TestCase {
/**
@@ -31,6 +31,7 @@ class Migrator extends \Test\TestCase {
**/
private $config;
+ /** @var string */
private $tableName;
protected function setUp() {
@@ -41,9 +42,6 @@ class Migrator extends \Test\TestCase {
if ($this->connection->getDatabasePlatform() instanceof OraclePlatform) {
$this->markTestSkipped('DB migration tests are not supported on OCI');
}
- if ($this->connection->getDatabasePlatform() instanceof SQLServerPlatform) {
- $this->markTestSkipped('DB migration tests are not supported on MSSQL');
- }
$this->manager = new \OC\DB\MDB2SchemaManager($this->connection);
$this->tableName = strtolower($this->getUniqueID($this->config->getSystemValue('dbtableprefix', 'oc_') . 'test_'));
}
diff --git a/tests/lib/db/querybuilder/querybuildertest.php b/tests/lib/db/querybuilder/querybuildertest.php
index 02e516b7386..75e62ba944e 100644
--- a/tests/lib/db/querybuilder/querybuildertest.php
+++ b/tests/lib/db/querybuilder/querybuildertest.php
@@ -253,8 +253,8 @@ class QueryBuilderTest extends \Test\TestCase {
public function dataDelete() {
return [
- ['data', null, ['table' => '`data`', 'alias' => null], '`data`'],
- ['data', 't', ['table' => '`data`', 'alias' => 't'], '`data` t'],
+ ['data', null, ['table' => '`*PREFIX*data`', 'alias' => null], '`*PREFIX*data`'],
+ ['data', 't', ['table' => '`*PREFIX*data`', 'alias' => 't'], '`*PREFIX*data` t'],
];
}
@@ -282,8 +282,8 @@ class QueryBuilderTest extends \Test\TestCase {
public function dataUpdate() {
return [
- ['data', null, ['table' => '`data`', 'alias' => null], '`data`'],
- ['data', 't', ['table' => '`data`', 'alias' => 't'], '`data` t'],
+ ['data', null, ['table' => '`*PREFIX*data`', 'alias' => null], '`*PREFIX*data`'],
+ ['data', 't', ['table' => '`*PREFIX*data`', 'alias' => 't'], '`*PREFIX*data` t'],
];
}
@@ -311,7 +311,7 @@ class QueryBuilderTest extends \Test\TestCase {
public function dataInsert() {
return [
- ['data', ['table' => '`data`'], '`data`'],
+ ['data', ['table' => '`*PREFIX*data`'], '`*PREFIX*data`'],
];
}
@@ -338,16 +338,16 @@ class QueryBuilderTest extends \Test\TestCase {
public function dataFrom() {
return [
- ['data', null, null, null, [['table' => '`data`', 'alias' => null]], '`data`'],
- ['data', 't', null, null, [['table' => '`data`', 'alias' => 't']], '`data` t'],
+ ['data', null, null, null, [['table' => '`*PREFIX*data`', 'alias' => null]], '`*PREFIX*data`'],
+ ['data', 't', null, null, [['table' => '`*PREFIX*data`', 'alias' => 't']], '`*PREFIX*data` t'],
['data1', null, 'data2', null, [
- ['table' => '`data1`', 'alias' => null],
- ['table' => '`data2`', 'alias' => null]
- ], '`data1`, `data2`'],
+ ['table' => '`*PREFIX*data1`', 'alias' => null],
+ ['table' => '`*PREFIX*data2`', 'alias' => null]
+ ], '`*PREFIX*data1`, `*PREFIX*data2`'],
['data', 't1', 'data', 't2', [
- ['table' => '`data`', 'alias' => 't1'],
- ['table' => '`data`', 'alias' => 't2']
- ], '`data` t1, `data` t2'],
+ ['table' => '`*PREFIX*data`', 'alias' => 't1'],
+ ['table' => '`*PREFIX*data`', 'alias' => 't2']
+ ], '`*PREFIX*data` t1, `*PREFIX*data` t2'],
];
}
@@ -382,18 +382,18 @@ class QueryBuilderTest extends \Test\TestCase {
return [
[
'd1', 'data2', null, null,
- ['d1' => [['joinType' => 'inner', 'joinTable' => '`data2`', 'joinAlias' => null, 'joinCondition' => null]]],
- '`data1` d1 INNER JOIN `data2` ON '
+ ['d1' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]],
+ '`*PREFIX*data1` d1 INNER JOIN `*PREFIX*data2` ON '
],
[
'd1', 'data2', 'd2', null,
- ['d1' => [['joinType' => 'inner', 'joinTable' => '`data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]],
- '`data1` d1 INNER JOIN `data2` d2 ON '
+ ['d1' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]],
+ '`*PREFIX*data1` d1 INNER JOIN `*PREFIX*data2` d2 ON '
],
[
'd1', 'data2', 'd2', 'd1.`field1` = d2.`field2`',
- ['d1' => [['joinType' => 'inner', 'joinTable' => '`data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]],
- '`data1` d1 INNER JOIN `data2` d2 ON d1.`field1` = d2.`field2`'
+ ['d1' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]],
+ '`*PREFIX*data1` d1 INNER JOIN `*PREFIX*data2` d2 ON d1.`field1` = d2.`field2`'
],
];
@@ -463,18 +463,18 @@ class QueryBuilderTest extends \Test\TestCase {
return [
[
'd1', 'data2', null, null,
- ['d1' => [['joinType' => 'left', 'joinTable' => '`data2`', 'joinAlias' => null, 'joinCondition' => null]]],
- '`data1` d1 LEFT JOIN `data2` ON '
+ ['d1' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]],
+ '`*PREFIX*data1` d1 LEFT JOIN `*PREFIX*data2` ON '
],
[
'd1', 'data2', 'd2', null,
- ['d1' => [['joinType' => 'left', 'joinTable' => '`data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]],
- '`data1` d1 LEFT JOIN `data2` d2 ON '
+ ['d1' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]],
+ '`*PREFIX*data1` d1 LEFT JOIN `*PREFIX*data2` d2 ON '
],
[
'd1', 'data2', 'd2', 'd1.`field1` = d2.`field2`',
- ['d1' => [['joinType' => 'left', 'joinTable' => '`data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]],
- '`data1` d1 LEFT JOIN `data2` d2 ON d1.`field1` = d2.`field2`'
+ ['d1' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]],
+ '`*PREFIX*data1` d1 LEFT JOIN `*PREFIX*data2` d2 ON d1.`field1` = d2.`field2`'
],
];
}
@@ -513,18 +513,18 @@ class QueryBuilderTest extends \Test\TestCase {
return [
[
'd1', 'data2', null, null,
- ['d1' => [['joinType' => 'right', 'joinTable' => '`data2`', 'joinAlias' => null, 'joinCondition' => null]]],
- '`data1` d1 RIGHT JOIN `data2` ON '
+ ['d1' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]],
+ '`*PREFIX*data1` d1 RIGHT JOIN `*PREFIX*data2` ON '
],
[
'd1', 'data2', 'd2', null,
- ['d1' => [['joinType' => 'right', 'joinTable' => '`data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]],
- '`data1` d1 RIGHT JOIN `data2` d2 ON '
+ ['d1' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]],
+ '`*PREFIX*data1` d1 RIGHT JOIN `*PREFIX*data2` d2 ON '
],
[
'd1', 'data2', 'd2', 'd1.`field1` = d2.`field2`',
- ['d1' => [['joinType' => 'right', 'joinTable' => '`data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]],
- '`data1` d1 RIGHT JOIN `data2` d2 ON d1.`field1` = d2.`field2`'
+ ['d1' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]],
+ '`*PREFIX*data1` d1 RIGHT JOIN `*PREFIX*data2` d2 ON d1.`field1` = d2.`field2`'
],
];
}
@@ -591,7 +591,7 @@ class QueryBuilderTest extends \Test\TestCase {
);
$this->assertSame(
- 'UPDATE `data` SET ' . $expectedQuery,
+ 'UPDATE `*PREFIX*data` SET ' . $expectedQuery,
$this->queryBuilder->getSQL()
);
}
@@ -774,7 +774,7 @@ class QueryBuilderTest extends \Test\TestCase {
);
$this->assertSame(
- 'INSERT INTO `data` ' . $expectedQuery,
+ 'INSERT INTO `*PREFIX*data` ' . $expectedQuery,
$this->queryBuilder->getSQL()
);
}
@@ -799,7 +799,7 @@ class QueryBuilderTest extends \Test\TestCase {
);
$this->assertSame(
- 'INSERT INTO `data` ' . $expectedQuery,
+ 'INSERT INTO `*PREFIX*data` ' . $expectedQuery,
$this->queryBuilder->getSQL()
);
}
@@ -996,4 +996,34 @@ class QueryBuilderTest extends \Test\TestCase {
$this->queryBuilder->getSQL()
);
}
+
+ public function dataGetTableName() {
+ return [
+ ['*PREFIX*table', null, '`*PREFIX*table`'],
+ ['*PREFIX*table', true, '`*PREFIX*table`'],
+ ['*PREFIX*table', false, '`*PREFIX*table`'],
+
+ ['table', null, '`*PREFIX*table`'],
+ ['table', true, '`*PREFIX*table`'],
+ ['table', false, '`table`'],
+ ];
+ }
+
+ /**
+ * @dataProvider dataGetTableName
+ *
+ * @param string $tableName
+ * @param bool $automatic
+ * @param string $expected
+ */
+ public function testGetTableName($tableName, $automatic, $expected) {
+ if ($automatic !== null) {
+ $this->queryBuilder->automaticTablePrefix($automatic);
+ }
+
+ $this->assertSame(
+ $expected,
+ $this->invokePrivate($this->queryBuilder, 'getTableName', [$tableName])
+ );
+ }
}
diff --git a/tests/lib/dbschema.php b/tests/lib/dbschema.php
index cfaebec079e..97307664b6a 100644
--- a/tests/lib/dbschema.php
+++ b/tests/lib/dbschema.php
@@ -47,9 +47,6 @@ class Test_DBSchema extends \Test\TestCase {
*/
public function testSchema() {
$platform = \OC_DB::getConnection()->getDatabasePlatform();
- if ($platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform) {
- $this->markTestSkipped("Test not relevant on MSSQL");
- }
$this->doTestSchemaCreating();
$this->doTestSchemaChanging();
$this->doTestSchemaDumping();
diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php
index e6947e36a17..acc03cc4c77 100644
--- a/tests/lib/files/cache/watcher.php
+++ b/tests/lib/files/cache/watcher.php
@@ -39,6 +39,7 @@ class Watcher extends \Test\TestCase {
$storage = $this->getTestStorage();
$cache = $storage->getCache();
$updater = $storage->getWatcher();
+ $updater->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE);
//set the mtime to the past so it can detect an mtime change
$cache->put('', array('storage_mtime' => 10));
@@ -79,6 +80,7 @@ class Watcher extends \Test\TestCase {
$storage = $this->getTestStorage();
$cache = $storage->getCache();
$updater = $storage->getWatcher();
+ $updater->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE);
//set the mtime to the past so it can detect an mtime change
$cache->put('', array('storage_mtime' => 10));
@@ -95,6 +97,7 @@ class Watcher extends \Test\TestCase {
$storage = $this->getTestStorage();
$cache = $storage->getCache();
$updater = $storage->getWatcher();
+ $updater->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE);
//set the mtime to the past so it can detect an mtime change
$cache->put('foo.txt', array('storage_mtime' => 10));
diff --git a/tests/lib/files/mount/mountpoint.php b/tests/lib/files/mount/mountpoint.php
index 29610e6058d..d758c1b8d4d 100644
--- a/tests/lib/files/mount/mountpoint.php
+++ b/tests/lib/files/mount/mountpoint.php
@@ -70,4 +70,25 @@ class MountPoint extends \Test\TestCase {
// storage wrapper never called
$this->assertFalse($called);
}
+
+ public function testWrappedStorage() {
+ $storage = $this->getMockBuilder('\OC\Files\Storage\Wrapper\Wrapper')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $loader = $this->getMock('\OCP\Files\Storage\IStorageFactory');
+ $loader->expects($this->never())
+ ->method('getInstance');
+ $loader->expects($this->never())
+ ->method('wrap');
+
+ $mountPoint = new \OC\Files\Mount\MountPoint(
+ $storage,
+ '/mountpoint',
+ null,
+ $loader
+ );
+
+ $this->assertEquals($storage, $mountPoint->getStorage());
+ }
}
diff --git a/tests/lib/files/pathverificationtest.php b/tests/lib/files/pathverificationtest.php
index b59aceba7b1..13fccd310f3 100644
--- a/tests/lib/files/pathverificationtest.php
+++ b/tests/lib/files/pathverificationtest.php
@@ -83,6 +83,10 @@ class PathVerification extends \Test\TestCase {
return [
// this is the monkey emoji - http://en.wikipedia.org/w/index.php?title=%F0%9F%90%B5&redirect=no
['🐵'],
+ ['🐵.txt'],
+ ['txt.💩'],
+ ['💩🐵.txt'],
+ ['💩🐵'],
];
}
diff --git a/tests/lib/files/storage/wrapper/availability.php b/tests/lib/files/storage/wrapper/availability.php
new file mode 100644
index 00000000000..9b394df8ca3
--- /dev/null
+++ b/tests/lib/files/storage/wrapper/availability.php
@@ -0,0 +1,149 @@
+<?php
+/**
+ * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace Test\Files\Storage\Wrapper;
+
+class Availability extends \Test\TestCase {
+ protected function getWrapperInstance() {
+ $storage = $this->getMockBuilder('\OC\Files\Storage\Temporary')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $wrapper = new \OC\Files\Storage\Wrapper\Availability(['storage' => $storage]);
+ return [$storage, $wrapper];
+ }
+
+ /**
+ * Storage is available
+ */
+ public function testAvailable() {
+ list($storage, $wrapper) = $this->getWrapperInstance();
+ $storage->expects($this->once())
+ ->method('getAvailability')
+ ->willReturn(['available' => true, 'last_checked' => 0]);
+ $storage->expects($this->never())
+ ->method('test');
+ $storage->expects($this->once())
+ ->method('mkdir');
+
+ $wrapper->mkdir('foobar');
+ }
+
+ /**
+ * Storage marked unavailable, TTL not expired
+ *
+ * @expectedException \OCP\Files\StorageNotAvailableException
+ */
+ public function testUnavailable() {
+ list($storage, $wrapper) = $this->getWrapperInstance();
+ $storage->expects($this->once())
+ ->method('getAvailability')
+ ->willReturn(['available' => false, 'last_checked' => time()]);
+ $storage->expects($this->never())
+ ->method('test');
+ $storage->expects($this->never())
+ ->method('mkdir');
+
+ $wrapper->mkdir('foobar');
+ }
+
+ /**
+ * Storage marked unavailable, TTL expired
+ */
+ public function testUnavailableRecheck() {
+ list($storage, $wrapper) = $this->getWrapperInstance();
+ $storage->expects($this->once())
+ ->method('getAvailability')
+ ->willReturn(['available' => false, 'last_checked' => 0]);
+ $storage->expects($this->once())
+ ->method('test')
+ ->willReturn(true);
+ $storage->expects($this->once())
+ ->method('setAvailability')
+ ->with($this->equalTo(true));
+ $storage->expects($this->once())
+ ->method('mkdir');
+
+ $wrapper->mkdir('foobar');
+ }
+
+ /**
+ * Storage marked available, but throws StorageNotAvailableException
+ *
+ * @expectedException \OCP\Files\StorageNotAvailableException
+ */
+ public function testAvailableThrowStorageNotAvailable() {
+ list($storage, $wrapper) = $this->getWrapperInstance();
+ $storage->expects($this->once())
+ ->method('getAvailability')
+ ->willReturn(['available' => true, 'last_checked' => 0]);
+ $storage->expects($this->never())
+ ->method('test');
+ $storage->expects($this->once())
+ ->method('mkdir')
+ ->will($this->throwException(new \OCP\Files\StorageNotAvailableException()));
+ $storage->expects($this->once())
+ ->method('setAvailability')
+ ->with($this->equalTo(false));
+
+ $wrapper->mkdir('foobar');
+ }
+
+ /**
+ * Storage available, but call fails
+ * Method failure does not indicate storage unavailability
+ */
+ public function testAvailableFailure() {
+ list($storage, $wrapper) = $this->getWrapperInstance();
+ $storage->expects($this->once())
+ ->method('getAvailability')
+ ->willReturn(['available' => true, 'last_checked' => 0]);
+ $storage->expects($this->never())
+ ->method('test');
+ $storage->expects($this->once())
+ ->method('mkdir')
+ ->willReturn(false);
+ $storage->expects($this->never())
+ ->method('setAvailability');
+
+ $wrapper->mkdir('foobar');
+ }
+
+ /**
+ * Storage available, but throws exception
+ * Standard exception does not indicate storage unavailability
+ *
+ * @expectedException \Exception
+ */
+ public function testAvailableThrow() {
+ list($storage, $wrapper) = $this->getWrapperInstance();
+ $storage->expects($this->once())
+ ->method('getAvailability')
+ ->willReturn(['available' => true, 'last_checked' => 0]);
+ $storage->expects($this->never())
+ ->method('test');
+ $storage->expects($this->once())
+ ->method('mkdir')
+ ->will($this->throwException(new \Exception()));
+ $storage->expects($this->never())
+ ->method('setAvailability');
+
+ $wrapper->mkdir('foobar');
+ }
+}
diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php
index 612cf827975..c49e6bb0d1f 100644
--- a/tests/lib/files/storage/wrapper/encryption.php
+++ b/tests/lib/files/storage/wrapper/encryption.php
@@ -261,10 +261,12 @@ class Encryption extends \Test\Files\Storage\Storage {
->expects($this->once())
->method('copyKeys')
->willReturn($copyKeysReturn);
- $this->cache->expects($this->once())
+ $this->cache->expects($this->atLeastOnce())
->method('put')
- ->with($this->anything(), ['encrypted' => true])
- ->willReturn(true);
+ ->willReturnCallback(function($path, $data) {
+ $this->assertArrayHasKey('encrypted', $data);
+ $this->assertTrue($data['encrypted']);
+ });
} else {
$this->cache->expects($this->never())->method('put');
$this->keyStore->expects($this->never())->method('copyKeys');
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 382c033f19c..bf99a582117 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -44,8 +44,22 @@ class View extends \Test\TestCase {
* @var \OC\Files\Storage\Storage[] $storages
*/
private $storages = array();
+
+ /**
+ * @var string
+ */
private $user;
+ /**
+ * @var \OCP\IUser
+ */
+ private $userObject;
+
+ /**
+ * @var \OCP\IGroup
+ */
+ private $groupObject;
+
/** @var \OC\Files\Storage\Storage */
private $tempStorage;
@@ -57,10 +71,15 @@ class View extends \Test\TestCase {
\OC_User::useBackend(new \OC_User_Dummy());
//login
- \OC_User::createUser('test', 'test');
+ $userManager = \OC::$server->getUserManager();
+ $groupManager = \OC::$server->getGroupManager();
+ $this->user = 'test';
+ $this->userObject = $userManager->createUser('test', 'test');
- $this->loginAsUser('test');
- $this->user = \OC_User::getUser();
+ $this->groupObject = $groupManager->createGroup('group1');
+ $this->groupObject->addUser($this->userObject);
+
+ $this->loginAsUser($this->user);
// clear mounts but somehow keep the root storage
// that was initialized above...
\OC\Files\Filesystem::clearMounts();
@@ -81,6 +100,10 @@ class View extends \Test\TestCase {
}
$this->logout();
+
+ $this->userObject->delete();
+ $this->groupObject->delete();
+
parent::tearDown();
}
@@ -208,6 +231,40 @@ class View extends \Test\TestCase {
$this->assertEquals(4, count($folderContent));
}
+ public function sharingDisabledPermissionProvider() {
+ return [
+ ['no', '', true],
+ ['yes', 'group1', false],
+ ];
+ }
+
+ /**
+ * @dataProvider sharingDisabledPermissionProvider
+ */
+ public function testRemoveSharePermissionWhenSharingDisabledForUser($excludeGroups, $excludeGroupsList, $expectedShareable) {
+ $appConfig = \OC::$server->getAppConfig();
+ $oldExcludeGroupsFlag = $appConfig->getValue('core', 'shareapi_exclude_groups', 'no');
+ $oldExcludeGroupsList = $appConfig->getValue('core', 'shareapi_exclude_groups_list', '');
+ $appConfig->setValue('core', 'shareapi_exclude_groups', $excludeGroups);
+ $appConfig->setValue('core', 'shareapi_exclude_groups_list', $excludeGroupsList);
+
+ $storage1 = $this->getTestStorage();
+ $storage2 = $this->getTestStorage();
+ \OC\Files\Filesystem::mount($storage1, array(), '/');
+ \OC\Files\Filesystem::mount($storage2, array(), '/mount');
+
+ $view = new \OC\Files\View('/');
+
+ $folderContent = $view->getDirectoryContent('');
+ $this->assertEquals($expectedShareable, $folderContent[0]->isShareable());
+
+ $folderContent = $view->getDirectoryContent('mount');
+ $this->assertEquals($expectedShareable, $folderContent[0]->isShareable());
+
+ $appConfig->setValue('core', 'shareapi_exclude_groups', $oldExcludeGroupsFlag);
+ $appConfig->setValue('core', 'shareapi_exclude_groups_list', $oldExcludeGroupsList);
+ }
+
function testCacheIncompleteFolder() {
$storage1 = $this->getTestStorage(false);
\OC\Files\Filesystem::clearMounts();
diff --git a/tests/lib/repair/cleantags.php b/tests/lib/repair/cleantags.php
index 2f6d0879642..a511daa03d6 100644
--- a/tests/lib/repair/cleantags.php
+++ b/tests/lib/repair/cleantags.php
@@ -40,13 +40,13 @@ class CleanTags extends \Test\TestCase {
protected function cleanUpTables() {
$qb = $this->connection->getQueryBuilder();
- $qb->delete('*PREFIX*vcategory')
+ $qb->delete('vcategory')
->execute();
- $qb->delete('*PREFIX*vcategory_to_object')
+ $qb->delete('vcategory_to_object')
->execute();
- $qb->delete('*PREFIX*filecache')
+ $qb->delete('filecache')
->execute();
}
@@ -61,20 +61,20 @@ class CleanTags extends \Test\TestCase {
$this->addTagEntry(9999999, $cat3, 'contacts'); // Retained
$this->addTagEntry($this->getFileID(), $cat3 + 1, 'files'); // Deleted: Category is NULL
- $this->assertEntryCount('*PREFIX*vcategory_to_object', 4, 'Assert tag entries count before repair step');
- $this->assertEntryCount('*PREFIX*vcategory', 4, 'Assert tag categories count before repair step');
+ $this->assertEntryCount('vcategory_to_object', 4, 'Assert tag entries count before repair step');
+ $this->assertEntryCount('vcategory', 4, 'Assert tag categories count before repair step');
self::invokePrivate($this->repair, 'deleteOrphanFileEntries');
- $this->assertEntryCount('*PREFIX*vcategory_to_object', 3, 'Assert tag entries count after cleaning file entries');
- $this->assertEntryCount('*PREFIX*vcategory', 4, 'Assert tag categories count after cleaning file entries');
+ $this->assertEntryCount('vcategory_to_object', 3, 'Assert tag entries count after cleaning file entries');
+ $this->assertEntryCount('vcategory', 4, 'Assert tag categories count after cleaning file entries');
self::invokePrivate($this->repair, 'deleteOrphanTagEntries');
- $this->assertEntryCount('*PREFIX*vcategory_to_object', 2, 'Assert tag entries count after cleaning tag entries');
- $this->assertEntryCount('*PREFIX*vcategory', 4, 'Assert tag categories count after cleaning tag entries');
+ $this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning tag entries');
+ $this->assertEntryCount('vcategory', 4, 'Assert tag categories count after cleaning tag entries');
self::invokePrivate($this->repair, 'deleteOrphanCategoryEntries');
- $this->assertEntryCount('*PREFIX*vcategory_to_object', 2, 'Assert tag entries count after cleaning category entries');
- $this->assertEntryCount('*PREFIX*vcategory', 2, 'Assert tag categories count after cleaning category entries');
+ $this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning category entries');
+ $this->assertEntryCount('vcategory', 2, 'Assert tag categories count after cleaning category entries');
}
/**
@@ -100,7 +100,7 @@ class CleanTags extends \Test\TestCase {
*/
protected function addTagCategory($category, $type) {
$qb = $this->connection->getQueryBuilder();
- $qb->insert('*PREFIX*vcategory')
+ $qb->insert('vcategory')
->values([
'uid' => $qb->createNamedParameter('TestRepairCleanTags'),
'category' => $qb->createNamedParameter($category),
@@ -108,7 +108,7 @@ class CleanTags extends \Test\TestCase {
])
->execute();
- return (int) $this->getLastInsertID('*PREFIX*vcategory', 'id');
+ return (int) $this->getLastInsertID('vcategory', 'id');
}
/**
@@ -119,7 +119,7 @@ class CleanTags extends \Test\TestCase {
*/
protected function addTagEntry($objectId, $category, $type) {
$qb = $this->connection->getQueryBuilder();
- $qb->insert('*PREFIX*vcategory_to_object')
+ $qb->insert('vcategory_to_object')
->values([
'objid' => $qb->createNamedParameter($objectId, \PDO::PARAM_INT),
'categoryid' => $qb->createNamedParameter($category, \PDO::PARAM_INT),
@@ -141,21 +141,21 @@ class CleanTags extends \Test\TestCase {
// We create a new file entry and delete it after the test again
$fileName = $this->getUniqueID('TestRepairCleanTags', 12);
- $qb->insert('*PREFIX*filecache')
+ $qb->insert('filecache')
->values([
'path' => $qb->createNamedParameter($fileName),
'path_hash' => $qb->createNamedParameter(md5($fileName)),
])
->execute();
$fileName = $this->getUniqueID('TestRepairCleanTags', 12);
- $qb->insert('*PREFIX*filecache')
+ $qb->insert('filecache')
->values([
'path' => $qb->createNamedParameter($fileName),
'path_hash' => $qb->createNamedParameter(md5($fileName)),
])
->execute();
- $this->createdFile = (int) $this->getLastInsertID('*PREFIX*filecache', 'fileid');
+ $this->createdFile = (int) $this->getLastInsertID('filecache', 'fileid');
return $this->createdFile;
}
diff --git a/tests/lib/server.php b/tests/lib/server.php
index cf0ad8265bf..9c5c83ceb5c 100644
--- a/tests/lib/server.php
+++ b/tests/lib/server.php
@@ -1,6 +1,9 @@
<?php
/**
* @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -48,6 +51,7 @@ class Server extends \Test\TestCase {
['AvatarManager', '\OC\AvatarManager'],
['AvatarManager', '\OCP\IAvatarManager'],
+ ['CapabilitiesManager', '\OC\CapabilitiesManager'],
['ContactsManager', '\OC\ContactsManager'],
['ContactsManager', '\OCP\Contacts\IManager'],
['Crypto', '\OC\Security\Crypto'],
diff --git a/tests/lib/setup.php b/tests/lib/setup.php
index 79ca0c0be90..72c84520056 100644
--- a/tests/lib/setup.php
+++ b/tests/lib/setup.php
@@ -20,6 +20,10 @@ class Test_OC_Setup extends \Test\TestCase {
private $defaults;
/** @var \OC\Setup | PHPUnit_Framework_MockObject_MockObject */
protected $setupClass;
+ /** @var \OCP\ILogger | PHPUnit_Framework_MockObject_MockObject */
+ protected $logger;
+ /** @var \OCP\Security\ISecureRandom | PHPUnit_Framework_MockObject_MockObject */
+ protected $random;
protected function setUp() {
parent::setUp();
@@ -28,9 +32,11 @@ class Test_OC_Setup extends \Test\TestCase {
$this->iniWrapper = $this->getMock('\bantu\IniGetWrapper\IniGetWrapper');
$this->l10n = $this->getMock('\OCP\IL10N');
$this->defaults = $this->getMock('\OC_Defaults');
+ $this->logger = $this->getMock('\OCP\ILogger');
+ $this->random = $this->getMock('\OCP\Security\ISecureRandom');
$this->setupClass = $this->getMock('\OC\Setup',
- ['class_exists', 'is_callable'],
- [$this->config, $this->iniWrapper, $this->l10n, $this->defaults]);
+ ['class_exists', 'is_callable', 'getAvailableDbDriversForPdo'],
+ [$this->config, $this->iniWrapper, $this->l10n, $this->defaults, $this->logger, $this->random]);
}
public function testGetSupportedDatabasesWithOneWorking() {
@@ -45,9 +51,13 @@ class Test_OC_Setup extends \Test\TestCase {
->method('class_exists')
->will($this->returnValue(true));
$this->setupClass
- ->expects($this->exactly(2))
+ ->expects($this->once())
->method('is_callable')
->will($this->returnValue(false));
+ $this->setupClass
+ ->expects($this->once())
+ ->method('getAvailableDbDriversForPdo')
+ ->will($this->returnValue([]));
$result = $this->setupClass->getSupportedDatabases();
$expectedResult = array(
'sqlite' => 'SQLite'
@@ -68,36 +78,43 @@ class Test_OC_Setup extends \Test\TestCase {
->method('class_exists')
->will($this->returnValue(false));
$this->setupClass
- ->expects($this->exactly(3))
+ ->expects($this->exactly(2))
->method('is_callable')
->will($this->returnValue(false));
+ $this->setupClass
+ ->expects($this->once())
+ ->method('getAvailableDbDriversForPdo')
+ ->will($this->returnValue([]));
$result = $this->setupClass->getSupportedDatabases();
$this->assertSame(array(), $result);
}
- public function testGetSupportedDatabasesWitAllWorking() {
+ public function testGetSupportedDatabasesWithAllWorking() {
$this->config
->expects($this->once())
->method('getSystemValue')
->will($this->returnValue(
- array('sqlite', 'mysql', 'pgsql', 'oci', 'mssql')
+ array('sqlite', 'mysql', 'pgsql', 'oci')
));
$this->setupClass
->expects($this->once())
->method('class_exists')
->will($this->returnValue(true));
$this->setupClass
- ->expects($this->exactly(4))
+ ->expects($this->exactly(2))
->method('is_callable')
->will($this->returnValue(true));
+ $this->setupClass
+ ->expects($this->once())
+ ->method('getAvailableDbDriversForPdo')
+ ->will($this->returnValue(['mysql']));
$result = $this->setupClass->getSupportedDatabases();
$expectedResult = array(
'sqlite' => 'SQLite',
'mysql' => 'MySQL/MariaDB',
'pgsql' => 'PostgreSQL',
- 'oci' => 'Oracle',
- 'mssql' => 'MS SQL'
+ 'oci' => 'Oracle'
);
$this->assertSame($expectedResult, $result);
}
diff --git a/tests/lib/share/searchresultsorter.php b/tests/lib/share/searchresultsorter.php
index 97ef0f9478a..d91110f7a9a 100644
--- a/tests/lib/share/searchresultsorter.php
+++ b/tests/lib/share/searchresultsorter.php
@@ -37,11 +37,4 @@ class Test_Share_Search extends \Test\TestCase {
$this->assertTrue($result[2]['foobar'] === 'Bicyclerepairwoman');
$this->assertTrue($result[3]['foobar'] === 'woot');
}
-
- /**
- * @expectedException PHPUnit_Framework_Error
- */
- public function testSortWrongLog() {
- $sorter = new \OC\Share\SearchResultSorter('foo', 'bar', 'UTF-8', 'foobar');
- }
}
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index b6d3e16826d..ef0d9822085 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -1288,7 +1288,7 @@ class Test_Share extends \Test\TestCase {
// Find the share ID in the db
$qb = $connection->getQueryBuilder();
$qb->select('id')
- ->from('*PREFIX*share')
+ ->from('share')
->where($qb->expr()->eq('item_type', $qb->createParameter('type')))
->andWhere($qb->expr()->eq('item_source', $qb->createParameter('source')))
->andWhere($qb->expr()->eq('uid_owner', $qb->createParameter('owner')))
@@ -1309,7 +1309,7 @@ class Test_Share extends \Test\TestCase {
// Fetch the hash from the database
$qb = $connection->getQueryBuilder();
$qb->select('share_with')
- ->from('*PREFIX*share')
+ ->from('share')
->where($qb->expr()->eq('id', $qb->createParameter('id')))
->setParameter('id', $id);
$hash = $qb->execute()->fetch()['share_with'];
diff --git a/tests/ocs/response.php b/tests/ocs/response.php
new file mode 100644
index 00000000000..919915a7c78
--- /dev/null
+++ b/tests/ocs/response.php
@@ -0,0 +1,42 @@
+<?php
+use OCP\AppFramework\Http;
+
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+class OcsResponseTest extends \Test\TestCase {
+
+ /**
+ * @dataProvider providesStatusCodes
+ */
+ public function testStatusCodeMapper($expected, $sc) {
+ $result = OC_API::mapStatusCodes($sc);
+ $this->assertEquals($expected, $result);
+ }
+
+ public function providesStatusCodes() {
+ return [
+ [Http::STATUS_OK, 100],
+ [Http::STATUS_BAD_REQUEST, 104],
+ [Http::STATUS_BAD_REQUEST, 1000],
+ [201, 201],
+ ];
+ }
+}
diff --git a/tests/settings/controller/CertificateControllerTest.php b/tests/settings/controller/CertificateControllerTest.php
index b6981195034..023d7753cca 100644
--- a/tests/settings/controller/CertificateControllerTest.php
+++ b/tests/settings/controller/CertificateControllerTest.php
@@ -21,6 +21,7 @@
namespace OC\Settings\Controller;
+use OCP\App\IAppManager;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\IRequest;
@@ -41,6 +42,8 @@ class CertificateControllerTest extends \Test\TestCase {
private $certificateManager;
/** @var IL10N */
private $l10n;
+ /** @var IAppManager */
+ private $appManager;
public function setUp() {
parent::setUp();
@@ -48,13 +51,21 @@ class CertificateControllerTest extends \Test\TestCase {
$this->request = $this->getMock('\OCP\IRequest');
$this->certificateManager = $this->getMock('\OCP\ICertificateManager');
$this->l10n = $this->getMock('\OCP\IL10N');
-
- $this->certificateController = new CertificateController(
- 'settings',
- $this->request,
- $this->certificateManager,
- $this->l10n
- );
+ $this->appManager = $this->getMock('OCP\App\IAppManager');
+
+ $this->certificateController = $this->getMockBuilder('OC\Settings\Controller\CertificateController')
+ ->setConstructorArgs(
+ [
+ 'settings',
+ $this->request,
+ $this->certificateManager,
+ $this->l10n,
+ $this->appManager
+ ]
+ )->setMethods(['isCertificateImportAllowed'])->getMock();
+
+ $this->certificateController->expects($this->any())
+ ->method('isCertificateImportAllowed')->willReturn(true);
}
public function testAddPersonalRootCertificateWithEmptyFile() {
diff --git a/themes/example/defaults.php b/themes/example/defaults.php
index 0dd0d46bd9c..21d80416e12 100644
--- a/themes/example/defaults.php
+++ b/themes/example/defaults.php
@@ -28,6 +28,7 @@ class OC_Theme {
private $themeSyncClientUrl;
private $themeSlogan;
private $themeMailHeaderColor;
+ private $themeKnowledgeBaseUrl;
/* put your custom text in these variables */
function __construct() {
@@ -39,6 +40,7 @@ class OC_Theme {
$this->themeSyncClientUrl = 'https://owncloud.org/install';
$this->themeSlogan = 'Your custom cloud, personalized for you!';
$this->themeMailHeaderColor = '#745bca';
+ $this->themeKnowledgeBaseUrl = 'https://doc.owncloud.org';
}
/* nothing after this needs to be adjusted */
@@ -92,4 +94,8 @@ class OC_Theme {
return $this->themeMailHeaderColor;
}
+ public function getKnowledgeBaseUrl() {
+ return $this->themeKnowledgeBaseUrl;
+ }
+
}