From 0d7861a4f80756051ba772391658929f49feadf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 29 May 2017 11:59:41 +0200 Subject: [PATCH 001/118] MOBILE-2073 database: Basic module structure --- www/addons/mod/data/controllers/index.js | 155 ++++++++++ www/addons/mod/data/lang/en.json | 9 + www/addons/mod/data/main.js | 42 +++ www/addons/mod/data/services/data.js | 280 ++++++++++++++++++ www/addons/mod/data/services/handlers.js | 160 ++++++++++ .../mod/data/services/prefetch_handler.js | 249 ++++++++++++++++ www/addons/mod/data/templates/index.html | 42 +++ 7 files changed, 937 insertions(+) create mode 100644 www/addons/mod/data/controllers/index.js create mode 100644 www/addons/mod/data/lang/en.json create mode 100644 www/addons/mod/data/main.js create mode 100644 www/addons/mod/data/services/data.js create mode 100644 www/addons/mod/data/services/handlers.js create mode 100644 www/addons/mod/data/services/prefetch_handler.js create mode 100644 www/addons/mod/data/templates/index.html diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js new file mode 100644 index 00000000000..cd3840b7ce2 --- /dev/null +++ b/www/addons/mod/data/controllers/index.js @@ -0,0 +1,155 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Data index controller. + * + * @module mm.addons.mod_data + * @ngdoc controller + * @name mmaModDataIndexCtrl + */ +.controller('mmaModDataIndexCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $mmCourseHelper, $q, + $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite) { + + var module = $stateParams.module || {}, + courseId = $stateParams.courseid, + data, + onlineObserver; + + $scope.title = module.name; + $scope.description = module.description; + $scope.moduleUrl = module.url; + $scope.moduleName = $mmCourse.translateModuleName('data'); + $scope.courseId = courseId; + $scope.refreshIcon = 'spinner'; + $scope.syncIcon = 'spinner'; + $scope.component = mmaModDataComponent; + $scope.componentId = module.id; + $scope.databaseLoaded = false; + + + function fetchDatabaseData(refresh, sync, showErrors) { + $scope.isOnline = $mmApp.isOnline(); + + return $mmaModData.getDatabase(courseId, module.id).then(function(databaseData) { + data = databaseData; + + $scope.title = data.name || $scope.title; + $scope.description = data.intro || $scope.description; + + $scope.database = data; + + return $mmaModData.getDatabaseAccessInformation(data.id); + }).then(function(accessData) { + $scope.access = accessData; + + if (!accessData.timeavailable) { + var time = $mmUtil.timestamp(); + + $scope.timeAvailableFrom = data.timeavailablefrom && time < data.timeavailablefrom ? + parseInt(data.timeavailablefrom, 10) * 1000 : false; + $scope.timeAvailableFromReadable = $scope.timeAvailableFrom ? + moment($scope.timeAvailableFrom).format('LLL') : false; + $scope.timeAvailableTo = data.timeavailableto && time > data.timeavailableto ? + parseInt(data.timeavailableto, 10) * 1000 : false; + $scope.timeAvailableToReadable = $scope.timeAvailableTo ? moment($scope.timeAvailableTo).format('LLL') : false; + } else { + // TODO: Calculate num entries based on get_entries WS. + $scope.numEntries = accessData.numentries; + $scope.entriesLeftToView = accessData.entrieslefttoview; + $scope.entriesLeftToAdd = accessData.entrieslefttoadd; + $scope.canAdd = accessData.canaddentry; + } + }).then(function() { + // All data obtained, now fill the context menu. + $mmCourseHelper.fillContextMenu($scope, module, courseId, refresh, mmaModDataComponent); + }).catch(function(message) { + if (!refresh) { + // Some call failed, retry without using cache since it might be a new activity. + return refreshAllData(); + } + + $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); + return $q.reject(); + }).finally(function(){ + $scope.databaseLoaded = true; + }); + } + + // Convenience function to refresh all the data. + function refreshAllData(sync, showErrors) { + var promises = []; + + return $q.all(promises).finally(function() { + return fetchDatabaseData(true, sync, showErrors); + }); + } + + fetchDatabaseData(false, true).then(function() { + $mmaModData.logView(data.id).then(function() { + $mmCourse.checkModuleCompletion(courseId, module.completionstatus); + }); + }).finally(function() { + $scope.refreshIcon = 'ion-refresh'; + $scope.syncIcon = 'ion-loop'; + }); + + // Confirm and Remove action. + $scope.removeFiles = function() { + $mmCourseHelper.confirmAndRemove(module, courseId); + }; + + // Context Menu Prefetch action. + $scope.prefetch = function() { + $mmCourseHelper.contextMenuPrefetch($scope, module, courseId); + }; + // Context Menu Description action. + $scope.expandDescription = function() { + $mmText.expandText($translate.instant('mm.core.description'), $scope.description, false, mmaModDataComponent, module.id); + }; + + // Pull to refresh. + $scope.refreshDatabase = function(showErrors) { + if ($scope.databaseLoaded) { + $scope.refreshIcon = 'spinner'; + $scope.syncIcon = 'spinner'; + return refreshAllData(true, showErrors).finally(function() { + $scope.refreshIcon = 'ion-refresh'; + $scope.syncIcon = 'ion-loop'; + $scope.$broadcast('scroll.refreshComplete'); + }); + } + }; + + // Opens search. + $scope.gotoSearch = function() { + $mmUtil.openInApp($mmSite.getURL() + '/mod/data/view.php?mode=asearch&d=' + data.id); + }; + + // Opens add entries form + $scope.gotoAddEntries = function() { + $mmUtil.openInApp($mmSite.getURL() + '/mod/data/edit.php?d=' + data.id); + }; + + // Refresh online status when changes. + onlineObserver = $mmEvents.on(mmCoreEventOnlineStatusChanged, function(online) { + $scope.isOnline = online; + }); + + $scope.$on('$destroy', function() { + onlineObserver && onlineObserver.off && onlineObserver.off(); + }); +}); diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json new file mode 100644 index 00000000000..5fc410aa1c6 --- /dev/null +++ b/www/addons/mod/data/lang/en.json @@ -0,0 +1,9 @@ +{ + "addentries": "Add entries", + "entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries in order to complete this activity", + "entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.", + "expired": "Sorry, this activity closed on {{$a}} and is no longer available", + "norecords": "No entries in database", + "notopenyet": "Sorry, this activity is not available until {{$a}}", + "search": "Search" +} diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js new file mode 100644 index 00000000000..eee37ce60f0 --- /dev/null +++ b/www/addons/mod/data/main.js @@ -0,0 +1,42 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data', ['mm.core']) + +.constant('mmaModDataComponent', 'mmaModData') + +.config(function($stateProvider) { + + $stateProvider + + .state('site.mod_data', { + url: '/mod_data', + params: { + module: null, + courseid: null + }, + views: { + 'site': { + controller: 'mmaModDataIndexCtrl', + templateUrl: 'addons/mod/data/templates/index.html' + } + } + }); + +}) + +.config(function($mmCourseDelegateProvider, $mmContentLinksDelegateProvider) { + $mmCourseDelegateProvider.registerContentHandler('mmaModData', 'data', '$mmaModDataHandlers.courseContent'); + $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData', '$mmaModDataHandlers.linksHandler'); +}); \ No newline at end of file diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js new file mode 100644 index 00000000000..4e06dbb4eff --- /dev/null +++ b/www/addons/mod/data/services/data.js @@ -0,0 +1,280 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Data service. + * + * @module mm.addons.mod_data + * @ngdoc controller + * @name $mmaModData + */ +.factory('$mmaModData', function($q, $mmSitesManager, mmaModDataComponent, $mmFilepool) { + var self = {}; + + /** + * Get cache key for database data WS calls. + * + * @param {Number} courseId Course ID. + * @return {String} Cache key. + */ + function getDatabaseDataCacheKey(courseId) { + return 'mmaModData:data:' + courseId; + } + + /** + * Get prefix cache key for all database activity data WS calls. + * + * @param {Number} dataId Data ID. + * @return {String} Cache key. + */ + function getDatabaseDataPrefixCacheKey(dataId) { + return 'mmaModData:' + dataId; + } + + /** + * Get cache key for database access information data WS calls. + * + * @param {Number} dataId Data ID. + * @return {String} Cache key. + */ + function getDatabaseAccessInformationDataCacheKey(dataId) { + return getDatabaseDataPrefixCacheKey(dataId) + ':access'; + } + + /** + * Return whether or not the plugin is enabled in a certain site. Plugin is enabled if the database WS are available. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#isPluginEnabled + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved with true if plugin is enabled, rejected or resolved with false otherwise. + */ + self.isPluginEnabled = function(siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.wsAvailable('mod_data_get_databases_by_courses') && + site.wsAvailable('mod_data_get_data_access_information'); + }); + }; + + /** + * Get a database with key=value. If more than one is found, only the first will be returned. + * + * @param {Number} courseId Course ID. + * @param {String} key Name of the property to check. + * @param {Mixed} value Value to search. + * @param {String} [siteId] Site ID. If not defined, current site. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @return {Promise} Promise resolved when the database is retrieved. + */ + function getDatabase(courseId, key, value, siteId, forceCache) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + courseids: [courseId] + }, + preSets = { + cacheKey: getDatabaseDataCacheKey(courseId) + }; + + if (forceCache) { + preSets.omitExpires = true; + } + + return site.read('mod_data_get_databases_by_courses', params, preSets).then(function(response) { + if (response && response.databases) { + for (var x in response.databases) { + if (response.databases[x][key] == value) { + return response.databases[x]; + } + } + } + return $q.reject(); + }); + }); + } + + /** + * Get a database by course module ID. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#getDatabase + * @param {Number} courseId Course ID. + * @param {Number} cmId Course module ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @return {Promise} Promise resolved when the database is retrieved. + */ + self.getDatabase = function(courseId, cmId, siteId, forceCache) { + return getDatabase(courseId, 'coursemodule', cmId, siteId, forceCache); + }; + + /** + * Get a database by ID. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#getDatabaseById + * @param {Number} courseId Course ID. + * @param {Number} id Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @return {Promise} Promise resolved when the database is retrieved. + */ + self.getDatabaseById = function(courseId, id, siteId, forceCache) { + return getDatabase(courseId, 'id', id, siteId, forceCache); + }; + + /** + * Invalidates database data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateDatabaseData + * @param {Number} courseId Course ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the database is invalidated. + */ + self.invalidateDatabaseData = function(courseId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.invalidateWsCacheForKey(getDatabaseDataCacheKey(courseId)); + }); + }; + + /** + * Invalidates database data except files and module info. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateDatabaseWSData + * @param {Number} databaseId Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + self.invalidateDatabaseWSData = function(databaseId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.invalidateWsCacheForKeyStartingWith(getDatabaseDataPrefixCacheKey(databaseId)); + + }); + }; + + /** + * Get access information for a given database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#getDatabaseAccessInformation + * @param {Number} dataId Data ID. + * @param {Boolean} offline True if it should return cached data. Has priority over ignoreCache. + * @param {Boolean} ignoreCache True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the database is retrieved. + */ + self.getDatabaseAccessInformation = function(dataId, offline, ignoreCache, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + databaseid: dataId + }, + preSets = { + cacheKey: getDatabaseAccessInformationDataCacheKey(dataId) + }; + + if (offline) { + preSets.omitExpires = true; + } else if (ignoreCache) { + preSets.getFromCache = 0; + preSets.emergencyCache = 0; + } + + return site.read('mod_data_get_data_access_information', params, preSets); + }); + }; + + /** + * Invalidates database access information data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateDatabaseAccessInformationData + * @param {Number} dataId Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + self.invalidateDatabaseAccessInformationData = function(dataId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.invalidateWsCacheForKey(getDatabaseAccessInformationDataCacheKey(dataId)); + }); + }; + + /** + * Invalidate the prefetched content except files. + * To invalidate files, use $mmaModData#invalidateFiles. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateContent + * @param {Number} moduleId The module ID. + * @param {Number} courseId Course ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} + */ + self.invalidateContent = function(moduleId, courseId, siteId) { + siteId = siteId || $mmSite.getId(); + return self.getDatabase(courseId, moduleId, siteId, true).then(function(data) { + var ps = []; + // Do not invalidate database data before getting database info, we need it! + ps.push(self.invalidateDatabaseData(courseId, siteId)); + ps.push(self.invalidateDatabaseWSData(data.id, siteId)); + + return $q.all(ps); + }); + }; + + /** + * Invalidate the prefetched files. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateFiles + * @param {Number} moduleId The module ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the files are invalidated. + */ + self.invalidateFiles = function(moduleId, siteId) { + return $mmFilepool.invalidateFilesByComponent(siteId, mmaModDataComponent, moduleId); + }; + + /** + * Report the database as being viewed. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#logView + * @param {String} id Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the WS call is successful. + */ + self.logView = function(id, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + databaseid: id + }; + return site.write('mod_data_view_database', params); + }); + }; + + return self; +}); diff --git a/www/addons/mod/data/services/handlers.js b/www/addons/mod/data/services/handlers.js new file mode 100644 index 00000000000..4220d647011 --- /dev/null +++ b/www/addons/mod/data/services/handlers.js @@ -0,0 +1,160 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Mod data handlers. + * + * @module mm.addons.mod_data + * @ngdoc service + * @name $mmaModDataHandlers + */ +.factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, + mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, + mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate) { + var self = {}; + + /** + * Course content handler. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#courseContent + */ + self.courseContent = function() { + + var self = {}; + + /** + * Whether or not the module is enabled for the site. + * + * @return {Boolean} + */ + self.isEnabled = function() { + return $mmaModData.isPluginEnabled(); + }; + + /** + * Get the controller. + * + * @param {Object} module The module info. + * @param {Number} courseId The course ID. + * @return {Function} + */ + self.getController = function(module, courseId) { + return function($scope) { + var downloadBtn = { + hidden: true, + icon: 'ion-ios-cloud-download-outline', + label: 'mm.core.download', + action: function(e) { + if (e) { + e.preventDefault(); + e.stopPropagation(); + } + download(); + } + }, + refreshBtn = { + hidden: true, + icon: 'ion-android-refresh', + label: 'mm.core.refresh', + action: function(e) { + if (e) { + e.preventDefault(); + e.stopPropagation(); + } + $mmaModData.invalidateContent(module.id, courseId).finally(function() { + download(); + }); + } + }; + + $scope.title = module.name; + $scope.icon = $mmCourse.getModuleIconSrc('data'); + $scope.class = 'mma-mod_data-handler'; + $scope.buttons = [downloadBtn, refreshBtn]; + $scope.spinner = true; // Show spinner while calculating status. + + $scope.action = function(e) { + if (e) { + e.preventDefault(); + e.stopPropagation(); + } + $state.go('site.mod_data', {module: module, moduleid: module.id, courseid: courseId}); + }; + + function download() { + + $scope.spinner = true; // Show spinner since this operation might take a while. + // We need to call getDownloadSize, the package might have been updated. + $mmaModDataPrefetchHandler.getDownloadSize(module, courseId).then(function(size) { + $mmUtil.confirmDownloadSize(size).then(function() { + $mmaModDataPrefetchHandler.prefetch(module, courseId).catch(function(error) { + if (!$scope.$$destroyed) { + $mmUtil.showErrorModalDefault(error, 'mm.core.errordownloading', true); + } + }); + }).catch(function() { + // User hasn't confirmed, stop spinner. + $scope.spinner = false; + }); + }).catch(function(error) { + $scope.spinner = false; + $mmUtil.showErrorModalDefault(error, 'mm.core.errordownloading', true); + }); + } + + // Show buttons according to module status. + function showStatus(status) { + if (status) { + $scope.spinner = status === mmCoreDownloading; + downloadBtn.hidden = status !== mmCoreNotDownloaded; + refreshBtn.hidden = status !== mmCoreOutdated; + } + } + + // Listen for changes on this module status. + var statusObserver = $mmEvents.on(mmCoreEventPackageStatusChanged, function(data) { + if (data.siteid === $mmSite.getId() && data.componentId === module.id && + data.component === mmaModDataComponent) { + showStatus(data.status); + } + }); + + // Get current status to decide which icon should be shown. + $mmCoursePrefetchDelegate.getModuleStatus(module, courseId).then(showStatus); + + $scope.$on('$destroy', function() { + statusObserver && statusObserver.off && statusObserver.off(); + }); + }; + }; + + return self; + }; + + /** + * Content links handler for module index page. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#indexLinksHandler + */ + self.indexLinksHandler = $mmContentLinksHelper.createModuleIndexLinkHandler('mmaModData', 'data', $mmaModData); + + + return self; +}); diff --git a/www/addons/mod/data/services/prefetch_handler.js b/www/addons/mod/data/services/prefetch_handler.js new file mode 100644 index 00000000000..9e3d181ea6c --- /dev/null +++ b/www/addons/mod/data/services/prefetch_handler.js @@ -0,0 +1,249 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Mod data prefetch handler. + * + * @module mm.addons.mod_data + * @ngdoc service + * @name $mmaModDataPrefetchHandler + */ +.factory('$mmaModDataPrefetchHandler', function($mmaModData, mmaModDataComponent, $mmFilepool, $q, $mmUtil, $mmPrefetchFactory) { + + var self = $mmPrefetchFactory.createPrefetchHandler(mmaModDataComponent); + + // RegExp to check if a module has updates based on the result of $mmCoursePrefetchDelegate#getCourseUpdates. + self.updatesNames = /^configuration$|^.*files$|^entries|^gradeitems$|^outcomes$|^comments$|^ratings/; + + /** + * Download the module. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#download + * @param {Object} module The module object returned by WS. + * @param {Number} courseId Course ID the module belongs to. + * @return {Promise} Promise resolved when all files have been downloaded. Data returned is not reliable. + */ + self.download = function(module, courseId) { + // Database cannot be downloaded right away, only prefetched. + return self.prefetch(module, courseId); + }; + + /** + * Get the list of downloadable files. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#getFiles + * @param {Object} module Module to get the files. + * @param {Number} courseId Course ID the module belongs to. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved with the list of files. + */ + self.getFiles = function(module, courseId, siteId) { + var files = []; + return $mmaModData.getDatabase(courseId, module.id, siteId).then(function(database) { + // Get intro files. + files = self.getIntroFilesFromInstance(module, database); + return files; + }).catch(function() { + // Any error, return the list we have. + return files; + }); + }; + + /** + * Returns database intro files. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#getIntroFiles + * @param {Object} module The module object returned by WS. + * @param {Number} courseId Course ID. + * @return {Promise} Promise resolved with list of intro files. + */ + self.getIntroFiles = function(module, courseId) { + return $mmaModData.getDatabase(courseId, module.id).catch(function() { + // Not found, return undefined so module description is used. + }).then(function(database) { + return self.getIntroFilesFromInstance(module, database); + }); + }; + + /** + * Get revision of a data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#getRevision + * @param {Object} module Module to get the revision. + * @param {Number} courseId Course ID the module belongs to. + * @return {Number} Promise resolved with revision. + */ + self.getRevision = function(module, courseId) { + // Data will always be controlled using the getCourseUpdates. + return 0; + }; + + /** + * Get timemodified of a data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#getTimemodified + * @param {Object} module Module to get the timemodified. + * @param {Number} courseId Course ID the module belongs to. + * @return {Promise} Promise resolved with timemodified. + */ + self.getTimemodified = function(module, courseId) { + var siteId = $mmSite.getId(); + + return $mmaModData.getDatabase(courseId, module.id, siteId).then(function(database) { + var files = self.getIntroFilesFromInstance(module, database); + + return Math.max(database.timemodified || 0, $mmFilepool.getTimemodifiedFromFileList(files)); + }).catch(function() { + return 0; + }); + }; + + /** + * Invalidate the prefetched content. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#invalidateContent + * @param {Number} moduleId The module ID. + * @param {Number} courseId Course ID of the module. + * @return {Promise} + */ + self.invalidateContent = function(moduleId, courseId) { + return $mmaModData.invalidateContent(moduleId, courseId); + }; + + /** + * Invalidates WS calls needed to determine module status. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#invalidateModule + * @param {Object} module Module to invalidate. + * @param {Number} courseId Course ID the module belongs to. + * @return {Promise} Promise resolved when done. + */ + self.invalidateModule = function(module, courseId) { + return $mmaModData.invalidateDatabaseData(courseId); + }; + + /** + * Check if a database is downloadable. + * A database isn't downloadable if it's not open yet. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#isDownloadable + * @param {Object} module Module to check. + * @param {Number} courseId Course ID the module belongs to. + * @return {Promise} Promise resolved with true if downloadable, resolved with false otherwise. + */ + self.isDownloadable = function(module, courseId) { + return $mmaModData.getDatabase(courseId, module.id, false, true).then(function(database) { + return $mmaModData.getDatabaseAccessInformation(database.id).then(function(accessData) { + // Check if database is restricted by time. + if (!accessData.timeavailable) { + var time = $mmUtil.timestamp(); + + // It is restricted, checking times. + if (database.timeavailablefrom && time < database.timeavailablefrom) { + return false; + } + if (database.timeavailableto && time > database.timeavailableto) { + return false; + } + } + return true; + }); + }); + }; + + /** + * Whether or not the module is enabled for the site. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#isEnabled + * @return {Boolean} + */ + self.isEnabled = function() { + return $mmaModData.isPluginEnabled(); + }; + + /** + * Prefetch the module. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#prefetch + * @param {Object} module The module object returned by WS. + * @param {Number} courseId Course ID the module belongs to. + * @param {Boolean} single True if we're downloading a single module, false if we're downloading a whole section. + * @return {Promise} Promise resolved when all files have been downloaded. Data returned is not reliable. + */ + self.prefetch = function(module, courseId, single) { + return self.prefetchPackage(module, courseId, single, prefetchDatabase); + }; + + /** + * Prefetch a database. + * + * @param {Object} module The module object returned by WS. + * @param {Number} courseId Course ID the module belongs to. + * @param {Boolean} single True if we're downloading a single module, false if we're downloading a whole section. + * @param {String} siteId Site ID. + * @return {Promise} Promise resolved with an object with 'revision' and 'timemod'. + */ + function prefetchDatabase(module, courseId, single, siteId) { + // Prefetch the database data. + return $mmaModData.getDatabase(courseId, module.id, siteId).then(function(database) { + var promises = []; + + promises.push(self.getFiles(module, courseId, siteId).then(function(files) { + return $mmFilepool.addFilesToQueueByUrl(siteId, files, self.component, module.id); + })); + + promises.push($mmaModData.getDatabaseAccessInformation(database.id, false, true, siteId)); + + return $q.all(promises); + }).then(function() { + // Get revision and timemodified. + + var promises = []; + promises.push(self.getRevision(module, courseId)); + promises.push(self.getTimemodified(module, courseId)); + + // Return revision and timemodified. + return $q.all(promises).then(function(list) { + return { + revision: list[0], + timemod: list[1] + }; + }); + }); + } + + return self; +}); diff --git a/www/addons/mod/data/templates/index.html b/www/addons/mod/data/templates/index.html new file mode 100644 index 00000000000..fb4bf06e2ed --- /dev/null +++ b/www/addons/mod/data/templates/index.html @@ -0,0 +1,42 @@ + + {{ title }} + + + + + + + + + + + + + + + +
+
+ {{ description }} +
+
+
+ {{ 'mma.mod_data.notopenyet' | translate:{$a: timeAvailableFromReadable} }} +
+ +
+ {{ 'mma.mod_data.expired' | translate:{$a: timeAvailableToReadable} }} +
+ +
+ {{ 'mma.mod_data.entrieslefttoaddtoview' | translate:{$a: {entrieslefttoview: entriesLeftToView} } }} +
+ +
+ {{ 'mma.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: entriesLeftToAdd} } }} +
+ + +
+
+
From 6ec56ec16bb8885fed0b22dd725c2f5cb24f8821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 29 May 2017 13:07:09 +0200 Subject: [PATCH 002/118] MOBILE-2140 style: Add variables for init screen --- scss/app.scss | 3 +++ www/core/components/courses/scss/styles.scss | 2 +- www/core/scss/styles.scss | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/scss/app.scss b/scss/app.scss index 3a670e093c7..cb62756fea2 100644 --- a/scss/app.scss +++ b/scss/app.scss @@ -50,6 +50,9 @@ $mm-color: $orange; $mm-color-light: lighten($mm-color, 10%); $mm-color-dark: darken($mm-color, 10%); +$mm-color-init-screen: #ff5c00; +$mm-color-init-screen-alt: #ff7600; + $mm-buttons-color: $positive; // Change Ionic default elements colors. diff --git a/www/core/components/courses/scss/styles.scss b/www/core/components/courses/scss/styles.scss index b6762dc0036..3387c0bf5cf 100644 --- a/www/core/components/courses/scss/styles.scss +++ b/www/core/components/courses/scss/styles.scss @@ -2,7 +2,7 @@ $chart-size: 70px; $doughnut-border-size: 15px; $doughnut-dasharray: 173; $doughnut-empty-colour: $gray-light; -$doughnut-fill-colour: $orange-light; +$doughnut-fill-colour: $mm-color-light; $doughnut-border-colour: $gray-dark; $doughnut-text-colour: $gray-darker; diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index ac1142effc1..01d5313f132 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -52,9 +52,9 @@ $item-input-padding: 16px !default; * App Branding */ .mm-bglogo { - background-color: #ff5c00; /* Change this to add a bg image or change color */ - background: -webkit-radial-gradient(#ff7600, #ff5c00); - background: radial-gradient(#ff7600, #ff5c00); + background-color: $mm-color-init-screen; /* Change this to add a bg image or change color */ + background: -webkit-radial-gradient($mm-color-init-screen-alt, $mm-color-init-screen); + background: radial-gradient($mm-color-init-screen-alt, $mm-color-init-screen); background-repeat: no-repeat; background-position: center center; position: absolute; From 879c4545c68431fe6796ac33cc13c3ee789564a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 29 May 2017 14:00:09 +0200 Subject: [PATCH 003/118] MOBILE-2140 style: Change logo images name --- scss/app.scss | 15 ++++++++++----- .../components/login/templates/credentials.html | 8 ++++---- www/core/components/login/templates/init.html | 2 +- .../components/login/templates/reconnect.html | 8 ++++---- www/core/components/login/templates/site.html | 2 +- www/img/{moodle.png => logo.png} | Bin www/img/{moodle_white.png => logo_white.png} | Bin 7 files changed, 20 insertions(+), 15 deletions(-) rename www/img/{moodle.png => logo.png} (100%) rename www/img/{moodle_white.png => logo_white.png} (100%) diff --git a/scss/app.scss b/scss/app.scss index cb62756fea2..052489c2113 100644 --- a/scss/app.scss +++ b/scss/app.scss @@ -60,7 +60,7 @@ $base-color: $black !default; $base-background-color: $gray-light !default; $item-default-text: $black; -$sheet-options-text-color: $positive; +$sheet-options-text-color: $mm-buttons-color; // Header. $bar-content-bg: $mm-color !default; @@ -73,7 +73,7 @@ $item-disabled-color: $gray-dark !default; $button-light-border: $gray; -$toggle-on-default-bg: $blue; +$toggle-on-default-bg: $mm-buttons-color; $tabs-off-opacity: 0.6; $tabs-striped-off-opacity: $tabs-off-opacity; @@ -85,6 +85,11 @@ $button-default-border: $mm-buttons-color !default; $button-default-active-bg: $mm-buttons-color !default; $button-default-active-border: $mm-buttons-color !default; +$button-positive-bg: $mm-buttons-color !default; +$button-positive-border: darken($mm-buttons-color, 10%) !default; +$button-positive-active-bg: darken($mm-buttons-color, 10%) !default; +$button-positive-active-border: darken($mm-buttons-color, 10%) !default; + // The path to the font icons. $ionicons-font-path: "../lib/ionic/release/fonts" !default; @@ -95,7 +100,7 @@ $ionicons-font-path: "../lib/ionic/release/fonts" !default; color: $gray-darker; &.positive { - color: $positive; + color: $mm-buttons-color; } &.assertive { color: $assertive; @@ -115,7 +120,7 @@ $ionicons-font-path: "../lib/ionic/release/fonts" !default; &.activated, &.active .icon, &.activated .icon { - color: $positive; + color: $mm-buttons-color; &.assertive { color: $assertive; @@ -147,7 +152,7 @@ $ionicons-font-path: "../lib/ionic/release/fonts" !default; color: $assertive; } -// Setting the default button to button-outline positive. +// Setting the default button to button-outline $mm-buttons-color. .button { &.button-light, &.button-stable, diff --git a/www/core/components/login/templates/credentials.html b/www/core/components/login/templates/credentials.html index 053f7bb9865..74fff04f930 100644 --- a/www/core/components/login/templates/credentials.html +++ b/www/core/components/login/templates/credentials.html @@ -5,13 +5,13 @@
- + -

{{siteurl}}

+

{{siteurl}}

-

{{sitename}}

-

{{siteurl}}

+

{{sitename}}

+

{{siteurl}}

diff --git a/www/core/components/login/templates/init.html b/www/core/components/login/templates/init.html index eea30ac01a2..628fa135273 100644 --- a/www/core/components/login/templates/init.html +++ b/www/core/components/login/templates/init.html @@ -1,7 +1,7 @@ diff --git a/www/core/components/login/templates/reconnect.html b/www/core/components/login/templates/reconnect.html index d425a8cf33e..cd887e58af7 100644 --- a/www/core/components/login/templates/reconnect.html +++ b/www/core/components/login/templates/reconnect.html @@ -6,13 +6,13 @@ {{ 'mm.core.pictureof' | translate:{$a: site.fullname} }} - + -

{{siteurl}}

+

{{siteurl}}

-

{{sitename}}

-

{{siteurl}}

+

{{sitename}}

+

{{siteurl}}

{{ 'mm.login.reconnectdescription' | translate }}

diff --git a/www/core/components/login/templates/site.html b/www/core/components/login/templates/site.html index cc1310fd9c7..57abe516090 100644 --- a/www/core/components/login/templates/site.html +++ b/www/core/components/login/templates/site.html @@ -6,7 +6,7 @@
- +

{{ 'mm.login.newsitedescription' | translate }}

diff --git a/www/img/moodle.png b/www/img/logo.png similarity index 100% rename from www/img/moodle.png rename to www/img/logo.png diff --git a/www/img/moodle_white.png b/www/img/logo_white.png similarity index 100% rename from www/img/moodle_white.png rename to www/img/logo_white.png From 3fc3c1bae5c2792125dc2272855a5af260113844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 30 May 2017 12:26:58 +0200 Subject: [PATCH 004/118] MOBILE-2140 style: Add variables for init spinner --- scss/app.scss | 5 +++-- www/core/scss/styles.scss | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/scss/app.scss b/scss/app.scss index 052489c2113..08608e214a1 100644 --- a/scss/app.scss +++ b/scss/app.scss @@ -50,8 +50,9 @@ $mm-color: $orange; $mm-color-light: lighten($mm-color, 10%); $mm-color-dark: darken($mm-color, 10%); -$mm-color-init-screen: #ff5c00; -$mm-color-init-screen-alt: #ff7600; +$mm-color-init-screen: #ff5c00; +$mm-color-init-screen-alt: #ff7600; +$mm-init-screen-spinner-color: $white; $mm-buttons-color: $positive; diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index 01d5313f132..5f8637a1d73 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -81,9 +81,9 @@ $item-input-padding: 16px !default; } .spinner { - color: white; - stroke: white; - fill: white; + color: $mm-init-screen-spinner-color; + stroke: $mm-init-screen-spinner-color; + fill: $mm-init-screen-spinner-color; } } From 9765ddaaa6a05df744ca169dd4ea5f9ecacfd5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 6 Jun 2017 12:29:59 +0200 Subject: [PATCH 005/118] MOBILE-2140 style: Add boolean to hide site name and url --- scss/app.scss | 1 + www/core/components/login/scss/styles.scss | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/scss/app.scss b/scss/app.scss index 08608e214a1..d6d477cb47a 100644 --- a/scss/app.scss +++ b/scss/app.scss @@ -53,6 +53,7 @@ $mm-color-dark: darken($mm-color, 10%); $mm-color-init-screen: #ff5c00; $mm-color-init-screen-alt: #ff7600; $mm-init-screen-spinner-color: $white; +$mm-fixed-url: false; $mm-buttons-color: $positive; diff --git a/www/core/components/login/scss/styles.scss b/www/core/components/login/scss/styles.scss index 78aa66c1561..18dad1af296 100644 --- a/www/core/components/login/scss/styles.scss +++ b/www/core/components/login/scss/styles.scss @@ -61,4 +61,9 @@ background: $white; border: 1px solid $item-default-border; } + + .mm-sitename, .mm-siteurl { + @if $mm-fixed-url { display: none; } + } } + From 572878ce66d290b467f9e73cac27d199c2095ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 6 Jun 2017 12:30:16 +0200 Subject: [PATCH 006/118] MOBILE-2140 style: Add variables to control init screen logo --- scss/app.scss | 11 +++++++---- www/core/scss/styles.scss | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/scss/app.scss b/scss/app.scss index d6d477cb47a..19dd3a630a6 100644 --- a/scss/app.scss +++ b/scss/app.scss @@ -50,10 +50,13 @@ $mm-color: $orange; $mm-color-light: lighten($mm-color, 10%); $mm-color-dark: darken($mm-color, 10%); -$mm-color-init-screen: #ff5c00; -$mm-color-init-screen-alt: #ff7600; -$mm-init-screen-spinner-color: $white; -$mm-fixed-url: false; +$mm-color-init-screen: #ff5c00; +$mm-color-init-screen-alt: #ff7600; +$mm-init-screen-spinner-color: $white; +$mm-init-screen-logo-width: 60%; +$mm-init-screen-logo-max-width: 300px; + +$mm-fixed-url: false; $mm-buttons-color: $positive; diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index 5f8637a1d73..93a1b6256da 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -73,8 +73,8 @@ $item-input-padding: 16px !default; } img { - width: 60%; - max-width: 300px; + width: $mm-init-screen-logo-width; + max-width: $mm-init-screen-logo-max-width; display: block; margin: 0 auto; margin-bottom: 30px; From d205a55abb2942a18d39c6cc6e333728d94240ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 6 Jun 2017 12:53:34 +0200 Subject: [PATCH 007/118] MOBILE-2140 style: Add variables to control sidemenu --- scss/app.scss | 19 +++++++++++---- www/core/components/sidemenu/scss/styles.scss | 24 +++++++++++++------ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/scss/app.scss b/scss/app.scss index 19dd3a630a6..5d1afb1a84d 100644 --- a/scss/app.scss +++ b/scss/app.scss @@ -67,16 +67,27 @@ $base-background-color: $gray-light !default; $item-default-text: $black; $sheet-options-text-color: $mm-buttons-color; +$item-default-bg: $white; +$item-divider-bg: $gray-lighter; +$item-disabled-color: $gray-dark !default; + +$button-light-border: $gray; + // Header. $bar-content-bg: $mm-color !default; $bar-content-border: transparent !default; $bar-content-text: $white !default; -$item-default-bg: $white; -$item-divider-bg: $gray-lighter; -$item-disabled-color: $gray-dark !default; +$bar-side-menu-height: 80px !default; +$bar-side-menu-color: $bar-content-bg !default; +$bar-side-menu-border-color: $bar-content-border !default; +$bar-side-menu-text-color: $bar-content-text !default; -$button-light-border: $gray; +$bar-side-menu-item-border-color: $button-light-border; +$bar-side-menu-item-divider-color: $item-divider-bg; +$bar-side-menu-item-background-color: $item-default-bg; +$bar-side-menu-item-text-color: $item-default-text; +$bar-side-menu-item-icon-color: $gray-darker; $toggle-on-default-bg: $mm-buttons-color; diff --git a/www/core/components/sidemenu/scss/styles.scss b/www/core/components/sidemenu/scss/styles.scss index 5c03857bccd..bb3c1b5f97a 100644 --- a/www/core/components/sidemenu/scss/styles.scss +++ b/www/core/components/sidemenu/scss/styles.scss @@ -1,9 +1,3 @@ -// Variables. -$bar-side-menu-height: 80px !default; -$bar-side-menu-color: $bar-content-bg !default; -$bar-side-menu-border-color: $bar-content-border !default; -$bar-side-menu-text-color: $bar-content-text !default; - // Bar styles .bar-side-menu { @include bar-style($bar-side-menu-color, $bar-side-menu-border-color, $bar-side-menu-text-color); @@ -15,7 +9,8 @@ $bar-side-menu-text-color: $bar-content-text !default; .item-avatar { margin-top: 0px !important; // MOBILE-959: Added to fix side menu header in iOS. h2, - p { + p, + .icon { color: $bar-side-menu-text-color; } } @@ -30,3 +25,18 @@ $bar-side-menu-text-color: $bar-content-text !default; right: 16px; } } + +ion-side-menu li .item, +ion-side-menu li.item { + border-color: $bar-side-menu-item-border-color; + background-color: $bar-side-menu-item-background-color; + color: $bar-side-menu-item-text-color; + + .icon { + color: $bar-side-menu-item-icon-color; + } +} + +ion-side-menu li.item.item-divider { + background-color: $bar-side-menu-item-divider-color; +} \ No newline at end of file From 914a3a418a329397460b3e153208377cda73a5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 30 May 2017 13:38:16 +0200 Subject: [PATCH 008/118] MOBILE-2118 database: View entry list --- www/addons/mod/data/controllers/index.js | 73 +++++- www/addons/mod/data/main.js | 8 +- www/addons/mod/data/scss/styles.scss | 18 ++ www/addons/mod/data/services/data.js | 241 +++++++++++++++++- www/addons/mod/data/services/helper.js | 51 ++++ .../mod/data/services/prefetch_handler.js | 135 ++++++++-- www/addons/mod/data/templates/index.html | 37 ++- www/core/lib/groups.js | 3 +- www/core/scss/fontawesome.scss | 44 ++++ 9 files changed, 564 insertions(+), 46 deletions(-) create mode 100644 www/addons/mod/data/scss/styles.scss create mode 100644 www/addons/mod/data/services/helper.js create mode 100644 www/core/scss/fontawesome.scss diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index cd3840b7ce2..442ca61b38b 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name mmaModDataIndexCtrl */ .controller('mmaModDataIndexCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $mmCourseHelper, $q, - $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite) { + $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -33,13 +33,12 @@ angular.module('mm.addons.mod_data') $scope.description = module.description; $scope.moduleUrl = module.url; $scope.moduleName = $mmCourse.translateModuleName('data'); - $scope.courseId = courseId; $scope.refreshIcon = 'spinner'; $scope.syncIcon = 'spinner'; $scope.component = mmaModDataComponent; $scope.componentId = module.id; $scope.databaseLoaded = false; - + $scope.selectedGroup = $stateParams.group || 0; function fetchDatabaseData(refresh, sync, showErrors) { $scope.isOnline = $mmApp.isOnline(); @@ -49,10 +48,12 @@ angular.module('mm.addons.mod_data') $scope.title = data.name || $scope.title; $scope.description = data.intro || $scope.description; + $scope.data = databaseData; $scope.database = data; return $mmaModData.getDatabaseAccessInformation(data.id); + }).then(function(accessData) { $scope.access = accessData; @@ -66,13 +67,31 @@ angular.module('mm.addons.mod_data') $scope.timeAvailableTo = data.timeavailableto && time > data.timeavailableto ? parseInt(data.timeavailableto, 10) * 1000 : false; $scope.timeAvailableToReadable = $scope.timeAvailableTo ? moment($scope.timeAvailableTo).format('LLL') : false; - } else { - // TODO: Calculate num entries based on get_entries WS. - $scope.numEntries = accessData.numentries; - $scope.entriesLeftToView = accessData.entrieslefttoview; - $scope.entriesLeftToAdd = accessData.entrieslefttoadd; - $scope.canAdd = accessData.canaddentry; + + $scope.isEmpty = true; + $scope.groupInfo = false; + return false; } + + return $mmGroups.getActivityGroupInfo(data.coursemodule, accessData.canmanageentries).then(function(groupInfo) { + $scope.groupInfo = groupInfo; + + // Check selected group is accessible. + if (groupInfo && groupInfo.groups && groupInfo.groups.length > 0) { + var found = false; + for (var x in groupInfo.groups) { + if (groupInfo.groups[x].id == $scope.selectedGroup) { + found = true; + break; + } + } + if (!found) { + $scope.selectedGroup = groupInfo.groups[0].id; + } + } + + return fetchEntriesData(); + }); }).then(function() { // All data obtained, now fill the context menu. $mmCourseHelper.fillContextMenu($scope, module, courseId, refresh, mmaModDataComponent); @@ -89,10 +108,46 @@ angular.module('mm.addons.mod_data') }); } + function fetchEntriesData() { + return $mmaModData.getDatabaseAccessInformation(data.id, $scope.selectedGroup).then(function(accessData) { + // Update values for current group. + $scope.access.canaddentry = accessData.canaddentry; + + return $mmaModData.getEntries(data.id, $scope.selectedGroup).then(function(entries) { + $scope.isEmpty = !entries || entries.entries.length <= 0; + $scope.entries = ""; + + if (!$scope.isEmpty) { + $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); + $scope.entries = entries.listviewcontents; + } + }); + }); + } + + + // Set group to see the database. + $scope.setGroup = function(groupId) { + $scope.selectedGroup = groupId; + return fetchEntriesData().catch(function(message) { + $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); + return $q.reject(); + }); + }; + + + // Convenience function to refresh all the data. function refreshAllData(sync, showErrors) { var promises = []; + promises.push($mmaModData.invalidateDatabaseData(courseId)); + if (data) { + promises.push($mmaModData.invalidateDatabaseAccessInformationData(data.id)); + promises.push($mmGroups.invalidateActivityGroupInfo(data.coursemodule)); + promises.push($mmaModData.invalidateEntriesData(data.id)); + } + return $q.all(promises).finally(function() { return fetchDatabaseData(true, sync, showErrors); }); diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index eee37ce60f0..38a967c9627 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -24,7 +24,8 @@ angular.module('mm.addons.mod_data', ['mm.core']) url: '/mod_data', params: { module: null, - courseid: null + courseid: null, + group: null }, views: { 'site': { @@ -36,7 +37,8 @@ angular.module('mm.addons.mod_data', ['mm.core']) }) -.config(function($mmCourseDelegateProvider, $mmContentLinksDelegateProvider) { +.config(function($mmCourseDelegateProvider, $mmContentLinksDelegateProvider, $mmCoursePrefetchDelegateProvider) { $mmCourseDelegateProvider.registerContentHandler('mmaModData', 'data', '$mmaModDataHandlers.courseContent'); - $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData', '$mmaModDataHandlers.linksHandler'); + $mmCoursePrefetchDelegateProvider.registerPrefetchHandler('mmaModData', 'data', '$mmaModDataPrefetchHandler'); + $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:index', '$mmaModDataHandlers.indexLinksHandler'); }); \ No newline at end of file diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss new file mode 100644 index 00000000000..955e8772526 --- /dev/null +++ b/www/addons/mod/data/scss/styles.scss @@ -0,0 +1,18 @@ + +.mm-site_mod_data { + .recordcheckbox { + display: none; + } +} + +.mm-data-contents { + overflow: visible; + white-space: normal; + word-break: break-all; + padding: $item-padding; + background-color: white; + border-top-width: $item-border-width; + border-bottom-width: $item-border-width; + border-style: solid; + border-color: $item-default-border; +} \ No newline at end of file diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 4e06dbb4eff..beb2df25881 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc controller * @name $mmaModData */ -.factory('$mmaModData', function($q, $mmSitesManager, mmaModDataComponent, $mmFilepool) { +.factory('$mmaModData', function($q, $mmSitesManager, mmaModDataComponent, $mmFilepool, $mmSite) { var self = {}; /** @@ -44,14 +44,59 @@ angular.module('mm.addons.mod_data') return 'mmaModData:' + dataId; } + + /** + * Get prefix cache key for all database access information data WS calls. + * + * @param {Number} dataId Data ID. + * @return {String} Cache key. + */ + function getDatabaseAccessInformationDataPrefixCacheKey(dataId) { + return getDatabaseDataPrefixCacheKey(dataId) + ':access:'; + } + /** * Get cache key for database access information data WS calls. * * @param {Number} dataId Data ID. + * @param {Number} [groupId] Group ID. * @return {String} Cache key. */ - function getDatabaseAccessInformationDataCacheKey(dataId) { - return getDatabaseDataPrefixCacheKey(dataId) + ':access'; + function getDatabaseAccessInformationDataCacheKey(dataId, groupId) { + groupId = groupId || 0; + return getDatabaseAccessInformationDataPrefixCacheKey(dataId) + groupId; + } + + /** + * Get prefix cache key for database all entries data WS calls. + * + * @param {Number} dataId Data ID. + * @return {String} Cache key. + */ + function getEntriesPrefixCacheKey(dataId) { + return getDatabaseDataPrefixCacheKey(dataId) + ':entries:'; + } + + /** + * Get cache key for database entries data WS calls. + * + * @param {Number} dataId Data ID. + * @param {Number} [groupId] Group ID. + * @return {String} Cache key. + */ + function getEntriesCacheKey(dataId, groupId) { + groupId = groupId || 0; + return getEntriesPrefixCacheKey(dataId) + groupId; + } + + /** + * Get cache key for database fields data WS calls. + * + * @param {Number} dataId Data ID. + * @return {String} Cache key. + */ + function getFieldsCacheKey(dataId) { + return getDatabaseDataPrefixCacheKey(dataId) + ':fields'; } /** @@ -178,20 +223,25 @@ angular.module('mm.addons.mod_data') * @ngdoc method * @name $mmaModData#getDatabaseAccessInformation * @param {Number} dataId Data ID. + * @param {Number} [groupId] Group ID. * @param {Boolean} offline True if it should return cached data. Has priority over ignoreCache. * @param {Boolean} ignoreCache True if it should ignore cached data (it will always fail in offline or server down). * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when the database is retrieved. */ - self.getDatabaseAccessInformation = function(dataId, offline, ignoreCache, siteId) { + self.getDatabaseAccessInformation = function(dataId, groupId, offline, ignoreCache, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { var params = { databaseid: dataId }, preSets = { - cacheKey: getDatabaseAccessInformationDataCacheKey(dataId) + cacheKey: getDatabaseAccessInformationDataCacheKey(dataId, groupId) }; + if (typeof groupId !== "undefined") { + params.groupid = groupId; + } + if (offline) { preSets.omitExpires = true; } else if (ignoreCache) { @@ -215,10 +265,189 @@ angular.module('mm.addons.mod_data') */ self.invalidateDatabaseAccessInformationData = function(dataId, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { - return site.invalidateWsCacheForKey(getDatabaseAccessInformationDataCacheKey(dataId)); + return site.invalidateWsCacheForKeyStartingWith(getDatabaseAccessInformationDataPrefixCacheKey(dataId)); + }); + }; + + /** + * Get entries for a specific database and group. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#getEntries + * @param {Number} dataId Data ID. + * @param {Number} [groupId] Group ID. + * @param {Number} [sort] Sort the records by this field id, reserved ids are: + * 0: timeadded + * -1: firstname + * -2: lastname + * -3: approved + * -4: timemodified. + * Empty for using the default database setting. + * @param {String} [order] The direction of the sorting: 'ASC' or 'DESC'. + * Empty for using the default database setting. + * @param {Number} [page] Page of records to return. + * @param {Number} [perPage] Number of records to return per page. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the database is retrieved. + */ + self.getEntries = function(dataId, groupId, sort, order, page, perPage, forceCache, ignoreCache, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + databaseid: dataId, + returncontents: 1 + }, + preSets = { + cacheKey: getEntriesCacheKey(dataId, groupId) + }; + + if (typeof sort != "undefined") { + params.sort = sort; + } + + if (order) { + params.order = order; + } + + if (page) { + params.page = page; + } + + if (perPage) { + params.perpage = perPage; + } + + if (typeof groupId !== "undefined") { + params.groupid = groupId; + } + + if (forceCache) { + preSets.omitExpires = true; + } else if (ignoreCache) { + preSets.getFromCache = 0; + preSets.emergencyCache = 0; + } + + return site.read('mod_data_get_entries', params, preSets); }); }; + /** + * Invalidates database entries data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateEntriesData + * @param {Number} dataId Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + self.invalidateEntriesData = function(dataId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.invalidateWsCacheForKeyStartingWith(getEntriesPrefixCacheKey(dataId)); + }); + }; + + /** + * Get the list of configured fields for the given database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#getFields + * @param {Number} dataId Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the database is retrieved. + */ + self.getFields = function(dataId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + databaseid: dataId + }, + preSets = { + cacheKey: getFieldsCacheKey(dataId) + }; + + return site.read('mod_data_get_fields', params, preSets).then(function(response) { + if (response && response.fields) { + return response.fields; + } + return $q.reject(); + }); + }); + }; + + /** + * Invalidates database fields data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateFieldsData + * @param {Number} dataId Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + self.invalidateFieldsData = function(dataId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.invalidateWsCacheForKey(getFieldsCacheKey(dataId)); + }); + }; + + /** + * Performs the whole fetch of the entries in the database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataPrefetchHandler#fetchAllEntries + * @param {Number} dataId Data ID. + * @param {Number} [groupId] Group ID. + * @param {Number} [sort] Sort the records by this field id. See $mmaModData#getEntries for more information. + * @param {String} [order] The direction of the sorting. See $mmaModData#getEntries for more information. + * @param {Number} [perPage] Number of records to return per page. Default 10. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when done. + */ + self.fetchAllEntries = function(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, siteId) { + siteId = siteId || $mmSite.getId(); + + if (typeof perPage == 'undefined') { + perPage = 10; + } + + return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, [], 0, siteId); + }; + + /** + * Recursive call on fetch all entries. + * + * @param {Number} dataId Data ID. + * @param {Number} groupId Group ID. + * @param {Number} sort Sort the records by this field id. See $mmaModData#getEntries for more information. + * @param {String} order The direction of the sorting. See $mmaModData#getEntries for more information. + * @param {Number} perPage Number of records to return per page. + * @param {Boolean} forceCache True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} ignoreCache True if it should ignore cached data (it will always fail in offline or server down). + * @param {Array} entries Entries already fetch (just to concatenate them). + * @param {Number} page Page of records to return. + * @param {String} siteId Site ID. + * @return {Promise} Promise resolved when done. + */ + function fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, entries, page, siteId) { + return self.getEntries(dataId, groupId, sort, order, page, perPage, forceCache, ignoreCache, siteId).then(function(result) { + entries = entries.concat(result.entries); + + var canLoadMore = ((page + 1) * perPage) < result.totalcount; + if (canLoadMore) { + return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, entries, + page + 1, siteId); + } + return entries; + }); + } + /** * Invalidate the prefetched content except files. * To invalidate files, use $mmaModData#invalidateFiles. diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js new file mode 100644 index 00000000000..d2647d6c648 --- /dev/null +++ b/www/addons/mod/data/services/helper.js @@ -0,0 +1,51 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Helper to gather some common functions for database. + * + * @module mm.addons.mod_data + * @ngdoc service + * @name $mmaModDataHelper + */ +.factory('$mmaModDataHelper', function() { + + var self = {}; + + /** + * Add a prefix to all rules in a CSS string. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#prefixCSS + * @param {String} css CSS code to be prefixed. + * @param {String} prefix Prefix css selector. + * @return {String} Prefixed CSS. + */ + self.prefixCSS = function(css, prefix) { + if (!css) { + return ""; + } + // Remove comments first. + var regExp = /\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm; + css = css.replace(regExp, ""); + // Add prefix. + regExp = /([^]*?)({[^]*?}|,)/g; + return css.replace(regExp, prefix + " $1 $2"); + }; + + return self; +}); \ No newline at end of file diff --git a/www/addons/mod/data/services/prefetch_handler.js b/www/addons/mod/data/services/prefetch_handler.js index 9e3d181ea6c..c9b1e05bab1 100644 --- a/www/addons/mod/data/services/prefetch_handler.js +++ b/www/addons/mod/data/services/prefetch_handler.js @@ -21,12 +21,13 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataPrefetchHandler */ -.factory('$mmaModDataPrefetchHandler', function($mmaModData, mmaModDataComponent, $mmFilepool, $q, $mmUtil, $mmPrefetchFactory) { +.factory('$mmaModDataPrefetchHandler', function($mmaModData, mmaModDataComponent, $mmFilepool, $q, $mmUtil, $mmPrefetchFactory, + $mmSite, $mmGroups) { var self = $mmPrefetchFactory.createPrefetchHandler(mmaModDataComponent); // RegExp to check if a module has updates based on the result of $mmCoursePrefetchDelegate#getCourseUpdates. - self.updatesNames = /^configuration$|^.*files$|^entries|^gradeitems$|^outcomes$|^comments$|^ratings/; + self.updatesNames = /^configuration$|^.*files$|^entries$|^gradeitems$|^outcomes$|^comments$|^ratings/; /** * Download the module. @@ -55,17 +56,115 @@ angular.module('mm.addons.mod_data') * @return {Promise} Promise resolved with the list of files. */ self.getFiles = function(module, courseId, siteId) { - var files = []; - return $mmaModData.getDatabase(courseId, module.id, siteId).then(function(database) { - // Get intro files. - files = self.getIntroFilesFromInstance(module, database); - return files; - }).catch(function() { - // Any error, return the list we have. - return files; + siteId = siteId || $mmSite.getId(); + + return getDatabaseInfoHelper(module, courseId, true, undefined, undefined, siteId).then(function(info) { + return info.files; }); }; + /** + * Helper function to get all database info just once. + * + * @param {Object} module Module to get the files. + * @param {Number} courseId Course ID the module belongs to. + * @param {Boolean} [omitFail] True to always return even if fails. Default false. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} siteId Site ID. + * @return {Promise} Promise resolved with the info fetched. + */ + function getDatabaseInfoHelper(module, courseId, omitFail, forceCache, ignoreCache, siteId) { + var database, + groups = [], + entries = [], + files = []; + + return $mmaModData.getDatabase(courseId, module.id, siteId, forceCache).then(function(data) { + files = self.getIntroFilesFromInstance(module, database); + + database = data; + return $mmGroups.getActivityGroupInfo(module.id, false, undefined, siteId).then(function(groupInfo) { + if (!groupInfo.groups || groupInfo.groups.length == 0) { + groupInfo.groups = [{id: 0}]; + } + groups = groupInfo.groups; + + return getAllUniqueEntries(database.id, groups, forceCache, ignoreCache, siteId); + }); + }).then(function(uniqueEntries) { + entries = uniqueEntries; + files = files.concat(getEntriesFiles(entries)); + + return { + database: database, + groups: groups, + entries: entries, + files: files + }; + }).catch(function(message) { + if (omitFail) { + // Any error, return the info we have. + return { + database: database, + groups: groups, + entries: entries, + files: files + }; + } + return $q.reject(message); + }); + } + + /** + * Retrieves all the entries for all the groups and then returns only unique entries. + * + * @param {Number} dataId Database Id. + * @param {Array} groups Array of groups in the activity. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} siteId Site ID. + * @return {Promise} All unique entries. + */ + function getAllUniqueEntries(dataId, groups, forceCache, ignoreCache, siteId) { + var promises = []; + + angular.forEach(groups, function(group) { + promises.push($mmaModData.fetchAllEntries(dataId, group.id, undefined, undefined, undefined, forceCache, + ignoreCache, siteId)); + }); + + return $q.all(promises).then(function(responses) { + var uniqueEntries = {}; + + angular.forEach(responses, function(groupEntries) { + angular.forEach(groupEntries.entries, function(entry) { + uniqueEntries[entry.id] = entry; + }); + }); + + return uniqueEntries; + }); + } + + /** + * Returns the file contained in the entries. + * + * @param {Array} entries List of entries to get files from. + * @return {Array} List of files. + */ + function getEntriesFiles(entries) { + var files = []; + + angular.forEach(entries, function(entry) { + angular.forEach(entry.contents, function(content) { + files = files.concat(content.files); + }); + }); + + return files; + } + /** * Returns database intro files. * @@ -217,16 +316,18 @@ angular.module('mm.addons.mod_data') * @return {Promise} Promise resolved with an object with 'revision' and 'timemod'. */ function prefetchDatabase(module, courseId, single, siteId) { - // Prefetch the database data. - return $mmaModData.getDatabase(courseId, module.id, siteId).then(function(database) { - var promises = []; + siteId = siteId || $mmSite.getId(); - promises.push(self.getFiles(module, courseId, siteId).then(function(files) { - return $mmFilepool.addFilesToQueueByUrl(siteId, files, self.component, module.id); - })); + // Prefetch the database data. + return getDatabaseInfoHelper(module, courseId, false, true, siteId).then(function(info) { + var database = info.database, + promises = []; - promises.push($mmaModData.getDatabaseAccessInformation(database.id, false, true, siteId)); + promises.push($mmFilepool.addFilesToQueueByUrl(siteId, info.files, self.component, module.id)); + angular.forEach(info.groups, function(group) { + promises.push($mmaModData.getDatabaseAccessInformation(database.id, group.id, false, true, siteId)); + }); return $q.all(promises); }).then(function() { // Get revision and timemodified. diff --git a/www/addons/mod/data/templates/index.html b/www/addons/mod/data/templates/index.html index fb4bf06e2ed..3e4cf439b8a 100644 --- a/www/addons/mod/data/templates/index.html +++ b/www/addons/mod/data/templates/index.html @@ -1,18 +1,18 @@ {{ title }} - + - + - +
@@ -20,23 +20,40 @@ {{ description }}
-
+ +
+ {{ 'mm.core.groupsseparate' | translate }} + {{ 'mm.core.groupsvisible' | translate }} + +
+
{{ 'mma.mod_data.notopenyet' | translate:{$a: timeAvailableFromReadable} }}
-
+
{{ 'mma.mod_data.expired' | translate:{$a: timeAvailableToReadable} }}
-
- {{ 'mma.mod_data.entrieslefttoaddtoview' | translate:{$a: {entrieslefttoview: entriesLeftToView} } }} +
+ {{ 'mma.mod_data.entrieslefttoaddtoview' | translate:{$a: {entrieslefttoview: access.entrieslefttoview} } }}
-
- {{ 'mma.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: entriesLeftToAdd} } }} +
+ {{ 'mma.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: access.entrieslefttoadd} } }} +
+ +
+ + + + {{ entries }} +
- + diff --git a/www/core/lib/groups.js b/www/core/lib/groups.js index 651af503e29..e549a5866dd 100644 --- a/www/core/lib/groups.js +++ b/www/core/lib/groups.js @@ -93,6 +93,7 @@ angular.module('mm.core') * @name $mmGroups#getActivityGroupInfo * @param {Number} cmId Course Module Id of the feedback. * @param {Boolean} [addAllParts=true] True to add the all participants option, false otherwise. + * Always true for visible groups. * @param {Number} [userId] User ID. If not defined, use current user. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Object} Containing the group info related to the activity. @@ -120,7 +121,7 @@ angular.module('mm.core') groupInfo.separateGroups = false; groupInfo.visibleGroups = false; } else { - if (addAllParts) { + if (addAllParts || groupInfo.visibleGroups) { groupInfo.groups = [ {'id': 0, 'name': $translate.instant('mm.core.allparticipants')} ]; diff --git a/www/core/scss/fontawesome.scss b/www/core/scss/fontawesome.scss new file mode 100644 index 00000000000..ca630e76d74 --- /dev/null +++ b/www/core/scss/fontawesome.scss @@ -0,0 +1,44 @@ +/** This file is intended to translate fontawesome to ionicons while the font is not supported */ + +.fa.icon { + @extend .ion; +} + +.fa { + font-size: $button-icon-size; + width: $button-icon-size; + height: $button-icon-size; +} + +/** Fixed width */ +.fa-fw { + width: (18em / 14); + text-align: center; +} + +/** Uncomment for dev purposes, it will show an asterisk in red where a missing icon is */ +/*.fa:before { + color: red !important; + content: $ionicon-var-asterisk; +}*/ + +/** Icons translation */ +.fa-search-plus:before { + content: $ionicon-var-ios-search-strong; +} + +.fa-cog:before { + content: $ionicon-var-gear-b; +} + +.fa-trash:before { + content: $ionicon-var-trash-a; +} + +.fa-thumbs-up:before { + content: $ionicon-var-thumbsup; +} + +.fa-thumbs-down:before { + content: $ionicon-var-thumbsdown; +} \ No newline at end of file From 46d6f28278b8578801fb7baf7f049932dd3b9723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 6 Jun 2017 10:42:08 +0200 Subject: [PATCH 009/118] MOBILE-2119 data: Show single view entries --- www/addons/mod/data/controllers/entry.js | 172 ++++++++++++++++++ www/addons/mod/data/controllers/index.js | 3 - www/addons/mod/data/main.js | 21 ++- www/addons/mod/data/services/data.js | 83 ++++++--- www/addons/mod/data/services/handlers.js | 61 ++++++- www/addons/mod/data/services/helper.js | 85 ++++++++- .../mod/data/services/prefetch_handler.js | 14 +- www/addons/mod/data/templates/entry.html | 37 ++++ www/addons/mod/data/templates/index.html | 4 +- 9 files changed, 446 insertions(+), 34 deletions(-) create mode 100644 www/addons/mod/data/controllers/entry.js create mode 100644 www/addons/mod/data/templates/entry.html diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js new file mode 100644 index 00000000000..644aae9f69d --- /dev/null +++ b/www/addons/mod/data/controllers/entry.js @@ -0,0 +1,172 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Data entry controller. + * + * @module mm.addons.mod_data + * @ngdoc controller + * @name mmaModDataEntryCtrl + */ +.controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, + $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate) { + + var module = $stateParams.module || {}, + courseId = $stateParams.courseid, + entryId = $stateParams.entryid || false, + page = $stateParams.page || false, + data, + scrollView; + + $scope.title = module.name; + $scope.description = module.description; + $scope.moduleUrl = module.url; + $scope.moduleName = $mmCourse.translateModuleName('data'); + $scope.component = mmaModDataComponent; + $scope.databaseLoaded = false; + $scope.selectedGroup = $stateParams.group || 0; + + function fetchEntryData(refresh) { + return $mmaModData.getDatabase(courseId, module.id).then(function(databaseData) { + data = databaseData; + + $scope.title = data.name || $scope.title; + $scope.description = data.intro || $scope.description; + $scope.data = databaseData; + + $scope.database = data; + + return setEntryIdFromPage(data.id, page, $scope.selectedGroup).then(function() { + return $mmaModData.getDatabaseAccessInformation(data.id); + }); + }).then(function(accessData) { + return $mmGroups.getActivityGroupInfo(data.coursemodule, accessData.canmanageentries).then(function(groupInfo) { + $scope.groupInfo = groupInfo; + + // Check selected group is accessible. + if (groupInfo && groupInfo.groups && groupInfo.groups.length > 0) { + var found = false; + for (var x in groupInfo.groups) { + if (groupInfo.groups[x].id == $scope.selectedGroup) { + found = true; + break; + } + } + if (!found) { + $scope.selectedGroup = groupInfo.groups[0].id; + } + } + + return $mmaModData.getEntry(data.id, entryId); + }); + }).then(function(entry) { + $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); + $scope.entryContents = entry.entryviewcontents; + + return $mmaModDataHelper.getPageInfoByEntry(data.id, entryId, $scope.selectedGroup).then(function(result) { + $scope.previousId = result.previousId; + $scope.nextId = result.nextId; + }); + }).catch(function(message) { + if (!refresh) { + // Some call failed, retry without using cache since it might be a new activity. + return refreshAllData(); + } + + $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); + return $q.reject(); + }).finally(function() { + scrollTop(); + $scope.databaseLoaded = true; + }); + } + + // Set group to see the database. + $scope.setGroup = function(groupId) { + $scope.selectedGroup = groupId; + $scope.databaseLoaded = false; + + return setEntryIdFromPage(data.id, 0, $scope.selectedGroup).then(function() { + return fetchEntryData(); + }); + }; + + // Go to selected entry without changing state. + $scope.gotoEntry = function(entry) { + entryId = entry; + page = false; + $scope.databaseLoaded = false; + return fetchEntryData(); + + }; + + // Convenience function to refresh all the data. + function refreshAllData() { + var promises = []; + + promises.push($mmaModData.invalidateDatabaseData(courseId)); + if (data) { + promises.push($mmaModData.invalidateEntryData(data.id, entryId)); + promises.push($mmGroups.invalidateActivityGroupInfo(data.coursemodule)); + promises.push($mmaModData.invalidateEntriesData(data.id)); + } + + return $q.all(promises).finally(function() { + return fetchEntryData(true); + }); + } + + // Convenience function to translate page number to entry identifier. + function setEntryIdFromPage(dataId, pageNumber, group) { + if (pageNumber !== false) { + return $mmaModDataHelper.getPageInfoByPage(dataId, pageNumber, group).then(function(result) { + entryId = result.entryId; + page = false; + }); + } + + return $q.when(); + } + + fetchEntryData(); + + // Scroll to top. + function scrollTop() { + if (!scrollView) { + scrollView = $ionicScrollDelegate.$getByHandle('mmaModDataEntryScroll'); + } + scrollView && scrollView.scrollTop && scrollView.scrollTop(); + } + + // Context Menu Description action. + $scope.expandDescription = function() { + $mmText.expandText($translate.instant('mm.core.description'), $scope.description, false, mmaModDataComponent, module.id); + }; + + // Pull to refresh. + $scope.refreshDatabase = function() { + if ($scope.databaseLoaded) { + return refreshAllData().finally(function() { + $scope.$broadcast('scroll.refreshComplete'); + }); + } + }; + + // Opens search. + $scope.gotoSearch = function() { + $mmUtil.openInApp($mmSite.getURL() + '/mod/data/view.php?mode=asearch&d=' + data.id); + }; +}); diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 442ca61b38b..35f52d9c5fd 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -36,7 +36,6 @@ angular.module('mm.addons.mod_data') $scope.refreshIcon = 'spinner'; $scope.syncIcon = 'spinner'; $scope.component = mmaModDataComponent; - $scope.componentId = module.id; $scope.databaseLoaded = false; $scope.selectedGroup = $stateParams.group || 0; @@ -135,8 +134,6 @@ angular.module('mm.addons.mod_data') }); }; - - // Convenience function to refresh all the data. function refreshAllData(sync, showErrors) { var promises = []; diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index 38a967c9627..01408a1af9a 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -33,6 +33,24 @@ angular.module('mm.addons.mod_data', ['mm.core']) templateUrl: 'addons/mod/data/templates/index.html' } } + }) + + .state('site.mod_data-entry', { + url: '/mod_data-entry', + params: { + module: null, + moduleid: null, // Redundant parameter to fix a problem passing object as parameters. To be fixed in MOBILE-1370. + courseid: null, + entryid: null, + page: null, + group: null + }, + views: { + 'site': { + controller: 'mmaModDataEntryCtrl', + templateUrl: 'addons/mod/data/templates/entry.html' + } + } }); }) @@ -41,4 +59,5 @@ angular.module('mm.addons.mod_data', ['mm.core']) $mmCourseDelegateProvider.registerContentHandler('mmaModData', 'data', '$mmaModDataHandlers.courseContent'); $mmCoursePrefetchDelegateProvider.registerPrefetchHandler('mmaModData', 'data', '$mmaModDataPrefetchHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:index', '$mmaModDataHandlers.indexLinksHandler'); -}); \ No newline at end of file + $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:entry', '$mmaModDataHandlers.showEntryLinksHandler'); +}); diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index beb2df25881..7c27dd20779 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -89,6 +89,17 @@ angular.module('mm.addons.mod_data') return getEntriesPrefixCacheKey(dataId) + groupId; } + /** + * Get cache key for database entry data WS calls. + * + * @param {Number} dataId Data ID for caching purposes. + * @param {Number} entryId Entry ID. + * @return {String} Cache key. + */ + function getEntryCacheKey(dataId, entryId) { + return getDatabaseDataPrefixCacheKey(dataId) + ':entry:' + entryId; + } + /** * Get cache key for database fields data WS calls. * @@ -297,7 +308,10 @@ angular.module('mm.addons.mod_data') return $mmSitesManager.getSite(siteId).then(function(site) { var params = { databaseid: dataId, - returncontents: 1 + returncontents: 1, + page: page || 0, + perpage: perPage || 0, + groupid: groupId || 0 }, preSets = { cacheKey: getEntriesCacheKey(dataId, groupId) @@ -307,22 +321,10 @@ angular.module('mm.addons.mod_data') params.sort = sort; } - if (order) { + if (typeof order !== "undefined") { params.order = order; } - if (page) { - params.page = page; - } - - if (perPage) { - params.perpage = perPage; - } - - if (typeof groupId !== "undefined") { - params.groupid = groupId; - } - if (forceCache) { preSets.omitExpires = true; } else if (ignoreCache) { @@ -350,6 +352,48 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Get an entry of the database activity. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#getEntry + * @param {Number} dataId Data ID for caching purposes. + * @param {Number} entryId Entry ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the database entry is retrieved. + */ + self.getEntry = function(dataId, entryId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + entryid: entryId, + returncontents: 1 + }, + preSets = { + cacheKey: getEntryCacheKey(dataId, entryId) + }; + + return site.read('mod_data_get_entry', params, preSets); + }); + }; + + /** + * Invalidates database entry data. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#invalidateEntryData + * @param {Number} dataId Data ID for caching purposes. + * @param {Number} entryId Entry ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + self.invalidateEntryData = function(dataId, entryId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.invalidateWsCacheForKey(getEntryCacheKey(dataId, entryId)); + }); + }; + /** * Get the list of configured fields for the given database. * @@ -412,11 +456,6 @@ angular.module('mm.addons.mod_data') */ self.fetchAllEntries = function(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, siteId) { siteId = siteId || $mmSite.getId(); - - if (typeof perPage == 'undefined') { - perPage = 10; - } - return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, [], 0, siteId); }; @@ -440,9 +479,9 @@ angular.module('mm.addons.mod_data') entries = entries.concat(result.entries); var canLoadMore = ((page + 1) * perPage) < result.totalcount; - if (canLoadMore) { - return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, entries, - page + 1, siteId); + if (perPage && canLoadMore) { + return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, entries, page + 1, + siteId); } return entries; }); diff --git a/www/addons/mod/data/services/handlers.js b/www/addons/mod/data/services/handlers.js index 4220d647011..19b727ce4be 100644 --- a/www/addons/mod/data/services/handlers.js +++ b/www/addons/mod/data/services/handlers.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataHandlers */ .factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, - mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, + mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, $mmContentLinkHandlerFactory, mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate) { var self = {}; @@ -156,5 +156,64 @@ angular.module('mm.addons.mod_data') self.indexLinksHandler = $mmContentLinksHelper.createModuleIndexLinkHandler('mmaModData', 'data', $mmaModData); + /** + * Content links handler for database show entry. + * Match mod/data/view.php?d=6&rid=5 with a valid data id and entryid. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#showEntryLinksHandler + */ + self.showEntryLinksHandler = $mmContentLinkHandlerFactory.createChild( + /\/mod\/data\/view\.php.*([\?\&](d|rid|page|group|mode)=\d+)/, '$mmCourseDelegate_mmaModData'); + + // Check if the printLinksHandler is enabled for a certain site. See $mmContentLinkHandlerFactory#isEnabled. + self.showEntryLinksHandler.isEnabled = $mmaModData.isPluginEnabled; + + // Get actions to perform with the link. See $mmContentLinkHandlerFactory#getActions. + self.showEntryLinksHandler.getActions = function(siteIds, url, params, courseId) { + if (typeof params.d == 'undefined') { + // Id not defined. Cannot treat the URL. + return false; + } + + if ((!params.mode || params.mode != "single") && typeof params.rid == 'undefined') { + return false; + } + + return [{ + action: function(siteId) { + var modal = $mmUtil.showModalLoading(), + dataId = parseInt(params.d, 10), + rId = parseInt(params.rid, 10) || false, + group = parseInt(params.group, 10) || false, + page = parseInt(params.page, 10) || false; + + return $mmCourse.getModuleBasicInfoByInstance(dataId, 'data', siteId).then(function(module) { + var stateParams = { + moduleid: module.id, + module: module, + courseid: module.course + }; + + if (group) { + stateParams.group = group; + } + + if (params.mode && params.mode == "single") { + stateParams.page = page || 1; + } else if (rId) { + stateParams.entryid = rId; + } + + + return $mmContentLinksHelper.goInSite('site.mod_data-entry', stateParams, siteId); + }).finally(function() { + modal.dismiss(); + }); + } + }]; + }; + return self; }); diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index d2647d6c648..d625a691374 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataHelper */ -.factory('$mmaModDataHelper', function() { +.factory('$mmaModDataHelper', function($mmaModData) { var self = {}; @@ -47,5 +47,86 @@ angular.module('mm.addons.mod_data') return css.replace(regExp, prefix + " $1 $2"); }; + + /** + * Get page info related to an entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getPageInfoByEntry + * @param {Number} dataId Data ID. + * @param {Number} entryId Entry ID. + * @param {Number} groupId Group ID. + * @param {String} siteId Site ID. Current if not defined. + * @return {Promise} Containing page number, if has next and have following page. + */ + self.getPageInfoByEntry = function(dataId, entryId, groupId, siteId) { + return self.getAllEntriesIds(dataId, groupId, siteId).then(function(entries) { + for (var index in entries) { + if (entries[index] == entryId) { + index = parseInt(index, 10); + return { + previousId: entries[index - 1] || false, + nextId: entries[index + 1] || false, + entryId: entryId, + page: index + 1, // Parsed to natural language. + numEntries: entries.length + }; + } + } + return false; + }); + }; + + /** + * Get page info related to an entry by page number. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getPageInfoByPage + * @param {Number} dataId Data ID. + * @param {Number} page Page number. + * @param {Number} groupId Group ID. + * @param {String} siteId Site ID. Current if not defined. + * @return {Promise} Containing page number, if has next and have following page. + */ + self.getPageInfoByPage = function(dataId, page, groupId, siteId) { + return self.getAllEntriesIds(dataId, groupId, siteId).then(function(entries) { + var index = parseInt(page, 10) - 1, + entryId = entries[index]; + if (entryId) { + return { + previousId: entries[index - 1] || false, + nextId: entries[index + 1] || false, + entryId: entryId, + page: page, // Parsed to natural language. + numEntries: entries.length + }; + } + return false; + }); + }; + + /** + * Fetch all entries and return it's Id + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getAllEntriesIds + * @param {Number} dataId Data ID. + * @param {Number} groupId Group ID. + * @param {String} siteId Site ID. Current if not defined. + * @return {Promise} Containing and array of EntryId. + */ + self.getAllEntriesIds = function(dataId, groupId, siteId) { + return $mmaModData.fetchAllEntries(dataId, groupId, undefined, undefined, undefined, true, undefined, siteId) + .then(function(entries) { + return entries.map(function(entry) { + return entry.id; + }); + }); + }; + + return self; -}); \ No newline at end of file +}); diff --git a/www/addons/mod/data/services/prefetch_handler.js b/www/addons/mod/data/services/prefetch_handler.js index c9b1e05bab1..7f22770fca7 100644 --- a/www/addons/mod/data/services/prefetch_handler.js +++ b/www/addons/mod/data/services/prefetch_handler.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataPrefetchHandler */ .factory('$mmaModDataPrefetchHandler', function($mmaModData, mmaModDataComponent, $mmFilepool, $q, $mmUtil, $mmPrefetchFactory, - $mmSite, $mmGroups) { + $mmSite, $mmGroups, $mmCourse) { var self = $mmPrefetchFactory.createPrefetchHandler(mmaModDataComponent); @@ -138,7 +138,7 @@ angular.module('mm.addons.mod_data') var uniqueEntries = {}; angular.forEach(responses, function(groupEntries) { - angular.forEach(groupEntries.entries, function(entry) { + angular.forEach(groupEntries, function(entry) { uniqueEntries[entry.id] = entry; }); }); @@ -326,8 +326,16 @@ angular.module('mm.addons.mod_data') promises.push($mmFilepool.addFilesToQueueByUrl(siteId, info.files, self.component, module.id)); angular.forEach(info.groups, function(group) { - promises.push($mmaModData.getDatabaseAccessInformation(database.id, group.id, false, true, siteId)); + promises.push($mmaModData.getDatabaseAccessInformation(database.id, group.id, false, true, siteId)); }); + + angular.forEach(info.entries, function(entry) { + promises.push($mmaModData.getEntry(database.id, entry.id, siteId)); + }); + + // Add Basic Info to manage links. + promises.push($mmCourse.getModuleBasicInfoByInstance(database.id, 'data', siteId)); + return $q.all(promises); }).then(function() { // Get revision and timemodified. diff --git a/www/addons/mod/data/templates/entry.html b/www/addons/mod/data/templates/entry.html new file mode 100644 index 00000000000..759db3c2cc0 --- /dev/null +++ b/www/addons/mod/data/templates/entry.html @@ -0,0 +1,37 @@ + + {{ title }} + + + + + + + + + +
+ {{ 'mm.core.groupsseparate' | translate }} + {{ 'mm.core.groupsvisible' | translate }} + +
+
+ + + + {{ entryContents }} + +
+
+ + +
+
+
+
diff --git a/www/addons/mod/data/templates/index.html b/www/addons/mod/data/templates/index.html index 3e4cf439b8a..1c9b7e7623e 100644 --- a/www/addons/mod/data/templates/index.html +++ b/www/addons/mod/data/templates/index.html @@ -17,7 +17,7 @@
- {{ description }} + {{ description }}
@@ -48,7 +48,7 @@ {{ cssTemplate }} - + {{ entries }}
From 75ea51da66689b14a6c67011ae07681866d83e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 9 Jun 2017 12:49:33 +0200 Subject: [PATCH 010/118] MOBILE-2123 data: Approve/Disapprove entries --- www/addons/mod/data/controllers/entry.js | 17 ++++++- www/addons/mod/data/controllers/index.js | 13 +++++- www/addons/mod/data/lang/en.json | 3 ++ www/addons/mod/data/main.js | 2 + www/addons/mod/data/services/data.js | 22 +++++++++ www/addons/mod/data/services/handlers.js | 59 ++++++++++++++++++++++-- www/core/scss/fontawesome.scss | 4 ++ 7 files changed, 114 insertions(+), 6 deletions(-) diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 644aae9f69d..6951ca54d8d 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -21,14 +21,15 @@ angular.module('mm.addons.mod_data') * @ngdoc controller * @name mmaModDataEntryCtrl */ -.controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, - $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate) { +.controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, $mmEvents, + $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, entryId = $stateParams.entryid || false, page = $stateParams.page || false, data, + entryChangedObserver, scrollView; $scope.title = module.name; @@ -169,4 +170,16 @@ angular.module('mm.addons.mod_data') $scope.gotoSearch = function() { $mmUtil.openInApp($mmSite.getURL() + '/mod/data/view.php?mode=asearch&d=' + data.id); }; + + // Refresh entry on change. + entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { + if (eventData.entryId == entryId && data.id == eventData.dataId && $mmSite.getId() == eventData.siteId) { + $scope.databaseLoaded = false; + return fetchEntryData(true); + } + }); + + $scope.$on('$destroy', function() { + entryChangedObserver && entryChangedObserver.off && entryChangedObserver.off(); + }); }); diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 35f52d9c5fd..ffe7c433a1a 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -22,11 +22,13 @@ angular.module('mm.addons.mod_data') * @name mmaModDataIndexCtrl */ .controller('mmaModDataIndexCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $mmCourseHelper, $q, - $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups) { + $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, + mmaModDataEventEntryChanged) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, data, + entryChangedObserver, onlineObserver; $scope.title = module.name; @@ -201,7 +203,16 @@ angular.module('mm.addons.mod_data') $scope.isOnline = online; }); + // Refresh entry on change. + entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { + if (data.id == eventData.dataId && $mmSite.getId() == eventData.siteId) { + $scope.databaseLoaded = false; + return fetchDatabaseData(true); + } + }); + $scope.$on('$destroy', function() { onlineObserver && onlineObserver.off && onlineObserver.off(); + entryChangedObserver && entryChangedObserver.off && entryChangedObserver.off(); }); }); diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index 5fc410aa1c6..76b50d2082a 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -2,8 +2,11 @@ "addentries": "Add entries", "entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries in order to complete this activity", "entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.", + "errorapproving": "Error approving or unapproving entry.", "expired": "Sorry, this activity closed on {{$a}} and is no longer available", "norecords": "No entries in database", "notopenyet": "Sorry, this activity is not available until {{$a}}", + "recordapproved": "Entry approved", + "recorddisapproved": "Entry unapproved", "search": "Search" } diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index 01408a1af9a..05b351dde8c 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -15,6 +15,7 @@ angular.module('mm.addons.mod_data', ['mm.core']) .constant('mmaModDataComponent', 'mmaModData') +.constant('mmaModDataEventEntryChanged', 'mma-mod_data_entry_changed') .config(function($stateProvider) { @@ -60,4 +61,5 @@ angular.module('mm.addons.mod_data', ['mm.core']) $mmCoursePrefetchDelegateProvider.registerPrefetchHandler('mmaModData', 'data', '$mmaModDataPrefetchHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:index', '$mmaModDataHandlers.indexLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:entry', '$mmaModDataHandlers.showEntryLinksHandler'); + $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:approve', '$mmaModDataHandlers.approveEntryLinksHandler'); }); diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 7c27dd20779..28fcdfceab4 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -394,6 +394,28 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Approves or unapproves an entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#approveEntry + * @param {Number} entryId Entry ID. + * @param {Boolean} approve Whether to approve (true) or unapprove the entry. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the database entry is retrieved. + */ + self.approveEntry = function(entryId, approve, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + entryid: entryId, + approve: approve ? 1 : 0 + }; + + return site.write('mod_data_approve_entry', params); + }); + }; + /** * Get the list of configured fields for the given database. * diff --git a/www/addons/mod/data/services/handlers.js b/www/addons/mod/data/services/handlers.js index 19b727ce4be..b02f707520a 100644 --- a/www/addons/mod/data/services/handlers.js +++ b/www/addons/mod/data/services/handlers.js @@ -21,9 +21,9 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataHandlers */ -.factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, +.factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, $q, mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, $mmContentLinkHandlerFactory, - mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate) { + mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged) { var self = {}; /** @@ -167,7 +167,7 @@ angular.module('mm.addons.mod_data') self.showEntryLinksHandler = $mmContentLinkHandlerFactory.createChild( /\/mod\/data\/view\.php.*([\?\&](d|rid|page|group|mode)=\d+)/, '$mmCourseDelegate_mmaModData'); - // Check if the printLinksHandler is enabled for a certain site. See $mmContentLinkHandlerFactory#isEnabled. + // Check if the showEntryLinksHandler is enabled for a certain site. See $mmContentLinkHandlerFactory#isEnabled. self.showEntryLinksHandler.isEnabled = $mmaModData.isPluginEnabled; // Get actions to perform with the link. See $mmContentLinkHandlerFactory#getActions. @@ -215,5 +215,58 @@ angular.module('mm.addons.mod_data') }]; }; + /** + * Content links handler for database approve/disapprove entry. + * Match mod/data/view.php?d=6&approve=5 with a valid data id and entryid. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#approveEntryLinksHandler + */ + self.approveEntryLinksHandler = $mmContentLinkHandlerFactory.createChild( + /\/mod\/data\/view\.php.*([\?\&](d|approve|disapprove)=\d+)/, '$mmCourseDelegate_mmaModData'); + + // Check if the approveEntryLinksHandler is enabled for a certain site. See $mmContentLinkHandlerFactory#isEnabled. + self.approveEntryLinksHandler.isEnabled = $mmaModData.isPluginEnabled; + + // Get actions to perform with the link. See $mmContentLinkHandlerFactory#getActions. + self.approveEntryLinksHandler.getActions = function(siteIds, url, params, courseId) { + if (typeof params.d == 'undefined' || (typeof params.approve == 'undefined' && typeof params.disapprove == 'undefined')) { + // Required fields not defined. Cannot treat the URL. + return false; + } + + return [{ + action: function(siteId) { + var modal = $mmUtil.showModalLoading(), + dataId = parseInt(params.d, 10), + entryId = parseInt(params.approve, 10) || parseInt(params.disapprove, 10), + approve = parseInt(params.approve, 10) ? true : false; + + // Approve/disapprove entry. + return $mmaModData.approveEntry(entryId, approve, siteId).catch(function(message) { + modal.dismiss(); + $mmUtil.showErrorModal(message, 'mma.mod_data.errorapproving', true); + + return $q.reject(); + }).then(function() { + var promises = []; + promises.push($mmaModData.invalidateEntryData(dataId, entryId, siteId)); + promises.push($mmaModData.invalidateEntriesData(dataId, siteId)); + + return $q.all(promises); + }).then(function() { + $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: dataId, entryId: entryId, siteId: siteId}); + + modal.dismiss(); + $mmUtil.showToast(approve ? 'mma.mod_data.recordapproved' : 'mma.mod_data.recorddisapproved', true, 3000); + }).finally(function() { + // Just in case. In fact we need to dismiss the modal before showing a toast or error message. + modal.dismiss(); + }); + } + }]; + }; + return self; }); diff --git a/www/core/scss/fontawesome.scss b/www/core/scss/fontawesome.scss index ca630e76d74..ced2f2e1e7d 100644 --- a/www/core/scss/fontawesome.scss +++ b/www/core/scss/fontawesome.scss @@ -41,4 +41,8 @@ .fa-thumbs-down:before { content: $ionicon-var-thumbsdown; +} + +.fa-ban:before { + content: $ionicon-var-minus-circled; } \ No newline at end of file From b4657acc8a686a586699b67a0a04fc7741c77634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 12 Jun 2017 09:56:28 +0200 Subject: [PATCH 011/118] MOBILE-2125 data: Delete entry --- www/addons/mod/data/controllers/entry.js | 12 +++-- www/addons/mod/data/lang/en.json | 3 ++ www/addons/mod/data/main.js | 1 + www/addons/mod/data/services/data.js | 22 ++++++++- www/addons/mod/data/services/handlers.js | 60 +++++++++++++++++++++++- 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 6951ca54d8d..3f94bd07ad2 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -22,7 +22,8 @@ angular.module('mm.addons.mod_data') * @name mmaModDataEntryCtrl */ .controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, $mmEvents, - $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged) { + $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged, + $ionicHistory) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -174,8 +175,13 @@ angular.module('mm.addons.mod_data') // Refresh entry on change. entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { if (eventData.entryId == entryId && data.id == eventData.dataId && $mmSite.getId() == eventData.siteId) { - $scope.databaseLoaded = false; - return fetchEntryData(true); + if (eventData.deleted) { + // If deleted, go back. + $ionicHistory.goBack(); + } else { + $scope.databaseLoaded = false; + return fetchEntryData(true); + } } }); diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index 76b50d2082a..03ac31afac0 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -1,12 +1,15 @@ { "addentries": "Add entries", + "confirmdeleterecord": "Are you sure you want to delete this entry?", "entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries in order to complete this activity", "entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.", "errorapproving": "Error approving or unapproving entry.", + "errordeleting": "Error deleting the entry.", "expired": "Sorry, this activity closed on {{$a}} and is no longer available", "norecords": "No entries in database", "notopenyet": "Sorry, this activity is not available until {{$a}}", "recordapproved": "Entry approved", + "recorddeleted": "Entry deleted", "recorddisapproved": "Entry unapproved", "search": "Search" } diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index 05b351dde8c..c6bfa192fbe 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -62,4 +62,5 @@ angular.module('mm.addons.mod_data', ['mm.core']) $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:index', '$mmaModDataHandlers.indexLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:entry', '$mmaModDataHandlers.showEntryLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:approve', '$mmaModDataHandlers.approveEntryLinksHandler'); + $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:delete', '$mmaModDataHandlers.deleteEntryLinksHandler'); }); diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 28fcdfceab4..55c3fdf2aa1 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -403,7 +403,7 @@ angular.module('mm.addons.mod_data') * @param {Number} entryId Entry ID. * @param {Boolean} approve Whether to approve (true) or unapprove the entry. * @param {String} [siteId] Site ID. If not defined, current site. - * @return {Promise} Promise resolved when the database entry is retrieved. + * @return {Promise} Promise resolved when the action is done. */ self.approveEntry = function(entryId, approve, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { @@ -416,6 +416,26 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Deletes an entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#deleteEntry + * @param {Number} entryId Entry ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the action is done. + */ + self.deleteEntry = function(entryId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + entryid: entryId + }; + + return site.write('mod_data_delete_entry', params); + }); + }; + /** * Get the list of configured fields for the given database. * diff --git a/www/addons/mod/data/services/handlers.js b/www/addons/mod/data/services/handlers.js index b02f707520a..2c00b4b1f63 100644 --- a/www/addons/mod/data/services/handlers.js +++ b/www/addons/mod/data/services/handlers.js @@ -23,7 +23,7 @@ angular.module('mm.addons.mod_data') */ .factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, $q, mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, $mmContentLinkHandlerFactory, - mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged) { + mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged, $translate) { var self = {}; /** @@ -215,7 +215,7 @@ angular.module('mm.addons.mod_data') }]; }; - /** + /** * Content links handler for database approve/disapprove entry. * Match mod/data/view.php?d=6&approve=5 with a valid data id and entryid. * @@ -268,5 +268,61 @@ angular.module('mm.addons.mod_data') }]; }; + /** + * Content links handler for database delete entry. + * Match mod/data/view.php?d=6&delete=5 with a valid data id and entryid. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#deleteEntryLinksHandler + */ + self.deleteEntryLinksHandler = $mmContentLinkHandlerFactory.createChild( + /\/mod\/data\/view\.php.*([\?\&](d|delete)=\d+)/, '$mmCourseDelegate_mmaModData'); + + // Check if the deleteEntryLinksHandler is enabled for a certain site. See $mmContentLinkHandlerFactory#isEnabled. + self.deleteEntryLinksHandler.isEnabled = $mmaModData.isPluginEnabled; + + // Get actions to perform with the link. See $mmContentLinkHandlerFactory#getActions. + self.deleteEntryLinksHandler.getActions = function(siteIds, url, params, courseId) { + if (typeof params.d == 'undefined' || typeof params.delete == 'undefined') { + // Required fields not defined. Cannot treat the URL. + return false; + } + + return [{ + action: function(siteId) { + // Confirm before delete. + return $mmUtil.showConfirm($translate.instant('mma.mod_data.confirmdeleterecord')).then(function() { + var modal = $mmUtil.showModalLoading(), + dataId = parseInt(params.d, 10), + entryId = parseInt(params.delete, 10); + + // Delete entry. + return $mmaModData.deleteEntry(entryId, siteId).catch(function(message) { + modal.dismiss(); + $mmUtil.showErrorModal(message, 'mma.mod_data.errordeleting', true); + + return $q.reject(); + }).then(function() { + var promises = []; + promises.push($mmaModData.invalidateEntryData(dataId, entryId, siteId)); + promises.push($mmaModData.invalidateEntriesData(dataId, siteId)); + + return $q.all(promises); + }).then(function() { + $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: dataId, entryId: entryId, siteId: siteId, + deleted: true}); + + modal.dismiss(); + $mmUtil.showToast('mma.mod_data.recorddeleted', true, 3000); + }).finally(function() { + // Just in case. In fact we need to dismiss the modal before showing a toast or error message. + modal.dismiss(); + }); + }); + } + }]; + }; + return self; }); From 33410f5c506e7b71ac5f470e0d24475577120036 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 29 May 2017 13:30:03 +0200 Subject: [PATCH 012/118] MOBILE-2147 electron: Basic Electron support --- package.json | 8 +-- www/core/components/login/main.js | 6 ++ .../components/sidemenu/controllers/menu.js | 5 ++ www/electron.js | 63 +++++++++++++++++++ www/index.html | 2 +- 5 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 www/electron.js diff --git a/package.json b/package.json index 553a2c9c0d5..fcc4f55f831 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mm2", - "version": "1.0.0", + "version": "3.3.0", "description": "Moodle Mobile 2: The official mobile app for Moodle.", "repository": { "type": "git", @@ -13,8 +13,7 @@ "url": "http://www.apache.org/licenses/LICENSE-2.0" } ], - "dependencies": { - }, + "dependencies": {}, "devDependencies": { "appium": "^1.6.0", "bower": "^1.3.3", @@ -122,5 +121,6 @@ "serve.e2e": "ionic serve -b -a", "serve.dev": "ionic serve", "e2e": "protractor e2e/build/protractor.conf.js" - } + }, + "main": "www/electron.js" } diff --git a/www/core/components/login/main.js b/www/core/components/login/main.js index d4cac17104b..d8c5f71e611 100644 --- a/www/core/components/login/main.js +++ b/www/core/components/login/main.js @@ -30,6 +30,12 @@ angular.module('mm.core.login', []) onEnter: function($ionicHistory) { // Ensure that there is no history stack when getting here. $ionicHistory.clearHistory(); + }, + controller: function($scope) { + // Required for Electron app so the title doesn't change. + $scope.$on('$ionicView.afterEnter', function(ev) { + ev.stopPropagation(); + }); } }) diff --git a/www/core/components/sidemenu/controllers/menu.js b/www/core/components/sidemenu/controllers/menu.js index 3edc382bd8c..c6cff4db0e0 100644 --- a/www/core/components/sidemenu/controllers/menu.js +++ b/www/core/components/sidemenu/controllers/menu.js @@ -67,6 +67,11 @@ angular.module('mm.core.sidemenu') } }); + // Required for Electron app so the title doesn't change. + $scope.$on('$ionicView.afterEnter', function(ev) { + ev.stopPropagation(); + }); + $scope.$on('$destroy', function() { if (langObserver && langObserver.off) { langObserver.off(); diff --git a/www/electron.js b/www/electron.js new file mode 100644 index 00000000000..aeaddc1b61d --- /dev/null +++ b/www/electron.js @@ -0,0 +1,63 @@ +const {app, BrowserWindow} = require('electron'); +const path = require('path'); +const url = require('url'); + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let win; + +function createWindow () { + // Create the browser window. + var width = 800, + height = 600; + + const screen = require('electron').screen; + if (screen) { + const display = screen.getPrimaryDisplay(); + if (display && display.workArea) { + width = display.workArea.width || width; + height = display.workArea.height || height; + } + } + + win = new BrowserWindow({ + width: width, + height: height, + minWidth: 400, + minHeight: 400, + textAreasAreResizable: false, + plugins: true + }); + + // And load the index.html of the app. + win.loadURL(url.format({ + pathname: path.join(__dirname, 'index.html'), + protocol: 'file:', + slashes: true + })); + + // Emitted when the window is closed. + win.on('closed', () => { + // Dereference the window object. + win = null + }); +} + +// This method will be called when Electron has finished initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + app.quit(); +}); + +app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the dock icon is clicked and there are no other windows open. + if (win === null) { + createWindow(); + } +}); + +// In this file you can include the rest of your app's specific main process code. +// You can also put them in separate files and require them here. diff --git a/www/index.html b/www/index.html index ffd50b38ce0..646aa4240a6 100644 --- a/www/index.html +++ b/www/index.html @@ -4,7 +4,7 @@ - + Moodle Mobile From 1fa2c0f6efb349ffdd2bd4411fcb47c28b5c184f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 31 May 2017 15:51:49 +0200 Subject: [PATCH 013/118] MOBILE-2147 electron: Emulate Cordova File API --- www/core/lib/app.js | 12 + www/core/lib/emulator.js | 482 ++++++++++++++++++++++++++++++++++++++- www/core/lib/fs.js | 9 +- 3 files changed, 490 insertions(+), 13 deletions(-) diff --git a/www/core/lib/app.js b/www/core/lib/app.js index 5a2884c2594..4b40c7d47f3 100644 --- a/www/core/lib/app.js +++ b/www/core/lib/app.js @@ -186,6 +186,18 @@ angular.module('mm.core') return $ionicPlatform.ready(); }; + /** + * Checks if the app is running in a desktop environment (not browser). + * + * @module mm.core + * @ngdoc method + * @name $mmApp#isDesktop + * @return {Bool} Whether the app is running in a desktop environment (not browser). + */ + self.isDesktop = function() { + return !!(window.process && window.process.versions && typeof window.process.versions.electron != 'undefined'); + }; + /** * Checks if the app is running in a real device with cordova-plugin-device installed. * diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 7e610270a04..773b3d4ea78 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -21,12 +21,441 @@ angular.module('mm.core') * @description * This service handles the emulation of Cordova plugins in other environments like browser. */ -.factory('$mmEmulatorManager', function($log, $q, $http, $mmFS, $window) { +.factory('$mmEmulatorManager', function($log, $q, $http, $mmFS, $window, $mmApp, mmCoreConfigConstants) { $log = $log.getInstance('$mmEmulatorManager'); var self = {}; + /** + * Emulate Cordova file plugin using NodeJS functions. + * + * @return {Void} + */ + function emulateCordovaFile() { + var fs = require('fs'); + + // Create the Entry object, parent of DirectoryEntry and FileEntry. + // It includes fileSystem and nativeURL as the Cordova object, but they aren't used. + $window.Entry = function(isFile, isDirectory, name, fullPath, fileSystem, nativeURL) { + this.isFile = !!isFile; + this.isDirectory = !!isDirectory; + this.name = name || ''; + this.fullPath = fullPath || ''; + this.filesystem = fileSystem || null; + this.nativeURL = nativeURL || null; + }; + + // Implement Entry functions. + $window.Entry.prototype.getMetadata = function(successCallback, errorCallback) { + fs.stat(this.fullPath, function(err, stats) { + if (err) { + errorCallback && errorCallback(err); + } else { + successCallback && successCallback({ + size: stats.size, + modificationTime: stats.mtime + }); + } + }); + }; + + $window.Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) { + // Not supported. + errorCallback('Not supported'); + }; + + $window.Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { + newName = newName || this.name; + + var srcPath = this.fullPath, + destPath = $mmFS.concatenatePaths(parent.fullPath, newName), + that = this; + + fs.rename(srcPath, destPath, function(err) { + if (err) { + errorCallback && errorCallback(err); + } else { + var constructorFn = that.isDirectory ? DirectoryEntry : FileEntry; + successCallback && successCallback(new constructorFn(newName, destPath)); + } + }); + }; + + $window.Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { + newName = newName || this.name; + + // There is no function to copy a file, read the source and write the dest. + var srcPath = this.fullPath, + destPath = $mmFS.concatenatePaths(parent.fullPath, newName), + reader = fs.createReadStream(srcPath), + writer = fs.createWriteStream(destPath), + deferred = $q.defer(), // Use a promise to make sure only one callback is called. + that = this; + + deferred.promise.then(function() { + var constructorFn = that.isDirectory ? DirectoryEntry : FileEntry; + successCallback && successCallback(new constructorFn(newName, destPath)); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + reader.on('error', deferred.reject); + + writer.on('error', deferred.reject); + + writer.on('close', deferred.resolve); + + reader.pipe(writer); + }; + + $window.Entry.prototype.toInternalURL = function() { + return 'file://' + this.fullPath; + }; + + $window.Entry.prototype.toURL = function() { + return this.fullPath; + }; + + $window.Entry.prototype.remove = function(successCallback, errorCallback) { + var removeFn = this.isDirectory ? fs.rmdir : fs.unlink; + removeFn(this.fullPath, function(err) { + if (err < 0) { + errorCallback(err); + } else { + successCallback(); + } + }); + }; + + $window.Entry.prototype.getParent = function(successCallback, errorCallback) { + // Remove last slash if present and get the path of the parent. + var fullPath = this.fullPath.slice(-1) == '/' ? this.fullPath.slice(0, -1) : this.fullPath, + parentPath = fullPath.substr(0, fullPath.lastIndexOf('/')); + + // Check that parent exists. + fs.stat(parentPath, function(err, stats) { + if (err || !stats.isDirectory()) { + errorCallback && errorCallback(err); + } else { + var fileAndDir = $mmFS.getFileAndDirectoryFromPath(parentPath); + successCallback && successCallback(new DirectoryEntry(fileAndDir.name, parentPath)); + } + }); + }; + + // FileWriter to write data in files. Don't support abort, seek and truncate. + $window.FileWriter = function(file) { + this.fileName = ''; + this.length = 0; + if (file) { + this.localURL = file.localURL || file; + this.length = file.size || 0; + } + + this.position = 0; // Default is to write at the beginning of the file. + this.readyState = 0; // EMPTY + this.result = null; + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). + }; + + $window.FileWriter.prototype.write = function(data) { + var that = this; + if (data && data.toString() == '[object Blob]') { + // Can't write Blobs, convert it to a Buffer. + var reader = new FileReader(); + reader.onload = function() { + if (reader.readyState == 2) { + write(new Buffer(reader.result)); + } + }; + reader.readAsArrayBuffer(data); + } else { + write(data); + } + + function write(data) { + fs.writeFile(that.localURL, data, function(err) { + if (err) { + that.onerror && that.onerror(err); + } else { + that.onwrite && that.onwrite(); + } + that.onwriteend && that.onwriteend(); + }); + + that.onwritestart && that.onwritestart(); + } + }; + + // DirectoryReader to read directory contents. + $window.DirectoryReader = function(localURL) { + this.localURL = localURL || null; + }; + + $window.DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + var that = this; + + fs.readdir(this.localURL, function(err, files) { + if (err) { + errorCallback && errorCallback(err); + } else { + // Use try/catch because it includes sync calls. + try { + var entries = []; + for (var i = 0; i < files.length; i++) { + var fileName = files[i], + filePath = $mmFS.concatenatePaths(that.localURL, fileName), + stats = fs.statSync(filePath); // Use sync function to make code simpler. + + if (stats.isDirectory()) { + entries.push(new DirectoryEntry(fileName, filePath)); + } else if (stats.isFile()) { + entries.push(new FileEntry(fileName, filePath)); + } + } + + successCallback(entries); + } catch(ex) { + errorCallback && errorCallback(ex); + } + } + }); + }; + + // Create FileEntry and its functions, inheriting from Entry. + $window.FileEntry = function(name, fullPath, fileSystem, nativeURL) { + // Remove trailing slash if it is present. + if (fullPath && /\/$/.test(fullPath)) { + fullPath = fullPath.substring(0, fullPath.length - 1); + } + if (nativeURL && /\/$/.test(nativeURL)) { + nativeURL = nativeURL.substring(0, nativeURL.length - 1); + } + + $window.Entry.call(this, true, false, name, fullPath, fileSystem, nativeURL); + }; + + $window.FileEntry.prototype = Object.create($window.Entry.prototype); // Inherit Entry prototype. + + $window.FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(file) { + successCallback && successCallback(new FileWriter(file)); + }, errorCallback); + }; + + $window.FileEntry.prototype.file = function(successCallback, errorCallback) { + var that = this; + + // Get the metadata to know the time modified. + this.getMetadata(function(metadata) { + // Read the file. + fs.readFile(that.fullPath, function(err, data) { + if (err) { + errorCallback && errorCallback(err); + } else { + // Create a File instance and return it. + data = Uint8Array.from(data).buffer; // Convert the NodeJS Buffer to ArrayBuffer. + var file = new File([data], that.name || '', { + lastModified: metadata.modificationTime || null, + type: $mmFS.getMimeType($mmFS.getFileExtension(that.name)) || null + }); + file.localURL = that.fullPath; + file.start = 0; + file.end = file.size; + + successCallback && successCallback(file); + } + }); + }, errorCallback); + }; + + // Create DirectoryEntry and its functions, inheriting from Entry. + $window.DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + // Add trailing slash if it is missing. + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += '/'; + } + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += '/'; + } + + $window.Entry.call(this, false, true, name, fullPath, fileSystem, nativeURL); + }; + + $window.DirectoryEntry.prototype = Object.create($window.Entry.prototype); // Inherit Entry prototype. + + $window.DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.fullPath); + }; + + $window.DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + getDirOrFile(this, true, path, options, successCallback, errorCallback); + }; + + $window.DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + // Use a promise to make sure only one callback is called. + var deferred = $q.defer(); + + deferred.promise.then(function() { + successCallback && successCallback(); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + deleteRecursive(this.fullPath, function() { + deferred.resolve(); + }); + + // Delete a file or folder recursively. + function deleteRecursive(path, success) { + // Check if it exists. + fs.stat(path, function(err, stats) { + if (err) { + // File not found, reject. + deferred.reject(err); + } else if (stats.isFile()) { + // It's a file, remove it. + fs.unlink(path, function(err) { + if (err) { + // Error removing file, reject. + deferred.reject(err); + } else { + success && success(); + } + }); + } else { + // It's a directory, read the contents. + fs.readdir(path, function(err, files) { + if (err) { + // Error reading directory contents, reject. + deferred.reject(err); + } else if (!files.length) { + // No files to delete, delete the folder. + deleteEmptyFolder(path, success); + } else { + // Remove all the files and directories. + var removed = 0; + files.forEach(function(filename) { + deleteRecursive($mmFS.concatenatePaths(path, filename), function() { + // Success deleting the file/dir. + removed++; + if (removed == files.length) { + // All files deleted, delete the folder. + deleteEmptyFolder(path, success); + } + }); + }); + } + }); + } + }); + } + + // Delete an empty folder. + function deleteEmptyFolder(path, success) { + fs.rmdir(path, function(err) { + if (err) { + // Error removing directory, reject. + deferred.reject(err); + } else { + success && success(); + } + }); + } + }; + + $window.DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + getDirOrFile(this, false, path, options, successCallback, errorCallback); + }; + + // Helper function for getDirectory and getFile. + function getDirOrFile(file, isDir, path, options, successCallback, errorCallback) { + var filename = $mmFS.getFileAndDirectoryFromPath(path).name, + fileDirPath = $mmFS.concatenatePaths(file.fullPath, path); + + // Check if file/dir exists. + fs.stat(fileDirPath, function(err) { + if (err) { + if (options.create) { + // File/Dir probably doesn't exist, create it. + create(function(error2) { + if (!error2) { + // File created successfully, return it. + success(); + } else if (error2.code === 'EEXIST') { + // File exists, success. + success(); + } else if (error2.code === 'ENOENT') { + // Seems like the parent doesn't exist, create it too. + var parent = fileDirPath.substring(0, fileDirPath.lastIndexOf('/')); + + if (parent) { + file.getDirectory(parent, options, function() { + // Parent created, try to create the child again. + create(function(error3) { + if (!error3) { + success(); + } else { + errorCallback && errorCallback(error3); + } + }); + }, errorCallback); + } else { + errorCallback && errorCallback(error2); + } + } else { + errorCallback && errorCallback(error2); + } + }); + } else { + errorCallback && errorCallback(err); + } + } else { + success(); + } + }); + + // Success, return the DirectoryEntry or FileEntry. + function success() { + var constructorFn = isDir ? DirectoryEntry : FileEntry; + successCallback(new constructorFn(filename, fileDirPath)); + } + + // Create the file/dir. + function create(done) { + if (isDir) { + fs.mkdir(fileDirPath, done); + } else { + fs.writeFile(fileDirPath, "", done); + } + } + } + + // Implement resolveLocalFileSystemURL. + $window.resolveLocalFileSystemURL = function(path, successCallback, errorCallback) { + // Check that the file/dir exists. + fs.stat(path, function(err, stats) { + if (err) { + errorCallback && errorCallback(err); + } else { + // The file/dir exists, return an instance. + var constructorFn = stats.isDirectory() ? DirectoryEntry : FileEntry, + fileAndDir = $mmFS.getFileAndDirectoryFromPath(path); + successCallback && successCallback(new constructorFn(fileAndDir.name, path)); + } + }); + }; + } + /** * Loads HTML API to simulate Cordova APIs. Reserved for core use. * @@ -60,12 +489,20 @@ angular.module('mm.core') $window.FileTransfer = function() {}; $window.FileTransfer.prototype.download = function(url, filePath, successCallback, errorCallback) { - $http.get(url, {responseType: 'blob'}).then(function(data) { + var isDesktop = $mmApp.isDesktop(), + responseType = isDesktop ? 'arraybuffer' : 'blob'; + + $http.get(url, {responseType: responseType}).then(function(data) { if (!data || !data.data) { errorCallback(); } else { filePath = filePath.replace(basePath, ''); // Remove basePath from the filePath. filePath = filePath.replace(/%20/g, ' '); // Replace all %20 with spaces. + if (isDesktop) { + // In desktop we need to convert the arraybuffer into a Buffer. + data.data = Buffer.from(new Uint8Array(data.data)); + } + $mmFS.writeFile(filePath, data.data).then(function(e) { successCallback(e); }).catch(function(error) { @@ -117,14 +554,41 @@ angular.module('mm.core') // @todo: Implement FileTransfer.upload. - // Request 500MB. - $window.webkitStorageInfo.requestQuota(PERSISTENT, 500 * 1024 * 1024, function(granted) { - $window.requestFileSystem(PERSISTENT, granted, function(entry) { - basePath = entry.root.toURL(); - $mmFS.setHTMLBasePath(basePath); - deferred.resolve(); + if ($mmApp.isDesktop()) { + var fs = require('fs'), + app = require('electron').remote.app; + + emulateCordovaFile(); + + // Initialize File System. Get the path to use. + basePath = app.getPath('documents') || app.getPath('home'); + if (!basePath) { + deferred.reject('Cannot calculate base path for file system.'); + return; + } + + basePath = $mmFS.concatenatePaths(basePath.replace(/\\/g, '/'), mmCoreConfigConstants.app_id) + '/'; + + // Create the folder if needed. + fs.mkdir(basePath, function(e) { + if (!e || (e && e.code === 'EEXIST')) { + // Create successful or it already exists. Resolve. + $mmFS.setHTMLBasePath(basePath); + deferred.resolve(); + } else { + deferred.reject('Error creating base path.'); + } + }); + } else { + // It's browser, request a quota to use. Request 500MB. + $window.webkitStorageInfo.requestQuota(PERSISTENT, 500 * 1024 * 1024, function(granted) { + $window.requestFileSystem(PERSISTENT, granted, function(entry) { + basePath = entry.root.toURL(); + $mmFS.setHTMLBasePath(basePath); + deferred.resolve(); + }, deferred.reject); }, deferred.reject); - }, deferred.reject); + } return deferred.promise; }; diff --git a/www/core/lib/fs.js b/www/core/lib/fs.js index 63de16de91c..bc9d61f11b7 100644 --- a/www/core/lib/fs.js +++ b/www/core/lib/fs.js @@ -24,7 +24,8 @@ angular.module('mm.core') * @description * This service handles the interaction with the FileSystem. */ -.factory('$mmFS', function($ionicPlatform, $cordovaFile, $log, $q, $http, $cordovaZip, $mmText, mmFsSitesFolder, mmFsTmpFolder) { +.factory('$mmFS', function($ionicPlatform, $cordovaFile, $log, $q, $http, $cordovaZip, $mmText, mmFsSitesFolder, mmFsTmpFolder, + $mmApp) { $log = $log.getInstance('$mmFS'); @@ -591,7 +592,7 @@ angular.module('mm.core') return self.init().then(function() { // Create file (and parent folders) to prevent errors. return self.createFile(path).then(function(fileEntry) { - if (isHTMLAPI && typeof data == 'string') { + if (isHTMLAPI && !$mmApp.isDesktop() && typeof data == 'string') { // We need to write Blobs. var type = self.getMimeType(self.getFileExtension(path)); data = new Blob([data], {type: type || 'text/plain'}); @@ -851,8 +852,8 @@ angular.module('mm.core') * @return {String} Internal URL. */ self.getInternalURL = function(fileEntry) { - if (isHTMLAPI) { - // HTML API doesn't implement toInternalURL. + if (!fileEntry.toInternalURL) { + // File doesn't implement toInternalURL, use toURL. return fileEntry.toURL(); } return fileEntry.toInternalURL(); From 92ab2568472785a41dd616d176c599932986735e Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 31 May 2017 16:19:48 +0200 Subject: [PATCH 014/118] MOBILE-2147 electron: Open files and URLs with the right external app --- www/core/lib/util.js | 17 +++++++++++++++-- www/electron.js | 8 +++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/www/core/lib/util.js b/www/core/lib/util.js index 0edb004b4b3..5a21b276da5 100644 --- a/www/core/lib/util.js +++ b/www/core/lib/util.js @@ -292,7 +292,11 @@ angular.module('mm.core') self.openFile = function(path) { var deferred = $q.defer(); - if (window.plugins) { + if ($mmApp.isDesktop()) { + // It's a desktop app, send an event so the file is opened. It has to be done with an event + // because opening the file from here (renderer process) doesn't focus the opened app. + require('electron').ipcRenderer.send('openItem', path); + } else if (window.plugins) { var extension = $mmFS.getFileExtension(path), mimetype = $mmFS.getMimeType(extension); @@ -378,7 +382,16 @@ angular.module('mm.core') * @return {Void} */ self.openInBrowser = function(url) { - window.open(url, '_system'); + if ($mmApp.isDesktop()) { + // It's a desktop app, use Electron shell library to open the browser. + var shell = require('electron').shell; + if (!shell.openExternal(url)) { + // Open browser failed, open a new window in the app. + window.open(url, '_system'); + } + } else { + window.open(url, '_system'); + } }; /** diff --git a/www/electron.js b/www/electron.js index aeaddc1b61d..f9343476c5e 100644 --- a/www/electron.js +++ b/www/electron.js @@ -1,4 +1,5 @@ -const {app, BrowserWindow} = require('electron'); + +const {app, BrowserWindow, ipcMain, shell} = require('electron'); const path = require('path'); const url = require('url'); @@ -59,5 +60,6 @@ app.on('activate', () => { } }); -// In this file you can include the rest of your app's specific main process code. -// You can also put them in separate files and require them here. +ipcMain.on('openItem', (event, path) => { + shell.openItem(path); +}); From 8a894c03a9661b24d9d2d6e84f18232f2b194943 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 2 Jun 2017 12:24:13 +0200 Subject: [PATCH 015/118] MOBILE-2147 electron: Allow uploading files with file picker --- .../components/fileuploader/scss/styles.scss | 1 + .../fileuploader/services/handlers.js | 10 +- .../fileuploader/services/helper.js | 4 +- www/core/lib/emulator.js | 294 +++++++++++++++--- www/core/lib/fs.js | 2 +- 5 files changed, 267 insertions(+), 44 deletions(-) diff --git a/www/core/components/fileuploader/scss/styles.scss b/www/core/components/fileuploader/scss/styles.scss index d35c7e95330..f8da47e3e68 100644 --- a/www/core/components/fileuploader/scss/styles.scss +++ b/www/core/components/fileuploader/scss/styles.scss @@ -8,5 +8,6 @@ opacity: 0; outline: none; z-index: 100; + cursor: pointer; } } diff --git a/www/core/components/fileuploader/services/handlers.js b/www/core/components/fileuploader/services/handlers.js index 62226e64440..13106a7b9df 100644 --- a/www/core/components/fileuploader/services/handlers.js +++ b/www/core/components/fileuploader/services/handlers.js @@ -42,7 +42,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return true; + return $mmApp.isDevice(); }; /** @@ -87,7 +87,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return true; + return $mmApp.isDevice(); }; /** @@ -132,7 +132,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return true; + return $mmApp.isDevice(); }; /** @@ -177,7 +177,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return true; + return $mmApp.isDevice(); }; /** @@ -223,7 +223,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return ionic.Platform.isAndroid(); + return ionic.Platform.isAndroid() || !$mmApp.isDevice(); }; /** diff --git a/www/core/components/fileuploader/services/helper.js b/www/core/components/fileuploader/services/helper.js index aea9ef476d5..f0f0cd9f9f3 100644 --- a/www/core/components/fileuploader/services/helper.js +++ b/www/core/components/fileuploader/services/helper.js @@ -756,9 +756,7 @@ angular.module('mm.core.fileuploader') }, function() { // User cancelled. Delete the file if needed. if (deleteAfterUpload) { - angular.forEach(paths, function(path) { - $mmFS.removeExternalFile(path); - }); + $mmFS.removeExternalFile(path); } return $q.reject(); }); diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 773b3d4ea78..1e88379a71d 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -21,14 +21,45 @@ angular.module('mm.core') * @description * This service handles the emulation of Cordova plugins in other environments like browser. */ -.factory('$mmEmulatorManager', function($log, $q, $http, $mmFS, $window, $mmApp, mmCoreConfigConstants) { +.factory('$mmEmulatorManager', function($log, $q, $mmFS, $window, $mmApp, mmCoreConfigConstants) { $log = $log.getInstance('$mmEmulatorManager'); - var self = {}; + var self = {}, + fileTransferIdCounter = 0, + basePath; /** - * Emulate Cordova file plugin using NodeJS functions. + * Given a URL, check if it has a credentials in it and, if so, return them in a header object. + * This code is extracted from Cordova FileTransfer plugin. + * + * @param {String} urlString The URL to get the credentials from. + * @return {Object} The header with the credentials, null if no credentials. + */ + function getBasicAuthHeader(urlString) { + var header = null; + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url. + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = "Authorization"; + var authHeaderValue = "Basic " + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; + } + + /** + * Emulate Cordova file plugin using NodeJS functions. This should only be used in NodeJS environments, + * browser works with the default resolveLocalFileSystemURL. * * @return {Void} */ @@ -178,6 +209,9 @@ angular.module('mm.core') } }; reader.readAsArrayBuffer(data); + } else if (data && data.toString() == '[object ArrayBuffer]') { + // Convert it to a Buffer. + write(Buffer.from(new Uint8Array(data))); } else { write(data); } @@ -456,6 +490,226 @@ angular.module('mm.core') }; } + /** + * Emulate Cordova FileTransfer plugin for browser or NodeJS. + * + * @return {Void} + */ + function emulateCordovaFileTransfer() { + // Create the FileTransferError object. + $window.FileTransferError = function(code, source, target, status, body, exception) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; + this.exception = exception || null; + }; + + $window.FileTransferError.FILE_NOT_FOUND_ERR = 1; + $window.FileTransferError.INVALID_URL_ERR = 2; + $window.FileTransferError.CONNECTION_ERR = 3; + $window.FileTransferError.ABORT_ERR = 4; + $window.FileTransferError.NOT_MODIFIED_ERR = 5; + + // Create the FileTransfer object and its functions. + $window.FileTransfer = function() { + this._id = ++fileTransferIdCounter; + this.onprogress = null; // Optional callback. + }; + + $window.FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + // Use XMLHttpRequest instead of $http to support onprogress and abort. + var basicAuthHeader = getBasicAuthHeader(source), + xhr = new XMLHttpRequest(), + isDesktop = $mmApp.isDesktop(), + deferred = $q.defer(), // Use a promise to make sure only one callback is called. + headers = null; + + deferred.promise.then(function(entry) { + successCallback && successCallback(entry); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + this.xhr = xhr; + this.deferred = deferred; + this.source = source; + this.target = target; + + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + headers = options.headers || null; + } + + // Prepare the request. + xhr.open('GET', source, true); + xhr.responseType = isDesktop ? 'arraybuffer' : 'blob'; + angular.forEach(headers, function(value, name) { + xhr.setRequestHeader(name, value); + }); + + if (this.onprogress) { + xhr.onprogress = this.onprogress; + } + + xhr.onerror = function() { + deferred.reject(new FileTransferError(-1, source, target, xhr.status, xhr.statusText)); + }; + + xhr.onload = function() { + // Finished dowloading the file. + var response = xhr.response; + if (!response) { + deferred.reject(); + } else { + target = target.replace(basePath, ''); // Remove basePath from the target. + target = target.replace(/%20/g, ' '); // Replace all %20 with spaces. + if (isDesktop) { + // In desktop we need to convert the arraybuffer into a Buffer. + response = Buffer.from(new Uint8Array(response)); + } + + $mmFS.writeFile(target, response).then(deferred.resolve, deferred.reject); + } + }; + + xhr.send(); + }; + + $window.FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + var fileKey = null, + fileName = null, + mimeType = null, + params = null, + headers = null, + httpMethod = null, + deferred = $q.defer(), // Use a promise to make sure only one callback is called. + basicAuthHeader = getBasicAuthHeader(server), + that = this; + + deferred.promise.then(function(result) { + successCallback && successCallback(result); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || 'POST'; + + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = 'PUT'; + } else { + httpMethod = 'POST'; + } + + if (options.params) { + params = options.params; + } else { + params = {}; + } + } + + // Add fileKey and fileName to the headers. + headers = headers || {}; + if (!headers['Content-Disposition']) { + headers['Content-Disposition'] = 'form-data;' + (fileKey ? ' name="' + fileKey + '";' : '') + + (fileName ? ' filename="' + fileName + '"' : '') + } + + // For some reason, adding a Content-Type header with the mimeType makes the request fail (it doesn't detect + // the token in the params). Don't include this header, and delete it if it's supplied. + delete headers['Content-Type']; + + // Get the file to upload. + $mmFS.getFile(filePath).then(function(fileEntry) { + return $mmFS.getFileObjectFromFileEntry(fileEntry); + }).then(function(file) { + // Use XMLHttpRequest instead of $http to support onprogress and abort. + var xhr = new XMLHttpRequest(); + xhr.open(httpMethod || 'POST', server); + angular.forEach(headers, function(value, name) { + // Filter "unsafe" headers. + if (name != 'Connection') { + xhr.setRequestHeader(name, value); + } + }); + + if (that.onprogress) { + xhr.onprogress = that.onprogress; + } + + that.xhr = xhr; + that.deferred = deferred; + this.source = filePath; + this.target = server; + + xhr.onerror = function() { + deferred.reject(new FileTransferError(-1, filePath, server, xhr.status, xhr.statusText)); + }; + + xhr.onload = function() { + // Finished uploading the file. + deferred.resolve({ + bytesSent: file.size, + responseCode: xhr.status, + response: xhr.response, + objectId: '' + }); + }; + + // Create a form data to send params and the file. + var fd = new FormData(); + angular.forEach(params, function(value, name) { + fd.append(name, value); + }); + fd.append('file', file); + + xhr.send(fd); + }).catch(deferred.reject); + }; + + $window.FileTransfer.prototype.abort = function() { + if (this.xhr) { + this.xhr.abort(); + this.deferred.reject(new FileTransferError(FileTransferError.ABORT_ERR, this.source, this.target)); + } + }; + } + + /** + * Get the credentials from a URL. + * This code is extracted from Cordova FileTransfer plugin. + * + * @param {String} urlString The URL to get the credentials from. + * @return {String} Retrieved credentials. + */ + function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; + } + /** * Loads HTML API to simulate Cordova APIs. Reserved for core use. * @@ -472,8 +726,7 @@ angular.module('mm.core') return $q.when(); } - var deferred = $q.defer(), - basePath; + var deferred = $q.defer(); $log.debug('Loading HTML API.'); @@ -485,34 +738,7 @@ angular.module('mm.core') PERSISTENT: 1 }; - // FileTransfer API. - $window.FileTransfer = function() {}; - - $window.FileTransfer.prototype.download = function(url, filePath, successCallback, errorCallback) { - var isDesktop = $mmApp.isDesktop(), - responseType = isDesktop ? 'arraybuffer' : 'blob'; - - $http.get(url, {responseType: responseType}).then(function(data) { - if (!data || !data.data) { - errorCallback(); - } else { - filePath = filePath.replace(basePath, ''); // Remove basePath from the filePath. - filePath = filePath.replace(/%20/g, ' '); // Replace all %20 with spaces. - if (isDesktop) { - // In desktop we need to convert the arraybuffer into a Buffer. - data.data = Buffer.from(new Uint8Array(data.data)); - } - - $mmFS.writeFile(filePath, data.data).then(function(e) { - successCallback(e); - }).catch(function(error) { - errorCallback(error); - }); - } - }).catch(function(error) { - errorCallback(error); - }); - }; + emulateCordovaFileTransfer(); // Cordova ZIP plugin. $window.zip = { @@ -552,8 +778,6 @@ angular.module('mm.core') } }; - // @todo: Implement FileTransfer.upload. - if ($mmApp.isDesktop()) { var fs = require('fs'), app = require('electron').remote.app; diff --git a/www/core/lib/fs.js b/www/core/lib/fs.js index bc9d61f11b7..f6a2a084ce7 100644 --- a/www/core/lib/fs.js +++ b/www/core/lib/fs.js @@ -592,7 +592,7 @@ angular.module('mm.core') return self.init().then(function() { // Create file (and parent folders) to prevent errors. return self.createFile(path).then(function(fileEntry) { - if (isHTMLAPI && !$mmApp.isDesktop() && typeof data == 'string') { + if (isHTMLAPI && !$mmApp.isDesktop() && (typeof data == 'string' || data.toString() == '[object ArrayBuffer]')) { // We need to write Blobs. var type = self.getMimeType(self.getFileExtension(path)); data = new Blob([data], {type: type || 'text/plain'}); From 8e393912648b8621876fe6eba7c9426e79e7ef64 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 2 Jun 2017 13:58:36 +0200 Subject: [PATCH 016/118] MOBILE-2147 electron: Basic Globalization support --- www/core/lib/emulator.js | 90 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 1e88379a71d..5582ff786a6 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -696,6 +696,95 @@ angular.module('mm.core') }; } + /** + * Emulate Cordova Globalization plugin for browser or NodeJS. + * Only support the functions to get locale, the rest of functions won't be supported for now. + * + * @return {Void} + */ + function emulateCordovaGlobalization() { + // Create the GlobalizationError object. + $window.GlobalizationError = function(code, message) { + this.code = code || null; + this.message = message || ''; + }; + + $window.GlobalizationError.UNKNOWN_ERROR = 0; + $window.GlobalizationError.FORMATTING_ERROR = 1; + $window.GlobalizationError.PARSING_ERROR = 2; + $window.GlobalizationError.PATTERN_ERROR = 3; + + // Create the globalization object and its functions. + function getLocale() { + var navLang = navigator.userLanguage || navigator.language; + try { + if ($mmApp.isDesktop()) { + var locale = require('electron').remote.app.getLocale(); + return locale || navLang; + } else { + return navLang; + } + } catch(ex) { + // Something went wrong, return browser language. + return navLang; + } + } + + navigator.globalization = { + getLocaleName: function(successCallback, errorCallback) { + var locale = getLocale(); + if (locale) { + successCallback && successCallback({value: locale}); + } else { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Cannot get language'); + errorCallback && errorCallback(error); + } + }, + numberToString: function(number, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + isDayLightSavingsTime: function(date, successCallback, errorCallback) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getFirstDayOfWeek: function(successCallback, errorCallback) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getDateNames: function (successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getDatePattern: function(successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getNumberPattern: function(successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getCurrencyPattern: function(currencyCode, successCallback, errorCallback) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + stringToDate: function(dateString, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + stringToNumber: function(numberString, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + dateToString: function(date, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + }; + + navigator.globalization.getPreferredLanguage = navigator.globalization.getLocaleName; + } + /** * Get the credentials from a URL. * This code is extracted from Cordova FileTransfer plugin. @@ -739,6 +828,7 @@ angular.module('mm.core') }; emulateCordovaFileTransfer(); + emulateCordovaGlobalization(); // Cordova ZIP plugin. $window.zip = { From e5eff55e943ecd3fa9a59793a134c1276d343a72 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 5 Jun 2017 09:58:10 +0200 Subject: [PATCH 017/118] MOBILE-2147 electron: Support unzip, including progress --- www/addons/mod/scorm/controllers/index.js | 1 + www/core/lib/emulator.js | 94 ++++++++++++++--------- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/www/addons/mod/scorm/controllers/index.js b/www/addons/mod/scorm/controllers/index.js index f73a74bf913..7be5e3f2ce2 100644 --- a/www/addons/mod/scorm/controllers/index.js +++ b/www/addons/mod/scorm/controllers/index.js @@ -323,6 +323,7 @@ angular.module('mm.addons.mod_scorm') } } else if (progress.message) { // Show a message. $scope.progressMessage = progress.message; + $scope.percentage = undefined; } else if (progress.loaded && progress.total) { // Unzipping package. $scope.percentage = (parseFloat(progress.loaded / progress.total) * 100).toFixed(1); } else { diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 5582ff786a6..83e4c7564f6 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -785,6 +785,61 @@ angular.module('mm.core') navigator.globalization.getPreferredLanguage = navigator.globalization.getLocaleName; } + /** + * Emulate Cordova ZIP plugin for browser or NodeJS. + * Only support the unzip function, the rest of functions won't be supported for now. + * + * @return {Void} + */ + function emulateCordovaZip() { + // Cordova ZIP plugin. + $window.zip = { + unzip: function(source, destination, callback, progressCallback) { + // Remove basePath from the source and destination. + source = source.replace(basePath, ''); + source = source.replace(/%20/g, ' '); // Replace all %20 with spaces. + destination = destination.replace(basePath, ''); + destination = destination.replace(/%20/g, ' '); // Replace all %20 with spaces. + + $mmFS.readFile(source, $mmFS.FORMATARRAYBUFFER).then(function(data) { + var zip = new JSZip(data), + promises = [], + loaded = 0, + total = Object.keys(zip.files).length; + + angular.forEach(zip.files, function(file, name) { + var filePath = $mmFS.concatenatePaths(destination, name), + type, + promise; + + if (!file.dir) { + // It's a file. Get the mimetype and write the file. + type = $mmFS.getMimeType($mmFS.getFileExtension(name)); + promise = $mmFS.writeFile(filePath, new Blob([file.asArrayBuffer()], {type: type})); + } else { + // It's a folder, create it if it doesn't exist. + promise = $mmFS.createDir(filePath); + } + + promises.push(promise.then(function() { + // File unzipped, call the progress. + loaded++; + progressCallback && progressCallback({loaded: loaded, total: total}); + })); + }); + + return $q.all(promises).then(function() { + // Success. + callback(0); + }); + }).catch(function() { + // Error. + callback(-1); + }); + } + }; + } + /** * Get the credentials from a URL. * This code is extracted from Cordova FileTransfer plugin. @@ -829,44 +884,7 @@ angular.module('mm.core') emulateCordovaFileTransfer(); emulateCordovaGlobalization(); - - // Cordova ZIP plugin. - $window.zip = { - unzip: function(source, destination, callback, progressCallback) { - // Remove basePath from the source and destination. - source = source.replace(basePath, ''); - source = source.replace(/%20/g, ' '); // Replace all %20 with spaces. - destination = destination.replace(basePath, ''); - destination = destination.replace(/%20/g, ' '); // Replace all %20 with spaces. - - $mmFS.readFile(source, $mmFS.FORMATARRAYBUFFER).then(function(data) { - var zip = new JSZip(data), - promises = []; - - angular.forEach(zip.files, function(file, name) { - var filepath = $mmFS.concatenatePaths(destination, name), - type; - - if (!file.dir) { - // It's a file. Get the mimetype and write the file. - type = $mmFS.getMimeType($mmFS.getFileExtension(name)); - promises.push($mmFS.writeFile(filepath, new Blob([file.asArrayBuffer()], {type: type}))); - } else { - // It's a folder, create it if it doesn't exist. - promises.push($mmFS.createDir(filepath)); - } - }); - - return $q.all(promises).then(function() { - // Success. - callback(0); - }); - }).catch(function() { - // Error. - callback(-1); - }); - } - }; + emulateCordovaZip(); if ($mmApp.isDesktop()) { var fs = require('fs'), From c9e23b29cff7a6da417daf88e284330bb581553b Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 5 Jun 2017 10:16:35 +0200 Subject: [PATCH 018/118] MOBILE-2147 electron: Wait for window to be ready before show --- www/electron.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/www/electron.js b/www/electron.js index f9343476c5e..26bc7a31a56 100644 --- a/www/electron.js +++ b/www/electron.js @@ -27,7 +27,8 @@ function createWindow () { minWidth: 400, minHeight: 400, textAreasAreResizable: false, - plugins: true + plugins: true, + show: false // Don't show it until it's ready to prevent showing a blank screen. }); // And load the index.html of the app. @@ -37,6 +38,10 @@ function createWindow () { slashes: true })); + win.once('ready-to-show', () => { + win.show(); + }); + // Emitted when the window is closed. win.on('closed', () => { // Dereference the window object. From eb008b16c97ef077c15c273a45e83ab3c0d046e0 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 5 Jun 2017 12:14:02 +0200 Subject: [PATCH 019/118] MOBILE-2147 electron: Support copy and paste from clipboard --- www/core/lib/emulator.js | 79 ++++++++++++++++++++++++++++++++++++++- www/core/scss/styles.scss | 8 +++- 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 83e4c7564f6..9baf427a528 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -21,7 +21,7 @@ angular.module('mm.core') * @description * This service handles the emulation of Cordova plugins in other environments like browser. */ -.factory('$mmEmulatorManager', function($log, $q, $mmFS, $window, $mmApp, mmCoreConfigConstants) { +.factory('$mmEmulatorManager', function($log, $q, $mmFS, $window, $mmApp, mmCoreConfigConstants, $cordovaClipboard) { $log = $log.getInstance('$mmEmulatorManager'); @@ -57,6 +57,82 @@ angular.module('mm.core') return header; } + /** + * Emulate Cordova clipboard plugin for browser and NodeJS. + * + * @return {Void} + */ + function emulateCordovaClipboard() { + var isDesktop = $mmApp.isDesktop(), + clipboard, + copyTextarea; + + if (isDesktop) { + clipboard = require('electron').clipboard; + } else { + // In browser the text must be selected in order to copy it. Create a hidden textarea to put the text in it. + copyTextarea = document.createElement('textarea'); + angular.element(copyTextarea).addClass('mm-browser-copy-area'); + copyTextarea.setAttribute('aria-hidden', 'true'); + document.body.append(copyTextarea); + } + + // We need to redefine $cordovaClipboard methods instead of the core plugin (window.cordova.plugins.clipboard) + // because creating window.cordova breaks the app (it thinks it's a real device). + $cordovaClipboard.copy = function(text) { + var deferred = $q.defer(); + + if (isDesktop) { + clipboard.writeText(text); + deferred.resolve(); + } else { + // Put the text in the hidden textarea and select it. + copyTextarea.innerHTML = text; + copyTextarea.select(); + + try { + if (document.execCommand('copy')) { + deferred.resolve(); + } else { + deferred.reject(); + } + } catch (err) { + deferred.reject(); + } + + copyTextarea.innerHTML = ''; + } + + return deferred.promise; + }; + + $cordovaClipboard.paste = function() { + var deferred = $q.defer(); + + if (isDesktop) { + deferred.resolve(clipboard.readText()); + } else { + // Paste the text in the hidden textarea and get it. + copyTextarea.innerHTML = ''; + copyTextarea.select(); + + try { + if (document.execCommand('paste')) { + deferred.resolve(copyTextarea.innerHTML); + } else { + deferred.reject(); + } + } catch (err) { + deferred.reject(); + } + + copyTextarea.innerHTML = ''; + } + + return deferred.promise; + }; + } + /** * Emulate Cordova file plugin using NodeJS functions. This should only be used in NodeJS environments, * browser works with the default resolveLocalFileSystemURL. @@ -885,6 +961,7 @@ angular.module('mm.core') emulateCordovaFileTransfer(); emulateCordovaGlobalization(); emulateCordovaZip(); + emulateCordovaClipboard(); if ($mmApp.isDesktop()) { var fs = require('fs'), diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index ac1142effc1..125685f726f 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -1632,4 +1632,10 @@ h2.invert { &.ng-leave.ng-leave-active { opacity: 0; } -} \ No newline at end of file +} + +// Textarea to copy text in browser or desktop. Don't use display none because otherwise it can't be selected. +.mm-browser-copy-area { + position: absolute; + left: -10000px; +} From 16af71669c60f72bdc8a98ba578b1abd7629b110 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 6 Jun 2017 15:17:37 +0200 Subject: [PATCH 020/118] MOBILE-2147 electron: Support Custom URL scheme --- www/core/components/login/main.js | 5 +++ www/core/lib/emulator.js | 23 ++++++++++++- www/electron.js | 55 +++++++++++++++++++++++++------ 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/www/core/components/login/main.js b/www/core/components/login/main.js index d8c5f71e611..2080760da08 100644 --- a/www/core/components/login/main.js +++ b/www/core/components/login/main.js @@ -371,6 +371,11 @@ angular.module('mm.core.login', []) // Delete the sso scheme from the URL. url = url.replace(ssoScheme, ''); + // Some platforms like Windows add a slash at the end. Remove it. + if (url.slice(-1) == '/') { + url = url.substring(0, url.length - 1); + } + // Some sites add a # at the end of the URL. If it's there, remove it. if (url.slice(-1) == '#') { url = url.substring(0, url.length - 1); diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 9baf427a528..a37cb536f34 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -134,12 +134,16 @@ angular.module('mm.core') } /** - * Emulate Cordova file plugin using NodeJS functions. This should only be used in NodeJS environments, + * Emulate Cordova file plugin using NodeJS functions. This is only for NodeJS environments, * browser works with the default resolveLocalFileSystemURL. * * @return {Void} */ function emulateCordovaFile() { + if (!$mmApp.isDesktop()) { + return; + } + var fs = require('fs'); // Create the Entry object, parent of DirectoryEntry and FileEntry. @@ -916,6 +920,22 @@ angular.module('mm.core') }; } + /** + * Emulate Custom URL Schemes for NodeJS. + * + * @return {Void} + */ + function emulateCustomURLScheme() { + if (!$mmApp.isDesktop()) { + return; + } + + // Listen for app launched events. + require('electron').ipcRenderer.on('mmAppLaunched', (event, url) => { + window.handleOpenURL && window.handleOpenURL(url); + }); + } + /** * Get the credentials from a URL. * This code is extracted from Cordova FileTransfer plugin. @@ -968,6 +988,7 @@ angular.module('mm.core') app = require('electron').remote.app; emulateCordovaFile(); + emulateCustomURLScheme(); // Initialize File System. Get the path to use. basePath = app.getPath('documents') || app.getPath('home'); diff --git a/www/electron.js b/www/electron.js index 26bc7a31a56..ff47101b150 100644 --- a/www/electron.js +++ b/www/electron.js @@ -5,9 +5,9 @@ const url = require('url'); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. -let win; +let mainWindow; -function createWindow () { +function createWindow() { // Create the browser window. var width = 800, height = 600; @@ -21,7 +21,7 @@ function createWindow () { } } - win = new BrowserWindow({ + mainWindow = new BrowserWindow({ width: width, height: height, minWidth: 400, @@ -32,26 +32,31 @@ function createWindow () { }); // And load the index.html of the app. - win.loadURL(url.format({ + mainWindow.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true })); - win.once('ready-to-show', () => { - win.show(); + mainWindow.once('ready-to-show', () => { + mainWindow.show(); }); // Emitted when the window is closed. - win.on('closed', () => { + mainWindow.on('closed', () => { // Dereference the window object. - win = null + mainWindow = null }); } // This method will be called when Electron has finished initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. -app.on('ready', createWindow); +app.on('ready', function() { + createWindow(); + + // Open the app when a link with "moodlemobile://" is clicked. + app.setAsDefaultProtocolClient('moodlemobile'); +}); // Quit when all windows are closed. app.on('window-all-closed', () => { @@ -60,11 +65,41 @@ app.on('window-all-closed', () => { app.on('activate', () => { // On macOS it's common to re-create a window in the app when the dock icon is clicked and there are no other windows open. - if (win === null) { + if (mainWindow === null) { createWindow(); } }); +// Make sure that only a single instance of the app is running. +var shouldQuit = app.makeSingleInstance((argv, workingDirectory) => { + // Another instance was launched. If it was launched with a URL, it should be in the second param. + if (argv && argv[1]) { + appLaunched(argv[1]); + } +}); + +if (shouldQuit) { + // It's not the main instance of the app, kill it. + app.quit(); +} else { + // Listen for open-url events (Mac OS only). + app.on('open-url', (event, url) => { + event.preventDefault(); + appLaunched(url); + }); +} + +function appLaunched(url) { + // App was launched again with a URL. Focus the main window and send an event to treat the URL. + if (mainWindow) { + if (mainWindow.isMinimized()) { + mainWindow.restore(); + } + mainWindow.focus(); + mainWindow.webContents.send('mmAppLaunched', url); // Send an event to the main window. + } +} + ipcMain.on('openItem', (event, path) => { shell.openItem(path); }); From be7034c7bb3966e22fb96a414080cb01e59f8923 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 7 Jun 2017 11:25:58 +0200 Subject: [PATCH 021/118] MOBILE-2147 electron: Support InAppBrowser --- www/core/components/login/main.js | 4 + www/core/lib/emulator.js | 126 ++++++++++++++++++++++++++++++ www/core/lib/util.js | 11 ++- www/electron.js | 10 +++ 4 files changed, 149 insertions(+), 2 deletions(-) diff --git a/www/core/components/login/main.js b/www/core/components/login/main.js index 2080760da08..75880aea5d9 100644 --- a/www/core/components/login/main.js +++ b/www/core/components/login/main.js @@ -363,6 +363,10 @@ angular.module('mm.core.login', []) // Authentication ongoing, probably duplicated request. return true; } + if ($mmApp.isDesktop()) { + // In desktop, make sure InAppBrowser is closed. + $mmUtil.closeInAppBrowser(true); + } // App opened using custom URL scheme. Probably an SSO authentication. $mmApp.startSSOAuthentication(); diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index a37cb536f34..0b329d77046 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -936,6 +936,131 @@ angular.module('mm.core') }); } + /** + * Emulate InAppBrowser for NodeJS. + * + * @return {Void} + */ + function emulateInAppBrowser() { + if (!$mmApp.isDesktop()) { + return; + } + + var BrowserWindow = require('electron').remote.BrowserWindow, + screen = require('electron').screen; + + // Redefine window open to be able to have full control over the new window. + $window.open = function(url, frameName, features) { + var width = 800, + height = 600, + display, + newWindow, + listeners = {}; + + if (screen) { + display = screen.getPrimaryDisplay(); + if (display && display.workArea) { + width = display.workArea.width || width; + height = display.workArea.height || height; + } + } + + newWindow = new BrowserWindow({ + width: width, + height: height + }); + newWindow.loadURL(url); + + // Add the missing functions that InAppBrowser supports but BrowserWindow doesn't. + newWindow.addEventListener = function(name, callback) { + var that = this; + + switch (name) { + case 'loadstart': + that.webContents.addListener('did-start-loading', received); + break; + + case 'loadstop': + that.webContents.addListener('did-finish-load', received); + break; + + case 'loaderror': + that.webContents.addListener('did-fail-load', received); + break; + + case 'exit': + that.addListener('close', received); + break; + } + + // Store the received function instance to be able to remove the listener. + listeners[callback] = received; + + function received(event) { + try { + event.url = that.getURL(); + callback(event); + } catch(ex) {} + } + }; + + newWindow.removeEventListener = function(name, callback) { + var that = this, + listener = listeners[callback]; + + switch (name) { + case 'loadstart': + that.webContents.removeListener('did-start-loading', listener); + break; + + case 'loadstop': + that.webContents.removeListener('did-finish-load', listener); + break; + + case 'loaderror': + that.webContents.removeListener('did-fail-load', listener); + break; + + case 'exit': + that.removeListener('close', listener); + break; + } + }; + + newWindow.executeScript = function(details, callback) { + var that = this; + + if (details.code) { + that.webContents.executeJavaScript(details.code, false, callback); + } else if (details.file) { + $mmFS.readFile(details.file).then(function(code) { + that.webContents.executeJavaScript(code, false, callback); + }).catch(callback); + } else { + callback('executeScript requires exactly one of code or file to be specified'); + } + }; + + newWindow.insertCSS = function(details, callback) { + var that = this; + + if (details.code) { + that.webContents.insertCSS(details.code); + callback(); + } else if (details.file) { + $mmFS.readFile(details.file).then(function(code) { + that.webContents.insertCSS(code); + callback(); + }).catch(callback); + } else { + callback('insertCSS requires exactly one of code or file to be specified'); + } + }; + + return newWindow; + }; + } + /** * Get the credentials from a URL. * This code is extracted from Cordova FileTransfer plugin. @@ -989,6 +1114,7 @@ angular.module('mm.core') emulateCordovaFile(); emulateCustomURLScheme(); + emulateInAppBrowser(); // Initialize File System. Get the path to use. basePath = app.getPath('documents') || app.getPath('home'); diff --git a/www/core/lib/util.js b/www/core/lib/util.js index 5a21b276da5..1e4f82db24b 100644 --- a/www/core/lib/util.js +++ b/www/core/lib/util.js @@ -432,10 +432,17 @@ angular.module('mm.core') * @module mm.core * @ngdoc method * @name $mmUtil#closeInAppBrowser + * @param {Boolean} [closeAll] Desktop only. True to close all secondary windows, false to close only the "current" one. * @return {Void} */ - self.closeInAppBrowser = function() { - $cordovaInAppBrowser.close(); + self.closeInAppBrowser = function(closeAll) { + // Use try/catch because it will fail if there is no opened InAppBrowser. + try { + $cordovaInAppBrowser.close(); + if (closeAll && $mmApp.isDesktop()) { + require('electron').ipcRenderer.send('closeSecondaryWindows'); + } + } catch(ex) {} }; /** diff --git a/www/electron.js b/www/electron.js index ff47101b150..c95bdfb7566 100644 --- a/www/electron.js +++ b/www/electron.js @@ -100,6 +100,16 @@ function appLaunched(url) { } } +// Listen for events sent by the renderer processes (windows). ipcMain.on('openItem', (event, path) => { shell.openItem(path); }); + +ipcMain.on('closeSecondaryWindows', () => { + var windows = BrowserWindow.getAllWindows(); + for (var i = 0; i < windows.length; i++) { + if (!mainWindow || windows[i].id != mainWindow.id) { + windows[i].close(); + } + } +}); From 862b851bdf46c3c61998442cc8702f879477fe70 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 9 Jun 2017 10:01:12 +0200 Subject: [PATCH 022/118] MOBILE-2147 calendar: Open event in split view when notification clicked --- www/addons/calendar/controllers/list.js | 38 +++++++++++++++++++------ www/addons/calendar/templates/list.html | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/www/addons/calendar/controllers/list.js b/www/addons/calendar/controllers/list.js index 5ef1ab47781..30f897430f1 100644 --- a/www/addons/calendar/controllers/list.js +++ b/www/addons/calendar/controllers/list.js @@ -21,9 +21,9 @@ angular.module('mm.addons.calendar') * @ngdoc controller * @name mmaCalendarListCtrl */ -.controller('mmaCalendarListCtrl', function($scope, $stateParams, $log, $state, $mmaCalendar, $mmUtil, $ionicHistory, $mmEvents, +.controller('mmaCalendarListCtrl', function($scope, $stateParams, $log, $state, $mmaCalendar, $mmUtil, $timeout, $mmEvents, mmaCalendarDaysInterval, $ionicScrollDelegate, $mmLocalNotifications, $mmCourses, mmaCalendarDefaultNotifTimeChangedEvent, - $ionicPopover, $q, $translate) { + $ionicPopover, $q, $translate, $ionicPlatform) { $log = $log.getInstance('mmaCalendarListCtrl'); @@ -38,10 +38,10 @@ angular.module('mm.addons.calendar') }; $scope.events = []; + $scope.eventToLoad = 1; - if ($stateParams.eventid) { - // We arrived here via notification click, let's clear history and redirect to event details. - $ionicHistory.clearHistory(); + if ($stateParams.eventid && !$ionicPlatform.isTablet()) { + // There is an event to load and it's a phone device, open the event in a new state. $state.go('site.calendar-event', {id: $stateParams.eventid}); } @@ -69,7 +69,6 @@ angular.module('mm.addons.calendar') emptyEventsTimes++; if (emptyEventsTimes > 5) { // Stop execution if we retrieve empty list 6 consecutive times. $scope.canLoadMore = false; - $scope.eventsLoaded = true; if (refresh) { $scope.events = []; } @@ -90,7 +89,6 @@ angular.module('mm.addons.calendar') // Filter events with same ID. Repeated events are returned once per WS call, show them only once. $scope.events = $mmUtil.mergeArraysWithoutDuplicates($scope.events, events, 'id'); } - $scope.eventsLoaded = true; $scope.canLoadMore = true; // Schedule notifications for the events retrieved (might have new events). @@ -101,7 +99,6 @@ angular.module('mm.addons.calendar') scrollView.resize(); }, function(error) { $mmUtil.showErrorModalDefault(error, 'mma.calendar.errorloadevents', true); - $scope.eventsLoaded = true; $scope.canLoadMore = false; // Set to false to prevent infinite calls with infinite-loading. }); } @@ -121,7 +118,30 @@ angular.module('mm.addons.calendar') $scope.notificationsEnabled = $mmLocalNotifications.isAvailable(); // Get first events. - fetchData(); + fetchData().then(function() { + if ($stateParams.eventid && $ionicPlatform.isTablet()) { + // There is an event to load and it's a tablet device. Search the position of the event in the list and load it. + var found = false; + + for (var i = 0; i < $scope.events.length; i++) { + if ($scope.events[i].id == $stateParams.eventid) { + $scope.eventToLoad = i + 1; + found = true; + break; + } + } + + if (!found) { + // Event not found in the list, open it in a new state. Use a $timeout to open the state after the + // split view is loaded. + $timeout(function() { + $state.go('site.calendar-event', {id: $stateParams.eventid}); + }); + } + } + }).finally(function() { + $scope.eventsLoaded = true; + }); // Init popover. $ionicPopover.fromTemplateUrl('addons/calendar/templates/course_picker.html', { diff --git a/www/addons/calendar/templates/list.html b/www/addons/calendar/templates/list.html index 7ec4466f335..23f07180988 100644 --- a/www/addons/calendar/templates/list.html +++ b/www/addons/calendar/templates/list.html @@ -5,7 +5,7 @@ - + From 53e10880b0a3263dc885fc189fa02cf5c1804a92 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 9 Jun 2017 11:58:27 +0200 Subject: [PATCH 023/118] MOBILE-2147 electron: Support local notifications --- .../notifications/controllers/preferences.js | 23 +- .../notifications/templates/preferences.html | 4 +- www/core/lib/emulator.js | 471 +++++++++++++++++- www/core/lib/localnotif.js | 2 +- 4 files changed, 484 insertions(+), 16 deletions(-) diff --git a/www/addons/notifications/controllers/preferences.js b/www/addons/notifications/controllers/preferences.js index 226a12fcaab..efe6168083f 100644 --- a/www/addons/notifications/controllers/preferences.js +++ b/www/addons/notifications/controllers/preferences.js @@ -23,23 +23,26 @@ angular.module('mm.addons.notifications') */ .controller('mmaNotificationsPreferencesCtrl', function($scope, $mmaNotifications, $mmUtil, $ionicPlatform, $mmUser, $mmConfig, $mmaMessageOutputDelegate, $q, $timeout, $mmSettingsHelper, mmCoreSettingsNotificationSound, $mmLocalNotifications, - $mmEvents, mmCoreEventNotificationSoundChanged) { + $mmEvents, mmCoreEventNotificationSoundChanged, $mmApp) { var updateTimeout; $scope.isTablet = $ionicPlatform.isTablet(); $scope.notifPrefsEnabled = $mmaNotifications.isNotificationPreferencesEnabled(); + $scope.canChangeSound = $mmLocalNotifications.isAvailable() && !$mmApp.isDesktop(); - // Notification sound setting. - $mmConfig.get(mmCoreSettingsNotificationSound, true).then(function(enabled) { - $scope.notificationSound = enabled; - }); + if ($scope.canChangeSound) { + // Notification sound setting. + $mmConfig.get(mmCoreSettingsNotificationSound, true).then(function(enabled) { + $scope.notificationSound = enabled; + }); - $scope.notificationSoundChanged = function(enabled) { - $mmConfig.set(mmCoreSettingsNotificationSound, enabled); - $mmEvents.trigger(mmCoreEventNotificationSoundChanged, enabled); - $mmLocalNotifications.rescheduleAll(); - }; + $scope.notificationSoundChanged = function(enabled) { + $mmConfig.set(mmCoreSettingsNotificationSound, enabled); + $mmEvents.trigger(mmCoreEventNotificationSoundChanged, enabled); + $mmLocalNotifications.rescheduleAll(); + }; + } if (!$scope.notifPrefsEnabled) { // Notification preferences aren't enabled, stop. diff --git a/www/addons/notifications/templates/preferences.html b/www/addons/notifications/templates/preferences.html index 94ec50727c0..1b35e02a80b 100644 --- a/www/addons/notifications/templates/preferences.html +++ b/www/addons/notifications/templates/preferences.html @@ -10,7 +10,7 @@ - +

{{ 'mma.notifications.playsound' | translate }}

@@ -19,7 +19,7 @@ {{ 'mm.settings.disableall' | translate }} - +

{{ 'mma.notifications.playsound' | translate }}

diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 0b329d77046..7deb5c7f26a 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -14,6 +14,23 @@ angular.module('mm.core') +.constant('mmDesktopLocalNotificationsStore', 'desktop_local_notifications') + +.config(function($mmAppProvider, mmDesktopLocalNotificationsStore) { + var stores = [ + { + name: mmDesktopLocalNotificationsStore, // Store to schedule notifications in desktop apps. + keyPath: 'id', + indexes: [ + { + name: 'triggered' + } + ] + } + ]; + $mmAppProvider.registerStores(stores); +}) + /** * @ngdoc service * @name $mmEmulatorManager @@ -21,7 +38,9 @@ angular.module('mm.core') * @description * This service handles the emulation of Cordova plugins in other environments like browser. */ -.factory('$mmEmulatorManager', function($log, $q, $mmFS, $window, $mmApp, mmCoreConfigConstants, $cordovaClipboard) { +.factory('$mmEmulatorManager', function($log, $q, $mmFS, $window, $mmApp, $mmUtil, mmCoreConfigConstants, $cordovaClipboard, + $cordovaLocalNotification, mmDesktopLocalNotificationsStore, $timeout, $rootScope, $interval, + mmCoreSecondsYear, mmCoreSecondsDay, mmCoreSecondsHour, mmCoreSecondsMinute) { $log = $log.getInstance('$mmEmulatorManager'); @@ -1061,6 +1080,427 @@ angular.module('mm.core') }; } + /** + * Emulate local notifications for NodeJS. + * Some of the code used in here was extracted from the Cordova Local Notification plugin. + * + * @return {Promise} Promise resolved when done. + */ + function emulateLocalNotifications() { + if (!$mmApp.isDesktop()) { + return $q.when(); + } + + var scheduled = {}, + triggered = {}, + defaults = { + text: '', + title: '', + id: 0, + sound: '', + data: undefined, + every: undefined, + at: undefined + }; + + // Redefine $cordovaLocalNotification methods instead of the core plugin (window.cordova.plugins.notification.local) + // because creating window.cordova breaks the app (it thinks it's a real device). + $cordovaLocalNotification.schedule = function(notifications, scope, isUpdate) { + var promises = []; + + notifications = Array.isArray(notifications) ? notifications : [notifications]; + + angular.forEach(notifications, function(notification) { + mergeWithDefaults(notification); + convertProperties(notification); + + // Cancel current notification if exists. + $cordovaLocalNotification.cancel(notification.id, null, true); + + // Store the notification in the scheduled list and in the DB. + scheduled[notification.id] = { + notification: notification + }; + promises.push(storeLocalNotification(notification, false)); + + // Schedule the notification. + var toTrigger = notification.at * 1000 - Date.now(); + scheduled[notification.id].timeout = $timeout(function trigger() { + // Trigger the notification. + var notifInstance = new Notification(notification.title, { + body: notification.text + }); + + // Store the notification as triggered. Don't remove it from scheduled, it's how the plugin works. + triggered[notification.id] = notification; + storeLocalNotification(notification, true); + + // Launch the trigger event. + $rootScope.$broadcast('$cordovaLocalNotification:trigger', notification, 'foreground'); + + // Listen for click events. + notifInstance.onclick = function() { + $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + }; + + if (notification.every && scheduled[notification.id] && !scheduled[notification.id].interval) { + var interval = parseInterval(notification.every); + if (interval > 0) { + scheduled[notification.id].interval = $interval(trigger, interval); + } + } + }, toTrigger); + + // Launch the scheduled/update event. + var eventName = isUpdate ? 'update' : 'schedule'; + $rootScope.$broadcast('$cordovaLocalNotification:' + eventName, notification, 'foreground'); + }); + + return $q.when(); + }; + + $cordovaLocalNotification.update = function(notifications) { + // Just schedule them again, since scheduling cancels the existing one. + return $cordovaLocalNotification.schedule(notifications, null, true); + }; + + $cordovaLocalNotification.clear = function(ids, scope, omitEvent) { + var promises = []; + + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + + // Clear the notifications. + angular.forEach(ids, function(id) { + // Cancel only the notifications that aren't repeating. + if (scheduled[id] && scheduled[id].notification && !scheduled[id].notification.every) { + promises.push(cancelNotification(id, omitEvent, '$cordovaLocalNotification:clear')); + } + }); + + return $q.all(promises); + }; + + $cordovaLocalNotification.clearAll = function(scope, omitEvent) { + var ids = Object.keys(scheduled); + return $cordovaLocalNotification.clear(ids, scope, omitEvent).then(function() { + if (!omitEvent) { + $rootScope.$broadcast('$cordovaLocalNotification:clearall', 'foreground'); + } + }); + }; + + $cordovaLocalNotification.cancel = function(ids, scope, omitEvent) { + var promises = []; + + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + + // Cancel the notifications. + angular.forEach(ids, function(id) { + if (scheduled[id]) { + promises.push(cancelNotification(id, omitEvent, '$cordovaLocalNotification:cancel')); + } + }); + + return $q.all(promises); + }; + + $cordovaLocalNotification.cancelAll = function(scope, omitEvent) { + var ids = Object.keys(scheduled); + return $cordovaLocalNotification.cancel(ids, scope, omitEvent).then(function() { + if (!omitEvent) { + $rootScope.$broadcast('$cordovaLocalNotification:cancelall', 'foreground'); + } + }); + }; + + $cordovaLocalNotification.isPresent = function(id) { + return $q.when(!!scheduled[id] || !!triggered[notification.id]); + }; + + $cordovaLocalNotification.isScheduled = function(id) { + return $q.when(!!scheduled[id]); + }; + + $cordovaLocalNotification.isTriggered = function(id) { + return $q.when(!!triggered[notification.id]); + }; + + $cordovaLocalNotification.hasPermission = function() { + return $q.when(true); + }; + + $cordovaLocalNotification.registerPermission = function() { + return $q.when(true); + }; + + $cordovaLocalNotification.getAllIds = function() { + return $q.when($mmUtil.mergeArraysWithoutDuplicates(Object.keys(scheduled), Object.keys(triggered))); + }; + $cordovaLocalNotification.getIds = $cordovaLocalNotification.getAllIds; + + $cordovaLocalNotification.getScheduledIds = function() { + return $q.when(Object.keys(scheduled)); + }; + + $cordovaLocalNotification.getTriggeredIds = function() { + return $q.when(Object.keys(triggered)); + }; + + $cordovaLocalNotification.get = function(ids) { + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + return getNotifications(ids, true, true); + }; + + $cordovaLocalNotification.getAll = function() { + return getNotifications(null, true, true); + }; + + $cordovaLocalNotification.getScheduled = function(ids) { + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + return getNotifications(ids, true, false); + }; + + $cordovaLocalNotification.getAllScheduled = function() { + return getNotifications(null, true, false); + }; + + $cordovaLocalNotification.getTriggered = function(ids) { + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + return getNotifications(ids, false, true); + }; + + $cordovaLocalNotification.getAllTriggered = function() { + return getNotifications(null, false, true); + }; + + $cordovaLocalNotification.getDefaults = function() { + return defaults; + }; + + $cordovaLocalNotification.setDefaults = function(newDefaults) { + for (var key in defaults) { + if (newDefaults.hasOwnProperty(key)) { + defaults[key] = newDefaults[key]; + } + } + }; + + // App is being loaded, re-schedule all the notifications that were scheduled before. + return getAllLocalNotifications().catch(function() { + return []; + }).then(function(notifications) { + angular.forEach(notifications, function(notification) { + if (notification.triggered) { + // Notification was triggered already, store it in memory but don't schedule it again. + delete notification.triggered; + scheduled[notification.id] = notification; + triggered[notification.id] = notification; + } else { + // Schedule the notification again unless it should have been triggered more than an hour ago. + delete notification.triggered; + notification.at = notification.at * 1000; + if (notification.at - Date.now() > - mmCoreSecondsHour * 1000) { + $cordovaLocalNotification.schedule(notification); + } + } + }); + }); + + // Cancel a notification. + function cancelNotification(id, omitEvent, eventName) { + var notification = scheduled[id].notification; + + $timeout.cancel(scheduled[id].timeout); + $interval.cancel(scheduled[id].interval); + delete scheduled[id]; + delete triggered[id]; + + removeLocalNotification(id); + + if (!omitEvent) { + $rootScope.$broadcast(eventName, notification, 'foreground'); + } + } + + // Get a set of notifications. If ids isn't specified, return all the notifications. + function getNotifications(ids, getScheduled, getTriggered) { + var notifications = []; + + if (getScheduled) { + angular.forEach(scheduled, function(entry, id) { + if (!ids || ids.indexOf(id) != -1) { + notifications.push(entry.notification); + } + }); + } + + if (getTriggered) { + angular.forEach(triggered, function(notification, id) { + if ((!getScheduled || !scheduled[id]) && (!ids || ids.indexOf(id) != -1)) { + notifications.push(notification); + } + }); + } + + return $q.when(notifications); + } + + // Merge options with default values. + function mergeWithDefaults(options) { + options.at = getValueFor(options, 'at', 'firstAt', 'date'); + options.text = getValueFor(options, 'text', 'message'); + options.data = getValueFor(options, 'data', 'json'); + + if (defaults.hasOwnProperty('autoClear')) { + options.autoClear = getValueFor(options, 'autoClear', 'autoCancel'); + } + + if (options.autoClear !== true && options.ongoing) { + options.autoClear = false; + } + + if (options.at === undefined || options.at === null) { + options.at = new Date(); + } + + for (var key in defaults) { + if (options[key] === null || options[key] === undefined) { + if (options.hasOwnProperty(key) && ['data','sound'].indexOf(key) > -1) { + options[key] = undefined; + } else { + options[key] = defaults[key]; + } + } + } + + for (key in options) { + if (!defaults.hasOwnProperty(key)) { + delete options[key]; + console.warn('Unknown property: ' + key); + } + } + + return options; + } + + // First found value for the given keys. + function getValueFor(options) { + var keys = Array.apply(null, arguments).slice(1); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (options.hasOwnProperty(key)) { + return options[key]; + } + } + } + + // Convert the passed values to their required type. + function convertProperties(options) { + if (options.id) { + if (isNaN(options.id)) { + options.id = defaults.id; + console.warn('Id is not a number: ' + options.id); + } else { + options.id = Number(options.id); + } + } + + if (options.title) { + options.title = options.title.toString(); + } + + if (options.text) { + options.text = options.text.toString(); + } + + if (options.badge) { + if (isNaN(options.badge)) { + options.badge = defaults.badge; + console.warn('Badge number is not a number: ' + options.id); + } else { + options.badge = Number(options.badge); + } + } + + if (options.at) { + if (typeof options.at == 'object') { + options.at = options.at.getTime(); + } + + options.at = Math.round(options.at / 1000); + } + + if (typeof options.data == 'object') { + options.data = JSON.stringify(options.data); + } + + return options; + } + + // Convert the IDs to numbers. + function convertIds(ids) { + var convertedIds = []; + + for (var i = 0; i < ids.length; i++) { + convertedIds.push(Number(ids[i])); + } + + return convertedIds; + } + + // Parse the interval and convert it to a number of milliseconds (0 if not valid). + function parseInterval(every) { + var interval; + + every = String(every).toLowerCase(); + + if (!every || every == 'undefined') { + interval = 0; + } else if (every == 'second') { + interval = 1000; + } else if (every == 'minute') { + interval = mmCoreSecondsMinute * 1000; + } else if (every == 'hour') { + interval = mmCoreSecondsHour * 1000; + } else if (every == 'day') { + interval = mmCoreSecondsDay * 1000; + } else if (every == 'week') { + interval = mmCoreSecondsDay * 7 * 1000; + } else if (every == 'month') { + interval = mmCoreSecondsDay * 31 * 1000; + } else if (every == 'quarter') { + interval = mmCoreSecondsHour * 2190 * 1000; + } else if (every == 'year') { + interval = mmCoreSecondsYear * 1000; + } else { + interval = parseInt(every, 10); + if (isNaN(interval)) { + interval = 0; + } else { + interval *= 60000; + } + } + + return interval; + } + } + + /** + * Get all the notification stored in local DB. + * + * @return {Promise} Promise resolved with the notifications. + */ + function getAllLocalNotifications() { + return $mmApp.getDB().getAll(mmDesktopLocalNotificationsStore); + } + /** * Get the credentials from a URL. * This code is extracted from Cordova FileTransfer plugin. @@ -1091,7 +1531,8 @@ angular.module('mm.core') return $q.when(); } - var deferred = $q.defer(); + var deferred = $q.defer(), + promises = [deferred.promise]; $log.debug('Loading HTML API.'); @@ -1115,6 +1556,7 @@ angular.module('mm.core') emulateCordovaFile(); emulateCustomURLScheme(); emulateInAppBrowser(); + promises.push(emulateLocalNotifications()); // Initialize File System. Get the path to use. basePath = app.getPath('documents') || app.getPath('home'); @@ -1146,9 +1588,32 @@ angular.module('mm.core') }, deferred.reject); } - return deferred.promise; + return $q.all(promises); }; + /** + * Remove a notification from local DB. + * + * @param {Number} id ID of the notification. + * @return {Promise} Promise resolved when done. + */ + function removeLocalNotification(id) { + return $mmApp.getDB().remove(mmDesktopLocalNotificationsStore, id); + } + + /** + * Store a notification in local DB. + * + * @param {Object} notification Notification to store. + * @param {Boolean} triggered Whether the notification has been triggered. + * @return {Promise} Promise resolved when stored. + */ + function storeLocalNotification(notification, triggered) { + notification = angular.copy(notification); + notification.triggered = !!triggered; + return $mmApp.getDB().insert(mmDesktopLocalNotificationsStore, notification); + } + return self; }) diff --git a/www/core/lib/localnotif.js b/www/core/lib/localnotif.js index e2300fed332..883e015bec0 100644 --- a/www/core/lib/localnotif.js +++ b/www/core/lib/localnotif.js @@ -300,7 +300,7 @@ angular.module('mm.core') * @return {Boolean} True when local notifications plugin is installed. */ self.isAvailable = function() { - return window.plugin && window.plugin.notification && window.plugin.notification.local ? true: false; + return $mmApp.isDesktop() || !!(window.plugin && window.plugin.notification && window.plugin.notification.local); }; /** From 92e3dd4a059a5131b95a45ae29c0ad57f4e8fe6e Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 9 Jun 2017 14:43:49 +0200 Subject: [PATCH 024/118] MOBILE-2147 electron: Support app badge --- www/core/lib/emulator.js | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js index 7deb5c7f26a..a3b0e1d14f4 100644 --- a/www/core/lib/emulator.js +++ b/www/core/lib/emulator.js @@ -1492,6 +1492,85 @@ angular.module('mm.core') } } + /** + * Emulate some of the features of push notifications. + * + * @return {Void} + */ + function emulatePushNotifications() { + // Create the PushNotification object, but only some of its functions will be supported. + var PushNotification = function(options) {}; + + PushNotification.prototype.unregister = function(successCallback, errorCallback, options) { + errorCallback && errorCallback('Unregister is only supported in mobile devices'); + }; + + PushNotification.prototype.subscribe = function(topic, successCallback, errorCallback) { + errorCallback && errorCallback('Suscribe is only supported in mobile devices'); + }; + + PushNotification.prototype.unsubscribe = function(topic, successCallback, errorCallback) { + errorCallback && errorCallback('Unsuscribe is only supported in mobile devices'); + }; + + PushNotification.prototype.setApplicationIconBadgeNumber = function(successCallback, errorCallback, badge) { + if (!$mmApp.isDesktop()) { + errorCallback && errorCallback('setApplicationIconBadgeNumber is not supported in browser'); + return; + } + + try { + var app = require('electron').remote.app; + if (app.setBadgeCount(badge)) { + successCallback && successCallback(); + } else { + errorCallback && errorCallback(); + } + } catch(ex) { + errorCallback && errorCallback(ex); + } + }; + + PushNotification.prototype.getApplicationIconBadgeNumber = function(successCallback, errorCallback) { + if (!$mmApp.isDesktop()) { + errorCallback && errorCallback('getApplicationIconBadgeNumber is not supported in browser'); + return; + } + + try { + var app = require('electron').remote.app; + successCallback && successCallback(app.getBadgeCount()); + } catch(ex) { + errorCallback && errorCallback(ex); + } + }; + + PushNotification.prototype.clearAllNotifications = function(successCallback, errorCallback) { + errorCallback && errorCallback('clearAllNotifications is only supported in mobile devices'); + }; + + PushNotification.prototype.on = function(eventName, callback) {}; + PushNotification.prototype.off = function(eventName, handle) {}; + PushNotification.prototype.emit = function() {}; + + PushNotification.prototype.finish = function(successCallback, errorCallback, id) { + errorCallback && errorCallback('finish is only supported in mobile devices'); + }; + + // Create the visible PushNotification object. + $window.PushNotification = { + init: function(options) { + return new PushNotification(options); + }, + + hasPermission: function(successCallback, errorCallback) { + errorCallback && errorCallback('hasPermission is only supported in mobile devices'); + }, + + PushNotification: PushNotification + }; + } + /** * Get all the notification stored in local DB. * @@ -1548,6 +1627,7 @@ angular.module('mm.core') emulateCordovaGlobalization(); emulateCordovaZip(); emulateCordovaClipboard(); + emulatePushNotifications(); if ($mmApp.isDesktop()) { var fs = require('fs'), From 04d054fa4b96b635e856d2f6a91f43fcbc816d5f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 12 Jun 2017 13:55:10 +0200 Subject: [PATCH 025/118] MOBILE-2147 electron: Move emulator code to a new component --- www/core/components/emulator/main.js | 23 + .../components/emulator/services/clipboard.js | 112 ++ .../components/emulator/services/customurl.js | 52 + .../components/emulator/services/emulator.js | 65 + www/core/components/emulator/services/file.js | 595 ++++++ .../emulator/services/filetransfer.js | 286 +++ .../emulator/services/globalization.js | 130 ++ .../emulator/services/inappbrowser.js | 161 ++ .../emulator/services/localnotif.js | 542 ++++++ .../emulator/services/pushnotifications.js | 116 ++ www/core/components/emulator/services/zip.js | 89 + www/core/lib/emulator.js | 1705 ----------------- www/core/lib/fs.js | 18 + 13 files changed, 2189 insertions(+), 1705 deletions(-) create mode 100644 www/core/components/emulator/main.js create mode 100644 www/core/components/emulator/services/clipboard.js create mode 100644 www/core/components/emulator/services/customurl.js create mode 100644 www/core/components/emulator/services/emulator.js create mode 100644 www/core/components/emulator/services/file.js create mode 100644 www/core/components/emulator/services/filetransfer.js create mode 100644 www/core/components/emulator/services/globalization.js create mode 100644 www/core/components/emulator/services/inappbrowser.js create mode 100644 www/core/components/emulator/services/localnotif.js create mode 100644 www/core/components/emulator/services/pushnotifications.js create mode 100644 www/core/components/emulator/services/zip.js delete mode 100644 www/core/lib/emulator.js diff --git a/www/core/components/emulator/main.js b/www/core/components/emulator/main.js new file mode 100644 index 00000000000..ae23d656926 --- /dev/null +++ b/www/core/components/emulator/main.js @@ -0,0 +1,23 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Module to support Cordova plugins in desktop and some of them in browser too. +angular.module('mm.core.emulator', ['mm.core']) + +.config(function($mmInitDelegateProvider, mmInitDelegateMaxAddonPriority) { + if (!ionic.Platform.isWebView()) { + $mmInitDelegateProvider.registerProcess('mmEmulator', '$mmEmulatorManager.loadHTMLAPI', + mmInitDelegateMaxAddonPriority + 500, true); + } +}); diff --git a/www/core/components/emulator/services/clipboard.js b/www/core/components/emulator/services/clipboard.js new file mode 100644 index 00000000000..75bd66d9d09 --- /dev/null +++ b/www/core/components/emulator/services/clipboard.js @@ -0,0 +1,112 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the clipboard Cordova plugin in desktop apps and in browser. + * + * @ngdoc service + * @name $mmEmulatorClipboard + * @module mm.core.emulator + */ +.factory('$mmEmulatorClipboard', function($log, $q, $mmApp, $cordovaClipboard) { + + $log = $log.getInstance('$mmEmulatorClipboard'); + + var self = {}; + + /** + * Load the emulation of the Cordova plugin. It might not work in some browsers. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorClipboard#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + var isDesktop = $mmApp.isDesktop(), + clipboard, + copyTextarea; + + if (isDesktop) { + clipboard = require('electron').clipboard; + } else { + // In browser the text must be selected in order to copy it. Create a hidden textarea to put the text in it. + copyTextarea = document.createElement('textarea'); + angular.element(copyTextarea).addClass('mm-browser-copy-area'); + copyTextarea.setAttribute('aria-hidden', 'true'); + document.body.append(copyTextarea); + } + + // We need to redefine $cordovaClipboard methods instead of the core plugin (window.cordova.plugins.clipboard) + // because creating window.cordova breaks the app (it thinks it's a real device). + $cordovaClipboard.copy = function(text) { + var deferred = $q.defer(); + + if (isDesktop) { + clipboard.writeText(text); + deferred.resolve(); + } else { + // Put the text in the hidden textarea and select it. + copyTextarea.innerHTML = text; + copyTextarea.select(); + + try { + if (document.execCommand('copy')) { + deferred.resolve(); + } else { + deferred.reject(); + } + } catch (err) { + deferred.reject(); + } + + copyTextarea.innerHTML = ''; + } + + return deferred.promise; + }; + + $cordovaClipboard.paste = function() { + var deferred = $q.defer(); + + if (isDesktop) { + deferred.resolve(clipboard.readText()); + } else { + // Paste the text in the hidden textarea and get it. + copyTextarea.innerHTML = ''; + copyTextarea.select(); + + try { + if (document.execCommand('paste')) { + deferred.resolve(copyTextarea.innerHTML); + } else { + deferred.reject(); + } + } catch (err) { + deferred.reject(); + } + + copyTextarea.innerHTML = ''; + } + + return deferred.promise; + }; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/customurl.js b/www/core/components/emulator/services/customurl.js new file mode 100644 index 00000000000..50fdab480f0 --- /dev/null +++ b/www/core/components/emulator/services/customurl.js @@ -0,0 +1,52 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova Custom URL Scheme plugin in desktop apps. + * + * @ngdoc service + * @name $mmEmulatorCustomURLScheme + * @module mm.core.emulator + */ +.factory('$mmEmulatorCustomURLScheme', function($log, $q, $mmApp) { + + $log = $log.getInstance('$mmEmulatorCustomURLScheme'); + + var self = {}; + + /** + * Load the emulation of the Cordova plugin. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorCustomURLScheme#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + if (!$mmApp.isDesktop()) { + return $q.when(); + } + + // Listen for app launched events. + require('electron').ipcRenderer.on('mmAppLaunched', function(event, url) { + window.handleOpenURL && window.handleOpenURL(url); + }); + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/emulator.js b/www/core/components/emulator/services/emulator.js new file mode 100644 index 00000000000..0d370a95ce1 --- /dev/null +++ b/www/core/components/emulator/services/emulator.js @@ -0,0 +1,65 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core') + +/** + * @ngdoc service + * @name $mmEmulatorManager + * @module mm.core + * @description + * This service handles the emulation of Cordova plugins in other environments like browser. + */ +.factory('$mmEmulatorManager', function($log, $q, $mmFS, $mmEmulatorClipboard, $mmEmulatorCustomURLScheme, $mmEmulatorFile, + $mmEmulatorFileTransfer, $mmEmulatorGlobalization, $mmEmulatorInAppBrowser, $mmEmulatorLocalNotifications, + $mmEmulatorPushNotifications, $mmEmulatorZip, $mmUtil) { + + $log = $log.getInstance('$mmEmulatorManager'); + + var self = {}; + + /** + * Loads HTML API to simulate Cordova APIs. Reserved for core use. + * + * @module mm.core + * @ngdoc method + * @name $mmEmulatorManager#loadHTMLAPI + * @return {Promise} Promise resolved when the API is loaded. + * @protected + */ + self.loadHTMLAPI = function() { + if ($mmFS.isAvailable()) { + $log.debug('Stop loading HTML API, it was already loaded or the environment doesn\'t need it.'); + return $q.when(); + } + + $log.debug('Loading HTML API.'); + + var promises = []; + + promises.push($mmEmulatorClipboard.load()); + promises.push($mmEmulatorCustomURLScheme.load()); + promises.push($mmEmulatorFile.load()); + promises.push($mmEmulatorFileTransfer.load()); + promises.push($mmEmulatorGlobalization.load()); + promises.push($mmEmulatorInAppBrowser.load()); + promises.push($mmEmulatorLocalNotifications.load()); + promises.push($mmEmulatorPushNotifications.load()); + promises.push($mmEmulatorZip.load()); + + return $mmUtil.allPromises(promises); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/file.js b/www/core/components/emulator/services/file.js new file mode 100644 index 00000000000..4de40822e7e --- /dev/null +++ b/www/core/components/emulator/services/file.js @@ -0,0 +1,595 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova File plugin in desktop apps and in browser. + * + * @ngdoc service + * @name $mmEmulatorFile + * @module mm.core.emulator + */ +.factory('$mmEmulatorFile', function($log, $q, $mmFS, $window, $mmApp, mmCoreConfigConstants) { + + $log = $log.getInstance('$mmEmulatorFile'); + + var self = {}; + + /** + * Delete an empty folder. + * + * @param {Object} fs Node module 'fs'. + * @param {String} path Path of the folder. + * @param {Function} successCallback Function to call when success. + * @param {Function} errorCallback Function to call when error. + * @return {Void} + */ + function deleteEmptyFolder(fs, path, successCallback, errorCallback) { + fs.rmdir(path, function(err) { + if (err) { + // Error removing directory. + errorCallback && errorCallback(err); + } else { + successCallback && successCallback(); + } + }); + } + + /** + * Delete a file or folder recursively. + * + * @param {Object} fs Node module 'fs'. + * @param {String} path Path of the folder. + * @param {Function} successCallback Function to call when success. + * @param {Function} errorCallback Function to call when error. + * @return {Void} + */ + function deleteRecursive(fs, path, successCallback, errorCallback) { + // Check if it exists. + fs.stat(path, function(err, stats) { + if (err) { + // File not found, reject. + errorCallback && errorCallback(err); + } else if (stats.isFile()) { + // It's a file, remove it. + fs.unlink(path, function(err) { + if (err) { + // Error removing file, reject. + errorCallback && errorCallback(err); + } else { + successCallback && successCallback(); + } + }); + } else { + // It's a directory, read the contents. + fs.readdir(path, function(err, files) { + if (err) { + // Error reading directory contents, reject. + errorCallback && errorCallback(err); + } else if (!files.length) { + // No files to delete, delete the folder. + deleteEmptyFolder(fs, path, successCallback, errorCallback); + } else { + // Remove all the files and directories. + var removed = 0; + files.forEach(function(filename) { + deleteRecursive(fs, $mmFS.concatenatePaths(path, filename), function() { + // Success deleting the file/dir. + removed++; + if (removed == files.length) { + // All files deleted, delete the folder. + deleteEmptyFolder(fs, path, successCallback, errorCallback); + } + }, errorCallback); + }); + } + }); + } + }); + } + + /** + * Emulate Cordova file plugin using NodeJS functions. This is only for NodeJS environments, + * browser works with the default resolveLocalFileSystemURL. + * + * @param {Object} fs Node module 'fs'. + * @return {Void} + */ + function emulateCordovaFileForDesktop(fs) { + if (!$mmApp.isDesktop()) { + return; + } + + emulateEntry(fs); + emulateFileWriter(fs); + emulateDirectoryReader(fs); + emulateFileEntry(fs); + emulateDirectoryEntry(fs); + + // Implement resolveLocalFileSystemURL. + $window.resolveLocalFileSystemURL = function(path, successCallback, errorCallback) { + // Check that the file/dir exists. + fs.stat(path, function(err, stats) { + if (err) { + errorCallback && errorCallback(err); + } else { + // The file/dir exists, return an instance. + var constructorFn = stats.isDirectory() ? DirectoryEntry : FileEntry, + fileAndDir = $mmFS.getFileAndDirectoryFromPath(path); + successCallback && successCallback(new constructorFn(fileAndDir.name, path)); + } + }); + }; + } + + /** + * Emulate DirectoryEntry object of the Cordova file plugin using NodeJS functions. + * + * @param {Object} fs Node module 'fs'. + * @return {Void} + */ + function emulateDirectoryEntry(fs) { + // Create DirectoryEntry and its functions, inheriting from Entry. + $window.DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { + // Add trailing slash if it is missing. + if ((fullPath) && !/\/$/.test(fullPath)) { + fullPath += '/'; + } + if (nativeURL && !/\/$/.test(nativeURL)) { + nativeURL += '/'; + } + + $window.Entry.call(this, false, true, name, fullPath, fileSystem, nativeURL); + }; + + $window.DirectoryEntry.prototype = Object.create($window.Entry.prototype); // Inherit Entry prototype. + + $window.DirectoryEntry.prototype.createReader = function() { + return new DirectoryReader(this.fullPath); + }; + + $window.DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + getDirOrFile(fs, this, true, path, options, successCallback, errorCallback); + }; + + $window.DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + // Use a promise to make sure only one callback is called. + var deferred = $q.defer(); + + deferred.promise.then(function() { + successCallback && successCallback(); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + deleteRecursive(fs, this.fullPath, deferred.resolve, deferred.reject); + }; + + $window.DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + getDirOrFile(fs, this, false, path, options, successCallback, errorCallback); + }; + } + + /** + * Emulate DirectoryReader object of the Cordova file plugin using NodeJS functions. + * + * @param {Object} fs Node module 'fs'. + * @return {Void} + */ + function emulateDirectoryReader(fs) { + // DirectoryReader to read directory contents. + $window.DirectoryReader = function(localURL) { + this.localURL = localURL || null; + }; + + $window.DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + var that = this; + + fs.readdir(this.localURL, function(err, files) { + if (err) { + errorCallback && errorCallback(err); + } else { + // Use try/catch because it includes sync calls. + try { + var entries = []; + for (var i = 0; i < files.length; i++) { + var fileName = files[i], + filePath = $mmFS.concatenatePaths(that.localURL, fileName), + stats = fs.statSync(filePath); // Use sync function to make code simpler. + + if (stats.isDirectory()) { + entries.push(new DirectoryEntry(fileName, filePath)); + } else if (stats.isFile()) { + entries.push(new FileEntry(fileName, filePath)); + } + } + + successCallback(entries); + } catch(ex) { + errorCallback && errorCallback(ex); + } + } + }); + }; + } + + /** + * Emulate Entry object of the Cordova file plugin using NodeJS functions. + * + * @param {Object} fs Node module 'fs'. + * @return {Void} + */ + function emulateEntry(fs) { + // Create the Entry object, parent of DirectoryEntry and FileEntry. + // It includes fileSystem and nativeURL as the Cordova plugin does, but they aren't used. + $window.Entry = function(isFile, isDirectory, name, fullPath, fileSystem, nativeURL) { + this.isFile = !!isFile; + this.isDirectory = !!isDirectory; + this.name = name || ''; + this.fullPath = fullPath || ''; + this.filesystem = fileSystem || null; + this.nativeURL = nativeURL || null; + }; + + // Implement Entry functions. + $window.Entry.prototype.getMetadata = function(successCallback, errorCallback) { + fs.stat(this.fullPath, function(err, stats) { + if (err) { + errorCallback && errorCallback(err); + } else { + successCallback && successCallback({ + size: stats.size, + modificationTime: stats.mtime + }); + } + }); + }; + + $window.Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) { + // Not supported. + errorCallback('Not supported'); + }; + + $window.Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { + newName = newName || this.name; + + var srcPath = this.fullPath, + destPath = $mmFS.concatenatePaths(parent.fullPath, newName), + that = this; + + fs.rename(srcPath, destPath, function(err) { + if (err) { + errorCallback && errorCallback(err); + } else { + var constructorFn = that.isDirectory ? DirectoryEntry : FileEntry; + successCallback && successCallback(new constructorFn(newName, destPath)); + } + }); + }; + + $window.Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { + newName = newName || this.name; + + // There is no function to copy a file, read the source and write the dest. + var srcPath = this.fullPath, + destPath = $mmFS.concatenatePaths(parent.fullPath, newName), + reader = fs.createReadStream(srcPath), + writer = fs.createWriteStream(destPath), + deferred = $q.defer(), // Use a promise to make sure only one callback is called. + that = this; + + deferred.promise.then(function() { + var constructorFn = that.isDirectory ? DirectoryEntry : FileEntry; + successCallback && successCallback(new constructorFn(newName, destPath)); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + reader.on('error', deferred.reject); + + writer.on('error', deferred.reject); + + writer.on('close', deferred.resolve); + + reader.pipe(writer); + }; + + $window.Entry.prototype.toInternalURL = function() { + return 'file://' + this.fullPath; + }; + + $window.Entry.prototype.toURL = function() { + return this.fullPath; + }; + + $window.Entry.prototype.remove = function(successCallback, errorCallback) { + var removeFn = this.isDirectory ? fs.rmdir : fs.unlink; + removeFn(this.fullPath, function(err) { + if (err < 0) { + errorCallback(err); + } else { + successCallback(); + } + }); + }; + + $window.Entry.prototype.getParent = function(successCallback, errorCallback) { + // Remove last slash if present and get the path of the parent. + var fullPath = this.fullPath.slice(-1) == '/' ? this.fullPath.slice(0, -1) : this.fullPath, + parentPath = fullPath.substr(0, fullPath.lastIndexOf('/')); + + // Check that parent exists. + fs.stat(parentPath, function(err, stats) { + if (err || !stats.isDirectory()) { + errorCallback && errorCallback(err); + } else { + var fileAndDir = $mmFS.getFileAndDirectoryFromPath(parentPath); + successCallback && successCallback(new DirectoryEntry(fileAndDir.name, parentPath)); + } + }); + }; + } + + /** + * Emulate FileEntry object of the Cordova file plugin using NodeJS functions. + * + * @param {Object} fs Node module 'fs'. + * @return {Void} + */ + function emulateFileEntry(fs) { + // Create FileEntry and its functions, inheriting from Entry. + $window.FileEntry = function(name, fullPath, fileSystem, nativeURL) { + // Remove trailing slash if it is present. + if (fullPath && /\/$/.test(fullPath)) { + fullPath = fullPath.substring(0, fullPath.length - 1); + } + if (nativeURL && /\/$/.test(nativeURL)) { + nativeURL = nativeURL.substring(0, nativeURL.length - 1); + } + + $window.Entry.call(this, true, false, name, fullPath, fileSystem, nativeURL); + }; + + $window.FileEntry.prototype = Object.create($window.Entry.prototype); // Inherit Entry prototype. + + $window.FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(file) { + successCallback && successCallback(new FileWriter(file)); + }, errorCallback); + }; + + $window.FileEntry.prototype.file = function(successCallback, errorCallback) { + var that = this; + + // Get the metadata to know the time modified. + this.getMetadata(function(metadata) { + // Read the file. + fs.readFile(that.fullPath, function(err, data) { + if (err) { + errorCallback && errorCallback(err); + } else { + // Create a File instance and return it. + data = Uint8Array.from(data).buffer; // Convert the NodeJS Buffer to ArrayBuffer. + var file = new File([data], that.name || '', { + lastModified: metadata.modificationTime || null, + type: $mmFS.getMimeType($mmFS.getFileExtension(that.name)) || null + }); + file.localURL = that.fullPath; + file.start = 0; + file.end = file.size; + + successCallback && successCallback(file); + } + }); + }, errorCallback); + }; + } + + /** + * Emulate FileWriter object of the Cordova file plugin using NodeJS functions. + * + * @param {Object} fs Node module 'fs'. + * @return {Void} + */ + function emulateFileWriter(fs) { + // FileWriter to write data in files. Don't support abort, seek and truncate. + $window.FileWriter = function(file) { + this.fileName = ''; + this.length = 0; + if (file) { + this.localURL = file.localURL || file; + this.length = file.size || 0; + } + + this.position = 0; // Default is to write at the beginning of the file. + this.readyState = 0; // EMPTY + this.result = null; + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). + }; + + $window.FileWriter.prototype.write = function(data) { + var that = this; + if (data && data.toString() == '[object Blob]') { + // Can't write Blobs, convert it to a Buffer. + var reader = new FileReader(); + reader.onload = function() { + if (reader.readyState == 2) { + write(new Buffer(reader.result)); + } + }; + reader.readAsArrayBuffer(data); + } else if (data && data.toString() == '[object ArrayBuffer]') { + // Convert it to a Buffer. + write(Buffer.from(new Uint8Array(data))); + } else { + write(data); + } + + function write(data) { + fs.writeFile(that.localURL, data, function(err) { + if (err) { + that.onerror && that.onerror(err); + } else { + that.onwrite && that.onwrite(); + } + that.onwriteend && that.onwriteend(); + }); + + that.onwritestart && that.onwritestart(); + } + }; + } + + /** + * Helper function for getDirectory and getFile in DirectoryEntry. + * + * @param {Object} fs Node module 'fs'. + * @param {Object} entry DirectoryEntry to get the file/dir in. + * @param {Boolean} isDir True if getting a directory, false if getting a file. + * @param {String} path Path of the file or dir. + * @param {Object} options Options. + * @param {Function} successCallback Function to call in success. + * @param {Function} errorCallback Function to call in error. + * @return {Void} + */ + function getDirOrFile(fs, entry, isDir, path, options, successCallback, errorCallback) { + var filename = $mmFS.getFileAndDirectoryFromPath(path).name, + fileDirPath = $mmFS.concatenatePaths(entry.fullPath, path); + + // Check if file/dir exists. + fs.stat(fileDirPath, function(err) { + if (err) { + if (options.create) { + // File/Dir probably doesn't exist, create it. + create(function(error2) { + if (!error2) { + // File created successfully, return it. + success(); + } else if (error2.code === 'EEXIST') { + // File exists, success. + success(); + } else if (error2.code === 'ENOENT') { + // Seems like the parent doesn't exist, create it too. + var parent = fileDirPath.substring(0, fileDirPath.lastIndexOf('/')); + + if (parent) { + entry.getDirectory(parent, options, function() { + // Parent created, try to create the child again. + create(function(error3) { + if (!error3) { + success(); + } else { + errorCallback && errorCallback(error3); + } + }); + }, errorCallback); + } else { + errorCallback && errorCallback(error2); + } + } else { + errorCallback && errorCallback(error2); + } + }); + } else { + errorCallback && errorCallback(err); + } + } else { + success(); + } + }); + + // Success, return the DirectoryEntry or FileEntry. + function success() { + var constructorFn = isDir ? DirectoryEntry : FileEntry; + successCallback(new constructorFn(filename, fileDirPath)); + } + + // Create the file/dir. + function create(done) { + if (isDir) { + fs.mkdir(fileDirPath, done); + } else { + fs.writeFile(fileDirPath, '', done); + } + } + } + + /** + * Load the emulation of the Cordova plugin. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorFile#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + var deferred = $q.defer(), + basePath; + + $window.requestFileSystem = $window.requestFileSystem || $window.webkitRequestFileSystem; + $window.resolveLocalFileSystemURL = $window.resolveLocalFileSystemURL || $window.webkitResolveLocalFileSystemURL; + $window.LocalFileSystem = { + PERSISTENT: 1 + }; + + if ($mmApp.isDesktop()) { + var fs = require('fs'), + app = require('electron').remote.app; + + emulateCordovaFileForDesktop(fs); + + // Initialize File System. Get the path to use. + basePath = app.getPath('documents') || app.getPath('home'); + if (!basePath) { + deferred.reject('Cannot calculate base path for file system.'); + return; + } + + basePath = $mmFS.concatenatePaths(basePath.replace(/\\/g, '/'), mmCoreConfigConstants.app_id) + '/'; + + // Create the folder if needed. + fs.mkdir(basePath, function(e) { + if (!e || (e && e.code === 'EEXIST')) { + // Create successful or it already exists. Resolve. + $mmFS.setHTMLBasePath(basePath); + deferred.resolve(); + } else { + deferred.reject('Error creating base path.'); + } + }); + } else { + // It's browser, request a quota to use. Request 500MB. + $window.webkitStorageInfo.requestQuota(PERSISTENT, 500 * 1024 * 1024, function(granted) { + $window.requestFileSystem(PERSISTENT, granted, function(entry) { + basePath = entry.root.toURL(); + $mmFS.setHTMLBasePath(basePath); + deferred.resolve(); + }, deferred.reject); + }, deferred.reject); + } + + return deferred.promise; + }; + + return self; +}); diff --git a/www/core/components/emulator/services/filetransfer.js b/www/core/components/emulator/services/filetransfer.js new file mode 100644 index 00000000000..19101c56007 --- /dev/null +++ b/www/core/components/emulator/services/filetransfer.js @@ -0,0 +1,286 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova FileTransfer plugin in desktop apps and in browser. + * + * @ngdoc service + * @name $mmEmulatorFileTransfer + * @module mm.core.emulator + */ +.factory('$mmEmulatorFileTransfer', function($log, $q, $mmFS, $window, $mmApp) { + + $log = $log.getInstance('$mmEmulatorFileTransfer'); + + var self = {}, + fileTransferIdCounter = 0; + + /** + * Given a URL, check if it has a credentials in it and, if so, return them in a header object. + * This code is extracted from Cordova FileTransfer plugin. + * + * @param {String} urlString The URL to get the credentials from. + * @return {Object} The header with the credentials, null if no credentials. + */ + function getBasicAuthHeader(urlString) { + var header = null; + + // This is changed due to MS Windows doesn't support credentials in http uris + // so we detect them by regexp and strip off from result url. + if (window.btoa) { + var credentials = getUrlCredentials(urlString); + if (credentials) { + var authHeader = 'Authorization'; + var authHeaderValue = 'Basic ' + window.btoa(credentials); + + header = { + name : authHeader, + value : authHeaderValue + }; + } + } + + return header; + } + + /** + * Get the credentials from a URL. + * This code is extracted from Cordova FileTransfer plugin. + * + * @param {String} urlString The URL to get the credentials from. + * @return {String} Retrieved credentials. + */ + function getUrlCredentials(urlString) { + var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, + credentials = credentialsPattern.exec(urlString); + + return credentials && credentials[1]; + } + + /** + * Load the emulation of the Cordova plugin. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorFileTransfer#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + // Create the FileTransferError object. + $window.FileTransferError = function(code, source, target, status, body, exception) { + this.code = code || null; + this.source = source || null; + this.target = target || null; + this.http_status = status || null; + this.body = body || null; + this.exception = exception || null; + }; + + $window.FileTransferError.FILE_NOT_FOUND_ERR = 1; + $window.FileTransferError.INVALID_URL_ERR = 2; + $window.FileTransferError.CONNECTION_ERR = 3; + $window.FileTransferError.ABORT_ERR = 4; + $window.FileTransferError.NOT_MODIFIED_ERR = 5; + + // Create the FileTransfer object and its functions. + $window.FileTransfer = function() { + this._id = ++fileTransferIdCounter; + this.onprogress = null; // Optional callback. + }; + + $window.FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { + // Use XMLHttpRequest instead of $http to support onprogress and abort. + var basicAuthHeader = getBasicAuthHeader(source), + xhr = new XMLHttpRequest(), + isDesktop = $mmApp.isDesktop(), + deferred = $q.defer(), // Use a promise to make sure only one callback is called. + headers = null; + + deferred.promise.then(function(entry) { + successCallback && successCallback(entry); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + this.xhr = xhr; + this.deferred = deferred; + this.source = source; + this.target = target; + + if (basicAuthHeader) { + source = source.replace(getUrlCredentials(source) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + headers = options.headers || null; + } + + // Prepare the request. + xhr.open('GET', source, true); + xhr.responseType = isDesktop ? 'arraybuffer' : 'blob'; + angular.forEach(headers, function(value, name) { + xhr.setRequestHeader(name, value); + }); + + if (this.onprogress) { + xhr.onprogress = this.onprogress; + } + + xhr.onerror = function() { + deferred.reject(new FileTransferError(-1, source, target, xhr.status, xhr.statusText)); + }; + + xhr.onload = function() { + // Finished dowloading the file. + var response = xhr.response; + if (!response) { + deferred.reject(); + } else { + var basePath = $mmFS.getBasePathInstant(); + target = target.replace(basePath, ''); // Remove basePath from the target. + target = target.replace(/%20/g, ' '); // Replace all %20 with spaces. + if (isDesktop) { + // In desktop we need to convert the arraybuffer into a Buffer. + response = Buffer.from(new Uint8Array(response)); + } + + $mmFS.writeFile(target, response).then(deferred.resolve, deferred.reject); + } + }; + + xhr.send(); + }; + + $window.FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { + var fileKey = null, + fileName = null, + mimeType = null, + params = null, + headers = null, + httpMethod = null, + deferred = $q.defer(), // Use a promise to make sure only one callback is called. + basicAuthHeader = getBasicAuthHeader(server), + that = this; + + deferred.promise.then(function(result) { + successCallback && successCallback(result); + }).catch(function(error) { + errorCallback && errorCallback(error); + }); + + if (basicAuthHeader) { + server = server.replace(getUrlCredentials(server) + '@', ''); + + options = options || {}; + options.headers = options.headers || {}; + options.headers[basicAuthHeader.name] = basicAuthHeader.value; + } + + if (options) { + fileKey = options.fileKey; + fileName = options.fileName; + mimeType = options.mimeType; + headers = options.headers; + httpMethod = options.httpMethod || 'POST'; + + if (httpMethod.toUpperCase() == "PUT"){ + httpMethod = 'PUT'; + } else { + httpMethod = 'POST'; + } + + if (options.params) { + params = options.params; + } else { + params = {}; + } + } + + // Add fileKey and fileName to the headers. + headers = headers || {}; + if (!headers['Content-Disposition']) { + headers['Content-Disposition'] = 'form-data;' + (fileKey ? ' name="' + fileKey + '";' : '') + + (fileName ? ' filename="' + fileName + '"' : '') + } + + // For some reason, adding a Content-Type header with the mimeType makes the request fail (it doesn't detect + // the token in the params). Don't include this header, and delete it if it's supplied. + delete headers['Content-Type']; + + // Get the file to upload. + $mmFS.getFile(filePath).then(function(fileEntry) { + return $mmFS.getFileObjectFromFileEntry(fileEntry); + }).then(function(file) { + // Use XMLHttpRequest instead of $http to support onprogress and abort. + var xhr = new XMLHttpRequest(); + xhr.open(httpMethod || 'POST', server); + angular.forEach(headers, function(value, name) { + // Filter "unsafe" headers. + if (name != 'Connection') { + xhr.setRequestHeader(name, value); + } + }); + + if (that.onprogress) { + xhr.onprogress = that.onprogress; + } + + that.xhr = xhr; + that.deferred = deferred; + this.source = filePath; + this.target = server; + + xhr.onerror = function() { + deferred.reject(new FileTransferError(-1, filePath, server, xhr.status, xhr.statusText)); + }; + + xhr.onload = function() { + // Finished uploading the file. + deferred.resolve({ + bytesSent: file.size, + responseCode: xhr.status, + response: xhr.response, + objectId: '' + }); + }; + + // Create a form data to send params and the file. + var fd = new FormData(); + angular.forEach(params, function(value, name) { + fd.append(name, value); + }); + fd.append('file', file); + + xhr.send(fd); + }).catch(deferred.reject); + }; + + $window.FileTransfer.prototype.abort = function() { + if (this.xhr) { + this.xhr.abort(); + this.deferred.reject(new FileTransferError(FileTransferError.ABORT_ERR, this.source, this.target)); + } + }; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/globalization.js b/www/core/components/emulator/services/globalization.js new file mode 100644 index 00000000000..3b612bc905a --- /dev/null +++ b/www/core/components/emulator/services/globalization.js @@ -0,0 +1,130 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova Globalization plugin in desktop apps and in browser. + * + * @ngdoc service + * @name $mmEmulatorGlobalization + * @module mm.core.emulator + */ +.factory('$mmEmulatorGlobalization', function($log, $q, $window, $mmApp) { + + $log = $log.getInstance('$mmEmulatorGlobalization'); + + var self = {}; + + /** + * Get the current locale. + * + * @return {String} Locale. + */ + function getLocale() { + var navLang = navigator.userLanguage || navigator.language; + try { + if ($mmApp.isDesktop()) { + var locale = require('electron').remote.app.getLocale(); + return locale || navLang; + } else { + return navLang; + } + } catch(ex) { + // Something went wrong, return browser language. + return navLang; + } + } + + /** + * Load the emulation of the Cordova plugin. + * Only some of the functions are supported. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorGlobalization#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + // Create the GlobalizationError object. + $window.GlobalizationError = function(code, message) { + this.code = code || null; + this.message = message || ''; + }; + + $window.GlobalizationError.UNKNOWN_ERROR = 0; + $window.GlobalizationError.FORMATTING_ERROR = 1; + $window.GlobalizationError.PARSING_ERROR = 2; + $window.GlobalizationError.PATTERN_ERROR = 3; + + // Create the Globalization object. + navigator.globalization = { + getLocaleName: function(successCallback, errorCallback) { + var locale = getLocale(); + if (locale) { + successCallback && successCallback({value: locale}); + } else { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Cannot get language'); + errorCallback && errorCallback(error); + } + }, + numberToString: function(number, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + isDayLightSavingsTime: function(date, successCallback, errorCallback) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getFirstDayOfWeek: function(successCallback, errorCallback) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getDateNames: function (successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getDatePattern: function(successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getNumberPattern: function(successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + getCurrencyPattern: function(currencyCode, successCallback, errorCallback) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + stringToDate: function(dateString, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + stringToNumber: function(numberString, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + dateToString: function(date, successCallback, errorCallback, options) { + var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); + errorCallback && errorCallback(error); + }, + }; + + navigator.globalization.getPreferredLanguage = navigator.globalization.getLocaleName; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/inappbrowser.js b/www/core/components/emulator/services/inappbrowser.js new file mode 100644 index 00000000000..93b40a8690c --- /dev/null +++ b/www/core/components/emulator/services/inappbrowser.js @@ -0,0 +1,161 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova InAppBrowser plugin in desktop apps. + * + * @ngdoc service + * @name $mmEmulatorInAppBrowser + * @module mm.core.emulator + */ +.factory('$mmEmulatorInAppBrowser', function($log, $q, $mmFS, $window, $mmApp) { + + $log = $log.getInstance('$mmEmulatorInAppBrowser'); + + var self = {}; + + /** + * Load the emulation of the Cordova plugin. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorInAppBrowser#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + if (!$mmApp.isDesktop()) { + return $q.when(); + } + + var BrowserWindow = require('electron').remote.BrowserWindow, + screen = require('electron').screen; + + // Redefine window open to be able to have full control over the new window. + $window.open = function(url, frameName, features) { + var width = 800, + height = 600, + display, + newWindow, + listeners = {}; + + if (screen) { + display = screen.getPrimaryDisplay(); + if (display && display.workArea) { + width = display.workArea.width || width; + height = display.workArea.height || height; + } + } + + newWindow = new BrowserWindow({ + width: width, + height: height + }); + newWindow.loadURL(url); + + // Add the missing functions that InAppBrowser supports but BrowserWindow doesn't. + newWindow.addEventListener = function(name, callback) { + var that = this; + + switch (name) { + case 'loadstart': + that.webContents.addListener('did-start-loading', received); + break; + + case 'loadstop': + that.webContents.addListener('did-finish-load', received); + break; + + case 'loaderror': + that.webContents.addListener('did-fail-load', received); + break; + + case 'exit': + that.addListener('close', received); + break; + } + + // Store the received function instance to be able to remove the listener. + listeners[callback] = received; + + function received(event) { + try { + event.url = that.getURL(); + callback(event); + } catch(ex) {} + } + }; + + newWindow.removeEventListener = function(name, callback) { + var that = this, + listener = listeners[callback]; + + switch (name) { + case 'loadstart': + that.webContents.removeListener('did-start-loading', listener); + break; + + case 'loadstop': + that.webContents.removeListener('did-finish-load', listener); + break; + + case 'loaderror': + that.webContents.removeListener('did-fail-load', listener); + break; + + case 'exit': + that.removeListener('close', listener); + break; + } + }; + + newWindow.executeScript = function(details, callback) { + var that = this; + + if (details.code) { + that.webContents.executeJavaScript(details.code, false, callback); + } else if (details.file) { + $mmFS.readFile(details.file).then(function(code) { + that.webContents.executeJavaScript(code, false, callback); + }).catch(callback); + } else { + callback('executeScript requires exactly one of code or file to be specified'); + } + }; + + newWindow.insertCSS = function(details, callback) { + var that = this; + + if (details.code) { + that.webContents.insertCSS(details.code); + callback(); + } else if (details.file) { + $mmFS.readFile(details.file).then(function(code) { + that.webContents.insertCSS(code); + callback(); + }).catch(callback); + } else { + callback('insertCSS requires exactly one of code or file to be specified'); + } + }; + + return newWindow; + }; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/localnotif.js b/www/core/components/emulator/services/localnotif.js new file mode 100644 index 00000000000..1e2c7fc3ede --- /dev/null +++ b/www/core/components/emulator/services/localnotif.js @@ -0,0 +1,542 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +.constant('mmCoreDesktopLocalNotificationsStore', 'desktop_local_notifications') + +.config(function($mmAppProvider, mmCoreDesktopLocalNotificationsStore) { + var stores = [ + { + name: mmCoreDesktopLocalNotificationsStore, // Store to schedule notifications in desktop apps. + keyPath: 'id', + indexes: [ + { + name: 'triggered' + } + ] + } + ]; + $mmAppProvider.registerStores(stores); +}) + +/** + * This service handles the emulation of the local notifications Cordova plugin in desktop apps. + * + * @ngdoc service + * @name $mmEmulatorLocalNotifications + * @module mm.core.emulator + */ +.factory('$mmEmulatorLocalNotifications', function($log, $q, $mmApp, $mmUtil, $timeout, $interval, $rootScope, + $cordovaLocalNotification, mmCoreDesktopLocalNotificationsStore, mmCoreSecondsYear, mmCoreSecondsDay, + mmCoreSecondsHour, mmCoreSecondsMinute) { + + $log = $log.getInstance('$mmEmulatorLocalNotifications'); + + var self = {}, + scheduled = {}, + triggered = {}, + defaults = { + text: '', + title: '', + sound: '', + badge: 0, + id: 0, + data: undefined, + every: undefined, + at: undefined + }; + + /** + * Cancel a local notification. + * + * @param {Number} id Notification ID. + * @param {Boolean} omitEvent If true, the clear/cancel event won't be triggered. + * @param {[type]} eventName Name of the event to trigger. + * @return {Void} + */ + function cancelNotification(id, omitEvent, eventName) { + var notification = scheduled[id].notification; + + $timeout.cancel(scheduled[id].timeout); + $interval.cancel(scheduled[id].interval); + delete scheduled[id]; + delete triggered[id]; + + removeNotification(id); + + if (!omitEvent) { + $rootScope.$broadcast(eventName, notification, 'foreground'); + } + } + + /** + * Convert a list of IDs to numbers. + * Code extracted from the Cordova plugin. + * + * @param {Mixed[]} ids List of IDs. + * @return {Number[]} List of IDs as numbers. + */ + function convertIds(ids) { + var convertedIds = []; + + for (var i = 0; i < ids.length; i++) { + convertedIds.push(Number(ids[i])); + } + + return convertedIds; + } + + /** + * Convert the notification options to their required type. + * Code extracted from the Cordova plugin. + * + * @param {Object} options Notification options. + * @return {Object} Converted options. + */ + function convertProperties(options) { + if (options.id) { + if (isNaN(options.id)) { + options.id = defaults.id; + $log.warn('Id is not a number: ' + options.id); + } else { + options.id = Number(options.id); + } + } + + if (options.title) { + options.title = options.title.toString(); + } + + if (options.text) { + options.text = options.text.toString(); + } + + if (options.badge) { + if (isNaN(options.badge)) { + options.badge = defaults.badge; + $log.warn('Badge number is not a number: ' + options.id); + } else { + options.badge = Number(options.badge); + } + } + + if (options.at) { + if (typeof options.at == 'object') { + options.at = options.at.getTime(); + } + + options.at = Math.round(options.at / 1000); + } + + if (typeof options.data == 'object') { + options.data = JSON.stringify(options.data); + } + + return options; + } + + /** + * Get all the notification stored in local DB. + * + * @return {Promise} Promise resolved with the notifications. + */ + function getAllNotifications() { + return $mmApp.getDB().getAll(mmCoreDesktopLocalNotificationsStore); + } + + /** + * Get a set of notifications. If ids isn't specified, return all the notifications. + * + * @param {Number[]} [ids] Ids of notifications to get. If not specified, get all notifications. + * @param {Boolean} [getScheduled] Get scheduled notifications. + * @param {Boolean} [getTriggered] Get triggered notifications. + * @return {Object[]} List of notifications. + */ + function getNotifications(ids, getScheduled, getTriggered) { + var notifications = []; + + if (getScheduled) { + angular.forEach(scheduled, function(entry, id) { + if (!ids || ids.indexOf(id) != -1) { + notifications.push(entry.notification); + } + }); + } + + if (getTriggered) { + angular.forEach(triggered, function(notification, id) { + if ((!getScheduled || !scheduled[id]) && (!ids || ids.indexOf(id) != -1)) { + notifications.push(notification); + } + }); + } + + return notifications; + } + + /** + * Given an object of options and a list of properties, return the first property that exists. + * Code extracted from the Cordova plugin. + * + * @param {Object} options Notification options. + * @return {Mixed} First value found. + */ + function getValueFor(options) { + var keys = Array.apply(null, arguments).slice(1); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (options.hasOwnProperty(key)) { + return options[key]; + } + } + } + + /** + * Load the emulation of the Cordova plugin. Only for desktop apps. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorLocalNotifications#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + if (!$mmApp.isDesktop()) { + return $q.when(); + } + + // Redefine $cordovaLocalNotification methods instead of the core plugin (window.cordova.plugins.notification.local) + // because creating window.cordova breaks the app (it thinks it's a real device). + $cordovaLocalNotification.schedule = function(notifications, scope, isUpdate) { + var promises = []; + + notifications = Array.isArray(notifications) ? notifications : [notifications]; + + angular.forEach(notifications, function(notification) { + mergeWithDefaults(notification); + convertProperties(notification); + + // Cancel current notification if exists. + $cordovaLocalNotification.cancel(notification.id, null, true); + + // Store the notification in the scheduled list and in the DB. + scheduled[notification.id] = { + notification: notification + }; + promises.push(storeNotification(notification, false)); + + // Schedule the notification. + var toTrigger = notification.at * 1000 - Date.now(); + scheduled[notification.id].timeout = $timeout(function trigger() { + // Trigger the notification. + var notifInstance = new Notification(notification.title, { + body: notification.text + }); + + // Store the notification as triggered. Don't remove it from scheduled, it's how the plugin works. + triggered[notification.id] = notification; + storeNotification(notification, true); + + // Launch the trigger event. + $rootScope.$broadcast('$cordovaLocalNotification:trigger', notification, 'foreground'); + + // Listen for click events. + notifInstance.onclick = function() { + $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + }; + + if (notification.every && scheduled[notification.id] && !scheduled[notification.id].interval) { + var interval = parseInterval(notification.every); + if (interval > 0) { + scheduled[notification.id].interval = $interval(trigger, interval); + } + } + }, toTrigger); + + // Launch the scheduled/update event. + var eventName = isUpdate ? 'update' : 'schedule'; + $rootScope.$broadcast('$cordovaLocalNotification:' + eventName, notification, 'foreground'); + }); + + return $q.when(); + }; + + $cordovaLocalNotification.update = function(notifications) { + // Just schedule them again, since scheduling cancels the existing one. + return $cordovaLocalNotification.schedule(notifications, null, true); + }; + + $cordovaLocalNotification.clear = function(ids, scope, omitEvent) { + var promises = []; + + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + + // Clear the notifications. + angular.forEach(ids, function(id) { + // Cancel only the notifications that aren't repeating. + if (scheduled[id] && scheduled[id].notification && !scheduled[id].notification.every) { + promises.push(cancelNotification(id, omitEvent, '$cordovaLocalNotification:clear')); + } + }); + + return $q.all(promises); + }; + + $cordovaLocalNotification.clearAll = function(scope, omitEvent) { + var ids = Object.keys(scheduled); + return $cordovaLocalNotification.clear(ids, scope, omitEvent).then(function() { + if (!omitEvent) { + $rootScope.$broadcast('$cordovaLocalNotification:clearall', 'foreground'); + } + }); + }; + + $cordovaLocalNotification.cancel = function(ids, scope, omitEvent) { + var promises = []; + + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + + // Cancel the notifications. + angular.forEach(ids, function(id) { + if (scheduled[id]) { + promises.push(cancelNotification(id, omitEvent, '$cordovaLocalNotification:cancel')); + } + }); + + return $q.all(promises); + }; + + $cordovaLocalNotification.cancelAll = function(scope, omitEvent) { + var ids = Object.keys(scheduled); + return $cordovaLocalNotification.cancel(ids, scope, omitEvent).then(function() { + if (!omitEvent) { + $rootScope.$broadcast('$cordovaLocalNotification:cancelall', 'foreground'); + } + }); + }; + + $cordovaLocalNotification.isPresent = function(id) { + return $q.when(!!scheduled[id] || !!triggered[notification.id]); + }; + + $cordovaLocalNotification.isScheduled = function(id) { + return $q.when(!!scheduled[id]); + }; + + $cordovaLocalNotification.isTriggered = function(id) { + return $q.when(!!triggered[notification.id]); + }; + + $cordovaLocalNotification.hasPermission = function() { + return $q.when(true); + }; + + $cordovaLocalNotification.registerPermission = function() { + return $q.when(true); + }; + + $cordovaLocalNotification.getAllIds = function() { + return $q.when($mmUtil.mergeArraysWithoutDuplicates(Object.keys(scheduled), Object.keys(triggered))); + }; + $cordovaLocalNotification.getIds = $cordovaLocalNotification.getAllIds; + + $cordovaLocalNotification.getScheduledIds = function() { + return $q.when(Object.keys(scheduled)); + }; + + $cordovaLocalNotification.getTriggeredIds = function() { + return $q.when(Object.keys(triggered)); + }; + + $cordovaLocalNotification.get = function(ids) { + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + return $q.when(getNotifications(ids, true, true)); + }; + + $cordovaLocalNotification.getAll = function() { + return $q.when(getNotifications(null, true, true)); + }; + + $cordovaLocalNotification.getScheduled = function(ids) { + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + return $q.when(getNotifications(ids, true, false)); + }; + + $cordovaLocalNotification.getAllScheduled = function() { + return $q.when(getNotifications(null, true, false)); + }; + + $cordovaLocalNotification.getTriggered = function(ids) { + ids = Array.isArray(ids) ? ids : [ids]; + ids = convertIds(ids); + return $q.when(getNotifications(ids, false, true)); + }; + + $cordovaLocalNotification.getAllTriggered = function() { + return $q.when(getNotifications(null, false, true)); + }; + + $cordovaLocalNotification.getDefaults = function() { + return defaults; + }; + + $cordovaLocalNotification.setDefaults = function(newDefaults) { + for (var key in defaults) { + if (newDefaults.hasOwnProperty(key)) { + defaults[key] = newDefaults[key]; + } + } + }; + + // App is being loaded, re-schedule all the notifications that were scheduled before. + return getAllNotifications().catch(function() { + return []; + }).then(function(notifications) { + angular.forEach(notifications, function(notification) { + if (notification.triggered) { + // Notification was triggered already, store it in memory but don't schedule it again. + delete notification.triggered; + scheduled[notification.id] = { + notification: notification + }; + triggered[notification.id] = notification; + } else { + // Schedule the notification again unless it should have been triggered more than an hour ago. + delete notification.triggered; + notification.at = notification.at * 1000; + if (notification.at - Date.now() > - mmCoreSecondsHour * 1000) { + $cordovaLocalNotification.schedule(notification); + } + } + }); + }); + }; + + /** + * Merge notification options with default values. + * Code extracted from the Cordova plugin. + * + * @param {Object} options Notification options. + * @return {Object} Merged options. + */ + function mergeWithDefaults(options) { + options.at = getValueFor(options, 'at', 'firstAt', 'date'); + options.text = getValueFor(options, 'text', 'message'); + options.data = getValueFor(options, 'data', 'json'); + + if (defaults.hasOwnProperty('autoClear')) { + options.autoClear = getValueFor(options, 'autoClear', 'autoCancel'); + } + + if (options.autoClear !== true && options.ongoing) { + options.autoClear = false; + } + + if (options.at === undefined || options.at === null) { + options.at = new Date(); + } + + for (var key in defaults) { + if (options[key] === null || options[key] === undefined) { + if (options.hasOwnProperty(key) && ['data','sound'].indexOf(key) > -1) { + options[key] = undefined; + } else { + options[key] = defaults[key]; + } + } + } + + for (key in options) { + if (!defaults.hasOwnProperty(key)) { + delete options[key]; + $log.warn('Unknown property: ' + key); + } + } + + return options; + } + + /** + * Parse a interval and convert it to a number of milliseconds (0 if not valid). + * Code extracted from the Cordova plugin. + * + * @param {String} every Interval to convert. + * @return {Number} Number of milliseconds of the interval- + */ + function parseInterval(every) { + var interval; + + every = String(every).toLowerCase(); + + if (!every || every == 'undefined') { + interval = 0; + } else if (every == 'second') { + interval = 1000; + } else if (every == 'minute') { + interval = mmCoreSecondsMinute * 1000; + } else if (every == 'hour') { + interval = mmCoreSecondsHour * 1000; + } else if (every == 'day') { + interval = mmCoreSecondsDay * 1000; + } else if (every == 'week') { + interval = mmCoreSecondsDay * 7 * 1000; + } else if (every == 'month') { + interval = mmCoreSecondsDay * 31 * 1000; + } else if (every == 'quarter') { + interval = mmCoreSecondsHour * 2190 * 1000; + } else if (every == 'year') { + interval = mmCoreSecondsYear * 1000; + } else { + interval = parseInt(every, 10); + if (isNaN(interval)) { + interval = 0; + } else { + interval *= 60000; + } + } + + return interval; + } + + /** + * Remove a notification from local DB. + * + * @param {Number} id ID of the notification. + * @return {Promise} Promise resolved when done. + */ + function removeNotification(id) { + return $mmApp.getDB().remove(mmCoreDesktopLocalNotificationsStore, id); + } + + /** + * Store a notification in local DB. + * + * @param {Object} notification Notification to store. + * @param {Boolean} triggered Whether the notification has been triggered. + * @return {Promise} Promise resolved when stored. + */ + function storeNotification(notification, triggered) { + notification = angular.copy(notification); + notification.triggered = !!triggered; + return $mmApp.getDB().insert(mmCoreDesktopLocalNotificationsStore, notification); + } + + return self; +}); diff --git a/www/core/components/emulator/services/pushnotifications.js b/www/core/components/emulator/services/pushnotifications.js new file mode 100644 index 00000000000..81942971df6 --- /dev/null +++ b/www/core/components/emulator/services/pushnotifications.js @@ -0,0 +1,116 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova PushNotifications plugin. + * + * @ngdoc service + * @name $mmEmulatorPushNotifications + * @module mm.core.emulator + */ +.factory('$mmEmulatorPushNotifications', function($log, $q, $window, $mmApp) { + + $log = $log.getInstance('$mmEmulatorPushNotifications'); + + var self = {}; + + /** + * Load the emulation of the Cordova plugin. + * Only some functions are supported. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorPushNotifications#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + // Create the PushNotification object. + var PushNotification = function(options) {}; + + PushNotification.prototype.unregister = function(successCallback, errorCallback, options) { + errorCallback && errorCallback('Unregister is only supported in mobile devices'); + }; + + PushNotification.prototype.subscribe = function(topic, successCallback, errorCallback) { + errorCallback && errorCallback('Suscribe is only supported in mobile devices'); + }; + + PushNotification.prototype.unsubscribe = function(topic, successCallback, errorCallback) { + errorCallback && errorCallback('Unsuscribe is only supported in mobile devices'); + }; + + PushNotification.prototype.setApplicationIconBadgeNumber = function(successCallback, errorCallback, badge) { + if (!$mmApp.isDesktop()) { + errorCallback && errorCallback('setApplicationIconBadgeNumber is not supported in browser'); + return; + } + + try { + var app = require('electron').remote.app; + if (app.setBadgeCount(badge)) { + successCallback && successCallback(); + } else { + errorCallback && errorCallback(); + } + } catch(ex) { + errorCallback && errorCallback(ex); + } + }; + + PushNotification.prototype.getApplicationIconBadgeNumber = function(successCallback, errorCallback) { + if (!$mmApp.isDesktop()) { + errorCallback && errorCallback('getApplicationIconBadgeNumber is not supported in browser'); + return; + } + + try { + var app = require('electron').remote.app; + successCallback && successCallback(app.getBadgeCount()); + } catch(ex) { + errorCallback && errorCallback(ex); + } + }; + + PushNotification.prototype.clearAllNotifications = function(successCallback, errorCallback) { + errorCallback && errorCallback('clearAllNotifications is only supported in mobile devices'); + }; + + PushNotification.prototype.on = function(eventName, callback) {}; + PushNotification.prototype.off = function(eventName, handle) {}; + PushNotification.prototype.emit = function() {}; + + PushNotification.prototype.finish = function(successCallback, errorCallback, id) { + errorCallback && errorCallback('finish is only supported in mobile devices'); + }; + + // Create the visible PushNotification object. + $window.PushNotification = { + init: function(options) { + return new PushNotification(options); + }, + + hasPermission: function(successCallback, errorCallback) { + errorCallback && errorCallback('hasPermission is only supported in mobile devices'); + }, + + PushNotification: PushNotification + }; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/services/zip.js b/www/core/components/emulator/services/zip.js new file mode 100644 index 00000000000..1e736beced8 --- /dev/null +++ b/www/core/components/emulator/services/zip.js @@ -0,0 +1,89 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova Zip plugin in desktop apps and in browser. + * + * @ngdoc service + * @name $mmEmulatorZip + * @module mm.core.emulator + */ +.factory('$mmEmulatorZip', function($log, $q, $mmFS, $window) { + + $log = $log.getInstance('$mmEmulatorZip'); + + var self = {}; + + /** + * Load the emulation of the Cordova plugin. + * Only support the unzip function, the rest of functions won't be supported for now. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorZip#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + $window.zip = { + unzip: function(source, destination, callback, progressCallback) { + // Remove basePath from the source and destination. Also, replace all %20 with spaces. + var basePath = $mmFS.getBasePathInstant(); + source = source.replace(basePath, '').replace(/%20/g, ' '); + destination = destination.replace(basePath, '').replace(/%20/g, ' '); + + $mmFS.readFile(source, $mmFS.FORMATARRAYBUFFER).then(function(data) { + var zip = new JSZip(data), + promises = [], + loaded = 0, + total = Object.keys(zip.files).length; + + angular.forEach(zip.files, function(file, name) { + var filePath = $mmFS.concatenatePaths(destination, name), + type, + promise; + + if (!file.dir) { + // It's a file. Get the mimetype and write the file. + type = $mmFS.getMimeType($mmFS.getFileExtension(name)); + promise = $mmFS.writeFile(filePath, new Blob([file.asArrayBuffer()], {type: type})); + } else { + // It's a folder, create it if it doesn't exist. + promise = $mmFS.createDir(filePath); + } + + promises.push(promise.then(function() { + // File unzipped, call the progress. + loaded++; + progressCallback && progressCallback({loaded: loaded, total: total}); + })); + }); + + return $q.all(promises).then(function() { + // Success. + callback(0); + }); + }).catch(function() { + // Error. + callback(-1); + }); + } + }; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/lib/emulator.js b/www/core/lib/emulator.js deleted file mode 100644 index a3b0e1d14f4..00000000000 --- a/www/core/lib/emulator.js +++ /dev/null @@ -1,1705 +0,0 @@ -// (C) Copyright 2015 Martin Dougiamas -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -angular.module('mm.core') - -.constant('mmDesktopLocalNotificationsStore', 'desktop_local_notifications') - -.config(function($mmAppProvider, mmDesktopLocalNotificationsStore) { - var stores = [ - { - name: mmDesktopLocalNotificationsStore, // Store to schedule notifications in desktop apps. - keyPath: 'id', - indexes: [ - { - name: 'triggered' - } - ] - } - ]; - $mmAppProvider.registerStores(stores); -}) - -/** - * @ngdoc service - * @name $mmEmulatorManager - * @module mm.core - * @description - * This service handles the emulation of Cordova plugins in other environments like browser. - */ -.factory('$mmEmulatorManager', function($log, $q, $mmFS, $window, $mmApp, $mmUtil, mmCoreConfigConstants, $cordovaClipboard, - $cordovaLocalNotification, mmDesktopLocalNotificationsStore, $timeout, $rootScope, $interval, - mmCoreSecondsYear, mmCoreSecondsDay, mmCoreSecondsHour, mmCoreSecondsMinute) { - - $log = $log.getInstance('$mmEmulatorManager'); - - var self = {}, - fileTransferIdCounter = 0, - basePath; - - /** - * Given a URL, check if it has a credentials in it and, if so, return them in a header object. - * This code is extracted from Cordova FileTransfer plugin. - * - * @param {String} urlString The URL to get the credentials from. - * @return {Object} The header with the credentials, null if no credentials. - */ - function getBasicAuthHeader(urlString) { - var header = null; - - // This is changed due to MS Windows doesn't support credentials in http uris - // so we detect them by regexp and strip off from result url. - if (window.btoa) { - var credentials = getUrlCredentials(urlString); - if (credentials) { - var authHeader = "Authorization"; - var authHeaderValue = "Basic " + window.btoa(credentials); - - header = { - name : authHeader, - value : authHeaderValue - }; - } - } - - return header; - } - - /** - * Emulate Cordova clipboard plugin for browser and NodeJS. - * - * @return {Void} - */ - function emulateCordovaClipboard() { - var isDesktop = $mmApp.isDesktop(), - clipboard, - copyTextarea; - - if (isDesktop) { - clipboard = require('electron').clipboard; - } else { - // In browser the text must be selected in order to copy it. Create a hidden textarea to put the text in it. - copyTextarea = document.createElement('textarea'); - angular.element(copyTextarea).addClass('mm-browser-copy-area'); - copyTextarea.setAttribute('aria-hidden', 'true'); - document.body.append(copyTextarea); - } - - // We need to redefine $cordovaClipboard methods instead of the core plugin (window.cordova.plugins.clipboard) - // because creating window.cordova breaks the app (it thinks it's a real device). - $cordovaClipboard.copy = function(text) { - var deferred = $q.defer(); - - if (isDesktop) { - clipboard.writeText(text); - deferred.resolve(); - } else { - // Put the text in the hidden textarea and select it. - copyTextarea.innerHTML = text; - copyTextarea.select(); - - try { - if (document.execCommand('copy')) { - deferred.resolve(); - } else { - deferred.reject(); - } - } catch (err) { - deferred.reject(); - } - - copyTextarea.innerHTML = ''; - } - - return deferred.promise; - }; - - $cordovaClipboard.paste = function() { - var deferred = $q.defer(); - - if (isDesktop) { - deferred.resolve(clipboard.readText()); - } else { - // Paste the text in the hidden textarea and get it. - copyTextarea.innerHTML = ''; - copyTextarea.select(); - - try { - if (document.execCommand('paste')) { - deferred.resolve(copyTextarea.innerHTML); - } else { - deferred.reject(); - } - } catch (err) { - deferred.reject(); - } - - copyTextarea.innerHTML = ''; - } - - return deferred.promise; - }; - } - - /** - * Emulate Cordova file plugin using NodeJS functions. This is only for NodeJS environments, - * browser works with the default resolveLocalFileSystemURL. - * - * @return {Void} - */ - function emulateCordovaFile() { - if (!$mmApp.isDesktop()) { - return; - } - - var fs = require('fs'); - - // Create the Entry object, parent of DirectoryEntry and FileEntry. - // It includes fileSystem and nativeURL as the Cordova object, but they aren't used. - $window.Entry = function(isFile, isDirectory, name, fullPath, fileSystem, nativeURL) { - this.isFile = !!isFile; - this.isDirectory = !!isDirectory; - this.name = name || ''; - this.fullPath = fullPath || ''; - this.filesystem = fileSystem || null; - this.nativeURL = nativeURL || null; - }; - - // Implement Entry functions. - $window.Entry.prototype.getMetadata = function(successCallback, errorCallback) { - fs.stat(this.fullPath, function(err, stats) { - if (err) { - errorCallback && errorCallback(err); - } else { - successCallback && successCallback({ - size: stats.size, - modificationTime: stats.mtime - }); - } - }); - }; - - $window.Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) { - // Not supported. - errorCallback('Not supported'); - }; - - $window.Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { - newName = newName || this.name; - - var srcPath = this.fullPath, - destPath = $mmFS.concatenatePaths(parent.fullPath, newName), - that = this; - - fs.rename(srcPath, destPath, function(err) { - if (err) { - errorCallback && errorCallback(err); - } else { - var constructorFn = that.isDirectory ? DirectoryEntry : FileEntry; - successCallback && successCallback(new constructorFn(newName, destPath)); - } - }); - }; - - $window.Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { - newName = newName || this.name; - - // There is no function to copy a file, read the source and write the dest. - var srcPath = this.fullPath, - destPath = $mmFS.concatenatePaths(parent.fullPath, newName), - reader = fs.createReadStream(srcPath), - writer = fs.createWriteStream(destPath), - deferred = $q.defer(), // Use a promise to make sure only one callback is called. - that = this; - - deferred.promise.then(function() { - var constructorFn = that.isDirectory ? DirectoryEntry : FileEntry; - successCallback && successCallback(new constructorFn(newName, destPath)); - }).catch(function(error) { - errorCallback && errorCallback(error); - }); - - reader.on('error', deferred.reject); - - writer.on('error', deferred.reject); - - writer.on('close', deferred.resolve); - - reader.pipe(writer); - }; - - $window.Entry.prototype.toInternalURL = function() { - return 'file://' + this.fullPath; - }; - - $window.Entry.prototype.toURL = function() { - return this.fullPath; - }; - - $window.Entry.prototype.remove = function(successCallback, errorCallback) { - var removeFn = this.isDirectory ? fs.rmdir : fs.unlink; - removeFn(this.fullPath, function(err) { - if (err < 0) { - errorCallback(err); - } else { - successCallback(); - } - }); - }; - - $window.Entry.prototype.getParent = function(successCallback, errorCallback) { - // Remove last slash if present and get the path of the parent. - var fullPath = this.fullPath.slice(-1) == '/' ? this.fullPath.slice(0, -1) : this.fullPath, - parentPath = fullPath.substr(0, fullPath.lastIndexOf('/')); - - // Check that parent exists. - fs.stat(parentPath, function(err, stats) { - if (err || !stats.isDirectory()) { - errorCallback && errorCallback(err); - } else { - var fileAndDir = $mmFS.getFileAndDirectoryFromPath(parentPath); - successCallback && successCallback(new DirectoryEntry(fileAndDir.name, parentPath)); - } - }); - }; - - // FileWriter to write data in files. Don't support abort, seek and truncate. - $window.FileWriter = function(file) { - this.fileName = ''; - this.length = 0; - if (file) { - this.localURL = file.localURL || file; - this.length = file.size || 0; - } - - this.position = 0; // Default is to write at the beginning of the file. - this.readyState = 0; // EMPTY - this.result = null; - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). - }; - - $window.FileWriter.prototype.write = function(data) { - var that = this; - if (data && data.toString() == '[object Blob]') { - // Can't write Blobs, convert it to a Buffer. - var reader = new FileReader(); - reader.onload = function() { - if (reader.readyState == 2) { - write(new Buffer(reader.result)); - } - }; - reader.readAsArrayBuffer(data); - } else if (data && data.toString() == '[object ArrayBuffer]') { - // Convert it to a Buffer. - write(Buffer.from(new Uint8Array(data))); - } else { - write(data); - } - - function write(data) { - fs.writeFile(that.localURL, data, function(err) { - if (err) { - that.onerror && that.onerror(err); - } else { - that.onwrite && that.onwrite(); - } - that.onwriteend && that.onwriteend(); - }); - - that.onwritestart && that.onwritestart(); - } - }; - - // DirectoryReader to read directory contents. - $window.DirectoryReader = function(localURL) { - this.localURL = localURL || null; - }; - - $window.DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { - var that = this; - - fs.readdir(this.localURL, function(err, files) { - if (err) { - errorCallback && errorCallback(err); - } else { - // Use try/catch because it includes sync calls. - try { - var entries = []; - for (var i = 0; i < files.length; i++) { - var fileName = files[i], - filePath = $mmFS.concatenatePaths(that.localURL, fileName), - stats = fs.statSync(filePath); // Use sync function to make code simpler. - - if (stats.isDirectory()) { - entries.push(new DirectoryEntry(fileName, filePath)); - } else if (stats.isFile()) { - entries.push(new FileEntry(fileName, filePath)); - } - } - - successCallback(entries); - } catch(ex) { - errorCallback && errorCallback(ex); - } - } - }); - }; - - // Create FileEntry and its functions, inheriting from Entry. - $window.FileEntry = function(name, fullPath, fileSystem, nativeURL) { - // Remove trailing slash if it is present. - if (fullPath && /\/$/.test(fullPath)) { - fullPath = fullPath.substring(0, fullPath.length - 1); - } - if (nativeURL && /\/$/.test(nativeURL)) { - nativeURL = nativeURL.substring(0, nativeURL.length - 1); - } - - $window.Entry.call(this, true, false, name, fullPath, fileSystem, nativeURL); - }; - - $window.FileEntry.prototype = Object.create($window.Entry.prototype); // Inherit Entry prototype. - - $window.FileEntry.prototype.createWriter = function(successCallback, errorCallback) { - this.file(function(file) { - successCallback && successCallback(new FileWriter(file)); - }, errorCallback); - }; - - $window.FileEntry.prototype.file = function(successCallback, errorCallback) { - var that = this; - - // Get the metadata to know the time modified. - this.getMetadata(function(metadata) { - // Read the file. - fs.readFile(that.fullPath, function(err, data) { - if (err) { - errorCallback && errorCallback(err); - } else { - // Create a File instance and return it. - data = Uint8Array.from(data).buffer; // Convert the NodeJS Buffer to ArrayBuffer. - var file = new File([data], that.name || '', { - lastModified: metadata.modificationTime || null, - type: $mmFS.getMimeType($mmFS.getFileExtension(that.name)) || null - }); - file.localURL = that.fullPath; - file.start = 0; - file.end = file.size; - - successCallback && successCallback(file); - } - }); - }, errorCallback); - }; - - // Create DirectoryEntry and its functions, inheriting from Entry. - $window.DirectoryEntry = function(name, fullPath, fileSystem, nativeURL) { - // Add trailing slash if it is missing. - if ((fullPath) && !/\/$/.test(fullPath)) { - fullPath += '/'; - } - if (nativeURL && !/\/$/.test(nativeURL)) { - nativeURL += '/'; - } - - $window.Entry.call(this, false, true, name, fullPath, fileSystem, nativeURL); - }; - - $window.DirectoryEntry.prototype = Object.create($window.Entry.prototype); // Inherit Entry prototype. - - $window.DirectoryEntry.prototype.createReader = function() { - return new DirectoryReader(this.fullPath); - }; - - $window.DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { - getDirOrFile(this, true, path, options, successCallback, errorCallback); - }; - - $window.DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { - // Use a promise to make sure only one callback is called. - var deferred = $q.defer(); - - deferred.promise.then(function() { - successCallback && successCallback(); - }).catch(function(error) { - errorCallback && errorCallback(error); - }); - - deleteRecursive(this.fullPath, function() { - deferred.resolve(); - }); - - // Delete a file or folder recursively. - function deleteRecursive(path, success) { - // Check if it exists. - fs.stat(path, function(err, stats) { - if (err) { - // File not found, reject. - deferred.reject(err); - } else if (stats.isFile()) { - // It's a file, remove it. - fs.unlink(path, function(err) { - if (err) { - // Error removing file, reject. - deferred.reject(err); - } else { - success && success(); - } - }); - } else { - // It's a directory, read the contents. - fs.readdir(path, function(err, files) { - if (err) { - // Error reading directory contents, reject. - deferred.reject(err); - } else if (!files.length) { - // No files to delete, delete the folder. - deleteEmptyFolder(path, success); - } else { - // Remove all the files and directories. - var removed = 0; - files.forEach(function(filename) { - deleteRecursive($mmFS.concatenatePaths(path, filename), function() { - // Success deleting the file/dir. - removed++; - if (removed == files.length) { - // All files deleted, delete the folder. - deleteEmptyFolder(path, success); - } - }); - }); - } - }); - } - }); - } - - // Delete an empty folder. - function deleteEmptyFolder(path, success) { - fs.rmdir(path, function(err) { - if (err) { - // Error removing directory, reject. - deferred.reject(err); - } else { - success && success(); - } - }); - } - }; - - $window.DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { - getDirOrFile(this, false, path, options, successCallback, errorCallback); - }; - - // Helper function for getDirectory and getFile. - function getDirOrFile(file, isDir, path, options, successCallback, errorCallback) { - var filename = $mmFS.getFileAndDirectoryFromPath(path).name, - fileDirPath = $mmFS.concatenatePaths(file.fullPath, path); - - // Check if file/dir exists. - fs.stat(fileDirPath, function(err) { - if (err) { - if (options.create) { - // File/Dir probably doesn't exist, create it. - create(function(error2) { - if (!error2) { - // File created successfully, return it. - success(); - } else if (error2.code === 'EEXIST') { - // File exists, success. - success(); - } else if (error2.code === 'ENOENT') { - // Seems like the parent doesn't exist, create it too. - var parent = fileDirPath.substring(0, fileDirPath.lastIndexOf('/')); - - if (parent) { - file.getDirectory(parent, options, function() { - // Parent created, try to create the child again. - create(function(error3) { - if (!error3) { - success(); - } else { - errorCallback && errorCallback(error3); - } - }); - }, errorCallback); - } else { - errorCallback && errorCallback(error2); - } - } else { - errorCallback && errorCallback(error2); - } - }); - } else { - errorCallback && errorCallback(err); - } - } else { - success(); - } - }); - - // Success, return the DirectoryEntry or FileEntry. - function success() { - var constructorFn = isDir ? DirectoryEntry : FileEntry; - successCallback(new constructorFn(filename, fileDirPath)); - } - - // Create the file/dir. - function create(done) { - if (isDir) { - fs.mkdir(fileDirPath, done); - } else { - fs.writeFile(fileDirPath, "", done); - } - } - } - - // Implement resolveLocalFileSystemURL. - $window.resolveLocalFileSystemURL = function(path, successCallback, errorCallback) { - // Check that the file/dir exists. - fs.stat(path, function(err, stats) { - if (err) { - errorCallback && errorCallback(err); - } else { - // The file/dir exists, return an instance. - var constructorFn = stats.isDirectory() ? DirectoryEntry : FileEntry, - fileAndDir = $mmFS.getFileAndDirectoryFromPath(path); - successCallback && successCallback(new constructorFn(fileAndDir.name, path)); - } - }); - }; - } - - /** - * Emulate Cordova FileTransfer plugin for browser or NodeJS. - * - * @return {Void} - */ - function emulateCordovaFileTransfer() { - // Create the FileTransferError object. - $window.FileTransferError = function(code, source, target, status, body, exception) { - this.code = code || null; - this.source = source || null; - this.target = target || null; - this.http_status = status || null; - this.body = body || null; - this.exception = exception || null; - }; - - $window.FileTransferError.FILE_NOT_FOUND_ERR = 1; - $window.FileTransferError.INVALID_URL_ERR = 2; - $window.FileTransferError.CONNECTION_ERR = 3; - $window.FileTransferError.ABORT_ERR = 4; - $window.FileTransferError.NOT_MODIFIED_ERR = 5; - - // Create the FileTransfer object and its functions. - $window.FileTransfer = function() { - this._id = ++fileTransferIdCounter; - this.onprogress = null; // Optional callback. - }; - - $window.FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) { - // Use XMLHttpRequest instead of $http to support onprogress and abort. - var basicAuthHeader = getBasicAuthHeader(source), - xhr = new XMLHttpRequest(), - isDesktop = $mmApp.isDesktop(), - deferred = $q.defer(), // Use a promise to make sure only one callback is called. - headers = null; - - deferred.promise.then(function(entry) { - successCallback && successCallback(entry); - }).catch(function(error) { - errorCallback && errorCallback(error); - }); - - this.xhr = xhr; - this.deferred = deferred; - this.source = source; - this.target = target; - - if (basicAuthHeader) { - source = source.replace(getUrlCredentials(source) + '@', ''); - - options = options || {}; - options.headers = options.headers || {}; - options.headers[basicAuthHeader.name] = basicAuthHeader.value; - } - - if (options) { - headers = options.headers || null; - } - - // Prepare the request. - xhr.open('GET', source, true); - xhr.responseType = isDesktop ? 'arraybuffer' : 'blob'; - angular.forEach(headers, function(value, name) { - xhr.setRequestHeader(name, value); - }); - - if (this.onprogress) { - xhr.onprogress = this.onprogress; - } - - xhr.onerror = function() { - deferred.reject(new FileTransferError(-1, source, target, xhr.status, xhr.statusText)); - }; - - xhr.onload = function() { - // Finished dowloading the file. - var response = xhr.response; - if (!response) { - deferred.reject(); - } else { - target = target.replace(basePath, ''); // Remove basePath from the target. - target = target.replace(/%20/g, ' '); // Replace all %20 with spaces. - if (isDesktop) { - // In desktop we need to convert the arraybuffer into a Buffer. - response = Buffer.from(new Uint8Array(response)); - } - - $mmFS.writeFile(target, response).then(deferred.resolve, deferred.reject); - } - }; - - xhr.send(); - }; - - $window.FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { - var fileKey = null, - fileName = null, - mimeType = null, - params = null, - headers = null, - httpMethod = null, - deferred = $q.defer(), // Use a promise to make sure only one callback is called. - basicAuthHeader = getBasicAuthHeader(server), - that = this; - - deferred.promise.then(function(result) { - successCallback && successCallback(result); - }).catch(function(error) { - errorCallback && errorCallback(error); - }); - - if (basicAuthHeader) { - server = server.replace(getUrlCredentials(server) + '@', ''); - - options = options || {}; - options.headers = options.headers || {}; - options.headers[basicAuthHeader.name] = basicAuthHeader.value; - } - - if (options) { - fileKey = options.fileKey; - fileName = options.fileName; - mimeType = options.mimeType; - headers = options.headers; - httpMethod = options.httpMethod || 'POST'; - - if (httpMethod.toUpperCase() == "PUT"){ - httpMethod = 'PUT'; - } else { - httpMethod = 'POST'; - } - - if (options.params) { - params = options.params; - } else { - params = {}; - } - } - - // Add fileKey and fileName to the headers. - headers = headers || {}; - if (!headers['Content-Disposition']) { - headers['Content-Disposition'] = 'form-data;' + (fileKey ? ' name="' + fileKey + '";' : '') + - (fileName ? ' filename="' + fileName + '"' : '') - } - - // For some reason, adding a Content-Type header with the mimeType makes the request fail (it doesn't detect - // the token in the params). Don't include this header, and delete it if it's supplied. - delete headers['Content-Type']; - - // Get the file to upload. - $mmFS.getFile(filePath).then(function(fileEntry) { - return $mmFS.getFileObjectFromFileEntry(fileEntry); - }).then(function(file) { - // Use XMLHttpRequest instead of $http to support onprogress and abort. - var xhr = new XMLHttpRequest(); - xhr.open(httpMethod || 'POST', server); - angular.forEach(headers, function(value, name) { - // Filter "unsafe" headers. - if (name != 'Connection') { - xhr.setRequestHeader(name, value); - } - }); - - if (that.onprogress) { - xhr.onprogress = that.onprogress; - } - - that.xhr = xhr; - that.deferred = deferred; - this.source = filePath; - this.target = server; - - xhr.onerror = function() { - deferred.reject(new FileTransferError(-1, filePath, server, xhr.status, xhr.statusText)); - }; - - xhr.onload = function() { - // Finished uploading the file. - deferred.resolve({ - bytesSent: file.size, - responseCode: xhr.status, - response: xhr.response, - objectId: '' - }); - }; - - // Create a form data to send params and the file. - var fd = new FormData(); - angular.forEach(params, function(value, name) { - fd.append(name, value); - }); - fd.append('file', file); - - xhr.send(fd); - }).catch(deferred.reject); - }; - - $window.FileTransfer.prototype.abort = function() { - if (this.xhr) { - this.xhr.abort(); - this.deferred.reject(new FileTransferError(FileTransferError.ABORT_ERR, this.source, this.target)); - } - }; - } - - /** - * Emulate Cordova Globalization plugin for browser or NodeJS. - * Only support the functions to get locale, the rest of functions won't be supported for now. - * - * @return {Void} - */ - function emulateCordovaGlobalization() { - // Create the GlobalizationError object. - $window.GlobalizationError = function(code, message) { - this.code = code || null; - this.message = message || ''; - }; - - $window.GlobalizationError.UNKNOWN_ERROR = 0; - $window.GlobalizationError.FORMATTING_ERROR = 1; - $window.GlobalizationError.PARSING_ERROR = 2; - $window.GlobalizationError.PATTERN_ERROR = 3; - - // Create the globalization object and its functions. - function getLocale() { - var navLang = navigator.userLanguage || navigator.language; - try { - if ($mmApp.isDesktop()) { - var locale = require('electron').remote.app.getLocale(); - return locale || navLang; - } else { - return navLang; - } - } catch(ex) { - // Something went wrong, return browser language. - return navLang; - } - } - - navigator.globalization = { - getLocaleName: function(successCallback, errorCallback) { - var locale = getLocale(); - if (locale) { - successCallback && successCallback({value: locale}); - } else { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Cannot get language'); - errorCallback && errorCallback(error); - } - }, - numberToString: function(number, successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - isDayLightSavingsTime: function(date, successCallback, errorCallback) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - getFirstDayOfWeek: function(successCallback, errorCallback) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - getDateNames: function (successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - getDatePattern: function(successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - getNumberPattern: function(successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - getCurrencyPattern: function(currencyCode, successCallback, errorCallback) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - stringToDate: function(dateString, successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - stringToNumber: function(numberString, successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - dateToString: function(date, successCallback, errorCallback, options) { - var error = new GlobalizationError(GlobalizationError.UNKNOWN_ERROR, 'Not supported.'); - errorCallback && errorCallback(error); - }, - }; - - navigator.globalization.getPreferredLanguage = navigator.globalization.getLocaleName; - } - - /** - * Emulate Cordova ZIP plugin for browser or NodeJS. - * Only support the unzip function, the rest of functions won't be supported for now. - * - * @return {Void} - */ - function emulateCordovaZip() { - // Cordova ZIP plugin. - $window.zip = { - unzip: function(source, destination, callback, progressCallback) { - // Remove basePath from the source and destination. - source = source.replace(basePath, ''); - source = source.replace(/%20/g, ' '); // Replace all %20 with spaces. - destination = destination.replace(basePath, ''); - destination = destination.replace(/%20/g, ' '); // Replace all %20 with spaces. - - $mmFS.readFile(source, $mmFS.FORMATARRAYBUFFER).then(function(data) { - var zip = new JSZip(data), - promises = [], - loaded = 0, - total = Object.keys(zip.files).length; - - angular.forEach(zip.files, function(file, name) { - var filePath = $mmFS.concatenatePaths(destination, name), - type, - promise; - - if (!file.dir) { - // It's a file. Get the mimetype and write the file. - type = $mmFS.getMimeType($mmFS.getFileExtension(name)); - promise = $mmFS.writeFile(filePath, new Blob([file.asArrayBuffer()], {type: type})); - } else { - // It's a folder, create it if it doesn't exist. - promise = $mmFS.createDir(filePath); - } - - promises.push(promise.then(function() { - // File unzipped, call the progress. - loaded++; - progressCallback && progressCallback({loaded: loaded, total: total}); - })); - }); - - return $q.all(promises).then(function() { - // Success. - callback(0); - }); - }).catch(function() { - // Error. - callback(-1); - }); - } - }; - } - - /** - * Emulate Custom URL Schemes for NodeJS. - * - * @return {Void} - */ - function emulateCustomURLScheme() { - if (!$mmApp.isDesktop()) { - return; - } - - // Listen for app launched events. - require('electron').ipcRenderer.on('mmAppLaunched', (event, url) => { - window.handleOpenURL && window.handleOpenURL(url); - }); - } - - /** - * Emulate InAppBrowser for NodeJS. - * - * @return {Void} - */ - function emulateInAppBrowser() { - if (!$mmApp.isDesktop()) { - return; - } - - var BrowserWindow = require('electron').remote.BrowserWindow, - screen = require('electron').screen; - - // Redefine window open to be able to have full control over the new window. - $window.open = function(url, frameName, features) { - var width = 800, - height = 600, - display, - newWindow, - listeners = {}; - - if (screen) { - display = screen.getPrimaryDisplay(); - if (display && display.workArea) { - width = display.workArea.width || width; - height = display.workArea.height || height; - } - } - - newWindow = new BrowserWindow({ - width: width, - height: height - }); - newWindow.loadURL(url); - - // Add the missing functions that InAppBrowser supports but BrowserWindow doesn't. - newWindow.addEventListener = function(name, callback) { - var that = this; - - switch (name) { - case 'loadstart': - that.webContents.addListener('did-start-loading', received); - break; - - case 'loadstop': - that.webContents.addListener('did-finish-load', received); - break; - - case 'loaderror': - that.webContents.addListener('did-fail-load', received); - break; - - case 'exit': - that.addListener('close', received); - break; - } - - // Store the received function instance to be able to remove the listener. - listeners[callback] = received; - - function received(event) { - try { - event.url = that.getURL(); - callback(event); - } catch(ex) {} - } - }; - - newWindow.removeEventListener = function(name, callback) { - var that = this, - listener = listeners[callback]; - - switch (name) { - case 'loadstart': - that.webContents.removeListener('did-start-loading', listener); - break; - - case 'loadstop': - that.webContents.removeListener('did-finish-load', listener); - break; - - case 'loaderror': - that.webContents.removeListener('did-fail-load', listener); - break; - - case 'exit': - that.removeListener('close', listener); - break; - } - }; - - newWindow.executeScript = function(details, callback) { - var that = this; - - if (details.code) { - that.webContents.executeJavaScript(details.code, false, callback); - } else if (details.file) { - $mmFS.readFile(details.file).then(function(code) { - that.webContents.executeJavaScript(code, false, callback); - }).catch(callback); - } else { - callback('executeScript requires exactly one of code or file to be specified'); - } - }; - - newWindow.insertCSS = function(details, callback) { - var that = this; - - if (details.code) { - that.webContents.insertCSS(details.code); - callback(); - } else if (details.file) { - $mmFS.readFile(details.file).then(function(code) { - that.webContents.insertCSS(code); - callback(); - }).catch(callback); - } else { - callback('insertCSS requires exactly one of code or file to be specified'); - } - }; - - return newWindow; - }; - } - - /** - * Emulate local notifications for NodeJS. - * Some of the code used in here was extracted from the Cordova Local Notification plugin. - * - * @return {Promise} Promise resolved when done. - */ - function emulateLocalNotifications() { - if (!$mmApp.isDesktop()) { - return $q.when(); - } - - var scheduled = {}, - triggered = {}, - defaults = { - text: '', - title: '', - id: 0, - sound: '', - data: undefined, - every: undefined, - at: undefined - }; - - // Redefine $cordovaLocalNotification methods instead of the core plugin (window.cordova.plugins.notification.local) - // because creating window.cordova breaks the app (it thinks it's a real device). - $cordovaLocalNotification.schedule = function(notifications, scope, isUpdate) { - var promises = []; - - notifications = Array.isArray(notifications) ? notifications : [notifications]; - - angular.forEach(notifications, function(notification) { - mergeWithDefaults(notification); - convertProperties(notification); - - // Cancel current notification if exists. - $cordovaLocalNotification.cancel(notification.id, null, true); - - // Store the notification in the scheduled list and in the DB. - scheduled[notification.id] = { - notification: notification - }; - promises.push(storeLocalNotification(notification, false)); - - // Schedule the notification. - var toTrigger = notification.at * 1000 - Date.now(); - scheduled[notification.id].timeout = $timeout(function trigger() { - // Trigger the notification. - var notifInstance = new Notification(notification.title, { - body: notification.text - }); - - // Store the notification as triggered. Don't remove it from scheduled, it's how the plugin works. - triggered[notification.id] = notification; - storeLocalNotification(notification, true); - - // Launch the trigger event. - $rootScope.$broadcast('$cordovaLocalNotification:trigger', notification, 'foreground'); - - // Listen for click events. - notifInstance.onclick = function() { - $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); - }; - - if (notification.every && scheduled[notification.id] && !scheduled[notification.id].interval) { - var interval = parseInterval(notification.every); - if (interval > 0) { - scheduled[notification.id].interval = $interval(trigger, interval); - } - } - }, toTrigger); - - // Launch the scheduled/update event. - var eventName = isUpdate ? 'update' : 'schedule'; - $rootScope.$broadcast('$cordovaLocalNotification:' + eventName, notification, 'foreground'); - }); - - return $q.when(); - }; - - $cordovaLocalNotification.update = function(notifications) { - // Just schedule them again, since scheduling cancels the existing one. - return $cordovaLocalNotification.schedule(notifications, null, true); - }; - - $cordovaLocalNotification.clear = function(ids, scope, omitEvent) { - var promises = []; - - ids = Array.isArray(ids) ? ids : [ids]; - ids = convertIds(ids); - - // Clear the notifications. - angular.forEach(ids, function(id) { - // Cancel only the notifications that aren't repeating. - if (scheduled[id] && scheduled[id].notification && !scheduled[id].notification.every) { - promises.push(cancelNotification(id, omitEvent, '$cordovaLocalNotification:clear')); - } - }); - - return $q.all(promises); - }; - - $cordovaLocalNotification.clearAll = function(scope, omitEvent) { - var ids = Object.keys(scheduled); - return $cordovaLocalNotification.clear(ids, scope, omitEvent).then(function() { - if (!omitEvent) { - $rootScope.$broadcast('$cordovaLocalNotification:clearall', 'foreground'); - } - }); - }; - - $cordovaLocalNotification.cancel = function(ids, scope, omitEvent) { - var promises = []; - - ids = Array.isArray(ids) ? ids : [ids]; - ids = convertIds(ids); - - // Cancel the notifications. - angular.forEach(ids, function(id) { - if (scheduled[id]) { - promises.push(cancelNotification(id, omitEvent, '$cordovaLocalNotification:cancel')); - } - }); - - return $q.all(promises); - }; - - $cordovaLocalNotification.cancelAll = function(scope, omitEvent) { - var ids = Object.keys(scheduled); - return $cordovaLocalNotification.cancel(ids, scope, omitEvent).then(function() { - if (!omitEvent) { - $rootScope.$broadcast('$cordovaLocalNotification:cancelall', 'foreground'); - } - }); - }; - - $cordovaLocalNotification.isPresent = function(id) { - return $q.when(!!scheduled[id] || !!triggered[notification.id]); - }; - - $cordovaLocalNotification.isScheduled = function(id) { - return $q.when(!!scheduled[id]); - }; - - $cordovaLocalNotification.isTriggered = function(id) { - return $q.when(!!triggered[notification.id]); - }; - - $cordovaLocalNotification.hasPermission = function() { - return $q.when(true); - }; - - $cordovaLocalNotification.registerPermission = function() { - return $q.when(true); - }; - - $cordovaLocalNotification.getAllIds = function() { - return $q.when($mmUtil.mergeArraysWithoutDuplicates(Object.keys(scheduled), Object.keys(triggered))); - }; - $cordovaLocalNotification.getIds = $cordovaLocalNotification.getAllIds; - - $cordovaLocalNotification.getScheduledIds = function() { - return $q.when(Object.keys(scheduled)); - }; - - $cordovaLocalNotification.getTriggeredIds = function() { - return $q.when(Object.keys(triggered)); - }; - - $cordovaLocalNotification.get = function(ids) { - ids = Array.isArray(ids) ? ids : [ids]; - ids = convertIds(ids); - return getNotifications(ids, true, true); - }; - - $cordovaLocalNotification.getAll = function() { - return getNotifications(null, true, true); - }; - - $cordovaLocalNotification.getScheduled = function(ids) { - ids = Array.isArray(ids) ? ids : [ids]; - ids = convertIds(ids); - return getNotifications(ids, true, false); - }; - - $cordovaLocalNotification.getAllScheduled = function() { - return getNotifications(null, true, false); - }; - - $cordovaLocalNotification.getTriggered = function(ids) { - ids = Array.isArray(ids) ? ids : [ids]; - ids = convertIds(ids); - return getNotifications(ids, false, true); - }; - - $cordovaLocalNotification.getAllTriggered = function() { - return getNotifications(null, false, true); - }; - - $cordovaLocalNotification.getDefaults = function() { - return defaults; - }; - - $cordovaLocalNotification.setDefaults = function(newDefaults) { - for (var key in defaults) { - if (newDefaults.hasOwnProperty(key)) { - defaults[key] = newDefaults[key]; - } - } - }; - - // App is being loaded, re-schedule all the notifications that were scheduled before. - return getAllLocalNotifications().catch(function() { - return []; - }).then(function(notifications) { - angular.forEach(notifications, function(notification) { - if (notification.triggered) { - // Notification was triggered already, store it in memory but don't schedule it again. - delete notification.triggered; - scheduled[notification.id] = notification; - triggered[notification.id] = notification; - } else { - // Schedule the notification again unless it should have been triggered more than an hour ago. - delete notification.triggered; - notification.at = notification.at * 1000; - if (notification.at - Date.now() > - mmCoreSecondsHour * 1000) { - $cordovaLocalNotification.schedule(notification); - } - } - }); - }); - - // Cancel a notification. - function cancelNotification(id, omitEvent, eventName) { - var notification = scheduled[id].notification; - - $timeout.cancel(scheduled[id].timeout); - $interval.cancel(scheduled[id].interval); - delete scheduled[id]; - delete triggered[id]; - - removeLocalNotification(id); - - if (!omitEvent) { - $rootScope.$broadcast(eventName, notification, 'foreground'); - } - } - - // Get a set of notifications. If ids isn't specified, return all the notifications. - function getNotifications(ids, getScheduled, getTriggered) { - var notifications = []; - - if (getScheduled) { - angular.forEach(scheduled, function(entry, id) { - if (!ids || ids.indexOf(id) != -1) { - notifications.push(entry.notification); - } - }); - } - - if (getTriggered) { - angular.forEach(triggered, function(notification, id) { - if ((!getScheduled || !scheduled[id]) && (!ids || ids.indexOf(id) != -1)) { - notifications.push(notification); - } - }); - } - - return $q.when(notifications); - } - - // Merge options with default values. - function mergeWithDefaults(options) { - options.at = getValueFor(options, 'at', 'firstAt', 'date'); - options.text = getValueFor(options, 'text', 'message'); - options.data = getValueFor(options, 'data', 'json'); - - if (defaults.hasOwnProperty('autoClear')) { - options.autoClear = getValueFor(options, 'autoClear', 'autoCancel'); - } - - if (options.autoClear !== true && options.ongoing) { - options.autoClear = false; - } - - if (options.at === undefined || options.at === null) { - options.at = new Date(); - } - - for (var key in defaults) { - if (options[key] === null || options[key] === undefined) { - if (options.hasOwnProperty(key) && ['data','sound'].indexOf(key) > -1) { - options[key] = undefined; - } else { - options[key] = defaults[key]; - } - } - } - - for (key in options) { - if (!defaults.hasOwnProperty(key)) { - delete options[key]; - console.warn('Unknown property: ' + key); - } - } - - return options; - } - - // First found value for the given keys. - function getValueFor(options) { - var keys = Array.apply(null, arguments).slice(1); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - - if (options.hasOwnProperty(key)) { - return options[key]; - } - } - } - - // Convert the passed values to their required type. - function convertProperties(options) { - if (options.id) { - if (isNaN(options.id)) { - options.id = defaults.id; - console.warn('Id is not a number: ' + options.id); - } else { - options.id = Number(options.id); - } - } - - if (options.title) { - options.title = options.title.toString(); - } - - if (options.text) { - options.text = options.text.toString(); - } - - if (options.badge) { - if (isNaN(options.badge)) { - options.badge = defaults.badge; - console.warn('Badge number is not a number: ' + options.id); - } else { - options.badge = Number(options.badge); - } - } - - if (options.at) { - if (typeof options.at == 'object') { - options.at = options.at.getTime(); - } - - options.at = Math.round(options.at / 1000); - } - - if (typeof options.data == 'object') { - options.data = JSON.stringify(options.data); - } - - return options; - } - - // Convert the IDs to numbers. - function convertIds(ids) { - var convertedIds = []; - - for (var i = 0; i < ids.length; i++) { - convertedIds.push(Number(ids[i])); - } - - return convertedIds; - } - - // Parse the interval and convert it to a number of milliseconds (0 if not valid). - function parseInterval(every) { - var interval; - - every = String(every).toLowerCase(); - - if (!every || every == 'undefined') { - interval = 0; - } else if (every == 'second') { - interval = 1000; - } else if (every == 'minute') { - interval = mmCoreSecondsMinute * 1000; - } else if (every == 'hour') { - interval = mmCoreSecondsHour * 1000; - } else if (every == 'day') { - interval = mmCoreSecondsDay * 1000; - } else if (every == 'week') { - interval = mmCoreSecondsDay * 7 * 1000; - } else if (every == 'month') { - interval = mmCoreSecondsDay * 31 * 1000; - } else if (every == 'quarter') { - interval = mmCoreSecondsHour * 2190 * 1000; - } else if (every == 'year') { - interval = mmCoreSecondsYear * 1000; - } else { - interval = parseInt(every, 10); - if (isNaN(interval)) { - interval = 0; - } else { - interval *= 60000; - } - } - - return interval; - } - } - - /** - * Emulate some of the features of push notifications. - * - * @return {Void} - */ - function emulatePushNotifications() { - // Create the PushNotification object, but only some of its functions will be supported. - var PushNotification = function(options) {}; - - PushNotification.prototype.unregister = function(successCallback, errorCallback, options) { - errorCallback && errorCallback('Unregister is only supported in mobile devices'); - }; - - PushNotification.prototype.subscribe = function(topic, successCallback, errorCallback) { - errorCallback && errorCallback('Suscribe is only supported in mobile devices'); - }; - - PushNotification.prototype.unsubscribe = function(topic, successCallback, errorCallback) { - errorCallback && errorCallback('Unsuscribe is only supported in mobile devices'); - }; - - PushNotification.prototype.setApplicationIconBadgeNumber = function(successCallback, errorCallback, badge) { - if (!$mmApp.isDesktop()) { - errorCallback && errorCallback('setApplicationIconBadgeNumber is not supported in browser'); - return; - } - - try { - var app = require('electron').remote.app; - if (app.setBadgeCount(badge)) { - successCallback && successCallback(); - } else { - errorCallback && errorCallback(); - } - } catch(ex) { - errorCallback && errorCallback(ex); - } - }; - - PushNotification.prototype.getApplicationIconBadgeNumber = function(successCallback, errorCallback) { - if (!$mmApp.isDesktop()) { - errorCallback && errorCallback('getApplicationIconBadgeNumber is not supported in browser'); - return; - } - - try { - var app = require('electron').remote.app; - successCallback && successCallback(app.getBadgeCount()); - } catch(ex) { - errorCallback && errorCallback(ex); - } - }; - - PushNotification.prototype.clearAllNotifications = function(successCallback, errorCallback) { - errorCallback && errorCallback('clearAllNotifications is only supported in mobile devices'); - }; - - PushNotification.prototype.on = function(eventName, callback) {}; - PushNotification.prototype.off = function(eventName, handle) {}; - PushNotification.prototype.emit = function() {}; - - PushNotification.prototype.finish = function(successCallback, errorCallback, id) { - errorCallback && errorCallback('finish is only supported in mobile devices'); - }; - - // Create the visible PushNotification object. - $window.PushNotification = { - init: function(options) { - return new PushNotification(options); - }, - - hasPermission: function(successCallback, errorCallback) { - errorCallback && errorCallback('hasPermission is only supported in mobile devices'); - }, - - PushNotification: PushNotification - }; - } - - /** - * Get all the notification stored in local DB. - * - * @return {Promise} Promise resolved with the notifications. - */ - function getAllLocalNotifications() { - return $mmApp.getDB().getAll(mmDesktopLocalNotificationsStore); - } - - /** - * Get the credentials from a URL. - * This code is extracted from Cordova FileTransfer plugin. - * - * @param {String} urlString The URL to get the credentials from. - * @return {String} Retrieved credentials. - */ - function getUrlCredentials(urlString) { - var credentialsPattern = /^https?\:\/\/(?:(?:(([^:@\/]*)(?::([^@\/]*))?)?@)?([^:\/?#]*)(?::(\d*))?).*$/, - credentials = credentialsPattern.exec(urlString); - - return credentials && credentials[1]; - } - - /** - * Loads HTML API to simulate Cordova APIs. Reserved for core use. - * - * @module mm.core - * @ngdoc method - * @name $mmEmulatorManager#loadHTMLAPI - * @return {Promise} Promise resolved when the API is loaded. - * @protected - */ - self.loadHTMLAPI = function() { - - if ($mmFS.isAvailable()) { - $log.debug('Stop loading HTML API, it was already loaded or the environment doesn\'t need it.'); - return $q.when(); - } - - var deferred = $q.defer(), - promises = [deferred.promise]; - - $log.debug('Loading HTML API.'); - - // File API. - $window.requestFileSystem = $window.requestFileSystem || $window.webkitRequestFileSystem; - $window.resolveLocalFileSystemURL = $window.resolveLocalFileSystemURL || $window.webkitResolveLocalFileSystemURL; - - $window.LocalFileSystem = { - PERSISTENT: 1 - }; - - emulateCordovaFileTransfer(); - emulateCordovaGlobalization(); - emulateCordovaZip(); - emulateCordovaClipboard(); - emulatePushNotifications(); - - if ($mmApp.isDesktop()) { - var fs = require('fs'), - app = require('electron').remote.app; - - emulateCordovaFile(); - emulateCustomURLScheme(); - emulateInAppBrowser(); - promises.push(emulateLocalNotifications()); - - // Initialize File System. Get the path to use. - basePath = app.getPath('documents') || app.getPath('home'); - if (!basePath) { - deferred.reject('Cannot calculate base path for file system.'); - return; - } - - basePath = $mmFS.concatenatePaths(basePath.replace(/\\/g, '/'), mmCoreConfigConstants.app_id) + '/'; - - // Create the folder if needed. - fs.mkdir(basePath, function(e) { - if (!e || (e && e.code === 'EEXIST')) { - // Create successful or it already exists. Resolve. - $mmFS.setHTMLBasePath(basePath); - deferred.resolve(); - } else { - deferred.reject('Error creating base path.'); - } - }); - } else { - // It's browser, request a quota to use. Request 500MB. - $window.webkitStorageInfo.requestQuota(PERSISTENT, 500 * 1024 * 1024, function(granted) { - $window.requestFileSystem(PERSISTENT, granted, function(entry) { - basePath = entry.root.toURL(); - $mmFS.setHTMLBasePath(basePath); - deferred.resolve(); - }, deferred.reject); - }, deferred.reject); - } - - return $q.all(promises); - }; - - /** - * Remove a notification from local DB. - * - * @param {Number} id ID of the notification. - * @return {Promise} Promise resolved when done. - */ - function removeLocalNotification(id) { - return $mmApp.getDB().remove(mmDesktopLocalNotificationsStore, id); - } - - /** - * Store a notification in local DB. - * - * @param {Object} notification Notification to store. - * @param {Boolean} triggered Whether the notification has been triggered. - * @return {Promise} Promise resolved when stored. - */ - function storeLocalNotification(notification, triggered) { - notification = angular.copy(notification); - notification.triggered = !!triggered; - return $mmApp.getDB().insert(mmDesktopLocalNotificationsStore, notification); - } - - return self; -}) - -.config(function($mmInitDelegateProvider, mmInitDelegateMaxAddonPriority) { - if (!ionic.Platform.isWebView()) { - $mmInitDelegateProvider.registerProcess('mmEmulator', '$mmEmulatorManager.loadHTMLAPI', - mmInitDelegateMaxAddonPriority + 500, true); - } -}); diff --git a/www/core/lib/fs.js b/www/core/lib/fs.js index f6a2a084ce7..fbd69d7f431 100644 --- a/www/core/lib/fs.js +++ b/www/core/lib/fs.js @@ -675,6 +675,24 @@ angular.module('mm.core') }); }; + /** + * Get the base path where the application files are stored. Returns the value instantly, without waiting for it to be ready. + * + * @module mm.core + * @ngdoc method + * @name $mmFS#getBasePathInstant + * @return {String} Base path. If the service hasn't been initialized it will return an invalid value. + */ + self.getBasePathInstant = function() { + if (!basePath) { + return basePath; + } else if (basePath.slice(-1) == '/') { + return basePath; + } else { + return basePath + '/'; + } + }; + /** * Get temporary directory path. * From bcfdd1a4537b137b8fff0f34cae38357fc9ba528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 13 Jun 2017 10:32:57 +0200 Subject: [PATCH 026/118] MOBILE-2120 data: Support basic search --- www/addons/mod/data/controllers/entry.js | 5 -- www/addons/mod/data/controllers/index.js | 82 +++++++++++++++---- www/addons/mod/data/lang/en.json | 16 +++- www/addons/mod/data/main.js | 2 +- www/addons/mod/data/services/data.js | 73 ++++++++++++++--- www/addons/mod/data/templates/index.html | 23 +++++- .../mod/data/templates/search-modal.html | 37 +++++++++ www/core/lang/en.json | 1 + 8 files changed, 203 insertions(+), 36 deletions(-) create mode 100644 www/addons/mod/data/templates/search-modal.html diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 3f94bd07ad2..1288a632512 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -167,11 +167,6 @@ angular.module('mm.addons.mod_data') } }; - // Opens search. - $scope.gotoSearch = function() { - $mmUtil.openInApp($mmSite.getURL() + '/mod/data/view.php?mode=asearch&d=' + data.id); - }; - // Refresh entry on change. entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { if (eventData.entryId == entryId && data.id == eventData.dataId && $mmSite.getId() == eventData.siteId) { diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index ffe7c433a1a..98bc308accb 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -23,7 +23,7 @@ angular.module('mm.addons.mod_data') */ .controller('mmaModDataIndexCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $mmCourseHelper, $q, $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, - mmaModDataEventEntryChanged) { + mmaModDataEventEntryChanged, $ionicModal) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -41,6 +41,13 @@ angular.module('mm.addons.mod_data') $scope.databaseLoaded = false; $scope.selectedGroup = $stateParams.group || 0; + $scope.search = { + sortBy: "0", + sortDirection: "ASC", + page: 0, + text: "" + }; + function fetchDatabaseData(refresh, sync, showErrors) { $scope.isOnline = $mmApp.isOnline(); @@ -91,7 +98,13 @@ angular.module('mm.addons.mod_data') } } - return fetchEntriesData(); + var promises = [ + fetchEntriesData(), + $mmaModData.getFields(data.id).then(function(fields) { + $scope.fields = fields; + }) + ]; + return $q.all(promises); }); }).then(function() { // All data obtained, now fill the context menu. @@ -114,15 +127,24 @@ angular.module('mm.addons.mod_data') // Update values for current group. $scope.access.canaddentry = accessData.canaddentry; - return $mmaModData.getEntries(data.id, $scope.selectedGroup).then(function(entries) { - $scope.isEmpty = !entries || entries.entries.length <= 0; - $scope.entries = ""; - - if (!$scope.isEmpty) { - $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - $scope.entries = entries.listviewcontents; - } - }); + // TODO: Advanced search. + if ($scope.search.text) { + return $mmaModData.searchEntries(data.id, $scope.selectedGroup, $scope.search.text, undefined, $scope.search.sortBy, + $scope.search.sortDirection, $scope.search.page); + } else { + return $mmaModData.getEntries(data.id, $scope.selectedGroup, $scope.search.sortBy, $scope.search.sortDirection, + $scope.search.page); + } + }).then(function(entries) { + $scope.numEntries = entries && entries.totalcount; + $scope.isEmpty = $scope.numEntries <= 0; + $scope.hasNextPage = (($scope.search.page + 1) * $mmaModData.perPage) < $scope.numEntries; + $scope.entries = ""; + + if (!$scope.isEmpty) { + $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); + $scope.entries = entries.listviewcontents; + } }); } @@ -188,9 +210,41 @@ angular.module('mm.addons.mod_data') } }; - // Opens search. - $scope.gotoSearch = function() { - $mmUtil.openInApp($mmSite.getURL() + '/mod/data/view.php?mode=asearch&d=' + data.id); + // Setup search modal. + $ionicModal.fromTemplateUrl('addons/mod/data/templates/search-modal.html', { + scope: $scope, + animation: 'slide-in-up' + }).then(function(searchModal) { + $scope.showSearch = function() { + searchModal.show(); + }; + $scope.closeSearch = function() { + searchModal.hide(); + }; + $scope.$on('$destroy', function() { + searchModal.remove(); + }); + }); + + // Performs the search and closes the modal. + $scope.searchEntries = function(page) { + $scope.closeSearch(); + $scope.databaseLoaded = false; + $scope.search.page = page; + return fetchEntriesData().catch(function(message) { + $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); + return $q.reject(); + }).finally(function(){ + $scope.databaseLoaded = true; + }); + }; + + // Reset all search filters and closes the modal. + $scope.searchReset = function() { + $scope.search.sortBy = "0"; + $scope.search.sortDirection = "ASC"; + $scope.search.text = ""; + $scope.searchEntries(0); }; // Opens add entries form diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index 03ac31afac0..c0f609c82a3 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -1,15 +1,27 @@ { "addentries": "Add entries", + "approved": "Approved", + "ascending": "Ascending", + "authorfirstname": "Author first name", + "authorlastname": "Author surname", "confirmdeleterecord": "Are you sure you want to delete this entry?", + "descending": "Descending", "entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries in order to complete this activity", "entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.", "errorapproving": "Error approving or unapproving entry.", "errordeleting": "Error deleting the entry.", "expired": "Sorry, this activity closed on {{$a}} and is no longer available", + "fields": "Fields", + "nomatch": "No matching entries found!", "norecords": "No entries in database", "notopenyet": "Sorry, this activity is not available until {{$a}}", + "numrecords": "{{$a}} entries", + "other": "Other", "recordapproved": "Entry approved", "recorddeleted": "Entry deleted", "recorddisapproved": "Entry unapproved", - "search": "Search" -} + "resetsettings": "Reset filters", + "search": "Search", + "timeadded": "Time added", + "timemodified": "Time modified" +} \ No newline at end of file diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index c6bfa192fbe..04e33fc8b9f 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -16,6 +16,7 @@ angular.module('mm.addons.mod_data', ['mm.core']) .constant('mmaModDataComponent', 'mmaModData') .constant('mmaModDataEventEntryChanged', 'mma-mod_data_entry_changed') +.constant('mmaModDataPerPage', 25) .config(function($stateProvider) { @@ -53,7 +54,6 @@ angular.module('mm.addons.mod_data', ['mm.core']) } } }); - }) .config(function($mmCourseDelegateProvider, $mmContentLinksDelegateProvider, $mmCoursePrefetchDelegateProvider) { diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 55c3fdf2aa1..3383aef0241 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc controller * @name $mmaModData */ -.factory('$mmaModData', function($q, $mmSitesManager, mmaModDataComponent, $mmFilepool, $mmSite) { +.factory('$mmaModData', function($q, $mmSitesManager, mmaModDataComponent, $mmFilepool, $mmSite, mmaModDataPerPage) { var self = {}; /** @@ -298,7 +298,7 @@ angular.module('mm.addons.mod_data') * @param {String} [order] The direction of the sorting: 'ASC' or 'DESC'. * Empty for using the default database setting. * @param {Number} [page] Page of records to return. - * @param {Number} [perPage] Number of records to return per page. + * @param {Number} [perPage] Records per page to return. Default on mmaModDataPerPage. * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). * @param {String} [siteId] Site ID. If not defined, current site. @@ -310,7 +310,7 @@ angular.module('mm.addons.mod_data') databaseid: dataId, returncontents: 1, page: page || 0, - perpage: perPage || 0, + perpage: perPage || mmaModDataPerPage, groupid: groupId || 0 }, preSets = { @@ -436,6 +436,56 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Performs search over a database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#searchEntries + * @param {Number} databaseId The data instance id. + * @param {Number} [groupId] Group id, 0 means that the function will determine the user group. + * @param {String} [search] Search text. It will be used if advSearch is not defined. + * @param {Array} [advSearch] Advanced search data. + * @param {String} [sort] Sort by this field. + * @param {Number} [order] The direction of the sorting. + * @param {Number} [page] Page of records to return. + * @param {Number} [perPage] Records per page to return. Default on mmaModDataPerPage. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the action is done. + */ + self.searchEntries = function(databaseId, groupId, search, advSearch, sort, order, page, perPage, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + databaseid: databaseId, + groupid: groupId || 0, + returncontents: 1, + page: page || 0, + perpage: perPage || mmaModDataPerPage + }, + preSets = { + getCache: 0, + saveCache: 1, + emergencyCache: 1 + }; + + if (typeof sort != "undefined") { + params.sort = sort; + } + + if (typeof order !== "undefined") { + params.order = order; + } + + if (typeof advSearch !== "undefined") { + params.advsearch = advSearch; + } else { + params.search = search; + } + + return site.read('mod_data_search_entries', params); + }); + }; + /** * Get the list of configured fields for the given database. * @@ -490,15 +540,14 @@ angular.module('mm.addons.mod_data') * @param {Number} [groupId] Group ID. * @param {Number} [sort] Sort the records by this field id. See $mmaModData#getEntries for more information. * @param {String} [order] The direction of the sorting. See $mmaModData#getEntries for more information. - * @param {Number} [perPage] Number of records to return per page. Default 10. * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when done. */ - self.fetchAllEntries = function(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, siteId) { + self.fetchAllEntries = function(dataId, groupId, sort, order, forceCache, ignoreCache, siteId) { siteId = siteId || $mmSite.getId(); - return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, [], 0, siteId); + return fetchEntriesRecursive(dataId, groupId, sort, order, forceCache, ignoreCache, [], 0, siteId); }; /** @@ -508,7 +557,6 @@ angular.module('mm.addons.mod_data') * @param {Number} groupId Group ID. * @param {Number} sort Sort the records by this field id. See $mmaModData#getEntries for more information. * @param {String} order The direction of the sorting. See $mmaModData#getEntries for more information. - * @param {Number} perPage Number of records to return per page. * @param {Boolean} forceCache True to always get the value from cache, false otherwise. Default false. * @param {Boolean} ignoreCache True if it should ignore cached data (it will always fail in offline or server down). * @param {Array} entries Entries already fetch (just to concatenate them). @@ -516,13 +564,14 @@ angular.module('mm.addons.mod_data') * @param {String} siteId Site ID. * @return {Promise} Promise resolved when done. */ - function fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, entries, page, siteId) { - return self.getEntries(dataId, groupId, sort, order, page, perPage, forceCache, ignoreCache, siteId).then(function(result) { + function fetchEntriesRecursive(dataId, groupId, sort, order, forceCache, ignoreCache, entries, page, siteId) { + return self.getEntries(dataId, groupId, sort, order, page, mmaModDataPerPage, forceCache, ignoreCache, siteId) + .then(function(result) { entries = entries.concat(result.entries); - var canLoadMore = ((page + 1) * perPage) < result.totalcount; - if (perPage && canLoadMore) { - return fetchEntriesRecursive(dataId, groupId, sort, order, perPage, forceCache, ignoreCache, entries, page + 1, + var canLoadMore = ((page + 1) * mmaModDataPerPage) < result.totalcount; + if (canLoadMore) { + return fetchEntriesRecursive(dataId, groupId, sort, order, forceCache, ignoreCache, entries, page + 1, siteId); } return entries; diff --git a/www/addons/mod/data/templates/index.html b/www/addons/mod/data/templates/index.html index 1c9b7e7623e..556a075ad01 100644 --- a/www/addons/mod/data/templates/index.html +++ b/www/addons/mod/data/templates/index.html @@ -1,7 +1,7 @@ {{ title }} - + @@ -43,6 +43,11 @@ {{ 'mma.mod_data.entrieslefttoadd' | translate:{$a: {entriesleft: access.entrieslefttoadd} } }}
+
+

{{ 'mma.mod_data.numrecords' | translate: {$a: numEntries } }}

+ {{ 'mma.mod_data.resetsettings' | translate}} +
+
+ + + + {{ editForm }} + + +
+ + + From 0f160d5dfcbd24f05d35dd5aeb0385e724fb695e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 20 Jun 2017 10:57:59 +0200 Subject: [PATCH 031/118] MOBILE-2121 data: Render fields to add and edit --- .../mod/data/fields/checkbox/directive.js | 8 +++++ .../mod/data/fields/checkbox/template.html | 5 +-- www/addons/mod/data/fields/date/directive.js | 9 +++-- www/addons/mod/data/fields/date/template.html | 5 +-- www/addons/mod/data/fields/file/directive.js | 11 ++++-- www/addons/mod/data/fields/file/template.html | 4 ++- .../mod/data/fields/latlong/directive.js | 8 ++++- .../mod/data/fields/latlong/template.html | 11 +++++- www/addons/mod/data/fields/menu/directive.js | 4 +++ www/addons/mod/data/fields/menu/template.html | 3 +- .../mod/data/fields/multimenu/directive.js | 11 ++++++ .../mod/data/fields/multimenu/template.html | 3 +- .../mod/data/fields/number/directive.js | 7 +++- .../mod/data/fields/number/template.html | 3 +- .../mod/data/fields/picture/directive.js | 11 ++++-- .../mod/data/fields/picture/template.html | 4 ++- .../mod/data/fields/radiobutton/directive.js | 4 +++ .../mod/data/fields/radiobutton/template.html | 3 +- www/addons/mod/data/fields/text/directive.js | 7 +++- www/addons/mod/data/fields/text/template.html | 3 +- .../mod/data/fields/textarea/directive.js | 17 ++++++++-- .../mod/data/fields/textarea/template.html | 6 +++- www/addons/mod/data/fields/url/directive.js | 7 +++- www/addons/mod/data/fields/url/template.html | 3 +- www/addons/mod/data/scss/styles.scss | 34 ++++++++++++++++++- www/core/directives/attachments.js | 4 +++ 26 files changed, 168 insertions(+), 27 deletions(-) diff --git a/www/addons/mod/data/fields/checkbox/directive.js b/www/addons/mod/data/fields/checkbox/directive.js index 9a625df1751..aa40f0bf19c 100644 --- a/www/addons/mod/data/fields/checkbox/directive.js +++ b/www/addons/mod/data/fields/checkbox/directive.js @@ -28,6 +28,14 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/checkbox/template.html', link: function(scope) { scope.options = scope.field.param1.split("\n"); + + if (scope.mode == 'edit' && scope.value) { + scope.values = {}; + + angular.forEach(scope.value.content.split("##"), function(value) { + scope.values[value] = true; + }); + } } }; }); diff --git a/www/addons/mod/data/fields/checkbox/template.html b/www/addons/mod/data/fields/checkbox/template.html index d5fb6bfab3b..b2304beb661 100644 --- a/www/addons/mod/data/fields/checkbox/template.html +++ b/www/addons/mod/data/fields/checkbox/template.html @@ -1,4 +1,5 @@ - {{ option }} - {{ 'mma.mod_data.selectedrequired' | translate }} + + {{ option }} + {{ 'mma.mod_data.selectedrequired' | translate }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/date/directive.js b/www/addons/mod/data/fields/date/directive.js index 6ddbacc5ca0..a50a3f49615 100644 --- a/www/addons/mod/data/fields/date/directive.js +++ b/www/addons/mod/data/fields/date/directive.js @@ -27,8 +27,13 @@ angular.module('mm.addons.mod_data') priority: 100, templateUrl: 'addons/mod/data/fields/date/template.html', link: function(scope) { - scope.value = new Date().toISOString().substr(0, 10); - scope.enable = false; + if (scope.mode == 'edit' && scope.value) { + scope.value = new Date(scope.value.content * 1000).toISOString().substr(0, 10); + scope.enable = true; + } else { + scope.value = new Date().toISOString().substr(0, 10); + scope.enable = false; + } } }; }); diff --git a/www/addons/mod/data/fields/date/template.html b/www/addons/mod/data/fields/date/template.html index 910b0d8b7c8..bd54b7a2e99 100644 --- a/www/addons/mod/data/fields/date/template.html +++ b/www/addons/mod/data/fields/date/template.html @@ -1,2 +1,3 @@ - -{{ 'mma.mod_data.usedate' | translate }} \ No newline at end of file + + +{{ 'mma.mod_data.usedate' | translate }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/file/directive.js b/www/addons/mod/data/fields/file/directive.js index af66262b89f..a84d2c1cd3a 100644 --- a/www/addons/mod/data/fields/file/directive.js +++ b/www/addons/mod/data/fields/file/directive.js @@ -21,10 +21,17 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataFieldFile */ -.directive('mmaModDataFieldFile', function() { +.directive('mmaModDataFieldFile', function(mmaModDataComponent) { return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/file/template.html' + templateUrl: 'addons/mod/data/fields/file/template.html', + link: function(scope) { + if (scope.mode == 'edit') { + scope.component = mmaModDataComponent; + scope.componentId = scope.database.coursemodule; + scope.maxSizeBytes = parseInt(scope.field.param3, 10); + } + } }; }); diff --git a/www/addons/mod/data/fields/file/template.html b/www/addons/mod/data/fields/file/template.html index 968da84f85e..d3ea0fa63d2 100644 --- a/www/addons/mod/data/fields/file/template.html +++ b/www/addons/mod/data/fields/file/template.html @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/www/addons/mod/data/fields/latlong/directive.js b/www/addons/mod/data/fields/latlong/directive.js index 0df21dfa5e5..ce46f8dae9b 100644 --- a/www/addons/mod/data/fields/latlong/directive.js +++ b/www/addons/mod/data/fields/latlong/directive.js @@ -25,6 +25,12 @@ angular.module('mm.addons.mod_data') return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/latlong/template.html' + templateUrl: 'addons/mod/data/fields/latlong/template.html', + link: function(scope) { + if (scope.value) { + scope.north = parseFloat(scope.value.content); + scope.east = parseFloat(scope.value.content1); + } + } }; }); diff --git a/www/addons/mod/data/fields/latlong/template.html b/www/addons/mod/data/fields/latlong/template.html index 968da84f85e..1745e268c0a 100644 --- a/www/addons/mod/data/fields/latlong/template.html +++ b/www/addons/mod/data/fields/latlong/template.html @@ -1 +1,10 @@ - \ No newline at end of file + + + + diff --git a/www/addons/mod/data/fields/menu/directive.js b/www/addons/mod/data/fields/menu/directive.js index aa3f830c20c..7eb41e54c48 100644 --- a/www/addons/mod/data/fields/menu/directive.js +++ b/www/addons/mod/data/fields/menu/directive.js @@ -28,6 +28,10 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/menu/template.html', link: function(scope) { scope.options = scope.field.param1.split("\n"); + + if (scope.mode == 'edit' && scope.value) { + scope.value = scope.value.content; + } } }; }); diff --git a/www/addons/mod/data/fields/menu/template.html b/www/addons/mod/data/fields/menu/template.html index 0d88b6646f9..6d99d81b8f1 100644 --- a/www/addons/mod/data/fields/menu/template.html +++ b/www/addons/mod/data/fields/menu/template.html @@ -1,5 +1,6 @@ +
- diff --git a/www/addons/mod/data/fields/multimenu/directive.js b/www/addons/mod/data/fields/multimenu/directive.js index 9d5d301ff55..515494d842c 100644 --- a/www/addons/mod/data/fields/multimenu/directive.js +++ b/www/addons/mod/data/fields/multimenu/directive.js @@ -30,6 +30,17 @@ angular.module('mm.addons.mod_data') scope.options = scope.field.param1.split("\n").map(function(option) { return {key: option, value: option}; }); + + if (scope.mode == 'edit' && scope.value) { + angular.forEach(scope.value.content.split("##"), function(value) { + for (var x in scope.options) { + if (value == scope.options[x].key) { + scope.options[x].selected = true; + break; + } + } + }); + } } }; }); diff --git a/www/addons/mod/data/fields/multimenu/template.html b/www/addons/mod/data/fields/multimenu/template.html index c5958ce9cc2..7e47d843905 100644 --- a/www/addons/mod/data/fields/multimenu/template.html +++ b/www/addons/mod/data/fields/multimenu/template.html @@ -1,2 +1,3 @@ + -{{ 'mma.mod_data.selectedrequired' | translate }} \ No newline at end of file +{{ 'mma.mod_data.selectedrequired' | translate }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/number/directive.js b/www/addons/mod/data/fields/number/directive.js index 25fc64a5655..448f00855db 100644 --- a/www/addons/mod/data/fields/number/directive.js +++ b/www/addons/mod/data/fields/number/directive.js @@ -25,6 +25,11 @@ angular.module('mm.addons.mod_data') return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/number/template.html' + templateUrl: 'addons/mod/data/fields/number/template.html', + link: function(scope) { + if (scope.mode == 'edit' && scope.value) { + scope.value = parseFloat(scope.value.content); + } + } }; }); diff --git a/www/addons/mod/data/fields/number/template.html b/www/addons/mod/data/fields/number/template.html index e843b626dc2..246b94e3dfb 100644 --- a/www/addons/mod/data/fields/number/template.html +++ b/www/addons/mod/data/fields/number/template.html @@ -1 +1,2 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/www/addons/mod/data/fields/picture/directive.js b/www/addons/mod/data/fields/picture/directive.js index 1ba245b55fd..ee9d61efc24 100644 --- a/www/addons/mod/data/fields/picture/directive.js +++ b/www/addons/mod/data/fields/picture/directive.js @@ -21,10 +21,17 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataFieldPicture */ -.directive('mmaModDataFieldPicture', function() { +.directive('mmaModDataFieldPicture', function(mmaModDataComponent) { return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/picture/template.html' + templateUrl: 'addons/mod/data/fields/picture/template.html', + link: function(scope) { + if (scope.mode == 'edit') { + scope.component = mmaModDataComponent; + scope.componentId = scope.database.coursemodule; + scope.maxSizeBytes = parseInt(scope.field.param3, 10); + } + } }; }); diff --git a/www/addons/mod/data/fields/picture/template.html b/www/addons/mod/data/fields/picture/template.html index 968da84f85e..d3ea0fa63d2 100644 --- a/www/addons/mod/data/fields/picture/template.html +++ b/www/addons/mod/data/fields/picture/template.html @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/www/addons/mod/data/fields/radiobutton/directive.js b/www/addons/mod/data/fields/radiobutton/directive.js index 0c07ec4f5af..6d152555648 100644 --- a/www/addons/mod/data/fields/radiobutton/directive.js +++ b/www/addons/mod/data/fields/radiobutton/directive.js @@ -28,6 +28,10 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/radiobutton/template.html', link: function(scope) { scope.options = scope.field.param1.split("\n"); + + if (scope.mode == 'edit' && scope.value) { + scope.value = scope.value.content; + } } }; }); diff --git a/www/addons/mod/data/fields/radiobutton/template.html b/www/addons/mod/data/fields/radiobutton/template.html index 0d88b6646f9..6d99d81b8f1 100644 --- a/www/addons/mod/data/fields/radiobutton/template.html +++ b/www/addons/mod/data/fields/radiobutton/template.html @@ -1,5 +1,6 @@ +
- diff --git a/www/addons/mod/data/fields/text/directive.js b/www/addons/mod/data/fields/text/directive.js index 1394ac5846c..9fcb4f4d3f8 100644 --- a/www/addons/mod/data/fields/text/directive.js +++ b/www/addons/mod/data/fields/text/directive.js @@ -25,6 +25,11 @@ angular.module('mm.addons.mod_data') return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/text/template.html' + templateUrl: 'addons/mod/data/fields/text/template.html', + link: function(scope) { + if (scope.mode == 'edit' && scope.value) { + scope.value = scope.value.content; + } + } }; }); diff --git a/www/addons/mod/data/fields/text/template.html b/www/addons/mod/data/fields/text/template.html index 968da84f85e..189f72e0ffe 100644 --- a/www/addons/mod/data/fields/text/template.html +++ b/www/addons/mod/data/fields/text/template.html @@ -1 +1,2 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/www/addons/mod/data/fields/textarea/directive.js b/www/addons/mod/data/fields/textarea/directive.js index 2655d0370dc..c6d8ecb8094 100644 --- a/www/addons/mod/data/fields/textarea/directive.js +++ b/www/addons/mod/data/fields/textarea/directive.js @@ -21,10 +21,23 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataFieldTextarea */ -.directive('mmaModDataFieldTextarea', function() { +.directive('mmaModDataFieldTextarea', function($mmUtil, $mmText) { return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/textarea/template.html' + templateUrl: 'addons/mod/data/fields/textarea/template.html', + link: function(scope) { + // Check if rich text editor is enabled. + if (scope.mode == 'edit') { + $mmUtil.isRichTextEditorEnabled().then(function(enabled) { + var text = scope.value ? $mmText.replacePluginfileUrls(scope.value.content, scope.value.files) : ""; + + // Get the text. + scope.model = { + text: text + }; + }); + } + } }; }); diff --git a/www/addons/mod/data/fields/textarea/template.html b/www/addons/mod/data/fields/textarea/template.html index 968da84f85e..7759a113d91 100644 --- a/www/addons/mod/data/fields/textarea/template.html +++ b/www/addons/mod/data/fields/textarea/template.html @@ -1 +1,5 @@ - \ No newline at end of file + + +
+ +
\ No newline at end of file diff --git a/www/addons/mod/data/fields/url/directive.js b/www/addons/mod/data/fields/url/directive.js index b4ed5849567..dd641ac988d 100644 --- a/www/addons/mod/data/fields/url/directive.js +++ b/www/addons/mod/data/fields/url/directive.js @@ -25,6 +25,11 @@ angular.module('mm.addons.mod_data') return { restrict: 'A', priority: 100, - templateUrl: 'addons/mod/data/fields/url/template.html' + templateUrl: 'addons/mod/data/fields/url/template.html', + link: function(scope) { + if (scope.mode == 'edit' && scope.value) { + scope.value = scope.value.content; + } + } }; }); diff --git a/www/addons/mod/data/fields/url/template.html b/www/addons/mod/data/fields/url/template.html index 968da84f85e..78f2af414af 100644 --- a/www/addons/mod/data/fields/url/template.html +++ b/www/addons/mod/data/fields/url/template.html @@ -1 +1,2 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss index d9df4b7d8d4..61002f7dacb 100644 --- a/www/addons/mod/data/scss/styles.scss +++ b/www/addons/mod/data/scss/styles.scss @@ -39,7 +39,7 @@ input[type="tel"], input[type="color"], .item-select, - mm-multiple-select .item { + mm-attachments>.item-border { width: 100%; margin: -1px; border: 1px solid $gray; @@ -47,6 +47,26 @@ height: 56px; } + mm-attachments .item-media { + width: 100%; + margin: -1px; + border: 1px solid $gray; + height: 56px; + } + + mm-multiple-select .item { + width: 100%; + margin: -1px; + border: 1px solid $gray; + padding: 16px 0 16px 16px; + } + + mm-attachments .item { + width: 100%; + margin: -1px; + border: 1px solid $gray; + } + .item-checkbox { margin-right: 1px; } @@ -56,4 +76,16 @@ left: 0; max-width: none; } + + .item-input.mm-latlong { + width: 100%; + margin: -1px; + padding-top: 0; + padding-bottom: 0; + padding-left: 0; + + input { + border: 0; + } + } } \ No newline at end of file diff --git a/www/core/directives/attachments.js b/www/core/directives/attachments.js index 075c1f3af1a..1e01808baab 100644 --- a/www/core/directives/attachments.js +++ b/www/core/directives/attachments.js @@ -73,6 +73,10 @@ angular.module('mm.core') scope.unlimitedFiles = true; } + if (typeof scope.files == 'undefined') { + scope.files = []; + } + scope.add = function() { if (!allowOffline && !$mmApp.isOnline()) { $mmUtil.showErrorModal('mm.fileuploader.errormustbeonlinetoupload', true); From a44fed8189713108c851dd04337eacfd274f5e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 20 Jun 2017 13:57:44 +0200 Subject: [PATCH 032/118] MOBILE-2121 data: Send data to the server --- www/addons/mod/data/controllers/edit.js | 19 ++++ .../mod/data/fields/checkbox/handler.js | 26 +++++ www/addons/mod/data/fields/date/handler.js | 33 +++++++ www/addons/mod/data/fields/latlong/handler.js | 29 ++++++ www/addons/mod/data/fields/menu/handler.js | 20 ++++ .../mod/data/fields/multimenu/directive.js | 2 +- .../mod/data/fields/multimenu/handler.js | 23 +++++ www/addons/mod/data/fields/number/handler.js | 18 ++++ .../mod/data/fields/radiobutton/handler.js | 19 ++++ www/addons/mod/data/fields/text/handler.js | 18 ++++ .../mod/data/fields/textarea/handler.js | 43 +++++++- www/addons/mod/data/fields/url/handler.js | 18 ++++ www/addons/mod/data/services/data.js | 50 ++++++++++ .../mod/data/services/fieldsdelegate.js | 41 ++++++++ www/addons/mod/data/services/helper.js | 99 ++++++++++++++----- www/addons/mod/data/templates/edit.html | 3 + 16 files changed, 434 insertions(+), 27 deletions(-) diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index 5275f31a64c..9deabef28c8 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -109,6 +109,25 @@ angular.module('mm.addons.mod_data') return fetchEntryData(); }; + // Saves data. + $scope.save = function(page) { + return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields) + .then(function(editData) { + if (editData.length > 0) { + var promise; + + if (entry.id) { + promise = $mmaModData.editEntry(entry.id, editData); + } else { + promise = $mmaModData.addEntry(data.id, editData, $scope.selectedGroup); + } + + // TODO: Treat result. + return promise; + } + }); + }; + // Convenience function to refresh all the data. function refreshAllData() { var promises = []; diff --git a/www/addons/mod/data/fields/checkbox/handler.js b/www/addons/mod/data/fields/checkbox/handler.js index 5d6ee85e301..b3ee51cd76e 100644 --- a/www/addons/mod/data/fields/checkbox/handler.js +++ b/www/addons/mod/data/fields/checkbox/handler.js @@ -61,6 +61,32 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + + var checkboxes = []; + angular.forEach(inputData[fieldName], function(value, option) { + if (value) { + checkboxes.push(option); + } + }); + if (checkboxes.length > 0) { + return [{ + fieldid: field.id, + value: checkboxes + }]; + } + + return false; + }; + return self; }) diff --git a/www/addons/mod/data/fields/date/handler.js b/www/addons/mod/data/fields/date/handler.js index 9d4e5927977..2c981eb43f6 100644 --- a/www/addons/mod/data/fields/date/handler.js +++ b/www/addons/mod/data/fields/date/handler.js @@ -63,6 +63,39 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + + var values = [], + date = inputData[fieldName].split('-'), + year = date[0], + month = date[1], + day = date[2]; + values.push({ + fieldid: field.id, + subfield: 'year', + value: year + }); + values.push({ + fieldid: field.id, + subfield: 'month', + value: month + }); + values.push({ + fieldid: field.id, + subfield: 'day', + value: day + }); + return values; + }; + return self; }) diff --git a/www/addons/mod/data/fields/latlong/handler.js b/www/addons/mod/data/fields/latlong/handler.js index 71c6db3f03f..f99ddb3e7a6 100644 --- a/www/addons/mod/data/fields/latlong/handler.js +++ b/www/addons/mod/data/fields/latlong/handler.js @@ -43,6 +43,35 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + + var values = []; + + if (inputData[fieldName + '_0']) { + values.push({ + fieldid: field.id, + subfield: '0', + value: inputData[fieldName + '_0'] + }); + } + if (inputData[fieldName + '_1']) { + values.push({ + fieldid: field.id, + subfield: '1', + value: inputData[fieldName + '_1'] + }); + } + return values; + }; + return self; }) diff --git a/www/addons/mod/data/fields/menu/handler.js b/www/addons/mod/data/fields/menu/handler.js index b30736782e5..6ff0dcc2139 100644 --- a/www/addons/mod/data/fields/menu/handler.js +++ b/www/addons/mod/data/fields/menu/handler.js @@ -43,6 +43,26 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + + if (inputData[fieldName]) { + return [{ + fieldid: field.id, + value: inputData[fieldName] + }]; + } + return false; + }; + + return self; }) diff --git a/www/addons/mod/data/fields/multimenu/directive.js b/www/addons/mod/data/fields/multimenu/directive.js index 515494d842c..0979d997763 100644 --- a/www/addons/mod/data/fields/multimenu/directive.js +++ b/www/addons/mod/data/fields/multimenu/directive.js @@ -31,7 +31,7 @@ angular.module('mm.addons.mod_data') return {key: option, value: option}; }); - if (scope.mode == 'edit' && scope.value) { + if (scope.mode == 'edit' && scope.value && scope.value.content) { angular.forEach(scope.value.content.split("##"), function(value) { for (var x in scope.options) { if (value == scope.options[x].key) { diff --git a/www/addons/mod/data/fields/multimenu/handler.js b/www/addons/mod/data/fields/multimenu/handler.js index 1fe28f266ec..8fa7078568c 100644 --- a/www/addons/mod/data/fields/multimenu/handler.js +++ b/www/addons/mod/data/fields/multimenu/handler.js @@ -58,6 +58,29 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + + if (inputData[fieldName].length > 0) { + var options = inputData[fieldName].split('###'); + if (options.length > 0) { + return [{ + fieldid: field.id, + value: options + }]; + } + } + + return false; + }; + return self; }) diff --git a/www/addons/mod/data/fields/number/handler.js b/www/addons/mod/data/fields/number/handler.js index 50110ebbead..46fd202ba44 100644 --- a/www/addons/mod/data/fields/number/handler.js +++ b/www/addons/mod/data/fields/number/handler.js @@ -44,6 +44,24 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + if (inputData[fieldName]) { + return [{ + fieldid: field.id, + value: inputData[fieldName] + }]; + } + return false; + }; + return self; }) diff --git a/www/addons/mod/data/fields/radiobutton/handler.js b/www/addons/mod/data/fields/radiobutton/handler.js index 0546748ff53..a599e6af342 100644 --- a/www/addons/mod/data/fields/radiobutton/handler.js +++ b/www/addons/mod/data/fields/radiobutton/handler.js @@ -43,6 +43,25 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + + if (inputData[fieldName]) { + return [{ + fieldid: field.id, + value: inputData[fieldName] + }]; + } + return false; + }; + return self; }) diff --git a/www/addons/mod/data/fields/text/handler.js b/www/addons/mod/data/fields/text/handler.js index c33a29cbd97..755f5768fe2 100644 --- a/www/addons/mod/data/fields/text/handler.js +++ b/www/addons/mod/data/fields/text/handler.js @@ -43,6 +43,24 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + if (inputData[fieldName]) { + return [{ + fieldid: field.id, + value: inputData[fieldName] + }]; + } + return false; + }; + return self; }) diff --git a/www/addons/mod/data/fields/textarea/handler.js b/www/addons/mod/data/fields/textarea/handler.js index ab45cc61272..be9fce8766b 100644 --- a/www/addons/mod/data/fields/textarea/handler.js +++ b/www/addons/mod/data/fields/textarea/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldTextareaHandler */ -.factory('$mmaModDataFieldTextareaHandler', function() { +.factory('$mmaModDataFieldTextareaHandler', function($mmText, $mmUtil) { var self = {}; @@ -43,6 +43,47 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get the text to submit. + * + * @param {Object} field Field. + * @param {Object} inputData Data entered in the edit form. + * @return {String} Text to submit. + */ + function getTextToSubmit(plugin, text) { + + + return + } + + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + if (inputData[fieldName]) { + return $mmUtil.isRichTextEditorEnabled().then(function(enabled) { + var files = field.files ? field.files : [], + text = $mmText.restorePluginfileUrls(inputData[fieldName], files); + + if (!enabled) { + // Rich text editor not enabled, add some HTML to the text if needed. + text = $mmText.formatHtmlLines(text); + } + + return [{ + fieldid: field.id, + value: text + }]; + }); + } + return false; + }; + return self; }) diff --git a/www/addons/mod/data/fields/url/handler.js b/www/addons/mod/data/fields/url/handler.js index 822d8d937ae..bc71b7fb7db 100644 --- a/www/addons/mod/data/fields/url/handler.js +++ b/www/addons/mod/data/fields/url/handler.js @@ -43,6 +43,24 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {Array} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field, inputData) { + var fieldName = 'f_' + field.id; + if (inputData[fieldName]) { + return [{ + fieldid: field.id, + value: inputData[fieldName] + }]; + } + return false; + }; + return self; }) diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index ca91d6279db..3b629da7c32 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -436,6 +436,56 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Adds a new entry to a database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#addEntry + * @param {Number} dataId Data instance ID. + * @param {Object} data The fields data to be created. + * @param {Number} [groupId] Group id, 0 means that the function will determine the user group. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the action is done. + */ + self.addEntry = function(dataId, data, groupId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + databaseid: dataId, + data: data + }; + + if (typeof groupId !== "undefined") { + params.groupid = groupId; + } + + return site.write('mod_data_add_entry', params); + }); + }; + + /** + * Updates an existing entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#addEntry + * @param {Number} entryId Entry ID. + * @param {Object} data The fields data to be updated. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the action is done. + */ + self.editEntry = function(entryId, data, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + entryid: entryId, + data: data + }; + + return site.write('mod_data_update_entry', params); + }); + }; + + /** * Performs search over a database. * diff --git a/www/addons/mod/data/services/fieldsdelegate.js b/www/addons/mod/data/services/fieldsdelegate.js index 176e6a168ec..96e528cbb3f 100644 --- a/www/addons/mod/data/services/fieldsdelegate.js +++ b/www/addons/mod/data/services/fieldsdelegate.js @@ -84,6 +84,43 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get database data in the input data to add or update entry. + * + * @module mm.addons.mod_assign + * @ngdoc method + * @name $mmaModDataFieldsDelegate#getFieldEditData + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @return {Array} Name and data field. + */ + self.getFieldEditData = function(field, inputData) { + var handler = self.getPluginHandler(field.type); + if (handler && handler.getFieldEditData) { + return handler.getFieldEditData(field, inputData); + } + return false; + }; + + /** + * Get files used by this plugin. + * The files returned by this function will be prefetched when the user prefetches the database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#getPluginFiles + * @param {Object} field Defines the field. + * @param {Object} content Defines the content that contains the files. + * @return {Array} List of files. + */ + self.getPluginFiles = function(field, content) { + var handler = self.getPluginHandler(field.type); + if (handler && handler.getPluginFiles) { + return handler.getPluginFiles(field, content); + } + return content.files; + }; + /** * Get the directive to use for a certain feedback plugin. * @@ -131,6 +168,10 @@ angular.module('mm.addons.mod_data') * returning an object defining these properties. See {@link $mmUtil#resolveObject}. * - getFieldSearchData(field, inputData) Optional. * Should return name and data entered to the field. + * - getFieldEditData(field, inputData) Optional. + * Should return name and data entered to the field. + * - getPluginFiles(plugin, inputData) Optional. + * Should return file list of the field. */ self.registerHandler = function(addon, pluginType, handler) { if (typeof handlers[pluginType] !== 'undefined') { diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 89edbb53ece..baba019d798 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataHelper */ -.factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate) { +.factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q) { var self = { searchOther: { @@ -66,22 +66,13 @@ angular.module('mm.addons.mod_data') }; /** - * Retrieve the entered data in search in a form. - * We don't use ng-model because it doesn't detect changes done by JavaScript. + * Return the form data. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataHelper#getSearchDataFromForm - * @param {Object} form Form (DOM element). - * @param {Array} fields Fields that defines every content in the entry. - * @return {Object} Object with the answers. + * @param {Object} form Form (DOM element). + * @return {Object} Data retrieved from form. */ - self.getSearchDataFromForm = function(form, fields) { - if (!form || !form.elements) { - return {}; - } - - var searchedData = {}; + function getFormData(form) { + var formData = {}; angular.forEach(form.elements, function(element) { var name = element.name || ''; @@ -92,30 +83,49 @@ angular.module('mm.addons.mod_data') // Get the value. if (element.type == 'checkbox') { - if (typeof searchedData[name] == "undefined") { - searchedData[name] = {}; + if (typeof formData[name] == "undefined") { + formData[name] = {}; } - searchedData[name][element.value] = !!element.checked; + formData[name][element.value] = !!element.checked; } else if (element.type == 'radio') { if (element.checked) { - searchedData[name] = element.value; + formData[name] = element.value; } } else { - searchedData[name] = element.value; + formData[name] = element.value; } }); + return formData; + } + + /** + * Retrieve the entered data in search in a form. + * We don't use ng-model because it doesn't detect changes done by JavaScript. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getSearchDataFromForm + * @param {Object} form Form (DOM element). + * @param {Array} fields Fields that defines every content in the entry. + * @return {Object} Object with the answers. + */ + self.getSearchDataFromForm = function(form, fields) { + if (!form || !form.elements) { + return {}; + } + + var searchedData = getFormData(form); + // Filter and translate fields to each field plugin. var advancedSearch = []; angular.forEach(fields, function(field) { var fieldData = $mmaModDataFieldsDelegate.getFieldSearchData(field, searchedData); if (fieldData) { angular.forEach(fieldData, function(data) { + data.value = JSON.stringify(data.value); // WS wants values in Json format. - advancedSearch.push({ - name: data.name, - value: JSON.stringify(data.value) - }); + advancedSearch.push(data); }); } }); @@ -145,7 +155,7 @@ angular.module('mm.addons.mod_data') * @param {Array} [contents] Contents for the editing entry (if editing). * @return {String} Generated HTML. */ - self.displayEditFields = function(template, fields, contents) { + self.displayEditFields = function(template, fields) { var replace; // Replace the fields found on template. @@ -169,6 +179,45 @@ angular.module('mm.addons.mod_data') return template; }; + /** + * Retrieve the entered data in the edit form. + * We don't use ng-model because it doesn't detect changes done by JavaScript. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getEditDataFromForm + * @param {Object} form Form (DOM element). + * @param {Array} fields Fields that defines every content in the entry. + * @return {Object} Object with the answers. + */ + self.getEditDataFromForm = function(form, fields) { + if (!form || !form.elements) { + return {}; + } + + var formData = getFormData(form); + + // Filter and translate fields to each field plugin. + var edit = [], + promises = []; + angular.forEach(fields, function(field) { + promises.push($q.when($mmaModDataFieldsDelegate.getFieldEditData(field, formData)).then(function (fieldData) { + if (fieldData) { + angular.forEach(fieldData, function(data) { + data.value = JSON.stringify(data.value); + // WS wants values in Json format. + edit.push(data); + }); + } + })); + }); + + return $q.all(promises).then(function() { + console.error(formData, edit); + return edit; + }); + }; + /** * Add a prefix to all rules in a CSS string. * diff --git a/www/addons/mod/data/templates/edit.html b/www/addons/mod/data/templates/edit.html index 8521cd0400c..9bd0062315b 100644 --- a/www/addons/mod/data/templates/edit.html +++ b/www/addons/mod/data/templates/edit.html @@ -1,5 +1,8 @@ {{ title }} + + {{ 'mm.core.save' | translate }} + From e815b35de47a2e6f8eaac23e4a011843a877dba1 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 21 Jun 2017 15:50:14 +0200 Subject: [PATCH 033/118] MOBILE-2146 core: Implement mmChrono directive --- www/core/directives/chrono.js | 178 +++++++++++++++++++++++++++++++ www/core/filters/secondstohms.js | 3 + 2 files changed, 181 insertions(+) create mode 100644 www/core/directives/chrono.js diff --git a/www/core/directives/chrono.js b/www/core/directives/chrono.js new file mode 100644 index 00000000000..12cedd17a31 --- /dev/null +++ b/www/core/directives/chrono.js @@ -0,0 +1,178 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core') + +/** + * This directive shows a chronometer in format HH:MM:SS. + * + * @module mm.core + * @ngdoc directive + * @name mmChrono + * @description + * This directive shows a chronometer in format HH:MM:SS. + * + * If no startTime is provided, it will start at 00:00:00. If the startTime changes, the chrono + * will be resetted to the startTime (and it will keep running if it was already running). + * If an endTime is provided, the chrono will stop and call the onEnd function when that number of seconds is reached. + * E.g. if startTime=60000 and endTime=120000, the chrono will start at 00:01:00 and end when it reaches 00:02:00. + * + * This directive listens for scope events to start and stop the timer. All events accept an object as a parameter. + * If the chrono has an id, the events must pass an id in the param object. + * + * mm-chrono-start To start the chrono. + * mm-chrono-stop To stop the chrono, leaving the current value. + * mm-chrono-reset To stop and reset the chrono. If the chrono should play after reset, pass play=true. + * + * Example usage: + * + * + * Then the controller can send events like this: + * + * $scope.$broadcast('mm-chrono-reset', {id: 'mychrono', play: true}); + * + * @param {Number} [id] ID to identify the chrono. It's used when sending events to the chrono. + * @param {Number} [startTime] Number of milliseconds to put in the chrono before starting. Defaults to 0. + * @param {Number} [endTime] Number of milliseconds to stop the chrono. By default, never stop it. + * @param {Boolean} [autoPlay] True to start the chrono automatically right after creating it. + * @param {Function} [onEnd] Function called when the endTime is reached. + */ +.directive('mmChrono', function($interval) { + + /** + * Check if an event received belongs to the current chrono. + * + * @param {Object} scope Chrono's scope. + * @param {Object} data Data received by the event. + * @return {Boolean} True if this chrono, false otherwise. + */ + function isCurrentChrono(scope, data) { + if (!scope.id && (!data || !data.id)) { + // Neither the chrono or the event has ID, consider it's this chrono. + return true; + } else if (scope.id && data && data.id == scope.id) { + // IDs match, it's this chrono. + return true; + } + + return false; + } + + /** + * Reset the chrono, stopping it and setting it to startTime. + * + * @param {Object} scope Chrono's scope. + * @return {Void} + */ + function reset(scope) { + stop(scope); + scope.time = scope.startTime || 0; + } + + /** + * Start the chrono if it isn't running. + * + * @param {Object} scope Chrono's scope. + * @return {Void} + */ + function start(scope) { + if (scope.isRunning) { + // Already running. + return; + } + + var lastExecTime = Date.now(); + scope.isRunning = true; + + scope.interval = $interval(function() { + // Increase the chrono. + scope.time += Date.now() - lastExecTime; + lastExecTime = Date.now(); + + if (typeof scope.endTime != 'undefined' && scope.time > scope.endTime) { + // End time reached, stop the timer and call the end function. + stop(scope); + if (scope.onEnd) { + scope.onEnd(); + } + } + }, 200); + } + + /** + * Stop the chrono, leaving the same time it has. + * + * @param {Object} scope Chrono's scope. + * @return {Void} + */ + function stop(scope) { + scope.isRunning = false; + $interval.cancel(scope.interval); + } + + return { + restrict: 'E', + scope: { + id: '=?', + startTime: '=?', + endTime: '=?', + autoPlay: '=?', + onEnd: '&?' + }, + template: '{{ time / 1000 | mmSecondsToHMS }}', + link: function(scope) { + scope.time = scope.startTime || 0; + + // Listen for events to start, stop and reset. + scope.$on('mm-chrono-start', function (e, data) { + if (isCurrentChrono(scope, data)) { + start(scope); + } + }); + + scope.$on('mm-chrono-stop', function (e, data) { + if (isCurrentChrono(scope, data)) { + stop(scope); + } + }); + + scope.$on('mm-chrono-reset', function (e, data) { + if (isCurrentChrono(scope, data)) { + reset(scope); + if (data && data.play) { + start(scope); + } + } + }); + + // If start time changes, reset the chrono. + scope.$watch('startTime', function() { + var wasRunning = scope.isRunning; + reset(scope); + if (wasRunning) { + start(scope); + } + }); + + if (scope.autoPlay && scope.autoPlay !== 'false') { + // auto-play is true, start the chrono now. + start(scope); + } + + scope.$on('$destroy', function() { + stop(scope); + }); + } + }; +}); diff --git a/www/core/filters/secondstohms.js b/www/core/filters/secondstohms.js index 2649bdab51d..87bbecdf729 100644 --- a/www/core/filters/secondstohms.js +++ b/www/core/filters/secondstohms.js @@ -32,6 +32,9 @@ angular.module('mm.core') if (typeof seconds == 'undefined' || seconds < 0) { seconds = 0; + } else { + // Don't allow decimals. + seconds = Math.floor(seconds); } hours = Math.floor(seconds / mmCoreSecondsHour); From 91c836b002af97c2c72102719bb8ca28f0ee3aae Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 21 Jun 2017 15:57:04 +0200 Subject: [PATCH 034/118] MOBILE-2146 media: Allow recording video --- www/core/components/emulator/scss/styles.scss | 37 +++ .../components/emulator/services/emulator.js | 3 +- .../emulator/services/mediacapture.js | 257 ++++++++++++++++++ .../emulator/templates/capturemediamodal.html | 25 ++ .../fileuploader/services/handlers.js | 2 +- .../fileuploader/services/helper.js | 3 +- www/core/lang/en.json | 1 + www/core/lib/app.js | 24 ++ www/core/scss/styles.scss | 16 ++ www/index.html | 2 +- 10 files changed, 366 insertions(+), 4 deletions(-) create mode 100644 www/core/components/emulator/scss/styles.scss create mode 100644 www/core/components/emulator/services/mediacapture.js create mode 100644 www/core/components/emulator/templates/capturemediamodal.html diff --git a/www/core/components/emulator/scss/styles.scss b/www/core/components/emulator/scss/styles.scss new file mode 100644 index 00000000000..b6c3f5e369f --- /dev/null +++ b/www/core/components/emulator/scss/styles.scss @@ -0,0 +1,37 @@ +.mm-capture-media-modal { + background-color: $gray-light; + + .bar-header { + @include bar-style($bar-content-bg, $bar-content-border, $bar-content-text); + + .button { + color: $bar-content-text; + font-weight: normal; + } + } + + video { + width: 100%; + height: 100%; + + &.mm-webcam-stream { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + } + } + + .bar-footer { + background-color: $gray; + border-top-color: $gray-dark; + + .col { + padding: 0; + line-height: $bar-height - $bar-padding-portrait * 2; + color: $positive; + + .ion-record { + color: red; + } + } + } +} diff --git a/www/core/components/emulator/services/emulator.js b/www/core/components/emulator/services/emulator.js index 0d370a95ce1..1f1216e7f24 100644 --- a/www/core/components/emulator/services/emulator.js +++ b/www/core/components/emulator/services/emulator.js @@ -23,7 +23,7 @@ angular.module('mm.core') */ .factory('$mmEmulatorManager', function($log, $q, $mmFS, $mmEmulatorClipboard, $mmEmulatorCustomURLScheme, $mmEmulatorFile, $mmEmulatorFileTransfer, $mmEmulatorGlobalization, $mmEmulatorInAppBrowser, $mmEmulatorLocalNotifications, - $mmEmulatorPushNotifications, $mmEmulatorZip, $mmUtil) { + $mmEmulatorPushNotifications, $mmEmulatorZip, $mmUtil, $mmEmulatorMediaCapture) { $log = $log.getInstance('$mmEmulatorManager'); @@ -55,6 +55,7 @@ angular.module('mm.core') promises.push($mmEmulatorGlobalization.load()); promises.push($mmEmulatorInAppBrowser.load()); promises.push($mmEmulatorLocalNotifications.load()); + promises.push($mmEmulatorMediaCapture.load()); promises.push($mmEmulatorPushNotifications.load()); promises.push($mmEmulatorZip.load()); diff --git a/www/core/components/emulator/services/mediacapture.js b/www/core/components/emulator/services/mediacapture.js new file mode 100644 index 00000000000..46183df830d --- /dev/null +++ b/www/core/components/emulator/services/mediacapture.js @@ -0,0 +1,257 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +/** + * This service handles the emulation of the Cordova Media Capture plugin in desktop apps and in browser. + * + * @ngdoc service + * @name $mmEmulatorMediaCapture + * @module mm.core.emulator + */ +.factory('$mmEmulatorMediaCapture', function($log, $q, $ionicModal, $rootScope, $window, $mmUtil, $mmFS, $timeout) { + + $log = $log.getInstance('$mmEmulatorMediaCapture'); + + var self = {}, + possibleVideoMimeTypes = { + 'video/webm;codecs=vp9': 'webm', + 'video/webm;codecs=vp8': 'webm', + 'video/ogg': 'ogv' + }, + videoMimeType; + + /** + * Init the getUserMedia function, using a deprecated function as fallback if the new one doesn't exist. + * + * @return {Boolean} Whether the function is supported. + */ + function initGetUserMedia() { + // Check if there is a function to get user media. + navigator.mediaDevices = navigator.mediaDevices || {}; + + if (!navigator.mediaDevices.getUserMedia) { + // New function doesn't exist, check if the deprecated function is supported. + navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || + navigator.mozGetUserMedia || navigator.msGetUserMedia; + + if (navigator.getUserMedia) { + // Deprecated function exists, support the new function using the deprecated one. + navigator.mediaDevices.getUserMedia = function(constraints) { + var deferred = $q.defer(); + navigator.getUserMedia(constraints, deferred.resolve, deferred.reject); + return deferred.promise; + }; + } else { + return false; + } + } + + return true; + } + + /** + * Initialize the mimetypes to use when capturing. + * + * @return {Void} + */ + function initMimeTypes() { + // Determine video mimetype. + for (var mimeType in possibleVideoMimeTypes) { + if (MediaRecorder.isTypeSupported(mimeType)) { + videoMimeType = mimeType; + break; + } + } + } + + /** + * Initialize the modal to capture media. + * + * @param {Object} scope Scope to use in the modal. + * @return {Promise} Promise resolved when the modal is initialized. + */ + function initModal(scope) { + // Chat users modal. + return $ionicModal.fromTemplateUrl('core/components/emulator/templates/capturemediamodal.html', { + scope: scope, + animation: 'slide-in-up' + }).then(function(modal) { + scope.modal = modal; + + return modal; + }); + } + + /** + * Load the emulation of the Cordova plugin. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorMediaCapture#load + * @return {Promise} Promise resolved when done. + */ + self.load = function() { + if (typeof window.MediaRecorder == 'undefined') { + // Cannot record. + return $q.when(); + } + + if (!initGetUserMedia()) { + // Function not supported, stop. + return $q.when(); + } + + initMimeTypes(); + + navigator.device = navigator.device || {}; + navigator.device.capture = navigator.device.capture || {}; + + navigator.device.capture.captureVideo = function(successCallback, errorCallback, options) { + try { + var scope = $rootScope.$new(), + loadingModal = $mmUtil.showModalLoading(); + + if (options && options.duration) { + scope.chronoEndTime = options.duration * 1000; + } + + initModal(scope).then(function(modal) { + navigator.mediaDevices.getUserMedia({video: true, audio: true}).then(function(localMediaStream) { + var streamVideo = modal.modalEl.querySelector('video.mm-webcam-stream'), + viewVideo = modal.modalEl.querySelector('video.mm-webcam-video-captured'), + mediaRecorder = new MediaRecorder(localMediaStream, {mimeType: videoMimeType}), + chunks = [], + mediaBlob; + + // Set the stream as the source of the video. + streamVideo.src = $window.URL.createObjectURL(localMediaStream); + + // When data is captured, add it to the list of chunks. + mediaRecorder.ondataavailable = function(e) { + if (e.data.size > 0) { + chunks.push(e.data); + } + }; + + // When capturing stops, create a Blob element with the recording and set it to the video. + mediaRecorder.onstop = function() { + mediaBlob = new Blob(chunks); + chunks = []; + + viewVideo.src = $window.URL.createObjectURL(mediaBlob); + }; + + // Stream ready, show modal. + streamVideo.onloadedmetadata = function() { + loadingModal.dismiss(); + modal.show(); + scope.readyToCapture = true; + streamVideo.onloadedmetadata = null; + }; + + // Capture or stop capturing (for video and audio). + scope.actionClicked = function() { + if (scope.isCapturing) { + // It's capturing, stop. + scope.stopCapturing(); + } else { + // Start the capture. + mediaRecorder.start(); + scope.isCapturing = true; + scope.$broadcast('mm-chrono-start'); + } + }; + + // Stop capturing. + scope.stopCapturing = function() { + streamVideo.pause(); + mediaRecorder.stop(); + scope.isCapturing = false; + scope.hasCaptured = true; + scope.$broadcast('mm-chrono-stop'); + }; + + // Discard the captured media. + scope.discard = function() { + viewVideo.pause(); + streamVideo.play(); + + scope.hasCaptured = false; + scope.isCapturing = false; + scope.$broadcast('mm-chrono-reset'); + delete mediaBlob; + }; + + // Done capturing, write the file. + scope.done = function() { + if (!mediaBlob) { + // Shouldn't happen. + $mmUtil.showErrorModal('Please capture the media first.'); + return; + } + + // Create the file and return it. + var fileName = 'video_' + $mmUtil.readableTimestamp() + '.' + possibleVideoMimeTypes[videoMimeType], + path = $mmFS.concatenatePaths($mmFS.getTmpFolder(), 'media/' + fileName); + + loadingModal = $mmUtil.showModalLoading(); + + $mmFS.writeFile(path, mediaBlob).then(function(fileEntry) { + scope.modal.hide(); + + // Wait for the modal to close before calling the callback to prevent Ionic bug with modals. + $timeout(function() { + successCallback && successCallback([fileEntry]); + }, 400); + }).catch(function(err) { + $mmUtil.showErrorModal(err); + }).finally(function() { + loadingModal.dismiss(); + }); + }; + + // Capture cancelled. + scope.cancel = function() { + scope.modal.hide(); + errorCallback && errorCallback({code: 3, message: "Canceled."}); + }; + + scope.$on('modal.hidden', function() { + // Modal hidden, stop video and stream and destroy the scope. + var tracks = localMediaStream.getTracks(); + angular.forEach(tracks, function(track) { + track.stop(); + }); + streamVideo.pause(); + viewVideo.pause(); + scope.$destroy(); + }); + + scope.$on('$destroy', function() { + scope.modal.remove(); + }); + }).catch(errorCallback); + }, errorCallback); + } catch(ex) { + errorCallback(ex.toString()); + } + }; + + return $q.when(); + }; + + return self; +}); diff --git a/www/core/components/emulator/templates/capturemediamodal.html b/www/core/components/emulator/templates/capturemediamodal.html new file mode 100644 index 00000000000..e3680c156b1 --- /dev/null +++ b/www/core/components/emulator/templates/capturemediamodal.html @@ -0,0 +1,25 @@ + + + +

{{ 'mm.core.capturemedia' | translate }}

+ +
+ + + + + + + + +
+ +
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/www/core/components/fileuploader/services/handlers.js b/www/core/components/fileuploader/services/handlers.js index 13106a7b9df..edb5f56c9cc 100644 --- a/www/core/components/fileuploader/services/handlers.js +++ b/www/core/components/fileuploader/services/handlers.js @@ -177,7 +177,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return $mmApp.isDevice(); + return $mmApp.isDevice() || ($mmApp.canGetUserMedia() && $mmApp.canRecordMedia()); }; /** diff --git a/www/core/components/fileuploader/services/helper.js b/www/core/components/fileuploader/services/helper.js index f0f0cd9f9f3..ac06e7d6d48 100644 --- a/www/core/components/fileuploader/services/helper.js +++ b/www/core/components/fileuploader/services/helper.js @@ -431,7 +431,8 @@ angular.module('mm.core.fileuploader') return fn({limit: 1}).then(function(medias) { // We used limit 1, we only want 1 media. var media = medias[0], - path = media.localURL; + path = media.localURL || media.toURL(); + if (upload) { return uploadFile(true, path, maxSize, true, $mmFileUploader.uploadMedia, media); } else { diff --git a/www/core/lang/en.json b/www/core/lang/en.json index 3870dcb79dd..027f92f4322 100644 --- a/www/core/lang/en.json +++ b/www/core/lang/en.json @@ -7,6 +7,7 @@ "cancel": "Cancel", "cannotconnect": "Cannot connect: Verify that you have typed correctly the URL and that your site uses Moodle 2.4 or later.", "cannotdownloadfiles": "File downloading is disabled in your Mobile service. Please, contact your site administrator.", + "capturemedia": "Capture media", "category": "Category", "choose": "Choose", "choosedots": "Choose...", diff --git a/www/core/lib/app.js b/www/core/lib/app.js index 4b40c7d47f3..be75fa0233e 100644 --- a/www/core/lib/app.js +++ b/www/core/lib/app.js @@ -103,6 +103,30 @@ angular.module('mm.core') self = {}, ssoAuthenticationDeferred; + /** + * Check if the browser supports mediaDevices.getUserMedia. + * + * @module mm.core + * @ngdoc method + * @name $mmApp#canGetUserMedia + * @return {Boolean} Whether the function is supported. + */ + self.canGetUserMedia = function() { + return !!(navigator && navigator.mediaDevices && navigator.mediaDevices.getUserMedia); + }; + + /** + * Check if the browser supports MediaRecorder. + * + * @module mm.core + * @ngdoc method + * @name $mmApp#canRecordMedia + * @return {Boolean} Whether the function is supported. + */ + self.canRecordMedia = function() { + return !!window.MediaRecorder; + }; + /** * Create a new state in the UI-router. * diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index 125685f726f..8af1907df25 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -1639,3 +1639,19 @@ h2.invert { position: absolute; left: -10000px; } + +// Full screen modal. +.modal-wrapper .modal.mm-fullscreen-modal { + width: 100%; + height: 100%; + left: 0; + top: 0; + bottom: 0; + right: 0 +} + +// Buttons in header in modals. +.modal .bar-header .button { + border-color: transparent; + background: none; +} diff --git a/www/index.html b/www/index.html index 646aa4240a6..03a307c50fa 100644 --- a/www/index.html +++ b/www/index.html @@ -3,7 +3,7 @@ - + Moodle Mobile From 8b5edd5d4789ec49d2645bb10ac7df693a277c4e Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 22 Jun 2017 12:33:47 +0200 Subject: [PATCH 035/118] MOBILE-2146 media: Allow capturing images --- www/core/components/emulator/scss/styles.scss | 21 +- .../emulator/services/mediacapture.js | 419 +++++++++++++----- .../emulator/templates/capturemediamodal.html | 15 +- .../fileuploader/services/handlers.js | 2 +- www/core/lang/en.json | 5 +- www/index.html | 2 +- 6 files changed, 334 insertions(+), 130 deletions(-) diff --git a/www/core/components/emulator/scss/styles.scss b/www/core/components/emulator/scss/styles.scss index b6c3f5e369f..cbcaf50563e 100644 --- a/www/core/components/emulator/scss/styles.scss +++ b/www/core/components/emulator/scss/styles.scss @@ -10,16 +10,25 @@ } } - video { - width: 100%; - height: 100%; + .mm-capture-media-modal-content { + text-align: center; - &.mm-webcam-stream { - -webkit-transform: scaleX(-1); - transform: scaleX(-1); + video { + max-width: 100%; + max-height: 100%; + + &.mm-webcam-stream { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + } + } + + .mm-webcam-image-canvas { + display: none; } } + .bar-footer { background-color: $gray; border-top-color: $gray-dark; diff --git a/www/core/components/emulator/services/mediacapture.js b/www/core/components/emulator/services/mediacapture.js index 46183df830d..471006e7801 100644 --- a/www/core/components/emulator/services/mediacapture.js +++ b/www/core/components/emulator/services/mediacapture.js @@ -33,6 +33,250 @@ angular.module('mm.core.emulator') }, videoMimeType; + /** + * Capture media (image, audio, video). + * + * @param {String} type Type of media: image, audio, video. + * @param {Function} successCallback Function called when media taken. + * @param {Function} errorCallback Function called when error or cancel. + * @param {Object} [options] Optional options. + * @return {Void} + */ + function captureMedia(type, successCallback, errorCallback, options) { + options = options || {}; + + try { + var scope = $rootScope.$new(), + loadingModal = $mmUtil.showModalLoading(), + facingMode = 'environment', + mimetype, + extension, + quality = 0.92, // Image only. + returnData = false; // Image only. + + // Initialize some data based on the type of media to capture. + if (type == 'video') { + scope.isVideo = true; + title = 'mm.core.capturevideo'; + mimetype = videoMimeType; + extension = possibleVideoMimeTypes[mimetype]; + } else if (type == 'audio') { + scope.isAudio = true; + title = 'mm.core.captureaudio'; + } else if (type == 'image') { + scope.isImage = true; + title = 'mm.core.captureimage'; + + if (typeof options.sourceType != 'undefined' && options.sourceType != Camera.PictureSourceType.CAMERA) { + errorCallback && errorCallback('This source type is not supported in desktop.'); + loadingModal.dismiss(); + return; + } + + if (options.cameraDirection == Camera.Direction.FRONT) { + facingMode = 'user'; + } + + if (options.encodingType == Camera.EncodingType.PNG) { + mimetype = 'image/png'; + extension = 'png'; + } else { + mimetype = 'image/jpeg'; + extension = 'jpeg'; + } + + if (options.quality >= 0 && options.quality <= 100) { + quality = options.quality / 100; + } + + if (options.destinationType == Camera.DestinationType.DATA_URL) { + returnData = true; + } + } + + if (options.duration) { + scope.chronoEndTime = options.duration * 1000; + } + + initModal(scope).then(function(modal) { + var constraints = { + video: scope.isAudio ? false : {facingMode: facingMode}, + audio: !scope.isImage + }; + + navigator.mediaDevices.getUserMedia(constraints).then(function(localMediaStream) { + var streamVideo, + viewVideo, + canvas, + imgEl, + mediaRecorder, + chunks = [], + mediaBlob; + + if (scope.isImage) { + canvas = modal.modalEl.querySelector('canvas.mm-webcam-image-canvas'); + imgEl = modal.modalEl.querySelector('img.mm-webcam-image'); + } else { + if (scope.isVideo) { + viewVideo = modal.modalEl.querySelector('video.mm-webcam-video-captured'); + } + + mediaRecorder = new MediaRecorder(localMediaStream, {mimeType: mimetype}); + + // When video or audio is recorded, add it to the list of chunks. + mediaRecorder.ondataavailable = function(e) { + if (e.data.size > 0) { + chunks.push(e.data); + } + }; + + // When recording stops, create a Blob element with the recording and set it to the video or audio. + mediaRecorder.onstop = function() { + mediaBlob = new Blob(chunks); + chunks = []; + + viewVideo.src = $window.URL.createObjectURL(mediaBlob); + }; + } + + if (scope.isImage || scope.isVideo) { + // Set the stream as the source of the video. + streamVideo = modal.modalEl.querySelector('video.mm-webcam-stream'); + streamVideo.src = $window.URL.createObjectURL(localMediaStream); + + // Stream ready, show modal. + streamVideo.onloadedmetadata = function() { + loadingModal.dismiss(); + modal.show(); + scope.readyToCapture = true; + streamVideo.onloadedmetadata = null; + }; + } + + // Capture or stop capturing (stop is only for video and audio). + scope.actionClicked = function() { + if (scope.isCapturing) { + // It's capturing, stop. + scope.stopCapturing(); + } else { + if (!scope.isImage) { + // Start the capture. + scope.isCapturing = true; + mediaRecorder.start(); + scope.$broadcast('mm-chrono-start'); + } else { + // Get the image from the video and set it to the canvas, using video width/height. + var width = streamVideo.offsetWidth, + height = streamVideo.offsetHeight; + + canvas.width = width; + canvas.height = height; + canvas.getContext('2d').drawImage(streamVideo, 0, 0, width, height); + + // Convert the image to blob and show it in an image element. + loadingModal = $mmUtil.showModalLoading(); + canvas.toBlob(function(blob) { + loadingModal.dismiss(); + + mediaBlob = blob; + imgEl.setAttribute('src', $window.URL.createObjectURL(mediaBlob)); + scope.hasCaptured = true; + }, mimetype, quality); + + } + } + }; + + // Stop capturing. Only for video and audio. + scope.stopCapturing = function() { + viewVideo && streamVideo.pause(); + mediaRecorder.stop(); + scope.isCapturing = false; + scope.hasCaptured = true; + scope.$broadcast('mm-chrono-stop'); + }; + + // Discard the captured media. + scope.discard = function() { + viewVideo && viewVideo.pause(); + streamVideo && streamVideo.play(); + + scope.hasCaptured = false; + scope.isCapturing = false; + scope.$broadcast('mm-chrono-reset'); + delete mediaBlob; + }; + + // Done capturing, write the file. + scope.done = function() { + if (returnData) { + // Return the image as a base64 string. + success(canvas.toDataURL(mimetype, quality)); + return; + } + + if (!mediaBlob) { + // Shouldn't happen. + $mmUtil.showErrorModal('Please capture the media first.'); + return; + } + + // Create the file and return it. + var fileName = type + '_' + $mmUtil.readableTimestamp() + '.' + extension, + path = $mmFS.concatenatePaths($mmFS.getTmpFolder(), 'media/' + fileName); + + loadingModal = $mmUtil.showModalLoading(); + + $mmFS.writeFile(path, mediaBlob).then(function(fileEntry) { + if (scope.isImage) { + success(fileEntry.toURL()); + } else { + success([fileEntry]); + } + }).catch(function(err) { + $mmUtil.showErrorModal(err); + }).finally(function() { + loadingModal.dismiss(); + }); + }; + + // Success capturing the data. + function success(data) { + scope.modal.hide(); + + // Wait for the modal to close before calling the callback to prevent Ionic bug with modals. + $timeout(function() { + successCallback && successCallback(data); + }, 400); + } + + // Capture cancelled. + scope.cancel = function() { + scope.modal.hide(); + errorCallback && errorCallback({code: 3, message: "Canceled."}); + }; + + scope.$on('modal.hidden', function() { + // Modal hidden, stop video and stream and destroy the scope. + var tracks = localMediaStream.getTracks(); + angular.forEach(tracks, function(track) { + track.stop(); + }); + streamVideo && streamVideo.pause(); + viewVideo && viewVideo.pause(); + scope.$destroy(); + }); + + scope.$on('$destroy', function() { + scope.modal.remove(); + }); + }).catch(errorCallback); + }, errorCallback); + } catch(ex) { + errorCallback(ex.toString()); + } + } + /** * Init the getUserMedia function, using a deprecated function as fallback if the new one doesn't exist. * @@ -118,136 +362,79 @@ angular.module('mm.core.emulator') navigator.device = navigator.device || {}; navigator.device.capture = navigator.device.capture || {}; + navigator.camera = navigator.camera || {}; - navigator.device.capture.captureVideo = function(successCallback, errorCallback, options) { - try { - var scope = $rootScope.$new(), - loadingModal = $mmUtil.showModalLoading(); - - if (options && options.duration) { - scope.chronoEndTime = options.duration * 1000; - } - - initModal(scope).then(function(modal) { - navigator.mediaDevices.getUserMedia({video: true, audio: true}).then(function(localMediaStream) { - var streamVideo = modal.modalEl.querySelector('video.mm-webcam-stream'), - viewVideo = modal.modalEl.querySelector('video.mm-webcam-video-captured'), - mediaRecorder = new MediaRecorder(localMediaStream, {mimeType: videoMimeType}), - chunks = [], - mediaBlob; - - // Set the stream as the source of the video. - streamVideo.src = $window.URL.createObjectURL(localMediaStream); - - // When data is captured, add it to the list of chunks. - mediaRecorder.ondataavailable = function(e) { - if (e.data.size > 0) { - chunks.push(e.data); - } - }; + // Create Camera constants. + $window.Camera = $window.Camera || {}; - // When capturing stops, create a Blob element with the recording and set it to the video. - mediaRecorder.onstop = function() { - mediaBlob = new Blob(chunks); - chunks = []; - - viewVideo.src = $window.URL.createObjectURL(mediaBlob); - }; - - // Stream ready, show modal. - streamVideo.onloadedmetadata = function() { - loadingModal.dismiss(); - modal.show(); - scope.readyToCapture = true; - streamVideo.onloadedmetadata = null; - }; + $window.Camera.DestinationType = { + DATA_URL: 0, + FILE_URI: 1, + NATIVE_URI: 2 + }; - // Capture or stop capturing (for video and audio). - scope.actionClicked = function() { - if (scope.isCapturing) { - // It's capturing, stop. - scope.stopCapturing(); - } else { - // Start the capture. - mediaRecorder.start(); - scope.isCapturing = true; - scope.$broadcast('mm-chrono-start'); - } - }; + $window.Camera.Direction = { + BACK: 0, + FRONT: 1 + }; - // Stop capturing. - scope.stopCapturing = function() { - streamVideo.pause(); - mediaRecorder.stop(); - scope.isCapturing = false; - scope.hasCaptured = true; - scope.$broadcast('mm-chrono-stop'); - }; + $window.Camera.EncodingType = { + JPEG: 0, + PNG: 1 + }; - // Discard the captured media. - scope.discard = function() { - viewVideo.pause(); - streamVideo.play(); + $window.Camera.MediaType = { + PICTURE: 0, + VIDEO: 1, + ALLMEDIA: 2 + }; - scope.hasCaptured = false; - scope.isCapturing = false; - scope.$broadcast('mm-chrono-reset'); - delete mediaBlob; - }; + $window.Camera.PictureSourceType = { + PHOTOLIBRARY: 0, + CAMERA: 1, + SAVEDPHOTOALBUM: 2 + }; - // Done capturing, write the file. - scope.done = function() { - if (!mediaBlob) { - // Shouldn't happen. - $mmUtil.showErrorModal('Please capture the media first.'); - return; - } + $window.Camera.PopoverArrowDirection = { + ARROW_UP: 1, + ARROW_DOWN: 2, + ARROW_LEFT: 4, + ARROW_RIGHT: 8, + ARROW_ANY: 15 + }; - // Create the file and return it. - var fileName = 'video_' + $mmUtil.readableTimestamp() + '.' + possibleVideoMimeTypes[videoMimeType], - path = $mmFS.concatenatePaths($mmFS.getTmpFolder(), 'media/' + fileName); + // Copy the constants to navigator.camera. + angular.extend(navigator.camera, $window.Camera); - loadingModal = $mmUtil.showModalLoading(); + // Create CameraPopoverOptions and CameraPopoverHandle. + $window.CameraPopoverOptions = function() { + // Nothing to do, not supported in desktop. + }; - $mmFS.writeFile(path, mediaBlob).then(function(fileEntry) { - scope.modal.hide(); + $window.CameraPopoverHandle = function() { + // Nothing to do, not supported in desktop. + }; + $window.CameraPopoverHandle.prototype.setPosition = function() { + // Nothing to do, not supported in desktop. + }; - // Wait for the modal to close before calling the callback to prevent Ionic bug with modals. - $timeout(function() { - successCallback && successCallback([fileEntry]); - }, 400); - }).catch(function(err) { - $mmUtil.showErrorModal(err); - }).finally(function() { - loadingModal.dismiss(); - }); - }; + // Create camera methods. + navigator.camera.getPicture = function(successCallback, errorCallback, options) { + return captureMedia('image', successCallback, errorCallback, options); + }; - // Capture cancelled. - scope.cancel = function() { - scope.modal.hide(); - errorCallback && errorCallback({code: 3, message: "Canceled."}); - }; + navigator.camera.cleanup = function(successCallback, errorCallback) { + // The tmp folder is cleaned when the app is started, do nothing. + successCallback && successCallback(); + }; - scope.$on('modal.hidden', function() { - // Modal hidden, stop video and stream and destroy the scope. - var tracks = localMediaStream.getTracks(); - angular.forEach(tracks, function(track) { - track.stop(); - }); - streamVideo.pause(); - viewVideo.pause(); - scope.$destroy(); - }); + // Support Media Capture methods. + navigator.device.capture.captureImage = function(successCallback, errorCallback, options) { + return captureMedia('image', successCallback, errorCallback, options); + }; - scope.$on('$destroy', function() { - scope.modal.remove(); - }); - }).catch(errorCallback); - }, errorCallback); - } catch(ex) { - errorCallback(ex.toString()); - } + navigator.device.capture.captureVideo = function(successCallback, errorCallback, options) { + return captureMedia('video', successCallback, errorCallback, options); }; return $q.when(); diff --git a/www/core/components/emulator/templates/capturemediamodal.html b/www/core/components/emulator/templates/capturemediamodal.html index e3680c156b1..1ad45c34640 100644 --- a/www/core/components/emulator/templates/capturemediamodal.html +++ b/www/core/components/emulator/templates/capturemediamodal.html @@ -1,14 +1,19 @@ -

{{ 'mm.core.capturemedia' | translate }}

+

{{ title }}

- + - + + +
+ + {{ 'mm.core.capturedimage' | translate }} +
@@ -16,10 +21,10 @@

{{ 'mm.core.capturemedia' | translate }}

- +
- +
\ No newline at end of file diff --git a/www/core/components/fileuploader/services/handlers.js b/www/core/components/fileuploader/services/handlers.js index edb5f56c9cc..fd892f939c1 100644 --- a/www/core/components/fileuploader/services/handlers.js +++ b/www/core/components/fileuploader/services/handlers.js @@ -87,7 +87,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return $mmApp.isDevice(); + return $mmApp.isDevice() || $mmApp.canGetUserMedia(); }; /** diff --git a/www/core/lang/en.json b/www/core/lang/en.json index 027f92f4322..ae7b95ab827 100644 --- a/www/core/lang/en.json +++ b/www/core/lang/en.json @@ -7,7 +7,10 @@ "cancel": "Cancel", "cannotconnect": "Cannot connect: Verify that you have typed correctly the URL and that your site uses Moodle 2.4 or later.", "cannotdownloadfiles": "File downloading is disabled in your Mobile service. Please, contact your site administrator.", - "capturemedia": "Capture media", + "captureaudio": "Record audio", + "capturedimage": "Taken picture.", + "captureimage": "Take picture", + "capturevideo": "Record video", "category": "Category", "choose": "Choose", "choosedots": "Choose...", diff --git a/www/index.html b/www/index.html index 03a307c50fa..7ea51cb8406 100644 --- a/www/index.html +++ b/www/index.html @@ -3,7 +3,7 @@ - + Moodle Mobile From 1fc5e81497d7673fe981efeeeb1d585890cce008 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 22 Jun 2017 16:12:20 +0200 Subject: [PATCH 036/118] MOBILE-2146 media: Allow capturing audio --- www/core/components/emulator/scss/styles.scss | 14 ++ .../emulator/services/mediacapture.js | 161 ++++++++++++++++-- .../emulator/templates/capturemediamodal.html | 11 +- .../fileuploader/services/handlers.js | 2 +- 4 files changed, 173 insertions(+), 15 deletions(-) diff --git a/www/core/components/emulator/scss/styles.scss b/www/core/components/emulator/scss/styles.scss index cbcaf50563e..de49a540725 100644 --- a/www/core/components/emulator/scss/styles.scss +++ b/www/core/components/emulator/scss/styles.scss @@ -26,6 +26,20 @@ .mm-webcam-image-canvas { display: none; } + + .mm-audio-record-container { + width: 100%; + height: 100%; + + .mm-audio-canvas { + width: 100%; + height: 100%; + } + + .mm-audio-captured { + width: 100%; + } + } } diff --git a/www/core/components/emulator/services/mediacapture.js b/www/core/components/emulator/services/mediacapture.js index 471006e7801..fbecee6eb1c 100644 --- a/www/core/components/emulator/services/mediacapture.js +++ b/www/core/components/emulator/services/mediacapture.js @@ -26,12 +26,17 @@ angular.module('mm.core.emulator') $log = $log.getInstance('$mmEmulatorMediaCapture'); var self = {}, + possibleAudioMimeTypes = { + 'audio/webm': 'weba', + 'audio/ogg': 'ogg' + }, possibleVideoMimeTypes = { 'video/webm;codecs=vp9': 'webm', 'video/webm;codecs=vp8': 'webm', 'video/ogg': 'ogv' }, - videoMimeType; + videoMimeType, + audioMimeType; /** * Capture media (image, audio, video). @@ -52,7 +57,13 @@ angular.module('mm.core.emulator') mimetype, extension, quality = 0.92, // Image only. - returnData = false; // Image only. + returnData = false, // Image only. + isCaptureImage = false; // To identify if it's capturing an image using media capture plugin (instead of camera). + + if (type == 'captureimage') { + isCaptureImage = true; + type = 'image'; + } // Initialize some data based on the type of media to capture. if (type == 'video') { @@ -63,6 +74,8 @@ angular.module('mm.core.emulator') } else if (type == 'audio') { scope.isAudio = true; title = 'mm.core.captureaudio'; + mimetype = audioMimeType; + extension = possibleAudioMimeTypes[mimetype]; } else if (type == 'image') { scope.isImage = true; title = 'mm.core.captureimage'; @@ -106,19 +119,25 @@ angular.module('mm.core.emulator') navigator.mediaDevices.getUserMedia(constraints).then(function(localMediaStream) { var streamVideo, - viewVideo, + previewMedia, canvas, imgEl, mediaRecorder, chunks = [], - mediaBlob; + mediaBlob, + audioDrawer; if (scope.isImage) { canvas = modal.modalEl.querySelector('canvas.mm-webcam-image-canvas'); imgEl = modal.modalEl.querySelector('img.mm-webcam-image'); } else { if (scope.isVideo) { - viewVideo = modal.modalEl.querySelector('video.mm-webcam-video-captured'); + previewMedia = modal.modalEl.querySelector('video.mm-webcam-video-captured'); + } else { + previewMedia = modal.modalEl.querySelector('audio.mm-audio-captured'); + canvas = modal.modalEl.querySelector('canvas.mm-audio-canvas'); + audioDrawer = initAudioDrawer(localMediaStream, canvas); + audioDrawer.start(); } mediaRecorder = new MediaRecorder(localMediaStream, {mimeType: mimetype}); @@ -135,7 +154,7 @@ angular.module('mm.core.emulator') mediaBlob = new Blob(chunks); chunks = []; - viewVideo.src = $window.URL.createObjectURL(mediaBlob); + previewMedia.src = $window.URL.createObjectURL(mediaBlob); }; } @@ -151,6 +170,11 @@ angular.module('mm.core.emulator') scope.readyToCapture = true; streamVideo.onloadedmetadata = null; }; + } else { + // No need to wait to show the modal. + loadingModal.dismiss(); + modal.show(); + scope.readyToCapture = true; } // Capture or stop capturing (stop is only for video and audio). @@ -189,7 +213,8 @@ angular.module('mm.core.emulator') // Stop capturing. Only for video and audio. scope.stopCapturing = function() { - viewVideo && streamVideo.pause(); + streamVideo && streamVideo.pause(); + audioDrawer && audioDrawer.stop(); mediaRecorder.stop(); scope.isCapturing = false; scope.hasCaptured = true; @@ -198,8 +223,9 @@ angular.module('mm.core.emulator') // Discard the captured media. scope.discard = function() { - viewVideo && viewVideo.pause(); + previewMedia && previewMedia.pause(); streamVideo && streamVideo.play(); + audioDrawer && audioDrawer.start(); scope.hasCaptured = false; scope.isCapturing = false; @@ -228,9 +254,15 @@ angular.module('mm.core.emulator') loadingModal = $mmUtil.showModalLoading(); $mmFS.writeFile(path, mediaBlob).then(function(fileEntry) { - if (scope.isImage) { + if (scope.isImage && !isCaptureImage) { success(fileEntry.toURL()); } else { + // The capture plugin returns a MediaFile, not a FileEntry. The only difference is that + // it supports a new function that won't be supported in desktop. + fileEntry.getFormatData = function(successFn, errorFn) { + errorFn && errorFn('Not supported'); + }; + success([fileEntry]); } }).catch(function(err) { @@ -253,7 +285,8 @@ angular.module('mm.core.emulator') // Capture cancelled. scope.cancel = function() { scope.modal.hide(); - errorCallback && errorCallback({code: 3, message: "Canceled."}); + var error = scope.isImage && !isCaptureImage ? 'Camera cancelled' : {code: 3, message: 'Canceled.'}; + errorCallback && errorCallback(error); }; scope.$on('modal.hidden', function() { @@ -263,7 +296,8 @@ angular.module('mm.core.emulator') track.stop(); }); streamVideo && streamVideo.pause(); - viewVideo && viewVideo.pause(); + previewMedia && previewMedia.pause(); + audioDrawer && audioDrawer.stop(); scope.$destroy(); }); @@ -277,6 +311,88 @@ angular.module('mm.core.emulator') } } + /** + * Initialize the audio drawer. This code has been extracted from MDN's example on MediaStream Recording: + * https://github.com/mdn/web-dictaphone + * + * @param {Object} stream Stream returned by getUserMedia. + * @param {Object} canvas Canvas element where to draw the audio waves. + * @return {Object} Object to start and stop the drawer. + */ + function initAudioDrawer(stream, canvas) { + var audioCtx = new (window.AudioContext || webkitAudioContext)(), + canvasCtx = canvas.getContext("2d"), + source = audioCtx.createMediaStreamSource(stream), + analyser = audioCtx.createAnalyser(), + bufferLength = analyser.frequencyBinCount, + dataArray = new Uint8Array(bufferLength), + width = canvas.width, + height = canvas.height, + running = false, + skip = true; + + analyser.fftSize = 2048; + source.connect(analyser); + + return { + start: function() { + if (running) { + return; + } + + running = true; + drawAudio(); + }, + stop: function() { + running = false; + } + }; + + function drawAudio() { + if (!running) { + return; + } + + // Update the draw every animation frame. + requestAnimationFrame(drawAudio); + + // Skip half of the frames to improve performance, shouldn't affect the smoothness. + skip = !skip; + if (skip) { + return; + } + + var sliceWidth = width / bufferLength, + x = 0; + + analyser.getByteTimeDomainData(dataArray); + + canvasCtx.fillStyle = 'rgb(200, 200, 200)'; + canvasCtx.fillRect(0, 0, width, height); + + canvasCtx.lineWidth = 1; + canvasCtx.strokeStyle = 'rgb(0, 0, 0)'; + + canvasCtx.beginPath(); + + for(var i = 0; i < bufferLength; i++) { + var v = dataArray[i] / 128.0, + y = v * height / 2; + + if (i === 0) { + canvasCtx.moveTo(x, y); + } else { + canvasCtx.lineTo(x, y); + } + + x += sliceWidth; + } + + canvasCtx.lineTo(width, height / 2); + canvasCtx.stroke(); + } + } + /** * Init the getUserMedia function, using a deprecated function as fallback if the new one doesn't exist. * @@ -312,13 +428,20 @@ angular.module('mm.core.emulator') * @return {Void} */ function initMimeTypes() { - // Determine video mimetype. + // Determine video and audio mimetype to use. for (var mimeType in possibleVideoMimeTypes) { if (MediaRecorder.isTypeSupported(mimeType)) { videoMimeType = mimeType; break; } } + + for (mimeType in possibleAudioMimeTypes) { + if (MediaRecorder.isTypeSupported(mimeType)) { + audioMimeType = mimeType; + break; + } + } } /** @@ -430,13 +553,25 @@ angular.module('mm.core.emulator') // Support Media Capture methods. navigator.device.capture.captureImage = function(successCallback, errorCallback, options) { - return captureMedia('image', successCallback, errorCallback, options); + return captureMedia('captureimage', successCallback, errorCallback, options); }; navigator.device.capture.captureVideo = function(successCallback, errorCallback, options) { return captureMedia('video', successCallback, errorCallback, options); }; + navigator.device.capture.captureAudio = function(successCallback, errorCallback, options) { + return captureMedia('audio', successCallback, errorCallback, options); + }; + + // Support other Media Capture variables. + $window.CaptureAudioOptions = function() {}; + $window.CaptureImageOptions = function() {}; + $window.CaptureVideoOptions = function() {}; + $window.CaptureError = function(c) { + this.code = c || null; + }; + return $q.when(); }; diff --git a/www/core/components/emulator/templates/capturemediamodal.html b/www/core/components/emulator/templates/capturemediamodal.html index 1ad45c34640..aaf6e993159 100644 --- a/www/core/components/emulator/templates/capturemediamodal.html +++ b/www/core/components/emulator/templates/capturemediamodal.html @@ -6,14 +6,23 @@

{{ title }}

+ + + -
+ {{ 'mm.core.capturedimage' | translate }}
+ + +
+ + +
diff --git a/www/core/components/fileuploader/services/handlers.js b/www/core/components/fileuploader/services/handlers.js index fd892f939c1..3f612ae4d04 100644 --- a/www/core/components/fileuploader/services/handlers.js +++ b/www/core/components/fileuploader/services/handlers.js @@ -132,7 +132,7 @@ angular.module('mm.core.fileuploader') * @return {Boolean} True if handler is enabled, false otherwise. */ self.isEnabled = function() { - return $mmApp.isDevice(); + return $mmApp.isDevice() || ($mmApp.canGetUserMedia() && $mmApp.canRecordMedia()); }; /** From 42feb7a6a848ad9279341b72838dccbd1068b8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 23 Jun 2017 16:14:53 +0200 Subject: [PATCH 037/118] MOBILE-2146 electron: Style audio and video recording --- www/core/components/emulator/scss/styles.scss | 33 +++++++++++++++---- .../emulator/services/mediacapture.js | 4 +-- .../emulator/templates/capturemediamodal.html | 32 +++++++++--------- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/www/core/components/emulator/scss/styles.scss b/www/core/components/emulator/scss/styles.scss index de49a540725..7bfb9f8e8dd 100644 --- a/www/core/components/emulator/scss/styles.scss +++ b/www/core/components/emulator/scss/styles.scss @@ -13,9 +13,27 @@ .mm-capture-media-modal-content { text-align: center; - video { - max-width: 100%; - max-height: 100%; + .mm-av-wrapper { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + display: table; + height: 100%; + width: 100%; + margin: 0; + padding: 0; + clear: both; + } + + audio, video, img { + width: 100%; + height: 100%; + display: table-cell; + text-align: center; + vertical-align: middle; + object-fit: contain; &.mm-webcam-stream { -webkit-transform: scaleX(-1); @@ -50,10 +68,13 @@ .col { padding: 0; line-height: $bar-height - $bar-padding-portrait * 2; - color: $positive; - .ion-record { - color: red; + .button-icon { + color: $black; + } + + .ion-record, .ion-trash-a { + color: $red; } } } diff --git a/www/core/components/emulator/services/mediacapture.js b/www/core/components/emulator/services/mediacapture.js index fbecee6eb1c..473ff8cc621 100644 --- a/www/core/components/emulator/services/mediacapture.js +++ b/www/core/components/emulator/services/mediacapture.js @@ -190,8 +190,8 @@ angular.module('mm.core.emulator') scope.$broadcast('mm-chrono-start'); } else { // Get the image from the video and set it to the canvas, using video width/height. - var width = streamVideo.offsetWidth, - height = streamVideo.offsetHeight; + var width = streamVideo.videoWidth, + height = streamVideo.videoHeight; canvas.width = width; canvas.height = height; diff --git a/www/core/components/emulator/templates/capturemediamodal.html b/www/core/components/emulator/templates/capturemediamodal.html index aaf6e993159..7d8be7d37d9 100644 --- a/www/core/components/emulator/templates/capturemediamodal.html +++ b/www/core/components/emulator/templates/capturemediamodal.html @@ -5,32 +5,32 @@

{{ title }}

- - - + - - +
+ + + + + -
- - {{ 'mm.core.capturedimage' | translate }} -
+ + {{ 'mm.core.capturedimage' | translate }} - -
- - + +
+ + +
-
- -
+
+
From 9befd13c764a1f757e58cb129dba2b624f8dfd8f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 15 Jun 2017 10:13:32 +0200 Subject: [PATCH 038/118] MOBILE-2145 electron: Simulate push notifications in desktop --- www/addons/messages/main.js | 36 ++-- www/addons/messages/services/handlers.js | 46 ++++- www/addons/messages/services/messages.js | 125 +++++++++++--- www/addons/notifications/main.js | 40 +++-- www/addons/notifications/services/handlers.js | 41 ++++- .../notifications/services/notifications.js | 114 +++++++----- .../components/emulator/services/emulator.js | 6 +- .../components/emulator/services/helper.js | 162 ++++++++++++++++++ www/core/lib/cron.js | 8 +- 9 files changed, 478 insertions(+), 100 deletions(-) create mode 100644 www/core/components/emulator/services/helper.js diff --git a/www/addons/messages/main.js b/www/addons/messages/main.js index 740671284eb..2e7697e54a4 100644 --- a/www/addons/messages/main.js +++ b/www/addons/messages/main.js @@ -29,6 +29,7 @@ angular.module('mm.addons.messages', ['mm.core']) .constant('mmaMessagesReadCronEvent', 'mma-messages_read_cron') .constant('mmaMessagesAutomSyncedEvent', 'mma_messages_autom_synced') .constant('mmaMessagesLimitSearchMessages', 50) +.constant('mmaMessagesPushSimulationComponent', 'mmaMessagesPushSimulation') .config(function($stateProvider, $mmUserDelegateProvider, $mmSideMenuDelegateProvider, mmaMessagesSendMessagePriority, mmaMessagesAddContactPriority, mmaMessagesBlockContactPriority, mmaMessagesPriority, $mmContentLinksDelegateProvider, @@ -87,7 +88,7 @@ angular.module('mm.addons.messages', ['mm.core']) }) .run(function($mmaMessages, $mmEvents, $state, $mmAddonManager, $mmUtil, mmCoreEventLogin, $mmCronDelegate, $mmaMessagesSync, - mmCoreEventOnlineStatusChanged, $mmSitesManager) { + mmCoreEventOnlineStatusChanged, $mmSitesManager, $mmLocalNotifications, $mmApp, mmaMessagesPushSimulationComponent) { // Invalidate messaging enabled WS calls. $mmEvents.on(mmCoreEventLogin, function() { @@ -99,18 +100,7 @@ angular.module('mm.addons.messages', ['mm.core']) if ($mmPushNotificationsDelegate) { $mmPushNotificationsDelegate.registerHandler('mmaMessages', function(notification) { if ($mmUtil.isFalseOrZero(notification.notif)) { - $mmaMessages.isMessagingEnabledForSite(notification.site).then(function() { - $mmSitesManager.isFeatureDisabled('$mmSideMenuDelegate_mmaMessages', notification.site).then(function(disabled) { - if (disabled) { - // Messages are disabled, stop. - return; - } - - $mmaMessages.invalidateDiscussionsCache().finally(function() { - $state.go('redirect', {siteid: notification.site, state: 'site.messages'}); - }); - }); - }); + notificationClicked(notification); return true; } }); @@ -126,4 +116,24 @@ angular.module('mm.addons.messages', ['mm.core']) $mmaMessagesSync.syncAllDiscussions(undefined, true); } }); + + if ($mmApp.isDesktop()) { + // Listen for clicks in simulated push notifications. + $mmLocalNotifications.registerClick(mmaMessagesPushSimulationComponent, notificationClicked); + } + + function notificationClicked(notification) { + $mmaMessages.isMessagingEnabledForSite(notification.site).then(function() { + $mmSitesManager.isFeatureDisabled('$mmSideMenuDelegate_mmaMessages', notification.site).then(function(disabled) { + if (disabled) { + // Messages are disabled, stop. + return; + } + + $mmaMessages.invalidateDiscussionsCache().finally(function() { + $state.go('redirect', {siteid: notification.site, state: 'site.messages'}); + }); + }); + }); + } }); diff --git a/www/addons/messages/services/handlers.js b/www/addons/messages/services/handlers.js index 412b112500f..3ce6f4c4c3e 100644 --- a/www/addons/messages/services/handlers.js +++ b/www/addons/messages/services/handlers.js @@ -25,11 +25,43 @@ angular.module('mm.addons.messages') */ .factory('$mmaMessagesHandlers', function($log, $mmaMessages, $mmSite, $state, $mmUtil, $mmContentLinksHelper, $mmaMessagesSync, $mmSitesManager, mmUserProfileHandlersTypeCommunication, mmUserProfileHandlersTypeAction, $translate, - mmaMessagesReadChangedEvent, $mmEvents, mmaMessagesReadCronEvent, $mmAddonManager, $mmContentLinkHandlerFactory) { + mmaMessagesReadChangedEvent, $mmEvents, mmaMessagesReadCronEvent, $mmAddonManager, $mmContentLinkHandlerFactory, + $mmText, $mmApp, $mmLocalNotifications, $mmEmulatorHelper, mmaMessagesPushSimulationComponent) { $log = $log.getInstance('$mmaMessagesHandlers'); var self = {}; + /** + * Get the latest unread received messages from a site. + * + * @param {String} siteId Site ID. + * @return {Promise} Promise resolved with the notifications. + */ + function fetchMessages(siteId) { + return $mmaMessages.getUnreadReceivedMessages(true, false, true, siteId).then(function(response) { + return response.messages; + }); + } + + /** + * Given a message, return the title and the text for the message. + * + * @param {Object} message Message. + * @return {Promise} Promise resolved with an object with title and text. + */ + function getTitleAndText(message) { + var data = { + title: message.userfromfullname, + }; + + return $mmText.formatText(message.text, true, true).catch(function() { + return message.text; + }).then(function(formattedText) { + data.text = formattedText; + return data; + }); + } + /** * Add contact handler. * @@ -407,6 +439,11 @@ angular.module('mm.addons.messages') siteid: siteId }); } + + if ($mmApp.isDesktop() && $mmLocalNotifications.isAvailable()) { + $mmEmulatorHelper.checkNewNotifications( + mmaMessagesPushSimulationComponent, fetchMessages, getTitleAndText, siteId); + } }; /** @@ -415,7 +452,7 @@ angular.module('mm.addons.messages') * @return {Number} Time between consecutive executions (in ms). */ self.getInterval = function() { - return 600000; // 10 minutes. + return $mmApp.isDesktop() ? 60000 : 600000; // 1 or 10 minutes. }; /** @@ -424,8 +461,9 @@ angular.module('mm.addons.messages') * @return {Boolean} True if is a sync process, false otherwise. */ self.isSync = function() { - // This is done to use only wifi if using the fallback function - return !$mmaMessages.isMessageCountEnabled(); + // This is done to use only wifi if using the fallback function. + // In desktop it is always sync, since it fetches messages to see if there's a new one. + return !$mmaMessages.isMessageCountEnabled() || $mmApp.isDesktop(); }; /** diff --git a/www/addons/messages/services/messages.js b/www/addons/messages/services/messages.js index 41f22f2a6aa..16aa328c250 100644 --- a/www/addons/messages/services/messages.js +++ b/www/addons/messages/services/messages.js @@ -22,7 +22,8 @@ angular.module('mm.addons.messages') * @name $mmaMessages */ .factory('$mmaMessages', function($mmSite, $mmSitesManager, $log, $q, $mmUser, $mmaMessagesOffline, $mmApp, $mmUtil, - mmaMessagesNewMessageEvent, mmaMessagesLimitMessages, mmaMessagesLimitSearchMessages) { + mmaMessagesNewMessageEvent, mmaMessagesLimitMessages, mmaMessagesLimitSearchMessages, $mmEmulatorHelper, + mmaMessagesPushSimulationComponent) { $log = $log.getInstance('$mmaMessages'); var self = {}; @@ -286,9 +287,12 @@ angular.module('mm.addons.messages') * @param {Number} [lfReceivedRead=0] Number of read received messages already fetched, so fetch will be done from this. * @param {Number} [lfSentUnread=0] Number of unread sent messages already fetched, so fetch will be done from this. * @param {Number} [lfSentRead=0] Number of read sent messages already fetched, so fetch will be done from this. + * @param {Boolean} [toDisplay=true] True if messages will be displayed to the user, either in view or in a notification. + * @param {String} [siteId] Site ID. If not defined, use current site. * @return {Promise} Promise resolved with messages and a boolean telling if can load more messages. */ - self.getDiscussion = function(userId, excludePending, lfReceivedUnread, lfReceivedRead, lfSentUnread, lfSentRead) { + self.getDiscussion = function(userId, excludePending, lfReceivedUnread, lfReceivedRead, lfSentUnread, lfSentRead, toDisplay, + siteId) { lfReceivedUnread = lfReceivedUnread || 0; lfReceivedRead = lfReceivedRead || 0; lfSentUnread = lfSentUnread || 0; @@ -315,14 +319,15 @@ angular.module('mm.addons.messages') } // Get message received by current user. - return self._getRecentMessages(params, presets, lfReceivedUnread, lfReceivedRead).then(function(response) { + return self._getRecentMessages(params, presets, lfReceivedUnread, lfReceivedRead, toDisplay, siteId) + .then(function(response) { result.messages = response; params.useridto = userId; params.useridfrom = $mmSite.getUserId(); hasReceived = response.length > 0; // Get message sent by current user. - return self._getRecentMessages(params, presets, lfSentUnread, lfSentRead); + return self._getRecentMessages(params, presets, lfSentUnread, lfSentRead, toDisplay, siteId); }).then(function(response) { result.messages = result.messages.concat(response); hasSent = response.length > 0; @@ -524,25 +529,40 @@ angular.module('mm.addons.messages') * @module mm.addons.messages * @ngdoc method * @name $mmaMessages#_getMessages - * @param {Object} params Parameters to pass to the WS. - * @param {Object} presets Set of presets for the WS. + * @param {Object} params Parameters to pass to the WS. + * @param {Object} preSets Set of presets for the WS. + * @param {Boolean} [toDisplay=true] True if messages will be displayed to the user, either in view or in a notification. + * @param {String} [siteId] Site ID. If not defined, use current site. * @return {Promise} * @protected */ - self._getMessages = function(params, presets) { + self._getMessages = function(params, preSets, toDisplay, siteId) { + toDisplay = typeof toDisplay == 'undefined' ? true : toDisplay; + siteId = siteId || $mmSite.getId(); + params = angular.extend(params, { type: 'conversations', newestfirst: 1, }); - return $mmSite.read('core_message_get_messages', params, presets).then(function(response) { - angular.forEach(response.messages, function(message) { - message.read = params.read == 0 ? 0 : 1; - // Convert times to milliseconds. - message.timecreated = message.timecreated ? message.timecreated * 1000 : 0; - message.timeread = message.timeread ? message.timeread * 1000 : 0; + return $mmSitesManager.getSite(siteId).then(function(site) { + var userId = site.getUserId(); + + return site.read('core_message_get_messages', params, preSets).then(function(response) { + angular.forEach(response.messages, function(message) { + message.read = params.read == 0 ? 0 : 1; + // Convert times to milliseconds. + message.timecreated = message.timecreated ? message.timecreated * 1000 : 0; + message.timeread = message.timeread ? message.timeread * 1000 : 0; + }); + + if ($mmApp.isDesktop() && toDisplay && !params.read && params.useridto == userId && params.limitfrom === 0) { + // Store the last unread received messages. Don't block the user for this. + storeLastReceivedMessageIfNeeded(params.useridfrom, response.messages[0], siteId); + } + + return response; }); - return response; }); }; @@ -556,10 +576,12 @@ angular.module('mm.addons.messages') * @param {Object} preSets Set of presets for the WS. * @param {Number} [limitFromUnread=0] Number of read messages already fetched, so fetch will be done from this number. * @param {Number} [limitFromRead=0] Number of unread messages already fetched, so fetch will be done from this number. + * @param {Boolean} [toDisplay=true] True if messages will be displayed to the user, either in view or in a notification. + * @param {String} [siteId] Site ID. If not defined, use current site. * @return {Promise} * @protected */ - self._getRecentMessages = function(params, preSets, limitFromUnread, limitFromRead) { + self._getRecentMessages = function(params, preSets, limitFromUnread, limitFromRead, toDisplay, siteId) { limitFromUnread = limitFromUnread || 0; limitFromRead = limitFromRead || 0; @@ -568,7 +590,7 @@ angular.module('mm.addons.messages') limitfrom: limitFromUnread }); - return self._getMessages(params, preSets).then(function(response) { + return self._getMessages(params, preSets, toDisplay, siteId).then(function(response) { var messages = response.messages; if (messages) { if (messages.length >= params.limitnum) { @@ -580,7 +602,7 @@ angular.module('mm.addons.messages') params.read = 1; params.limitfrom = limitFromRead; - return self._getMessages(params, preSets).then(function(response) { + return self._getMessages(params, preSets, toDisplay, siteId).then(function(response) { if (response.messages) { messages = messages.concat(response.messages); } @@ -642,11 +664,13 @@ angular.module('mm.addons.messages') * @return {Promise} Promise resolved with the message unread count. */ self.getUnreadConversationsCount = function(userId, siteId) { + var params; + return $mmSitesManager.getSite(siteId).then(function(site) { userId = userId || site.getUserId(); if (site.wsAvailable('core_message_get_unread_conversations_count')) { - var params = { + params = { useridto: userId }, preSets = { @@ -663,14 +687,14 @@ angular.module('mm.addons.messages') } // Fallback call. - var params = { + params = { read: 0, limitfrom: 0, limitnum: mmaMessagesLimitMessages + 1, useridto: userId, useridfrom: 0, }; - return self._getMessages(params).then(function(response) { + return self._getMessages(params, undefined, false, siteId).then(function(response) { // Count the discussions by filtering same senders. var discussions = {}, count; @@ -688,6 +712,40 @@ angular.module('mm.addons.messages') }); }; + /** + * Get the latest unread received messages. + * + * @module mm.addons.messages + * @ngdoc method + * @name $mmaMessages#getUnreadReceivedMessages + * @param {Boolean} [toDisplay=true] True if messages will be displayed to the user, either in view or in a notification. + * @param {Boolean} [forceCache] True if it should return cached data. Has priority over ignoreCache. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, use current site. + * @return {Promise} Promise resolved with the message unread count. + */ + self.getUnreadReceivedMessages = function(toDisplay, forceCache, ignoreCache, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + read: 0, + limitfrom: 0, + limitnum: mmaMessagesLimitMessages, + useridto: site.getUserId(), + useridfrom: 0 + }, + preSets = {}; + + if (forceCache) { + preSets.omitExpires = true; + } else if (ignoreCache) { + preSets.getFromCache = 0; + preSets.emergencyCache = 0; + } + + return self._getMessages(params, preSets, toDisplay, siteId); + }); + }; + /** * Invalidate all contacts cache. * @@ -1274,6 +1332,33 @@ angular.module('mm.addons.messages') }); } + /** + * Store the last received message if it's newer than the last stored. + * + * @param {Number} userIdFrom ID of the useridfrom retrieved, 0 for all users. + * @param {Object} message Last message received. + * @param {String} siteId Site ID. + * @return {Promise} Promise resolved when done. + */ + function storeLastReceivedMessageIfNeeded(userIdFrom, message, siteId) { + var component = mmaMessagesPushSimulationComponent; + + // Get the last received message. + return $mmEmulatorHelper.getLastReceivedNotification(component, siteId).then(function(lastMessage) { + if (userIdFrom > 0 && (!message || !lastMessage)) { + // Seeing a single discussion. No received message or cannot know if it really is the last received message. Stop. + return; + } + + if (message && lastMessage && message.timecreated <= lastMessage.timecreated) { + // The message isn't newer than the stored message, don't store it. + return; + } + + return $mmEmulatorHelper.storeLastReceivedNotification(component, message, siteId); + }); + } + /** * Unblock a user. * diff --git a/www/addons/notifications/main.js b/www/addons/notifications/main.js index 715ca9acb8d..d178e938f10 100644 --- a/www/addons/notifications/main.js +++ b/www/addons/notifications/main.js @@ -19,6 +19,7 @@ angular.module('mm.addons.notifications', []) .constant('mmaNotificationsPreferencesPriority', 500) .constant('mmaNotificationsReadChangedEvent', 'mma-notifications_read_changed') .constant('mmaNotificationsReadCronEvent', 'mma-notifications_read_cron') +.constant('mmaNotificationsPushSimulationComponent', 'mmaNotificationsPushSimulation') .config(function($stateProvider, $mmSideMenuDelegateProvider, mmaNotificationsPriority, $mmSettingsDelegateProvider, mmaNotificationsPreferencesPriority) { @@ -53,7 +54,8 @@ angular.module('mm.addons.notifications', []) '$mmaNotificationsHandlers.preferences', mmaNotificationsPreferencesPriority); }) -.run(function($log, $mmaNotifications, $mmUtil, $state, $mmAddonManager, $mmCronDelegate, $mmSitesManager) { +.run(function($log, $mmaNotifications, $mmUtil, $state, $mmAddonManager, $mmCronDelegate, $mmSitesManager, $mmLocalNotifications, + $mmApp, mmaNotificationsPushSimulationComponent) { $log = $log.getInstance('mmaNotifications'); // Register push notification clicks. @@ -61,19 +63,7 @@ angular.module('mm.addons.notifications', []) if ($mmPushNotificationsDelegate) { $mmPushNotificationsDelegate.registerHandler('mmaNotifications', function(notification) { if ($mmUtil.isTrueOrOne(notification.notif)) { - $mmaNotifications.isPluginEnabledForSite(notification.site).then(function() { - $mmSitesManager.isFeatureDisabled('$mmSideMenuDelegate_mmaNotifications', notification.site) - .then(function(disabled) { - if (disabled) { - // Notifications are disabled, stop. - return; - } - - $mmaNotifications.invalidateNotificationsList().finally(function() { - $state.go('redirect', {siteid: notification.site, state: 'site.notifications'}); - }); - }); - }); + notificationClicked(notification); return true; } }); @@ -81,4 +71,26 @@ angular.module('mm.addons.notifications', []) // Register sync process. $mmCronDelegate.register('mmaNotificationsMenu', '$mmaNotificationsHandlers.sideMenuNav'); + + if ($mmApp.isDesktop()) { + // Listen for clicks in simulated push notifications. + $mmLocalNotifications.registerClick(mmaNotificationsPushSimulationComponent, notificationClicked); + } + + // A push notification belonging to notifications was clicked. + function notificationClicked(notification) { + return $mmaNotifications.isPluginEnabledForSite(notification.site).then(function() { + $mmSitesManager.isFeatureDisabled('$mmSideMenuDelegate_mmaNotifications', notification.site) + .then(function(disabled) { + if (disabled) { + // Notifications are disabled, stop. + return; + } + + $mmaNotifications.invalidateNotificationsList().finally(function() { + $state.go('redirect', {siteid: notification.site, state: 'site.notifications'}); + }); + }); + }); + } }); diff --git a/www/addons/notifications/services/handlers.js b/www/addons/notifications/services/handlers.js index f832baa8c98..9dd39235d82 100644 --- a/www/addons/notifications/services/handlers.js +++ b/www/addons/notifications/services/handlers.js @@ -24,11 +24,38 @@ angular.module('mm.addons.notifications') * @name $mmaNotificationsHandlers */ .factory('$mmaNotificationsHandlers', function($log, $mmaNotifications, $mmEvents, $mmSitesManager, $mmUtil, $mmSite, - mmaNotificationsReadChangedEvent, mmaNotificationsReadCronEvent, $mmAddonManager) { + mmaNotificationsReadChangedEvent, mmaNotificationsReadCronEvent, $mmAddonManager, $mmApp, $mmLocalNotifications, + $mmEmulatorHelper, $mmText, mmaNotificationsPushSimulationComponent) { $log = $log.getInstance('$mmaNotificationsHandlers'); var self = {}; + /** + * Get the latest unread notifications from a site. + * + * @param {String} siteId Site ID. + * @return {Promise} Promise resolved with the notifications. + */ + function fetchNotifications(siteId) { + return $mmaNotifications.getUnreadNotifications(0, undefined, true, false, true, siteId); + } + + /** + * Given a notification, return the title and the text for the notification. + * + * @param {Object} notification Notification. + * @return {Object} Object with title and text. + */ + function getTitleAndText(notification) { + var data = { + title: notification.userfromfullname, + text: notification.mobiletext.replace(/-{4,}/ig, '') + }; + data.text = $mmText.replaceNewLines(data.text, '
'); + + return data; + } + /** * Side menu nav handler. * @@ -142,6 +169,11 @@ angular.module('mm.addons.notifications') siteid: siteId }); } + + if ($mmApp.isDesktop() && $mmLocalNotifications.isAvailable()) { + $mmEmulatorHelper.checkNewNotifications( + mmaNotificationsPushSimulationComponent, fetchNotifications, getTitleAndText, siteId); + } }; /** @@ -150,7 +182,7 @@ angular.module('mm.addons.notifications') * @return {Number} Time between consecutive executions (in ms). */ self.getInterval = function() { - return 600000; // 10 minutes. + return $mmApp.isDesktop() ? 60000 : 600000; // 1 or 10 minutes. }; /** @@ -159,8 +191,9 @@ angular.module('mm.addons.notifications') * @return {Boolean} True if is a sync process, false otherwise. */ self.isSync = function() { - // This is done to use only wifi if using the fallback function - return !$mmaNotifications.isNotificationCountEnabled(); + // This is done to use only wifi if using the fallback function. + // In desktop it is always sync, since it fetches notification to see if there's a new one. + return !$mmaNotifications.isNotificationCountEnabled() || $mmApp.isDesktop(); }; /** diff --git a/www/addons/notifications/services/notifications.js b/www/addons/notifications/services/notifications.js index 44e7179dca3..58a3470f1ba 100644 --- a/www/addons/notifications/services/notifications.js +++ b/www/addons/notifications/services/notifications.js @@ -21,13 +21,19 @@ angular.module('mm.addons.notifications') * @ngdoc service * @name $mmaNotifications */ -.factory('$mmaNotifications', function($q, $log, $mmSite, $mmSitesManager, $mmUser, $mmUtil, mmaNotificationsListLimit) { +.factory('$mmaNotifications', function($q, $log, $mmSite, $mmSitesManager, $mmUser, $mmUtil, $mmApp, mmaNotificationsListLimit, + mmaNotificationsPushSimulationComponent, $mmEmulatorHelper) { $log = $log.getInstance('$mmaNotifications'); var self = {}; - // Function to format notification data. + /** + * Function to format notification data. + * + * @param {Object[]} notifications List of notifications. + * @return {Void} + */ function formatNotificationsData(notifications) { angular.forEach(notifications, function(notification) { // Set message to show. @@ -97,39 +103,60 @@ angular.module('mm.addons.notifications') * @module mm.addons.notifications * @ngdoc method * @name $mmaNotifications#getNotifications - * @param {Boolean} read True if should get read notifications, false otherwise. - * @param {Number} limitFrom Position of the first notification to get. - * @param {Number} limitNumber Number of notifications to get. - * @return {Promise} Promise resolved with notifications. + * @param {Boolean} read True if should get read notifications, false otherwise. + * @param {Number} limitFrom Position of the first notification to get. + * @param {Number} limitNumber Number of notifications to get. + * @param {Boolean} [toDisplay=true] True if notifications will be displayed to the user, either in view or in a notification. + * @param {Boolean} [forceCache] True if it should return cached data. Has priority over ignoreCache. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, use current site. + * @return {Promise} Promise resolved with notifications. */ - self.getNotifications = function(read, limitFrom, limitNumber) { + self.getNotifications = function(read, limitFrom, limitNumber, toDisplay, forceCache, ignoreCache, siteId) { + toDisplay = typeof toDisplay == 'undefined' ? true : toDisplay; limitFrom = limitFrom || 0; limitNumber = limitNumber || mmaNotificationsListLimit; + siteId = siteId || $mmSite.getId(); $log.debug('Get ' + (read ? 'read' : 'unread') + ' notifications from ' + limitFrom + '. Limit: ' + limitNumber); - var data = { - useridto: $mmSite.getUserId(), - useridfrom: 0, - type: 'notifications', - read: read ? 1 : 0, - newestfirst: 1, - limitfrom: limitFrom, - limitnum: limitNumber - }; - var preSets = { - cacheKey: getNotificationsCacheKey() - }; - - // Get unread notifications. - return $mmSite.read('core_message_get_messages', data, preSets).then(function(response) { - if (response.messages) { - var notifications = response.messages; - formatNotificationsData(notifications); - return notifications; - } else { - return $q.reject(); + return $mmSitesManager.getSite(siteId).then(function(site) { + var data = { + useridto: site.getUserId(), + useridfrom: 0, + type: 'notifications', + read: read ? 1 : 0, + newestfirst: 1, + limitfrom: limitFrom, + limitnum: limitNumber + }, preSets = { + cacheKey: getNotificationsCacheKey() + }; + + if (forceCache) { + preSets.omitExpires = true; + } else if (ignoreCache) { + preSets.getFromCache = 0; + preSets.emergencyCache = 0; } + + // Get unread notifications. + return site.read('core_message_get_messages', data, preSets).then(function(response) { + if (response.messages) { + var notifications = response.messages; + formatNotificationsData(notifications); + + if ($mmApp.isDesktop() && toDisplay && !read && limitFrom === 0) { + // Store the last received notification. Don't block the user for this. + $mmEmulatorHelper.storeLastReceivedNotification( + mmaNotificationsPushSimulationComponent, notifications[0], siteId); + } + + return notifications; + } else { + return $q.reject(); + } + }); }); }; @@ -139,12 +166,16 @@ angular.module('mm.addons.notifications') * @module mm.addons.notifications * @ngdoc method * @name $mmaNotifications#getReadNotifications - * @param {Number} limitFrom Position of the first notification to get. - * @param {Number} limitNumber Number of notifications to get. - * @return {Promise} Promise resolved with notifications. + * @param {Number} limitFrom Position of the first notification to get. + * @param {Number} limitNumber Number of notifications to get. + * @param {Boolean} [toDisplay=true] True if notifications will be displayed to the user, either in view or in a notification. + * @param {Boolean} [forceCache] True if it should return cached data. Has priority over ignoreCache. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, use current site. + * @return {Promise} Promise resolved with notifications. */ - self.getReadNotifications = function(limitFrom, limitNumber) { - return self.getNotifications(true, limitFrom, limitNumber); + self.getReadNotifications = function(limitFrom, limitNumber, toDisplay, forceCache, ignoreCache, siteId) { + return self.getNotifications(true, limitFrom, limitNumber, toDisplay, forceCache, ignoreCache, siteId); }; /** @@ -153,12 +184,16 @@ angular.module('mm.addons.notifications') * @module mm.addons.notifications * @ngdoc method * @name $mmaNotifications#getUnreadNotifications - * @param {Number} limitFrom Position of the first notification to get. - * @param {Number} limitNumber Number of notifications to get. - * @return {Promise} Promise resolved with notifications. + * @param {Number} limitFrom Position of the first notification to get. + * @param {Number} limitNumber Number of notifications to get. + * @param {Boolean} [toDisplay=true] True if notifications will be displayed to the user, either in view or in a notification. + * @param {Boolean} [forceCache] True if it should return cached data. Has priority over ignoreCache. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, use current site. + * @return {Promise} Promise resolved with notifications. */ - self.getUnreadNotifications = function(limitFrom, limitNumber) { - return self.getNotifications(false, limitFrom, limitNumber); + self.getUnreadNotifications = function(limitFrom, limitNumber, toDisplay, forceCache, ignoreCache, siteId) { + return self.getNotifications(false, limitFrom, limitNumber, toDisplay, forceCache, ignoreCache, siteId); }; /** @@ -193,7 +228,8 @@ angular.module('mm.addons.notifications') } // Fallback call. - return self.getNotifications(false, 0, mmaNotificationsListLimit + 1).then(function(unread) { + var limit = mmaNotificationsListLimit + 1; + return self.getUnreadNotifications(0, limit, false, false, false, siteId).then(function(unread) { // Add + sign if there are more than the limit reachable. return (unread.length > mmaNotificationsListLimit) ? unread.length + "+" : unread.length; }).catch(function() { diff --git a/www/core/components/emulator/services/emulator.js b/www/core/components/emulator/services/emulator.js index 0d370a95ce1..0a72c044be3 100644 --- a/www/core/components/emulator/services/emulator.js +++ b/www/core/components/emulator/services/emulator.js @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -angular.module('mm.core') +angular.module('mm.core.emulator') /** * @ngdoc service * @name $mmEmulatorManager - * @module mm.core + * @module mm.core.emulator * @description * This service handles the emulation of Cordova plugins in other environments like browser. */ @@ -32,7 +32,7 @@ angular.module('mm.core') /** * Loads HTML API to simulate Cordova APIs. Reserved for core use. * - * @module mm.core + * @module mm.core.emulator * @ngdoc method * @name $mmEmulatorManager#loadHTMLAPI * @return {Promise} Promise resolved when the API is loaded. diff --git a/www/core/components/emulator/services/helper.js b/www/core/components/emulator/services/helper.js new file mode 100644 index 00000000000..555e9445717 --- /dev/null +++ b/www/core/components/emulator/services/helper.js @@ -0,0 +1,162 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.core.emulator') + +.constant('mmCoreEmulatorLastReceivedNotificationStore', 'mm_emulator_last_received_notification') + +.config(function($mmSitesFactoryProvider, mmCoreEmulatorLastReceivedNotificationStore) { + var stores = [ + { + name: mmCoreEmulatorLastReceivedNotificationStore, + keyPath: 'component' // Only 1 entry per component. + } + ]; + $mmSitesFactoryProvider.registerStores(stores); +}) + +.factory('$mmEmulatorHelper', function($log, $mmSitesManager, $mmApp, $q, $mmLocalNotifications, $mmUtil, mmCoreSecondsDay, + mmCoreEmulatorLastReceivedNotificationStore) { + + $log = $log.getInstance('$mmEmulatorHelper'); + + var self = {}; + + /** + * Check if there are new notifications, triggering a local notification if found. + * Only for desktop apps since they don't support push notifications. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorHelper#checkNewNotifications + * @param {String} [siteId] Site ID to check. If not defined, check all sites. + * @return {Promise} Promise resolved when done. + */ + self.checkNewNotifications = function(component, fetchFn, getDataFn, siteId) { + if (!$mmApp.isDesktop() || !$mmLocalNotifications.isAvailable()) { + return $q.when(); + } + + if (!$mmApp.isOnline()) { + $log.debug('Cannot check push notifications because device is offline.'); + return $q.reject(); + } + + var promise; + if (!siteId) { + // No site ID defined, check all sites. + promise = $mmSitesManager.getSitesIds(); + } else { + promise = $q.when([siteId]); + } + + return promise.then(function(siteIds) { + var sitePromises = []; + + angular.forEach(siteIds, function(siteId) { + // Check new notifications for each site. + sitePromises.push(checkNewNotificationsForSite(component, fetchFn, getDataFn, siteId)); + }); + + return $q.all(sitePromises); + }); + }; + + /** + * Check if there are new notifications for a certain site, triggering a local notification if found. + * + * @param {String} siteId Site ID to check. + * @return {Promise} Promise resolved when done. + */ + function checkNewNotificationsForSite(component, fetchFn, getDataFn, siteId) { + // Get the last received notification in the app. + return self.getLastReceivedNotification(component, siteId).then(function(lastNotification) { + // Now fetch the latest notifications from the server. + return fetchFn(siteId).then(function(notifications) { + if (!lastNotification || !notifications.length) { + // No last notification stored (first call) or no new notifications. Stop. + return; + } + + var notification = notifications[0]; + + if (notification.id == lastNotification.id || notification.timecreated <= lastNotification.timecreated || + $mmUtil.timestamp() - notification.timecreated > mmCoreSecondsDay) { + // There are no new notifications or the newest one happened more than a day ago, stop. + return; + } + + // There is a new notification, show it. + return $q.when(getDataFn(notification)).then(function(titleAndText) { + var localNotif = { + id: 1, + at: new Date(), + title: titleAndText.title, + text: titleAndText.text, + data: { + notif: notification, + site: siteId + } + }; + + $mmLocalNotifications.schedule(localNotif, component, siteId); + }); + }); + }); + } + + + /** + * Get the last notification received in a certain site for a certain component. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorHelper#getLastReceivedNotification + * @param {String} component Component of the notification to get. + * @param {String} siteId Site ID of the notification. + * @return {Promise} Promise resolved with the notification or false if not found. + */ + self.getLastReceivedNotification = function(component, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.getDb().get(mmCoreEmulatorLastReceivedNotificationStore, component); + }).catch(function() { + return false; + }); + }; + + /** + * Store the last notification received in a certain site. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorHelper#storeLastReceivedNotification + * @param {String} component Component of the notification to store. + * @param {Object} notification Notification to store. + * @param {String} siteId Site ID of the notification. + * @return {Promise} Promise resolved when done. + */ + self.storeLastReceivedNotification = function(component, notification, siteId) { + if (!notification) { + // No notification, store a fake one. + notification = {id: -1, timecreated: 0}; + } + notification.component = component; + + return $mmSitesManager.getSite(siteId).then(function(site) { + return site.getDb().insert(mmCoreEmulatorLastReceivedNotificationStore, notification); + }); + }; + + return self; +}); diff --git a/www/core/lib/cron.js b/www/core/lib/cron.js index 4ef83d830c2..b9405333e49 100644 --- a/www/core/lib/cron.js +++ b/www/core/lib/cron.js @@ -16,6 +16,7 @@ angular.module('mm.core') .constant('mmCoreCronInterval', 3600000) // Default interval is 1 hour. .constant('mmCoreCronMinInterval', 300000) // Minimum interval is 5 minutes. +.constant('mmCoreCronDesktopMinInterval', 60000) // Minimum interval in desktop is 1 minute. .constant('mmCoreCronMaxTimeProcess', 120000) // Max time a process can block the queue. Defaults to 2 minutes. .constant('mmCoreCronStore', 'cron') @@ -37,7 +38,7 @@ angular.module('mm.core') * @name $mmCronDelegate */ .factory('$mmCronDelegate', function($log, $mmConfig, $mmApp, $timeout, $q, $mmUtil, mmCoreCronInterval, mmCoreCronStore, - mmCoreSettingsSyncOnlyOnWifi, mmCoreCronMinInterval, mmCoreCronMaxTimeProcess) { + mmCoreSettingsSyncOnlyOnWifi, mmCoreCronMinInterval, mmCoreCronMaxTimeProcess, mmCoreCronDesktopMinInterval) { $log = $log.getInstance('$mmCronDelegate'); @@ -190,8 +191,9 @@ angular.module('mm.core') return mmCoreCronInterval; } - // Don't allow intervals lower than 5 minutes. - return Math.max(mmCoreCronMinInterval, parseInt(hooks[name].instance.getInterval(), 10)); + // Don't allow intervals lower than the minimum. + var minInterval = $mmApp.isDesktop() ? mmCoreCronDesktopMinInterval : mmCoreCronMinInterval; + return Math.max(minInterval, parseInt(hooks[name].instance.getInterval(), 10)); }; /** From 0bb4843724da000c28e9761b8496f4e5d3658b04 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 26 Jun 2017 08:39:10 +0200 Subject: [PATCH 039/118] MOBILE-2145 electron: Use ToastNotification and TileNotification --- package.json | 13 ++-- .../components/emulator/services/helper.js | 17 +++++ .../emulator/services/localnotif.js | 73 ++++++++++++++++--- 3 files changed, 88 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index fcc4f55f831..2fe9eed3a62 100644 --- a/package.json +++ b/package.json @@ -13,22 +13,25 @@ "url": "http://www.apache.org/licenses/LICENSE-2.0" } ], - "dependencies": {}, + "dependencies": { + "electron-windows-notifications": "^1.1.13" + }, "devDependencies": { "appium": "^1.6.0", "bower": "^1.3.3", + "electron-rebuild": "^1.5.11", "gulp": "^3.9.1", - "gulp-clean-css": "^3.0.3", - "gulp-concat": "^2.6.0", - "gulp-rename": "^1.2.0", - "gulp-sass": "^2.3.2", "gulp-clean": "^0.3.2", + "gulp-clean-css": "^3.0.3", "gulp-clip-empty-files": "^0.1.1", + "gulp-concat": "^2.6.0", "gulp-concat-util": "^0.5.2", "gulp-file": "^0.3.0", "gulp-insert": "^0.5.0", "gulp-ng-annotate": "^2.0.0", "gulp-remove-empty-lines": "0.0.8", + "gulp-rename": "^1.2.0", + "gulp-sass": "^2.3.2", "gulp-slash": "^1.1.3", "gulp-strip-comments": "^2.4.3", "gulp-tap": "^0.1.3", diff --git a/www/core/components/emulator/services/helper.js b/www/core/components/emulator/services/helper.js index 555e9445717..a95570a5b4a 100644 --- a/www/core/components/emulator/services/helper.js +++ b/www/core/components/emulator/services/helper.js @@ -135,6 +135,23 @@ angular.module('mm.core.emulator') }); }; + /** + * Check if the app is running in a Windows environment. + * + * @module mm.core.emulator + * @ngdoc method + * @name $mmEmulatorHelper#isWindows + * @return {Boolean} Whether it's running in a Windows environment. + */ + self.isWindows = function() { + try { + var os = require('os'); + return os.platform().indexOf('win') === 0; + } catch(ex) { + return false; + } + }; + /** * Store the last notification received in a certain site. * diff --git a/www/core/components/emulator/services/localnotif.js b/www/core/components/emulator/services/localnotif.js index 1e2c7fc3ede..6e41fbfd3fd 100644 --- a/www/core/components/emulator/services/localnotif.js +++ b/www/core/components/emulator/services/localnotif.js @@ -40,7 +40,7 @@ angular.module('mm.core.emulator') */ .factory('$mmEmulatorLocalNotifications', function($log, $q, $mmApp, $mmUtil, $timeout, $interval, $rootScope, $cordovaLocalNotification, mmCoreDesktopLocalNotificationsStore, mmCoreSecondsYear, mmCoreSecondsDay, - mmCoreSecondsHour, mmCoreSecondsMinute) { + mmCoreSecondsHour, mmCoreSecondsMinute, $mmEmulatorHelper, mmCoreConfigConstants) { $log = $log.getInstance('$mmEmulatorLocalNotifications'); @@ -56,7 +56,17 @@ angular.module('mm.core.emulator') data: undefined, every: undefined, at: undefined - }; + }, + winNotif, // Library for Windows notifications. + toastTemplate = '%s' + + '%s', // Template for Windows ToastNotifications. + tileBindingTemplate = '%s' + + '%s', + tileTemplate = '' + + '' + tileBindingTemplate + '' + + '' + tileBindingTemplate + '' + + '' + tileBindingTemplate + '' + + ''; // Template for Windows TileNotifications. Use same template for all sizes. /** * Cancel a local notification. @@ -218,6 +228,12 @@ angular.module('mm.core.emulator') return $q.when(); } + if ($mmEmulatorHelper.isWindows()) { + try { + winNotif = require('electron-windows-notifications'); + } catch(ex) {} + } + // Redefine $cordovaLocalNotification methods instead of the core plugin (window.cordova.plugins.notification.local) // because creating window.cordova breaks the app (it thinks it's a real device). $cordovaLocalNotification.schedule = function(notifications, scope, isUpdate) { @@ -242,9 +258,7 @@ angular.module('mm.core.emulator') var toTrigger = notification.at * 1000 - Date.now(); scheduled[notification.id].timeout = $timeout(function trigger() { // Trigger the notification. - var notifInstance = new Notification(notification.title, { - body: notification.text - }); + triggerNotification(notification); // Store the notification as triggered. Don't remove it from scheduled, it's how the plugin works. triggered[notification.id] = notification; @@ -253,11 +267,6 @@ angular.module('mm.core.emulator') // Launch the trigger event. $rootScope.$broadcast('$cordovaLocalNotification:trigger', notification, 'foreground'); - // Listen for click events. - notifInstance.onclick = function() { - $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); - }; - if (notification.every && scheduled[notification.id] && !scheduled[notification.id].interval) { var interval = parseInterval(notification.every); if (interval > 0) { @@ -538,5 +547,49 @@ angular.module('mm.core.emulator') return $mmApp.getDB().insert(mmCoreDesktopLocalNotificationsStore, notification); } + /** + * Trigger a notification, using the best method depending on the OS. + * + * @param {Object} notification Notification to trigger. + * @return {Void} + */ + function triggerNotification(notification) { + if (winNotif) { + // Use Windows notifications. + var notifInstance = new winNotif.ToastNotification({ + appId: mmCoreConfigConstants.app_id, + template: toastTemplate, + strings: [notification.title, notification.text] + }); + + // Listen for click events. + notifInstance.on('activated', function() { + $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + }); + + notifInstance.show() + + // Show it in Tile too. + var tileNotif = new winNotif.TileNotification({ + tag: notification.id + '', + template: tileTemplate, + strings: [notification.title, notification.text, notification.title, notification.text, notification.title, notification.text], + expirationTime: new Date(Date.now() + mmCoreSecondsHour * 1000) // Expire in 1 hour. + }) + + tileNotif.show() + } else { + // Use Electron default notifications. + var notifInstance = new Notification(notification.title, { + body: notification.text + }); + + // Listen for click events. + notifInstance.onclick = function() { + $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + }; + } + } + return self; }); From 7d98ce41bd29c8a2519fba76c44ebf065271f4c8 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 27 Jun 2017 14:45:42 +0200 Subject: [PATCH 040/118] MOBILE-2136 course: Support links to sections --- .../components/course/controllers/sections.js | 37 ++++++++++++++----- www/core/components/course/main.js | 3 +- .../components/courses/services/handlers.js | 25 ++++++++++--- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/www/core/components/course/controllers/sections.js b/www/core/components/course/controllers/sections.js index 82f9dbd431e..58ac12947fb 100644 --- a/www/core/components/course/controllers/sections.js +++ b/www/core/components/course/controllers/sections.js @@ -26,6 +26,7 @@ angular.module('mm.core.course') mmCoreEventSectionStatusChanged, $state, $timeout, $mmCoursesDelegate, $controller) { var courseId = $stateParams.courseid, sectionId = $stateParams.sid, + sectionNumber = $stateParams.sectionnumber, moduleId = $stateParams.moduleid, course = $stateParams.course ? angular.copy($stateParams.course) : false; @@ -171,14 +172,17 @@ angular.module('mm.core.course') // Convenience function to autoload a section if sectionId param is set. function autoloadSection() { - if (sectionId) { + if (sectionId || sectionNumber >= 0) { if ($ionicPlatform.isTablet()) { // Search the position of the section to load. - angular.forEach($scope.sections, function(section, index) { - if (section.id == sectionId) { - $scope.sectionToLoad = index + 1; + for (var index in $scope.sections) { + var section = $scope.sections[index]; + if (section.id == sectionId || (sectionNumber >= 0 && section.section === sectionNumber)) { + $scope.sectionToLoad = parseInt(index, 10) + 1; + break; } - }); + } + // Set moduleId to pass it to the new state when the section is autoloaded. We unset it after this // to prevent autoloading the module when the user manually loads a section. $scope.moduleId = moduleId; @@ -186,11 +190,24 @@ angular.module('mm.core.course') $scope.moduleId = null; // Unset moduleId when }, 500); } else { - $state.go('site.mm_course-section', { - sectionid: sectionId, - cid: courseId, - mid: moduleId - }); + if (!sectionId) { + // Search the section ID by section number. + for (var index in $scope.sections) { + var section = $scope.sections[index]; + if (section.section == sectionNumber) { + sectionId = section.id + break; + } + } + } + + if (sectionId) { + $state.go('site.mm_course-section', { + sectionid: sectionId, + cid: courseId, + mid: moduleId + }); + } } } } diff --git a/www/core/components/course/main.js b/www/core/components/course/main.js index ea85c0ea079..99205b24219 100644 --- a/www/core/components/course/main.js +++ b/www/core/components/course/main.js @@ -17,7 +17,7 @@ angular.module('mm.core.course', ['mm.core.courses']) .constant('mmCoreCoursePriority', 800) .constant('mmCoreCourseAllSectionsId', -1) -.config(function($stateProvider, $mmCoursesDelegateProvider, mmCoreCoursePriority) { +.config(function($stateProvider) { $stateProvider @@ -26,6 +26,7 @@ angular.module('mm.core.course', ['mm.core.courses']) params: { courseid: null, sid: null, // Section to load. Not naming it sectionid because it collides with 'mm_course-section' param in split-view. + sectionnumber: null, // Section to load. If sid is provided there is no need to provide sectionnumber and vice versa. moduleid: null, // Module to load. course: null }, diff --git a/www/core/components/courses/services/handlers.js b/www/core/components/courses/services/handlers.js index 6ebbe389417..08daca0ee07 100644 --- a/www/core/components/courses/services/handlers.js +++ b/www/core/components/courses/services/handlers.js @@ -91,17 +91,29 @@ angular.module('mm.core.courses') self.courseLinksHandler.getActions = function(siteIds, url, params, courseId) { courseId = parseInt(params.id, 10); + var sectionId = params.sectionid ? parseInt(params.sectionid, 10) : null, + sectionNumber = typeof params.section != 'undefined' ? parseInt(params.section, 10) : NaN, + stateParams = { + courseid: courseId, + sid: sectionId || null + }; + + if (!isNaN(sectionNumber)) { + stateParams.sectionnumber = sectionNumber; + } + return [{ action: function(siteId) { siteId = siteId || $mmSite.getId(); if (siteId == $mmSite.getId()) { - actionEnrol(courseId, url); + actionEnrol(courseId, url, stateParams); } else { + // Use redirect to make the course the new history root (to avoid "loops" in history). $state.go('redirect', { siteid: siteId, state: 'site.mm_course', - params: {courseid: courseId} + params: stateParams }); } } @@ -111,11 +123,12 @@ angular.module('mm.core.courses') /** * Action to perform when an enrol link is clicked. * - * @param {Number} courseId Course ID. - * @param {String} url Treated URL. + * @param {Number} courseId Course ID. + * @param {String} url Treated URL. + * @param {Object} stateParams Params to send to the new state. * @return {Void} */ - function actionEnrol(courseId, url) { + function actionEnrol(courseId, url, stateParams) { var modal = $mmUtil.showModalLoading(), isEnrolUrl = !!url.match(/(\/enrol\/index\.php)|(\/course\/enrol\.php)/); @@ -164,7 +177,7 @@ angular.module('mm.core.courses') $state.go('redirect', { siteid: $mmSite.getId(), state: 'site.mm_course', - params: {courseid: courseId} + params: stateParams }); }); } From 3da835b043f4f5b9da6ba9d5683c6ba1c016571f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 27 Jun 2017 13:12:52 +0200 Subject: [PATCH 041/118] MOBILE-2148: Prepare app for Windows Store --- .gitignore | 1 + AppXManifest.xml | 44 +++++++++++++++ package.json | 53 ++++++++++++++++-- resources/desktop/Square150x150Logo.png | Bin 0 -> 21500 bytes resources/desktop/Square44x44Logo.png | Bin 0 -> 5300 bytes resources/desktop/StoreLogo.png | Bin 0 -> 5326 bytes resources/desktop/Wide310x150Logo.png | Bin 0 -> 22634 bytes resources/desktop/icon.icns | Bin 0 -> 32691 bytes resources/desktop/icon.ico | Bin 0 -> 29466 bytes www/config.json | 1 + .../components/settings/controllers/about.js | 4 +- www/electron.js | 6 +- www/index.html | 2 +- 13 files changed, 100 insertions(+), 11 deletions(-) create mode 100644 AppXManifest.xml create mode 100644 resources/desktop/Square150x150Logo.png create mode 100644 resources/desktop/Square44x44Logo.png create mode 100644 resources/desktop/StoreLogo.png create mode 100644 resources/desktop/Wide310x150Logo.png create mode 100644 resources/desktop/icon.icns create mode 100644 resources/desktop/icon.ico diff --git a/.gitignore b/.gitignore index aabd7486658..de95095bf11 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ www/build .sass-cache/ www/lib e2e/build +/desktop diff --git a/AppXManifest.xml b/AppXManifest.xml new file mode 100644 index 00000000000..d525ac270d7 --- /dev/null +++ b/AppXManifest.xml @@ -0,0 +1,44 @@ + + + + + Moodle Desktop + Moodle Pty Ltd. + The official app for Moodle. + assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + Moodle Mobile URI Scheme + + + + + + diff --git a/package.json b/package.json index 2fe9eed3a62..d8d37a8dabb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,11 @@ { - "name": "mm2", + "name": "com.moodle.moodlemobile", "version": "3.3.0", - "description": "Moodle Mobile 2: The official mobile app for Moodle.", + "description": "The official app for Moodle.", + "author": { + "name": "Moodle Pty Ltd.", + "email": "mobile@moodle.com" + }, "repository": { "type": "git", "url": "https://github.com/moodlehq/moodlemobile2.git" @@ -14,7 +18,8 @@ } ], "dependencies": { - "electron-windows-notifications": "^1.1.13" + "electron-windows-notifications": "^1.1.13", + "electron-builder-squirrel-windows": "^19.3.0" }, "devDependencies": { "appium": "^1.6.0", @@ -123,7 +128,45 @@ "android": "ionic run android", "serve.e2e": "ionic serve -b -a", "serve.dev": "ionic serve", - "e2e": "protractor e2e/build/protractor.conf.js" + "e2e": "protractor e2e/build/protractor.conf.js", + "desktop.pack": "build --dir", + "desktop.dist": "build", + "windows.store": "electron-windows-store --input-directory .\\desktop\\dist\\win-unpacked --output-directory .\\desktop\\store --flatten true -a .\\resources\\desktop -m .\\AppXManifest.xml --package-version 0.0.0.0 --package-name MoodleDesktop" }, - "main": "www/electron.js" + "main": "www/electron.js", + "build": { + "appId": "com.moodle.moodlemobile", + "productName": "MoodleDesktop", + "files": [ + "!desktop", + "!**/e2e", + "!hooks", + "!platforms", + "!plugins", + "!resources", + "!**/*.scss" + ], + "directories": { + "output": "desktop/dist" + }, + "protocols": [ + { + "name": "Moodle Mobile URL", + "schemes": [ + "moodlemobile" + ], + "role": "Viewer" + } + ], + "compression": "maximum", + "electronVersion": "1.6.11", + "mac": { + "category": "public.app-category.education", + "icon": "resources/desktop/icon.icns" + }, + "win": { + "target": "appx", + "icon": "resources/desktop/icon.ico" + } + } } diff --git a/resources/desktop/Square150x150Logo.png b/resources/desktop/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6dbca4bea3f1f3a62f259fc51bcefa9560072fe5 GIT binary patch literal 21500 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 OJF1FW3YBtJ;r{^=+OduR literal 0 HcmV?d00001 diff --git a/resources/desktop/Square44x44Logo.png b/resources/desktop/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ad9e9bdc27f8dd88d1f16519ee89ca78b379da GIT binary patch literal 5300 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 p3T2=EA5{aRkSfE!zYGld`FRXV% z<4B4)d;kCd0RR8QlusywaTv!xzx}rNWwGfs|I!?t{5z^~;3@~@FlReRl+qebyC`u$ znyiSM94RgiI66qg@@E&ti7*T8U3*`LVI)F}Up<#^->2`d=Xt*0Us*RRR?qhPUlA*y zI3Cd@OdUG#Z8>qzYN$aMb7zG}i}7<2MWnd9zax|%pzoodj)NvDL*>*jmJ;5TL}D5x zc9X==37yVUsPiFPCXkJOL{T;7^)-BzqyW0D5Qk!=CqBY-@hH(-iKn4~3U>uk*od56 zvVR;!88%VIO=RmBJS36L1K7GZQ728TZ8IRu&qYL86&UGUPh7;ckUj4? zx4m&v+jE)h9LyoL;eSnL0833f=GD#TBF63tmRj!z!n=QoH!BqK=Q|OahHFyjr^uBChb z!;DYtm`z9&VHn4MGqdx~uI{$&BAXqe4&5}i^x&aHD5Ri+E8?LKiVT8KBdjP&GlEWa z(~EWKRF}SQWByzleO|NlIr znwO%v`rQ4!`m z&$Sv_Ca*9YK16vSggyP5%t8`f_%VzCF>?xg`U}d2dbC}=XnU@qR_{a3&V!~Fhv;sa z!P;9`GRXdlS4i_SmFw40T~$RqzLmvP63zL_hx!5Zt6B862WUG^pw+eEYw5@6mne}M z(26)?PBGXy)kmXzMl(Z{r^j&}iDCGeo%zH>T5zDfi<8F=g3s_SDmjTea(`(fy?qcl zIaeenst+=Aps3`eq_g8ViRJ`bw$;*Alf=A`qIE+;8-9Xf@@+V5>1>xcbdI{QLL0jPA_20j-kZ-fQ~!)$#m;(Dij~d(AyB>H z){AHI&$s@FLp76 z`);U&lNjM2yN|-I#2?A)mS*JRn)q*8e+FdjH}=dfHi{|?!_S$Wo!M^N?QXZf)KVy| z&V-L~w`&d%{-R$#N+02R<`Px4)yoHyspJ9EBszV{vFdW+H<6$&uS^lu@B z|45r5^1mb^0LOJ+Z0d7MP=!QOEwr3CnlFy#HPLbtmB!VIM!#1wvP!M@Gh&&Ut z`=deIcNWUuC*qKCMoopE3ht-Dzn%K*Rsyq{*{eQE*RY$3!4u5ZgPa@arMu@O9$!9H z)z!>jP=mjy5Z&d%AtYsLkY(G(5o;T9QkU_vL`weQp(UxRc@+Tj8Z1lm$yK|1gW{aIR}Z-zpJm zDKa#2#a}1|C1e6aI*Ge(!cem?%sdRsN8Iv5RHddwZ>&xEzi>f#ZukXJTn^*IQ^^qt z!UEN47uU(RA+0FUA(JQ8y~gK_8`$;9PQE+1pZ25e^#1x4gAebgudbEdcXV)DnNIBO z^&}2&OV7QL)0iJDM|c%Pc|M}N0ITB&X4A77&upc<7C9lWo`?)aP%4+;eEtw*7s2`9 zg;|9Itg&>hDo+n$M8Gg|FmNEGWqbQ-2IY`2Ky_VQR$9pmW)e|nC9XJ4QnyyF6RZ0h zBlb^rhX literal 0 HcmV?d00001 diff --git a/resources/desktop/Wide310x150Logo.png b/resources/desktop/Wide310x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..40787a6d884a17ea16aef79582b9b8f678b737e0 GIT binary patch literal 22634 zcmbTd1yo$mvNuYCySo!SxI4ieg1dWgcMHMYbs$&>Zoy@6cXx+@V1dE)P0sn>@1AeH z`@Q$po3&@x?(W&u)z#JA)xYYA`m8L2ibRA21qFpFCo8E21@+z@3hEsb0vzOyNVO#n zDL{0V)pdh{LdN?0eK)%i_zVSwq+%-}@%gijle?3fjgvEloP-30v#XPpt-U1_l=mt? z-C9Ha7*F_a^IBXXGB{PiNevf)LQOm-7$=FAkrEL@K9aIv1y{8PQ%VYkc=&rHbbNep zEUqdON;J|k{61x2d}vW*^yt%$UyYl_v zu7^TEfnrmQ3}b+T@q;oM{_w#Y>RT2Rj`Wqb(B;Q!3=ktkQ(5&wtgl5eA8wmGC zWoEYbdN5Vt{0Rzb$31Z7m5H^1C|D3K*x|L1<{ZYx2>H9mU5r&d`lm*y@5ig!VCTQO zkt#@RU0FHU-(QyR7uPo()ed;I?ltb#ezAWD6neh9+3wn<4&g8ik%772?j65YEFqan zM*L>BewZNh+>HG8Ogcx^FK5=O!-%t|isce7nH>w}D4~iHPi7dPnSHa^-C}xz7TMy4 zs{JDJ&M%4ir=dCYtpXi}j(hj+9Te16yHn3RJpy#FP3X>)*V~2Yi_CW#s9-C(WEUtX zBS~r&jnM|tAp|HW$?qYIwPM8AJp@eMa3npj>pjTNCOqH7sr!4yF~pH9f=OIW7%IPt z(}z#gk}{gG&VM51>Q=Q0PjND6pO6Lv;_G)2hkq3;Mmgb^D?z&52^jeKVot@9xs z0Y5A3p0Y<41}lb|Vk8nrl}aIrTb5ldT7yDUmh?*4^*w)tfplAv;4l=&*XQsK8TQnW zdR5_hltzixpS(ohqzjR!E!^3&6Y#$0OuPOf5{~6508Llepsyx~NDQ%c9}&QF_S>_u z4EBlF@i8H$n2*&_Riac364h!|LbpfVm`~Mt!C-|*btCe?c!^V(l8MRcDC#IL%l@Pw zq2|I|MdU?<{-)YXN0stZ;TLTi=0iV$83%iWjx5uMMXUsDRt&#LiGE&ctSAW%y4J+^ za&^TTvskmzvyN&Xj+x4GxMYbwq>QXu*ww@Hr!rA|91hzD?Dy?+?i24*Ug;wN%s#mk z->dJ^tBrnry$y3CjZ8UXT6=cvSmr3>2>RL!1vMNubSToAo-l_1p1_*Wi=ZY` z@dx2t4B?Ol8!!7wCMXL%%Sls*v5C6Cr|ZRDd0z^RJ-m|2%6ZC zJe>iZjCH~!EC8gwqP|gzREno0EO1lJQf^m5T+lA*1#~Pu&&=yG3eHn>D&6$y1U-@j zu)b)#I6Ri#$e`%JHK0(#t)Wa32n}$%I0=!m4y|3PN*MNik|;4vGtJofmee{URJ0%+ zCygF!J7};+z2`9KFjzzjM@vbop!8emJX=kv^#{WbK}A8up^5Q{!imK!?i^wEB@R#y zC}$~WtJy@)TaT&fXH$!%T>ZY@58d;o4#zM(e%%rsO+CW~=_)`K&0>31dnsmVt8$8R zMc$%yU+rbnNK;ueVeP>(+*);$LsNjMwHdy3^FVdqc}izWKwCiEi!eND#0pvksUB&d z+b>rf0WE>e?8)47(SU*L^kY_Qohgi|WzM}O>@kLZTY!4boQyTTb*oz_I5H+m;p-Sn zh6qaz@!-aA=f1rAjf>%q@9YgAry-~J?B`m|InTN6dBl4DI9EPHo-U``bl?{_VV37+6e(xY|$YP~CzMuopk+WAI;b&p2 z=5e&|+Il_%N9+Q2k@x)YGg*fXoqY->d#}Sv@yb}Rm;};4DMl*urT!7aVEl;}OLK+o zMH7$Y(@WZGO~pFHGZVQiVZcbHd?m}MZt}L-b5mj*`M<5R` z+mph9Ls+1bJv2Ef(M7zRQYod$`nUC=mFHNcWmx^|fMZNED_I)+h+RWsC9EzpQj_?P zBMm+JB}VvqYfEh_;6&6Ye|kmU$BDD?hS9Y|-rS4)w==9>texbhl5hoWW>THQ&dM+R z^+GN_Ye;*zuph&<;3|b$qMH~U7E~(Ev@@y$J86BD>_UusM!)tnzOy?))7%8WXB=jrIijwt{zBc-`gL}5E49X&F+so99@-?)S_Bko>98yvnVb+5)hO1u)_Bz5 zIiKBVG+nxPoH-}<>$v4QU0BoaxO)*9=~~l#r>V4HwP5)q_tbDFS{+q>e4qa0U|6N> z;BqzuJq!H;{{gLOsdavVbXHhHEn)HFi458hdDko8!iyP|2URmJcX0QEv!u`d@g3sU z9T}>?s%NZUl)pfHXirAj`wL$y#BPAIN-i>kGQmMH`0u&aBj13`np;aMIwa#r>*& z?EqW5MLWAjz}Vrp`){GwlsT25_T2XD>Q)20)^p#^Mn9{&W8ysC$&KqypG&;A#f3b6 z;f+qPuhZSY-OU!>MxZO*%j8)5iWl8^RfkH4@%5)Ou@#Aphy_vo*Y)L#^`I}^Uf;np z>oRw6VWCs6NjC}T60iwb31i`?;U{@~BK-WjqOLE;&!rMm7E`o&_^*YpW7YV0tbz9n zCrgtvnKK0$R~acl2mg|n-`yvKHEV;tgJfMJ-kj`4*IG|!Jzncxq!&e7=qmgE6hZWF zHV<_->eHo9DTFC0Z!plA;AeAA<~4}FNntLlrUV7$O9KTJ90~>X@CKpBP*5IhP*A^3 zpr8aYp`h@cl8pzXp`et~qpRQ43wN4oay}xV`<4@oWyRE4&hhcxh`E0+IT+<_ zm`O4(q!z<$i2`?_9*q!vA~`p{Ov`@>+| z2}=C+S?|xYcb^yrHa|h-PXSE~l^w~#Iq17`!d_t?Jg~gL->R;ci`{l`vhP<+&s%=e zuc;1#^D;EFv|ZZjLO7L_<`)4bTOltvIQJAuCf8uPRJHFodHfVpN}U!?Q>bz6KJQaq z$#SK4x{N0uRz?Ssw+C7ql#eY%SaP%RvahzCtl-bj0epU55QMwSEwcRN^4CgAb^yV^vvDU z11s?HTZ9y4CE=8lUnc4~?9w7P5d2mi?sNy_)%EwzBuYsM&DDf;3^RYlXaPofa2sz^ zzo&D4!_8et?);vfqn))W+sJFM%H5J)8Q<9;} zJ5E;tw^bgG?}y|}R$53&Gc-t89qt$cl}wScO6I$TqT4jXF%)8QhVw*nwMWT#ghert zI=;iPg@pn*Os-S~Oesz>rc|-#{&1o$%cXJPe@=8h`;~p2p zKn?>DCa=}j5%ms{>u)2h$b^O!+-Z}OISPy8(p2=Q)lEzWB5S*sRm73<@pSX(MEF$< z2XLF0jJd}=a1nW``o=Oh$9j`SdP7Oyt?8WlzHLDipmT@ddg;NB-d|Kj3xYivwgJ0tBNAv6`jd4z@IJ#42!&TC`AJ zIN?DeV_A%-XCOFX3lEkSiy@w@)12OYtqn6m%ufAYh5qZ{*nyNx-xuC$c~3d2=BB0j zluHczUsnp&U(z?P0-59><^^!FA+{t5&R3XKnDgXTny=2%1FhCM(k4ggYOi#oWB<}= zjtcsOL(;-Xg%FrLq15vm1IBQ$Kh2i6?mVGQU?W%UI+Vu+Ee#c^u~ABlv`GJl;oPR7 ztIx}{-Wgs_udKuAMabP8>4jn7-TIT?h3m!BA^60RLCxy4!dooSog&iy>o6?>RSrcx zBIMzpl>RGpq2F9C0h5_h1iIHXBi==s$%+xH!kvMbp+3Kd!vT|z9obEU(5d9sOQIw`RI{O%5uj#0W5aWEbLd z^%0-uxV{#!5w1yl9al1+h|jskI;j)Re}2!M`3WHReUkR`$Tywapd=-_p24mBeT_Y9 zl=U}U*6aBlg8ZbOi#zO?0o`Ut;kN2McLBFW?Olc*5>nWbBas_nmJDRrU;Xk3U1voN zKVV7FoCR17`_5XyEyk)XUi9mNxaU86U+PD@7S~q34Qt8TFot%vg&A(r7kp?|Zvck8 z6e#P}tjMethITYuW5D;4@7$&)E242GlMJ#+*P%dv}5ADbw8WZ?J6o-eP8_<{Y6GcN1aa`NwAA72dO{adLJF1lz4p? z4XOe!x_xIza`0SB&szLkp6W%3TA_ulTbGRc(Fri`)lM+RRaS*O>#H5^L{326^t}H| zWoY@kA; zgeY*_`#f31X2Ody3{`&jmHrT!Jf3Tv8pwUbm47^%o4Xg2x5%l&;ZB&c<5ELlkTtJX zpRQl2BQ-}AM-sCbb0d0js03F(K)cdNHFcbXuP`0US>%-EeeQ<0m8dTMXEeNMt2!%n z3JU{d_SRn%k{r+y&sdA)I5A!?$L3#p8I30exbj(Lif?i~#;=*e|6}|>2GW0}aL9t* z|7(zM1lgzFyo0PEcdhN9Ry)0F;P(yzmJjF!@6fdi);O; z&)h~ASf2ga-#S29Uup66E2;$ilNi0r+=RVj3t|!~Puf=j3?>c3i{lOO208Oa@NzrR zTH}=u-IQqONs8b3(Fni|4-y zV$Q!(e@V$VrN5*THtS&U{knJeM{Cma*MQja{QYf*;S$$74?bxxdaNe&uZ%?7;mjw- z!#`~1oWq@%ihUJW(nLo~ubzAifSfsJK{1Jc0uHBgdy`IrWK29NG)>1~me}%1YYsoJ zb44=<%4fEeeEXe`ciF#HgkuSdV`(S=6r;A_YpMh|q}-O~m#G+bEu)x_jQtYUoIfQS z`&FfV)opxLHY|sw+z`q!h*43w^Cx-Eo!0Oev*~Un)CaNJwl%$VO3~_eGs+?YI#-0` zML=M4FFiZy`9Zz?GR1TRvneK+pMj@SB%SrSEZhf}rCb0qKhAEX%TiPoc2Sc)8Hob9 zJnNU1k-yaUBdkdcQ-O5ci_>$^CQ1&fIC=+XS6Ag79GIW!$UgV`-3nTvF>Wa_DpU!Jg7X-ORtkM(L!<+N4cJwq77CT6laA5Wf4!JGz1gcN@>ZUBP*%2L<>WIOkGx z((PC4H+oL4(}9ZDyt9!v1W@IqI6z+e+}Y&cuRC7e@NwCFizqgP0ztqO!-a8sC@uS95$z@!*ZO!DNrgc98Jf^wd%E}1TzbNSfkG0|eT7PbDU z|LE>PW&gINoN2b`85n8@Vm8weN(lEjVPIsjT2I@{5;(*5w^~#@-13HwaWWdM`lwaw zswrHdwWa(*+I)F)Fm^whOf%1tsWMSos%|J8GCRv5w6r(8BcWq=%(JM@k+r`f`i$vR z6gF(r@g#D;wWO$ud!F6wyN$F)Q6t3HBP<0p>78q6opUttxC%U%)2mXXojO+ohL76O9%h}It^T%jfifxd?H_%140jL$fe9$DeHQt zTYZeILfJeJGx~mQN)YEL2?`SS*;o!%PN}JBEqYjHouj&t$cuC-gF$r9z*Vz<9d01vSJ_&ewu!=_&yk8{fFiHF34pWr8XX?smH)(@QeK# ze`+nN><)hgcXTfgn|5KrikB@;SQSuZxy{&@TA_&E{-s)}h|XR<0H%(H+_)GMrzwQN z`_d)udoAkcx)$lr%Wy1jECDBS%W&n1U0E#l^8Y<=Hua=O9iYZ7WvMgSOLXpY#@*lH zUAGl~+_(rLI63M-5%HZf)%aiYt6J}mztil$2!pBm-_*YdWN!YO(g?aH|F?s<5s-*; z5CYlM&dtpUkDX7RpCXSTJ&l%+#Za(Pc{@|$vP!z~)9_y)uu7|6G9xmWA9O@VeEoWl z#jKVm``)VyE>sfdT=^Fp1$)1we-C}SjRhtQ7qVdcSl77no#Nd~-EfT5?ntE!1yDtE zscT-@3G9B60Xoit{U}^RJ^w=~r%By*ZmW>0@E{~IvX_>sur?}^-kypIDd)e)f8_p0 z;eX}+uUD?LCkdQSG3Z$P8PI&211SS(6$C0SF~gLU+31LN`y2SAbgAHs)~www?AWbD z)VpgVq8VCvL!S1qqVe(7pU9=SL@-J(L-=mScIUV7O9NFgZ@fU9W-l6O7&KdG+&>Fz zN33xwWh2%1_gdbua<@PK88DNsBKfp48-j8_B_GbrYQ0}%$t9wpyqEl%+uD*#iJrj* z&Js`WATw8JP(skaheJ`eC>uu~Zjgw5XO1FV=7@AMb#RM}Z2Rc>kyS-Usf;ucF%Hfc zhi8P+$VWt3G(T?QVcfqfTkIo|t#@SzqTLsQ&hl_o^m&)tB2E9N2erks(Z2V}tfQZ^ z@@afYv=s$5BwVDp)dvA1n=zy;ByFoT(*u2}&~_w$ zQ)@otr*U1gJ=q@EuWpxbwo+d*zpyYfJ1b6=M3JTF+K29BGTSdVp5+Eje!3BQ(l!)e zkOxxT41&5rwcaK0-dm_rB>hEfd^aI!nqnS4{$+2&9=73j;&Aow*r4--G5s|E8!$*v ztS!cN?ltRRENHL~U9|ttPM<7o3JyO0Oh--DNzflw|A$^yw*g%3+4*@%B_-4-$**kV z0Sp9i@0v(0`+u@$Qdk6m$!#C|)+E=3Ch4a*u3oW}gD84_y+!Te1dUo&=TkkKWA!pE zX5pK>^$AM?+X<~5$MUxhPicG?q^Z;$2g-9`j^j69?l<7^k0G`krK`7Vp0pz!#PgQ@ z$kOo2mQq5B@4UyIQEPE2Y!EP^DM^LNk;N2$Qg1e3KAy>*qQLqB=hRV`76J`_tJ@J@ zx7ZIB4v!;{qBcvp6y99ELUJ4zzEVKz+>)0;)7cWw&#htcqpE;RV%~UFf?@c^qh719(sH0si&_m*Ys;TTXA-ARoc%_ z5Q6x)dwA|XkwG;%>V=V;U6bSat$) z5j<`;4FuHb&CQi`8WL49YF02Xn%bXrj6ZJkJtTc~xK|dtWO3meBa@MbxXV)&RXMv^Iqn(S< zJ7*&^@((eqHp3U+dyfmJ-LX;CzGZO%Z1bx%(4X4<(cGUP(_*&7rzaHXGv^b*h z;`MouuG^&A^!N5sojhC@tGRo5&aMOoH(7inKi?RO_i6?&F7o;u4B)Rcn!}$}$ra8V z6?g~WG;Vg^NS_tqZv|dINXj81pSOgTF1_9rh&Df6P)?#gMHw|8e9MRS`z_q!74f&h zo^%PBuF<`;Lj%p=tdjoK`-Vcu~bagx`FvjCeiRL01w$-{fGrmbA(I z1v^Sd#-68%loBfnqmHREl(RCy$}Ga#Tm~rYYUR1VL=vAvxiKeUsfh~ov*pY%4qTCQ z5iuJRFI;k@Jhhn{D65srU+*dhNG?BXO+L98W_Sz5v;W}LO83zC$z+~1Vu2t*&%jX7 zR-N}44hN^Ht*)voXY0cc8H(OQ%3@;g9$p?X-3*ydbX@j+66Ubub>;u4FAu--1WvgT z=LtVdN^~IIRWt1vF{|M6j9g0V2g}W4c{cBNRD3B-JJ%qB^hmU1EfuD(uiE_lB1d4a zWH_2=%+80&!`MOTXa#w;;EN}Vh81&>9gJ{FQ-a&cbEXq>my>{;-{(J?9NGG$WA`^m zFX~KR+EQLqTSQTDdBc=k^BHxvJwP2f0)FUgqBbA!Vq9KRkqLMM-{Gpgj)ZPqOSFx_R6}P z*eqHeVQcFfFI~R#-B@dWdi@-t9}Z8LQhX54d>i&IwCiSqF;CJ)jnKeeLe2hp`}ux) z4v0PIbz;5EL}acs2*7SGt*)gdA53}nP|QjA-rTgE9n10ng`7RP=6O!>Fm`ol4*%3* z?7Dg7xzRz0-;}drN@r3cRGYKd7>kv3=ucgVT_Vk?4Q+d1V1BIJA$|t*JD8qQKNGI- zyFIt>=tg7s{C7ERe7HRP=d}U%0zX<7- z0!=1<)9JkIGv@j4x{w*ZBE;ZrOq_}Vtz91iuRah8)nKrK83H#LQHGzFlma+tS3qP! z=X_bcSR4t869J1nHU{}HYB){6uAhxGb=H;ruaB<1=_F1%5n|^<;PXe4n0XoKy~Eo- zCLkv_^qjM!_nOQ5EpT05j&{h4R}1J~gJ0E*inC8lj|PGC_H@qMbVhzhFGo@_l*2Zk zC2^WkbP{`Tw8-*`QSua*JwNS1+%3R(kt6o`BVbTW(p0d~BES9RXMz$i5>5(|99hBa zy}d&ZGWcA;j;Xq=>^k$lBdB7L58|4Y;>`hZ-dbj+QtI8eo>25%aw+wHxq|-( z@A3cDryRE44q9mkAN?E+P1xH4O^yRbENCdBOp)cFblsnuf)^Q zcJR=S*U~P?SK`u&UO!Rg6@}o2DRq%JcJJa9yMTpxXi3h4=ps1tn2Oh!OJHisDL`$m zaN`WS$w1K6l9%CPGarr&6Sovu8mx$vse(;=!#IHiBW7vK7W+6+$5-6|{3QF)J_2Sb zhY5i$+;(O&eNSG2910P8H?cvL_Zm>j?}i3@ar>K z|GWrKec;WOn4sJ;Sy{R`2=1UwKK>481o7s{pj-HD*E?{WoLpP4$ zNwXS%1>X^cp5ov9WKmS#KHsezCD^Sapjmj~_xL1;htioZ$)w%DrMgV5prA0ci$`rE zD`;>h&G2$@EO+T-M+nxC$ur1OSgv#bsHnRAsQZ+~11K(jlYQm5rU^8!}O0t-zqkw9y6Rdl}IT(wWB}sr2 z2c}GTdw}N6A5B~DVo3t1$}BkS6s9bwq>ZLb$BCZb@m?Fs*6S*$Kw4~_o|6Q3xaehi zR5*9P0)$JtB4zAl_w2|S*Bcv6`&d>}13D^7I4l{6(QOYTJz1>U8wi`iMz9J*&$@V$ zT*okcBp(n>=*kZT6MHyiL-aoY^T%aF+EF)%!dTxQEl96f6nDpJ{mjaGkRY2VN2ksV z78e)SKy=SH9e9K12AVkNTOe0cH&nVi-&m;)WL8pAB4m}?yX4d4-rz4+@yjC(B#+X; z;Znd3QxZ`bzHjNVs(v|=?YewyWpey2yEHtgGCrwQW27V@0sTQb)}*Ha*&A%^0xeBQatQ&z;mh3?9Z{U?V@`HGMeR*aW_m1uiNWU9Q+W z$LW8Zn09p2|HS1qL+&UF-q|$nmwqrRS)p!!(Aiqg>d2c1KjZK`$g{O5lX_8i^)Ps( z=pLjc~+AXQ;>yH_FZH!>6jF*;|N3)wNo8JGaaT{Z9hG+sJ+b4=z{kzF#vIta? z-YZ_C(t=lWaZ0bTa`!drG4X_1uJgu{4q`Wvx4JS(Y)^I4kOKT>xKm$+qmBWXaHVc{ zLWG^?De}gz@qEHESR~wW(^Ki#dA5iu%`ou~G~Oaj)#oXK3`jYrfq3v40(qC{2T#nL zK8?1bU8L=7h+^|R(2 zU?3)sjsV3WCVE9^V^!?VlMH@yF@A}+`1^#+Pk(!L(gI|o56^ZA+ru&SU0Wd`)_X>} zD&FA($LvV$KhQ`3=MWiQ3A3xr!;XhnZmrJsH(I_%}oi# zXlF2)0$)Z)rlzJIvA~>nlLS~%Fr9W!bF=IH(O&7;@si);^c|a(Bb#yv(_nH4?iLYS zgzb719FTnsNkfWgvAPz`VrO-wFLkjnVb*xrnY8^!>P!n#9NyED?6(Q3t|CnE!UxI1(Wgj?}v=y z94h;&%lZJ1>>+(qTOanwNc_-uY~@a6$om|P+G2Wdx42ar5Ch3y5L4Vrlby`g`M^s; zk4FZtcV90%ZXZR=%1LCUFV88fX4*5!8P$14^1FK9x+A))Z>_V=o>eCK>!9#?Yy z7r*Lq+0U5*@AusJ-U=@bT#ri(JQt{0^8InO6|;Ja8B(&IE6NO97Saq{S4s@-V~m|Q zVe#3{bIIAQPRnBXUcKQ^$t3ed8r{#=!wL(&{UAJ z8WRpt0_3OLRhT>d?i>yA&_pt(vw~=a8s1?uZ1!3ENB&`oiSo2}yZvjbUt9E*mnJPq z^sjmFU+jfcl!W5MAg7sJ;&TYVPN|X?RnRkCt24;V4m-(3!cam6D#nZYAn5LaBVE3;VKke2k1ze zB&$q(`NeOs$&zPjep$Bkx8u6+$*D@7O(zi1u}9l_Q78~`^0lbvw-yA6~Lp^+OL$)t&-H5*&L%J7%obhwM zVjG#HzZVv{>E{kn9G-v*)VtT^kfUdJTg}=eG25AI>}e9VV8D9_Yz5fMf$|&!gB*mk zY}s{CMBvaPicu4f0^K3cRTH#ee zK##TDk8{$aO|X?`#*d`X8Oo){GY!0;x9cF=tuBiie!K$C*Y|O8z5^PjDV4SPq)mW| zVw&ufP>`Q~(V;!s(jt??!|JcifF$M8%MLDOicfqbw2)1Hyd*-HIA46j!vNBp^sq?l z>3ThhQmJrxc?G{`KZ10efMbmy&Up>iGCJ>3uEsL8o$1&$f=+(!x{%t){$keh?OYi% zraU#4WG|+G`;lxyo^Vhbj*~`&4fWp~@G#c{I^Dha zx!xzqa0EW9+^zOu3I*U17=ucBX>}3xe|VAJhkL@RCP(#`re_~(Alad4YA%onm{0&d zenga^g1}6($Me>k*dYBF_VCYazkGN_0|F)pA`TB}AFl<2v6Y2F##r0kYeYywLO^EP zPV+txP{K<6n?uMjQ)0NM59Vwc*W}^Jmog2cB@aS28w7Y#cQ$^0)!oZ`<*jwQDw;oK z+Q@pq+YT;a-#hc(Zwh=*r{w3v5&OkazR&WeDW@bMilz3H(a`Mgdln^*pU5N0+1@T&QAoU(9ZB=9H%gORrW5a@C|%B*nEA_K zF2Yt;0F41JNT=Zm9?FdN^`#Fj`&>bv7_*9<-k=G1o--#@Xe~gmOzl3XM0U0X-zoCX zW&9(YJneSsva`HZlvW(xSe-Uuus}r5UWevL(d;Dyne`6D!Mtx~SfX6p0}Z!sN*XHE z^!CX!Lf8n)O}UVT_yUXQx_xHyTj78e=ocL5M@xa1779k}NuT(0;!-3l1k zN3hxuStg8kC3)r^xN3?xqJbv&bZnW;z)b1U7hH*|aMk9R*$e3CS<+KJSzQ|TEx5h#S?*T-|-=dHlYaZVN2n}rm9(`%bAZ3~Imamk7$ zQ3KfCi`y^~`}lY>b#B&hC?dHRi{Y8GXO@RIuOGl)oXpf9@fjjVYC_iMDW`Bd=GXdx z75(fQgHF3ptjNSXPFg`h%(-KTZpi?3FQq|Sjdt3~e5PF3vkW22@bhEhuJEedZT|Aq*=wCzh}6 zV>kMg0^f|IYAt;m{F)ror}i6CK1khWb3a~#3Rcf-T@E^chd?fCPq#{! zuhWIZ_EM&6oRu_eziyxvbKmU^Pr|#LAD4I>mL@ATT6psaE*Bfk;Dk9$xmUH4mENx9 zSUb{*gQZdBZ;>h}F~S@YY)qdLJbRmLWFZJhfP)(5Odr@#CNE(UU%CYGtfwm;fKcx+Z1U5HZ_ z)}EOw>YAQBB}7H`HeDbjcDc|&tG5*SF&#$+dcWsW%g#mf1i^~#xN!Ci_ zs=$p0Ns4gUeH`iOYX77{_E-8u6ST6m_)wdqL2-y!8M}C5PPWYdgy8<4B60tK4Y$Vh z#QE>AokedbCk2@e5+4F#`m$d9PRye#I3WjgOVfI3{Zfx-^ZI>g_a<;GZ}XgA3v~%E zLJc3xtU@svsMtkPA9OT+Ek%{oj^qLA9x`tS2%YW;mDPJ6vMwYjkU5(?bqSECmV8S7 zJ7oAjgBkyG?*9gH{441A|DjR;4p9E@NYg*;hc|z}t+Ze8G5m(0NBLXh=ck)zH%KHT z2f>1gn=tR*NnztcTuOTr-a3(}N6EOs?>2>nn8=v^Y|EdEmT{S2h`&>O!=hmP9(*mh z{g|HR^STVpUYOuhxSr*|)fHItF~&K*p`APsoJ080S3SO_;GfTod&Da(BNY`D#J_~x zsR~W7F)=Y!Av%G4zA8yVJ~)tgDx_0*Ao>3k&@cbZm+Yba?*do|G87s4p9TNsg!%7+ z|K#*PRPmpj{$2Nfa{8z4|E%KQGW{Q`_)lT~X$7Q;t3B)BVAy!ncxdJ57<0e-u9-p1 zzw!;=Vd{$^=LRQWU%60`DTha-Y_M?%*$y?9lgQ;=H>UUxKWYZfZW?ebH!%%?KuMT<6hQC#^YKu5&1KtbibXC7B0-A z_=;vvUQU&|&JZ)KbBTue;S=ZSB$?=HvaIEhD>;@H2=TZJ1DOn^J6K|C-njpEUsBKs zJ}z|p+1@wdTz7oBk0B|?yT!iu-Qizy9`wHo)zgmmqpK6XNejq4^XJstw(f5MA~@?X zI18ZM6hsQzU2R3Ub0n;-TvtEZ8r&!&rDTNr++s&OwX)Bs;4& zT($K1HE~TZ4<1H*Dvs!8C#!qZQ|lGG5+IXzxiD{O$)AYcnYvsxWo4tc!>_Z^iI9}~ zYc!%paL!ERbo)ESbk6m=BMD7Y=>j=-O#(t40==4GPX3)V179IE*`0m7Z$Vqh-40U4 z>kGMsZw%X!*7dF16DW?xB&LUulikZ$7V2qXAPLXmQl)T(r^fJU*N`DRf${e9SI3Xpw zdn9(JcnEP-gxK!=_-5wlMY^TSqdqLjqlSW>&~*AR;7qQwo%vx-pWR;TUB>v>&gOw_ z$E8oEiWhvOPxyMR%o<7tnl9q1MazDPcQIUmeGIuhAd@{@hbfvkAqlYcb)9U8qt;1< zjQE;29W^LbUm*kI+QE$5wk3Gx-RHlC*qH>MPB=V;Yyi>M-w1nuAny3t(^h0? z%2DdLh;*du0;B%?M6qIM)#bT@xy3~ltzq#;U3qW8Cii}6ORB{n!-(QE(*h0Fbsh1g zY$1ENB$e2&uK4R~_j*CpBK7=&bMN%D<=djzws>|{(!QC|M-MkX=7B# zeZcd=vHh3H4kB^l(>0ROsYM|Bw|tCi7jf+Q=_N4pa4ccVzQ?vIx|Y(g#bCOc?Vo-c zo9K)xRpzp4EoqycOkwXg4HJ60HovrF-T|}1ESS7x4nueAFwow2Sm(TqZ7}T`;A*G` zSS*S9I}M-}24A{}tLDn0DpT}Cmvf!#FGZ_^yh=~N5;ov#Ocd`<^d(ki)7u{gqbH&J z5qqh{OLI&#%EPxo^B)_NPiD=icU3vukVk&IazQ^{n;dRyG70`xrA=qf z6TWTHYR0m+I6_3F#-eO+XDjIpcODBy(jpU1k@1}-eJ-@i#_o(bD=5XE7kMMM>s z(7gFi*+r*?Up&n(E$qOc5LWrk7Cy}wxc}^n-eKji-UgFosplDF;LZKhq&wpee4Z$D z9q>c(4L=1E5cBU2kI+>LmpV8J8uw+%HkXr78;|$-Zhk3M(Q;xqMYg{Qj_zLa9UL4~ z8UyoC^MjO`@QQx@`T&Y0hy3+!klp=Wh0yz+4ed-cahJydf`{A(&LQU6{36>M7_nJQ zKdlzEl*~8V;Bi@tibN@sl~l-;skTvOS`ht zR<5L zzVUIyyjTfChyrM~w#VOkclM{&5gP19JZxERZaluJs~yd>lLtJJOZ#|yjZSmpXS^2y z=+D2$EOe<-!2WB(&oLo*Y%Izqyzzz;oIy+{TS^I!3Y0{sb_od^fZSKo7-`bJB% z%hm0Aqq;QRJ(~L6YSf$d!SOh(egpZWdNA(gx($N&)j56MUhZ@u&~%Kb-Z*Q`BMk!s zgJQl2Kr9q)t_}ibd7KUIgrb8E5wX2NXU%1mmDH@P3CYP=(Rz58QIc$^Cq3Eyw^sp$ zHy#8ir1FC7Ces+RoE-NjyHZR>El}#foNs_pCFBM+UcBj-9s@1y6}|_=uT2Rxj@Wzlbv4J=i6r9nMz%^zY5-qClzaU+&EfmW|ct| zjo#Y06+8rr=4b!@as>w4E>)9GP4(`D*G9<$(pq6NaP zl@B+K_BFi{_@wua0QvXb_C;Cu)+XEN$3J$A6h;YOH2|ub*fp-uwNmsWP2Atg_$iAe;izGczCj?c?R51h%I}Z6Ci) zWACE^TNDz$MBI<*ZpS4V>?Yl&kYuKLJb!wQ<0G@vRL;=(M*GOfNP)vzlV~>m)2J3F zWL;8bBBJ5sj4^tFn=W(HX7oJW4!zqvZ1AwFV~TN>_jW=AH(I(6CjOzIJ5|rlFj=Id z99Nn+;$@C7?CKeD0Rk(YiICU%UaOIwt8njc7BV|HP6I)h1j3=)n&jBo``B$ubl1Tu zHuVW^?FpO(NTBRS7}mGQZ7DE9E_Y0KrVK(ZS6H{4dTl}{=~HR*8F2{q#RunEXc%RH z^7gnjLf#u(j{@HAvn%&xoS?I#0!G^yoqJGU<|%etWBfJ^GD5C1tLH@nyALU)UJgnd z02ia`%d)q$iZ;Xohl9|_ks}01)Ww+JdB4(17F8Tc`tU`<3xHt$^MOvF3r zvwH?ZG~=>DBMM5AdF@wV?d<-@3hdX^HkQ(|qUE#}8M*wRVzP`W|-Lf0~(dYF6 zf4Rj4yR57XasW(SW4>^NwCnjzG8^P0S#$$K8Zl|uHrMH8EVN`f0uR>hbcK!b&UKbY zO1C66=^Z9H;&nh+*e@cz!qR9D--UM_2688Gr|~E|?&gb{&ev0Dg#t_77dGmY3}N$u zEX9NVASzuVZs5^)k3208J(E>{WfeV72G?ps*nar%R_0loB(&r}RN?Gcr2x0lDbiCR zIv{ezo7t;8qTB6&i%}u}${P(?d-u2Kriswp)Iub16<(Crci+CcVWT?-oK1PV*@L-Tz;WoOf6gOV_{^lqv}VN(T!?1ZhzarKkvqROKoLqzj>kA|;eWK#J0d z0@4vgq(`ch&cuIq(q(H3?5D5sNoP?=!0 zOoOFZ)xKh{6CJuZNB_N8$eZ#=45PUwan=W2{sO#rqV!3SSEoI>_AKv3rk7iD<~+)FDQ8SHA7`}sv*^^&ilawbA1FtX}sFS=CH~| zgoBwS=vHFerq)^%Fe5UQY`64v)+*52sKUe1TNl#gg28s&_Ze)1h^4rl%B=^Ou z?c#2DU8aQ@c*%>q4YPW{hrr-p^u3lu_X!pOICnSwWX(k{I^#UG<|~h2nBgnd|B#ixrwWFhBXJ_X*NeCzXx8dQ3Mn*a= zdTZEGU~pvD)~4X`CO;jWJ{1;TxEm<6w zk)dz*`0N)1V*bbCK)nX5NrlvVz459y6>tLwD6d(q*9X(sU)#$gvB;xC$P%&n6hBf# z>u6qFK+!|wqQQ-LBV3H_>N}Y1uL)13_4koAdxJV(W(zFb7QP#A6!If`D-|c2UYd$~ zbPHB*9crU%7K0d*m2FwTx~UyUV13)4nR$?%nQ+9?fYv+8-W+*(1Gm2wDYH3W1l?Yp zOp4A#^$lvUj&AS6o>ZOZVnK-xV)<+c*YMc$ccZegB{3EEUM3cgyZso0d5%o_43%-j zG<`Bc2gy?qvRSDeP*UXcqv0E!_)ZzHuVi{t(*7Vczl>QLapaDphYFJ}~mF7by z0?i@lX}0H_de%f#goNwpB}|v0E#fVp)}RD8G>JYl7P5Wu0oV zPJ2QU1()6z|IzGTWBlBb-!@OJph}o3E?t9g8rBb=hi5U;hLYyieKo>YM?8cg=v!b=c~1 z8pK=5#(=LKnu8+_FtTbhhckz^u&oS|OHYgi+4W+_ulefUt1q3%fq4U0H5Zo}Hw<2+!lf+(2XuZt$f~ujk=epU(N(;}f z=H;WcZclzB|IC>p+c_voL%pviNeT3oVy~mq(gesF)Yh({`(F@44rEfwT#Y@&>S>uJ z`=a#qw5_uOeW9$39y7tMHI~h{`cl(8$;9N=QR5h*4b(EOp5{gh)dzgTi}Z|1g2-=sIRveT+f~P zs^1JcfuTQs=lDJ5TP95x$6ujO>&C6$b>J<@*2qt^%QnHkEL=*iO-=ab@lcRoEltBj zilMc5EhxR)YK z^6#EHbZW$w^aQNvjw!0`PUc)eIK-X6*uVKKZRRjlkX-jGr7c(6$3C2raZ*3^wtYeD ztBNMVgN%Ci3|guxoITIJa7SvSNUPq zzO9TraI#ZF%@fufA?FpCXPa^b&^R6@c97Ebkl!Bkq>|2#SfJ8( zhdS8*Zu(*i7ArkN`Q@RJ3ItubnAuL9zWh)KmRyS=paazN%(V11SvGuweXnXZfy73# zd56k0*Sb%~;yx7@0}j8x2*FzWe67!l9{dqbPp%v+XsRbK7_@fWPT-xDeQY6k`0_qkf>%4^q7tR8d0 zzm@gvG(>vzV78aW!pUSh=kfPgY=(WS86)T*va`CUWz|fLo2LG!^9hNXi>@m6L)mYp z0uML(D;N=heT8WOoB6^d3RiK9DGBr|e8_E)oYLmWjrQH8<0zNDAh&Xdqtrb5kka7m zWFAydtVeCc@dT^+b35~MeD`bkt*nXYwR$;d0Lq7hN@aOqxf?f=SY9Wl-^na0Qw8iX z;A$>J&%kCkuPr{bUKTXJurMd~6o^XPCfkD6LH#`I>lTR8YNASJE#3sck%%u!0)sGi zm+&BL!hxkfnw3}WPB=x4=Q$~nk#!XH)^sqOKvZs!o^_lsWH|7j2#%N82HbP$8 zjnQ0sv?{uPbXF{4;hU9$jMdz(3RmT2yFG*0g&I!%Jas5dEX=y5^uf1gPeFO?l~gKkRvhPg zbI0zK&D~~$jEM3@KeVt2U-t(#@EG`9lN{5)(CC6xy~)A3^16v` zz4mpZ)o&byUoRvwSp{&nEGG{md|C528rr7e3!eJ9*uz`;TaCr#iQ%Q;S z8opA>0vp^OnN()o&Z0`0H&Sq&=#1I)C@65uFO20d5FsiH6OJWD+cGlU=!)D9d-zcM zRc?GrqW<-SFm%fOO9}clUhu)2pxiQb@C|Q!+>2e_G<*N@S{y=P;T-f+I5TbmWIX&#b^XhBCQcqgQI)43tD$JxAk>$EsSh?^a~5K+rz$ zgJ$Y2@Q@VPXW%J^jM>;#g*zt4^S)>ARhF3Fqzx8E#nF87g?+^R-Dbo^ih`W%zAfQE z2UyF@bJhOb94;1^H<6mG;Br|8yQl2Ai0vZpuW$aUgF}3NrS`nr;w!gPY26MNp2Z%D zdEx}CAu~UiCjz#5b<=zyobZNFQ?aQYmukKF41Y>f2$&L&6Y_rvtTl;O^0eFP;4eoM zQqesQ{)%6{GMcH+eKSl=8oQwbk{^nS-V6@T17|rlxEL<(>i1da)DX>6Vb?r<)%l!0$_;*U zF8qn|+vF8?61cDXW!LNJKr#a*uU*etapSRaG--@aSLAS-I^)gL$XDMER*YWM_1g-w z`+h@#<~f@SuDwu6O|Yn3I=*p)CD^My9`e0>utIREH}!&okj1g2F@L>_qpJRDN{9F- z;sLoYNc+Kg8%5f^I;tAqoM<1?Ar~Hmyc!+7C{Aw)uH`WL>zG$vg-d`iiUjL_GICmh z;VH3uL?L?Z0fv$##C(MR;U+~^;m`JiagHihAZa0;2XTsS!)Mrr4a*!MYn( zi~*f*ghuvYk*{gEbY3lGJ%~-LdMzlENwif~$tq&GEdMu0H+W6}qVdL|ncaac;R+?siULZRGEQf!rU{@PkwEeF%Z* ztMKx|bVp_JZ`M0#PdAN}U1*9O1C1URdFIpr+nRC_B;}3pL zVJG0Y=4YglX>B&*HlIzz;aoC*?!G_p!%E&`Llwb^>Xv7MInsbNAZ%G975w;^l&QGz z@82}#0VD8R=)b@lxbaV`{w)A<%zq^QQ}7Rs?rfAm^R*Ca=|~}Jv(mmHNwgf z!iCKzTBED4JiN2FkU1;uJnw>WV?nx{6ytKN7i+$ zqjxNwCrG~>Ce}9arNqY#Oz{yJg|zWQ-9sqIKK5Y9k<&tt322VL?{a39{DPvryZ>{; zX+Rq|{+rMLFAb;l$bZ-Lr$>N*@85#|uIW#~{~_Yf!}zCf|E=l&^_2b*fwX+f2OQKE h_Wglx$2=B{3j){e}C|1jWxdWC=9@?VH< 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 A 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 z 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 { } }); +// Open the app when a link with "moodlemobile://" is clicked. +app.setAsDefaultProtocolClient('moodlemobile'); + // Make sure that only a single instance of the app is running. var shouldQuit = app.makeSingleInstance((argv, workingDirectory) => { // Another instance was launched. If it was launched with a URL, it should be in the second param. diff --git a/www/index.html b/www/index.html index 7ea51cb8406..a3bea4024f6 100644 --- a/www/index.html +++ b/www/index.html @@ -4,7 +4,7 @@ - Moodle Mobile + Moodle Desktop From b29b7294391bc5502acd1043250ac37b588be977 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 27 Jun 2017 13:13:04 +0200 Subject: [PATCH 042/118] MOBILE-2148 notifications: Fix trigger in desktop for distant events --- www/core/components/emulator/services/localnotif.js | 6 ++++++ www/core/lib/localnotif.js | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/www/core/components/emulator/services/localnotif.js b/www/core/components/emulator/services/localnotif.js index 6e41fbfd3fd..9ad132cad7f 100644 --- a/www/core/components/emulator/services/localnotif.js +++ b/www/core/components/emulator/services/localnotif.js @@ -254,6 +254,12 @@ angular.module('mm.core.emulator') }; promises.push(storeNotification(notification, false)); + if (Math.abs(moment().diff(notification.at * 1000, 'days')) > 15) { + // Notification should trigger more than 15 days from now, don't schedule it. Using $timeout + // with numbers higher than (2^31 - 1) will trigger the function immediately. + return; + } + // Schedule the notification. var toTrigger = notification.at * 1000 - Date.now(); scheduled[notification.id].timeout = $timeout(function trigger() { diff --git a/www/core/lib/localnotif.js b/www/core/lib/localnotif.js index 883e015bec0..a585573832c 100644 --- a/www/core/lib/localnotif.js +++ b/www/core/lib/localnotif.js @@ -106,7 +106,7 @@ angular.module('mm.core') } return db.get(store, id).then(function(entry) { - var code = parseInt(entry.code); + var code = parseInt(entry.code, 10); codes[key] = code; return code; }, function() { @@ -114,7 +114,7 @@ angular.module('mm.core') return db.query(store, undefined, 'code', true).then(function(entries) { var newCode = 0; if (entries.length > 0) { - newCode = parseInt(entries[0].code) + 1; + newCode = parseInt(entries[0].code, 10) + 1; } return db.insert(store, {id: id, code: newCode}).then(function() { codes[key] = newCode; @@ -167,7 +167,7 @@ angular.module('mm.core') return getSiteCode(siteid).then(function(sitecode) { return getComponentCode(component).then(function(componentcode) { // We use the % operation to keep the number under Android's limit. - return (sitecode * 100000000 + componentcode * 10000000 + parseInt(notificationid)) % 2147483647; + return (sitecode * 100000000 + componentcode * 10000000 + parseInt(notificationid, 10)) % 2147483647; }); }); } @@ -528,11 +528,11 @@ angular.module('mm.core') self.showNotificationPopover(notification); } - var id = parseInt(notification.id); + var id = parseInt(notification.id, 10); if (!isNaN(id)) { return $mmApp.getDB().insert(mmCoreNotificationsTriggeredStore, { id: id, - at: parseInt(notification.at) + at: parseInt(notification.at, 10) }); } else { return $q.reject(); From fff34d26c9d678b3c288e94dc954695d00ccbcf5 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 27 Jun 2017 16:10:52 +0200 Subject: [PATCH 043/118] MOBILE-2148 electron: Read customurlscheme from config.json --- www/electron.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/www/electron.js b/www/electron.js index fa074b33b8a..9a354b1d504 100644 --- a/www/electron.js +++ b/www/electron.js @@ -2,6 +2,7 @@ const {app, BrowserWindow, ipcMain, shell} = require('electron'); const path = require('path'); const url = require('url'); +const fs = require('fs'); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. @@ -67,8 +68,18 @@ app.on('activate', () => { } }); -// Open the app when a link with "moodlemobile://" is clicked. -app.setAsDefaultProtocolClient('moodlemobile'); +// Read the config.json file to set app's protocol (custom URL scheme). +fs.readFile(path.join(__dirname, 'config.json'), 'utf8', (err, data) => { + var ssoScheme = 'moodlemobile'; // Default value. + if (!err) { + try { + data = JSON.parse(data); + ssoScheme = data.customurlscheme; + } catch(ex) {} + } + + app.setAsDefaultProtocolClient(ssoScheme); +}); // Make sure that only a single instance of the app is running. var shouldQuit = app.makeSingleInstance((argv, workingDirectory) => { From 15d6d4fcf787cc8110eb028845252d7c685ced06 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 28 Jun 2017 10:02:17 +0200 Subject: [PATCH 044/118] MOBILE-2155 lesson: Fix videos in lesson page --- www/addons/mod/lesson/controllers/player.js | 2 +- www/addons/mod/lesson/services/helper.js | 25 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/www/addons/mod/lesson/controllers/player.js b/www/addons/mod/lesson/controllers/player.js index 7c2e5f840d5..b7eb0b459c1 100644 --- a/www/addons/mod/lesson/controllers/player.js +++ b/www/addons/mod/lesson/controllers/player.js @@ -190,7 +190,7 @@ angular.module('mm.addons.mod_lesson') $scope.pageData = data; $scope.title = data.page.title; - $scope.pageContent = data.page.contents; + $scope.pageContent = $mmaModLessonHelper.getPageContentsFromPageData(data); $scope.pageLoaded = true; $scope.currentPage = pageId; $scope.messages = $scope.messages.concat(data.messages); diff --git a/www/addons/mod/lesson/services/helper.js b/www/addons/mod/lesson/services/helper.js index 7999d10a59e..42c4ed36cb2 100644 --- a/www/addons/mod/lesson/services/helper.js +++ b/www/addons/mod/lesson/services/helper.js @@ -141,6 +141,31 @@ angular.module('mm.addons.mod_lesson') return buttons; }; + /** + * Given a page data (result of getPageData), get the page contents. + * + * @module mm.addons.mod_lesson + * @ngdoc method + * @name $mmaModLessonHelper#getPageContentsFromPageData + * @param {Object} data Page data. + * @return {String} Page contents. + */ + self.getPageContentsFromPageData = function(data) { + var contents, + rootElement = document.createElement('div'); + + // Search the page contents inside the whole page HTML. Use data.pagecontent because it's filtered. + rootElement.innerHTML = data.pagecontent; + contents = rootElement.querySelector('.contents'); + + if (contents) { + return contents.innerHTML.trim(); + } + + // Cannot find contents element, return the page.contents (some elements like videos might not work). + return data.page.contents; + }; + /** * Given the HTML of an answer from a question page, extract the data to render the answer. * From 62e38bc572869b9f8ad321a4c4d1c13abcd8bcc5 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 28 Jun 2017 11:36:23 +0200 Subject: [PATCH 045/118] MOBILE-839 icons: Fix icon size for Windows --- resources/desktop/Square150x150Logo.png | Bin 21500 -> 11485 bytes resources/desktop/Wide310x150Logo.png | Bin 22634 -> 11880 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/desktop/Square150x150Logo.png b/resources/desktop/Square150x150Logo.png index 6dbca4bea3f1f3a62f259fc51bcefa9560072fe5..dd059984b4aa5f7575f576354b31026fecd7a94d 100644 GIT binary patch delta 8846 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 delta 18940 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

&2r0me=Y}_A)^RmXo>>4xx_r!)?DjhF5M49w7 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 delta 20083 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 o9R#-rir^t=lHqmoXd5>q^UxM*ztevMSJ7{ Date: Wed, 21 Jun 2017 14:25:59 +0200 Subject: [PATCH 046/118] MOBILE-2121 data: Check if fields have changed --- www/addons/mod/data/controllers/edit.js | 111 +++++++++------ .../mod/data/fields/checkbox/handler.js | 22 +++ www/addons/mod/data/fields/date/directive.js | 6 +- www/addons/mod/data/fields/date/handler.js | 62 +++++--- www/addons/mod/data/fields/date/template.html | 2 +- www/addons/mod/data/fields/file/directive.js | 5 +- www/addons/mod/data/fields/file/handler.js | 45 +++++- www/addons/mod/data/fields/file/template.html | 2 +- www/addons/mod/data/fields/latlong/handler.js | 18 +++ www/addons/mod/data/fields/menu/directive.js | 2 +- www/addons/mod/data/fields/menu/handler.js | 15 ++ www/addons/mod/data/fields/menu/template.html | 2 +- .../mod/data/fields/multimenu/handler.js | 18 ++- .../mod/data/fields/number/directive.js | 2 +- www/addons/mod/data/fields/number/handler.js | 16 +++ .../mod/data/fields/number/template.html | 2 +- .../mod/data/fields/picture/directive.js | 5 +- www/addons/mod/data/fields/picture/handler.js | 45 +++++- .../mod/data/fields/radiobutton/directive.js | 2 +- .../mod/data/fields/radiobutton/handler.js | 16 +++ .../mod/data/fields/radiobutton/template.html | 2 +- www/addons/mod/data/fields/text/directive.js | 2 +- www/addons/mod/data/fields/text/handler.js | 16 +++ www/addons/mod/data/fields/text/template.html | 2 +- .../mod/data/fields/textarea/directive.js | 7 +- .../mod/data/fields/textarea/handler.js | 56 +++++--- .../mod/data/fields/textarea/template.html | 2 +- www/addons/mod/data/fields/url/directive.js | 2 +- www/addons/mod/data/fields/url/handler.js | 18 ++- www/addons/mod/data/fields/url/template.html | 2 +- .../mod/data/services/fieldsdelegate.js | 67 ++++++--- www/addons/mod/data/services/helper.js | 133 ++++++++++++++++-- www/addons/mod/data/templates/edit.html | 1 - www/addons/mod/data/templates/index.html | 7 +- www/core/directives/multipleselect.js | 3 + 35 files changed, 577 insertions(+), 141 deletions(-) diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index 9deabef28c8..f8f4e1b3240 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -22,14 +22,12 @@ angular.module('mm.addons.mod_data') * @name mmaModDataEditCtrl */ .controller('mmaModDataEditCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $q, $mmUtil, $mmaModDataHelper, - $mmGroups) { + $mmGroups, $ionicHistory, $mmEvents, mmaModDataEventEntryChanged, $mmSite, $translate, $mmFileUploaderHelper) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, data, - entry = { - id: $stateParams.entryid || false - }; + entryId = $stateParams.entryid || false; $scope.title = module.name; $scope.component = mmaModDataComponent; @@ -37,7 +35,10 @@ angular.module('mm.addons.mod_data') $scope.selectedGroup = $stateParams.group || 0; $scope.entryContents = {}; - function fetchEntryData(refresh) { + // Block leaving the view, we want to show a confirm to the user if there's unsaved data. + $mmUtil.blockLeaveView($scope, cancel); + + function fetchEntryData() { return $mmaModData.getDatabase(courseId, module.id).then(function(databaseData) { data = databaseData; @@ -51,9 +52,9 @@ angular.module('mm.addons.mod_data') }).then(function(accessData) { $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - if (entry.id) { + if (entryId) { // Editing, group is set. - return $mmaModData.getEntry(data.id, entry.id).then(function(entryData) { + return $mmaModData.getEntry(data.id, entryId).then(function(entryData) { $scope.entryContents = {}; angular.forEach(entryData.entry.contents, function(field) { $scope.entryContents[field.fieldid] = field; @@ -89,11 +90,6 @@ angular.module('mm.addons.mod_data') $scope.editForm = $mmaModDataHelper.displayEditFields(data.addtemplate, $scope.fields, $scope.entryContents); }).catch(function(message) { - if (!refresh) { - // Some call failed, retry without using cache since it might be a new activity. - return refreshAllData(); - } - $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); return $q.reject(); }).finally(function() { @@ -110,50 +106,73 @@ angular.module('mm.addons.mod_data') }; // Saves data. - $scope.save = function(page) { - return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields) - .then(function(editData) { - if (editData.length > 0) { - var promise; - - if (entry.id) { - promise = $mmaModData.editEntry(entry.id, editData); - } else { - promise = $mmaModData.addEntry(data.id, editData, $scope.selectedGroup); - } + $scope.save = function() { + return $mmaModDataHelper.hasEditDataChanged(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + $scope.entryContents).then(function(changed) { - // TODO: Treat result. - return promise; + if (!changed) { + return returnToEntryList(); } + + var modal = $mmUtil.showModalLoading('mm.core.sending', true); + + return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + $scope.entryContents).then(function(editData) { + if (editData.length > 0) { + if (entryId) { + return $mmaModData.editEntry(entryId, editData); + } else { + return $mmaModData.addEntry(data.id, editData, $scope.selectedGroup); + } + } + }).then(function(result) { + if (!result) { + // Nothing done, just go back. + return returnToEntryList(); + } + + // This is done if entry is updated when editing or creating if not. + if ((entryId && result.updated) || (!entryId && result.newentryid)) { + entryId = entryId || result.newentryid; + $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: data.id, entryId: entryId, siteId: $mmSite.getId()}); + return returnToEntryList(); + } + }).catch(function(error) { + $mmUtil.showErrorModalDefault(error, 'Cannot edit entry', true); + }).finally(function() { + modal.dismiss(); + }); }); }; - // Convenience function to refresh all the data. - function refreshAllData() { - var promises = []; + function returnToEntryList() { + return $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + $scope.entryContents).then(function(files) { + $mmFileUploaderHelper.clearTmpFiles(files); + }).finally(function() { + // Go back to discussions list. + $ionicHistory.goBack(); + }); + } - promises.push($mmaModData.invalidateDatabaseData(courseId)); - if (data) { - if (entry.id) { - promises.push($mmaModData.invalidateEntryData(data.id, entry.id)); + // Just ask to confirm the lost of data. + function cancel() { + return $mmaModDataHelper.hasEditDataChanged(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + $scope.entryContents).then(function(changed) { + if (!changed) { + return $q.when(); } - promises.push($mmGroups.invalidateActivityGroupInfo(data.coursemodule)); - promises.push($mmaModData.invalidateEntriesData(data.id)); - } - - return $q.all(promises).finally(function() { - return fetchEntryData(true); + // Show confirmation if some data has been modified. + return $mmUtil.showConfirm($translate('mm.core.confirmcanceledit')); + }).then(function() { + // Delete the local files from the tmp folder. + $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + $scope.entryContents).then(function(files) { + $mmFileUploaderHelper.clearTmpFiles(files); + }); }); } fetchEntryData(); - // Pull to refresh. - $scope.refreshDatabase = function() { - if ($scope.databaseLoaded) { - return refreshAllData().finally(function() { - $scope.$broadcast('scroll.refreshComplete'); - }); - } - }; }); diff --git a/www/addons/mod/data/fields/checkbox/handler.js b/www/addons/mod/data/fields/checkbox/handler.js index b3ee51cd76e..1fdee4bc853 100644 --- a/www/addons/mod/data/fields/checkbox/handler.js +++ b/www/addons/mod/data/fields/checkbox/handler.js @@ -87,6 +87,28 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + checkboxes = []; + + angular.forEach(inputData[fieldName], function(value, option) { + if (value) { + checkboxes.push(option); + } + }); + + originalData = (originalData && originalData.content) || ""; + return checkboxes.join("##") != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/date/directive.js b/www/addons/mod/data/fields/date/directive.js index a50a3f49615..7844ee95216 100644 --- a/www/addons/mod/data/fields/date/directive.js +++ b/www/addons/mod/data/fields/date/directive.js @@ -28,12 +28,14 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/date/template.html', link: function(scope) { if (scope.mode == 'edit' && scope.value) { - scope.value = new Date(scope.value.content * 1000).toISOString().substr(0, 10); scope.enable = true; } else { - scope.value = new Date().toISOString().substr(0, 10); + scope.value = { + content: Math.floor(Date.now() / 1000) + }; scope.enable = false; } + scope.val = new Date(scope.value.content * 1000).toISOString().substr(0, 10); } }; }); diff --git a/www/addons/mod/data/fields/date/handler.js b/www/addons/mod/data/fields/date/handler.js index 2c981eb43f6..65aa27354ff 100644 --- a/www/addons/mod/data/fields/date/handler.js +++ b/www/addons/mod/data/fields/date/handler.js @@ -73,27 +73,47 @@ angular.module('mm.addons.mod_data') self.getFieldEditData = function(field, inputData) { var fieldName = 'f_' + field.id; - var values = [], - date = inputData[fieldName].split('-'), - year = date[0], - month = date[1], - day = date[2]; - values.push({ - fieldid: field.id, - subfield: 'year', - value: year - }); - values.push({ - fieldid: field.id, - subfield: 'month', - value: month - }); - values.push({ - fieldid: field.id, - subfield: 'day', - value: day - }); - return values; + if (inputData[fieldName]) { + var values = [], + date = inputData[fieldName].split('-'), + year = date[0], + month = date[1], + day = date[2]; + values.push({ + fieldid: field.id, + subfield: 'year', + value: year + }); + values.push({ + fieldid: field.id, + subfield: 'month', + value: month + }); + values.push({ + fieldid: field.id, + subfield: 'day', + value: day + }); + return values; + } + return false; + }; + + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content && + new Date(originalData.content * 1000).toISOString().substr(0, 10)) || ""; + + return input != originalData; }; return self; diff --git a/www/addons/mod/data/fields/date/template.html b/www/addons/mod/data/fields/date/template.html index bd54b7a2e99..6fb55039f52 100644 --- a/www/addons/mod/data/fields/date/template.html +++ b/www/addons/mod/data/fields/date/template.html @@ -1,3 +1,3 @@ - + {{ 'mma.mod_data.usedate' | translate }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/file/directive.js b/www/addons/mod/data/fields/file/directive.js index a84d2c1cd3a..719219f56f0 100644 --- a/www/addons/mod/data/fields/file/directive.js +++ b/www/addons/mod/data/fields/file/directive.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataFieldFile */ -.directive('mmaModDataFieldFile', function(mmaModDataComponent) { +.directive('mmaModDataFieldFile', function($mmFileSession, mmaModDataComponent) { return { restrict: 'A', priority: 100, @@ -31,6 +31,9 @@ angular.module('mm.addons.mod_data') scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; scope.maxSizeBytes = parseInt(scope.field.param3, 10); + + scope.files = angular.copy((scope.value && scope.value.files) || []); + $mmFileSession.setFiles(mmaModDataComponent, scope.database.id + '_' + scope.field.id, scope.files); } } }; diff --git a/www/addons/mod/data/fields/file/handler.js b/www/addons/mod/data/fields/file/handler.js index 6f6dcdd2374..45fe97dde67 100644 --- a/www/addons/mod/data/fields/file/handler.js +++ b/www/addons/mod/data/fields/file/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldFileHandler */ -.factory('$mmaModDataFieldFileHandler', function() { +.factory('$mmaModDataFieldFileHandler', function($mmFileSession, mmaModDataComponent, $mmFileUploaderHelper) { var self = {}; @@ -43,6 +43,49 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @return {Promise} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field) { + var files = self.getFieldEditFiles(field); + if (!!files.length) { + return [{ + fieldid: field.id, + subfield: 'file', + files: files + }]; + } + return false; + }; + + /** + * Get field edit files in the input data. + * + * @param {Object} field Defines the field.. + * @return {Promise} With name and value of the data to be sent. + */ + self.getFieldEditFiles = function(field) { + return $mmFileSession.getFiles(mmaModDataComponent, field.dataid + '_' + field.id); + }; + + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var files = $mmFileSession.getFiles(mmaModDataComponent, field.dataid + '_' + field.id) || [], + originalFiles = (originalData && originalData.files) || []; + + return $mmFileUploaderHelper.areFileListDifferent(files, originalFiles); + }; + return self; }) diff --git a/www/addons/mod/data/fields/file/template.html b/www/addons/mod/data/fields/file/template.html index d3ea0fa63d2..053317062c8 100644 --- a/www/addons/mod/data/fields/file/template.html +++ b/www/addons/mod/data/fields/file/template.html @@ -1,3 +1,3 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/www/addons/mod/data/fields/latlong/handler.js b/www/addons/mod/data/fields/latlong/handler.js index f99ddb3e7a6..1d2e25a8477 100644 --- a/www/addons/mod/data/fields/latlong/handler.js +++ b/www/addons/mod/data/fields/latlong/handler.js @@ -72,6 +72,24 @@ angular.module('mm.addons.mod_data') return values; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + lat = inputData[fieldName + '_0'] || "", + long = inputData[fieldName + '_1'] || "", + originalLat = (originalData && originalData.content) || "", + originalLong = (originalData && originalData.content1) || ""; + + return lat != originalLat || long != originalLong; + }; + return self; }) diff --git a/www/addons/mod/data/fields/menu/directive.js b/www/addons/mod/data/fields/menu/directive.js index 7eb41e54c48..a5fbb2032c9 100644 --- a/www/addons/mod/data/fields/menu/directive.js +++ b/www/addons/mod/data/fields/menu/directive.js @@ -30,7 +30,7 @@ angular.module('mm.addons.mod_data') scope.options = scope.field.param1.split("\n"); if (scope.mode == 'edit' && scope.value) { - scope.value = scope.value.content; + scope.val = scope.value.content; } } }; diff --git a/www/addons/mod/data/fields/menu/handler.js b/www/addons/mod/data/fields/menu/handler.js index 6ff0dcc2139..7287cb90f3d 100644 --- a/www/addons/mod/data/fields/menu/handler.js +++ b/www/addons/mod/data/fields/menu/handler.js @@ -62,6 +62,21 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; return self; }) diff --git a/www/addons/mod/data/fields/menu/template.html b/www/addons/mod/data/fields/menu/template.html index 6d99d81b8f1..ffeb42e0abf 100644 --- a/www/addons/mod/data/fields/menu/template.html +++ b/www/addons/mod/data/fields/menu/template.html @@ -1,6 +1,6 @@

-

{{ 'mma.mod_data.numrecords' | translate: {$a: numEntries } }}

{{ 'mma.mod_data.resetsettings' | translate}}
diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index 600a52eb370..9abc3227855 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -1683,3 +1683,7 @@ h2.invert { ::-webkit-calendar-picker-indicator, ::-webkit-inner-spin-button, ::-webkit-clear-button { display: none; } + +*[ng-click] { + cursor: pointer; +} From cfa3fc8960af085cd30c5f907f5d2f8e479c6554 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 25 Jul 2017 13:54:57 +0200 Subject: [PATCH 085/118] MOBILE-2178 database: Use row/col styles in database tables --- www/addons/mod/data/scss/styles.scss | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss index f563d867542..a9a3b423711 100644 --- a/www/addons/mod/data/scss/styles.scss +++ b/www/addons/mod/data/scss/styles.scss @@ -16,10 +16,17 @@ border-style: solid; border-color: $item-default-border; + table, tbody { + display: block; + } + + tr { + @extend .row; + padding: 0; + } + td { - padding-left: 2px; - padding-right: 2px; - vertical-align: top; + @extend .col; } } From ab6db795dfe8d70b04905cecb2cd4ac38a8ddf75 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 26 Jul 2017 10:29:43 +0200 Subject: [PATCH 086/118] MOBILE-2178 database: Don't force cache in getAllEntriesIds --- www/addons/mod/data/services/data.js | 13 ++++------- www/addons/mod/data/services/helper.js | 30 +++++++++++++++----------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index dcb5962cbd7..926b0ab2d1d 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -307,25 +307,20 @@ angular.module('mm.addons.mod_data') */ self.getEntries = function(dataId, groupId, sort, order, page, perPage, forceCache, ignoreCache, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { + // Always use sort and order params to improve cache usage (entries are identified by params). var params = { databaseid: dataId, returncontents: 1, page: page || 0, perpage: perPage || mmaModDataPerPage, - groupid: groupId || 0 + groupid: groupId || 0, + sort: sort || "0", + order: order || "ASC" }, preSets = { cacheKey: getEntriesCacheKey(dataId, groupId) }; - if (typeof sort != "undefined") { - params.sort = sort; - } - - if (typeof order !== "undefined") { - params.order = order; - } - if (forceCache) { preSets.omitExpires = true; } else if (ignoreCache) { diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index f00dbdb7281..53666cb89e1 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -584,11 +584,13 @@ angular.module('mm.addons.mod_data') * @param {Number} dataId Data ID. * @param {Number} entryId Entry ID. * @param {Number} groupId Group ID. - * @param {String} siteId Site ID. Current if not defined. - * @return {Promise} Containing page number, if has next and have following page. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. Current if not defined. + * @return {Promise} Containing page number, if has next and have following page. */ - self.getPageInfoByEntry = function(dataId, entryId, groupId, siteId) { - return self.getAllEntriesIds(dataId, groupId, siteId).then(function(entries) { + self.getPageInfoByEntry = function(dataId, entryId, groupId, forceCache, ignoreCache, siteId) { + return self.getAllEntriesIds(dataId, groupId, forceCache, ignoreCache, siteId).then(function(entries) { for (var index in entries) { if (entries[index] == entryId) { index = parseInt(index, 10); @@ -614,11 +616,13 @@ angular.module('mm.addons.mod_data') * @param {Number} dataId Data ID. * @param {Number} page Page number. * @param {Number} groupId Group ID. - * @param {String} siteId Site ID. Current if not defined. - * @return {Promise} Containing page number, if has next and have following page. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. Current if not defined. + * @return {Promise} Containing page number, if has next and have following page. */ - self.getPageInfoByPage = function(dataId, page, groupId, siteId) { - return self.getAllEntriesIds(dataId, groupId, siteId).then(function(entries) { + self.getPageInfoByPage = function(dataId, page, groupId, forceCache, ignoreCache, siteId) { + return self.getAllEntriesIds(dataId, groupId, forceCache, ignoreCache, siteId).then(function(entries) { var index = parseInt(page, 10) - 1, entryId = entries[index]; if (entryId) { @@ -642,11 +646,13 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataHelper#getAllEntriesIds * @param {Number} dataId Data ID. * @param {Number} groupId Group ID. - * @param {String} siteId Site ID. Current if not defined. - * @return {Promise} Containing and array of EntryId. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. Current if not defined. + * @return {Promise} Resolved with an array of entry ID. */ - self.getAllEntriesIds = function(dataId, groupId, siteId) { - return $mmaModData.fetchAllEntries(dataId, groupId, undefined, undefined, undefined, true, undefined, undefined, siteId) + self.getAllEntriesIds = function(dataId, groupId, forceCache, ignoreCache, siteId) { + return $mmaModData.fetchAllEntries(dataId, groupId, undefined, undefined, undefined, forceCache, ignoreCache, siteId) .then(function(entries) { return entries.map(function(entry) { return entry.id; From 0fad8c168f6f4a8188785196aa4087c796cde4d1 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 26 Jul 2017 15:00:29 +0200 Subject: [PATCH 087/118] MOBILE-2178 modules: Show last download time if no timemodified --- www/core/components/course/services/helper.js | 27 ++++++++++++++++--- www/core/lang/en.json | 1 + 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/www/core/components/course/services/helper.js b/www/core/components/course/services/helper.js index 65d30da17fd..2283ff9b969 100644 --- a/www/core/components/course/services/helper.js +++ b/www/core/components/course/services/helper.js @@ -23,7 +23,8 @@ angular.module('mm.core.course') */ .factory('$mmCourseHelper', function($q, $mmCoursePrefetchDelegate, $mmFilepool, $mmUtil, $mmCourse, $mmSite, $state, $mmText, mmCoreNotDownloaded, mmCoreOutdated, mmCoreDownloading, mmCoreCourseAllSectionsId, $mmSitesManager, $mmAddonManager, - $controller, $mmCourseDelegate, $translate, $mmEvents, mmCoreEventPackageStatusChanged, mmCoreNotDownloadable) { + $controller, $mmCourseDelegate, $translate, $mmEvents, mmCoreEventPackageStatusChanged, mmCoreNotDownloadable, + mmCoreDownloaded) { var self = {}, calculateSectionStatus = false; @@ -243,9 +244,10 @@ angular.module('mm.core.course') * @param {Object} module Module to get the info from. * @param {Number} courseid Course ID the section belongs to. * @param {Number} [invalidateCache=false] Invalidates the cache first. + * @param {String} [component] Component of the module. * @return {Promise} Promise resolved with the download size, timemodified and module status. */ - self.getModulePrefetchInfo = function(module, courseId, invalidateCache) { + self.getModulePrefetchInfo = function(module, courseId, invalidateCache, component) { var moduleInfo = { size: false, @@ -255,6 +257,7 @@ angular.module('mm.core.course') status: false, statusIcon: false }, + siteId = $mmSite.getId(), promises = []; if (typeof invalidateCache != "undefined" && invalidateCache) { @@ -298,6 +301,22 @@ angular.module('mm.core.course') } })); + // Get the time it was downloaded (if it was downloaded). + promises.push($mmFilepool.getPackageData(siteId, component, module.id).then(function(data) { + if (data && data.downloadtime && (data.status == mmCoreOutdated || data.status == mmCoreDownloaded)) { + moduleInfo.downloadtime = data.downloadtime; + var now = $mmUtil.timestamp(); + if (now - data.downloadtime < 7 * 86400) { + moduleInfo.downloadtimeReadable = moment(data.downloadtime * 1000).fromNow(); + } else { + moduleInfo.downloadtimeReadable = moment(data.downloadtime * 1000).calendar(); + } + } + }).catch(function() { + // Not downloaded. + moduleInfo.downloadtime = 0; + })); + return $q.all(promises).then(function () { return moduleInfo; }); @@ -711,7 +730,7 @@ angular.module('mm.core.course') * @return {Promise} Promise resolved when done. */ self.fillContextMenu = function(scope, module, courseId, invalidateCache, component) { - return self.getModulePrefetchInfo(module, courseId, invalidateCache).then(function(moduleInfo) { + return self.getModulePrefetchInfo(module, courseId, invalidateCache, component).then(function(moduleInfo) { scope.size = moduleInfo.size > 0 ? moduleInfo.sizeReadable : 0; scope.prefetchStatusIcon = moduleInfo.statusIcon; @@ -719,6 +738,8 @@ angular.module('mm.core.course') // Module is downloadable, calculate timemodified. if (moduleInfo.timemodified > 0) { scope.timemodified = $translate.instant('mm.core.lastmodified') + ': ' + moduleInfo.timemodifiedReadable; + } else if (moduleInfo.downloadtime > 0) { + scope.timemodified = $translate.instant('mm.core.lastdownloaded') + ': ' + moduleInfo.downloadtimeReadable; } else { // Cannot calculate time modified, show a default text. scope.timemodified = $translate.instant('mm.core.download'); diff --git a/www/core/lang/en.json b/www/core/lang/en.json index 2da04fdfdd7..d48edfa86b1 100644 --- a/www/core/lang/en.json +++ b/www/core/lang/en.json @@ -94,6 +94,7 @@ "info": "Info", "ios": "iOS", "labelsep": ": ", + "lastdownloaded": "Last downloaded", "lastmodified": "Last modified", "lastsync": "Last synchronization", "listsep": ",", From ec33b4afe65d1a90178f79ae0a50a3f33506e92d Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 26 Jul 2017 15:46:25 +0200 Subject: [PATCH 088/118] MOBILE-2178 database: Improve date field in edit form --- www/addons/mod/data/fields/date/directive.js | 2 +- www/addons/mod/data/fields/date/template.html | 2 +- www/addons/mod/data/scss/styles.scss | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/www/addons/mod/data/fields/date/directive.js b/www/addons/mod/data/fields/date/directive.js index 1e23db4adb9..859ed4c1064 100644 --- a/www/addons/mod/data/fields/date/directive.js +++ b/www/addons/mod/data/fields/date/directive.js @@ -41,7 +41,7 @@ angular.module('mm.addons.mod_data') }; scope.enable = false; } - scope.val = new Date(scope.value.content * 1000).toISOString().substr(0, 10); + scope.val = new Date(scope.value.content * 1000); } }; }); diff --git a/www/addons/mod/data/fields/date/template.html b/www/addons/mod/data/fields/date/template.html index b01f5edc6bc..e9bac5373f2 100644 --- a/www/addons/mod/data/fields/date/template.html +++ b/www/addons/mod/data/fields/date/template.html @@ -1,5 +1,5 @@ {{ error }} - + {{ 'mma.mod_data.usedate' | translate }} {{ text | mmFormatDate:"dfdaymonthyear" }} \ No newline at end of file diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss index a9a3b423711..bad4851771e 100644 --- a/www/addons/mod/data/scss/styles.scss +++ b/www/addons/mod/data/scss/styles.scss @@ -63,6 +63,12 @@ height: 56px; } + input[type="datetime"], + input[type="datetime-local"], + input[type="date"] { + -webkit-appearance: none; + } + mm-attachments .item-media { width: 100%; margin: -1px; From 9283f825caa86522a2479826381a4f08192af4d3 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 26 Jul 2017 16:21:53 +0200 Subject: [PATCH 089/118] MOBILE-2178 database: Don't save offline if fieldnotifications --- www/addons/mod/data/services/data.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 926b0ab2d1d..58096d51985 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -622,12 +622,7 @@ angular.module('mm.addons.mod_data') params.groupid = groupId; } - return site.write('mod_data_add_entry', params).then(function(result) { - if (result.newentryid) { - return result; - } - return $q.reject(); - }).catch(function(error) { + return site.write('mod_data_add_entry', params).catch(function(error) { return $q.reject({ error: error, wserror: $mmUtil.isWebServiceError(error) @@ -766,12 +761,7 @@ angular.module('mm.addons.mod_data') data: data }; - return site.write('mod_data_update_entry', params).then(function(result) { - if (result.updated) { - return result; - } - return $q.reject(); - }).catch(function(error) { + return site.write('mod_data_update_entry', params).catch(function(error) { return $q.reject({ error: error, wserror: $mmUtil.isWebServiceError(error) From 6c272b46591e0f9c166ec3cb82abe2b1d3e11e77 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 27 Jul 2017 00:05:07 +0200 Subject: [PATCH 090/118] MOBILE-2156 lang: Sync with amos for new languages New languages: Lithuanian and Serbian (Cyrillic and Latin alphabets). --- www/addons/calendar/lang/ar.json | 2 +- www/addons/calendar/lang/da.json | 2 +- www/addons/calendar/lang/el.json | 1 + www/addons/calendar/lang/es.json | 1 + www/addons/calendar/lang/he.json | 4 +- www/addons/calendar/lang/ja.json | 6 +- www/addons/calendar/lang/sr-cr.json | 8 ++ www/addons/calendar/lang/sr-lt.json | 8 ++ www/addons/competency/lang/da.json | 2 +- www/addons/competency/lang/ja.json | 3 +- www/addons/competency/lang/sr-cr.json | 4 + www/addons/competency/lang/sr-lt.json | 4 + www/addons/coursecompletion/lang/ar.json | 18 ++-- www/addons/coursecompletion/lang/da.json | 26 ++--- www/addons/coursecompletion/lang/el.json | 2 +- www/addons/coursecompletion/lang/he.json | 22 ++--- www/addons/coursecompletion/lang/ja.json | 26 ++--- www/addons/coursecompletion/lang/sr-cr.json | 21 ++++ www/addons/coursecompletion/lang/sr-lt.json | 21 ++++ www/addons/coursecompletion/lang/uk.json | 2 +- www/addons/files/lang/ar.json | 2 +- www/addons/files/lang/da.json | 4 +- www/addons/files/lang/he.json | 2 +- www/addons/files/lang/ja.json | 10 +- www/addons/files/lang/sr-cr.json | 10 ++ www/addons/files/lang/sr-lt.json | 10 ++ www/addons/files/lang/uk.json | 2 +- .../messageoutput/airnotifier/lang/ja.json | 3 + .../messageoutput/airnotifier/lang/sr-cr.json | 3 + .../messageoutput/airnotifier/lang/sr-lt.json | 3 + www/addons/messages/lang/ar.json | 4 +- www/addons/messages/lang/da.json | 4 +- www/addons/messages/lang/el.json | 4 + www/addons/messages/lang/es.json | 4 + www/addons/messages/lang/he.json | 6 +- www/addons/messages/lang/ja.json | 26 ++++- www/addons/messages/lang/sr-cr.json | 23 +++++ www/addons/messages/lang/sr-lt.json | 23 +++++ www/addons/messages/lang/uk.json | 2 +- www/addons/mod/assign/lang/el.json | 2 + www/addons/mod/assign/lang/es.json | 1 + www/addons/mod/assign/lang/fr.json | 2 +- www/addons/mod/assign/lang/ja.json | 15 ++- www/addons/mod/assign/lang/sr-cr.json | 15 +++ www/addons/mod/assign/lang/sr-lt.json | 15 +++ www/addons/mod/assign/lang/uk.json | 4 +- www/addons/mod/chat/lang/ja.json | 7 +- www/addons/mod/chat/lang/sr-cr.json | 8 ++ www/addons/mod/chat/lang/sr-lt.json | 8 ++ www/addons/mod/chat/lang/uk.json | 4 +- www/addons/mod/choice/lang/ar.json | 2 +- www/addons/mod/choice/lang/da.json | 4 +- www/addons/mod/choice/lang/ja.json | 7 +- www/addons/mod/choice/lang/sr-cr.json | 7 ++ www/addons/mod/choice/lang/sr-lt.json | 7 ++ www/addons/mod/choice/lang/uk.json | 2 +- www/addons/mod/feedback/lang/el.json | 2 + www/addons/mod/feedback/lang/es.json | 2 + www/addons/mod/feedback/lang/fr.json | 2 + www/addons/mod/feedback/lang/ja.json | 2 + www/addons/mod/feedback/lang/sr-cr.json | 4 + www/addons/mod/feedback/lang/sr-lt.json | 4 + www/addons/mod/folder/lang/da.json | 2 +- www/addons/mod/folder/lang/he.json | 2 +- www/addons/mod/folder/lang/ja.json | 3 +- www/addons/mod/folder/lang/sr-cr.json | 4 + www/addons/mod/folder/lang/sr-lt.json | 4 + www/addons/mod/folder/lang/uk.json | 2 +- www/addons/mod/forum/lang/da.json | 2 +- www/addons/mod/forum/lang/he.json | 2 +- www/addons/mod/forum/lang/ja.json | 8 +- www/addons/mod/forum/lang/sr-cr.json | 11 +++ www/addons/mod/forum/lang/sr-lt.json | 11 +++ www/addons/mod/glossary/lang/da.json | 2 +- www/addons/mod/glossary/lang/el.json | 3 + www/addons/mod/glossary/lang/es.json | 3 + www/addons/mod/glossary/lang/ja.json | 18 +++- www/addons/mod/glossary/lang/sr-cr.json | 17 ++++ www/addons/mod/glossary/lang/sr-lt.json | 17 ++++ www/addons/mod/glossary/lang/uk.json | 4 +- www/addons/mod/imscp/lang/ja.json | 3 +- www/addons/mod/imscp/lang/sr-cr.json | 3 + www/addons/mod/imscp/lang/sr-lt.json | 3 + www/addons/mod/label/lang/he.json | 2 +- www/addons/mod/label/lang/sr-cr.json | 3 + www/addons/mod/label/lang/sr-lt.json | 3 + www/addons/mod/lesson/lang/el.json | 6 ++ www/addons/mod/lesson/lang/es.json | 6 ++ www/addons/mod/lesson/lang/fr.json | 6 ++ www/addons/mod/lesson/lang/ja.json | 6 ++ www/addons/mod/lesson/lang/sr-cr.json | 8 ++ www/addons/mod/lesson/lang/sr-lt.json | 8 ++ www/addons/mod/lesson/lang/uk.json | 2 +- www/addons/mod/lti/lang/ja.json | 5 + www/addons/mod/lti/lang/sr-cr.json | 5 + www/addons/mod/lti/lang/sr-lt.json | 5 + www/addons/mod/lti/lang/uk.json | 2 +- www/addons/mod/page/lang/ja.json | 4 +- www/addons/mod/page/lang/sr-cr.json | 3 + www/addons/mod/page/lang/sr-lt.json | 3 + www/addons/mod/quiz/lang/ja.json | 20 ++++ www/addons/mod/quiz/lang/sr-cr.json | 22 +++++ www/addons/mod/quiz/lang/sr-lt.json | 22 +++++ www/addons/mod/quiz/lang/uk.json | 10 +- www/addons/mod/resource/lang/ja.json | 5 +- www/addons/mod/resource/lang/sr-cr.json | 4 + www/addons/mod/resource/lang/sr-lt.json | 4 + www/addons/mod/scorm/lang/el.json | 1 + www/addons/mod/scorm/lang/ja.json | 18 +++- www/addons/mod/scorm/lang/sr-cr.json | 18 ++++ www/addons/mod/scorm/lang/sr-lt.json | 18 ++++ www/addons/mod/scorm/lang/uk.json | 8 +- www/addons/mod/survey/lang/ar.json | 2 +- www/addons/mod/survey/lang/ja.json | 2 + www/addons/mod/survey/lang/sr-cr.json | 5 + www/addons/mod/survey/lang/sr-lt.json | 5 + www/addons/mod/survey/lang/uk.json | 4 +- www/addons/mod/url/lang/ja.json | 5 +- www/addons/mod/url/lang/sr-cr.json | 4 + www/addons/mod/url/lang/sr-lt.json | 4 + www/addons/mod/wiki/lang/ja.json | 7 ++ www/addons/mod/wiki/lang/sr-cr.json | 10 ++ www/addons/mod/wiki/lang/sr-lt.json | 10 ++ www/addons/mod/wiki/lang/uk.json | 2 +- www/addons/notes/lang/ar.json | 2 +- www/addons/notes/lang/da.json | 2 +- www/addons/notes/lang/he.json | 2 +- www/addons/notes/lang/ja.json | 13 ++- www/addons/notes/lang/sr-cr.json | 13 +++ www/addons/notes/lang/sr-lt.json | 13 +++ www/addons/notes/lang/uk.json | 2 +- www/addons/notifications/lang/ar.json | 2 +- www/addons/notifications/lang/da.json | 2 +- www/addons/notifications/lang/de.json | 2 +- www/addons/notifications/lang/el.json | 1 + www/addons/notifications/lang/es.json | 1 + www/addons/notifications/lang/fr.json | 1 + www/addons/notifications/lang/he.json | 2 +- www/addons/notifications/lang/ja.json | 4 +- www/addons/notifications/lang/ru.json | 1 + www/addons/notifications/lang/sr-cr.json | 7 ++ www/addons/notifications/lang/sr-lt.json | 7 ++ www/addons/participants/lang/ar.json | 2 +- www/addons/participants/lang/ja.json | 2 +- www/addons/participants/lang/sr-cr.json | 4 + www/addons/participants/lang/sr-lt.json | 4 + www/config.json | 2 +- www/core/components/contentlinks/lang/ja.json | 7 ++ .../components/contentlinks/lang/sr-cr.json | 7 ++ .../components/contentlinks/lang/sr-lt.json | 7 ++ www/core/components/contentlinks/lang/uk.json | 2 +- www/core/components/course/lang/ar.json | 4 +- www/core/components/course/lang/da.json | 2 +- www/core/components/course/lang/el.json | 1 + www/core/components/course/lang/es.json | 1 + www/core/components/course/lang/he.json | 2 +- www/core/components/course/lang/ja.json | 2 +- www/core/components/course/lang/sr-cr.json | 20 ++++ www/core/components/course/lang/sr-lt.json | 20 ++++ www/core/components/course/lang/uk.json | 6 +- www/core/components/courses/lang/da.json | 6 +- www/core/components/courses/lang/el.json | 2 + www/core/components/courses/lang/es.json | 2 + www/core/components/courses/lang/ru.json | 1 + www/core/components/courses/lang/sr-cr.json | 19 ++++ www/core/components/courses/lang/sr-lt.json | 19 ++++ www/core/components/courses/lang/uk.json | 4 +- www/core/components/fileuploader/lang/ar.json | 6 +- www/core/components/fileuploader/lang/da.json | 4 +- www/core/components/fileuploader/lang/fr.json | 2 +- www/core/components/fileuploader/lang/he.json | 6 +- www/core/components/fileuploader/lang/ja.json | 6 +- .../components/fileuploader/lang/sr-cr.json | 25 +++++ .../components/fileuploader/lang/sr-lt.json | 25 +++++ www/core/components/login/lang/da.json | 2 +- www/core/components/login/lang/de.json | 2 +- www/core/components/login/lang/el.json | 36 ++++++- www/core/components/login/lang/es.json | 2 + www/core/components/login/lang/he.json | 2 +- www/core/components/login/lang/ja.json | 1 + www/core/components/login/lang/sr-cr.json | 49 ++++++++++ www/core/components/login/lang/sr-lt.json | 49 ++++++++++ www/core/components/login/lang/uk.json | 20 ++-- www/core/components/question/lang/el.json | 7 +- www/core/components/question/lang/sr-cr.json | 8 ++ www/core/components/question/lang/sr-lt.json | 8 ++ www/core/components/question/lang/uk.json | 2 +- www/core/components/settings/lang/de.json | 12 +-- www/core/components/settings/lang/el.json | 47 ++++++++- www/core/components/settings/lang/es.json | 1 + www/core/components/settings/lang/sr-cr.json | 47 +++++++++ www/core/components/settings/lang/sr-lt.json | 47 +++++++++ www/core/components/settings/lang/uk.json | 18 ++-- www/core/components/sharedfiles/lang/de.json | 4 +- www/core/components/sharedfiles/lang/el.json | 9 +- www/core/components/sharedfiles/lang/fr.json | 2 +- .../components/sharedfiles/lang/sr-cr.json | 11 +++ .../components/sharedfiles/lang/sr-lt.json | 11 +++ www/core/components/sidemenu/lang/ar.json | 4 +- www/core/components/sidemenu/lang/el.json | 8 +- www/core/components/sidemenu/lang/sr-cr.json | 9 ++ www/core/components/sidemenu/lang/sr-lt.json | 9 ++ www/core/components/user/lang/ar.json | 4 +- www/core/components/user/lang/da.json | 4 +- www/core/components/user/lang/el.json | 12 ++- www/core/components/user/lang/es.json | 1 + www/core/components/user/lang/he.json | 8 +- www/core/components/user/lang/ja.json | 4 +- www/core/components/user/lang/sr-cr.json | 12 +++ www/core/components/user/lang/sr-lt.json | 12 +++ www/core/lang/ar.json | 2 +- www/core/lang/da.json | 14 +-- www/core/lang/el.json | 8 ++ www/core/lang/es.json | 8 ++ www/core/lang/fr.json | 5 +- www/core/lang/he.json | 16 ++-- www/core/lang/ja.json | 95 ++++++++++++++++--- www/core/lang/sr-cr.json | 95 +++++++++++++++++++ www/core/lang/sr-lt.json | 95 +++++++++++++++++++ www/core/lang/uk.json | 26 ++--- 220 files changed, 1754 insertions(+), 258 deletions(-) create mode 100644 www/addons/calendar/lang/sr-cr.json create mode 100644 www/addons/calendar/lang/sr-lt.json create mode 100644 www/addons/competency/lang/sr-cr.json create mode 100644 www/addons/competency/lang/sr-lt.json create mode 100644 www/addons/coursecompletion/lang/sr-cr.json create mode 100644 www/addons/coursecompletion/lang/sr-lt.json create mode 100644 www/addons/files/lang/sr-cr.json create mode 100644 www/addons/files/lang/sr-lt.json create mode 100644 www/addons/messageoutput/airnotifier/lang/ja.json create mode 100644 www/addons/messageoutput/airnotifier/lang/sr-cr.json create mode 100644 www/addons/messageoutput/airnotifier/lang/sr-lt.json create mode 100644 www/addons/messages/lang/sr-cr.json create mode 100644 www/addons/messages/lang/sr-lt.json create mode 100644 www/addons/mod/assign/lang/sr-cr.json create mode 100644 www/addons/mod/assign/lang/sr-lt.json create mode 100644 www/addons/mod/chat/lang/sr-cr.json create mode 100644 www/addons/mod/chat/lang/sr-lt.json create mode 100644 www/addons/mod/choice/lang/sr-cr.json create mode 100644 www/addons/mod/choice/lang/sr-lt.json create mode 100644 www/addons/mod/feedback/lang/sr-cr.json create mode 100644 www/addons/mod/feedback/lang/sr-lt.json create mode 100644 www/addons/mod/folder/lang/sr-cr.json create mode 100644 www/addons/mod/folder/lang/sr-lt.json create mode 100644 www/addons/mod/forum/lang/sr-cr.json create mode 100644 www/addons/mod/forum/lang/sr-lt.json create mode 100644 www/addons/mod/glossary/lang/sr-cr.json create mode 100644 www/addons/mod/glossary/lang/sr-lt.json create mode 100644 www/addons/mod/imscp/lang/sr-cr.json create mode 100644 www/addons/mod/imscp/lang/sr-lt.json create mode 100644 www/addons/mod/label/lang/sr-cr.json create mode 100644 www/addons/mod/label/lang/sr-lt.json create mode 100644 www/addons/mod/lesson/lang/sr-cr.json create mode 100644 www/addons/mod/lesson/lang/sr-lt.json create mode 100644 www/addons/mod/lti/lang/ja.json create mode 100644 www/addons/mod/lti/lang/sr-cr.json create mode 100644 www/addons/mod/lti/lang/sr-lt.json create mode 100644 www/addons/mod/page/lang/sr-cr.json create mode 100644 www/addons/mod/page/lang/sr-lt.json create mode 100644 www/addons/mod/quiz/lang/sr-cr.json create mode 100644 www/addons/mod/quiz/lang/sr-lt.json create mode 100644 www/addons/mod/resource/lang/sr-cr.json create mode 100644 www/addons/mod/resource/lang/sr-lt.json create mode 100644 www/addons/mod/scorm/lang/sr-cr.json create mode 100644 www/addons/mod/scorm/lang/sr-lt.json create mode 100644 www/addons/mod/survey/lang/sr-cr.json create mode 100644 www/addons/mod/survey/lang/sr-lt.json create mode 100644 www/addons/mod/url/lang/sr-cr.json create mode 100644 www/addons/mod/url/lang/sr-lt.json create mode 100644 www/addons/mod/wiki/lang/sr-cr.json create mode 100644 www/addons/mod/wiki/lang/sr-lt.json create mode 100644 www/addons/notes/lang/sr-cr.json create mode 100644 www/addons/notes/lang/sr-lt.json create mode 100644 www/addons/notifications/lang/sr-cr.json create mode 100644 www/addons/notifications/lang/sr-lt.json create mode 100644 www/addons/participants/lang/sr-cr.json create mode 100644 www/addons/participants/lang/sr-lt.json create mode 100644 www/core/components/contentlinks/lang/ja.json create mode 100644 www/core/components/contentlinks/lang/sr-cr.json create mode 100644 www/core/components/contentlinks/lang/sr-lt.json create mode 100644 www/core/components/course/lang/sr-cr.json create mode 100644 www/core/components/course/lang/sr-lt.json create mode 100644 www/core/components/courses/lang/sr-cr.json create mode 100644 www/core/components/courses/lang/sr-lt.json create mode 100644 www/core/components/fileuploader/lang/sr-cr.json create mode 100644 www/core/components/fileuploader/lang/sr-lt.json create mode 100644 www/core/components/login/lang/sr-cr.json create mode 100644 www/core/components/login/lang/sr-lt.json create mode 100644 www/core/components/question/lang/sr-cr.json create mode 100644 www/core/components/question/lang/sr-lt.json create mode 100644 www/core/components/settings/lang/sr-cr.json create mode 100644 www/core/components/settings/lang/sr-lt.json create mode 100644 www/core/components/sharedfiles/lang/sr-cr.json create mode 100644 www/core/components/sharedfiles/lang/sr-lt.json create mode 100644 www/core/components/sidemenu/lang/sr-cr.json create mode 100644 www/core/components/sidemenu/lang/sr-lt.json create mode 100644 www/core/components/user/lang/sr-cr.json create mode 100644 www/core/components/user/lang/sr-lt.json create mode 100644 www/core/lang/sr-cr.json create mode 100644 www/core/lang/sr-lt.json diff --git a/www/addons/calendar/lang/ar.json b/www/addons/calendar/lang/ar.json index 9bece3c914d..23e2ee91b94 100644 --- a/www/addons/calendar/lang/ar.json +++ b/www/addons/calendar/lang/ar.json @@ -3,5 +3,5 @@ "errorloadevent": "خطأ في تحميل الحدث", "errorloadevents": "خطأ في تحميل الأحداث", "noevents": "لا يوجد أي أحداث", - "notifications": "إشعارات" + "notifications": "الإشعارات" } \ No newline at end of file diff --git a/www/addons/calendar/lang/da.json b/www/addons/calendar/lang/da.json index 70693816a85..6826baea7eb 100644 --- a/www/addons/calendar/lang/da.json +++ b/www/addons/calendar/lang/da.json @@ -3,5 +3,5 @@ "errorloadevent": "Fejl ved indlæsning af begivenhed.", "errorloadevents": "Fejl ved indlæsning af begivenheder.", "noevents": "Der er ingen begivenheder", - "notifications": "Beskeder" + "notifications": "Notifikationer" } \ No newline at end of file diff --git a/www/addons/calendar/lang/el.json b/www/addons/calendar/lang/el.json index 744426a674d..9a2040a3e51 100644 --- a/www/addons/calendar/lang/el.json +++ b/www/addons/calendar/lang/el.json @@ -1,5 +1,6 @@ { "calendarevents": "Ημερολόγιο συμβάντων", + "defaultnotificationtime": "Προεπιλεγμένος χρόνος ειδοποίησης", "errorloadevent": "Σφάλμα στην φόρτωση συμβάντου.", "errorloadevents": "Σφάλμα στην φόρτωση συμβάντων.", "noevents": "Δεν υπάρχουν συμβάντα", diff --git a/www/addons/calendar/lang/es.json b/www/addons/calendar/lang/es.json index 39bf009cfb6..993aec44200 100644 --- a/www/addons/calendar/lang/es.json +++ b/www/addons/calendar/lang/es.json @@ -1,5 +1,6 @@ { "calendarevents": "Eventos de calendario", + "defaultnotificationtime": "Tiempo de notificación por defecto", "errorloadevent": "Error cargando el evento.", "errorloadevents": "Error cargando los eventos.", "noevents": "No hay eventos", diff --git a/www/addons/calendar/lang/he.json b/www/addons/calendar/lang/he.json index 3702664d6e1..368fb1895c4 100644 --- a/www/addons/calendar/lang/he.json +++ b/www/addons/calendar/lang/he.json @@ -2,6 +2,6 @@ "calendarevents": "אירועי לוח שנה", "errorloadevent": "שגיאה בטעינת האירוע.", "errorloadevents": "שגיאה בטעינת האירועים.", - "noevents": "לא קיימות פעילויות עתידיות להן מועד הגשה", - "notifications": "עדכונים והודעות" + "noevents": "אין אירועים", + "notifications": "התראות" } \ No newline at end of file diff --git a/www/addons/calendar/lang/ja.json b/www/addons/calendar/lang/ja.json index 5064bdee92f..b6e5457e412 100644 --- a/www/addons/calendar/lang/ja.json +++ b/www/addons/calendar/lang/ja.json @@ -1,4 +1,8 @@ { - "noevents": "到来する活動期限はありません。", + "calendarevents": "カレンダーイベント", + "defaultnotificationtime": "デフォルト通知時間", + "errorloadevent": "イベントの読み込み時にエラーがありました。", + "errorloadevents": "イベントの読み込み時にエラーがありました。", + "noevents": "イベントはありません", "notifications": "通知" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sr-cr.json b/www/addons/calendar/lang/sr-cr.json new file mode 100644 index 00000000000..dba4ebcd807 --- /dev/null +++ b/www/addons/calendar/lang/sr-cr.json @@ -0,0 +1,8 @@ +{ + "calendarevents": "Догађаји у календару", + "defaultnotificationtime": "Подразумевано време за слање обавештења", + "errorloadevent": "Грешка приликом учитавања догађаја.", + "errorloadevents": "Грешка приликом учитавања догађаја.", + "noevents": "Нема догађаја", + "notifications": "Обавештења" +} \ No newline at end of file diff --git a/www/addons/calendar/lang/sr-lt.json b/www/addons/calendar/lang/sr-lt.json new file mode 100644 index 00000000000..7db382ef521 --- /dev/null +++ b/www/addons/calendar/lang/sr-lt.json @@ -0,0 +1,8 @@ +{ + "calendarevents": "Događaji u kalendaru", + "defaultnotificationtime": "Podrazumevano vreme za slanje obaveštenja", + "errorloadevent": "Greška prilikom učitavanja događaja.", + "errorloadevents": "Greška prilikom učitavanja događaja.", + "noevents": "Nema događaja", + "notifications": "Nema događaja" +} \ No newline at end of file diff --git a/www/addons/competency/lang/da.json b/www/addons/competency/lang/da.json index 57b4efe1f8c..dfda559c46e 100644 --- a/www/addons/competency/lang/da.json +++ b/www/addons/competency/lang/da.json @@ -11,7 +11,7 @@ "learningplans": "Læringsplaner", "myplans": "Mine læringsplaner", "noactivities": "Ingen aktiviteter", - "nocompetencies": "Ingen kompetencer er oprettet i denne ramme.", + "nocompetencies": "Ingen kompetencer", "nocrossreferencedcompetencies": "Ingen andre kompetencer er krydsrefereret til denne kompetence.", "noevidence": "Ingen vidnesbyrd", "noplanswerecreated": "Der blev ikke oprettet nogen læringsplaner.", diff --git a/www/addons/competency/lang/ja.json b/www/addons/competency/lang/ja.json index 5b45ea08016..c2210f5308d 100644 --- a/www/addons/competency/lang/ja.json +++ b/www/addons/competency/lang/ja.json @@ -6,12 +6,13 @@ "coursecompetencyratingsarepushedtouserplans": "このコース内でのコンピテンシー評定は学習プラン内ですぐに更新されます。", "crossreferencedcompetencies": "クロスリファレンスコンピテンシー", "duedate": "終了日時", + "errornocompetenciesfound": "コンピテンシーが見つかりません", "evidence": "エビデンス", "learningplancompetencies": "学習プランコンピテンシー", "learningplans": "学習プラン", "myplans": "マイ学習プラン", "noactivities": "活動なし", - "nocompetencies": "このフレームワークにコンピテンシーは作成されていません。", + "nocompetencies": "コンピテンシーなし", "nocrossreferencedcompetencies": "このコンピテンシーに相互参照されている他のコンピテンシーはありません。", "noevidence": "エビデンスなし", "noplanswerecreated": "学習プランは作成されませんでした。", diff --git a/www/addons/competency/lang/sr-cr.json b/www/addons/competency/lang/sr-cr.json new file mode 100644 index 00000000000..7a73abc828d --- /dev/null +++ b/www/addons/competency/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "errornocompetenciesfound": "Није пронађена ниједна компетенција", + "nocompetencies": "Нема компетенција" +} \ No newline at end of file diff --git a/www/addons/competency/lang/sr-lt.json b/www/addons/competency/lang/sr-lt.json new file mode 100644 index 00000000000..31af28b95ea --- /dev/null +++ b/www/addons/competency/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "errornocompetenciesfound": "Nije pronađena nijedna kompetencija", + "nocompetencies": "Nema kompetencija" +} \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ar.json b/www/addons/coursecompletion/lang/ar.json index 7faf3c038ac..f88bc955bca 100644 --- a/www/addons/coursecompletion/lang/ar.json +++ b/www/addons/coursecompletion/lang/ar.json @@ -1,19 +1,19 @@ { - "complete": "كامل", + "complete": "مكتمل", "completecourse": "مقرر مكتمل", - "completed": "تم", + "completed": "تم إكمال المقرر", "completiondate": "تاريخ إكمال المقرر", "couldnotloadreport": "لا يمكن تحميل تقرير إكمال المقرر، الرجاء المحاولة في وقت آخر", - "coursecompletion": "إكمال المقرر الدراسي", - "criteria": "معايير", - "criteriagroup": "مجموعة المعايير", + "coursecompletion": "إكمال المقرر", + "criteria": "المعايير", + "criteriagroup": "معايير المجموعة", "criteriarequiredall": "كل المعايير في الأسفل مطلوبة", - "criteriarequiredany": "أي معيار في الأسفل مطلوب", + "criteriarequiredany": "أي معايير في الأسفل مطلوبة", "inprogress": "قيد التنفيذ", - "manualselfcompletion": "إكمال يدوي ذاتي", + "manualselfcompletion": "إكمال ذاتي يدوي", "notyetstarted": "لم يبدأ بعد", - "pending": "معلق", - "required": "مفروض", + "pending": "قيد الانتظار", + "required": "مطلوب", "requiredcriteria": "المعايير المطلوبة", "requirement": "المتطلبات", "status": "الحالة", diff --git a/www/addons/coursecompletion/lang/da.json b/www/addons/coursecompletion/lang/da.json index 21281be057e..9d2cdeb93a0 100644 --- a/www/addons/coursecompletion/lang/da.json +++ b/www/addons/coursecompletion/lang/da.json @@ -1,20 +1,20 @@ { - "complete": "Færdiggør", + "complete": "Fuldfør", "completecourse": "Fuldfør kursus", - "completed": "Gennemført", + "completed": "Fuldført", "completiondate": "Afslutningsdato", "couldnotloadreport": "Kunne ikke indlæse rapporten vedrørende kursusfuldførelse, prøv igen senere.", - "coursecompletion": "Kursusgennemførelse", - "criteria": "Kriterie", - "criteriagroup": "Kriteriegruppe", - "criteriarequiredall": "Alle kriterier herunder er påkrævet", - "criteriarequiredany": "Ethvert kriterium herunder er påkrævet", - "inprogress": "Igangværende", - "manualselfcompletion": "Manuel selvregistrering af gennemførelse", - "notyetstarted": "Ikke begyndt endnu", - "pending": "Behandles", - "required": "Påkrævet", - "requiredcriteria": "Påkrævede kriterier", + "coursecompletion": "Kursusfuldførelse", + "criteria": "Kriterier", + "criteriagroup": "Gruppe af kriterier", + "criteriarequiredall": "Alle nedenstående kriterier er påkrævet", + "criteriarequiredany": "Hvilken som helst af nedenstående kriterier er påkrævet", + "inprogress": "I gang", + "manualselfcompletion": "Manuel markering af færdiggørelse", + "notyetstarted": "Endnu ikke startet", + "pending": "Afventer", + "required": "Krævet", + "requiredcriteria": "Krævet kriterie", "requirement": "Krav", "status": "Status", "viewcoursereport": "Se kursusrapport" diff --git a/www/addons/coursecompletion/lang/el.json b/www/addons/coursecompletion/lang/el.json index 555b60517bd..a6fb10fd47b 100644 --- a/www/addons/coursecompletion/lang/el.json +++ b/www/addons/coursecompletion/lang/el.json @@ -10,7 +10,7 @@ "criteriarequiredall": "Όλα τα παρακάτω κριτήρια είναι υποχρεωτικά", "criteriarequiredany": "Οποιοδήποτε από τα παρακάτω κριτήρια είναι υποχρεωτικά", "inprogress": "Σε εξέλιξη", - "manualselfcompletion": "Χειροκίνητη αυτό-ολοκλήρωση", + "manualselfcompletion": "Μη αυτόματη ολοκλήρωση", "notyetstarted": "Δεν έχει ξεκινήσει ακόμα", "pending": "Εκκρεμής", "required": "Απαιτείται", diff --git a/www/addons/coursecompletion/lang/he.json b/www/addons/coursecompletion/lang/he.json index 3036661befc..dca12273f76 100644 --- a/www/addons/coursecompletion/lang/he.json +++ b/www/addons/coursecompletion/lang/he.json @@ -1,19 +1,19 @@ { - "complete": "הושלם", + "complete": "השלמה", "completecourse": "השלמת קורס", "completed": "הושלם", "completiondate": "תאריך השלמה", - "coursecompletion": "השלמת הקורס", - "criteria": "תנאי", - "criteriagroup": "קבוצת תנאים", - "criteriarequiredall": "כל התנאים המצויינים מטה נדרשים", - "criteriarequiredany": "לפחות אחד מהתנאים המצויינים מטה נדרשים", + "coursecompletion": "השלמת קורס", + "criteria": "מדד־הערכה", + "criteriagroup": "קבוצת מדדיי־הערכה", + "criteriarequiredall": "כל מדדיי־הערכה להלן נדרשים", + "criteriarequiredany": "אחד ממדדיי־הערכה להלן נדרש", "inprogress": "בתהליך", - "manualselfcompletion": "השלמה עצמאית ידנית", - "notyetstarted": "עדיין לא התחיל", - "pending": "בתהליך למידה", - "required": "דרוש", - "requiredcriteria": "תנאי נדרש", + "manualselfcompletion": "הזנת השלמה עצמית", + "notyetstarted": "עדיין לא החל", + "pending": "בהמתנה", + "required": "נדרש", + "requiredcriteria": "מדד־הערכה נדרש", "requirement": "דרישה", "status": "מצב", "viewcoursereport": "צפיה בדוח הקורס" diff --git a/www/addons/coursecompletion/lang/ja.json b/www/addons/coursecompletion/lang/ja.json index f53547d1c99..344ea673aea 100644 --- a/www/addons/coursecompletion/lang/ja.json +++ b/www/addons/coursecompletion/lang/ja.json @@ -1,17 +1,21 @@ { - "complete": "詳細", - "completed": "完了", + "complete": "完了", + "completecourse": "コース完了", + "completed": "完了しました", + "completiondate": "完了した日", + "couldnotloadreport": "コース完了の読み込みができませんでした。後でもう一度試してください。", "coursecompletion": "コース完了", "criteria": "クライテリア", "criteriagroup": "クライテリアグループ", - "criteriarequiredall": "下記のクライテリアすべてが必須である", - "criteriarequiredany": "下記いくつかのクライテリアが必須である", + "criteriarequiredall": "以下すべてのクライテリアが必要", + "criteriarequiredany": "以下のクライテリアいずれかが必要", "inprogress": "進行中", - "manualselfcompletion": "手動による自己完了", - "notyetstarted": "未開始", - "pending": "保留", - "required": "必須", - "requiredcriteria": "必須クライテリア", - "status": "ステータス", - "viewcoursereport": "コースレポートを表示する" + "manualselfcompletion": "手動自己完了", + "notyetstarted": "まだ開始されていない", + "pending": "保留中", + "required": "必要な", + "requiredcriteria": "必要なクライテリア", + "requirement": "要求", + "status": "状態", + "viewcoursereport": "コースレポートを見る" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sr-cr.json b/www/addons/coursecompletion/lang/sr-cr.json new file mode 100644 index 00000000000..610e78602a3 --- /dev/null +++ b/www/addons/coursecompletion/lang/sr-cr.json @@ -0,0 +1,21 @@ +{ + "complete": "Заврши", + "completecourse": "Заврши курс", + "completed": "Завршено", + "completiondate": "Датум завршетка", + "couldnotloadreport": "Није могуће учитати извештај о завршетку курса. Молимо вас, покушајте поново касније.", + "coursecompletion": "Завршетак курса", + "criteria": "Критеријуми", + "criteriagroup": "Група критеријума", + "criteriarequiredall": "Сви доле наведени критеријуми су неопходни", + "criteriarequiredany": "Било који од доле наведених критеријума је неопходан", + "inprogress": "У току", + "manualselfcompletion": "Ручни самостални завршетак", + "notyetstarted": "Још није започето", + "pending": "На чекању", + "required": "Неопходно", + "requiredcriteria": "Неопходни критеријуми", + "requirement": "Услов", + "status": "Статус", + "viewcoursereport": "Прикажи извештај са курса" +} \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sr-lt.json b/www/addons/coursecompletion/lang/sr-lt.json new file mode 100644 index 00000000000..6553f9f3960 --- /dev/null +++ b/www/addons/coursecompletion/lang/sr-lt.json @@ -0,0 +1,21 @@ +{ + "complete": "Završi", + "completecourse": "Završi kurs", + "completed": "Završeno", + "completiondate": "Datum završetka", + "couldnotloadreport": "Nije moguće učitati izveštaj o završetku kursa. Molimo vas, pokušajte ponovo kasnije.", + "coursecompletion": "Završetak kursa", + "criteria": "Kriterijumi", + "criteriagroup": "Grupa kriterijuma", + "criteriarequiredall": "Svi dole navedeni kriterijumi su neophodni", + "criteriarequiredany": "Bilo koji od dole navedenih kriterijuma je neophodan", + "inprogress": "U toku", + "manualselfcompletion": "Ručni samostalni završetak", + "notyetstarted": "Još nije započeto", + "pending": "Na čekanju", + "required": "Neophodno", + "requiredcriteria": "Neophodni kriterijumi", + "requirement": "Uslov", + "status": "Status", + "viewcoursereport": "Prikaži izveštaj sa kursa" +} \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/uk.json b/www/addons/coursecompletion/lang/uk.json index 86fa3eecf17..790fda5169e 100644 --- a/www/addons/coursecompletion/lang/uk.json +++ b/www/addons/coursecompletion/lang/uk.json @@ -10,7 +10,7 @@ "criteriarequiredall": "Всі критерії нижче обов'язкові", "criteriarequiredany": "Будь-яка критерія нижче обов'язкова", "inprogress": "В процесі...", - "manualselfcompletion": "Завершення самостійно", + "manualselfcompletion": "Самостійне завершення", "notyetstarted": "Не розпочато", "pending": "В очікуванні", "required": "Необхідно", diff --git a/www/addons/files/lang/ar.json b/www/addons/files/lang/ar.json index 2ab44cda49c..3521b2b6f32 100644 --- a/www/addons/files/lang/ar.json +++ b/www/addons/files/lang/ar.json @@ -4,5 +4,5 @@ "files": "ملفات", "privatefiles": "ملفات خاصة", "sitefiles": "ملفات الموقع", - "uploadfiles": "إرسل ملفات التغذية الراجعة" + "uploadfiles": "رفع ملفات" } \ No newline at end of file diff --git a/www/addons/files/lang/da.json b/www/addons/files/lang/da.json index 5f9d7d54b3b..1453d08f9f7 100644 --- a/www/addons/files/lang/da.json +++ b/www/addons/files/lang/da.json @@ -2,12 +2,12 @@ "admindisableddownload": "Bemærk venligst at din Moodleadministrator har deaktiveret download af filer. Du kan se filerne men ikke downloade dem.", "clicktoupload": "Klik på knappen nedenfor for at uploade filer til dine private filer.", "couldnotloadfiles": "Fillisten kunne ikke hentes", - "emptyfilelist": "Der er ingen filer at vise", + "emptyfilelist": "Der er ingen filer at vise.", "erroruploadnotworking": "Desværre er det p.t. ikke muligt at uploade filer til dit site.", "files": "Filer", "myprivatefilesdesc": "Filerne som er tilgængelige i dit private område på dette Moodlewebsted.", "privatefiles": "Private filer", "sitefiles": "Site filer", "sitefilesdesc": "De andre filer som er tilgængelige for dig på denne Moodlewebside.", - "uploadfiles": "Send feedbackfiler" + "uploadfiles": "Upload filer" } \ No newline at end of file diff --git a/www/addons/files/lang/he.json b/www/addons/files/lang/he.json index 6f612548ac8..0ed31567503 100644 --- a/www/addons/files/lang/he.json +++ b/www/addons/files/lang/he.json @@ -2,7 +2,7 @@ "admindisableddownload": "יש לשים לב כי מנהל/ת אתר המוודל שלך, ביטל/ה את אפשרות להורדת הקבצים. באפשרותך לעיין בקבצים אך לא להורידם.", "clicktoupload": "להעלאת הקבצים לקבצים הפרטיים שלך, יש להקליק על הכפתור למטה.", "couldnotloadfiles": "לא ניתן לטעון את רשימת הקבצים.", - "emptyfilelist": "אין קבצים להציג", + "emptyfilelist": "אין קבצים להצגה.", "files": "קבצים", "myprivatefilesdesc": "הקבצים הזמינים לך באזור הפרטי באתר מוודל זה.", "privatefiles": "הקבצים שלי", diff --git a/www/addons/files/lang/ja.json b/www/addons/files/lang/ja.json index 0f3df892d31..de63504d659 100644 --- a/www/addons/files/lang/ja.json +++ b/www/addons/files/lang/ja.json @@ -1,7 +1,13 @@ { - "emptyfilelist": "表示するファイルはありません。", + "admindisableddownload": "あなたのMoodle管理者に、ファイルのダウンロードを無効にするよう知らせてください。そうすれば、ファイルをデバイスにダウンロードせず閲覧のみにすることができます。", + "clicktoupload": "ファイルをあなたのプライベートファイル領域にアップロードするには、下のボタンをクリックしてください。", + "couldnotloadfiles": "以下のファイルが読み込みできませんでした。", + "emptyfilelist": "表示するファイルがありません。", + "erroruploadnotworking": "残念ながら、現在、あなたのサイトにファイルをアップロードすることはできません。", "files": "ファイル", + "myprivatefilesdesc": "ファイルはMoodleサイト上のあなたのプライベート領域にあります。", "privatefiles": "プライベートファイル", "sitefiles": "サイトファイル", - "uploadfiles": "フィードバックファイルを送信する" + "sitefilesdesc": "本Moodleサイトであなたが利用できる他のファイル", + "uploadfiles": "アップロードファイル" } \ No newline at end of file diff --git a/www/addons/files/lang/sr-cr.json b/www/addons/files/lang/sr-cr.json new file mode 100644 index 00000000000..2faaa2353ae --- /dev/null +++ b/www/addons/files/lang/sr-cr.json @@ -0,0 +1,10 @@ +{ + "admindisableddownload": "Имајте у виду да је ваш Moodle администратор онемогућио преузимање датотека. Датотеке можете да прегледате, али не и да их преузмете.", + "clicktoupload": "Кликните на доње дугме како бисте отпремили датотеке међу своје приватне датотеке.", + "couldnotloadfiles": "Списак датотека не може бити учитан.", + "emptyfilelist": "Нема датотека за приказ.", + "erroruploadnotworking": "Нажалост, тренутно није могуће отпремити датотеке на ваш сајт.", + "myprivatefilesdesc": "Датотеке које су доступне у вашем приватном простору на овом Moodle сајту.", + "sitefilesdesc": "Остале датотеке које су доступне на овом Moodle сајту.", + "uploadfiles": "Отпреми датотеке" +} \ No newline at end of file diff --git a/www/addons/files/lang/sr-lt.json b/www/addons/files/lang/sr-lt.json new file mode 100644 index 00000000000..d847189a2dd --- /dev/null +++ b/www/addons/files/lang/sr-lt.json @@ -0,0 +1,10 @@ +{ + "admindisableddownload": "Imajte u vidu da je vaš Moodle administrator onemogućio preuzimanje datoteka. Datoteke možete da pregledate, ali ne i da ih preuzmete.", + "clicktoupload": "Kliknite na donje dugme kako biste otpremili datoteke među svoje privatne datoteke.", + "couldnotloadfiles": "Spisak datoteka ne može biti učitan.", + "emptyfilelist": "Nema datoteka za prikaz.", + "erroruploadnotworking": "Nažalost, trenutno nije moguće otpremiti datoteke na vaš sajt.", + "myprivatefilesdesc": "Datoteke koje su dostupne u vašem privatnom prostoru na ovom Moodle sajtu.", + "sitefilesdesc": "Ostale datoteke koje su dostupne na ovom Moodle sajtu.", + "uploadfiles": "Otpremi datoteke" +} \ No newline at end of file diff --git a/www/addons/files/lang/uk.json b/www/addons/files/lang/uk.json index cb8988a3eaf..083a9f56194 100644 --- a/www/addons/files/lang/uk.json +++ b/www/addons/files/lang/uk.json @@ -1,5 +1,5 @@ { - "admindisableddownload": "Зверніть увагу, що ваш адміністратор Moodle відключив завантаження файлів, ви можете переглядати файли, але не завантажувати їх.", + "admindisableddownload": "Зверніть увагу, що ваш адміністратор Moodle відключив завантаження файлів. Ви можете переглядати файли, але не завантажувати їх.", "clicktoupload": "Натисніть на кнопку нижче, щоб завантажити ваші особисті файли.", "couldnotloadfiles": "Список файлів не може бути завантажений.", "emptyfilelist": "Немає файлів для показу.", diff --git a/www/addons/messageoutput/airnotifier/lang/ja.json b/www/addons/messageoutput/airnotifier/lang/ja.json new file mode 100644 index 00000000000..3746717dab7 --- /dev/null +++ b/www/addons/messageoutput/airnotifier/lang/ja.json @@ -0,0 +1,3 @@ +{ + "processorsettingsdesc": "デバイスの設定" +} \ No newline at end of file diff --git a/www/addons/messageoutput/airnotifier/lang/sr-cr.json b/www/addons/messageoutput/airnotifier/lang/sr-cr.json new file mode 100644 index 00000000000..fda693e8ae3 --- /dev/null +++ b/www/addons/messageoutput/airnotifier/lang/sr-cr.json @@ -0,0 +1,3 @@ +{ + "processorsettingsdesc": "Конфигуриши уређаје" +} \ No newline at end of file diff --git a/www/addons/messageoutput/airnotifier/lang/sr-lt.json b/www/addons/messageoutput/airnotifier/lang/sr-lt.json new file mode 100644 index 00000000000..4419d93d89a --- /dev/null +++ b/www/addons/messageoutput/airnotifier/lang/sr-lt.json @@ -0,0 +1,3 @@ +{ + "processorsettingsdesc": "Komfiguriši uređaj" +} \ No newline at end of file diff --git a/www/addons/messages/lang/ar.json b/www/addons/messages/lang/ar.json index a047f3dfa6a..afa651966c1 100644 --- a/www/addons/messages/lang/ar.json +++ b/www/addons/messages/lang/ar.json @@ -10,8 +10,8 @@ "messages": "رسائل", "mustbeonlinetosendmessages": "لابد أن تكون متصل بالأنترنت لكي ترسل أي رسائل", "newmessage": "رسالة جديدة", - "nomessages": "لا توجد رسائل بعد", - "nousersfound": "لا يوجد مستخدمون", + "nomessages": "لا يوجد رسائل", + "nousersfound": "لا يوجد مستخدمين", "removecontact": "ازل عنوان الاتصال", "send": "إرسل", "sendmessage": "إرسل رسالة", diff --git a/www/addons/messages/lang/da.json b/www/addons/messages/lang/da.json index 160591f104a..0e63f8c9314 100644 --- a/www/addons/messages/lang/da.json +++ b/www/addons/messages/lang/da.json @@ -16,8 +16,8 @@ "messagepreferences": "Indstillinger for beskeder", "messages": "Beskeder", "mustbeonlinetosendmessages": "Du skal være online for at sende beskeder", - "newmessage": "Ny besked", - "nomessages": "Ingen beskeder endnu", + "newmessage": "Ny besked...", + "nomessages": "Ingen besked.", "nousersfound": "Ingen brugere fundet", "removecontact": "Fjern kontakt", "send": "send", diff --git a/www/addons/messages/lang/el.json b/www/addons/messages/lang/el.json index 3476b0c695a..972f33b7539 100644 --- a/www/addons/messages/lang/el.json +++ b/www/addons/messages/lang/el.json @@ -1,6 +1,7 @@ { "addcontact": "Προσθήκη επαφής", "blockcontact": "Φραγμός επαφής", + "blockcontactconfirm": "Θα σταματήσετε να λαμβάνετε μηνύματα από αυτήν την επαφή.", "blocknoncontacts": "Φραγή όλων των νέων μηνυμάτων που προέρχονται από χρήστες που δεν βρίσκονται στη λίστα επαφών σας.", "contactlistempty": "Η λίστα επαφών είναι κενή", "contactname": "Όνομα επαφής", @@ -9,15 +10,18 @@ "errorwhileretrievingcontacts": "Σφάλμα κατά την ανάκτηση των επαφών από το διακομιστή.", "errorwhileretrievingdiscussions": "Σφάλμα κατά την ανάκτηση των συζητήσεων από το διακομιστή.", "errorwhileretrievingmessages": "Σφάλμα κατά την ανάκτηση των μηνυμάτων από το διακομιστή.", + "loadpreviousmessages": "Φορτώστε τα προηγούμενα μηνύματα", "message": "Σώμα μηνύματος", "messagenotsent": "Το μήνυμα δεν στάλθηκε, δοκιμάστε ξανά αργότερα.", "messagepreferences": "Προτιμήσεις μηνύματος", "messages": "Μηνύματα", "mustbeonlinetosendmessages": "Πρέπει να είστε συνδεδεμένοι για να στείλετε μηνύματα", "newmessage": "Νέο μήνυμα...", + "newmessages": "Νέα μηνύματα", "nomessages": "Κανένα μήνυμα.", "nousersfound": "Δεν βρέθηκαν χρήστες", "removecontact": "Αφαίρεσε την επαφή", + "removecontactconfirm": "Η επαφή θα καταργηθεί από τη λίστα επαφών σας.", "send": "Αποστολή", "sendmessage": "Αποστολή μηνύματος", "type_blocked": "Μπλοκαρισμένοι", diff --git a/www/addons/messages/lang/es.json b/www/addons/messages/lang/es.json index 9f18c4105e8..c2662e87fb9 100644 --- a/www/addons/messages/lang/es.json +++ b/www/addons/messages/lang/es.json @@ -1,6 +1,7 @@ { "addcontact": "Añadir contacto", "blockcontact": "Bloquear contacto", + "blockcontactconfirm": "Usted dejará de recibir mensajes de este contacto.", "blocknoncontacts": "Bloquear mensajes de usuarios que no figuren en mi lista de contactos", "contactlistempty": "Lista de contactos vacía", "contactname": "Nombre del contacto", @@ -11,15 +12,18 @@ "errorwhileretrievingcontacts": "Error al recuperar los contactos del servidor.", "errorwhileretrievingdiscussions": "Error al recuperar las discusiones del servidor.", "errorwhileretrievingmessages": "Error al recuperar los mensajes del servidor.", + "loadpreviousmessages": "Cargar mensajes anteriores", "message": "Cuerpo del mensaje", "messagenotsent": "El mensaje no fue enviado; por favor inténtelo nuevamente después.", "messagepreferences": "Preferencias de mensajes", "messages": "Mensajes", "mustbeonlinetosendmessages": "Debe conectarse para enviar mensajes", "newmessage": "Nuevo mensaje...", + "newmessages": "Nuevos mensajes", "nomessages": "No hay mensajes en espera", "nousersfound": "No se encuentran usuarios", "removecontact": "Eliminar contacto", + "removecontactconfirm": "El contacto se eliminará de su lista de contactos.", "send": "enviar", "sendmessage": "Enviar mensaje", "type_blocked": "Bloqueado", diff --git a/www/addons/messages/lang/he.json b/www/addons/messages/lang/he.json index fb473cf8205..99fc18ee0ff 100644 --- a/www/addons/messages/lang/he.json +++ b/www/addons/messages/lang/he.json @@ -15,9 +15,9 @@ "messagepreferences": "העדפות מסרים", "messages": "הודעות", "mustbeonlinetosendmessages": "עליך להיות מחובר/ת בכדי לשלוח מסר.", - "newmessage": "הודעה חדשה", - "nomessages": "אין הודעות עדיין", - "nousersfound": "לתשומת-לב", + "newmessage": "מסר חדש...", + "nomessages": "אין מסרים.", + "nousersfound": "לא נמצאו משתמשים", "removecontact": "הסרת איש הקשר", "send": "שליחה", "sendmessage": "שליחת הודעה", diff --git a/www/addons/messages/lang/ja.json b/www/addons/messages/lang/ja.json index fdd373a6acd..ea482d4418d 100644 --- a/www/addons/messages/lang/ja.json +++ b/www/addons/messages/lang/ja.json @@ -1,20 +1,36 @@ { "addcontact": "コンタクトに追加する", "blockcontact": "受信拒否", + "blockcontactconfirm": "この連絡先からのメッセージ受信を停止します。", "blocknoncontacts": "不明なユーザをブロックする", - "contactlistempty": "コンタクトリストは空です。", - "contactname": "連絡先", + "contactlistempty": "連絡先リストが空", + "contactname": "連絡先名称", "contacts": "コンタクト", "deletemessage": "メッセージを削除する", "deletemessageconfirmation": "本当にこのメッセージを削除してもよろしいですか? あなたのメッセージング履歴からのみ削除され、メッセージを送受信したユーザはまだ閲覧することができます。", + "errordeletemessage": "メッセージ消去中にエラーが発生しました。", + "errorwhileretrievingcontacts": "サーバから連絡先を取得中にエラーが発生しました。", + "errorwhileretrievingdiscussions": "サーバからディスカッションを受信中にエラーが発生しました。", + "errorwhileretrievingmessages": "サーバからメッセージを受信中にエラーが発生しました。", + "loadpreviousmessages": "以前のメッセージを読み込み", "message": "メッセージ本文", + "messagenotsent": "メッセージは送信されませんでした。後で再び試みてください。", "messagepreferences": "メッセージプリファレンス", "messages": "メッセージ", - "newmessage": "新しいメッセージ", + "mustbeonlinetosendmessages": "メッセージを送信するにはオンラインでなければなりません。", + "newmessage": "新規メッセージ...", + "newmessages": "新規メッセージ...", "nomessages": "メッセージがありません。", - "nousersfound": "ユーザは見つかりませんでした。", + "nousersfound": "ユーザが見つかりません", "removecontact": "コンタクトから削除する", + "removecontactconfirm": "連絡先はあなたの連絡先リストから削除されます。", "send": "送信", "sendmessage": "メッセージを送信する", - "unblockcontact": "コンタクトの拒否を解除する" + "type_blocked": "ブロックされています", + "type_offline": "オフライン", + "type_online": "オンライン", + "type_search": "結果の検索", + "type_strangers": "その他", + "unblockcontact": "コンタクトの拒否を解除する", + "warningmessagenotsent": "ユーザ {{user}} へのメッセージ送信ができませんでした。 {{error}}" } \ No newline at end of file diff --git a/www/addons/messages/lang/sr-cr.json b/www/addons/messages/lang/sr-cr.json new file mode 100644 index 00000000000..e03e4624361 --- /dev/null +++ b/www/addons/messages/lang/sr-cr.json @@ -0,0 +1,23 @@ +{ + "blockcontactconfirm": "Нећете више добијати поруке од ове особе.", + "contactlistempty": "Листа контаката је празна", + "contactname": "Име особе", + "errordeletemessage": "Грешка приликом брисања поруке.", + "errorwhileretrievingcontacts": "Грешка приликом преузимања контаката са сервера.", + "errorwhileretrievingdiscussions": "Грешка приликом преузимања дискусија са сервера.", + "errorwhileretrievingmessages": "Грешка приликом преузимања порука са сервера.", + "loadpreviousmessages": "Учитај претходне поруке", + "messagenotsent": "Порука није послата. Молимо, покушајте поново касније.", + "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке", + "newmessage": "Нове поруке...", + "newmessages": "Нове поруке", + "nomessages": "Нема порука.", + "nousersfound": "Није пронађен ниједан корисник", + "removecontactconfirm": "Особа ће бити уклоњена са ваше листе контаката.", + "type_blocked": "Блокиран", + "type_offline": "Офлајн", + "type_online": "Онлајн", + "type_search": "Резултати претраге", + "type_strangers": "Други", + "warningmessagenotsent": "Није могуће послати поруку/е кориснику {{user}}. {{error}}" +} \ No newline at end of file diff --git a/www/addons/messages/lang/sr-lt.json b/www/addons/messages/lang/sr-lt.json new file mode 100644 index 00000000000..305b0160956 --- /dev/null +++ b/www/addons/messages/lang/sr-lt.json @@ -0,0 +1,23 @@ +{ + "blockcontactconfirm": "Nećete više dobijati poruke od ove osobe.", + "contactlistempty": "Lista kontakata je prazna", + "contactname": "Ime osobe", + "errordeletemessage": "Greška prilikom brisanja poruke.", + "errorwhileretrievingcontacts": "Greška prilikom preuzimanja kontakata sa servera.", + "errorwhileretrievingdiscussions": "Greška prilikom preuzimanja diskusija sa servera.", + "errorwhileretrievingmessages": "Greška prilikom preuzimanja poruka sa servera.", + "loadpreviousmessages": "Učitaj prethodne poruke", + "messagenotsent": "Poruka nije poslata. Molimo, pokušajte ponovo kasnije.", + "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke", + "newmessage": "Nove poruke...", + "newmessages": "Nove poruke", + "nomessages": "Nema poruka.", + "nousersfound": "Nije pronađen nijedan korisnik", + "removecontactconfirm": "Osoba će biti uklonjena sa vaše liste kontakata.", + "type_blocked": "Blokiran", + "type_offline": "Oflajn", + "type_online": "Onlajn", + "type_search": "Rezultati pretrage", + "type_strangers": "Drugi", + "warningmessagenotsent": "Nije moguće poslati poruku/e korisniku {{user}}. {{error}}" +} \ No newline at end of file diff --git a/www/addons/messages/lang/uk.json b/www/addons/messages/lang/uk.json index 21fa4dc7976..6fab9eec6d8 100644 --- a/www/addons/messages/lang/uk.json +++ b/www/addons/messages/lang/uk.json @@ -29,5 +29,5 @@ "type_search": "Результати пошуку", "type_strangers": "Інші", "unblockcontact": "Розблокувати контакт", - "warningmessagenotsent": "Неможливо відправити повідомлення до {{user}}. {{error}}" + "warningmessagenotsent": "Неможливо відправити повідомлення до {{user}}. {{error}}" } \ No newline at end of file diff --git a/www/addons/mod/assign/lang/el.json b/www/addons/mod/assign/lang/el.json index 321937193aa..0303c8b0932 100644 --- a/www/addons/mod/assign/lang/el.json +++ b/www/addons/mod/assign/lang/el.json @@ -23,10 +23,12 @@ "editsubmission": "Τροποποίηση της υποβολής μου", "erroreditpluginsnotsupported": "Δεν μπορείτε να προσθέσετε ή να επεξεργαστείτε μια υποβολή στην εφαρμογή επειδή ορισμένα plugins δεν υποστηρίζονται για επεξεργασία:", "errorshowinginformation": "Δεν μπορούν να εμφανιστούν οι πληροφορίες υποβολής", + "feedbacknotsupported": "Αυτό το σχόλιο δεν υποστηρίζεται από την εφαρμογή και μπορεί να μην περιέχει όλες τις πληροφορίες", "grade": "Βαθμός", "graded": "Βαθμολογήθηκε", "gradedby": "Βαθμολογήθηκε από", "gradedon": "Βαθμολογήθηκε στις", + "gradenotsynced": "Η βαθμολογία δεν συγχρονίστηκε", "gradingstatus": "Κατάσταση Βαθμολόγησης", "groupsubmissionsettings": "Ρυθμίσεις ομαδικής υποβολής", "latesubmissions": "Εκπρόθεσμες υποβολές", diff --git a/www/addons/mod/assign/lang/es.json b/www/addons/mod/assign/lang/es.json index 35e141f70c9..8b1583be23c 100644 --- a/www/addons/mod/assign/lang/es.json +++ b/www/addons/mod/assign/lang/es.json @@ -36,6 +36,7 @@ "graded": "Calificado", "gradedby": "Calificado por", "gradedon": "Calificado sobre", + "gradenotsynced": "Calificación no sincronizada", "gradeoutof": "Calificación sobre {{$a}}", "gradingstatus": "Estado de la calificación", "groupsubmissionsettings": "Configuración de entrega por grupo", diff --git a/www/addons/mod/assign/lang/fr.json b/www/addons/mod/assign/lang/fr.json index 4dc3f9a1b2b..a381dffff5a 100644 --- a/www/addons/mod/assign/lang/fr.json +++ b/www/addons/mod/assign/lang/fr.json @@ -15,7 +15,7 @@ "attemptreopenmethod_untilpass": "Automatiquement jusqu'à réussite", "attemptsettings": "Réglages de tentative", "cannoteditduetostatementsubmission": "Vous ne pouvez pas ajouter, ni modifier de données dans l'app, car il n'est actuellement pas possible de récupérer les conditions d'envoi.", - "cannotgradefromapp": "Certaines méthodes d'évaluations ne sont pas encore supportées par l'app et ne peuvent pas être modifiées", + "cannotgradefromapp": "Certaines méthodes d'évaluations ne sont pas encore supportées par l'app et ne peuvent pas être modifiées.", "cannotsubmitduetostatementsubmission": "Vous ne pouvez pas déposer de travail à évaluer dans l'app, car il n'est actuellement pas possible de récupérer les conditions d'envoi.", "confirmsubmission": "Voulez-vous vraiment remettre votre travail pour évaluation ? Vous ne pourrez plus effectuer de changement.", "currentattempt": "Ceci est la tentative {{$a}}.", diff --git a/www/addons/mod/assign/lang/ja.json b/www/addons/mod/assign/lang/ja.json index d7f86ec249e..7d36b430584 100644 --- a/www/addons/mod/assign/lang/ja.json +++ b/www/addons/mod/assign/lang/ja.json @@ -1,4 +1,5 @@ { + "acceptsubmissionstatement": "提出時宣誓文を受諾してください。", "addattempt": "別の提出を許可する", "addnewattempt": "新しい提出を追加する", "addnewattemptfromprevious": "前回の提出をもとに新しい提出を追加する", @@ -13,6 +14,9 @@ "attemptreopenmethod_manual": "手動", "attemptreopenmethod_untilpass": "合格するまで自動", "attemptsettings": "受験設定", + "cannoteditduetostatementsubmission": "サイトから提出時宣誓文を取得することができなかったため、アプリでは提出物の追加や編集ができません。", + "cannotgradefromapp": "評定方法にアプリでは未サポートあるいは変更できないものがあります。", + "cannotsubmitduetostatementsubmission": "サイトから提出時宣誓文が取得できなかったため、アプリから評定を提出することができませんでした。", "confirmsubmission": "本当にあなたの作業を評定のために提出してもよろしいですか? これ以上、あなたは変更できないようになります。", "currentattempt": "これは {{$a}} 回目の提出です。", "currentattemptof": "これは {{$a.attemptnumber}} 回目の提出です ( {{$a.maxattempts}} 回の提出が許可されています)。", @@ -24,11 +28,15 @@ "duedatereached": "この課題の提出期限を過ぎました。", "editingstatus": "編集ステータス", "editsubmission": "提出を編集する", + "erroreditpluginsnotsupported": "提出物の編集がサポートされていないプラグインがあるため、アプリから提出物の追加や編集ができませんでした。", + "errorshowinginformation": "提出物の情報を表示できません。", "extensionduedate": "延長提出期限", + "feedbacknotsupported": "このフィードバックはアプリでは未サポートのため、すべての情報が含まれていない可能性があります", "grade": "評点", "graded": "評定済み", "gradedby": "評定者", "gradedon": "評定日時", + "gradenotsynced": "評定が同期できませんでした", "gradeoutof": "{{$a}} 点中の評点", "gradingstatus": "評定ステータス", "groupsubmissionsettings": "グループ提出設定", @@ -47,6 +55,7 @@ "nomoresubmissionsaccepted": "延長を許可された参加者のみ許可されます。", "noonlinesubmissions": "この課題においてあなたがオンラインで提出するものはありません。", "nosubmission": "この課題に関して提出されているものはありません。", + "notallparticipantsareshown": "提出物のない参加者は表示されていません", "noteam": "どのグループのメンバーでもない", "notgraded": "未評定", "numberofdraftsubmissions": "下書き", @@ -61,6 +70,7 @@ "submission": "提出課題", "submissioneditable": "学生はこの提出を編集できます。", "submissionnoteditable": "学生はこの提出を編集できません。", + "submissionnotsupported": "この提出物はアプリでは未サポートのため、すべての情報が含まれていない可能性があります", "submissionslocked": "この課題は提出を受け付けていません。", "submissionstatus": "提出ステータス", "submissionstatus_": "提出なし", @@ -80,5 +90,8 @@ "ungroupedusers": "設定「提出にグループを必要とする」が有効にされているため、そして何名かのユーザがグループのメンバーではないため、または2つ以上のグループメンバーであるため、提出することはできません。", "unlimitedattempts": "無制限", "userswhoneedtosubmit": "提出が必要なユーザ: {{$a}}", - "viewsubmission": "提出を表示する" + "userwithid": "ID {{id}} を持つユーザ", + "viewsubmission": "提出を表示する", + "warningsubmissiongrademodified": "提出物の評定がサイト上で変更されました。", + "warningsubmissionmodified": "ユーザの提出物がサイト上で変更されました。" } \ No newline at end of file diff --git a/www/addons/mod/assign/lang/sr-cr.json b/www/addons/mod/assign/lang/sr-cr.json new file mode 100644 index 00000000000..653fd72673d --- /dev/null +++ b/www/addons/mod/assign/lang/sr-cr.json @@ -0,0 +1,15 @@ +{ + "acceptsubmissionstatement": "Молимо вас да прихватите изјаву о предаји рада.", + "cannoteditduetostatementsubmission": "Не можете да додате или мењате рад у апликацији јер нисмо могли да преузмемо са сајта изјаву о предаји рада.", + "cannotgradefromapp": "Апликације још увек не подржава неке методе оцењивања и оне не могу да се мењају.", + "cannotsubmitduetostatementsubmission": "Не можете да предате рад на оцењивање у апликацији јер нисмо могли да преузмемо са сајта изјаву о предаји рада.", + "erroreditpluginsnotsupported": "Не можете да додате или мењате рад у апликацији јер неки додаци немају подршку за уређивање:", + "errorshowinginformation": "Не можемо да прикажемо информације о предатом раду", + "feedbacknotsupported": "Аплликација не подржава ову повратну информацију. Могуће је да она не садржи све информације.", + "gradenotsynced": "Оцена није синхронизована", + "notallparticipantsareshown": "Учесници који нису предали рад се не приказују", + "submissionnotsupported": "Апликација не подржава овај предати рад. Могуће је да рад не садржи све информације.", + "userwithid": "Корисник са ID ознаком {{id}}", + "warningsubmissiongrademodified": "Оцена предатог рада је измењена на сајту.", + "warningsubmissionmodified": "Предати рад корисника је измењен на сајту." +} \ No newline at end of file diff --git a/www/addons/mod/assign/lang/sr-lt.json b/www/addons/mod/assign/lang/sr-lt.json new file mode 100644 index 00000000000..fc825011df5 --- /dev/null +++ b/www/addons/mod/assign/lang/sr-lt.json @@ -0,0 +1,15 @@ +{ + "acceptsubmissionstatement": "Molimo vas da prihvatite izjavu o predaji rada.", + "cannoteditduetostatementsubmission": "Ne možete da dodate ili menjate rad u aplikaciji jer nismo mogli da preuzmemo sa sajta izjavu o predaji rada.", + "cannotgradefromapp": "Aplikacije ne podržava neke metode ocenjivanja i one ne mogu da se menjaju.", + "cannotsubmitduetostatementsubmission": "Ne možete da predate rad na ocenjivanje u aplikaciji jer nismo mogli da preuzmemo sa sajta izjavu o predaji rada.", + "erroreditpluginsnotsupported": "Ne možete da dodate ili menjate rad u aplikaciji jer neki dodaci nemaju podršku za uređivanje:", + "errorshowinginformation": "Ne možemo da prikažemo informacije o predatom radu", + "feedbacknotsupported": "Apllikacija ne podržava ovu povratnu informaciju. Moguće je da ona ne sadrži sve informacije.", + "gradenotsynced": "Ocena nije sinhronizovana", + "notallparticipantsareshown": "Učesnici koji nisu predali rad se ne prikazuju", + "submissionnotsupported": "Aplikacija ne podržava ovaj predati rad. Moguće je da rad ne sadrži sve informacije.", + "userwithid": "Korisnik sa ID oznakom {{id}}", + "warningsubmissiongrademodified": "Ocena predatog rada je izmenjena na sajtu.", + "warningsubmissionmodified": "Predati rad korisnika je izmenjen na sajtu." +} \ No newline at end of file diff --git a/www/addons/mod/assign/lang/uk.json b/www/addons/mod/assign/lang/uk.json index 2b97cdc9229..96c4002f16f 100644 --- a/www/addons/mod/assign/lang/uk.json +++ b/www/addons/mod/assign/lang/uk.json @@ -16,7 +16,7 @@ "attemptsettings": "Налаштування спроби", "cannoteditduetostatementsubmission": "Ви не можете додати або змінити представлення в додатку, тому що ми не могли отримати заяву з сайту.", "cannotgradefromapp": "Деякі методи класифікації поки не підтримуються додатком і не можуть бути змінені.", - "cannotsubmitduetostatementsubmission": "Ви не можете подати для сортування в додатку, тому що ми не могли отримати заява представлення з сайту.", + "cannotsubmitduetostatementsubmission": "Ви не можете подати запит для сортування в додатку, тому що ми не могли отримати заява представлення з сайту.", "confirmsubmission": "Відправити вашу роботу на перевірку? Після цього ви не зможете робити в ній ніяких змін.", "currentattempt": "Це спроба {{$a}}.", "currentattemptof": "Це спроба {{$a.attemptnumber}} (дозволено спроб - {{$a.maxattempts}}).", @@ -36,7 +36,7 @@ "graded": "Оцінено", "gradedby": "Оцінив", "gradedon": "Оцінено на", - "gradenotsynced": "Оцінка не синхронізуються", + "gradenotsynced": "Оцінки не синхронізовані", "gradeoutof": "Оцінка (макс. {{$a}})", "gradingstatus": "Статус оцінення", "groupsubmissionsettings": "Налаштування групової здачі", diff --git a/www/addons/mod/chat/lang/ja.json b/www/addons/mod/chat/lang/ja.json index 052232c43bf..37dd5b0164d 100644 --- a/www/addons/mod/chat/lang/ja.json +++ b/www/addons/mod/chat/lang/ja.json @@ -3,10 +3,15 @@ "currentusers": "現在のユーザ", "enterchat": "ここをクリックしてチャットルームに入室する", "entermessage": "あなたのメッセージを入力してください。", - "errorwhilesendingmessage": "メッセージの送信中にエラーが発生しました。後で再度お試しください。", + "errorwhileconnecting": "チャットに接続する際にエラーが発生しました。", + "errorwhilegettingchatdata": "チャットのデータを取得中にエラーが発生しました。", + "errorwhilegettingchatusers": "チャットのユーザを取得中にエラーが発生しました。", + "errorwhileretrievingmessages": "サーバからメッセージを取得中にエラーが発生しました。", + "errorwhilesendingmessage": "メッセージ送信中にエラーが発生しました。", "messagebeepsyou": "{{$a}} があなたにビープしました!", "messageenter": "このチャットに {{$a}} が入室しました。", "messageexit": "このチャットから {{$a}} が退室しました。", + "mustbeonlinetosendmessages": "メッセージを送信するにはオンラインでなければなりません。", "nomessages": "メッセージがありません。", "send": "送信", "sessionstart": "次のチャットセッションは {{$a.date}} に開始されます (現在から {{$a.fromnow}} 後)。", diff --git a/www/addons/mod/chat/lang/sr-cr.json b/www/addons/mod/chat/lang/sr-cr.json new file mode 100644 index 00000000000..1e36fd7d84d --- /dev/null +++ b/www/addons/mod/chat/lang/sr-cr.json @@ -0,0 +1,8 @@ +{ + "errorwhileconnecting": "Грешка приликом повезивања са причаоницом.", + "errorwhilegettingchatdata": "Грешка приликом преузимања података за 'Причаоницу'.", + "errorwhilegettingchatusers": "Грешка приликом преузимања корисника причаонице.", + "errorwhileretrievingmessages": "Грешка приликом преузимања порука са сервера.", + "errorwhilesendingmessage": "Грешка приликом слања поруке.", + "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке." +} \ No newline at end of file diff --git a/www/addons/mod/chat/lang/sr-lt.json b/www/addons/mod/chat/lang/sr-lt.json new file mode 100644 index 00000000000..9f2850e8b5e --- /dev/null +++ b/www/addons/mod/chat/lang/sr-lt.json @@ -0,0 +1,8 @@ +{ + "errorwhileconnecting": "Greška prilikom povezivanja sa pričaonicom.", + "errorwhilegettingchatdata": "Greška prilikom preuzimanja podataka za 'Pričaonicu'.", + "errorwhilegettingchatusers": "Greška prilikom preuzimanja korisnika pričaonice.", + "errorwhileretrievingmessages": "Greška prilikom preuzimanja poruka sa servera.", + "errorwhilesendingmessage": "Greška prilikom slanja poruke.", + "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke." +} \ No newline at end of file diff --git a/www/addons/mod/chat/lang/uk.json b/www/addons/mod/chat/lang/uk.json index 66503297072..ab756410d89 100644 --- a/www/addons/mod/chat/lang/uk.json +++ b/www/addons/mod/chat/lang/uk.json @@ -6,8 +6,8 @@ "errorwhileconnecting": "Помилка при підключенні до чату.", "errorwhilegettingchatdata": "Помилка отримання даних чату.", "errorwhilegettingchatusers": "Помилка отримання користувачів чату.", - "errorwhileretrievingmessages": "Помилка отримання повідомлень з серверу", - "errorwhilesendingmessage": "Помилка відправки повідомлення", + "errorwhileretrievingmessages": "Помилка отримання повідомлень з серверу.", + "errorwhilesendingmessage": "Помилка відправки повідомлення.", "messagebeepsyou": "{{$a}} відправив Вам сигнал!", "messageenter": "{{$a}} з'явився в чаті", "messageexit": "{{$a}} пішов із чату", diff --git a/www/addons/mod/choice/lang/ar.json b/www/addons/mod/choice/lang/ar.json index 60ff70d91f6..507d25fbe0c 100644 --- a/www/addons/mod/choice/lang/ar.json +++ b/www/addons/mod/choice/lang/ar.json @@ -4,7 +4,7 @@ "full": "(كامل)", "noresultsviewable": "حالياً لا يمكن معاينة النتائج", "notopenyet": "عذرا، هذا النشاط سيكون متوفر في {{$a}}", - "numberofuser": "عدد المستخدمين", + "numberofuser": "عدد المشاركين", "numberofuserinpercentage": "عدد المستخدمين كنسبة", "removemychoice": "استبعد خياري", "responses": "إجابات", diff --git a/www/addons/mod/choice/lang/da.json b/www/addons/mod/choice/lang/da.json index e462afcd51a..3ef6b107e4d 100644 --- a/www/addons/mod/choice/lang/da.json +++ b/www/addons/mod/choice/lang/da.json @@ -6,8 +6,8 @@ "full": "(Fuld)", "noresultsviewable": "Resultaterne er ikke tilgængelige på nuværende tidspunkt.", "notopenyet": "Denne aktivitet er tilgængelig fra {{$a}}", - "numberofuser": "Antal svar", - "numberofuserinpercentage": "Antal svar i procent", + "numberofuser": "Antal deltagere", + "numberofuserinpercentage": "Procentdel af deltagerne", "previewonly": "Dette er en forhåndsvisning af de tilgængelige valgmuligheder i denne afstemning. Du kan ikke indsende dine valg før {{$a}}.", "removemychoice": "Slet mit valg", "responses": "Besvarelser", diff --git a/www/addons/mod/choice/lang/ja.json b/www/addons/mod/choice/lang/ja.json index 02afe740bcd..5f5b78343c7 100644 --- a/www/addons/mod/choice/lang/ja.json +++ b/www/addons/mod/choice/lang/ja.json @@ -1,16 +1,19 @@ { "cannotsubmit": "申し訳ございません、あなたの投票送信時に問題が発生しました。再度お試しください。", "choiceoptions": "投票オプション", + "errorgetchoice": "選択データの取得中にエラーが発生しました。", "expired": "申し訳ございません、この活動は {{$a}} に終了しているため、これ以上利用することはできません。", "full": "(上限到達)", "noresultsviewable": "現在、投票結果は閲覧できません。", "notopenyet": "申し訳ございません、この活動は {{$a}} まで利用することができません。", - "numberofuser": "投票者数", - "numberofuserinpercentage": "投票者数 (%)", + "numberofuser": "参加者数", + "numberofuserinpercentage": "参加者の割合", "previewonly": "これはこの活動で利用可能なオプションのプレビューです。あなたの投票は {{$a}} まで送信することができません。", "removemychoice": "私の投票を削除する", "responses": "投票結果", + "responsesresultgraphdescription": "{{number}}% のユーザが選択肢: {{text}} を選択しました。", "responsesresultgraphheader": "グラフ表示", + "resultsnotsynced": "結果にあなたの最後のレスポンスが含まれていません。更新のため、同期を行ってください。", "savemychoice": "私の投票を保存する", "userchoosethisoption": "このオプションを選択したユーザ", "yourselection": "あなたの投票" diff --git a/www/addons/mod/choice/lang/sr-cr.json b/www/addons/mod/choice/lang/sr-cr.json new file mode 100644 index 00000000000..298eab2ca83 --- /dev/null +++ b/www/addons/mod/choice/lang/sr-cr.json @@ -0,0 +1,7 @@ +{ + "errorgetchoice": "Грешка приликом преузимања података за 'Избор'", + "numberofuser": "Број учесника", + "numberofuserinpercentage": "Проценат учесника", + "responsesresultgraphdescription": "{{number}}% корисника је изабрало опцију: {{text}}.", + "resultsnotsynced": "Резултати не укључује ваш последњи одговор. Покрените синхронизацију како бисте их ажурирали." +} \ No newline at end of file diff --git a/www/addons/mod/choice/lang/sr-lt.json b/www/addons/mod/choice/lang/sr-lt.json new file mode 100644 index 00000000000..b1d8bf5a49d --- /dev/null +++ b/www/addons/mod/choice/lang/sr-lt.json @@ -0,0 +1,7 @@ +{ + "errorgetchoice": "Greška prilikom preuzimanja podataka za 'Izbor'", + "numberofuser": "Broj učesnika", + "numberofuserinpercentage": "Procenat učesnika", + "responsesresultgraphdescription": "{{number}}% korisnika je izabralo opciju: {{text}}.", + "resultsnotsynced": "Rezultati ne uključuje vaš poslednji odgovor. Pokrenite sinhronizaciju kako biste ih ažurirali." +} \ No newline at end of file diff --git a/www/addons/mod/choice/lang/uk.json b/www/addons/mod/choice/lang/uk.json index 3587cc22f86..7c22b1890c7 100644 --- a/www/addons/mod/choice/lang/uk.json +++ b/www/addons/mod/choice/lang/uk.json @@ -1,7 +1,7 @@ { "cannotsubmit": "Вибачте, але трапилася проблема під час збереження вашого вибору. Повторіть, будь ласка, ще раз.", "choiceoptions": "Параметри вибору", - "errorgetchoice": "Помилка при отриманні даних вибору.", + "errorgetchoice": "Помилка при отриманні даних виборки.", "expired": "На жаль, ця діяльність закрита для {{$a}} та більше недоступна", "full": "(Все)", "noresultsviewable": "В даний час результати не можна побачити.", diff --git a/www/addons/mod/feedback/lang/el.json b/www/addons/mod/feedback/lang/el.json index 7dd8e2abab8..1d5dec70464 100644 --- a/www/addons/mod/feedback/lang/el.json +++ b/www/addons/mod/feedback/lang/el.json @@ -3,10 +3,12 @@ "anonymous": "Ανώνυμα", "anonymous_entries": "Ανώνυμες καταχωρήσεις", "average": "Μέσος όρος", + "captchaofflinewarning": "Η ανατροφοδότηση με την χρήση captcha δεν μπορεί να ολοκληρωθεί εάν δεν έχει διαμορφωθεί, εάν βρίσκεστε εκτός λειτουργίας ή με ο server δεν λειτουργεί.", "complete_the_form": "Απαντήστε τις ερωτήσεις...", "completed_feedbacks": "Απαντήσεις που έχουν υποβληθεί", "continue_the_form": "Συνεχίστε τη φόρμα", "feedback_is_not_open": "Το σχόλιο δεν είναι ανοιχτό", + "feedback_submitted_offline": "Αυτή η ανατροφοδότηση έχει αποθηκευτεί για να υποβληθεί αργότερα.", "feedbackclose": "Κλείσε το σχόλιο στις", "feedbackopen": "Άνοιξε το σχόλιο στις", "mapcourses": "Αντιστοίχηση σχόλιου σε μαθήματα", diff --git a/www/addons/mod/feedback/lang/es.json b/www/addons/mod/feedback/lang/es.json index b0d70fa540b..d6fc51f295d 100644 --- a/www/addons/mod/feedback/lang/es.json +++ b/www/addons/mod/feedback/lang/es.json @@ -3,10 +3,12 @@ "anonymous": "Anónima", "anonymous_entries": "Respuestas anónimas", "average": "Promedio", + "captchaofflinewarning": "La retroalimentación con captcha no puede ser completada si no está configurada, si está en modo fuera-de-línea o con el servidor caído.", "complete_the_form": "Responda a las preguntas...", "completed_feedbacks": "Respuestas enviadas", "continue_the_form": "Continuar con el formulario", "feedback_is_not_open": "La encuesta no está disponible", + "feedback_submitted_offline": "Esta retroalimentación ha sido guardada para enviarse más tarde.", "feedbackclose": "Permitir respuestas a", "feedbackopen": "Permitir respuestas de", "mapcourses": "Asignar encuesta a cursos", diff --git a/www/addons/mod/feedback/lang/fr.json b/www/addons/mod/feedback/lang/fr.json index e043077cb6a..902851b6a51 100644 --- a/www/addons/mod/feedback/lang/fr.json +++ b/www/addons/mod/feedback/lang/fr.json @@ -3,10 +3,12 @@ "anonymous": "Anonyme", "anonymous_entries": "Réponses anonymes ({{$a}})", "average": "Moyenne", + "captchaofflinewarning": "Le feedback avec captcha ne peut pas être terminé s'il n'est pas configuré, en mode hors ligne ou si le serveur est arrêté.", "complete_the_form": "Répondre aux questions...", "completed_feedbacks": "Réponses envoyées", "continue_the_form": "Continuer le formulaire", "feedback_is_not_open": "Le feedback n'est pas ouvert", + "feedback_submitted_offline": "Ce feedback a été enregistré pour être remis plus tard.", "feedbackclose": "Permettre les réponses jusqu'au", "feedbackopen": "Permettre les réponses dès le", "mapcourses": "Associer le feedback aux cours", diff --git a/www/addons/mod/feedback/lang/ja.json b/www/addons/mod/feedback/lang/ja.json index 63503d3cc28..cf75cb496e1 100644 --- a/www/addons/mod/feedback/lang/ja.json +++ b/www/addons/mod/feedback/lang/ja.json @@ -3,10 +3,12 @@ "anonymous": "匿名", "anonymous_entries": "匿名エントリ ({{$a}})", "average": "平均", + "captchaofflinewarning": "Capchaつきのフィードバックは、未設定の場合、オフラインモードの場合、サーバがダウンしている場合には完了できません。", "complete_the_form": "質問に回答する ...", "completed_feedbacks": "送信済み回答", "continue_the_form": "フォームを続ける", "feedback_is_not_open": "フィードバックは利用できません。", + "feedback_submitted_offline": "このフィードバックを、あとで提出するために保存しました。", "feedbackclose": "フィードバック終了日時", "feedbackopen": "フィードバック開始日時", "mapcourses": "フィードバックをコースにマップする", diff --git a/www/addons/mod/feedback/lang/sr-cr.json b/www/addons/mod/feedback/lang/sr-cr.json new file mode 100644 index 00000000000..703d835b603 --- /dev/null +++ b/www/addons/mod/feedback/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "captchaofflinewarning": "Упитник са Captcha елементом не може да буде завршен ако није конфигурисан, ако сте у офлајн режиму или ако је сервер искључен.", + "feedback_submitted_offline": "Овај упитник је сачуван како би касније био предат." +} \ No newline at end of file diff --git a/www/addons/mod/feedback/lang/sr-lt.json b/www/addons/mod/feedback/lang/sr-lt.json new file mode 100644 index 00000000000..ceea89255f5 --- /dev/null +++ b/www/addons/mod/feedback/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "captchaofflinewarning": "Upitnik sa Captcha elementom ne može da bude završen ako nije konfigurisan, ako ste u oflajn režimu ili ako je server isključen.", + "feedback_submitted_offline": "Ovaj upitnik je sačuvan kako bi kasnije bio predat." +} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/da.json b/www/addons/mod/folder/lang/da.json index c53b3a994ed..2337bed4841 100644 --- a/www/addons/mod/folder/lang/da.json +++ b/www/addons/mod/folder/lang/da.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Der er ingen filer at vise", + "emptyfilelist": "Der er ingen filer at vise.", "errorwhilegettingfolder": "Fejl ved hentning af mappedata." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/he.json b/www/addons/mod/folder/lang/he.json index 1c2ec27977b..55811600621 100644 --- a/www/addons/mod/folder/lang/he.json +++ b/www/addons/mod/folder/lang/he.json @@ -1,3 +1,3 @@ { - "emptyfilelist": "אין קבצים להציג" + "emptyfilelist": "אין קבצים להציג." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/ja.json b/www/addons/mod/folder/lang/ja.json index 39c4d9fcfbd..61980e500fc 100644 --- a/www/addons/mod/folder/lang/ja.json +++ b/www/addons/mod/folder/lang/ja.json @@ -1,3 +1,4 @@ { - "emptyfilelist": "表示するファイルはありません。" + "emptyfilelist": "表示するファイルがありません。", + "errorwhilegettingfolder": "フォルダのデータを取得中にエラーが発生しました。" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/sr-cr.json b/www/addons/mod/folder/lang/sr-cr.json new file mode 100644 index 00000000000..a65fb8697c7 --- /dev/null +++ b/www/addons/mod/folder/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "emptyfilelist": "Нема датотека за приказ.", + "errorwhilegettingfolder": "Грешка приликом преузимања података за 'Директоријум'" +} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/sr-lt.json b/www/addons/mod/folder/lang/sr-lt.json new file mode 100644 index 00000000000..9bfdf403335 --- /dev/null +++ b/www/addons/mod/folder/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "emptyfilelist": "Nema datoteka za prikaz.", + "errorwhilegettingfolder": "Greška prilikom preuzimanja podataka za 'Direktorijum'" +} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/uk.json b/www/addons/mod/folder/lang/uk.json index 28ec6cd8e8a..1357444e2a4 100644 --- a/www/addons/mod/folder/lang/uk.json +++ b/www/addons/mod/folder/lang/uk.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Немає файдів для показу", + "emptyfilelist": "Немає файлів для показу", "errorwhilegettingfolder": "Помилка отримання інформації про папку" } \ No newline at end of file diff --git a/www/addons/mod/forum/lang/da.json b/www/addons/mod/forum/lang/da.json index 38dca8ad7f1..bdbd7c0a872 100644 --- a/www/addons/mod/forum/lang/da.json +++ b/www/addons/mod/forum/lang/da.json @@ -9,7 +9,7 @@ "discussionsubscription": "Abonnement på tråd", "edit": "Rediger", "erroremptymessage": "Indlægget kan ikke være tomt.", - "erroremptysubject": "Indlæggets emne kan ikke være tomt.", + "erroremptysubject": "Emnefeltet kan ikke være tomt", "errorgetforum": "Fejl ved hentning af forumdata.", "errorgetgroups": "Fejl ved hentning af gruppeindstillinger.", "forumnodiscussionsyet": "Der er endnu ingen indlæg i dette forum.", diff --git a/www/addons/mod/forum/lang/he.json b/www/addons/mod/forum/lang/he.json index 665cc87e1b4..585aef50b5f 100644 --- a/www/addons/mod/forum/lang/he.json +++ b/www/addons/mod/forum/lang/he.json @@ -9,7 +9,7 @@ "discussionsubscription": "מנוי לעדכונים בדיון", "edit": "עריכה", "erroremptymessage": "הודעת הפרסום איננה יכולה להיות ריקה", - "erroremptysubject": "הנושא הפרסום אינו יכול להיות ריק", + "erroremptysubject": "נושא ההודעה אינו יכול להיות ריק", "errorgetforum": "שגיאה בטעינת מידע הפורום.", "errorgetgroups": "שגיאה בטעינת הגדרות קבוצה.", "forumnodiscussionsyet": "עדיין לא קיימים נושאי דיונים בפורום זה.", diff --git a/www/addons/mod/forum/lang/ja.json b/www/addons/mod/forum/lang/ja.json index c6861af9156..27252c4d033 100644 --- a/www/addons/mod/forum/lang/ja.json +++ b/www/addons/mod/forum/lang/ja.json @@ -10,15 +10,21 @@ "discussionsubscription": "ディスカッション購読", "edit": "編集", "erroremptymessage": "投稿メッセージを空にすることはできません。", - "erroremptysubject": "投稿件名を空にすることはできません。", + "erroremptysubject": "投稿の件名は必須です", + "errorgetforum": "フォーラムのデータ取得中にエラーが発生しました。", + "errorgetgroups": "グループ設定の取得中にエラーが発生しました。", "forumnodiscussionsyet": "このフォーラムにはまだディスカッショントピックがありません", "group": "グループ", "message": "メッセージ", "modeflatnewestfirst": "返信を新しいものからフラット表示する", "modeflatoldestfirst": "返信を古いものからフラット表示する", "modenested": "返信をネスト表示する", + "numdiscussions": "ディスカッション数 {{numdiscussions}}", + "numreplies": "返信数 {{numreplies}}", "posttoforum": "フォーラムに投稿する", "re": "Re:", + "refreshdiscussions": "ディスカッションをリフレッシュ", + "refreshposts": "ディスカッション投稿をリフレッシュ", "reply": "返信", "subject": "件名", "unread": "未読", diff --git a/www/addons/mod/forum/lang/sr-cr.json b/www/addons/mod/forum/lang/sr-cr.json new file mode 100644 index 00000000000..4d04219d752 --- /dev/null +++ b/www/addons/mod/forum/lang/sr-cr.json @@ -0,0 +1,11 @@ +{ + "erroremptysubject": "Тема поруке не може бити празна", + "errorgetforum": "Грешка приликом преузимања података за 'Форум'", + "errorgetgroups": "Грешка приликом преузимања подешавања група.", + "forumnodiscussionsyet": "Још нема тема за дискусију на овом форуму.", + "group": "Група", + "numdiscussions": "{{numdiscussions}} дискусије/а", + "numreplies": "{{numreplies}} одговора", + "refreshdiscussions": "Освежи дискусије", + "refreshposts": "Освежи постове" +} \ No newline at end of file diff --git a/www/addons/mod/forum/lang/sr-lt.json b/www/addons/mod/forum/lang/sr-lt.json new file mode 100644 index 00000000000..27882a3847b --- /dev/null +++ b/www/addons/mod/forum/lang/sr-lt.json @@ -0,0 +1,11 @@ +{ + "erroremptysubject": "Tema poruke ne može biti prazna", + "errorgetforum": "Greška prilikom preuzimanja podataka za 'Forum'", + "errorgetgroups": "Greška prilikom preuzimanja podešavanja grupa.", + "forumnodiscussionsyet": "Greška prilikom preuzimanja podešavanja grupa.", + "group": "Grupa", + "numdiscussions": "{{numdiscussions}} diskusije/a", + "numreplies": "{{numreplies}} odgovora", + "refreshdiscussions": "Osveži diskusije", + "refreshposts": "Osveži postove" +} \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/da.json b/www/addons/mod/glossary/lang/da.json index bd0f0d93d2e..40b07cf0bb0 100644 --- a/www/addons/mod/glossary/lang/da.json +++ b/www/addons/mod/glossary/lang/da.json @@ -1,6 +1,6 @@ { "attachment": "Tilføj badge til besked", - "browsemode": "Forhåndsvisning", + "browsemode": "Skim indlæg", "byalphabet": "Alfabetisk", "byauthor": "Grupper efter forfatter", "bynewestfirst": "Nyeste først", diff --git a/www/addons/mod/glossary/lang/el.json b/www/addons/mod/glossary/lang/el.json index c79bed26793..0bfce509423 100644 --- a/www/addons/mod/glossary/lang/el.json +++ b/www/addons/mod/glossary/lang/el.json @@ -3,11 +3,14 @@ "browsemode": "Περιήγηση στις καταχωρήσεις", "byalphabet": "Αλφαβητικά", "byauthor": "Ομαδοποίηση ανά συγγραφέα", + "bycategory": "Ομαδοποίηση ανά κατηγορία", "bynewestfirst": "Νεότερα πρώτα", "byrecentlyupdated": "Ανανεώθηκαν πρόσφατα", "bysearch": "Αναζήτηση", + "cannoteditentry": "Δεν είναι δυνατή η επεξεργασία της καταχώρισης", "casesensitive": "Χρήση κανονικών εκφράσεων", "categories": "Κατηγορίες μαθημάτων", + "entriestobesynced": "Entries που πρέπει να συγχρονιστούν", "entrypendingapproval": "Εκκρεμεί η έγκριση για αυτή την καταχώρηση.", "errorloadingentries": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση των καταχωρήσεων.", "errorloadingentry": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση της καταχώρησης.", diff --git a/www/addons/mod/glossary/lang/es.json b/www/addons/mod/glossary/lang/es.json index 02d8e633d5c..4089c74aa49 100644 --- a/www/addons/mod/glossary/lang/es.json +++ b/www/addons/mod/glossary/lang/es.json @@ -3,11 +3,14 @@ "browsemode": "Navegar por las entradas", "byalphabet": "Alfabéticamente", "byauthor": "Agrupado por autor", + "bycategory": "Agrupar por categoría", "bynewestfirst": "El más reciente primero", "byrecentlyupdated": "Actualizado recientemente", "bysearch": "Busca", + "cannoteditentry": "No se puede editar la entrada", "casesensitive": "Usar expresiones regulares", "categories": "Categorías", + "entriestobesynced": "Entradas pendientes de ser sincronizadas", "entrypendingapproval": "Esta entrada está pendiente de aprobación.", "errorloadingentries": "Ha ocurrido un error cargando las entradas.", "errorloadingentry": "Ha ocurrido un error cargando la entrada.", diff --git a/www/addons/mod/glossary/lang/ja.json b/www/addons/mod/glossary/lang/ja.json index b518d805074..395ba50cc3b 100644 --- a/www/addons/mod/glossary/lang/ja.json +++ b/www/addons/mod/glossary/lang/ja.json @@ -1,6 +1,20 @@ { "attachment": "添付", - "browsemode": "プレビューモード", + "browsemode": "エントリをブラウズ", + "byalphabet": "アルファベット順", + "byauthor": "著者でグループ", + "bycategory": "カテゴリでグループ", + "bynewestfirst": "新規順", + "byrecentlyupdated": "最近の更新", + "bysearch": "検索", + "cannoteditentry": "エントリの編集ができませんでした", "casesensitive": "正規表現を使用する", - "categories": "コースカテゴリ" + "categories": "コースカテゴリ", + "entriestobesynced": "エントリの同期ができませんでした", + "entrypendingapproval": "このエントリは承認待ちです。", + "errorloadingentries": "エントリ読み込み中にエラーが発生しました。", + "errorloadingentry": "エントリ読み込み中にエラーが発生しました。", + "errorloadingglossary": "用語集を読み込み中にエラーが発生しました。", + "noentriesfound": "エントリが見つかりませんでした。", + "searchquery": "検索内容" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/sr-cr.json b/www/addons/mod/glossary/lang/sr-cr.json new file mode 100644 index 00000000000..3b6a512513a --- /dev/null +++ b/www/addons/mod/glossary/lang/sr-cr.json @@ -0,0 +1,17 @@ +{ + "browsemode": "Прегледај појмове", + "byalphabet": "Азбучним редом", + "byauthor": "Групиши по аутору", + "bycategory": "Групиши по категорији", + "bynewestfirst": "Најновији прво", + "byrecentlyupdated": "Недавно ажурирани", + "bysearch": "Претражи", + "cannoteditentry": "Не можете да уређујете појам", + "entriestobesynced": "Појмови за синхронизацију", + "entrypendingapproval": "Овај појам чека одобрење.", + "errorloadingentries": "Дошло је до грешке приликом учитавања појмова.", + "errorloadingentry": "Дошло је до грешке приликом учитавања појма.", + "errorloadingglossary": "Дошло је до грешке приликом учитавања речника.", + "noentriesfound": "Није пронађен ниједан појам.", + "searchquery": "Упит за претрагу" +} \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/sr-lt.json b/www/addons/mod/glossary/lang/sr-lt.json new file mode 100644 index 00000000000..fe27335b225 --- /dev/null +++ b/www/addons/mod/glossary/lang/sr-lt.json @@ -0,0 +1,17 @@ +{ + "browsemode": "Pregledaj pojmove", + "byalphabet": "Abecednim redom", + "byauthor": "Grupiši po autoru", + "bycategory": "Grupiši po kategoriji", + "bynewestfirst": "Najnoviji prvo", + "byrecentlyupdated": "Nedavno ažurirani", + "bysearch": "Pretraži", + "cannoteditentry": "Ne možete da uređujete pojam", + "entriestobesynced": "Pojmovi za sinhronizaciju", + "entrypendingapproval": "Ovaj pojam čeka odobrenje.", + "errorloadingentries": "Došlo je do greške prilikom učitavanja pojmova.", + "errorloadingentry": "Došlo je do greške prilikom učitavanja pojma.", + "errorloadingglossary": "Došlo je do greške prilikom učitavanja rečnika.", + "noentriesfound": "Nije pronađen nijedan pojam.", + "searchquery": "Upit za pretragu" +} \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/uk.json b/www/addons/mod/glossary/lang/uk.json index 5452c0da423..f3e1eeb10fc 100644 --- a/www/addons/mod/glossary/lang/uk.json +++ b/www/addons/mod/glossary/lang/uk.json @@ -5,9 +5,9 @@ "byauthor": "Групувати за автором", "bycategory": "Групувати за категорією", "bynewestfirst": "Новіші перші", - "byrecentlyupdated": "Недавно оновлені", + "byrecentlyupdated": "Нещодавно оновлені", "bysearch": "Пошук", - "cannoteditentry": "Неможливо задагувати запис", + "cannoteditentry": "Неможливо редагувати запис", "casesensitive": "Використовувати регулярні вирази", "categories": "Категорії курсів", "entriestobesynced": "Записи будуть синхронізовані", diff --git a/www/addons/mod/imscp/lang/ja.json b/www/addons/mod/imscp/lang/ja.json index 66c407ae43e..5bd979018e4 100644 --- a/www/addons/mod/imscp/lang/ja.json +++ b/www/addons/mod/imscp/lang/ja.json @@ -1,3 +1,4 @@ { - "deploymenterror": "コンテンツパッケージエラー!" + "deploymenterror": "コンテンツパッケージエラー!", + "showmoduledescription": "説明の表示" } \ No newline at end of file diff --git a/www/addons/mod/imscp/lang/sr-cr.json b/www/addons/mod/imscp/lang/sr-cr.json new file mode 100644 index 00000000000..939547b3b5f --- /dev/null +++ b/www/addons/mod/imscp/lang/sr-cr.json @@ -0,0 +1,3 @@ +{ + "showmoduledescription": "Прикажи опис" +} \ No newline at end of file diff --git a/www/addons/mod/imscp/lang/sr-lt.json b/www/addons/mod/imscp/lang/sr-lt.json new file mode 100644 index 00000000000..8519e32307b --- /dev/null +++ b/www/addons/mod/imscp/lang/sr-lt.json @@ -0,0 +1,3 @@ +{ + "showmoduledescription": "Prikaži opis" +} \ No newline at end of file diff --git a/www/addons/mod/label/lang/he.json b/www/addons/mod/label/lang/he.json index 232aff3b2bf..7f0814d0381 100644 --- a/www/addons/mod/label/lang/he.json +++ b/www/addons/mod/label/lang/he.json @@ -1,3 +1,3 @@ { - "label": "תווית לשאלה מותנית (באנגלית)" + "label": "תווית" } \ No newline at end of file diff --git a/www/addons/mod/label/lang/sr-cr.json b/www/addons/mod/label/lang/sr-cr.json new file mode 100644 index 00000000000..ee0697520d2 --- /dev/null +++ b/www/addons/mod/label/lang/sr-cr.json @@ -0,0 +1,3 @@ +{ + "label": "Натпис" +} \ No newline at end of file diff --git a/www/addons/mod/label/lang/sr-lt.json b/www/addons/mod/label/lang/sr-lt.json new file mode 100644 index 00000000000..c2a3f10a06e --- /dev/null +++ b/www/addons/mod/label/lang/sr-lt.json @@ -0,0 +1,3 @@ +{ + "label": "Natpis" +} \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/el.json b/www/addons/mod/lesson/lang/el.json index d2c0aa91741..bbb63a55b7d 100644 --- a/www/addons/mod/lesson/lang/el.json +++ b/www/addons/mod/lesson/lang/el.json @@ -19,6 +19,8 @@ "emptypassword": "Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός", "enterpassword": "Παρακαλώ εισάγετε τον κωδικό:", "eolstudentoutoftimenoanswers": "Δεν απαντήσατε καμία ερώτηση. Πήρατε 0 σε αυτή την ενότητα.", + "errorreviewretakenotlast": "Αυτή η προσπάθεια δεν μπορεί πλέον να αναθεωρηθεί επειδή μια άλλη προσπάθεια έχει ήδη ολοκληρωθεί.", + "finishretakeoffline": "Αυτή η προσπάθεια έχει ολοκληρωθεί εκτός σύνδεσης.", "firstwrong": "Δυστυχώς δεν μπορείτε να κερδίσετε αυτό το βαθμό γιατί η απάντησή σας ήταν λάθος. Θέλετε να συνεχίσετε να μαντεύετε, μόνο για τη χαρά της μάθησης (δεν θα λάβετε το βαθμολογικό μπόνους);", "grade": "Βαθμός", "highscore": "Υψηλός βαθμός", @@ -49,6 +51,9 @@ "rawgrade": "Βαθμός χωρίς επεξεργασία", "reports": "Αναφορές", "response": "Ανταπόκριση", + "retakefinishedinsync": "Μια προσπάθεια εκτός σύνδεσης συγχρονίστηκε. Θέλετε να την αναθεωρήσετε;", + "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", + "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", "review": "Αναθεώρηση", "reviewlesson": "Αναθεώρηση ενότητας", "reviewquestionback": "Ναι, θα ήθελα να δοκιμάσω πάλι", @@ -63,6 +68,7 @@ "timeremaining": "Υπολοιπόμενος χρόνος", "timetaken": "Χρόνος που χρειάστηκε", "unseenpageinbranch": "Ερώτηση μέσα σε διακλάδωση που δεν εμφανίσθηκε", + "warningretakefinished": "Η προσπάθεια ολοκληρώθηκε στον ιστότοπο.", "welldone": "Μπράβο!", "youhaveseen": "Έχετε δει περισσότερες από μία σελίδες αυτής της ενότητας.
Θέλετε να ξεκινήσετε από την τελευταία σελίδα που είδατε;", "youranswer": "Η απάντησή σας", diff --git a/www/addons/mod/lesson/lang/es.json b/www/addons/mod/lesson/lang/es.json index 1b960b84214..2679c6f3f4c 100644 --- a/www/addons/mod/lesson/lang/es.json +++ b/www/addons/mod/lesson/lang/es.json @@ -21,7 +21,9 @@ "emptypassword": "La contraseña no puede estar vacía", "enterpassword": "Por favor, escriba la contraseña:", "eolstudentoutoftimenoanswers": "No ha contestado a ninguna pregunta. En esta lección ha obtenido 0 puntos.", + "errorreviewretakenotlast": "Este intento no puede ser revisado ya que se ha terminado otro intento.", "finish": "Terminado", + "finishretakeoffline": "Este intento se ha terminado en fuera-de-línea.", "firstwrong": "Lo sentimos, usted no puede obtener este punto porque su respuesta no es correcta. ¿Desea seguir intentándolo? (únicamente para aprender, no para ganar el punto).", "gotoendoflesson": "Ir al final de la lección", "grade": "Calificación", @@ -55,6 +57,9 @@ "rawgrade": "Calificación en bruto", "reports": "Informes", "response": "Comentario", + "retakefinishedinsync": "Un intento fuera-de-línea fue sincronizado. ¿Quiere usted revisarlo?", + "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", + "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", "review": "Revisión", "reviewlesson": "Revisar lección", "reviewquestionback": "Sí, me gustaría probar de nuevo", @@ -69,6 +74,7 @@ "timeremaining": "Tiempo restante", "timetaken": "Tiempo empleado", "unseenpageinbranch": "Pregunta no vista dentro de una página de conenidos", + "warningretakefinished": "Este intento se terminó en el sitio.", "welldone": "¡Bien hecho!", "youhaveseen": "Usted ya ha visto más de una página de esta lección.
¿Desea comenzar desde la última página vista?", "youranswer": "Su respuesta", diff --git a/www/addons/mod/lesson/lang/fr.json b/www/addons/mod/lesson/lang/fr.json index 2b8652437b9..4c51fa118a7 100644 --- a/www/addons/mod/lesson/lang/fr.json +++ b/www/addons/mod/lesson/lang/fr.json @@ -21,7 +21,9 @@ "emptypassword": "Le mot de passe ne peut pas être vide", "enterpassword": "Veuillez saisir le mot de passe :", "eolstudentoutoftimenoanswers": "vous n'avez répondu à aucune question. Votre note pour cette leçon est de 0.", + "errorreviewretakenotlast": "Cette tentative ne peut plus être relue, car une autre tentative a été terminée.", "finish": "Terminer", + "finishretakeoffline": "Cette tentative a été terminée en mode hors ligne.", "firstwrong": "Vous n'avez pas répondu correctement. Voulez-vous essayer de deviner la bonne réponse ? Si vous répondez maintenant correctement, vous ne recevrez cependant pas de point.", "gotoendoflesson": "Aller à la fin de la leçon", "grade": "Note", @@ -55,6 +57,9 @@ "rawgrade": "Note brute", "reports": "Rapports", "response": "Feedback", + "retakefinishedinsync": "Une tentative hors ligne a été synchronisée. Voulez-vous la relire ?", + "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", + "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", "review": "Relecture", "reviewlesson": "Revoir la leçon", "reviewquestionback": "Oui, j'aimerais essayer à nouveau", @@ -69,6 +74,7 @@ "timeremaining": "Durée restante", "timetaken": "Durée utilisée", "unseenpageinbranch": "Question non vue au sein d'une page de contenu", + "warningretakefinished": "Cette tentative a été terminée sur la plateforme.", "welldone": "Bien joué !", "youhaveseen": "Vous avez déjà vu au moins une page de cette leçon.
Voulez-vous commencer à la dernière page que vous avez vue ?", "youranswer": "Votre réponse", diff --git a/www/addons/mod/lesson/lang/ja.json b/www/addons/mod/lesson/lang/ja.json index 18e3ade173c..14a3926d347 100644 --- a/www/addons/mod/lesson/lang/ja.json +++ b/www/addons/mod/lesson/lang/ja.json @@ -21,7 +21,9 @@ "emptypassword": "パスワードは空白にできません。", "enterpassword": "パスワードを入力してください:", "eolstudentoutoftimenoanswers": "あなたはどの問題にも解答していません。このレッスンのあなたの評点は0点です。", + "errorreviewretakenotlast": "この回答は、別の回答が完了しているため評価できません。", "finish": "終了", + "finishretakeoffline": "この回答はオフライン状態で完了しました。", "firstwrong": "あなたの解答は正しくありません。問題を再度受験しますか? (今から問題に正しく解答した場合、あなたの最終評点には加算されません)", "gotoendoflesson": "レッスンの最後に移動する", "grade": "評点", @@ -55,6 +57,9 @@ "rawgrade": "素点", "reports": "レポート", "response": "返答", + "retakefinishedinsync": "オフラインの回答が同期されました。評価しますか?", + "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", + "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", "review": "レビュー", "reviewlesson": "レッスンをレビューする", "reviewquestionback": "はい、もう一度受験します", @@ -69,6 +74,7 @@ "timeremaining": "残り時間", "timetaken": "経過時間", "unseenpageinbranch": "コンテンツページ内の未閲覧の問題", + "warningretakefinished": "回答はサイト内で完了しました。", "welldone": "よくできました!", "youhaveseen": "あなたはすでにこのレッスンを2ページ以上表示しました。
あなたが表示した最後のページから始めますか?", "youranswer": "あなたの答え", diff --git a/www/addons/mod/lesson/lang/sr-cr.json b/www/addons/mod/lesson/lang/sr-cr.json new file mode 100644 index 00000000000..db28c42b19e --- /dev/null +++ b/www/addons/mod/lesson/lang/sr-cr.json @@ -0,0 +1,8 @@ +{ + "errorreviewretakenotlast": "Ова покушај не може више бити прегледан зато што је завршен други покушај.", + "finishretakeoffline": "Овај покушај је завршен у офлајн режиму.", + "retakefinishedinsync": "Офлајн покушај је синхронизован. Да ли желите да га прегледате?", + "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", + "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", + "warningretakefinished": "Покушај је завршен на сајту." +} \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/sr-lt.json b/www/addons/mod/lesson/lang/sr-lt.json new file mode 100644 index 00000000000..da28ea0cf44 --- /dev/null +++ b/www/addons/mod/lesson/lang/sr-lt.json @@ -0,0 +1,8 @@ +{ + "errorreviewretakenotlast": "Ova pokušaj ne može više biti pregledan zato što je završen drugi pokušaj.", + "finishretakeoffline": "Ovaj pokušaj je završen u oflajn režimu.", + "retakefinishedinsync": "Oflajn pokušaj je sinhronizovan. Da li želite da ga pregledate?", + "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", + "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", + "warningretakefinished": "Pokušaj je završen na sajtu." +} \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/uk.json b/www/addons/mod/lesson/lang/uk.json index e6a5762d90d..43f68800251 100644 --- a/www/addons/mod/lesson/lang/uk.json +++ b/www/addons/mod/lesson/lang/uk.json @@ -21,7 +21,7 @@ "emptypassword": "Пароль не може бути порожнім", "enterpassword": "Будь ласка, введіть пароль:", "eolstudentoutoftimenoanswers": "Ви не дали відповіді на жодне запитання. Ви отримуєте нуль за цей урок.", - "errorreviewretakenotlast": "Ця спроба не може бути переглянута більше, тому що ще одна спроба була закінчена.", + "errorreviewretakenotlast": "Ця спроба не може бути переглянута, тому що ще одна спроба була закінчена.", "finish": "Завершити", "finishretakeoffline": "Ця спроба була закінчена в автономному режимі.", "firstwrong": "На жаль, за неправильної відповіді Ви не можете отримати бал. Ви хочете продовжити вгадування в цілях навчання (але не в цілях отримання балів)?", diff --git a/www/addons/mod/lti/lang/ja.json b/www/addons/mod/lti/lang/ja.json new file mode 100644 index 00000000000..b3e5bba2e60 --- /dev/null +++ b/www/addons/mod/lti/lang/ja.json @@ -0,0 +1,5 @@ +{ + "errorgetlti": "モジュールデータ取得中にエラーが発生しました。", + "errorinvalidlaunchurl": "起動するURLが不正です。", + "launchactivity": "アクティビティを起動" +} \ No newline at end of file diff --git a/www/addons/mod/lti/lang/sr-cr.json b/www/addons/mod/lti/lang/sr-cr.json new file mode 100644 index 00000000000..6f616981561 --- /dev/null +++ b/www/addons/mod/lti/lang/sr-cr.json @@ -0,0 +1,5 @@ +{ + "errorgetlti": "Грешка приликом преузимања података модула.", + "errorinvalidlaunchurl": "Иницијална URL адреса није исправна.", + "launchactivity": "Покрени активност" +} \ No newline at end of file diff --git a/www/addons/mod/lti/lang/sr-lt.json b/www/addons/mod/lti/lang/sr-lt.json new file mode 100644 index 00000000000..0feaaf89a14 --- /dev/null +++ b/www/addons/mod/lti/lang/sr-lt.json @@ -0,0 +1,5 @@ +{ + "errorgetlti": "Greška prilikom preuzimanja podataka modula.", + "errorinvalidlaunchurl": "Inicijalna URL adresa nije ispravna.", + "launchactivity": "Pokreni aktivnost" +} \ No newline at end of file diff --git a/www/addons/mod/lti/lang/uk.json b/www/addons/mod/lti/lang/uk.json index cc542981fd4..8569afbe6c1 100644 --- a/www/addons/mod/lti/lang/uk.json +++ b/www/addons/mod/lti/lang/uk.json @@ -1,5 +1,5 @@ { "errorgetlti": "Помилка при отриманні даних модуля.", - "errorinvalidlaunchurl": "Запуск URL не є дійсним.", + "errorinvalidlaunchurl": "Цей URL не є дійсним.", "launchactivity": "Запуск діяльності" } \ No newline at end of file diff --git a/www/addons/mod/page/lang/ja.json b/www/addons/mod/page/lang/ja.json index 0637a088a01..4084af15212 100644 --- a/www/addons/mod/page/lang/ja.json +++ b/www/addons/mod/page/lang/ja.json @@ -1 +1,3 @@ -[] \ No newline at end of file +{ + "errorwhileloadingthepage": "ページ内容を読み込み中にエラーが発生しました。" +} \ No newline at end of file diff --git a/www/addons/mod/page/lang/sr-cr.json b/www/addons/mod/page/lang/sr-cr.json new file mode 100644 index 00000000000..bb2b30f0d8b --- /dev/null +++ b/www/addons/mod/page/lang/sr-cr.json @@ -0,0 +1,3 @@ +{ + "errorwhileloadingthepage": "Грешка приликом учитавања садржаја странице." +} \ No newline at end of file diff --git a/www/addons/mod/page/lang/sr-lt.json b/www/addons/mod/page/lang/sr-lt.json new file mode 100644 index 00000000000..683b241e992 --- /dev/null +++ b/www/addons/mod/page/lang/sr-lt.json @@ -0,0 +1,3 @@ +{ + "errorwhileloadingthepage": "Greška prilikom učitavanja sadržaja stranice." +} \ No newline at end of file diff --git a/www/addons/mod/quiz/lang/ja.json b/www/addons/mod/quiz/lang/ja.json index f7b4d3d133f..2fb91503783 100644 --- a/www/addons/mod/quiz/lang/ja.json +++ b/www/addons/mod/quiz/lang/ja.json @@ -4,26 +4,43 @@ "attemptnumber": "受験", "attemptquiznow": "問題を受験する", "attemptstate": "状態", + "cannotsubmitquizdueto": "このクイズの回答は、以下の理由で提出できませんでした:", "comment": "コメント", "completedon": "完了日時", "confirmclose": "送信した場合、この受験に関して、これ以上あなたの答えを変更することはできません。", + "confirmcontinueoffline": "この回答は、理由「 {{$a}} 」により、同期できませんでした。もしあなたが別のデバイスで回答を続けていた場合、データが失われている可能性があります。", + "confirmleavequizonerror": "回答の保存中にエラーが発生しました。クイズを終了してもよいですか?", "confirmstart": "この小テストには {{$a}} の時間制限があります。あなたが受験を開始した時点から時間が計測されます。あなたは有効期限前に送信する必要があります。今から開始してもよろしいですか?", "confirmstartheader": "時間制限小テスト", "connectionerror": "ネットワークコネクションが切断されました (オートセーブ失敗)。\n\nこのページで入力した最後の数分間の解答をメモした後、再接続を試みてください。\n\n接続が再確立された場合、あなたの解答は保存され、このメッセージは表示されなくなります。", "continueattemptquiz": "前回の受験を続ける", "continuepreview": "前回受験のプレビューを続ける", + "errorbehaviournotsupported": "このクイズは、アプリでサポートされていない動作が含まれているため回答することができません。", + "errordownloading": "必要なデータのダウンロード中にエラーが発生しました。", + "errorgetattempt": "回答データの取得中にエラーが発生しました。", + "errorgetquestions": "質問の取得中にエラーが発生しました。", + "errorgetquiz": "クイズデータの取得中にエラーが発生しました。", + "errorparsequestions": "質問の読み込み中にエラーが発生しました。Webブラウザからこのクイズに回答してください。", + "errorquestionsnotsupported": "このクイズは、アプリでサポートされていない質問を含む可能性があるため回答することができません。", + "errorrulesnotsupported": "このクイズは、アプリでサポートされていないアクセスルールがあるため回答することができません。", + "errorsaveattempt": "回答データの保存中にエラーが発生しました。", + "errorsyncquiz": "同期中にエラーが発生しました。再度同期してください。", + "errorsyncquizblocked": "このクイズは、進行中のプロセスがあるためすぐには同期できません。後で再び同期してください。この問題が連続する場合、アプリを再起動してみてください。", "feedback": "フィードバック", "finishattemptdots": "受験を終了する ...", + "finishnotsynced": "完了しましたが同期されていません。", "grade": "評点", "gradeaverage": "平均評点", "gradehighest": "最高評点", "grademethod": "評定方法", "gradesofar": "{{$a.method}}: {{$a.mygrade}} / {{$a.quizgrade}}", + "hasdatatosync": "このクイズには同期が必要なオフラインデータがあります。", "marks": "得点", "mustbesubmittedby": "この受験は {{$a}} までに送信される必要があります。", "noquestions": "まだ問題が追加されていません。", "noreviewattempt": "あなたはこの受験のレビューを許可されていません。", "notyetgraded": "未評定", + "opentoc": "ナビゲーションポップオーバーを開いてください。", "outof": "{{$a.grade}} / {{$a.maxgrade}}", "outofpercent": "{{$a.grade}} / {{$a.maxgrade}} ({{$a.percent}}%)", "outofshort": "{{$a.grade}} / {{$a.maxgrade}}", @@ -56,5 +73,8 @@ "summaryofattempts": "あなたの前回の受験概要", "timeleft": "残り時間", "timetaken": "所要時間", + "warningattemptfinished": "オフラインの回答は、サイト上で完了していた、もしくは見当たらなかったため廃棄されました。", + "warningdatadiscarded": "質問文がオンラインで変更されたため、一部のオフライン回答が廃棄されました。", + "warningdatadiscardedfromfinished": "オフライン回答が廃棄されたため、回答が完了していません。回答内容を確認し、回答を再度提出してください。", "yourfinalgradeis": "あなたの小テスト最終評点は {{$a}} です。" } \ No newline at end of file diff --git a/www/addons/mod/quiz/lang/sr-cr.json b/www/addons/mod/quiz/lang/sr-cr.json new file mode 100644 index 00000000000..f41594f4ad8 --- /dev/null +++ b/www/addons/mod/quiz/lang/sr-cr.json @@ -0,0 +1,22 @@ +{ + "cannotsubmitquizdueto": "Овај покушај решавања теста не може да буде предат због следећих разлога:", + "confirmcontinueoffline": "Овај покушај није синхронизован од {{$a}}. Ако сте у међувремену овај покушај наставили на неком другом уређају, постоји могућност да сте изгубили податке.", + "confirmleavequizonerror": "Дошло је до грешке приликом покушаја да се сачувају одговори. Да ли сте сигурни да желите да напустите тест?", + "errorbehaviournotsupported": "Овај тест не можете решавати у апликацији зато што она не подржава понашање питања:", + "errordownloading": "Грешка приликом преузимања неопходних података.", + "errorgetattempt": "Грешка приликом преузимања података о покушају решавања теста.", + "errorgetquestions": "Грешка приликом преузимања питања.", + "errorgetquiz": "Грешка приликом преузимања података о тесту.", + "errorparsequestions": "Дошло је до грешке приликом учитавања питања. Молимо, покушајте да решите овај тест у веб читачу.", + "errorquestionsnotsupported": "Овај тест се не може решавати у апликацији зато што садржи питања које апликација не подржава:", + "errorrulesnotsupported": "Овај тест се не може решавати у апликацији зато што садржи правила за приступ које апликација не подржава:", + "errorsaveattempt": "Дошло је до грешке приликом снимања података о покушају решавања теста.", + "errorsyncquiz": "Дошло је до грешке приликом синхронизације. Молимо, покушајте поново.", + "errorsyncquizblocked": "Овај тест сада не може бити синхронизован због другог процеса који је тренутно у току. Молимо, покушајте поново касније. Ако и даље будете имали проблема, покушајте да покренете апликацију испочетка.", + "finishnotsynced": "Тест је завршен, али није синхронизован", + "hasdatatosync": "Овај тест има офлајн податке које треба синхронизовати.", + "opentoc": "Отвори навигациони мени.", + "warningattemptfinished": "Офлајн покушај је одбачен зато што је или завршен на сајту или није пронађен.", + "warningdatadiscarded": "Неки офлајн одговори су одбачени зато што су питања измењена онлајн.", + "warningdatadiscardedfromfinished": "Покушај решавања теста је није завршен зато што су неки офлајн одговори одбачени. Прегледајте своје одговоре, а затим поново пошаљите свој покушај." +} \ No newline at end of file diff --git a/www/addons/mod/quiz/lang/sr-lt.json b/www/addons/mod/quiz/lang/sr-lt.json new file mode 100644 index 00000000000..a8ac15c303b --- /dev/null +++ b/www/addons/mod/quiz/lang/sr-lt.json @@ -0,0 +1,22 @@ +{ + "cannotsubmitquizdueto": "Ovaj pokušaj rešavanja testa ne može da bude predat zbog sledećih razloga:", + "confirmcontinueoffline": "Ovaj pokušaj nije sinhronizovan od {{$a}}. Ako ste u međuvremenu ovaj pokušaj nastavili na nekom drugom uređaju, postoji mogućnost da ste izgubili podatke.", + "confirmleavequizonerror": "Došlo je do greške prilikom pokušaja da se sačuvaju odgovori. Da li ste sigurni da želite da napustite test?", + "errorbehaviournotsupported": "Ovaj test ne možete rešavati u aplikaciji zato što ona ne podržava ponašanje pitanja:", + "errordownloading": "Greška prilikom preuzimanja neophodnih podataka.", + "errorgetattempt": "Greška prilikom preuzimanja podataka o pokušaju rešavanja testa.", + "errorgetquestions": "Greška prilikom preuzimanja pitanja.", + "errorgetquiz": "Greška prilikom preuzimanja podataka o testu.", + "errorparsequestions": "Došlo je do greške prilikom učitavanja pitanja. Molimo, pokušajte da rešite ovaj test u veb čitaču.", + "errorquestionsnotsupported": "Ovaj test se ne može rešavati u aplikaciji zato što sadrži pitanja koje aplikacija ne podržava:", + "errorrulesnotsupported": "Ovaj test se ne može rešavati u aplikaciji zato što sadrži pravila za pristup koje aplikacija ne podržava:", + "errorsaveattempt": "Došlo je do greške prilikom snimanja podataka o pokušaju rešavanja testa.", + "errorsyncquiz": "Došlo je do greške prilikom sinhronizacije. Molimo, pokušajte ponovo.", + "errorsyncquizblocked": "Ovaj test sada ne može biti sinhronizovan zbog drugog procesa koji je trenutno u toku. Molimo, pokušajte ponovo kasnije. Ako i dalje budete imali problema, pokušajte da pokrenete aplikaciju ispočetka.", + "finishnotsynced": "Test je završen, ali nije sinhronizovan", + "hasdatatosync": "Ovaj test ima oflajn podatke koje treba sinhronizovati.", + "opentoc": "Otvori navigacioni meni.", + "warningattemptfinished": "Oflajn pokušaj je odbačen zato što je ili završen na sajtu ili nije pronađen.", + "warningdatadiscarded": "Neki oflajn odgovori su odbačeni zato što su pitanja izmenjena onlajn.", + "warningdatadiscardedfromfinished": "Pokušaj rešavanja testa je nije završen zato što su neki oflajn odgovori odbačeni. Pregledajte svoje odgovore, a zatim ponovo pošaljite svoj pokušaj." +} \ No newline at end of file diff --git a/www/addons/mod/quiz/lang/uk.json b/www/addons/mod/quiz/lang/uk.json index 3c6c7b28f67..33bfc0688f7 100644 --- a/www/addons/mod/quiz/lang/uk.json +++ b/www/addons/mod/quiz/lang/uk.json @@ -8,24 +8,24 @@ "comment": "Коментар", "completedon": "Завершено", "confirmclose": "Ви вибрали закінчення тесту (даної спроби). Якщо ви це підтверджуєте, Ви більше не зможете змінювати ваші відповіді.", - "confirmcontinueoffline": "Ця спроба не була синхронізована, {{$a}}. Якщо ви продовжили цю спробу в іншому пристрої з тих пір, ви можете втратити дані.", + "confirmcontinueoffline": "Ця спроба не була синхронізована, {{$a}}. Якщо ви продовжили цю спробу на іншому пристрої, ви можете втратити дані.", "confirmleavequizonerror": "При збереженні відповідей сталася помилка. Ви впевнені, що хочете залишити тест?", "confirmstart": "Цей тест має обмеження в часі {{$a}}. Час почне відраховуватися з моменту, коли ви починаєте вашу спробу, і ви повинні будете закінчити вашу спробу допоки не спливе термін. Ви впевнені, що хочете почати зараз?", "confirmstartheader": "Тест з обмеженням в часі", "connectionerror": "Мережеве підключення втрачено. (Автозбереження не вдалося).\n\nЗапишіть відповіді введені на цій сторінці за останні кілька хвилин, потім спробуйте знову підключити.\n\nПісля того, як з'єднання буде відновлено, ваші відповіді мають бути збережені і це повідомлення зникне.", "continueattemptquiz": "Продовжити останню спробу", "continuepreview": "Продовжити останній перегляд", - "errorbehaviournotsupported": "Цей тест не може бути зроблений в додатку, тому що поведінка не підтримуються додатком:", + "errorbehaviournotsupported": "Цей тест не може бути зроблений в додатку, тому що не підтримується додатком:", "errordownloading": "Помилка при завантаженні потрібних даних.", "errorgetattempt": "Помилка при отриманні даних спроби.", "errorgetquestions": "Помилка отримання питань.", "errorgetquiz": "Помилка при отриманні даних тесту.", - "errorparsequestions": "Сталася помилка під час читання питання. Будь ласка, спроба цей тест в веб-браузері.", + "errorparsequestions": "Сталася помилка під час читання питання. Будь ласка, спробуйте цей тест в веб-браузері.", "errorquestionsnotsupported": "Цей тест не може бути вирішених в додатку, оскільки він може містити питання, які не підтримуються додатком:", - "errorrulesnotsupported": "Цей тест не може бути зроблений в додатку, оскільки він має правило доступу, що не підтримується додатком:", + "errorrulesnotsupported": "Цей тест не може бути зроблений в додатку, оскільки він має правила доступу, що не підтримується додатком:", "errorsaveattempt": "При збереженні даних спроби сталася помилка.", "errorsyncquiz": "Під час синхронізації сталася помилка. Будь ласка спробуйте ще раз.", - "errorsyncquizblocked": "Цей тест не може бути синхронізований прямо зараз через триваючий процес. Будь-ласка спробуйте пізніше. Якщо питання залишається невирішеним, спробуйте перезапустити програму.", + "errorsyncquizblocked": "Цей тест не може бути синхронізований прямо зараз через навантаження на сервер. Будь-ласка спробуйте пізніше. Якщо питання залишається невирішеним, спробуйте перезапустити програму.", "feedback": "Відгук", "finishattemptdots": "Завершити спробу...", "finishnotsynced": "Готово, але не синхронізовано", diff --git a/www/addons/mod/resource/lang/ja.json b/www/addons/mod/resource/lang/ja.json index 0637a088a01..8a0d7d9a02d 100644 --- a/www/addons/mod/resource/lang/ja.json +++ b/www/addons/mod/resource/lang/ja.json @@ -1 +1,4 @@ -[] \ No newline at end of file +{ + "errorwhileloadingthecontent": "内容を読み込み中にエラーが発生しました。", + "openthefile": "ファイルを開く" +} \ No newline at end of file diff --git a/www/addons/mod/resource/lang/sr-cr.json b/www/addons/mod/resource/lang/sr-cr.json new file mode 100644 index 00000000000..260ac7e4935 --- /dev/null +++ b/www/addons/mod/resource/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "errorwhileloadingthecontent": "Грешка приликом учитавања садржаја.", + "openthefile": "Отвори датотеку" +} \ No newline at end of file diff --git a/www/addons/mod/resource/lang/sr-lt.json b/www/addons/mod/resource/lang/sr-lt.json new file mode 100644 index 00000000000..8120d454e8a --- /dev/null +++ b/www/addons/mod/resource/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "errorwhileloadingthecontent": "Greška prilikom učitavanja sadržaja.", + "openthefile": "Otvori datoteku" +} \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/el.json b/www/addons/mod/scorm/lang/el.json index a819301fbee..e5fbfbe4a46 100644 --- a/www/addons/mod/scorm/lang/el.json +++ b/www/addons/mod/scorm/lang/el.json @@ -46,5 +46,6 @@ "scormstatusnotdownloaded": "Αυτό το SCORM δεν έχει κατέβει. Θα κατέβει αυτόματα όταν το ανοίξετε.", "scormstatusoutdated": "Αυτό το SCORM έχει τροποποιηθεί από την τελευταία λήψη. Θα κατέβει αυτόματα όταν το ανοίξετε.", "suspended": "Αναστέλλεται", + "warningofflinedatadeleted": "Ορισμένα δεδομένα εκτός σύνδεσης της προσπάθειας {{number}} διαγράφηκαν επειδή δεν ήταν δυνατή η δημιουργία νέας προσπάθειας.", "warningsynconlineincomplete": "Κάποιες προσπάθειες δεν μπόρεσαν να συγχρονιστούν με το site διότι η τελευταία online προσπάθεια δεν έχει ολοκληρωθεί. Παρακαλώ τελειώστε την online προσπάθεια πρώτα." } \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/ja.json b/www/addons/mod/scorm/lang/ja.json index df57f44b198..031b2f60a58 100644 --- a/www/addons/mod/scorm/lang/ja.json +++ b/www/addons/mod/scorm/lang/ja.json @@ -6,9 +6,19 @@ "browse": "プレビュー", "browsed": "閲覧済み", "browsemode": "プレビューモード", + "cannotcalculategrade": "評定が計算できませんでした。", "completed": "完了", "contents": "コンテンツ", + "dataattemptshown": "このデータは回答番号 {{number}} に該当します。", "enter": "問題に入る", + "errorcreateofflineattempt": "新たなオフライン回答の作成中にエラーが発生しました。再度実行してください。", + "errordownloadscorm": "SCORM \"{{name}}\" のダウンロード中にエラーが発生しました。", + "errorgetscorm": "SCORMデータの取得中にエラーが発生しました。", + "errorinvalidversion": "申し訳ありません。アプリケーションはSCORM 1.2のみをサポートしています。", + "errornotdownloadable": "あなたのMoodleサイトではSCORMパッケージのダウンロードができません。Moodleサイト管理者に連絡してください。", + "errornovalidsco": "このSCORMはロードに必要な表示できるSCOがありません。", + "errorpackagefile": "申し訳ありません。アプリケーションはZIPパッケージのみをサポートしています。", + "errorsyncscorm": "同期中にエラーが発生しました。再度実行してください。", "exceededmaxattempts": "あなたは最大受験回数に達しました。", "failed": "不合格", "firstattempt": "最初の受験", @@ -28,8 +38,14 @@ "noattemptsmade": "あなたの受験回数", "normal": "ノーマル", "notattempted": "未受験", + "offlineattemptnote": "この回答には動悸されなかったデータがあります。", + "offlineattemptovermax": "受験可能回数を超えたため、この回答を送信できません。", "organizations": "組織", "passed": "合格", "reviewmode": "レビューモード", - "suspended": "一時停止" + "scormstatusnotdownloaded": "このSCORMはダウンロードされていません。これを開くときに、自動的にダウンロードされます。", + "scormstatusoutdated": "このSCORMは最後にダウンロードされた後に更新されています。開くときに、自動的に新しいものがダウンロードされます。", + "suspended": "一時停止", + "warningofflinedatadeleted": "回答番号 {{number}} を新しい回答として作成することができなかったため、オフラインデータの一部が消去されました。", + "warningsynconlineincomplete": "最終のオンライン回答が完了していないため、一部の回答が同期できませんでした。先にオンライン回答を完了してください。" } \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/sr-cr.json b/www/addons/mod/scorm/lang/sr-cr.json new file mode 100644 index 00000000000..481c70dc534 --- /dev/null +++ b/www/addons/mod/scorm/lang/sr-cr.json @@ -0,0 +1,18 @@ +{ + "cannotcalculategrade": "Оцена не може да се израчуна.", + "dataattemptshown": "Ови подаци припадају покушају број {{number}}.", + "errorcreateofflineattempt": "Дошло је до грешке приликом покушаја креирања новог офлајн покушаја. Молимо, покушајте поново.", + "errordownloadscorm": "Грешка приликом преузимања SCORM пакета: \"{{name}}\".", + "errorgetscorm": "Грешка приликом преузимања података SCORM пакета.", + "errorinvalidversion": "Извините, апликација подржава само SCORM 1.2.", + "errornotdownloadable": "Преузимање SCORM пакета је онемогућено на вашем сајту. Молимо, обратите се администратору вашег Moodle сајта.", + "errornovalidsco": "Овај SCORM пакет нема видљив SCO који би био учитан.", + "errorpackagefile": "Извините, апликација подржава само ZIP архиве.", + "errorsyncscorm": "Дошло је до грешке приликом синхронизације. Молимо, покушајте поново.", + "offlineattemptnote": "Овај покушај има податке који нису синхронизован.", + "offlineattemptovermax": "Овај покушај не може бити послат зато што сте премашили максималан број дозвољених покушаја.", + "scormstatusnotdownloaded": "Овај SCORM пакет није преузет. Биће аутоматски преузет када га отворите.", + "scormstatusoutdated": "Овај SCORM пакет је мењан од последњег преузимања. Биће аутоматски преузет када га отворите.", + "warningofflinedatadeleted": "Неки офлајн подаци о покушају {{number}} су обрисани зато што их није могуће креирати у новом покушају.", + "warningsynconlineincomplete": "Неки покушаји нису могли бити синхронизовани са сајтом зато што последњи онлине покушај није завршен. Молимо вас да прво завршите онлајн покушај." +} \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/sr-lt.json b/www/addons/mod/scorm/lang/sr-lt.json new file mode 100644 index 00000000000..1e0cbfee595 --- /dev/null +++ b/www/addons/mod/scorm/lang/sr-lt.json @@ -0,0 +1,18 @@ +{ + "cannotcalculategrade": "Ocena ne može da se izračuna.", + "dataattemptshown": "Ovi podaci pripadaju pokušaju broj {{number}}.", + "errorcreateofflineattempt": "Došlo je do greške prilikom pokušaja kreiranja novog oflajn pokušaja. Molimo, pokušajte ponovo.", + "errordownloadscorm": "Greška prilikom preuzimanja SCORM paketa: \"{{name}}\".", + "errorgetscorm": "Greška prilikom preuzimanja podataka SCORM paketa.", + "errorinvalidversion": "Izvinite, aplikacija podržava samo SCORM 1.2.", + "errornotdownloadable": "Preuzimanje SCORM paketa je onemogućeno na vašem sajtu. Molimo, obratite se administratoru vašeg Moodle sajta.", + "errornovalidsco": "Ovaj SCORM paket nema vidljiv SCO koji bi bio učitan.", + "errorpackagefile": "Izvinite, aplikacija podržava samo ZIP arhive.", + "errorsyncscorm": "Došlo je do greške prilikom sinhronizacije. Molimo, pokušajte ponovo.", + "offlineattemptnote": "Ovaj pokušaj ima podatke koji nisu sinhronizovan.", + "offlineattemptovermax": "Ovaj pokušaj ne može biti poslat zato što ste premašili maksimalan broj dozvoljenih pokušaja.", + "scormstatusnotdownloaded": "Ovaj SCORM paket nije preuzet. Biće automatski preuzet kada ga otvorite.", + "scormstatusoutdated": "Ovaj SCORM paket je menjan od poslednjeg preuzimanja. Biće automatski preuzet kada ga otvorite.", + "warningofflinedatadeleted": "Neki oflajn podaci o pokušaju {{number}} su obrisani zato što ih nije moguće kreirati u novom pokušaju.", + "warningsynconlineincomplete": "Neki pokušaji nisu mogli biti sinhronizovani sa sajtom zato što poslednji online pokušaj nije završen. Molimo vas da prvo završite onlajn pokušaj." +} \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/uk.json b/www/addons/mod/scorm/lang/uk.json index 47edde51210..dc0f5cb8a29 100644 --- a/www/addons/mod/scorm/lang/uk.json +++ b/www/addons/mod/scorm/lang/uk.json @@ -12,7 +12,7 @@ "dataattemptshown": "Ці дані належать до спроби № {{number}}.", "enter": "Ввести", "errorcreateofflineattempt": "При створенні нового форуму сталася помилка. Будь ласка спробуйте ще раз.", - "errordownloadscorm": "Помилка завантаження SCORM: \"{{name}}\".", + "errordownloadscorm": "Помилка завантаження SCORM: \"{{name}}\".", "errorgetscorm": "Помилка отримання SCORM-даних.", "errorinvalidversion": "На жаль, додаток підтримує тільки SCORM 1.2.", "errornotdownloadable": "Завантаження SCORM пакетів відключене у вашому сайті Moodle. Будь ласка, зверніться до адміністратора сайту Moodle.", @@ -39,13 +39,13 @@ "normal": "Нормальний", "notattempted": "Не було спроб", "offlineattemptnote": "Ця спроба має дані, що не були синхронізовані.", - "offlineattemptovermax": "Ця спроба не може бути відправлена, так як ви перевершили максимальну кількість спроб.", + "offlineattemptovermax": "Ця спроба не може бути відправлена, так як ви перевищили максимальну кількість спроб.", "organizations": "Організації", "passed": "Пропущено", "reviewmode": "Режим перегляду", - "scormstatusnotdownloaded": "Це SCORM не завантажується. Він буде автоматично завантажуватися при її відкритті.", + "scormstatusnotdownloaded": "Цей SCORM не завантажений. Він буде автоматично завантажуватися при його відкритті.", "scormstatusoutdated": "Цей SCORM був змінений з моменту останнього завантаження. Він буде автоматично завантажуватися при її відкритті.", "suspended": "Заблокований", - "warningofflinedatadeleted": "Деякі автономні дані про спробу № {{number}} були видалений, тому що він не може бути створений в новій спробі.", + "warningofflinedatadeleted": "Деякі автономні дані про спробу № {{number}} були видалені, тому що вони не можуть бути створені в новій спробі.", "warningsynconlineincomplete": "Деякі спроби не можуть бути синхронізовані з сайтом, тому що онлайн спроба не закінчена. Будь ласка закінчіть спробу онлайн спершу." } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/ar.json b/www/addons/mod/survey/lang/ar.json index 30dd1d2fed3..dd271b759c7 100644 --- a/www/addons/mod/survey/lang/ar.json +++ b/www/addons/mod/survey/lang/ar.json @@ -2,5 +2,5 @@ "ifoundthat": "وجدت أن", "ipreferthat": "أفضل أن", "responses": "إجابات", - "results": "نتائج" + "results": "النتائج" } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/ja.json b/www/addons/mod/survey/lang/ja.json index 9880b35045a..35fbcedcc0d 100644 --- a/www/addons/mod/survey/lang/ja.json +++ b/www/addons/mod/survey/lang/ja.json @@ -1,4 +1,6 @@ { + "cannotsubmitsurvey": "申し訳ありません。あなたの調査提出で問題が発生しました。再度提出を実行してください。", + "errorgetsurvey": "調査データの取得中にエラーが発生しました。", "ifoundthat": "私は次のことを発見しました:", "ipreferthat": "私は次のことが好きです:", "responses": "回答", diff --git a/www/addons/mod/survey/lang/sr-cr.json b/www/addons/mod/survey/lang/sr-cr.json new file mode 100644 index 00000000000..81ed8c380d2 --- /dev/null +++ b/www/addons/mod/survey/lang/sr-cr.json @@ -0,0 +1,5 @@ +{ + "cannotsubmitsurvey": "Нажалост, било је проблема са предајом вашег упитника. Молим вас, покушајте поново.", + "errorgetsurvey": "Грешка приликом преузимања података за 'Упитник' (Survey)", + "results": "Резултати" +} \ No newline at end of file diff --git a/www/addons/mod/survey/lang/sr-lt.json b/www/addons/mod/survey/lang/sr-lt.json new file mode 100644 index 00000000000..22342db7d8a --- /dev/null +++ b/www/addons/mod/survey/lang/sr-lt.json @@ -0,0 +1,5 @@ +{ + "cannotsubmitsurvey": "Nažalost, bilo je problema sa predajom vašeg upitnika. Molim vas, pokušajte ponovo.", + "errorgetsurvey": "Greška prilikom preuzimanja podataka za 'Upitnik' (Survey)", + "results": "Rezultati" +} \ No newline at end of file diff --git a/www/addons/mod/survey/lang/uk.json b/www/addons/mod/survey/lang/uk.json index 74dd0374658..c0e91783cb7 100644 --- a/www/addons/mod/survey/lang/uk.json +++ b/www/addons/mod/survey/lang/uk.json @@ -1,6 +1,6 @@ { - "cannotsubmitsurvey": "На жаль, існує проблема представлення вашого обстеження. Будь ласка спробуйте ще раз.", - "errorgetsurvey": "Помилка при отриманні даних обстеження.", + "cannotsubmitsurvey": "На жаль, існує проблема вашого представлення. Будь ласка спробуйте ще раз.", + "errorgetsurvey": "Помилка при отриманні даних.", "ifoundthat": "Я довідався, що", "ipreferthat": "Я волію, щоб", "responses": "Відповіді", diff --git a/www/addons/mod/url/lang/ja.json b/www/addons/mod/url/lang/ja.json index 0637a088a01..350006f4a7f 100644 --- a/www/addons/mod/url/lang/ja.json +++ b/www/addons/mod/url/lang/ja.json @@ -1 +1,4 @@ -[] \ No newline at end of file +{ + "accessurl": "URLへのアクセス", + "pointingtourl": "このリソースを示すURL" +} \ No newline at end of file diff --git a/www/addons/mod/url/lang/sr-cr.json b/www/addons/mod/url/lang/sr-cr.json new file mode 100644 index 00000000000..8559de48806 --- /dev/null +++ b/www/addons/mod/url/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "accessurl": "Приступи URL адреси", + "pointingtourl": "URL адреса са којом је овај ресурс повезан" +} \ No newline at end of file diff --git a/www/addons/mod/url/lang/sr-lt.json b/www/addons/mod/url/lang/sr-lt.json new file mode 100644 index 00000000000..a266fc49df5 --- /dev/null +++ b/www/addons/mod/url/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "accessurl": "Pristupi URL adresi", + "pointingtourl": "URL adresa sa kojom je ovaj resurs povezan" +} \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/ja.json b/www/addons/mod/wiki/lang/ja.json index fbfaad517e5..602d4646668 100644 --- a/www/addons/mod/wiki/lang/ja.json +++ b/www/addons/mod/wiki/lang/ja.json @@ -2,6 +2,9 @@ "cannoteditpage": "あなたはこのページを編集できません。", "createpage": "ページを作成する", "editingpage": "このページ「 {{$a}} 」の編集", + "errorloadingpage": "ページの読み込み中にエラーが発生しました。", + "errornowikiavailable": "このwikiにはまだ内容がありません。", + "gowikihome": "Wikiのホームへ移動", "map": "マップ", "newpagehdr": "新しいページ", "newpagetitle": "新しいページタイトル", @@ -10,5 +13,9 @@ "page": "ページ", "pageexists": "このページはすでに存在します。", "pagename": "ページ名", + "subwiki": "サブwiki", + "titleshouldnotbeempty": "空のタイトルは受け付けられません", + "viewpage": "ページを表示", + "wikipage": "Wikiページ", "wrongversionlock": "あなたが編集している間、別のユーザがこのページを編集しました。そのため、あなたのコンテンツは古くなりました。" } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/sr-cr.json b/www/addons/mod/wiki/lang/sr-cr.json new file mode 100644 index 00000000000..8a152b69a6d --- /dev/null +++ b/www/addons/mod/wiki/lang/sr-cr.json @@ -0,0 +1,10 @@ +{ + "errorloadingpage": "Дошло је до грешке приликом учитавања странице.", + "errornowikiavailable": "Овај вики још увек нема садржај.", + "gowikihome": "Иди на почетну страницу викија", + "page": "Страница", + "subwiki": "Подвики", + "titleshouldnotbeempty": "Наслов не би требало да буде празан", + "viewpage": "Погледај страницу", + "wikipage": "Вики страница" +} \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/sr-lt.json b/www/addons/mod/wiki/lang/sr-lt.json new file mode 100644 index 00000000000..e8ced77df30 --- /dev/null +++ b/www/addons/mod/wiki/lang/sr-lt.json @@ -0,0 +1,10 @@ +{ + "errorloadingpage": "Došlo je do greške prilikom učitavanja stranice.", + "errornowikiavailable": "Ovaj viki još uvek nema sadržaj.", + "gowikihome": "Idi na početnu stranicu vikija", + "page": "Stranica", + "subwiki": "Podviki", + "titleshouldnotbeempty": "Naslov ne bi trebalo da bude prazan", + "viewpage": "Pogledaj stranicu", + "wikipage": "Viki stranica" +} \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/uk.json b/www/addons/mod/wiki/lang/uk.json index c19abe51cb9..cd89e56c9cc 100644 --- a/www/addons/mod/wiki/lang/uk.json +++ b/www/addons/mod/wiki/lang/uk.json @@ -13,7 +13,7 @@ "page": "Сторінка", "pageexists": "Ця сторінка вже існує. Перенаправити до неї.", "pagename": "Назва сторінки", - "subwiki": "Сабвікі", + "subwiki": "Субвікі", "titleshouldnotbeempty": "Заголовок не може бути порожнім", "viewpage": "Переглянути сторінку", "wikipage": "Вікі-сторінка", diff --git a/www/addons/notes/lang/ar.json b/www/addons/notes/lang/ar.json index df8de0cf069..30b58e0c705 100644 --- a/www/addons/notes/lang/ar.json +++ b/www/addons/notes/lang/ar.json @@ -2,7 +2,7 @@ "addnewnote": "إضافة ملاحظة جديدة", "coursenotes": "ملاحظات المقرر الدراسي", "note": "ملحوظة", - "notes": "تحليلك وملاحظاتك الخاصة", + "notes": "ملاحظات", "personalnotes": "ملاحظات شخصية", "publishstate": "السياق", "sitenotes": "ملاحظات الموقع" diff --git a/www/addons/notes/lang/da.json b/www/addons/notes/lang/da.json index cf35362b164..3dadb18f0eb 100644 --- a/www/addons/notes/lang/da.json +++ b/www/addons/notes/lang/da.json @@ -4,7 +4,7 @@ "eventnotecreated": "Note oprettet", "nonotes": "Der er endnu ingen noter af denne type", "note": "Note", - "notes": "Dine private kommentarer og noter", + "notes": "Noter", "personalnotes": "Personlige noter", "publishstate": "Sammenhæng", "sitenotes": "Webstedsnoter", diff --git a/www/addons/notes/lang/he.json b/www/addons/notes/lang/he.json index 2e3c5dd9644..416427b2dec 100644 --- a/www/addons/notes/lang/he.json +++ b/www/addons/notes/lang/he.json @@ -4,7 +4,7 @@ "eventnotecreated": "הערה נוצרה", "nonotes": "עדיין לא קיימות הערות מסוג זה", "note": "הערה", - "notes": "ההערות והניתוח הפרטיים שלך.", + "notes": "הערות", "personalnotes": "הערות אישיות", "publishstate": "תוכן", "sitenotes": "הערות אתר", diff --git a/www/addons/notes/lang/ja.json b/www/addons/notes/lang/ja.json index 31c68f19f28..6b3304c8067 100644 --- a/www/addons/notes/lang/ja.json +++ b/www/addons/notes/lang/ja.json @@ -1,10 +1,13 @@ { - "addnewnote": "新しいノートを追加する", + "addnewnote": "新しいノートを追加", "coursenotes": "コースノート", - "eventnotecreated": "ノートが作成されました。", + "eventnotecreated": "作成したノート", + "nonotes": "このタイプのノートはまだ存在しません", "note": "ノート", - "notes": "あなたの個人分析およびノート", + "notes": "ノート", "personalnotes": "パーソナルノート", - "publishstate": "コンテクスト", - "sitenotes": "サイトノート" + "publishstate": "コンテキスト", + "sitenotes": "サイトノート", + "userwithid": "ID {{id}} のユーザ", + "warningnotenotsent": "コース {{course}} にノートを追加することができません。 {{error}}" } \ No newline at end of file diff --git a/www/addons/notes/lang/sr-cr.json b/www/addons/notes/lang/sr-cr.json new file mode 100644 index 00000000000..0690900c3c5 --- /dev/null +++ b/www/addons/notes/lang/sr-cr.json @@ -0,0 +1,13 @@ +{ + "addnewnote": "Додај нову белешку", + "coursenotes": "Белешке курса", + "eventnotecreated": "Белешка креирана", + "nonotes": "Још не постоје белешке овог типа", + "note": "Белешка", + "notes": "Белешке", + "personalnotes": "Личне белешке", + "publishstate": "Контекст", + "sitenotes": "Белешке сајта", + "userwithid": "Корисник са ID ознаком {{id}}", + "warningnotenotsent": "Није могуће додати белешку/е курсу {{course}}. {{error}}" +} \ No newline at end of file diff --git a/www/addons/notes/lang/sr-lt.json b/www/addons/notes/lang/sr-lt.json new file mode 100644 index 00000000000..d4a1ef87e7f --- /dev/null +++ b/www/addons/notes/lang/sr-lt.json @@ -0,0 +1,13 @@ +{ + "addnewnote": "Dodaj novu belešku", + "coursenotes": "Beleške kursa", + "eventnotecreated": "Beleška kreirana", + "nonotes": "Još ne postoje beleške ovog tipa", + "note": "Beleška", + "notes": "Beleške", + "personalnotes": "Lične beleške", + "publishstate": "Kontekst", + "sitenotes": "Beleške sajta", + "userwithid": "Korisnik sa ID oznakom {{id}}", + "warningnotenotsent": "Nije moguće dodati belešku/e kursu {{course}}. {{error}}" +} \ No newline at end of file diff --git a/www/addons/notes/lang/uk.json b/www/addons/notes/lang/uk.json index 8f58e17054e..8c815080c16 100644 --- a/www/addons/notes/lang/uk.json +++ b/www/addons/notes/lang/uk.json @@ -9,5 +9,5 @@ "publishstate": "Контекст", "sitenotes": "Записки сайту", "userwithid": "Користувач з Id {{id}}", - "warningnotenotsent": "Неможливо додати записку до курсу{{course}}. {{error}}" + "warningnotenotsent": "Неможливо додати записку до курсу {{course}}. {{error}}" } \ No newline at end of file diff --git a/www/addons/notifications/lang/ar.json b/www/addons/notifications/lang/ar.json index cab5daac101..edbc8f11446 100644 --- a/www/addons/notifications/lang/ar.json +++ b/www/addons/notifications/lang/ar.json @@ -1,5 +1,5 @@ { "errorgetnotifications": "خطأ في الحصول على الإشعارات", - "notifications": "إشعارات", + "notifications": "الإشعارات", "therearentnotificationsyet": "لا توجد إشعارات" } \ No newline at end of file diff --git a/www/addons/notifications/lang/da.json b/www/addons/notifications/lang/da.json index 2e190040f35..56219f0789c 100644 --- a/www/addons/notifications/lang/da.json +++ b/www/addons/notifications/lang/da.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Fejl ved hentning af underretninger", "notificationpreferences": "Indstillinger for underretninger", - "notifications": "Beskeder", + "notifications": "Underretninger", "therearentnotificationsyet": "Der er ingen underretninger" } \ No newline at end of file diff --git a/www/addons/notifications/lang/de.json b/www/addons/notifications/lang/de.json index 6dc2a08c68c..b89ba1477d5 100644 --- a/www/addons/notifications/lang/de.json +++ b/www/addons/notifications/lang/de.json @@ -2,6 +2,6 @@ "errorgetnotifications": "Fehler beim Laden der Mitteilungen", "notificationpreferences": "Systemmitteilungen", "notifications": "Systemmitteilungen", - "playsound": "Audio abspielen", + "playsound": "Sound abspielen", "therearentnotificationsyet": "Keine Mitteilungen" } \ No newline at end of file diff --git a/www/addons/notifications/lang/el.json b/www/addons/notifications/lang/el.json index 287c60968cc..d5d645008b8 100644 --- a/www/addons/notifications/lang/el.json +++ b/www/addons/notifications/lang/el.json @@ -2,5 +2,6 @@ "errorgetnotifications": "Σφάλμα κατά τη λήψη ειδοποιήσεων", "notificationpreferences": "Προτιμήσεις ειδοποιήσεων", "notifications": "Ειδοποιήσεις", + "playsound": "Αναπαραγωγή ήχου", "therearentnotificationsyet": "Δεν υπάρχουν ειδοποιήσεις" } \ No newline at end of file diff --git a/www/addons/notifications/lang/es.json b/www/addons/notifications/lang/es.json index e73e272de69..db11ade05af 100644 --- a/www/addons/notifications/lang/es.json +++ b/www/addons/notifications/lang/es.json @@ -2,5 +2,6 @@ "errorgetnotifications": "Error al obtener notificaciones", "notificationpreferences": "Preferencias de notificaciones", "notifications": "Notificaciones", + "playsound": "Reproducir sonido", "therearentnotificationsyet": "No hay notificaciones" } \ No newline at end of file diff --git a/www/addons/notifications/lang/fr.json b/www/addons/notifications/lang/fr.json index edb4a631896..f5c2621dbba 100644 --- a/www/addons/notifications/lang/fr.json +++ b/www/addons/notifications/lang/fr.json @@ -2,5 +2,6 @@ "errorgetnotifications": "Erreur lors de la récupération des notifications.", "notificationpreferences": "Préférences de notification", "notifications": "Notifications", + "playsound": "Jouer le son", "therearentnotificationsyet": "Aucune notification" } \ No newline at end of file diff --git a/www/addons/notifications/lang/he.json b/www/addons/notifications/lang/he.json index 39e5a6ed7a5..1c1591b94ed 100644 --- a/www/addons/notifications/lang/he.json +++ b/www/addons/notifications/lang/he.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "שגיאה בטעינת התראות", "notificationpreferences": "העדפות הודעות", - "notifications": "עדכונים והודעות", + "notifications": "התראות", "therearentnotificationsyet": "אין התראות" } \ No newline at end of file diff --git a/www/addons/notifications/lang/ja.json b/www/addons/notifications/lang/ja.json index a253cfba0ae..22daa00358e 100644 --- a/www/addons/notifications/lang/ja.json +++ b/www/addons/notifications/lang/ja.json @@ -1,5 +1,7 @@ { - "notificationpreferences": "通知プリファレンス", + "errorgetnotifications": "通知の取得中にエラーが発生しました。", + "notificationpreferences": "通知の設定", "notifications": "通知", + "playsound": "音を出力", "therearentnotificationsyet": "通知はありません" } \ No newline at end of file diff --git a/www/addons/notifications/lang/ru.json b/www/addons/notifications/lang/ru.json index 46e6247828f..3bb79943f46 100644 --- a/www/addons/notifications/lang/ru.json +++ b/www/addons/notifications/lang/ru.json @@ -2,5 +2,6 @@ "errorgetnotifications": "Ошибка получения уведомления", "notificationpreferences": "Настройка уведомлений", "notifications": "Уведомления", + "playsound": "Проигрывать звук", "therearentnotificationsyet": "Уведомлений нет" } \ No newline at end of file diff --git a/www/addons/notifications/lang/sr-cr.json b/www/addons/notifications/lang/sr-cr.json new file mode 100644 index 00000000000..f45f0611020 --- /dev/null +++ b/www/addons/notifications/lang/sr-cr.json @@ -0,0 +1,7 @@ +{ + "errorgetnotifications": "Грешка приликом преузимања обавештења", + "notificationpreferences": "Параметри обавештења", + "notifications": "Обавештења", + "playsound": "Репродукуј звук", + "therearentnotificationsyet": "Нема обавештења" +} \ No newline at end of file diff --git a/www/addons/notifications/lang/sr-lt.json b/www/addons/notifications/lang/sr-lt.json new file mode 100644 index 00000000000..74bfd3d17cb --- /dev/null +++ b/www/addons/notifications/lang/sr-lt.json @@ -0,0 +1,7 @@ +{ + "errorgetnotifications": "Greška prilikom preuzimanja obaveštenja", + "notificationpreferences": "Parametri obaveštenja", + "notifications": "Obaveštenja", + "playsound": "Reprodukuj zvuk", + "therearentnotificationsyet": "Nema obaveštenja" +} \ No newline at end of file diff --git a/www/addons/participants/lang/ar.json b/www/addons/participants/lang/ar.json index 91db007489d..8c013f870e2 100644 --- a/www/addons/participants/lang/ar.json +++ b/www/addons/participants/lang/ar.json @@ -1,4 +1,4 @@ { "noparticipants": "لم يتم العثور على مشاركين في هذا المقرر الدراسي", - "participants": "المشتركون" + "participants": "المشاركين" } \ No newline at end of file diff --git a/www/addons/participants/lang/ja.json b/www/addons/participants/lang/ja.json index 8fbbcbb3976..3656df9f659 100644 --- a/www/addons/participants/lang/ja.json +++ b/www/addons/participants/lang/ja.json @@ -1,4 +1,4 @@ { - "noparticipants": "このコースには参加者が登録されていません。", + "noparticipants": "このコースには参加者がいません。", "participants": "参加者" } \ No newline at end of file diff --git a/www/addons/participants/lang/sr-cr.json b/www/addons/participants/lang/sr-cr.json new file mode 100644 index 00000000000..5c5170c3c41 --- /dev/null +++ b/www/addons/participants/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "noparticipants": "Ниједан учесник није пронађен на овом курсу.", + "participants": "Учесници" +} \ No newline at end of file diff --git a/www/addons/participants/lang/sr-lt.json b/www/addons/participants/lang/sr-lt.json new file mode 100644 index 00000000000..090378abb39 --- /dev/null +++ b/www/addons/participants/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "noparticipants": "Nijedan učesnik nije pronađen na ovom kursu.", + "participants": "Učesnici" +} \ No newline at end of file diff --git a/www/config.json b/www/config.json index 7ce5ad6b66f..c280d2f83fd 100644 --- a/www/config.json +++ b/www/config.json @@ -6,7 +6,7 @@ "versionname" : "3.3.0", "cache_expiration_time" : 300000, "default_lang" : "en", - "languages": {"ar": "عربي", "bg": "Български", "ca": "Català", "cs": "Čeština", "da": "Dansk", "de": "Deutsch", "el": "Ελληνικά", "en": "English", "es": "Español", "es-mx": "Español - México", "eu": "Euskara", "fa": "فارسی", "fr" : "Français", "he" : "עברית", "hu": "magyar", "it": "Italiano", "ja": "日本語","nl": "Nederlands", "pl": "Polski", "pt-br": "Português - Brasil", "pt": "Português - Portugal", "ro": "Română", "ru": "Русский", "sv": "Svenska", "tr" : "Türkçe", "uk" : "Українська", "zh-cn" : "简体中文", "zh-tw" : "正體中文"}, + "languages": {"ar": "عربي", "bg": "Български", "ca": "Català", "cs": "Čeština", "da": "Dansk", "de": "Deutsch", "el": "Ελληνικά", "en": "English", "es": "Español", "es-mx": "Español - México", "eu": "Euskara", "fa": "فارسی", "fr" : "Français", "he" : "עברית", "hu": "magyar", "it": "Italiano", "lt" : "Lietuvių", "ja": "日本語","nl": "Nederlands", "pl": "Polski", "pt-br": "Português - Brasil", "pt": "Português - Portugal", "ro": "Română", "ru": "Русский", "sr-cr": "Српски", "sr-lt": "Srpski", "sv": "Svenska", "tr" : "Türkçe", "uk" : "Українська", "zh-cn" : "简体中文", "zh-tw" : "正體中文"}, "wsservice" : "moodle_mobile_app", "wsextservice" : "local_mobile", "demo_sites": {"student": {"url": "http://school.demo.moodle.net", "username": "student", "password": "moodle"}, "teacher": {"url": "http://school.demo.moodle.net", "username": "teacher", "password": "moodle"}, "cva": {"url": "http://mm.cvaconsulting.com/moodle", "username": "student", "password": "student"}}, diff --git a/www/core/components/contentlinks/lang/ja.json b/www/core/components/contentlinks/lang/ja.json new file mode 100644 index 00000000000..625c4385040 --- /dev/null +++ b/www/core/components/contentlinks/lang/ja.json @@ -0,0 +1,7 @@ +{ + "chooseaccount": "アカウントの選択", + "chooseaccounttoopenlink": "リンクを開くアカウントを選択してください。", + "confirmurlothersite": "このリンクは別のサイトに属しています。本当に開きますか?", + "errornoactions": "このリンクを実行するためのアクションが見つかりませんでした。", + "errornosites": "このリンクをもつサイトが見つかりませんでした。" +} \ No newline at end of file diff --git a/www/core/components/contentlinks/lang/sr-cr.json b/www/core/components/contentlinks/lang/sr-cr.json new file mode 100644 index 00000000000..9091dad7d56 --- /dev/null +++ b/www/core/components/contentlinks/lang/sr-cr.json @@ -0,0 +1,7 @@ +{ + "chooseaccount": "Изабери налог", + "chooseaccounttoopenlink": "Изаберите налог са којим треба отворити линк.", + "confirmurlothersite": "Овај линк припада другом сајту. Да ли желите да га отворите?", + "errornoactions": "Није могуће пронаћи акцију коју треба извести са овим линком.", + "errornosites": "Није могуће пронаћи било који сајт који може изаћи на крај са овим линком." +} \ No newline at end of file diff --git a/www/core/components/contentlinks/lang/sr-lt.json b/www/core/components/contentlinks/lang/sr-lt.json new file mode 100644 index 00000000000..2d375d7a366 --- /dev/null +++ b/www/core/components/contentlinks/lang/sr-lt.json @@ -0,0 +1,7 @@ +{ + "chooseaccount": "Izaberi nalog", + "chooseaccounttoopenlink": "Izaberite nalog sa kojim treba otvoriti link.", + "confirmurlothersite": "Ovaj link pripada drugom sajtu. Da li želite da ga otvorite?", + "errornoactions": "Nije moguće pronaći akciju koju treba izvesti sa ovim linkom.", + "errornosites": "Nije moguće pronaći bilo koji sajt koji može izaći na kraj sa ovim linkom." +} \ No newline at end of file diff --git a/www/core/components/contentlinks/lang/uk.json b/www/core/components/contentlinks/lang/uk.json index a759354d9f2..7ee18752677 100644 --- a/www/core/components/contentlinks/lang/uk.json +++ b/www/core/components/contentlinks/lang/uk.json @@ -2,6 +2,6 @@ "chooseaccount": "Виберіть аккаунт", "chooseaccounttoopenlink": "Виберіть обліковий запис, щоб відкрити посилання.", "confirmurlothersite": "Це посилання відноситься до іншого місця. Ви хочете відкрити?", - "errornoactions": "Не вдалося знайти дію, яка виконує за цим посиланням.", + "errornoactions": "Не вдалося знайти дію, яка виконується за цим посиланням.", "errornosites": "Не вдалося знайти сайт, щоб впоратися з цим посиланням." } \ No newline at end of file diff --git a/www/core/components/course/lang/ar.json b/www/core/components/course/lang/ar.json index 47a7f04e4bb..ab7fafab59b 100644 --- a/www/core/components/course/lang/ar.json +++ b/www/core/components/course/lang/ar.json @@ -1,8 +1,8 @@ { "allsections": "كل الأقسام", - "contents": "محتويات", + "contents": "المحتويات", "couldnotloadsections": "لم يتم تحميل كل الأقسام، من فضلك حاول مرة أخرى لاحقاَ", "errordownloadingsection": "خطأ عن تنزيل الأقسام", "hiddenfromstudents": "مخفي عن الطلاب", - "showall": "عرض الكل {{$a}}" + "showall": "عرض الكل" } \ No newline at end of file diff --git a/www/core/components/course/lang/da.json b/www/core/components/course/lang/da.json index 2d70a448b4f..9242ee4ca2d 100644 --- a/www/core/components/course/lang/da.json +++ b/www/core/components/course/lang/da.json @@ -9,5 +9,5 @@ "hiddenfromstudents": "Skjult for studerende", "nocontentavailable": "Intet indhold tilgængeligt lige nu.", "overriddennotice": "Din endelige karakter fra denne aktivitet blev justeret manuelt.", - "showall": "Vis alle {{$a}}" + "showall": "Vis alt" } \ No newline at end of file diff --git a/www/core/components/course/lang/el.json b/www/core/components/course/lang/el.json index 5882734e565..ee4ca9da68c 100644 --- a/www/core/components/course/lang/el.json +++ b/www/core/components/course/lang/el.json @@ -1,4 +1,5 @@ { + "activitydisabled": "Ο οργανισμός σας απενεργοποίησε αυτήν την δραστηριότητα στην εφαρμογή για κινητά.", "activitynotyetviewableinapp": "Εργαζόμαστε για την υποστήριξη της δραστηριότητας {{$a}} .", "activitynotyetviewableremoteaddon": "Ο οργανισμός σας εγκατέστησε ένα plugin που δεν υποστηρίζεται ακόμη.", "activitynotyetviewablesiteupgradeneeded": "Η πλατφόρμα Moodle του οργανισμού σας πρέπει να αναβαθμιστεί.", diff --git a/www/core/components/course/lang/es.json b/www/core/components/course/lang/es.json index 40087d97665..f674129afed 100644 --- a/www/core/components/course/lang/es.json +++ b/www/core/components/course/lang/es.json @@ -1,4 +1,5 @@ { + "activitydisabled": "Su organización ha deshabilitado esta actividad en la aplicación móvil.", "activitynotyetviewableinapp": "Estamos trabajando para soportar la actividad de {{$a}}.", "activitynotyetviewableremoteaddon": "Esta actividad es un complemento de terceros que todavía no está soportada por la aplicación.", "activitynotyetviewablesiteupgradeneeded": "El sitio no está usando la versión más reciente de Moodle. Por favor, contacte al administrador del sitio.", diff --git a/www/core/components/course/lang/he.json b/www/core/components/course/lang/he.json index 413e5343000..1789a2e476e 100644 --- a/www/core/components/course/lang/he.json +++ b/www/core/components/course/lang/he.json @@ -6,5 +6,5 @@ "hiddenfromstudents": "מוסתר בפני סטודנטים", "nocontentavailable": "אין תוכן זמין כרגע.", "overriddennotice": "הציון הסופי שלך מפעילות זו הותאם ידנית.", - "showall": "תצוגת כל ה-{{$a}}" + "showall": "הראה הכל" } \ No newline at end of file diff --git a/www/core/components/course/lang/ja.json b/www/core/components/course/lang/ja.json index 2e41ef36acc..2059fb9fb13 100644 --- a/www/core/components/course/lang/ja.json +++ b/www/core/components/course/lang/ja.json @@ -3,5 +3,5 @@ "contents": "コンテンツ", "hiddenfromstudents": "学生から非表示", "overriddennotice": "この活動に関するあなたの評点は手動で調整されました。", - "showall": "すべての {{$a}} を表示する" + "showall": "すべて表示" } \ No newline at end of file diff --git a/www/core/components/course/lang/sr-cr.json b/www/core/components/course/lang/sr-cr.json new file mode 100644 index 00000000000..3ee4f3ebe39 --- /dev/null +++ b/www/core/components/course/lang/sr-cr.json @@ -0,0 +1,20 @@ +{ + "activitydisabled": "Ваша институција је онемогућила ову активност у мобилној апликацији.", + "activitynotyetviewableinapp": "Радимо на подршци за активност {{$a}}.", + "activitynotyetviewableremoteaddon": "Ваша институција је инсталирала додатак који још увек није подржан.", + "activitynotyetviewablesiteupgradeneeded": "Потребно је да се ажурира Moodle инсталација ваше институције.", + "allsections": "Све секције", + "askadmintosupport": "Обратите се администратору сајта и реците му да желите да користите ову активност са Moodle Mobile апликацијом.", + "confirmdeletemodulefiles": "Да ли сте сигурни да желите да избришете датотеке овог модула?", + "confirmdownload": "Намеравате да преузмете {{size}}. Да ли сте сигурни да желите да наставите?", + "confirmdownloadunknownsize": "Нисмо могли да израчунамо величину преузимање. Да ли сте сигурни да желите да преузмете?", + "confirmpartialdownloadsize": "Намеравате да преузмете најмање {{size}}. Да ли сте сигурни да желите да наставите?", + "contents": "Садржаји", + "couldnotloadsectioncontent": "Није могуће учитати садржај секције, покушајте поново касније.", + "couldnotloadsections": "Није могуће учитати секције, покушајте поново касније.", + "errordownloadingsection": "Грешка приликом преузимања секције.", + "errorgetmodule": "Грешка приликом преузимања података модула.", + "nocontentavailable": "Никакав садржај није доступан у овом тренутку.", + "showall": "Прикажи све", + "useactivityonbrowser": "Још увек можете да га користите помоћу веб читача вашег уређаја." +} \ No newline at end of file diff --git a/www/core/components/course/lang/sr-lt.json b/www/core/components/course/lang/sr-lt.json new file mode 100644 index 00000000000..97d89d52dc2 --- /dev/null +++ b/www/core/components/course/lang/sr-lt.json @@ -0,0 +1,20 @@ +{ + "activitydisabled": "Vaša institucija je onemogućila ovu aktivnost u mobilnoj aplikaciji.", + "activitynotyetviewableinapp": "Radimo na podršci za aktivnost {{$a}}.", + "activitynotyetviewableremoteaddon": "Vaša institucija je instalirala dodatak koji još uvek nije podržan.", + "activitynotyetviewablesiteupgradeneeded": "Potrebno je da se ažurira Moodle instalacija vaše institucije.", + "allsections": "Sve sekcije", + "askadmintosupport": "Obratite se administratoru sajta i recite mu da želite da koristite ovu aktivnost sa Moodle Mobile aplikacijom.", + "confirmdeletemodulefiles": "Da li ste sigurni da želite da izbrišete datoteke ovog modula?", + "confirmdownload": "Nameravate da preuzmete {{size}}. Da li ste sigurni da želite da nastavite?", + "confirmdownloadunknownsize": "Nismo mogli da izračunamo veličinu preuzimanje. Da li ste sigurni da želite da preuzmete?", + "confirmpartialdownloadsize": "Nameravate da preuzmete najmanje {{size}}. Da li ste sigurni da želite da nastavite?", + "contents": "Sadržaji", + "couldnotloadsectioncontent": "Nije moguće učitati sadržaj sekcije, pokušajte ponovo kasnije.", + "couldnotloadsections": "Nije moguće učitati sekcije, pokušajte ponovo kasnije.", + "errordownloadingsection": "Greška prilikom preuzimanja sekcije.", + "errorgetmodule": "Greška prilikom preuzimanja podataka modula.", + "nocontentavailable": "Nikakav sadržaj nije dostupan u ovom trenutku.", + "showall": "Prikaži sve", + "useactivityonbrowser": "Još uvek možete da ga koristite pomoću veb čitača vašeg uređaja." +} \ No newline at end of file diff --git a/www/core/components/course/lang/uk.json b/www/core/components/course/lang/uk.json index f1e7e1b958b..232aa47f117 100644 --- a/www/core/components/course/lang/uk.json +++ b/www/core/components/course/lang/uk.json @@ -1,10 +1,10 @@ { "activitydisabled": "Ваша організація відключила цю активність в мобільному додатку.", - "activitynotyetviewableinapp": "Ми працюємо на підтримку {{$a}} діяльності.", + "activitynotyetviewableinapp": "Ми працюємо на підтримку діяльності {{$a}}.", "activitynotyetviewableremoteaddon": "Ваша організація встановила плагін, який ще не підтримується.", - "activitynotyetviewablesiteupgradeneeded": "Установка Moodle вашої організації повинна бути оновлена.", + "activitynotyetviewablesiteupgradeneeded": "Установка версія Moodle вашої організації повинна бути оновлена.", "allsections": "Всі секції", - "askadmintosupport": "Зверніться до адміністратора сайту і скажіть їм, що ви хочете використовувати цю діяльність з додатком Moodle Mobile.", + "askadmintosupport": "Зверніться до адміністратора сайту і скажіть, що ви хочете використовувати цю діяльність з додатком Moodle Mobile.", "confirmdeletemodulefiles": "Ви впевнені, що хочете видалити цей модуль?", "confirmdownload": "Ви збираєтеся завантажити {{size}}. Ви впевнені, що хочете продовжити?", "confirmdownloadunknownsize": "Ми не змогли розрахувати розмір файлу. Ви впевнені, що ви хочете завантажити?", diff --git a/www/core/components/courses/lang/da.json b/www/core/components/courses/lang/da.json index f5f007f4d13..506a637348d 100644 --- a/www/core/components/courses/lang/da.json +++ b/www/core/components/courses/lang/da.json @@ -11,12 +11,12 @@ "filtermycourses": "Filtrer mit kursus", "frontpage": "Forside", "mycourses": "Mine kurser", - "nocourses": "Du er ikke tilmeldt nogen kurser.", + "nocourses": "Der er ingen kursusoplysninger at vise.", "nocoursesyet": "Der er ingen kurser i denne kategori", - "nosearchresults": "Der var ingen beskeder der opfyldte søgekriteriet", + "nosearchresults": "Din søgning gav ingen resultater", "notenroled": "Du er ikke tilmeldt dette kursus", "notenrollable": "Du kan ikke selv tilmelde dig dette kursus.", - "password": "Delt hemmelig streng", + "password": "Tilmeldingsnøgle", "search": "Søg", "searchcourses": "Søg efter kurser", "searchcoursesadvice": "Du kan bruge knappen kursussøgning for at få adgang som gæst eller tilmelde dig kurser der tillader det.", diff --git a/www/core/components/courses/lang/el.json b/www/core/components/courses/lang/el.json index def66c4256d..127c3fcdd83 100644 --- a/www/core/components/courses/lang/el.json +++ b/www/core/components/courses/lang/el.json @@ -1,10 +1,12 @@ { "allowguests": "Σε αυτό το μάθημα επιτρέπονται και οι επισκέπτες", "availablecourses": "Διαθέσιμα Μαθήματα", + "cannotretrievemorecategories": "Δεν είναι δυνατή η ανάκτηση κατηγοριών μετά από το επίπεδο {{$a}}.", "categories": "Κατηγορίες μαθημάτων", "confirmselfenrol": "Είστε σίγουροι ότι θέλετε να εγγραφείτε σε αυτό το μάθημα;", "courses": "Μαθήματα", "enrolme": "Εγγραφή", + "errorloadcategories": "Παρουσιάστηκε σφάλμα κατά την φόρτωση των κατηγοριών.", "errorloadcourses": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση των μαθημάτων.", "errorsearching": "Παρουσιάστηκε σφάλμα κατά τη διάρκεια της αναζήτησης.", "errorselfenrol": "Παρουσιάστηκε σφάλμα κατά τη διάρκεια της αυτο-εγγραφής.", diff --git a/www/core/components/courses/lang/es.json b/www/core/components/courses/lang/es.json index c631db3a6aa..92337d9e248 100644 --- a/www/core/components/courses/lang/es.json +++ b/www/core/components/courses/lang/es.json @@ -1,10 +1,12 @@ { "allowguests": "Este curso permite la entrada de invitados", "availablecourses": "Cursos disponibles", + "cannotretrievemorecategories": "No se pueden recuperar categorías más profundas que el nivel {{$a}}.", "categories": "Categorías", "confirmselfenrol": "¿Está seguro que desea auto-matricularse en este curso?", "courses": "Cursos", "enrolme": "Matricularme", + "errorloadcategories": "Ocurrió un error al cargar categorías.", "errorloadcourses": "Se ha producido un error cargando los cursos.", "errorsearching": "Se ha producido un error durante la búsqueda.", "errorselfenrol": "Se ha producido un error durante la auto-matriculación.", diff --git a/www/core/components/courses/lang/ru.json b/www/core/components/courses/lang/ru.json index 60a255745fb..03db819ba08 100644 --- a/www/core/components/courses/lang/ru.json +++ b/www/core/components/courses/lang/ru.json @@ -5,6 +5,7 @@ "courses": "Курсы", "enrolme": "Записаться на курс", "errorloadcourses": "При загрузке курсов произошла ошибка.", + "filtermycourses": "Поиск моих курсов", "frontpage": "Главная страница", "mycourses": "Мои курсы", "nocourses": "Нет информации для отображения.", diff --git a/www/core/components/courses/lang/sr-cr.json b/www/core/components/courses/lang/sr-cr.json new file mode 100644 index 00000000000..a45b33d0d74 --- /dev/null +++ b/www/core/components/courses/lang/sr-cr.json @@ -0,0 +1,19 @@ +{ + "cannotretrievemorecategories": "Категорије које су испод нивоа {{$a}} не могу се преузети.", + "confirmselfenrol": "Да ли сте сигурни да желите да се упишете на овај курс?", + "enrolme": "Упиши ме", + "errorloadcategories": "Дошло је до грешке приликом учитавања категорија.", + "errorloadcourses": "Дошло је до грешке приликом учитавања курсева.", + "errorsearching": "Дошло је до грешке приликом претраживања.", + "errorselfenrol": "Дошло је до грешке приликом покушаја самосталног уписа.", + "filtermycourses": "Филтрирај моје курсеве", + "frontpage": "Насловна страница", + "nocourses": "Нема информација о курсевима за приказ.", + "nosearchresults": "Није било резултата ваше претраге", + "notenroled": "Нисте уписани на овај курс", + "notenrollable": "Не можете сами да се упишете на овај курс.", + "password": "Приступна лозинка курса", + "searchcoursesadvice": "Можете користити дугме за претрагу курсева како бисте им приступили као гост или се уписали на курсеве који то допуштају.", + "selfenrolment": "Самостални упис", + "totalcoursesearchresults": "Укупно курсева: {{$a}}" +} \ No newline at end of file diff --git a/www/core/components/courses/lang/sr-lt.json b/www/core/components/courses/lang/sr-lt.json new file mode 100644 index 00000000000..65613c906bb --- /dev/null +++ b/www/core/components/courses/lang/sr-lt.json @@ -0,0 +1,19 @@ +{ + "cannotretrievemorecategories": "Kategorije koje su ispod nivoa {{$a}} ne mogu se preuzeti.", + "confirmselfenrol": "Da li ste sigurni da želite da se upišete na ovaj kurs?", + "enrolme": "Upiši me", + "errorloadcategories": "Došlo je do greške prilikom učitavanja kategorija.", + "errorloadcourses": "Došlo je do greške prilikom učitavanja kurseva.", + "errorsearching": "Došlo je do greške prilikom pretraživanja.", + "errorselfenrol": "Došlo je do greške prilikom pokušaja samostalnog upisa.", + "filtermycourses": "Filtriraj moje kurseve", + "frontpage": "Naslovna stranica", + "nocourses": "Nema informacija o kursevima za prikaz.", + "nosearchresults": "Nije bilo rezultata vaše pretrage", + "notenroled": "Niste upisani na ovaj kurs", + "notenrollable": "Ne možete sami da se upišete na ovaj kurs.", + "password": "Pristupna lozinka kursa", + "searchcoursesadvice": "Možete koristiti dugme za pretragu kurseva kako biste im pristupili kao gost ili se upisali na kurseve koji to dopuštaju.", + "selfenrolment": "Samostalni upis", + "totalcoursesearchresults": "Ukupno kurseva: {{$a}}" +} \ No newline at end of file diff --git a/www/core/components/courses/lang/uk.json b/www/core/components/courses/lang/uk.json index 2821e8d6a72..e21fe775615 100644 --- a/www/core/components/courses/lang/uk.json +++ b/www/core/components/courses/lang/uk.json @@ -18,10 +18,10 @@ "nosearchresults": "Ніяких результатів пошуку", "notenroled": "Ви не зареєстровані в цьому курсі", "notenrollable": "Ви не можете зареєструвати себе в цьому курсі.", - "password": "ключ подачі заявок", + "password": "Ключ подачі заявок", "search": "Знайти", "searchcourses": "Пошук курсів", - "searchcoursesadvice": "Ви можете використовувати кнопку пошуку курсів, щоб отримати доступ в якості гостя або зареєструвати себе в курсах, які дозволяють їй.", + "searchcoursesadvice": "Ви можете використовувати кнопку пошуку курсів, щоб отримати доступ в якості гостя або зареєструвати себе в курсах, які дозволяють це.", "selfenrolment": "Самостійна реєстрація", "totalcoursesearchresults": "Всього курсів: {{$a}}" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/ar.json b/www/core/components/fileuploader/lang/ar.json index 68a20669859..3756250ce62 100644 --- a/www/core/components/fileuploader/lang/ar.json +++ b/www/core/components/fileuploader/lang/ar.json @@ -5,12 +5,12 @@ "errorcapturingimage": "خطأ في التقاط الصورة", "errorcapturingvideo": "خطأ في التقاط الفيديو", "errormustbeonlinetoupload": "لابد أن تكون متصل بالأنترنت لكي يتم رفع الملفات", - "errorreadingfile": "خطاء في قراءة ملف \"{{$a}}\"", + "errorreadingfile": "خطأ في قراءة الملف", "file": "ملف", "fileuploaded": "الملف الذي تم رفعه", "maxbytesfile": "حجم الملف {{$a.file}} كبير جداً . الحد الأقصى الذي تستطيع رفعه هو {{$a.size}}.", "readingfile": "يتم قراءة الملف", - "uploadafile": "تحميل ملف", - "uploading": "يتم التحميل", + "uploadafile": "إرفع ملف", + "uploading": "يتم الرفع", "video": "فيديو" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/da.json b/www/core/components/fileuploader/lang/da.json index 7b7c0c77636..3fe2280526b 100644 --- a/www/core/components/fileuploader/lang/da.json +++ b/www/core/components/fileuploader/lang/da.json @@ -9,7 +9,7 @@ "errorgettingimagealbum": "Fejl ved indhentning af billede fra album", "errormustbeonlinetoupload": "Du skal være online for at uploade filer.", "errornoapp": "Du har ikke installeret en app som kan udføre denne handling.", - "errorreadingfile": "Fejl under læsning af filen \"{{$a}}\"", + "errorreadingfile": "Fejl ved læsning af fil.", "errorwhileuploading": "En fejl opstod under upload af filen.", "file": "Fil", "fileuploaded": "Filen er uploadet.", @@ -17,6 +17,6 @@ "photoalbums": "Fotoalbum", "readingfile": "Læser fil", "uploadafile": "Upload en fil", - "uploading": "Uploader...", + "uploading": "Uploader", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/fr.json b/www/core/components/fileuploader/lang/fr.json index 68434825ec0..13eb0148fcf 100644 --- a/www/core/components/fileuploader/lang/fr.json +++ b/www/core/components/fileuploader/lang/fr.json @@ -15,7 +15,7 @@ "file": "Fichier", "fileuploaded": "Le fichier a été déposé.", "maxbytesfile": "Le fichier {{$a.file}} est trop gros. La taille maximale permise est de {{$a.size}}.", - "photoalbums": "Albums de photos", + "photoalbums": "Albums photos", "readingfile": "Lecture du fichier", "selectafile": "Choisir un fichier", "uploadafile": "Déposer un fichier", diff --git a/www/core/components/fileuploader/lang/he.json b/www/core/components/fileuploader/lang/he.json index 62479a48162..b6dda48ad1e 100644 --- a/www/core/components/fileuploader/lang/he.json +++ b/www/core/components/fileuploader/lang/he.json @@ -9,13 +9,13 @@ "errorgettingimagealbum": "שגיאה בטעינת תמונה מאלבום.", "errormustbeonlinetoupload": "עליך להיות מחובר/ת בכדי להעלות קבצים.", "errornoapp": "לא נמצא יישומון זמין לביצוע פעולה הזו.", - "errorreadingfile": "שגיאה בקריאת קובץ \"{{$a}}\"", + "errorreadingfile": "שגיאה בקריאת קובץ.", "errorwhileuploading": "התרחשה שגיאה בזמן הניסיון להעלות את הקובץ.", "file": "קובץ", "fileuploaded": "הקובץ הועלה בהצלחה.", "photoalbums": "אלבומי תמונות", "readingfile": "קורא קובץ", - "uploadafile": "העלאת קובץ", - "uploading": "מעלה את הקובץ...", + "uploadafile": "העלה קובץ", + "uploading": "מעלה קבצים", "video": "וידאו" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/ja.json b/www/core/components/fileuploader/lang/ja.json index afec789151e..86f29cfe14c 100644 --- a/www/core/components/fileuploader/lang/ja.json +++ b/www/core/components/fileuploader/lang/ja.json @@ -1,14 +1,14 @@ { - "addfiletext": "ファイルを追加する", + "addfiletext": "ファイル追加", "confirmuploadfile": "{{$a}}をアップロードしようとしています。続けますか?", "errorcapturingaudio": "音声キャプチャーのエラー", "errorcapturingvideo": "ビデオキャプチャーのエラー", - "errorreadingfile": "ファイル「 {{$a}} 」の読み取り中にエラーが発生しました。", + "errorreadingfile": "ファイル\"{{$a}}\"の読み取りエラー", "file": "ファイル", "fileuploaded": "アップロードしたファイル", "maxbytesfile": "ファイル {{$a.file}} は大きすぎます。あなたがアップロードできる最大サイズは {{$a.size}} です。", "readingfile": "ファイル読み取り", "uploadafile": "ファイルをアップロードする", - "uploading": "アップロード中 ...", + "uploading": "アップロード中", "video": "ビデオ" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/sr-cr.json b/www/core/components/fileuploader/lang/sr-cr.json new file mode 100644 index 00000000000..74ec8641949 --- /dev/null +++ b/www/core/components/fileuploader/lang/sr-cr.json @@ -0,0 +1,25 @@ +{ + "addfiletext": "Додај датотеку", + "audio": "Аудио", + "camera": "Камера", + "confirmuploadfile": "Намеравате да отпремите {{size}}. Да ли сте сигурни да желите да наставите?", + "confirmuploadunknownsize": "Нисмо могли да израчунамо величину датотека за отпремање. Да ли сте сигурни да желите да наставите?", + "errorcapturingaudio": "Грешка приликом снимања аудио записа.", + "errorcapturingimage": "Грешка приликом снимања слике.", + "errorcapturingvideo": "Грешка приликом снимања видео записа.", + "errorgettingimagealbum": "Грешка приликом преузимања слике из албума.", + "errormustbeonlinetoupload": "Морате бити онлајн како бисте отпремили датотеке.", + "errornoapp": "Немате инсталирану апликацију која може да изведе ову акцију.", + "errorreadingfile": "Грешка приликом учитавања датотеке.", + "errorwhileuploading": "Дошло је до грешке приликом отпремања датотеке.", + "file": "Датотека", + "fileuploaded": "Датотека је успешно отпремљена.", + "maxbytesfile": "Датотека {{$a.file}} је превелика. Максимална величина коју можете да отпремите је {{$a.size}}.", + "photoalbums": "Фото албум", + "readingfile": "Учитавање датотеке", + "selectafile": "Изабери датотеку", + "uploadafile": "Отпреми датотеку", + "uploading": "Отпремање", + "uploadingperc": "Отпремање: {{$a}}%", + "video": "Видео" +} \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/sr-lt.json b/www/core/components/fileuploader/lang/sr-lt.json new file mode 100644 index 00000000000..5da78d54b07 --- /dev/null +++ b/www/core/components/fileuploader/lang/sr-lt.json @@ -0,0 +1,25 @@ +{ + "addfiletext": "Dodaj datoteku", + "audio": "Audio", + "camera": "Kamera", + "confirmuploadfile": "Nameravate da otpremite {{size}}. Da li ste sigurni da želite da nastavite?", + "confirmuploadunknownsize": "Nismo mogli da izračunamo veličinu datoteka za otpremanje. Da li ste sigurni da želite da nastavite?", + "errorcapturingaudio": "Greška prilikom snimanja audio zapisa.", + "errorcapturingimage": "Greška prilikom snimanja slike.", + "errorcapturingvideo": "Greška prilikom snimanja video zapisa.", + "errorgettingimagealbum": "Greška prilikom preuzimanja slike iz albuma.", + "errormustbeonlinetoupload": "Morate biti onlajn kako biste otpremili datoteke.", + "errornoapp": "Nemate instaliranu aplikaciju koja može da izvede ovu akciju.", + "errorreadingfile": "Greška prilikom učitavanja datoteke.", + "errorwhileuploading": "Došlo je do greške prilikom otpremanja datoteke.", + "file": "Датотека", + "fileuploaded": "Datoteka je uspešno otpremljena.", + "maxbytesfile": "Datoteka {{$a.file}} je prevelika. Maksimalna veličina koju možete da otpremite je {{$a.size}}.", + "photoalbums": "Foto album", + "readingfile": "Učitavanje datoteke", + "selectafile": "Izaberi datoteku", + "uploadafile": "Otpremi datoteku", + "uploading": "Otpremanje", + "uploadingperc": "Otpremanje: {{$a}}%", + "video": "Video" +} \ No newline at end of file diff --git a/www/core/components/login/lang/da.json b/www/core/components/login/lang/da.json index 71bccdcbe1d..73378e4f7a3 100644 --- a/www/core/components/login/lang/da.json +++ b/www/core/components/login/lang/da.json @@ -2,7 +2,7 @@ "authenticating": "Godkender", "cancel": "Annuller", "confirmdeletesite": "Er du sikker på at du ønsker at slette websiden {{sitename}}?", - "connect": "Forbind", + "connect": "Tilslut!", "connecttomoodle": "Tilslut til Moodle", "createaccount": "Opret ny profil", "createuserandpass": "Vælg brugernavn og adgangskode", diff --git a/www/core/components/login/lang/de.json b/www/core/components/login/lang/de.json index e88b1eeed67..2c1061d3f43 100644 --- a/www/core/components/login/lang/de.json +++ b/www/core/components/login/lang/de.json @@ -20,7 +20,7 @@ "firsttime": "Sind Sie zum ersten Mal auf dieser Webseite?", "getanothercaptcha": "Neues Captcha laden", "help": "Hilfe", - "helpmelogin": "

Die Moodle Mobile App funktioniert nur mit Websites, die speziell für den mobilen Zugriff freigegeben wurden.

\n

Alle Möglichkeiten finden Sie unter http://docs.moodle.org/de/Mobile_app.

\n


Wenn Sie die App mit einer Demo-Website testen möchten, tragen Sie bitte teacher oder student in das Feld URL der Website ein. Tippen Sie dann auf die Taste Verbinden.

", + "helpmelogin": "

Es gibt viele tausend Moodle-Websites auf der Welt. Die mobile App funktioniert nur mit Websites, für die der mobile Zugriff freigegeben wurde.

\n

Alle Möglichkeiten finden Sie unter http://docs.moodle.org/de/Mobile_app.

\n


Wenn Sie die App mit einer Demo-Website testen möchten, tragen Sie bitte teacher oder student in das Feld URL der Website ein. Tippen Sie dann auf die Taste Verbinden.

", "instructions": "Anleitung", "invalidaccount": "Prüfen Sie Ihre Anmeldedaten oder wenden Sie sich an den Administrator der Website.", "invaliddate": "Ungültiges Datum", diff --git a/www/core/components/login/lang/el.json b/www/core/components/login/lang/el.json index cb0a2b6fbae..ddfa99ae3f0 100644 --- a/www/core/components/login/lang/el.json +++ b/www/core/components/login/lang/el.json @@ -14,30 +14,64 @@ "emailconfirmsent": "

Ένα email έχει σταλεί στη διεύθυνση σας {{$a}}

Περιέχει εύκολες οδηγίες για να ολοκληρώσετε την εγγραφή σας.

Εάν συνεχίσετε να έχετε δυσκολίες επικοινωνήστε με το διαχειριστή του site.

", "emailnotmatch": "Οι διευθύνσεις email δεν ταιριάζουν", "enterthewordsabove": "Enter the words above", + "erroraccesscontrolalloworigin": "Η κλήση πολλαπλών προελεύσεων (Cross-Origin call) που προσπαθείτε να εκτελέσετε έχει απορριφθεί. Παρακαλώ ελέγξτε https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", "errordeletesite": "Παρουσιάστηκε σφάλμα κατά τη διάρκεια της διαγραφής του site. Δοκιμάστε ξανά αργότερα.", "errorupdatesite": "Παρουσιάστηκε σφάλμα κατά την ενημέρωση του site token.", "firsttime": "Είναι η πρώτη σας φορά εδώ;", "getanothercaptcha": "Πάρε ένα άλλο CAPTCHA", "help": "Βοήθεια", + "helpmelogin": "

Υπάρχουν χιλιάδες Moodle ιστότοποι σε όλο τον κόσμο. Αυτή η εφαρμογή μπορεί να συνδεθεί μόνο σε ιστότοπους Moodle που έχουν ενεργοποιήσει συγκεκριμένα την πρόσβαση σε εφαρμογές για κινητά.

Εάν δεν μπορείτε να συνδεθείτε στον ιστότοπό σας Moodle, πρέπει να επικοινωνήσετε με το διαχειριστή του Moodle ιστότοπου όπου θέλετε να συνδεθείτε και ζητήστε τους να διαβάσουν http://docs.moodle.org/en/Mobile_app

Για να δοκιμάσετε την εφαρμογή σε έναν δοκιμαστικό ιστότοπο Moodle δάσκαλος ή σπουδαστής στο πεδίο Διεύθυνση ιστοτόπου και κάντε κλικ στο κουμπί < .

", "instructions": "Οδηγίες", + "invalidaccount": "Ελέγξτε τα στοιχεία σύνδεσης ή ζητήστε από τον διαχειριστή του ιστότοπού σας να ελέγξει τη διαμόρφωση του ιστότοπου.", + "invaliddate": "Η ημερομηνία δεν είναι σωστή", "invalidemail": "Εσφαλμένη διεύθυνση ηλεκτρονικού ταχυδρομείου", + "invalidmoodleversion": "Μη έγκυρη έκδοση Moodle. Η ελάχιστη απαιτούμενη έκδοση είναι η 2.4.", + "invalidsite": "Η διεύθυνση ιστότοπου δεν είναι έγκυρη.", + "invalidtime": "Μη έγκυρη ώρα", "invalidurl": "Το URL που εισαγάγατε δεν είναι έγκυρο", + "invalidvaluemax": "Η μεγαλύτερη τιμή είναι {{$a}}", + "invalidvaluemin": "Η μικρότερη τιμή είναι {{$a}}", + "localmobileunexpectedresponse": "Ο έλεγχος επιπρόσθετων λειτουργιών τη εφαρμοργής για κινητά Moodle επέστρεψε μια απροσδόκητη απόκριση, θα πιστοποιηθείτε χρησιμοποιώντας την τυπική υπηρεσία κινητής τηλεφωνίας.", + "loggedoutssodescription": "Πρέπει να επαληθεύσετε ξανά τον έλεγχο ταυτότητας. Θα πρέπει να συνδεθείτε στον ιστότοπο σε ένα παράθυρο του προγράμματος περιήγησης.", "login": "Είσοδος", + "loginbutton": "Σύνδεση", + "logininsiterequired": "Θα πρέπει να συνδεθείτε στον ιστότοπο σε ένα παράθυρο του προγράμματος περιήγησης.", "loginsteps": "Γεια σας,\n\nΓια να έχετε πλήρη πρόσβαση σε κάποια μαθήματα θα χρειαστεί να δημιουργήσετε ένα νέο λογαριασμό, ακολουθώντας τα παρακάτω βήματα:\n
    \n
  1. Συμπληρώστε τη φόρμα Νέου λογαριασμού με τα δεδομένα σας.\n
  2. Ένα μήνυμα ηλεκτρονικού ταχυδρομείου θα αποσταλεί στη διεύθυνσή σας.\n
  3. Διαβάστε το μήνυμα και επιλέξτε τη διεύθυνση που περιέχει.\n
  4. Μετά την επιβεβαίωση του λογαριασμού σας, θα μπορείτε να συνδεθείτε στην ηλεκτρονική τάξη.\n
  5. Αφού έχετε συνδεθεί, μπορείτε να επιλέξτε το μάθημα στο οποίο θέλετε να εγγραφείτε. Αν σας ζητηθεί ένα \"κλειδί εγγραφής\" - χρησιμοποιήστε αυτό που σας έδωσε ο διδάσκοντάς σας.\n
  6. Από εδώ και στο εξής θα έχετε τη δυνατότητα να χρησιμοποιήσετε όλες τις δραστηριότητες και τις πηγές πληροφοριών του μαθήματος.\n
", "missingemail": "Λείπει η διεύθυνση ηλεκτρονικού ταχυδρομείου", "missingfirstname": "Λείπει το όνομα", "missinglastname": "Λείπει το επώνυμο", + "mobileservicesnotenabled": "Οι υπηρεσίες κινητής τηλεφωνίας δεν είναι ενεργοποιημένες στον ιστότοπό σας. Παρακαλούμε, επικοινωνήστε με τον διαχειριστή του ιστότοπου εάν πιστεύετε ότι η πρόσβαση στο κινητό θα πρέπει να είναι ενεργοποιημένη.", "newaccount": "Νέος λογαριασμός", + "newsitedescription": "Καταχωρίστε τη διεύθυνση URL του ιστότοπού σας Moodle. Σημειώστε ότι ενδέχεται να μην έχει ρυθμιστεί να λειτουργεί με αυτήν την εφαρμογή.", + "notloggedin": "Πρέπει να συνδεθείτε", "password": "Κωδικός", + "passwordrequired": "Απαιτείται κωδικός πρόσβασης", "policyaccept": "Καταλαβαίνω και συμφωνώ", "policyagree": "Πρέπει να συμφωνήσετε σε αυτήν την πολιτική για να συνεχίσετε στο ιστοχώρο. Συμφωνείτε;", "policyagreement": "Άδεια χρήσης του ιστοχώρου", "policyagreementclick": "Πατήστε εδώ για να διαβάσετε του όρους χρήσης", "potentialidps": "Συνδεθείτε χρησιμοποιώντας το λογαριασμό σας στο:", + "problemconnectingerror": "Παρουσιάστηκαν προβλήματα σύνδεσης", + "problemconnectingerrorcontinue": "Ελέγξτε ότι έχετε εισάγει σωστά τη διεύθυνση και προσπαθήστε ξανά.", + "profileinvaliddata": "Μη έγκυρη τιμή", + "recaptchachallengeimage": "Εικόνα reCAPTCHA", + "reconnect": "Επανασύνδεση", + "reconnectdescription": "Η σύνδεση με το λογαριασμό σας δεν είναι έγκυρη ή έχει λήξει, πρέπει να επανασυνδεθείτε με τον ιστότοπο.", + "reconnectssodescription": "Η σύνδεση με το λογαριασμό σας δεν είναι έγκυρη ή έχει λήξει, πρέπει να επανασυνδεθείτε με τον ιστότοπο. Θα πρέπει να συνδεθείτε στον ιστότοπο σε ένα παράθυρο του προγράμματος περιήγησης.", "security_question": "Ερώτηση ασφαλείας", "selectacountry": "Επιλέξτε μια χώρα", + "signupplugindisabled": "{{$a}} δεν έχει ενεργοποιηθεί.", + "siteaddress": "Διεύθυνση ιστότοπου", + "siteinmaintenance": "Ο ιστότοπός σας βρίσκεται σε λειτουργία συντήρησης", + "sitepolicynotagreederror": "Η πολιτική του ιστότοπου δεν έγινε δεκτή.", + "siteurl": "URL του ιστότοπου", + "siteurlrequired": "Το URL του ιστότοπου είναι απαραίτητο, π.χ. http://www.yourmoodlesite.abc or https://www.yourmoodlesite.efg", "startsignup": "Ξεκινήστε τώρα δημιουργώντας νέο λογαριασμό!", + "stillcantconnect": "Ακόμα δεν μπορείτε να συνδεθείτε;", "supplyinfo": "Παρακαλώ, δώστε κάποιες πληροφορίες σχετικές με τον εαυτό σας", "username": "Όνομα χρήστη", - "usernotaddederror": "Ο χρήστης \"{{$a}}\" δεν προστέθηκε - άγνωστο σφάλμα" + "usernamerequired": "Το όνομα χρήστη είναι απαραίτητο", + "usernotaddederror": "Ο χρήστης \"{{$a}}\" δεν προστέθηκε - άγνωστο σφάλμα", + "visitchangepassword": "Θέλετε να επισκεφτείτε τον ιστότοπο για να αλλάξετε τον κωδικό πρόσβασης;", + "webservicesnotenabled": "Οι υπηρεσίες Web δεν είναι ενεργοποιημένες στον ιστότοπό σας. Παρακαλούμε, επικοινωνήστε με τον διαχειριστή του δικτυακού σας τόπου για το Moodle εάν πιστεύετε ότι η πρόσβαση στο κινητό θα πρέπει να είναι ενεργοποιημένη." } \ No newline at end of file diff --git a/www/core/components/login/lang/es.json b/www/core/components/login/lang/es.json index 652d4db8fef..db20e532710 100644 --- a/www/core/components/login/lang/es.json +++ b/www/core/components/login/lang/es.json @@ -32,6 +32,7 @@ "invalidvaluemax": "El valor máximo es {{$a}}", "invalidvaluemin": "El valor mínimo es {{$a}}", "localmobileunexpectedresponse": "Las características adicionales de Moodle Mobile han devuelto una respuesta inesperada, debe autenticarse utilizando el servicio estándar de Mobile.", + "loggedoutssodescription": "Tiene que autenticarse nuevamente. Necesita acceder al sitio en una ventana del navegador.", "login": "Acceder", "loginbutton": "Acceder", "logininsiterequired": "Para autentificarse en el sitio se ha de abrir una ventana de navegador.", @@ -62,6 +63,7 @@ "signupplugindisabled": "{{$a}} no está habilitado", "siteaddress": "Dirección del sitio", "siteinmaintenance": "Su sitio está en modo mantenimiento", + "sitepolicynotagreederror": "No se aceptó la política del sitio.", "siteurl": "URL del sitio", "siteurlrequired": "La URL del sitio es obligatoria, por ejemplo http://www.yourmoodlesite.es o https://www.yourmoodlesite.org", "startsignup": "Crear nueva cuenta", diff --git a/www/core/components/login/lang/he.json b/www/core/components/login/lang/he.json index 08820ee166c..6fdfc343515 100644 --- a/www/core/components/login/lang/he.json +++ b/www/core/components/login/lang/he.json @@ -2,7 +2,7 @@ "authenticating": "מאמת נתונים", "cancel": "ביטול", "confirmdeletesite": "האם את/ה בטוח/ה שברצונך למחוק את האתר {{sitename}}?", - "connect": "חיבור", + "connect": "התחברות!", "connecttomoodle": "התחברות למוודל", "createaccount": "יצירת חשבון חדש", "createuserandpass": "הזנת שם־משתמש וסיסמה", diff --git a/www/core/components/login/lang/ja.json b/www/core/components/login/lang/ja.json index 6b0b86428d5..7dab53a83d0 100644 --- a/www/core/components/login/lang/ja.json +++ b/www/core/components/login/lang/ja.json @@ -17,6 +17,7 @@ "invalidsite": "サイトURLが正しくありません。", "invalidurl": "無効なURLです。", "login": "ログイン", + "loginbutton": "ログイン", "logininsiterequired": "ブラウザウインドウからサイトにログインする必要があります。", "loginsteps": "このサイトにフルアクセスするため、あなたは最初にアカウントを作成する必要があります。", "missingemail": "メールアドレスが入力されていません。", diff --git a/www/core/components/login/lang/sr-cr.json b/www/core/components/login/lang/sr-cr.json new file mode 100644 index 00000000000..d4ba2b2f360 --- /dev/null +++ b/www/core/components/login/lang/sr-cr.json @@ -0,0 +1,49 @@ +{ + "auth_email": "Самостална регистрација на основу е-адресе", + "authenticating": "Провера идентитета", + "checksiteversion": "Проверите да ли ваш сајт користи Moodle 2.4 или новију верзију.", + "confirmdeletesite": "Да ли сте сигурни да желите да обришете сајт {{sitename}}?", + "connect": "Повежите се!", + "connecttomoodle": "Повежите се са Moodleom", + "contactyouradministrator": "Обратите се администратору вашег сајта за даљу помоћ.", + "contactyouradministratorissue": "Замолите администратора да провери следећи проблем: {{$a}}", + "credentialsdescription": "За пријаву на систем унесите своје корисничко име и лозинку.", + "emailconfirmsent": "

Требало би да је послата порука на вашу е-адресу {{$a}}

Порука садржи једноставна упутства о даљем поступку регистрације.

Ако и даље имате проблема, обратите се администратору сајта.

", + "emailnotmatch": "Адресе е-поште се не поклапају", + "erroraccesscontrolalloworigin": "Cross-Origin позив који покушавате да изведете је одбијен. Молимо, проверите https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", + "errordeletesite": "Дошло је до грешке приликом брисања овог сајта. Молим, покушајте поново.", + "errorupdatesite": "Дошло је до грешке приликом ажурирању токена сајта.", + "helpmelogin": "

Широм света постоји више хиљада Moodle сајтова. Ова апликација може се повезати само са Moodle сајтовима који су наменски омогућили приступ апликацијама за мобилне уређаје.

Ако не можете да се повежете са вашим Moodle сајтом потребно је да се обратите Moodle администратору сајта са којим желите да се повежете и да га замолите да прочитаhttp://docs.moodle.org/en/Mobile_app

За тестирање апликације на Moodle демо сајту унесите teacher или student у поље Адреса сајта и кликните на дугме Повежи се!.

", + "invalidaccount": "Проверите своје податке за пријаву или замолите вашег администратора да провери конфигурацију сајта.", + "invaliddate": "Неисправан датум", + "invalidmoodleversion": "Неисправна Moodle верзија. Неопходна је, минимално, верзија 2.4.", + "invalidsite": "URL адреса сајт није исправна.", + "invalidtime": "Неисправно време", + "invalidvaluemax": "Максимална вредност је {{$a}}", + "invalidvaluemin": "Минимална вредност је {{$a}}", + "localmobileunexpectedresponse": "Провера Moodle Mobile додатних функционалности вратила је неочекиван одговор. Ваш идентитет биће проверен помоћу стандардног мобилнog сервиса.", + "loggedoutssodescription": "Морате поново да потврдите свој идентитет. Потребно је да се пријавите на сајт у прозору веб читача.", + "loginbutton": "Пријава", + "logininsiterequired": "Потребно је да се пријавите на сајт у прозору веб читача.", + "mobileservicesnotenabled": "Мобилни сервиси нису омогућени на вашем сајту. Обратите се администратору вашег Moodle сајта ако мислите да мобилни приступ треба да буде омогућен.", + "newsitedescription": "Унесите URL адресу вашег Moodle сајта. Имајте на уму да сајт можда није конфигурисан да ради са овом апликацијом.", + "notloggedin": "Морате бити пријављени.", + "passwordrequired": "Неопходна је лозинка", + "problemconnectingerror": "Имамо проблема да се повежемо са", + "problemconnectingerrorcontinue": "Добро проверите да ли сте правилно унели адресу и покушајте поново.", + "profileinvaliddata": "Неисправна вредност", + "recaptchachallengeimage": "reCAPTCHA слика", + "reconnect": "Повежите се поново", + "reconnectdescription": "Ваш токен за проверу идентитета је неисправан или је истекао. Морате поново да успоставите везу са сајтом.", + "reconnectssodescription": "Ваш токен за проверу идентитета је неисправан или је истекао. Морате поново да успоставите везу са сајтом. Потребно је да се пријавите на сајт у прозору веб читача.", + "signupplugindisabled": "{{$a}} није омогућен.", + "siteaddress": "Адреса сајта", + "siteinmaintenance": "Ваш сајт је у режиму одржавања", + "sitepolicynotagreederror": "Сагласност са политиком сајта није потврђена.", + "siteurl": "URL адреса сајта", + "siteurlrequired": "Неопходна је URL адреса, нпр. http://www.yourmoodlesite.abc или https://www.yourmoodlesite.efg", + "stillcantconnect": "Још увек не можете да се повежете?", + "usernamerequired": "Корисничко име је неопходно", + "visitchangepassword": "Да ли желите да посетите сајт како бисте променили лозинку?", + "webservicesnotenabled": "Веб сервиси нису омогућени на вашем сајту. Обратите се администратору вашег Moodle сајта ако мислите да мобилни приступ треба да буде омогућен." +} \ No newline at end of file diff --git a/www/core/components/login/lang/sr-lt.json b/www/core/components/login/lang/sr-lt.json new file mode 100644 index 00000000000..63bb0dd2d9f --- /dev/null +++ b/www/core/components/login/lang/sr-lt.json @@ -0,0 +1,49 @@ +{ + "auth_email": "Samostalna registracija na osnovu e-adrese", + "authenticating": "Provera identiteta", + "checksiteversion": "Proverite da li vaš sajt koristi Moodle 2.4 ili noviju verziju.", + "confirmdeletesite": "Da li ste sigurni da želite da obrišete sajt {{sitename}}?", + "connect": "Povežite se!", + "connecttomoodle": "Povežite se sa Moodleom", + "contactyouradministrator": "Obratite se administratoru vašeg sajta za dalju pomoć.", + "contactyouradministratorissue": "Zamolite administratora da proveri sledeći problem: {{$a}}", + "credentialsdescription": "Za prijavu na sistem unesite svoje korisničko ime i lozinku.", + "emailconfirmsent": "

Trebalo bi da je poslata poruka na vašu e-adresu {{$a}}

Poruka sadrži jednostavna uputstva o daljem postupku registracije.

Ako i dalje imate problema, obratite se administratoru sajta.

", + "emailnotmatch": "Adrese e-pošte se ne poklapaju", + "erroraccesscontrolalloworigin": "Cross-Origin poziv koji pokušavate da izvedete je odbijen. Molimo, proverite https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", + "errordeletesite": "Došlo je do greške prilikom brisanja ovog sajta. Molim, pokušajte ponovo.", + "errorupdatesite": "Došlo je do greške prilikom ažuriranju tokena sajta.", + "helpmelogin": "

Širom sveta postoji više hiljada Moodle sajtova. Ova aplikacija može se povezati samo sa Moodle sajtovima koji su namenski omogućili pristup aplikacijama za mobilne uređaje.

Ako ne možete da se povežete sa vašim Moodle sajtom potrebno je da se obratite Moodle administratoru sajta sa kojim želite da se povežete i da ga zamolite da pročitahttp://docs.moodle.org/en/Mobile_app

Za testiranje aplikacije na Moodle demo sajtu unesite teacher ili student u polje Adresa sajta i kliknite na dugme Poveži se!.

", + "invalidaccount": "Proverite svoje podatke za prijavu ili zamolite vašeg administratora da proveri konfiguraciju sajta.", + "invaliddate": "Neispravan datum", + "invalidmoodleversion": "Neispravna Moodle verzija. Neophodna je, minimalno, verzija 2.4.", + "invalidsite": "URL adresa sajt nije ispravna.", + "invalidtime": "Neispravno vreme", + "invalidvaluemax": "Maksimalna vrednost je {{$a}}", + "invalidvaluemin": "Minimalna vrednost je {{$a}}", + "localmobileunexpectedresponse": "Provera Moodle Mobile dodatnih funkcionalnosti vratila je neočekivan odgovor. Vaš identitet biće proveren pomoću standardnog mobilnog servisa.", + "loggedoutssodescription": "Morate ponovo da potvrdite svoj identitet. Potrebno je da se prijavite na sajt u prozoru veb čitača.", + "loginbutton": "Prijava", + "logininsiterequired": "Potrebno je da se prijavite na sajt u prozoru veb čitača.", + "mobileservicesnotenabled": "Mobilni servisi nisu omogućeni na vašem sajtu. Obratite se administratoru vašeg Moodle sajta ako mislite da mobilni pristup treba da bude omogućen.", + "newsitedescription": "Unesite URL adresu vašeg Moodle sajta. Imajte na umu da sajt možda nije konfigurisan da radi sa ovom aplikacijom.", + "notloggedin": "Morate biti prijavljeni.", + "passwordrequired": "Neophodna je lozinka", + "problemconnectingerror": "Imamo problema da se povežemo sa", + "problemconnectingerrorcontinue": "Dobro proverite da li ste pravilno uneli adresu i pokušajte ponovo.", + "profileinvaliddata": "Neispravna vrednost", + "recaptchachallengeimage": "reCAPTCHA slika", + "reconnect": "Povežite se ponovo", + "reconnectdescription": "Vaš token za proveru identiteta je neispravan ili je istekao. Morate ponovo da uspostavite vezu sa sajtom.", + "reconnectssodescription": "Vaš token za proveru identiteta je neispravan ili je istekao. Morate ponovo da uspostavite vezu sa sajtom. Potrebno je da se prijavite na sajt u prozoru veb čitača.", + "signupplugindisabled": "{{$a}} nije omogućen.", + "siteaddress": "Adresa sajta", + "siteinmaintenance": "Vaš sajt je u režimu održavanja", + "sitepolicynotagreederror": "Saglasnost sa politikom sajta nije potvrđena.", + "siteurl": "URL adresa sajta", + "siteurlrequired": "Neophodna je URL adresa, npr. http://www.yourmoodlesite.abc ili https://www.yourmoodlesite.efg", + "stillcantconnect": "Još uvek ne možete da se povežete?", + "usernamerequired": "Korisničko ime je neophodno", + "visitchangepassword": "Da li želite da posetite sajt kako biste promenili lozinku?", + "webservicesnotenabled": "Veb servisi nisu omogućeni na vašem sajtu. Obratite se administratoru vašeg Moodle sajta ako mislite da mobilni pristup treba da bude omogućen." +} \ No newline at end of file diff --git a/www/core/components/login/lang/uk.json b/www/core/components/login/lang/uk.json index eb2ed868ac3..1504411013a 100644 --- a/www/core/components/login/lang/uk.json +++ b/www/core/components/login/lang/uk.json @@ -1,11 +1,11 @@ { "auth_email": "Email на основі самостійної реєстрації", - "authenticating": "Аутинтифікація", + "authenticating": "Аутентифікація", "cancel": "Скасувати", "checksiteversion": "Переконайтеся, що ваш сайт використовує Moodle 2.4 або більш пізньої версії.", "confirmdeletesite": "Видалити сайт {{sitename}}?", "connect": "З'єднано!", - "connecttomoodle": "Відключитись до Moodle", + "connecttomoodle": "Підключитись до Moodle", "contactyouradministrator": "Зверніться до адміністратора сайту для подальшої допомоги.", "contactyouradministratorissue": "Будь ласка, зверніться до адміністратора, щоб перевірити наступне питання: {{$a}}", "createaccount": "Створити запис", @@ -14,18 +14,18 @@ "emailconfirmsent": "

Лист повинен бути відправлений на Вашу електронну адресу в {{$a}}

Він містить прості інструкції для завершення реєстрації.

Якщо ви продовжуєте зазнавати труднощів, зверніться до адміністратора сайту.

", "emailnotmatch": "Email не співпадають", "enterthewordsabove": "Введіть символи, які бачите вище", - "erroraccesscontrolalloworigin": "Cross-Origin дзвінок Ви намагаєтеся виконати відхилено. Будь ласка, перевірте https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", + "erroraccesscontrolalloworigin": "Cross-Origin дзвінок був відхилений. Будь ласка, перевірте https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", "errordeletesite": "Під час видалення цього сайту сталася помилка. Будь ласка спробуйте ще раз.", "errorupdatesite": "При оновленні токена сайту сталася помилка.", "firsttime": "Ви вперше на нашому сайті?", "getanothercaptcha": "Отримати інший варант", "help": "Допомога", - "helpmelogin": "

Є багато тисяч сайтів Moodle по всьому світу. Ця програма може підключатися тільки до сайтів Moodle, які спеціально з підтримкою мобільного доступу додатків.

Якщо ви не можете підключитися до вашого сайту Moodle, то вам необхідно звернутися до адміністратора Moodle в тому місці, де планується отримати доступ і попросіть їх прочитати http://docs.moodle.org/en/Mobile_app

Щоб перевірити додаток в типі Moodle демо сайті учитель або студент в адреса сайту поля і натисніть кнопку Підключення .

", + "helpmelogin": "

Є багато тисяч сайтів Moodle по всьому світу. Ця програма може підключатися тільки до сайтів Moodle, які є з підтримкою мобільного доступу додатків.

Якщо ви не можете підключитися до вашого сайту Moodle, то вам необхідно звернутися до адміністратора Moodle в тому місці, де планується отримати доступ і попросіть їх прочитати http://docs.moodle.org/en/Mobile_app

Щоб перевірити додаток на Moodle демо сайті в ролі вчителя або студента в полі адреса сайту і натисніть кнопку Підключення .

", "instructions": "Інструкції", "invalidaccount": "Будь ласка, перевірте ваші реєстраційні дані, або зверніться до адміністратора сайту, щоб перевірити конфігурацію сайту.", "invaliddate": "Невірна дата", "invalidemail": "Неправильний формат для ел.пошти", - "invalidmoodleversion": "Невірна версія Moodle. Мінімальна версія 2.4 потрібно.", + "invalidmoodleversion": "Невірна версія Moodle. Мінімальна версія 2.4.", "invalidsite": "URL сайту недійсний.", "invalidtime": "Невірний час", "invalidurl": "Неправильний URL", @@ -40,9 +40,9 @@ "missingemail": "Не вказано адресу електронної пошти", "missingfirstname": "Не вказано ім'я", "missinglastname": "Не вказано прізвище", - "mobileservicesnotenabled": "Мобільні послуги не включені в вашому сайті. Будь ласка, зверніться до адміністратора вашого Moodle сайт, якщо ви вважаєте, мобільний доступ повинен бути включений.", + "mobileservicesnotenabled": "Мобільні послуги не включені в вашому сайті. Будь ласка, зверніться до адміністратора вашого Moodle сайт, якщо ви вважаєте, що мобільний доступ повинен бути включений.", "newaccount": "Новий обліковий запис", - "newsitedescription": "Будь ласка, введіть адресу вашого сайту Moodle. Зверніть увагу, що це не може бути налаштоване для роботи з цим додатком.", + "newsitedescription": "Будь ласка, введіть адресу вашого сайту Moodle. Зверніть увагу, що це може бути не налаштоване для роботи з цим додатком.", "notloggedin": "Ви повинні увійти в систему.", "password": "Відкритий ключ", "passwordrequired": "Пароль необхідний", @@ -57,7 +57,7 @@ "recaptchachallengeimage": "виклик reCAPTCHA", "reconnect": "Повторне з'єднання", "reconnectdescription": "Ваш маркер аутентифікації недійсний або закінчився, ви повинні підключитися до сайту.", - "reconnectssodescription": "Ваш маркер аутентифікації недійсний або закінчився, ви повинні підключитися до сайту. Вам необхідно увійти на сайт у вікні браузера.", + "reconnectssodescription": "Ваш маркер аутентифікації недійсний або закінчився, ви повинні перепідключитися до сайту. Вам необхідно увійти на сайт у вікні браузера.", "security_question": "Контрольне питання", "selectacountry": "Країна", "signupplugindisabled": "{{$a}} не доступно.", @@ -67,11 +67,11 @@ "siteurl": "URL сайту", "siteurlrequired": "URL сайту повинно бути схоже на http://www.yourmoodlesite.abc or https://www.yourmoodlesite.efg", "startsignup": "Створити новий обліковий запис", - "stillcantconnect": "До сих пір не можу підключитися?", + "stillcantconnect": "До сих пір не можете підключитися?", "supplyinfo": "Більше інформації", "username": "Ім’я входу", "usernamerequired": "Ім'я користувача необхідне", "usernotaddederror": "Користувач не доданий - помилка", "visitchangepassword": "Ви хочете відвідати сайт, щоб змінити пароль?", - "webservicesnotenabled": "Веб-служба не включені в вашому сайті. Будь ласка, зверніться до адміністратора вашого Moodle сайт, якщо ви вважаєте, мобільний доступ повинен бути включений." + "webservicesnotenabled": "Веб-служба не включені в вашому сайті. Будь ласка, зверніться до адміністратора вашого Moodle сайту, якщо ви вважаєте, що мобільний доступ повинен бути включений." } \ No newline at end of file diff --git a/www/core/components/question/lang/el.json b/www/core/components/question/lang/el.json index 04bb3effa9e..283d84af335 100644 --- a/www/core/components/question/lang/el.json +++ b/www/core/components/question/lang/el.json @@ -3,12 +3,17 @@ "answersaved": "Η απάντηση αποθηκεύτηκε", "complete": "Ολοκλήρωση", "correct": "Σωστό", + "errorattachmentsnotsupported": "Η εφαρμογή δεν υποστηρίζει ακόμα την προσάρτηση αρχείων σε απαντήσεις.", + "errorinlinefilesnotsupported": "Η εφαρμογή δεν υποστηρίζει ακόμα την επεξεργασία αρχείων.", + "errorquestionnotsupported": "Αυτός ο τύπος ερωτήματος δεν υποστηρίζεται από την εφαρμογή: {{$a}}.", "feedback": "Ανάδραση", + "howtodraganddrop": "Πατήστε για να επιλέξετε και στη συνέχεια, πατήστε για να αφήσετε.", "incorrect": "Λάθος", "invalidanswer": "Ημιτελής απάντηση", "notanswered": "Δεν απαντήθηκε ακόμα", "notyetanswered": "Δεν έχει απαντηθεί ακόμα", "partiallycorrect": "Μερικώς σωστή", + "questionmessage": "Ερώτηση {{$a}}: {{$b}}", "questionno": "Ερώτηση {{$a}}", - "unknown": "Άγνωστο" + "unknown": "Δεν είναι δυνατός ο προσδιορισμός της κατάστασης" } \ No newline at end of file diff --git a/www/core/components/question/lang/sr-cr.json b/www/core/components/question/lang/sr-cr.json new file mode 100644 index 00000000000..ffe53b968b1 --- /dev/null +++ b/www/core/components/question/lang/sr-cr.json @@ -0,0 +1,8 @@ +{ + "errorattachmentsnotsupported": "Апликација још увек не подржава могућност да се датотеке придруже уз одговоре.", + "errorinlinefilesnotsupported": "Апликација још увек не подржава уређивање унутар датотека.", + "errorquestionnotsupported": "Апликација не подржава овај тип питања: {{$a}}.", + "howtodraganddrop": "Додирните за избор, затим још једном за спуштање.", + "questionmessage": "Питање {{$a}}: {{$b}}", + "unknown": "Није могуће утврдити статус" +} \ No newline at end of file diff --git a/www/core/components/question/lang/sr-lt.json b/www/core/components/question/lang/sr-lt.json new file mode 100644 index 00000000000..938634ec0ad --- /dev/null +++ b/www/core/components/question/lang/sr-lt.json @@ -0,0 +1,8 @@ +{ + "errorattachmentsnotsupported": "Aplikacija još uvek ne podržava mogućnost da se datoteke pridruže uz odgovore.", + "errorinlinefilesnotsupported": "Aplikacija još uvek ne podržava uređivanje unutar datoteka.", + "errorquestionnotsupported": "Aplikacija ne podržava ovaj tip pitanja: {{$a}}.", + "howtodraganddrop": "Dodirnite za izbor, zatim još jednom za spuštanje.", + "questionmessage": "Pitanje {{$a}}: {{$b}}", + "unknown": "Nije moguće utvrditi status" +} \ No newline at end of file diff --git a/www/core/components/question/lang/uk.json b/www/core/components/question/lang/uk.json index 3ddcb4cabc4..a4c6af3fe0f 100644 --- a/www/core/components/question/lang/uk.json +++ b/www/core/components/question/lang/uk.json @@ -5,7 +5,7 @@ "correct": "Правильно", "errorattachmentsnotsupported": "Додаток не підтримує прикріплення файлів відповідей", "errorinlinefilesnotsupported": "Додаток ще не підтримує редагування вбудованих файлів.", - "errorquestionnotsupported": "Цей тип питання не підтримує додатком: {{$a}}.", + "errorquestionnotsupported": "Цей тип питання не підтримується додатком: {{$a}}.", "feedback": "Відгук", "howtodraganddrop": "Натисніть, щоб вибрати і перемістить.", "incorrect": "Неправильно", diff --git a/www/core/components/settings/lang/de.json b/www/core/components/settings/lang/de.json index dc12fbcf598..ae82a9b0020 100644 --- a/www/core/components/settings/lang/de.json +++ b/www/core/components/settings/lang/de.json @@ -1,10 +1,10 @@ { - "about": "Über diese App", + "about": "Über Moodle Mobile", "appready": "App nutzbar", "cacheexpirationtime": "Speicherdauer im Cache (Millisekunden)", "cannotsyncoffline": "Offline kann nicht synchronisiert werden.", - "cannotsyncwithoutwifi": "Die Daten wurden nicht synchronisiert, weil Ihre Einstellungen dies nur mit WLAN zulassen. Stellen Sie eine Verbindung zu einem WLAN her.", - "configuringnotifications": "Sie konfigurieren die Mitteilungen für '{{$a}}'.", + "cannotsyncwithoutwifi": "Die Daten wurden nicht synchronisiert, weil die Einstellungen dies nur mit WLAN zulassen. Stellen Sie eine WLAN-Verbindung her.", + "configuringnotifications": "Einstellungen für '{{$a}}'.", "cordovadevicemodel": "Cordova Device Model", "cordovadeviceosversion": "Cordova Device OS Version", "cordovadeviceplatform": "Cordova Device Platform", @@ -14,7 +14,7 @@ "currentlanguage": "Eingestellte Sprache", "deletesitefiles": "Möchten Sie wirklich alle von der Website '{{sitename}}' geladenen Dateien löschen?", "deletesitefilestitle": "Website-Dateien löschen", - "deviceinfo": "Geräteinfo", + "deviceinfo": "Geräteinformationen", "deviceos": "Geräte-OS", "devicewebworkers": "Device Web Workers unterstützt", "disableall": "Benachrichtungen ausschalten", @@ -22,7 +22,7 @@ "displayformat": "Bildschirmformat", "enabledebugging": "Debugging aktivieren", "enabledownloadsection": "Herunterladen von Abschnitten aktivieren", - "enabledownloadsectiondescription": "Deaktivieren Sie diese Option, wenn das Laden von Kursabschnitten im Online-Modus zu lange dauert.", + "enabledownloadsectiondescription": "Deaktivieren Sie diese Option, wenn das Laden von Abschnitten im Online-Modus zu lange dauert.", "enablerichtexteditor": "Texteditor aktivieren", "enablerichtexteditordescription": "Wenn diese Option aktiviert ist, wird an passenden Stellen ein Texteditor angezeigt.", "enablesyncwifi": "Nur mit WLAN synchronierieren", @@ -40,7 +40,7 @@ "navigatorlanguage": "Browsersprache", "navigatoruseragent": "Browserkennung (userAgent)", "networkstatus": "Internetverbindung", - "privacypolicy": "Selbstständigkeitserklärung", + "privacypolicy": "Datenschutzerklärung", "processorsettings": "Verarbeitungseinstellungen", "reportinbackground": "Fehler automatisch senden", "settings": "Einstellungen", diff --git a/www/core/components/settings/lang/el.json b/www/core/components/settings/lang/el.json index ded142e065b..cf6cad8002e 100644 --- a/www/core/components/settings/lang/el.json +++ b/www/core/components/settings/lang/el.json @@ -1,13 +1,58 @@ { + "about": "Σχετικά", + "appready": "Η εφαρμογή είναι έτοιμη", + "cacheexpirationtime": "Χρόνος λήξης της προσωρινής μνήμης (miliseconds)", + "cannotsyncoffline": "Δεν είναι δυνατός ο συγχρονισμός εκτός σύνδεσης.", + "cannotsyncwithoutwifi": "Δεν μπορεί να γίνει συγχρονισμός, επειδή οι τρέχουσες ρυθμίσεις επιτρέπουν μόνο συγχρονισμό όταν είστε συνδεδεμένοι με Wi-Fi. Συνδεθείτε με ένα δίκτυο Wi-Fi.", + "configuringnotifications": "Ρυθμίζετε τις '{{$a}}' ειδοποιήσεις.", + "cordovadevicemodel": "Μοντέλο συσκευής Cordova", + "cordovadeviceosversion": "Cordova έκδοση συσκευής OS", + "cordovadeviceplatform": "Πλατφόρμα συσκευής Cordova", + "cordovadeviceuuid": "Cordova Device uuid", + "cordovaversion": "Έκδοση Cordova", + "credits": "Credits", "currentlanguage": "Επιλεγμένη γλώσσα", + "deletesitefiles": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τα ληφθέντα αρχεία από τον ιστότοπο '{{sitename}}';", + "deletesitefilestitle": "Διαγραφή αρχείων ιστότοπου", + "deviceinfo": "Πληροφορίες συσκευές", + "deviceos": "Λειτουργικό σύστημα συσκευής", + "devicewebworkers": "Υποστηρίζονται οι συσκευές Web Workers", "disableall": "Προσωρινή απενεργοποίηση ειδοποιήσεων", "disabled": "Ανενεργό", + "displayformat": "Μορφή εμφάνισης", + "enabledebugging": "Ενεργοποίηση εντοπισμού σφαλμάτων", + "enabledownloadsection": "Ενεργοποιήστε τις ενότητες λήψης", + "enabledownloadsectiondescription": "Απενεργοποιήστε αυτήν την επιλογή για να επιταχύνετε τη φόρτωση των τμημάτων του μαθήματος.", + "enablerichtexteditor": "Ενεργοποιήστε τον επεξεργαστή εμπλουτισμένου κειμένου", + "enablerichtexteditordescription": "Εάν είναι ενεργοποιημένη, θα εμφανιστεί ένας επεξεργαστής εμπλουτισμένου κειμένου στα μέρη που το επιτρέπουν.", + "enablesyncwifi": "Να επιτρέπεται ο συγχρονισμός μόνο όταν είστε συνδεδεμένοι μέσω Wifi", + "errordeletesitefiles": "Σφάλμα κατά τη διαγραφή αρχείων ιστότοπου.", + "errorsyncsite": "Παρουσιάστηκε σφάλμα κατά το συγχρονισμό των δεδομένων ιστότοπου, ελέγξτε τη σύνδεση στο διαδίκτυο και δοκιμάστε ξανά.", + "estimatedfreespace": "Εκτιμώμενος ελεύθερος χώρος", + "filesystemroot": "Σύστημα αρχείων root", "general": "Γενικά", "language": "Γλώσσα", "license": "Άδεια GPL", + "localnotifavailable": "Διαθέσιμες τοπικές ειδοποιήσεις", + "locationhref": "Webview URL", "loggedin": "Συνδεδεμένος", "loggedoff": "Μη συνδεδεμένος", + "navigatorlanguage": "Γλώσσα πλοήγησης", + "navigatoruseragent": "Navigator userAgent", + "networkstatus": "Κατάσταση σύνδεσης στο Internet", + "privacypolicy": "Πολιτική απορρήτου", + "reportinbackground": "Αυτόματη αναφορά σφαλμάτων", "settings": "Ρυθμίσεις", "sites": "Δικτυακοί τόποι", - "total": "Συνολικά" + "spaceusage": "Χρήση χώρου", + "storagetype": "Τύπος αποθήκευσης", + "synchronization": "Συγχρονισμός", + "synchronizenow": "Συγχρονίστε τώρα", + "synchronizing": "Γίνεται συγχρονισμός", + "syncsettings": "Ρυθμίσεις συγχρονισμού", + "syncsitesuccess": "Τα δεδομένα ιστότοπου συγχρονίστηκαν και όλες οι προσωρινές μνήμες ακυρώθηκαν.", + "total": "Συνολικά", + "versioncode": "Κωδικός έκδοσης", + "versionname": "Όνομα έκδοσης", + "wificonnection": "Σύνδεση WiFi" } \ No newline at end of file diff --git a/www/core/components/settings/lang/es.json b/www/core/components/settings/lang/es.json index f26bc88eda5..9e144842444 100644 --- a/www/core/components/settings/lang/es.json +++ b/www/core/components/settings/lang/es.json @@ -40,6 +40,7 @@ "navigatorlanguage": "Lenguaje del navegador", "navigatoruseragent": "Agente de usuario del navegador", "networkstatus": "Estado de la conexión a internet", + "privacypolicy": "Política de privacidad.", "processorsettings": "Ajustes de procesador", "reportinbackground": "Informar de los errores automáticamente", "settings": "Configuración", diff --git a/www/core/components/settings/lang/sr-cr.json b/www/core/components/settings/lang/sr-cr.json new file mode 100644 index 00000000000..2001c299b89 --- /dev/null +++ b/www/core/components/settings/lang/sr-cr.json @@ -0,0 +1,47 @@ +{ + "about": "О апликацији", + "appready": "Апликација спремна", + "cacheexpirationtime": "Време истека кеша (милисекунде)", + "cannotsyncoffline": "Офлајн синхронизација није могућа.", + "cannotsyncwithoutwifi": "Синхронизација није могућа зато што тренутна подешавања дозвољавају синхронизацију само када постоји веза са Wi-Fi мрежом. Повежите се на Wi-Fi мрежу.", + "configuringnotifications": "Конфигуришете '{{$a}}' обавештења.", + "cordovadevicemodel": "Модел Cordova уређаја", + "cordovadeviceosversion": "Верзија оперативног система Cordova уређаја", + "cordovadeviceplatform": "Платформа Cordova уређаја", + "cordovadeviceuuid": "UUID Cordova уређаја", + "cordovaversion": "Cordova верзија", + "credits": "Заслуге", + "deletesitefiles": "Да ли сте сигурни да желите да обришете преузете датотеке са сајта '{{sitename}}'?", + "deletesitefilestitle": "Обриши датотеке сајта", + "deviceinfo": "Информације о уређају", + "deviceos": "Оперативни систем уређаја", + "devicewebworkers": "Web Workers уређаји подржани", + "displayformat": "Формат приказа", + "enabledebugging": "Омогући отклањање грешака", + "enabledownloadsection": "Омогући преузимање секција.", + "enabledownloadsectiondescription": "Онемогућите ову опцију како бисте убрзали учитавање секција курса.", + "enablerichtexteditor": "Омогући обогаћени едитор текста", + "enablerichtexteditordescription": "Ако је ова опција укључена обогаћени едитор текста биће приказан на местима која то дозвољавају.", + "enablesyncwifi": "Дозволите синхронизацију само када сте повезани на Wi-Fi мрежу.", + "errordeletesitefiles": "Грешка приликом брисања датотека сајта.", + "errorsyncsite": "Грешка приликом синхронизације података сајта. Молимо, проверите вашу интернет везу и покушајте поново.", + "estimatedfreespace": "Процењени слободан простора", + "filesystemroot": "Основни директоријум система датотека", + "localnotifavailable": "Локална обавештења доступна", + "locationhref": "Webview URL адреса", + "navigatorlanguage": "Језик навигатора", + "navigatoruseragent": "Кориснички агент навигатора", + "networkstatus": "Статус инернет везе", + "privacypolicy": "Политика приватности", + "reportinbackground": "Пријави грешке аутоматски", + "spaceusage": "Искориштеност простора", + "storagetype": "Тип складишта", + "synchronization": "Синхронизација", + "synchronizenow": "Синхронизуј сада", + "synchronizing": "Синхронизовање", + "syncsettings": "Подешавања синхронизације", + "syncsitesuccess": "Подаци сајтa су синхронизовани и сав кеш је поништен.", + "versioncode": "Верзија кôда", + "versionname": "Назив верзије", + "wificonnection": "WiFi веза" +} \ No newline at end of file diff --git a/www/core/components/settings/lang/sr-lt.json b/www/core/components/settings/lang/sr-lt.json new file mode 100644 index 00000000000..3dbe087bed0 --- /dev/null +++ b/www/core/components/settings/lang/sr-lt.json @@ -0,0 +1,47 @@ +{ + "about": "O aplikaciji", + "appready": "Aplikacija spremna", + "cacheexpirationtime": "Vreme isteka keša (milisekunde)", + "cannotsyncoffline": "Oflajn sinhronizacija nije moguća.", + "cannotsyncwithoutwifi": "Sinhronizacija nije moguća zato što trenutna podešavanja dozvoljavaju sinhronizaciju samo kada postoji veza sa Wi-Fi mrežom. Povežite se na Wi-Fi mrežu.", + "configuringnotifications": "Konfigurišete '{{$a}}' obaveštenja.", + "cordovadevicemodel": "Model Cordova uređaja", + "cordovadeviceosversion": "Verzija operativnog sistema Cordova uređaja", + "cordovadeviceplatform": "Platforma Cordova uređaja", + "cordovadeviceuuid": "UUID Cordova uređaja", + "cordovaversion": "Cordova verzija", + "credits": "Zasluge", + "deletesitefiles": "Da li ste sigurni da želite da obrišete preuzete datoteke sa sajta '{{sitename}}'?", + "deletesitefilestitle": "Obriši datoteke sajta", + "deviceinfo": "Informacija o uređaju", + "deviceos": "Operativni sistem uređaja", + "devicewebworkers": "Web Workers uređaji podržani", + "displayformat": "Format prikaza", + "enabledebugging": "Omogući otklanjanje grešaka", + "enabledownloadsection": "Omogući preuzimanje sekcija.", + "enabledownloadsectiondescription": "Onemogućite ovu opciju kako biste ubrzali učitavanje sekcija kursa.", + "enablerichtexteditor": "Omogući obogaćeni editor teksta", + "enablerichtexteditordescription": "Ako je ova opcija uključena obogaćeni editor teksta biće prikazan na mestima koja to dozvoljavaju.", + "enablesyncwifi": "Dozvolite sinhronizaciju samo kada ste povezani na Wi-Fi mrežu.", + "errordeletesitefiles": "Greška prilikom brisanja datoteka sajta.", + "errorsyncsite": "Greška prilikom sinhronizacije podataka sajta. Molimo, proverite vašu internet vezu i pokušajte ponovo.", + "estimatedfreespace": "Procenjeni slobodan prostora", + "filesystemroot": "Osnovni direktorijum sistema datoteka", + "localnotifavailable": "Lokalna obaveštenja dostupna", + "locationhref": "Webview URL adresa", + "navigatorlanguage": "Jezik navigatora", + "navigatoruseragent": "Korisnički agent navigatora", + "networkstatus": "Status inernet veze", + "privacypolicy": "Politika privatnosti", + "reportinbackground": "Prijavi greške automatski", + "spaceusage": "Iskorištenost prostora", + "storagetype": "Tip skladišta", + "synchronization": "Sinhronizacija", + "synchronizenow": "Sinhronizuj sada", + "synchronizing": "Sinhronizovanje", + "syncsettings": "Podešavanja sinhronizacije", + "syncsitesuccess": "Podaci sajta su sinhronizovani i sav keš je poništen.", + "versioncode": "Verzija kôda", + "versionname": "Naziv verzije", + "wificonnection": "WiFi veza" +} \ No newline at end of file diff --git a/www/core/components/settings/lang/uk.json b/www/core/components/settings/lang/uk.json index b918ac439dc..19e3c097dcc 100644 --- a/www/core/components/settings/lang/uk.json +++ b/www/core/components/settings/lang/uk.json @@ -1,11 +1,11 @@ { - "about": "Про", + "about": "Про додаток", "appready": "Додаток готовий", "cacheexpirationtime": "Час закінчення кеша (мілісекунди)", "cannotsyncoffline": "Неможливо синхронізувати в автономному режимі.", - "cannotsyncwithoutwifi": "Неможливо синхронізувати, так як поточні настройки тільки дозволяють синхронізувати при підключенні до Wi-Fi. Підключіться до мережі Wi-Fi.", - "configuringnotifications": "Ви налаштовуєте '{{$a}}' повідомлення.", - "cordovadevicemodel": "Модель пристрою Кордова", + "cannotsyncwithoutwifi": "Неможливо синхронізувати, так як поточні налаштування тільки дозволяють синхронізуватись при підключенні до Wi-Fi. Підключіться до мережі Wi-Fi.", + "configuringnotifications": "Ви налаштовуєте '{{$a}}' сповіщення.", + "cordovadevicemodel": "Модель пристрою Cordova", "cordovadeviceosversion": "Cordova Device OS version", "cordovadeviceplatform": "Cordova Device platform", "cordovadeviceuuid": "Cordova Device uuid", @@ -24,8 +24,8 @@ "enabledownloadsection": "Увімкнути секцію завантаження", "enabledownloadsectiondescription": "Вимкніть цей параметр, щоб прискорити завантаження курсу секцій.", "enablerichtexteditor": "Включити редактор тексту", - "enablerichtexteditordescription": "Якщо цей параметр включений, розширений текстовий редактор буде показаний в тих місцях, які дозволяють їй.", - "enablesyncwifi": "Дозволити синхронізацію тільки тоді, коли на Wi-Fi", + "enablerichtexteditordescription": "Якщо цей параметр включений, розширений текстовий редактор буде показаний в тих місцях, які дозволяють це.", + "enablesyncwifi": "Тільки Wi-Fi синхронізація", "errordeletesitefiles": "Помилка видалення файлів сайту", "errorsyncsite": "Помилка синхронізації даних сайту, будь ласка, перевірте підключення до Інтернету і спробуйте ще раз.", "estimatedfreespace": "Розрахунковий вільний простір", @@ -33,13 +33,13 @@ "general": "Основне", "language": "Мова інтерфейсу", "license": "Ліцензія", - "localnotifavailable": "Локальні сповіщення доступні", + "localnotifavailable": "Доступні локальні сповіщення", "locationhref": "Webview URL", "loggedin": "В мережі", "loggedoff": "Поза мережею", "navigatorlanguage": "Мова навігації", - "navigatoruseragent": "Navigator userAgent", - "networkstatus": "Статут інтернет з'єднання", + "navigatoruseragent": "Навігаційний userAgent", + "networkstatus": "Статус інтернет з'єднання", "privacypolicy": "Політика конфіденційності", "reportinbackground": "Відправляти помилки автоматично", "settings": "Параметри завдання", diff --git a/www/core/components/sharedfiles/lang/de.json b/www/core/components/sharedfiles/lang/de.json index f682d1fb09c..6bbe564a7ac 100644 --- a/www/core/components/sharedfiles/lang/de.json +++ b/www/core/components/sharedfiles/lang/de.json @@ -2,10 +2,10 @@ "chooseaccountstorefile": "Wählen Sie ein Nutzerkonto, um die Datei dort zu speichern.", "chooseactionrepeatedfile": "Eine Datei mit diesem Namen existiert bereits. Möchten Sie die vorhandene Datei ersetzen oder möchten Sie sie umbenennen in '{{$a}}'?", "errorreceivefilenosites": "Keine Websites gespeichert. Fügen Sie zuerst eine Website hinzu, bevor Sie eine Datei über die App freigeben.", - "nosharedfiles": "Keine freigegebenen Dateien für diese Website", + "nosharedfiles": "Keine geteilten Dateien für diese Website", "nosharedfilestoupload": "Sie haben noch keine Dateien zum Hochladen freigegeben. Wenn Sie eine Datei aus einer anderen App hochladen möchten, suchen Sie diese Datei und tippen Sie auf die Taste 'Öffnen in'.", "rename": "Umbenennen", "replace": "Ersetzen", - "sharedfiles": "Freigegebene Dateien", + "sharedfiles": "Geteilte Dateien", "successstorefile": "Die Datei wurde gespeichert. Sie können die Datei verwenden, um Sie in 'Meine Dateien' hochzuladen oder bei Aktivitäten anzuhängen." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/el.json b/www/core/components/sharedfiles/lang/el.json index 581cf18441d..d6eef40792d 100644 --- a/www/core/components/sharedfiles/lang/el.json +++ b/www/core/components/sharedfiles/lang/el.json @@ -1,4 +1,11 @@ { + "chooseaccountstorefile": "Επιλέξτε ένα λογαριασμό για να αποθηκεύσετε το αρχείο.", + "chooseactionrepeatedfile": "Υπάρχει ήδη ένα αρχείο με αυτό το όνομα. Θέλετε να αντικαταστήσετε το υπάρχον αρχείο ή να το μετονομάσετε σε \"{{$a}}\";", + "errorreceivefilenosites": "Δεν υπάρχουν αποθηκευμένες τοποθεσίες. Προσθέστε έναν ιστότοπο προτού μοιραστείτε ένα αρχείο με την εφαρμογή.", + "nosharedfiles": "Δεν υπάρχουν αποθηκευμένα αρχεία σε αυτόν τον ιστότοπο.", + "nosharedfilestoupload": "Δεν έχετε αρχεία για μεταφόρτωση εδώ. Αν θέλετε να μεταφορτώσετε ένα αρχείο από άλλη εφαρμογή, εντοπίστε το αρχείο και κάντε κλικ στο κουμπί \"Άνοιγμα σε\".", "rename": "Μετονομασία", - "replace": "Αντικατάσταση" + "replace": "Αντικατάσταση", + "sharedfiles": "Κοινόχρηστα αρχεία", + "successstorefile": "Το αρχείο αποθηκεύτηκε με επιτυχία. Τώρα μπορείτε να επιλέξετε αυτό το αρχείο για να το ανεβάσετε στα ιδιωτικά αρχεία σας ή να το επισυνάψετε σε ορισμένες δραστηριότητες." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/fr.json b/www/core/components/sharedfiles/lang/fr.json index 39b85fbf055..27784aa42fb 100644 --- a/www/core/components/sharedfiles/lang/fr.json +++ b/www/core/components/sharedfiles/lang/fr.json @@ -2,7 +2,7 @@ "chooseaccountstorefile": "Veuillez choisir un compte dans lequel enregistrer le fichier.", "chooseactionrepeatedfile": "Un fichier de ce nom existe déjà. Voulez-vous remplacer le fichier existant ou le renommer en « {{$a}} »?", "errorreceivefilenosites": "Aucun site n'est enregistré. Veuillez ajouter un site avant de partager un site avec l'app.", - "nosharedfiles": "Il n'y a pas de fichier partagés sur ce site.", + "nosharedfiles": "Il n'y a pas de fichier partagé sur ce site.", "nosharedfilestoupload": "Il n'y a pas de fichier à déposer ici. Si vous voulez déposer un fichier à partir d'une autre app, localiser le fichier et tapoter « Ouvrir dans ».", "rename": "Renommer", "replace": "Remplacer", diff --git a/www/core/components/sharedfiles/lang/sr-cr.json b/www/core/components/sharedfiles/lang/sr-cr.json new file mode 100644 index 00000000000..3b9b852cf35 --- /dev/null +++ b/www/core/components/sharedfiles/lang/sr-cr.json @@ -0,0 +1,11 @@ +{ + "chooseaccountstorefile": "Изаберите налог за чување датотеке.", + "chooseactionrepeatedfile": "Већ постоји датотека са овим називом. Да ли желите да замените постојећу датотеку или да јој назив промените у \"{{$a}}\"?", + "errorreceivefilenosites": "Не постоје меморисани сајтови. Молимо, додајте сајт пре него што покушате да поделите датотеке са апликацијом.", + "nosharedfiles": "Не постоје дељене датотеке које се налазе на овом сајту.", + "nosharedfilestoupload": "Овде немате датотеке које можете да отпремите. Ако желите да отпремите датотеку из друге апликације, пронађите ту датотеку и кликните на дугме 'Отвори у'.", + "rename": "Промени назив", + "replace": "Замени", + "sharedfiles": "Дељене датотеке", + "successstorefile": "Датотека је успешно сачувана. Сада можете да изаберете ову датотеку да бисте је отпремили међу своје приватне датотеке или је придружили некој активности." +} \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/sr-lt.json b/www/core/components/sharedfiles/lang/sr-lt.json new file mode 100644 index 00000000000..796ef026796 --- /dev/null +++ b/www/core/components/sharedfiles/lang/sr-lt.json @@ -0,0 +1,11 @@ +{ + "chooseaccountstorefile": "Izaberite nalog za čuvanje datoteke.", + "chooseactionrepeatedfile": "Već postoji datoteka sa ovim nazivom. Da li želite da zamenite postojeću datoteku ili da joj naziv promenite u \"{{$a}}\"?", + "errorreceivefilenosites": "Ne postoje memorisani sajtovi. Molimo, dodajte sajt pre nego što pokušate da podelite datoteke sa aplikacijom.", + "nosharedfiles": "Ne postoje deljene datoteke koje se nalaze na ovom sajtu.", + "nosharedfilestoupload": "Ovde nemate datoteke koje možete da otpremite. Ako želite da otpremite datoteku iz druge aplikacije, pronađite tu datoteku i kliknite na dugme 'Otvori u'.", + "rename": "Promeni naziv", + "replace": "Zameni", + "sharedfiles": "Deljene datoteke", + "successstorefile": "Datoteka je uspešno sačuvana. Sada možete da izaberete ovu datoteku da biste je otpremili među svoje privatne datoteke ili je pridružili nekoj aktivnosti." +} \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/ar.json b/www/core/components/sidemenu/lang/ar.json index 79a0f6adb0d..79c72d2c731 100644 --- a/www/core/components/sidemenu/lang/ar.json +++ b/www/core/components/sidemenu/lang/ar.json @@ -2,7 +2,7 @@ "appsettings": "إعدادات التطبيق", "changesite": "الخروج", "help": "مساعدة", - "logout": "خروج", - "mycourses": "مقرراتي الدراسية", + "logout": "الخروج", + "mycourses": "مقرراتي", "website": "الموقع" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/el.json b/www/core/components/sidemenu/lang/el.json index 46aa4595112..2e0168f9e01 100644 --- a/www/core/components/sidemenu/lang/el.json +++ b/www/core/components/sidemenu/lang/el.json @@ -1,5 +1,9 @@ { + "appsettings": "Ρυθμίσεις εφαρμογής", + "changesite": "Αλλαγή ιστότοπου", "help": "Βοήθεια", - "logout": "Έξοδος", - "mycourses": "Τα μαθήματά μου" + "logout": "Αποσύνδεση", + "mycourses": "Τα μαθήματά μου", + "togglemenu": "Αλλαγή μενού", + "website": "Ιστότοπος" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/sr-cr.json b/www/core/components/sidemenu/lang/sr-cr.json new file mode 100644 index 00000000000..8323e0aa5bd --- /dev/null +++ b/www/core/components/sidemenu/lang/sr-cr.json @@ -0,0 +1,9 @@ +{ + "appsettings": "Подешавања апликације", + "changesite": "Промени сајт", + "help": "Помоћ", + "logout": "Одјава", + "mycourses": "Моји курсеви", + "togglemenu": "Укључи/искључи мени", + "website": "Веб сајт" +} \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/sr-lt.json b/www/core/components/sidemenu/lang/sr-lt.json new file mode 100644 index 00000000000..aa6e18a3722 --- /dev/null +++ b/www/core/components/sidemenu/lang/sr-lt.json @@ -0,0 +1,9 @@ +{ + "appsettings": "Podešavanja aplikacije", + "changesite": "Promeni sajt", + "help": "Pomoć", + "logout": "Odjava", + "mycourses": "Moji kursevi", + "togglemenu": "Uključi/isključi meni", + "website": "Veb sajt" +} \ No newline at end of file diff --git a/www/core/components/user/lang/ar.json b/www/core/components/user/lang/ar.json index ee88dd1fe2f..33cf6dc0156 100644 --- a/www/core/components/user/lang/ar.json +++ b/www/core/components/user/lang/ar.json @@ -4,7 +4,7 @@ "contact": "جهة اتصال", "country": "الدولة", "description": "الوصف", - "details": "تفاصيل متابعة اسكو", + "details": "التفاصيل", "editingteacher": "معلم", "email": "عنوان البريد الإلكتروني", "emailagain": "إعادة إدخال البريد الإلكتروني للتأكيد ", @@ -15,7 +15,7 @@ "manager": "مدير", "newpicture": "صورة شخصية جديدة", "phone1": "هاتف", - "phone2": "رقم الهاتف المحمول", + "phone2": "الجوال", "roles": "أدوار", "student": "طالب", "viewprofile": "عرض الحساب", diff --git a/www/core/components/user/lang/da.json b/www/core/components/user/lang/da.json index b55d48a20e1..507cc600278 100644 --- a/www/core/components/user/lang/da.json +++ b/www/core/components/user/lang/da.json @@ -4,14 +4,14 @@ "contact": "Kontakt", "country": "Land", "description": "Introduktionstekst", - "details": "Følg detaljer", + "details": "Detaljer", "detailsnotavailable": "Denne brugers data er ikke tilgængelige for dig.", "editingteacher": "Lærer", "email": "E-mailadresse", "emailagain": "E-mail (igen)", "firstname": "Fornavn", "interests": "Interesser", - "invaliduser": "Ugyldig bruger", + "invaliduser": "Ugyldig bruger.", "lastname": "Efternavn", "manager": "Manager", "newpicture": "Nyt billede", diff --git a/www/core/components/user/lang/el.json b/www/core/components/user/lang/el.json index f041ebc81a0..007097ea4bb 100644 --- a/www/core/components/user/lang/el.json +++ b/www/core/components/user/lang/el.json @@ -1,20 +1,26 @@ { "address": "Διεύθυνση", "city": "Πόλη/χωριό", + "contact": "Επικοινωνία", "country": "Χώρα", "description": "Κείμενο εισαγωγής", - "details": "Παρακολούθηση λεπτομερειών", + "details": "Λεπτομέρειες", + "detailsnotavailable": "Λεπτομέρειες για αυτό τον χρήστη δεν είναι διαθέσιμες.", + "editingteacher": "Διδάσκων", "email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου", "emailagain": "Email (ξανά)", "firstname": "Όνομα", "interests": "Ενδιαφέροντα", "invaliduser": "Μη έγκυρος χρήστης", "lastname": "Επώνυμο", + "manager": "Διαχειριστής", "newpicture": "Νέα εικόνα", "phone1": "Τηλέφωνο", - "phone2": "Κινητό τηλέφωνο", + "phone2": "Κινητό", "roles": "Ρόλοι", - "student": "Φοιτητής", + "sendemail": "Email", + "student": "Μαθητής", + "teacher": "Διδάσκων χωρίς δικαιώματα αλλαγής", "viewprofile": "Επισκόπηση του προφίλ", "webpage": "Ιστοσελίδα" } \ No newline at end of file diff --git a/www/core/components/user/lang/es.json b/www/core/components/user/lang/es.json index a57e113d551..53dbd5e228c 100644 --- a/www/core/components/user/lang/es.json +++ b/www/core/components/user/lang/es.json @@ -18,6 +18,7 @@ "phone1": "Teléfono", "phone2": "Móvil", "roles": "Roles", + "sendemail": "Correo electrónico", "student": "Estudiante", "teacher": "Profesor sin permiso de edición", "viewprofile": "Ver perfil", diff --git a/www/core/components/user/lang/he.json b/www/core/components/user/lang/he.json index a4891acf920..76f6e8d241e 100644 --- a/www/core/components/user/lang/he.json +++ b/www/core/components/user/lang/he.json @@ -1,22 +1,22 @@ { "address": "כתובת", "city": "ישוב", - "contact": "ליצירת קשר", + "contact": "צור קשר", "country": "ארץ", "description": "תיאור", - "details": "דוח המעקב מפורט", + "details": "פרטים", "detailsnotavailable": "פרטי משתמש זה אינם זמינים לך.", "editingteacher": "מרצה", "email": "כתובת דואר אלקטרוני", "emailagain": "דואר אלקטרוני (שוב)", "firstname": "שם פרטי", "interests": "תחומי עניין", - "invaliduser": "משתמש שגוי", + "invaliduser": "משתמש לא תקף.", "lastname": "שם משפחה", "manager": "מנהל", "newpicture": "תמונה חדשה", "phone1": "טלפון", - "phone2": "טלפון נייד", + "phone2": "סלולרי", "roles": "תפקידים", "student": "סטודנט", "teacher": "עוזר/ת הוראה", diff --git a/www/core/components/user/lang/ja.json b/www/core/components/user/lang/ja.json index ed89cc07550..1d661257fae 100644 --- a/www/core/components/user/lang/ja.json +++ b/www/core/components/user/lang/ja.json @@ -1,10 +1,10 @@ { "address": "住所", "city": "都道府県", - "contact": "連絡先", + "contact": "コンタクト", "country": "国", "description": "説明", - "details": "トラック詳細", + "details": "詳細", "email": "メールアドレス", "emailagain": "メールアドレス (もう一度)", "firstname": "名", diff --git a/www/core/components/user/lang/sr-cr.json b/www/core/components/user/lang/sr-cr.json new file mode 100644 index 00000000000..8770ab16865 --- /dev/null +++ b/www/core/components/user/lang/sr-cr.json @@ -0,0 +1,12 @@ +{ + "contact": "Контакт", + "details": "Подаци о кориснику", + "detailsnotavailable": "Подаци о овом кориснику вам нису доступни.", + "editingteacher": "Предавач", + "invaliduser": "Неисправан корисник.", + "manager": "Менаџер", + "phone2": "Мобилни", + "sendemail": "Е-пошта", + "student": "Полазник", + "teacher": "Предавач без уређивачких права" +} \ No newline at end of file diff --git a/www/core/components/user/lang/sr-lt.json b/www/core/components/user/lang/sr-lt.json new file mode 100644 index 00000000000..96a85eb0ff5 --- /dev/null +++ b/www/core/components/user/lang/sr-lt.json @@ -0,0 +1,12 @@ +{ + "contact": "Kontakt", + "details": "Podaci o korisniku", + "detailsnotavailable": "Podaci o ovom korisniku vam nisu dostupni.", + "editingteacher": "Predavač", + "invaliduser": "Neispravan korisnik.", + "manager": "Menadžer", + "phone2": "Mobilni", + "sendemail": "E-pošta", + "student": "Polaznik", + "teacher": "Predavač bez uređivačkih prava" +} \ No newline at end of file diff --git a/www/core/lang/ar.json b/www/core/lang/ar.json index a16f56062b9..60af9e74633 100644 --- a/www/core/lang/ar.json +++ b/www/core/lang/ar.json @@ -103,7 +103,7 @@ "required": "مفروض", "save": "حفظ", "search": "بحث", - "searching": "بحث في", + "searching": "يتم البحث", "searchresults": "نتائج البحث", "sec": "ثانية", "secs": "ثواني", diff --git a/www/core/lang/da.json b/www/core/lang/da.json index 847a8e2b5f1..fdb455e8fae 100644 --- a/www/core/lang/da.json +++ b/www/core/lang/da.json @@ -16,12 +16,12 @@ "close": "Luk", "comments": "Dine kommentarer", "commentscount": "Kommentarer ({{$a}})", - "completion-alt-auto-fail": "Gennemført: {{$a}} (opnåede ikke beståelseskarakter)", + "completion-alt-auto-fail": "Gennemført: {{$a}} (bestod ikke)", "completion-alt-auto-n": "Ikke gennemført: {{$a}}", - "completion-alt-auto-pass": "Gennemført: {{$a}} (opnåede beståelseskarakter)", + "completion-alt-auto-pass": "Gennemført: {{$a}} (bestod)", "completion-alt-auto-y": "Gennemført: {{$a}}", - "completion-alt-manual-n": "Ikke gennemført: {{$a}}. Vælg for at markere som gennemført.", - "completion-alt-manual-y": "Gennemført: {{$a}}. Vælg for at markere som ikke gennemført.", + "completion-alt-manual-n": "Ikke gennemført: {{$a}}. Vælg til markering som gennemført.", + "completion-alt-manual-y": "Gennemført: {{$a}}. Vælg til markering som ikke gennemført.", "confirmcanceledit": "Er du sikker på at du vil forlade denne side? Alle ændringer vil gå tabt.", "confirmdeletefile": "Er du sikker på at du vil slette denne fil?", "confirmopeninbrowser": "Vil du åbne den i en browser?", @@ -115,7 +115,7 @@ "notice": "Bemærk", "now": "nu", "numwords": "{{$a}} ord", - "offline": "Der kræves ikke online-aflevering", + "offline": "Offline", "online": "Online", "openfullimage": "Klik her for at vise billedet i fuld størrelse.", "openinbrowser": "Åben i browser", @@ -130,7 +130,7 @@ "requireduserdatamissing": "Denne bruger mangler nogle krævede profildata. Udfyld venligst de manglende data i din Moodle og prøv igen.
{{$a}}", "save": "Gem", "search": "Søg", - "searching": "Søg i", + "searching": "Søger", "searchresults": "Søgeresultater", "sec": "sekunder", "secs": "sekunder", @@ -147,7 +147,7 @@ "sizetb": "TB", "start": "Start", "submit": "Gem", - "success": "Succes", + "success": "Succes!", "tablet": "Tablet", "teachers": "Undervisere", "time": "Tidspunkt", diff --git a/www/core/lang/el.json b/www/core/lang/el.json index 01ffb362a04..0a1f805526f 100644 --- a/www/core/lang/el.json +++ b/www/core/lang/el.json @@ -25,10 +25,12 @@ "completion-alt-manual-y": "Ολοκληρώθηκε: {{$a}}. Επιλέξτε για να οριστεί ως μη ολοκληρωμένο.", "confirmcanceledit": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν τη σελίδα; Όλες οι αλλαγές θα χαθούν.", "confirmdeletefile": "Είστε σίγουροι οτι θέλετε να διαγράψετε αυτό το αρχείο?", + "confirmloss": "Είστε σίγουροι? Όλες οι αλλαγές θα χαθούν.", "confirmopeninbrowser": "Θέλετε να το ανοίξετε στο πρόγραμμα περιήγησης;", "content": "Περιεχόμενο", "contenteditingsynced": "Το περιεχόμενο που επεξεργάζεστε έχει συγχρονιστεί.", "continue": "Συνέχεια", + "copiedtoclipboard": "Το κείμενο αντιγράφηκε στο πρόχειρο", "course": "Μάθημα", "coursedetails": "Λεπτομέρειες μαθήματος", "currentdevice": "Τρέχουσα συσκευή", @@ -42,6 +44,7 @@ "description": "Κείμενο εισαγωγής", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", + "dffulldate": "dddd, D MMMM YYYY h[:]mm A", "dflastweekdate": "ddd", "dfmediumdate": "LLL", "dftimedate": "h[:]mm A", @@ -51,6 +54,7 @@ "download": "Μεταφόρτωση", "downloading": "Κατέβασμα", "edit": "Edit", + "emptysplit": "Αυτή η σελίδα θα εμφανιστεί κενή, εάν ο αριστερός πίνακας είναι κενός ή φορτώνεται.", "error": "Σφάλμα", "errorchangecompletion": "Παρουσιάστηκε σφάλμα κατά την αλλαγή της κατάστασης ολοκλήρωσης. Παρακαλώ προσπαθήστε ξανά.", "errordeletefile": "Σφάλμα κατά τη διαγραφή του αρχείου. Παρακαλώ προσπαθήστε ξανά.", @@ -59,6 +63,7 @@ "errorfileexistssamename": "Υπάρχει ήδη ένα αρχείο με αυτό το όνομα.", "errorinvalidform": "Η φόρμα περιέχει μη έγκυρα δεδομένα. Παρακαλούμε φροντίστε να συμπληρώσετε όλα τα απαιτούμενα πεδία και ότι τα δεδομένα είναι έγκυρα.", "errorinvalidresponse": "Ελήφθη μη έγκυρη απάντηση. Επικοινωνήστε με το διαχειριστή εάν το πρόβλημα επιμείνει.", + "errorloadingcontent": "Σφάλμα κατά τη φόρτωση περιεχομένου.", "erroropenfilenoapp": "Σφάλμα κατά το άνοιγμα του αρχείου: δεν βρέθηκε εφαρμογή για το άνοιγμα αυτού του είδους αρχεία.", "erroropenfilenoextension": "Σφάλμα κατά το άνοιγμα του αρχείου: το αρχείο δεν έχει επέκταση.", "erroropenpopup": "Αυτή η δραστηριότητα προσπαθεί να ανοίξει ένα αναδυόμενο παράθυρο. Αυτό δεν υποστηρίζεται σε αυτή την εφαρμογή.", @@ -87,6 +92,7 @@ "lastsync": "Τελευταίος συγχρονισμός", "listsep": ";", "loading": "Φορτώνει", + "loadmore": "Φόρτωση περισσότερων", "lostconnection": "Η σύνδεσή σας είναι άκυρη ή έχει λήξει. Πρέπει να ξανασυνδεθείτε στο site.", "maxsizeandattachments": "Μέγιστο μέγεθος για νέα αρχεία: {{$a.size}}, μέγιστος αριθμός συνημμένων: {{$a.attachments}}", "min": "λεπτό", @@ -183,6 +189,8 @@ "twoparagraphs": "{{p1}}

{{p2}}", "uhoh": "Uh oh!", "unexpectederror": "Απρόσμενο σφάλμα. Κλείστε και ανοίξτε ξανά την εφαρμογή για να προσπαθήσετε ξανά", + "unicodenotsupported": "Ορισμένα emojis δεν υποστηρίζονται σε αυτόν τον ιστότοπο. Αυτοί οι χαρακτήρες θα αφαιρεθούν κατά την αποστολή του μηνύματος.", + "unicodenotsupportedcleanerror": "Κενό κείμενο βρέθηκε κατά τον καθαρισμό χαρακτήρων Unicode.", "unknown": "Άγνωστο", "unlimited": "Χωρίς περιορισμό", "unzipping": "Αποσυμπίεση", diff --git a/www/core/lang/es.json b/www/core/lang/es.json index 708e85381b9..24c93e6d7bd 100644 --- a/www/core/lang/es.json +++ b/www/core/lang/es.json @@ -25,10 +25,12 @@ "completion-alt-manual-y": "Finalizado; {{$a}} seleccione para marcar como no finalizado", "confirmcanceledit": "¿Está usted seguro de que quiere abandonar esta página? Se perderán todos los cambios.", "confirmdeletefile": "¿Está seguro de que desea eliminar este archivo?", + "confirmloss": "¿Está seguro? Se perderán todos los cambios.", "confirmopeninbrowser": "¿Quiere abrirlo en el navegador?", "content": "Contenido", "contenteditingsynced": "El contenido que está editando ha sido sincronizado.", "continue": "Continuar", + "copiedtoclipboard": "Texto copiado al portapapeles", "course": "Curso", "coursedetails": "Detalles del curso", "currentdevice": "Dispositivo actual", @@ -42,6 +44,7 @@ "description": "Descripción", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", + "dffulldate": "dddd, D MMMM YYYY h[:]mm A", "dflastweekdate": "ddd", "dfmediumdate": "LLL", "dftimedate": "h[:]mm A", @@ -51,6 +54,7 @@ "download": "Descargar", "downloading": "Descargando...", "edit": "Edición", + "emptysplit": "Esta página aparecerá en blanco si el panel izquierdo está vacío o si está cargando.", "error": "Error", "errorchangecompletion": "Ha ocurrido un error cargando el grado de realización. Por favor inténtalo de nuevo.", "errordeletefile": "Error al eliminar el archivo. Por favor inténtelo de nuevo.", @@ -59,6 +63,7 @@ "errorfileexistssamename": "Ya existe un archivo con este nombre.", "errorinvalidform": "El formulario contiene datos inválidos. Por favor, asegúrese de rellenar todos los campos requeridos y que los datos son válidos.", "errorinvalidresponse": "Se ha recibido una respuesta no válida. Por favor contactar con el administrador de Moodle si el error persiste.", + "errorloadingcontent": "Error cargando contenido.", "erroropenfilenoapp": "Error durante la apertura del archivo: no se encontró ninguna aplicación capaz de abrir este tipo de archivo.", "erroropenfilenoextension": "Se ha producido un error abriendo el archivo: el archivo no tiene extensión.", "erroropenpopup": "Esta actividad está intentando abrir una ventana emergente. Esta aplicación no lo soporta.", @@ -88,6 +93,7 @@ "lastsync": "Última sincronización", "listsep": ";", "loading": "Cargando", + "loadmore": "Cargar más", "lostconnection": "Hemos perdido la conexión, necesita reconectar. Su token ya no es válido", "maxsizeandattachments": "Tamaño máximo para nuevos archivos: {{$a.size}}, número máximo de archivos adjuntos: {{$a.attachments}}", "min": "minutos", @@ -185,6 +191,8 @@ "twoparagraphs": "{{p1}}

{{p2}}", "uhoh": "¡Oh oh!", "unexpectederror": "Error inesperado. Por favor cierre y vuelva a abrir la aplicación para intentarlo de nuevo", + "unicodenotsupported": "Los emojis no están soportado en este sitio; esos caracteres serán quitados cuando el mensaje sea enviado.", + "unicodenotsupportedcleanerror": "Se encontró texto vacío al limpiar caracteres Unicode.", "unknown": "Desconocido", "unlimited": "Sin límite", "unzipping": "Descomprimiendo", diff --git a/www/core/lang/fr.json b/www/core/lang/fr.json index 6b59ade573d..e6a40702a51 100644 --- a/www/core/lang/fr.json +++ b/www/core/lang/fr.json @@ -45,6 +45,7 @@ "description": "Description", "dfdaymonthyear": "DD-MM-YYYY", "dfdayweekmonth": "ddd, D MMM", + "dffulldate": "dddd, D MMMM YYYY h[:]mm A", "dflastweekdate": "ddd", "dfmediumdate": "LLL", "dftimedate": "hh[:]mm", @@ -54,6 +55,7 @@ "download": "Télécharger", "downloading": "Téléchargement en cours", "edit": "Modifier", + "emptysplit": "Cette page paraîtra vide si le panneau de gauche est vide ou en cours de chargement.", "error": "Erreur", "errorchangecompletion": "Une erreur est survenue lors du changement de l'état d'achèvement. Veuillez essayer à nouveau.", "errordeletefile": "Erreur lors de la suppression du fichier. Veuillez essayer à nouveau.", @@ -92,6 +94,7 @@ "lastsync": "Dernière synchronisation", "listsep": ";", "loading": "Chargement", + "loadmore": "Charger plus", "lostconnection": "Connexion perdue. Vous devez vous reconnecter. Votre jeton n'est plus valide", "maxsizeandattachments": "Taille maximale des nouveaux fichiers : {{$a.size}}. Nombre maximal d'annexes : {{$a.attachments}}", "min": "min", @@ -189,7 +192,7 @@ "twoparagraphs": "{{p1}}

{{p2}}", "uhoh": "Aïe !", "unexpectederror": "Erreur inattendue. Veuillez fermer et rouvrir l'app pour continuer", - "unicodenotsupported": "Les caractères encodés en Unicode, par exemple les emojis, ne sont pas supportés sur ce site. Ces caractères seront supprimés avant l'envoi.", + "unicodenotsupported": "Certains emojis ne sont pas supportés sur ce site. Ils seront supprimés avant l'envoi.", "unicodenotsupportedcleanerror": "Un texte vide a été rencontré lors du nettoyage des caractères Unicode.", "unknown": "Inconnu", "unlimited": "Illimité", diff --git a/www/core/lang/he.json b/www/core/lang/he.json index d0306063c87..63788a56caf 100644 --- a/www/core/lang/he.json +++ b/www/core/lang/he.json @@ -14,12 +14,12 @@ "close": "סגירה", "comments": "ההערות שלך", "commentscount": "({{$a}}) הערות", - "completion-alt-auto-fail": "הושלם: {{$a}} (לא השיג ציון עובר)", + "completion-alt-auto-fail": "הושלם: {{$a}} (לא הושג ציון עובר)", "completion-alt-auto-n": "לא הושלם: {{$a}}", - "completion-alt-auto-pass": "הושלם: {{$a}} (השיג ציון עובר)", + "completion-alt-auto-pass": "הושלם: {{$a}} (הושג ציון עובר)", "completion-alt-auto-y": "הושלם: {{$a}}", - "completion-alt-manual-n": "{{$a}} לא הושלם. הקליקו לסימון כ\"הושלם\"", - "completion-alt-manual-y": "{{$a}} הושלם. הקליקו לסימון כ\"לא הושלם\"", + "completion-alt-manual-n": "לא הושלם: {{$a}}. יש לבחור כדי לסמן כ:הושלם.", + "completion-alt-manual-y": "הושלם: {{$a}}. יש לבחור כדי לסמן כ:לא-הושלם.", "confirmdeletefile": "האם הינך בטוח כי ברצונך למחוק את קובץ זה?", "content": "תוכן", "continue": "המשך", @@ -105,8 +105,8 @@ "notice": "לתשומת לב", "now": "עכשיו", "numwords": "{{$a}} מילים", - "offline": "לא נדרשות הגשות מקוונות", - "online": "מקוון", + "offline": "לא מחובר", + "online": "מחובר", "openfullimage": "יש להקליק כאן להצגת התמונה בגודל מלא", "openinbrowser": "תצוגה בדפדפן", "pagea": "עמוד {{$a}}", @@ -125,7 +125,7 @@ "secs": "שניות", "seemoredetail": "הקליקו כאן כדי לראות פרטים נוספים", "send": "שליחה", - "sending": "שולחים", + "sending": "שולח", "serverconnection": "שגיאה בהתחברות לשרת", "show": "הצגה", "site": "מערכת", @@ -135,7 +135,7 @@ "sizemb": "MB", "start": "התחלה", "submit": "שמירה", - "success": "הצלחה", + "success": "הצלחה!", "tablet": "טאבלט", "teachers": "מורים", "time": "זמן", diff --git a/www/core/lang/ja.json b/www/core/lang/ja.json index 72124e5922a..27ba12cde6a 100644 --- a/www/core/lang/ja.json +++ b/www/core/lang/ja.json @@ -1,56 +1,100 @@ { + "accounts": "アカウント", "allparticipants": "すべての参加者", + "android": "Android", "areyousure": "本当によろしいですか?", "back": "戻る", "cancel": "キャンセル", "cannotconnect": "接続できません:正しいURLを入力しているか、サイトのMoodleが2.4以降であることを確認してください。", + "cannotdownloadfiles": "ダウンロードしようとしているファイルは、あなたのモバイルサービスでは無効になっています。あなたのサイト管理者に連絡してください。", "category": "カテゴリ", "choose": "選択", "choosedots": "選択 ...", + "clearsearch": "検索のクリア", "clicktohideshow": "展開または折りたたむにはここをクリックしてください。", + "clicktoseefull": "クリックで全てのコンテンツを見る", "close": "閉じる", "comments": "あなたのコメント", "commentscount": "コメント ({{$a}})", - "completion-alt-auto-fail": "完了: {{$a}} (合格点未到達)", - "completion-alt-auto-n": "未完了: {{$a}}", - "completion-alt-auto-pass": "完了: {{$a}} (合格点到達)", + "commentsnotworking": "コメントが取得できませんでした", + "completion-alt-auto-fail": "完了: {{$a}} (合格点に達していない)", + "completion-alt-auto-n": "未了: {{$a}}", + "completion-alt-auto-pass": "完了: {{$a}} (合格点達成)", "completion-alt-auto-y": "完了: {{$a}}", - "completion-alt-manual-n": "未完了: {{$a}} 完了マークするには選択してください。", - "completion-alt-manual-y": "完了: {{$a}} 未完了マークするには選択してください。", + "completion-alt-manual-n": "未了: {{$a}}。選択して完了に変更してください。", + "completion-alt-manual-y": "完了: {{$a}}。選択して未了に変更してください。", + "confirmcanceledit": "本当にこのページを離れますか? 全ての変更が失われます。", "confirmdeletefile": "本当にこのファイルを削除してもよろしいですか?", + "confirmloss": "本当ですか? すべての変更が失われます。", + "confirmopeninbrowser": "これをブラウザで開きますか?", "content": "コンテンツ", + "contenteditingsynced": "編集中のコンテンツが同期されました。", "continue": "続ける", + "copiedtoclipboard": "クリップボードにコピーされたテキスト", "course": "コース", "coursedetails": "コース詳細", + "currentdevice": "現在のデバイス", + "datastoredoffline": "送信できなかったため、データはデバイスに保存されました。後で自動的に送信されます。", "date": "日付", "day": "日", "days": "日", "decsep": ".", "defaultvalue": "デフォルト ({{$a}})", "delete": "削除", - "deleting": "削除中", + "deleting": "消去中", "description": "説明", + "dfdaymonthyear": "YYYY/MM/DD", + "dfdayweekmonth": "MMM月D日(ddd)", + "dffulldate": "YYYY年MMMM月D日(dddd) h[:]mm A", + "dflastweekdate": "ddd", + "dfmediumdate": "LLL", + "dftimedate": "h[:]mm A", + "discard": "無視", + "dismiss": "取消", "done": "完了", "download": "ダウンロード", - "downloading": "ダウンロード中 ...", + "downloading": "ダウンロード中", "edit": "編集", + "emptysplit": "左パネルが空またはロード中のため本ページは空白", "error": "エラー", - "errordownloading": "ファイルのダウンロードのエラー", + "errorchangecompletion": "完了状態の変更中にエラーが発生しました。再度実行してください。", + "errordeletefile": "ファイル消去中にエラーが発生しました。再度実行してください。", + "errordownloading": "ファイルダウンロードのエラー", + "errordownloadingsomefiles": "モジュールファイルのダウンロード中にエラーが発生しました。欠落しているファイルがあるかもしれません。", + "errorfileexistssamename": "同じ名前のファイルがあります。", + "errorinvalidform": "フォームに不正なデータが含まれています。必須フィールドすべてが記入され、データが正しいことを確認してください。", + "errorinvalidresponse": "不正な返信を受信しました。エラーが連続する場合、あなたのMoodleサイト管理者に連絡をとってください。", + "errorloadingcontent": "コンテンツのロード中にエラーが発生しました。", + "erroropenfilenoapp": "ファイルを開く際にエラーが発生しました。この種のファイルを開くアプリが見つかりません。", + "erroropenfilenoextension": "ファイルを開く際にエラーが発生しました。ファイルに拡張子がありません。", + "erroropenpopup": "このアクティビティはポップアップを開こうとしています。本アプリではサポートされていません。", + "errorrenamefile": "ファイル名変更でエラーが発生しました。再度実行してください。", + "errorsync": "同期中にエラーが発生しました。再度実行してください。", + "errorsyncblocked": "実行中のプロセスがあったため、この {{$a}} はすぐに同期できませんでした。再度実行してください。問題が継続する場合、アプリを再起動してください。", "filename": "ファイル名", + "filenameexist": "ファイル名がすでに存在しています:{{$a}}", "folder": "フォルダ", "forcepasswordchangenotice": "続けるにはパスワードを変更してください。", "fulllistofcourses": "すべてのコース", + "fullnameandsitename": "{{fullname}} ({{sitename}})", "groupsseparate": "分離グループ", "groupsvisible": "可視グループ", + "hasdatatosync": "この {{$a}} には同期すべきオフラインデータがあります。", "help": "ヘルプ", "hide": "非表示", "hour": "時間", "hours": "時間", + "humanreadablesize": "{{size}} {{unit}}", + "image": "画像", + "imageviewer": "画像ビューア", "info": "情報", + "ios": "iOS", "labelsep": ":", "lastmodified": "最終更新日時", + "lastsync": "最後の同期", "listsep": ",", "loading": "読み込み", + "loadmore": "続きを読み込む", "lostconnection": "あなたのトークンが無効になったため、再接続に必要な情報がサーバにはありません。", "maxsizeandattachments": "新しいファイルの最大サイズ: {{$a.size}} / 最大添付: {{$a.attachments}}", "min": "分", @@ -68,6 +112,7 @@ "mod_survey": "調査", "mod_wiki": "Wiki", "moduleintro": "説明", + "mygroups": "マイグループ", "name": "名称", "networkerrormsg": "ネットワークが無効もしくは機能していません", "never": "なし", @@ -76,23 +121,33 @@ "nocomments": "コメントなし", "nograde": "評点なし", "none": "なし", - "nopasswordchangeforced": "あなたはパスワードを変更せずに次へ進むことはできません。しかし、パスワードを変更するため利用できるページがありません。あなたのMoodle管理者にご連絡ください。", + "nopasswordchangeforced": "パスワードを変更するまで続きを実行できません。", "nopermissions": "申し訳ございません、現在、あなたは 「 {{$a}} 」を実行するためのパーミッションがありません。", "noresults": "該当データがありません。", + "notapplicable": "なし", "notice": "警告", + "notsent": "未送信", "now": "現在", "numwords": "{{$a}} 語", - "offline": "オンライン提出不要", + "offline": "オフライン", "online": "オンライン", + "openfullimage": "クリックしてフルサイズの画像を表示", + "openinbrowser": "ブラウザで開く", + "othergroups": "他のグループ", "pagea": "ページ {{$a}}", + "percentagenumber": "{{$a}}%", "phone": "電話", "pictureof": "画像 {{$a}}", "previous": "前へ", + "pulltorefresh": "引いて更新", + "redirectingtosite": "サイトにリダイレクトされます。", "refresh": "リフレッシュ", "required": "必須", + "requireduserdatamissing": "このユーザは必須のプロフィールデータが欠けています。Moodleでデータを補い、再度開いてください。
{{$a}}", + "retry": "再実行", "save": "保存", "search": "検索", - "searching": "検索:", + "searching": "検索中", "searchresults": "検索結果", "sec": "秒", "secs": "秒", @@ -101,21 +156,33 @@ "sending": "送信中", "serverconnection": "サーバへの接続中にエラーが発生しました。", "show": "表示", + "showmore": "さらに表示...", "site": "サイト", + "sitemaintenance": "サイトがメンテナンス中のため、現在利用できません。", "sizeb": "バイト", "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", + "sizetb": "TB", + "sorry": "すみません...", "start": "開始", "submit": "送信", - "success": "成功", + "success": "成功!", + "tablet": "タブレット", "teachers": "教師", + "thereisdatatosync": "同期が必要なオフライン {{$a}} があります。", "time": "時間", "timesup": "時間終了!", "today": "本日", + "tryagain": "再実行", + "twoparagraphs": "{{p1}}

{{p2}}", + "uhoh": "おおっと!", "unexpectederror": "不明なエラー。アプリを閉じて再起動してみてください。", - "unknown": "不明", + "unicodenotsupported": "本サイトでは一部の絵文字がサポートされていません。それらは送信されたメッセージから削除されます。", + "unicodenotsupportedcleanerror": "Unicode文字をクリアする際に空のテキストがありました。", + "unknown": "不明な", "unlimited": "無制限", + "unzipping": "未展開の", "upgraderunning": "サイトはアップグレード中です。後ほどお試しください。", "userdeleted": "このユーザのアカウントは削除されました。", "userdetails": "ユーザ詳細", @@ -123,6 +190,8 @@ "users": "ユーザ", "view": "表示", "viewprofile": "プロファイルを表示する", + "whoops": "しまった!", + "windowsphone": "Windows Phone", "year": "年", "years": "年", "yes": "Yes" diff --git a/www/core/lang/sr-cr.json b/www/core/lang/sr-cr.json new file mode 100644 index 00000000000..68915a26c2f --- /dev/null +++ b/www/core/lang/sr-cr.json @@ -0,0 +1,95 @@ +{ + "accounts": "Налози", + "android": "Андроид", + "cannotconnect": "Није могуће успоставити везу. Проверите да ли сте унели исправну URL адресу и да ли ваш сајт користи Moodle 2.4 или новију верзију.", + "cannotdownloadfiles": "Преузимање датотека је онемогућено у подешавањима вашег мобилног сервиса. Обратите се администратору сајта.", + "clearsearch": "Обриши претрагу", + "clicktoseefull": "Кликните да бисте видели комплетан садржај.", + "commentsnotworking": "Коментари не могу да буду преузети", + "completion-alt-auto-fail": "Завршено: {{$a}} (није постигнута прелазна оцена)", + "completion-alt-auto-n": "Није завршено: {{$a}}", + "completion-alt-auto-pass": "Завршено: {{$a}} (постигнута прелазна оцена)", + "completion-alt-auto-y": "Завршено: {{$a}}", + "completion-alt-manual-n": "Није завршено: {{$a}}. Изаберите да бисте означили као завршено.", + "completion-alt-manual-y": "Завршено: {{$a}}. Изаберите да бисте означили као незавршено.", + "confirmcanceledit": "Да ли сте сигурни да желите да напустите ову страницу? Све промене ће бити изгубљене.", + "confirmloss": "Да ли сте сигурни? Све промене ће бити изгубљене.", + "confirmopeninbrowser": "Да ли желите да отворите у веб читачу?", + "contenteditingsynced": "Садржај који уређујете је синхронизован.", + "copiedtoclipboard": "Текст копиран у клипборд", + "currentdevice": "Тренутни уређај", + "datastoredoffline": "Подаци су сачувани у мобилном уређају, зато што не могу да се пошаљу. Аутоматски ће бити послати касније.", + "deleting": "Брисање", + "dfdaymonthyear": "MM-DD-YYYY", + "dfdayweekmonth": "ddd, D MMM", + "dffulldate": "dddd, D MMMM YYYY h[:]mm A", + "dflastweekdate": "ddd", + "dfmediumdate": "LLL", + "dftimedate": "h[:]mm A", + "discard": "Одбаци", + "dismiss": "Обустави", + "downloading": "Преузимање", + "emptysplit": "Ова страница ће се појавити празна уколико је леви панел празан или се учитава.", + "errorchangecompletion": "Дошло је до грешке приликом промене статуса завршетка. Молимо, покушајте поново.", + "errordeletefile": "Грешка приликом брисања датотеке. Молимо, покушајте поново.", + "errordownloading": "Грешка приликом преузимања датотеке.", + "errordownloadingsomefiles": "Грешка приликом преузимања датотека модула. Могуће је да неке датотеке недостају.", + "errorfileexistssamename": "Већ постоји датотека са овим називом.", + "errorinvalidform": "Образац садржи неисправне податке. Уверите се да сте попунили сва неопходна поља и да су подаци исправни.", + "errorinvalidresponse": "Примљен је неисправан одговор. Обратите се администратору вашег Moodle сајта ако се грешка понови.", + "errorloadingcontent": "Грешка при учитавању садржаја.", + "erroropenfilenoapp": "Грешка приликом отварања датотеке: није пронађена апликација која може да отвори овај тип датотеке.", + "erroropenfilenoextension": "Грешка приликом отварања датотеке: датотека нема екстензију.", + "erroropenpopup": "Ова активност покушава да отвори искачући прозор. Ова апликација то не подржава.", + "errorrenamefile": "Грешка приликом покушаја промене назива датотеке. Молимо, покушајте поново.", + "errorsync": "Дошло је до грешке приликом синхронизацији. Молимо, покушајте поново.", + "errorsyncblocked": "{{$a}} тренутно не може да се синхронизује због текућег процеса. Молимо, покушајте поново касније. Ако се проблем и даље буде постојао, покушајте поново да покренете апликацију.", + "filenameexist": "Назив датотеке већ постоји: {{$a}}", + "fullnameandsitename": "{{fullname}} ({{sitename}})", + "hasdatatosync": "{{$a}} има офлајн податке које треба синхронизовати.", + "humanreadablesize": "{{size}} {{unit}}", + "image": "Слика", + "imageviewer": "Приказивач слике", + "info": "Инфо", + "ios": "iOS", + "lastsync": "Последња синхронизација", + "loadmore": "Учитај још", + "lostconnection": "Ваш токен за потврду идентитета је неважећи или је истекао. Мораћете поново да успоставите везу са сајтом.", + "mygroups": "Моје групе", + "networkerrormsg": "Мрежа није укључена или не ради.", + "nopasswordchangeforced": "Не можете наставити без промене своје лозинке.", + "notapplicable": "n/a", + "notsent": "Није послато", + "offline": "Офлајн", + "online": "Онлајн", + "openfullimage": "Кликните овде да бисте приказали слику у пуној величини", + "openinbrowser": "Отвори у веб читачу", + "othergroups": "Друге групе", + "percentagenumber": "{{$a}}%", + "pulltorefresh": "Повуците за освежавање", + "redirectingtosite": "Бићете преусмерени на сајт.", + "requireduserdatamissing": "Овај корисник нема у свом профилу неке неопходне податке. Молимо вас, унесети ове податке у ваш Moodle и покушајте поново.
{{$a}}", + "retry": "Покушај поново", + "searching": "Претраживање", + "sending": "Слање", + "showmore": "Прикажи још...", + "sitemaintenance": "Сајт је у режиму одржавања и тренутно није доступан", + "sizetb": "TB", + "sorry": "Извините...", + "success": "Успешно!", + "tablet": "Таблет", + "thereisdatatosync": "Број офлајн податак које треба синхронизовати: {{$a}}", + "tryagain": "Покушај поново", + "twoparagraphs": "{{p1}}

{{p2}}", + "uhoh": "Ух!", + "unexpectederror": "Неочекивана грешка. Затворите и поново отворите апликацију како бисте покушали поново.", + "unicodenotsupported": "Неки емотикони нису подржани на овом сајту. Такви карактери ће бити уклоњени приликом слања поруке.", + "unicodenotsupportedcleanerror": "Приликом чишћења Unicode карактера пронађен је празан текст.", + "unknown": "Непознато", + "unzipping": "Распакивање", + "warningofflinedatadeleted": "Офлајн подаци компоненте {{component}} '{{name}}' су обрисани. {{error}}", + "whoops": "Упс!", + "whyisthishappening": "Зашто се ово дешава?", + "windowsphone": "Windows Phone", + "wsfunctionnotavailable": "Функција Webservice није доступна." +} \ No newline at end of file diff --git a/www/core/lang/sr-lt.json b/www/core/lang/sr-lt.json new file mode 100644 index 00000000000..efcfe49fee4 --- /dev/null +++ b/www/core/lang/sr-lt.json @@ -0,0 +1,95 @@ +{ + "accounts": "Nalozi", + "android": "Android", + "cannotconnect": "Nije moguće uspostaviti vezu. Proverite da li ste uneli ispravnu URL adresu i da li vaš sajt koristi Moodle 2.4 ili noviju verziju.", + "cannotdownloadfiles": "Preuzimanje datoteka je onemogućeno u podešavanjima vašeg mobilnog servisa. Obratite se administratoru sajta.", + "clearsearch": "Obriši pretragu", + "clicktoseefull": "Kliknite da biste videli kompletan sadržaj.", + "commentsnotworking": "Komentari ne mogu da budu preuzeti", + "completion-alt-auto-fail": "Završeno: {{$a}} (nije postignuta prelazna ocena)", + "completion-alt-auto-n": "Nije završeno: {{$a}}", + "completion-alt-auto-pass": "Završeno: {{$a}} (postignuta prelazna ocena)", + "completion-alt-auto-y": "Završeno: {{$a}}", + "completion-alt-manual-n": "Nije završeno: {{$a}}. Izaberite da biste označili kao završeno.", + "completion-alt-manual-y": "Završeno: {{$a}}. Izaberite da biste označili kao nezavršeno.", + "confirmcanceledit": "Da li ste sigurni da želite da napustite ovu stranicu? Sve promene će biti izgubljene.", + "confirmloss": "Da li ste sigurni? Sve promene će biti izgubljene.", + "confirmopeninbrowser": "Da li želite da otvorite u veb čitaču?", + "contenteditingsynced": "Sadržaj koji uređujete je sinhronizovan.", + "copiedtoclipboard": "Tekst kopiran u klipbord", + "currentdevice": "Trenutni uređaj", + "datastoredoffline": "Podaci su sačuvani u mobilnom uređaju, zato što ne mogu da se pošalju. Automatski će biti poslati kasnije.", + "deleting": "Brisanje", + "dfdaymonthyear": "MM-DD-YYYY", + "dfdayweekmonth": "ddd, D MMM", + "dffulldate": "dddd, D MMMM YYYY h[:]mm A", + "dflastweekdate": "ddd", + "dfmediumdate": "LLL", + "dftimedate": "h[:]mm A", + "discard": "Odbaci", + "dismiss": "Obustavi", + "downloading": "Preuzimanje", + "emptysplit": "Ova stranica će se pojaviti prazna ukoliko je levi panel prazan ili se učitava.", + "errorchangecompletion": "Došlo je do greške prilikom promene statusa završetka. Molimo, pokušajte ponovo.", + "errordeletefile": "Greška prilikom brisanja datoteke. Molimo, pokušajte ponovo.", + "errordownloading": "Greška prilikom preuzimanja datoteke.", + "errordownloadingsomefiles": "Greška prilikom preuzimanja datoteka modula. Moguće je da neke datoteke nedostaju.", + "errorfileexistssamename": "Već postoji datoteka sa ovim nazivom.", + "errorinvalidform": "Obrazac sadrži neispravne podatke. Uverite se da ste popunili sva neophodna polja i da su podaci ispravni.", + "errorinvalidresponse": "Primljen je neispravan odgovor. Obratite se administratoru vašeg Moodle sajta ako se greška ponovi.", + "errorloadingcontent": "Greška pri učitavanju sadržaja.", + "erroropenfilenoapp": "Greška prilikom otvaranja datoteke: nije pronađena aplikacija koja može da otvori ovaj tip datoteke.", + "erroropenfilenoextension": "Greška prilikom otvaranja datoteke: datoteka nema ekstenziju.", + "erroropenpopup": "Ova aktivnost pokušava da otvori iskačući prozor. Ova aplikacija to ne podržava.", + "errorrenamefile": "Greška prilikom pokušaja promene naziva datoteke. Molimo, pokušajte ponovo.", + "errorsync": "Došlo je do greške prilikom sinhronizaciji. Molimo, pokušajte ponovo.", + "errorsyncblocked": "{{$a}} trenutno ne može da se sinhronizuje zbog tekućeg procesa. Molimo, pokušajte ponovo kasnije. Ako se problem i dalje bude postojao, pokušajte ponovo da pokrenete aplikaciju.", + "filenameexist": "Naziv datoteke već postoji: {{$a}}", + "fullnameandsitename": "{{fullname}} ({{sitename}})", + "hasdatatosync": "{{$a}} ima oflajn podatke koje treba sinhronizovati.", + "humanreadablesize": "{{size}} {{unit}}", + "image": "Slika", + "imageviewer": "Prikazivač slike", + "info": "Info", + "ios": "iOS", + "lastsync": "Poslednja sinhronizacija", + "loadmore": "Učitaj još", + "lostconnection": "Vaš token za potvrdu identiteta je nevažeći ili je istekao. Moraćete ponovo da uspostavite vezu sa sajtom.", + "mygroups": "Moje grupe", + "networkerrormsg": "Mreža nije uključena ili ne radi.", + "nopasswordchangeforced": "Ne možete nastaviti bez promene svoje lozinke.", + "notapplicable": "n/a", + "notsent": "Nije poslato", + "offline": "Oflajn", + "online": "Onlajn", + "openfullimage": "Kliknite ovde da biste prikazali sliku u punoj veličini", + "openinbrowser": "Otvori u veb čitaču", + "othergroups": "Druge grupe", + "percentagenumber": "{{$a}}%", + "pulltorefresh": "Povucite za osvežavanje", + "redirectingtosite": "Bićete preusmereni na sajt.", + "requireduserdatamissing": "Ovaj korisnik nema u svom profilu neke neophodne podatke. Molimo vas, uneseti ove podatke u vaš Moodle i pokušajte ponovo.
{{$a}}", + "retry": "Pokušaj ponovo", + "searching": "Pretraživanje", + "sending": "Slanje", + "showmore": "Prikaži još...", + "sitemaintenance": "Sajt je u režimu održavanja i trenutno nije dostupan", + "sizetb": "TB", + "sorry": "Izvinite...", + "success": "Uspešno!", + "tablet": "Tablet", + "thereisdatatosync": "Broj oflajn podatak koje treba sinhronizovati: {{$a}}", + "tryagain": "Pokušaj ponovo", + "twoparagraphs": "{{p1}}

{{p2}}", + "uhoh": "Uh!", + "unexpectederror": "Neočekivana greška. Zatvorite i ponovo otvorite aplikaciju kako biste pokušali ponovo.", + "unicodenotsupported": "Neki emotikoni nisu podržani na ovom sajtu. Takvi karakteri će biti uklonjeni prilikom slanja poruke.", + "unicodenotsupportedcleanerror": "Prilikom čišćenja Unicode karaktera pronađen je prazan tekst.", + "unknown": "Nepoznato", + "unzipping": "Raspakivanje", + "warningofflinedatadeleted": "Oflajn podaci komponente {{component}} '{{name}}' su obrisani. {{error}}", + "whoops": "Ups!", + "whyisthishappening": "Zašto se ovo dešava?", + "windowsphone": "Windows Phone", + "wsfunctionnotavailable": "Funkcija Webservice nije dostupna." +} \ No newline at end of file diff --git a/www/core/lang/uk.json b/www/core/lang/uk.json index 2586c68adc3..65399cfaf7e 100644 --- a/www/core/lang/uk.json +++ b/www/core/lang/uk.json @@ -1,12 +1,12 @@ { - "accounts": "Акаунти", + "accounts": "Аккаунти", "allparticipants": "Усі учасники", "android": "Android", "areyousure": "Ви впевнені?", "back": "Назад", "cancel": "Скасувати", - "cannotconnect": "Неможливо з'єднатися: Переконайтеся, що ви ввели правильно URL і що сайт використовує Moodle 2.4 або більш пізньої версії.", - "cannotdownloadfiles": "Завантаження файлів відключена у вашій мобільній службі. Будь ласка, зверніться до адміністратора сайту.", + "cannotconnect": "Неможливо з'єднатися: Переконайтеся, що ви ввели правильний URL і що сайт використовує Moodle 2.4 або більш пізню версію.", + "cannotdownloadfiles": "Завантаження файлів відключено у вашій мобільній службі. Будь ласка, зверніться до адміністратора сайту.", "category": "Категорія", "choose": "Вибрати", "choosedots": "Вибрати...", @@ -17,13 +17,13 @@ "comments": "Ваші коментарі", "commentscount": "Коментарі ({{$a}})", "commentsnotworking": "Коментар не може бути відновлений", - "completion-alt-auto-fail": "Виконано: {{$a}} (не досягли до рівня зараховання)", + "completion-alt-auto-fail": "Виконано: {{$a}} (не досягли до рівня зарахування)", "completion-alt-auto-n": "Не завершено: {{$a}}", - "completion-alt-auto-pass": "Виконано: {{$a}} (досягагли до рівня зараховано)", + "completion-alt-auto-pass": "Виконано: {{$a}} (досягли до рівня зараховано)", "completion-alt-auto-y": "Завершено: {{$a}}", "completion-alt-manual-n": "Не завершено {{$a}}. Виберіть для відмічення як завершене.", - "completion-alt-manual-y": "Завершено {{$a}}. Виберіть для відмічення як не завершене.", - "confirmcanceledit": "Ви впевнені, що хочете залишити цю сторінку? Всі зміни будуть втрачені.", + "completion-alt-manual-y": "Завершено {{$a}}. Виберіть для відмічення як незавершене.", + "confirmcanceledit": "Ви впевнені що хочете залишити цю сторінку? Всі зміни будуть втрачені.", "confirmdeletefile": "Ви впевнені, що хочете видалити цей файл?", "confirmloss": "Ви впевнені? Всі зміни будуть втрачені.", "confirmopeninbrowser": "Ви хочете відкрити в браузері?", @@ -56,7 +56,7 @@ "edit": "Редагувати", "emptysplit": "Ця сторінка буде виглядати порожньою, якщо ліва панель порожня або завантажується.", "error": "Помилка", - "errorchangecompletion": "При зміні стану завершення сталася помилка. Будь ласка спробуйте ще раз.", + "errorchangecompletion": "При зміні статусу завершення сталася помилка. Будь ласка спробуйте ще раз.", "errordeletefile": "Помилка видалення файлу. Будь ласка спробуйте ще раз.", "errordownloading": "Помилка завантаження файлу.", "errordownloadingsomefiles": "Помилка завантаження модуля файлів. Деякі файли можуть бути відсутні.", @@ -69,7 +69,7 @@ "erroropenpopup": "Ця діяльність намагається відкрити спливаюче вікно. Це не підтримується в цьому додатку.", "errorrenamefile": "Помилка перейменування файлу. Будь ласка спробуйте ще раз.", "errorsync": "Під час синхронізації сталася помилка. Будь ласка спробуйте ще раз.", - "errorsyncblocked": "Це {{$a}} не може бути синхронізований прямо зараз через триваючого процесу. Будь-ласка спробуйте пізніше. Якщо питання залишається невирішеним, спробуйте перезапустити програму.", + "errorsyncblocked": "{{$a}} не може бути синхронізований прямо зараз через навантаження на сервер. Будь-ласка спробуйте пізніше. Якщо питання залишається невирішеним, спробуйте перезапустити програму.", "filename": "Ім’я файлу", "filenameexist": "Файл вже існує: {{$a}}", "folder": "Тека", @@ -93,7 +93,7 @@ "lastsync": "Остання синхронізація", "listsep": ";", "loading": "Завантаження...", - "loadmore": "Завнтажити більше", + "loadmore": "Завантажити більше", "lostconnection": "Ваш маркер аутентифікації недійсний або закінчився, вам доведеться підключитися до сайту.", "maxsizeandattachments": "Макс. обсяг для нових файлів: {{$a.size}}, макс. кількість прикріплених файлів: {{$a.attachments}}", "min": "хв", @@ -167,7 +167,7 @@ "start": "Початок", "submit": "Прийняти", "success": "Успіх!", - "tablet": "пЛАНШЕТ", + "tablet": "Планшет", "teachers": "Викладачі", "thereisdatatosync": "Офлайн {{$a}} повинні бути синхронізовані.", "time": "Час", @@ -177,7 +177,7 @@ "twoparagraphs": "{{p1}}

{{p2}}", "uhoh": "Опана...", "unexpectederror": "Неочікувана помилка. Будь ласка, закрийте і знову відкрийте додаток, щоб спробувати ще раз", - "unicodenotsupported": "Деякі Emojis не підтримуються на цьому сайті. Такі символи будуть видалені, коли повідомлення було відправлено.", + "unicodenotsupported": "Деякі Emoji не підтримуються на цьому сайті. Такі символи будуть видалені, коли повідомлення буде відправлено.", "unicodenotsupportedcleanerror": "Порожній текст був знайдений при чищенні Unicode символів.", "unknown": "Невідомо", "unlimited": "Не обмежено", @@ -188,7 +188,7 @@ "users": "Користувачі", "view": "Перегляд", "viewprofile": "Переглянути профіль", - "warningofflinedatadeleted": "Offline дані {{component}} '{{name}}' були видалений. {{error}}", + "warningofflinedatadeleted": "Offline дані {{component}} '{{name}}' були видалені. {{error}}", "whoops": "Упс!", "whyisthishappening": "Чому це відбувається?", "windowsphone": "Windows Phone", From 595bf3adf4fe7de7824b49203bc7ed5a7a2ef581 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 27 Jul 2017 00:07:50 +0200 Subject: [PATCH 091/118] MOBILE-2156 lang: Auto-translation --- www/addons/badges/lang/sr-cr.json | 12 ++ www/addons/badges/lang/sr-lt.json | 12 ++ www/addons/badges/lang/sv.json | 2 +- www/addons/badges/lang/tr.json | 2 +- www/addons/calendar/lang/ar.json | 2 +- www/addons/calendar/lang/ca.json | 2 +- www/addons/calendar/lang/cs.json | 4 +- www/addons/calendar/lang/da.json | 4 +- www/addons/calendar/lang/de.json | 4 +- www/addons/calendar/lang/es-mx.json | 4 +- www/addons/calendar/lang/es.json | 4 +- www/addons/calendar/lang/eu.json | 2 +- www/addons/calendar/lang/fa.json | 4 +- www/addons/calendar/lang/fr.json | 2 +- www/addons/calendar/lang/he.json | 4 +- www/addons/calendar/lang/it.json | 2 +- www/addons/calendar/lang/ja.json | 2 +- www/addons/calendar/lang/lt.json | 2 +- www/addons/calendar/lang/nl.json | 2 +- www/addons/calendar/lang/pl.json | 2 +- www/addons/calendar/lang/pt-br.json | 4 +- www/addons/calendar/lang/pt.json | 2 +- www/addons/calendar/lang/ru.json | 2 +- www/addons/calendar/lang/sr-cr.json | 2 +- www/addons/calendar/lang/sr-lt.json | 4 +- www/addons/calendar/lang/sv.json | 2 +- www/addons/calendar/lang/uk.json | 4 +- www/addons/calendar/lang/zh-cn.json | 4 +- www/addons/calendar/lang/zh-tw.json | 2 +- www/addons/competency/lang/ar.json | 6 +- www/addons/competency/lang/bg.json | 2 +- www/addons/competency/lang/ca.json | 14 +- www/addons/competency/lang/cs.json | 12 +- www/addons/competency/lang/da.json | 12 +- www/addons/competency/lang/de.json | 16 +-- www/addons/competency/lang/el.json | 4 +- www/addons/competency/lang/es-mx.json | 14 +- www/addons/competency/lang/es.json | 10 +- www/addons/competency/lang/eu.json | 10 +- www/addons/competency/lang/fa.json | 10 +- www/addons/competency/lang/fr.json | 12 +- www/addons/competency/lang/he.json | 14 +- www/addons/competency/lang/hu.json | 12 +- www/addons/competency/lang/it.json | 14 +- www/addons/competency/lang/ja.json | 14 +- www/addons/competency/lang/lt.json | 20 ++- www/addons/competency/lang/nl.json | 12 +- www/addons/competency/lang/pl.json | 10 +- www/addons/competency/lang/pt-br.json | 12 +- www/addons/competency/lang/pt.json | 14 +- www/addons/competency/lang/ro.json | 4 +- www/addons/competency/lang/ru.json | 14 +- www/addons/competency/lang/sr-cr.json | 26 +++- www/addons/competency/lang/sr-lt.json | 26 +++- www/addons/competency/lang/sv.json | 14 +- www/addons/competency/lang/tr.json | 12 +- www/addons/competency/lang/uk.json | 18 +-- www/addons/competency/lang/zh-cn.json | 6 +- www/addons/competency/lang/zh-tw.json | 14 +- www/addons/coursecompletion/lang/ar.json | 20 +-- www/addons/coursecompletion/lang/bg.json | 10 +- www/addons/coursecompletion/lang/ca.json | 18 +-- www/addons/coursecompletion/lang/cs.json | 26 ++-- www/addons/coursecompletion/lang/da.json | 28 ++-- www/addons/coursecompletion/lang/de.json | 24 ++-- www/addons/coursecompletion/lang/el.json | 14 +- www/addons/coursecompletion/lang/es-mx.json | 26 ++-- www/addons/coursecompletion/lang/es.json | 10 +- www/addons/coursecompletion/lang/eu.json | 14 +- www/addons/coursecompletion/lang/fa.json | 10 +- www/addons/coursecompletion/lang/fr.json | 10 +- www/addons/coursecompletion/lang/he.json | 26 ++-- www/addons/coursecompletion/lang/hu.json | 10 +- www/addons/coursecompletion/lang/it.json | 16 +-- www/addons/coursecompletion/lang/ja.json | 24 ++-- www/addons/coursecompletion/lang/lt.json | 22 +-- www/addons/coursecompletion/lang/nl.json | 20 +-- www/addons/coursecompletion/lang/pl.json | 12 +- www/addons/coursecompletion/lang/pt-br.json | 24 ++-- www/addons/coursecompletion/lang/pt.json | 18 +-- www/addons/coursecompletion/lang/ro.json | 28 ++-- www/addons/coursecompletion/lang/ru.json | 26 ++-- www/addons/coursecompletion/lang/sr-cr.json | 14 +- www/addons/coursecompletion/lang/sr-lt.json | 14 +- www/addons/coursecompletion/lang/sv.json | 22 +-- www/addons/coursecompletion/lang/tr.json | 10 +- www/addons/coursecompletion/lang/uk.json | 26 ++-- www/addons/coursecompletion/lang/zh-cn.json | 14 +- www/addons/coursecompletion/lang/zh-tw.json | 28 ++-- www/addons/files/lang/ar.json | 2 +- www/addons/files/lang/ca.json | 4 +- www/addons/files/lang/cs.json | 4 +- www/addons/files/lang/da.json | 4 +- www/addons/files/lang/de.json | 4 +- www/addons/files/lang/el.json | 2 +- www/addons/files/lang/es-mx.json | 4 +- www/addons/files/lang/es.json | 4 +- www/addons/files/lang/eu.json | 4 +- www/addons/files/lang/fr.json | 4 +- www/addons/files/lang/he.json | 2 +- www/addons/files/lang/it.json | 4 +- www/addons/files/lang/ja.json | 4 +- www/addons/files/lang/lt.json | 4 +- www/addons/files/lang/nl.json | 4 +- www/addons/files/lang/pt-br.json | 4 +- www/addons/files/lang/pt.json | 6 +- www/addons/files/lang/ro.json | 4 +- www/addons/files/lang/ru.json | 2 +- www/addons/files/lang/sr-cr.json | 7 +- www/addons/files/lang/sr-lt.json | 7 +- www/addons/files/lang/uk.json | 4 +- www/addons/files/lang/zh-tw.json | 4 +- www/addons/frontpage/lang/da.json | 2 +- www/addons/frontpage/lang/eu.json | 2 +- www/addons/frontpage/lang/sr-cr.json | 4 + www/addons/frontpage/lang/sr-lt.json | 4 + www/addons/grades/lang/bg.json | 2 +- www/addons/grades/lang/el.json | 2 +- www/addons/grades/lang/fa.json | 2 +- www/addons/grades/lang/fr.json | 2 +- www/addons/grades/lang/he.json | 2 +- www/addons/grades/lang/it.json | 2 +- www/addons/grades/lang/ja.json | 2 +- www/addons/grades/lang/nl.json | 2 +- www/addons/grades/lang/pl.json | 2 +- www/addons/grades/lang/ru.json | 2 +- www/addons/grades/lang/sr-cr.json | 4 + www/addons/grades/lang/sr-lt.json | 4 + www/addons/grades/lang/uk.json | 2 +- www/addons/grades/lang/zh-tw.json | 2 +- www/addons/messages/lang/ar.json | 6 +- www/addons/messages/lang/bg.json | 6 +- www/addons/messages/lang/ca.json | 9 +- www/addons/messages/lang/cs.json | 10 +- www/addons/messages/lang/da.json | 8 +- www/addons/messages/lang/de.json | 8 +- www/addons/messages/lang/el.json | 8 +- www/addons/messages/lang/es-mx.json | 10 +- www/addons/messages/lang/es.json | 8 +- www/addons/messages/lang/eu.json | 8 +- www/addons/messages/lang/fa.json | 6 +- www/addons/messages/lang/fr.json | 12 +- www/addons/messages/lang/he.json | 14 +- www/addons/messages/lang/hu.json | 6 +- www/addons/messages/lang/it.json | 10 +- www/addons/messages/lang/ja.json | 8 +- www/addons/messages/lang/lt.json | 10 +- www/addons/messages/lang/nl.json | 8 +- www/addons/messages/lang/pl.json | 6 +- www/addons/messages/lang/pt-br.json | 9 +- www/addons/messages/lang/pt.json | 6 +- www/addons/messages/lang/ro.json | 8 +- www/addons/messages/lang/ru.json | 6 +- www/addons/messages/lang/sr-cr.json | 15 +- www/addons/messages/lang/sr-lt.json | 15 +- www/addons/messages/lang/sv.json | 11 +- www/addons/messages/lang/tr.json | 4 +- www/addons/messages/lang/uk.json | 6 +- www/addons/messages/lang/zh-cn.json | 6 +- www/addons/messages/lang/zh-tw.json | 14 +- www/addons/mod/assign/lang/ca.json | 2 +- www/addons/mod/assign/lang/de.json | 2 +- www/addons/mod/assign/lang/el.json | 1 + www/addons/mod/assign/lang/eu.json | 2 +- www/addons/mod/assign/lang/fr.json | 6 +- www/addons/mod/assign/lang/he.json | 2 +- www/addons/mod/assign/lang/it.json | 2 +- www/addons/mod/assign/lang/ja.json | 2 +- www/addons/mod/assign/lang/nl.json | 2 +- www/addons/mod/assign/lang/pt-br.json | 6 +- www/addons/mod/assign/lang/pt.json | 4 +- www/addons/mod/assign/lang/ro.json | 2 +- www/addons/mod/assign/lang/sr-cr.json | 82 +++++++++++ www/addons/mod/assign/lang/sr-lt.json | 82 +++++++++++ www/addons/mod/assign/lang/sv.json | 6 +- www/addons/mod/assign/lang/tr.json | 2 +- www/addons/mod/assign/lang/zh-tw.json | 2 +- www/addons/mod/chat/lang/cs.json | 2 +- www/addons/mod/chat/lang/de.json | 2 +- www/addons/mod/chat/lang/he.json | 2 +- www/addons/mod/chat/lang/lt.json | 2 +- www/addons/mod/chat/lang/pl.json | 2 +- www/addons/mod/chat/lang/pt-br.json | 2 +- www/addons/mod/chat/lang/sr-cr.json | 13 +- www/addons/mod/chat/lang/sr-lt.json | 13 +- www/addons/mod/chat/lang/sv.json | 6 +- www/addons/mod/choice/lang/ar.json | 2 +- www/addons/mod/choice/lang/ca.json | 4 +- www/addons/mod/choice/lang/cs.json | 4 +- www/addons/mod/choice/lang/da.json | 4 +- www/addons/mod/choice/lang/de.json | 4 +- www/addons/mod/choice/lang/el.json | 4 +- www/addons/mod/choice/lang/es-mx.json | 4 +- www/addons/mod/choice/lang/es.json | 4 +- www/addons/mod/choice/lang/eu.json | 4 +- www/addons/mod/choice/lang/fr.json | 4 +- www/addons/mod/choice/lang/it.json | 4 +- www/addons/mod/choice/lang/ja.json | 4 +- www/addons/mod/choice/lang/lt.json | 4 +- www/addons/mod/choice/lang/nl.json | 4 +- www/addons/mod/choice/lang/pt-br.json | 4 +- www/addons/mod/choice/lang/pt.json | 4 +- www/addons/mod/choice/lang/ro.json | 4 +- www/addons/mod/choice/lang/ru.json | 2 +- www/addons/mod/choice/lang/sr-cr.json | 19 ++- www/addons/mod/choice/lang/sr-lt.json | 19 ++- www/addons/mod/choice/lang/sv.json | 6 +- www/addons/mod/choice/lang/uk.json | 4 +- www/addons/mod/choice/lang/zh-tw.json | 4 +- www/addons/mod/data/lang/ar.json | 32 +++++ www/addons/mod/data/lang/bg.json | 36 +++++ www/addons/mod/data/lang/ca.json | 38 +++++ www/addons/mod/data/lang/cs.json | 38 +++++ www/addons/mod/data/lang/da.json | 38 +++++ www/addons/mod/data/lang/de.json | 38 +++++ www/addons/mod/data/lang/el.json | 32 +++++ www/addons/mod/data/lang/es-mx.json | 38 +++++ www/addons/mod/data/lang/es.json | 38 +++++ www/addons/mod/data/lang/eu.json | 38 +++++ www/addons/mod/data/lang/fa.json | 33 +++++ www/addons/mod/data/lang/fr.json | 38 +++++ www/addons/mod/data/lang/he.json | 38 +++++ www/addons/mod/data/lang/hu.json | 38 +++++ www/addons/mod/data/lang/it.json | 38 +++++ www/addons/mod/data/lang/ja.json | 38 +++++ www/addons/mod/data/lang/lt.json | 38 +++++ www/addons/mod/data/lang/nl.json | 38 +++++ www/addons/mod/data/lang/pl.json | 38 +++++ www/addons/mod/data/lang/pt-br.json | 38 +++++ www/addons/mod/data/lang/pt.json | 38 +++++ www/addons/mod/data/lang/ro.json | 37 +++++ www/addons/mod/data/lang/ru.json | 38 +++++ www/addons/mod/data/lang/sr-cr.json | 38 +++++ www/addons/mod/data/lang/sr-lt.json | 38 +++++ www/addons/mod/data/lang/sv.json | 34 +++++ www/addons/mod/data/lang/tr.json | 38 +++++ www/addons/mod/data/lang/uk.json | 38 +++++ www/addons/mod/data/lang/zh-cn.json | 37 +++++ www/addons/mod/data/lang/zh-tw.json | 38 +++++ www/addons/mod/feedback/lang/cs.json | 2 +- www/addons/mod/feedback/lang/da.json | 2 +- www/addons/mod/feedback/lang/de.json | 2 +- www/addons/mod/feedback/lang/es-mx.json | 2 +- www/addons/mod/feedback/lang/eu.json | 8 +- www/addons/mod/feedback/lang/fr.json | 2 +- www/addons/mod/feedback/lang/he.json | 2 +- www/addons/mod/feedback/lang/hu.json | 2 +- www/addons/mod/feedback/lang/ja.json | 2 +- www/addons/mod/feedback/lang/lt.json | 2 +- www/addons/mod/feedback/lang/nl.json | 2 +- www/addons/mod/feedback/lang/pt-br.json | 7 +- www/addons/mod/feedback/lang/pt.json | 4 +- www/addons/mod/feedback/lang/sr-cr.json | 33 ++++- www/addons/mod/feedback/lang/sr-lt.json | 33 ++++- www/addons/mod/feedback/lang/sv.json | 2 +- www/addons/mod/feedback/lang/tr.json | 12 +- www/addons/mod/folder/lang/ca.json | 2 +- www/addons/mod/folder/lang/cs.json | 2 +- www/addons/mod/folder/lang/da.json | 2 +- www/addons/mod/folder/lang/de.json | 2 +- www/addons/mod/folder/lang/es-mx.json | 2 +- www/addons/mod/folder/lang/eu.json | 2 +- www/addons/mod/folder/lang/fr.json | 2 +- www/addons/mod/folder/lang/he.json | 2 +- www/addons/mod/folder/lang/it.json | 2 +- www/addons/mod/folder/lang/ja.json | 2 +- www/addons/mod/folder/lang/lt.json | 2 +- www/addons/mod/folder/lang/nl.json | 2 +- www/addons/mod/folder/lang/pt-br.json | 2 +- www/addons/mod/folder/lang/pt.json | 2 +- www/addons/mod/folder/lang/ro.json | 2 +- www/addons/mod/folder/lang/sr-cr.json | 2 +- www/addons/mod/folder/lang/sr-lt.json | 2 +- www/addons/mod/folder/lang/zh-tw.json | 2 +- www/addons/mod/forum/lang/ca.json | 1 + www/addons/mod/forum/lang/da.json | 2 +- www/addons/mod/forum/lang/de.json | 2 +- www/addons/mod/forum/lang/es-mx.json | 2 +- www/addons/mod/forum/lang/fr.json | 2 +- www/addons/mod/forum/lang/he.json | 3 +- www/addons/mod/forum/lang/it.json | 2 +- www/addons/mod/forum/lang/ja.json | 4 +- www/addons/mod/forum/lang/lt.json | 2 +- www/addons/mod/forum/lang/nl.json | 2 +- www/addons/mod/forum/lang/pl.json | 2 +- www/addons/mod/forum/lang/pt-br.json | 4 +- www/addons/mod/forum/lang/ro.json | 2 +- www/addons/mod/forum/lang/ru.json | 2 +- www/addons/mod/forum/lang/sr-cr.json | 25 +++- www/addons/mod/forum/lang/sr-lt.json | 25 +++- www/addons/mod/forum/lang/sv.json | 8 +- www/addons/mod/forum/lang/uk.json | 2 +- www/addons/mod/forum/lang/zh-tw.json | 4 +- www/addons/mod/glossary/lang/ar.json | 6 +- www/addons/mod/glossary/lang/bg.json | 6 +- www/addons/mod/glossary/lang/ca.json | 8 +- www/addons/mod/glossary/lang/cs.json | 8 +- www/addons/mod/glossary/lang/da.json | 8 +- www/addons/mod/glossary/lang/de.json | 8 +- www/addons/mod/glossary/lang/el.json | 8 +- www/addons/mod/glossary/lang/es-mx.json | 6 +- www/addons/mod/glossary/lang/es.json | 6 +- www/addons/mod/glossary/lang/eu.json | 8 +- www/addons/mod/glossary/lang/fa.json | 6 +- www/addons/mod/glossary/lang/fr.json | 8 +- www/addons/mod/glossary/lang/he.json | 6 +- www/addons/mod/glossary/lang/hu.json | 6 +- www/addons/mod/glossary/lang/it.json | 6 +- www/addons/mod/glossary/lang/ja.json | 8 +- www/addons/mod/glossary/lang/lt.json | 8 +- www/addons/mod/glossary/lang/nl.json | 8 +- www/addons/mod/glossary/lang/pl.json | 6 +- www/addons/mod/glossary/lang/pt-br.json | 8 +- www/addons/mod/glossary/lang/pt.json | 8 +- www/addons/mod/glossary/lang/ro.json | 8 +- www/addons/mod/glossary/lang/ru.json | 6 +- www/addons/mod/glossary/lang/sr-cr.json | 5 +- www/addons/mod/glossary/lang/sr-lt.json | 5 +- www/addons/mod/glossary/lang/sv.json | 8 +- www/addons/mod/glossary/lang/tr.json | 6 +- www/addons/mod/glossary/lang/uk.json | 8 +- www/addons/mod/glossary/lang/zh-cn.json | 6 +- www/addons/mod/glossary/lang/zh-tw.json | 8 +- www/addons/mod/label/lang/he.json | 2 +- www/addons/mod/label/lang/lt.json | 2 +- www/addons/mod/label/lang/ru.json | 2 +- www/addons/mod/label/lang/uk.json | 2 +- www/addons/mod/lesson/lang/ar.json | 3 +- www/addons/mod/lesson/lang/bg.json | 1 + www/addons/mod/lesson/lang/ca.json | 1 + www/addons/mod/lesson/lang/cs.json | 1 + www/addons/mod/lesson/lang/da.json | 1 + www/addons/mod/lesson/lang/de.json | 1 + www/addons/mod/lesson/lang/el.json | 1 + www/addons/mod/lesson/lang/es-mx.json | 1 + www/addons/mod/lesson/lang/es.json | 1 + www/addons/mod/lesson/lang/eu.json | 3 +- www/addons/mod/lesson/lang/fa.json | 1 + www/addons/mod/lesson/lang/fr.json | 3 +- www/addons/mod/lesson/lang/he.json | 1 + www/addons/mod/lesson/lang/hu.json | 1 + www/addons/mod/lesson/lang/it.json | 1 + www/addons/mod/lesson/lang/ja.json | 11 +- www/addons/mod/lesson/lang/lt.json | 1 + www/addons/mod/lesson/lang/nl.json | 1 + www/addons/mod/lesson/lang/pl.json | 1 + www/addons/mod/lesson/lang/pt-br.json | 1 + www/addons/mod/lesson/lang/pt.json | 7 +- www/addons/mod/lesson/lang/ro.json | 1 + www/addons/mod/lesson/lang/ru.json | 1 + www/addons/mod/lesson/lang/sr-cr.json | 78 ++++++++++- www/addons/mod/lesson/lang/sr-lt.json | 78 ++++++++++- www/addons/mod/lesson/lang/sv.json | 1 + www/addons/mod/lesson/lang/tr.json | 1 + www/addons/mod/lesson/lang/uk.json | 1 + www/addons/mod/lesson/lang/zh-cn.json | 1 + www/addons/mod/lesson/lang/zh-tw.json | 5 +- www/addons/mod/quiz/lang/ja.json | 8 +- www/addons/mod/quiz/lang/lt.json | 1 + www/addons/mod/quiz/lang/sr-cr.json | 60 +++++++- www/addons/mod/quiz/lang/sr-lt.json | 60 +++++++- www/addons/mod/quiz/lang/sv.json | 2 +- www/addons/mod/scorm/lang/eu.json | 2 +- www/addons/mod/scorm/lang/sr-cr.json | 33 +++++ www/addons/mod/scorm/lang/sr-lt.json | 33 +++++ www/addons/mod/scorm/lang/zh-tw.json | 12 +- www/addons/mod/survey/lang/ar.json | 2 +- www/addons/mod/survey/lang/ja.json | 2 +- www/addons/mod/survey/lang/pl.json | 2 +- www/addons/mod/survey/lang/sr-cr.json | 6 +- www/addons/mod/survey/lang/sr-lt.json | 6 +- www/addons/mod/survey/lang/tr.json | 2 +- www/addons/mod/survey/lang/zh-cn.json | 2 +- www/addons/mod/survey/lang/zh-tw.json | 2 +- www/addons/mod/wiki/lang/ar.json | 2 +- www/addons/mod/wiki/lang/bg.json | 4 +- www/addons/mod/wiki/lang/ca.json | 2 +- www/addons/mod/wiki/lang/cs.json | 2 +- www/addons/mod/wiki/lang/da.json | 2 +- www/addons/mod/wiki/lang/de.json | 2 +- www/addons/mod/wiki/lang/el.json | 4 +- www/addons/mod/wiki/lang/es-mx.json | 2 +- www/addons/mod/wiki/lang/es.json | 2 +- www/addons/mod/wiki/lang/eu.json | 2 +- www/addons/mod/wiki/lang/fa.json | 2 +- www/addons/mod/wiki/lang/fr.json | 2 +- www/addons/mod/wiki/lang/he.json | 2 +- www/addons/mod/wiki/lang/hu.json | 2 +- www/addons/mod/wiki/lang/it.json | 2 +- www/addons/mod/wiki/lang/ja.json | 2 +- www/addons/mod/wiki/lang/lt.json | 2 +- www/addons/mod/wiki/lang/nl.json | 2 +- www/addons/mod/wiki/lang/pl.json | 2 +- www/addons/mod/wiki/lang/pt-br.json | 2 +- www/addons/mod/wiki/lang/pt.json | 2 +- www/addons/mod/wiki/lang/ro.json | 4 +- www/addons/mod/wiki/lang/ru.json | 2 +- www/addons/mod/wiki/lang/sr-cr.json | 15 +- www/addons/mod/wiki/lang/sr-lt.json | 15 +- www/addons/mod/wiki/lang/sv.json | 2 +- www/addons/mod/wiki/lang/tr.json | 2 +- www/addons/mod/wiki/lang/uk.json | 2 +- www/addons/mod/wiki/lang/zh-cn.json | 2 +- www/addons/mod/wiki/lang/zh-tw.json | 2 +- www/addons/myoverview/lang/ca.json | 19 ++- www/addons/myoverview/lang/da.json | 18 ++- www/addons/myoverview/lang/de.json | 2 +- www/addons/myoverview/lang/es.json | 4 +- www/addons/myoverview/lang/eu.json | 10 +- www/addons/myoverview/lang/fr.json | 2 +- www/addons/myoverview/lang/he.json | 4 +- www/addons/myoverview/lang/it.json | 18 +-- www/addons/myoverview/lang/ja.json | 4 +- www/addons/myoverview/lang/lt.json | 19 ++- www/addons/myoverview/lang/pl.json | 19 ++- www/addons/myoverview/lang/pt-br.json | 17 ++- www/addons/myoverview/lang/pt.json | 17 ++- www/addons/myoverview/lang/ru.json | 17 ++- www/addons/myoverview/lang/sr-cr.json | 18 +++ www/addons/myoverview/lang/sr-lt.json | 18 +++ www/addons/myoverview/lang/sv.json | 17 ++- www/addons/myoverview/lang/uk.json | 18 +++ www/addons/myoverview/lang/zh-cn.json | 19 ++- www/addons/myoverview/lang/zh-tw.json | 2 +- www/addons/notes/lang/ar.json | 2 +- www/addons/notes/lang/bg.json | 2 +- www/addons/notes/lang/ca.json | 2 +- www/addons/notes/lang/cs.json | 2 +- www/addons/notes/lang/da.json | 2 +- www/addons/notes/lang/de.json | 2 +- www/addons/notes/lang/el.json | 2 +- www/addons/notes/lang/es-mx.json | 2 +- www/addons/notes/lang/eu.json | 2 +- www/addons/notes/lang/fr.json | 2 +- www/addons/notes/lang/he.json | 2 +- www/addons/notes/lang/it.json | 2 +- www/addons/notes/lang/ja.json | 2 +- www/addons/notes/lang/lt.json | 2 +- www/addons/notes/lang/nl.json | 2 +- www/addons/notes/lang/pt-br.json | 2 +- www/addons/notes/lang/pt.json | 2 +- www/addons/notes/lang/ro.json | 2 +- www/addons/notes/lang/ru.json | 2 +- www/addons/notes/lang/sr-cr.json | 2 +- www/addons/notes/lang/sr-lt.json | 2 +- www/addons/notes/lang/sv.json | 2 +- www/addons/notes/lang/uk.json | 2 +- www/addons/notes/lang/zh-tw.json | 2 +- www/addons/notifications/lang/ar.json | 2 +- www/addons/notifications/lang/ca.json | 2 +- www/addons/notifications/lang/cs.json | 2 +- www/addons/notifications/lang/da.json | 2 +- www/addons/notifications/lang/de.json | 2 +- www/addons/notifications/lang/es-mx.json | 2 +- www/addons/notifications/lang/es.json | 4 +- www/addons/notifications/lang/eu.json | 2 +- www/addons/notifications/lang/fa.json | 2 +- www/addons/notifications/lang/he.json | 2 +- www/addons/notifications/lang/ja.json | 2 +- www/addons/notifications/lang/lt.json | 2 +- www/addons/notifications/lang/nl.json | 2 +- www/addons/notifications/lang/pt-br.json | 4 +- www/addons/notifications/lang/sv.json | 3 +- www/addons/notifications/lang/uk.json | 2 +- www/addons/notifications/lang/zh-cn.json | 2 +- www/addons/notifications/lang/zh-tw.json | 2 +- www/addons/participants/lang/ar.json | 2 +- www/addons/participants/lang/ca.json | 2 +- www/addons/participants/lang/cs.json | 4 +- www/addons/participants/lang/da.json | 2 +- www/addons/participants/lang/de.json | 4 +- www/addons/participants/lang/el.json | 2 +- www/addons/participants/lang/es-mx.json | 2 +- www/addons/participants/lang/es.json | 2 +- www/addons/participants/lang/eu.json | 2 +- www/addons/participants/lang/fa.json | 2 +- www/addons/participants/lang/fr.json | 2 +- www/addons/participants/lang/he.json | 2 +- www/addons/participants/lang/hu.json | 2 +- www/addons/participants/lang/it.json | 4 +- www/addons/participants/lang/ja.json | 2 +- www/addons/participants/lang/lt.json | 2 +- www/addons/participants/lang/nl.json | 2 +- www/addons/participants/lang/pl.json | 2 +- www/addons/participants/lang/pt-br.json | 2 +- www/addons/participants/lang/pt.json | 4 +- www/addons/participants/lang/ro.json | 4 +- www/addons/participants/lang/ru.json | 2 +- www/addons/participants/lang/sr-cr.json | 2 +- www/addons/participants/lang/sr-lt.json | 2 +- www/addons/participants/lang/sv.json | 2 +- www/addons/participants/lang/tr.json | 2 +- www/addons/participants/lang/uk.json | 2 +- www/addons/participants/lang/zh-cn.json | 2 +- www/addons/participants/lang/zh-tw.json | 4 +- www/core/components/course/lang/ar.json | 4 +- www/core/components/course/lang/bg.json | 2 +- www/core/components/course/lang/ca.json | 2 +- www/core/components/course/lang/cs.json | 2 +- www/core/components/course/lang/da.json | 2 +- www/core/components/course/lang/de.json | 2 +- www/core/components/course/lang/el.json | 2 +- www/core/components/course/lang/es-mx.json | 4 +- www/core/components/course/lang/es.json | 6 +- www/core/components/course/lang/eu.json | 2 +- www/core/components/course/lang/fa.json | 4 +- www/core/components/course/lang/fr.json | 2 +- www/core/components/course/lang/he.json | 2 +- www/core/components/course/lang/it.json | 2 +- www/core/components/course/lang/ja.json | 2 +- www/core/components/course/lang/lt.json | 4 +- www/core/components/course/lang/nl.json | 2 +- www/core/components/course/lang/pt-br.json | 4 +- www/core/components/course/lang/pt.json | 2 +- www/core/components/course/lang/ro.json | 4 +- www/core/components/course/lang/ru.json | 2 +- www/core/components/course/lang/sr-cr.json | 6 +- www/core/components/course/lang/sr-lt.json | 6 +- www/core/components/course/lang/sv.json | 2 +- www/core/components/course/lang/tr.json | 4 +- www/core/components/course/lang/uk.json | 4 +- www/core/components/course/lang/zh-cn.json | 2 +- www/core/components/course/lang/zh-tw.json | 4 +- www/core/components/courses/lang/ar.json | 10 +- www/core/components/courses/lang/bg.json | 8 +- www/core/components/courses/lang/ca.json | 12 +- www/core/components/courses/lang/cs.json | 14 +- www/core/components/courses/lang/da.json | 12 +- www/core/components/courses/lang/de.json | 14 +- www/core/components/courses/lang/el.json | 12 +- www/core/components/courses/lang/es-mx.json | 8 +- www/core/components/courses/lang/es.json | 10 +- www/core/components/courses/lang/eu.json | 14 +- www/core/components/courses/lang/fa.json | 12 +- www/core/components/courses/lang/fr.json | 12 +- www/core/components/courses/lang/he.json | 10 +- www/core/components/courses/lang/hu.json | 12 +- www/core/components/courses/lang/it.json | 10 +- www/core/components/courses/lang/ja.json | 10 +- www/core/components/courses/lang/lt.json | 14 +- www/core/components/courses/lang/nl.json | 14 +- www/core/components/courses/lang/pl.json | 12 +- www/core/components/courses/lang/pt-br.json | 12 +- www/core/components/courses/lang/pt.json | 14 +- www/core/components/courses/lang/ro.json | 14 +- www/core/components/courses/lang/ru.json | 12 +- www/core/components/courses/lang/sr-cr.json | 14 +- www/core/components/courses/lang/sr-lt.json | 14 +- www/core/components/courses/lang/sv.json | 14 +- www/core/components/courses/lang/tr.json | 12 +- www/core/components/courses/lang/uk.json | 14 +- www/core/components/courses/lang/zh-cn.json | 8 +- www/core/components/courses/lang/zh-tw.json | 14 +- www/core/components/fileuploader/lang/ar.json | 8 +- www/core/components/fileuploader/lang/bg.json | 4 +- www/core/components/fileuploader/lang/ca.json | 8 +- www/core/components/fileuploader/lang/cs.json | 10 +- www/core/components/fileuploader/lang/da.json | 6 +- www/core/components/fileuploader/lang/de.json | 6 +- www/core/components/fileuploader/lang/el.json | 8 +- .../components/fileuploader/lang/es-mx.json | 8 +- www/core/components/fileuploader/lang/es.json | 6 +- www/core/components/fileuploader/lang/eu.json | 8 +- www/core/components/fileuploader/lang/fa.json | 3 +- www/core/components/fileuploader/lang/fr.json | 10 +- www/core/components/fileuploader/lang/he.json | 8 +- www/core/components/fileuploader/lang/hu.json | 2 +- www/core/components/fileuploader/lang/it.json | 10 +- www/core/components/fileuploader/lang/ja.json | 8 +- www/core/components/fileuploader/lang/lt.json | 8 +- www/core/components/fileuploader/lang/nl.json | 12 +- www/core/components/fileuploader/lang/pl.json | 2 +- .../components/fileuploader/lang/pt-br.json | 10 +- www/core/components/fileuploader/lang/pt.json | 10 +- www/core/components/fileuploader/lang/ro.json | 8 +- www/core/components/fileuploader/lang/ru.json | 8 +- .../components/fileuploader/lang/sr-cr.json | 10 +- .../components/fileuploader/lang/sr-lt.json | 10 +- www/core/components/fileuploader/lang/sv.json | 6 +- www/core/components/fileuploader/lang/tr.json | 6 +- www/core/components/fileuploader/lang/uk.json | 8 +- .../components/fileuploader/lang/zh-cn.json | 4 +- .../components/fileuploader/lang/zh-tw.json | 10 +- www/core/components/grades/lang/ar.json | 2 +- www/core/components/grades/lang/bg.json | 2 +- www/core/components/grades/lang/ca.json | 4 +- www/core/components/grades/lang/cs.json | 4 +- www/core/components/grades/lang/da.json | 4 +- www/core/components/grades/lang/de.json | 6 +- www/core/components/grades/lang/el.json | 2 +- www/core/components/grades/lang/es-mx.json | 2 +- www/core/components/grades/lang/es.json | 2 +- www/core/components/grades/lang/eu.json | 4 +- www/core/components/grades/lang/he.json | 8 +- www/core/components/grades/lang/it.json | 4 +- www/core/components/grades/lang/ja.json | 2 +- www/core/components/grades/lang/lt.json | 2 +- www/core/components/grades/lang/nl.json | 4 +- www/core/components/grades/lang/pl.json | 4 +- www/core/components/grades/lang/pt-br.json | 4 +- www/core/components/grades/lang/pt.json | 8 +- www/core/components/grades/lang/ro.json | 4 +- www/core/components/grades/lang/ru.json | 4 +- www/core/components/grades/lang/sr-cr.json | 15 ++ www/core/components/grades/lang/sr-lt.json | 15 ++ www/core/components/grades/lang/sv.json | 8 +- www/core/components/grades/lang/tr.json | 8 +- www/core/components/grades/lang/uk.json | 8 +- www/core/components/grades/lang/zh-cn.json | 4 +- www/core/components/grades/lang/zh-tw.json | 4 +- www/core/components/login/lang/ar.json | 6 +- www/core/components/login/lang/bg.json | 6 +- www/core/components/login/lang/ca.json | 4 +- www/core/components/login/lang/cs.json | 14 +- www/core/components/login/lang/da.json | 8 +- www/core/components/login/lang/de.json | 8 +- www/core/components/login/lang/el.json | 8 +- www/core/components/login/lang/es-mx.json | 12 +- www/core/components/login/lang/es.json | 8 +- www/core/components/login/lang/eu.json | 10 +- www/core/components/login/lang/fa.json | 4 +- www/core/components/login/lang/fr.json | 10 +- www/core/components/login/lang/he.json | 8 +- www/core/components/login/lang/hu.json | 8 +- www/core/components/login/lang/it.json | 6 +- www/core/components/login/lang/ja.json | 6 +- www/core/components/login/lang/lt.json | 12 +- www/core/components/login/lang/nl.json | 10 +- www/core/components/login/lang/pl.json | 4 +- www/core/components/login/lang/pt-br.json | 10 +- www/core/components/login/lang/pt.json | 12 +- www/core/components/login/lang/ro.json | 8 +- www/core/components/login/lang/ru.json | 10 +- www/core/components/login/lang/sr-cr.json | 32 ++++- www/core/components/login/lang/sr-lt.json | 32 ++++- www/core/components/login/lang/sv.json | 16 +-- www/core/components/login/lang/tr.json | 6 +- www/core/components/login/lang/uk.json | 10 +- www/core/components/login/lang/zh-cn.json | 6 +- www/core/components/login/lang/zh-tw.json | 14 +- www/core/components/question/lang/ar.json | 14 +- www/core/components/question/lang/bg.json | 12 +- www/core/components/question/lang/ca.json | 12 +- www/core/components/question/lang/cs.json | 14 +- www/core/components/question/lang/da.json | 10 +- www/core/components/question/lang/de.json | 10 +- www/core/components/question/lang/el.json | 6 +- www/core/components/question/lang/es-mx.json | 14 +- www/core/components/question/lang/es.json | 14 +- www/core/components/question/lang/eu.json | 10 +- www/core/components/question/lang/fa.json | 8 +- www/core/components/question/lang/fr.json | 6 +- www/core/components/question/lang/he.json | 12 +- www/core/components/question/lang/hu.json | 6 +- www/core/components/question/lang/it.json | 14 +- www/core/components/question/lang/ja.json | 8 +- www/core/components/question/lang/lt.json | 16 +-- www/core/components/question/lang/nl.json | 8 +- www/core/components/question/lang/pl.json | 10 +- www/core/components/question/lang/pt-br.json | 14 +- www/core/components/question/lang/pt.json | 8 +- www/core/components/question/lang/ro.json | 10 +- www/core/components/question/lang/ru.json | 6 +- www/core/components/question/lang/sr-cr.json | 15 +- www/core/components/question/lang/sr-lt.json | 15 +- www/core/components/question/lang/sv.json | 6 +- www/core/components/question/lang/tr.json | 10 +- www/core/components/question/lang/uk.json | 6 +- www/core/components/question/lang/zh-cn.json | 10 +- www/core/components/question/lang/zh-tw.json | 16 +-- www/core/components/settings/lang/ar.json | 8 +- www/core/components/settings/lang/bg.json | 6 +- www/core/components/settings/lang/ca.json | 6 +- www/core/components/settings/lang/cs.json | 6 +- www/core/components/settings/lang/da.json | 9 +- www/core/components/settings/lang/de.json | 8 +- www/core/components/settings/lang/el.json | 6 +- www/core/components/settings/lang/es-mx.json | 6 +- www/core/components/settings/lang/es.json | 6 +- www/core/components/settings/lang/eu.json | 8 +- www/core/components/settings/lang/fa.json | 6 +- www/core/components/settings/lang/fr.json | 10 +- www/core/components/settings/lang/he.json | 10 +- www/core/components/settings/lang/hu.json | 8 +- www/core/components/settings/lang/it.json | 6 +- www/core/components/settings/lang/ja.json | 6 +- www/core/components/settings/lang/lt.json | 6 +- www/core/components/settings/lang/nl.json | 6 +- www/core/components/settings/lang/pl.json | 10 +- www/core/components/settings/lang/pt-br.json | 7 +- www/core/components/settings/lang/pt.json | 6 +- www/core/components/settings/lang/ro.json | 8 +- www/core/components/settings/lang/ru.json | 13 +- www/core/components/settings/lang/sr-cr.json | 12 ++ www/core/components/settings/lang/sr-lt.json | 12 ++ www/core/components/settings/lang/sv.json | 10 +- www/core/components/settings/lang/tr.json | 6 +- www/core/components/settings/lang/uk.json | 8 +- www/core/components/settings/lang/zh-cn.json | 10 +- www/core/components/settings/lang/zh-tw.json | 10 +- www/core/components/sharedfiles/lang/ar.json | 2 +- www/core/components/sharedfiles/lang/ca.json | 2 +- www/core/components/sharedfiles/lang/cs.json | 2 +- www/core/components/sharedfiles/lang/de.json | 2 +- .../components/sharedfiles/lang/es-mx.json | 2 +- www/core/components/sharedfiles/lang/eu.json | 2 +- www/core/components/sharedfiles/lang/it.json | 2 +- www/core/components/sharedfiles/lang/lt.json | 4 +- www/core/components/sharedfiles/lang/pt.json | 2 +- .../components/sharedfiles/lang/sr-cr.json | 2 +- .../components/sharedfiles/lang/sr-lt.json | 2 +- www/core/components/sharedfiles/lang/sv.json | 2 +- www/core/components/sharedfiles/lang/tr.json | 2 +- www/core/components/sharedfiles/lang/uk.json | 2 +- .../components/sharedfiles/lang/zh-tw.json | 4 +- www/core/components/sidemenu/lang/ar.json | 4 +- www/core/components/sidemenu/lang/ca.json | 2 +- www/core/components/sidemenu/lang/cs.json | 4 +- www/core/components/sidemenu/lang/de.json | 2 +- www/core/components/sidemenu/lang/el.json | 2 +- www/core/components/sidemenu/lang/es-mx.json | 2 +- www/core/components/sidemenu/lang/eu.json | 2 +- www/core/components/sidemenu/lang/fa.json | 4 +- www/core/components/sidemenu/lang/he.json | 2 +- www/core/components/sidemenu/lang/it.json | 2 +- www/core/components/sidemenu/lang/lt.json | 6 +- www/core/components/sidemenu/lang/nl.json | 2 +- www/core/components/sidemenu/lang/pl.json | 2 +- www/core/components/sidemenu/lang/pt.json | 2 +- www/core/components/sidemenu/lang/ro.json | 2 +- www/core/components/sidemenu/lang/ru.json | 2 +- www/core/components/sidemenu/lang/tr.json | 2 +- www/core/components/sidemenu/lang/uk.json | 2 +- www/core/components/sidemenu/lang/zh-cn.json | 2 +- www/core/components/sidemenu/lang/zh-tw.json | 4 +- www/core/components/user/lang/ar.json | 8 +- www/core/components/user/lang/bg.json | 10 +- www/core/components/user/lang/ca.json | 8 +- www/core/components/user/lang/cs.json | 10 +- www/core/components/user/lang/da.json | 10 +- www/core/components/user/lang/de.json | 8 +- www/core/components/user/lang/el.json | 10 +- www/core/components/user/lang/es-mx.json | 10 +- www/core/components/user/lang/es.json | 6 +- www/core/components/user/lang/eu.json | 10 +- www/core/components/user/lang/fa.json | 10 +- www/core/components/user/lang/fr.json | 10 +- www/core/components/user/lang/he.json | 12 +- www/core/components/user/lang/hu.json | 4 +- www/core/components/user/lang/it.json | 10 +- www/core/components/user/lang/ja.json | 6 +- www/core/components/user/lang/lt.json | 12 +- www/core/components/user/lang/nl.json | 8 +- www/core/components/user/lang/pl.json | 4 +- www/core/components/user/lang/pt-br.json | 10 +- www/core/components/user/lang/pt.json | 4 +- www/core/components/user/lang/ro.json | 10 +- www/core/components/user/lang/ru.json | 10 +- www/core/components/user/lang/sr-cr.json | 22 ++- www/core/components/user/lang/sr-lt.json | 22 ++- www/core/components/user/lang/sv.json | 12 +- www/core/components/user/lang/tr.json | 12 +- www/core/components/user/lang/uk.json | 10 +- www/core/components/user/lang/zh-cn.json | 8 +- www/core/components/user/lang/zh-tw.json | 12 +- www/core/lang/ar.json | 45 +++--- www/core/lang/bg.json | 41 +++--- www/core/lang/ca.json | 55 ++++---- www/core/lang/cs.json | 67 ++++----- www/core/lang/da.json | 67 ++++----- www/core/lang/de.json | 67 ++++----- www/core/lang/el.json | 67 ++++----- www/core/lang/es-mx.json | 73 +++++----- www/core/lang/es.json | 59 ++++---- www/core/lang/eu.json | 45 +++--- www/core/lang/fa.json | 33 ++--- www/core/lang/fr.json | 49 +++---- www/core/lang/he.json | 69 +++++----- www/core/lang/hu.json | 53 +++---- www/core/lang/it.json | 69 +++++----- www/core/lang/ja.json | 47 +++---- www/core/lang/lt.json | 73 +++++----- www/core/lang/nl.json | 71 +++++----- www/core/lang/pl.json | 53 +++---- www/core/lang/pt-br.json | 74 +++++----- www/core/lang/pt.json | 73 +++++----- www/core/lang/ro.json | 83 +++++------ www/core/lang/ru.json | 50 +++---- www/core/lang/sr-cr.json | 130 ++++++++++++++++-- www/core/lang/sr-lt.json | 130 ++++++++++++++++-- www/core/lang/sv.json | 67 ++++----- www/core/lang/tr.json | 53 +++---- www/core/lang/uk.json | 75 +++++----- www/core/lang/zh-cn.json | 47 +++---- www/core/lang/zh-tw.json | 75 +++++----- 795 files changed, 5468 insertions(+), 2906 deletions(-) create mode 100644 www/addons/badges/lang/sr-cr.json create mode 100644 www/addons/badges/lang/sr-lt.json create mode 100644 www/addons/frontpage/lang/sr-cr.json create mode 100644 www/addons/frontpage/lang/sr-lt.json create mode 100644 www/addons/grades/lang/sr-cr.json create mode 100644 www/addons/grades/lang/sr-lt.json create mode 100644 www/addons/mod/data/lang/ar.json create mode 100644 www/addons/mod/data/lang/bg.json create mode 100644 www/addons/mod/data/lang/ca.json create mode 100644 www/addons/mod/data/lang/cs.json create mode 100644 www/addons/mod/data/lang/da.json create mode 100644 www/addons/mod/data/lang/de.json create mode 100644 www/addons/mod/data/lang/el.json create mode 100644 www/addons/mod/data/lang/es-mx.json create mode 100644 www/addons/mod/data/lang/es.json create mode 100644 www/addons/mod/data/lang/eu.json create mode 100644 www/addons/mod/data/lang/fa.json create mode 100644 www/addons/mod/data/lang/fr.json create mode 100644 www/addons/mod/data/lang/he.json create mode 100644 www/addons/mod/data/lang/hu.json create mode 100644 www/addons/mod/data/lang/it.json create mode 100644 www/addons/mod/data/lang/ja.json create mode 100644 www/addons/mod/data/lang/lt.json create mode 100644 www/addons/mod/data/lang/nl.json create mode 100644 www/addons/mod/data/lang/pl.json create mode 100644 www/addons/mod/data/lang/pt-br.json create mode 100644 www/addons/mod/data/lang/pt.json create mode 100644 www/addons/mod/data/lang/ro.json create mode 100644 www/addons/mod/data/lang/ru.json create mode 100644 www/addons/mod/data/lang/sr-cr.json create mode 100644 www/addons/mod/data/lang/sr-lt.json create mode 100644 www/addons/mod/data/lang/sv.json create mode 100644 www/addons/mod/data/lang/tr.json create mode 100644 www/addons/mod/data/lang/uk.json create mode 100644 www/addons/mod/data/lang/zh-cn.json create mode 100644 www/addons/mod/data/lang/zh-tw.json create mode 100644 www/addons/myoverview/lang/sr-cr.json create mode 100644 www/addons/myoverview/lang/sr-lt.json create mode 100644 www/addons/myoverview/lang/uk.json create mode 100644 www/core/components/grades/lang/sr-cr.json create mode 100644 www/core/components/grades/lang/sr-lt.json diff --git a/www/addons/badges/lang/sr-cr.json b/www/addons/badges/lang/sr-cr.json new file mode 100644 index 00000000000..dde1e852627 --- /dev/null +++ b/www/addons/badges/lang/sr-cr.json @@ -0,0 +1,12 @@ +{ + "badgedetails": "Подаци о беџу", + "badges": "Беџеви", + "contact": "Контакт", + "dateawarded": "Датум издавања", + "expirydate": "Датум истека", + "issuancedetails": "Беџ истиче", + "issuerdetails": "Подаци о издавачу", + "issuername": "Име/назив издавача беџа", + "nobadges": "Нема доступних беџева", + "recipientdetails": "Детаљи о примаоцу" +} \ No newline at end of file diff --git a/www/addons/badges/lang/sr-lt.json b/www/addons/badges/lang/sr-lt.json new file mode 100644 index 00000000000..7c2a996f0ba --- /dev/null +++ b/www/addons/badges/lang/sr-lt.json @@ -0,0 +1,12 @@ +{ + "badgedetails": "Podaci o bedžu", + "badges": "Bedževi", + "contact": "Kontakt", + "dateawarded": "Datum izdavanja", + "expirydate": "Datum isteka", + "issuancedetails": "Bedž ističe", + "issuerdetails": "Podaci o izdavaču", + "issuername": "Ime/naziv izdavača bedža", + "nobadges": "Nema dostupnih bedževa", + "recipientdetails": "Detalji o primaocu" +} \ No newline at end of file diff --git a/www/addons/badges/lang/sv.json b/www/addons/badges/lang/sv.json index 4c67f9031ef..878282c5e4f 100644 --- a/www/addons/badges/lang/sv.json +++ b/www/addons/badges/lang/sv.json @@ -1,6 +1,6 @@ { "badgedetails": "Detaljer för märke", - "badges": "Badges", + "badges": "Märken", "contact": "Kontakt", "dateawarded": "Utfärdandedatum", "expirydate": "Förfallodatum", diff --git a/www/addons/badges/lang/tr.json b/www/addons/badges/lang/tr.json index b540e7cabae..5c79f345058 100644 --- a/www/addons/badges/lang/tr.json +++ b/www/addons/badges/lang/tr.json @@ -1,6 +1,6 @@ { "badgedetails": "Nişan ayrıntıları", - "badges": "Rozetler", + "badges": "Nişanlar", "contact": "İletişim", "dateawarded": "Verilen tarih", "expirydate": "Bitiş Tarihi", diff --git a/www/addons/calendar/lang/ar.json b/www/addons/calendar/lang/ar.json index 23e2ee91b94..9bece3c914d 100644 --- a/www/addons/calendar/lang/ar.json +++ b/www/addons/calendar/lang/ar.json @@ -3,5 +3,5 @@ "errorloadevent": "خطأ في تحميل الحدث", "errorloadevents": "خطأ في تحميل الأحداث", "noevents": "لا يوجد أي أحداث", - "notifications": "الإشعارات" + "notifications": "إشعارات" } \ No newline at end of file diff --git a/www/addons/calendar/lang/ca.json b/www/addons/calendar/lang/ca.json index cc1ee634071..a2a8930c77d 100644 --- a/www/addons/calendar/lang/ca.json +++ b/www/addons/calendar/lang/ca.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Hora de notificació per defecte", "errorloadevent": "S'ha produït un error carregant l'esdeveniment.", "errorloadevents": "S'ha produït un error carregant els esdeveniments.", - "noevents": "No hi ha cap esdeveniment", + "noevents": "Cap activitat venç properament", "notifications": "Notificacions" } \ No newline at end of file diff --git a/www/addons/calendar/lang/cs.json b/www/addons/calendar/lang/cs.json index 93d27c11dce..5dca11fb0e2 100644 --- a/www/addons/calendar/lang/cs.json +++ b/www/addons/calendar/lang/cs.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Výchozí čas oznámení", "errorloadevent": "Chyba při načítání události.", "errorloadevents": "Chyba při načítání událostí.", - "noevents": "Nejsou žádné události", - "notifications": "Upozornění" + "noevents": "Žádné nadcházející činnosti", + "notifications": "Informace" } \ No newline at end of file diff --git a/www/addons/calendar/lang/da.json b/www/addons/calendar/lang/da.json index 6826baea7eb..9af5235a51d 100644 --- a/www/addons/calendar/lang/da.json +++ b/www/addons/calendar/lang/da.json @@ -2,6 +2,6 @@ "calendarevents": "Kalenderbegivenheder", "errorloadevent": "Fejl ved indlæsning af begivenhed.", "errorloadevents": "Fejl ved indlæsning af begivenheder.", - "noevents": "Der er ingen begivenheder", - "notifications": "Notifikationer" + "noevents": "Ingen forestående aktiviteter", + "notifications": "Beskeder" } \ No newline at end of file diff --git a/www/addons/calendar/lang/de.json b/www/addons/calendar/lang/de.json index ee64dc04300..e38e81f16cd 100644 --- a/www/addons/calendar/lang/de.json +++ b/www/addons/calendar/lang/de.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Standardmäßige Benachrichtigungszeit", "errorloadevent": "Fehler beim Laden des Kalendereintrags", "errorloadevents": "Fehler beim Laden der Kalendereinträge", - "noevents": "Keine Kalendereinträge", - "notifications": "Benachrichtigung" + "noevents": "Keine anstehenden Aktivitäten fällig", + "notifications": "Systemmitteilungen" } \ No newline at end of file diff --git a/www/addons/calendar/lang/es-mx.json b/www/addons/calendar/lang/es-mx.json index 872b31813b4..d4be495ef94 100644 --- a/www/addons/calendar/lang/es-mx.json +++ b/www/addons/calendar/lang/es-mx.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Hora de notificación por defecto", "errorloadevent": "Error al cargar evento.", "errorloadevents": "Error al cargar eventos.", - "noevents": "No hay eventos", - "notifications": "Notificaciones" + "noevents": "No hay actividades próximas pendientes", + "notifications": "Avisos" } \ No newline at end of file diff --git a/www/addons/calendar/lang/es.json b/www/addons/calendar/lang/es.json index 993aec44200..8149bc574d6 100644 --- a/www/addons/calendar/lang/es.json +++ b/www/addons/calendar/lang/es.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Tiempo de notificación por defecto", "errorloadevent": "Error cargando el evento.", "errorloadevents": "Error cargando los eventos.", - "noevents": "No hay eventos", - "notifications": "Notificaciones" + "noevents": "No hay actividades próximas pendientes", + "notifications": "Avisos" } \ No newline at end of file diff --git a/www/addons/calendar/lang/eu.json b/www/addons/calendar/lang/eu.json index 1158b9cd186..26477c604df 100644 --- a/www/addons/calendar/lang/eu.json +++ b/www/addons/calendar/lang/eu.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Berezko jakinarazpen-ordua", "errorloadevent": "Errorea gertakaria kargatzean.", "errorloadevents": "Errorea gertakariak kargatzean.", - "noevents": "Ez dago ekitaldirik", + "noevents": "Ez dago jardueren muga-egunik laster", "notifications": "Jakinarazpenak" } \ No newline at end of file diff --git a/www/addons/calendar/lang/fa.json b/www/addons/calendar/lang/fa.json index 109ac4e7ec6..76813733c1d 100644 --- a/www/addons/calendar/lang/fa.json +++ b/www/addons/calendar/lang/fa.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "زمان پیش‌فرض اطلاع‌رسانی", "errorloadevent": "خطا در بارگیری رویداد.", "errorloadevents": "خطا در بارگیری رویدادها.", - "noevents": "هیچ رویدادی نیست", - "notifications": "هشدارها" + "noevents": "هیچ مهلتی برای فعالیت‌های آتی وجود ندارد", + "notifications": "تذکرات" } \ No newline at end of file diff --git a/www/addons/calendar/lang/fr.json b/www/addons/calendar/lang/fr.json index 79e2b2edcac..9281fbdabb5 100644 --- a/www/addons/calendar/lang/fr.json +++ b/www/addons/calendar/lang/fr.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Heure de notification par défaut", "errorloadevent": "Erreur de chargement de l'événement", "errorloadevents": "Erreur de chargement des événements", - "noevents": "Il n'y a pas d'événement", + "noevents": "Aucune activité", "notifications": "Notifications" } \ No newline at end of file diff --git a/www/addons/calendar/lang/he.json b/www/addons/calendar/lang/he.json index 368fb1895c4..3702664d6e1 100644 --- a/www/addons/calendar/lang/he.json +++ b/www/addons/calendar/lang/he.json @@ -2,6 +2,6 @@ "calendarevents": "אירועי לוח שנה", "errorloadevent": "שגיאה בטעינת האירוע.", "errorloadevents": "שגיאה בטעינת האירועים.", - "noevents": "אין אירועים", - "notifications": "התראות" + "noevents": "לא קיימות פעילויות עתידיות להן מועד הגשה", + "notifications": "עדכונים והודעות" } \ No newline at end of file diff --git a/www/addons/calendar/lang/it.json b/www/addons/calendar/lang/it.json index 7dda0726c1e..bd05740cedc 100644 --- a/www/addons/calendar/lang/it.json +++ b/www/addons/calendar/lang/it.json @@ -2,6 +2,6 @@ "calendarevents": "Eventi nel calendario", "errorloadevent": "Si è verificato un errore durante il caricamento degli eventi.", "errorloadevents": "Si è verificato un errore durante il caricamento degli eventi.", - "noevents": "Non ci sono eventi", + "noevents": "Non ci sono attività da svolgere", "notifications": "Notifiche" } \ No newline at end of file diff --git a/www/addons/calendar/lang/ja.json b/www/addons/calendar/lang/ja.json index b6e5457e412..8bdfec3c217 100644 --- a/www/addons/calendar/lang/ja.json +++ b/www/addons/calendar/lang/ja.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "デフォルト通知時間", "errorloadevent": "イベントの読み込み時にエラーがありました。", "errorloadevents": "イベントの読み込み時にエラーがありました。", - "noevents": "イベントはありません", + "noevents": "到来する活動期限はありません。", "notifications": "通知" } \ No newline at end of file diff --git a/www/addons/calendar/lang/lt.json b/www/addons/calendar/lang/lt.json index 84444f84a30..38fab7b87a5 100644 --- a/www/addons/calendar/lang/lt.json +++ b/www/addons/calendar/lang/lt.json @@ -2,6 +2,6 @@ "calendarevents": "Renginių kalendorius", "errorloadevent": "Klaida įkeliant renginį.", "errorloadevents": "Klaida įkeliant renginius.", - "noevents": "Renginių nėra", + "noevents": "Nėra numatytų artėjančių veiklų", "notifications": "Pranešimai" } \ No newline at end of file diff --git a/www/addons/calendar/lang/nl.json b/www/addons/calendar/lang/nl.json index 5c7174a3165..16546e8a4ee 100644 --- a/www/addons/calendar/lang/nl.json +++ b/www/addons/calendar/lang/nl.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Standaard notificatietijd", "errorloadevent": "Fout bij het laden van de gebeurtenis.", "errorloadevents": "Fout bij het laden van de gebeurtenissen.", - "noevents": "Er zijn geen gebeurtenissen", + "noevents": "Er zijn geen verwachte activiteiten", "notifications": "Meldingen" } \ No newline at end of file diff --git a/www/addons/calendar/lang/pl.json b/www/addons/calendar/lang/pl.json index 4116997d19c..4f391781a66 100644 --- a/www/addons/calendar/lang/pl.json +++ b/www/addons/calendar/lang/pl.json @@ -1,4 +1,4 @@ { - "noevents": "Brak zdarzeń", + "noevents": "Brak nadchodzących terminów zadań", "notifications": "Powiadomienia" } \ No newline at end of file diff --git a/www/addons/calendar/lang/pt-br.json b/www/addons/calendar/lang/pt-br.json index b348e89bed4..f66b11184df 100644 --- a/www/addons/calendar/lang/pt-br.json +++ b/www/addons/calendar/lang/pt-br.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Tempo de notificação padrão", "errorloadevent": "Erro ao carregar evento.", "errorloadevents": "Erro ao carregar eventos.", - "noevents": "Sem eventos", - "notifications": "Notificação" + "noevents": "Não há atividades pendentes", + "notifications": "Avisos" } \ No newline at end of file diff --git a/www/addons/calendar/lang/pt.json b/www/addons/calendar/lang/pt.json index 6cb58c20e8d..a65b11f461a 100644 --- a/www/addons/calendar/lang/pt.json +++ b/www/addons/calendar/lang/pt.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Hora de notificação predefinida", "errorloadevent": "Erro ao carregar evento.", "errorloadevents": "Erro ao carregar eventos.", - "noevents": "Sem eventos", + "noevents": "Nenhuma atividade programada", "notifications": "Notificações" } \ No newline at end of file diff --git a/www/addons/calendar/lang/ru.json b/www/addons/calendar/lang/ru.json index 0d17cabd368..001aa958044 100644 --- a/www/addons/calendar/lang/ru.json +++ b/www/addons/calendar/lang/ru.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Время уведомлений по умолчанию", "errorloadevent": "Ошибка при загрузке события", "errorloadevents": "Ошибка при загрузке событий", - "noevents": "Нет событий", + "noevents": "Нет предстоящих заданий", "notifications": "Уведомления" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sr-cr.json b/www/addons/calendar/lang/sr-cr.json index dba4ebcd807..90d189510bd 100644 --- a/www/addons/calendar/lang/sr-cr.json +++ b/www/addons/calendar/lang/sr-cr.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Подразумевано време за слање обавештења", "errorloadevent": "Грешка приликом учитавања догађаја.", "errorloadevents": "Грешка приликом учитавања догађаја.", - "noevents": "Нема догађаја", + "noevents": "Нема активности које се ускоро завршавају", "notifications": "Обавештења" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sr-lt.json b/www/addons/calendar/lang/sr-lt.json index 7db382ef521..ef06104d1cf 100644 --- a/www/addons/calendar/lang/sr-lt.json +++ b/www/addons/calendar/lang/sr-lt.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Podrazumevano vreme za slanje obaveštenja", "errorloadevent": "Greška prilikom učitavanja događaja.", "errorloadevents": "Greška prilikom učitavanja događaja.", - "noevents": "Nema događaja", - "notifications": "Nema događaja" + "noevents": "Nema aktivnosti koje se uskoro završavaju", + "notifications": "Obaveštenja" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sv.json b/www/addons/calendar/lang/sv.json index d5ac5c127d0..12cef7ef2eb 100644 --- a/www/addons/calendar/lang/sv.json +++ b/www/addons/calendar/lang/sv.json @@ -3,5 +3,5 @@ "errorloadevent": "Fel vid inläsning av händelse.", "errorloadevents": "Fel vid inläsning av händelser", "noevents": "Det finns inga händelser", - "notifications": "Notifikationer" + "notifications": "Administration" } \ No newline at end of file diff --git a/www/addons/calendar/lang/uk.json b/www/addons/calendar/lang/uk.json index 2e0930c7034..e0b616f24a4 100644 --- a/www/addons/calendar/lang/uk.json +++ b/www/addons/calendar/lang/uk.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Час сповіщень за-замовчуванням", "errorloadevent": "Помилка завантаження події.", "errorloadevents": "Помилка завантаження подій.", - "noevents": "Немає подій", - "notifications": "Сповіщення" + "noevents": "Наразі, заплановані активності відсутні", + "notifications": "Повідомлення" } \ No newline at end of file diff --git a/www/addons/calendar/lang/zh-cn.json b/www/addons/calendar/lang/zh-cn.json index 5fc1088f46f..4afe676ce56 100644 --- a/www/addons/calendar/lang/zh-cn.json +++ b/www/addons/calendar/lang/zh-cn.json @@ -1,4 +1,4 @@ { - "noevents": "没有事件", - "notifications": "通知" + "noevents": "没有即将到期的活动", + "notifications": "通告" } \ No newline at end of file diff --git a/www/addons/calendar/lang/zh-tw.json b/www/addons/calendar/lang/zh-tw.json index f880be3d54c..a6d35c00472 100644 --- a/www/addons/calendar/lang/zh-tw.json +++ b/www/addons/calendar/lang/zh-tw.json @@ -2,6 +2,6 @@ "calendarevents": "行事曆", "errorloadevent": "載入事件時出現錯誤", "errorloadevents": "載入事件時出現錯誤", - "noevents": "沒有事件", + "noevents": "沒有即將到期的活動", "notifications": "通知" } \ No newline at end of file diff --git a/www/addons/competency/lang/ar.json b/www/addons/competency/lang/ar.json index 5952485e905..79ce4fda7f6 100644 --- a/www/addons/competency/lang/ar.json +++ b/www/addons/competency/lang/ar.json @@ -1,11 +1,11 @@ { - "activities": "الأنشطة", - "duedate": "تاريخ تقديم مهمة", + "activities": "أنشطة", + "duedate": "موعد التسليم", "errornocompetenciesfound": "لا يوجد أي قدرات موجودة", "myplans": "خططي للتعلم", "nocompetencies": "لا يوجد أي قدرات", "path": "مسار", "progress": "تقدّم الطالب", - "status": "الحالة", + "status": "الوضع", "template": "قالب" } \ No newline at end of file diff --git a/www/addons/competency/lang/bg.json b/www/addons/competency/lang/bg.json index 3b3a332e5fb..37d407ff786 100644 --- a/www/addons/competency/lang/bg.json +++ b/www/addons/competency/lang/bg.json @@ -6,6 +6,6 @@ "myplans": "Моите учебни планове", "noplanswerecreated": "Не бяха създадени учебни планове.", "path": "Път", - "status": "Състояние", + "status": "Състояние на значка", "template": "Шаблон" } \ No newline at end of file diff --git a/www/addons/competency/lang/ca.json b/www/addons/competency/lang/ca.json index 70962efd930..80f7da7b125 100644 --- a/www/addons/competency/lang/ca.json +++ b/www/addons/competency/lang/ca.json @@ -3,24 +3,24 @@ "competenciesmostoftennotproficientincourse": "Competències que més sovint no s'assoleixen en aquest curs", "coursecompetencies": "Competències del curs", "crossreferencedcompetencies": "Competències referenciades", - "duedate": "Data de venciment", + "duedate": "Venciment", "errornocompetenciesfound": "No s'han trobat competències", "evidence": "Evidència", "learningplancompetencies": "Competències del pla d'aprenentatge", "learningplans": "Plans d'aprenentatge", "myplans": "Els meus plans d'aprenentatge", "noactivities": "Cap activitat", - "nocompetencies": "Cap competència", + "nocompetencies": "No s'han creat competències en aquest marc.", "nocrossreferencedcompetencies": "No hi ha competències amb referències a aquesta.", "noevidence": "Cap evidència", "noplanswerecreated": "No s'ha creat cap pla d'aprenentatge.", - "path": "Camí", + "path": "Ruta:", "proficient": "Superada", - "progress": "Progrés de l'estudiant", - "rating": "Valoració", + "progress": "Progrés", + "rating": "Qualificació", "reviewstatus": "Estat de la revisió", - "status": "Estat", - "template": "Plantilla", + "status": "Estat de la insígnia", + "template": "Plantilla de pla d'aprenentatge", "xcompetenciesproficientoutofy": "{{$a.x}} de {{$a.y}} competències superades", "xcompetenciesproficientoutofyincourse": "Heu superat {{$a.x}} de {{$a.y}} competències en aquest curs." } \ No newline at end of file diff --git a/www/addons/competency/lang/cs.json b/www/addons/competency/lang/cs.json index 95324b05ccc..effff8797dc 100644 --- a/www/addons/competency/lang/cs.json +++ b/www/addons/competency/lang/cs.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Hodnocení kompetencí v tomto kurzu nemají vliv na studijní plány.", "coursecompetencyratingsarepushedtouserplans": "Hodnocení kompetencí v tomto kurzu jsou okamžitě aktualizovány v studijních plánech.", "crossreferencedcompetencies": "Průřezové kompetence", - "duedate": "Termín odevzdání", + "duedate": "Datum platnosti", "errornocompetenciesfound": "Nebyly nalezeny žádné kompetence", "evidence": "Evidence", "learningplancompetencies": "Kompetence studijního plánu", "learningplans": "Studijní plány", "myplans": "Mé studijní plány", "noactivities": "Žádné činnosti", - "nocompetencies": "Žádné kompetence", + "nocompetencies": "V tomto rámci nebyly vytvořeny žádné kompetence.", "nocrossreferencedcompetencies": "K této kompetenci nebyly spojeny další průřezové kompetence.", "noevidence": "Bez záznamu", "noplanswerecreated": "Nebyly vytvořeny žádné studijní plány.", - "path": "Cesta", + "path": "Cesta:", "proficient": "Splněno", - "progress": "Pokrok studenta", + "progress": "Pokrok", "rating": "Hodnocení", "reviewstatus": "Stav revize", - "status": "Stav", - "template": "Šablona", + "status": "Stav odznaku", + "template": "Šablona studijního plánu", "xcompetenciesproficientoutofy": "máte splněno {{$a.x}} z {{$a.y}} kompetencí", "xcompetenciesproficientoutofyincourse": "V tomto kurzu máte splněno {{$a.x}} z {{$a.y}} kompetencí." } \ No newline at end of file diff --git a/www/addons/competency/lang/da.json b/www/addons/competency/lang/da.json index dfda559c46e..f139228f22e 100644 --- a/www/addons/competency/lang/da.json +++ b/www/addons/competency/lang/da.json @@ -4,20 +4,20 @@ "coursecompetencyratingsarenotpushedtouserplans": "Kompetencebedømmelser på dette kursus påvirker ikke læringsplaner.", "coursecompetencyratingsarepushedtouserplans": "Kompetencebedømmelser på dette kursus opdateres straks i læringsplaner.", "crossreferencedcompetencies": "Kryds-refererede kompetencer", - "duedate": "Afleveringsdato", + "duedate": "Forfaldsdato", "errornocompetenciesfound": "Ingen kompetencer fundet", "evidence": "Vidnesbyrd", "learningplancompetencies": "Læringsplankompetencer", "learningplans": "Læringsplaner", "myplans": "Mine læringsplaner", "noactivities": "Ingen aktiviteter", - "nocompetencies": "Ingen kompetencer", + "nocompetencies": "Ingen kompetencer er oprettet i denne ramme.", "nocrossreferencedcompetencies": "Ingen andre kompetencer er krydsrefereret til denne kompetence.", "noevidence": "Ingen vidnesbyrd", "noplanswerecreated": "Der blev ikke oprettet nogen læringsplaner.", - "path": "Sti", - "progress": "Studerendes fremskridt", + "path": "Sti:", + "progress": "Progression", "rating": "Bedømmelse", - "status": "Status", - "template": "Skabelon" + "status": "Badgestatus", + "template": "Læringsplanskabelon" } \ No newline at end of file diff --git a/www/addons/competency/lang/de.json b/www/addons/competency/lang/de.json index 2c43a7fb415..77056f4c882 100644 --- a/www/addons/competency/lang/de.json +++ b/www/addons/competency/lang/de.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Kompetenzbewertungen in diesem Kurs beeinflussen keine Lernpläne.", "coursecompetencyratingsarepushedtouserplans": "Kompetenzbewertungen in diesem Kurs werden sofort in den Lernplänen aktualisiert.", "crossreferencedcompetencies": "Querverwiesene Kompetenzen", - "duedate": "Fälligkeitsdatum", + "duedate": "Termin", "errornocompetenciesfound": "Keine Kompetenzen gefunden", - "evidence": "Evidenz", + "evidence": "Beleg", "learningplancompetencies": "Kompetenzen des Lernplans", "learningplans": "Lernpläne", "myplans": "Meine Lernpläne", "noactivities": "Keine Aktivitäten", - "nocompetencies": "Keine Kompetenzen", + "nocompetencies": "Für diesen Kompetenzrahmen wurden keine Kompetenzen angelegt.", "nocrossreferencedcompetencies": "Keine anderen Kompetenzen wurden zu dieser Kompetenz referiert.", "noevidence": "Keine Belege", "noplanswerecreated": "Bisher sind keine Lernpläne angelegt.", - "path": "Pfad", + "path": "Pfad:", "proficient": "Erfahren", - "progress": "Bearbeitungsstand", - "rating": "Bewertung", + "progress": "Fortschritt", + "rating": "Wertung", "reviewstatus": "Überprüfungsstatus", - "status": "Status", - "template": "Vorlage", + "status": "Existierende Einschreibungen erlauben", + "template": "Lernplanvorlage", "xcompetenciesproficientoutofy": "{{$a.x}} von {{$a.y}} Kompetenzen sind eingeübt", "xcompetenciesproficientoutofyincourse": "Du bist in {{$a.x}} von {{$a.y}} Kompetenzen geübt" } \ No newline at end of file diff --git a/www/addons/competency/lang/el.json b/www/addons/competency/lang/el.json index 3a61231a7af..940c9116122 100644 --- a/www/addons/competency/lang/el.json +++ b/www/addons/competency/lang/el.json @@ -1,10 +1,10 @@ { "activities": "Δραστηριότητες", - "duedate": "Καταληκτική ημερομηνία", + "duedate": "Ημερομηνία εκπνοής", "errornocompetenciesfound": "Δεν βρέθηκαν ικανότητες", "nocompetencies": "Δεν βρέθηκαν ικανότητες", "path": "Διαδρομή", "progress": "Πρόοδος μαθητών", - "status": "Κατάσταση", + "status": "Επιτρέπεται η πρόσβαση στους επισκέπτες", "template": "Πρότυπο" } \ No newline at end of file diff --git a/www/addons/competency/lang/es-mx.json b/www/addons/competency/lang/es-mx.json index 276f784e4f3..f1a9d12780f 100644 --- a/www/addons/competency/lang/es-mx.json +++ b/www/addons/competency/lang/es-mx.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Las valoraciones de competencia en este curso no afectan a los planes de aprendizaje.", "coursecompetencyratingsarepushedtouserplans": "Las valoraciones de competencia en este curso son actualizadas inmediatamente dentro de planes de aprendizaje.", "crossreferencedcompetencies": "Competencias con referencias-cruzadas", - "duedate": "Fecha de entrega", + "duedate": "Vencimiento", "errornocompetenciesfound": "No se encontraron competencias", "evidence": "Evidencia", "learningplancompetencies": "Competencias del plan de aprendizaje", "learningplans": "Planes de aprendizaje", "myplans": "Mis planes de aprendizaje", "noactivities": "Sin actividades", - "nocompetencies": "Sin competencias", + "nocompetencies": "No se han creado competencias en esta estructura.", "nocrossreferencedcompetencies": "No se han referenciado cruzadamente otras competencias con esta competencia.", "noevidence": "Sin evidencia", "noplanswerecreated": "No se crearon planes de aprendizaje.", - "path": "Ruta", + "path": "Ruta:", "proficient": "Dominio/pericia", - "progress": "Progreso del estudiante", - "rating": "Valuación (rating)", + "progress": "Progreso", + "rating": "Valoración", "reviewstatus": "Revisar estatus", - "status": "Estatus", - "template": "Plantilla", + "status": "Estatus de insignias", + "template": "Plantilla de plan de aprendizaje", "xcompetenciesproficientoutofy": "{{$a.x}} de un total de {{$a.y}} competencias se tienen dominadas", "xcompetenciesproficientoutofyincourse": "Usted es capaz/perito/experto en {{$a.x}} de un total de {{$a.y}} competencias en este curso." } \ No newline at end of file diff --git a/www/addons/competency/lang/es.json b/www/addons/competency/lang/es.json index b87c3dda451..22b0ec02246 100644 --- a/www/addons/competency/lang/es.json +++ b/www/addons/competency/lang/es.json @@ -5,22 +5,22 @@ "coursecompetencyratingsarenotpushedtouserplans": "Las calificaciones de competencias de este curso no afectan los planes de aprendizaje.", "coursecompetencyratingsarepushedtouserplans": "Las calificaciones de competencias en este curso actualizan de inmediato los planes de aprendizaje.", "crossreferencedcompetencies": "Competencias referenciadas", - "duedate": "Fecha de entrega", + "duedate": "Vencimiento", "errornocompetenciesfound": "No se encontraron competencias", "evidence": "Evidencia", "learningplancompetencies": "Competencias del plan de aprendizaje", "learningplans": "Planes de aprendizaje", "myplans": "Mis planes de aprendizaje", "noactivities": "Sin actividades", - "nocompetencies": "Sin competencias", + "nocompetencies": "No se han creado competencias para este marco.", "nocrossreferencedcompetencies": "No se han referenciado otras competencias a esta competencia.", "noevidence": "Sin evidencias", "path": "Ruta", "proficient": "Superada", - "progress": "Progreso del estudiante", - "rating": "Clasificación", + "progress": "Avance", + "rating": "Calificación", "reviewstatus": "Estado de la revisión", - "status": "Estado", + "status": "Estado de la insignia", "template": "Plantilla", "xcompetenciesproficientoutofy": "{{$a.x}} de {{$a.y}} competencias superadas", "xcompetenciesproficientoutofyincourse": "Has superado {{$a.x}} de las {{$a.y}} competencias del curso." diff --git a/www/addons/competency/lang/eu.json b/www/addons/competency/lang/eu.json index 3b4e8511411..706620b8084 100644 --- a/www/addons/competency/lang/eu.json +++ b/www/addons/competency/lang/eu.json @@ -9,14 +9,14 @@ "learningplans": "Ikasketa-planak", "myplans": "Nire ikasketa-planak", "noactivities": "Ez dago jarduerarik", - "nocompetencies": "Gaitasunik ez", + "nocompetencies": "Ezin izan gaitasunik sortu marko honetan.", "noevidence": "Ez dago ebidentziarik", "noplanswerecreated": "Ez da ikasketa-planik sortu.", - "path": "Bidea", + "path": "Bidea:", "proficient": "Gai", - "progress": "Ikaslearen aurrerapena", + "progress": "Aurrerapena", "rating": "Puntuazioa", "reviewstatus": "Berrikusi egora", - "status": "Egoera", - "template": "Txantiloia" + "status": "Dominen egoera", + "template": "Ikasketa-planerako txantiloia" } \ No newline at end of file diff --git a/www/addons/competency/lang/fa.json b/www/addons/competency/lang/fa.json index 7bec744c8a6..768c777500c 100644 --- a/www/addons/competency/lang/fa.json +++ b/www/addons/competency/lang/fa.json @@ -4,7 +4,7 @@ "coursecompetencyratingsarenotpushedtouserplans": "امتیازهای شایستگی‌ها در این درس تاثیری در برنامه‌های یادگیری ندارند.", "coursecompetencyratingsarepushedtouserplans": "امتیازهای شایستگی‌ها در این درس بلافاصله در برنامه‌های یادگیری به‌روز می‌شوند.", "crossreferencedcompetencies": "شایستگی‌های دارای ارجاع متقابل", - "duedate": "مهلت تحویل", + "duedate": "مهلت", "errornocompetenciesfound": "هیچ شایستگی‌ای پیدا نشد", "evidence": "مدرک", "learningplancompetencies": "شایستگی‌های برنامه یادگیری", @@ -13,13 +13,13 @@ "nocrossreferencedcompetencies": "هیچ شایستگی دیگری به این شایستگی به‌طور متقابل ارجاع داده نشده است.", "noevidence": "بدون مدرک", "noplanswerecreated": "هیچ برنامهٔ یادگیری‌ای ساخته نشده است.", - "path": "مسیر", + "path": "مسیر:", "proficient": "کسب مهارت", - "progress": "پیشروی شاگردان", + "progress": "پیشروی", "rating": "امتیاز", "reviewstatus": "بازبینی وضعیت", - "status": "وضعیت", - "template": "الگو", + "status": "وضعیت مدال", + "template": "الگوی برنامه یادگیری", "xcompetenciesproficientoutofy": "در {{$a.x}} شایستگی از مجموع {{$a.y}} شایستگی مهارت کسب شده است", "xcompetenciesproficientoutofyincourse": "شما در {{$a.x}} شایستگی از {{$a.y}} شایستگی ماهر هستید." } \ No newline at end of file diff --git a/www/addons/competency/lang/fr.json b/www/addons/competency/lang/fr.json index 54703a62fc1..da75ef9eb86 100644 --- a/www/addons/competency/lang/fr.json +++ b/www/addons/competency/lang/fr.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Les évaluations de compétences de ce cours n'ont pas d'influence sur les plans de formation.", "coursecompetencyratingsarepushedtouserplans": "Les évaluations de compétences de ce cours sont immédiatement reportées dans les plans de formation.", "crossreferencedcompetencies": "Compétences transversales", - "duedate": "Date de remise", + "duedate": "Délai d'achèvement", "errornocompetenciesfound": "Aucune compétence trouvée", "evidence": "Preuve", "learningplancompetencies": "Compétences du plan de formation", "learningplans": "Plans de formation", "myplans": "Mes plans de formation", "noactivities": "Aucune activité", - "nocompetencies": "Aucune compétence", + "nocompetencies": "Aucune compétence n'a été créée dans ce référentiel.", "nocrossreferencedcompetencies": "Aucune autre compétence n'est transversale pour cette compétence.", "noevidence": "Aucune preuve d'acquis", "noplanswerecreated": "Aucun plan de formation n'a été créé.", - "path": "Chemin", + "path": "Chemin :", "proficient": "Compétence acquise", - "progress": "Suivi des activités des participants", + "progress": "Progrès", "rating": "Évaluation", "reviewstatus": "Statut de validation", - "status": "Statut", - "template": "Modèle", + "status": "Statut du badge", + "template": "Modèle de plan de formation", "xcompetenciesproficientoutofy": "{{$a.x}} compétences sur {{$a.y}} sont acquises", "xcompetenciesproficientoutofyincourse": "Vous avez acquis {{$a.x}} compétences sur {{$a.y}} dans ce cours." } \ No newline at end of file diff --git a/www/addons/competency/lang/he.json b/www/addons/competency/lang/he.json index ffae1727aab..0a89741eb32 100644 --- a/www/addons/competency/lang/he.json +++ b/www/addons/competency/lang/he.json @@ -5,8 +5,8 @@ "coursecompetencyratingsarenotpushedtouserplans": "השלמת מיומנויות בקורס זה לא מתעדכנות בתוכניות־הלימוד", "coursecompetencyratingsarepushedtouserplans": "מצב רכישת מיומנות כתוצאה מהשלמת פעילות בקורס, מתעדכן באופן מידי בתוכניות־הלימוד.", "crossreferencedcompetencies": "מקושר למיומנויות", - "duedate": "תאריך סופי", - "evidence": "סימוכין", + "duedate": "עד לתאריך", + "evidence": "ראיה לבקיאות", "learningplancompetencies": "מיומנויות תוכנית־הלימוד", "learningplans": "תוכניות־לימוד", "myplans": "תוכניות הלימודים שלי", @@ -15,13 +15,13 @@ "nocrossreferencedcompetencies": "אף מיומנות לא מקושרת למיומנות זו.", "noevidence": "טרם צורפה ראיה לבקיאות", "noplanswerecreated": "טרם נוצרו תוכניות־לימוד.", - "path": "נתיב:", + "path": "נתיב", "proficient": "בקיאות", - "progress": "מעקב התקדמות למידה", - "rating": "דירוג", + "progress": "התקדמות", + "rating": "דרוג", "reviewstatus": "סקירת מצב", - "status": "מצב", - "template": "תבנית", + "status": "סטטוס ההישג", + "template": "תבנית תוכנית־לימוד", "xcompetenciesproficientoutofy": "בקיאות ב {{$a.x}} מיומנויות מתוך {{$a.y}}", "xcompetenciesproficientoutofyincourse": "רכשתם בקיאות ב {{$a.x}} מתוך {{$a.y}} המיומנויות בקורס זה." } \ No newline at end of file diff --git a/www/addons/competency/lang/hu.json b/www/addons/competency/lang/hu.json index 101f0f9a6a0..eb64c67f47c 100644 --- a/www/addons/competency/lang/hu.json +++ b/www/addons/competency/lang/hu.json @@ -5,7 +5,7 @@ "coursecompetencyratingsarenotpushedtouserplans": "A kurzus készségbesorolásai nem érintik a tanulási terveket.", "coursecompetencyratingsarepushedtouserplans": "A kurzus készségbesorolásai azonnal frissülnek a tanulási tervekben.", "crossreferencedcompetencies": "Kereszthivatkozott készségek", - "duedate": "Határidő", + "duedate": "Esedékesség", "evidence": "Bizonyíték", "learningplancompetencies": "Tanulási tervhez tartozó készségek", "learningplans": "Tanulási tervek", @@ -15,13 +15,13 @@ "nocrossreferencedcompetencies": "A készséghez kereszthivatkozással nem kapcsolódik más készség.", "noevidence": "Nincs bizonyíték", "noplanswerecreated": "Nem jött létre tanulási terv.", - "path": "Útvonal", + "path": "Útvonal:", "proficient": "Sikeres", - "progress": "A tanuló előmenetele", - "rating": "Értékelés", + "progress": "Előmenetel", + "rating": "Besorolás", "reviewstatus": "Ellenőrzés állapota", - "status": "Állapot", - "template": "Sablon", + "status": "A kitűző állapota", + "template": "Tanulási tervsablon", "xcompetenciesproficientoutofy": "{{$a.x}} / {{$a.y}} készség eredményes", "xcompetenciesproficientoutofyincourse": "Ön a kurzusban {{$a.y}} közül {{$a.x}} készség tekintetében eredményesnek bizonyul." } \ No newline at end of file diff --git a/www/addons/competency/lang/it.json b/www/addons/competency/lang/it.json index 9c5d5159c01..a578afc6c20 100644 --- a/www/addons/competency/lang/it.json +++ b/www/addons/competency/lang/it.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Le valutazioni delle competenze nel corso non si riflettono nei piani di formazione.", "coursecompetencyratingsarepushedtouserplans": "Le valutazione delle competenze nel corso si riflettono immediatamente nei piani di formazione.", "crossreferencedcompetencies": "Competenze con riferimento incrociato", - "duedate": "Termine consegne", + "duedate": "Data di termine", "errornocompetenciesfound": "Non sono state trovate competenze", - "evidence": "Verifica", + "evidence": "Attestazione", "learningplancompetencies": "Competenze del piano di formazione", "learningplans": "Piani di formazione", "myplans": "I miei piani di formazione", "noactivities": "Nessuna attività.", - "nocompetencies": "Non sono presenti competenze", + "nocompetencies": "Questo quadro non ha competenze", "nocrossreferencedcompetencies": "Non ci sono competenze con riferimenti incrociati a questa competenza", "noevidence": "Non sono presenti attestazioni.", "noplanswerecreated": "Non sono stati creati piani di formazione", - "path": "Percorso", + "path": "Percorso:", "proficient": "Esperto", - "progress": "Situazione dello studente", + "progress": "Avanzamento", "rating": "Valutazione", "reviewstatus": "Stato della revisione", - "status": "Stato", - "template": "Modello", + "status": "Stato badge", + "template": "Modello di piano di formazione", "xcompetenciesproficientoutofy": "{{$a.x}} competenze su {{$a.y}} sono a livello di esperto", "xcompetenciesproficientoutofyincourse": "Possiedi un livello di esperto in {{$a.x}} competenze su {{$a.y}} competenze di questo corso." } \ No newline at end of file diff --git a/www/addons/competency/lang/ja.json b/www/addons/competency/lang/ja.json index c2210f5308d..0e42d5d3584 100644 --- a/www/addons/competency/lang/ja.json +++ b/www/addons/competency/lang/ja.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "このコース内でのコンピテンシー評定は学習プランに影響しません。", "coursecompetencyratingsarepushedtouserplans": "このコース内でのコンピテンシー評定は学習プラン内ですぐに更新されます。", "crossreferencedcompetencies": "クロスリファレンスコンピテンシー", - "duedate": "終了日時", + "duedate": "期限", "errornocompetenciesfound": "コンピテンシーが見つかりません", "evidence": "エビデンス", "learningplancompetencies": "学習プランコンピテンシー", "learningplans": "学習プラン", "myplans": "マイ学習プラン", "noactivities": "活動なし", - "nocompetencies": "コンピテンシーなし", + "nocompetencies": "このフレームワークにコンピテンシーは作成されていません。", "nocrossreferencedcompetencies": "このコンピテンシーに相互参照されている他のコンピテンシーはありません。", "noevidence": "エビデンスなし", "noplanswerecreated": "学習プランは作成されませんでした。", - "path": "パス", + "path": "パス:", "proficient": "熟達", - "progress": "学生の進捗", - "rating": "評価", + "progress": "進捗", + "rating": "評定", "reviewstatus": "レビューステータス", - "status": "ステータス", - "template": "テンプレート", + "status": "バッジステータス", + "template": "学習プランテンプレート", "xcompetenciesproficientoutofy": "{{$a.x}} / {{$a.y}} のコンピテンシーで熟達しています。", "xcompetenciesproficientoutofyincourse": "あなたはこのコースに関して {{$a.x}} / {{$a.y}} のコンピテンシーで熟達しています。" } \ No newline at end of file diff --git a/www/addons/competency/lang/lt.json b/www/addons/competency/lang/lt.json index bfd76f8a42c..cc846b39a81 100644 --- a/www/addons/competency/lang/lt.json +++ b/www/addons/competency/lang/lt.json @@ -1,19 +1,25 @@ { - "activities": "Veikla", + "activities": "Veiklos", "coursecompetencies": "Kurso kompetencijos", "coursecompetencyratingsarenotpushedtouserplans": "Kompetencijų reitingai šiame kurse neturi įtakos mokymosi planams.", - "duedate": "Data pristatymui", + "crossreferencedcompetencies": "Kryžminės kompetencijos", + "duedate": "Terminas", "errornocompetenciesfound": "Kompetencijų nerasta", "evidence": "Įrodymas", "learningplancompetencies": "Mokymosi plano kompetencijos", "learningplans": "Mokymosi planai", "myplans": "Mano mokymosi planai", "noactivities": "Nėra veiklų", - "nocompetencies": "Nėra kompetencijų", + "nocompetencies": "Šioje sistemoje nebuvo sukurta kompetencijų.", + "nocrossreferencedcompetencies": "Jokios kitos kompetencijos nebuvo susietos kryžmine nuoroda su šia kompetencija.", + "noevidence": "Nėra įrodymų", "noplanswerecreated": "Nebuvo sukurta mokymosi planų.", "path": "Kelias", - "progress": "Besimokančiojo pažanga", - "rating": "Vertinimas", - "status": "Būsena", - "template": "Šablonas" + "proficient": "Įgūdis", + "progress": "Progresas", + "rating": "Reitingas", + "reviewstatus": "Peržiūros būsena", + "status": "Pasiekimo būsena", + "template": "Mokymosi plano šablonas", + "xcompetenciesproficientoutofyincourse": "Įgijote {{$a.x}} iš {{$a.y}} kompetenciją šiame kurse." } \ No newline at end of file diff --git a/www/addons/competency/lang/nl.json b/www/addons/competency/lang/nl.json index 5dff19cfe87..b6e8ddd757e 100644 --- a/www/addons/competency/lang/nl.json +++ b/www/addons/competency/lang/nl.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Competentiebeoordelingen in deze cursus hebben geen invloed op studieplannnen.", "coursecompetencyratingsarepushedtouserplans": "Competentiebeoordelingen in deze cursus worden onmiddellijk aangepast in studieplannen.", "crossreferencedcompetencies": "Competenties met kruisverwijzingen", - "duedate": "Uiterste inleverdatum", + "duedate": "Klaar tegen", "errornocompetenciesfound": "Geen competenties gevonden", "evidence": "Bewijs", "learningplancompetencies": "Studieplan competenties", "learningplans": "Studieplannen", "myplans": "Mijn studieplannen", "noactivities": "Geen activiteiten", - "nocompetencies": "Geen competenties", + "nocompetencies": "Er zijn nog geen competenties gemaakt in dit framework", "nocrossreferencedcompetencies": "Er zijn geen andere competenties met een kruisverwijzing naar deze competentie.", "noevidence": "Geen bewijs", "noplanswerecreated": "Er zijn nog geen studieplannen gemaakt", - "path": "Pad", + "path": "Pad:", "proficient": "Geslaagd", - "progress": "Vordering leerling", + "progress": "Vordering", "rating": "Beoordeling", "reviewstatus": "Beoordelingsstatus", - "status": "Status", - "template": "Sjabloon", + "status": "Badge status", + "template": "Studieplansjabloon", "xcompetenciesproficientoutofy": "{{$a.x}} van de {{$a.y}} competenties zijn bekwaam", "xcompetenciesproficientoutofyincourse": "Je bent bekwaam in {{$a.x}} van de {{$a.y}} competenties in deze cursus." } \ No newline at end of file diff --git a/www/addons/competency/lang/pl.json b/www/addons/competency/lang/pl.json index 2b72a64195a..f548cb4520d 100644 --- a/www/addons/competency/lang/pl.json +++ b/www/addons/competency/lang/pl.json @@ -1,7 +1,7 @@ { "activities": "Aktywności", "coursecompetencies": "Kompetencje kursu", - "duedate": "Termin oddania", + "duedate": "Termin", "evidence": "Dowód", "learningplancompetencies": "Kompetencje planu nauczania", "learningplans": "Plany nauczania", @@ -10,10 +10,10 @@ "nocompetencies": "Nie utworzono żadnych kompetencji w tych ramach kwalifikacji.", "noevidence": "Brak dowodów", "noplanswerecreated": "Nie utworzono planów uczenia się.", - "path": "Ścieżka", - "progress": "Postępy studenta w nauce", + "path": "Ścieżka:", + "progress": "Postęp", "rating": "Ocena", "reviewstatus": "Status przeglądu", - "status": "Status", - "template": "Szablon" + "status": "Status odznak", + "template": "Szablon planu uczenia się." } \ No newline at end of file diff --git a/www/addons/competency/lang/pt-br.json b/www/addons/competency/lang/pt-br.json index 268860975f8..42b3ca47eb5 100644 --- a/www/addons/competency/lang/pt-br.json +++ b/www/addons/competency/lang/pt-br.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "Avaliações de competência neste curso não afetam os planos de aprendizagem.", "coursecompetencyratingsarepushedtouserplans": "Avaliações de competência neste curso são atualizadas imediatamente nos planos de aprendizagem.", "crossreferencedcompetencies": "Competências referenciadas", - "duedate": "Data de entrega", + "duedate": "Data de encerramento", "errornocompetenciesfound": "Nenhuma competência encontrada", "evidence": "Evidência", "learningplancompetencies": "Competências do plano de aprendizagem", "learningplans": "Planos de aprendizagem", "myplans": "Meus planos de aprendizagem", "noactivities": "Sem atividades", - "nocompetencies": "Nenhuma competência", + "nocompetencies": "Nenhuma competência foi criada para esta estrutura.", "nocrossreferencedcompetencies": "Nenhuma outra competência foi referenciada a esta competência.", "noevidence": "Nenhuma evidência", "noplanswerecreated": "Nenhum plano de aprendizagem foi criado.", - "path": "Caminho", + "path": "Caminho:", "proficient": "Proficiente", - "progress": "Progresso do aluno", + "progress": "Progresso", "rating": "Avaliação", "reviewstatus": "Estado da revisão", - "status": "Status", - "template": "Modelo", + "status": "Status do emblema", + "template": "Modelo de plano de aprendizagem", "xcompetenciesproficientoutofy": "{{$a.x}} de {{$a.y}} competências são proficiêntes", "xcompetenciesproficientoutofyincourse": "Você é proficiente em {{$a.x}} de {{$a.y}} competências neste curso." } \ No newline at end of file diff --git a/www/addons/competency/lang/pt.json b/www/addons/competency/lang/pt.json index 9acc0bd20d8..a4a75b2de01 100644 --- a/www/addons/competency/lang/pt.json +++ b/www/addons/competency/lang/pt.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "As avaliações das competências nesta disciplina não afetam os planos de aprendizagem.", "coursecompetencyratingsarepushedtouserplans": "As avaliações das competências nesta disciplina são automaticamente atualizadas nos planos de aprendizagem.", "crossreferencedcompetencies": "Competências referenciadas", - "duedate": "Data limite para submeter trabalhos", + "duedate": "Data de fim", "errornocompetenciesfound": "Competências não encontradas", - "evidence": "Evidência", + "evidence": "Comprovativo", "learningplancompetencies": "Competências do plano de aprendizagem", "learningplans": "Planos de aprendizagem", "myplans": "Os meus planos de aprendizagem", "noactivities": "Nenhuma atividade associada", - "nocompetencies": "Sem competências", + "nocompetencies": "Ainda não foram criadas competências neste quadro.", "nocrossreferencedcompetencies": "Nenhuma competência foi referenciada a esta competência.", "noevidence": "Não foi adicionado nenhum comprovativo", "noplanswerecreated": "Nenhum plano de aprendizagem foi criado.", - "path": "Caminho", + "path": "Localização:", "proficient": "Proficiente", - "progress": "Progresso do aluno", + "progress": "Progresso", "rating": "Avaliação", "reviewstatus": "Estado da revisão", - "status": "Estado", - "template": "Modelo", + "status": "Estado da Medalha", + "template": "Modelo de plano de aprendizagem", "xcompetenciesproficientoutofy": "Tem proficiência em {{$a.x}} de {{$a.y}} competências", "xcompetenciesproficientoutofyincourse": "Tem proficiência em {{$a.x}} de {{$a.y}} competências nesta disciplina" } \ No newline at end of file diff --git a/www/addons/competency/lang/ro.json b/www/addons/competency/lang/ro.json index 63d6243c09f..9dec53a5b19 100644 --- a/www/addons/competency/lang/ro.json +++ b/www/addons/competency/lang/ro.json @@ -1,10 +1,10 @@ { - "activities": "Activităţi", + "activities": "Activități", "duedate": "Termen de predare", "evidence": "Evidență", "path": "Cale", "progress": "Progres student", "rating": "Rating", - "status": "Status", + "status": "Status ecuson", "template": "Șablon" } \ No newline at end of file diff --git a/www/addons/competency/lang/ru.json b/www/addons/competency/lang/ru.json index d268e9046ac..b4dd1160c36 100644 --- a/www/addons/competency/lang/ru.json +++ b/www/addons/competency/lang/ru.json @@ -1,12 +1,12 @@ { - "activities": "Элементы курса", + "activities": "Элементы", "competenciesmostoftennotproficientincourse": "Компетенции, которые чаще всего оказываются не освоенными в этом курсе", "coursecompetencies": "Компетенции курса", "coursecompetencyratingsarenotpushedtouserplans": "Рейтинги компетенций из этого курса не влияют на учебные планы.", "coursecompetencyratingsarepushedtouserplans": "Рейтинги компетенций из этого курса сразу же обновляются в учебных планах.", "crossreferencedcompetencies": "Перекрестные компетенции", - "duedate": "Последний срок сдачи", - "evidence": "Подтверждение", + "duedate": "Срок выполнения", + "evidence": "Доказательство", "learningplancompetencies": "Компетенции учебного плана", "learningplans": "Учебные планы", "myplans": "Мои учебные планы", @@ -15,13 +15,13 @@ "nocrossreferencedcompetencies": "Нет других компетенций, перекрестно ссылающихся на эту компетенцию.", "noevidence": "Нет доказательств", "noplanswerecreated": "Учебные планы не были созданы.", - "path": "Путь", + "path": "Путь:", "proficient": "Освоено", - "progress": "Достижения студента", + "progress": "В процессе", "rating": "Рейтинг", "reviewstatus": "Статус пересмотра", - "status": "Статус", - "template": "Шаблон", + "status": "Статус значка", + "template": "Шаблон учебного плана", "xcompetenciesproficientoutofy": "{{$a.x}} из {{$a.y}} компетенций освоены", "xcompetenciesproficientoutofyincourse": "Вы освоили {{$a.x}} из {{$a.y}} компетенций в этом курсе." } \ No newline at end of file diff --git a/www/addons/competency/lang/sr-cr.json b/www/addons/competency/lang/sr-cr.json index 7a73abc828d..c1e8de7be78 100644 --- a/www/addons/competency/lang/sr-cr.json +++ b/www/addons/competency/lang/sr-cr.json @@ -1,4 +1,28 @@ { + "activities": "Активности", + "competenciesmostoftennotproficientincourse": "Компетенције које најчешће нису усавршене на овом курсу", + "coursecompetencies": "Компетенције курса", + "coursecompetencyratingsarenotpushedtouserplans": "Рангирање компетенција на овом курсу на утиче на планове учења.", + "coursecompetencyratingsarepushedtouserplans": "Рангирање компетенција на овом курсу се аутоматски ажурира у плановима учења.", + "crossreferencedcompetencies": "Унакрсно повезане компетенције", + "duedate": "Крајњи рок", "errornocompetenciesfound": "Није пронађена ниједна компетенција", - "nocompetencies": "Нема компетенција" + "evidence": "Доказ", + "learningplancompetencies": "Компетенције плана учења", + "learningplans": "Планови учења", + "myplans": "Моји планови учења", + "noactivities": "Нема активности", + "nocompetencies": "Ниједна компетенција није креирана у овом оквиру.", + "nocrossreferencedcompetencies": "Ниједна друга компетенција није унакрсно повезана са овом компетенцијом.", + "noevidence": "Нема доказа", + "noplanswerecreated": "Није креиран ниједан план учења.", + "path": "Путања", + "proficient": "Стручан", + "progress": "Напредовање полазника", + "rating": "Оцена", + "reviewstatus": "Прегледај статус", + "status": "Статус", + "template": "Шаблон", + "xcompetenciesproficientoutofy": "{{$a.x}} од {{$a.y}} компетенција су на највишем нивоу стручности", + "xcompetenciesproficientoutofyincourse": "Стручни сте у {{$a.x}} од {{$a.y}} компетенција на овом курсу." } \ No newline at end of file diff --git a/www/addons/competency/lang/sr-lt.json b/www/addons/competency/lang/sr-lt.json index 31af28b95ea..443a40f4ff4 100644 --- a/www/addons/competency/lang/sr-lt.json +++ b/www/addons/competency/lang/sr-lt.json @@ -1,4 +1,28 @@ { + "activities": "Aktivnosti", + "competenciesmostoftennotproficientincourse": "Kompetencije koje najčešće nisu usavršene na ovom kursu", + "coursecompetencies": "Kompetencije kursa", + "coursecompetencyratingsarenotpushedtouserplans": "Rangiranje kompetencija na ovom kursu na utiče na planove učenja.", + "coursecompetencyratingsarepushedtouserplans": "Rangiranje kompetencija na ovom kursu se automatski ažurira u planovima učenja.", + "crossreferencedcompetencies": "Unakrsno povezane kompetencije", + "duedate": "Krajnji rok", "errornocompetenciesfound": "Nije pronađena nijedna kompetencija", - "nocompetencies": "Nema kompetencija" + "evidence": "Dokaz", + "learningplancompetencies": "Kompetencije plana učenja", + "learningplans": "Planovi učenja", + "myplans": "Moji planovi učenja", + "noactivities": "Nema aktivnosti", + "nocompetencies": "Nijedna kompetencija nije kreirana u ovom okviru.", + "nocrossreferencedcompetencies": "Nijedna druga kompetencija nije unakrsno povezana sa ovom kompetencijom.", + "noevidence": "Nema dokaza", + "noplanswerecreated": "Nije kreiran nijedan plan učenja.", + "path": "Putanja", + "proficient": "Stručan", + "progress": "Napredovanje polaznika", + "rating": "Ocena", + "reviewstatus": "Pregledaj status", + "status": "Status", + "template": "Šablon", + "xcompetenciesproficientoutofy": "{{$a.x}} od {{$a.y}} kompetencija su na najvišem nivou stručnosti", + "xcompetenciesproficientoutofyincourse": "Stručni ste u {{$a.x}} od {{$a.y}} kompetencija na ovom kursu." } \ No newline at end of file diff --git a/www/addons/competency/lang/sv.json b/www/addons/competency/lang/sv.json index a87634db442..15a7a9216ef 100644 --- a/www/addons/competency/lang/sv.json +++ b/www/addons/competency/lang/sv.json @@ -5,8 +5,8 @@ "coursecompetencyratingsarenotpushedtouserplans": "Bedömning av kompetenser i denna kurs kommer inte att påverka studieplaner.", "coursecompetencyratingsarepushedtouserplans": "Bedömning av kompetenser i denna kurs uppdateras omedelbart i studieplanerna.", "crossreferencedcompetencies": "Korsrefererade kompetenser.", - "duedate": "Stoppdatum/tid", - "evidence": "Bevis", + "duedate": "Sista inskickningsdatum", + "evidence": "Verifiering", "learningplancompetencies": "Kompetenser i studieplaner", "learningplans": "Studieplaner", "myplans": "Mina studieplaner", @@ -15,13 +15,13 @@ "nocrossreferencedcompetencies": "Inga andra kompetenser har korsrefererats till denna kompetens.", "noevidence": "Inga verifieringar", "noplanswerecreated": "Inga studieplaner var skapade.", - "path": "Sökväg", + "path": "Sökväg:", "proficient": "Kunnig", - "progress": "Kursdeltagares progression", - "rating": "Betygssättning/omdömen", + "progress": "Utveckling", + "rating": "Bedömning", "reviewstatus": "Granska status", - "status": "Status", - "template": "Mall", + "status": "Status för märke", + "template": "Mall för studieplan", "xcompetenciesproficientoutofy": "{{$a.x}} av {{$a.y}} kompetenser är uppnådda", "xcompetenciesproficientoutofyincourse": "Du har uppnått {{$a.x}} av {{$a.y}} kompetenser i denna kurs.." } \ No newline at end of file diff --git a/www/addons/competency/lang/tr.json b/www/addons/competency/lang/tr.json index aaf5e15f532..4253ce29f6c 100644 --- a/www/addons/competency/lang/tr.json +++ b/www/addons/competency/lang/tr.json @@ -5,8 +5,8 @@ "coursecompetencyratingsarenotpushedtouserplans": "Bu dersin yetkinlik dereceleri öğrenme planlarını etkilemez.", "coursecompetencyratingsarepushedtouserplans": "Bu dersin yetkinlik dereceleri öğrenme planlarında anında güncellenir.", "crossreferencedcompetencies": "Çapraz referanslı yetkinlikler", - "duedate": "Son teslim tarihi", - "evidence": "Kanıt", + "duedate": "Bitiş tarihi", + "evidence": "Öğrenme kanıtı", "learningplancompetencies": "Öğrenme planı yetkinlikleri", "learningplans": "Öğrenme planları", "myplans": "Benim öğrenme planlarım", @@ -15,13 +15,13 @@ "nocrossreferencedcompetencies": "Bu yetkinliğe çapraz referanslı başka yetkinlik bulunmamaktadır.", "noevidence": "Öğrenme kanıtı yok", "noplanswerecreated": "Hiçbir öğrenme planı oluşturulmadı.", - "path": "Yol", + "path": "Yol:", "proficient": "Yeterli", - "progress": "Öğrenci ilerlemesi", + "progress": "İlerleme", "rating": "Derecelendirme", "reviewstatus": "İnceleme durumu", - "status": "Durum", - "template": "Şablon", + "status": "Nişan Durumu", + "template": "Öğrenme planı şablonu", "xcompetenciesproficientoutofy": "{{$a.y}} yetkinliğinden {{$a.x}} dışarıda yeterli", "xcompetenciesproficientoutofyincourse": "Bu derste {{$a.y}} yetkinliğin dışında {{$a.x}} yeterliliğe sahibisiniz." } \ No newline at end of file diff --git a/www/addons/competency/lang/uk.json b/www/addons/competency/lang/uk.json index d764c9bda7c..047fc924f5a 100644 --- a/www/addons/competency/lang/uk.json +++ b/www/addons/competency/lang/uk.json @@ -1,28 +1,28 @@ { - "activities": "Види діяльності", + "activities": "Діяльності", "competenciesmostoftennotproficientincourse": "Компетентності, які найчастіше не досягаються у цьому курсі", "coursecompetencies": "Компетентності курсу", "coursecompetencyratingsarenotpushedtouserplans": "Оцінювання компетентностей цього курсу не впливають на навчальні плани", "coursecompetencyratingsarepushedtouserplans": "Оцінювання компетентностей цього курсу будуть зразу передані в навчальні плани.", "crossreferencedcompetencies": "Пов'язані компетентності", - "duedate": "Кінцевий термін здачі", + "duedate": "Кінцевий термін", "errornocompetenciesfound": "Не знайдено компетенції", - "evidence": "Докази", + "evidence": "Підтвердження", "learningplancompetencies": "Компетентності навчального плану", "learningplans": "Навчальний план", "myplans": "Мої навчальні плани", "noactivities": "Жодної діяльності", - "nocompetencies": "Немає компетенції", + "nocompetencies": "Жодної компетентності не створено у цьому репозиторії", "nocrossreferencedcompetencies": "Жодна інша компетентність не пов'язана з даною", "noevidence": "Жодного підтвердження", "noplanswerecreated": "Жодного навчального плану не було створено", - "path": "Шлях", + "path": "Шлях:", "proficient": "Набута компетентність", - "progress": "Прогрес студента", - "rating": "Оцінка", + "progress": "Прогрес", + "rating": "Оцінювання", "reviewstatus": "Статус підтвердження", - "status": "Статус", - "template": "Шаблон", + "status": "Статус відзнаки", + "template": "Шаблон навчального плану", "xcompetenciesproficientoutofy": "{{$a.x}} компетентностей з {{$a.y}} набуті", "xcompetenciesproficientoutofyincourse": "Ви набули {{$a.x}} компетентностей з {{$a.y}} наявних у цьому курсі" } \ No newline at end of file diff --git a/www/addons/competency/lang/zh-cn.json b/www/addons/competency/lang/zh-cn.json index e22e787d956..48f9fe6ae99 100644 --- a/www/addons/competency/lang/zh-cn.json +++ b/www/addons/competency/lang/zh-cn.json @@ -2,15 +2,15 @@ "activities": "活动", "competenciesmostoftennotproficientincourse": "在这门课程中你有太多不精通的能力", "coursecompetencies": "课程能力", - "duedate": "截止时间", + "duedate": "截止日", "evidence": "凭据", "noactivities": "没有设置活动", "path": "路径", "proficient": "精通", "progress": "学生进度", "rating": "正在评分", - "status": "状态", - "template": "模板", + "status": "勋章状态", + "template": "学习计划模板", "xcompetenciesproficientoutofy": "{{$a.y}}个能力中的{{$a.x}}是精通的", "xcompetenciesproficientoutofyincourse": "你精通这门课程{{$a.y}}个能力中的{{$a.x}}个。" } \ No newline at end of file diff --git a/www/addons/competency/lang/zh-tw.json b/www/addons/competency/lang/zh-tw.json index fe0b027bb70..90a00057bf4 100644 --- a/www/addons/competency/lang/zh-tw.json +++ b/www/addons/competency/lang/zh-tw.json @@ -5,24 +5,24 @@ "coursecompetencyratingsarenotpushedtouserplans": "在這一課程的核心能力評等不會影響學習計畫", "coursecompetencyratingsarepushedtouserplans": "在這一課程的核心能力評等在學習計畫上會立即更新", "crossreferencedcompetencies": "交互參照的核心能力", - "duedate": "規定繳交時間", + "duedate": "到期日", "errornocompetenciesfound": "找不到能使用的功能", "evidence": "證據", "learningplancompetencies": "學習計畫核心能力", "learningplans": "學習計畫", "myplans": "我的學習計畫", "noactivities": "沒有活動", - "nocompetencies": "沒有功能", + "nocompetencies": "在這一架構中沒有核心能力被建立", "nocrossreferencedcompetencies": "沒有其他核心能力被交互參照這一核心能力", "noevidence": "沒有證據", "noplanswerecreated": "沒有學習計畫被建立", - "path": "路徑", + "path": "路徑:", "proficient": "精熟", - "progress": "學生進度", - "rating": "評比", + "progress": "進度", + "rating": "評等", "reviewstatus": "審查狀況", - "status": "狀態", - "template": "範本", + "status": "獎章狀態", + "template": "學習計畫樣版", "xcompetenciesproficientoutofy": "在{{$a.y}}個核心能力中有{{$a.x}}個已經精熟", "xcompetenciesproficientoutofyincourse": "在此課程中有{{$a.y}}個核心能力,你已經精熟{{$a.x}}個。" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ar.json b/www/addons/coursecompletion/lang/ar.json index f88bc955bca..9069a17e684 100644 --- a/www/addons/coursecompletion/lang/ar.json +++ b/www/addons/coursecompletion/lang/ar.json @@ -1,21 +1,21 @@ { - "complete": "مكتمل", + "complete": "كامل", "completecourse": "مقرر مكتمل", - "completed": "تم إكمال المقرر", + "completed": "تم", "completiondate": "تاريخ إكمال المقرر", "couldnotloadreport": "لا يمكن تحميل تقرير إكمال المقرر، الرجاء المحاولة في وقت آخر", - "coursecompletion": "إكمال المقرر", - "criteria": "المعايير", - "criteriagroup": "معايير المجموعة", + "coursecompletion": "إكمال المقرر الدراسي", + "criteria": "معايير", + "criteriagroup": "مجموعة المعايير", "criteriarequiredall": "كل المعايير في الأسفل مطلوبة", - "criteriarequiredany": "أي معايير في الأسفل مطلوبة", + "criteriarequiredany": "أي معيار في الأسفل مطلوب", "inprogress": "قيد التنفيذ", - "manualselfcompletion": "إكمال ذاتي يدوي", + "manualselfcompletion": "إكمال يدوي ذاتي", "notyetstarted": "لم يبدأ بعد", - "pending": "قيد الانتظار", - "required": "مطلوب", + "pending": "معلق", + "required": "مفروض", "requiredcriteria": "المعايير المطلوبة", "requirement": "المتطلبات", - "status": "الحالة", + "status": "الوضع", "viewcoursereport": "عرض تقرير المقرر" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/bg.json b/www/addons/coursecompletion/lang/bg.json index e60bae81321..245ed87b13c 100644 --- a/www/addons/coursecompletion/lang/bg.json +++ b/www/addons/coursecompletion/lang/bg.json @@ -1,14 +1,14 @@ { - "complete": "Завършен", - "completed": "Завършено", - "coursecompletion": "Завършване на курса", + "complete": "Отговорен", + "completed": "Завършена", + "coursecompletion": "Напредване в курса", "criteria": "Критерии", "criteriagroup": "Група критерии", "criteriarequiredall": "Всички критерии по-долу са задължителни", "criteriarequiredany": "Някои критерии по-долу са задължителни", "inprogress": "Не е приключен", "manualselfcompletion": "Ръчно самоотбелязване на завършването", - "required": "Задължително", - "status": "Състояние", + "required": "Задължителен", + "status": "Състояние на значка", "viewcoursereport": "Вижте отчет за курса" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ca.json b/www/addons/coursecompletion/lang/ca.json index c8c2a11d5e0..9a6429f37c6 100644 --- a/www/addons/coursecompletion/lang/ca.json +++ b/www/addons/coursecompletion/lang/ca.json @@ -1,21 +1,21 @@ { - "complete": "Complet", + "complete": "Completa", "completecourse": "Curs complet", - "completed": "Completat", + "completed": "completat", "completiondate": "Data de compleció", "couldnotloadreport": "No es pot carregar l'informe de compleció del curs, torneu a intentar-ho més tard.", - "coursecompletion": "Compleció del curs", + "coursecompletion": "Compleció de curs", "criteria": "Criteris", "criteriagroup": "Grup de criteris", - "criteriarequiredall": "Calen tots els criteris del dessota", - "criteriarequiredany": "Cal qualsevol dels criteris del dessota", - "inprogress": "En curs", + "criteriarequiredall": "Cal que es compleixin tots els criteris que es mostren a continuació", + "criteriarequiredany": "Cal que es compleixi algun dels criteris que es mostren a continuació", + "inprogress": "En progrés", "manualselfcompletion": "Auto-compleció manual", "notyetstarted": "No s'ha començat encara", - "pending": "Pendents", - "required": "Necessari", + "pending": "Pendent", + "required": "Requerit", "requiredcriteria": "Criteri requerit", "requirement": "Requisit", - "status": "Estat", + "status": "Estat de la insígnia", "viewcoursereport": "Visualitza l'informe del curs" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/cs.json b/www/addons/coursecompletion/lang/cs.json index f54632d92c0..2b2ffccd75f 100644 --- a/www/addons/coursecompletion/lang/cs.json +++ b/www/addons/coursecompletion/lang/cs.json @@ -1,21 +1,21 @@ { - "complete": "Absolvováno", + "complete": "Splněno", "completecourse": "Absolvovaný kurz", - "completed": "Splněno", + "completed": "Hhotovo", "completiondate": "Datum ukončení", "couldnotloadreport": "Nelze načíst zprávu o absolvování kurzu, zkuste to prosím později.", - "coursecompletion": "Absolvování kurzu", - "criteria": "Kritéria", + "coursecompletion": "Studenti musí absolvovat tento kurz", + "criteria": "Podmínky", "criteriagroup": "Skupina podmínek", - "criteriarequiredall": "Jsou požadovány všechny podmínky", - "criteriarequiredany": "Je požadována libovolná podmínka", - "inprogress": "Probíhá", - "manualselfcompletion": "Ručně nastavené absolvování kurzu samotným studentem", + "criteriarequiredall": "Všechny podmínky musí být splněny", + "criteriarequiredany": "Jakákoli z podmínek musí být splněna", + "inprogress": "Probíhající", + "manualselfcompletion": "Označení absolvování kurzu samotným studentem", "notyetstarted": "Zatím nezačalo", - "pending": "Čeká", - "required": "Požadováno", - "requiredcriteria": "Požadovaná kriteria", + "pending": "Probíhající", + "required": "Vyžadováno", + "requiredcriteria": "Vyžadované podmínky", "requirement": "Požadavek", - "status": "Status", - "viewcoursereport": "Zobrazit sestavu kurzu" + "status": "Stav", + "viewcoursereport": "Zobrazit přehled kurzu" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/da.json b/www/addons/coursecompletion/lang/da.json index 9d2cdeb93a0..825ffc76c20 100644 --- a/www/addons/coursecompletion/lang/da.json +++ b/www/addons/coursecompletion/lang/da.json @@ -1,21 +1,21 @@ { - "complete": "Fuldfør", + "complete": "Færdiggør", "completecourse": "Fuldfør kursus", - "completed": "Fuldført", + "completed": "Gennemført", "completiondate": "Afslutningsdato", "couldnotloadreport": "Kunne ikke indlæse rapporten vedrørende kursusfuldførelse, prøv igen senere.", - "coursecompletion": "Kursusfuldførelse", - "criteria": "Kriterier", - "criteriagroup": "Gruppe af kriterier", - "criteriarequiredall": "Alle nedenstående kriterier er påkrævet", - "criteriarequiredany": "Hvilken som helst af nedenstående kriterier er påkrævet", - "inprogress": "I gang", - "manualselfcompletion": "Manuel markering af færdiggørelse", - "notyetstarted": "Endnu ikke startet", - "pending": "Afventer", - "required": "Krævet", - "requiredcriteria": "Krævet kriterie", + "coursecompletion": "Kursusgennemførelse", + "criteria": "Kriterie", + "criteriagroup": "Kriteriegruppe", + "criteriarequiredall": "Alle kriterier herunder er påkrævet", + "criteriarequiredany": "Et af kriterierne herunder er påkrævet", + "inprogress": "Igangværende", + "manualselfcompletion": "Manuel selvregistrering af gennemførelse", + "notyetstarted": "Ikke begyndt endnu", + "pending": "Behandles", + "required": "Påkrævet", + "requiredcriteria": "Påkrævede kriterier", "requirement": "Krav", - "status": "Status", + "status": "Badgestatus", "viewcoursereport": "Se kursusrapport" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/de.json b/www/addons/coursecompletion/lang/de.json index 7125646d332..2ecdc1febf8 100644 --- a/www/addons/coursecompletion/lang/de.json +++ b/www/addons/coursecompletion/lang/de.json @@ -1,21 +1,21 @@ { - "complete": "Abschließen", + "complete": "Fertig", "completecourse": "Kurs abschließen", "completed": "Abgeschlossen", "completiondate": "Abschlussdatum", "couldnotloadreport": "Fehler beim Laden des Kursabschlussberichts. Versuchen Sie es später noch einmal.", - "coursecompletion": "Kursabschluss", + "coursecompletion": "Teilnehmer/innen müssen diesen Kurs abschließen.", "criteria": "Kriterien", "criteriagroup": "Kriteriengruppe", - "criteriarequiredall": "Alle nachfolgenden Kriterien sind notwendig.", - "criteriarequiredany": "Ein nachfolgendes Kriterium ist notwendig.", - "inprogress": "In Arbeit", - "manualselfcompletion": "Manueller Selbstabschluss", - "notyetstarted": "Nicht begonnen", - "pending": "Nicht erledigt", - "required": "Notwendig", - "requiredcriteria": "Notwendige Kriterien", + "criteriarequiredall": "Alle nachfolgenden Kriterien sind notwendig", + "criteriarequiredany": "Eine der nachfolgenden Kriterien ist notwendig", + "inprogress": "In Bearbeitung", + "manualselfcompletion": "Manueller eigener Abschluss", + "notyetstarted": "Noch nicht begonnen", + "pending": "Unerledigt", + "required": "Erforderlich", + "requiredcriteria": "Notwendiges Kriterium", "requirement": "Anforderung", - "status": "Status", - "viewcoursereport": "Kursbericht anzeigen" + "status": "Existierende Einschreibungen erlauben", + "viewcoursereport": "Kursbericht ansehen" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/el.json b/www/addons/coursecompletion/lang/el.json index a6fb10fd47b..8ba062f3e82 100644 --- a/www/addons/coursecompletion/lang/el.json +++ b/www/addons/coursecompletion/lang/el.json @@ -1,21 +1,21 @@ { "complete": "Ολοκλήρωση", "completecourse": "Ολοκλήρωση μαθήματος", - "completed": "Ολοκληρωμένο", + "completed": "ολοκληρώθηκε", "completiondate": "Ημερομηνία ολοκλήρωσης", "couldnotloadreport": "Δεν ήταν δυνατή η φόρτωση της αναφοράς ολοκλήρωσης του μαθήματος, δοκιμάστε ξανά αργότερα.", "coursecompletion": "Ολοκλήρωση μαθήματος", "criteria": "Κριτήρια", "criteriagroup": "Ομάδα κριτηρίων", - "criteriarequiredall": "Όλα τα παρακάτω κριτήρια είναι υποχρεωτικά", - "criteriarequiredany": "Οποιοδήποτε από τα παρακάτω κριτήρια είναι υποχρεωτικά", + "criteriarequiredall": "Όλα τα παρακάτω κριτήρια είναι απαραίτητα", + "criteriarequiredany": "Τα παρακάτω κριτήρια είναι απαραίτητα", "inprogress": "Σε εξέλιξη", - "manualselfcompletion": "Μη αυτόματη ολοκλήρωση", + "manualselfcompletion": "Χειροκίνητη αυτό-ολοκλήρωση", "notyetstarted": "Δεν έχει ξεκινήσει ακόμα", - "pending": "Εκκρεμής", + "pending": "Σε εκκρεμότητα", "required": "Απαιτείται", "requiredcriteria": "Απαιτούμενα κριτήρια", "requirement": "Απαίτηση", - "status": "Κατάσταση", - "viewcoursereport": "Δείτε την αναφορά μαθήματος" + "status": "Επιτρέπεται η πρόσβαση στους επισκέπτες", + "viewcoursereport": "Προβολή αναφορά μαθήματος" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/es-mx.json b/www/addons/coursecompletion/lang/es-mx.json index 0252ef2ea82..40d6b0459ae 100644 --- a/www/addons/coursecompletion/lang/es-mx.json +++ b/www/addons/coursecompletion/lang/es-mx.json @@ -1,21 +1,21 @@ { - "complete": "Completo", + "complete": "Completado", "completecourse": "Curso completo", - "completed": "Completado", + "completed": "Finalizado", "completiondate": "Fecha de terminación", "couldnotloadreport": "No pudo cargarse el reporte de finalización del curso; por favor inténtelo más tarde.", - "coursecompletion": "Finalización del curso", - "criteria": "Criterio", - "criteriagroup": "Grupo de criterio", - "criteriarequiredall": "Todos los criterios debajo son necesarios", - "criteriarequiredany": "Cualquiera de los criterios debajo es necesarios", - "inprogress": "en progreso", - "manualselfcompletion": "Auto finalización manual", - "notyetstarted": "Todavía no iniciado", + "coursecompletion": "Finalización de curso", + "criteria": "Criterios", + "criteriagroup": "Grupo de criterios", + "criteriarequiredall": "Son necesarios todos los criterios que aparecen más abajo", + "criteriarequiredany": "Es necesario cualquiera de los criterios que aparecen más abajo", + "inprogress": "En curso", + "manualselfcompletion": "Auto-finalizar manualmente", + "notyetstarted": "Aún no ha comenzado", "pending": "Pendiente", - "required": "Requerido", - "requiredcriteria": "Criterio requerido", + "required": "Obligatorio", + "requiredcriteria": "Criterios necesarios", "requirement": "Requisito", - "status": "Estatus", + "status": "Estatus de insignias", "viewcoursereport": "Ver reporte del curso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/es.json b/www/addons/coursecompletion/lang/es.json index 89ef5e6ecd0..a061fa0356e 100644 --- a/www/addons/coursecompletion/lang/es.json +++ b/www/addons/coursecompletion/lang/es.json @@ -1,21 +1,21 @@ { - "complete": "Completado", + "complete": "Finalizado", "completecourse": "Curso completado", - "completed": "Finalizado", + "completed": "completada", "completiondate": "Fecha de finalización", "couldnotloadreport": "No se puede cargar el informe de finalización del curso, por favor inténtalo de nuevo más tarde.", - "coursecompletion": "Finalización del curso", + "coursecompletion": "Los usuarios deben finalizar este curso.", "criteria": "Criterios", "criteriagroup": "Grupo de criterios", "criteriarequiredall": "Son necesarios todos los criterios que aparecen más abajo", "criteriarequiredany": "Es necesario cualquiera de los criterios que aparecen más abajo", - "inprogress": "En curso", + "inprogress": "En progreso", "manualselfcompletion": "Autocompletar manualmente", "notyetstarted": "Aún no comenzado", "pending": "Pendiente", "required": "Obligatorio", "requiredcriteria": "Criterios necesarios", "requirement": "Requisito", - "status": "Estado", + "status": "Estado de la insignia", "viewcoursereport": "Ver informe del curso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/eu.json b/www/addons/coursecompletion/lang/eu.json index 4735d6035c9..295f4ed6d7c 100644 --- a/www/addons/coursecompletion/lang/eu.json +++ b/www/addons/coursecompletion/lang/eu.json @@ -1,21 +1,21 @@ { - "complete": "Osoa", + "complete": "Osatu", "completecourse": "Ikastaroa osatu", - "completed": "Osatuta", + "completed": "Osatua", "completiondate": "Osaketa-data", "couldnotloadreport": "Ezin izan da ikastaro-osaketaren txostena kargatu, mesedez saiatu beranduago.", - "coursecompletion": "Ikastaro-osaketa", + "coursecompletion": "Erabiltzaileek ikastaro hau osatu behar dute", "criteria": "Irizpidea", "criteriagroup": "Irizpide-multzoa", "criteriarequiredall": "Beheko irizpide guztiak dira beharrezko", "criteriarequiredany": "Beheko hainbat irizpide dira beharrezko", - "inprogress": "Ari da", + "inprogress": "Martxan", "manualselfcompletion": "Norberak eskuz osatu", "notyetstarted": "Ez da hasi", - "pending": "Egin gabe", - "required": "Beharrezkoa", + "pending": "Zain", + "required": "Ezinbestekoa", "requiredcriteria": "Irizpidea behar da", "requirement": "Eskakizuna", - "status": "Egoera", + "status": "Dominen egoera", "viewcoursereport": "Ikastaroaren txostena ikusi" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/fa.json b/www/addons/coursecompletion/lang/fa.json index b9ddd4aaa56..2f308382aff 100644 --- a/www/addons/coursecompletion/lang/fa.json +++ b/www/addons/coursecompletion/lang/fa.json @@ -1,7 +1,7 @@ { "complete": "کامل", - "completed": "تکمیل‌شده", - "coursecompletion": "تکمیل درس", + "completed": "کامل شده", + "coursecompletion": "کاربر باید این درس را تکمیل کند.", "criteria": "ضابطه", "criteriagroup": "گروه ضوابط", "criteriarequiredall": "تمام ضوابط زیر باید برآورده شوند", @@ -10,8 +10,8 @@ "manualselfcompletion": "علامت زدن به عنوان کامل توسط خود افراد", "notyetstarted": "هنوز شروع نشده است", "pending": "معلق", - "required": "لازم است", + "required": "الزامی بودن", "requiredcriteria": "ضوابط مورد نیاز", - "status": "وضعیت", - "viewcoursereport": "مشاهدهٔ گزارش درس" + "status": "وضعیت مدال", + "viewcoursereport": "مشاهده گزارش درس" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/fr.json b/www/addons/coursecompletion/lang/fr.json index 9b7c1642571..e0290d8a8bb 100644 --- a/www/addons/coursecompletion/lang/fr.json +++ b/www/addons/coursecompletion/lang/fr.json @@ -1,10 +1,10 @@ { - "complete": "Terminer", + "complete": "Complet", "completecourse": "Terminer le cours", "completed": "Terminé", "completiondate": "Date d'achèvement", "couldnotloadreport": "Impossible de charger le rapport d'achèvement de cours. Veuillez essayer plus tard.", - "coursecompletion": "Achèvement du cours", + "coursecompletion": "Achèvement de cours", "criteria": "Critères", "criteriagroup": "Groupe de critères", "criteriarequiredall": "Tous les critères ci-dessous sont requis", @@ -12,10 +12,10 @@ "inprogress": "En cours", "manualselfcompletion": "Auto-achèvement manuel", "notyetstarted": "Pas encore commencé", - "pending": "En attente", + "pending": "En suspens", "required": "Requis", "requiredcriteria": "Critères requis", "requirement": "Condition", - "status": "Statut", - "viewcoursereport": "Afficher le rapport du cours" + "status": "Statut du badge", + "viewcoursereport": "Consulter le rapport du cours" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/he.json b/www/addons/coursecompletion/lang/he.json index dca12273f76..021aaa2b398 100644 --- a/www/addons/coursecompletion/lang/he.json +++ b/www/addons/coursecompletion/lang/he.json @@ -1,20 +1,20 @@ { - "complete": "השלמה", + "complete": "הושלם", "completecourse": "השלמת קורס", "completed": "הושלם", "completiondate": "תאריך השלמה", - "coursecompletion": "השלמת קורס", - "criteria": "מדד־הערכה", - "criteriagroup": "קבוצת מדדיי־הערכה", - "criteriarequiredall": "כל מדדיי־הערכה להלן נדרשים", - "criteriarequiredany": "אחד ממדדיי־הערכה להלן נדרש", - "inprogress": "בתהליך", - "manualselfcompletion": "הזנת השלמה עצמית", - "notyetstarted": "עדיין לא החל", - "pending": "בהמתנה", - "required": "נדרש", - "requiredcriteria": "מדד־הערכה נדרש", + "coursecompletion": "השלמת הקורס", + "criteria": "תנאי", + "criteriagroup": "קבוצת תנאים", + "criteriarequiredall": "כל התנאים המצויינים מטה נדרשים", + "criteriarequiredany": "לפחות אחד מהתנאים המצויינים מטה נדרשים", + "inprogress": "בלמידה", + "manualselfcompletion": "השלמה עצמאית ידנית", + "notyetstarted": "עדיין לא התחיל", + "pending": "בתהליך למידה", + "required": "דרוש", + "requiredcriteria": "תנאי נדרש", "requirement": "דרישה", - "status": "מצב", + "status": "סטטוס ההישג", "viewcoursereport": "צפיה בדוח הקורס" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/hu.json b/www/addons/coursecompletion/lang/hu.json index d07a78bbda4..361a4bf7069 100644 --- a/www/addons/coursecompletion/lang/hu.json +++ b/www/addons/coursecompletion/lang/hu.json @@ -1,17 +1,17 @@ { - "complete": "Teljes", - "completed": "Teljesítve", - "coursecompletion": "Kurzus teljesítése", + "complete": "Kész", + "completed": "Kész", + "coursecompletion": "A tanulóknak teljesíteni kell ezt a kurzust", "criteria": "Követelmények", "criteriagroup": "Követelménycsoport", "criteriarequiredall": "Az összes alábbi követelmény teljesítendő", "criteriarequiredany": "Bármely alábbi követelmény teljesítendő", - "inprogress": "Folyamatban", + "inprogress": "Folyamatban lévő", "manualselfcompletion": "Saját teljesítés kézzel", "notyetstarted": "Még nem kezdődött el", "pending": "Függőben", "required": "Kitöltendő", "requiredcriteria": "Előírt követelmények", - "status": "Állapot", + "status": "A kitűző állapota", "viewcoursereport": "Kurzusjelentés megtekintése" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/it.json b/www/addons/coursecompletion/lang/it.json index 6521061e031..85d2a1d7320 100644 --- a/www/addons/coursecompletion/lang/it.json +++ b/www/addons/coursecompletion/lang/it.json @@ -1,21 +1,21 @@ { - "complete": "Completato", + "complete": "Completo", "completecourse": "Corso completato", - "completed": "Completato", + "completed": "Completata", "completiondate": "Data di completamento", "couldnotloadreport": "Non è stato possibile caricare il report di completamento del corso, per favore riporva.", - "coursecompletion": "Completamento del corso", + "coursecompletion": "Completamento corso", "criteria": "Criteri", "criteriagroup": "Gruppo di criteri", "criteriarequiredall": "E' richiesto il soddisfacimento di tutti i criteri elencati", "criteriarequiredany": "E' richiesto il soddisfacimento di almeno uno dei criteri elencati", - "inprogress": "In svolgimento", + "inprogress": "In corso", "manualselfcompletion": "Conferma personale di completamento", - "notyetstarted": "Non iniziato", + "notyetstarted": "Non ancora iniziato", "pending": "In attesa", - "required": "Da soddisfare", + "required": "Obbligatorio", "requiredcriteria": "Criteri da soddisfare", "requirement": "Requisito", - "status": "Stato", - "viewcoursereport": "Visualizza report del corso" + "status": "Stato badge", + "viewcoursereport": "Visualizza il report del corso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ja.json b/www/addons/coursecompletion/lang/ja.json index 344ea673aea..df8a2b8634d 100644 --- a/www/addons/coursecompletion/lang/ja.json +++ b/www/addons/coursecompletion/lang/ja.json @@ -1,21 +1,21 @@ { - "complete": "完了", + "complete": "詳細", "completecourse": "コース完了", - "completed": "完了しました", + "completed": "完了", "completiondate": "完了した日", "couldnotloadreport": "コース完了の読み込みができませんでした。後でもう一度試してください。", - "coursecompletion": "コース完了", + "coursecompletion": "ユーザはこのコースを完了する必要があります。", "criteria": "クライテリア", "criteriagroup": "クライテリアグループ", - "criteriarequiredall": "以下すべてのクライテリアが必要", - "criteriarequiredany": "以下のクライテリアいずれかが必要", + "criteriarequiredall": "下記のクライテリアすべてが必須である", + "criteriarequiredany": "下記いくつかのクライテリアが必須である", "inprogress": "進行中", - "manualselfcompletion": "手動自己完了", - "notyetstarted": "まだ開始されていない", - "pending": "保留中", - "required": "必要な", - "requiredcriteria": "必要なクライテリア", + "manualselfcompletion": "手動による自己完了", + "notyetstarted": "未開始", + "pending": "保留", + "required": "必須", + "requiredcriteria": "必須クライテリア", "requirement": "要求", - "status": "状態", - "viewcoursereport": "コースレポートを見る" + "status": "ステータス", + "viewcoursereport": "コースレポートを表示する" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/lt.json b/www/addons/coursecompletion/lang/lt.json index c6813474cf2..e26747a5ead 100644 --- a/www/addons/coursecompletion/lang/lt.json +++ b/www/addons/coursecompletion/lang/lt.json @@ -1,21 +1,21 @@ { - "complete": "Visas", + "complete": "Užbaigti", "completecourse": "Visa kursų medžiaga", - "completed": "Užbaigta", + "completed": "Baigtas", "completiondate": "Užbaigimo data", "couldnotloadreport": "Nepavyko įkelti kursų baigimo ataskaitos, prašome pabandyti vėliau.", - "coursecompletion": "Kursų užbaigimas", + "coursecompletion": "Kurso baigimas", "criteria": "Kriterijai", "criteriagroup": "Kriterijų grupė", - "criteriarequiredall": "Visi žemiau esantys kriterijai yra privalomi", - "criteriarequiredany": "Kiekvienas kriterijus, esantis žemiau, yra privalomas", - "inprogress": "Nebaigta", - "manualselfcompletion": "Savarankiško mokymosi vadovas", - "notyetstarted": "Nepradėta", + "criteriarequiredall": "Visi žemiau pateikti kriterijai yra būtini", + "criteriarequiredany": "Bet kuris žemiau pateiktas kriterijus yra būtinas", + "inprogress": "Atliekama", + "manualselfcompletion": "Savas užbaigimas neautomatiniu būdu", + "notyetstarted": "Dar nepradėta", "pending": "Laukiama", - "required": "Privaloma", - "requiredcriteria": "Privalomi kriterijai", + "required": "Būtina", + "requiredcriteria": "Būtini kriterijai", "requirement": "Būtina sąlyga", - "status": "Būsena", + "status": "Pasiekimo būsena", "viewcoursereport": "Peržiūrėti kursų ataskaitą" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/nl.json b/www/addons/coursecompletion/lang/nl.json index 78f31da0ac9..e8fdb985c1f 100644 --- a/www/addons/coursecompletion/lang/nl.json +++ b/www/addons/coursecompletion/lang/nl.json @@ -1,21 +1,21 @@ { - "complete": "Voltooi", + "complete": "Voltooid", "completecourse": "Voltooi cursus", - "completed": "Voltooid", + "completed": "Volledig", "completiondate": "Voltooiingsdatum", "couldnotloadreport": "Kon het voltooiingsrapport van de cursus niet laden. Probeer later opnieuw.", - "coursecompletion": "Cursus voltooiing", + "coursecompletion": "Cursus voltooien", "criteria": "Criteria", "criteriagroup": "Criteria groep", "criteriarequiredall": "Alle onderstaande criteria zijn vereist", - "criteriarequiredany": "Alle onderstaande criteria zijn vereist", - "inprogress": "Bezig", - "manualselfcompletion": "Handmatige zelf-voltooiing", - "notyetstarted": "Nog niet gestart", - "pending": "Nog bezig", - "required": "Vereist", + "criteriarequiredany": "Al onderstaande criteria zijn vereist", + "inprogress": "Actief", + "manualselfcompletion": "Manueel voltooien", + "notyetstarted": "Nog niet begonnen", + "pending": "Bezig", + "required": "Verplicht", "requiredcriteria": "Vereiste criteria", "requirement": "Vereiste", - "status": "Status", + "status": "Badge status", "viewcoursereport": "Bekijk cursusrapport" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/pl.json b/www/addons/coursecompletion/lang/pl.json index db69489a520..c5ffb7263b7 100644 --- a/www/addons/coursecompletion/lang/pl.json +++ b/www/addons/coursecompletion/lang/pl.json @@ -1,17 +1,17 @@ { - "complete": "Pełna wersja", - "completed": "Ukończony", - "coursecompletion": "Ukończenie kursu", + "complete": "Zakończone", + "completed": "zakończony", + "coursecompletion": "Użytkownicy muszą ukończyć ten kurs.", "criteria": "Kryteria", "criteriagroup": "Grupa kryteriów", "criteriarequiredall": "Wszystkie poniższe kryteria są wymagane", "criteriarequiredany": "Wszystkie poniższe kryteria są wymagane", - "inprogress": "W toku", + "inprogress": "Aktualne", "manualselfcompletion": "Samodzielne oznaczenie ukończenia", "notyetstarted": "Jeszcze nie rozpoczęto", - "pending": "Oczekujący", + "pending": "Oczekujące", "required": "Wymagane", "requiredcriteria": "Wymagane kryteria", - "status": "Status", + "status": "Status odznak", "viewcoursereport": "Zobacz raport kursu" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/pt-br.json b/www/addons/coursecompletion/lang/pt-br.json index da82565edc9..6ffa2866e22 100644 --- a/www/addons/coursecompletion/lang/pt-br.json +++ b/www/addons/coursecompletion/lang/pt-br.json @@ -1,21 +1,21 @@ { - "complete": "Concluído", + "complete": "Completo", "completecourse": "Curso concluído", - "completed": "Completado", + "completed": "Concluído", "completiondate": "Data de conclusão", "couldnotloadreport": "Não foi possível carregar o relatório de conclusão do curso, por favor tente novamente mais tarde.", - "coursecompletion": "Conclusão do curso", + "coursecompletion": "Andamento do curso", "criteria": "Critérios", "criteriagroup": "Grupo de critérios", "criteriarequiredall": "Todos os critérios abaixo são necessários", - "criteriarequiredany": "Quaisquer critérios abaixo são necessários", - "inprogress": "Em progresso", - "manualselfcompletion": "Auto conclusão manual", - "notyetstarted": "Ainda não começou", - "pending": "Pendente", - "required": "Necessário", - "requiredcriteria": "Critério necessário", + "criteriarequiredany": "Qualquer um dos critérios abaixo são necessários", + "inprogress": "Em andamento", + "manualselfcompletion": "Conclusão manual por si mesmo", + "notyetstarted": "Não iniciado ainda", + "pending": "Pendentes", + "required": "Necessários", + "requiredcriteria": "Critérios exigidos", "requirement": "Exigência", - "status": "Condição", - "viewcoursereport": "Ver relatório de curso" + "status": "Status", + "viewcoursereport": "Ver relatório do curso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/pt.json b/www/addons/coursecompletion/lang/pt.json index 5f2bd4dc942..7de6a08cbaa 100644 --- a/www/addons/coursecompletion/lang/pt.json +++ b/www/addons/coursecompletion/lang/pt.json @@ -1,21 +1,21 @@ { - "complete": "Concluído", + "complete": "Completo", "completecourse": "Disciplina concluída", - "completed": "Concluído", + "completed": "Completou", "completiondate": "Data de conclusão", "couldnotloadreport": "Não foi possível carregar o relatório de conclusão da disciplina, por favor tente mais tarde.", - "coursecompletion": "Conclusão da disciplina", + "coursecompletion": "Os utilizadores têm de completar esta disciplina", "criteria": "Critérios", "criteriagroup": "Grupo de critérios", - "criteriarequiredall": "É exigido o cumprimento de todos os critérios abaixo", - "criteriarequiredany": "É exigido o cumprimento de qualquer um dos critérios abaixo", + "criteriarequiredall": "Todos os critérios abaixo são exigidos", + "criteriarequiredany": "Qualquer dos critérios abaixo é necessário", "inprogress": "Em progresso", "manualselfcompletion": "Conclusão manual pelo próprio", - "notyetstarted": "Não iniciou", + "notyetstarted": "Ainda não iniciou", "pending": "Pendente", - "required": "Exigido", - "requiredcriteria": "Critério exigido", + "required": "Obrigatório", + "requiredcriteria": "Critério obrigatório", "requirement": "Requisito", - "status": "Estado", + "status": "Estado da Medalha", "viewcoursereport": "Ver relatório da disciplina" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ro.json b/www/addons/coursecompletion/lang/ro.json index 46b9f21bb93..7a195f67c33 100644 --- a/www/addons/coursecompletion/lang/ro.json +++ b/www/addons/coursecompletion/lang/ro.json @@ -1,21 +1,21 @@ { - "complete": "Complet", + "complete": "Finalizează", "completecourse": "Curs complet", - "completed": "Complet", + "completed": "Finalizare", "completiondate": "Data limita până la completarea acțiunii", "couldnotloadreport": "Raportul cu privire la situația completării cursului nu se poate încărca, încercați mai târziu.", - "coursecompletion": "Completarea cursului", + "coursecompletion": "Absolvire curs", "criteria": "Criterii", - "criteriagroup": "Criterii pentru grup", - "criteriarequiredall": "Indeplinirea următoarelor criterii este obligatorie", - "criteriarequiredany": "Oricare din urmatoarele criterii sunt obligatorii", - "inprogress": "În progres", - "manualselfcompletion": "Autocompletare", - "notyetstarted": "Înca nu a început", - "pending": "În asteptare", - "required": "Obligatoriu", - "requiredcriteria": "Criterii obligatorii", + "criteriagroup": "Grup criterii", + "criteriarequiredall": "Toate criteriile de mai jos sunt necesare", + "criteriarequiredany": "Oricare dintre criteriile de mai jos sunt necesare", + "inprogress": "În curs", + "manualselfcompletion": "Auto-finalizare manuală", + "notyetstarted": "Nu a fost încă început", + "pending": "În așteptare", + "required": "Necesar", + "requiredcriteria": "Criteriu necesar", "requirement": "Cerințe", - "status": "Situație", - "viewcoursereport": "Vizualizați raportul despre curs" + "status": "Status", + "viewcoursereport": "Vezi raportul cursului" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ru.json b/www/addons/coursecompletion/lang/ru.json index dbd50c8ad09..1c6b6de220a 100644 --- a/www/addons/coursecompletion/lang/ru.json +++ b/www/addons/coursecompletion/lang/ru.json @@ -1,20 +1,20 @@ { - "complete": "Завершить", + "complete": "Завершено", "completecourse": "Завершить курс", - "completed": "Завершен", + "completed": "Выполнено", "completiondate": "Дата завершения", - "coursecompletion": "Завершение курса", + "coursecompletion": "Окончание курса", "criteria": "Критерии", - "criteriagroup": "Критерии группы", - "criteriarequiredall": "Все приведенные ниже критерии являются обязательными", - "criteriarequiredany": "Некоторые из нижеуказанных критериев обязательны", - "inprogress": "В прогрессе", - "manualselfcompletion": "Ручное самостоятельное завершение", - "notyetstarted": "Еще не начался", - "pending": "На рассмотрении", - "required": "Необходимый", + "criteriagroup": "Группа критериев", + "criteriarequiredall": "Требуются соответствие всем указанным ниже критериям", + "criteriarequiredany": "Требуется соответствие любому из указанных ниже критериев", + "inprogress": "В процессе", + "manualselfcompletion": "Пользователь может сам поставить отметку о выполнении", + "notyetstarted": "Еще не началось", + "pending": "Ожидается", + "required": "Необходимо заполнить", "requiredcriteria": "Необходимые критерии", "requirement": "Требование", - "status": "Статус", - "viewcoursereport": "Посмотреть отчет курса" + "status": "Статус значка", + "viewcoursereport": "Просмотреть отчет по курсу" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sr-cr.json b/www/addons/coursecompletion/lang/sr-cr.json index 610e78602a3..26e18b26b42 100644 --- a/www/addons/coursecompletion/lang/sr-cr.json +++ b/www/addons/coursecompletion/lang/sr-cr.json @@ -1,21 +1,21 @@ { - "complete": "Заврши", + "complete": "Потпуно", "completecourse": "Заврши курс", "completed": "Завршено", "completiondate": "Датум завршетка", "couldnotloadreport": "Није могуће учитати извештај о завршетку курса. Молимо вас, покушајте поново касније.", - "coursecompletion": "Завршетак курса", + "coursecompletion": "Завршеност курса", "criteria": "Критеријуми", "criteriagroup": "Група критеријума", "criteriarequiredall": "Сви доле наведени критеријуми су неопходни", "criteriarequiredany": "Било који од доле наведених критеријума је неопходан", "inprogress": "У току", "manualselfcompletion": "Ручни самостални завршетак", - "notyetstarted": "Још није започето", - "pending": "На чекању", - "required": "Неопходно", - "requiredcriteria": "Неопходни критеријуми", + "notyetstarted": "Није још почео", + "pending": "Не чекању", + "required": "Обавезно", + "requiredcriteria": "Обавезни критеријуми", "requirement": "Услов", - "status": "Статус", + "status": "Статус беџа", "viewcoursereport": "Прикажи извештај са курса" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sr-lt.json b/www/addons/coursecompletion/lang/sr-lt.json index 6553f9f3960..89da4bf9058 100644 --- a/www/addons/coursecompletion/lang/sr-lt.json +++ b/www/addons/coursecompletion/lang/sr-lt.json @@ -1,21 +1,21 @@ { - "complete": "Završi", + "complete": "Potpuno", "completecourse": "Završi kurs", "completed": "Završeno", "completiondate": "Datum završetka", "couldnotloadreport": "Nije moguće učitati izveštaj o završetku kursa. Molimo vas, pokušajte ponovo kasnije.", - "coursecompletion": "Završetak kursa", + "coursecompletion": "Završenost kursa", "criteria": "Kriterijumi", "criteriagroup": "Grupa kriterijuma", "criteriarequiredall": "Svi dole navedeni kriterijumi su neophodni", "criteriarequiredany": "Bilo koji od dole navedenih kriterijuma je neophodan", "inprogress": "U toku", "manualselfcompletion": "Ručni samostalni završetak", - "notyetstarted": "Još nije započeto", - "pending": "Na čekanju", - "required": "Neophodno", - "requiredcriteria": "Neophodni kriterijumi", + "notyetstarted": "Nije još počeo", + "pending": "Ne čekanju", + "required": "Obavezno", + "requiredcriteria": "Obavezni kriterijumi", "requirement": "Uslov", - "status": "Status", + "status": "Status bedža", "viewcoursereport": "Prikaži izveštaj sa kursa" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sv.json b/www/addons/coursecompletion/lang/sv.json index 1a9665c3d8e..df193278ade 100644 --- a/www/addons/coursecompletion/lang/sv.json +++ b/www/addons/coursecompletion/lang/sv.json @@ -1,21 +1,21 @@ { "complete": "Komplett", "completecourse": "", - "completed": "Fullföljt", + "completed": "Slutfört", "completiondate": "Datum för fullföljande", "couldnotloadreport": "Det gick inte att läsa in rapporten för fullföljande av kursen, vänligen försök igen senare .", - "coursecompletion": "Fullföljande av kurs", - "criteria": "Villkor", - "criteriagroup": "Villkor grupp", - "criteriarequiredall": "Alla villkor nedan måste vara uppfyllda", - "criteriarequiredany": "Något villkor nedan måste vara uppfylld", - "inprogress": "Pågående", - "manualselfcompletion": "Manuell fullföljande av deltagare", - "notyetstarted": "Ännu inte börjat", + "coursecompletion": "Fullgörande av kurs", + "criteria": "Kriterier", + "criteriagroup": "Kriterier för grupp", + "criteriarequiredall": "Alla kriterier är obligatoriska", + "criteriarequiredany": "Alla kriterier nedan är obligatoriska", + "inprogress": "Pågår", + "manualselfcompletion": "Studenten markerar själv som fullföljd", + "notyetstarted": "Har ännu inte påbörjats", "pending": "Avvaktar", "required": "Obligatorisk", - "requiredcriteria": "Obligatorisk villkor", + "requiredcriteria": "Obligatoriskt kriterium", "requirement": "Krav", - "status": "Status", + "status": "Status för märke", "viewcoursereport": "Visa kursrapport" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/tr.json b/www/addons/coursecompletion/lang/tr.json index 89efac25b4d..3aedfd0238d 100644 --- a/www/addons/coursecompletion/lang/tr.json +++ b/www/addons/coursecompletion/lang/tr.json @@ -1,17 +1,17 @@ { - "complete": "Tamamlanmış", - "completed": "Bitirmeli", - "coursecompletion": "Ders tamamlama", + "complete": "Tamamlandı", + "completed": "Tamamlandı", + "coursecompletion": "Kurs tamamlama", "criteria": "Ölçüt", "criteriagroup": "Ölçüt Grubu", "criteriarequiredall": "Aşağıdaki ölçütlerin tümü gereklidir", "criteriarequiredany": "Aşağıdaki herhangi bir kriter gereklidir", - "inprogress": "Devam ediyor", + "inprogress": "Devam etmekte", "manualselfcompletion": "Kendi kendine elle tamamlama", "notyetstarted": "Henüz başlamadı", "pending": "Bekliyor", "required": "Gerekli", "requiredcriteria": "Gerekli Ölçüt", - "status": "Durum", + "status": "Nişan Durumu", "viewcoursereport": "Kurs raporunu görüntüle" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/uk.json b/www/addons/coursecompletion/lang/uk.json index 790fda5169e..8078ba36f3d 100644 --- a/www/addons/coursecompletion/lang/uk.json +++ b/www/addons/coursecompletion/lang/uk.json @@ -1,21 +1,21 @@ { - "complete": "Завершити", + "complete": "Завершено", "completecourse": "Завершити курсу", - "completed": "Завершено", + "completed": "Виконано", "completiondate": "Дата завершення", "couldnotloadreport": "Не вдалося завантажити звіт про закінчення курсу, будь ласка, спробуйте ще раз пізніше.", - "coursecompletion": "Завершення курсу", - "criteria": "Критерія", + "coursecompletion": "Курс закінчено", + "criteria": "Критерій", "criteriagroup": "Група критеріїв", - "criteriarequiredall": "Всі критерії нижче обов'язкові", - "criteriarequiredany": "Будь-яка критерія нижче обов'язкова", - "inprogress": "В процесі...", - "manualselfcompletion": "Самостійне завершення", - "notyetstarted": "Не розпочато", - "pending": "В очікуванні", - "required": "Необхідно", - "requiredcriteria": "Необхідна критерія", + "criteriarequiredall": "Потрібна відповідність всім вказаним критеріям", + "criteriarequiredany": "Потрібна відповідність будь-якому критерію", + "inprogress": "В процесі", + "manualselfcompletion": "Самореєстрація завершення", + "notyetstarted": "Ще не почато", + "pending": "Очікується", + "required": "Необхідні", + "requiredcriteria": "Необхідний критерій", "requirement": "Вимога", - "status": "Статус", + "status": "Статус відзнаки", "viewcoursereport": "Переглянути звіт курсу" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/zh-cn.json b/www/addons/coursecompletion/lang/zh-cn.json index f46cbe0662d..eedfdd029f5 100644 --- a/www/addons/coursecompletion/lang/zh-cn.json +++ b/www/addons/coursecompletion/lang/zh-cn.json @@ -1,17 +1,17 @@ { - "complete": "完全", - "completed": "完成", - "coursecompletion": "修完课程", + "complete": "完成", + "completed": "已完成", + "coursecompletion": "课程进度跟踪", "criteria": "条件", "criteriagroup": "条件组", "criteriarequiredall": "必须满足以下条件", "criteriarequiredany": "必须满足下列任一条件", - "inprogress": "处理中", + "inprogress": "进行中", "manualselfcompletion": "手动自设完成", "notyetstarted": "还未开始", - "pending": "等待中", - "required": "必需的", + "pending": "待决", + "required": "必须回答", "requiredcriteria": "必备条件", - "status": "状态", + "status": "勋章状态", "viewcoursereport": "查看课程报告" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/zh-tw.json b/www/addons/coursecompletion/lang/zh-tw.json index 55f600fc398..2e6a01c0622 100644 --- a/www/addons/coursecompletion/lang/zh-tw.json +++ b/www/addons/coursecompletion/lang/zh-tw.json @@ -1,21 +1,21 @@ { - "complete": "完成", + "complete": "完全", "completecourse": "完成課程", - "completed": "已完成", + "completed": "完成", "completiondate": "完成日期", "couldnotloadreport": "無法載入課程完成報表,請稍後再試.", - "coursecompletion": "課程完成度", - "criteria": "條件", - "criteriagroup": "條件群組", - "criteriarequiredall": "以下所有的條件都為必填", - "criteriarequiredany": "以下任何條件都為必須", - "inprogress": "處理中", + "coursecompletion": "課程進度", + "criteria": "規準", + "criteriagroup": "各種判斷條件", + "criteriarequiredall": "必須滿足以下所有條件", + "criteriarequiredany": "必須滿足以下任一條件", + "inprogress": "進行中", "manualselfcompletion": "手動自我完成", - "notyetstarted": "還沒有開始", - "pending": "暫緩", - "required": "必須的", - "requiredcriteria": "必須條件", + "notyetstarted": "尚未開始", + "pending": "等待中", + "required": "必答", + "requiredcriteria": "必要條件", "requirement": "需要", - "status": "狀態", - "viewcoursereport": "檢視課程報表" + "status": "獎章狀態", + "viewcoursereport": "查看課程報告" } \ No newline at end of file diff --git a/www/addons/files/lang/ar.json b/www/addons/files/lang/ar.json index 3521b2b6f32..2ab44cda49c 100644 --- a/www/addons/files/lang/ar.json +++ b/www/addons/files/lang/ar.json @@ -4,5 +4,5 @@ "files": "ملفات", "privatefiles": "ملفات خاصة", "sitefiles": "ملفات الموقع", - "uploadfiles": "رفع ملفات" + "uploadfiles": "إرسل ملفات التغذية الراجعة" } \ No newline at end of file diff --git a/www/addons/files/lang/ca.json b/www/addons/files/lang/ca.json index 035be4b1f33..90887bf7b3f 100644 --- a/www/addons/files/lang/ca.json +++ b/www/addons/files/lang/ca.json @@ -2,12 +2,12 @@ "admindisableddownload": "Teniu en compte que l'administrador de Moodle ha desactivat la descàrrega d'arxius; podeu visualitzar els arxius, però no descarregar-los.", "clicktoupload": "Feu clic al botó del dessota per pujar arxius a l'àrea del vostres fitxers.", "couldnotloadfiles": "La llista d'arxius no s'ha pogut carregar.", - "emptyfilelist": "No hi ha fitxers per mostrar.", + "emptyfilelist": "No hi ha fitxers per mostrar", "erroruploadnotworking": "No es poden pujar fitxers al vostre lloc ara mateix.", "files": "Fitxers", "myprivatefilesdesc": "Els arxius que teniu disponibles a la vostra àrea privada en aquest lloc Moodle.", "privatefiles": "Fitxers privats", "sitefiles": "Fitxers del lloc", "sitefilesdesc": "Els altres arxius que es troben disponibles en aquest lloc Moodle.", - "uploadfiles": "Puja fitxers" + "uploadfiles": "Envia fitxers de retroacció" } \ No newline at end of file diff --git a/www/addons/files/lang/cs.json b/www/addons/files/lang/cs.json index 2336beb6bc4..becf830a35d 100644 --- a/www/addons/files/lang/cs.json +++ b/www/addons/files/lang/cs.json @@ -2,12 +2,12 @@ "admindisableddownload": "Upozorňujeme, že správce Moodle zakázal stahování souborů, soubory si můžete prohlížet, ale ne stáhnout.", "clicktoupload": "Kliknutím na tlačítko níže nahrát soubory do vašich osobních souborů.", "couldnotloadfiles": "Seznam souborů, které nelze načíst .", - "emptyfilelist": "Žádný soubor k zobrazení.", + "emptyfilelist": "Žádný soubor k zobrazení", "erroruploadnotworking": "Bohužel v současné době není možné nahrávat na stránky vašeho Moodle.", "files": "Soubory", "myprivatefilesdesc": "Soubory, které jsou dostupné v soukromé oblasti na těchto stránkách Moodle.", "privatefiles": "Osobní soubory", "sitefiles": "Soubory stránek", "sitefilesdesc": "Další soubory, které jsou dostupné na těchto stránkách Moodle.", - "uploadfiles": "Nahrát soubory" + "uploadfiles": "Poslat zpětnovazební soubory" } \ No newline at end of file diff --git a/www/addons/files/lang/da.json b/www/addons/files/lang/da.json index 1453d08f9f7..5f9d7d54b3b 100644 --- a/www/addons/files/lang/da.json +++ b/www/addons/files/lang/da.json @@ -2,12 +2,12 @@ "admindisableddownload": "Bemærk venligst at din Moodleadministrator har deaktiveret download af filer. Du kan se filerne men ikke downloade dem.", "clicktoupload": "Klik på knappen nedenfor for at uploade filer til dine private filer.", "couldnotloadfiles": "Fillisten kunne ikke hentes", - "emptyfilelist": "Der er ingen filer at vise.", + "emptyfilelist": "Der er ingen filer at vise", "erroruploadnotworking": "Desværre er det p.t. ikke muligt at uploade filer til dit site.", "files": "Filer", "myprivatefilesdesc": "Filerne som er tilgængelige i dit private område på dette Moodlewebsted.", "privatefiles": "Private filer", "sitefiles": "Site filer", "sitefilesdesc": "De andre filer som er tilgængelige for dig på denne Moodlewebside.", - "uploadfiles": "Upload filer" + "uploadfiles": "Send feedbackfiler" } \ No newline at end of file diff --git a/www/addons/files/lang/de.json b/www/addons/files/lang/de.json index 39a046af215..16517d7cc60 100644 --- a/www/addons/files/lang/de.json +++ b/www/addons/files/lang/de.json @@ -2,12 +2,12 @@ "admindisableddownload": "Das Herunterladen von Dateien ist deaktiviert. Sie können nur die Dateiliste sehen.", "clicktoupload": "Tippen Sie auf die Taste, um Dateien in 'Meine Dateien' hochzuladen.", "couldnotloadfiles": "Die Dateiliste konnte nicht geladen werden.", - "emptyfilelist": "Keine Dateien", + "emptyfilelist": "Es liegen keine Dateien vor", "erroruploadnotworking": "Im Moment können keine Dateien zur Website hochgeladen werden.", "files": "Dateien", "myprivatefilesdesc": "Diese Dateien liegen in Ihrem persönlichen Bereich auf dieser Website.", "privatefiles": "Meine Dateien", "sitefiles": "Dateien", "sitefilesdesc": "Weitere Dateien, die für Sie in anderen Bereichen der Website verfügbar sind.", - "uploadfiles": "Dateien hochladen" + "uploadfiles": "Feedbackdateien senden" } \ No newline at end of file diff --git a/www/addons/files/lang/el.json b/www/addons/files/lang/el.json index 8f435d24e4f..105bb0c0877 100644 --- a/www/addons/files/lang/el.json +++ b/www/addons/files/lang/el.json @@ -9,5 +9,5 @@ "privatefiles": "Προσωπικά αρχεία", "sitefiles": "Αρχεία του ιστοχώρου", "sitefilesdesc": "Άλλα αρχεία που είναι στη διάθεσή σας σε αυτό το site Moodle.", - "uploadfiles": "Μεταφορτώστε αρχεία" + "uploadfiles": "Αποστολή αρχείου ανατροφοδότησης" } \ No newline at end of file diff --git a/www/addons/files/lang/es-mx.json b/www/addons/files/lang/es-mx.json index 38849f29131..3a779e4d667 100644 --- a/www/addons/files/lang/es-mx.json +++ b/www/addons/files/lang/es-mx.json @@ -2,12 +2,12 @@ "admindisableddownload": "Por favor tome nota de que su administrador de Moodle deshabilitó las descargas de archivos; Usted puede ver los archivos pero no puede descargarlos.", "clicktoupload": "Haga click en el botón inferior para subir archivos a sus archivos privados.", "couldnotloadfiles": "La lista de archivos no pudo cargarse.", - "emptyfilelist": "No hay archivos para mostrar.", + "emptyfilelist": "No hay archivos que mostrar", "erroruploadnotworking": "Desafortunadamente ahorita no es posible subir archivos a su sitio.", "files": "Archivos", "myprivatefilesdesc": "Los archivos que están disponibles en su área privada en este sitio Moodle.", "privatefiles": "Archivos privados", "sitefiles": "Archivos del sitio", "sitefilesdesc": "Los otros archivos que están disponibles para Usted en este sitio Moodle.", - "uploadfiles": "Subir archivos" + "uploadfiles": "Mandar archivos de retroalimentación" } \ No newline at end of file diff --git a/www/addons/files/lang/es.json b/www/addons/files/lang/es.json index d67044531b0..7521ea196f2 100644 --- a/www/addons/files/lang/es.json +++ b/www/addons/files/lang/es.json @@ -4,10 +4,10 @@ "couldnotloadfiles": "La lista de archivos no ha podido cargarse.", "emptyfilelist": "No hay archivos que mostrar", "erroruploadnotworking": "Desafortunadamente en estos momentos no es posible subir archivos al sitio.", - "files": "Archivos", + "files": "Ficheros", "myprivatefilesdesc": "Los archivos que están disponibles en su área privada en este sitio Moodle.", "privatefiles": "Ficheros privados", "sitefiles": "Archivos del sitio", "sitefilesdesc": "Los otros archivos que están disponibles para Usted en este sitio Moodle.", - "uploadfiles": "Subir archivos" + "uploadfiles": "Mandar archivos de retroalimentación" } \ No newline at end of file diff --git a/www/addons/files/lang/eu.json b/www/addons/files/lang/eu.json index 30106de97bd..4648a027001 100644 --- a/www/addons/files/lang/eu.json +++ b/www/addons/files/lang/eu.json @@ -2,12 +2,12 @@ "admindisableddownload": "Mesedez ohartu zaitez zure Moodle administratzaileak fitxategien jaitsiera ezgaitu duela, fitxategiak arakatu ditzakezu baina ezin dituzu jaitsi.", "clicktoupload": "Klik egin beheko botoian fitxategiak zure gune pribatura igotzeko.", "couldnotloadfiles": "Ezin izan da fitxategien zerrenda kargatu.", - "emptyfilelist": "Ez dago fitxategirik erakusteko.", + "emptyfilelist": "Ez dago erakusteko fitxategirik", "erroruploadnotworking": "Zoritxarrez une honetan ezin dira fitxategiak zure gunera igo.", "files": "Fitxategiak", "myprivatefilesdesc": "Moodle gune honetako zure gune pribatuan eskuragarri dauden fitxategiak.", "privatefiles": "Fitxategi pribatuak", "sitefiles": "Guneko fitxategiak", "sitefilesdesc": "Zure Moodle gunean eskuragarri dauden beste fitxategiak.", - "uploadfiles": "Igo fitxategiak" + "uploadfiles": "bidali feedback-fitxategiak" } \ No newline at end of file diff --git a/www/addons/files/lang/fr.json b/www/addons/files/lang/fr.json index a1237a3feeb..ce819c482cb 100644 --- a/www/addons/files/lang/fr.json +++ b/www/addons/files/lang/fr.json @@ -2,12 +2,12 @@ "admindisableddownload": "L'administrateur de votre Moodle a désactivé le téléchargement des fichiers. Vous pouvez les consulter, mais pas les télécharger.", "clicktoupload": "Cliquer sur le bouton ci-dessous pour déposer les fichiers dans vos fichiers personnels.", "couldnotloadfiles": "La liste des fichiers n'a pas pu être chargée.", - "emptyfilelist": "Aucun fichier à afficher.", + "emptyfilelist": "Il n'y a pas de fichier à afficher", "erroruploadnotworking": "Il n'est actuellement pas possible de déposer des fichiers sur votre site.", "files": "Fichiers", "myprivatefilesdesc": "Les fichiers disponibles dans votre zone privée sur cette plateforme Moodle.", "privatefiles": "Fichiers personnels", "sitefiles": "Fichiers du site", "sitefilesdesc": "Les autres fichiers disponibles sur cette plateforme Moodle.", - "uploadfiles": "Déposer des fichiers" + "uploadfiles": "Envoyer des fichiers de feedback" } \ No newline at end of file diff --git a/www/addons/files/lang/he.json b/www/addons/files/lang/he.json index 0ed31567503..6f612548ac8 100644 --- a/www/addons/files/lang/he.json +++ b/www/addons/files/lang/he.json @@ -2,7 +2,7 @@ "admindisableddownload": "יש לשים לב כי מנהל/ת אתר המוודל שלך, ביטל/ה את אפשרות להורדת הקבצים. באפשרותך לעיין בקבצים אך לא להורידם.", "clicktoupload": "להעלאת הקבצים לקבצים הפרטיים שלך, יש להקליק על הכפתור למטה.", "couldnotloadfiles": "לא ניתן לטעון את רשימת הקבצים.", - "emptyfilelist": "אין קבצים להצגה.", + "emptyfilelist": "אין קבצים להציג", "files": "קבצים", "myprivatefilesdesc": "הקבצים הזמינים לך באזור הפרטי באתר מוודל זה.", "privatefiles": "הקבצים שלי", diff --git a/www/addons/files/lang/it.json b/www/addons/files/lang/it.json index 3f198893008..d9b1f96d205 100644 --- a/www/addons/files/lang/it.json +++ b/www/addons/files/lang/it.json @@ -2,12 +2,12 @@ "admindisableddownload": "L'amministratore del sito Moodle ha disabilitato il download dei file. Puoi navigare tra i file ma non potrai scaricarli.", "clicktoupload": "Fai click sul pulsante sotto per caricare i file nei File personali", "couldnotloadfiles": "Non è stato possibile caricare l'elenco dei file.", - "emptyfilelist": "Non ci sono file da visualizzare.", + "emptyfilelist": "Non ci sono file da visualizzare", "erroruploadnotworking": "Al momento non è possibile caricare file sul sito.", "files": "File", "myprivatefilesdesc": "I file memorizzati nell'omonima area di Moodle", "privatefiles": "File personali", "sitefiles": "File del sito", "sitefilesdesc": "Altri file del sito Moodle ai quali puoi accedere.", - "uploadfiles": "Carica file" + "uploadfiles": "Invia file di commento" } \ No newline at end of file diff --git a/www/addons/files/lang/ja.json b/www/addons/files/lang/ja.json index de63504d659..648ed7d331a 100644 --- a/www/addons/files/lang/ja.json +++ b/www/addons/files/lang/ja.json @@ -2,12 +2,12 @@ "admindisableddownload": "あなたのMoodle管理者に、ファイルのダウンロードを無効にするよう知らせてください。そうすれば、ファイルをデバイスにダウンロードせず閲覧のみにすることができます。", "clicktoupload": "ファイルをあなたのプライベートファイル領域にアップロードするには、下のボタンをクリックしてください。", "couldnotloadfiles": "以下のファイルが読み込みできませんでした。", - "emptyfilelist": "表示するファイルがありません。", + "emptyfilelist": "表示するファイルはありません。", "erroruploadnotworking": "残念ながら、現在、あなたのサイトにファイルをアップロードすることはできません。", "files": "ファイル", "myprivatefilesdesc": "ファイルはMoodleサイト上のあなたのプライベート領域にあります。", "privatefiles": "プライベートファイル", "sitefiles": "サイトファイル", "sitefilesdesc": "本Moodleサイトであなたが利用できる他のファイル", - "uploadfiles": "アップロードファイル" + "uploadfiles": "フィードバックファイルを送信する" } \ No newline at end of file diff --git a/www/addons/files/lang/lt.json b/www/addons/files/lang/lt.json index 82157441c00..1e5b2c5b2f2 100644 --- a/www/addons/files/lang/lt.json +++ b/www/addons/files/lang/lt.json @@ -2,12 +2,12 @@ "admindisableddownload": "Primename, kad Moodle administratorius panaikino galimybę parsisiųsti failus, failų atsisiųsti negalima, galite tik naršyti.", "clicktoupload": "Paspauskite mygtuką, esantį žemiau, kad galėtumėte atsisiųsti failus į privatų aplanką.", "couldnotloadfiles": "Negalima užkrauti failų sąrašo.", - "emptyfilelist": "Nėra ką rodyti.", + "emptyfilelist": "Nėra rodytinų failų", "erroruploadnotworking": "Deja, failo į pasirinktą svetainę įkelti negalima.", "files": "Failai", "myprivatefilesdesc": "Jūsų privatūs failai Moodle svetainėje.", "privatefiles": "Asmeniniai failai", "sitefiles": "Svetainės failai", "sitefilesdesc": "Kiti failai Moodle svetainėje", - "uploadfiles": "Įkelti failus" + "uploadfiles": "Siųsti grįžtamojo ryšio failus" } \ No newline at end of file diff --git a/www/addons/files/lang/nl.json b/www/addons/files/lang/nl.json index 2b091df63b0..e4f5e1dc248 100644 --- a/www/addons/files/lang/nl.json +++ b/www/addons/files/lang/nl.json @@ -2,12 +2,12 @@ "admindisableddownload": "Je Moodle beheerder heeft het downloaden van bestanden uitgeschakeld. Je kunt door de bestandenlijst bladeren, maar ze niet downloaden.", "clicktoupload": "Klik op onderstaande knop om bestanden naar je privé-bestanden te uploaden.", "couldnotloadfiles": "De bestandenlijst kon niet geladen worden.", - "emptyfilelist": "Er zijn geen bestanden te tonen.", + "emptyfilelist": "Er zijn geen bestanden om te tonen", "erroruploadnotworking": "Jammer genoeg kun je op dit ogenblik geen bestanden uploaden naar de site.", "files": "Bestanden", "myprivatefilesdesc": "Jouw bestanden op deze Moodle-site.", "privatefiles": "Privébestanden", "sitefiles": "Sitebestanden", "sitefilesdesc": "Andere bestanden op deze Moodle-site.", - "uploadfiles": "Bestanden uploaden" + "uploadfiles": "Stuur feedbackbestanden" } \ No newline at end of file diff --git a/www/addons/files/lang/pt-br.json b/www/addons/files/lang/pt-br.json index fa0429bebba..2c3c45d9555 100644 --- a/www/addons/files/lang/pt-br.json +++ b/www/addons/files/lang/pt-br.json @@ -2,12 +2,12 @@ "admindisableddownload": "Por favor note que o administrador do Moodle desativou downloads de arquivos, você pode navegar através dos arquivos, mas não baixá-los.", "clicktoupload": "Clique no botão abaixo para enviar para seus arquivos privados.", "couldnotloadfiles": "A lista de arquivos não pode ser carregada.", - "emptyfilelist": "Não há arquivos para mostrar.", + "emptyfilelist": "Não há arquivos para exibir", "erroruploadnotworking": "Infelizmente é impossível enviar arquivos para o seu site.", "files": "Arquivos", "myprivatefilesdesc": "Os arquivos que estão disponíveis em sua área de arquivos privados nesse site Moodle.", "privatefiles": "Arquivos privados", "sitefiles": "Arquivos do site", "sitefilesdesc": "Os outros arquivos que estão disponíveis a você neste site Moodle.", - "uploadfiles": "Enviar arquivos" + "uploadfiles": "Enviar arquivos de feedback" } \ No newline at end of file diff --git a/www/addons/files/lang/pt.json b/www/addons/files/lang/pt.json index 3e1ce1acbd4..aad6d0a66be 100644 --- a/www/addons/files/lang/pt.json +++ b/www/addons/files/lang/pt.json @@ -2,12 +2,12 @@ "admindisableddownload": "Tenha en atenção que o administrador do Moodle desativou a opção de descarregar ficheiros. Poderá navegar nos ficheiros mas não conseguirá descarregá-los.", "clicktoupload": "Clique no botão abaixo para carregar ficheiros para os seus ficheiros privados.", "couldnotloadfiles": "Não foi possível carregar a lista de ficheiros", - "emptyfilelist": "Não há ficheiros", + "emptyfilelist": "Este repositório está vazio", "erroruploadnotworking": "Infelizmente não é possível carregar ficheiros para o seu site.", - "files": "Ficheiros", + "files": "Anexos", "myprivatefilesdesc": "Ficheiros disponíveis na sua área privada neste site Moodle", "privatefiles": "Ficheiros privados", "sitefiles": "Ficheiros do site", "sitefilesdesc": "Os outros ficheiros que estão disponíveis para si neste site Moodle.", - "uploadfiles": "Carregar ficheiros" + "uploadfiles": "Enviar ficheiros de feedback" } \ No newline at end of file diff --git a/www/addons/files/lang/ro.json b/www/addons/files/lang/ro.json index 30500b91c47..d8113b20c3d 100644 --- a/www/addons/files/lang/ro.json +++ b/www/addons/files/lang/ro.json @@ -2,8 +2,8 @@ "admindisableddownload": "Atenție! Administratorul platformei a dezactivat descărcarea de fișiere; puteți accesa fișierele dar nu le puteți descărca.", "clicktoupload": "Apăsați butonul de mai jos pentru a încarcă fișierele în contul dumneavoastră.", "couldnotloadfiles": "Lista fișierelor nu a putut fi încărcată.", - "emptyfilelist": "Nu sunt fișiere disponibile.", - "files": "Fişiere", + "emptyfilelist": "Nu există fișiere", + "files": "Fișiere", "myprivatefilesdesc": "Fișierele disponibile din zona personală, pe care o dețineți pe acest site.", "privatefiles": "Fișiere private", "sitefiles": "Fişiere site", diff --git a/www/addons/files/lang/ru.json b/www/addons/files/lang/ru.json index 7da775bb875..10418095e77 100644 --- a/www/addons/files/lang/ru.json +++ b/www/addons/files/lang/ru.json @@ -8,5 +8,5 @@ "privatefiles": "Личные файлы", "sitefiles": "Файлы сайта", "sitefilesdesc": "Другие файлы, доступные на этом сайте Moodle", - "uploadfiles": "Загрузка файлов" + "uploadfiles": "Отправить файлы с отзывами" } \ No newline at end of file diff --git a/www/addons/files/lang/sr-cr.json b/www/addons/files/lang/sr-cr.json index 2faaa2353ae..8fad2e69c6e 100644 --- a/www/addons/files/lang/sr-cr.json +++ b/www/addons/files/lang/sr-cr.json @@ -2,9 +2,12 @@ "admindisableddownload": "Имајте у виду да је ваш Moodle администратор онемогућио преузимање датотека. Датотеке можете да прегледате, али не и да их преузмете.", "clicktoupload": "Кликните на доње дугме како бисте отпремили датотеке међу своје приватне датотеке.", "couldnotloadfiles": "Списак датотека не може бити учитан.", - "emptyfilelist": "Нема датотека за приказ.", + "emptyfilelist": "Нема датотека за приказ", "erroruploadnotworking": "Нажалост, тренутно није могуће отпремити датотеке на ваш сајт.", + "files": "Датотеке", "myprivatefilesdesc": "Датотеке које су доступне у вашем приватном простору на овом Moodle сајту.", + "privatefiles": "Приватне датотеке", + "sitefiles": "Датотеке сајта", "sitefilesdesc": "Остале датотеке које су доступне на овом Moodle сајту.", - "uploadfiles": "Отпреми датотеке" + "uploadfiles": "Пошаљи датотеке са повратним информацијама" } \ No newline at end of file diff --git a/www/addons/files/lang/sr-lt.json b/www/addons/files/lang/sr-lt.json index d847189a2dd..2375580de0e 100644 --- a/www/addons/files/lang/sr-lt.json +++ b/www/addons/files/lang/sr-lt.json @@ -2,9 +2,12 @@ "admindisableddownload": "Imajte u vidu da je vaš Moodle administrator onemogućio preuzimanje datoteka. Datoteke možete da pregledate, ali ne i da ih preuzmete.", "clicktoupload": "Kliknite na donje dugme kako biste otpremili datoteke među svoje privatne datoteke.", "couldnotloadfiles": "Spisak datoteka ne može biti učitan.", - "emptyfilelist": "Nema datoteka za prikaz.", + "emptyfilelist": "Nema datoteka za prikaz", "erroruploadnotworking": "Nažalost, trenutno nije moguće otpremiti datoteke na vaš sajt.", + "files": "Datoteke", "myprivatefilesdesc": "Datoteke koje su dostupne u vašem privatnom prostoru na ovom Moodle sajtu.", + "privatefiles": "Privatne datoteke", + "sitefiles": "Datoteke sajta", "sitefilesdesc": "Ostale datoteke koje su dostupne na ovom Moodle sajtu.", - "uploadfiles": "Otpremi datoteke" + "uploadfiles": "Pošalji datoteke sa povratnim informacijama" } \ No newline at end of file diff --git a/www/addons/files/lang/uk.json b/www/addons/files/lang/uk.json index 083a9f56194..4043adc3905 100644 --- a/www/addons/files/lang/uk.json +++ b/www/addons/files/lang/uk.json @@ -2,12 +2,12 @@ "admindisableddownload": "Зверніть увагу, що ваш адміністратор Moodle відключив завантаження файлів. Ви можете переглядати файли, але не завантажувати їх.", "clicktoupload": "Натисніть на кнопку нижче, щоб завантажити ваші особисті файли.", "couldnotloadfiles": "Список файлів не може бути завантажений.", - "emptyfilelist": "Немає файлів для показу.", + "emptyfilelist": "Немає файлів для показу", "erroruploadnotworking": "На жаль, в даний час не представляється можливим завантажувати файли на ваш сайт.", "files": "Файли", "myprivatefilesdesc": "Файли, які доступні у приватній області на цьому сайті Moodle.", "privatefiles": "Особисті файли", "sitefiles": "Файли сайту", "sitefilesdesc": "Інші файли, які доступні для вас на цьому сайті Moodle.", - "uploadfiles": "Завантажити файли" + "uploadfiles": "Надіслати файл-відгук(и)" } \ No newline at end of file diff --git a/www/addons/files/lang/zh-tw.json b/www/addons/files/lang/zh-tw.json index 78c6090acee..7f0cc12450e 100644 --- a/www/addons/files/lang/zh-tw.json +++ b/www/addons/files/lang/zh-tw.json @@ -2,12 +2,12 @@ "admindisableddownload": "請注意, 您的Moodle管理員禁止檔案下載, 您可以瀏覽檔案, 但不能下載它們.", "clicktoupload": "點選這個按鈕,將檔案上傳到你的個人檔案區", "couldnotloadfiles": "這些檔案是不能被載入的", - "emptyfilelist": "沒有檔案可以顯示", + "emptyfilelist": "沒有可以顯示的檔案", "erroruploadnotworking": "很抱歉, 目前無法將檔案上傳到您的網站.", "files": "檔案", "myprivatefilesdesc": "在此Moodle網站上, 您的私有區域中有可用的文件", "privatefiles": "私人檔案", "sitefiles": "網站檔案", "sitefilesdesc": "您在此Moodle網站上有可用的其他文件.", - "uploadfiles": "上傳檔案" + "uploadfiles": "送出回饋檔案" } \ No newline at end of file diff --git a/www/addons/frontpage/lang/da.json b/www/addons/frontpage/lang/da.json index 14f7474bfce..b3d549ab6ff 100644 --- a/www/addons/frontpage/lang/da.json +++ b/www/addons/frontpage/lang/da.json @@ -1,4 +1,4 @@ { "sitehome": "Webstedets forside", - "sitenews": "Sitenyheder" + "sitenews": "Sitemeddelelser" } \ No newline at end of file diff --git a/www/addons/frontpage/lang/eu.json b/www/addons/frontpage/lang/eu.json index 2a21d6f7aa1..332c7d403ff 100644 --- a/www/addons/frontpage/lang/eu.json +++ b/www/addons/frontpage/lang/eu.json @@ -1,4 +1,4 @@ { "sitehome": "Gunearen hasiera", - "sitenews": "Gunearen berriak" + "sitenews": "Guneko albisteak" } \ No newline at end of file diff --git a/www/addons/frontpage/lang/sr-cr.json b/www/addons/frontpage/lang/sr-cr.json new file mode 100644 index 00000000000..de1f7c9cbd7 --- /dev/null +++ b/www/addons/frontpage/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "sitehome": "Насловна страница сајта", + "sitenews": "Обавештења сајта" +} \ No newline at end of file diff --git a/www/addons/frontpage/lang/sr-lt.json b/www/addons/frontpage/lang/sr-lt.json new file mode 100644 index 00000000000..685ff10dcef --- /dev/null +++ b/www/addons/frontpage/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "sitehome": "Naslovna stranica sajta", + "sitenews": "Obaveštenja sajta" +} \ No newline at end of file diff --git a/www/addons/grades/lang/bg.json b/www/addons/grades/lang/bg.json index 49ff4539d55..02c842d1272 100644 --- a/www/addons/grades/lang/bg.json +++ b/www/addons/grades/lang/bg.json @@ -1,3 +1,3 @@ { - "viewgrades": "Виждане на оценките" + "viewgrades": "Разглеждане на оценки" } \ No newline at end of file diff --git a/www/addons/grades/lang/el.json b/www/addons/grades/lang/el.json index c1625a02671..5517b193e17 100644 --- a/www/addons/grades/lang/el.json +++ b/www/addons/grades/lang/el.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Δεν επιστράφηκε κανένας βαθμός", - "viewgrades": "Προβολή βαθμών" + "viewgrades": "Προβολή Βαθμών" } \ No newline at end of file diff --git a/www/addons/grades/lang/fa.json b/www/addons/grades/lang/fa.json index 6c9c03151dd..fd0241c2bc7 100644 --- a/www/addons/grades/lang/fa.json +++ b/www/addons/grades/lang/fa.json @@ -1,3 +1,3 @@ { - "viewgrades": "مشاهدهٔ نمره‌ها" + "viewgrades": "دیدن نمره‌ها" } \ No newline at end of file diff --git a/www/addons/grades/lang/fr.json b/www/addons/grades/lang/fr.json index 37ee094566f..1c1ce861d2d 100644 --- a/www/addons/grades/lang/fr.json +++ b/www/addons/grades/lang/fr.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Aucune note retournée", - "viewgrades": "Afficher les notes" + "viewgrades": "Affichage des notes" } \ No newline at end of file diff --git a/www/addons/grades/lang/he.json b/www/addons/grades/lang/he.json index 63f5df64a1c..f6450d5c884 100644 --- a/www/addons/grades/lang/he.json +++ b/www/addons/grades/lang/he.json @@ -1,4 +1,4 @@ { "nogradesreturned": "לא הוחזרו ציונים", - "viewgrades": "ראה ציונים" + "viewgrades": "תצוגת ציונים" } \ No newline at end of file diff --git a/www/addons/grades/lang/it.json b/www/addons/grades/lang/it.json index 194c13b5f5a..883d830fb4f 100644 --- a/www/addons/grades/lang/it.json +++ b/www/addons/grades/lang/it.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Non è stata ottenuta alcuna valutazione", - "viewgrades": "Visualizza risultati" + "viewgrades": "Visualizza valutazioni" } \ No newline at end of file diff --git a/www/addons/grades/lang/ja.json b/www/addons/grades/lang/ja.json index c49db645dae..23abe78a3be 100644 --- a/www/addons/grades/lang/ja.json +++ b/www/addons/grades/lang/ja.json @@ -1,4 +1,4 @@ { "nogradesreturned": "評点がありません。", - "viewgrades": "評点を表示する" + "viewgrades": "評定を表示する" } \ No newline at end of file diff --git a/www/addons/grades/lang/nl.json b/www/addons/grades/lang/nl.json index 1b33ee8446a..a11f8e821e2 100644 --- a/www/addons/grades/lang/nl.json +++ b/www/addons/grades/lang/nl.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Geen cijfers", - "viewgrades": "Bekijk de cijfers" + "viewgrades": "Bekijk cijfers" } \ No newline at end of file diff --git a/www/addons/grades/lang/pl.json b/www/addons/grades/lang/pl.json index b2abf06357d..0f2f359336e 100644 --- a/www/addons/grades/lang/pl.json +++ b/www/addons/grades/lang/pl.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Brak stopni", - "viewgrades": "Pokaż oceny" + "viewgrades": "Podgląd ocen" } \ No newline at end of file diff --git a/www/addons/grades/lang/ru.json b/www/addons/grades/lang/ru.json index fac7633651b..733ed0c23e6 100644 --- a/www/addons/grades/lang/ru.json +++ b/www/addons/grades/lang/ru.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Нет оценок", - "viewgrades": "Посмотреть оценки" + "viewgrades": "Просмотр оценок" } \ No newline at end of file diff --git a/www/addons/grades/lang/sr-cr.json b/www/addons/grades/lang/sr-cr.json new file mode 100644 index 00000000000..88b8e81b468 --- /dev/null +++ b/www/addons/grades/lang/sr-cr.json @@ -0,0 +1,4 @@ +{ + "nogradesreturned": "Нема добијених оцена", + "viewgrades": "Приказ оцена" +} \ No newline at end of file diff --git a/www/addons/grades/lang/sr-lt.json b/www/addons/grades/lang/sr-lt.json new file mode 100644 index 00000000000..bc161c7fd6e --- /dev/null +++ b/www/addons/grades/lang/sr-lt.json @@ -0,0 +1,4 @@ +{ + "nogradesreturned": "Nema dobijenih ocena", + "viewgrades": "Prikaz ocena" +} \ No newline at end of file diff --git a/www/addons/grades/lang/uk.json b/www/addons/grades/lang/uk.json index 86c7bf00584..32dd4de48eb 100644 --- a/www/addons/grades/lang/uk.json +++ b/www/addons/grades/lang/uk.json @@ -1,4 +1,4 @@ { "nogradesreturned": "Немає оцінок", - "viewgrades": "Подивитися оцінки" + "viewgrades": "Перегляд оцінок" } \ No newline at end of file diff --git a/www/addons/grades/lang/zh-tw.json b/www/addons/grades/lang/zh-tw.json index 9a7313f470a..7dedc8d3d0c 100644 --- a/www/addons/grades/lang/zh-tw.json +++ b/www/addons/grades/lang/zh-tw.json @@ -1,4 +1,4 @@ { "nogradesreturned": "未找到成績", - "viewgrades": "檢視分數" + "viewgrades": "檢視成績" } \ No newline at end of file diff --git a/www/addons/messages/lang/ar.json b/www/addons/messages/lang/ar.json index afa651966c1..81750633333 100644 --- a/www/addons/messages/lang/ar.json +++ b/www/addons/messages/lang/ar.json @@ -10,10 +10,10 @@ "messages": "رسائل", "mustbeonlinetosendmessages": "لابد أن تكون متصل بالأنترنت لكي ترسل أي رسائل", "newmessage": "رسالة جديدة", - "nomessages": "لا يوجد رسائل", - "nousersfound": "لا يوجد مستخدمين", + "nomessages": "لا توجد رسائل بعد", + "nousersfound": "لا يوجد مستخدمون", "removecontact": "ازل عنوان الاتصال", - "send": "إرسل", + "send": "إرسال", "sendmessage": "إرسل رسالة", "type_offline": "غير متصل", "type_online": "متصل", diff --git a/www/addons/messages/lang/bg.json b/www/addons/messages/lang/bg.json index 857ae200454..1cf0cf2e3be 100644 --- a/www/addons/messages/lang/bg.json +++ b/www/addons/messages/lang/bg.json @@ -10,16 +10,16 @@ "errorwhileretrievingcontacts": "Грешка при изчитането на списъка с контакти от сървъра.", "errorwhileretrievingdiscussions": "Грешка при изчитането на дискусиите от сървъра.", "errorwhileretrievingmessages": "Грешка при изчитането на съобщенията от сървъра.", - "message": "Текст на съобщението", + "message": "Вашето мнение", "messagenotsent": "Съобщението не беше изпратено. Моля опитайте пак по-късно.", "messagepreferences": "Предпочитания за съобщенията", "messages": "Съобщения", "mustbeonlinetosendmessages": "Трябва да сте онлайн, за да изпращате съобщения.", "newmessage": "Ново съобщение ...", - "nomessages": "Няма съобщения.", + "nomessages": "Още няма съобщения", "nousersfound": "Не са намерени потребители", "removecontact": "Премахване на контакт", - "send": "изпращане", + "send": "Изпращане", "sendmessage": "Изпращане на съобщение", "type_blocked": "Блокиран", "type_offline": "Офлайн", diff --git a/www/addons/messages/lang/ca.json b/www/addons/messages/lang/ca.json index f4e5e0357b7..78d880054d7 100644 --- a/www/addons/messages/lang/ca.json +++ b/www/addons/messages/lang/ca.json @@ -13,17 +13,18 @@ "errorwhileretrievingdiscussions": "S'ha produït un error mentre es recuperaven els debats del servidor.", "errorwhileretrievingmessages": "S'ha produït un error descarregant els missatges.", "loadpreviousmessages": "Carrega els missatges anteriors", - "message": "Cos del missatge", + "message": "Missatge", "messagenotsent": "El missatge no s'ha enviat. Si us plau, intenteu-ho més tard", + "messagepreferences": "Preferències dels missatges", "messages": "Missatges", "mustbeonlinetosendmessages": "Heu de tenir connexió a la xarxa per a enviar missatges", - "newmessage": "Nou missatge...", + "newmessage": "Missatge nou", "newmessages": "Nous missatges", - "nomessages": "No hi ha missatges.", + "nomessages": "No hi ha missatges encara", "nousersfound": "No s'han trobat usuaris", "removecontact": "Suprimeix contacte", "removecontactconfirm": "El contacte s'eliminarà de la vostra llista de contactes.", - "send": "envia", + "send": "Envia", "sendmessage": "Envia missatge", "type_blocked": "Bloquejat", "type_offline": "Fora de línia", diff --git a/www/addons/messages/lang/cs.json b/www/addons/messages/lang/cs.json index fe2c22c0fc3..18c655d4826 100644 --- a/www/addons/messages/lang/cs.json +++ b/www/addons/messages/lang/cs.json @@ -18,14 +18,14 @@ "messagepreferences": "Nastavení zpráv", "messages": "Zprávy", "mustbeonlinetosendmessages": "Pro odesílání zpráv musíte být online", - "newmessage": "Nová zpráva...", + "newmessage": "Nová zpráva", "newmessages": "Nové zprávy", - "nomessages": "Žádné zprávy.", - "nousersfound": "Nebyl nalezen žádný uživatel", + "nomessages": "Zatím žádné zprávy", + "nousersfound": "Nenalezeni žádní uživatelé", "removecontact": "Odebrat kontakt", "removecontactconfirm": "Kontakt bude odstraněn ze seznamu kontaktů.", - "send": "odeslat", - "sendmessage": "Odeslat zprávu", + "send": "Odeslat", + "sendmessage": "Poslat zprávu", "type_blocked": "Blokováno", "type_offline": "Offline", "type_online": "Online", diff --git a/www/addons/messages/lang/da.json b/www/addons/messages/lang/da.json index 0e63f8c9314..0449e80699a 100644 --- a/www/addons/messages/lang/da.json +++ b/www/addons/messages/lang/da.json @@ -11,16 +11,16 @@ "errorwhileretrievingcontacts": "Fejl ved hentning af kontakter fra serveren", "errorwhileretrievingdiscussions": "Fejl ved hentning af diskussioner fra serveren", "errorwhileretrievingmessages": "Fejl ved hentning af beskeder fra serveren.", - "message": "Beskedtekst", + "message": "Meddelelse", "messagenotsent": "Beskeden blev ikke sendt, prøv igen senere.", "messagepreferences": "Indstillinger for beskeder", "messages": "Beskeder", "mustbeonlinetosendmessages": "Du skal være online for at sende beskeder", - "newmessage": "Ny besked...", - "nomessages": "Ingen besked.", + "newmessage": "Ny besked", + "nomessages": "Ingen beskeder endnu", "nousersfound": "Ingen brugere fundet", "removecontact": "Fjern kontakt", - "send": "send", + "send": "Send", "sendmessage": "Send besked", "type_blocked": "Blokeret", "type_offline": "Offline", diff --git a/www/addons/messages/lang/de.json b/www/addons/messages/lang/de.json index 1f91de7f2a3..6deac3f090b 100644 --- a/www/addons/messages/lang/de.json +++ b/www/addons/messages/lang/de.json @@ -2,7 +2,7 @@ "addcontact": "Kontakt hinzufügen", "blockcontact": "Kontakt sperren", "blockcontactconfirm": "Sie beenden den Mitteilungsempfang von diesem Kontakt.", - "blocknoncontacts": "Weitere Personen sperren", + "blocknoncontacts": "Mitteilungen nur für Kontakte zulassen", "contactlistempty": "Die Kontaktliste ist leer.", "contactname": "Name", "contacts": "Kontakte", @@ -15,13 +15,13 @@ "loadpreviousmessages": "Vorherige Mitteilungen laden", "message": "Mitteilung", "messagenotsent": "Die Mitteilung wurde nicht gesendet. Versuchen Sie es später noch einmal.", - "messagepreferences": "Mitteilungen konfigurieren", + "messagepreferences": "Mitteilungen", "messages": "Mitteilungen", "mustbeonlinetosendmessages": "Sie müssen online sein, um Mitteilungen zu senden", - "newmessage": "Neue Mitteilung ...", + "newmessage": "Neue Mitteilung", "newmessages": "Neue Mitteilungen", "nomessages": "Keine Mitteilungen", - "nousersfound": "Keine Personen gefunden", + "nousersfound": "Keine Nutzer/innen gefunden", "removecontact": "Kontakt entfernen", "removecontactconfirm": "Der Kontakt wird aus Ihrer Kontaktliste gelöscht.", "send": "Senden", diff --git a/www/addons/messages/lang/el.json b/www/addons/messages/lang/el.json index 972f33b7539..714e6df2eb0 100644 --- a/www/addons/messages/lang/el.json +++ b/www/addons/messages/lang/el.json @@ -11,15 +11,15 @@ "errorwhileretrievingdiscussions": "Σφάλμα κατά την ανάκτηση των συζητήσεων από το διακομιστή.", "errorwhileretrievingmessages": "Σφάλμα κατά την ανάκτηση των μηνυμάτων από το διακομιστή.", "loadpreviousmessages": "Φορτώστε τα προηγούμενα μηνύματα", - "message": "Σώμα μηνύματος", + "message": "Μήνυμα", "messagenotsent": "Το μήνυμα δεν στάλθηκε, δοκιμάστε ξανά αργότερα.", "messagepreferences": "Προτιμήσεις μηνύματος", "messages": "Μηνύματα", "mustbeonlinetosendmessages": "Πρέπει να είστε συνδεδεμένοι για να στείλετε μηνύματα", - "newmessage": "Νέο μήνυμα...", + "newmessage": "Νέο μήνυμα", "newmessages": "Νέα μηνύματα", - "nomessages": "Κανένα μήνυμα.", - "nousersfound": "Δεν βρέθηκαν χρήστες", + "nomessages": "Δεν υπάρχουν ακόμα μηνύματα", + "nousersfound": "Δε βρέθηκαν χρήστες", "removecontact": "Αφαίρεσε την επαφή", "removecontactconfirm": "Η επαφή θα καταργηθεί από τη λίστα επαφών σας.", "send": "Αποστολή", diff --git a/www/addons/messages/lang/es-mx.json b/www/addons/messages/lang/es-mx.json index b7a7a579a99..da63ffaf879 100644 --- a/www/addons/messages/lang/es-mx.json +++ b/www/addons/messages/lang/es-mx.json @@ -13,18 +13,18 @@ "errorwhileretrievingdiscussions": "Error al recuperar las discusiones del servidor.", "errorwhileretrievingmessages": "Error al recuperar los mensajes del servidor.", "loadpreviousmessages": "Cargar mensajes anteriores", - "message": "Cuerpo del mensaje", + "message": "Mensaje", "messagenotsent": "El mensaje no fue enviado; por favor inténtelo nuevamente después.", "messagepreferences": "Preferencias de Mensaje", "messages": "Mensajes", "mustbeonlinetosendmessages": "Usted debe de estar en-linea para enviar mensajes", - "newmessage": "Nuevo mensaje...", + "newmessage": "Nuevo mensaje", "newmessages": "Nuevos mensajes", - "nomessages": "Sin mensajes.", - "nousersfound": "No se encontraron usuarios", + "nomessages": "Aún no hay mensajes", + "nousersfound": "No se encuentran usuarios", "removecontact": "Eliminar contacto", "removecontactconfirm": "El contacto será quitado de su lista de contactos.", - "send": "enviar", + "send": "Enviar", "sendmessage": "Enviar mensaje", "type_blocked": "Bloqueado", "type_offline": "Fuera-de-línea", diff --git a/www/addons/messages/lang/es.json b/www/addons/messages/lang/es.json index c2662e87fb9..351337a98eb 100644 --- a/www/addons/messages/lang/es.json +++ b/www/addons/messages/lang/es.json @@ -13,18 +13,18 @@ "errorwhileretrievingdiscussions": "Error al recuperar las discusiones del servidor.", "errorwhileretrievingmessages": "Error al recuperar los mensajes del servidor.", "loadpreviousmessages": "Cargar mensajes anteriores", - "message": "Cuerpo del mensaje", + "message": "Mensaje", "messagenotsent": "El mensaje no fue enviado; por favor inténtelo nuevamente después.", "messagepreferences": "Preferencias de mensajes", "messages": "Mensajes", "mustbeonlinetosendmessages": "Debe conectarse para enviar mensajes", - "newmessage": "Nuevo mensaje...", + "newmessage": "Nuevo mensaje", "newmessages": "Nuevos mensajes", - "nomessages": "No hay mensajes en espera", + "nomessages": "Aún no hay mensajes", "nousersfound": "No se encuentran usuarios", "removecontact": "Eliminar contacto", "removecontactconfirm": "El contacto se eliminará de su lista de contactos.", - "send": "enviar", + "send": "Enviar", "sendmessage": "Enviar mensaje", "type_blocked": "Bloqueado", "type_offline": "Desconectado", diff --git a/www/addons/messages/lang/eu.json b/www/addons/messages/lang/eu.json index ed18c8f0e65..0da6ce51bb0 100644 --- a/www/addons/messages/lang/eu.json +++ b/www/addons/messages/lang/eu.json @@ -13,18 +13,18 @@ "errorwhileretrievingdiscussions": "Errorea elkarrizketak zerbitzaritik jasotzean.", "errorwhileretrievingmessages": "Errorea mezuak zerbitzaritik jasotzean.", "loadpreviousmessages": "Kargatu aurreko mezuak", - "message": "Mezuren gurputza", + "message": "Mezua", "messagenotsent": "Mezua ez da bidali, mesedez saiatu beranduago.", "messagepreferences": "Mezuen hobespenak", "messages": "Mezuak", "mustbeonlinetosendmessages": "Online egon behar zara mezuak bidaltzeko.", - "newmessage": "Mezu berria...", + "newmessage": "Mezu berria", "newmessages": "Mezu beriak", - "nomessages": "Mezurik ez.", + "nomessages": "Ez dago mezurik oraindik", "nousersfound": "Ez da erabiltzailerik aurkitu", "removecontact": "Ezabatu kontaktua", "removecontactconfirm": "Kontaktua zure kontaktuen zerrendatik ezabatuko da.", - "send": "bidali", + "send": "Bidali", "sendmessage": "Mezua bidali", "type_blocked": "Blokeatuta", "type_offline": "Lineaz kanpo", diff --git a/www/addons/messages/lang/fa.json b/www/addons/messages/lang/fa.json index a6d80f69982..f5155644c97 100644 --- a/www/addons/messages/lang/fa.json +++ b/www/addons/messages/lang/fa.json @@ -6,14 +6,14 @@ "contactname": "نام مخاطب", "contacts": "مخاطبین", "errorwhileretrievingdiscussions": "خطا در دریافت مباحثه‌ها از کارگزار.", - "message": "متن پیام", + "message": "متن", "messagepreferences": "ترجیحات پیام‌دهی", "messages": "پیام‌ها", "newmessage": "پیام جدید", - "nomessages": "هنوز پیامی گفته نشده است", + "nomessages": "هیچ پیغامی منتظر جواب نیست", "nousersfound": "کاربری پیدا نشد", "removecontact": "حذف کردن مخاطب", - "send": "فرستادن", + "send": "ارسال", "sendmessage": "ارسال پیام", "unblockcontact": "خارج کردن مخاطب از حالت مسدود" } \ No newline at end of file diff --git a/www/addons/messages/lang/fr.json b/www/addons/messages/lang/fr.json index 159b6fe52a9..454057f6d63 100644 --- a/www/addons/messages/lang/fr.json +++ b/www/addons/messages/lang/fr.json @@ -13,19 +13,19 @@ "errorwhileretrievingdiscussions": "Erreur lors de la récupération des discussions depuis le serveur.", "errorwhileretrievingmessages": "Erreur lors de la récupération des messages depuis le serveur.", "loadpreviousmessages": "Charger les messages antérieurs", - "message": "Corps du message", + "message": "Message", "messagenotsent": "Ce message n'a pas été envoyé. Veuillez essayer plus tard.", "messagepreferences": "Préférences des messages", - "messages": "Messages", + "messages": "Messages personnels", "mustbeonlinetosendmessages": "Vous devez être en ligne pour envoyer des messages", - "newmessage": "Nouveau message...", + "newmessage": "Nouveau message", "newmessages": "Nouveaux messages", - "nomessages": "Aucun message.", - "nousersfound": "Aucun utilisateur trouvé", + "nomessages": "Pas encore de messages", + "nousersfound": "Aucun utilisateur n'a été trouvé", "removecontact": "Supprimer ce contact", "removecontactconfirm": "Le contact sera retiré de votre liste.", "send": "Envoyer", - "sendmessage": "Envoyer message", + "sendmessage": "Envoyer message personnel", "type_blocked": "Bloqué", "type_offline": "Hors ligne", "type_online": "En ligne", diff --git a/www/addons/messages/lang/he.json b/www/addons/messages/lang/he.json index 99fc18ee0ff..9cc287e1b26 100644 --- a/www/addons/messages/lang/he.json +++ b/www/addons/messages/lang/he.json @@ -10,17 +10,17 @@ "errorwhileretrievingcontacts": "שגיאה בזמן טעינת אנשי קשר מהשרת.", "errorwhileretrievingdiscussions": "שגיאה בזמן טעינת הדיונים מהשרת.", "errorwhileretrievingmessages": "שגיאה בזמן טעינת המסרים מהשרת.", - "message": "גוף ההודעה", + "message": "הודעה", "messagenotsent": "מסר זה לא נשלח, אנא נסה שוב מאוחר יותר.", "messagepreferences": "העדפות מסרים", - "messages": "הודעות", + "messages": "מסרים", "mustbeonlinetosendmessages": "עליך להיות מחובר/ת בכדי לשלוח מסר.", - "newmessage": "מסר חדש...", - "nomessages": "אין מסרים.", - "nousersfound": "לא נמצאו משתמשים", + "newmessage": "הודעה חדשה", + "nomessages": "אין הודעות עדיין", + "nousersfound": "לתשומת-לב", "removecontact": "הסרת איש הקשר", - "send": "שליחה", - "sendmessage": "שליחת הודעה", + "send": "לשלוח", + "sendmessage": "שליחת מסר", "type_blocked": "חסומים", "type_offline": "לא מחוברים", "type_online": "מחוברים", diff --git a/www/addons/messages/lang/hu.json b/www/addons/messages/lang/hu.json index 324fe26fe60..af6e18a3d8a 100644 --- a/www/addons/messages/lang/hu.json +++ b/www/addons/messages/lang/hu.json @@ -7,14 +7,14 @@ "contacts": "Kapcsolatok", "deletemessage": "Üzenet törlése", "deletemessageconfirmation": "Biztosan törli az üzenetet? Az csak a korábbi üzeneteiből törlődik, az azt küldő vagy fogadó fél továbbra is láthatja.", - "message": "Üzenet törzsszövege", + "message": "Üzenet", "messagepreferences": "Üzenet beállításai", "messages": "Üzenetek", "newmessage": "Új üzenet", - "nomessages": "Még nincs üzenet", + "nomessages": "Nincs üzenet.", "nousersfound": "Nincs felhasználó", "removecontact": "Kapcsolat törlése", - "send": "Elküld", + "send": "küldés", "sendmessage": "Üzenet küldése", "unblockcontact": "Kapcsolat zárolásának feloldása" } \ No newline at end of file diff --git a/www/addons/messages/lang/it.json b/www/addons/messages/lang/it.json index 0762bb1d877..6acc19d9b7d 100644 --- a/www/addons/messages/lang/it.json +++ b/www/addons/messages/lang/it.json @@ -11,16 +11,16 @@ "errorwhileretrievingcontacts": "Si è verificato un errore durante la ricezione dei contatti dal server.", "errorwhileretrievingdiscussions": "Si è verificato un errore durante la ricezione delle discussioni dal server.", "errorwhileretrievingmessages": "Si è verificato un errore durante la ricezione dei messaggi dal server.", - "message": "Corpo del messaggio", + "message": "Messaggio", "messagenotsent": "Il messaggio non è stato inviato, per favore riprova più tardi.", "messagepreferences": "Preferenze messaggi", "messages": "Messaggi", "mustbeonlinetosendmessages": "Per inviare messaggi devi essere online", - "newmessage": "Nuovo messaggio...", - "nomessages": "Non ci sono messaggi.", - "nousersfound": "Non sono stati trovati utenti", + "newmessage": "Nuovo messaggio", + "nomessages": "Non ci sono ancora messaggi", + "nousersfound": "Non trovato alcun utente", "removecontact": "Cancella contatti", - "send": "invia", + "send": "Invia", "sendmessage": "Invia messaggio", "type_blocked": "Bloccato", "type_offline": "Offline", diff --git a/www/addons/messages/lang/ja.json b/www/addons/messages/lang/ja.json index ea482d4418d..da389c600e2 100644 --- a/www/addons/messages/lang/ja.json +++ b/www/addons/messages/lang/ja.json @@ -13,15 +13,15 @@ "errorwhileretrievingdiscussions": "サーバからディスカッションを受信中にエラーが発生しました。", "errorwhileretrievingmessages": "サーバからメッセージを受信中にエラーが発生しました。", "loadpreviousmessages": "以前のメッセージを読み込み", - "message": "メッセージ本文", + "message": "メッセージ", "messagenotsent": "メッセージは送信されませんでした。後で再び試みてください。", "messagepreferences": "メッセージプリファレンス", "messages": "メッセージ", "mustbeonlinetosendmessages": "メッセージを送信するにはオンラインでなければなりません。", - "newmessage": "新規メッセージ...", + "newmessage": "新しいメッセージ", "newmessages": "新規メッセージ...", - "nomessages": "メッセージがありません。", - "nousersfound": "ユーザが見つかりません", + "nomessages": "メッセージはありません。", + "nousersfound": "ユーザは見つかりませんでした。", "removecontact": "コンタクトから削除する", "removecontactconfirm": "連絡先はあなたの連絡先リストから削除されます。", "send": "送信", diff --git a/www/addons/messages/lang/lt.json b/www/addons/messages/lang/lt.json index f63f91053b9..ba0d4980bbf 100644 --- a/www/addons/messages/lang/lt.json +++ b/www/addons/messages/lang/lt.json @@ -9,16 +9,16 @@ "errorwhileretrievingcontacts": "Klaida nuskaitant kontaktus iš serverio.", "errorwhileretrievingdiscussions": "Klaida nuskaitant diskusijas iš serverio.", "errorwhileretrievingmessages": "Klaida nuskaitant pranešimus iš serverio.", - "message": "Pranešimo tekstas", + "message": "Žinutės tekstas", "messagenotsent": "Žinutė nebuvo išsiųsta, pabandykite vėliau.", "messagepreferences": "Žinučių nuostatos", "messages": "Žinutės", "mustbeonlinetosendmessages": "Norėdamas išsiųsti žinutę, turite prisijungti", - "newmessage": "Nauja žinutė...", - "nomessages": "Žinučių nėra.", - "nousersfound": "Vartotojas nerastas", + "newmessage": "Nauja žinutė", + "nomessages": "Žinučių dar nėra", + "nousersfound": "Nerasta naudotojų", "removecontact": "Pašalinti kontaktą", - "send": "siųsti", + "send": "Siųsti", "sendmessage": "Siųsti žinutę", "type_blocked": "Užblokuota", "type_offline": "Neprisjungęs", diff --git a/www/addons/messages/lang/nl.json b/www/addons/messages/lang/nl.json index c0cb0d61bb3..36315f2cc2e 100644 --- a/www/addons/messages/lang/nl.json +++ b/www/addons/messages/lang/nl.json @@ -13,18 +13,18 @@ "errorwhileretrievingdiscussions": "Fout bij het ophalen van discussies van de server.", "errorwhileretrievingmessages": "Fout bij het ophalen van berichten van de server.", "loadpreviousmessages": "Laad vorige berichten", - "message": "Berichtinhoud", + "message": "Bericht", "messagenotsent": "Het bericht is niet verzonden. Probeer het later opnieuw.", "messagepreferences": "Berichten voorkeuren", "messages": "Berichten", "mustbeonlinetosendmessages": "Je moet online zijn om berichten te versturen", - "newmessage": "Nieuw bericht...", + "newmessage": "Nieuw bericht", "newmessages": "Nieuwe berichten", - "nomessages": "Geen berichten.", + "nomessages": "Nog geen berichten", "nousersfound": "Geen gebruikers gevonden", "removecontact": "Verwijder contactpersoon", "removecontactconfirm": "Contact zal verwijderd worden van je contactenlijst.", - "send": "Stuur", + "send": "stuur", "sendmessage": "Stuur bericht", "type_blocked": "Geblokkeerd", "type_offline": "Offline", diff --git a/www/addons/messages/lang/pl.json b/www/addons/messages/lang/pl.json index a0b20dc95eb..6cb4279d4f9 100644 --- a/www/addons/messages/lang/pl.json +++ b/www/addons/messages/lang/pl.json @@ -7,14 +7,14 @@ "contacts": "Kontakty", "deletemessage": "Usuń wiadomość", "deletemessageconfirmation": "Czy jesteś pewien, że chcesz usunąć tę wiadomość? Zostanie ona usunięta wyłącznie z twojej historii wiadomości, użytkownik który ją wysłał lub odebrał nadal będzie mógł ją wyświetlić.", - "message": "Treść wiadomości", + "message": "Wiadomość", "messagepreferences": "Preferencje wiadomości", "messages": "Wiadomości", "newmessage": "Nowa wiadomość", - "nomessages": "Brak wiadomości", + "nomessages": "Brak oczekujących wiadomości", "nousersfound": "Nie znaleziono użytkowników", "removecontact": "Usuń kontakt", - "send": "wyślij", + "send": "Wyślij", "sendmessage": "Wyślij wiadomość", "unblockcontact": "Odblokuj kontakt" } \ No newline at end of file diff --git a/www/addons/messages/lang/pt-br.json b/www/addons/messages/lang/pt-br.json index b7c9da7e6a9..54c1e1b6e2c 100644 --- a/www/addons/messages/lang/pt-br.json +++ b/www/addons/messages/lang/pt-br.json @@ -13,17 +13,18 @@ "errorwhileretrievingdiscussions": "Erro ao recuperar discussão do servidor.", "errorwhileretrievingmessages": "Erro ao recuperar as mensagens do servidor.", "loadpreviousmessages": "Carregar mensagens anteriores", - "message": "Corpo da mensagem", + "message": "Mensagem", "messagenotsent": "A mensagem não foi enviada. Por favor tente novamente mais tarde.", + "messagepreferences": "Preferências de mensagens", "messages": "Mensagens", "mustbeonlinetosendmessages": "Você precisa estar conectado para enviar mensagens.", - "newmessage": "Nova mensagem...", + "newmessage": "Nova Mensagem", "newmessages": "Novas mensagens", - "nomessages": "Não há mensagens.", + "nomessages": "Nenhuma mensagem ainda", "nousersfound": "Nenhum usuário encontrado", "removecontact": "Eliminar contato", "removecontactconfirm": "O contato será removido da sua lista de contatos.", - "send": "enviar", + "send": "Enviar", "sendmessage": "Enviar mensagem", "type_blocked": "Bloqueado", "type_offline": "Offline", diff --git a/www/addons/messages/lang/pt.json b/www/addons/messages/lang/pt.json index b9ae68508bd..0e8975e0f49 100644 --- a/www/addons/messages/lang/pt.json +++ b/www/addons/messages/lang/pt.json @@ -13,14 +13,14 @@ "errorwhileretrievingdiscussions": "Erro ao obter os tópicos de discussão do servidor.", "errorwhileretrievingmessages": "Erro ao obter as mensagens do servidor.", "loadpreviousmessages": "Carregar mensagens antigas", - "message": "Corpo da mensagem", + "message": "Mensagem", "messagenotsent": "A mensagem não foi enviada. Por favor, tente novamente mais tarde.", "messagepreferences": "Preferências das mensagens", "messages": "Mensagens", "mustbeonlinetosendmessages": "Precisa de estar online para enviar mensagens", - "newmessage": "Nova mensagem...", + "newmessage": "Nova mensagem", "newmessages": "Novas mensagens", - "nomessages": "Sem mensagens.", + "nomessages": "Ainda não há mensagens", "nousersfound": "Nenhum utilizador encontrado", "removecontact": "Remover contacto", "removecontactconfirm": "O contacto será removido da sua lista de contactos.", diff --git a/www/addons/messages/lang/ro.json b/www/addons/messages/lang/ro.json index b519bbf378f..1ee83c12782 100644 --- a/www/addons/messages/lang/ro.json +++ b/www/addons/messages/lang/ro.json @@ -11,15 +11,15 @@ "errorwhileretrievingcontacts": "A apărut o eroare în găsirea contactelor pe server.", "errorwhileretrievingdiscussions": "A apărut o eroare în găsirea conversațiilor de pe server.", "errorwhileretrievingmessages": "A apărut o eroare în găsirea mesajelor de pe server.", - "message": "Conținut mesaj", + "message": "Mesaj", "messagenotsent": "Mesajul nu a fost expediat, vă rugăm să încercați mai târziu.", "messages": "Mesaje", "mustbeonlinetosendmessages": "Trebuie să fiți online pentru a putea trimite mesaje", "newmessage": "Mesaj nou!", - "nomessages": "Nu aveți mesaje.", - "nousersfound": "Nu au fost găsiți utilizatori", + "nomessages": "Nu a fost trimis încă niciun mesaj", + "nousersfound": "Nu s-au găsit utilizatori", "removecontact": "Şterge prieten din listă", - "send": "Trimis", + "send": "trimis", "sendmessage": "Trimite mesaj", "type_blocked": "Blocat", "type_offline": "Deconectat", diff --git a/www/addons/messages/lang/ru.json b/www/addons/messages/lang/ru.json index be656eda0df..37c1774bd10 100644 --- a/www/addons/messages/lang/ru.json +++ b/www/addons/messages/lang/ru.json @@ -11,14 +11,14 @@ "errorwhileretrievingdiscussions": "Ошибка при получении обсуждения с сервера.", "errorwhileretrievingmessages": "Ошибка при получении сообщения с сервера", "loadpreviousmessages": "Загрузить предыдущее сообщение", - "message": "Текст сообщения", + "message": "Сообщение", "messagenotsent": "Сообщение не было отправлено. Повторите попытку позже.", "messagepreferences": "Настройки сообщений", "messages": "Сообщения", "mustbeonlinetosendmessages": "Вы должны быть на сайте, чтобы отправлять сообщения", - "newmessage": "Новое сообщение...", + "newmessage": "Новое сообщение", "newmessages": "Новые сообщения", - "nomessages": "Нет сообщений", + "nomessages": "Нет ни одного сообщения", "nousersfound": "Пользователи не найдены", "removecontact": "Удалить собеседника из моего списка", "send": "Отправить", diff --git a/www/addons/messages/lang/sr-cr.json b/www/addons/messages/lang/sr-cr.json index e03e4624361..fdd16352919 100644 --- a/www/addons/messages/lang/sr-cr.json +++ b/www/addons/messages/lang/sr-cr.json @@ -1,23 +1,34 @@ { + "addcontact": "Додај контакт", + "blockcontact": "Блокирај контакт", "blockcontactconfirm": "Нећете више добијати поруке од ове особе.", + "blocknoncontacts": "Блокирај све нове поруке од корисника који нису на мојој листи контаката", "contactlistempty": "Листа контаката је празна", "contactname": "Име особе", + "contacts": "Контакти", "errordeletemessage": "Грешка приликом брисања поруке.", "errorwhileretrievingcontacts": "Грешка приликом преузимања контаката са сервера.", "errorwhileretrievingdiscussions": "Грешка приликом преузимања дискусија са сервера.", "errorwhileretrievingmessages": "Грешка приликом преузимања порука са сервера.", "loadpreviousmessages": "Учитај претходне поруке", + "message": "Тело поруке", "messagenotsent": "Порука није послата. Молимо, покушајте поново касније.", + "messagepreferences": "Параметри порука", + "messages": "Поруке", "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке", - "newmessage": "Нове поруке...", + "newmessage": "Нова порука", "newmessages": "Нове поруке", - "nomessages": "Нема порука.", + "nomessages": "Још нема порука", "nousersfound": "Није пронађен ниједан корисник", + "removecontact": "Обриши контакт", "removecontactconfirm": "Особа ће бити уклоњена са ваше листе контаката.", + "send": "Пошаљи", + "sendmessage": "Пошаљи поруку", "type_blocked": "Блокиран", "type_offline": "Офлајн", "type_online": "Онлајн", "type_search": "Резултати претраге", "type_strangers": "Други", + "unblockcontact": "Одблокирај контакт", "warningmessagenotsent": "Није могуће послати поруку/е кориснику {{user}}. {{error}}" } \ No newline at end of file diff --git a/www/addons/messages/lang/sr-lt.json b/www/addons/messages/lang/sr-lt.json index 305b0160956..a5c218640e8 100644 --- a/www/addons/messages/lang/sr-lt.json +++ b/www/addons/messages/lang/sr-lt.json @@ -1,23 +1,34 @@ { + "addcontact": "Dodaj kontakt", + "blockcontact": "Blokiraj kontakt", "blockcontactconfirm": "Nećete više dobijati poruke od ove osobe.", + "blocknoncontacts": "Blokiraj sve nove poruke od korisnika koji nisu na mojoj listi kontakata", "contactlistempty": "Lista kontakata je prazna", "contactname": "Ime osobe", + "contacts": "Kontakti", "errordeletemessage": "Greška prilikom brisanja poruke.", "errorwhileretrievingcontacts": "Greška prilikom preuzimanja kontakata sa servera.", "errorwhileretrievingdiscussions": "Greška prilikom preuzimanja diskusija sa servera.", "errorwhileretrievingmessages": "Greška prilikom preuzimanja poruka sa servera.", "loadpreviousmessages": "Učitaj prethodne poruke", + "message": "Telo poruke", "messagenotsent": "Poruka nije poslata. Molimo, pokušajte ponovo kasnije.", + "messagepreferences": "Parametri poruka", + "messages": "Poruke", "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke", - "newmessage": "Nove poruke...", + "newmessage": "Nova poruka", "newmessages": "Nove poruke", - "nomessages": "Nema poruka.", + "nomessages": "Još nema poruka", "nousersfound": "Nije pronađen nijedan korisnik", + "removecontact": "Obriši kontakt", "removecontactconfirm": "Osoba će biti uklonjena sa vaše liste kontakata.", + "send": "Pošalji", + "sendmessage": "Pošalji poruku", "type_blocked": "Blokiran", "type_offline": "Oflajn", "type_online": "Onlajn", "type_search": "Rezultati pretrage", "type_strangers": "Drugi", + "unblockcontact": "Odblokiraj kontakt", "warningmessagenotsent": "Nije moguće poslati poruku/e korisniku {{user}}. {{error}}" } \ No newline at end of file diff --git a/www/addons/messages/lang/sv.json b/www/addons/messages/lang/sv.json index 301b34c89a3..6a623453331 100644 --- a/www/addons/messages/lang/sv.json +++ b/www/addons/messages/lang/sv.json @@ -11,15 +11,16 @@ "errorwhileretrievingcontacts": "Fel vid hämtning av kontakter från servern.", "errorwhileretrievingdiscussions": "Fel vid hämtning av diskussionerna från servern.", "errorwhileretrievingmessages": "Fel vid hämtning meddelanden från servern.", - "message": "Meddelandets brödtext", + "message": "Meddelande", "messagenotsent": "Meddelandet skickades inte, försök igen senare.", + "messagepreferences": "Välj inställningar för meddelanden", "messages": "Meddelanden", "mustbeonlinetosendmessages": "Du måste vara online för att skicka meddelanden", - "newmessage": "Ny meddelande...", - "nomessages": "Inga meddelanden", - "nousersfound": "Inga användare hittades", + "newmessage": "Nytt meddelande", + "nomessages": "Inga meddelanden än", + "nousersfound": "Det gick inte att hitta några användare", "removecontact": "Ta bort kontakt", - "send": "skicka", + "send": "Skicka", "sendmessage": "Skicka meddelande", "type_blocked": "blockerad", "type_offline": "Offline", diff --git a/www/addons/messages/lang/tr.json b/www/addons/messages/lang/tr.json index 72ef991ede5..38d1a3b1e77 100644 --- a/www/addons/messages/lang/tr.json +++ b/www/addons/messages/lang/tr.json @@ -5,11 +5,11 @@ "contactlistempty": "Kişi listeniz şu anda boş", "contactname": "Adı", "contacts": "Kişiler", - "message": "Mesaj gövdesi", + "message": "Mesaj", "messagepreferences": "İleti tercihleri", "messages": "Mesajlar", "newmessage": "Yeni ileti", - "nomessages": "İleti yok.", + "nomessages": "Henüz mesaj yok", "nousersfound": "Kullanıcı bulunamadı", "removecontact": "Kişiyi sil", "send": "Gönder", diff --git a/www/addons/messages/lang/uk.json b/www/addons/messages/lang/uk.json index 6fab9eec6d8..12fc1146ab9 100644 --- a/www/addons/messages/lang/uk.json +++ b/www/addons/messages/lang/uk.json @@ -11,17 +11,17 @@ "errorwhileretrievingdiscussions": "Помилка при отриманні обговорення з сервера.", "errorwhileretrievingmessages": "Помилка при отриманні повідомлень від сервера.", "loadpreviousmessages": "Завантаження попередніх повідомлень", - "message": "Текст повідомлення", + "message": "Повідомлення", "messagenotsent": "Повідомлення не було відправлено, будь ласка, спробуйте ще раз пізніше.", "messages": "Повідомлення", "mustbeonlinetosendmessages": "Ви повинні бути онлайн, щоб відправляти повідомлення", "newmessage": "Нове повідомлення...", "newmessages": "Нові повідомлення", - "nomessages": "Повідомлення відсутні.", + "nomessages": "Ще немає повідомлень", "nousersfound": "Користувачів не знайдено", "removecontact": "Видалити контакт", "removecontactconfirm": "Контакт буде видалено зі списку контактів.", - "send": "Відіслати", + "send": "надіслати", "sendmessage": "Надіслати повідомлення", "type_blocked": "Заблоковано", "type_offline": "Офлайн", diff --git a/www/addons/messages/lang/zh-cn.json b/www/addons/messages/lang/zh-cn.json index 38ed871a73d..fa7d759934b 100644 --- a/www/addons/messages/lang/zh-cn.json +++ b/www/addons/messages/lang/zh-cn.json @@ -6,12 +6,12 @@ "contactname": "联系人", "contacts": "联系人", "deletemessage": "删除消息", - "message": "内容", + "message": "正文", "messages": "消息", - "nomessages": "无消息", + "nomessages": "没有新消息", "nousersfound": "未找到用户", "removecontact": "删除联系人", "send": "发送", - "sendmessage": "发消息", + "sendmessage": "发送消息", "unblockcontact": "不再阻拦联系人" } \ No newline at end of file diff --git a/www/addons/messages/lang/zh-tw.json b/www/addons/messages/lang/zh-tw.json index 34693107bc7..de4e6fccf0f 100644 --- a/www/addons/messages/lang/zh-tw.json +++ b/www/addons/messages/lang/zh-tw.json @@ -11,17 +11,17 @@ "errorwhileretrievingcontacts": "從伺服器存取聯絡人時出錯", "errorwhileretrievingdiscussions": "從伺服器存取討論區時出錯", "errorwhileretrievingmessages": "從伺服器存取訊息時出錯", - "message": "訊息主文", + "message": "訊息", "messagenotsent": "訊息未發送, 請稍後再試.", "messagepreferences": "簡訊偏好", - "messages": "訊息", + "messages": "簡訊", "mustbeonlinetosendmessages": "您必須上線才能發送訊息", - "newmessage": "新訊息...", - "nomessages": "沒有任何訊息.", - "nousersfound": "沒有使用者", + "newmessage": "新簡訊", + "nomessages": "尚無訊息", + "nousersfound": "找不到用戶", "removecontact": "刪除聯絡人", - "send": "傳送", - "sendmessage": "寄送訊息", + "send": "送出", + "sendmessage": "傳送簡訊", "type_blocked": "已停止", "type_offline": "離線", "type_online": "上線", diff --git a/www/addons/mod/assign/lang/ca.json b/www/addons/mod/assign/lang/ca.json index 9d246a7ff12..065ff663e07 100644 --- a/www/addons/mod/assign/lang/ca.json +++ b/www/addons/mod/assign/lang/ca.json @@ -32,7 +32,7 @@ "errorshowinginformation": "No es pot mostrar la informació de la tramesa", "extensionduedate": "Data de venciment de la pròrroga", "feedbacknotsupported": "Aquesta retroacció no està admesa per l'aplicació i podria no contenir tota la informació", - "grade": "Qualifica", + "grade": "Qualificació", "graded": "Qualificada", "gradedby": "Qualificat per", "gradedon": "Qualificat el", diff --git a/www/addons/mod/assign/lang/de.json b/www/addons/mod/assign/lang/de.json index 802d7887f82..02ebc2a9649 100644 --- a/www/addons/mod/assign/lang/de.json +++ b/www/addons/mod/assign/lang/de.json @@ -32,7 +32,7 @@ "errorshowinginformation": "Die Abgabeinformationen können nicht angezeigt werden.", "extensionduedate": "Verlängerung des Fälligkeitsdatums", "feedbacknotsupported": "Dieses Feedback wird von der App nicht unterstützt und könnte möglicherweise Informationen unvollständig enthalten.", - "grade": "Relative Bewertung", + "grade": "Bewertung", "graded": "Bewertet", "gradedby": "Bewertet von", "gradedon": "Bewertet am", diff --git a/www/addons/mod/assign/lang/el.json b/www/addons/mod/assign/lang/el.json index 0303c8b0932..f05910d0dc3 100644 --- a/www/addons/mod/assign/lang/el.json +++ b/www/addons/mod/assign/lang/el.json @@ -34,6 +34,7 @@ "latesubmissions": "Εκπρόθεσμες υποβολές", "noattempt": "Καμία προσπάθεια", "nomoresubmissionsaccepted": "Επιτρέπονται μόνο στους συμμετέχοντες που τους έχει χορηγηθεί παράταση", + "noonlinesubmissions": "Δεν απαιτείται κάποια υποβολή", "nosubmission": "Δεν έχει υποβληθεί τίποτα για την εργασία αυτή", "notallparticipantsareshown": "Συμμετέχοντες χωρίς υποβολές δεν προβάλλονται", "notgraded": "Χωρίς βαθμό", diff --git a/www/addons/mod/assign/lang/eu.json b/www/addons/mod/assign/lang/eu.json index 1b62e71067f..c5b7f53de20 100644 --- a/www/addons/mod/assign/lang/eu.json +++ b/www/addons/mod/assign/lang/eu.json @@ -32,7 +32,7 @@ "errorshowinginformation": "Ezin dugu bidalketaren informazioa erakutsi", "extensionduedate": "Luzapenaren entregatze-data", "feedbacknotsupported": "Feedback hau ez da onartzen app-an eta baliteke informazio guztia jasota ez egotea.", - "grade": "Nota", + "grade": "Kalifikazioa", "graded": "Kalifikatua", "gradedby": "Nork kalifikatua", "gradedon": "Noiz kalifikatua", diff --git a/www/addons/mod/assign/lang/fr.json b/www/addons/mod/assign/lang/fr.json index a381dffff5a..19cfc56bcaf 100644 --- a/www/addons/mod/assign/lang/fr.json +++ b/www/addons/mod/assign/lang/fr.json @@ -57,7 +57,7 @@ "nosubmission": "Rien n'a été déposé pour ce devoir", "notallparticipantsareshown": "Les participants sans travail remis ne sont pas affichés", "noteam": "Membre d'aucun groupe", - "notgraded": "Pas évalué", + "notgraded": "Non évalué", "numberofdraftsubmissions": "Brouillons", "numberofparticipants": "Participants", "numberofsubmissionsneedgrading": "Nécessitant évaluation", @@ -76,10 +76,10 @@ "submissionstatus_": "Pas de travail remis", "submissionstatus_draft": "Brouillon (non remis)", "submissionstatus_marked": "Noté", - "submissionstatus_new": "Aucun travail remis", + "submissionstatus_new": "Non remis", "submissionstatus_reopened": "Rouvert", "submissionstatus_submitted": "Remis pour évaluation", - "submissionstatusheading": "État du travail remis", + "submissionstatusheading": "Statut de remise", "submissionteam": "Groupe", "submitassignment": "Envoyer le devoir", "submitassignment_help": "Une fois ce devoir envoyé, vous ne pourrez plus y effectuer de modification.", diff --git a/www/addons/mod/assign/lang/he.json b/www/addons/mod/assign/lang/he.json index 634624ece1e..05f4ea2748c 100644 --- a/www/addons/mod/assign/lang/he.json +++ b/www/addons/mod/assign/lang/he.json @@ -25,7 +25,7 @@ "editingstatus": "מצב עריכה", "editsubmission": "עריכת ההגשה", "extensionduedate": "הארכת מועד הגשה", - "grade": "ציונים", + "grade": "ציון", "graded": "נבדק", "gradedby": "נבדק על-ידי", "gradedon": "הציון ניתן על", diff --git a/www/addons/mod/assign/lang/it.json b/www/addons/mod/assign/lang/it.json index efc338d796b..bfcebef051d 100644 --- a/www/addons/mod/assign/lang/it.json +++ b/www/addons/mod/assign/lang/it.json @@ -25,7 +25,7 @@ "editingstatus": "Possibilità di modifica", "editsubmission": "Modifica consegna", "extensionduedate": "Data scadenza proroga", - "grade": "Punteggio", + "grade": "Valutazione", "graded": "Valutata", "gradedby": "Valutatore", "gradedon": "Data di valutazione", diff --git a/www/addons/mod/assign/lang/ja.json b/www/addons/mod/assign/lang/ja.json index 7d36b430584..4837351e4cc 100644 --- a/www/addons/mod/assign/lang/ja.json +++ b/www/addons/mod/assign/lang/ja.json @@ -32,7 +32,7 @@ "errorshowinginformation": "提出物の情報を表示できません。", "extensionduedate": "延長提出期限", "feedbacknotsupported": "このフィードバックはアプリでは未サポートのため、すべての情報が含まれていない可能性があります", - "grade": "評点", + "grade": "評定", "graded": "評定済み", "gradedby": "評定者", "gradedon": "評定日時", diff --git a/www/addons/mod/assign/lang/nl.json b/www/addons/mod/assign/lang/nl.json index cb58014537a..6148bf53066 100644 --- a/www/addons/mod/assign/lang/nl.json +++ b/www/addons/mod/assign/lang/nl.json @@ -32,7 +32,7 @@ "errorshowinginformation": "We kunnen de instuurinformatie niet tonen", "extensionduedate": "Extra tijd einddatum", "feedbacknotsupported": "Deze feedback wordt niet ondersteund door de app en het is mogelijk dat de informatie onvolledig is", - "grade": "Cijfer", + "grade": "Beoordeling", "graded": "Beoordeeld", "gradedby": "Beoordeeld door", "gradedon": "Beoordeeld op", diff --git a/www/addons/mod/assign/lang/pt-br.json b/www/addons/mod/assign/lang/pt-br.json index 1b62b585379..f88df961a39 100644 --- a/www/addons/mod/assign/lang/pt-br.json +++ b/www/addons/mod/assign/lang/pt-br.json @@ -32,7 +32,7 @@ "errorshowinginformation": "Nós não podemos exibir as informações do envio", "extensionduedate": "Extensão do prazo de entrega", "feedbacknotsupported": "Esse feedback não é suportado pelo aplicativo e pode não conter todas as informações", - "grade": "Avaliação", + "grade": "Nota", "graded": "Avaliado", "gradedby": "Avaliado por", "gradedon": "Avaliado em", @@ -42,7 +42,7 @@ "groupsubmissionsettings": "Configurações de envio em grupo", "hiddenuser": "Participante", "latesubmissions": "Submissões atrasadas", - "latesubmissionsaccepted": "Somente estudante(s) contemplados com uma extensão ainda poderá(ão) enviar a tarefa", + "latesubmissionsaccepted": "Permitido até {{$a}}", "markingworkflowstate": "Estado do fluxo de avaliação", "markingworkflowstateinmarking": "Em avaliação", "markingworkflowstateinreview": "Em revisão", @@ -50,7 +50,7 @@ "markingworkflowstatereadyforrelease": "Pronto para publicação", "markingworkflowstatereadyforreview": "Avaliação concluída", "markingworkflowstatereleased": "Publicado", - "multipleteams": "Você é membro de vários grupos, entre em contato com o seu professor.", + "multipleteams": "Membro de mais de um grupo", "noattempt": "Nenhuma tentativa", "nomoresubmissionsaccepted": "Só é permitido para os participantes que tenham beneficiado de uma extensão", "noonlinesubmissions": "Esta tarefa não requer o envio online", diff --git a/www/addons/mod/assign/lang/pt.json b/www/addons/mod/assign/lang/pt.json index e2242d63f5e..f94e6cbb858 100644 --- a/www/addons/mod/assign/lang/pt.json +++ b/www/addons/mod/assign/lang/pt.json @@ -32,14 +32,14 @@ "errorshowinginformation": "Não é possível mostrar a informação da submissão", "extensionduedate": "Prolongamento da data limite", "feedbacknotsupported": "Este feedback não é suportado pela aplicação e pode não conter toda a informação", - "grade": "Avaliação", + "grade": "Nota", "graded": "Avaliado", "gradedby": "Avaliado por", "gradedon": "Avaliado em", "gradenotsynced": "Nota não está sincronizada", "gradeoutof": "Nota (de 0 a {{$a}})", "gradingstatus": "Estado da avaliação", - "groupsubmissionsettings": "Configurações das submissões de grupo", + "groupsubmissionsettings": "Configurações das submissões em grupo", "hiddenuser": "Participante", "latesubmissions": "Submissões com atraso", "latesubmissionsaccepted": "Disponível até {{$a}}", diff --git a/www/addons/mod/assign/lang/ro.json b/www/addons/mod/assign/lang/ro.json index 00faa4cbbda..9e5786fe879 100644 --- a/www/addons/mod/assign/lang/ro.json +++ b/www/addons/mod/assign/lang/ro.json @@ -20,7 +20,7 @@ "editingstatus": "Se editează statusul", "editsubmission": "Editare temă trimisă", "extensionduedate": "Termen de predare extins", - "grade": "Notează", + "grade": "Notă", "graded": "Notat", "gradedby": "Notat de", "gradedon": "Notat în data de", diff --git a/www/addons/mod/assign/lang/sr-cr.json b/www/addons/mod/assign/lang/sr-cr.json index 653fd72673d..3d0bf618245 100644 --- a/www/addons/mod/assign/lang/sr-cr.json +++ b/www/addons/mod/assign/lang/sr-cr.json @@ -1,15 +1,97 @@ { "acceptsubmissionstatement": "Молимо вас да прихватите изјаву о предаји рада.", + "addattempt": "Дозволи други покушај", + "addnewattempt": "Додај нови покушај", + "addnewattemptfromprevious": "Додај нови покушај на основу претходно предатог рада", + "addsubmission": "Додај рад", + "allowsubmissionsanddescriptionfromdatesummary": "Детаљније информације о задатку и образац за предају радова биће доступни од {{$a}}", + "allowsubmissionsfromdate": "Дозволи предају од", + "allowsubmissionsfromdatesummary": "Овај задатак ће прихватити предају рада од {{$a}}", + "applytoteam": "Примените оцене и повратне информације на целу групу", + "assignmentisdue": "Крајњи рок за предају је истекао", + "attemptnumber": "Број покушаја", + "attemptreopenmethod": "Поновно отварање рада", + "attemptreopenmethod_manual": "Ручно", + "attemptreopenmethod_untilpass": "Аутоматски док не добије прелазну оцену", + "attemptsettings": "Подешавања покушаја", "cannoteditduetostatementsubmission": "Не можете да додате или мењате рад у апликацији јер нисмо могли да преузмемо са сајта изјаву о предаји рада.", "cannotgradefromapp": "Апликације још увек не подржава неке методе оцењивања и оне не могу да се мењају.", "cannotsubmitduetostatementsubmission": "Не можете да предате рад на оцењивање у апликацији јер нисмо могли да преузмемо са сајта изјаву о предаји рада.", + "confirmsubmission": "Да ли сте сигурни да желите да предате свој рад на оцењивање? Више нећете моћи да га мењате.", + "currentattempt": "Ово је покушај {{$a}}.", + "currentattemptof": "Ово је покушај {{$a.attemptnumber}} ( {{$a.maxattempts}} дозвољена/их покушаја ).", + "currentgrade": "Тренутна оцена у књизи оцена", + "cutoffdate": "Дефинитивни рок", + "defaultteam": "Подразумевана група", + "duedate": "Крајњи рок", + "duedateno": "Нема крајњег рока", + "duedatereached": "Крајњи рок за овај задатак је сада истекао", + "editingstatus": "Статус уређивања", + "editsubmission": "Уреди рад", "erroreditpluginsnotsupported": "Не можете да додате или мењате рад у апликацији јер неки додаци немају подршку за уређивање:", "errorshowinginformation": "Не можемо да прикажемо информације о предатом раду", + "extensionduedate": "Продужени рок", "feedbacknotsupported": "Аплликација не подржава ову повратну информацију. Могуће је да она не садржи све информације.", + "grade": "Оцена", + "graded": "Оцењено", + "gradedby": "Оценио/ла", + "gradedon": "Оцењено", "gradenotsynced": "Оцена није синхронизована", + "gradeoutof": "Оцена од {{$a}}", + "gradingstatus": "Статус оцењивања", + "groupsubmissionsettings": "Подешавања за групну предају рада", + "hiddenuser": "Учесник", + "latesubmissions": "Касно предати радови", + "latesubmissionsaccepted": "Дозвољено до {{$a}}", + "markingworkflowstate": "Стање тока оцењивања", + "markingworkflowstateinmarking": "Оцењује се", + "markingworkflowstateinreview": "На прегледу", + "markingworkflowstatenotmarked": "Није оцењено", + "markingworkflowstatereadyforrelease": "Спремно за објаву", + "markingworkflowstatereadyforreview": "Оцењивање завршено", + "markingworkflowstatereleased": "Објављено", + "multipleteams": "Члан више од једне групе", + "noattempt": "Нема покушаја", + "nomoresubmissionsaccepted": "Дозвољено само полазницима којима је одобрен продужетак", + "noonlinesubmissions": "Овај задатак не тражи од вас да било штa предате онлајн", + "nosubmission": "За овај задатак још ништа није предато", "notallparticipantsareshown": "Учесници који нису предали рад се не приказују", + "noteam": "Није члан ниједне групе.", + "notgraded": "Није оцењено", + "numberofdraftsubmissions": "Нацрти", + "numberofparticipants": "Учесници", + "numberofsubmissionsneedgrading": "Тражи оцењивање", + "numberofsubmittedassignments": "Предато", + "numberofteams": "Групе", + "numwords": "{{$a}} реч(и)", + "outof": "{{$a.current}} од {{$a.total}}", + "overdue": "Крајњи рок за предају рада је истекао пре: {{$a}}", + "savechanges": "Сачувај промене", + "submission": "Предати рад", + "submissioneditable": "Полазници могу да уређују овај задатак", + "submissionnoteditable": "Полазници не могу да уређују овај задатак", "submissionnotsupported": "Апликација не подржава овај предати рад. Могуће је да рад не садржи све информације.", + "submissionslocked": "Овај задатак не прихвата предају радова", + "submissionstatus": "Статус предатог рада", + "submissionstatus_": "Нема предатих радова", + "submissionstatus_draft": "Нацрт рада (није предато)", + "submissionstatus_marked": "Оцењено", + "submissionstatus_new": "Нови предати рад", + "submissionstatus_reopened": "Поново отворено", + "submissionstatus_submitted": "Предато за оцењивање", + "submissionstatusheading": "Статус предатог рада", + "submissionteam": "Група", + "submitassignment": "Predaj rad", + "submitassignment_help": "Оног тренутка када предате овај рад више нећете моћи да га мењате.", + "submittedearly": "Задатак је предат {{$a}} раније", + "submittedlate": "Задатак је предат {{$a}} касније", + "timemodified": "Последње измене", + "timeremaining": "Преостало време", + "ungroupedusers": "Подешавање 'Неопходна је група за предају рада' је омогућено, али неки корисници нису чланови ниједне групе, или су чланови више од једне групе, тако да не могу да предају рад.", + "unlimitedattempts": "Неограничено", + "userswhoneedtosubmit": "Корисници који треба да предају решење: {{$a}}", "userwithid": "Корисник са ID ознаком {{id}}", + "viewsubmission": "Погледај предати рад", "warningsubmissiongrademodified": "Оцена предатог рада је измењена на сајту.", "warningsubmissionmodified": "Предати рад корисника је измењен на сајту." } \ No newline at end of file diff --git a/www/addons/mod/assign/lang/sr-lt.json b/www/addons/mod/assign/lang/sr-lt.json index fc825011df5..ee08bd63383 100644 --- a/www/addons/mod/assign/lang/sr-lt.json +++ b/www/addons/mod/assign/lang/sr-lt.json @@ -1,15 +1,97 @@ { "acceptsubmissionstatement": "Molimo vas da prihvatite izjavu o predaji rada.", + "addattempt": "Dozvoli drugi pokušaj", + "addnewattempt": "Dodaj novi pokušaj", + "addnewattemptfromprevious": "Dodaj novi pokušaj na osnovu prethodno predatog rada", + "addsubmission": "Dodaj rad", + "allowsubmissionsanddescriptionfromdatesummary": "Detaljnije informacije o zadatku i obrazac za predaju radova biće dostupni od {{$a}}", + "allowsubmissionsfromdate": "Dozvoli predaju od", + "allowsubmissionsfromdatesummary": "Ovaj zadatak će prihvatiti predaju rada od {{$a}}", + "applytoteam": "Primenite ocene i povratne informacije na celu grupu", + "assignmentisdue": "Krajnji rok za predaju je istekao", + "attemptnumber": "Broj pokušaja", + "attemptreopenmethod": "Ponovno otvaranje rada", + "attemptreopenmethod_manual": "Ručno", + "attemptreopenmethod_untilpass": "Automatski dok ne dobije prelaznu ocenu", + "attemptsettings": "Podešavanja pokušaja", "cannoteditduetostatementsubmission": "Ne možete da dodate ili menjate rad u aplikaciji jer nismo mogli da preuzmemo sa sajta izjavu o predaji rada.", "cannotgradefromapp": "Aplikacije ne podržava neke metode ocenjivanja i one ne mogu da se menjaju.", "cannotsubmitduetostatementsubmission": "Ne možete da predate rad na ocenjivanje u aplikaciji jer nismo mogli da preuzmemo sa sajta izjavu o predaji rada.", + "confirmsubmission": "Da li ste sigurni da želite da predate svoj rad na ocenjivanje? Više nećete moći da ga menjate.", + "currentattempt": "Ovo je pokušaj {{$a}}.", + "currentattemptof": "Ovo je pokušaj {{$a.attemptnumber}} ( {{$a.maxattempts}} dozvoljena/ih pokušaja ).", + "currentgrade": "Trenutna ocena u knjizi ocena", + "cutoffdate": "Definitivni rok", + "defaultteam": "Podrazumevana grupa", + "duedate": "Krajnji rok", + "duedateno": "Nema krajnjeg roka", + "duedatereached": "Krajnji rok za ovaj zadatak je sada istekao", + "editingstatus": "Status uređivanja", + "editsubmission": "Uredi rad", "erroreditpluginsnotsupported": "Ne možete da dodate ili menjate rad u aplikaciji jer neki dodaci nemaju podršku za uređivanje:", "errorshowinginformation": "Ne možemo da prikažemo informacije o predatom radu", + "extensionduedate": "Produženi rok", "feedbacknotsupported": "Apllikacija ne podržava ovu povratnu informaciju. Moguće je da ona ne sadrži sve informacije.", + "grade": "Ocena", + "graded": "Ocenjeno", + "gradedby": "Ocenio/la", + "gradedon": "Ocenjeno", "gradenotsynced": "Ocena nije sinhronizovana", + "gradeoutof": "Ocena od {{$a}}", + "gradingstatus": "Status ocenjivanja", + "groupsubmissionsettings": "Podešavanja za grupnu predaju rada", + "hiddenuser": "Učesnik", + "latesubmissions": "Kasno predati radovi", + "latesubmissionsaccepted": "Dozvoljeno do {{$a}}", + "markingworkflowstate": "Stanje toka ocenjivanja", + "markingworkflowstateinmarking": "Ocenjuje se", + "markingworkflowstateinreview": "Na pregledu", + "markingworkflowstatenotmarked": "Nije ocenjeno", + "markingworkflowstatereadyforrelease": "Spremno za objavu", + "markingworkflowstatereadyforreview": "Ocenjivanje završeno", + "markingworkflowstatereleased": "Objavljeno", + "multipleteams": "Član više od jedne grupe", + "noattempt": "Nema pokušaja", + "nomoresubmissionsaccepted": "Dozvoljeno samo polaznicima kojima je odobren produžetak", + "noonlinesubmissions": "Ovaj zadatak ne traži od vas da bilo šta predate onlajn", + "nosubmission": "Za ovaj zadatak još ništa nije predato", "notallparticipantsareshown": "Učesnici koji nisu predali rad se ne prikazuju", + "noteam": "Nije član nijedne grupe.", + "notgraded": "Nije ocenjeno", + "numberofdraftsubmissions": "Nacrti", + "numberofparticipants": "Učesnici", + "numberofsubmissionsneedgrading": "Traži ocenjivanje", + "numberofsubmittedassignments": "Predato", + "numberofteams": "Grupe", + "numwords": "{{$a}} reč(i)", + "outof": "{{$a.current}} od {{$a.total}}", + "overdue": "Krajnji rok za predaju rada je istekao pre: {{$a}}", + "savechanges": "Sačuvaj promene", + "submission": "Predati rad", + "submissioneditable": "Polaznici mogu da uređuju ovaj zadatak", + "submissionnoteditable": "Polaznici ne mogu da uređuju ovaj zadatak", "submissionnotsupported": "Aplikacija ne podržava ovaj predati rad. Moguće je da rad ne sadrži sve informacije.", + "submissionslocked": "Ovaj zadatak ne prihvata predaju radova", + "submissionstatus": "Status predatog rada", + "submissionstatus_": "Nema predatih radova", + "submissionstatus_draft": "Nacrt rada (nije predato)", + "submissionstatus_marked": "Ocenjeno", + "submissionstatus_new": "Novi predati rad", + "submissionstatus_reopened": "Ponovo otvoreno", + "submissionstatus_submitted": "Predato za ocenjivanje", + "submissionstatusheading": "Status predatog rada", + "submissionteam": "Grupa", + "submitassignment": "Predaj zadatak", + "submitassignment_help": "Onog trenutka kada predate ovaj rad više nećete moći da ga menjate.", + "submittedearly": "Zadatak je predat {{$a}} ranije", + "submittedlate": "Zadatak je predat {{$a}} kasnije", + "timemodified": "Poslednje izmene", + "timeremaining": "Preostalo vreme", + "ungroupedusers": "Podešavanje 'Neophodna je grupa za predaju rada' je omogućeno, ali neki korisnici nisu članovi nijedne grupe, ili su članovi više od jedne grupe, tako da ne mogu da predaju rad.", + "unlimitedattempts": "Neograničeno", + "userswhoneedtosubmit": "Korisnici koji treba da predaju rešenje: {{$a}}", "userwithid": "Korisnik sa ID oznakom {{id}}", + "viewsubmission": "Pogledaj predati rad", "warningsubmissiongrademodified": "Ocena predatog rada je izmenjena na sajtu.", "warningsubmissionmodified": "Predati rad korisnika je izmenjen na sajtu." } \ No newline at end of file diff --git a/www/addons/mod/assign/lang/sv.json b/www/addons/mod/assign/lang/sv.json index 674db970084..a4ffe14d1c8 100644 --- a/www/addons/mod/assign/lang/sv.json +++ b/www/addons/mod/assign/lang/sv.json @@ -13,7 +13,7 @@ "attemptreopenmethod_manual": "Manuellt", "attemptreopenmethod_untilpass": "Automatiskt tills passerat", "attemptsettings": "Inställningar försök", - "confirmsubmission": "Är du säker på att du vill lämna in ditt arbete för betygssättning? Du kommer inte längre att kunna göra några förändringar", + "confirmsubmission": "Är du säker på att du vill lämna in ditt arbete för betygssättning? Du kommer inte längre att kunna göra några ändringar", "currentattempt": "Detta är försök {{$a}}.", "currentattemptof": "Detta är försök {{$a.attemptnumber}} ( {{$a.maxattempts}} försök tillåten).", "currentgrade": "Aktuellt betyg/omdöme i betygskatalogen", @@ -23,9 +23,9 @@ "duedateno": "Inget stoppdatum/tid", "duedatereached": "Stoppdatum för denna inlämningsuppgift har nu passerat", "editingstatus": "Redigerar status", - "editsubmission": "Redigera min inskickade uppgiftslösning", + "editsubmission": "Redigera min inlämning", "extensionduedate": "Förlängning av stoppdatum", - "grade": "Betyg/omdöme", + "grade": "Betyg", "graded": "Betygssatt", "gradedby": "Betygssatt av", "gradedon": "Betygssatt den", diff --git a/www/addons/mod/assign/lang/tr.json b/www/addons/mod/assign/lang/tr.json index 72b0e0a2002..d56c55e9e46 100644 --- a/www/addons/mod/assign/lang/tr.json +++ b/www/addons/mod/assign/lang/tr.json @@ -25,7 +25,7 @@ "editingstatus": "Durumu düzenleme", "editsubmission": "Gönderimi düzenle", "extensionduedate": "Ek sürenin bitiş tarihi", - "grade": "Not", + "grade": "Başarı notu", "graded": "Notlandırıldı", "gradedon": "Not verildi", "gradeoutof": "{{$a}} Dışarıdan notu", diff --git a/www/addons/mod/assign/lang/zh-tw.json b/www/addons/mod/assign/lang/zh-tw.json index 94a6fc83415..674e767eebf 100644 --- a/www/addons/mod/assign/lang/zh-tw.json +++ b/www/addons/mod/assign/lang/zh-tw.json @@ -32,7 +32,7 @@ "errorshowinginformation": "我們無法顯示提交資訊", "extensionduedate": "展延到期日", "feedbacknotsupported": "該應用程式不支援此回饋, 並且可能不包含所有資訊", - "grade": "分數", + "grade": "成績", "graded": "已評分", "gradedby": "已評分由", "gradedon": "評分標準", diff --git a/www/addons/mod/chat/lang/cs.json b/www/addons/mod/chat/lang/cs.json index 5a2dbd232b7..a0e6fc3cd3b 100644 --- a/www/addons/mod/chat/lang/cs.json +++ b/www/addons/mod/chat/lang/cs.json @@ -14,6 +14,6 @@ "mustbeonlinetosendmessages": "Pro odesílání zpráv musíte být online", "nomessages": "Zatím žádné zprávy", "send": "Odeslat", - "sessionstart": "Další chatování začne v {{$a}}, (za {{$a.fromnow}})", + "sessionstart": "Další chatování začne v: {{$a.date}} (tj. za {{$a.fromnow}})", "talk": "Diskuse" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/de.json b/www/addons/mod/chat/lang/de.json index 9f7bc7161e6..77a921dd9cc 100644 --- a/www/addons/mod/chat/lang/de.json +++ b/www/addons/mod/chat/lang/de.json @@ -14,6 +14,6 @@ "mustbeonlinetosendmessages": "Sie müssen online sein, um Mitteilungen zu senden", "nomessages": "Keine Mitteilungen", "send": "Senden", - "sessionstart": "Nächster Chat beginnt am {{$a.date}}. ({{$a.fromnow}} von jetzt)", + "sessionstart": "Nächster Chat beginnt {{$a.date}}, (also in {{$a.fromnow}})", "talk": "Sprechen" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/he.json b/www/addons/mod/chat/lang/he.json index 8cd72c5f92d..129855c2b7c 100644 --- a/www/addons/mod/chat/lang/he.json +++ b/www/addons/mod/chat/lang/he.json @@ -10,6 +10,6 @@ "mustbeonlinetosendmessages": "עליך להיות מחובר בכדי לשלוח הודעות.", "nomessages": "אין הודעות עדיין", "send": "שליחה", - "sessionstart": "מפגש הרב-שיח הבא יתחיל ב: {{$a}}", + "sessionstart": "מפגש הרב-שיח הבא יתחיל ב: {{$a.date}}, ({{$a.fromnow}} מעכשיו)", "talk": "דברו" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/lt.json b/www/addons/mod/chat/lang/lt.json index 0eb4caa16f1..b71c2b82006 100644 --- a/www/addons/mod/chat/lang/lt.json +++ b/www/addons/mod/chat/lang/lt.json @@ -14,6 +14,6 @@ "mustbeonlinetosendmessages": "Norėdamas išsiųsti žinutę, turite būti prisijungęs.", "nomessages": "Žinučių dar nėra", "send": "Siųsti", - "sessionstart": "Pokalbio seansas bus pradėtas po: {{$a}}", + "sessionstart": "Kitas pokalbio seansas prasidės {{$a.date}}, ({{$a.fromnow}} nuo dabar)", "talk": "Kalbėti" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/pl.json b/www/addons/mod/chat/lang/pl.json index b1a54b073ef..f8fbf09ec3f 100644 --- a/www/addons/mod/chat/lang/pl.json +++ b/www/addons/mod/chat/lang/pl.json @@ -9,6 +9,6 @@ "messageexit": "{{$a}} opuścił czat", "nomessages": "Brak wiadomości", "send": "Wyślij", - "sessionstart": "Sesja czatu rozpocznie się za: {$ a}}", + "sessionstart": "Sesja czatu rozpocznie się {{$a.date}}, za ({{$a.fromnow}}", "talk": "Dyskusja" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/pt-br.json b/www/addons/mod/chat/lang/pt-br.json index 474fea465ec..eca3a53a9e6 100644 --- a/www/addons/mod/chat/lang/pt-br.json +++ b/www/addons/mod/chat/lang/pt-br.json @@ -14,6 +14,6 @@ "mustbeonlinetosendmessages": "Você deve estar online para enviar mensagens", "nomessages": "Nenhuma mensagem ainda", "send": "Enviar", - "sessionstart": "A próxima sessão de chat irá começar em {{$a}}", + "sessionstart": "A próxima sessão de chat irá começar em {{$a.date}}, ({{$a.fromnow}} a partir de agora)", "talk": "Falar" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/sr-cr.json b/www/addons/mod/chat/lang/sr-cr.json index 1e36fd7d84d..be3c293d91c 100644 --- a/www/addons/mod/chat/lang/sr-cr.json +++ b/www/addons/mod/chat/lang/sr-cr.json @@ -1,8 +1,19 @@ { + "beep": "Звучни сигнал", + "currentusers": "Тренутни корисници", + "enterchat": "Кликните овде за улазак у причаоницу", + "entermessage": "Унесите вашу поруку", "errorwhileconnecting": "Грешка приликом повезивања са причаоницом.", "errorwhilegettingchatdata": "Грешка приликом преузимања података за 'Причаоницу'.", "errorwhilegettingchatusers": "Грешка приликом преузимања корисника причаонице.", "errorwhileretrievingmessages": "Грешка приликом преузимања порука са сервера.", "errorwhilesendingmessage": "Грешка приликом слања поруке.", - "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке." + "messagebeepsyou": "{{$a}} вас је управо поздравио/ла звучним сигналом!", + "messageenter": "Учесник {{$a}} управо улази у причаоницу", + "messageexit": "Учесник {{$a}} управо напушта причаоницу", + "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке.", + "nomessages": "Још нема порука", + "send": "Пошаљи", + "sessionstart": "Следећа сесија ће почети дана {{$a.date}}, ({{$a.fromnow}} од сада)", + "talk": "Причај" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/sr-lt.json b/www/addons/mod/chat/lang/sr-lt.json index 9f2850e8b5e..dca8b6cbd39 100644 --- a/www/addons/mod/chat/lang/sr-lt.json +++ b/www/addons/mod/chat/lang/sr-lt.json @@ -1,8 +1,19 @@ { + "beep": "Zvučni signal", + "currentusers": "Trenutni korisnici", + "enterchat": "Kliknite ovde za ulazak u pričaonicu", + "entermessage": "Unesite vašu poruku", "errorwhileconnecting": "Greška prilikom povezivanja sa pričaonicom.", "errorwhilegettingchatdata": "Greška prilikom preuzimanja podataka za 'Pričaonicu'.", "errorwhilegettingchatusers": "Greška prilikom preuzimanja korisnika pričaonice.", "errorwhileretrievingmessages": "Greška prilikom preuzimanja poruka sa servera.", "errorwhilesendingmessage": "Greška prilikom slanja poruke.", - "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke." + "messagebeepsyou": "{{$a}} vas je upravo pozdravio/la zvučnim signalom!", + "messageenter": "Učesnik {{$a}} upravo ulazi u pričaonicu", + "messageexit": "Učesnik {{$a}} upravo napušta pričaonicu", + "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke.", + "nomessages": "Još nema poruka", + "send": "Pošalji", + "sessionstart": "Sledeća sesija će početi dana {{$a.date}}, ({{$a.fromnow}} od sada)", + "talk": "Pričaj" } \ No newline at end of file diff --git a/www/addons/mod/chat/lang/sv.json b/www/addons/mod/chat/lang/sv.json index cc26779e559..d5a2d85343a 100644 --- a/www/addons/mod/chat/lang/sv.json +++ b/www/addons/mod/chat/lang/sv.json @@ -1,14 +1,14 @@ { - "beep": "pipsignal", + "beep": "Pipsignal", "currentusers": "Aktuella användare", "enterchat": "Klicka här för att gå in i direktsamtalet nu", - "entermessage": "Sriv ditt meddelande", + "entermessage": "Skriv ditt meddelande", "errorwhileconnecting": "Fel vid anslutning till chatten", "errorwhilegettingchatdata": "Fel vid vid hämtning av chattdata", "errorwhilegettingchatusers": "Fel vid vid hämtning av chattanvändare", "errorwhileretrievingmessages": "Fel vid hämtning av meddelanden från servern", "errorwhilesendingmessage": "Fel när meddelandet skickades", - "messagebeepsyou": "{{$a}} har just skickat en pipsignal till Dig", + "messagebeepsyou": "{{$a}} har just skickat en pipsignal till dig", "messageenter": "{{$a}} har precis kommit in i detta direktsamtal", "messageexit": "{{$a}} har lämnat det här direktsamtalet", "mustbeonlinetosendmessages": "Du måste vara online för att skicka meddelanden", diff --git a/www/addons/mod/choice/lang/ar.json b/www/addons/mod/choice/lang/ar.json index 507d25fbe0c..60ff70d91f6 100644 --- a/www/addons/mod/choice/lang/ar.json +++ b/www/addons/mod/choice/lang/ar.json @@ -4,7 +4,7 @@ "full": "(كامل)", "noresultsviewable": "حالياً لا يمكن معاينة النتائج", "notopenyet": "عذرا، هذا النشاط سيكون متوفر في {{$a}}", - "numberofuser": "عدد المشاركين", + "numberofuser": "عدد المستخدمين", "numberofuserinpercentage": "عدد المستخدمين كنسبة", "removemychoice": "استبعد خياري", "responses": "إجابات", diff --git a/www/addons/mod/choice/lang/ca.json b/www/addons/mod/choice/lang/ca.json index fc6af3e2e89..c0a93b72130 100644 --- a/www/addons/mod/choice/lang/ca.json +++ b/www/addons/mod/choice/lang/ca.json @@ -6,8 +6,8 @@ "full": "(Complet)", "noresultsviewable": "A hores d'ara no es poden veure els resultats", "notopenyet": "Aquesta activitat no estarà disponible fins al dia {{$a}}", - "numberofuser": "Nombre de participants", - "numberofuserinpercentage": "Percentatge de participants", + "numberofuser": "Nombre de respostes", + "numberofuserinpercentage": "Percentatge de respostes (%)", "previewonly": "Això és sols una vista prèvia de les opcions disponibles en aquesta activitat. No esteu habilitat per enviar consultes fins {{$a}}.", "removemychoice": "Suprimeix la meva resposta", "responses": "Respostes", diff --git a/www/addons/mod/choice/lang/cs.json b/www/addons/mod/choice/lang/cs.json index aaa5ea9560c..f9a22aaf32e 100644 --- a/www/addons/mod/choice/lang/cs.json +++ b/www/addons/mod/choice/lang/cs.json @@ -6,8 +6,8 @@ "full": "(Obsazeno)", "noresultsviewable": "Výsledky nejsou momentálně k dispozici", "notopenyet": "Je nám líto, tato činnost není až do {{$a}} dostupná.", - "numberofuser": "Počet účastníků", - "numberofuserinpercentage": "Procentní podíl účastníků", + "numberofuser": "Počet odpovědí", + "numberofuserinpercentage": "Počet odpovědí v procentech", "previewonly": "Toto je náhled dostupných možností v této anketě. Hlasovat budete moci od {{$a}}.", "removemychoice": "Odstranit mou volbu", "responses": "Odpovědi", diff --git a/www/addons/mod/choice/lang/da.json b/www/addons/mod/choice/lang/da.json index 3ef6b107e4d..e462afcd51a 100644 --- a/www/addons/mod/choice/lang/da.json +++ b/www/addons/mod/choice/lang/da.json @@ -6,8 +6,8 @@ "full": "(Fuld)", "noresultsviewable": "Resultaterne er ikke tilgængelige på nuværende tidspunkt.", "notopenyet": "Denne aktivitet er tilgængelig fra {{$a}}", - "numberofuser": "Antal deltagere", - "numberofuserinpercentage": "Procentdel af deltagerne", + "numberofuser": "Antal svar", + "numberofuserinpercentage": "Antal svar i procent", "previewonly": "Dette er en forhåndsvisning af de tilgængelige valgmuligheder i denne afstemning. Du kan ikke indsende dine valg før {{$a}}.", "removemychoice": "Slet mit valg", "responses": "Besvarelser", diff --git a/www/addons/mod/choice/lang/de.json b/www/addons/mod/choice/lang/de.json index a7bea8a7061..be13d38af77 100644 --- a/www/addons/mod/choice/lang/de.json +++ b/www/addons/mod/choice/lang/de.json @@ -6,8 +6,8 @@ "full": "(Nicht verfügbar)", "noresultsviewable": "Ergebnisse sind aktuell nicht sichtbar.", "notopenyet": "Die Aktivität ist nicht verfügbar bis {{$a}}.", - "numberofuser": "Anzahl", - "numberofuserinpercentage": "Prozent", + "numberofuser": "Anzahl der Antworten", + "numberofuserinpercentage": "Prozent der Antworten", "previewonly": "Diese Vorschau zeigt die verfügbaren Optionen für diese Aktivität. Sie können Ihre Wahl nicht vor {{$a}} einreichen.", "removemychoice": "Meine Auswahl löschen", "responses": "Stimmabgaben", diff --git a/www/addons/mod/choice/lang/el.json b/www/addons/mod/choice/lang/el.json index 31602f11f93..4b17c064e80 100644 --- a/www/addons/mod/choice/lang/el.json +++ b/www/addons/mod/choice/lang/el.json @@ -4,8 +4,8 @@ "full": "(Πλήρες)", "noresultsviewable": "Τα αποτελέσματα δεν είναι ορατά προς το παρόν.", "notopenyet": "Συγνώμη, αυτή η δραστηριότητα δεν είναι διαθέσιμη μέχρι {{$a}}", - "numberofuser": "Πλήθος συμμετεχόντων", - "numberofuserinpercentage": "Ποσοστό συμμετεχόντων", + "numberofuser": "Αριθμός απαντήσεων", + "numberofuserinpercentage": "Ποσοστό απαντήσεων", "removemychoice": "Διαγραφή της επιλογής μου", "responses": "Απαντήσεις", "responsesresultgraphdescription": "{{number}}% των χρηστών επέλεξε: {{text}}.", diff --git a/www/addons/mod/choice/lang/es-mx.json b/www/addons/mod/choice/lang/es-mx.json index 41b15bb932f..ceddb82adc6 100644 --- a/www/addons/mod/choice/lang/es-mx.json +++ b/www/addons/mod/choice/lang/es-mx.json @@ -6,8 +6,8 @@ "full": "(Lleno)", "noresultsviewable": "Los resultados no pueden verse en este momento.", "notopenyet": "Lo sentimos, esta actividad no estará disponible hasta {{$a}}", - "numberofuser": "Número de participantes", - "numberofuserinpercentage": "Porcentaje de participantes", + "numberofuser": "Número de respuestas", + "numberofuserinpercentage": "Porcentaje de respuestas", "previewonly": "Esto es solamente una vista previa de las opciones disponibles para esta actividad. Usted no podrá enviar su elección hasta {{$a}}.", "removemychoice": "Eliminar mi elección", "responses": "Respuestas", diff --git a/www/addons/mod/choice/lang/es.json b/www/addons/mod/choice/lang/es.json index b14f860dda6..74076baa791 100644 --- a/www/addons/mod/choice/lang/es.json +++ b/www/addons/mod/choice/lang/es.json @@ -6,8 +6,8 @@ "full": "(Lleno)", "noresultsviewable": "Los resultados no pueden verse en este momento.", "notopenyet": "Lo sentimos, esta actividad no estará disponible hasta {{$a}}", - "numberofuser": "Número de participantes", - "numberofuserinpercentage": "Porcentaje de participantes", + "numberofuser": "Número de respuestas", + "numberofuserinpercentage": "Porcentaje de respuestas", "previewonly": "Esta es solamente una previsualización de las opciones disponibles para esta actividad. No podrá enviar su respuesta a la consulta hasta el {{$a}}.", "removemychoice": "Eliminar mi elección", "responses": "Respuestas", diff --git a/www/addons/mod/choice/lang/eu.json b/www/addons/mod/choice/lang/eu.json index ceb6eff44db..62e0810b4c4 100644 --- a/www/addons/mod/choice/lang/eu.json +++ b/www/addons/mod/choice/lang/eu.json @@ -6,8 +6,8 @@ "full": "(Beteta)", "noresultsviewable": "Emaitzak ezin dira orain ikusi", "notopenyet": "Barkatu, baina jarduera hau ez dago erabiltzeko moduan {{$a}} arte.", - "numberofuser": "Partaide-kopurua", - "numberofuserinpercentage": "Partaideen ehunekoa", + "numberofuser": "Erantzun-kopurua", + "numberofuserinpercentage": "Erantzunen portzentajea", "previewonly": "Hau jarduera honetan eskuragarri dauden aukeren aurrebista besterik ez da. Ezingo duzu zure erantzuna bidali {{$a}}-(e)ra arte.", "removemychoice": "Ezabatu nire aukera", "responses": "Erantzunak", diff --git a/www/addons/mod/choice/lang/fr.json b/www/addons/mod/choice/lang/fr.json index 05e3f3b9c99..9ca0f50c2ea 100644 --- a/www/addons/mod/choice/lang/fr.json +++ b/www/addons/mod/choice/lang/fr.json @@ -6,8 +6,8 @@ "full": "(complet)", "noresultsviewable": "Les résultats ne sont actuellement pas visibles.", "notopenyet": "Désolé, cette activité ne sera disponible que le {{$a}}", - "numberofuser": "Nombre de participants", - "numberofuserinpercentage": "Pourcentage de participants", + "numberofuser": "Nombre de réponses", + "numberofuserinpercentage": "Pourcentage de réponses", "previewonly": "Cet affichage est une prévisualisation des options disponibles pour cette activité. Vous ne pourrez pas enregistrer votre choix avant le {{$a}}.", "removemychoice": "Retirer mon vote", "responses": "Réponses", diff --git a/www/addons/mod/choice/lang/it.json b/www/addons/mod/choice/lang/it.json index c44e97ee335..01597a9058a 100644 --- a/www/addons/mod/choice/lang/it.json +++ b/www/addons/mod/choice/lang/it.json @@ -6,8 +6,8 @@ "full": "(Completo)", "noresultsviewable": "I risultati non sono al momento visualizzabili.", "notopenyet": "Spiacente, questa attività non è disponibile fino al {{$a}}", - "numberofuser": "Numero di partecipanti", - "numberofuserinpercentage": "Percentuale dei partecipanti", + "numberofuser": "Numero di risposte", + "numberofuserinpercentage": "Percentuale delle risposte", "previewonly": "Questa è un'anteprima delle scelte disponibili. Potrai inviare la tua scelta solo dal {{$a}}.", "removemychoice": "Elimina la mia scelta", "responses": "Scelte", diff --git a/www/addons/mod/choice/lang/ja.json b/www/addons/mod/choice/lang/ja.json index 5f5b78343c7..a5fee422a43 100644 --- a/www/addons/mod/choice/lang/ja.json +++ b/www/addons/mod/choice/lang/ja.json @@ -6,8 +6,8 @@ "full": "(上限到達)", "noresultsviewable": "現在、投票結果は閲覧できません。", "notopenyet": "申し訳ございません、この活動は {{$a}} まで利用することができません。", - "numberofuser": "参加者数", - "numberofuserinpercentage": "参加者の割合", + "numberofuser": "投票者数", + "numberofuserinpercentage": "投票者数 (%)", "previewonly": "これはこの活動で利用可能なオプションのプレビューです。あなたの投票は {{$a}} まで送信することができません。", "removemychoice": "私の投票を削除する", "responses": "投票結果", diff --git a/www/addons/mod/choice/lang/lt.json b/www/addons/mod/choice/lang/lt.json index 94e682f5d51..ee1bf2c25c3 100644 --- a/www/addons/mod/choice/lang/lt.json +++ b/www/addons/mod/choice/lang/lt.json @@ -6,8 +6,8 @@ "full": "(Visas)", "noresultsviewable": "Rezultatai dabar nematomi.", "notopenyet": "Apgailestaujame, ši veikla negalima iki {{$a}}", - "numberofuser": "Dalyvių skaičius", - "numberofuserinpercentage": "Dalyvių procentas", + "numberofuser": "Atsakymų skaičius", + "numberofuserinpercentage": "Atsakymų procentas", "previewonly": "Tai yra tik šios veiklos galimų variantų peržiūra. Savo pasirinkimo negalėsite pateikti iki {{$a}}.", "removemychoice": "Pašalinti mano pasirinkimą", "responses": "Atsakymai", diff --git a/www/addons/mod/choice/lang/nl.json b/www/addons/mod/choice/lang/nl.json index b2be190c0c9..d7e7f4cd7f3 100644 --- a/www/addons/mod/choice/lang/nl.json +++ b/www/addons/mod/choice/lang/nl.json @@ -6,8 +6,8 @@ "full": "(volledig)", "noresultsviewable": "De resultaten zijn nu niet zichtbaar.", "notopenyet": "Deze activiteit is niet beschikbaar tot {{$a}}", - "numberofuser": "Aantal deelnemers", - "numberofuserinpercentage": "Deelnemerspercentage", + "numberofuser": "Aantal antwoorden", + "numberofuserinpercentage": "Percentage antwoorden", "previewonly": "Dit is slechts een voorbeeld van de beschikbare opties voor deze activiteit. Je zult je keuze niet kunnen maken voor {{$a}}.", "removemychoice": "Verwijder mijn keuze", "responses": "Antwoorden", diff --git a/www/addons/mod/choice/lang/pt-br.json b/www/addons/mod/choice/lang/pt-br.json index f8fbe81990b..e1220130458 100644 --- a/www/addons/mod/choice/lang/pt-br.json +++ b/www/addons/mod/choice/lang/pt-br.json @@ -6,8 +6,8 @@ "full": "(Cheio)", "noresultsviewable": "Não é possível visualizar os resultados neste momento.", "notopenyet": "Esta atividade será acessível a partir de {{$a}}", - "numberofuser": "Número de participantes", - "numberofuserinpercentage": "Porcentagem de participantes", + "numberofuser": "Número de respostas", + "numberofuserinpercentage": "Percentagem de respostas", "previewonly": "Esta é somente uma previsualização das opções dessa atividade. Você somente poderá enviar sua escolha a partir de {{$a}}", "removemychoice": "Remover a minha resposta", "responses": "Respostas", diff --git a/www/addons/mod/choice/lang/pt.json b/www/addons/mod/choice/lang/pt.json index a5b426bc80b..68e628591c5 100644 --- a/www/addons/mod/choice/lang/pt.json +++ b/www/addons/mod/choice/lang/pt.json @@ -6,8 +6,8 @@ "full": "Completa", "noresultsviewable": "Os resultados da sondagem ainda não estão disponíveis.", "notopenyet": "Lamentamos mas esta atividade só estará disponível em {{$a}}", - "numberofuser": "Número de participantes", - "numberofuserinpercentage": "Percentagem de participantes", + "numberofuser": "Número de respostas", + "numberofuserinpercentage": "Percentagem de respostas", "previewonly": "Esta é apenas uma pré-visualização das opções disponíveis para esta atividade. Não poderá submeter a sua escolha até {{$a}}.", "removemychoice": "Apagar a minha resposta", "responses": "Respostas", diff --git a/www/addons/mod/choice/lang/ro.json b/www/addons/mod/choice/lang/ro.json index eb9c1bc300b..2133b57b951 100644 --- a/www/addons/mod/choice/lang/ro.json +++ b/www/addons/mod/choice/lang/ro.json @@ -4,8 +4,8 @@ "full": "(plin)", "noresultsviewable": "În acest moment rezultatele nu pot fi vizualizate.", "notopenyet": "Ne pare rău, această activitate nu este disponibilă mai devreme de {{$a}}", - "numberofuser": "Numărul participanților", - "numberofuserinpercentage": "Procentul participanților", + "numberofuser": "Numărul de răspunsuri", + "numberofuserinpercentage": "Procentajul răspunsurilor", "previewonly": "Acesta este doar o prezentare a opțiunilor existente pentru această activitate. Nu veți putea trimite opțiunea dvs. până la {{$a}}.", "removemychoice": "Șterge alegerea mea", "responses": "Răspunsuri", diff --git a/www/addons/mod/choice/lang/ru.json b/www/addons/mod/choice/lang/ru.json index a8b13940e57..38f9cf75ee3 100644 --- a/www/addons/mod/choice/lang/ru.json +++ b/www/addons/mod/choice/lang/ru.json @@ -2,7 +2,7 @@ "cannotsubmit": "Извините, возникла проблема при отправке Вашего ответа на опрос. Пожалуйста, повторите снова.", "choiceoptions": "Варианты ответа", "errorgetchoice": "Ошибка при получении данных выбора", - "expired": "Извините эта активность закрыта {{$a}} и более недоступна", + "expired": "Извините, этот элемент курса закрыт {{$a}} и более недоступен", "full": "(Заполнено)", "noresultsviewable": "Вы не можете в данный момент просматривать результаты опроса.", "notopenyet": "Извините, данное действие недоступно до {{$a}}", diff --git a/www/addons/mod/choice/lang/sr-cr.json b/www/addons/mod/choice/lang/sr-cr.json index 298eab2ca83..9a18723e91c 100644 --- a/www/addons/mod/choice/lang/sr-cr.json +++ b/www/addons/mod/choice/lang/sr-cr.json @@ -1,7 +1,20 @@ { + "cannotsubmit": "Извините, дошло је до проблема приликом чувања одабраног одговора. Молимо покушајте поново.", + "choiceoptions": "Опције за избор", "errorgetchoice": "Грешка приликом преузимања података за 'Избор'", - "numberofuser": "Број учесника", - "numberofuserinpercentage": "Проценат учесника", + "expired": "Нажалост, ова активност је затворена дана {{$a}} и није више доступна", + "full": "(Попуњено)", + "noresultsviewable": "Резултати тренутно нису видљиви.", + "notopenyet": "Нажалост, ова активност није доступна до {{$a}}", + "numberofuser": "Број одговора", + "numberofuserinpercentage": "Проценат одговора", + "previewonly": "Ово је само приказ доступних опција за ову активност. Нећете бити у могућности да извршите одабир до {{$a}}.", + "removemychoice": "Уклони мој избор", + "responses": "Одговори", "responsesresultgraphdescription": "{{number}}% корисника је изабрало опцију: {{text}}.", - "resultsnotsynced": "Резултати не укључује ваш последњи одговор. Покрените синхронизацију како бисте их ажурирали." + "responsesresultgraphheader": "Графички приказ", + "resultsnotsynced": "Резултати не укључује ваш последњи одговор. Покрените синхронизацију како бисте их ажурирали.", + "savemychoice": "Сачувај мој избор", + "userchoosethisoption": "Корисници који су изабрали ову опцију", + "yourselection": "Ваш избор" } \ No newline at end of file diff --git a/www/addons/mod/choice/lang/sr-lt.json b/www/addons/mod/choice/lang/sr-lt.json index b1d8bf5a49d..b9bfa00cb81 100644 --- a/www/addons/mod/choice/lang/sr-lt.json +++ b/www/addons/mod/choice/lang/sr-lt.json @@ -1,7 +1,20 @@ { + "cannotsubmit": "Izvinite, došlo je do problema prilikom čuvanja odabranog odgovora. Molimo pokušajte ponovo.", + "choiceoptions": "Opcije za izbor", "errorgetchoice": "Greška prilikom preuzimanja podataka za 'Izbor'", - "numberofuser": "Broj učesnika", - "numberofuserinpercentage": "Procenat učesnika", + "expired": "Nažalost, ova aktivnost je zatvorena dana {{$a}} i nije više dostupna", + "full": "(Popunjeno)", + "noresultsviewable": "Rezultati trenutno nisu vidljivi.", + "notopenyet": "Nažalost, ova aktivnost nije dostupna do {{$a}}", + "numberofuser": "Broj odgovora", + "numberofuserinpercentage": "Procenat odgovora", + "previewonly": "Ovo je samo prikaz dostupnih opcija za ovu aktivnost. Nećete biti u mogućnosti da izvršite odabir do {{$a}}.", + "removemychoice": "Ukloni moj izbor", + "responses": "Odgovori", "responsesresultgraphdescription": "{{number}}% korisnika je izabralo opciju: {{text}}.", - "resultsnotsynced": "Rezultati ne uključuje vaš poslednji odgovor. Pokrenite sinhronizaciju kako biste ih ažurirali." + "responsesresultgraphheader": "Grafički prikaz", + "resultsnotsynced": "Rezultati ne uključuje vaš poslednji odgovor. Pokrenite sinhronizaciju kako biste ih ažurirali.", + "savemychoice": "Sačuvaj moj izbor", + "userchoosethisoption": "Korisnici koji su izabrali ovu opciju", + "yourselection": "Vaš izbor" } \ No newline at end of file diff --git a/www/addons/mod/choice/lang/sv.json b/www/addons/mod/choice/lang/sv.json index 62217bdb227..f76c9f090e3 100644 --- a/www/addons/mod/choice/lang/sv.json +++ b/www/addons/mod/choice/lang/sv.json @@ -6,14 +6,14 @@ "full": "(Full)", "noresultsviewable": "Det går f.n. inte att visa resultaten.", "notopenyet": "Den här aktiviteten är tyvärr inte tillgänglig förrän {{$a}}", - "numberofuser": "Antal deltagare", - "numberofuserinpercentage": "Procent av deltagarna", + "numberofuser": "Antal användare", + "numberofuserinpercentage": "Antalet användare i procent.", "previewonly": "Detta är bara en förhandsvisning av de tillgängliga alternativen för den här aktiviteten . Du kommer inte att kunna lämna in ditt val innan {{$a}}", "removemychoice": "Ta bort mitt val", "responses": "Svar", "responsesresultgraphdescription": "{{number}}% Av användarna valde alternativet: {{text}}", "responsesresultgraphheader": "Visa en graf", "savemychoice": "Spara min opinionsundersökning", - "userchoosethisoption": "Användaren väljer detta alternativ", + "userchoosethisoption": "Användare som valt detta alternativ", "yourselection": "Ditt urval" } \ No newline at end of file diff --git a/www/addons/mod/choice/lang/uk.json b/www/addons/mod/choice/lang/uk.json index 7c22b1890c7..583a6f28d04 100644 --- a/www/addons/mod/choice/lang/uk.json +++ b/www/addons/mod/choice/lang/uk.json @@ -6,8 +6,8 @@ "full": "(Все)", "noresultsviewable": "В даний час результати не можна побачити.", "notopenyet": "Цей ресурс буде недоступний до {{$a}}", - "numberofuser": "Кількість учасників", - "numberofuserinpercentage": "Відсоток учасників", + "numberofuser": "Кількість користувачів", + "numberofuserinpercentage": "Кількість користувачів у відсотках", "previewonly": "Це лише попередній перегляд доступних варіантів для цієї діяльності. Ви не можете відправити відповідь до {{$a}}.", "removemychoice": "Видалити мій вибір", "responses": "Відповіді", diff --git a/www/addons/mod/choice/lang/zh-tw.json b/www/addons/mod/choice/lang/zh-tw.json index fd45e3f3362..c97305fd6fa 100644 --- a/www/addons/mod/choice/lang/zh-tw.json +++ b/www/addons/mod/choice/lang/zh-tw.json @@ -6,8 +6,8 @@ "full": "(已滿)", "noresultsviewable": "目前無法檢視票選結果", "notopenyet": "抱歉,這個活動在{{$a}}之前不能使用", - "numberofuser": "參與者人數", - "numberofuserinpercentage": "參與者百分比", + "numberofuser": "回應的人數", + "numberofuserinpercentage": "回應人數的百分比", "previewonly": "這只是這一活動的可用選項的預覽。你要等到{{$a}}才可以進行投票。", "removemychoice": "移除我的選擇", "responses": "答覆", diff --git a/www/addons/mod/data/lang/ar.json b/www/addons/mod/data/lang/ar.json new file mode 100644 index 00000000000..bb5d5765bd9 --- /dev/null +++ b/www/addons/mod/data/lang/ar.json @@ -0,0 +1,32 @@ +{ + "addentries": "أضف مدخلات", + "advancedsearch": "بحث متقدم", + "alttext": "النص البديل", + "approve": "اسمح/وافق", + "approved": "تم الموافقة", + "ascending": "تصاعدي", + "authorfirstname": "الاسم الأول للكاتب", + "authorlastname": "الاسم الأخير للكاتب", + "confirmdeleterecord": "هل فعلا ترغب في حذف هذا السجل؟", + "descending": "تنازليا", + "emptyaddform": "لم تقم بتعبئة الحقول!", + "expired": "عذراً، تم إغلاق هذا النشاط في {{$a}} وهو غير متوفر الآن.", + "fields": "حقول", + "menuchoose": "اختار", + "more": "المزيد", + "nomatch": "لم يتم العثور على مدخلات مطابقة!", + "norecords": "لا يوجد مدخلات في قاعدة البيانات", + "notapproved": "لم يتم الموافقة على المدخل بعد", + "notopenyet": "عذراً، هذا النشاط لن يتاح حتى {{$a}}", + "numrecords": "{{$a}} سجلات", + "other": "اخر", + "recordapproved": "تم الموافقه على السجل", + "recorddeleted": "تم حذف السجل", + "resetsettings": "إعادة تعين الحقول", + "restore": "إسترجاع", + "search": "بحث", + "selectedrequired": "كل المختار مطلوب", + "timeadded": "وقت الإضافة", + "timemodified": "وقت التعديل", + "usedate": "تضمين في البحث" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/bg.json b/www/addons/mod/data/lang/bg.json new file mode 100644 index 00000000000..6f8107d536b --- /dev/null +++ b/www/addons/mod/data/lang/bg.json @@ -0,0 +1,36 @@ +{ + "addentries": "Добавяне на записи", + "advancedsearch": "Разширено търсене", + "alttext": "Алтернативен текст", + "approve": "Одобрение", + "approved": "Одобрен", + "ascending": "По нарастване", + "authorfirstname": "Име на автора", + "authorlastname": "Презиме на автора", + "confirmdeleterecord": "Сигурни ли сте, че искате да изтриете това?", + "descending": "По намаляване", + "disapprove": "Отхвърляне на одобрение", + "emptyaddform": "Не сте попълнили никакви полета!", + "entrieslefttoadd": "Трябва да добавите още {{$a.entriesleft}} записи, за да завършите тази дейност", + "entrieslefttoaddtoview": "Трябва да добавите още {{$a.entrieslefttoview}} записи преди да можете да видите записите на другите участници.", + "expired": "За съжаление тази дейност е затворена в {{$a}} и вече не е достъпна", + "fields": "Полета", + "menuchoose": "Изберете...", + "more": "Още", + "nomatch": "Не са намерени съответстващи записи!", + "norecords": "Няма записи в базата данни", + "notapproved": "Записът още не е качен", + "notopenyet": "За съжаление тази дейност не е достъпна от {{$a}}", + "numrecords": "{{$a}} записи", + "other": "Друго", + "recordapproved": "Записът качен", + "recorddeleted": "Записът изтрит", + "recorddisapproved": "Записът не е одобрен", + "resetsettings": "Нулиране на филтрите", + "restore": "Възстановяване", + "search": "Търсене", + "selectedrequired": "Всичко избрано се изисква", + "timeadded": "Време на добавяне", + "timemodified": "Време на промяна", + "usedate": "Включване в търсене." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/ca.json b/www/addons/mod/data/lang/ca.json new file mode 100644 index 00000000000..4bfabe7bca6 --- /dev/null +++ b/www/addons/mod/data/lang/ca.json @@ -0,0 +1,38 @@ +{ + "addentries": "Afegeix entrades", + "advancedsearch": "Cerca avançada", + "alttext": "Text alternatiu", + "approve": "Aprova", + "approved": "Acceptat", + "ascending": "Ascendent", + "authorfirstname": "Nom de l'autor/autora", + "authorlastname": "Cognoms de l'autor/autora", + "confirmdeleterecord": "Segur que voleu suprimir aquesta entrada?", + "descending": "Descendent", + "disapprove": "Desfés l'aprovació", + "emptyaddform": "No heu emplenat cap camp", + "entrieslefttoadd": "Heu d'afegir {{$a.entriesleft}} una entrada o més per completar aquesta activitat", + "entrieslefttoaddtoview": "Heu d'afegir {{$a.entrieslefttoview}} una entrada o més abans que pugueu veure les entrades d'altres participants", + "errormustsupplyvalue": "Cal que poseu un valor aquí.", + "expired": "Aquesta activitat es va tancar el dia {{$a}} i ja no està disponible", + "fields": "Camps", + "latlongboth": "Cal posar tant la latitud com la longitud.", + "menuchoose": "Trieu...", + "more": "Més", + "nomatch": "No s'han trobat entrades que coincideixin", + "norecords": "No hi ha entrades en la base de dades", + "notapproved": "L'entrada encara no està aprovada.", + "notopenyet": "Aquesta activitat no estarà disponible fins al dia {{$a}}", + "numrecords": "{{$a}} entrades", + "other": "Un altre", + "recordapproved": "S'ha aprovat l'entrada", + "recorddeleted": "S'ha suprimit l'entrada", + "recorddisapproved": "Entrada no aprovada", + "resetsettings": "Reinicialitza els filtres", + "restore": "Restaura", + "search": "Cerca", + "selectedrequired": "Cal que estigui tot seleccionat", + "timeadded": "Hora de la incorporació", + "timemodified": "Hora de la modificació", + "usedate": "Inclou en la cerca." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/cs.json b/www/addons/mod/data/lang/cs.json new file mode 100644 index 00000000000..894d9e69c39 --- /dev/null +++ b/www/addons/mod/data/lang/cs.json @@ -0,0 +1,38 @@ +{ + "addentries": "Přidat záznamy", + "advancedsearch": "Pokročilé vyhledávání", + "alttext": "Alternativní text", + "approve": "Schválit", + "approved": "Schváleno", + "ascending": "Vzestupně", + "authorfirstname": "Křestní jméno autora", + "authorlastname": "Příjmení autora", + "confirmdeleterecord": "Chcete skutečně odstranit tento záznam?", + "descending": "Sestupně", + "disapprove": "Odvolat schválení", + "emptyaddform": "Nevyplnili jste žádná pole!", + "entrieslefttoadd": "Ještě musíte vložit {{$a.entriesleft}} záznamů(-y), abyste dokončili tuto činnost", + "entrieslefttoaddtoview": "Ještě musíte vložit {{$a.entrieslefttoview}} záznamů(-y), než budete moci vidět záznamy ostatních účastníků.", + "errormustsupplyvalue": "Musí obsahovat nějakou hodnotu.", + "expired": "Tato činnost byla ukončena {{$a}} a není již nadále dostupná.", + "fields": "Pole", + "latlongboth": "Je požadována zeměpisná šířka i délka.", + "menuchoose": "Vybrat...", + "more": "Podrobněji", + "nomatch": "Nenalezeny žádné záznamy!", + "norecords": "Nejsou k dispozici žádné záznamy", + "notapproved": "Záznam není zatím schválen", + "notopenyet": "Tato činnost nebude dostupná až do {{$a}}", + "numrecords": "{{$a}} záznamů", + "other": "Jiné", + "recordapproved": "Záznam byl schválen", + "recorddeleted": "Záznam byl smazán", + "recorddisapproved": "Neschválený záznam", + "resetsettings": "Resetovat filtry", + "restore": "Obnovit", + "search": "Vyhledat", + "selectedrequired": "Všechna zvolená povinná", + "timeadded": "Čas vložení", + "timemodified": "Čas poslední úpravy", + "usedate": "Zahrnout do vyhledávání." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/da.json b/www/addons/mod/data/lang/da.json new file mode 100644 index 00000000000..e1d919142bb --- /dev/null +++ b/www/addons/mod/data/lang/da.json @@ -0,0 +1,38 @@ +{ + "addentries": "Tilføj indlæg", + "advancedsearch": "Avanceret søgning", + "alttext": "Alternativ tekst", + "approve": "Godkend", + "approved": "Godkendt", + "ascending": "Stigende", + "authorfirstname": "Forfatterens fornavn", + "authorlastname": "Forfatterens efternavn", + "confirmdeleterecord": "Er du sikker på at du vil slette denne post?", + "descending": "Faldende", + "disapprove": "Fortryd godkendelse", + "emptyaddform": "Du udfyldte ingen felter!", + "entrieslefttoadd": "Du mangler at tilføje {{$a.entriesleft}} post(er) til denne database.", + "entrieslefttoaddtoview": "Du skal tilføje {{$a.entrieslefttoview}} post(er mere) til denne database før du kan se andre deltageres bidrag.", + "errormustsupplyvalue": "Du skal indsætte en værdi her.", + "expired": "Beklager, denne aktivitet lukkede {{$a}} og er ikke længere tilgængelig", + "fields": "Felter", + "latlongboth": "Skriv både bredde- og længdegrad", + "menuchoose": "Vælg...", + "more": "Flere", + "nomatch": "Ingen passende indlæg fundet", + "norecords": "Ingen indlæg i databasen", + "notapproved": "Posten er ikke godkendt endnu.", + "notopenyet": "Beklager, denne aktivitet er først tilgængelig {{$a}}", + "numrecords": "{{$a}} poster", + "other": "Anden", + "recordapproved": "Post godkendt", + "recorddeleted": "Posten er slettet", + "recorddisapproved": "Posten er ikke godkendt", + "resetsettings": "Nulstil filtre", + "restore": "Genopret", + "search": "Søg", + "selectedrequired": "Alle valgte er påkrævet", + "timeadded": "Tilføjet", + "timemodified": "Ændret", + "usedate": "Inkluder i søgning." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/de.json b/www/addons/mod/data/lang/de.json new file mode 100644 index 00000000000..54878e639d4 --- /dev/null +++ b/www/addons/mod/data/lang/de.json @@ -0,0 +1,38 @@ +{ + "addentries": "Einträge hinzufügen", + "advancedsearch": "Erweiterte Suche", + "alttext": "Alternativer Text", + "approve": "Zulassen", + "approved": "Bestätigt", + "ascending": "Aufsteigend", + "authorfirstname": "Vorname (Autor)", + "authorlastname": "Nachname (Autor)", + "confirmdeleterecord": "Möchten Sie diesen Datensatz wirklich in der Datenbank löschen?", + "descending": "Absteigend", + "disapprove": "Eintrag nicht freigegeben", + "emptyaddform": "Sie haben keine Einträge vorgenommen!", + "entrieslefttoadd": "Sie müssen {{$a.entriesleft}} (weitere) Einträge vornehmen, um diese Aktivität zu beenden.", + "entrieslefttoaddtoview": "Sie müssen {{$a.entrieslefttoview}} (weitere) Einträge vornehmen, bevor Sie andere Teilnehmerbeiträge betrachten können.", + "errormustsupplyvalue": "Sie müssen hier einen Wert eintragen.", + "expired": "Die Aktivität wurde am {{$a}} abgeschlossen und ist nicht weiter verfügbar.", + "fields": "Felder", + "latlongboth": "Längen- und Breitengrad müssen eingetragen werden.", + "menuchoose": "Auswählen ...", + "more": "Einzelansicht", + "nomatch": "Keine passenden Einträge gefunden", + "norecords": "Keine Einträge in der Datenbank", + "notapproved": "Der Eintrag wurde bisher nicht freigegeben", + "notopenyet": "Die Aktivität ist nicht verfügbar bis {{$a}}.", + "numrecords": "{{$a}} Datensätze", + "other": "Andere", + "recordapproved": "Datensatz wurde angenommen", + "recorddeleted": "Datensatz gelöscht", + "recorddisapproved": "Eintrag nicht freigegeben", + "resetsettings": "Filter zurücksetzen", + "restore": "Wiederherstellen", + "search": "Suche", + "selectedrequired": "Gesamte Auswahl ist erforderlich", + "timeadded": "Zeit erstellt", + "timemodified": "Zeit geändert", + "usedate": "In Suche einbeziehen" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/el.json b/www/addons/mod/data/lang/el.json new file mode 100644 index 00000000000..16838aa7d78 --- /dev/null +++ b/www/addons/mod/data/lang/el.json @@ -0,0 +1,32 @@ +{ + "addentries": "Προσθήκη καταχωρήσεων", + "advancedsearch": "Advanced search", + "alttext": "Εναλλακτικό κείμενο", + "approve": "Έγκριση", + "approved": "Εγκρίθηκε", + "ascending": "Αύξουσα", + "authorfirstname": "Όνομα συγγραφέα", + "authorlastname": "Επίθετο συγγραφέα", + "confirmdeleterecord": "Σίγουρα θέλετε να διαγραφεί αυτή η καταχώρηση;", + "descending": "Φθίνουσα", + "emptyaddform": "Δεν συμπληρώσατε κανένα από τα πεδία!", + "entrieslefttoadd": "Πρέπει να προσθέσετε {{$a.entriesleft}} περισσότερες καταχωρήσεις ώστε να ολοκληρώσετε αυτήν τη δραστηριότητα", + "entrieslefttoaddtoview": "Πρέπει να προσθέσετε {{$a.entrieslefttoview}} περισσότερες καταχωρήσεις πριν να μπορέσετε να δείτε τις καταχωρήσεις άλλων χρηστών.", + "expired": "Η δραστηριότητα αυτή έκλεισε στις {{$a}} και δεν είναι πλέον διαθέσιμη", + "fields": "Πεδία", + "menuchoose": "Επιλέξτε....", + "more": "Περισσότερα", + "nomatch": "Δεν βρέθηκαν καταχωρήσεις που να ταιριάζουν!", + "norecords": "Δεν υπάρχουν καταχωρήσεις στη βάση δεδομένων", + "notopenyet": "Συγνώμη, αυτή η δραστηριότητα δεν είναι διαθέσιμη μέχρι {{$a}}", + "numrecords": "{{$a}} καταχωρήσεις", + "other": "Άλλο", + "recordapproved": "Η καταχώρηση εγκρίθηκε", + "recorddeleted": "Η καταχώρηση διαγράφθηκε", + "resetsettings": "Επανορισμός φίλτρων", + "restore": "Επαναφορά", + "search": "Αναζήτηση", + "selectedrequired": "Απαιτούνται όλα τα επιλεγμένα", + "timeadded": "Προστέθηκε χρόνος", + "timemodified": "Ο χρόνος μεταβλήθηκε" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/es-mx.json b/www/addons/mod/data/lang/es-mx.json new file mode 100644 index 00000000000..f7c26455a61 --- /dev/null +++ b/www/addons/mod/data/lang/es-mx.json @@ -0,0 +1,38 @@ +{ + "addentries": "Añadir entradas", + "advancedsearch": "Búsqueda avanzada", + "alttext": "Texto alternativo", + "approve": "Aprobar", + "approved": "Aprobado", + "ascending": "Ascendente", + "authorfirstname": "Nombre del autor", + "authorlastname": "Apellidos del autor", + "confirmdeleterecord": "¿Está seguro de que desea eliminar esta entrada?", + "descending": "Descendente", + "disapprove": "Deshacer aprobación", + "emptyaddform": "¡No ha rellenado ningún campo!", + "entrieslefttoadd": "Debe añadir {{$a.entriesleft}} entrada(s) más antes de poder ver las entradas de otro participante.", + "entrieslefttoaddtoview": "Debe añadir {{$a.entrieslefttoview}} entrada(s) antes de poder ver las entradas de otros participantes.", + "errormustsupplyvalue": "Usted debe proporcionar un valor aquí.", + "expired": "Lo sentimos, esta actividad se cerró el {{$a}} y ya no está disponible", + "fields": "Campos", + "latlongboth": "Tanto la Latitud como la Longitud son necesarias.", + "menuchoose": "Seleccionar...", + "more": "Más", + "nomatch": "No se han encontrado entradas", + "norecords": "No entradas en la base de datos", + "notapproved": "La entrada aún no ha sido aprobada.", + "notopenyet": "Lo sentimos, esta actividad no está disponible hasta {{$a}}", + "numrecords": "{{$a}} entradas", + "other": "Otro", + "recordapproved": "Entrada aprobada", + "recorddeleted": "Entrada eliminada", + "recorddisapproved": "Entrada desaprobada", + "resetsettings": "Restablecer filtros", + "restore": "Restaurar", + "search": "Buscar", + "selectedrequired": "Se requieren todos los seleccionados", + "timeadded": "Tiempo añadido", + "timemodified": "Tiempo modificado", + "usedate": "Incluir en búsqueda." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/es.json b/www/addons/mod/data/lang/es.json new file mode 100644 index 00000000000..832a1d7c511 --- /dev/null +++ b/www/addons/mod/data/lang/es.json @@ -0,0 +1,38 @@ +{ + "addentries": "Añadir entradas", + "advancedsearch": "Búsqueda avanzada", + "alttext": "Texto alternativo", + "approve": "Aprobar", + "approved": "Aprobado", + "ascending": "Ascendente", + "authorfirstname": "Nombre del autor", + "authorlastname": "Apellido del autor", + "confirmdeleterecord": "¿Está seguro de que desea eliminar esta entrada?", + "descending": "Descendente", + "disapprove": "Desaprobar", + "emptyaddform": "¡No ha rellenado ningún campo!", + "entrieslefttoadd": "Debe agregar {{$a.entriesleft}} entrada(s) más para poder finalizar esta actividad", + "entrieslefttoaddtoview": "Debe añadir {{$a.entrieslefttoview}} entrada(s) antes de poder ver las entradas de otros participantes.", + "errormustsupplyvalue": "Debe proporcionar un valor aquí.", + "expired": "Lo sentimos, esta actividad se cerró el {{$a}} y ya no está disponible", + "fields": "Campos", + "latlongboth": "Tanto la latitud como la longitud son necesarias.", + "menuchoose": "Seleccionar...", + "more": "Más", + "nomatch": "No se han encontrado entradas", + "norecords": "No hay entradas en la base de datos", + "notapproved": "La entrada aún no ha sido aprobada.", + "notopenyet": "Lo sentimos, esta actividad no está disponible hasta {{$a}}", + "numrecords": "{{$a}} entradas", + "other": "Otro", + "recordapproved": "Entrada aprobada", + "recorddeleted": "Entrada eliminada", + "recorddisapproved": "Entrada desaprobada", + "resetsettings": "Restablecer filtros", + "restore": "Restaurar", + "search": "Buscar", + "selectedrequired": "Se requieren todos los seleccionados", + "timeadded": "Tiempo añadido", + "timemodified": "Tiempo modificado", + "usedate": "Incluir en la búsqueda" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/eu.json b/www/addons/mod/data/lang/eu.json new file mode 100644 index 00000000000..d5e1d820eda --- /dev/null +++ b/www/addons/mod/data/lang/eu.json @@ -0,0 +1,38 @@ +{ + "addentries": "Gehitu sarrerak", + "advancedsearch": "Bilaketa aurreratua", + "alttext": "Ordezko testua", + "approve": "Onartu", + "approved": "Onartuta", + "ascending": "Goranzkoa", + "authorfirstname": "Egilearen izena", + "authorlastname": "Egilearen deitura", + "confirmdeleterecord": "Ziur al zaude sarrera hau ezabatu nahi duzula?", + "descending": "Beheranzkoa", + "disapprove": "Onarpena desegin", + "emptyaddform": "Ez duzu eremuren bat bete!", + "entrieslefttoadd": "{{$a.entriesleft}} sarrera gehiago gehitu behar dituzu jarduera hau osatzeko.", + "entrieslefttoaddtoview": "{{$a.entrieslefttoview}} sarrera gehiago gehitu behar dituzu beste partaideen sarrerak ikusi ahal izateko.", + "errormustsupplyvalue": "Hemen balio bat eman behar duzu.", + "expired": "Barkatu, jarduera hau {{$a}} datan itxi zen eta dagoeneko ez dago eskuragarri", + "fields": "Eremuak", + "latlongboth": "Latitudea eta longitudea beharrekoak dira.", + "menuchoose": "Aukeratu...", + "more": "Gehiago", + "nomatch": "Ez da sarrera egokirik aurkitu!", + "norecords": "Datu-basean sarrerarik ez", + "notapproved": "Sarrera ez da oraindik onartu", + "notopenyet": "Barkatu, jarduera hau ez dago eskuragarri {{$a}} arte", + "numrecords": "{{$a}} sarrera(k)", + "other": "Beste bat", + "recordapproved": "Sarrera onartu da", + "recorddeleted": "Sarrera ezabatu da", + "recorddisapproved": "Onartu gabeko sarrera", + "resetsettings": "Berrabiarazi iragazkiak", + "restore": "Berreskuratu", + "search": "Bilatu", + "selectedrequired": "Aukeratutako guztia beharrezkoa", + "timeadded": "Denbora gehituta", + "timemodified": "Denbora aldatuta", + "usedate": "Sartu bilaketan." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/fa.json b/www/addons/mod/data/lang/fa.json new file mode 100644 index 00000000000..9d90d4bef82 --- /dev/null +++ b/www/addons/mod/data/lang/fa.json @@ -0,0 +1,33 @@ +{ + "addentries": "داده‌هایی را اضافه کنید", + "advancedsearch": "جستجوی پیشرفته", + "alttext": "متن جایگزین", + "approve": "تایید", + "approved": "وضعیت تایید", + "ascending": "صعودی", + "authorfirstname": "نام وارد کننده", + "authorlastname": "نام خانوادگی وارد کننده", + "confirmdeleterecord": "آیا مطمئن هستید که می‌خواهید این مورد را حذف کنید؟", + "descending": "نزولی", + "emptyaddform": "شما هیچ فیلدی را پر نکردید!", + "entrieslefttoadd": "برای کامل کردن این فعالیت باید {{$a.entriesleft}} دادهٔ دیگر وارد کنید", + "entrieslefttoaddtoview": "باید {{$a.entrieslefttoview}} دادهٔ دیگر وارد کنید تا بتوانید داده‌های وارد شده توسط سایرین را ببینید.", + "expired": "متأسفیم، این فعالیت در {{$a}} بسته شد و دیگر در دسترس نیست", + "fields": "فیلدها", + "menuchoose": "انتخاب کنید...", + "more": "نمایش جزئیات", + "nomatch": "دادهٔ مطابقی پیدا نشد!", + "norecords": "بانک اطلاعاتی خالی است", + "notapproved": "دادهٔ ورودی هنوز تایید نشده است.", + "notopenyet": "با عرض پوزش، این فعالیت تا قبل از {{$a}} در دسترس نیست", + "numrecords": "{{$a}} دادهٔ ورودی", + "other": "غیره", + "recordapproved": "دادهٔ ورودی تایید شد", + "recorddeleted": "حذف شد", + "resetsettings": "بازنشانی فیلترها", + "restore": "بازیابی", + "search": "جستجو", + "selectedrequired": "تمامی گزینه‌های انتخاب شده لازم هستند", + "timeadded": "زمان اضافه شدن", + "timemodified": "زمان آخرین تغییر" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/fr.json b/www/addons/mod/data/lang/fr.json new file mode 100644 index 00000000000..777e6974ade --- /dev/null +++ b/www/addons/mod/data/lang/fr.json @@ -0,0 +1,38 @@ +{ + "addentries": "Ajouter des fiches", + "advancedsearch": "Recherche avancée", + "alttext": "Texte alternatif", + "approve": "Approuver", + "approved": "Approuvé", + "ascending": "Ascendant", + "authorfirstname": "Prénom auteur", + "authorlastname": "Nom auteur", + "confirmdeleterecord": "Voulez-vous vraiment supprimer cette fiche ?", + "descending": "Descendant", + "disapprove": "Retirer l'approbation", + "emptyaddform": "Vous n'avez rempli aucun champ !", + "entrieslefttoadd": "Vous devez ajouter encore {{$a.entriesleft}} fiches pour terminer cette activité", + "entrieslefttoaddtoview": "Vous devez ajouter encore {{$a.entrieslefttoview}} fiches avant de pouvoir consulter les fiches des autres participants.", + "errormustsupplyvalue": "Veuillez renseigner une valeur.", + "expired": "Cette activité est fermée depuis {{$a}} et n'est plus disponible", + "fields": "Champs", + "latlongboth": "La latitude et la longitude sont requises.", + "menuchoose": "Sélectionner...", + "more": "Plus", + "nomatch": "Aucune fiche trouvée !", + "norecords": "Aucune fiche dans la base de données", + "notapproved": "La fiche n'est pas encore approuvée.", + "notopenyet": "Cette activité n'est pas disponible avant le {{$a}}", + "numrecords": "{{$a}} fiches", + "other": "Autre", + "recordapproved": "Fiche approuvée", + "recorddeleted": "Fiche supprimée", + "recorddisapproved": "Fiche désapprouvée", + "resetsettings": "Réinitialiser les filtres", + "restore": "Restauration", + "search": "Recherche", + "selectedrequired": "Toute la sélection requise", + "timeadded": "Date ajout", + "timemodified": "Date modification", + "usedate": "Inclure dans la recherche." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/he.json b/www/addons/mod/data/lang/he.json new file mode 100644 index 00000000000..8ec3817a5c1 --- /dev/null +++ b/www/addons/mod/data/lang/he.json @@ -0,0 +1,38 @@ +{ + "addentries": "הוספת פריטים", + "advancedsearch": "חיפוש מורחב", + "alttext": "תוכן חלופי", + "approve": "אישור", + "approved": "מאושר", + "ascending": "בסדר עולה", + "authorfirstname": "שם פרטי של המחבר", + "authorlastname": "שם משפחה של המחבר", + "confirmdeleterecord": "האם למחוק את הפריט הזה?", + "descending": "בסדר יורד", + "disapprove": "ביטול האישור", + "emptyaddform": "לא מילאת אף שדה!", + "entrieslefttoadd": "יש להזין {{$a.entriesleft}} פריטים נוספים בכדי להשלים פעילות זו", + "entrieslefttoaddtoview": "יש להזין {{$a.entrieslefttoview}} פריטים נוספים בכדי לראות פריטים של משתתפים אחרים.", + "errormustsupplyvalue": "יש להזין ערך בשדה זה.", + "expired": "מצטערים, פעילות זו נסגרה ב {{$a}} ואיננה זמינה יותר.", + "fields": "שדות", + "latlongboth": "נדרשים נתוני קו־רוחב וגם קו־אורך", + "menuchoose": "יש לבחור...", + "more": "עוד", + "nomatch": "לא נמצאו פריטים מתאימים!", + "norecords": "אין פריטים בבסיס הנתונים", + "notapproved": "הפריט עדיין לא אושר.", + "notopenyet": "מצטערים, פעילות זו איננה זמינה עד {{$a}} .", + "numrecords": "{{$a}} פריטים", + "other": "אחר", + "recordapproved": "הפריט אושר", + "recorddeleted": "הפריט נמחק", + "recorddisapproved": "הפריט לא מאושר", + "resetsettings": "איפוס שדות", + "restore": "שחזור", + "search": "חיפוש", + "selectedrequired": "כל הנבחרים דרושים", + "timeadded": "זמן הוספה", + "timemodified": "זמן עדכון", + "usedate": "כלול בחיפוש" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/hu.json b/www/addons/mod/data/lang/hu.json new file mode 100644 index 00000000000..bfca2794430 --- /dev/null +++ b/www/addons/mod/data/lang/hu.json @@ -0,0 +1,38 @@ +{ + "addentries": "Bejegyzések hozzáadása", + "advancedsearch": "Részletes keresés", + "alttext": "Alternatív szöveg", + "approve": "Jóváhagy", + "approved": "Jóváhagyva", + "ascending": "Növekvő", + "authorfirstname": "Szerző keresztneve", + "authorlastname": "Szerző vezetékneve", + "confirmdeleterecord": "Biztosan törölni akarja ezt a bejegyzést?", + "descending": "Csökkenő", + "disapprove": "Jóváhagyás elvetése", + "emptyaddform": "Nem töltött ki egy mezőt sem!", + "entrieslefttoadd": "A tevékenység befejezéséhez {{$a.entriesleft}} további tételt kell hozzáadnia.", + "entrieslefttoaddtoview": "Még {{$a.entrieslefttoview}} bejegyzést kell hozzáadnia, mielőtt megtekintheti más résztvevők bejegyzéseit.", + "errormustsupplyvalue": "Itt egy értéket kell megadnia.", + "expired": "A tevékenység {{$a}} időpontban lezárult és már nem érhető el.", + "fields": "Mezők", + "latlongboth": "Mind a szélesség, mind a hosszúság kitöltendő.", + "menuchoose": "Választás...", + "more": "Tovább", + "nomatch": "Nincs egyező fogalom!", + "norecords": "Nincsenek bejegyzések az adatbázisban", + "notapproved": "A bejegyzés még nincs jóváhagyva.", + "notopenyet": "A tevékenység {{$a}} időpontig nem elérhető.", + "numrecords": "{{$a}} bejegyzés", + "other": "Más", + "recordapproved": "Bejegyzés jóváhagyva", + "recorddeleted": "Bejegyzés törölve", + "recorddisapproved": "Nem jóváhagyott fogalom", + "resetsettings": "Szűrők visszaállítása", + "restore": "Helyreállítás", + "search": "Keresés", + "selectedrequired": "Minden kiválasztott szükséges", + "timeadded": "Időpont hozzáadva", + "timemodified": "Időpont módosult", + "usedate": "Keresésben szerepeljen." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/it.json b/www/addons/mod/data/lang/it.json new file mode 100644 index 00000000000..32e3bd0c051 --- /dev/null +++ b/www/addons/mod/data/lang/it.json @@ -0,0 +1,38 @@ +{ + "addentries": "Aggiungi record", + "advancedsearch": "Ricerca avanzata", + "alttext": "Testo alternativo", + "approve": "Approva", + "approved": "Approvato", + "ascending": "Crescente", + "authorfirstname": "Nome autore", + "authorlastname": "Cognome autore", + "confirmdeleterecord": "Stai per eliminare questo record. Ne sei certo?", + "descending": "Decrescente", + "disapprove": "Disapprova", + "emptyaddform": "Non hai riempito nessun campo!", + "entrieslefttoadd": "Per poter visualizzare i record inseriti dagli altri partecipanti è necessario inserire altri {{$a.entriesleft}} record.", + "entrieslefttoaddtoview": "Devi aggiungere {{$a.entrieslefttoview}} altri record prima di poter vedere i record degli altri partecipanti.", + "errormustsupplyvalue": "Devi inserire un valore.", + "expired": "Spiacente, l'attività non è più disponibile poiché è stata chiusa il {{$a}} ", + "fields": "Campi", + "latlongboth": "Devi compilare sia la latitudine sia la longitudine.", + "menuchoose": "Scegli...", + "more": "Dettagli", + "nomatch": "Non è stato trovato nessun record che corrisponda!", + "norecords": "Nessun record è presente nel Database", + "notapproved": "Il record inserito è in attesa di essere approvato.", + "notopenyet": "Spiacente, questa attività non sarà disponibile prima del {{$a}}", + "numrecords": "{{$a}} record", + "other": "Altro", + "recordapproved": "Record approvati", + "recorddeleted": "Il record è stato eliminato", + "recorddisapproved": "Record disapprovato", + "resetsettings": "Reimposta filtri", + "restore": "Ripristino", + "search": "Cerca", + "selectedrequired": "Necessari tutti i selezionati", + "timeadded": "Data/ora inserimento", + "timemodified": "Data/ora modifica", + "usedate": "Includi nella ricerca." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/ja.json b/www/addons/mod/data/lang/ja.json new file mode 100644 index 00000000000..9a3ae2261e4 --- /dev/null +++ b/www/addons/mod/data/lang/ja.json @@ -0,0 +1,38 @@ +{ + "addentries": "エントリを追加する", + "advancedsearch": "高度な検索", + "alttext": "代替テキスト", + "approve": "承認", + "approved": "承認日時", + "ascending": "昇順", + "authorfirstname": "著者の名", + "authorlastname": "著者の姓", + "confirmdeleterecord": "本当にこのエントリを削除してもよろしいですか?", + "descending": "降順", + "disapprove": "承認を取り消す", + "emptyaddform": "あなたはどのフィールドにも入力していません!", + "entrieslefttoadd": "この活動を完了するにはさらに {{$a.entriesleft}} 件以上のエントリを追加してください。", + "entrieslefttoaddtoview": "他の参加者のエントリを閲覧するにはさらに {{$a.entrieslefttoview}} 件以上のエントリを追加してください。", + "errormustsupplyvalue": "あなたはここで値を提供する必要があります。", + "expired": "申し訳ございません、この活動は {{$a}} に終了して利用することはできません。", + "fields": "フィールド", + "latlongboth": "緯度および経度の両方とも必須です。", + "menuchoose": "選択 ...", + "more": "詳細", + "nomatch": "該当するエントリが見つかりませんでした!", + "norecords": "データベースにエントリはありません。", + "notapproved": "エントリはまだ承認されていません。", + "notopenyet": "申し訳ございません、この活動は {{$a}} まで利用できません。", + "numrecords": "{{$a}} エントリ", + "other": "その他", + "recordapproved": "エントリが承認されました。", + "recorddeleted": "エントリが削除されました。", + "recorddisapproved": "エントリ未承認", + "resetsettings": "フィルタをリセットする", + "restore": "リストア", + "search": "検索", + "selectedrequired": "選択したすべてを含む", + "timeadded": "追加日時", + "timemodified": "修正日時", + "usedate": "検索に含む" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/lt.json b/www/addons/mod/data/lang/lt.json new file mode 100644 index 00000000000..ea0077d0407 --- /dev/null +++ b/www/addons/mod/data/lang/lt.json @@ -0,0 +1,38 @@ +{ + "addentries": "Įtraukti įrašus", + "advancedsearch": "Išplėstinė paieška", + "alttext": "Alternatyvusis tekstas", + "approve": "Patvirtinti", + "approved": "Patvirtinta", + "ascending": "Didėjimo tvarka", + "authorfirstname": "Autoriaus vardas", + "authorlastname": "Autoriaus pavardė", + "confirmdeleterecord": "Ar tikrai norite naikinti šį įrašą?", + "descending": "Mažėjimo tvarka", + "disapprove": "Atšaukti patvirtinimą", + "emptyaddform": "Neužpildėte jokių laukų!", + "entrieslefttoadd": "Turite įtraukti dar {{$a.entriesleft}} įrašus (-ų), kad galėtumėte užbaigti šią veiklą", + "entrieslefttoaddtoview": "Turite įtraukti dar {{$a.entrieslefttoview}} įrašus (-ų), kad galėtumėte peržiūrėti kitų dalyvių įrašus.", + "errormustsupplyvalue": "Privalote pateikti reikšmę čia.", + "expired": "Apgailestaujame, ši veikla uždaryta {{$a}} ir nebegalima", + "fields": "Laukai", + "latlongboth": "Abu, platuma ir ilguma, yra privalomi.", + "menuchoose": "Pasirinkite...", + "more": "Daugiau", + "nomatch": "Nerasta atitinkančių įrašų!", + "norecords": "Duomenų bazėje nėra įrašų", + "notapproved": "Įrašas dar nepatvirtintas.", + "notopenyet": "Apgailestaujame, ši veikla negalima iki {{$a}}", + "numrecords": "{{$a}} įrašai (-ų)", + "other": "Kita", + "recordapproved": "Įrašas patvirtintas", + "recorddeleted": "Įrašas panaikintas", + "recorddisapproved": "Įrašas nepatvirtintas", + "resetsettings": "Nustatyti filtrus iš naujo", + "restore": "Atkurti", + "search": "Ieškoti", + "selectedrequired": "Visi pasirinkti būtini", + "timeadded": "Įtraukimo laikas", + "timemodified": "Modifikavimo laikas", + "usedate": "Įtraukti į paiešką." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/nl.json b/www/addons/mod/data/lang/nl.json new file mode 100644 index 00000000000..d4cbe01011f --- /dev/null +++ b/www/addons/mod/data/lang/nl.json @@ -0,0 +1,38 @@ +{ + "addentries": "Items goedkeuren", + "advancedsearch": "Geavanceerd zoeken", + "alttext": "Alternatieve tekst", + "approve": "Goedkeuren", + "approved": "Goedgekeurd", + "ascending": "Oplopend", + "authorfirstname": "Voornaam auteur", + "authorlastname": "Achternaam auteur", + "confirmdeleterecord": "Je gaat deze record verwijderen. Ben je zeker?", + "descending": "Aflopend", + "disapprove": "Verwerp", + "emptyaddform": "Je hebt geen velden ingevuld!", + "entrieslefttoadd": "Je moet {{$a.entriesleft}} meer item(s) ingeven voor je de items van anderen kunt zien.", + "entrieslefttoaddtoview": "je moet {{$a.entrieslefttoview}} items meer toevoegen voor je de items van anderen kan zien.", + "errormustsupplyvalue": "Je moet hier een waarde geven.", + "expired": "Deze activiteit is gesloten op {{$a}} en is niet langer beschikbaar", + "fields": "Velden", + "latlongboth": "Zowel de breedtegraad als de lengtegraad zijn vereist.", + "menuchoose": "Kies...", + "more": "Meer", + "nomatch": "Geen overeenkomende items gevonden", + "norecords": "Geen items in de databank", + "notapproved": "Item is nog niet goedgekeurd", + "notopenyet": "Deze actieviteit is niet beschikbaar tot {{$a}}", + "numrecords": "{{$a}} records", + "other": "Andere", + "recordapproved": "Item goedgekeurd", + "recorddeleted": "Record verwijderd", + "recorddisapproved": "Item verworpen", + "resetsettings": "Reset filters", + "restore": "Terugzetten", + "search": "Zoek", + "selectedrequired": "Alle geselecteerde vereist", + "timeadded": "Toegevoegd op", + "timemodified": "Gewijzigd op", + "usedate": "Ook zoeken" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/pl.json b/www/addons/mod/data/lang/pl.json new file mode 100644 index 00000000000..9d0f4a0409b --- /dev/null +++ b/www/addons/mod/data/lang/pl.json @@ -0,0 +1,38 @@ +{ + "addentries": "Dodaj wpisy", + "advancedsearch": "Wyszukiwanie zaawansowane", + "alttext": "Alternatywny tekst", + "approve": "Zatwierdź", + "approved": "Zatwierdzony", + "ascending": "Rosnąco", + "authorfirstname": "Imię autora", + "authorlastname": "Nazwisko autora", + "confirmdeleterecord": "Na pewno chcesz usunąć ten wpis?", + "descending": "Malejąco", + "disapprove": "Cofnij zatwierdzenie", + "emptyaddform": "Nie wypełniłeś wszystkich pól", + "entrieslefttoadd": "Musisz dodać {{$a.entriesleft}} więcej wpisów, aby zakończyć tą aktywność", + "entrieslefttoaddtoview": "Musisz dodać {{$a.entrieslefttoview}} więcej wpisów, aby móc wyświetlać wpisy innych użytkowników.", + "errormustsupplyvalue": "Musisz podać wartość tutaj.", + "expired": "Niestety, ta aktywność została zamknięta {{$a}} i nie jest już dłużej dostępna", + "fields": "Pola", + "latlongboth": "Wymagana jest zarówno szerokość i długość geograficzna.", + "menuchoose": "Wybierz...", + "more": "Więcej", + "nomatch": "Żaden wpis nie został znaleziony.", + "norecords": "Brak wpisów w bazie danych", + "notapproved": "Wpis nie jest jeszcze zatwierdzony.", + "notopenyet": "Niestety, ta aktywność jest niedostępna aż do {{$a}}", + "numrecords": "{{$a}} wpisów", + "other": "Inne", + "recordapproved": "Wpis zatwierdzony", + "recorddeleted": "Wpis usunięty", + "recorddisapproved": "Wpis odrzucony", + "resetsettings": "Resetuj pola", + "restore": "Odtwórz", + "search": "Szukaj", + "selectedrequired": "Wszystkie zaznaczone są wymagane", + "timeadded": "Dodano czas", + "timemodified": "Zmodyfikowano czas", + "usedate": "Uwzględnij w wyszukiwaniu." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/pt-br.json b/www/addons/mod/data/lang/pt-br.json new file mode 100644 index 00000000000..4b8d2b11374 --- /dev/null +++ b/www/addons/mod/data/lang/pt-br.json @@ -0,0 +1,38 @@ +{ + "addentries": "Acrescentar itens", + "advancedsearch": "Busca avançada", + "alttext": "Texto alternativo", + "approve": "Aprovar", + "approved": "Aprovado", + "ascending": "Crescente", + "authorfirstname": "Nome do autor", + "authorlastname": "Sobrenome do autor", + "confirmdeleterecord": "Tem certeza que quer excluir este item?", + "descending": "Decrescente", + "disapprove": "Desfazer aprovação", + "emptyaddform": "Você não completou nenhum campo!", + "entrieslefttoadd": "Você precisa adicionar mais {{$a.entriesleft}} item(ns) para completar esta atividade", + "entrieslefttoaddtoview": "Você precisa adicionar mais {{$a.entrieslefttoview}} item(ns) antes de poder ver os itens dos outros participantes.", + "errormustsupplyvalue": "Você precisa fornecer um valor aqui.", + "expired": "Sinto muito, mas esta atividade foi fechada em {{$a}} e não está mais disponível", + "fields": "Campos", + "latlongboth": "Tanto a Latitude quanto a Longitude devem ser preenchidas.", + "menuchoose": "Selecionar...", + "more": "Mais", + "nomatch": "Nenhum item correspondente encontrado!", + "norecords": "Nenhum item na base de dados", + "notapproved": "O item ainda não foi aprovado.", + "notopenyet": "Desculpe, esta atividade não está disponível até {{$a}}", + "numrecords": "{{$a}} itens", + "other": "Outro", + "recordapproved": "Item aprovado", + "recorddeleted": "Item cancelado", + "recorddisapproved": "Entrada não aprovada", + "resetsettings": "Reconfigurar filtros", + "restore": "Restaurar", + "search": "Busca", + "selectedrequired": "Todos os itens selecionados são obrigatórios", + "timeadded": "Tempo adicionado", + "timemodified": "Tempo modificado", + "usedate": "Incluir na pesquisa." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/pt.json b/www/addons/mod/data/lang/pt.json new file mode 100644 index 00000000000..8da56197e36 --- /dev/null +++ b/www/addons/mod/data/lang/pt.json @@ -0,0 +1,38 @@ +{ + "addentries": "Adicionar registos", + "advancedsearch": "Pesquisa avançada", + "alttext": "Texto alternativo", + "approve": "Aprovar", + "approved": "Aprovado", + "ascending": "Ascendente", + "authorfirstname": "Primeiro nome do autor", + "authorlastname": "Apelido do autor", + "confirmdeleterecord": "Tem a certeza de que pretende apagar este registo?", + "descending": "Descendente", + "disapprove": "Anular aprovação", + "emptyaddform": "Não preencheu nenhum campo!", + "entrieslefttoadd": "Tem que adicionar mais {{$a.entriesleft}} registo(s) para completar esta atividade", + "entrieslefttoaddtoview": "Tem que adicionar mais {{$a.entrieslefttoview}} registos para conseguir visualizar as entradas dos outros participantes.", + "errormustsupplyvalue": "Indique aqui um valor.", + "expired": "A atividade terminou em {{$a}} e não se encontra disponível", + "fields": "Campos", + "latlongboth": "É necessário a latitude e a longitude.", + "menuchoose": "Selecione...", + "more": "Mais", + "nomatch": "Não foram encontrados registos correspondentes!", + "norecords": "Não existem registos na base de dados", + "notapproved": "O registo ainda não foi aprovado.", + "notopenyet": "A atividade apenas será disponibilizada em {{$a}}", + "numrecords": "{{$a}} registos", + "other": "Outro", + "recordapproved": "Registo aprovado", + "recorddeleted": "Registo apagado", + "recorddisapproved": "Entrada não aprovada", + "resetsettings": "Reiniciar filtros", + "restore": "Restaurar", + "search": "Pesquisar", + "selectedrequired": "Todos os selecionados são obrigatórios", + "timeadded": "Data de criação", + "timemodified": "Data da última edição", + "usedate": "Incluir na pesquisa." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/ro.json b/www/addons/mod/data/lang/ro.json new file mode 100644 index 00000000000..0f73ca747ca --- /dev/null +++ b/www/addons/mod/data/lang/ro.json @@ -0,0 +1,37 @@ +{ + "addentries": "Adaugă articole", + "advancedsearch": "Căutare complexă", + "alttext": "Text alternativ", + "approve": "Aprobă", + "approved": "Aprobat", + "ascending": "Crescător", + "authorfirstname": "Prenume autor", + "authorlastname": "Nume autor", + "confirmdeleterecord": "Sunteţi sigur că doriţi să ştergeţi acest articol?", + "descending": "Descrescător", + "disapprove": "Anulați aprobarea", + "emptyaddform": "Nu aţi completat niciun câmp!", + "entrieslefttoadd": "Pentru a finaliza această activitate trebuie să mai adăugaţi {{$a.entriesleft}} more entry/entries articole", + "entrieslefttoaddtoview": "Pentru a vedea articolele postate de ceilalţi participanţi trebuie să mai adăugaţi {{$a.entrieslefttoview}} articole.", + "errormustsupplyvalue": "Trebuie să inserați o valoare aici.", + "expired": "Ne pare rău, activitatea s-a închis în {{$a}} și nu mai este disponibilă", + "fields": "Câmpuri", + "menuchoose": "Alegeţi...", + "more": "Detalii suplimentare", + "nomatch": "Nu s-au găsit articole care să corespundă criteriilor selectate!", + "norecords": "Nu s-au găsit articole în baza de date", + "notapproved": "Acest articol nu a fost încă aprobat.", + "notopenyet": "Ne pare rău, această activitate nu este disponibilă până în {{$a}}", + "numrecords": "{{$a}} articole", + "other": "Altele", + "recordapproved": "Articol aprobat", + "recorddeleted": "Articol şters", + "recorddisapproved": "Postare neaprobată", + "resetsettings": "Resetează filtre", + "restore": "Restaurează", + "search": "Căutare", + "selectedrequired": "Toate elementele selectate sunt obligatorii", + "timeadded": "Ora la care a fost adăugat", + "timemodified": "Ora la care a fost modificat", + "usedate": "Include în căutare" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/ru.json b/www/addons/mod/data/lang/ru.json new file mode 100644 index 00000000000..5598d7b1238 --- /dev/null +++ b/www/addons/mod/data/lang/ru.json @@ -0,0 +1,38 @@ +{ + "addentries": "Добавить записи", + "advancedsearch": "Расширенный поиск", + "alttext": "Альтернативный текст", + "approve": "Одобрить", + "approved": "Одобрено", + "ascending": "По возрастанию", + "authorfirstname": "Имя автора", + "authorlastname": "Фамилия автора", + "confirmdeleterecord": "Вы уверены, что хотите удалить эту запись?", + "descending": "По убыванию", + "disapprove": "Отменить одобрение", + "emptyaddform": "Вы не заполнили ни одного поля", + "entrieslefttoadd": "Чтобы просматривать записи других участников Вы должны добавить еще записи - ({{$a.entriesleft}})", + "entrieslefttoaddtoview": "Вы должны еще добавить записи ({{$a.entrieslefttoview}}), прежде чем сможете просматривать записи других участников.", + "errormustsupplyvalue": "Вы должны здесь указать значение.", + "expired": "К сожалению, эта база данных закрыта {{$a}} и больше не доступна", + "fields": "Поля", + "latlongboth": "Необходимо задать и широту, и долготу.", + "menuchoose": "Выбрать...", + "more": "Просмотр записи", + "nomatch": "Соответствующих записей не найдено!", + "norecords": "Нет записей в базе данных", + "notapproved": "Запись пока не одобрена.", + "notopenyet": "Извините, этот элемент курса не доступен до {{$a}}", + "numrecords": "{{$a}} записей", + "other": "Другое", + "recordapproved": "Запись одобрена", + "recorddeleted": "Запись удалена", + "recorddisapproved": "Снято одобрение записи", + "resetsettings": "Сбросить фильтры", + "restore": "Восстановить", + "search": "Поиск", + "selectedrequired": "Требуются все выбранные", + "timeadded": "Время добавления", + "timemodified": "Время изменения", + "usedate": "Включить в поиск" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/sr-cr.json b/www/addons/mod/data/lang/sr-cr.json new file mode 100644 index 00000000000..6a73cae005c --- /dev/null +++ b/www/addons/mod/data/lang/sr-cr.json @@ -0,0 +1,38 @@ +{ + "addentries": "Додај уносе", + "advancedsearch": "Напредно претраживање", + "alttext": "Алтернативни текст", + "approve": "Одобри", + "approved": "Одобрено", + "ascending": "Растуће", + "authorfirstname": "Име аутора", + "authorlastname": "Презиме аутора", + "confirmdeleterecord": "Да ли сте сигурни да желите да обришете овај унос?", + "descending": "Опадајуће", + "disapprove": "Повуци одобрење", + "emptyaddform": "Нисте испунили ниједно поље!", + "entrieslefttoadd": "Морате да додате још {{$a.entriesleft}} унос(а) како бисте завршили ову активност", + "entrieslefttoaddtoview": "Морате да додате још {{$a.entrieslefttoview}} уноса пре него што будете могли да видите уносе других корисника.", + "errormustsupplyvalue": "Морате овде задати вредност.", + "expired": "Нажалост, ова активност је затворена {$}} и више није доступна", + "fields": "Поља", + "latlongboth": "Поља за географску ширина и дужина су обавезна.", + "menuchoose": "Изаберите...", + "more": "Још", + "nomatch": "Нема уноса који се поклапају!", + "norecords": "Нема уноса у бази података", + "notapproved": "Унос још није одобрен", + "notopenyet": "Нажалост, ова активност није доступна до {{$a}}", + "numrecords": "{{$a}} уноса", + "other": "Друго", + "recordapproved": "Унос је одобрен", + "recorddeleted": "Унос је обрисан", + "recorddisapproved": "Унос није одобрен", + "resetsettings": "Ресетуј филтере", + "restore": "Рестаурирање резервнe копијe", + "search": "Тражи", + "selectedrequired": "Све изабрано обавезно", + "timeadded": "Време додавања", + "timemodified": "Време измене", + "usedate": "Укључи у претраживање." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/sr-lt.json b/www/addons/mod/data/lang/sr-lt.json new file mode 100644 index 00000000000..68b43ff3628 --- /dev/null +++ b/www/addons/mod/data/lang/sr-lt.json @@ -0,0 +1,38 @@ +{ + "addentries": "Dodaj unose", + "advancedsearch": "Napredno pretraživanje", + "alttext": "Alternativni tekst", + "approve": "Odobri", + "approved": "Odobreno", + "ascending": "Rastuće", + "authorfirstname": "Ime autora", + "authorlastname": "Prezime autora", + "confirmdeleterecord": "Da li ste sigurni da želite da obrišete ovaj unos?", + "descending": "Opadajuće", + "disapprove": "Povuci odobrenje", + "emptyaddform": "Niste ispunili nijedno polje!", + "entrieslefttoadd": "Morate da dodate još {{$a.entriesleft}} unos(a) kako biste završili ovu aktivnost", + "entrieslefttoaddtoview": "Morate da dodate još {{$a.entrieslefttoview}} unosa pre nego što budete mogli da vidite unose drugih korisnika.", + "errormustsupplyvalue": "Morate ovde zadati vrednost.", + "expired": "Nažalost, ova aktivnost je zatvorena {$}} i više nije dostupna", + "fields": "Polja", + "latlongboth": "Polja za geografsku širina i dužina su obavezna.", + "menuchoose": "Izaberite...", + "more": "Još", + "nomatch": "Nema unosa koji se poklapaju!", + "norecords": "Nema unosa u bazi podataka", + "notapproved": "Unos još nije odobren", + "notopenyet": "Nažalost, ova aktivnost nije dostupna do {{$a}}", + "numrecords": "{{$a}} unosa", + "other": "Drugo", + "recordapproved": "Unos je odobren", + "recorddeleted": "Unos je obrisan", + "recorddisapproved": "Unos nije odobren", + "resetsettings": "Resetuj filtere", + "restore": "Restauriranje rezervne kopije", + "search": "Traži", + "selectedrequired": "Sve izabrano obavezno", + "timeadded": "Vreme dodavanja", + "timemodified": "Vreme izmene", + "usedate": "Uključi u pretraživanje." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/sv.json b/www/addons/mod/data/lang/sv.json new file mode 100644 index 00000000000..9a13c464c2e --- /dev/null +++ b/www/addons/mod/data/lang/sv.json @@ -0,0 +1,34 @@ +{ + "addentries": "Lägg till bidrag", + "advancedsearch": "Avancerad sökning", + "alttext": "Alternativ text", + "approve": "Godkänn", + "approved": "Godkänd", + "ascending": "Stigande", + "authorfirstname": "Författarens förnamn", + "authorlastname": "Författarens efternamn", + "confirmdeleterecord": "Är Du säker på att du vill ta bort det här bidraget?", + "descending": "Fallande", + "emptyaddform": "Du fyllde inte i alla fält!", + "entrieslefttoadd": "Du måste lägga till {{$a.entriesleft}} fler bidrag för att fullfölja den här aktiviteten.", + "entrieslefttoaddtoview": "Du måste lägga till {{$a.entrieslefttoview}} fler bidrag innan du kan få se de andra deltagarnas bidrag.", + "expired": "Den här aktiviteten stängdes tyvärr den {{$a}} och är inte längre tillgänglig.", + "fields": "Fält", + "menuchoose": "Välj...", + "more": "Fler", + "nomatch": "Det gick inte att hitta några matchande bidrag!", + "norecords": "Det finns inga bidrag i databasen", + "notapproved": "Bidraget är inte godkänt än", + "notopenyet": "Den här aktiviteten är tyvärr inte tillgänglig förrän {$}}", + "numrecords": "{{$a}} bidrag", + "other": "Övrigt", + "recordapproved": "Bidraget har godkänts", + "recorddeleted": "Bidraget har tagits bort", + "resetsettings": "Filter för återställning", + "restore": "Återställ", + "search": "Sök", + "selectedrequired": "Alla de valda är obligatoriska", + "timeadded": "Tillagd när", + "timemodified": "Modifierad när", + "usedate": "Ta med i sökning" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/tr.json b/www/addons/mod/data/lang/tr.json new file mode 100644 index 00000000000..6b427b298c4 --- /dev/null +++ b/www/addons/mod/data/lang/tr.json @@ -0,0 +1,38 @@ +{ + "addentries": "Kayıtları ekle", + "advancedsearch": "Gelişmiş arama", + "alttext": "Alternatif metin", + "approve": "Onayla", + "approved": "Onaylandı", + "ascending": "Artan", + "authorfirstname": "Yazarın adı", + "authorlastname": "Yazarın soyadı", + "confirmdeleterecord": "Bu kaydı silmek istediğinizden emin misiniz?", + "descending": "Azalan", + "disapprove": "Onayı geri al", + "emptyaddform": "Hiçbir alanı doldurmadınız!", + "entrieslefttoadd": "Bu etkinliği bitirmek için {{$a.entriesleft}} kayıt daha eklemelisiniz.", + "entrieslefttoaddtoview": "Diğer katılımcıların kayıtlarını görebilmek için {{$a.entrieslefttoview}} kayıt daha eklemelisiniz.", + "errormustsupplyvalue": "Burada bir değer vermelisiniz.", + "expired": "Maalesef, bu etkinlik {{$a}} tarihinde kapandı ve artık mevcut değil", + "fields": "Alanlar", + "latlongboth": "Enlem ve boylam gereklidir.", + "menuchoose": "Seç...", + "more": "Dahası", + "nomatch": "Eşleşen kayıt bulunamadı!", + "norecords": "Veritabanında kayıt yok", + "notapproved": "Kayıt henüz onaylanmamış.", + "notopenyet": "Üzgünüz, bu etkinlik {{$a}} kadar kullanılamıyor", + "numrecords": "{{$a}} kayıt", + "other": "Diğer", + "recordapproved": "Kayıt onaylandı", + "recorddeleted": "Kayıt silindi", + "recorddisapproved": "Giriş onaylanmadı", + "resetsettings": "Alanları Temizle", + "restore": "Geri yükle", + "search": "Ara", + "selectedrequired": "Tüm seçililer gereklidir", + "timeadded": "Ekleme zamanı", + "timemodified": "Düzenleme zamanı", + "usedate": "Aramaya dahil et." +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/uk.json b/www/addons/mod/data/lang/uk.json new file mode 100644 index 00000000000..ceb6004b6ca --- /dev/null +++ b/www/addons/mod/data/lang/uk.json @@ -0,0 +1,38 @@ +{ + "addentries": "Додати записи", + "advancedsearch": "Розширений пошук", + "alttext": "Альтернативний текст", + "approve": "Прийняти", + "approved": "Прийнято", + "ascending": "за зростанням", + "authorfirstname": "Ім’я автора", + "authorlastname": "Прізвище автора", + "confirmdeleterecord": "Ви впевнені, що хочете видалити цей запис?", + "descending": "за спаданням", + "disapprove": "Скасувати схвалення", + "emptyaddform": "Ви не заповнили жодного поля!", + "entrieslefttoadd": "Вам потрібно додати більше чим {{$a}} записів перед тим, як ви зможете побачити записи інших учасників.", + "entrieslefttoaddtoview": "Ви повинні ввести більше чим {{$a.entrieslefttoview}} запис(ів) перед тим, як матимете змогу бачити записи інших.", + "errormustsupplyvalue": "Ви повинні тут вказати значення.", + "expired": "На жаль, ця діяльність закрита на {{$a}} і більше не доступна", + "fields": "Поля", + "latlongboth": "Широта і довгота є обов’язковими.", + "menuchoose": "Вибрати...", + "more": "Детальний перегляд...", + "nomatch": "Жодного запису не знайдено!", + "norecords": "Немає записів у базі даних", + "notapproved": "Запис ще не схвалено", + "notopenyet": "ця діяльність не доступна до {{$a}}", + "numrecords": "{{$a}} записів", + "other": "Інше", + "recordapproved": "Запис погоджено", + "recorddeleted": "Запис вилучено", + "recorddisapproved": "Запис не схвалено", + "resetsettings": "Скинути фільтри", + "restore": "Відновлення", + "search": "Пошук", + "selectedrequired": "Всі відібрані вимоги", + "timeadded": "Час введення", + "timemodified": "Час модифікації", + "usedate": "Включити в пошук" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/zh-cn.json b/www/addons/mod/data/lang/zh-cn.json new file mode 100644 index 00000000000..071feda8d5d --- /dev/null +++ b/www/addons/mod/data/lang/zh-cn.json @@ -0,0 +1,37 @@ +{ + "addentries": "添加条目", + "advancedsearch": "高级搜索", + "alttext": "可替代文本", + "approve": "批准", + "approved": "许可", + "ascending": "升序", + "authorfirstname": "姓", + "authorlastname": "名", + "confirmdeleterecord": "您确定要删除这条记录?", + "descending": "降序", + "disapprove": "撤消审核", + "emptyaddform": "您未填写任何字段", + "entrieslefttoadd": "在完成此活动前,您还需添加 {{$a.entriesleft}} 条目", + "entrieslefttoaddtoview": "在查看其他参与者的条目前,您还需添加 {{$a.entrieslefttoview}} 条目", + "errormustsupplyvalue": "这儿你必须提供一个值。", + "expired": "对不起,这项活动截止于{{$a}},不再有效", + "fields": "字段", + "menuchoose": "选择...", + "more": "更多", + "nomatch": "未找到匹配的条目", + "norecords": "数据库中无条目", + "notapproved": "条目尚未被核准。", + "notopenyet": "抱歉,此活动直到{{$a}}才可用", + "numrecords": "{{$a}} 条记录", + "other": "其他", + "recordapproved": "记录已核准", + "recorddeleted": "记录已删除", + "recorddisapproved": "不可进入", + "resetsettings": "重置字段", + "restore": "恢复", + "search": "搜索", + "selectedrequired": "全选", + "timeadded": "追加时间", + "timemodified": "编辑时间", + "usedate": "包含到搜索中。" +} \ No newline at end of file diff --git a/www/addons/mod/data/lang/zh-tw.json b/www/addons/mod/data/lang/zh-tw.json new file mode 100644 index 00000000000..0ca1685c558 --- /dev/null +++ b/www/addons/mod/data/lang/zh-tw.json @@ -0,0 +1,38 @@ +{ + "addentries": "新增條目", + "advancedsearch": "進階搜尋", + "alttext": "替代文字", + "approve": "審核", + "approved": "已核准", + "ascending": "升冪", + "authorfirstname": "作者的名字", + "authorlastname": "作者的姓氏", + "confirmdeleterecord": "您確定要刪除這筆資料嗎?", + "descending": "降冪", + "disapprove": "取消核准", + "emptyaddform": "您沒有填入任何欄位!", + "entrieslefttoadd": "在您要瀏覽其他同學提供的資料前,您必須要再新增{{$a.entriesleft}} 筆資料。", + "entrieslefttoaddtoview": "您必須新增{{$a.entrieslefttoview}}筆以上資料,才能夠看到其他同學提供的資料。", + "errormustsupplyvalue": "這裡你必須提供一個數值。", + "expired": "抱歉,這活動已經在 {{$a}}關閉,已經無法使用。", + "fields": "欄位", + "latlongboth": "緯度和經度兩者都要填寫", + "menuchoose": "選擇...", + "more": "更多", + "nomatch": "找不到符合的資料!", + "norecords": "資料庫中沒有資料", + "notapproved": "資料尚未審核。", + "notopenyet": "抱歉,這一活動要等到{{$a}}才開始", + "numrecords": "{{$a}} 筆資料", + "other": "其他", + "recordapproved": "資料已審核", + "recorddeleted": "資料已刪除", + "recorddisapproved": "不可進入", + "resetsettings": "重設欄位", + "restore": "還原", + "search": "搜尋", + "selectedrequired": "所有必要的選擇", + "timeadded": "新增的時間", + "timemodified": "修改的時間", + "usedate": "包含在搜尋中" +} \ No newline at end of file diff --git a/www/addons/mod/feedback/lang/cs.json b/www/addons/mod/feedback/lang/cs.json index 50c98674c0f..af958dc96ff 100644 --- a/www/addons/mod/feedback/lang/cs.json +++ b/www/addons/mod/feedback/lang/cs.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "Dotazník se souborem captcha nemůže být dokončen, pokud není nakonfigurován režim offline nebo s vypnutým serverem.", "complete_the_form": "Klikněte zde a odpovězte na otázky...", "completed_feedbacks": "Odevzdané odpovědi", - "continue_the_form": "Pokračovat ve formuláři", + "continue_the_form": "Pokračovat v zodpovídání otázek ...", "feedback_is_not_open": "Dotazník není přístupný", "feedback_submitted_offline": "Tento dotazník byl uložen k pozdějšímu odevzdání.", "feedbackclose": "Povolit odpovědi", diff --git a/www/addons/mod/feedback/lang/da.json b/www/addons/mod/feedback/lang/da.json index 55d1b3cd1ba..6147eb30f82 100644 --- a/www/addons/mod/feedback/lang/da.json +++ b/www/addons/mod/feedback/lang/da.json @@ -5,7 +5,7 @@ "average": "Gennemsnit", "complete_the_form": "Svar på spørgsmålene...", "completed_feedbacks": "Afleverede svar", - "continue_the_form": "Fortsæt formularen", + "continue_the_form": "Fortsæt med at besvare spørgsmålene", "feedback_is_not_open": "Feedbacken er ikke åben", "feedbackclose": "Tillad svar til", "feedbackopen": "Tillad svar fra", diff --git a/www/addons/mod/feedback/lang/de.json b/www/addons/mod/feedback/lang/de.json index 7c665bbb337..6484534ca06 100644 --- a/www/addons/mod/feedback/lang/de.json +++ b/www/addons/mod/feedback/lang/de.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "Ein Feedback mit Captcha kann offline nicht beendet werden. Captcha funktioniert nicht, wenn der Server nicht konfiguriert ist oder der Server nicht antwortet.", "complete_the_form": "Formular ausfüllen...", "completed_feedbacks": "Ausgefüllte Feedbacks", - "continue_the_form": "Ausfüllen fortsetzen", + "continue_the_form": "Beantwortung der Fragen fortsetzen ...", "feedback_is_not_open": "Feedback ist zu diesem Zeitpunkt nicht möglich", "feedback_submitted_offline": "Das Feedback wurde gespeichert, um es später zu übemitteln.", "feedbackclose": "Antworten erlauben bis", diff --git a/www/addons/mod/feedback/lang/es-mx.json b/www/addons/mod/feedback/lang/es-mx.json index 6c9cfa558f6..b09def04c16 100644 --- a/www/addons/mod/feedback/lang/es-mx.json +++ b/www/addons/mod/feedback/lang/es-mx.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "La retroalimentación con captcha no puede ser completada si no está configurada, si está en modo fuera-de-línea o con el servidor tirado.", "complete_the_form": "Responda a las preguntas...", "completed_feedbacks": "Respuestas enviadas", - "continue_the_form": "Continuar con el formato", + "continue_the_form": "Continuar contestando las preguntas...", "feedback_is_not_open": "La retroalimentación no está disponible", "feedback_submitted_offline": "Esta retroalimentación ha sido guardada para enviarse más tarde.", "feedbackclose": "Permitir respuestas a", diff --git a/www/addons/mod/feedback/lang/eu.json b/www/addons/mod/feedback/lang/eu.json index 1f74e6b554e..b0a1488eb4f 100644 --- a/www/addons/mod/feedback/lang/eu.json +++ b/www/addons/mod/feedback/lang/eu.json @@ -9,8 +9,8 @@ "continue_the_form": "Jarraitu formularioarekin", "feedback_is_not_open": "Inkesta ez dago zabalik", "feedback_submitted_offline": "Feedback hau beranduago bidaltzeko gorde da.", - "feedbackclose": "Noiz itxi inkesta", - "feedbackopen": "Noiz zabaldu inkesta", + "feedbackclose": "Noiz arte baimendu erantzunak", + "feedbackopen": "Noiztik baimendu erantzunak", "mapcourses": "Esleitu feedback-a ikastaroetarako", "mode": "Modua", "next_page": "Hurrengo orria", @@ -18,7 +18,7 @@ "non_anonymous_entries": "Sarrera anonimorik ez ({{$a}})", "non_respondents_students": "Erantzun ez duten ikasleak ({{$a}})", "not_selected": "Aukeratu gabea", - "not_started": "hasi gabea", + "not_started": "Hasi gabea", "numberoutofrange": "Tartetik kanpoko zenbakia", "overview": "Ikuspegi orokorra", "page_after_submit": "Osaketa-mezua", @@ -30,6 +30,6 @@ "save_entries": "Bidali zure erantzunak", "show_entries": "Erakutsi erantzunak", "show_nonrespondents": "Erakutsi erantzun gabeak", - "started": "hasita", + "started": "Hasita", "this_feedback_is_already_submitted": "Dagoeneko egina duzu jarduera hau." } \ No newline at end of file diff --git a/www/addons/mod/feedback/lang/fr.json b/www/addons/mod/feedback/lang/fr.json index 902851b6a51..26c4c2c0740 100644 --- a/www/addons/mod/feedback/lang/fr.json +++ b/www/addons/mod/feedback/lang/fr.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "Le feedback avec captcha ne peut pas être terminé s'il n'est pas configuré, en mode hors ligne ou si le serveur est arrêté.", "complete_the_form": "Répondre aux questions...", "completed_feedbacks": "Réponses envoyées", - "continue_the_form": "Continuer le formulaire", + "continue_the_form": "Continuer à répondre aux questions...", "feedback_is_not_open": "Le feedback n'est pas ouvert", "feedback_submitted_offline": "Ce feedback a été enregistré pour être remis plus tard.", "feedbackclose": "Permettre les réponses jusqu'au", diff --git a/www/addons/mod/feedback/lang/he.json b/www/addons/mod/feedback/lang/he.json index 52e5c8f67b8..d1cac22f250 100644 --- a/www/addons/mod/feedback/lang/he.json +++ b/www/addons/mod/feedback/lang/he.json @@ -1,7 +1,7 @@ { "analysis": "ניתוח", "anonymous": "אנונימי", - "anonymous_entries": "משובים אנונימיים", + "anonymous_entries": "משובים אנונימיים ({{$a}})", "average": "ממוצע", "complete_the_form": "מענה על השאלות...", "completed_feedbacks": "תשובות אשר הוגשו", diff --git a/www/addons/mod/feedback/lang/hu.json b/www/addons/mod/feedback/lang/hu.json index 4c096d23974..40c06756007 100644 --- a/www/addons/mod/feedback/lang/hu.json +++ b/www/addons/mod/feedback/lang/hu.json @@ -5,7 +5,7 @@ "average": "Átlag", "complete_the_form": "Válaszoljon a kérdésekre...", "completed_feedbacks": "Leadott válaszok", - "continue_the_form": "Űrlap folytatása", + "continue_the_form": "Kérdések megválaszolásának folytatása...", "feedback_is_not_open": "A visszajelzés nincs nyitva", "feedbackclose": "Válaszok engedélyezése a címzettnek", "feedbackopen": "Válaszok engedélyezése a feladótól", diff --git a/www/addons/mod/feedback/lang/ja.json b/www/addons/mod/feedback/lang/ja.json index cf75cb496e1..1fa5c5c7b9a 100644 --- a/www/addons/mod/feedback/lang/ja.json +++ b/www/addons/mod/feedback/lang/ja.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "Capchaつきのフィードバックは、未設定の場合、オフラインモードの場合、サーバがダウンしている場合には完了できません。", "complete_the_form": "質問に回答する ...", "completed_feedbacks": "送信済み回答", - "continue_the_form": "フォームを続ける", + "continue_the_form": "質問への回答を続ける ...", "feedback_is_not_open": "フィードバックは利用できません。", "feedback_submitted_offline": "このフィードバックを、あとで提出するために保存しました。", "feedbackclose": "フィードバック終了日時", diff --git a/www/addons/mod/feedback/lang/lt.json b/www/addons/mod/feedback/lang/lt.json index dbe395c1dd6..e08688c5507 100644 --- a/www/addons/mod/feedback/lang/lt.json +++ b/www/addons/mod/feedback/lang/lt.json @@ -5,7 +5,7 @@ "average": "Vidurkis", "complete_the_form": "Atsakyti klausimus...", "completed_feedbacks": "Pateikti atsakymai", - "continue_the_form": "Tęsti formą", + "continue_the_form": "Tęsti atsakymus į klausimus...", "feedback_is_not_open": "Atsiliepimas neatidarytas", "feedbackclose": "Uždaryti atsiliepimą", "feedbackopen": "Atidaryti atsiliepimą", diff --git a/www/addons/mod/feedback/lang/nl.json b/www/addons/mod/feedback/lang/nl.json index 92250c29608..32c689ca443 100644 --- a/www/addons/mod/feedback/lang/nl.json +++ b/www/addons/mod/feedback/lang/nl.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "Feedback met captcha kan niet voltooid worden als dat niet geconfigureerd is, in offline modus of wanneer de server onbereikbaar is.", "complete_the_form": "Beantwoord de vragen...", "completed_feedbacks": "Ingevulde antwoorden", - "continue_the_form": "Ga verder met dit formulier", + "continue_the_form": "Ga verder met het beantwoorden van de vragen...", "feedback_is_not_open": "De feedback is niet open", "feedback_submitted_offline": "Deze feedback is bewaard om later in te sturen.", "feedbackclose": "Antwoorden toestaan tot", diff --git a/www/addons/mod/feedback/lang/pt-br.json b/www/addons/mod/feedback/lang/pt-br.json index 98fb2ece613..bc007fed595 100644 --- a/www/addons/mod/feedback/lang/pt-br.json +++ b/www/addons/mod/feedback/lang/pt-br.json @@ -1,7 +1,7 @@ { "analysis": "Análise", "anonymous": "Anônimo", - "anonymous_entries": "Entradas anônimas", + "anonymous_entries": "Entradas anônimas ({{$a}})", "average": "Média", "complete_the_form": "Responda as questões...", "completed_feedbacks": "Respostas submetidas", @@ -13,10 +13,11 @@ "mode": "Modo", "next_page": "Próxima página", "non_anonymous": "O nome do usuário será registrado e mostrado com as respostas", - "non_anonymous_entries": "entradas não anônimas", - "non_respondents_students": "estudantes não respondentes", + "non_anonymous_entries": "Entradas não anônimas ({{$a}})", + "non_respondents_students": "Estudantes não respondentes ({{$a}})", "not_selected": "Não selecionado", "not_started": "não iniciado", + "numberoutofrange": "Valor fora do intervalo", "overview": "Visão geral", "page_after_submit": "Mensagem de conclusão", "preview": "Previsão", diff --git a/www/addons/mod/feedback/lang/pt.json b/www/addons/mod/feedback/lang/pt.json index a6ba4bcbd66..23aced64222 100644 --- a/www/addons/mod/feedback/lang/pt.json +++ b/www/addons/mod/feedback/lang/pt.json @@ -6,7 +6,7 @@ "captchaofflinewarning": "Inquérito com captcha não pode ser concluído se não estiver configurado, nem em modo offline ou com o servidor em baixo.", "complete_the_form": "Responder às questões...", "completed_feedbacks": "Respostas submetidas", - "continue_the_form": "Continuar o inquérito", + "continue_the_form": "Continuar a responder às perguntas...", "feedback_is_not_open": "O inquérito não está aberto", "feedback_submitted_offline": "O Inquérito foi gravado para ser enviado mais tarde.", "feedbackclose": "Permitir respostas até", @@ -30,6 +30,6 @@ "save_entries": "Submeter respostas", "show_entries": "Respostas", "show_nonrespondents": "Utilizadores que não responderam", - "started": "iniciado", + "started": "Iniciado", "this_feedback_is_already_submitted": "Já completou esta atividade" } \ No newline at end of file diff --git a/www/addons/mod/feedback/lang/sr-cr.json b/www/addons/mod/feedback/lang/sr-cr.json index 703d835b603..a1cdc9bcc78 100644 --- a/www/addons/mod/feedback/lang/sr-cr.json +++ b/www/addons/mod/feedback/lang/sr-cr.json @@ -1,4 +1,35 @@ { + "analysis": "Анализа", + "anonymous": "Анонимни упитник", + "anonymous_entries": "Анонимни одговори ({{$a}})", + "average": "Просечно", "captchaofflinewarning": "Упитник са Captcha елементом не може да буде завршен ако није конфигурисан, ако сте у офлајн режиму или ако је сервер искључен.", - "feedback_submitted_offline": "Овај упитник је сачуван како би касније био предат." + "complete_the_form": "Одговори на питања...", + "completed_feedbacks": "Анализа одговорa", + "continue_the_form": "Настави са одговарањем на питања...", + "feedback_is_not_open": "Упитник није отворен", + "feedback_submitted_offline": "Овај упитник је сачуван како би касније био предат.", + "feedbackclose": "Упитник доступан до", + "feedbackopen": "Упитник доступан од", + "mapcourses": "Повежи упитник са курсевима", + "mode": "Врста упитника", + "next_page": "Следећа страница", + "non_anonymous": "Име корисника биће записано и приказано заједно са одговорима", + "non_anonymous_entries": "Неанонимни одговори ({{$a}})", + "non_respondents_students": "Полазници који нису одговорили на упитник ({{$a}})", + "not_selected": "Није изабрано", + "not_started": "Није започето", + "numberoutofrange": "Број изван опсега", + "overview": "Преглед", + "page_after_submit": "Порука која ће бити приказана кориснику након што попуни упитник", + "preview": "Преглед", + "previous_page": "Претходна страница", + "questions": "Питања", + "response_nr": "Одговор бр.", + "responses": "Одговори", + "save_entries": "Пошаљи своје одговоре", + "show_entries": "Прикажи одговоре", + "show_nonrespondents": "Прикажи кориснике које нису одговорили на упитник", + "started": "Започето", + "this_feedback_is_already_submitted": "Већ сте попунили овај упитник." } \ No newline at end of file diff --git a/www/addons/mod/feedback/lang/sr-lt.json b/www/addons/mod/feedback/lang/sr-lt.json index ceea89255f5..8f2198ecfcc 100644 --- a/www/addons/mod/feedback/lang/sr-lt.json +++ b/www/addons/mod/feedback/lang/sr-lt.json @@ -1,4 +1,35 @@ { + "analysis": "Analiza", + "anonymous": "Anonimni upitnik", + "anonymous_entries": "Anonimni odgovori ({{$a}})", + "average": "Prosečno", "captchaofflinewarning": "Upitnik sa Captcha elementom ne može da bude završen ako nije konfigurisan, ako ste u oflajn režimu ili ako je server isključen.", - "feedback_submitted_offline": "Ovaj upitnik je sačuvan kako bi kasnije bio predat." + "complete_the_form": "Odgovori na pitanja...", + "completed_feedbacks": "Analiza odgovora", + "continue_the_form": "Nastavi sa odgovaranjem na pitanja...", + "feedback_is_not_open": "Upitnik nije otvoren", + "feedback_submitted_offline": "Ovaj upitnik je sačuvan kako bi kasnije bio predat.", + "feedbackclose": "Upitnik dostupan do", + "feedbackopen": "Upitnik dostupan od", + "mapcourses": "Poveži upitnik sa kursevima", + "mode": "Vrsta upitnika", + "next_page": "Sledeća stranica", + "non_anonymous": "Ime korisnika biće zapisano i prikazano zajedno sa odgovorima", + "non_anonymous_entries": "Neanonimni odgovori ({{$a}})", + "non_respondents_students": "Polaznici koji nisu odgovorili na upitnik ({{$a}})", + "not_selected": "Nije izabrano", + "not_started": "Nije započeto", + "numberoutofrange": "Broj izvan opsega", + "overview": "Pregled", + "page_after_submit": "Poruka koja će biti prikazana korisniku nakon što popuni upitnik", + "preview": "Pregled", + "previous_page": "Prethodna stranica", + "questions": "Pitanja", + "response_nr": "Odgovor br.", + "responses": "Odgovori", + "save_entries": "Pošalji svoje odgovore", + "show_entries": "Prikaži odgovore", + "show_nonrespondents": "Prikaži korisnike koje nisu odgovorili na upitnik", + "started": "Započeto", + "this_feedback_is_already_submitted": "Već ste popunili ovaj upitnik." } \ No newline at end of file diff --git a/www/addons/mod/feedback/lang/sv.json b/www/addons/mod/feedback/lang/sv.json index c749faa8094..b2b4102df5d 100644 --- a/www/addons/mod/feedback/lang/sv.json +++ b/www/addons/mod/feedback/lang/sv.json @@ -16,7 +16,7 @@ "non_anonymous_entries": "Inga anonyma bidrag", "non_respondents_students": "Studenter/elever/deltagare/lärande som inte har lämnat några svar", "not_selected": "Inte vald", - "not_started": "inte påbörjad", + "not_started": "Inte påbörjad", "overview": "Översikt", "page_after_submit": "Sida efter inskickning", "preview": "Förhandsgranska", diff --git a/www/addons/mod/feedback/lang/tr.json b/www/addons/mod/feedback/lang/tr.json index b1c57c37b04..e4720de3ad0 100644 --- a/www/addons/mod/feedback/lang/tr.json +++ b/www/addons/mod/feedback/lang/tr.json @@ -1,14 +1,14 @@ { "analysis": "Analiz", "anonymous": "Anonim", - "anonymous_entries": "Anonim kayıtlar", + "anonymous_entries": "Anonim kayıtlar ({{$a}})", "average": "Ortalama", "complete_the_form": "Soruları cevaplayın...", "completed_feedbacks": "Gönderilen cevaplar", - "continue_the_form": "Devam et", + "continue_the_form": "Soruları cevaplamaya devam et...", "feedback_is_not_open": "Geribildirim açık değil", - "feedbackclose": "Geribildirimi kapat", - "feedbackopen": "Geribildirimi aç", + "feedbackclose": "Şuna yazılan cevaplara izin ver:", + "feedbackopen": "Şunlardan gelen cevaplara izin ver:", "mapcourses": "Geribildirimi derslere eşleştirin", "mode": "Mod", "next_page": "Sonraki sayfa", @@ -19,11 +19,11 @@ "not_started": "Başlatılmadı", "numberoutofrange": "Aralık dışı numara", "overview": "Gözat", - "page_after_submit": "Geribildirim doldurulduktan sonraki sayfa", + "page_after_submit": "Tamamlama bildirimi", "preview": "Önizleme", "previous_page": "Önceki sayfa", "questions": "Sorular", - "response_nr": "Yanıt No.", + "response_nr": "Yanıt numarası", "responses": "Yanıtlar", "save_entries": "Cevaplarınızı gönderin", "show_entries": "Yanıtları göster", diff --git a/www/addons/mod/folder/lang/ca.json b/www/addons/mod/folder/lang/ca.json index b2f87d440ac..2208f493a4b 100644 --- a/www/addons/mod/folder/lang/ca.json +++ b/www/addons/mod/folder/lang/ca.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "No hi ha fitxers per mostrar.", + "emptyfilelist": "No hi ha fitxers per mostrar", "errorwhilegettingfolder": "S'ha produït un error en recuperar les dades de la carpeta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/cs.json b/www/addons/mod/folder/lang/cs.json index 66b256adf4c..04e2822f6a0 100644 --- a/www/addons/mod/folder/lang/cs.json +++ b/www/addons/mod/folder/lang/cs.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Žádný soubor k zobrazení.", + "emptyfilelist": "Žádný soubor k zobrazení", "errorwhilegettingfolder": "Chyba při načítání dat složky." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/da.json b/www/addons/mod/folder/lang/da.json index 2337bed4841..c53b3a994ed 100644 --- a/www/addons/mod/folder/lang/da.json +++ b/www/addons/mod/folder/lang/da.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Der er ingen filer at vise.", + "emptyfilelist": "Der er ingen filer at vise", "errorwhilegettingfolder": "Fejl ved hentning af mappedata." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/de.json b/www/addons/mod/folder/lang/de.json index 022d05baeea..00b4ea2a954 100644 --- a/www/addons/mod/folder/lang/de.json +++ b/www/addons/mod/folder/lang/de.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Keine Dateien", + "emptyfilelist": "Es liegen keine Dateien vor", "errorwhilegettingfolder": "Fehler beim Laden der Verzeichnisdaten" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/es-mx.json b/www/addons/mod/folder/lang/es-mx.json index 5b9563d5c0d..e2f470725df 100644 --- a/www/addons/mod/folder/lang/es-mx.json +++ b/www/addons/mod/folder/lang/es-mx.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "No hay archivos para mostrar.", + "emptyfilelist": "No hay archivos que mostrar", "errorwhilegettingfolder": "Error al obtener datos de carpeta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/eu.json b/www/addons/mod/folder/lang/eu.json index 27a3ccc6636..07dae0aef65 100644 --- a/www/addons/mod/folder/lang/eu.json +++ b/www/addons/mod/folder/lang/eu.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Ez dago fitxategirik erakusteko.", + "emptyfilelist": "Ez dago erakusteko fitxategirik", "errorwhilegettingfolder": "Errorea karpetaren datuak eskuratzean." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/fr.json b/www/addons/mod/folder/lang/fr.json index 86d36f87890..e16e5c1aeb4 100644 --- a/www/addons/mod/folder/lang/fr.json +++ b/www/addons/mod/folder/lang/fr.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Aucun fichier à afficher.", + "emptyfilelist": "Il n'y a pas de fichier à afficher", "errorwhilegettingfolder": "Erreur lors de l'obtention des données du dossier." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/he.json b/www/addons/mod/folder/lang/he.json index 55811600621..1c2ec27977b 100644 --- a/www/addons/mod/folder/lang/he.json +++ b/www/addons/mod/folder/lang/he.json @@ -1,3 +1,3 @@ { - "emptyfilelist": "אין קבצים להציג." + "emptyfilelist": "אין קבצים להציג" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/it.json b/www/addons/mod/folder/lang/it.json index 93e13593395..b828249f904 100644 --- a/www/addons/mod/folder/lang/it.json +++ b/www/addons/mod/folder/lang/it.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Non ci sono file da visualizzare.", + "emptyfilelist": "Non ci sono file da visualizzare", "errorwhilegettingfolder": "Si è verificato un errore durante la ricezione dei dati della cartella." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/ja.json b/www/addons/mod/folder/lang/ja.json index 61980e500fc..8634d70f046 100644 --- a/www/addons/mod/folder/lang/ja.json +++ b/www/addons/mod/folder/lang/ja.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "表示するファイルがありません。", + "emptyfilelist": "表示するファイルはありません。", "errorwhilegettingfolder": "フォルダのデータを取得中にエラーが発生しました。" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/lt.json b/www/addons/mod/folder/lang/lt.json index e174a7c5a50..a80a862764e 100644 --- a/www/addons/mod/folder/lang/lt.json +++ b/www/addons/mod/folder/lang/lt.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Nėra ką rodyti.", + "emptyfilelist": "Nėra rodytinų failų", "errorwhilegettingfolder": "Klaida gaunant duomenis iš aplanko." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/nl.json b/www/addons/mod/folder/lang/nl.json index 92b48519e9d..7b544820480 100644 --- a/www/addons/mod/folder/lang/nl.json +++ b/www/addons/mod/folder/lang/nl.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Geen bestanden.", + "emptyfilelist": "Er zijn geen bestanden om te tonen", "errorwhilegettingfolder": "Fout bij het ophalen van de mapgegevens" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/pt-br.json b/www/addons/mod/folder/lang/pt-br.json index 1588790327d..4e9c9589aa3 100644 --- a/www/addons/mod/folder/lang/pt-br.json +++ b/www/addons/mod/folder/lang/pt-br.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Não há arquivos para mostrar", + "emptyfilelist": "Não há arquivos para exibir", "errorwhilegettingfolder": "Erro ao obter dados da pasta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/pt.json b/www/addons/mod/folder/lang/pt.json index d197c86f233..74865d321a4 100644 --- a/www/addons/mod/folder/lang/pt.json +++ b/www/addons/mod/folder/lang/pt.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Não há ficheiros para mostrar.", + "emptyfilelist": "Este repositório está vazio", "errorwhilegettingfolder": "Erro ao obter os dados da pasta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/ro.json b/www/addons/mod/folder/lang/ro.json index a66c107ebcd..0277b91b35f 100644 --- a/www/addons/mod/folder/lang/ro.json +++ b/www/addons/mod/folder/lang/ro.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Nu sunt fișiere disponibile pentru vizualizare.", + "emptyfilelist": "Nu există fișiere", "errorwhilegettingfolder": "A apărut o eroare la obținerea dosarului cu datele cerute." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/sr-cr.json b/www/addons/mod/folder/lang/sr-cr.json index a65fb8697c7..3ed8d5f00a0 100644 --- a/www/addons/mod/folder/lang/sr-cr.json +++ b/www/addons/mod/folder/lang/sr-cr.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Нема датотека за приказ.", + "emptyfilelist": "Нема датотека за приказ", "errorwhilegettingfolder": "Грешка приликом преузимања података за 'Директоријум'" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/sr-lt.json b/www/addons/mod/folder/lang/sr-lt.json index 9bfdf403335..847b0b05eff 100644 --- a/www/addons/mod/folder/lang/sr-lt.json +++ b/www/addons/mod/folder/lang/sr-lt.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Nema datoteka za prikaz.", + "emptyfilelist": "Nema datoteka za prikaz", "errorwhilegettingfolder": "Greška prilikom preuzimanja podataka za 'Direktorijum'" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/zh-tw.json b/www/addons/mod/folder/lang/zh-tw.json index 5300a974982..d7ff3cf3a76 100644 --- a/www/addons/mod/folder/lang/zh-tw.json +++ b/www/addons/mod/folder/lang/zh-tw.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "沒有檔案可以顯示", + "emptyfilelist": "沒有可以顯示的檔案", "errorwhilegettingfolder": "當讀取資料夾資料時發生錯誤" } \ No newline at end of file diff --git a/www/addons/mod/forum/lang/ca.json b/www/addons/mod/forum/lang/ca.json index 5f1be9cd58c..42bf0d4d3d0 100644 --- a/www/addons/mod/forum/lang/ca.json +++ b/www/addons/mod/forum/lang/ca.json @@ -5,6 +5,7 @@ "cannotcreatediscussion": "No s'ha pogut obrir un debat nou", "couldnotadd": "Un error desconegut ha impedit afegir el vostre missatge", "discussion": "Debat", + "discussionlocked": "Aquest fil de debat ha finalitzat, així que no admet respostes.", "discussionpinned": "Fixat", "discussionsubscription": "Subscripció als debats", "edit": "Edita", diff --git a/www/addons/mod/forum/lang/da.json b/www/addons/mod/forum/lang/da.json index bdbd7c0a872..38dca8ad7f1 100644 --- a/www/addons/mod/forum/lang/da.json +++ b/www/addons/mod/forum/lang/da.json @@ -9,7 +9,7 @@ "discussionsubscription": "Abonnement på tråd", "edit": "Rediger", "erroremptymessage": "Indlægget kan ikke være tomt.", - "erroremptysubject": "Emnefeltet kan ikke være tomt", + "erroremptysubject": "Indlæggets emne kan ikke være tomt.", "errorgetforum": "Fejl ved hentning af forumdata.", "errorgetgroups": "Fejl ved hentning af gruppeindstillinger.", "forumnodiscussionsyet": "Der er endnu ingen indlæg i dette forum.", diff --git a/www/addons/mod/forum/lang/de.json b/www/addons/mod/forum/lang/de.json index 22814dbf13e..bee3c7cb0d4 100644 --- a/www/addons/mod/forum/lang/de.json +++ b/www/addons/mod/forum/lang/de.json @@ -10,7 +10,7 @@ "discussionsubscription": "Themenabonnement", "edit": "Bearbeiten", "erroremptymessage": "Die Mitteilung darf nicht leer sein.", - "erroremptysubject": "Das Forenthema darf nicht leer sein.", + "erroremptysubject": "Der Betreff darf nicht leer sein.", "errorgetforum": "Fehler beim Laden der Forendaten", "errorgetgroups": "Fehler beim Laden der Gruppeneinstellungen", "forumnodiscussionsyet": "Keine Themen im Forum", diff --git a/www/addons/mod/forum/lang/es-mx.json b/www/addons/mod/forum/lang/es-mx.json index c3743416512..48404906707 100644 --- a/www/addons/mod/forum/lang/es-mx.json +++ b/www/addons/mod/forum/lang/es-mx.json @@ -10,7 +10,7 @@ "discussionsubscription": "Suscripción a discusión", "edit": "Editar", "erroremptymessage": "El mensaje no puede estar vacío", - "erroremptysubject": "El asunto de la publicación no puede estar vacío", + "erroremptysubject": "El asunto del mensaje no puede estar vacío.", "errorgetforum": "Error al obtener datos del foro.", "errorgetgroups": "Error al obtener configuraciones de grupo.", "forumnodiscussionsyet": "Todavía no hay tópicos de discusión en este foro.", diff --git a/www/addons/mod/forum/lang/fr.json b/www/addons/mod/forum/lang/fr.json index 09bf43de5be..566c52681f0 100644 --- a/www/addons/mod/forum/lang/fr.json +++ b/www/addons/mod/forum/lang/fr.json @@ -10,7 +10,7 @@ "discussionsubscription": "Abonnement à la discussion", "edit": "Modifier", "erroremptymessage": "Un message ne peut pas être vide", - "erroremptysubject": "L'objet du message ne peut pas être vide", + "erroremptysubject": "L'objet d'un message ne peut pas être vide", "errorgetforum": "Erreur de récupération des données de forum.", "errorgetgroups": "Erreur lors de l'obtention des réglages de groupe.", "forumnodiscussionsyet": "Il n'y a pas encore de message dans ce forum", diff --git a/www/addons/mod/forum/lang/he.json b/www/addons/mod/forum/lang/he.json index 585aef50b5f..3b4e2e70b17 100644 --- a/www/addons/mod/forum/lang/he.json +++ b/www/addons/mod/forum/lang/he.json @@ -5,11 +5,12 @@ "cannotcreatediscussion": "כשלון ביצירת דיון חדש.", "couldnotadd": "ההודעה שלך לא פורסמה עקב תקלה בלתי מזוהה", "discussion": "דיון", + "discussionlocked": "הדיון ננעל, כך שלא ניתן יותר להגיב אליו.", "discussionpinned": "בראש הרשימה", "discussionsubscription": "מנוי לעדכונים בדיון", "edit": "עריכה", "erroremptymessage": "הודעת הפרסום איננה יכולה להיות ריקה", - "erroremptysubject": "נושא ההודעה אינו יכול להיות ריק", + "erroremptysubject": "הנושא הפרסום אינו יכול להיות ריק", "errorgetforum": "שגיאה בטעינת מידע הפורום.", "errorgetgroups": "שגיאה בטעינת הגדרות קבוצה.", "forumnodiscussionsyet": "עדיין לא קיימים נושאי דיונים בפורום זה.", diff --git a/www/addons/mod/forum/lang/it.json b/www/addons/mod/forum/lang/it.json index ad1b8b1ed8b..c54ee597c31 100644 --- a/www/addons/mod/forum/lang/it.json +++ b/www/addons/mod/forum/lang/it.json @@ -10,7 +10,7 @@ "discussionsubscription": "Sottoscrizione della discussione", "edit": "Modifica", "erroremptymessage": "Il corpo del messaggio non può essere vuoto", - "erroremptysubject": "L'oggetto dell'intervento non può essere vuoto", + "erroremptysubject": "L'oggetto non può essere vuoto", "errorgetforum": "Si è verificato un errore durante la ricezione dei dati del forum.", "errorgetgroups": "Si è verificato un errore durante la ricezione delle impostazioni gruppo.", "forumnodiscussionsyet": "In questo forum non sono presenti discussioni", diff --git a/www/addons/mod/forum/lang/ja.json b/www/addons/mod/forum/lang/ja.json index 27252c4d033..c3c4562c07c 100644 --- a/www/addons/mod/forum/lang/ja.json +++ b/www/addons/mod/forum/lang/ja.json @@ -3,14 +3,14 @@ "cannotadddiscussion": "このフォーラムにディスカッションを追加するにはグループのメンバーである必要があります。", "cannotadddiscussionall": "あなたにはすべての参加者のための新しいディスカッショントピックを追加するパーミッションがありません。", "cannotcreatediscussion": "新しいディスカッションを作成できませんでした。", - "couldnotadd": "不明なエラーのため、あなたの投稿を追加できませんでした。", + "couldnotadd": "不明なエラーのためあなたの投稿を追加できませんでした。", "discussion": "ディスカッション", "discussionlocked": "このディスカッションはロックされているため、あなたは返信することはできません。", "discussionpinned": "ピン留め", "discussionsubscription": "ディスカッション購読", "edit": "編集", "erroremptymessage": "投稿メッセージを空にすることはできません。", - "erroremptysubject": "投稿の件名は必須です", + "erroremptysubject": "投稿件名を空にすることはできません。", "errorgetforum": "フォーラムのデータ取得中にエラーが発生しました。", "errorgetgroups": "グループ設定の取得中にエラーが発生しました。", "forumnodiscussionsyet": "このフォーラムにはまだディスカッショントピックがありません", diff --git a/www/addons/mod/forum/lang/lt.json b/www/addons/mod/forum/lang/lt.json index 82a99a7e4f4..93f37fba562 100644 --- a/www/addons/mod/forum/lang/lt.json +++ b/www/addons/mod/forum/lang/lt.json @@ -10,7 +10,7 @@ "discussionsubscription": "Diskusijos prenumerata", "edit": "Redaguoti", "erroremptymessage": "Skelbimo žinutė negali būti tuščia", - "erroremptysubject": "Pranešimo temos langelis negali būti tuščias", + "erroremptysubject": "Skelbimo tema negali būti tuščia.", "errorgetforum": "Klaida gaunant forumo duomenis.", "errorgetgroups": "Klaida gaunant grupės nustatymus.", "forumnodiscussionsyet": "Pokalbio temų forume dar nėra.", diff --git a/www/addons/mod/forum/lang/nl.json b/www/addons/mod/forum/lang/nl.json index 83fddedda47..8f7fe7dad45 100644 --- a/www/addons/mod/forum/lang/nl.json +++ b/www/addons/mod/forum/lang/nl.json @@ -10,7 +10,7 @@ "discussionsubscription": "Inschrijving discussie", "edit": "Wijzig", "erroremptymessage": "Bericht kan niet leeg zijn", - "erroremptysubject": "Onderwerp mag niet leeg zijn", + "erroremptysubject": "Onderwerp kan niet leeg zijn", "errorgetforum": "Fout bij het ophalen van forumgegevens", "errorgetgroups": "Fout bij het ophalen van groepinstellingen.", "forumnodiscussionsyet": "Er zijn nog geen discussies in dit forum", diff --git a/www/addons/mod/forum/lang/pl.json b/www/addons/mod/forum/lang/pl.json index 67a495dd1a6..0f761c4b8ec 100644 --- a/www/addons/mod/forum/lang/pl.json +++ b/www/addons/mod/forum/lang/pl.json @@ -7,7 +7,7 @@ "discussion": "Temat", "discussionlocked": "Dyskusja została zablokowana, więc nie możesz już odpowiedzieć.", "discussionpinned": "Przypięta", - "discussionsubscription": "Subskrypcja dyskusja", + "discussionsubscription": "Subskrypcja dyskusji", "edit": "Edycja", "erroremptymessage": "Wiadomość nie może być pusta", "erroremptysubject": "Tytuł wpisu nie może być pusty.", diff --git a/www/addons/mod/forum/lang/pt-br.json b/www/addons/mod/forum/lang/pt-br.json index f7d9cf730e2..a4df46a5972 100644 --- a/www/addons/mod/forum/lang/pt-br.json +++ b/www/addons/mod/forum/lang/pt-br.json @@ -5,10 +5,12 @@ "cannotcreatediscussion": "Não foi possível criar uma nova discussão", "couldnotadd": "Não foi possível publicar a sua mensagem. Infelizmente a causa do erro não foi identificada.", "discussion": "Tópico", + "discussionlocked": "Esta discussão foi bloqueada e já não é possível responder a ela.", + "discussionpinned": "Destacado", "discussionsubscription": "Assinatura de discussão", "edit": "Editar", "erroremptymessage": "A mensagem não pode ser vazia.", - "erroremptysubject": "Assunto não pode estar vazio", + "erroremptysubject": "O assunto da mensagem não pode ser vazio.", "errorgetforum": "Erro ao buscar dados de fórum.", "errorgetgroups": "Erro ao obter configurações do grupo.", "forumnodiscussionsyet": "Não existem tópicos neste fórum ainda", diff --git a/www/addons/mod/forum/lang/ro.json b/www/addons/mod/forum/lang/ro.json index 99d4fc77c16..2dd31a2be41 100644 --- a/www/addons/mod/forum/lang/ro.json +++ b/www/addons/mod/forum/lang/ro.json @@ -7,7 +7,7 @@ "discussion": "Discuție", "edit": "Modifică", "erroremptymessage": "Mesajul nu poate fi necompletat", - "erroremptysubject": "Subiectul nu poate rămâne necompletat", + "erroremptysubject": "Subiectul nu poate fi necompletat", "errorgetforum": "A apărut o eroare la obținerea datelor despre forum.", "errorgetgroups": "Eroare la obținerea setărilor pentru grup.", "forumnodiscussionsyet": "Nu există subiecte deschise în acest forum.", diff --git a/www/addons/mod/forum/lang/ru.json b/www/addons/mod/forum/lang/ru.json index 3faffe0f076..46a510d03d2 100644 --- a/www/addons/mod/forum/lang/ru.json +++ b/www/addons/mod/forum/lang/ru.json @@ -10,7 +10,7 @@ "discussionsubscription": "Подписаться на эту тему.", "edit": "Редактировать", "erroremptymessage": "Сообщение не может быть пустым", - "erroremptysubject": "Заголовок сообщения не может быть пустым", + "erroremptysubject": "Тема сообщения не может быть пустой", "errorgetforum": "Ошибка при получении данных форума", "errorgetgroups": "Ошибка получения параметров группы", "forumnodiscussionsyet": "В этом форуме ещё нет тем для обсуждения", diff --git a/www/addons/mod/forum/lang/sr-cr.json b/www/addons/mod/forum/lang/sr-cr.json index 4d04219d752..a29562d23f2 100644 --- a/www/addons/mod/forum/lang/sr-cr.json +++ b/www/addons/mod/forum/lang/sr-cr.json @@ -1,11 +1,32 @@ { - "erroremptysubject": "Тема поруке не може бити празна", + "addanewdiscussion": "Додај нову тему за дискусију", + "cannotadddiscussion": "Додавање дискусије у оквиру овог форума захтева групно чланство.", + "cannotadddiscussionall": "Немате дозволу да додајете нову тему за дискусију за све учеснике.", + "cannotcreatediscussion": "Није било могуће отворити нову дискусију", + "couldnotadd": "Нажалост, није могуће додати Вашу поруку због непознате грешке", + "discussion": "Дискусија", + "discussionlocked": "Ова дискусија је закључана тако да више не можете одговарати на њој.", + "discussionpinned": "Фиксирана", + "discussionsubscription": "Претплата на дискусију", + "edit": "Уреди", + "erroremptymessage": "Тело поруке не може бити празно", + "erroremptysubject": "Тема (наслов) поруке не може бити празна", "errorgetforum": "Грешка приликом преузимања података за 'Форум'", "errorgetgroups": "Грешка приликом преузимања подешавања група.", "forumnodiscussionsyet": "Још нема тема за дискусију на овом форуму.", "group": "Група", + "message": "Порука", + "modeflatnewestfirst": "Приказ одговора, почевши прво с најновијим", + "modeflatoldestfirst": "Приказ одговора, почевши прво с најстаријим", + "modenested": "Приказ одговора у угнежђеној форми", "numdiscussions": "{{numdiscussions}} дискусије/а", "numreplies": "{{numreplies}} одговора", + "posttoforum": "Пошаљи поруку на форум", + "re": "Одговор:", "refreshdiscussions": "Освежи дискусије", - "refreshposts": "Освежи постове" + "refreshposts": "Освежи постове", + "reply": "Одговори", + "subject": "Тема", + "unread": "Непрочитано", + "unreadpostsnumber": "Број непрочитаних порука: {{$a}}" } \ No newline at end of file diff --git a/www/addons/mod/forum/lang/sr-lt.json b/www/addons/mod/forum/lang/sr-lt.json index 27882a3847b..e655f26c3b4 100644 --- a/www/addons/mod/forum/lang/sr-lt.json +++ b/www/addons/mod/forum/lang/sr-lt.json @@ -1,11 +1,32 @@ { - "erroremptysubject": "Tema poruke ne može biti prazna", + "addanewdiscussion": "Dodaj novu temu za diskusiju", + "cannotadddiscussion": "Dodavanje diskusije u okviru ovog foruma zahteva grupno članstvo.", + "cannotadddiscussionall": "Nemate dozvolu da dodajete novu temu za diskusiju za sve učesnike.", + "cannotcreatediscussion": "Nije bilo moguće otvoriti novu diskusiju", + "couldnotadd": "Nažalost, nije moguće dodati Vašu poruku zbog nepoznate greške", + "discussion": "Diskusija", + "discussionlocked": "Ova diskusija je zaključana tako da više ne možete odgovarati na njoj.", + "discussionpinned": "Fiksirana", + "discussionsubscription": "Pretplata na diskusiju", + "edit": "Uredi", + "erroremptymessage": "Telo poruke ne može biti prazno", + "erroremptysubject": "Tema (naslov) poruke ne može biti prazna", "errorgetforum": "Greška prilikom preuzimanja podataka za 'Forum'", "errorgetgroups": "Greška prilikom preuzimanja podešavanja grupa.", "forumnodiscussionsyet": "Greška prilikom preuzimanja podešavanja grupa.", "group": "Grupa", + "message": "Poruka", + "modeflatnewestfirst": "Prikaz odgovora, počevši prvo s najnovijim", + "modeflatoldestfirst": "Prikaz odgovora, počevši prvo s najstarijim", + "modenested": "Prikaz odgovora u ugnežđenoj formi", "numdiscussions": "{{numdiscussions}} diskusije/a", "numreplies": "{{numreplies}} odgovora", + "posttoforum": "Pošalji poruku na forum", + "re": "Odgovor:", "refreshdiscussions": "Osveži diskusije", - "refreshposts": "Osveži postove" + "refreshposts": "Osveži postove", + "reply": "Odgovori", + "subject": "Tema", + "unread": "Nepročitano", + "unreadpostsnumber": "Broj nepročitanih poruka: {{$a}}" } \ No newline at end of file diff --git a/www/addons/mod/forum/lang/sv.json b/www/addons/mod/forum/lang/sv.json index 676e5ba9fa1..d8da791577b 100644 --- a/www/addons/mod/forum/lang/sv.json +++ b/www/addons/mod/forum/lang/sv.json @@ -3,12 +3,14 @@ "cannotadddiscussion": "För att lägga till diskussionsämnen till det här forumet krävs det att man är medlem av en grupp.", "cannotadddiscussionall": "Du har inte tillstånd att lägga till ett nytt diskussionsämne för alla deltagare. ", "cannotcreatediscussion": "Det gick inte att skapa en ny diskussion", - "couldnotadd": "Det gick inte att lägga till Ditt inlägg på grund av okänt fel.", + "couldnotadd": "Det gick inte att lägga till ditt inlägg på grund av okänt fel.", "discussion": "Diskussionsämne", - "discussionsubscription": "Diskussions prenumeration", + "discussionlocked": "Denna diskussion är stängd och du kan inte längre göra inlägg i den.", + "discussionpinned": "Fastnålad", + "discussionsubscription": "Prenumeration på diskussion", "edit": "Redigera", "erroremptymessage": "Meddelandet i inlägget kan inte vara tomt", - "erroremptysubject": "Rubriken kan inte vara tom", + "erroremptysubject": "Ämnesrubriken för inlägget kan inte vara tom.", "errorgetforum": "Fel att få forum innehåll", "errorgetgroups": "Fel vid hämtning av gruppinställningar", "forumnodiscussionsyet": "Det finns inga diskussionsämnen ännu i detta forum.", diff --git a/www/addons/mod/forum/lang/uk.json b/www/addons/mod/forum/lang/uk.json index 5fec7fdc11b..bf8cfd7742c 100644 --- a/www/addons/mod/forum/lang/uk.json +++ b/www/addons/mod/forum/lang/uk.json @@ -9,7 +9,7 @@ "discussionsubscription": "Підписатися на дискусію", "edit": "Редагувати", "erroremptymessage": "Повідомлення не може бути порожнім", - "erroremptysubject": "Заголовок не повинен бути пустим", + "erroremptysubject": "Тема повідомлення не може бути порожньою", "errorgetforum": "Помилка отримання даних форуму", "errorgetgroups": "Помилка отримання групових налаштувань.", "forumnodiscussionsyet": "Відсутні обговорення в даному форумі.", diff --git a/www/addons/mod/forum/lang/zh-tw.json b/www/addons/mod/forum/lang/zh-tw.json index a2d74d28770..81db9790069 100644 --- a/www/addons/mod/forum/lang/zh-tw.json +++ b/www/addons/mod/forum/lang/zh-tw.json @@ -10,11 +10,11 @@ "discussionsubscription": "議題訂閱", "edit": "編輯", "erroremptymessage": "貼文的訊息不能是空白", - "erroremptysubject": "貼文的標題不可以是空的", + "erroremptysubject": "貼文的主旨不能是空白", "errorgetforum": "讀取討論區資料發生錯誤", "errorgetgroups": "讀取群組設定發生錯誤", "forumnodiscussionsyet": "這個討論區還沒有討論主題", - "group": "群組", + "group": "分組", "message": "訊息", "modeflatnewestfirst": "以平舖方式呈現回應的貼文,最晚貼出的在前", "modeflatoldestfirst": "以平舖方式呈現回應的貼文,最早貼出的在前", diff --git a/www/addons/mod/glossary/lang/ar.json b/www/addons/mod/glossary/lang/ar.json index e92d720edeb..b52d6059283 100644 --- a/www/addons/mod/glossary/lang/ar.json +++ b/www/addons/mod/glossary/lang/ar.json @@ -1,10 +1,10 @@ { - "attachment": "مرفقات", + "attachment": "ملف مرفق", "browsemode": "النمط العرضي", "byauthor": "التجميع طبقا للمؤلف", "bynewestfirst": "الأحدث أولا", "byrecentlyupdated": "تم تحديثه مؤخرا", "bysearch": "بحث", - "casesensitive": "استخدم التعابير المعتادة", - "categories": "تصنيفات المقررات الدراسية" + "casesensitive": "مطابقة حالة الأحرف", + "categories": "التصنيفات" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/bg.json b/www/addons/mod/glossary/lang/bg.json index dc6e44a0dcd..593e987ab1a 100644 --- a/www/addons/mod/glossary/lang/bg.json +++ b/www/addons/mod/glossary/lang/bg.json @@ -1,6 +1,6 @@ { - "attachment": "Прикрепване на значката към съобщението.", + "attachment": "Прикачен файл", "browsemode": "Режим на преглеждане", - "casesensitive": "Използване на регулярни изрази", - "categories": "Категории курсове" + "casesensitive": "Чувствителност главни/малки букви", + "categories": "Категории" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/ca.json b/www/addons/mod/glossary/lang/ca.json index 191d2db0090..2351376a71d 100644 --- a/www/addons/mod/glossary/lang/ca.json +++ b/www/addons/mod/glossary/lang/ca.json @@ -1,6 +1,6 @@ { - "attachment": "Adjunt", - "browsemode": "Navegueu per les entrades", + "attachment": "Adjunta la insígnia al missatge", + "browsemode": "Mode exploració", "byalphabet": "Alfabèticament", "byauthor": "Agrupat per autor", "bycategory": "Agrupa per categoria", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Actualitzat recentment", "bysearch": "Cerca", "cannoteditentry": "No es pot editar l'entrada", - "casesensitive": "Utilitzeu expressions regulars", - "categories": "Categories de cursos", + "casesensitive": "Distingeix majúscules", + "categories": "Categories", "entriestobesynced": "Entrades per sincronitzar", "entrypendingapproval": "Aquesta entrada està pendent d'aprovació.", "errorloadingentries": "S'ha produït un error en carregar les entrades.", diff --git a/www/addons/mod/glossary/lang/cs.json b/www/addons/mod/glossary/lang/cs.json index 3421f566a83..db30da2ce2e 100644 --- a/www/addons/mod/glossary/lang/cs.json +++ b/www/addons/mod/glossary/lang/cs.json @@ -1,6 +1,6 @@ { - "attachment": "Připojit odznak do zprávy", - "browsemode": "Prohlížení příspěvků", + "attachment": "Příloha", + "browsemode": "Režim náhledu", "byalphabet": "Abecedně", "byauthor": "Skupina podle autora", "bycategory": "Skupina podle kategorie", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Posledně aktualizované", "bysearch": "Hledat", "cannoteditentry": "Záznam nelze upravit", - "casesensitive": "Používat regulární výrazy", - "categories": "Kategorie kurzů", + "casesensitive": "Rozlišovat malá/VELKÁ", + "categories": "Kategorie", "entriestobesynced": "Příspěvky, které mají být synchronizovány", "entrypendingapproval": "Tato položka čeká na schválení", "errorloadingentries": "Při načítání položek došlo k chybě", diff --git a/www/addons/mod/glossary/lang/da.json b/www/addons/mod/glossary/lang/da.json index 40b07cf0bb0..41338f8fc3e 100644 --- a/www/addons/mod/glossary/lang/da.json +++ b/www/addons/mod/glossary/lang/da.json @@ -1,13 +1,13 @@ { - "attachment": "Tilføj badge til besked", - "browsemode": "Skim indlæg", + "attachment": "Bilag", + "browsemode": "Forhåndsvisning", "byalphabet": "Alfabetisk", "byauthor": "Grupper efter forfatter", "bynewestfirst": "Nyeste først", "byrecentlyupdated": "Senest opdateret", "bysearch": "Søg", - "casesensitive": "Brug regulære udtryk", - "categories": "Kursuskategorier", + "casesensitive": "Store og små bogstaver", + "categories": "Kategorier", "entrypendingapproval": "Dette opslag afventer godkendelse", "errorloadingentries": "Der opstod en fejl under indlæsning af opslag", "errorloadingentry": "Der opstod en fejl under indlæsning af opslaget", diff --git a/www/addons/mod/glossary/lang/de.json b/www/addons/mod/glossary/lang/de.json index 6b5589a0b0c..c5afa42c3fc 100644 --- a/www/addons/mod/glossary/lang/de.json +++ b/www/addons/mod/glossary/lang/de.json @@ -1,6 +1,6 @@ { - "attachment": "Auszeichnung an Mitteilung anhängen", - "browsemode": "Einträge durchblättern", + "attachment": "Anhang", + "browsemode": "Vorschaumodus", "byalphabet": "Alphabetisch", "byauthor": "Nach Autor/in", "bycategory": "Nach Kategorie", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Gerade aktualisiert", "bysearch": "Suchen", "cannoteditentry": "Eintrag nicht bearbeitbar", - "casesensitive": "Reguläre Ausdrücke verwenden", - "categories": "Kursbereiche", + "casesensitive": "Groß-/Kleinschreibung", + "categories": "Kategorien", "entriestobesynced": "Einträge zum Synchronisieren", "entrypendingapproval": "Dieser Eintrag wartet auf eine Freigabe.", "errorloadingentries": "Fehler beim Laden von Einträgen", diff --git a/www/addons/mod/glossary/lang/el.json b/www/addons/mod/glossary/lang/el.json index 0bfce509423..0b1990425e5 100644 --- a/www/addons/mod/glossary/lang/el.json +++ b/www/addons/mod/glossary/lang/el.json @@ -1,6 +1,6 @@ { - "attachment": "Συνημμένα", - "browsemode": "Περιήγηση στις καταχωρήσεις", + "attachment": "Επισυναπτόμενο", + "browsemode": "Φάση Προεπισκόπισης", "byalphabet": "Αλφαβητικά", "byauthor": "Ομαδοποίηση ανά συγγραφέα", "bycategory": "Ομαδοποίηση ανά κατηγορία", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Ανανεώθηκαν πρόσφατα", "bysearch": "Αναζήτηση", "cannoteditentry": "Δεν είναι δυνατή η επεξεργασία της καταχώρισης", - "casesensitive": "Χρήση κανονικών εκφράσεων", - "categories": "Κατηγορίες μαθημάτων", + "casesensitive": "Διάκριση μικρών/κεφαλαίων", + "categories": "Κατηγορίες", "entriestobesynced": "Entries που πρέπει να συγχρονιστούν", "entrypendingapproval": "Εκκρεμεί η έγκριση για αυτή την καταχώρηση.", "errorloadingentries": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση των καταχωρήσεων.", diff --git a/www/addons/mod/glossary/lang/es-mx.json b/www/addons/mod/glossary/lang/es-mx.json index 158ea571325..f8b36fd05f5 100644 --- a/www/addons/mod/glossary/lang/es-mx.json +++ b/www/addons/mod/glossary/lang/es-mx.json @@ -1,6 +1,6 @@ { - "attachment": "Adjunto", - "browsemode": "Ver entradas", + "attachment": "Anexar insignia al mensaje", + "browsemode": "Modo de presentación preliminar", "byalphabet": "Alfabéticamente", "byauthor": "Agrupar por autor", "bycategory": "Agrupar por categoría", @@ -8,7 +8,7 @@ "byrecentlyupdated": "Recientemente actualizado", "bysearch": "Buscar", "cannoteditentry": "No puede editarse entrada", - "casesensitive": "Usar expresiones regulares", + "casesensitive": "Diferencia entre MAYÚSCULAS y minúsculas", "categories": "Categorías", "entriestobesynced": "Entradas para ser sincronizadas", "entrypendingapproval": "Esta entrada está pendiente de aprobación.", diff --git a/www/addons/mod/glossary/lang/es.json b/www/addons/mod/glossary/lang/es.json index 4089c74aa49..6cbdcc4dc0e 100644 --- a/www/addons/mod/glossary/lang/es.json +++ b/www/addons/mod/glossary/lang/es.json @@ -1,6 +1,6 @@ { - "attachment": "Adjunto", - "browsemode": "Navegar por las entradas", + "attachment": "Adjuntar insignia al mensaje", + "browsemode": "Modo de presentación preliminar", "byalphabet": "Alfabéticamente", "byauthor": "Agrupado por autor", "bycategory": "Agrupar por categoría", @@ -8,7 +8,7 @@ "byrecentlyupdated": "Actualizado recientemente", "bysearch": "Busca", "cannoteditentry": "No se puede editar la entrada", - "casesensitive": "Usar expresiones regulares", + "casesensitive": "Diferencia entre mayúsculas y minúsculas", "categories": "Categorías", "entriestobesynced": "Entradas pendientes de ser sincronizadas", "entrypendingapproval": "Esta entrada está pendiente de aprobación.", diff --git a/www/addons/mod/glossary/lang/eu.json b/www/addons/mod/glossary/lang/eu.json index c6ab2a7e186..96f4a794e08 100644 --- a/www/addons/mod/glossary/lang/eu.json +++ b/www/addons/mod/glossary/lang/eu.json @@ -1,6 +1,6 @@ { - "attachment": "Erantsi domina mezuari", - "browsemode": "Aztertu sarrerak", + "attachment": "Eranskina", + "browsemode": "Aurrebista-modua", "byalphabet": "Alfabetikoki", "byauthor": "Taldekatu egilearen arabera", "bycategory": "Taldekatu kategoriaren arabera", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Duela gutxi eguneratuak", "bysearch": "Bilatu", "cannoteditentry": "Ezin da sarrera editatu", - "casesensitive": "Erabil adierazpen erregularrak", - "categories": "Ikastaro-kategoriak", + "casesensitive": "Letra larriak eta xeheak bereiziz", + "categories": "Kategoriak", "entriestobesynced": "Sinkronizatu beharreko sarrerak", "entrypendingapproval": "Sarrera hau onarpenaren zain dago.", "errorloadingentries": "Errorea gertatu da sarrerak kargatzean.", diff --git a/www/addons/mod/glossary/lang/fa.json b/www/addons/mod/glossary/lang/fa.json index 637de884db4..8b6788b82aa 100644 --- a/www/addons/mod/glossary/lang/fa.json +++ b/www/addons/mod/glossary/lang/fa.json @@ -1,6 +1,6 @@ { - "attachment": "فایل پیوست", + "attachment": "ضمیمه کردن مدال به پیام", "browsemode": "حالت پیش‌نمایش", - "casesensitive": "استفاده از عبارت‌های منظم", - "categories": "طبقه‌های درسی" + "casesensitive": "حساس بودن به بزرگ و کوچکی حروف", + "categories": "دسته‌ها" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/fr.json b/www/addons/mod/glossary/lang/fr.json index 712afea4266..976057ed4e7 100644 --- a/www/addons/mod/glossary/lang/fr.json +++ b/www/addons/mod/glossary/lang/fr.json @@ -1,6 +1,6 @@ { - "attachment": "Joindre le badge à un courriel", - "browsemode": "Parcourir les articles", + "attachment": "Annexe", + "browsemode": "Mode prévisualisation", "byalphabet": "Alphabétiquement", "byauthor": "Grouper par auteur", "bycategory": "Grouper par catégorie", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Modifiés récemment", "bysearch": "Rechercher", "cannoteditentry": "Impossible de modifier l'article", - "casesensitive": "Utiliser les expressions régulières", - "categories": "Catégories de cours", + "casesensitive": "Casse des caractères", + "categories": "Catégories", "entriestobesynced": "Articles à synchroniser", "entrypendingapproval": "Cet article est en attente d'approbation", "errorloadingentries": "Une erreur est survenue lors du chargement des articles.", diff --git a/www/addons/mod/glossary/lang/he.json b/www/addons/mod/glossary/lang/he.json index abad848638c..e4d971b4c35 100644 --- a/www/addons/mod/glossary/lang/he.json +++ b/www/addons/mod/glossary/lang/he.json @@ -1,6 +1,6 @@ { - "attachment": "צירוף ההישג להודעה", + "attachment": "קובץ מצורף", "browsemode": "מצב תצוגה מקדימה", - "casesensitive": "השתמש בביטויים רגולריים", - "categories": "קטגוריות קורסים" + "casesensitive": "תלוי אותיות רישיות", + "categories": "קטגוריות חישוב ציונים" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/hu.json b/www/addons/mod/glossary/lang/hu.json index acb16b009bd..c74a20c85ed 100644 --- a/www/addons/mod/glossary/lang/hu.json +++ b/www/addons/mod/glossary/lang/hu.json @@ -1,6 +1,6 @@ { - "attachment": "Csatolt állomány:", + "attachment": "Kitűző hozzákapcsolása az üzenethez", "browsemode": "Előzetes megtekintés üzemmódja", - "casesensitive": "Reguláris kifejezések használata", - "categories": "Kurzuskategóriák" + "casesensitive": "Kis-/nagybetű különböző", + "categories": "Kategóriák" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/it.json b/www/addons/mod/glossary/lang/it.json index 581b16835e1..aa1cfe7fe09 100644 --- a/www/addons/mod/glossary/lang/it.json +++ b/www/addons/mod/glossary/lang/it.json @@ -1,10 +1,10 @@ { - "attachment": "Allega badge al messaggio", + "attachment": "Allegato", "browsemode": "Modalità anteprima", "byrecentlyupdated": "Aggiornati di recente", "bysearch": "Cerca", - "casesensitive": "Utilizza regular expression", - "categories": "Categorie di corso", + "casesensitive": "Rilevanza maiuscolo/minuscolo", + "categories": "Categorie", "entrypendingapproval": "Questa voce è in attesa di approvazione.", "errorloadingentries": "Si è verificato un errore durante il caricamento delle voci.", "errorloadingentry": "Si è verificato un errore durante il caricamento della voce.", diff --git a/www/addons/mod/glossary/lang/ja.json b/www/addons/mod/glossary/lang/ja.json index 395ba50cc3b..619f8f31178 100644 --- a/www/addons/mod/glossary/lang/ja.json +++ b/www/addons/mod/glossary/lang/ja.json @@ -1,6 +1,6 @@ { - "attachment": "添付", - "browsemode": "エントリをブラウズ", + "attachment": "メッセージにバッジを添付する", + "browsemode": "プレビューモード", "byalphabet": "アルファベット順", "byauthor": "著者でグループ", "bycategory": "カテゴリでグループ", @@ -8,8 +8,8 @@ "byrecentlyupdated": "最近の更新", "bysearch": "検索", "cannoteditentry": "エントリの編集ができませんでした", - "casesensitive": "正規表現を使用する", - "categories": "コースカテゴリ", + "casesensitive": "大文字小文字の区別", + "categories": "カテゴリ", "entriestobesynced": "エントリの同期ができませんでした", "entrypendingapproval": "このエントリは承認待ちです。", "errorloadingentries": "エントリ読み込み中にエラーが発生しました。", diff --git a/www/addons/mod/glossary/lang/lt.json b/www/addons/mod/glossary/lang/lt.json index 18f6cc6763e..23f3f7fe92b 100644 --- a/www/addons/mod/glossary/lang/lt.json +++ b/www/addons/mod/glossary/lang/lt.json @@ -1,13 +1,13 @@ { - "attachment": "Prikabinti pasiekimą prie pranešimo", - "browsemode": "Peržiūrėti įrašus", + "attachment": "Priedas", + "browsemode": "Peržiūros režimas", "byalphabet": "Abėcėlės tvarka", "byauthor": "Pagal autorių", "bynewestfirst": "Naujausi", "byrecentlyupdated": "Neseniai atnaujinti", "bysearch": "Paieška", - "casesensitive": "Naudoti reguliariąsias išraiškas", - "categories": "Kursų kategorijos", + "casesensitive": "Didžiųjų ir mažųjų raidžių skyrimas", + "categories": "Kategorijos", "entrypendingapproval": "Patvirtinti įrašą.", "errorloadingentries": "Klaida keliant įrašus.", "errorloadingentry": "Klaida įkeliant įrašą.", diff --git a/www/addons/mod/glossary/lang/nl.json b/www/addons/mod/glossary/lang/nl.json index 7c06a87db9a..a7e834e6b2a 100644 --- a/www/addons/mod/glossary/lang/nl.json +++ b/www/addons/mod/glossary/lang/nl.json @@ -1,6 +1,6 @@ { - "attachment": "Badge als bijlage bij bericht", - "browsemode": "Blader door items", + "attachment": "Bijlage", + "browsemode": "Probeermodus", "byalphabet": "Alfabetisch", "byauthor": "Groepeer per auteur", "bycategory": "Groepeer per categorie", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Onlangs gewijzigd", "bysearch": "Zoek", "cannoteditentry": "Kan item niet bewerken", - "casesensitive": "Regular expressions gebruiken", - "categories": "Cursuscategorieën", + "casesensitive": "Gevoeligheid voor hoofd/kleine letters", + "categories": "Categorieën", "entriestobesynced": "Items niet gesynchroniseerd", "entrypendingapproval": "Dit item wacht op goedkeuring.", "errorloadingentries": "Fout bij het laden van de items.", diff --git a/www/addons/mod/glossary/lang/pl.json b/www/addons/mod/glossary/lang/pl.json index 7effb708160..dc3225deb6a 100644 --- a/www/addons/mod/glossary/lang/pl.json +++ b/www/addons/mod/glossary/lang/pl.json @@ -1,6 +1,6 @@ { - "attachment": "Dołącz odznakę do wiadomości", + "attachment": "Załącznik", "browsemode": "Tryb przeglądania", - "casesensitive": "Użyj wyrażeń regularnych", - "categories": "Kategorie kursów" + "casesensitive": "Uwzględnianie wielkości liter", + "categories": "Kategorie" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/pt-br.json b/www/addons/mod/glossary/lang/pt-br.json index 7eeca932a54..37cf8ed2dab 100644 --- a/www/addons/mod/glossary/lang/pt-br.json +++ b/www/addons/mod/glossary/lang/pt-br.json @@ -1,6 +1,6 @@ { - "attachment": "Anexar emblema à mensagem", - "browsemode": "Navegar nas entradas", + "attachment": "Anexo", + "browsemode": "Prévia", "byalphabet": "Alfabeticamente", "byauthor": "Agrupar por autor", "bycategory": "Agrupar por categoria", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Recentemente atualizados", "bysearch": "Pesquisa", "cannoteditentry": "Não é possível editar o item", - "casesensitive": "Usar expressões regulares", - "categories": "Categorias de Cursos", + "casesensitive": "Considerar diferenças entre maiúsculas e minúsculas", + "categories": "Categorias", "entriestobesynced": "Itens a serem sincronizados", "entrypendingapproval": "A entrada está pendente de aprovação.", "errorloadingentries": "Ocorreu um erro enquanto carregava entradas.", diff --git a/www/addons/mod/glossary/lang/pt.json b/www/addons/mod/glossary/lang/pt.json index 151febb1e95..c672ec0b9a3 100644 --- a/www/addons/mod/glossary/lang/pt.json +++ b/www/addons/mod/glossary/lang/pt.json @@ -1,6 +1,6 @@ { - "attachment": "Anexar Medalha à mensagem", - "browsemode": "Ver entradas", + "attachment": "Anexo", + "browsemode": "Modo de pré-visualização", "byalphabet": "Alfabeticamente", "byauthor": "Agrupar por autor", "bycategory": "Agrupar por categoria", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Recentemente atualizados", "bysearch": "Pesquisar", "cannoteditentry": "Não é possível editar a entrada", - "casesensitive": "Usar regular expressions", - "categories": "Categorias de disciplinas", + "casesensitive": "Respeitar maiúsculas/minúsculas", + "categories": "Categorias", "entriestobesynced": "Entradas a ser sincronizadas", "entrypendingapproval": "Este termo aguarda aprovação.", "errorloadingentries": "Ocorreu um erro ao carregar os termos.", diff --git a/www/addons/mod/glossary/lang/ro.json b/www/addons/mod/glossary/lang/ro.json index 1711d27b159..697bdf70ba4 100644 --- a/www/addons/mod/glossary/lang/ro.json +++ b/www/addons/mod/glossary/lang/ro.json @@ -1,13 +1,13 @@ { - "attachment": "Atașament", - "browsemode": "Căutați în datele introduse", + "attachment": "Adaugă o etichetă mesajului", + "browsemode": "Mod Căutare", "byalphabet": "Alfabetic", "byauthor": "Grupare după autor", "bynewestfirst": "Cele mai noi sunt dispuse primele", "byrecentlyupdated": "Actualizări recente", "bysearch": "Căutare", - "casesensitive": "Foloseşte Regular Expressions", - "categories": "Categorii de cursuri", + "casesensitive": "Senzitivitate caractere", + "categories": "Categorii", "entrypendingapproval": "Această", "errorloadingentries": "A apărut o eroare la încărcarea intrărilor.", "errorloadingentry": "A apărut o eroare la încărcarea intrărilor.", diff --git a/www/addons/mod/glossary/lang/ru.json b/www/addons/mod/glossary/lang/ru.json index 05189841b97..487d64188b1 100644 --- a/www/addons/mod/glossary/lang/ru.json +++ b/www/addons/mod/glossary/lang/ru.json @@ -1,10 +1,10 @@ { - "attachment": "Вложение:", + "attachment": "Прикрепить значок к сообщению", "browsemode": "Режим предпросмотра", "byalphabet": "Алфавитно", "byauthor": "Группировать по автору", "bycategory": "Группировать по категориям", "bysearch": "Поиск", - "casesensitive": "Использовать регулярные выражения", - "categories": "Категории курсов" + "casesensitive": "Чувствительность ответа к регистру", + "categories": "Категории" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/sr-cr.json b/www/addons/mod/glossary/lang/sr-cr.json index 3b6a512513a..d816bfc641b 100644 --- a/www/addons/mod/glossary/lang/sr-cr.json +++ b/www/addons/mod/glossary/lang/sr-cr.json @@ -1,5 +1,6 @@ { - "browsemode": "Прегледај појмове", + "attachment": "Прилог", + "browsemode": "Режим прегледа", "byalphabet": "Азбучним редом", "byauthor": "Групиши по аутору", "bycategory": "Групиши по категорији", @@ -7,6 +8,8 @@ "byrecentlyupdated": "Недавно ажурирани", "bysearch": "Претражи", "cannoteditentry": "Не можете да уређујете појам", + "casesensitive": "Користи регуларне изразе", + "categories": "Категорије курсева", "entriestobesynced": "Појмови за синхронизацију", "entrypendingapproval": "Овај појам чека одобрење.", "errorloadingentries": "Дошло је до грешке приликом учитавања појмова.", diff --git a/www/addons/mod/glossary/lang/sr-lt.json b/www/addons/mod/glossary/lang/sr-lt.json index fe27335b225..4ee4c923d4a 100644 --- a/www/addons/mod/glossary/lang/sr-lt.json +++ b/www/addons/mod/glossary/lang/sr-lt.json @@ -1,5 +1,6 @@ { - "browsemode": "Pregledaj pojmove", + "attachment": "Prilog", + "browsemode": "Režim pregleda", "byalphabet": "Abecednim redom", "byauthor": "Grupiši po autoru", "bycategory": "Grupiši po kategoriji", @@ -7,6 +8,8 @@ "byrecentlyupdated": "Nedavno ažurirani", "bysearch": "Pretraži", "cannoteditentry": "Ne možete da uređujete pojam", + "casesensitive": "Koristi regularne izraze", + "categories": "Kategorije kurseva", "entriestobesynced": "Pojmovi za sinhronizaciju", "entrypendingapproval": "Ovaj pojam čeka odobrenje.", "errorloadingentries": "Došlo je do greške prilikom učitavanja pojmova.", diff --git a/www/addons/mod/glossary/lang/sv.json b/www/addons/mod/glossary/lang/sv.json index f9dc8d60f6a..3cfa169d56c 100644 --- a/www/addons/mod/glossary/lang/sv.json +++ b/www/addons/mod/glossary/lang/sv.json @@ -1,13 +1,13 @@ { - "attachment": "Bifoga märke med meddelande", - "browsemode": "Bläddrar bland poster", + "attachment": "Bilaga", + "browsemode": "Läge för förhandsgranskning", "byalphabet": "Alfabetiskt", "byauthor": "Sortera efter författare", "bynewestfirst": "Nyaste först", "byrecentlyupdated": "Nyligen uppdaterade", "bysearch": "Sök", - "casesensitive": "Använd standarduttryck", - "categories": "Kurskategorier", + "casesensitive": "Stor eller liten bokstav gör skillnad", + "categories": "Kategorier", "entrypendingapproval": "Detta inlägg väntar på godkännande", "errorloadingentries": "Ett fel uppstod vid inläsning av inläggen", "errorloadingentry": "Ett fel uppstod vid inläsning av inlägget", diff --git a/www/addons/mod/glossary/lang/tr.json b/www/addons/mod/glossary/lang/tr.json index ed836454608..6acccdba883 100644 --- a/www/addons/mod/glossary/lang/tr.json +++ b/www/addons/mod/glossary/lang/tr.json @@ -1,6 +1,6 @@ { - "attachment": "Rozete mesaj ekle", + "attachment": "Dosya", "browsemode": "Önizleme Modu", - "casesensitive": "Düzenli İfadeleri Kullan", - "categories": "Ders Kategorileri" + "casesensitive": "Harf duyarlılığı", + "categories": "Kategoriler" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/uk.json b/www/addons/mod/glossary/lang/uk.json index f3e1eeb10fc..a2186b273c3 100644 --- a/www/addons/mod/glossary/lang/uk.json +++ b/www/addons/mod/glossary/lang/uk.json @@ -1,6 +1,6 @@ { - "attachment": "Долучення", - "browsemode": "Перегляд записів", + "attachment": "Прикріпити відзнаку до повідомлення", + "browsemode": "Режим перегляду", "byalphabet": "По алфавіту", "byauthor": "Групувати за автором", "bycategory": "Групувати за категорією", @@ -8,8 +8,8 @@ "byrecentlyupdated": "Нещодавно оновлені", "bysearch": "Пошук", "cannoteditentry": "Неможливо редагувати запис", - "casesensitive": "Використовувати регулярні вирази", - "categories": "Категорії курсів", + "casesensitive": "Чутливість відповіді до регістра", + "categories": "Категорії", "entriestobesynced": "Записи будуть синхронізовані", "entrypendingapproval": "Цей запис очікує схвалення.", "errorloadingentries": "Сталася помилка під час завантаження записів.", diff --git a/www/addons/mod/glossary/lang/zh-cn.json b/www/addons/mod/glossary/lang/zh-cn.json index 761fdac404e..3af5cbb310e 100644 --- a/www/addons/mod/glossary/lang/zh-cn.json +++ b/www/addons/mod/glossary/lang/zh-cn.json @@ -1,6 +1,6 @@ { - "attachment": "附件发送", + "attachment": "附件", "browsemode": "预览模式", - "casesensitive": "使用正则表达式", - "categories": "课程分类" + "casesensitive": "区分大小写字母", + "categories": "类别" } \ No newline at end of file diff --git a/www/addons/mod/glossary/lang/zh-tw.json b/www/addons/mod/glossary/lang/zh-tw.json index d89166a41e8..b7204b9d753 100644 --- a/www/addons/mod/glossary/lang/zh-tw.json +++ b/www/addons/mod/glossary/lang/zh-tw.json @@ -1,13 +1,13 @@ { - "attachment": "在訊息上附加上獎章", - "browsemode": "瀏覽條目", + "attachment": "附件", + "browsemode": "預覽模式", "byalphabet": "按字母順序排列", "byauthor": "以作者為分群", "bynewestfirst": "最新的優先", "byrecentlyupdated": "最近的更新", "bysearch": "搜尋", - "casesensitive": "區分大小寫", - "categories": "課程類別", + "casesensitive": "區分字母的大小寫", + "categories": "類別", "entrypendingapproval": "這個項目已被暫緩核可", "errorloadingentries": "載入項目時發生錯誤", "errorloadingentry": "載入項目時發生錯誤", diff --git a/www/addons/mod/label/lang/he.json b/www/addons/mod/label/lang/he.json index 7f0814d0381..232aff3b2bf 100644 --- a/www/addons/mod/label/lang/he.json +++ b/www/addons/mod/label/lang/he.json @@ -1,3 +1,3 @@ { - "label": "תווית" + "label": "תווית לשאלה מותנית (באנגלית)" } \ No newline at end of file diff --git a/www/addons/mod/label/lang/lt.json b/www/addons/mod/label/lang/lt.json index f9a1ca059d8..8aba433e8cd 100644 --- a/www/addons/mod/label/lang/lt.json +++ b/www/addons/mod/label/lang/lt.json @@ -1,3 +1,3 @@ { - "label": "Etiketė" + "label": "Žyma" } \ No newline at end of file diff --git a/www/addons/mod/label/lang/ru.json b/www/addons/mod/label/lang/ru.json index 974254476a8..d174e316226 100644 --- a/www/addons/mod/label/lang/ru.json +++ b/www/addons/mod/label/lang/ru.json @@ -1,3 +1,3 @@ { - "label": "Пояснение" + "label": "Отмечено" } \ No newline at end of file diff --git a/www/addons/mod/label/lang/uk.json b/www/addons/mod/label/lang/uk.json index f1dd990cbfb..dc1348438f8 100644 --- a/www/addons/mod/label/lang/uk.json +++ b/www/addons/mod/label/lang/uk.json @@ -1,3 +1,3 @@ { - "label": "Лейба" + "label": "Напис" } \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/ar.json b/www/addons/mod/lesson/lang/ar.json index e314397c4ae..4f326bb530d 100644 --- a/www/addons/mod/lesson/lang/ar.json +++ b/www/addons/mod/lesson/lang/ar.json @@ -1,5 +1,6 @@ { "answer": "أجب", + "attempt": "محاولة: {{$a}}", "averagescore": "متوسط الدرجة", "averagetime": "متوسط الوقت", "branchtable": "محتوى", @@ -36,7 +37,7 @@ "review": "مراجعة", "reviewlesson": "مراجعة الدرس", "reviewquestionback": "نعم، أرغب في المحاولة ثانياً", - "submit": "سلم", + "submit": "سلم/قدم", "thatsthecorrectanswer": "هذه إجابة صحيحة", "thatsthewronganswer": "هذه إجابة خاطئة", "timeremaining": "الزمن المتبقى", diff --git a/www/addons/mod/lesson/lang/bg.json b/www/addons/mod/lesson/lang/bg.json index a1b9df04b2a..599f091c09d 100644 --- a/www/addons/mod/lesson/lang/bg.json +++ b/www/addons/mod/lesson/lang/bg.json @@ -1,5 +1,6 @@ { "answer": "Отговор", + "attempt": "{{$a}} опит", "attemptsremaining": "Имате оставащ(и) {{$a}} опит(a)", "averagescore": "Среден резултат", "averagetime": "Средно време", diff --git a/www/addons/mod/lesson/lang/ca.json b/www/addons/mod/lesson/lang/ca.json index ad28463c750..8978fa00b80 100644 --- a/www/addons/mod/lesson/lang/ca.json +++ b/www/addons/mod/lesson/lang/ca.json @@ -1,5 +1,6 @@ { "answer": "Resposta", + "attempt": "Intent: {{$a}}", "attemptheader": "Intent", "attemptsremaining": "Us resten {{$a}} intents", "averagescore": "Puntuació mitjana", diff --git a/www/addons/mod/lesson/lang/cs.json b/www/addons/mod/lesson/lang/cs.json index c6b5605a360..9918f0689c7 100644 --- a/www/addons/mod/lesson/lang/cs.json +++ b/www/addons/mod/lesson/lang/cs.json @@ -1,5 +1,6 @@ { "answer": "Odpověď", + "attempt": "Pokus: {{$a}}", "attemptheader": "Pokus", "attemptsremaining": "Zbývající počet pokusů: {{$a}}", "averagescore": "Průměrná známka", diff --git a/www/addons/mod/lesson/lang/da.json b/www/addons/mod/lesson/lang/da.json index d00ff2ab04e..54d6c8482c3 100644 --- a/www/addons/mod/lesson/lang/da.json +++ b/www/addons/mod/lesson/lang/da.json @@ -1,5 +1,6 @@ { "answer": "Svar", + "attempt": "Forsøg: {{$a}}", "attemptheader": "Forsøg", "attemptsremaining": "Du har {{$a}} forsøg endnu", "averagescore": "Gennemsnitlig score", diff --git a/www/addons/mod/lesson/lang/de.json b/www/addons/mod/lesson/lang/de.json index 60f5cf0ae98..f3f317f9c91 100644 --- a/www/addons/mod/lesson/lang/de.json +++ b/www/addons/mod/lesson/lang/de.json @@ -1,5 +1,6 @@ { "answer": "Antwort", + "attempt": "Versuch: {{$a}}", "attemptheader": "Versuch", "attemptsremaining": "Verbleibende Versuche: {{$a}}", "averagescore": "Durchschnittliche Bewertung", diff --git a/www/addons/mod/lesson/lang/el.json b/www/addons/mod/lesson/lang/el.json index bbb63a55b7d..cff02dafbf6 100644 --- a/www/addons/mod/lesson/lang/el.json +++ b/www/addons/mod/lesson/lang/el.json @@ -1,5 +1,6 @@ { "answer": "Απάντηση", + "attempt": "Προσπάθεια: {{$a}}", "attemptsremaining": "Σας απομένουν {{$a}} προσπάθειες", "averagescore": "Μέσος βαθμός", "averagetime": "Μέσος χρόνος", diff --git a/www/addons/mod/lesson/lang/es-mx.json b/www/addons/mod/lesson/lang/es-mx.json index ead72ecbab5..073ea430c66 100644 --- a/www/addons/mod/lesson/lang/es-mx.json +++ b/www/addons/mod/lesson/lang/es-mx.json @@ -1,5 +1,6 @@ { "answer": "Respuesta", + "attempt": "Intento: {{$a}}", "attemptheader": "Intento", "attemptsremaining": "Tiene {{$a}} intento(s) restante(s)", "averagescore": "Puntuación promedio", diff --git a/www/addons/mod/lesson/lang/es.json b/www/addons/mod/lesson/lang/es.json index 2679c6f3f4c..9c084627631 100644 --- a/www/addons/mod/lesson/lang/es.json +++ b/www/addons/mod/lesson/lang/es.json @@ -1,5 +1,6 @@ { "answer": "Respuesta", + "attempt": "Intento: {{$a}}", "attemptheader": "Intento", "attemptsremaining": "Tiene {{$a}} intento(s) pendiente(s)", "averagescore": "Puntuación promedio", diff --git a/www/addons/mod/lesson/lang/eu.json b/www/addons/mod/lesson/lang/eu.json index eb0cc12c6b0..fac71d304b6 100644 --- a/www/addons/mod/lesson/lang/eu.json +++ b/www/addons/mod/lesson/lang/eu.json @@ -1,5 +1,6 @@ { "answer": "Erantzuna", + "attempt": "Saiakera: {{$a}}", "attemptheader": "Saiakera", "attemptsremaining": "{{$a}} saiakera pendiente daukazu", "averagescore": "Batez besteko puntuazioa", @@ -24,7 +25,7 @@ "errorreviewretakenotlast": "Saiakera hau ezin da berrikusi dagoeneko beste saiakera bat amaitu duzulako.", "finish": "Amaitu", "finishretakeoffline": "Saiakera lineaz kanpo bukatu da.", - "firstwrong": "Sentitzen dugu. Ez duzu puntua lortu zure erantzuna zuzena izan ez delako. Berriz saiatu nahi al duzu? (ikasteko bakarrik, ez puntua lortzeko).", + "firstwrong": "Zure erantzuna ez da zuzena izan. Berriz saiatu nahi al duzu? (Oraingoan ondo erantzunez gero ez da zure azken emaitzan zenbatuko).", "gotoendoflesson": "Joan ikasgaiaren amaierara", "grade": "Kalifikazioa", "highscore": "Puntuazio altua", diff --git a/www/addons/mod/lesson/lang/fa.json b/www/addons/mod/lesson/lang/fa.json index 79774430714..36d3d14fd74 100644 --- a/www/addons/mod/lesson/lang/fa.json +++ b/www/addons/mod/lesson/lang/fa.json @@ -1,5 +1,6 @@ { "answer": "جواب", + "attempt": "تلاش: {{$a}}", "attemptsremaining": "می‌توانید {{$a}} بار دیگر تلاش کنید", "averagescore": "نمرهٔ میانگین", "averagetime": "زمان میانگین", diff --git a/www/addons/mod/lesson/lang/fr.json b/www/addons/mod/lesson/lang/fr.json index 4c51fa118a7..495601716fa 100644 --- a/www/addons/mod/lesson/lang/fr.json +++ b/www/addons/mod/lesson/lang/fr.json @@ -1,5 +1,6 @@ { "answer": "Réponse", + "attempt": "Tentative : {{$a}}", "attemptheader": "Tentative", "attemptsremaining": "Il vous reste {{$a}} tentative(s)", "averagescore": "Note moyenne", @@ -66,7 +67,7 @@ "reviewquestioncontinue": "Non, je veux passer à la question suivante", "secondpluswrong": "Pas tout à fait. Voulez-vous essayer à nouveau ?", "submit": "Envoyer", - "teacherjumpwarning": "Un lien {{$a.cluster}} ou un lien {{$a.unseen}} est utilisé dans cette leçon. Un lien « Page suivante » sera utilisé à sa place. Veuillez vous connecter en tant que participant pour tester ces liens.", + "teacherjumpwarning": "Un lien {{$a.cluster}} ou un lien {{$a.unseen}} est utilisé dans cette leçon. Un lien « Page suivante » sera utilisé à sa place. Veuillez vous connecter en tant qu'étudiant pour tester ces liens.", "teacherongoingwarning": "Le score actuel n'est affiché que pour les étudiants. Veuillez vous connecter en tant qu'étudiant pour tester le score actuel.", "teachertimerwarning": "Le chronomètre ne fonctionne que pour les étudiants. Veuillez vous connecter en tant qu'étudiant pour tester le chronomètre.", "thatsthecorrectanswer": "C'est une réponse correcte", diff --git a/www/addons/mod/lesson/lang/he.json b/www/addons/mod/lesson/lang/he.json index cc0a9600655..637604577d7 100644 --- a/www/addons/mod/lesson/lang/he.json +++ b/www/addons/mod/lesson/lang/he.json @@ -1,5 +1,6 @@ { "answer": "תשובה", + "attempt": "ניסיון: {{$a}}", "attemptheader": "ניסיון", "attemptsremaining": "נשארו לך עוד {{$a}} ניסיונות", "averagescore": "תוצאה ממוצעת", diff --git a/www/addons/mod/lesson/lang/hu.json b/www/addons/mod/lesson/lang/hu.json index d46a7ad2909..4c2bb5a14a2 100644 --- a/www/addons/mod/lesson/lang/hu.json +++ b/www/addons/mod/lesson/lang/hu.json @@ -1,5 +1,6 @@ { "answer": "Válasz", + "attempt": "Próbálkozás: {{$a}}", "attemptheader": "Próbálkozás", "attemptsremaining": "{{$a}} próbálkozása maradt", "averagescore": "Átlagpontszám", diff --git a/www/addons/mod/lesson/lang/it.json b/www/addons/mod/lesson/lang/it.json index de8299fe5af..3cd913414eb 100644 --- a/www/addons/mod/lesson/lang/it.json +++ b/www/addons/mod/lesson/lang/it.json @@ -1,5 +1,6 @@ { "answer": "Risposta", + "attempt": "Tentativo: {{$a}}", "attemptheader": "Tentativo", "attemptsremaining": "Ti rimangono {{$a}} tentativo/i", "averagescore": "Punteggio medio", diff --git a/www/addons/mod/lesson/lang/ja.json b/www/addons/mod/lesson/lang/ja.json index 14a3926d347..786b3484757 100644 --- a/www/addons/mod/lesson/lang/ja.json +++ b/www/addons/mod/lesson/lang/ja.json @@ -1,5 +1,6 @@ { - "answer": "答え/選択肢", + "answer": "答え", + "attempt": "受験: {{$a}}", "attemptheader": "受験", "attemptsremaining": "あなたには {{$a}} 回の受験回数が残っています。", "averagescore": "平均評点", @@ -30,7 +31,7 @@ "highscore": "最高評点", "hightime": "最長時間", "leftduringtimed": "あなたは制限時間のあるレッスンを途中で終了しました。
レッスンを再スタートするには「続ける」をクリックしてください。", - "leftduringtimednoretake": "あなたは制限時間のあるレッスンを途中で終了しました。
レッスンを再受験または継続は許可されていません。", + "leftduringtimednoretake": "あなたは制限時間のあるレッスンを途中で終了しました。
レッスンの再受験または継続は許可されていません。", "lessonmenu": "レッスンメニュー", "lessonstats": "レッスン統計", "linkedmedia": "リンクメディア", @@ -38,10 +39,10 @@ "lowscore": "最低評点", "lowtime": "最短時間", "maximumnumberofattemptsreached": "最大受験回数に達しました - 次のページに移動しています。", - "modattemptsnoteacher": "学生レビューは学生のみに表示されます。", + "modattemptsnoteacher": "学生レビューは学生にのみ表示されます。", "noanswer": "1つまたはそれ以上の問題が解答されていません。戻って解答を送信してください。", "nolessonattempts": "このレッスンは受験されていません。", - "nolessonattemptsgroup": "このレッスンの {{$a}} グループメンバーによる受験はありません。", + "nolessonattemptsgroup": "このレッスンでは {{$a}} グループメンバーによる受験はありません。", "notcompleted": "未了", "numberofcorrectanswers": "正解数: {{$a}}", "numberofpagesviewed": "解答済み問題数: {{$a}}", @@ -67,7 +68,7 @@ "secondpluswrong": "もう一度受験しますか?", "submit": "送信", "teacherjumpwarning": "このレッスンでは {{$a.cluster}} ジャンプまたは {{$a.unseen}} ジャンプが使用されています。代わりに「次のページ」へのジャンプが使用されます。これらのジャンプを確認するには学生としてログインしてください。", - "teacherongoingwarning": "進行中の評点は学生にのみ表示されます。進行中のスコアをテストするには学生としてログインしてください。", + "teacherongoingwarning": "進行中の評点は学生にのみ表示されます。進行中の評点をテストするには学生としてログインしてください。", "teachertimerwarning": "タイマーは学生に対してのみ作動します。タイマーをテストするには学生としてログインしてください。", "thatsthecorrectanswer": "正解です。", "thatsthewronganswer": "不正解です。", diff --git a/www/addons/mod/lesson/lang/lt.json b/www/addons/mod/lesson/lang/lt.json index e088a565222..d342ddcca33 100644 --- a/www/addons/mod/lesson/lang/lt.json +++ b/www/addons/mod/lesson/lang/lt.json @@ -1,5 +1,6 @@ { "answer": "Atsakyti", + "attempt": "Bandymas: {{$a}}", "attemptheader": "Bandymas", "attemptsremaining": "Turite likusių bandymų: {{$a}}", "averagescore": "Vidutinis balas", diff --git a/www/addons/mod/lesson/lang/nl.json b/www/addons/mod/lesson/lang/nl.json index e2620a8cabf..9d533a812b8 100644 --- a/www/addons/mod/lesson/lang/nl.json +++ b/www/addons/mod/lesson/lang/nl.json @@ -1,5 +1,6 @@ { "answer": "Antwoord", + "attempt": "Poging: {{$a}}", "attemptheader": "Poging", "attemptsremaining": "Je kan nog {{$a}} poging(en) doen", "averagescore": "Gemiddelde score", diff --git a/www/addons/mod/lesson/lang/pl.json b/www/addons/mod/lesson/lang/pl.json index c36b7ae91cf..410586113e2 100644 --- a/www/addons/mod/lesson/lang/pl.json +++ b/www/addons/mod/lesson/lang/pl.json @@ -1,5 +1,6 @@ { "answer": "Odpowiedź", + "attempt": "Podejście: {{$a}}", "attemptheader": "Próba", "attemptsremaining": "Pozostało Ci {{$a}} podejść", "averagescore": "Średnia liczba punktów", diff --git a/www/addons/mod/lesson/lang/pt-br.json b/www/addons/mod/lesson/lang/pt-br.json index a50382f3902..613d8d5c741 100644 --- a/www/addons/mod/lesson/lang/pt-br.json +++ b/www/addons/mod/lesson/lang/pt-br.json @@ -1,5 +1,6 @@ { "answer": "Resposta", + "attempt": "Tentativa: {{$a}}", "attemptheader": "Tentativa", "attemptsremaining": "Você tem ainda {{$a}} tentativas", "averagescore": "Pontuação média", diff --git a/www/addons/mod/lesson/lang/pt.json b/www/addons/mod/lesson/lang/pt.json index e236e65f35a..eab86d3e961 100644 --- a/www/addons/mod/lesson/lang/pt.json +++ b/www/addons/mod/lesson/lang/pt.json @@ -1,5 +1,6 @@ { "answer": "Resposta", + "attempt": "Tentativa: {{$a}}", "attemptheader": "Tentativa", "attemptsremaining": "Ainda pode realizar {{$a}} tentativa(s)", "averagescore": "Pontuação média", @@ -16,7 +17,7 @@ "detailedstats": "Estatísticas detalhadas", "didnotanswerquestion": "Não respondeu a esta pergunta", "displayofgrade": "Exibição da nota (apenas para alunos)", - "displayscorewithessays": "Obteve {{$a.score}} num máximo de {{$a.tempmaxgrade}}.
As suas respostas à(s) pergunta(s) de desenvolvimento {{$a.essayquestions resposta(s)}} serão avaliadas posteriormente,
sendo a pontuação correspondente adicionada à pontuação final.

A sua classificação atual, sem as perguntas que faltam avaliar, é de {{$a.score}} num máximo de {{$a.grade}}.", + "displayscorewithessays": "Obteve {{$a.score}} num máximo de {{$a.tempmaxgrade}}.
As suas respostas à(s) pergunta(s) de desenvolvimento {{$a.essayquestions}} resposta(s) serão avaliadas posteriormente,
sendo a pontuação correspondente adicionada à pontuação final.

A sua classificação atual, sem as perguntas que faltam avaliar, é de {{$a.score}} num máximo de {{$a.grade}}.", "displayscorewithoutessays": "Obteve uma pontuação de {{$a.score}} (em {{$a.grade}}). Clique em Ver notas para ver a sua nota final na pauta", "emptypassword": "A palava-chave não pode estar em branco", "enterpassword": "Introduza a senha:", @@ -66,11 +67,11 @@ "reviewquestioncontinue": "Não, quero avançar para a pergunta seguinte", "secondpluswrong": "Resposta incorreta. Quer voltar a tentar?", "submit": "Submeter", - "teacherjumpwarning": "Nesta lição, há páginas que seguem para {{$a.cluster}} ou {{$a.unseen}}. Esta sequência será ignorada e a lição seguirá para a página seguinte. Para testar a sequência das páginas entre como aluno.", + "teacherjumpwarning": "Nesta lição, há páginas que seguem para {{$a.cluster}} ou para {{$a.unseen}}. Esta sequência será ignorada e a lição seguirá para a página seguinte. Para testar a sequência das páginas entre como aluno.", "teacherongoingwarning": "A exibição da pontuação no decorrer da lição só é visível para os alunos. Para ver a pontuação no decorrer da lição entre como aluno.", "teachertimerwarning": "O cronómetro só é visível para os alunos. Para testar esta funcionalidade, entre como aluno.", "thatsthecorrectanswer": "A sua resposta está correta.", - "thatsthewronganswer": "A sua resposta não está correta.", + "thatsthewronganswer": "A sua resposta não está correta.", "timeremaining": "Tempo restante", "timetaken": "Tempo usado", "unseenpageinbranch": "Pergunta não vista da sequência", diff --git a/www/addons/mod/lesson/lang/ro.json b/www/addons/mod/lesson/lang/ro.json index e921358830b..b13962e5dd6 100644 --- a/www/addons/mod/lesson/lang/ro.json +++ b/www/addons/mod/lesson/lang/ro.json @@ -1,5 +1,6 @@ { "answer": "Răspuns", + "attempt": "Încercarea cu numărul: {{$a}}", "attemptheader": "Încercare", "attemptsremaining": "Mai aveţi {{$a}} încercări disponibile", "averagescore": "Punctaj mediu obţinut", diff --git a/www/addons/mod/lesson/lang/ru.json b/www/addons/mod/lesson/lang/ru.json index cdfe818e247..f8db842221a 100644 --- a/www/addons/mod/lesson/lang/ru.json +++ b/www/addons/mod/lesson/lang/ru.json @@ -1,5 +1,6 @@ { "answer": "Ответ", + "attempt": "Попытка: {{$a}}", "attemptheader": "Попытка", "attemptsremaining": "У вас осталось {{$a}} попыток", "averagescore": "Средний балл", diff --git a/www/addons/mod/lesson/lang/sr-cr.json b/www/addons/mod/lesson/lang/sr-cr.json index db28c42b19e..fe5901ac751 100644 --- a/www/addons/mod/lesson/lang/sr-cr.json +++ b/www/addons/mod/lesson/lang/sr-cr.json @@ -1,8 +1,84 @@ { + "answer": "Одговор", + "attempt": "Покушај: {{$a}}", + "attemptheader": "Покушај", + "attemptsremaining": "Број покушаја који вам је преостао: {{$a}}", + "averagescore": "Просечан број бодова", + "averagetime": "Просечно време", + "branchtable": "Садржај са гранањем", + "cannotfindattempt": "Грешка: није пронађен покушај", + "cannotfinduser": "Грешка: нису пронађени слогови у табели lesson_timer", + "clusterjump": "Још неприказано питање из групе питања", + "completed": "Завршено", + "congratulations": "Честитамо - стигли сте до краја лекције", + "continue": "Настави", + "continuetonextpage": "Идите на следећу страницу", + "defaultessayresponse": "Предавач ће оценити ваш есеј.", + "detailedstats": "Детаљна статистика", + "didnotanswerquestion": "Нисте одговорили на ово питање.", + "displayofgrade": "Приказ оцена (само за полазнике)", + "displayscorewithessays": "

Освојили сте {{$a.score}} од максималних {{$a.tempmaxgrade}} бодова за питања која се аутоматски оцењују.

\n

Ваш {{$a.essayquestions}} одговор на питања у форми есеја биће ускоро прегледан и оцењен, а оцена ће касније бити додата
у ваш финални резултат.

\n

Ваша тренутна оцена без есеја је {{$a.score}} од {{$a.grade}}

", + "displayscorewithoutessays": "Ваш резултат је {{$a.score}} (од могућих {{$a.grade}}).", + "emptypassword": "Поље за лозинку не може бити празно", + "enterpassword": "Молимо унесите лозинку:", + "eolstudentoutoftimenoanswers": "Нисте одговорили ни на једно питање. Ваша оцена за ову лекцију је 0.", "errorreviewretakenotlast": "Ова покушај не може више бити прегледан зато што је завршен други покушај.", + "finish": "Заврши", "finishretakeoffline": "Овај покушај је завршен у офлајн режиму.", + "firstwrong": "Погрешно сте одговорили на питање. Да ли желите да покушате поново? (ако сада тачно одговорите на питање, то се неће рачунати у ваш коначан резултат.)", + "gotoendoflesson": "Иди на крај лекције", + "grade": "Оцена", + "highscore": "Најбољи резултат", + "hightime": "Најдуже време", + "leftduringtimed": "Напустили сте лекцију која је временски ограничена.
Притисните тастер за наставак да бисте погледали лекцију од почетка.", + "leftduringtimednoretake": "Напустили сте лекцију која је временски ограничена и није Вам
дозвољено да наставите или почнете лекцију из почетка.", + "lessonmenu": "Мени лекције", + "lessonstats": "Статистика лекције", + "linkedmedia": "Повезани медији", + "loginfail": "Погрешна пријава, молимо покушајте поново...", + "lowscore": "Наслабији резултат", + "lowtime": "Најкраће време", + "maximumnumberofattemptsreached": "Достигнут је максималан број покушаја - прелази се на следећу страницу", + "modattemptsnoteacher": "Полазнички преглед функционише само за полазнике.", + "noanswer": "На једно или више питања није дат одговор. Молимо вратите се назад и дајте свој одговор.", + "nolessonattempts": "Нико још није покушао да прође кроз ову лекцију.", + "nolessonattemptsgroup": "Није било покушаја за ову лекцију од стране чланова групе {{$a}}.", + "notcompleted": "Није завршено", + "numberofcorrectanswers": "Број тачних одговора: {{$a}}", + "numberofpagesviewed": "Број прегледаних страница: {{$a}}", + "numberofpagesviewednotice": "Број питања на које је дат одговор: {{$a.nquestions}} (Требало би их бити бар {{$a.minquestions}})", + "ongoingcustom": "До сада сте освојили {{$a.score}} од максимално {{$a.currenthigh}} бодова.", + "ongoingnormal": "Тачно сте одговорили на {{$a.correct}} од {{$a.viewed}} питања која сте видели.", + "or": "ИЛИ", + "overview": "Преглед", + "preview": "Преглед", + "progressbarteacherwarning2": "Нећете видети траку напредовања зато што можете да уређујете ову лекцију", + "progresscompleted": "Завршили сте {{$a}}% лекције", + "question": "Питање", + "rawgrade": "Необрађена оцена", + "reports": "Извештаји", + "response": "Повратне информације", "retakefinishedinsync": "Офлајн покушај је синхронизован. Да ли желите да га прегледате?", "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", - "warningretakefinished": "Покушај је завршен на сајту." + "review": "Преглед", + "reviewlesson": "Преглед лекције", + "reviewquestionback": "Да, волео/ла бих да поново покушам", + "reviewquestioncontinue": "Не, желим да пређем на следеће питање", + "secondpluswrong": "Није баш. Да ли желите да покушате поново?", + "submit": "Пошаљи", + "teacherjumpwarning": "У овој лекцији се користе {{$a.cluster}} или {{$a.unseen}} прелаз између страница. Прелаз \"Следећа страница\" ће се користити уместо њих током овог приказа. За тестирање ових прелаза пријавите се на систем у улози полазника.", + "teacherongoingwarning": "Тренутни резултат током прегледа лекције се приказује само полазницима. Пријавите се на систем у улози полазника да бисте тестирали ову могућност.", + "teachertimerwarning": "Мерач времена могу да виде само полазници. Како бисте тестирали мерач времена пријавите се на систем у улози полазника.", + "thatsthecorrectanswer": "Тачан одговор", + "thatsthewronganswer": "Погрешан одговор", + "timeremaining": "Преостало време", + "timetaken": "Потрошено време", + "unseenpageinbranch": "Још неприказано питање унутар стране са садржајем и гранањем", + "warningretakefinished": "Покушај је завршен на сајту.", + "welldone": "Браво!", + "youhaveseen": "Већ сте видели више од једне странице ове лекције.
Желите ли почети од последње странице коју сте видели?", + "youranswer": "Ваш одговор", + "yourcurrentgradeisoutof": "Ваша тренутна оцена је {{$a.grade}} од могућих {{$a.total}}", + "youshouldview": "Требало би да одговорите на барем: {{$a}}" } \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/sr-lt.json b/www/addons/mod/lesson/lang/sr-lt.json index da28ea0cf44..03505574aa4 100644 --- a/www/addons/mod/lesson/lang/sr-lt.json +++ b/www/addons/mod/lesson/lang/sr-lt.json @@ -1,8 +1,84 @@ { + "answer": "Odgovor", + "attempt": "Pokušaj: {{$a}}", + "attemptheader": "Pokušaj", + "attemptsremaining": "Broj pokušaja koji vam je preostao: {{$a}}", + "averagescore": "Prosečan broj bodova", + "averagetime": "Prosečno vreme", + "branchtable": "Sadržaj sa grananjem", + "cannotfindattempt": "Greška: nije pronađen pokušaj", + "cannotfinduser": "Greška: nisu pronađeni slogovi u tabeli lesson_timer", + "clusterjump": "Još neprikazano pitanje iz grupe pitanja", + "completed": "Završeno", + "congratulations": "Čestitamo - stigli ste do kraja lekcije", + "continue": "Nastavi", + "continuetonextpage": "Idite na sledeću stranicu", + "defaultessayresponse": "Predavač će oceniti vaš esej.", + "detailedstats": "Detaljna statistika", + "didnotanswerquestion": "Niste odgovorili na ovo pitanje.", + "displayofgrade": "Prikaz ocena (samo za polaznike)", + "displayscorewithessays": "

Osvojili ste {{$a.score}} od maksimalnih {{$a.tempmaxgrade}} bodova za pitanja koja se automatski ocenjuju.

\n

Vaš {{$a.essayquestions}} odgovor na pitanja u formi eseja biće uskoro pregledan i ocenjen, a ocena će kasnije biti dodata
u vaš finalni rezultat.

\n

Vaša trenutna ocena bez eseja je {{$a.score}} od {{$a.grade}}

", + "displayscorewithoutessays": "Vaš rezultat je {{$a.score}} (od mogućih {{$a.grade}}).", + "emptypassword": "Polje za lozinku ne može biti prazno", + "enterpassword": "Molimo unesite lozinku:", + "eolstudentoutoftimenoanswers": "Niste odgovorili ni na jedno pitanje. Vaša ocena za ovu lekciju je 0.", "errorreviewretakenotlast": "Ova pokušaj ne može više biti pregledan zato što je završen drugi pokušaj.", + "finish": "Završi", "finishretakeoffline": "Ovaj pokušaj je završen u oflajn režimu.", + "firstwrong": "Pogrešno ste odgovorili na pitanje. Da li želite da pokušate ponovo? (ako sada tačno odgovorite na pitanje, to se neće računati u vaš konačan rezultat.)", + "gotoendoflesson": "Idi na kraj lekcije", + "grade": "Ocena", + "highscore": "Najbolji rezultat", + "hightime": "Najduže vreme", + "leftduringtimed": "Napustili ste lekciju koja je vremenski ograničena.
Pritisnite taster za nastavak da biste pogledali lekciju od početka.", + "leftduringtimednoretake": "Napustili ste lekciju koja je vremenski ograničena i nije Vam
dozvoljeno da nastavite ili počnete lekciju iz početka.", + "lessonmenu": "Meni lekcije", + "lessonstats": "Statistika lekcije", + "linkedmedia": "Povezani mediji", + "loginfail": "Pogrešna prijava, molimo pokušajte ponovo...", + "lowscore": "Naslabiji rezultat", + "lowtime": "Najkraće vreme", + "maximumnumberofattemptsreached": "Dostignut je maksimalan broj pokušaja - prelazi se na sledeću stranicu", + "modattemptsnoteacher": "Polaznički pregled funkcioniše samo za polaznike", + "noanswer": "Na jedno ili više pitanja nije dat odgovor. Molimo vratite se nazad i dajte svoj odgovor.", + "nolessonattempts": "Niko još nije pokušao da prođe kroz ovu lekciju.", + "nolessonattemptsgroup": "Nije bilo pokušaja za ovu lekciju od strane članova grupe {{$a}}.", + "notcompleted": "Nije završeno", + "numberofcorrectanswers": "Broj tačnih odgovora: {{$a}}", + "numberofpagesviewed": "Broj pregledanih stranica: {{$a}}", + "numberofpagesviewednotice": "Broj pitanja na koje je dat odgovor: {{$a.nquestions}} (Trebalo bi ih biti bar {{$a.minquestions}})", + "ongoingcustom": "Do sada ste osvojili {{$a.score}} od maksimalno {{$a.currenthigh}} bodova.", + "ongoingnormal": "Tačno ste odgovorili na {{$a.correct}} od {{$a.viewed}} pitanja koja ste videli.", + "or": "ILI", + "overview": "Pregled", + "preview": "Pregled", + "progressbarteacherwarning2": "Nećete videti traku napredovanja zato što možete da uređujete ovu lekciju", + "progresscompleted": "Završili ste {{$a}}% lekcije", + "question": "Pitanje", + "rawgrade": "Neobrađena ocena", + "reports": "Izveštaji", + "response": "Povratne informacije", "retakefinishedinsync": "Oflajn pokušaj je sinhronizovan. Da li želite da ga pregledate?", "retakelabelfull": "{{retake}}: {{grade}} {{timestart}} ({{duration}})", "retakelabelshort": "{{retake}}: {{grade}} {{timestart}}", - "warningretakefinished": "Pokušaj je završen na sajtu." + "review": "Pregled", + "reviewlesson": "Pregled lekcije", + "reviewquestionback": "Da, voleo/la bih da ponovo pokušam", + "reviewquestioncontinue": "Ne, želim da pređem na sledeće pitanje", + "secondpluswrong": "Nije baš. Da li želite da pokušate ponovo?", + "submit": "Pošalji", + "teacherjumpwarning": "U ovoj lekciji se koriste {{$a.cluster}} ili {{$a.unseen}} prelaz između stranica. Prelaz \"Sledeća stranica\" će se koristiti umesto njih tokom ovog prikaza. Za testiranje ovih prelaza prijavite se na sistem u ulozi polaznika.", + "teacherongoingwarning": "Trenutni rezultat tokom pregleda lekcije se prikazuje samo polaznicima. Prijavite se na sistem u ulozi polaznika da biste testirali ovu mogućnost.", + "teachertimerwarning": "Merač vremena mogu da vide samo polaznici. Kako biste testirali merač vremena prijavite se na sistem u ulozi polaznika.", + "thatsthecorrectanswer": "Tačan odgovor", + "thatsthewronganswer": "Pogrešan odgovor", + "timeremaining": "Preostalo vreme", + "timetaken": "Potrošeno vreme", + "unseenpageinbranch": "Još neprikazano pitanje unutar strane sa sadržajem i grananjem", + "warningretakefinished": "Pokušaj je završen na sajtu.", + "welldone": "Bravo!", + "youhaveseen": "Već ste videli više od jedne stranice ove lekcije.
Želite li početi od poslednje stranice koju ste videli?", + "youranswer": "Vaš odgovor", + "yourcurrentgradeisoutof": "Vaša trenutna ocena je {{$a.grade}} od mogućih {{$a.total}}", + "youshouldview": "Trebalo bi da odgovorite na barem: {{$a}}" } \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/sv.json b/www/addons/mod/lesson/lang/sv.json index fe0a53b2702..747a688c78b 100644 --- a/www/addons/mod/lesson/lang/sv.json +++ b/www/addons/mod/lesson/lang/sv.json @@ -1,5 +1,6 @@ { "answer": "Svar", + "attempt": "Försök: {{$a}}", "attemptsremaining": "Du har {{$a}} återstående försök", "averagescore": "Genomsnittsligt resultat", "averagetime": "Genomsnittslig tid", diff --git a/www/addons/mod/lesson/lang/tr.json b/www/addons/mod/lesson/lang/tr.json index 99d0bd338e2..7f50d81d9ea 100644 --- a/www/addons/mod/lesson/lang/tr.json +++ b/www/addons/mod/lesson/lang/tr.json @@ -1,5 +1,6 @@ { "answer": "Cevap", + "attempt": "Uygulama: {{$a}}", "attemptheader": "Deneme(Teşebbüs)", "attemptsremaining": "{{$a}} uygulama hakkınız kaldı", "averagescore": "Ortalama not", diff --git a/www/addons/mod/lesson/lang/uk.json b/www/addons/mod/lesson/lang/uk.json index 43f68800251..64f4e4e242a 100644 --- a/www/addons/mod/lesson/lang/uk.json +++ b/www/addons/mod/lesson/lang/uk.json @@ -1,5 +1,6 @@ { "answer": "Відповідь", + "attempt": "Спроба: {{$a}}", "attemptheader": "Спроба", "attemptsremaining": "У Вас залишилося {{$a}} спроб(и)", "averagescore": "Середній бал", diff --git a/www/addons/mod/lesson/lang/zh-cn.json b/www/addons/mod/lesson/lang/zh-cn.json index 3c06c89a713..1cb9bce4497 100644 --- a/www/addons/mod/lesson/lang/zh-cn.json +++ b/www/addons/mod/lesson/lang/zh-cn.json @@ -1,5 +1,6 @@ { "answer": "答案", + "attempt": "尝试:{{$a}}", "attemptsremaining": "您还有{{$a}}次机会", "averagescore": "平均分", "averagetime": "平均耗时", diff --git a/www/addons/mod/lesson/lang/zh-tw.json b/www/addons/mod/lesson/lang/zh-tw.json index 42b9529905a..bcbb5ed10a1 100644 --- a/www/addons/mod/lesson/lang/zh-tw.json +++ b/www/addons/mod/lesson/lang/zh-tw.json @@ -1,5 +1,6 @@ { "answer": "答案", + "attempt": "作答:{{$a}}", "attemptheader": "作答", "attemptsremaining": "您還有{{$a}}次作答機會", "averagescore": "平均分數", @@ -35,7 +36,7 @@ "loginfail": "登入錯誤,請重試", "lowscore": "最低分數", "lowtime": "最短時間", - "maximumnumberofattemptsreached": "達到嘗試次數上限 - 請進入下一頁", + "maximumnumberofattemptsreached": "已達到作答次的上限 - 將進入下一頁", "modattemptsnoteacher": "學生回顧功能只開放給學生們。", "noanswer": "有一個或以上的問題沒有回答。請回頭並提交一個答案。", "nolessonattempts": "這個課程還沒有人嘗試。", @@ -47,7 +48,7 @@ "ongoingcustom": "目前的{{$a.currenthigh}}分中,您已獲得{{$a.score}}分。", "ongoingnormal": "到目前為止的{{$a.viewed}}問題中,您答對了{{$a.correct}}題。", "or": "或", - "overview": "概要", + "overview": "綜覽", "preview": "預覽", "progressbarteacherwarning2": "你不能看到這進度列,因為你可以編輯這一編序學習。", "progresscompleted": "在這一編序學習,你已經完成{{$a}}%", diff --git a/www/addons/mod/quiz/lang/ja.json b/www/addons/mod/quiz/lang/ja.json index 2fb91503783..62382e648d4 100644 --- a/www/addons/mod/quiz/lang/ja.json +++ b/www/addons/mod/quiz/lang/ja.json @@ -7,14 +7,14 @@ "cannotsubmitquizdueto": "このクイズの回答は、以下の理由で提出できませんでした:", "comment": "コメント", "completedon": "完了日時", - "confirmclose": "送信した場合、この受験に関して、これ以上あなたの答えを変更することはできません。", + "confirmclose": "送信した場合、あなたはこれ以上受験の答えを変更できないようになります。", "confirmcontinueoffline": "この回答は、理由「 {{$a}} 」により、同期できませんでした。もしあなたが別のデバイスで回答を続けていた場合、データが失われている可能性があります。", "confirmleavequizonerror": "回答の保存中にエラーが発生しました。クイズを終了してもよいですか?", "confirmstart": "この小テストには {{$a}} の時間制限があります。あなたが受験を開始した時点から時間が計測されます。あなたは有効期限前に送信する必要があります。今から開始してもよろしいですか?", "confirmstartheader": "時間制限小テスト", - "connectionerror": "ネットワークコネクションが切断されました (オートセーブ失敗)。\n\nこのページで入力した最後の数分間の解答をメモした後、再接続を試みてください。\n\n接続が再確立された場合、あなたの解答は保存され、このメッセージは表示されなくなります。", + "connectionerror": "ネットワークコネクションが切断されました (オートセーブ失敗)。\n\nこのページで入力した最後の数分間の解答をメモした後、再接続を試みてください。\n\n再度接続が確立された場合、あなたの解答は保存されこのメッセージは表示されなくなります。", "continueattemptquiz": "前回の受験を続ける", - "continuepreview": "前回受験のプレビューを続ける", + "continuepreview": "前回のプレビューを続ける", "errorbehaviournotsupported": "このクイズは、アプリでサポートされていない動作が含まれているため回答することができません。", "errordownloading": "必要なデータのダウンロード中にエラーが発生しました。", "errorgetattempt": "回答データの取得中にエラーが発生しました。", @@ -46,7 +46,7 @@ "outofshort": "{{$a.grade}} / {{$a.maxgrade}}", "overallfeedback": "全体のフィードバック", "overdue": "期限切れ", - "overduemustbesubmittedby": "この受験は制限時間を過ぎています。そして、すでに送信されている必要があります。あなたがこの小テストの評定を希望する場合、{{$a}} までに送信してください。それまでに送信しない場合、この受験の評点はカウントされません。", + "overduemustbesubmittedby": "この受験は制限時間を過ぎています。この受験はすでに送信されている必要があります。あなたがこの小テストの評定を希望する場合、{{$a}} までに送信してください。それまでに送信しない場合、この受験の評点はカウントされません。", "preview": "プレビュー", "previewquiznow": "小テストをプレビューする", "question": "問題", diff --git a/www/addons/mod/quiz/lang/lt.json b/www/addons/mod/quiz/lang/lt.json index 3d18000f600..0e24a274c6e 100644 --- a/www/addons/mod/quiz/lang/lt.json +++ b/www/addons/mod/quiz/lang/lt.json @@ -46,6 +46,7 @@ "outofshort": "{{$a.grade}}/{{$a.maxgrade}}", "overallfeedback": "Bendras atsiliepimas", "overdue": "Uždelstas", + "overduemustbesubmittedby": "Šis bandymas jau pavėluotas. Jis jau turėjo būti pateiktas. Jei norite, kad šis testas būtų įvertintas, turite jį patvirtinti {{$a}}. Jei nepateiksite, tada balas šiam bandymui nebus skaičiuojamas.", "preview": "Peržiūra", "previewquiznow": "Peržiūrėti testą dabar", "question": "Klausimas", diff --git a/www/addons/mod/quiz/lang/sr-cr.json b/www/addons/mod/quiz/lang/sr-cr.json index f41594f4ad8..41be728b1ad 100644 --- a/www/addons/mod/quiz/lang/sr-cr.json +++ b/www/addons/mod/quiz/lang/sr-cr.json @@ -1,7 +1,20 @@ { + "attemptfirst": "Први покушај", + "attemptlast": "Последњи покушај", + "attemptnumber": "Покушај", + "attemptquiznow": "Започни тест", + "attemptstate": "Стање", "cannotsubmitquizdueto": "Овај покушај решавања теста не може да буде предат због следећих разлога:", + "comment": "Коментар", + "completedon": "Завршено дана", + "confirmclose": "Када предате тест нећете више бити у могућности да мењате своје одговоре.", "confirmcontinueoffline": "Овај покушај није синхронизован од {{$a}}. Ако сте у међувремену овај покушај наставили на неком другом уређају, постоји могућност да сте изгубили податке.", "confirmleavequizonerror": "Дошло је до грешке приликом покушаја да се сачувају одговори. Да ли сте сигурни да желите да напустите тест?", + "confirmstart": "Тест има временско ограничење ({{$a}}). Време ће се одбројавати од момента почетка покушаја и морате предати своје одговоре пре него што истекне. Да ли сте сигурни да сада желите да започнете решавање теста?", + "confirmstartheader": "Временски ограничен тест", + "connectionerror": "Мрежна веза је изгубљена. (Аутоматско чување није успело).\n\nЗапишите све одговора унетих на овој страници у последњих неколико минута, а затим покушајте поново да се повежете.\n\nКада се веза поново успостави ваши одговори би требало да буду сачувани а ова порука ће нестати.", + "continueattemptquiz": "Наставите последњи покушај", + "continuepreview": "Настави последњи преглед", "errorbehaviournotsupported": "Овај тест не можете решавати у апликацији зато што она не подржава понашање питања:", "errordownloading": "Грешка приликом преузимања неопходних података.", "errorgetattempt": "Грешка приликом преузимања података о покушају решавања теста.", @@ -13,10 +26,55 @@ "errorsaveattempt": "Дошло је до грешке приликом снимања података о покушају решавања теста.", "errorsyncquiz": "Дошло је до грешке приликом синхронизације. Молимо, покушајте поново.", "errorsyncquizblocked": "Овај тест сада не може бити синхронизован због другог процеса који је тренутно у току. Молимо, покушајте поново касније. Ако и даље будете имали проблема, покушајте да покренете апликацију испочетка.", + "feedback": "Повратне информације", + "finishattemptdots": "Заврши покушај...", "finishnotsynced": "Тест је завршен, али није синхронизован", + "grade": "Оцена", + "gradeaverage": "Просечна оцена", + "gradehighest": "Највиша оцена", + "grademethod": "Метод оцењивања", + "gradesofar": "{{$a.method}}: {{$a.mygrade}} / {{$a.quizgrade}}.", "hasdatatosync": "Овај тест има офлајн податке које треба синхронизовати.", + "marks": "Оцене", + "mustbesubmittedby": "Овај покушај мора бити предат до {{$a}}.", + "noquestions": "Ниједно питање још није додато", + "noreviewattempt": "Није Вам дозвољено да прегледате овај покушај", + "notyetgraded": "Још није оцењено", "opentoc": "Отвори навигациони мени.", + "outof": "{{$a.grade}} од {{$a.maxgrade}}", + "outofpercent": "{{$a.grade}} од {{$a.maxgrade}}", + "outofshort": "{{$a.grade}}/{{$a.maxgrade}}", + "overallfeedback": "Свеобухватне повратне информације", + "overdue": "Закаснели", + "overduemustbesubmittedby": "Време за овај покушај решавање теста је истекло. Покушај је већ требало предати. Ако желите да овај тест буде оцењен морате га предати до {{$a}}. Ако то не урадите до наведеног рока, оцене за овај покушај се неће рачунати.", + "preview": "Преглед", + "previewquiznow": "Прегледај тест сада", + "question": "Питање", + "quizpassword": "Лозинка теста", + "reattemptquiz": "Поновни покушај решавања теста", + "requirepasswordmessage": "Да бисте приступили решавању овог теста морате знати лозинку теста", + "returnattempt": "Повратак на покушај", + "review": "Преглед", + "reviewofattempt": "Преглед покушаја {{$a}}", + "reviewofpreview": "Преглед приказа", + "showall": "Прикажи сва питања на једној страници", + "showeachpage": "Прикажи једну по једну страницу", + "startattempt": "Започни покушај решавања", + "startedon": "Започето", + "stateabandoned": "Никад предато", + "statefinished": "Завршено", + "statefinisheddetails": "Предато {{$a}}", + "stateinprogress": "У току", + "stateoverdue": "Закаснела предаја", + "stateoverduedetails": "Мора се предати до {{$a}}", + "status": "Статус", + "submitallandfinish": "Предај све одговоре и заврши тест", + "summaryofattempt": "Резиме покушаја", + "summaryofattempts": "Резиме ваших претходних покушаја", + "timeleft": "Преостало време", + "timetaken": "Утрошено време", "warningattemptfinished": "Офлајн покушај је одбачен зато што је или завршен на сајту или није пронађен.", "warningdatadiscarded": "Неки офлајн одговори су одбачени зато што су питања измењена онлајн.", - "warningdatadiscardedfromfinished": "Покушај решавања теста је није завршен зато што су неки офлајн одговори одбачени. Прегледајте своје одговоре, а затим поново пошаљите свој покушај." + "warningdatadiscardedfromfinished": "Покушај решавања теста је није завршен зато што су неки офлајн одговори одбачени. Прегледајте своје одговоре, а затим поново пошаљите свој покушај.", + "yourfinalgradeis": "Ваша коначна оцена на овом тесту је {{$a}}." } \ No newline at end of file diff --git a/www/addons/mod/quiz/lang/sr-lt.json b/www/addons/mod/quiz/lang/sr-lt.json index a8ac15c303b..0bff65e68b6 100644 --- a/www/addons/mod/quiz/lang/sr-lt.json +++ b/www/addons/mod/quiz/lang/sr-lt.json @@ -1,7 +1,20 @@ { + "attemptfirst": "Prvi pokušaj", + "attemptlast": "Poslednji pokušaj", + "attemptnumber": "Pokušaj", + "attemptquiznow": "Započni test", + "attemptstate": "Stanje", "cannotsubmitquizdueto": "Ovaj pokušaj rešavanja testa ne može da bude predat zbog sledećih razloga:", + "comment": "Komentar", + "completedon": "Završeno dana", + "confirmclose": "Kada predate test nećete više biti u mogućnosti da menjate svoje odgovore.", "confirmcontinueoffline": "Ovaj pokušaj nije sinhronizovan od {{$a}}. Ako ste u međuvremenu ovaj pokušaj nastavili na nekom drugom uređaju, postoji mogućnost da ste izgubili podatke.", "confirmleavequizonerror": "Došlo je do greške prilikom pokušaja da se sačuvaju odgovori. Da li ste sigurni da želite da napustite test?", + "confirmstart": "Test ima vremensko ograničenje ({{$a}}). Vreme će se odbrojavati od momenta početka pokušaja i morate predati svoje odgovore pre nego što istekne. Da li ste sigurni da sada želite da započnete rešavanje testa?", + "confirmstartheader": "Vremenski ograničen test", + "connectionerror": "Mrežna veza je izgubljena. (Automatsko čuvanje nije uspelo).\n\nZapišite sve odgovora unetih na ovoj stranici u poslednjih nekoliko minuta, a zatim pokušajte ponovo da se povežete.\n\nKada se veza ponovo uspostavi vaši odgovori bi trebalo da budu sačuvani a ova poruka će nestati.", + "continueattemptquiz": "Nastavite poslednji pokušaj", + "continuepreview": "Nastavi poslednji pregled", "errorbehaviournotsupported": "Ovaj test ne možete rešavati u aplikaciji zato što ona ne podržava ponašanje pitanja:", "errordownloading": "Greška prilikom preuzimanja neophodnih podataka.", "errorgetattempt": "Greška prilikom preuzimanja podataka o pokušaju rešavanja testa.", @@ -13,10 +26,55 @@ "errorsaveattempt": "Došlo je do greške prilikom snimanja podataka o pokušaju rešavanja testa.", "errorsyncquiz": "Došlo je do greške prilikom sinhronizacije. Molimo, pokušajte ponovo.", "errorsyncquizblocked": "Ovaj test sada ne može biti sinhronizovan zbog drugog procesa koji je trenutno u toku. Molimo, pokušajte ponovo kasnije. Ako i dalje budete imali problema, pokušajte da pokrenete aplikaciju ispočetka.", + "feedback": "Povratne informacije", + "finishattemptdots": "Završi pokušaj...", "finishnotsynced": "Test je završen, ali nije sinhronizovan", + "grade": "Ocena", + "gradeaverage": "Prosečna ocena", + "gradehighest": "Najviša ocena", + "grademethod": "Metod ocenjivanja", + "gradesofar": "{{$a.method}}: {{$a.mygrade}} / {{$a.quizgrade}}.", "hasdatatosync": "Ovaj test ima oflajn podatke koje treba sinhronizovati.", + "marks": "Ocene", + "mustbesubmittedby": "Ovaj pokušaj mora biti predat do {{$a}}.", + "noquestions": "Nijedno pitanje još nije dodato", + "noreviewattempt": "Nije Vam dozvoljeno da pregledate ovaj pokušaj", + "notyetgraded": "Još nije ocenjeno", "opentoc": "Otvori navigacioni meni.", + "outof": "{{$a.grade}} od {{$a.maxgrade}}", + "outofpercent": "{{$a.grade}} od {{$a.maxgrade}}", + "outofshort": "{{$a.grade}}/{{$a.maxgrade}}", + "overallfeedback": "Sveobuhvatne povratne informacije", + "overdue": "Zakasneli", + "overduemustbesubmittedby": "Vreme za ovaj pokušaj rešavanje testa je isteklo. Pokušaj je već trebalo predati. Ako želite da ovaj test bude ocenjen morate ga predati do {{$a}}. Ako to ne uradite do navedenog roka, ocene za ovaj pokušaj se neće računati.", + "preview": "Pregled", + "previewquiznow": "Pregledaj test sada", + "question": "Pitanje", + "quizpassword": "Lozinka testa", + "reattemptquiz": "Ponovni pokušaj rešavanja testa", + "requirepasswordmessage": "Da biste pristupili rešavanju ovog testa morate znati lozinku testa", + "returnattempt": "Povratak na pokušaj", + "review": "Pregled", + "reviewofattempt": "Pregled pokušaja {{$a}}", + "reviewofpreview": "Pregled prikaza", + "showall": "Prikaži sva pitanja na jednoj stranici", + "showeachpage": "Prikaži jednu po jednu stranicu", + "startattempt": "Započni pokušaj rešavanja", + "startedon": "Započeto", + "stateabandoned": "Nikad predato", + "statefinished": "Završeno", + "statefinisheddetails": "Predato {{$a}}", + "stateinprogress": "U toku", + "stateoverdue": "Zakasnela predaja", + "stateoverduedetails": "Mora se predati do {{$a}}", + "status": "Status", + "submitallandfinish": "Predaj sve odgovore i završi test", + "summaryofattempt": "Rezime pokušaja", + "summaryofattempts": "Rezime vaših prethodnih pokušaja", + "timeleft": "Preostalo vreme", + "timetaken": "Utrošeno vreme", "warningattemptfinished": "Oflajn pokušaj je odbačen zato što je ili završen na sajtu ili nije pronađen.", "warningdatadiscarded": "Neki oflajn odgovori su odbačeni zato što su pitanja izmenjena onlajn.", - "warningdatadiscardedfromfinished": "Pokušaj rešavanja testa je nije završen zato što su neki oflajn odgovori odbačeni. Pregledajte svoje odgovore, a zatim ponovo pošaljite svoj pokušaj." + "warningdatadiscardedfromfinished": "Pokušaj rešavanja testa je nije završen zato što su neki oflajn odgovori odbačeni. Pregledajte svoje odgovore, a zatim ponovo pošaljite svoj pokušaj.", + "yourfinalgradeis": "Vaša konačna ocena na ovom testu je {{$a}}." } \ No newline at end of file diff --git a/www/addons/mod/quiz/lang/sv.json b/www/addons/mod/quiz/lang/sv.json index cb771aab8be..f330a8a5999 100644 --- a/www/addons/mod/quiz/lang/sv.json +++ b/www/addons/mod/quiz/lang/sv.json @@ -6,7 +6,7 @@ "attemptstate": "Tillstånd", "comment": "Kommentar", "completedon": "Fullgjord den", - "confirmclose": "Du håller på att avsluta det här försöket. När Du väl har avslutat försöket kommer Du inte längre att kunna ändra Dina svar.", + "confirmclose": "dDu håller på att avsluta det här försöket. När du väl har avslutat försöket kommer du inte längre att kunna ändra dina svar.", "connectionerror": "Nätverksanslutning förlorade (autospara misslyckades).\n\nAnteckna alla svar som angavs på webbplatsen de sista minuterna på papper, försöka sedan att återansluta.\n\nNär anslutningen har återupprättats, bör dina svar sparas och detta meddelande kommer att försvinna.", "continueattemptquiz": "Fortsätt med det senaste försöket", "continuepreview": "Fortsätt med den senaste förhandsgranskningen", diff --git a/www/addons/mod/scorm/lang/eu.json b/www/addons/mod/scorm/lang/eu.json index d6315ef6681..cb26ace868a 100644 --- a/www/addons/mod/scorm/lang/eu.json +++ b/www/addons/mod/scorm/lang/eu.json @@ -20,7 +20,7 @@ "errorpackagefile": "Barkatu, aplikazioak ZIP paketeak besterik ez du onartzen.", "errorsyncscorm": "Errorea gertatu da sinkronizatzean. Mesedez, saiatu berriz.", "exceededmaxattempts": "Gehienezko saiakera-kopurua egin duzu.", - "failed": "Errorea", + "failed": "Gainditu gabea", "firstattempt": "Lehenengo saiakera", "gradeaverage": "Batez besteko kalifikazioa", "gradeforattempt": "Saikerarako kalifikazioa", diff --git a/www/addons/mod/scorm/lang/sr-cr.json b/www/addons/mod/scorm/lang/sr-cr.json index 481c70dc534..e35b5f6a6b6 100644 --- a/www/addons/mod/scorm/lang/sr-cr.json +++ b/www/addons/mod/scorm/lang/sr-cr.json @@ -1,6 +1,16 @@ { + "asset": "Елемент", + "assetlaunched": "Елемент - Прегледано", + "attempts": "Покушаји", + "averageattempt": "Просечни број покушаја", + "browse": "Преглед", + "browsed": "Претражено", + "browsemode": "Режим прегледа", "cannotcalculategrade": "Оцена не може да се израчуна.", + "completed": "Завршено", + "contents": "Садржај", "dataattemptshown": "Ови подаци припадају покушају број {{number}}.", + "enter": "Уђи", "errorcreateofflineattempt": "Дошло је до грешке приликом покушаја креирања новог офлајн покушаја. Молимо, покушајте поново.", "errordownloadscorm": "Грешка приликом преузимања SCORM пакета: \"{{name}}\".", "errorgetscorm": "Грешка приликом преузимања података SCORM пакета.", @@ -9,10 +19,33 @@ "errornovalidsco": "Овај SCORM пакет нема видљив SCO који би био учитан.", "errorpackagefile": "Извините, апликација подржава само ZIP архиве.", "errorsyncscorm": "Дошло је до грешке приликом синхронизације. Молимо, покушајте поново.", + "exceededmaxattempts": "Достигли сте максималан број покушаја", + "failed": "Није успело", + "firstattempt": "Први покушај", + "gradeaverage": "Просечна оцена", + "gradeforattempt": "Оцена за покушај", + "gradehighest": "Највиша оцена", + "grademethod": "Метод оцењивања", + "gradereported": "Извештај о оценама", + "gradescoes": "Објекти за учење", + "gradesum": "Коначна оцена", + "highestattempt": "Најбољи покушај", + "incomplete": "Непотпуно", + "lastattempt": "Последњи завршени покушај", + "mode": "Режим рада", + "newattempt": "Почни нови покушај", + "noattemptsallowed": "Број дозвољених покушаја", + "noattemptsmade": "Број покушаја који сте имали", + "normal": "Нормално", + "notattempted": "Није покушавано", "offlineattemptnote": "Овај покушај има податке који нису синхронизован.", "offlineattemptovermax": "Овај покушај не може бити послат зато што сте премашили максималан број дозвољених покушаја.", + "organizations": "Организације", + "passed": "Положено", + "reviewmode": "Режим прегледа", "scormstatusnotdownloaded": "Овај SCORM пакет није преузет. Биће аутоматски преузет када га отворите.", "scormstatusoutdated": "Овај SCORM пакет је мењан од последњег преузимања. Биће аутоматски преузет када га отворите.", + "suspended": "Суспендовано", "warningofflinedatadeleted": "Неки офлајн подаци о покушају {{number}} су обрисани зато што их није могуће креирати у новом покушају.", "warningsynconlineincomplete": "Неки покушаји нису могли бити синхронизовани са сајтом зато што последњи онлине покушај није завршен. Молимо вас да прво завршите онлајн покушај." } \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/sr-lt.json b/www/addons/mod/scorm/lang/sr-lt.json index 1e0cbfee595..7f75f400c9b 100644 --- a/www/addons/mod/scorm/lang/sr-lt.json +++ b/www/addons/mod/scorm/lang/sr-lt.json @@ -1,6 +1,16 @@ { + "asset": "Element", + "assetlaunched": "Element - Pregledano", + "attempts": "Pokušaji", + "averageattempt": "Prosečni broj pokušaja", + "browse": "Pregled", + "browsed": "Pretraženo", + "browsemode": "Režim pregleda", "cannotcalculategrade": "Ocena ne može da se izračuna.", + "completed": "Završeno", + "contents": "Sadržaj", "dataattemptshown": "Ovi podaci pripadaju pokušaju broj {{number}}.", + "enter": "Uđi", "errorcreateofflineattempt": "Došlo je do greške prilikom pokušaja kreiranja novog oflajn pokušaja. Molimo, pokušajte ponovo.", "errordownloadscorm": "Greška prilikom preuzimanja SCORM paketa: \"{{name}}\".", "errorgetscorm": "Greška prilikom preuzimanja podataka SCORM paketa.", @@ -9,10 +19,33 @@ "errornovalidsco": "Ovaj SCORM paket nema vidljiv SCO koji bi bio učitan.", "errorpackagefile": "Izvinite, aplikacija podržava samo ZIP arhive.", "errorsyncscorm": "Došlo je do greške prilikom sinhronizacije. Molimo, pokušajte ponovo.", + "exceededmaxattempts": "Dostigli ste maksimalan broj pokušaja", + "failed": "Nije uspelo", + "firstattempt": "Prvi pokušaj", + "gradeaverage": "Prosečna ocena", + "gradeforattempt": "Ocena za pokušaj", + "gradehighest": "Najviša ocena", + "grademethod": "Metod ocenjivanja", + "gradereported": "Izveštaj o ocenama", + "gradescoes": "Objekti za učenje", + "gradesum": "Konačna ocena", + "highestattempt": "Najbolji pokušaj", + "incomplete": "Nepotpuno", + "lastattempt": "Poslednji završeni pokušaj", + "mode": "Režim rada", + "newattempt": "Počni novi pokušaj", + "noattemptsallowed": "Broj dozvoljenih pokušaja", + "noattemptsmade": "Broj pokušaja koji ste imali", + "normal": "Normalno", + "notattempted": "Nije pokušavano", "offlineattemptnote": "Ovaj pokušaj ima podatke koji nisu sinhronizovan.", "offlineattemptovermax": "Ovaj pokušaj ne može biti poslat zato što ste premašili maksimalan broj dozvoljenih pokušaja.", + "organizations": "Organizacije", + "passed": "Položeno", + "reviewmode": "Režim prikaza", "scormstatusnotdownloaded": "Ovaj SCORM paket nije preuzet. Biće automatski preuzet kada ga otvorite.", "scormstatusoutdated": "Ovaj SCORM paket je menjan od poslednjeg preuzimanja. Biće automatski preuzet kada ga otvorite.", + "suspended": "Suspendovano", "warningofflinedatadeleted": "Neki oflajn podaci o pokušaju {{number}} su obrisani zato što ih nije moguće kreirati u novom pokušaju.", "warningsynconlineincomplete": "Neki pokušaji nisu mogli biti sinhronizovani sa sajtom zato što poslednji online pokušaj nije završen. Molimo vas da prvo završite onlajn pokušaj." } \ No newline at end of file diff --git a/www/addons/mod/scorm/lang/zh-tw.json b/www/addons/mod/scorm/lang/zh-tw.json index ec476e126b9..c46213ad3fa 100644 --- a/www/addons/mod/scorm/lang/zh-tw.json +++ b/www/addons/mod/scorm/lang/zh-tw.json @@ -21,23 +21,23 @@ "errorsyncscorm": "同步時發生錯誤. 請再試一次.", "exceededmaxattempts": "你已經達到最大的作答次數", "failed": "失敗", - "firstattempt": "第一次使用", + "firstattempt": "第一次作答", "gradeaverage": "平均成績", "gradeforattempt": "作答次的分數", "gradehighest": "最高成績", - "grademethod": "評分方式", + "grademethod": "成績採計方式", "gradereported": "成績報告", "gradescoes": "學習目標", "gradesum": "加總", - "highestattempt": "最高使用次數", + "highestattempt": "最高作答次數", "incomplete": "不完整", "lastattempt": "最後完成的作答次", "mode": "模式", - "newattempt": "開始新的使用", + "newattempt": "開始一個新的作答次", "noattemptsallowed": "允許作答的次數", "noattemptsmade": "你已經作答的次數", "normal": "一般", - "notattempted": "未嘗試", + "notattempted": "尚未作答", "offlineattemptnote": "此嘗試包含尚未同步的資料.", "offlineattemptovermax": "無法發送此嘗試, 因為您超過了最大嘗試次數.", "organizations": "組織", @@ -45,7 +45,7 @@ "reviewmode": "複習模式", "scormstatusnotdownloaded": "此SCORM未下載. 它會在您打開時自動下載.", "scormstatusoutdated": "此SCORM自上次下載以來已被修改. 它會在您打開時自動下載.", - "suspended": "中止", + "suspended": "已休學", "warningofflinedatadeleted": "嘗試{{number}}的某些離線資料已被刪除, 因為無法建立新的嘗試.", "warningsynconlineincomplete": "某些嘗試無法與網站同步, 因為上次上線嘗試未完成, 請先完成上線嘗試." } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/ar.json b/www/addons/mod/survey/lang/ar.json index dd271b759c7..30dd1d2fed3 100644 --- a/www/addons/mod/survey/lang/ar.json +++ b/www/addons/mod/survey/lang/ar.json @@ -2,5 +2,5 @@ "ifoundthat": "وجدت أن", "ipreferthat": "أفضل أن", "responses": "إجابات", - "results": "النتائج" + "results": "نتائج" } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/ja.json b/www/addons/mod/survey/lang/ja.json index 35fbcedcc0d..6e207332222 100644 --- a/www/addons/mod/survey/lang/ja.json +++ b/www/addons/mod/survey/lang/ja.json @@ -4,6 +4,6 @@ "ifoundthat": "私は次のことを発見しました:", "ipreferthat": "私は次のことが好きです:", "responses": "回答", - "results": "結果", + "results": "受験結果", "surveycompletednograph": "あなたはこの調査を完了しました。" } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/pl.json b/www/addons/mod/survey/lang/pl.json index 3b9a9921b72..cc6f6480b61 100644 --- a/www/addons/mod/survey/lang/pl.json +++ b/www/addons/mod/survey/lang/pl.json @@ -2,6 +2,6 @@ "ifoundthat": "Stwierdziłem, że", "ipreferthat": "Wolę to", "responses": "Odpowiedzi", - "results": "Wynik", + "results": "Wyniki", "surveycompletednograph": "Już wypełniłeś tą ankietę." } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/sr-cr.json b/www/addons/mod/survey/lang/sr-cr.json index 81ed8c380d2..b09d2613a67 100644 --- a/www/addons/mod/survey/lang/sr-cr.json +++ b/www/addons/mod/survey/lang/sr-cr.json @@ -1,5 +1,9 @@ { "cannotsubmitsurvey": "Нажалост, било је проблема са предајом вашег упитника. Молим вас, покушајте поново.", "errorgetsurvey": "Грешка приликом преузимања података за 'Упитник' (Survey)", - "results": "Резултати" + "ifoundthat": "Открио/ла сам да", + "ipreferthat": "Преферирам", + "responses": "Одговори", + "results": "Резултати", + "surveycompletednograph": "Испунили сте анкету." } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/sr-lt.json b/www/addons/mod/survey/lang/sr-lt.json index 22342db7d8a..7e1fed7f8d7 100644 --- a/www/addons/mod/survey/lang/sr-lt.json +++ b/www/addons/mod/survey/lang/sr-lt.json @@ -1,5 +1,9 @@ { "cannotsubmitsurvey": "Nažalost, bilo je problema sa predajom vašeg upitnika. Molim vas, pokušajte ponovo.", "errorgetsurvey": "Greška prilikom preuzimanja podataka za 'Upitnik' (Survey)", - "results": "Rezultati" + "ifoundthat": "Otkrio/la sam da", + "ipreferthat": "Preferiram", + "responses": "Odgovori", + "results": "Rezultati", + "surveycompletednograph": "Ispunili ste anketu." } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/tr.json b/www/addons/mod/survey/lang/tr.json index f42edcb4d3f..471798df02c 100644 --- a/www/addons/mod/survey/lang/tr.json +++ b/www/addons/mod/survey/lang/tr.json @@ -2,6 +2,6 @@ "ifoundthat": "Gerçekte olan", "ipreferthat": "İstediğim", "responses": "Yanıtlar", - "results": "Sonuç", + "results": "Sonuçlar", "surveycompletednograph": "Bu anketi tamamladınız." } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/zh-cn.json b/www/addons/mod/survey/lang/zh-cn.json index 912d8caa96b..7ef142e9e7a 100644 --- a/www/addons/mod/survey/lang/zh-cn.json +++ b/www/addons/mod/survey/lang/zh-cn.json @@ -2,5 +2,5 @@ "ifoundthat": "我发现", "ipreferthat": "我希望的是", "responses": "回复", - "results": "投票结果" + "results": "结果" } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/zh-tw.json b/www/addons/mod/survey/lang/zh-tw.json index e6ad7be4230..924e0d4c800 100644 --- a/www/addons/mod/survey/lang/zh-tw.json +++ b/www/addons/mod/survey/lang/zh-tw.json @@ -4,6 +4,6 @@ "ifoundthat": "我發現", "ipreferthat": "我希望的是", "responses": "回應", - "results": "結果", + "results": "票選結果", "surveycompletednograph": "你已經完成這一份問卷。" } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/ar.json b/www/addons/mod/wiki/lang/ar.json index 1bff5b0f91c..794020d3f62 100644 --- a/www/addons/mod/wiki/lang/ar.json +++ b/www/addons/mod/wiki/lang/ar.json @@ -6,7 +6,7 @@ "newpagetitle": "عنواو صفحة جديد", "nocontent": "لا يوجد محتوى في هذه الصفحة", "notingroup": "لا ينتمي إلى مجموعة", - "page": "صفحة", + "page": "صفحة: {{$a}}", "pagename": "اسم الصفحة", "wrongversionlock": "قام مستخدم آخر بتحديث هذه الصفحة بينما كنت أنت تحررها، أصبحت تعديلاتك قديمة." } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/bg.json b/www/addons/mod/wiki/lang/bg.json index dbe95df13e3..cfe93c0370e 100644 --- a/www/addons/mod/wiki/lang/bg.json +++ b/www/addons/mod/wiki/lang/bg.json @@ -4,8 +4,8 @@ "editingpage": "Редактиране на страница \"{{$a}}\"", "map": "Карта", "newpagetitle": "Заглавие на новата страница", - "notingroup": "Извинете, но трябва да сте част от групата за да видите тази дейност.", - "page": "Страница", + "notingroup": "За съжаление Вие трябва да се част от група за да виждате този форум.", + "page": "Страница: {{$a}}", "pagename": "Име на страница", "wrongversionlock": "Друг потребител редактира тази страница докато Вие редактирахте и Вашата редакция вече е остаряла." } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/ca.json b/www/addons/mod/wiki/lang/ca.json index b827bb47066..fb0c7bfab1e 100644 --- a/www/addons/mod/wiki/lang/ca.json +++ b/www/addons/mod/wiki/lang/ca.json @@ -10,7 +10,7 @@ "newpagetitle": "Títol de la pàgina nova", "nocontent": "No hi ha contingut per a aquesta pàgina", "notingroup": "No en grup", - "page": "Pàgina", + "page": "Pàgina: {{$a}}", "pageexists": "Aquesta pàgina ja existeix.", "pagename": "Nom de la pàgina", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/cs.json b/www/addons/mod/wiki/lang/cs.json index 89723ca1da7..052676bb598 100644 --- a/www/addons/mod/wiki/lang/cs.json +++ b/www/addons/mod/wiki/lang/cs.json @@ -10,7 +10,7 @@ "newpagetitle": "Nový název stránky", "nocontent": "Pro tuto stránku není obsah", "notingroup": "Není ve skupině", - "page": "Stránka", + "page": "Stránka: {{$a}}", "pageexists": "Tato stránka již existuje.", "pagename": "Název stránky", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/da.json b/www/addons/mod/wiki/lang/da.json index 9b83d403406..c888f404157 100644 --- a/www/addons/mod/wiki/lang/da.json +++ b/www/addons/mod/wiki/lang/da.json @@ -8,7 +8,7 @@ "newpagetitle": "Ny sidetitel", "nocontent": "Der er intet indhold til denne side", "notingroup": "Ikke i gruppe", - "page": "Side", + "page": "Side: {{$a}}", "pageexists": "Denne side findes allerede.", "pagename": "Sidenavn", "subwiki": "Underwiki", diff --git a/www/addons/mod/wiki/lang/de.json b/www/addons/mod/wiki/lang/de.json index 7bb8187eaff..6fe1fc4dba9 100644 --- a/www/addons/mod/wiki/lang/de.json +++ b/www/addons/mod/wiki/lang/de.json @@ -10,7 +10,7 @@ "newpagetitle": "Titel für neue Seite\n", "nocontent": "Kein Inhalt auf dieser Seite", "notingroup": "Nicht in Gruppen", - "page": "Seite", + "page": "Seite: {{$a}}", "pageexists": "Diese Seite existiert bereits.", "pagename": "Seitenname", "subwiki": "Teilwiki", diff --git a/www/addons/mod/wiki/lang/el.json b/www/addons/mod/wiki/lang/el.json index 801399e1135..8eec41f7ee2 100644 --- a/www/addons/mod/wiki/lang/el.json +++ b/www/addons/mod/wiki/lang/el.json @@ -2,8 +2,8 @@ "errorloadingpage": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση της σελίδας.", "errornowikiavailable": "Αυτό το wiki δεν έχει ακόμα περιεχόμενο.", "gowikihome": "Go Wiki home", - "notingroup": "Συγνώμη, αλλά θα πρέπει να είστε μέλος μιας ομάδας για να δείτε αυτήν τη δραστηριότητα", - "page": "Σελίδα", + "notingroup": "Συγγνώμη, αλλά πρέπει να είστε μέλος ομάδας για να δείτε αυτό την ομάδα συζητήσεων.", + "page": "Σελίδα: {{$a}}", "subwiki": "Subwiki", "titleshouldnotbeempty": "Ο τίτλος δεν πρέπει να είναι κενός", "viewpage": "Δείτε τη σελίδα", diff --git a/www/addons/mod/wiki/lang/es-mx.json b/www/addons/mod/wiki/lang/es-mx.json index cbd65b371f9..5a53592ed79 100644 --- a/www/addons/mod/wiki/lang/es-mx.json +++ b/www/addons/mod/wiki/lang/es-mx.json @@ -10,7 +10,7 @@ "newpagetitle": "Título nuevo de la página", "nocontent": "No hay contenido para esta página", "notingroup": "No está en un grupo", - "page": "Página", + "page": "Página: {{$a}}", "pageexists": "Esta página ya existe.", "pagename": "Nombre de página", "subwiki": "Sub-wiki", diff --git a/www/addons/mod/wiki/lang/es.json b/www/addons/mod/wiki/lang/es.json index b31f110029b..3bbe24f3157 100644 --- a/www/addons/mod/wiki/lang/es.json +++ b/www/addons/mod/wiki/lang/es.json @@ -10,7 +10,7 @@ "newpagetitle": "Título nuevo de la página", "nocontent": "No hay contenido para esta página", "notingroup": "No está en un grupo", - "page": "Página", + "page": "Página: {{$a}}", "pageexists": "Esta página ya existe.", "pagename": "Nombre de la página", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/eu.json b/www/addons/mod/wiki/lang/eu.json index dee4d7b3f1e..f6b07f7639d 100644 --- a/www/addons/mod/wiki/lang/eu.json +++ b/www/addons/mod/wiki/lang/eu.json @@ -10,7 +10,7 @@ "newpagetitle": "Orri berriaren izenburua", "nocontent": "Ez dago edukirik orri honetarako", "notingroup": "Ez dago taldean", - "page": "Orria", + "page": "Orria: {{$a}}", "pageexists": "Orri hau badago dagoeneko.", "pagename": "Orriaren izena", "subwiki": "Azpiwikia", diff --git a/www/addons/mod/wiki/lang/fa.json b/www/addons/mod/wiki/lang/fa.json index 3ea0f81b588..645adbdab85 100644 --- a/www/addons/mod/wiki/lang/fa.json +++ b/www/addons/mod/wiki/lang/fa.json @@ -5,7 +5,7 @@ "newpagetitle": "عنوان صفحهٔ جدید", "nocontent": "محتوایی برای این صفحه وجود ندارد", "notingroup": "بدون گروه", - "page": "صفحه", + "page": "صفحهٔ {{$a}}", "pageexists": "این صفحه در حال حاضر وجود دارد. در حال تغییر مسیر به صفحهٔ موجود.", "viewpage": "مشاهدهٔ صفحه", "wrongversionlock": "هنگامی که شما در حال ویرایش این صفحه بودید، کاربر دیگری آن را ویرایش کرد و محتوایش را تغییر داد." diff --git a/www/addons/mod/wiki/lang/fr.json b/www/addons/mod/wiki/lang/fr.json index 3d4ff31273f..e18eeba1d13 100644 --- a/www/addons/mod/wiki/lang/fr.json +++ b/www/addons/mod/wiki/lang/fr.json @@ -10,7 +10,7 @@ "newpagetitle": "Titre de la nouvelle page", "nocontent": "Cette page n'a pas de contenu", "notingroup": "Pas dans le groupe", - "page": "Page", + "page": "Page : {{$a}}", "pageexists": "Cette page existe déjà.", "pagename": "Nom de page", "subwiki": "Sous-wiki", diff --git a/www/addons/mod/wiki/lang/he.json b/www/addons/mod/wiki/lang/he.json index 46bd85d687c..6d94870a86a 100644 --- a/www/addons/mod/wiki/lang/he.json +++ b/www/addons/mod/wiki/lang/he.json @@ -7,7 +7,7 @@ "newpagetitle": "כותרת דף חדש", "nocontent": "אין תוכן לדף זה", "notingroup": "לא בקבוצה", - "page": "עמוד", + "page": "עמוד: {{$a}}", "pageexists": "הדף כבר קיים. הפנה אליו מחדש.", "pagename": "שם העמוד", "wrongversionlock": "משתמש אחר ערך את הדף הזה בזמן שאת/ה ערכת/ה. התוכן שלך לא ישמר." diff --git a/www/addons/mod/wiki/lang/hu.json b/www/addons/mod/wiki/lang/hu.json index 19b98951ec9..52eb1a43078 100644 --- a/www/addons/mod/wiki/lang/hu.json +++ b/www/addons/mod/wiki/lang/hu.json @@ -7,7 +7,7 @@ "newpagetitle": "Új oldalcím", "nocontent": "Az oldalhoz nincs tartalom", "notingroup": "Nem része a csoportnak", - "page": "Oldal", + "page": "Oldal: {{$a}}", "pageexists": "Az oldal már létezik. Átirányítás az oldalra.", "pagename": "Oldal neve", "wrongversionlock": "A szerkesztés közben egy másik felhasználó szerkesztette ezt az oldalt, így az Ön tartalma elavult." diff --git a/www/addons/mod/wiki/lang/it.json b/www/addons/mod/wiki/lang/it.json index 5acbfeed47e..188539ca68d 100644 --- a/www/addons/mod/wiki/lang/it.json +++ b/www/addons/mod/wiki/lang/it.json @@ -10,7 +10,7 @@ "newpagetitle": "Titolo nuova pagina", "nocontent": "Questa pagina non ha contenuti", "notingroup": "Non è in un gruppo", - "page": "Pagina", + "page": "Pagina: {{$a}}", "pageexists": "La pagina esiste già.", "pagename": "Nome pagina", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/ja.json b/www/addons/mod/wiki/lang/ja.json index 602d4646668..6d79d901d29 100644 --- a/www/addons/mod/wiki/lang/ja.json +++ b/www/addons/mod/wiki/lang/ja.json @@ -10,7 +10,7 @@ "newpagetitle": "新しいページタイトル", "nocontent": "このページにはコンテンツがありません。", "notingroup": "グループ外", - "page": "ページ", + "page": "ページ: {{$a}}", "pageexists": "このページはすでに存在します。", "pagename": "ページ名", "subwiki": "サブwiki", diff --git a/www/addons/mod/wiki/lang/lt.json b/www/addons/mod/wiki/lang/lt.json index 52f7834015f..7523e9211c2 100644 --- a/www/addons/mod/wiki/lang/lt.json +++ b/www/addons/mod/wiki/lang/lt.json @@ -10,7 +10,7 @@ "newpagetitle": "Naujo puslapio pavadinimas", "nocontent": "Nėra šio puslapio turinio", "notingroup": "Nėra grupėje", - "page": "Puslapis", + "page": "Puslapis: {{$a}}", "pageexists": "Šis puslapis jau yra.", "pagename": "Puslapio pavadinimas", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/nl.json b/www/addons/mod/wiki/lang/nl.json index 2d4ec194f27..de4427ee53d 100644 --- a/www/addons/mod/wiki/lang/nl.json +++ b/www/addons/mod/wiki/lang/nl.json @@ -10,7 +10,7 @@ "newpagetitle": "Nieuwe paginatitel", "nocontent": "Er is geen inhoud voor deze pagina", "notingroup": "Niet in groep", - "page": "Pagina", + "page": "Pagina: {{$a}}", "pageexists": "Deze pagina bestaat al.", "pagename": "Paginanaam", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/pl.json b/www/addons/mod/wiki/lang/pl.json index 8515710e26a..391b0fbc350 100644 --- a/www/addons/mod/wiki/lang/pl.json +++ b/www/addons/mod/wiki/lang/pl.json @@ -7,7 +7,7 @@ "newpagetitle": "Tytuł nowej strony", "nocontent": "Brak zawartości dla tej strony", "notingroup": "Nie w grupie", - "page": "Strona", + "page": "Strona: {{$a}}", "pageexists": "Ta strona już istnieje. Przekierowuje do niej.", "pagename": "Nazwa strony", "wrongversionlock": "Inny użytkownik edytował tę stronę w czasie, kiedy ty ją edytowałeś i twoja zawartość jest przestarzała." diff --git a/www/addons/mod/wiki/lang/pt-br.json b/www/addons/mod/wiki/lang/pt-br.json index 6c2036aa656..710e219e39c 100644 --- a/www/addons/mod/wiki/lang/pt-br.json +++ b/www/addons/mod/wiki/lang/pt-br.json @@ -10,7 +10,7 @@ "newpagetitle": "Novo título da página", "nocontent": "Não existe conteúdo para esta página", "notingroup": "Não existe no grupo", - "page": "Página", + "page": "Página: {{$a}}", "pageexists": "Esta página já existe. Redirecionado para ela.", "pagename": "Nome da página", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/pt.json b/www/addons/mod/wiki/lang/pt.json index 83154bc5718..21749d0a238 100644 --- a/www/addons/mod/wiki/lang/pt.json +++ b/www/addons/mod/wiki/lang/pt.json @@ -10,7 +10,7 @@ "newpagetitle": "Novo título da página", "nocontent": "Não há nenhum conteúdo nesta página", "notingroup": "Não está em nenhum grupo", - "page": "Página", + "page": "Página: {{$a}}", "pageexists": "Esta página já existe.", "pagename": "Nome da página", "subwiki": "SubWiki", diff --git a/www/addons/mod/wiki/lang/ro.json b/www/addons/mod/wiki/lang/ro.json index 79fdc396e4f..2b0c326bec6 100644 --- a/www/addons/mod/wiki/lang/ro.json +++ b/www/addons/mod/wiki/lang/ro.json @@ -5,7 +5,7 @@ "newpagehdr": "Pagină nouă", "newpagetitle": "Un nou titlu de pagină", "nocontent": "Nu există conținut pentru această pagină", - "notingroup": "Ne pare rău, dar trebuie să faceţi parte dintr-un grup pentru a putea vizualiza această activitate.", - "page": "Pagină", + "notingroup": "Ne pare rău, pentru a putea vizualiza acest forum trebuie să fiţi membru al unui grup.", + "page": "Pagina {{$a}}", "pagename": "Nume pagină" } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/ru.json b/www/addons/mod/wiki/lang/ru.json index d1aad170e59..efca795f742 100644 --- a/www/addons/mod/wiki/lang/ru.json +++ b/www/addons/mod/wiki/lang/ru.json @@ -9,7 +9,7 @@ "newpagetitle": "Заголовок новой страницы", "nocontent": "Нет содержимого у этой страницы", "notingroup": "Не в группе", - "page": "Страница", + "page": "Страница: {{$a}}", "pageexists": "Такая страница уже существует.", "pagename": "Название страницы", "titleshouldnotbeempty": "Заголовок не должен быть пустым", diff --git a/www/addons/mod/wiki/lang/sr-cr.json b/www/addons/mod/wiki/lang/sr-cr.json index 8a152b69a6d..8213c338216 100644 --- a/www/addons/mod/wiki/lang/sr-cr.json +++ b/www/addons/mod/wiki/lang/sr-cr.json @@ -1,10 +1,21 @@ { + "cannoteditpage": "Не можете да уређујете ову страницу.", + "createpage": "Креирај страницу", + "editingpage": "Уређивање ове странице '{{$a}}'", "errorloadingpage": "Дошло је до грешке приликом учитавања странице.", "errornowikiavailable": "Овај вики још увек нема садржај.", "gowikihome": "Иди на почетну страницу викија", - "page": "Страница", + "map": "Мапа", + "newpagehdr": "Нова страница", + "newpagetitle": "Наслов нове странице", + "nocontent": "На овој страници нема садржаја", + "notingroup": "Није у групи", + "page": "Страница: {{$a}}", + "pageexists": "Ова страница већ постоји.", + "pagename": "Назив странице", "subwiki": "Подвики", "titleshouldnotbeempty": "Наслов не би требало да буде празан", "viewpage": "Погледај страницу", - "wikipage": "Вики страница" + "wikipage": "Вики страница", + "wrongversionlock": "Други корисник је уређивао ову страницу у исто време када и ви. Ваш садржај је застарео." } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/sr-lt.json b/www/addons/mod/wiki/lang/sr-lt.json index e8ced77df30..9b1e7853897 100644 --- a/www/addons/mod/wiki/lang/sr-lt.json +++ b/www/addons/mod/wiki/lang/sr-lt.json @@ -1,10 +1,21 @@ { + "cannoteditpage": "Ne možete da uređujete ovu stranicu.", + "createpage": "Kreiraj stranicu", + "editingpage": "Uređivanje ove stranice '{{$a}}'", "errorloadingpage": "Došlo je do greške prilikom učitavanja stranice.", "errornowikiavailable": "Ovaj viki još uvek nema sadržaj.", "gowikihome": "Idi na početnu stranicu vikija", - "page": "Stranica", + "map": "Mapa", + "newpagehdr": "Nova stranica", + "newpagetitle": "Naslov nove stranice", + "nocontent": "Na ovoj stranici nema sadržaja", + "notingroup": "Nije u grupi", + "page": "Stranica: {{$a}}", + "pageexists": "Ova stranica već postoji.", + "pagename": "Naziv stranice", "subwiki": "Podviki", "titleshouldnotbeempty": "Naslov ne bi trebalo da bude prazan", "viewpage": "Pogledaj stranicu", - "wikipage": "Viki stranica" + "wikipage": "Viki stranica", + "wrongversionlock": "Drugi korisnik je uređivao ovu stranicu u isto vreme kada i vi. Vaš sadržaj je zastareo." } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/sv.json b/www/addons/mod/wiki/lang/sv.json index f9ebf16c762..43bd89b4601 100644 --- a/www/addons/mod/wiki/lang/sv.json +++ b/www/addons/mod/wiki/lang/sv.json @@ -10,7 +10,7 @@ "newpagetitle": "Ny titel på sida", "nocontent": "Det finns inget innehåll för den här sidan", "notingroup": "Inte i grupp", - "page": "Sida", + "page": "Sida: {{$a}}", "pageexists": "Den här sidan finns redan, länkning dit pågår", "pagename": "Namn på sida", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/tr.json b/www/addons/mod/wiki/lang/tr.json index 8ddfdfd95b3..f1167632e26 100644 --- a/www/addons/mod/wiki/lang/tr.json +++ b/www/addons/mod/wiki/lang/tr.json @@ -7,7 +7,7 @@ "newpagetitle": "Yeni sayfa başlığı", "nocontent": "Bu sayfa için içerik yok", "notingroup": "Grupta değil", - "page": "Sayfa", + "page": "Sayfa: {{$a}}", "pageexists": "Bu sayfa zaten var.", "pagename": "Sayfa adı", "wrongversionlock": "Başka bir kullanıcı sizin düzenlemeniz sırasında bu sayfayı düzenledi ve içeriğiniz geçersiz." diff --git a/www/addons/mod/wiki/lang/uk.json b/www/addons/mod/wiki/lang/uk.json index cd89e56c9cc..7e2a88dd8db 100644 --- a/www/addons/mod/wiki/lang/uk.json +++ b/www/addons/mod/wiki/lang/uk.json @@ -10,7 +10,7 @@ "newpagetitle": "Заголовок нової сторінки", "nocontent": "Немає контенту для цієї сторінки", "notingroup": "Не в групі", - "page": "Сторінка", + "page": "Сторінка: {{$a}}", "pageexists": "Ця сторінка вже існує. Перенаправити до неї.", "pagename": "Назва сторінки", "subwiki": "Субвікі", diff --git a/www/addons/mod/wiki/lang/zh-cn.json b/www/addons/mod/wiki/lang/zh-cn.json index 1eb2563a117..28e5c1b23ad 100644 --- a/www/addons/mod/wiki/lang/zh-cn.json +++ b/www/addons/mod/wiki/lang/zh-cn.json @@ -7,7 +7,7 @@ "newpagetitle": "新页面标题", "nocontent": "此页面无内容", "notingroup": "不在小组内", - "page": "页", + "page": "页面", "pageexists": "页面已存在。重定向到它", "pagename": "页码", "wrongversionlock": "在您正编辑此页面时,另一个人已经做了编辑,所以您的修改已过时。" diff --git a/www/addons/mod/wiki/lang/zh-tw.json b/www/addons/mod/wiki/lang/zh-tw.json index 14abc591524..30fd50ff0d8 100644 --- a/www/addons/mod/wiki/lang/zh-tw.json +++ b/www/addons/mod/wiki/lang/zh-tw.json @@ -10,7 +10,7 @@ "newpagetitle": "新頁面標題", "nocontent": "在這一頁裡沒有內容", "notingroup": "不在群體", - "page": "分頁", + "page": "頁", "pageexists": "這頁面已經存在。", "pagename": "頁面名稱", "subwiki": "Subwiki", diff --git a/www/addons/myoverview/lang/ca.json b/www/addons/myoverview/lang/ca.json index 6f57cd536b3..7d74942e12e 100644 --- a/www/addons/myoverview/lang/ca.json +++ b/www/addons/myoverview/lang/ca.json @@ -1,5 +1,18 @@ { - "inprogress": "En curs", - "nocourses": "No hi ha informació de cursos per mostrar.", - "pluginname": "Nom del connector de repositori" + "future": "Futurs", + "inprogress": "En progrés", + "morecourses": "Més cursos", + "next30days": "Propers 30 dies", + "next7days": "Propers 7 dies", + "nocourses": "Cap curs", + "nocoursesfuture": "Cap curs futur", + "nocoursesinprogress": "Cap curs en progrés", + "nocoursespast": "Cap curs passat", + "noevents": "Cap activitat venç properament", + "past": "Passats", + "pluginname": "Resum del curs", + "recentlyoverdue": "Vençuda recentment", + "sortbycourses": "Ordena per cursos", + "sortbydates": "Ordena per dates", + "timeline": "Línia de temps" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/da.json b/www/addons/myoverview/lang/da.json index 6b0e076a3e8..93f96452658 100644 --- a/www/addons/myoverview/lang/da.json +++ b/www/addons/myoverview/lang/da.json @@ -1,5 +1,17 @@ { - "inprogress": "Igangværende", - "nocourses": "Du er ikke tilmeldt nogen kurser.", - "pluginname": "Navn på filarkiv-plugin" + "future": "Fremtidige", + "inprogress": "I gang", + "morecourses": "Flere kurser", + "next30days": "Næste 30 dage", + "next7days": "Næste 7 dage", + "nocourses": "Ingen kurser", + "nocoursesfuture": "Ingen fremtidige kurser", + "nocoursesinprogress": "Ingen igangværende kurser", + "nocoursespast": "Ingen tidligere kurser", + "noevents": "Ingen forestående aktiviteter", + "past": "Tidligere", + "pluginname": "Kursusoversigt", + "sortbycourses": "Sorter efter kurser", + "sortbydates": "Sorter efter dato", + "timeline": "Tidslinje" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/de.json b/www/addons/myoverview/lang/de.json index 5eeb1d65140..48617009585 100644 --- a/www/addons/myoverview/lang/de.json +++ b/www/addons/myoverview/lang/de.json @@ -14,5 +14,5 @@ "recentlyoverdue": "Kürzlich überfällig", "sortbycourses": "Nach Kurs sortieren", "sortbydates": "Nach Datum sortieren", - "timeline": "Timeline" + "timeline": "Zeitleiste" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/es.json b/www/addons/myoverview/lang/es.json index b796e0b88b4..44a7a41e6f1 100644 --- a/www/addons/myoverview/lang/es.json +++ b/www/addons/myoverview/lang/es.json @@ -1,5 +1,5 @@ { - "future": "Futuro", + "future": "Futuros", "inprogress": "En progreso", "morecourses": "Más cursos", "next30days": "Próximos 30 días", @@ -9,7 +9,7 @@ "nocoursesinprogress": "Sin cursos en progreso", "nocoursespast": "Sin cursos pasados", "noevents": "No hay actividades próximas pendientes", - "past": "Pasado", + "past": "Pasados", "pluginname": "Vista general de curso", "recentlyoverdue": "Recientemente vencidas", "sortbycourses": "Ordenar por curso", diff --git a/www/addons/myoverview/lang/eu.json b/www/addons/myoverview/lang/eu.json index 63ad1570d13..75bf1d67080 100644 --- a/www/addons/myoverview/lang/eu.json +++ b/www/addons/myoverview/lang/eu.json @@ -6,13 +6,13 @@ "next7days": "Datozen 7 egunetan", "nocourses": "Ez dago ikastarorik", "nocoursesfuture": "Ez dago ikastarorik etorkizunean", - "nocoursesinprogress": "", + "nocoursesinprogress": "Ez dago martxan dagoen ikastarorik", "nocoursespast": "Ez dago ikastarorik iraganean", - "noevents": "", + "noevents": "Ez dago jardueren muga-egunik laster", "past": "Iragana", - "pluginname": "", - "recentlyoverdue": "", + "pluginname": "Ikuspegi orokorra", + "recentlyoverdue": "Orain dela gutxi iragotako muga-egunak", "sortbycourses": "Ordenatu ikastaroen arabera", "sortbydates": "Ordenatu dataren arabera", - "timeline": "" + "timeline": "Kronologia" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/fr.json b/www/addons/myoverview/lang/fr.json index 266d636a4b5..2a74ad739d4 100644 --- a/www/addons/myoverview/lang/fr.json +++ b/www/addons/myoverview/lang/fr.json @@ -10,7 +10,7 @@ "nocoursespast": "Pas de cours dans le passé", "noevents": "Aucune activité", "past": "Passé", - "pluginname": "Vue d'ensemble du cours", + "pluginname": "Vue d'ensemble des cours", "recentlyoverdue": "Récemment en retard", "sortbycourses": "Tri par cours", "sortbydates": "Tri par date", diff --git a/www/addons/myoverview/lang/he.json b/www/addons/myoverview/lang/he.json index 2c8bcae7be2..d0b13672129 100644 --- a/www/addons/myoverview/lang/he.json +++ b/www/addons/myoverview/lang/he.json @@ -1,7 +1,7 @@ { "future": "עתידי", "inprogress": "בלמידה", - "morecourses": "", + "morecourses": "קורסים נוספים", "next30days": "ב 30 הימים הבאים", "next7days": "ב 7 הימים הבאים", "nocourses": "טרם נרשמתם לקורס כלשהו", @@ -10,7 +10,7 @@ "nocoursespast": "אינכם רשומים לקורס אשר הסתיימו", "noevents": "לא קיימות פעילויות עתידיות להן מועד הגשה", "past": "עבר", - "pluginname": "עדכונים בקורסים שלי", + "pluginname": "סקירה כללית", "recentlyoverdue": "מועד־ההגשה עבר, לאחרונה", "sortbycourses": "מיון לפי שמות קורסים", "sortbydates": "מיון לפי תאריכים", diff --git a/www/addons/myoverview/lang/it.json b/www/addons/myoverview/lang/it.json index 3e157ff6e5c..cca29fb3c13 100644 --- a/www/addons/myoverview/lang/it.json +++ b/www/addons/myoverview/lang/it.json @@ -1,17 +1,17 @@ { - "future": "", - "inprogress": "", - "morecourses": "", - "next30days": "", - "next7days": "", + "future": "Prossimi", + "inprogress": "In svolgimento", + "morecourses": "Altri corsi", + "next30days": "Prossimi 30 giorni", + "next7days": "Prossimi 7 giorni", "nocourses": "Non ci sono corsi", - "nocoursesfuture": "", + "nocoursesfuture": "Non ci sono corsi di prossima attivazione", "nocoursesinprogress": "Non ci sono corsi in svolgimento", - "nocoursespast": "", + "nocoursespast": "Non ci sono corsi conclusi", "noevents": "Non ci sono attività da svolgere", - "past": "", + "past": "Conclusi", "pluginname": "Panoramica corsi", - "recentlyoverdue": "", + "recentlyoverdue": "Scadute di recente", "sortbycourses": "Ordina per corso", "sortbydates": "Ordina per data", "timeline": "Cronologia" diff --git a/www/addons/myoverview/lang/ja.json b/www/addons/myoverview/lang/ja.json index 3671d43e7ee..af5dc09b17a 100644 --- a/www/addons/myoverview/lang/ja.json +++ b/www/addons/myoverview/lang/ja.json @@ -1,11 +1,11 @@ { - "future": "今後", + "future": "未来", "inprogress": "進行中", "morecourses": "コースをさらに", "next30days": "次の30日", "next7days": "次の7日", "nocourses": "コースなし", - "nocoursesfuture": "今後のコースはありません。", + "nocoursesfuture": "未来のコースはありません。", "nocoursesinprogress": "進行中のコースはありません。", "nocoursespast": "過去のコースはありません。", "noevents": "到来する活動期限はありません。", diff --git a/www/addons/myoverview/lang/lt.json b/www/addons/myoverview/lang/lt.json index cba79f81ce3..c7d17b3aea6 100644 --- a/www/addons/myoverview/lang/lt.json +++ b/www/addons/myoverview/lang/lt.json @@ -1,5 +1,18 @@ { - "inprogress": "Nebaigta", - "nocourses": "Nėra rodytinos kursų informacijos", - "pluginname": "Saugyklos priedo pavadinimas" + "future": "Būsimi", + "inprogress": "Vykstantys", + "morecourses": "Daugiau kursų", + "next30days": "Kitas 30 dienų", + "next7days": "Kitas 7 dienas", + "nocourses": "Nėra kursų", + "nocoursesfuture": "Nėra būsimų kursų", + "nocoursesinprogress": "Nėra vykstančių kursų", + "nocoursespast": "Nėra pasibaigusių kursų", + "noevents": "Nėra numatytų artėjančių veiklų", + "past": "Pasibaigę", + "pluginname": "Kursų apžvalga", + "recentlyoverdue": "Neseniai pavėluotas", + "sortbycourses": "Rūšiuoti pagal kursus", + "sortbydates": "Rūšiuoti pagal datą", + "timeline": "Laiko skalė" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/pl.json b/www/addons/myoverview/lang/pl.json index 08052becbb2..26323a8f098 100644 --- a/www/addons/myoverview/lang/pl.json +++ b/www/addons/myoverview/lang/pl.json @@ -1,5 +1,18 @@ { - "inprogress": "W toku", - "nocourses": "Nie ma informacji do pokazania", - "pluginname": "Nazwa wtyczki repozytorium" + "future": "Nadchodzące", + "inprogress": "Aktualne", + "morecourses": "Więcej kursów", + "next30days": "Następne 30 dni", + "next7days": "Następne 7 dni", + "nocourses": "Brak kursów", + "nocoursesfuture": "Brak nadchodzących kursów", + "nocoursesinprogress": "Brak aktualnych kursów", + "nocoursespast": "Brak zakończonych kursów", + "noevents": "Brak nadchodzących terminów zadań", + "past": "Zakończone", + "pluginname": "Przegląd kursu", + "recentlyoverdue": "Obecnie opóźnione", + "sortbycourses": "Sortuj wg kursów", + "sortbydates": "Sortuj wg dat", + "timeline": "Porządek chronologiczny" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/pt-br.json b/www/addons/myoverview/lang/pt-br.json index c02df1adb37..f768881904f 100644 --- a/www/addons/myoverview/lang/pt-br.json +++ b/www/addons/myoverview/lang/pt-br.json @@ -1,5 +1,18 @@ { + "future": "Não iniciados", "inprogress": "Em andamento", - "nocourses": "Nenhuma informação disponível sobre o curso.", - "pluginname": "Nome do plugin de repositório" + "morecourses": "Mais cursos", + "next30days": "Próximos 30 dias", + "next7days": "Próximos 7 dias", + "nocourses": "Não há cursos", + "nocoursesfuture": "Não há cursos não iniciados", + "nocoursesinprogress": "Não há cursos em andamento", + "nocoursespast": "Não há cursos encerrados", + "noevents": "Não há atividades pendentes", + "past": "Encerrados", + "pluginname": "Resumo dos cursos", + "recentlyoverdue": "Atividades atrasadas", + "sortbycourses": "Ordenar por cursos", + "sortbydates": "Ordenar por data", + "timeline": "Linha do tempo" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/pt.json b/www/addons/myoverview/lang/pt.json index b019a3830aa..1c084d2e2f3 100644 --- a/www/addons/myoverview/lang/pt.json +++ b/www/addons/myoverview/lang/pt.json @@ -1,5 +1,18 @@ { + "future": "Futuro", "inprogress": "Em progresso", - "nocourses": "Sem informação das suas disciplinas para mostrar.", - "pluginname": "Nome do módulo de repositório" + "morecourses": "Mais disciplinas", + "next30days": "Próximos 30 dias", + "next7days": "Próximos 7 dias", + "nocourses": "Sem disciplinas", + "nocoursesfuture": "Nenhuma disciplina a começar", + "nocoursesinprogress": "Nenhuma disciplina a decorrer", + "nocoursespast": "Nenhuma disciplina terminada", + "noevents": "Nenhuma atividade programada", + "past": "Passado", + "pluginname": "Vista geral", + "recentlyoverdue": "Terminadas recentemente", + "sortbycourses": "Ordenar por disciplinas", + "sortbydates": "Ordenar por datas", + "timeline": "Cronograma" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/ru.json b/www/addons/myoverview/lang/ru.json index fbfa8f8a870..1a29c7d620b 100644 --- a/www/addons/myoverview/lang/ru.json +++ b/www/addons/myoverview/lang/ru.json @@ -1,5 +1,18 @@ { + "future": "Будущие", "inprogress": "В процессе", - "nocourses": "Нет информации для отображения.", - "pluginname": "Имя плагина хранилища" + "morecourses": "Больше курсов", + "next30days": "Следующие 30 дней", + "next7days": "Следующие 7 дней", + "nocourses": "Нет курсов", + "nocoursesfuture": "Нет будущих курсов", + "nocoursesinprogress": "Нет курсов в процессе", + "nocoursespast": "Нет прошлых курсов", + "noevents": "Нет предстоящих заданий", + "past": "Прошлые", + "pluginname": "Обзор курсов", + "recentlyoverdue": "Недавно пропущенное", + "sortbycourses": "Сортировать по курсам", + "sortbydates": "Сортировать по датам", + "timeline": "Обзор" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/sr-cr.json b/www/addons/myoverview/lang/sr-cr.json new file mode 100644 index 00000000000..218f9ebde77 --- /dev/null +++ b/www/addons/myoverview/lang/sr-cr.json @@ -0,0 +1,18 @@ +{ + "future": "Будући", + "inprogress": "У току", + "morecourses": "Више курсева", + "next30days": "Следећих 30 дана", + "next7days": "Следећих 7 дана", + "nocourses": "Нема курсева", + "nocoursesfuture": "Нема будућих курсева", + "nocoursesinprogress": "Нема курсева који су току", + "nocoursespast": "Нема прошлих курсева", + "noevents": "Нема активности које се ускоро завршавају", + "past": "Прошли", + "pluginname": "Преглед курсева", + "recentlyoverdue": "Недавно завршене активности", + "sortbycourses": "Сортирај по курсевима", + "sortbydates": "Сортирају по датумима", + "timeline": "Временски распоред" +} \ No newline at end of file diff --git a/www/addons/myoverview/lang/sr-lt.json b/www/addons/myoverview/lang/sr-lt.json new file mode 100644 index 00000000000..953d764faa8 --- /dev/null +++ b/www/addons/myoverview/lang/sr-lt.json @@ -0,0 +1,18 @@ +{ + "future": "Budući", + "inprogress": "U toku", + "morecourses": "Više kurseva", + "next30days": "Sledećih 30 dana", + "next7days": "Sledećih 7 dana", + "nocourses": "Nema kurseva", + "nocoursesfuture": "Nema budućih kurseva", + "nocoursesinprogress": "Nema kurseva koji su toku", + "nocoursespast": "Nema prošlih kurseva", + "noevents": "Nema aktivnosti koje se uskoro završavaju", + "past": "Prošli", + "pluginname": "Pregled kurseva", + "recentlyoverdue": "Nedavno završene aktivnosti", + "sortbycourses": "Sortiraj po kursevima", + "sortbydates": "Sortiraju po datumima", + "timeline": "Vremenski raspored" +} \ No newline at end of file diff --git a/www/addons/myoverview/lang/sv.json b/www/addons/myoverview/lang/sv.json index 977e7631d0d..004122c5c20 100644 --- a/www/addons/myoverview/lang/sv.json +++ b/www/addons/myoverview/lang/sv.json @@ -1,5 +1,16 @@ { - "inprogress": "Pågår", - "nocourses": "Det finns ingen kursinformation att visa.", - "pluginname": "Namn på plugin-program för arkiv" + "future": "Kommande", + "inprogress": "Pågående", + "morecourses": "Fler kurser", + "next30days": "30 dagar framåt", + "next7days": "7 dagar framåt", + "nocourses": "Inga kurser", + "nocoursesfuture": "Inga kommande kurser", + "nocoursesinprogress": "Inga pågående kurser", + "nocoursespast": "Inga tidigare kurser", + "past": "Tidigare", + "pluginname": "Kursöversikt", + "sortbycourses": "Sortera efter kurser", + "sortbydates": "Sortera efter datum", + "timeline": "Tidslinje" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/uk.json b/www/addons/myoverview/lang/uk.json new file mode 100644 index 00000000000..1b4fb0f4e46 --- /dev/null +++ b/www/addons/myoverview/lang/uk.json @@ -0,0 +1,18 @@ +{ + "future": "Заплановані", + "inprogress": "В процесі", + "morecourses": "Більше курсів", + "next30days": "Наступні 30 днів", + "next7days": "Наступні 7 днів", + "nocourses": "Курси відсутні", + "nocoursesfuture": "Немає запланових курсів", + "nocoursesinprogress": "Курси в прогресі відсутні", + "nocoursespast": "Пройдені курси відсутні", + "noevents": "Наразі, заплановані активності відсутні", + "past": "Минулі", + "pluginname": "Огляд курсу", + "recentlyoverdue": "Нещодавно прострочені", + "sortbycourses": "Сортувати за назвою курсів", + "sortbydates": "Сортувати за датою", + "timeline": "Часова пряма" +} \ No newline at end of file diff --git a/www/addons/myoverview/lang/zh-cn.json b/www/addons/myoverview/lang/zh-cn.json index ce98820d486..0694737081f 100644 --- a/www/addons/myoverview/lang/zh-cn.json +++ b/www/addons/myoverview/lang/zh-cn.json @@ -1,5 +1,18 @@ { - "inprogress": "处理中", - "nocourses": "没有可显示的课程信息。", - "pluginname": "容器插件名" + "future": "未来", + "inprogress": "进行中", + "morecourses": "更多课程", + "next30days": "下一月", + "next7days": "下一周", + "nocourses": "没有课程", + "nocoursesfuture": "没有未来的课程", + "nocoursesinprogress": "没有进行中的课程", + "nocoursespast": "没有过去的课程", + "noevents": "没有即将到期的活动", + "past": "过去", + "pluginname": "课程概览", + "recentlyoverdue": "最近逾期的", + "sortbycourses": "按课程排序", + "sortbydates": "按日期排序", + "timeline": "时间进度" } \ No newline at end of file diff --git a/www/addons/myoverview/lang/zh-tw.json b/www/addons/myoverview/lang/zh-tw.json index 18cfa0860fc..16d60ff4766 100644 --- a/www/addons/myoverview/lang/zh-tw.json +++ b/www/addons/myoverview/lang/zh-tw.json @@ -11,7 +11,7 @@ "noevents": "沒有即將到期的活動", "past": "過去", "pluginname": "課程概觀", - "recentlyoverdue": "", + "recentlyoverdue": "最近逾期的", "sortbycourses": "依課程排序", "sortbydates": "依日期排序", "timeline": "時間軸" diff --git a/www/addons/notes/lang/ar.json b/www/addons/notes/lang/ar.json index 30b58e0c705..df8de0cf069 100644 --- a/www/addons/notes/lang/ar.json +++ b/www/addons/notes/lang/ar.json @@ -2,7 +2,7 @@ "addnewnote": "إضافة ملاحظة جديدة", "coursenotes": "ملاحظات المقرر الدراسي", "note": "ملحوظة", - "notes": "ملاحظات", + "notes": "تحليلك وملاحظاتك الخاصة", "personalnotes": "ملاحظات شخصية", "publishstate": "السياق", "sitenotes": "ملاحظات الموقع" diff --git a/www/addons/notes/lang/bg.json b/www/addons/notes/lang/bg.json index 606e3b6a09d..89cc6664d9d 100644 --- a/www/addons/notes/lang/bg.json +++ b/www/addons/notes/lang/bg.json @@ -4,7 +4,7 @@ "eventnotecreated": "Бележката създадена", "nonotes": "Все още няма бележки от този тип.", "note": "Бележка", - "notes": "Бележки", + "notes": "Вашият личен анализ и бележки", "personalnotes": "Лични бележки", "publishstate": "Контекст", "sitenotes": "Бележки за сайта" diff --git a/www/addons/notes/lang/ca.json b/www/addons/notes/lang/ca.json index 1c044e61b29..9367384a78e 100644 --- a/www/addons/notes/lang/ca.json +++ b/www/addons/notes/lang/ca.json @@ -4,7 +4,7 @@ "eventnotecreated": "S'ha creat la nota", "nonotes": "Encara no hi ha notes d'aquest tipus", "note": "Anotació", - "notes": "Anotacions", + "notes": "El teu anàlisi privat i les teves notes", "personalnotes": "Anotacions personals", "publishstate": "Context", "sitenotes": "Anotacions del lloc", diff --git a/www/addons/notes/lang/cs.json b/www/addons/notes/lang/cs.json index fd3b1a46f42..984816ff5e7 100644 --- a/www/addons/notes/lang/cs.json +++ b/www/addons/notes/lang/cs.json @@ -4,7 +4,7 @@ "eventnotecreated": "Poznámka vytvořena", "nonotes": "Doposud neexistují žádné poznámky tohoto typu", "note": "Poznámka", - "notes": "Poznámky", + "notes": "Vaše soukromé postřehy a poznámky", "personalnotes": "Osobní poznámky", "publishstate": "Kontext", "sitenotes": "Poznámky stránek", diff --git a/www/addons/notes/lang/da.json b/www/addons/notes/lang/da.json index 3dadb18f0eb..cf35362b164 100644 --- a/www/addons/notes/lang/da.json +++ b/www/addons/notes/lang/da.json @@ -4,7 +4,7 @@ "eventnotecreated": "Note oprettet", "nonotes": "Der er endnu ingen noter af denne type", "note": "Note", - "notes": "Noter", + "notes": "Dine private kommentarer og noter", "personalnotes": "Personlige noter", "publishstate": "Sammenhæng", "sitenotes": "Webstedsnoter", diff --git a/www/addons/notes/lang/de.json b/www/addons/notes/lang/de.json index b4ed60eb088..06d550d7211 100644 --- a/www/addons/notes/lang/de.json +++ b/www/addons/notes/lang/de.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anmerkung angelegt", "nonotes": "Keine Anmerkungen", "note": "Anmerkung", - "notes": "Anmerkungen", + "notes": "Ihre persönliche Analyse und Anmerkungen", "personalnotes": "Meine Anmerkungen", "publishstate": "Kontext", "sitenotes": "Anmerkungen zur Website", diff --git a/www/addons/notes/lang/el.json b/www/addons/notes/lang/el.json index e796b19cabe..9bc5d02d49e 100644 --- a/www/addons/notes/lang/el.json +++ b/www/addons/notes/lang/el.json @@ -4,7 +4,7 @@ "eventnotecreated": "Το σημείωμα δημιουργήθηκε", "nonotes": "Δεν υπάρχουν σημειώσεις αυτού του τύπου ακόμα", "note": "Σημείωση", - "notes": "Σημειώσεις", + "notes": "Οι προσωπικές σας αναλύσεις και σημειώσεις", "personalnotes": "Προσωπικές σημειώσεις", "publishstate": "Γενικό πλαίσιο", "sitenotes": "Σημειώσεις της ιστοσελίδας", diff --git a/www/addons/notes/lang/es-mx.json b/www/addons/notes/lang/es-mx.json index aabd17d948f..1c91ea47373 100644 --- a/www/addons/notes/lang/es-mx.json +++ b/www/addons/notes/lang/es-mx.json @@ -4,7 +4,7 @@ "eventnotecreated": "Nota creada", "nonotes": "Todavía no hay notas de este tipo todavía", "note": "Nota", - "notes": "Notas", + "notes": "Su análisis privado y sus notas", "personalnotes": "Notas personales", "publishstate": "Contexto", "sitenotes": "Notas del sitio", diff --git a/www/addons/notes/lang/eu.json b/www/addons/notes/lang/eu.json index f8935fec248..8656c9594fd 100644 --- a/www/addons/notes/lang/eu.json +++ b/www/addons/notes/lang/eu.json @@ -4,7 +4,7 @@ "eventnotecreated": "Oharra gehituta", "nonotes": "Oraindik ez dago mota honetako oharrik.", "note": "Oharra", - "notes": "Oharrak", + "notes": "Zure analisi pribatua eta oharrak", "personalnotes": "Ohar pertsonalak", "publishstate": "Testuingurua", "sitenotes": "Guneko oharrak", diff --git a/www/addons/notes/lang/fr.json b/www/addons/notes/lang/fr.json index 21d624c4af2..346f886976d 100644 --- a/www/addons/notes/lang/fr.json +++ b/www/addons/notes/lang/fr.json @@ -4,7 +4,7 @@ "eventnotecreated": "Annotation créée", "nonotes": "Il n'y a pas encore d'annotation de ce type", "note": "Annotation", - "notes": "Annotations", + "notes": "Votre analyse et vos remarques personnelles", "personalnotes": "Annotations personnelles", "publishstate": "Contexte", "sitenotes": "Annotations du site", diff --git a/www/addons/notes/lang/he.json b/www/addons/notes/lang/he.json index 416427b2dec..2e3c5dd9644 100644 --- a/www/addons/notes/lang/he.json +++ b/www/addons/notes/lang/he.json @@ -4,7 +4,7 @@ "eventnotecreated": "הערה נוצרה", "nonotes": "עדיין לא קיימות הערות מסוג זה", "note": "הערה", - "notes": "הערות", + "notes": "ההערות והניתוח הפרטיים שלך.", "personalnotes": "הערות אישיות", "publishstate": "תוכן", "sitenotes": "הערות אתר", diff --git a/www/addons/notes/lang/it.json b/www/addons/notes/lang/it.json index 0e9b001f16c..90c300a1f85 100644 --- a/www/addons/notes/lang/it.json +++ b/www/addons/notes/lang/it.json @@ -4,7 +4,7 @@ "eventnotecreated": "Creata annotazione", "nonotes": "Non sono presenti annotazioni di questo tipo.", "note": "Annotazione", - "notes": "Annotazioni", + "notes": "Le tue note e analisi", "personalnotes": "Annotazioni personali", "publishstate": "Contesto", "sitenotes": "Annotazioni del sito", diff --git a/www/addons/notes/lang/ja.json b/www/addons/notes/lang/ja.json index 6b3304c8067..ae48a7ac252 100644 --- a/www/addons/notes/lang/ja.json +++ b/www/addons/notes/lang/ja.json @@ -4,7 +4,7 @@ "eventnotecreated": "作成したノート", "nonotes": "このタイプのノートはまだ存在しません", "note": "ノート", - "notes": "ノート", + "notes": "あなたの個人分析およびノート", "personalnotes": "パーソナルノート", "publishstate": "コンテキスト", "sitenotes": "サイトノート", diff --git a/www/addons/notes/lang/lt.json b/www/addons/notes/lang/lt.json index ac321d27d1b..e9213ee0c0e 100644 --- a/www/addons/notes/lang/lt.json +++ b/www/addons/notes/lang/lt.json @@ -4,7 +4,7 @@ "eventnotecreated": "Užrašas sukurtas", "nonotes": "Nėra jokių šios temos užrašų", "note": "Užrašas", - "notes": "Užrašai", + "notes": "Pastabos", "personalnotes": "Asmeniniai užrašai", "publishstate": "Teksto ištrauka", "sitenotes": "Svetainės užrašai", diff --git a/www/addons/notes/lang/nl.json b/www/addons/notes/lang/nl.json index 49a0c0209c4..64e66285bed 100644 --- a/www/addons/notes/lang/nl.json +++ b/www/addons/notes/lang/nl.json @@ -4,7 +4,7 @@ "eventnotecreated": "Notitie gemaakt", "nonotes": "Er zijn nog geen notities van dit type.", "note": "Notitie", - "notes": "Notities", + "notes": "Je persoonlijke analyse en aantekeningen", "personalnotes": "Persoonlijke notities", "publishstate": "Context", "sitenotes": "Site notities", diff --git a/www/addons/notes/lang/pt-br.json b/www/addons/notes/lang/pt-br.json index ce6908d1d3e..5634bc70e89 100644 --- a/www/addons/notes/lang/pt-br.json +++ b/www/addons/notes/lang/pt-br.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anotação criada", "nonotes": "Não há mais anotações desse típo", "note": "Anotação", - "notes": "Anotações", + "notes": "Suas análises e anotações pessoais", "personalnotes": "Anotações pessoais", "publishstate": "Contexto", "sitenotes": "Anotações do site", diff --git a/www/addons/notes/lang/pt.json b/www/addons/notes/lang/pt.json index 28e62fa379b..5763cbe46e1 100644 --- a/www/addons/notes/lang/pt.json +++ b/www/addons/notes/lang/pt.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anotação criada", "nonotes": "Ainda não existem anotações deste tipo", "note": "Anotação", - "notes": "Anotações", + "notes": "Análise privada e anotações", "personalnotes": "Anotações pessoais", "publishstate": "Contexto", "sitenotes": "Anotações do site", diff --git a/www/addons/notes/lang/ro.json b/www/addons/notes/lang/ro.json index 605a02f2299..1115becc8d5 100644 --- a/www/addons/notes/lang/ro.json +++ b/www/addons/notes/lang/ro.json @@ -4,7 +4,7 @@ "eventnotecreated": "A fost creată o notă", "nonotes": "Momentan nu există note de acest tip", "note": "Notă", - "notes": "Note", + "notes": "Analiza şi notele tale particulare", "personalnotes": "Note personale", "publishstate": "Context", "sitenotes": "Note de site", diff --git a/www/addons/notes/lang/ru.json b/www/addons/notes/lang/ru.json index ce3b230d19d..5b45804576d 100644 --- a/www/addons/notes/lang/ru.json +++ b/www/addons/notes/lang/ru.json @@ -4,7 +4,7 @@ "eventnotecreated": "Заметка создана", "nonotes": "Тут нет заметок такого типа", "note": "Заметка", - "notes": "Заметки", + "notes": "Ваши анализы и заметки", "personalnotes": "Личные заметки", "publishstate": "Контекст", "sitenotes": "Заметки сайта", diff --git a/www/addons/notes/lang/sr-cr.json b/www/addons/notes/lang/sr-cr.json index 0690900c3c5..afe5cd9b24d 100644 --- a/www/addons/notes/lang/sr-cr.json +++ b/www/addons/notes/lang/sr-cr.json @@ -4,7 +4,7 @@ "eventnotecreated": "Белешка креирана", "nonotes": "Још не постоје белешке овог типа", "note": "Белешка", - "notes": "Белешке", + "notes": "Ваше приватне анализе и белешке", "personalnotes": "Личне белешке", "publishstate": "Контекст", "sitenotes": "Белешке сајта", diff --git a/www/addons/notes/lang/sr-lt.json b/www/addons/notes/lang/sr-lt.json index d4a1ef87e7f..11b505f9b4b 100644 --- a/www/addons/notes/lang/sr-lt.json +++ b/www/addons/notes/lang/sr-lt.json @@ -4,7 +4,7 @@ "eventnotecreated": "Beleška kreirana", "nonotes": "Još ne postoje beleške ovog tipa", "note": "Beleška", - "notes": "Beleške", + "notes": "Vaše privatne analize i beleške", "personalnotes": "Lične beleške", "publishstate": "Kontekst", "sitenotes": "Beleške sajta", diff --git a/www/addons/notes/lang/sv.json b/www/addons/notes/lang/sv.json index 8fcd87edc6d..75049c59549 100644 --- a/www/addons/notes/lang/sv.json +++ b/www/addons/notes/lang/sv.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anteckning skapade", "nonotes": "Det finns inga anteckningar av denna typ ännu", "note": "Anteckning", - "notes": "Anteckningar", + "notes": "Din privata analys och anteckningar", "personalnotes": "Personliga anteckningar", "publishstate": "Sammanhang", "sitenotes": "Webbplats anteckningar", diff --git a/www/addons/notes/lang/uk.json b/www/addons/notes/lang/uk.json index 8c815080c16..9c2ba1ac6bb 100644 --- a/www/addons/notes/lang/uk.json +++ b/www/addons/notes/lang/uk.json @@ -4,7 +4,7 @@ "eventnotecreated": "Записка створена", "nonotes": "Наразі немає записок такого типу", "note": "Записка", - "notes": "Записки", + "notes": "Ваш особистий аналіз і нотатки", "personalnotes": "Персональні записки", "publishstate": "Контекст", "sitenotes": "Записки сайту", diff --git a/www/addons/notes/lang/zh-tw.json b/www/addons/notes/lang/zh-tw.json index 6671dca17e8..2f1fd0f1429 100644 --- a/www/addons/notes/lang/zh-tw.json +++ b/www/addons/notes/lang/zh-tw.json @@ -4,7 +4,7 @@ "eventnotecreated": "註記已被建立", "nonotes": "還沒有這種類型的註記", "note": "註記", - "notes": "註記", + "notes": "您個人的分析和筆記", "personalnotes": "個人註記", "publishstate": "上下文", "sitenotes": "網站註記", diff --git a/www/addons/notifications/lang/ar.json b/www/addons/notifications/lang/ar.json index edbc8f11446..cab5daac101 100644 --- a/www/addons/notifications/lang/ar.json +++ b/www/addons/notifications/lang/ar.json @@ -1,5 +1,5 @@ { "errorgetnotifications": "خطأ في الحصول على الإشعارات", - "notifications": "الإشعارات", + "notifications": "إشعارات", "therearentnotificationsyet": "لا توجد إشعارات" } \ No newline at end of file diff --git a/www/addons/notifications/lang/ca.json b/www/addons/notifications/lang/ca.json index 324cd60ecdb..077c0e53ffd 100644 --- a/www/addons/notifications/lang/ca.json +++ b/www/addons/notifications/lang/ca.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "S'ha produït un error carregant les notificacions", - "notificationpreferences": "Preferències de notificació", + "notificationpreferences": "Preferències de les notificacions", "notifications": "Notificacions", "playsound": "Reprodueix el so", "therearentnotificationsyet": "No hi ha notificacions" diff --git a/www/addons/notifications/lang/cs.json b/www/addons/notifications/lang/cs.json index b6fcbaa749e..7e1d1531bb2 100644 --- a/www/addons/notifications/lang/cs.json +++ b/www/addons/notifications/lang/cs.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Chyba při načítání oznámení.", "notificationpreferences": "Nastavení oznámení", - "notifications": "Oznámení", + "notifications": "Informace", "playsound": "Přehrát zvuk", "therearentnotificationsyet": "Nejsou žádná sdělení" } \ No newline at end of file diff --git a/www/addons/notifications/lang/da.json b/www/addons/notifications/lang/da.json index 56219f0789c..2e190040f35 100644 --- a/www/addons/notifications/lang/da.json +++ b/www/addons/notifications/lang/da.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Fejl ved hentning af underretninger", "notificationpreferences": "Indstillinger for underretninger", - "notifications": "Underretninger", + "notifications": "Beskeder", "therearentnotificationsyet": "Der er ingen underretninger" } \ No newline at end of file diff --git a/www/addons/notifications/lang/de.json b/www/addons/notifications/lang/de.json index b89ba1477d5..115925c10ca 100644 --- a/www/addons/notifications/lang/de.json +++ b/www/addons/notifications/lang/de.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Fehler beim Laden der Mitteilungen", "notificationpreferences": "Systemmitteilungen", - "notifications": "Systemmitteilungen", + "notifications": "Mitteilungen", "playsound": "Sound abspielen", "therearentnotificationsyet": "Keine Mitteilungen" } \ No newline at end of file diff --git a/www/addons/notifications/lang/es-mx.json b/www/addons/notifications/lang/es-mx.json index 238d8cfaa15..1049b40c7a5 100644 --- a/www/addons/notifications/lang/es-mx.json +++ b/www/addons/notifications/lang/es-mx.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Error al obtener notificaciones", "notificationpreferences": "Preferencias de notificación", - "notifications": "Notificaciones", + "notifications": "Avisos", "playsound": "Reproducir sonido", "therearentnotificationsyet": "No hay notificaciones" } \ No newline at end of file diff --git a/www/addons/notifications/lang/es.json b/www/addons/notifications/lang/es.json index db11ade05af..1049b40c7a5 100644 --- a/www/addons/notifications/lang/es.json +++ b/www/addons/notifications/lang/es.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Error al obtener notificaciones", - "notificationpreferences": "Preferencias de notificaciones", - "notifications": "Notificaciones", + "notificationpreferences": "Preferencias de notificación", + "notifications": "Avisos", "playsound": "Reproducir sonido", "therearentnotificationsyet": "No hay notificaciones" } \ No newline at end of file diff --git a/www/addons/notifications/lang/eu.json b/www/addons/notifications/lang/eu.json index 256b8e1fe3e..2363a8e19af 100644 --- a/www/addons/notifications/lang/eu.json +++ b/www/addons/notifications/lang/eu.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Errorea jakinarazpenak jasotzean", - "notificationpreferences": "Jakinarazpen hobespenak", + "notificationpreferences": "Jakinarazpenen hobespenak", "notifications": "Jakinarazpenak", "playsound": "Erreproduzitu soinua", "therearentnotificationsyet": "Ez dago jakinarazpenik" diff --git a/www/addons/notifications/lang/fa.json b/www/addons/notifications/lang/fa.json index dcfecb86fba..f641bf74805 100644 --- a/www/addons/notifications/lang/fa.json +++ b/www/addons/notifications/lang/fa.json @@ -1,5 +1,5 @@ { "notificationpreferences": "ترجیحات اطلاعیه‌ها", - "notifications": "هشدارها", + "notifications": "تذکرات", "therearentnotificationsyet": "هیچ هشداری وجود ندارد" } \ No newline at end of file diff --git a/www/addons/notifications/lang/he.json b/www/addons/notifications/lang/he.json index 1c1591b94ed..39e5a6ed7a5 100644 --- a/www/addons/notifications/lang/he.json +++ b/www/addons/notifications/lang/he.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "שגיאה בטעינת התראות", "notificationpreferences": "העדפות הודעות", - "notifications": "התראות", + "notifications": "עדכונים והודעות", "therearentnotificationsyet": "אין התראות" } \ No newline at end of file diff --git a/www/addons/notifications/lang/ja.json b/www/addons/notifications/lang/ja.json index 22daa00358e..8c6ea812ddf 100644 --- a/www/addons/notifications/lang/ja.json +++ b/www/addons/notifications/lang/ja.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "通知の取得中にエラーが発生しました。", - "notificationpreferences": "通知の設定", + "notificationpreferences": "通知プリファレンス", "notifications": "通知", "playsound": "音を出力", "therearentnotificationsyet": "通知はありません" diff --git a/www/addons/notifications/lang/lt.json b/www/addons/notifications/lang/lt.json index 965ea666726..9487770171a 100644 --- a/www/addons/notifications/lang/lt.json +++ b/www/addons/notifications/lang/lt.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Klaida gaunant pranešimus", - "notificationpreferences": "Pranešimų nustatymai", + "notificationpreferences": "Pranešimų nuostatos", "notifications": "Pranešimai", "therearentnotificationsyet": "Nėra jokių pranešimų" } \ No newline at end of file diff --git a/www/addons/notifications/lang/nl.json b/www/addons/notifications/lang/nl.json index c884b7364ea..1f96952c939 100644 --- a/www/addons/notifications/lang/nl.json +++ b/www/addons/notifications/lang/nl.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Fout bij het ophalen van notificaties", - "notificationpreferences": "Notificatievoorkeuren", + "notificationpreferences": "Meldingen voorkeuren", "notifications": "Meldingen", "playsound": "Speel geluid", "therearentnotificationsyet": "Er zijn geen meldingen" diff --git a/www/addons/notifications/lang/pt-br.json b/www/addons/notifications/lang/pt-br.json index 33e2586486c..46bf5f98e68 100644 --- a/www/addons/notifications/lang/pt-br.json +++ b/www/addons/notifications/lang/pt-br.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Erro ao receber notificações", - "notificationpreferences": "Preferência de notificações", - "notifications": "Notificação", + "notificationpreferences": "Preferências de notificação", + "notifications": "Avisos", "therearentnotificationsyet": "Não há notificações" } \ No newline at end of file diff --git a/www/addons/notifications/lang/sv.json b/www/addons/notifications/lang/sv.json index 2aa4e69322a..ce4f0ccc515 100644 --- a/www/addons/notifications/lang/sv.json +++ b/www/addons/notifications/lang/sv.json @@ -1,5 +1,6 @@ { "errorgetnotifications": "Fel att få meddelanden", - "notifications": "Meddelanden", + "notificationpreferences": "Välj inställningar för notiser", + "notifications": "Administration", "therearentnotificationsyet": "Det finns inga meddelanden" } \ No newline at end of file diff --git a/www/addons/notifications/lang/uk.json b/www/addons/notifications/lang/uk.json index c3d124173af..791d1338ac3 100644 --- a/www/addons/notifications/lang/uk.json +++ b/www/addons/notifications/lang/uk.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Помилка отримання сповіщень", "notificationpreferences": "Налаштування сповіщень", - "notifications": "Сповіщення", + "notifications": "Повідомлення", "playsound": "Грати звук", "therearentnotificationsyet": "Немає сповіщень" } \ No newline at end of file diff --git a/www/addons/notifications/lang/zh-cn.json b/www/addons/notifications/lang/zh-cn.json index 7d236d7f15d..3afb489f861 100644 --- a/www/addons/notifications/lang/zh-cn.json +++ b/www/addons/notifications/lang/zh-cn.json @@ -1,4 +1,4 @@ { - "notifications": "通知", + "notifications": "通告", "therearentnotificationsyet": "没有通知" } \ No newline at end of file diff --git a/www/addons/notifications/lang/zh-tw.json b/www/addons/notifications/lang/zh-tw.json index f885ca29ff4..92e6514797c 100644 --- a/www/addons/notifications/lang/zh-tw.json +++ b/www/addons/notifications/lang/zh-tw.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "取得通知資料發生錯誤", - "notificationpreferences": "通知偏好設定", + "notificationpreferences": "通知的偏好", "notifications": "通知", "therearentnotificationsyet": "沒有通知訊息" } \ No newline at end of file diff --git a/www/addons/participants/lang/ar.json b/www/addons/participants/lang/ar.json index 8c013f870e2..91db007489d 100644 --- a/www/addons/participants/lang/ar.json +++ b/www/addons/participants/lang/ar.json @@ -1,4 +1,4 @@ { "noparticipants": "لم يتم العثور على مشاركين في هذا المقرر الدراسي", - "participants": "المشاركين" + "participants": "المشتركون" } \ No newline at end of file diff --git a/www/addons/participants/lang/ca.json b/www/addons/participants/lang/ca.json index 3c6638a3af7..8fd771b0c76 100644 --- a/www/addons/participants/lang/ca.json +++ b/www/addons/participants/lang/ca.json @@ -1,4 +1,4 @@ { - "noparticipants": "No s'han trobat participants per aquest curs", + "noparticipants": "No s'ha trobat cap participant en aquest curs", "participants": "Participants" } \ No newline at end of file diff --git a/www/addons/participants/lang/cs.json b/www/addons/participants/lang/cs.json index 2092b03a730..311ee521366 100644 --- a/www/addons/participants/lang/cs.json +++ b/www/addons/participants/lang/cs.json @@ -1,4 +1,4 @@ { - "noparticipants": "Pro tento kurz nenalezeni účastníci", - "participants": "Účastníci" + "noparticipants": "Pro tento kurz nenalezen žádný účastník", + "participants": "Přispěvatelé" } \ No newline at end of file diff --git a/www/addons/participants/lang/da.json b/www/addons/participants/lang/da.json index 69f209799f8..28829f714a6 100644 --- a/www/addons/participants/lang/da.json +++ b/www/addons/participants/lang/da.json @@ -1,4 +1,4 @@ { - "noparticipants": "Ingen deltagere fundet på dette kursus", + "noparticipants": "Ingen deltagere fundet.", "participants": "Deltagere" } \ No newline at end of file diff --git a/www/addons/participants/lang/de.json b/www/addons/participants/lang/de.json index 95a259f09bd..343c2a2709e 100644 --- a/www/addons/participants/lang/de.json +++ b/www/addons/participants/lang/de.json @@ -1,4 +1,4 @@ { - "noparticipants": "Keine Personen für diesen Kurs gefunden", - "participants": "Personen" + "noparticipants": "Keine Teilnehmer/innen für diesen Kurs gefunden", + "participants": "Teilnehmer/innen" } \ No newline at end of file diff --git a/www/addons/participants/lang/el.json b/www/addons/participants/lang/el.json index 846f209c0b0..e1a786afbb1 100644 --- a/www/addons/participants/lang/el.json +++ b/www/addons/participants/lang/el.json @@ -1,4 +1,4 @@ { - "noparticipants": "Δεν βρέθηκαν συμμετέχοντες σε αυτό το μάθημα", + "noparticipants": "Δε βρέθηκαν συμμετέχονες γι' αυτό το μάθημα", "participants": "Συμμετέχοντες" } \ No newline at end of file diff --git a/www/addons/participants/lang/es-mx.json b/www/addons/participants/lang/es-mx.json index 56f80358ad5..62113ad2ef9 100644 --- a/www/addons/participants/lang/es-mx.json +++ b/www/addons/participants/lang/es-mx.json @@ -1,4 +1,4 @@ { - "noparticipants": "No se encontraron participantes para este curso", + "noparticipants": "No se encontraron participantes en este curso", "participants": "Participantes" } \ No newline at end of file diff --git a/www/addons/participants/lang/es.json b/www/addons/participants/lang/es.json index c64b8bf86b4..62113ad2ef9 100644 --- a/www/addons/participants/lang/es.json +++ b/www/addons/participants/lang/es.json @@ -1,4 +1,4 @@ { - "noparticipants": "No se han encontrado participantes en este curso", + "noparticipants": "No se encontraron participantes en este curso", "participants": "Participantes" } \ No newline at end of file diff --git a/www/addons/participants/lang/eu.json b/www/addons/participants/lang/eu.json index b716ea85dad..0a84454d0c0 100644 --- a/www/addons/participants/lang/eu.json +++ b/www/addons/participants/lang/eu.json @@ -1,4 +1,4 @@ { - "noparticipants": "Ez da parte-hartzailerik aurkitu ikastaro honetan", + "noparticipants": "Ez da partaiderik aurkitu ikastaro honetarako", "participants": "Partaideak" } \ No newline at end of file diff --git a/www/addons/participants/lang/fa.json b/www/addons/participants/lang/fa.json index 34112f687d7..90d51eaa038 100644 --- a/www/addons/participants/lang/fa.json +++ b/www/addons/participants/lang/fa.json @@ -1,4 +1,4 @@ { - "noparticipants": "این درس شرکت‌کننده‌ای ندارد", + "noparticipants": "هیچ شرکت‌کننده‌ای پیدا نشد.", "participants": "شرکت کنندگان" } \ No newline at end of file diff --git a/www/addons/participants/lang/fr.json b/www/addons/participants/lang/fr.json index fc97610a609..0a75ac6f8c8 100644 --- a/www/addons/participants/lang/fr.json +++ b/www/addons/participants/lang/fr.json @@ -1,4 +1,4 @@ { - "noparticipants": "Aucun participant trouvé dans ce cours", + "noparticipants": "Aucun participant trouvé", "participants": "Participants" } \ No newline at end of file diff --git a/www/addons/participants/lang/he.json b/www/addons/participants/lang/he.json index 669a9a80dfd..5c487a42ed3 100644 --- a/www/addons/participants/lang/he.json +++ b/www/addons/participants/lang/he.json @@ -1,4 +1,4 @@ { - "noparticipants": "לא נמצאו משתתפים עבור קורס זה", + "noparticipants": "טרם צורפו משתתפים.", "participants": "משתתפים" } \ No newline at end of file diff --git a/www/addons/participants/lang/hu.json b/www/addons/participants/lang/hu.json index 929c510a598..f1cb5cf7cf6 100644 --- a/www/addons/participants/lang/hu.json +++ b/www/addons/participants/lang/hu.json @@ -1,4 +1,4 @@ { - "noparticipants": "A kurzushoz nincsenek résztvevők!", + "noparticipants": "Nincs résztvevő.", "participants": "Résztvevők" } \ No newline at end of file diff --git a/www/addons/participants/lang/it.json b/www/addons/participants/lang/it.json index 0d16202be57..21d39dce004 100644 --- a/www/addons/participants/lang/it.json +++ b/www/addons/participants/lang/it.json @@ -1,4 +1,4 @@ { - "noparticipants": "In questo corso non sono stati trovati partecipanti", - "participants": "Partecipanti" + "noparticipants": "Non sono stati trovati partecipanti.", + "participants": "Sono autorizzati ad inserire record" } \ No newline at end of file diff --git a/www/addons/participants/lang/ja.json b/www/addons/participants/lang/ja.json index 3656df9f659..8fbbcbb3976 100644 --- a/www/addons/participants/lang/ja.json +++ b/www/addons/participants/lang/ja.json @@ -1,4 +1,4 @@ { - "noparticipants": "このコースには参加者がいません。", + "noparticipants": "このコースには参加者が登録されていません。", "participants": "参加者" } \ No newline at end of file diff --git a/www/addons/participants/lang/lt.json b/www/addons/participants/lang/lt.json index b675a2848f1..714a8ffda94 100644 --- a/www/addons/participants/lang/lt.json +++ b/www/addons/participants/lang/lt.json @@ -1,4 +1,4 @@ { - "noparticipants": "Dalyvaujančių šiuose kursuose nėra", + "noparticipants": "Nerasta šių kursų dalyvių", "participants": "Dalyviai" } \ No newline at end of file diff --git a/www/addons/participants/lang/nl.json b/www/addons/participants/lang/nl.json index 2beef686f18..33b07998414 100644 --- a/www/addons/participants/lang/nl.json +++ b/www/addons/participants/lang/nl.json @@ -1,4 +1,4 @@ { - "noparticipants": "Geen deelnemers gevonden in deze cursus", + "noparticipants": "Geen gebruikers gevonden in deze cursus", "participants": "Deelnemers" } \ No newline at end of file diff --git a/www/addons/participants/lang/pl.json b/www/addons/participants/lang/pl.json index 5025bf740ec..adceacdf5a7 100644 --- a/www/addons/participants/lang/pl.json +++ b/www/addons/participants/lang/pl.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nie znaleziono uczestników w tym kursie", + "noparticipants": "Nie znaleziono uczestników.", "participants": "Uczestnicy" } \ No newline at end of file diff --git a/www/addons/participants/lang/pt-br.json b/www/addons/participants/lang/pt-br.json index 792fea1d8fd..e54b7e5dc2c 100644 --- a/www/addons/participants/lang/pt-br.json +++ b/www/addons/participants/lang/pt-br.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nenhum dos participantes encontrados para este curso", + "noparticipants": "Nenhum participante encontrado para este curso", "participants": "Participantes" } \ No newline at end of file diff --git a/www/addons/participants/lang/pt.json b/www/addons/participants/lang/pt.json index e7a2e39536f..5fa07c6b1a2 100644 --- a/www/addons/participants/lang/pt.json +++ b/www/addons/participants/lang/pt.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nenhum participante encontrado nesta disciplina", - "participants": "Participantes" + "noparticipants": "Não foram encontrados participantes para esta disciplina", + "participants": "Utilizadores" } \ No newline at end of file diff --git a/www/addons/participants/lang/ro.json b/www/addons/participants/lang/ro.json index 57abb945354..0c2fa9e2bad 100644 --- a/www/addons/participants/lang/ro.json +++ b/www/addons/participants/lang/ro.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nu au fost găsiți participanți la acest curs.", - "participants": "Participanți" + "noparticipants": "Nu există participanți la acest curs", + "participants": "Participanţi" } \ No newline at end of file diff --git a/www/addons/participants/lang/ru.json b/www/addons/participants/lang/ru.json index 590333bcb2f..bcfa292346e 100644 --- a/www/addons/participants/lang/ru.json +++ b/www/addons/participants/lang/ru.json @@ -1,4 +1,4 @@ { - "noparticipants": "Не найдены участники для этого курса.", + "noparticipants": "Участники не найдены.", "participants": "Участники" } \ No newline at end of file diff --git a/www/addons/participants/lang/sr-cr.json b/www/addons/participants/lang/sr-cr.json index 5c5170c3c41..2c8a28575f0 100644 --- a/www/addons/participants/lang/sr-cr.json +++ b/www/addons/participants/lang/sr-cr.json @@ -1,4 +1,4 @@ { - "noparticipants": "Ниједан учесник није пронађен на овом курсу.", + "noparticipants": "Није пронађен ни један учесник на овом курсу", "participants": "Учесници" } \ No newline at end of file diff --git a/www/addons/participants/lang/sr-lt.json b/www/addons/participants/lang/sr-lt.json index 090378abb39..eba071633fd 100644 --- a/www/addons/participants/lang/sr-lt.json +++ b/www/addons/participants/lang/sr-lt.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nijedan učesnik nije pronađen na ovom kursu.", + "noparticipants": "Nije pronađen ni jedan učesnik na ovom kursu", "participants": "Učesnici" } \ No newline at end of file diff --git a/www/addons/participants/lang/sv.json b/www/addons/participants/lang/sv.json index ab7780c8f28..27833cf5412 100644 --- a/www/addons/participants/lang/sv.json +++ b/www/addons/participants/lang/sv.json @@ -1,4 +1,4 @@ { - "noparticipants": "Inga deltagare hittades för kursen", + "noparticipants": "Inga deltagare hittades för denna kurs", "participants": "Deltagare" } \ No newline at end of file diff --git a/www/addons/participants/lang/tr.json b/www/addons/participants/lang/tr.json index 05e3c834e4a..9532bf04f39 100644 --- a/www/addons/participants/lang/tr.json +++ b/www/addons/participants/lang/tr.json @@ -1,4 +1,4 @@ { - "noparticipants": "Bu derste hiç katılımcı bulunamadı", + "noparticipants": "Bu ders için hiç katılımcı bulunamadı", "participants": "Katılımcılar" } \ No newline at end of file diff --git a/www/addons/participants/lang/uk.json b/www/addons/participants/lang/uk.json index 2a8bcb3747e..9a3ebc4a3b3 100644 --- a/www/addons/participants/lang/uk.json +++ b/www/addons/participants/lang/uk.json @@ -1,4 +1,4 @@ { - "noparticipants": "Учасників не знайдено за цим курсом", + "noparticipants": "Не знайдені учасники для цього курсу", "participants": "Учасники" } \ No newline at end of file diff --git a/www/addons/participants/lang/zh-cn.json b/www/addons/participants/lang/zh-cn.json index f2ce4c8e36a..8c621b3fa17 100644 --- a/www/addons/participants/lang/zh-cn.json +++ b/www/addons/participants/lang/zh-cn.json @@ -1,4 +1,4 @@ { "noparticipants": "未找到此项课程的参与者", - "participants": "课程参与者" + "participants": "成员" } \ No newline at end of file diff --git a/www/addons/participants/lang/zh-tw.json b/www/addons/participants/lang/zh-tw.json index f2aba39a343..69584ab153f 100644 --- a/www/addons/participants/lang/zh-tw.json +++ b/www/addons/participants/lang/zh-tw.json @@ -1,4 +1,4 @@ { - "noparticipants": "這個課程沒有參與者", - "participants": "參與者" + "noparticipants": "這一課程找不到參與者", + "participants": "成員" } \ No newline at end of file diff --git a/www/core/components/course/lang/ar.json b/www/core/components/course/lang/ar.json index ab7fafab59b..47a7f04e4bb 100644 --- a/www/core/components/course/lang/ar.json +++ b/www/core/components/course/lang/ar.json @@ -1,8 +1,8 @@ { "allsections": "كل الأقسام", - "contents": "المحتويات", + "contents": "محتويات", "couldnotloadsections": "لم يتم تحميل كل الأقسام، من فضلك حاول مرة أخرى لاحقاَ", "errordownloadingsection": "خطأ عن تنزيل الأقسام", "hiddenfromstudents": "مخفي عن الطلاب", - "showall": "عرض الكل" + "showall": "عرض الكل {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/bg.json b/www/core/components/course/lang/bg.json index 370471981b9..56a7382e3aa 100644 --- a/www/core/components/course/lang/bg.json +++ b/www/core/components/course/lang/bg.json @@ -5,5 +5,5 @@ "couldnotloadsections": "Неуспех при зареждането на секциите, моля опитайте отново.", "hiddenfromstudents": "Скрит от ученици", "nocontentavailable": "В момента няма достъпно съдържание.", - "showall": "Показване на всичко" + "showall": "Показване на всичките {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/ca.json b/www/core/components/course/lang/ca.json index 4d5f44fc1cc..fb53f90a1eb 100644 --- a/www/core/components/course/lang/ca.json +++ b/www/core/components/course/lang/ca.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Ocult per a l'estudiantat", "nocontentavailable": "No hi ha contingut disponible en aquest moment.", "overriddennotice": "La vostra qualificació final en aquesta activitat s'ha modificat manualment.", - "showall": "Mostra-ho tot", + "showall": "Mostra'ls tots ({{$a}})", "useactivityonbrowser": "Tot i així, podeu fer-la servir al navegador del dispositiu." } \ No newline at end of file diff --git a/www/core/components/course/lang/cs.json b/www/core/components/course/lang/cs.json index e8cac178795..6de4fc23e30 100644 --- a/www/core/components/course/lang/cs.json +++ b/www/core/components/course/lang/cs.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Skryté před studenty", "nocontentavailable": "V tuto chvíli není k dispozici žádný obsah.", "overriddennotice": "Vaše výsledná známka za tuto činnost byla ručně upravena.", - "showall": "Zobrazit vše", + "showall": "Ukázat všechny {{$a}}", "useactivityonbrowser": "Můžete i nadále používat jej pomocí prohlížeče zařízení." } \ No newline at end of file diff --git a/www/core/components/course/lang/da.json b/www/core/components/course/lang/da.json index 9242ee4ca2d..2d70a448b4f 100644 --- a/www/core/components/course/lang/da.json +++ b/www/core/components/course/lang/da.json @@ -9,5 +9,5 @@ "hiddenfromstudents": "Skjult for studerende", "nocontentavailable": "Intet indhold tilgængeligt lige nu.", "overriddennotice": "Din endelige karakter fra denne aktivitet blev justeret manuelt.", - "showall": "Vis alt" + "showall": "Vis alle {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/de.json b/www/core/components/course/lang/de.json index 16ab12b9912..ef581d50890 100644 --- a/www/core/components/course/lang/de.json +++ b/www/core/components/course/lang/de.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Für Teilnehmer/innen verborgen", "nocontentavailable": "Momentan sind keine Inhalte verfügbar", "overriddennotice": "Die endgültige Bewertung zu dieser Aktivität wurde manuell bearbeitet.", - "showall": "Alles anzeigen", + "showall": "Alle {{$a}} anzeigen", "useactivityonbrowser": "Sie können dafür weiterhin den normalen Browser verwenden." } \ No newline at end of file diff --git a/www/core/components/course/lang/el.json b/www/core/components/course/lang/el.json index ee4ca9da68c..abc9558d36b 100644 --- a/www/core/components/course/lang/el.json +++ b/www/core/components/course/lang/el.json @@ -17,5 +17,5 @@ "hiddenfromstudents": "Κρυμμένο από τους σπουδαστές", "nocontentavailable": "Δεν υπάρχει περιεχόμενο διαθέσιμο αυτή τη στιγμή.", "overriddennotice": "Ο τελικός βαθμός από αυτή τη δραστηριότητα ρυθμίστηκε χειροκίνητα.", - "showall": "Προβολή όλων" + "showall": "Προβολή όλων {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/es-mx.json b/www/core/components/course/lang/es-mx.json index 1745ce4e20a..225893e56e3 100644 --- a/www/core/components/course/lang/es-mx.json +++ b/www/core/components/course/lang/es-mx.json @@ -9,7 +9,7 @@ "confirmdownload": "Usted está a punto de descargar {{size}}. ¿Está Usted seguro de querer continuar?", "confirmdownloadunknownsize": "No pudimos calcular el tamaño de la descarga. ¿Está Usted seguro de querer descargarla?", "confirmpartialdownloadsize": "Usted está a punto de descargar al menos {{size}}. ¿Está Usted seguro de querer continuar?", - "contents": "Contenidos", + "contents": "Contenido", "couldnotloadsectioncontent": "No pudo cargarse el contenido de la sección; por favor inténtelo nuevamente después.", "couldnotloadsections": "No pudieron cargarse las secciones; por favor inténtelo nuevamente después.", "errordownloadingsection": "Error al descargar sección", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Oculto de estudiantes", "nocontentavailable": "Sin contenido disponible al momento.", "overriddennotice": "La calificación final de esta actividad ha sido ajustada manualmente.", - "showall": "Mostrar todo", + "showall": "Mostrar {{$a}}", "useactivityonbrowser": "Usted todavía puede usarla si usa su navegador del dispositivo." } \ No newline at end of file diff --git a/www/core/components/course/lang/es.json b/www/core/components/course/lang/es.json index f674129afed..b17f87a0442 100644 --- a/www/core/components/course/lang/es.json +++ b/www/core/components/course/lang/es.json @@ -9,14 +9,14 @@ "confirmdownload": "Está a punto de descargar {{size}}. ¿Está seguro de que desea continuar?", "confirmdownloadunknownsize": "No se puede calcular el tamaño de la descarga. ¿Está seguro que quiere descargarlo?", "confirmpartialdownloadsize": "Está a punto de descargar al menos {{size}}. ¿Está seguro de querer continuar?", - "contents": "Contenidos", + "contents": "Contenido", "couldnotloadsectioncontent": "No se ha podido cargar el contenido de la sección, por favor inténtelo más tarde.", "couldnotloadsections": "No se ha podido cargar las secciones, por favor inténtelo más tarde.", "errordownloadingsection": "Error durante la descarga de la sección.", "errorgetmodule": "Se ha producido un error recuperando los datos del módulo.", - "hiddenfromstudents": "Oculto de estudiantes", + "hiddenfromstudents": "No mostrado a los estudiantes", "nocontentavailable": "No hay contenido disponible en este momento.", "overriddennotice": "La calificación final de esta actividad ha sido ajustada manualmente.", - "showall": "Mostrar todo", + "showall": "Mostrar {{$a}}", "useactivityonbrowser": "Puede acceder a esta actividad mediante el navegador de su dispositivo." } \ No newline at end of file diff --git a/www/core/components/course/lang/eu.json b/www/core/components/course/lang/eu.json index c42572550ec..5c01bf83579 100644 --- a/www/core/components/course/lang/eu.json +++ b/www/core/components/course/lang/eu.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Ezkutuan ikasleentzat", "nocontentavailable": "Ez dago edukirik eskuragarri momentu honetan.", "overriddennotice": "Jarduera honetako zure azken kalifikazioa eskuz egokitu da.", - "showall": "Erakutsi denak", + "showall": "Erakutsi denak: {{$a}}", "useactivityonbrowser": "Zure gailuko nabigatzailea erabilita erabili dezakezu." } \ No newline at end of file diff --git a/www/core/components/course/lang/fa.json b/www/core/components/course/lang/fa.json index cb91088f8e6..5000e3146db 100644 --- a/www/core/components/course/lang/fa.json +++ b/www/core/components/course/lang/fa.json @@ -5,10 +5,10 @@ "confirmdownload": "شما در آستانهٔ دریافت {{size}} هستید. آیا مطمئنید که می‌خواهید ادامه دهید؟", "confirmdownloadunknownsize": "ما نتوانستیم حجم دریافت را محاسبه کنیم. آیا مطمئنید که می‌خواهید ادامه دهید؟", "confirmpartialdownloadsize": "شما در آستانهٔ دریافت حداقل {{size}} هستید. آیا مطمئنید که می‌خواهید ادامه دهید؟", - "contents": "محتواها", + "contents": "محتویات", "couldnotloadsectioncontent": "محتوای قسمت نتوانست بارگیری شود. لطفا بعدا دوباره تلاش کنید.", "couldnotloadsections": "قسمت‌ها نتوانستند بارگیری شوند. لطفا بعدا دوباره تلاش کنید.", "hiddenfromstudents": "پنهان از شاگردان", - "showall": "نمایش همه", + "showall": "نمایش همه {{$a}}", "useactivityonbrowser": "البته همچنان می‌توانید با استفاده از مرورگر دستگاه خود، از آن استفاده کنید." } \ No newline at end of file diff --git a/www/core/components/course/lang/fr.json b/www/core/components/course/lang/fr.json index fa5ca9f7fb7..a0ac1336588 100644 --- a/www/core/components/course/lang/fr.json +++ b/www/core/components/course/lang/fr.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Caché pour les participants", "nocontentavailable": "Aucun contenu disponible actuellement.", "overriddennotice": "Votre note finale pour cette activité a été ajustée manuellement.", - "showall": "Tout afficher", + "showall": "Afficher tous les {{$a}}", "useactivityonbrowser": "Vous pouvez continuer à l'utiliser avec le navigateur de votre appareil." } \ No newline at end of file diff --git a/www/core/components/course/lang/he.json b/www/core/components/course/lang/he.json index 1789a2e476e..413e5343000 100644 --- a/www/core/components/course/lang/he.json +++ b/www/core/components/course/lang/he.json @@ -6,5 +6,5 @@ "hiddenfromstudents": "מוסתר בפני סטודנטים", "nocontentavailable": "אין תוכן זמין כרגע.", "overriddennotice": "הציון הסופי שלך מפעילות זו הותאם ידנית.", - "showall": "הראה הכל" + "showall": "תצוגת כל ה-{{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/it.json b/www/core/components/course/lang/it.json index 2f6968177c8..82112c25cdd 100644 --- a/www/core/components/course/lang/it.json +++ b/www/core/components/course/lang/it.json @@ -9,5 +9,5 @@ "hiddenfromstudents": "Nascosta agli studenti", "nocontentavailable": "Non sono presenti contenuti.", "overriddennotice": "La tua valutazione finale da questa attività è stata modificata manualmente.", - "showall": "Visualizza tutto" + "showall": "Visualizza tutti i {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/ja.json b/www/core/components/course/lang/ja.json index 2059fb9fb13..2e41ef36acc 100644 --- a/www/core/components/course/lang/ja.json +++ b/www/core/components/course/lang/ja.json @@ -3,5 +3,5 @@ "contents": "コンテンツ", "hiddenfromstudents": "学生から非表示", "overriddennotice": "この活動に関するあなたの評点は手動で調整されました。", - "showall": "すべて表示" + "showall": "すべての {{$a}} を表示する" } \ No newline at end of file diff --git a/www/core/components/course/lang/lt.json b/www/core/components/course/lang/lt.json index d348b5e7c7f..39c1c02b24e 100644 --- a/www/core/components/course/lang/lt.json +++ b/www/core/components/course/lang/lt.json @@ -8,7 +8,7 @@ "confirmdownload": "Norite atsisiųsti {{size}}. Ar norite tęsti?", "confirmdownloadunknownsize": "Negalima apskaičiuoti failo, kurį norite atsisiųsti, dydžio. Ar tikrai norite atsisiųsti?", "confirmpartialdownloadsize": "Norite atsisiųsti mažiausiai {{size}}. Ar tikrai norite tęsti?", - "contents": "Turiniai", + "contents": "Turinys", "couldnotloadsectioncontent": "Negalima užkrauti pasirinkto turinio, prašome pamėginti vėliau.", "couldnotloadsections": "Negalima užkrauti pasirinkto turinio, prašome pamėginti vėliau.", "errordownloadingsection": "Klaida atsisiunčiant.", @@ -16,6 +16,6 @@ "hiddenfromstudents": "Paslėpta nuo besimokančiųjų", "nocontentavailable": "Turinys šiuo metu nepasiekiamas.", "overriddennotice": "Šios veiklos galutinis įvertis buvo koreguotas rankiniu būdu.", - "showall": "Rodyti visus", + "showall": "Rodyti visus {{$a}}", "useactivityonbrowser": "Galite naudoti savo naršyklėje." } \ No newline at end of file diff --git a/www/core/components/course/lang/nl.json b/www/core/components/course/lang/nl.json index e341c7adfe2..3f619164387 100644 --- a/www/core/components/course/lang/nl.json +++ b/www/core/components/course/lang/nl.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Verborgen voor leerlingen", "nocontentavailable": "Geen inhoud beschikbaar.", "overriddennotice": "Je totaalcijfer voor deze activiteit is manueel aangepast.", - "showall": "Toon alle", + "showall": "Laat alle {{$a}} zien", "useactivityonbrowser": "Je kunt de activiteit nog steeds via de browser van je apparaat gebruiken" } \ No newline at end of file diff --git a/www/core/components/course/lang/pt-br.json b/www/core/components/course/lang/pt-br.json index e95b7c4187c..8a77246be40 100644 --- a/www/core/components/course/lang/pt-br.json +++ b/www/core/components/course/lang/pt-br.json @@ -9,7 +9,7 @@ "confirmdownload": "Você está prestes a baixar {{size}}. Você tem certeza que quer continuar?", "confirmdownloadunknownsize": "Não fomos capazes de calcular o tamanho do download. Tem certeza de que deseja fazer o download?", "confirmpartialdownloadsize": "Você está prestes a baixar pelo menos {{size}}. Você tem certeza que quer continuar?", - "contents": "Conteúdos", + "contents": "Conteúdo", "couldnotloadsectioncontent": "Não foi possível carregar o conteúdo da seção, por favor tente mais tarde.", "couldnotloadsections": "Não foi possível carregar a seção, por favor tente mais tarde.", "errordownloadingsection": "Erro ao baixar seção.", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Esconder dos estudantes", "nocontentavailable": "Nenhum conteúdo disponível nesse momento.", "overriddennotice": "Sua nota final para esta atividade foi ajustada manualmente.", - "showall": "Mostrar todos", + "showall": "Mostrar todos os {{$a}}", "useactivityonbrowser": "Você ainda pode usar isso no navegador do seu dispositivo" } \ No newline at end of file diff --git a/www/core/components/course/lang/pt.json b/www/core/components/course/lang/pt.json index 7ac9f081fbd..8ba4d0a7688 100644 --- a/www/core/components/course/lang/pt.json +++ b/www/core/components/course/lang/pt.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Oculto para os alunos", "nocontentavailable": "Nenhum conteúdo disponível neste momento.", "overriddennotice": "A sua nota final nesta atividade foi alterada manualmente na pauta.", - "showall": "Mostrar todos", + "showall": "Mostrar tudo {{$a}}", "useactivityonbrowser": "Ainda pode usá-lo se utilizar o navegador dos seus dispositivos." } \ No newline at end of file diff --git a/www/core/components/course/lang/ro.json b/www/core/components/course/lang/ro.json index 2069aa89421..8db8d4081f2 100644 --- a/www/core/components/course/lang/ro.json +++ b/www/core/components/course/lang/ro.json @@ -2,7 +2,7 @@ "allsections": "Toate secțiunile", "confirmdownload": "Porniți o descărcare de {{size}}. Sunteți sigur ca doriți să continuați?", "confirmdownloadunknownsize": "Nu putem calcula dimensiunea fișierului pe care doriți să îl descărcați. Sunteți sigur că doriți să descărcați?", - "contents": "Conținut", + "contents": "Conţinut", "couldnotloadsectioncontent": "Nu se poate încărca conținutul acestei secțiuni, încercați mai târziu.", "couldnotloadsections": "Nu se pot încărca secțiunile, încercați mai târziu.", "errordownloadingsection": "A apărut o eroare la descărcarea secțiunii.", @@ -10,5 +10,5 @@ "hiddenfromstudents": "Ascuns de cursanţi", "nocontentavailable": "Pentru moment nu există conținut.", "overriddennotice": "Nota finală obţinută de dumneavoastră pentru această activitate a fost ajustată manual.", - "showall": "Arată tot" + "showall": "Afişează toate {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/ru.json b/www/core/components/course/lang/ru.json index 6a0a1c3f43a..0d6968e390e 100644 --- a/www/core/components/course/lang/ru.json +++ b/www/core/components/course/lang/ru.json @@ -6,5 +6,5 @@ "hiddenfromstudents": "Скрыто от студентов", "nocontentavailable": "Нет контента, доступного в данный момент", "overriddennotice": "Ваша итоговая оценка за этот элемента курса была скорректирована вручную.", - "showall": "Показать все" + "showall": "Показать все {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/sr-cr.json b/www/core/components/course/lang/sr-cr.json index 3ee4f3ebe39..15ed523e7b2 100644 --- a/www/core/components/course/lang/sr-cr.json +++ b/www/core/components/course/lang/sr-cr.json @@ -9,12 +9,14 @@ "confirmdownload": "Намеравате да преузмете {{size}}. Да ли сте сигурни да желите да наставите?", "confirmdownloadunknownsize": "Нисмо могли да израчунамо величину преузимање. Да ли сте сигурни да желите да преузмете?", "confirmpartialdownloadsize": "Намеравате да преузмете најмање {{size}}. Да ли сте сигурни да желите да наставите?", - "contents": "Садржаји", + "contents": "Садржај", "couldnotloadsectioncontent": "Није могуће учитати садржај секције, покушајте поново касније.", "couldnotloadsections": "Није могуће учитати секције, покушајте поново касније.", "errordownloadingsection": "Грешка приликом преузимања секције.", "errorgetmodule": "Грешка приликом преузимања података модула.", + "hiddenfromstudents": "Сакривено од полазника", "nocontentavailable": "Никакав садржај није доступан у овом тренутку.", - "showall": "Прикажи све", + "overriddennotice": "Ваша завршна оцена за ову активност је ручно подешена", + "showall": "Прикажи свих {{$a}}", "useactivityonbrowser": "Још увек можете да га користите помоћу веб читача вашег уређаја." } \ No newline at end of file diff --git a/www/core/components/course/lang/sr-lt.json b/www/core/components/course/lang/sr-lt.json index 97d89d52dc2..a1522ae721c 100644 --- a/www/core/components/course/lang/sr-lt.json +++ b/www/core/components/course/lang/sr-lt.json @@ -9,12 +9,14 @@ "confirmdownload": "Nameravate da preuzmete {{size}}. Da li ste sigurni da želite da nastavite?", "confirmdownloadunknownsize": "Nismo mogli da izračunamo veličinu preuzimanje. Da li ste sigurni da želite da preuzmete?", "confirmpartialdownloadsize": "Nameravate da preuzmete najmanje {{size}}. Da li ste sigurni da želite da nastavite?", - "contents": "Sadržaji", + "contents": "Sadržaj", "couldnotloadsectioncontent": "Nije moguće učitati sadržaj sekcije, pokušajte ponovo kasnije.", "couldnotloadsections": "Nije moguće učitati sekcije, pokušajte ponovo kasnije.", "errordownloadingsection": "Greška prilikom preuzimanja sekcije.", "errorgetmodule": "Greška prilikom preuzimanja podataka modula.", + "hiddenfromstudents": "Sakriveno od polaznika", "nocontentavailable": "Nikakav sadržaj nije dostupan u ovom trenutku.", - "showall": "Prikaži sve", + "overriddennotice": "Vaša završna ocena za ovu aktivnost je ručno podešena", + "showall": "Prikaži svih {{$a}}", "useactivityonbrowser": "Još uvek možete da ga koristite pomoću veb čitača vašeg uređaja." } \ No newline at end of file diff --git a/www/core/components/course/lang/sv.json b/www/core/components/course/lang/sv.json index 0063575e970..ecabe8e2fc5 100644 --- a/www/core/components/course/lang/sv.json +++ b/www/core/components/course/lang/sv.json @@ -10,5 +10,5 @@ "hiddenfromstudents": "Dolt för studenter/deltagare/elever/lärande", "nocontentavailable": "Inget innehåll tillgängligt för tillfället.", "overriddennotice": "Ditt sammanfattningsbetyg för den här aktiviteten har justerats manuellt.", - "showall": "Visa alla" + "showall": "Visa alla {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/tr.json b/www/core/components/course/lang/tr.json index 027484a1cc3..f3d9b003fd5 100644 --- a/www/core/components/course/lang/tr.json +++ b/www/core/components/course/lang/tr.json @@ -1,7 +1,7 @@ { "allsections": "Tüm Bölümler", - "contents": "İçerik(ler)", + "contents": "İçerik", "hiddenfromstudents": "Öğrencilerden gizli", "overriddennotice": "Bu etkinlikteki final notunuz, elle ayarlandı.", - "showall": "Tümünü göster" + "showall": "Tümünü göster: {{$a}}" } \ No newline at end of file diff --git a/www/core/components/course/lang/uk.json b/www/core/components/course/lang/uk.json index 232aa47f117..faf2b294bc7 100644 --- a/www/core/components/course/lang/uk.json +++ b/www/core/components/course/lang/uk.json @@ -9,7 +9,7 @@ "confirmdownload": "Ви збираєтеся завантажити {{size}}. Ви впевнені, що хочете продовжити?", "confirmdownloadunknownsize": "Ми не змогли розрахувати розмір файлу. Ви впевнені, що ви хочете завантажити?", "confirmpartialdownloadsize": "Ви збираєтеся завантажити принаймні {{size}}. Ви впевнені, що хочете продовжити?", - "contents": "Контент", + "contents": "Зміст", "couldnotloadsectioncontent": "Не вдалося завантажити вміст розділу, будь ласка, спробуйте ще раз пізніше.", "couldnotloadsections": "Не вдалося завантажити розділи, будь ласка, спробуйте ще раз пізніше.", "errordownloadingsection": "Помилка в завантаженні.", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Сховане від студентів", "nocontentavailable": "Немає контенту, доступного в даний момент.", "overriddennotice": "Ваші фінальні бали з даної активності були відкореговані вручну.", - "showall": "Показати все", + "showall": "Показати всі {{$a}}", "useactivityonbrowser": "Ви все ще можете використовувати його за допомогою браузера пристрою." } \ No newline at end of file diff --git a/www/core/components/course/lang/zh-cn.json b/www/core/components/course/lang/zh-cn.json index c60b61bdc0b..5a50033ab9f 100644 --- a/www/core/components/course/lang/zh-cn.json +++ b/www/core/components/course/lang/zh-cn.json @@ -2,5 +2,5 @@ "contents": "内容", "hiddenfromstudents": "对学生隐藏", "overriddennotice": "您在该活动中的最终成绩将自动调整。", - "showall": "全部显示" + "showall": "显示所有({{$a}})" } \ No newline at end of file diff --git a/www/core/components/course/lang/zh-tw.json b/www/core/components/course/lang/zh-tw.json index c9c97c2ef45..10ecfebf0bf 100644 --- a/www/core/components/course/lang/zh-tw.json +++ b/www/core/components/course/lang/zh-tw.json @@ -8,7 +8,7 @@ "confirmdownload": "您即將下載{{size}}. 您確定您要繼續嗎?", "confirmdownloadunknownsize": "我們無法計算下載的容量. 您確定要下載嗎?", "confirmpartialdownloadsize": "您即將下載至少 {{size}}. 您確定您要繼續嗎?", - "contents": "內容", + "contents": "目錄", "couldnotloadsectioncontent": "無法載入區塊內容, 請稍後再試.", "couldnotloadsections": "無法載入區塊, 請稍後再試.", "errordownloadingsection": "載入區塊時發生錯誤", @@ -16,6 +16,6 @@ "hiddenfromstudents": "對學生隱藏", "nocontentavailable": "目前無內容可使用", "overriddennotice": "您在這活動的最後成績是手動調整的。", - "showall": "顯示全部", + "showall": "顯示全部{{$a}}", "useactivityonbrowser": "你可以以瀏覽器一直使用" } \ No newline at end of file diff --git a/www/core/components/courses/lang/ar.json b/www/core/components/courses/lang/ar.json index f96af19297b..ac8c6650a59 100644 --- a/www/core/components/courses/lang/ar.json +++ b/www/core/components/courses/lang/ar.json @@ -1,16 +1,16 @@ { "allowguests": "يسمح للمستخدمين الضيوف بالدخول إلى هذا المقرر الدراسي", "availablecourses": "المقررات الدراسية المتاحة", - "categories": "تصنيفات المقررات الدراسية", + "categories": "التصنيفات", "courses": "تصنيف المقررات الدراسية", "enrolme": "سجلني", "frontpage": "الصفحة الرئيسية", "mycourses": "مقرراتي الدراسية", - "nocourses": "لا يوجد معلومات لمقرر دراسي ليتم اظهرها", + "nocourses": "لا يوجد مقررات", "nocoursesyet": "لا توجد مقررات دراسية لهذه الفئة", - "nosearchresults": "لا توجد نتائج لهذا البحث", + "nosearchresults": "لا يوجد نتائج", "notenroled": "أنت لست مسجلاً كطالب في هذا المقرر", - "password": "كلمة المرور", + "password": "كلمة مرور", "search": "بحث", - "searchcourses": "بحث مقررات دراسية" + "searchcourses": "البحث في المقررات الدراسية" } \ No newline at end of file diff --git a/www/core/components/courses/lang/bg.json b/www/core/components/courses/lang/bg.json index 704b295e74a..1ef954e47fd 100644 --- a/www/core/components/courses/lang/bg.json +++ b/www/core/components/courses/lang/bg.json @@ -1,16 +1,16 @@ { "allowguests": "В този курс могат да влизат гости", "availablecourses": "Налични курсове", - "categories": "Категории курсове", + "categories": "Категории", "courses": "Курсове", "enrolme": "Запишете ме", "errorloadcourses": "Грешка при зареждането на курсовете.", "frontpage": "Заглавна страница", "mycourses": "Моите курсове", - "nocourses": "Няма информация за курса, която да бъде показана.", + "nocourses": "Няма курсове", "nocoursesyet": "Няма курсове в тази категория", - "nosearchresults": "Няма открити резултати за Вашето търсене", - "password": "Ключ за записване", + "nosearchresults": "Няма резултати", + "password": "Парола", "search": "Търсене", "searchcourses": "Търсене на курсове" } \ No newline at end of file diff --git a/www/core/components/courses/lang/ca.json b/www/core/components/courses/lang/ca.json index dc6c6af16fd..739d5c8e7fd 100644 --- a/www/core/components/courses/lang/ca.json +++ b/www/core/components/courses/lang/ca.json @@ -2,7 +2,7 @@ "allowguests": "Aquest curs permet entrar als usuaris visitants", "availablecourses": "Cursos disponibles", "cannotretrievemorecategories": "No es poden recuperar categories més enllà del nivell {{$a}}.", - "categories": "Categories de cursos", + "categories": "Categories", "confirmselfenrol": "Segur que voleu autoinscriure-us en aquest curs?", "courses": "Cursos", "enrolme": "Inscriu-me", @@ -13,13 +13,13 @@ "filtermycourses": "Filtrar els meus cursos", "frontpage": "Pàgina principal", "mycourses": "Els meus cursos", - "nocourses": "No hi ha informació del curs per mostrar.", + "nocourses": "No hi ha informació de cursos per mostrar.", "nocoursesyet": "No hi ha cursos en aquesta categoria", - "nosearchresults": "No hi ha resultats per la vostra cerca", - "notenroled": "No esteu inscrit en aquest curs", + "nosearchresults": "La cerca no ha obtingut resultats", + "notenroled": "No us heu inscrit en aquest curs", "notenrollable": "No podeu autoinscriure-us en aquest curs.", - "password": "Clau d'inscripció", - "search": "Cerca", + "password": "Contrasenya", + "search": "Cerca...", "searchcourses": "Cerca cursos", "searchcoursesadvice": "Podeu fer servir el botó de cercar cursos per accedir als cursos com a convidat o autoinscriure-us en cursos que ho permetin.", "selfenrolment": "Autoinscripció", diff --git a/www/core/components/courses/lang/cs.json b/www/core/components/courses/lang/cs.json index 10ad53dc40c..59626b53315 100644 --- a/www/core/components/courses/lang/cs.json +++ b/www/core/components/courses/lang/cs.json @@ -2,10 +2,10 @@ "allowguests": "Tento kurz je otevřen i pro hosty", "availablecourses": "Dostupné kurzy", "cannotretrievemorecategories": "Kategorie hlubší než úroveň {{$a}} nelze načíst.", - "categories": "Kategorie kurzů", + "categories": "Kategorie", "confirmselfenrol": "Jste si jisti, že chcete zapsat se do tohoto kurzu?", "courses": "Kurzy", - "enrolme": "Zapsat se", + "enrolme": "Zapsat se do kurzu", "errorloadcategories": "Při načítání kategorií došlo k chybě.", "errorloadcourses": "Při načítání kurzů došlo k chybě.", "errorsearching": "Při vyhledávání došlo k chybě.", @@ -13,13 +13,13 @@ "filtermycourses": "Filtrovat mé kurzy", "frontpage": "Titulní stránka", "mycourses": "Moje kurzy", - "nocourses": "O kurzu nejsou žádné informace.", + "nocourses": "Žádné dostupné informace o kurzech", "nocoursesyet": "Žádný kurz v této kategorii", - "nosearchresults": "Z vašeho hledání nebyly nalezeny žádné výsledky", - "notenroled": "V tomto kurzu nejste zapsán", + "nosearchresults": "Vaše vyhledávání nepřineslo žádný výsledek", + "notenroled": "Nejste zapsáni v tomto kurzu", "notenrollable": "Do tohoto kurzu se nemůžete sami zapsat.", - "password": "Klíč zápisu", - "search": "Hledat", + "password": "Heslo", + "search": "Vyhledat", "searchcourses": "Vyhledat kurzy", "searchcoursesadvice": "Můžete použít tlačítko Vyhledat kurzy, pracovat jako host nebo se zapsat do kurzů, které to umožňují.", "selfenrolment": "Zápis sebe sama", diff --git a/www/core/components/courses/lang/da.json b/www/core/components/courses/lang/da.json index 506a637348d..7c3706806c8 100644 --- a/www/core/components/courses/lang/da.json +++ b/www/core/components/courses/lang/da.json @@ -1,7 +1,7 @@ { "allowguests": "Dette kursus tillader gæster", "availablecourses": "Tilgængelige kurser", - "categories": "Kursuskategorier", + "categories": "Kategorier", "confirmselfenrol": "Er du sikker på at du ønsker at tilmelde dig dette kursus?", "courses": "Alle kurser", "enrolme": "Tilmeld mig", @@ -11,14 +11,14 @@ "filtermycourses": "Filtrer mit kursus", "frontpage": "Forside", "mycourses": "Mine kurser", - "nocourses": "Der er ingen kursusoplysninger at vise.", + "nocourses": "Du er ikke tilmeldt nogen kurser.", "nocoursesyet": "Der er ingen kurser i denne kategori", - "nosearchresults": "Din søgning gav ingen resultater", + "nosearchresults": "Der var ingen beskeder der opfyldte søgekriteriet", "notenroled": "Du er ikke tilmeldt dette kursus", "notenrollable": "Du kan ikke selv tilmelde dig dette kursus.", - "password": "Tilmeldingsnøgle", - "search": "Søg", - "searchcourses": "Søg efter kurser", + "password": "Adgangskode", + "search": "Søg...", + "searchcourses": "Søg kurser", "searchcoursesadvice": "Du kan bruge knappen kursussøgning for at få adgang som gæst eller tilmelde dig kurser der tillader det.", "selfenrolment": "Selvtilmelding", "totalcoursesearchresults": "Kurser i alt: {{$a}}" diff --git a/www/core/components/courses/lang/de.json b/www/core/components/courses/lang/de.json index 4e3b14126e9..861a406fe43 100644 --- a/www/core/components/courses/lang/de.json +++ b/www/core/components/courses/lang/de.json @@ -2,10 +2,10 @@ "allowguests": "Der Kurs ist für Gäste zugänglich", "availablecourses": "Kursliste", "cannotretrievemorecategories": "Kursbereiche tiefer als Level {{$a}} können nicht abgerufen werden.", - "categories": "Kursbereiche", + "categories": "Kategorien", "confirmselfenrol": "Möchten Sie sich selbst in diesen Kurs einschreiben?", "courses": "Kurse", - "enrolme": "Selbst einschreiben", + "enrolme": "Einschreiben", "errorloadcategories": "Fehler beim Laden der Kursbereiche", "errorloadcourses": "Fehler beim Laden der Kurse", "errorsearching": "Fehler beim Suchen", @@ -13,13 +13,13 @@ "filtermycourses": "Meine Kurse filtern", "frontpage": "Startseite", "mycourses": "Meine Kurse", - "nocourses": "Keine Kursinformation", + "nocourses": "Keine Kursinformationen", "nocoursesyet": "Keine Kurse in diesem Kursbereich", - "nosearchresults": "Keine Suchergebnisse", - "notenroled": "Sie sind nicht in diesen Kurs eingeschrieben.", + "nosearchresults": "Keine Ergebnisse", + "notenroled": "Sie sind nicht in diesen Kurs eingeschrieben", "notenrollable": "Sie können sich nicht selbst in diesen Kurs einschreiben.", - "password": "Einschreibeschlüssel", - "search": "Suchen", + "password": "Kennwort", + "search": "Suche", "searchcourses": "Kurse suchen", "searchcoursesadvice": "Sie können Kurse suchen, um als Gast teilzunehmen oder sich selbst einzuschreiben, falls dies erlaubt ist.", "selfenrolment": "Selbsteinschreibung", diff --git a/www/core/components/courses/lang/el.json b/www/core/components/courses/lang/el.json index 127c3fcdd83..819d0105246 100644 --- a/www/core/components/courses/lang/el.json +++ b/www/core/components/courses/lang/el.json @@ -2,7 +2,7 @@ "allowguests": "Σε αυτό το μάθημα επιτρέπονται και οι επισκέπτες", "availablecourses": "Διαθέσιμα Μαθήματα", "cannotretrievemorecategories": "Δεν είναι δυνατή η ανάκτηση κατηγοριών μετά από το επίπεδο {{$a}}.", - "categories": "Κατηγορίες μαθημάτων", + "categories": "Κατηγορίες", "confirmselfenrol": "Είστε σίγουροι ότι θέλετε να εγγραφείτε σε αυτό το μάθημα;", "courses": "Μαθήματα", "enrolme": "Εγγραφή", @@ -13,13 +13,13 @@ "filtermycourses": "Φιλτράρισμα των μαθημάτων μου", "frontpage": "Αρχική σελίδα", "mycourses": "Τα μαθήματά μου", - "nocourses": "Δεν υπάρχουν πληροφορίες για αυτό το μάθημα.", + "nocourses": "Δεν υπάρχει πληροφορία του μαθήματος για προβολή.", "nocoursesyet": "Δεν υπάρχουν μαθήματα σε αυτήν την κατηγορία", - "nosearchresults": "Δεν βρέθηκαν αποτελέσματα", - "notenroled": "Δεν έχετε εγγραφεί σε αυτό το μάθημα", + "nosearchresults": "Δε βρέθηκαν αποτελέσματα για την αναζήτησή σας", + "notenroled": "Δεν είσαι εγγεγραμμένος σε αυτό το μάθημα", "notenrollable": "Δεν μπορείτε να αυτο-εγγραφείτε σε αυτό το μάθημα.", - "password": "Κλειδί εγγραφής", - "search": "Αναζήτηση", + "password": "Κωδικός πρόσβασης", + "search": "Έρευνα", "searchcourses": "Αναζήτηση μαθημάτων", "searchcoursesadvice": "Μπορείτε να χρησιμοποιήσετε το κουμπί Αναζήτηση μαθημάτων για πρόσβαση ως επισκέπτης ή για να αυτο-εγγραφείτε σε μαθήματα που το επιτρέπουν.", "selfenrolment": "Αυτο-εγγραφή", diff --git a/www/core/components/courses/lang/es-mx.json b/www/core/components/courses/lang/es-mx.json index 3b5fa60c3b6..ff09fef87cc 100644 --- a/www/core/components/courses/lang/es-mx.json +++ b/www/core/components/courses/lang/es-mx.json @@ -13,13 +13,13 @@ "filtermycourses": "<<\n
  • املأ نموذج حساب جديد.
  • \n
  • على الفور تصلك رسالة على عنوانك البريدي.
  • \n
  • قم بقراءة البريد واضغط على الرابطة الموجودة به.
  • \n
  • سيتم تأكيد اشتراكك ويسمح لك بالدخول.
  • \n
  • والآن قم باختيار المقرر الدراسي الذي ترغب المشاركة فيه.
  • \n
  • من الآن فصاعدا يمكنك الدخول عن طريق إدخال اسم المستخدم وكلمة المرور (في النموذج المقابل بهذه الصفحة) ، وتستطيع الاتصال الكامل المقرر الدراسي ، وتصل إلى أي مقرر دراسي تريد التسجيل به.
  • \n
  • إذا طلب منك ''مفتاح التسجيل'' - استخدم المفتاح الذي أعطاه لك المدرس. هذا سيجعلك ''تشارك'' في المقرر الدراسي.
  • \n
  • لا حظ أن كل مقرر دراسي قد يكون له أيضا \"مفتاح تسجيل\" ستحتاج إليه لاحقا.
  • \n ", @@ -26,7 +26,7 @@ "missinglastname": "الاسم الأخير لم يتم تحدده", "newaccount": "حساب مشترك جديد", "newsitedescription": "من فضلك أدخل رابط موقع نظام التعلم الإلكتروني مودل الخاص بك. لاحظ انه من الممكن أن يكون لم يتم إعداده للعمل مع هذا التطبيق.", - "password": "كلمة المرور", + "password": "كلمة مرور", "passwordrequired": "كلمة المرور مطلوبة", "policyaccept": "لقد فهمت وأوافق", "policyagree": "يجب الموافقة على هذه الشروط للإستمرار في إستخدام الموقع. هل أنت موافق؟", diff --git a/www/core/components/login/lang/bg.json b/www/core/components/login/lang/bg.json index 42351bce95a..aba3a7656a7 100644 --- a/www/core/components/login/lang/bg.json +++ b/www/core/components/login/lang/bg.json @@ -1,7 +1,7 @@ { "authenticating": "Удостоверяване", "cancel": "Отказване", - "connect": "Свързване!", + "connect": "Свързване", "connecttomoodle": "Свързване към Moodle", "createaccount": "Създаване на моята регистрация", "createuserandpass": "Изберете Вашето име и парола", @@ -17,7 +17,7 @@ "invalidmoodleversion": "Невалидна версия на Moodle. Най-старата изискване версия е 2.4.", "invalidsite": "Интернет адресът на сайта е невалиден.", "invalidurl": "URL-ът, който току що въведохте не е валиден", - "login": "Вход", + "login": "Влизане във Вашия профил", "loginbutton": "Вход!", "logininsiterequired": "Трябва да влезете в сайта през прозорец на браузър.", "loginsteps": "За пълен достъп до този сайт трябва първо да си създадете профил.", @@ -27,7 +27,7 @@ "mobileservicesnotenabled": "Услугите от Moodle не са активирани на Вашия сайт. Моля, свържете се с администратор на Moodle, ако мислите, че мобилния достъп трябва да бъде разрешен.", "newaccount": "Нова потребителска регистрация", "notloggedin": "Трябва са сте влезли в сайта.", - "password": "Ключ за записване", + "password": "Парола", "passwordrequired": "Паролата е задължителна", "policyaccept": "Разбирам и съм съгласен", "policyagree": "Трябва да се съгласите с тези условия за ползване, за да продължите да ползвате сайта. Съгласен/на ли сте?", diff --git a/www/core/components/login/lang/ca.json b/www/core/components/login/lang/ca.json index d14a659e218..30577d6307d 100644 --- a/www/core/components/login/lang/ca.json +++ b/www/core/components/login/lang/ca.json @@ -28,7 +28,7 @@ "invalidmoodleversion": "La versió de Moodle no és vàlida. Cal com a mínim la versió 2.4.", "invalidsite": "L'URL del lloc no és vàlid.", "invalidtime": "L'hora no és vàlida", - "invalidurl": "L'URL no és vàlid", + "invalidurl": "L'URL que heu introduït no és vàlid", "invalidvaluemax": "El valor màxim és {{$a}}", "invalidvaluemin": "El valor mínim és {{$a}}", "localmobileunexpectedresponse": "Les característiques addicionals de Moodle Mobile han tornat una resposta inesperada, us heu d'autenticar fent servir el servei estàndard de Mobile.", @@ -44,7 +44,7 @@ "newaccount": "Nou compte", "newsitedescription": "Introduïu l'URL del vostre lloc Moodle. Tingueu en compte que podria no estar configurat per treballar amb aquesta aplicació.", "notloggedin": "Heu d'entrar al lloc.", - "password": "Clau d'inscripció", + "password": "Contrasenya", "passwordrequired": "Contrasenya obligatòria", "policyaccept": "Entès i conforme", "policyagree": "Heu d'acceptar la normativa abans d'entrar en aquest lloc. Hi esteu d'acord?", diff --git a/www/core/components/login/lang/cs.json b/www/core/components/login/lang/cs.json index 8b4a2c704cd..05d01526f05 100644 --- a/www/core/components/login/lang/cs.json +++ b/www/core/components/login/lang/cs.json @@ -1,17 +1,17 @@ { "auth_email": "Registrace na základě e-mailu", "authenticating": "Autentizace", - "cancel": "Přerušit", + "cancel": "Zrušit", "checksiteversion": "Zkontrolujte, zda web používá Moodle 2.4 nebo novější.", "confirmdeletesite": "Jste si jisti, že chcete smazat web {{sitename}}?", - "connect": "Připojit!", + "connect": "Spojit", "connecttomoodle": "Připojit k Moodle", "contactyouradministrator": "Pro další pomoc se obraťte na správce webu.", "contactyouradministratorissue": "Požádejte správce, prosím, aby zkontroloval následující problém: {{$a}}", "createaccount": "Vytvořit můj nový účet", "createuserandpass": "Vytvořit nové uživatelské jméno a heslo pro přihlášení", "credentialsdescription": "Pro přihlášení uveďte své uživatelské jméno a heslo.", - "emailconfirmsent": "

    E-mail by měl být zaslán na Vaši adresu na {{$a}}

    Obsahuje jednoduché instrukce pro dokončení registrace.

    Pokud budou potíže pokračovat, obraťte se na správce webu.

    ", + "emailconfirmsent": "

    Na vaši adresu {{$a}} byl odeslán e-mail s jednoduchými pokyny k dokončení vaší registrace.

    Narazíte-li na nějaké obtíže, spojte se se správcem těchto stránek.

    ", "emailnotmatch": "E-maily se neshodují", "enterthewordsabove": "Vložte výše uvedená slova", "erroraccesscontrolalloworigin": "Cross-Origin volání - váš pokus o provedení byl odmítnut. Zkontrolujte prosím https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -19,7 +19,7 @@ "errorupdatesite": "Došlo k chybě při aktualizaci tokenu webu.", "firsttime": "Jste tady poprvé?", "getanothercaptcha": "Získat jiné CAPTCHA", - "help": "Nápověda", + "help": "Pomoc", "helpmelogin": "

    Existuje mnoho tisíc webů Moodle po celém světě. Tato aplikace může připojit pouze ke stránkám Moodle, které povolily, mobilní přístup k aplikaci.

    Pokud se nemůžete k Moodle připojit, pak je třeba kontaktovat správce web Moodle, kam se chcete připojit a požádat, aby přečetl http://docs.moodle.org/en/Mobile_app

    Chcete-li otestovat aplikaci na Moodle demo webu jako učitel nebo student na pole Adresa stránky a klikněte na tlačítko Připojit .

    ", "instructions": "Pokyny", "invalidaccount": "Zkontrolujte si prosím své přihlašovací údaje nebo se obraťte na správce webu, aby zkontroloval nastavení.", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Neplatná verze Moodle. Minimální potřebná verze je:", "invalidsite": "Adresa URL stránky je chybná", "invalidtime": "Neplatný čas", - "invalidurl": "Neplatná URL", + "invalidurl": "Použité URL není platné", "invalidvaluemax": "Maximální hodnota je {{$a}}", "invalidvaluemin": "Minimální hodnota je {{$a}}", "localmobileunexpectedresponse": "Kontrola rozšířených vlastností Moodle Mobile vrátil neočekávanou odezvu, budete ověřen pomocí standardních služeb mobilu .", "loggedoutssodescription": "Musíte se znovu autentizovat. Musíte se přihlásit na stránky v okně prohlížeče.", - "login": "Přihlásit se", + "login": "Přihlásit ke svému účtu", "loginbutton": "Přihlásit se", "logininsiterequired": "Váš Moodlu vás nutí k přihlášení pomocí prohlížeče. Nová instance prohlížeče otevře přesměrování na vaše stránky Moodle.", "loginsteps": "K plnému přístupu na tyto stránky, musíte nejprve vytvořit účet.", @@ -44,7 +44,7 @@ "newaccount": "Nový účet", "newsitedescription": "Zadejte prosím adresu URL vašeho webu Moodle. Všimněte si, že nemusí být nakonfigurován pro práci s touto aplikací.", "notloggedin": "Musíte být přihlášeni.", - "password": "Sdílené heslo", + "password": "Heslo", "passwordrequired": "Je požadováno heslo", "policyaccept": "Rozumím a souhlasím", "policyagree": "Před dalším používáním těchto stránek musíte souhlasit s těmito pravidly. Souhlasíte s nimi?", diff --git a/www/core/components/login/lang/da.json b/www/core/components/login/lang/da.json index 73378e4f7a3..2814f984626 100644 --- a/www/core/components/login/lang/da.json +++ b/www/core/components/login/lang/da.json @@ -2,7 +2,7 @@ "authenticating": "Godkender", "cancel": "Annuller", "confirmdeletesite": "Er du sikker på at du ønsker at slette websiden {{sitename}}?", - "connect": "Tilslut!", + "connect": "Forbind", "connecttomoodle": "Tilslut til Moodle", "createaccount": "Opret ny profil", "createuserandpass": "Vælg brugernavn og adgangskode", @@ -21,9 +21,9 @@ "invalidemail": "Ugyldig e-mailadresse", "invalidmoodleversion": "Ugyldig Moodle version. Der kræves minimum 2.4.", "invalidsite": "Denne webadresse er ugyldig.", - "invalidurl": "Ugyldig URL", + "invalidurl": "Den URL, du har skrevet, er ikke korrekt", "localmobileunexpectedresponse": "Du har fået en uventet reaktion fra Moodle Mobile Additional Features, så du vil blive godkendt ved hjælp af standard Mobile service.", - "login": "Log ind", + "login": "Log ind på din konto", "loginbutton": "Login", "logininsiterequired": "Du skal logge på websiden via en browser", "loginsteps": "For at få fuld adgang til dette site, skal du oprette en brugerkonto.", @@ -34,7 +34,7 @@ "newaccount": "Ny konto", "newsitedescription": "Skriv din Moodles webadresse. Bemærk at Moodle kan være konfigureret, så den ikke virker med denne app.", "notloggedin": "Du skal være logget på.", - "password": "Delt hemmelig streng", + "password": "Adgangskode", "passwordrequired": "Adgangskode kræves", "policyaccept": "Jeg forstår og er enig", "policyagree": "Du må acceptere disse retningslinjer for at benytte dette site.\nAccepterer du?", diff --git a/www/core/components/login/lang/de.json b/www/core/components/login/lang/de.json index 2c1061d3f43..deda25e1172 100644 --- a/www/core/components/login/lang/de.json +++ b/www/core/components/login/lang/de.json @@ -11,7 +11,7 @@ "createaccount": "Zugang anlegen (Registrierung)", "createuserandpass": "Wählen Sie Ihren Anmeldenamen und Ihr Kennwort", "credentialsdescription": "Geben Sie den Anmeldenamen und das Kennwort ein. ", - "emailconfirmsent": "

    In Kürze wird eine E-Mail an {{$a}} gesendet.

    Sie finden eine einfache Anleitung, wie Sie die Registrierung abschließen. Bei Schwierigkeiten wenden Sie sich an den Administrator der Website.

    ", + "emailconfirmsent": "

    Um sicherzugehen, dass sich niemand unberechtigt über die von Ihnen angegebene E-Mail anmeldet, wird eine automatische Benachrichtigung an diese Adresse {{$a}} gesendet. Je nach Netzlast trifft sie sofort oder auch etwas später bei Ihnen ein.

    \n

    Die Benachrichtigung enthält eine Anleitung, wie Sie Ihre Registrierung bestätigen.\nDanach sind Sie auf dieser Moodle-Seite registriert und können sofort loslegen.

    \n

    Bei Problemen wenden Sie sich bitte an die Administrator/innen der Website.

    ", "emailnotmatch": "Die E-Mail-Adressen stimmen nicht überein.", "enterthewordsabove": "Geben Sie die gezeigten Wörter ein", "erroraccesscontrolalloworigin": "Der Cross-Origin Aufruf wurde zurückgewiesen. Weitere Informationen: https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Falsche Version. Mindestens Moodle 2.4 ist notwendig.", "invalidsite": "Die URL der Website ist ungültig.", "invalidtime": "Ungültige Zeitangabe", - "invalidurl": "Ungültige URL", + "invalidurl": "Die eingegebene URL ist nicht gültig.", "invalidvaluemax": "Der Maximalwert ist {{$a}}.", "invalidvaluemin": "Der Minimalwert ist {{$a}}.", "localmobileunexpectedresponse": "Die Verbindung zum Plugin 'Moodle Mobile - Zusatzfeatures' ist fehlgeschlagen. Sie werden über den standardmäßigen mobilen Webservice authentifiziert.", "loggedoutssodescription": "Sie müssen sich erneut authentifizieren. Melden Sie sich dafür im Browser auf der Website im Browser an..", - "login": "Login", + "login": "Mit Ihrem Nutzerkonto anmelden", "loginbutton": "Anmelden", "logininsiterequired": "Sie müssen sich für diese Website im Browser anmelden.", "loginsteps": "Für den vollen Zugriff auf diese Website benötigen Sie ein Nutzerkonto.", @@ -44,7 +44,7 @@ "newaccount": "Neuer Zugang", "newsitedescription": "Geben Sie die URL zu Ihrer Website ein. Eventuell ist Ihre Website nicht für diese App freigegeben.", "notloggedin": "Sie müssen eingeloggt sein.", - "password": "Kennwort", + "password": "Öffentliches Kennwort", "passwordrequired": "Kennwort fehlt", "policyaccept": "Ich verstehe den Text und stimme ihm zu", "policyagree": "Lesen Sie diese Zustimmungserklärung sorgfältig. Sie müssen erst zustimmen, um diese Website weiter nutzen zu können. Stimmen Sie zu?", diff --git a/www/core/components/login/lang/el.json b/www/core/components/login/lang/el.json index ddfa99ae3f0..6ed49de1648 100644 --- a/www/core/components/login/lang/el.json +++ b/www/core/components/login/lang/el.json @@ -1,7 +1,7 @@ { "auth_email": "Email-based αυτο-εγγραφή", "authenticating": "Έλεγχος ταυτότητας", - "cancel": "Άκυρο", + "cancel": "Ακύρωση", "checksiteversion": "Ελέγξτε ποια έκδοση Moodle χρησιμοποιεί το site, Moodle 2.4 ή μετέπειτα έκδοση.", "confirmdeletesite": "Είστε σίγουροι ότι θέλετε να διαγράψετε το site {{sitename}};", "connect": "Σύνδεση!", @@ -11,7 +11,7 @@ "createaccount": "Δημιουργία του λογαριασμού μου", "createuserandpass": "Δημιουργία ενός νέου ονόματος χρήστη και κωδικού πρόσβασης για είσοδο στον δικτυακό τόπο", "credentialsdescription": "Δώστε το όνομα χρήστη και τον κωδικό πρόσβασής σας για να συνδεθείτε.", - "emailconfirmsent": "

    Ένα email έχει σταλεί στη διεύθυνση σας {{$a}}

    Περιέχει εύκολες οδηγίες για να ολοκληρώσετε την εγγραφή σας.

    Εάν συνεχίσετε να έχετε δυσκολίες επικοινωνήστε με το διαχειριστή του site.

    ", + "emailconfirmsent": "

    Ένα μήνυμα ηλεκτρονικού ταχυδρομείου θα πρέπει να έχει σταλεί στη διεύθυνσή σας, {{$a}}

    \n

    Περιέχει απλές οδηγίες για την ολοκλήρωση της εγγραφής σας.

    \n

    Αν συνεχίζετε να αντιμετωπίζετε δυσκολίες, επικοινωνήστε με το διαχειριστή του δικτυακού τόπου.

    ", "emailnotmatch": "Οι διευθύνσεις email δεν ταιριάζουν", "enterthewordsabove": "Enter the words above", "erroraccesscontrolalloworigin": "Η κλήση πολλαπλών προελεύσεων (Cross-Origin call) που προσπαθείτε να εκτελέσετε έχει απορριφθεί. Παρακαλώ ελέγξτε https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,7 +28,7 @@ "invalidmoodleversion": "Μη έγκυρη έκδοση Moodle. Η ελάχιστη απαιτούμενη έκδοση είναι η 2.4.", "invalidsite": "Η διεύθυνση ιστότοπου δεν είναι έγκυρη.", "invalidtime": "Μη έγκυρη ώρα", - "invalidurl": "Το URL που εισαγάγατε δεν είναι έγκυρο", + "invalidurl": "Μη έγκυρο URL", "invalidvaluemax": "Η μεγαλύτερη τιμή είναι {{$a}}", "invalidvaluemin": "Η μικρότερη τιμή είναι {{$a}}", "localmobileunexpectedresponse": "Ο έλεγχος επιπρόσθετων λειτουργιών τη εφαρμοργής για κινητά Moodle επέστρεψε μια απροσδόκητη απόκριση, θα πιστοποιηθείτε χρησιμοποιώντας την τυπική υπηρεσία κινητής τηλεφωνίας.", @@ -44,7 +44,7 @@ "newaccount": "Νέος λογαριασμός", "newsitedescription": "Καταχωρίστε τη διεύθυνση URL του ιστότοπού σας Moodle. Σημειώστε ότι ενδέχεται να μην έχει ρυθμιστεί να λειτουργεί με αυτήν την εφαρμογή.", "notloggedin": "Πρέπει να συνδεθείτε", - "password": "Κωδικός", + "password": "Κωδικός πρόσβασης", "passwordrequired": "Απαιτείται κωδικός πρόσβασης", "policyaccept": "Καταλαβαίνω και συμφωνώ", "policyagree": "Πρέπει να συμφωνήσετε σε αυτήν την πολιτική για να συνεχίσετε στο ιστοχώρο. Συμφωνείτε;", diff --git a/www/core/components/login/lang/es-mx.json b/www/core/components/login/lang/es-mx.json index 6bf776afc12..858db740994 100644 --- a/www/core/components/login/lang/es-mx.json +++ b/www/core/components/login/lang/es-mx.json @@ -4,14 +4,14 @@ "cancel": "Cancelar", "checksiteversion": "Revisar que su sitio usa Moodle 2.4 o más reciente.", "confirmdeletesite": "¿Está Usted seguro de querer eliminar el sitio {{sitename}}?", - "connect": "¡Conectar!", + "connect": "Conectar", "connecttomoodle": "Conectar a Moodle", "contactyouradministrator": "Contacte a su administrador del sitio para más ayuda.", "contactyouradministratorissue": "Por favor, pídale al administrador que revise el siguiente problema: {{$a}}", "createaccount": "Crear mi cuenta nueva", "createuserandpass": "Elegir su nombre_de_usuario y contraseña", "credentialsdescription": "Por favor proporcione su nombre_de_usuario y contraseña para ingresar.", - "emailconfirmsent": "

    Debería de haberse enviado un Email a su dirección en {{$a}}

    El Email contiene instrucciones sencillas para completar su registro.

    Si continúa teniendo dificultades, contacte al administrador del sitio.

    ", + "emailconfirmsent": "

    Hemos enviado un correo electrónico a {{$a}}

    \n

    En él encontrará instrucciones sencillas para concluir el proceso.

    \n

    Si tuviera alguna dificultad, contacte con el Administrador del Sistema.

    ", "emailnotmatch": "No coinciden los Emails", "enterthewordsabove": "Escriba las palabras de arriba", "erroraccesscontrolalloworigin": "La llamada de Orígen Cruzado (''Cross-Origin'') que Usted está tratando de realizar ha sido rechazada. Por favor revise https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Versión de Moodle inválida. La versión mínima requerida es 2.4", "invalidsite": "La URL del sitio es inválida.", "invalidtime": "Hora inválida", - "invalidurl": "URL no válida", + "invalidurl": "La URL introducida no es válida", "invalidvaluemax": "El valor máximo es {{$a}}", "invalidvaluemin": "El valor mínimo es {{$a}}", "localmobileunexpectedresponse": "La revisión de las características Adicionales de Moodle Mobile regresó una respuesta inesperada; Usted será autenticado usando el servicio Mobile estándar.", "loggedoutssodescription": "Usted tiene que autenticarse nuevamente. Usted necesita ingresar al sitio en una ventana del navegador.", - "login": "Ingresar", + "login": "Ingresar a su cuenta", "loginbutton": "Ingreso", "logininsiterequired": "Usted necesita ingresar al sitio con una ventana del navegador.", "loginsteps": "Para acceso completo a este sitio, Usted necesita primeramente crear una cuenta.", @@ -44,13 +44,13 @@ "newaccount": "Nueva cuenta", "newsitedescription": "Por favor escriba la uRL de su sitio Moodle. Tome nota de que este podría no estar configurado para trabajar con esta app.", "notloggedin": "Usted necesita estar ingresado.", - "password": "Secreto Compartido", + "password": "Contraseña", "passwordrequired": "Contraseña obligatoria", "policyaccept": "Entiendo y estoy de acuerdo", "policyagree": "Usted deberá estar de acuerdo con estas condiciones antes de seguir usando este sitio. ¿Está de acuerdo?", "policyagreement": "Acuerdo con las Condiciones del Sitio", "policyagreementclick": "Haga clic aquí para leer el acuerdo con las condiciones del sitio", - "potentialidps": "¿Entra (se registra) habitualmente en otro sitio antes de llegar aquí?
    Elija entre las opciones de la siguiente lista para entrar en su sitio habitual:", + "potentialidps": "Ingrese usando su cuenta en:", "problemconnectingerror": "Estamos teniendo dificultades para conectarnos", "problemconnectingerrorcontinue": "Revise dos veces que Usted haya ingresado la dirección correctamente e inténtelo nuevamente.", "profileinvaliddata": "Valor inválido", diff --git a/www/core/components/login/lang/es.json b/www/core/components/login/lang/es.json index db20e532710..2bf64c84d37 100644 --- a/www/core/components/login/lang/es.json +++ b/www/core/components/login/lang/es.json @@ -11,7 +11,7 @@ "createaccount": "Crear cuenta", "createuserandpass": "Crear un nuevo usuario y contraseña para acceder al sistema", "credentialsdescription": "Introduzca su nombre se usuario y contraseña para entrar", - "emailconfirmsent": "

    Se ha enviado un email a su dirección {{$a}}

    Contiene instrucciones para completar el proceso de registro.

    Si continúa teniendo algún problema, contacte con el administrador de su sitio.

    ", + "emailconfirmsent": "

    Hemos enviado un correo electrónico a {{$a}}

    \n

    En él encontrará instrucciones sencillas para concluir el proceso.

    \n

    Si tuviera alguna dificultad, contacte con el Administrador del Sistema.

    ", "emailnotmatch": "Las direcciones de correo no coinciden.", "enterthewordsabove": "Escriba las palabras de arriba", "erroraccesscontrolalloworigin": "La llamada Cross-Origin que está intentando ha sido rechazada. Por favor visite https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Versión de Moodle inválida. La versión mínima requerida es:", "invalidsite": "La URL del sitio es inválida.", "invalidtime": "Hora incorrecta", - "invalidurl": "URL no válida", + "invalidurl": "La URL introducida no es válida", "invalidvaluemax": "El valor máximo es {{$a}}", "invalidvaluemin": "El valor mínimo es {{$a}}", "localmobileunexpectedresponse": "Las características adicionales de Moodle Mobile han devuelto una respuesta inesperada, debe autenticarse utilizando el servicio estándar de Mobile.", "loggedoutssodescription": "Tiene que autenticarse nuevamente. Necesita acceder al sitio en una ventana del navegador.", - "login": "Acceder", + "login": "Acceder con su cuenta", "loginbutton": "Acceder", "logininsiterequired": "Para autentificarse en el sitio se ha de abrir una ventana de navegador.", "loginsteps": "Hola. Para acceder al sistema tómese un minuto para\ncrear una cuenta.\nCada curso puede disponer de una \"clave de acceso\"\nque sólo tendrá que usar la primera vez.\nEstos son los pasos:\n
      \n
    1. Rellene el Formulario de Registro con sus datos.
    2. \n
    3. El sistema le enviará un correo para verificar que su dirección sea correcta.
    4. \n
    5. Lea el correo y confirme su matrícula.
    6. \n
    7. Su registro será confirmado y usted podrá acceder al curso.
    8. \n
    9. Seleccione el curso en el que desea participar.
    10. \n
    11. Si algún curso en particular le solicita una \"contraseña de acceso\"\nutilice la que le facilitaron cuando se matriculó.\nAsí quedará matriculado.
    12. \n
    13. A partir de ese momento no necesitará utilizar más que su nombre de usuario y contraseña\nen el formulario de la página\npara entrar a cualquier curso en el que esté matriculado.
    14. \n
    ", @@ -44,7 +44,7 @@ "newaccount": "Nueva cuenta", "newsitedescription": "Introduzca la URL de su sitio Moodle. Tenga en cuenta que podría no estar configurado para trabajar con esta aplicación.", "notloggedin": "Ha de entrar al sitio.", - "password": "Clave de matriculación", + "password": "Contraseña", "passwordrequired": "Contraseña obligatoria", "policyaccept": "Entiendo y estoy de acuerdo", "policyagree": "Usted deberá estar de acuerdo con estas condiciones antes de seguir usando este sitio. ¿Está de acuerdo?", diff --git a/www/core/components/login/lang/eu.json b/www/core/components/login/lang/eu.json index 61b1d730666..d8feb394e24 100644 --- a/www/core/components/login/lang/eu.json +++ b/www/core/components/login/lang/eu.json @@ -4,14 +4,14 @@ "cancel": "Utzi", "checksiteversion": "Egiaztatu zure Moodle guneak 2.4 bertsioa edo aurreragokoa erabiltzen duela.", "confirmdeletesite": "Ziur zaude {{sitename}} gunea ezabatu nahi duzula?", - "connect": "Konektatu!", + "connect": "Konektatu", "connecttomoodle": "Moodle-ra konektatu", "contactyouradministrator": "Zure guneko kudeatzailearekin harremanetan jarri laguntza gehiagorako.", "contactyouradministratorissue": "Mesedez, eskatu zure kudeatzaileari hurrengo arazoa ikuskatu dezala: {{$a}}", "createaccount": "Nire kontu berria sortu", "createuserandpass": "Aukeratu zure erabiltzaile-izena eta pasahitza", "credentialsdescription": "Mesedez saioa hasteko zure sartu erabiltzaile eta pasahitza.", - "emailconfirmsent": "

    Zure {{$a}} helbidera mezu bat bidali da.

    Zure erregistroa amaitzeko argibide erraz batzuk ditu.

    Arazorik baduzu, jarri harremanetan kudeatzailearekin.

    ", + "emailconfirmsent": "

    E-posta mezu bat bidali dugu zure hurrengo helbide honetara: {{$a}}

    \n

    Izena ematen amaitzeko argibide erraz batzuk ditu.

    \n

    Arazorik baduzu, jarri harremanetan kudeatzailearekin.

    ", "emailnotmatch": "E-posta helbideak ez datoz bat", "enterthewordsabove": "Idatzi goiko hitzak", "erroraccesscontrolalloworigin": "Saiatzen ari zaren Cross-Origin deia ez da onartu. Ikusi mesedez https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Moodle bertsio baliogabea. Gutxieneko bertsioa hurrengoa da:", "invalidsite": "Guneko URLa ez da zuzena", "invalidtime": "Ordu baliogabea", - "invalidurl": "URL baliogabea", + "invalidurl": "Sartu duzun URL-a ez da onargarria", "invalidvaluemax": "Gehieneko balioa {{$a}} da.", "invalidvaluemin": "Gutxieneko balioa {{$a}} da.", "localmobileunexpectedresponse": "Moodle Mobile-ko Funtzio Aurreratuen kontrolak ezusteko erantzuna eman du, Mobile zerbitzu estandarra erabilita autentifikatuko zaitugu.", "loggedoutssodescription": "Berriz autentifikatu behar duzua. Gunean nabigatzaile leiho baten bitartez hasi behar duzu saioa.", - "login": "Sartu", + "login": "Sartu zure kontuan", "loginbutton": "Hasi saioa", "logininsiterequired": "Gunean web-nabigatzaile baten bidez sartu behar zara.", "loginsteps": "Gune honetara sarbide osoa izateko, lehenik eta behin kontua sortu behar duzu. in ikastarotara sartzeko web-gune honetako erabiltzaile izan behar duzu\neta horretarako kontu bat sortu behar duzu.\n\nNola sortu kontu berria:\n
      \n
    1. Sakatu lotura honetan KONTU BERRIA eta formularioa bete zure datuekin.
    2. \n
    3. E-posta mezu bat bidaliko dugu berehala zure e-posta helbidera.
    4. \n
    5. Mezua irakurri eta agertzen den loturan klik egin.
    6. \n
    7. Zure kontua berretsi eta barruan izango zara.
    8. \n
    9. Orduan, nahi duzun ikastaroa aukeratu.
    10. \n
    11. \"Partaide-giltza\" bat eskatzen badizu, erabili matrikulatutakoan eman zizutena
    12. \n
    13. Kontu berria sortutakoan, eta zenbait kasutan matrikula egindakoan, ikastarorako sarbidea izango duzu.
    14. \n
    15. Hemendik aurrera zure erabiltzaile-izena eta pasahitza besterik ez dituzu sartu beharko hasiera orrian zeure ikastaroan parte hartzeko.
    16. \n
    ", @@ -44,7 +44,7 @@ "newaccount": "Kontu berria", "newsitedescription": "Sartu mesedez zure Moodle guneko URLa. Kontuan hartu app honekin funtzionatzeko gunea aurretik konfiguraturik egon behar dela.", "notloggedin": "Autentifikaturik egon behar duzu.", - "password": "Partekatutako sekretua", + "password": "Pasahitza", "passwordrequired": "Pasahitza behar da", "policyaccept": "Ulertu dut eta ados nago", "policyagree": "Web gune honetan jarraitu aurretik baldintzekin ados egon behar duzu. Ados al zaude?", diff --git a/www/core/components/login/lang/fa.json b/www/core/components/login/lang/fa.json index 742e9639285..ede4296c505 100644 --- a/www/core/components/login/lang/fa.json +++ b/www/core/components/login/lang/fa.json @@ -17,7 +17,7 @@ "invalidemail": "آدرس پست الکترونیک نامعتبر", "invalidmoodleversion": "این نسخه از برنامه سایت قابلیت اتصال به موبایل ندارد", "invalidsite": "نشانی سایت معتبر نیست", - "invalidurl": "آدرس نامعتبر", + "invalidurl": "آدرسی که وارد کرده‌اید معتبر نیست", "login": "ورود به سایت", "logininsiterequired": "لازم است به سایت از طریق مرورگر متصل گردید", "loginsteps": "برای داشتن دسترسی کامل به این سایت، پیش از هر چیز باید یک حساب کاربری بسازید.", @@ -26,7 +26,7 @@ "missinglastname": "نام خانوادگی را وارد کنید", "mobileservicesnotenabled": "سرویس دسترسی موبایل در سایت شما فعال نیست", "newaccount": "حساب کاربری جدید", - "password": "رمز ورود", + "password": "کلمهٔ رمز", "passwordrequired": "گذرواژه مورد نیاز است", "policyaccept": "موافقم و می‌پذیرم", "policyagree": "برای ادامهٔ استفاده از این سایت باید موافقت خود را با خط مشی آن اعلام کنید. آیا موافقید؟", diff --git a/www/core/components/login/lang/fr.json b/www/core/components/login/lang/fr.json index 091525791f0..631db476ebc 100644 --- a/www/core/components/login/lang/fr.json +++ b/www/core/components/login/lang/fr.json @@ -4,14 +4,14 @@ "cancel": "Annuler", "checksiteversion": "Veuillez vérifier que votre site utilise Moodle 2.4 ou une version ultérieure.", "confirmdeletesite": "Voulez-vous vraiment supprimer la plateforme {{sitename}} ?", - "connect": "Connecter !", + "connect": "Connecter", "connecttomoodle": "Connexion à Moodle", "contactyouradministrator": "Veuillez contacter l'administrateur de la plateforme pour plus d'aide.", "contactyouradministratorissue": "Veuillez demander à l'administrateur de la plateforme de vérifier l'élément suivant : {{$a}}", "createaccount": "Créer mon compte", "createuserandpass": "Créer un compte", "credentialsdescription": "Veuillez fournir votre nom d'utilisateur et votre mot de passe pour vous connecter.", - "emailconfirmsent": "

    Un message vous a été envoyé par courriel à l'adresse {{$a}}

    Il contient des instructions vous permettant de terminer votre enregistrement.

    En cas de difficulté, viellez contacter l'administrateur de la plateforme.

    ", + "emailconfirmsent": "

    Un message vous a été envoyé à l'adresse de courriel {{$a}}.

    Il contient les instructions pour terminer votre enregistrement.

    Si vous rencontrez des difficultés, veuillez contacter l'administrateur du site.

    ", "emailnotmatch": "Les adresses de courriel ne correspondent pas", "enterthewordsabove": "Tapez les mots ci-dessus", "erroraccesscontrolalloworigin": "La tentative d'appel « Cross-Origin » que vous avez effectuée a été rejetée. Veuillez consulter https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Version de Moodle non valide. La version minimale requise est :", "invalidsite": "Cette URL n'est pas valide.", "invalidtime": "Temps non valide", - "invalidurl": "URL non valide", + "invalidurl": "L'URL que vous venez de saisir n'est pas valide", "invalidvaluemax": "La valeur maximale est {{$a}}", "invalidvaluemin": "La valeur minimale est {{$a}}", "localmobileunexpectedresponse": "La vérification des fonctionnalités additionnelles de Moodle Mobile a envoyé une réponse inattendue. Vous allez être connecté au moyen du service mobile standard.", "loggedoutssodescription": "Veuillez vous ré-authentifier en vous connectant au site au moyen d'un navigateur web.", - "login": "Connexion", + "login": "Connexion à votre compte", "loginbutton": "Se connecter", "logininsiterequired": "Vous devez vous connecter au moyen d'un navigateur.", "loginsteps": "Pour un accès complet à ce site, veuillez créer un compte utilisateur.", @@ -44,7 +44,7 @@ "newaccount": "Nouveau compte", "newsitedescription": "Veuillez saisir l'URL de votre plateforme Moodle.", "notloggedin": "Vous devez être connecté.", - "password": "Secret partagé", + "password": "Mot de passe", "passwordrequired": "Mot de passe requis", "policyaccept": "Je comprends et je me déclare d'accord", "policyagree": "Vous devez accepter de vous conformer à ce règlement pour continuer à utiliser ce site. Acceptez-vous le règlement ?", diff --git a/www/core/components/login/lang/he.json b/www/core/components/login/lang/he.json index 6fdfc343515..9d40a0cfdfa 100644 --- a/www/core/components/login/lang/he.json +++ b/www/core/components/login/lang/he.json @@ -2,7 +2,7 @@ "authenticating": "מאמת נתונים", "cancel": "ביטול", "confirmdeletesite": "האם את/ה בטוח/ה שברצונך למחוק את האתר {{sitename}}?", - "connect": "התחברות!", + "connect": "חיבור", "connecttomoodle": "התחברות למוודל", "createaccount": "יצירת חשבון חדש", "createuserandpass": "הזנת שם־משתמש וסיסמה", @@ -20,8 +20,8 @@ "invalidemail": "כתובת דואר אלקטרוני לא תקפה", "invalidmoodleversion": "גרסת מוודל לא תקינה. נדרשת גרסה 2.4 ומעלה.", "invalidsite": "כתובת האתר אינה תקינה.", - "invalidurl": "URL לא חוקי", - "login": "התחברות", + "invalidurl": "כתובת ה-URL (אינטרנט) שהזנת כרגע לא תקפה.", + "login": "התחברות לחשבונך", "loginbutton": "כניסה!", "logininsiterequired": "עליך להתחבר לאתר בחלון דפדפן.", "loginsteps": "שלום לך! לקבלת גישה מלאה לקורסים עליך להקדיש דקה לפתיחת חשבון חדש באתר זה.\nלכל אחד מהקורסים הבודדים יכול להיות גם \"מפתח רישום\" שתצטרך רק מאוחר יותר. להלן שלבי פתיחת החשבון:\n
      \n
    1. מלא את הטופס חשבון חדש בפרטים שלך
    2. \n
    3. דואר אלקטרוני יישלח מיידית לכתובת הדואר האלקטרוני שסיפקת (אם לא נמצא, נא לחפש גם בדואר הזבל או הספאם).
    4. \n
    5. קרא את הדואר אלקטרוני שלך ולחץ על קישור האינטרנט שהוא מכיל.
    6. \n
    7. החשבון שלך יאושר ואתה תהיה מחובר.
    8. \n
    9. עכשיו בחר את הקורס בו תרצה להשתתף.
    10. \n
    11. אם מבקשים ממך \"מפתח רישום\" השתמש בזה שנתן לך המורה שלך. זה \"ירשום\" אותך לקורס.
    12. \n
    13. עכשיו יש בידך גישה לכל הקורס. מעתה והלאה כל שתצטרך בכדי להתחבר ולהיכנס לכל קורס שנרשמת אליו הוא שם המשתמש שלך והסיסמה (בטופס המופיע בדף זה).
    14. \n
    ", @@ -32,7 +32,7 @@ "newaccount": "חשבון חדש", "newsitedescription": "יש להזין את כתובת אתר המוודל שלך. יש לשים לב כי יתכן והאתר אינו מוגדר לעבוד עם יישומון זו.", "notloggedin": "עליך להיות מחובר/ת", - "password": "סיסמה (secret)", + "password": "סיסמה", "passwordrequired": "דרושה סיסמה", "policyaccept": "אני מבין ומסכים", "policyagree": "הינך חייב לאשר את מדיניות זו על מנת להמשיך להשתמש באתר זה. האם אתה מסכים?", diff --git a/www/core/components/login/lang/hu.json b/www/core/components/login/lang/hu.json index c5c7c062990..0a23a2b4fce 100644 --- a/www/core/components/login/lang/hu.json +++ b/www/core/components/login/lang/hu.json @@ -1,6 +1,6 @@ { "authenticating": "Hitelesítés", - "cancel": "Mégse", + "cancel": "Törlés", "connect": "Kapcsolódás", "createaccount": "Új felhasználói azonosítóm létrehozása", "createuserandpass": "Új felhasználónév és jelszó megadása", @@ -15,8 +15,8 @@ "invalidemail": "Érvénytelen e-mail cím", "invalidmoodleversion": "Érvénytelen Moodle-verzió. A minimális verziószám a 2.4.", "invalidsite": "A portál-URL nem érvényes.", - "invalidurl": "Érvénytelen URL", - "login": "Belépés", + "invalidurl": "A megadott URL nem érvényes", + "login": "Lépjen be fiókjába", "logininsiterequired": "A portálra böngészőablakban kell bejelentkeznie.", "loginsteps": "Ahhoz, hogy teljesen hozzáférjen a portálhoz, először új fiókot kell létrehoznia.", "missingemail": "Hiányzó e-mail cím", @@ -24,7 +24,7 @@ "missinglastname": "Hiányzó vezetéknév", "mobileservicesnotenabled": "Portálján a mobil szolgáltatások nincsenek engedélyezve. A mobil elérhetőség bekapcsolásához forduljon a rendszergazdához.", "newaccount": "Új fiók", - "password": "Megosztott titkos jel", + "password": "Jelszó", "passwordrequired": "Jelszó szükséges", "policyaccept": "Megértettem és elfogadom", "policyagree": "A portál használatához el kell fogadnia a feltételeket. Elfogadja őket?", diff --git a/www/core/components/login/lang/it.json b/www/core/components/login/lang/it.json index 7cec597a221..bea999f99be 100644 --- a/www/core/components/login/lang/it.json +++ b/www/core/components/login/lang/it.json @@ -2,7 +2,7 @@ "authenticating": "Autenticazione in corso", "cancel": "Annulla", "confirmdeletesite": "Sei sicuro di eliminare il sito {{sitename}}?", - "connect": "Collegati!", + "connect": "Connetti", "connecttomoodle": "Collegati a Moodle", "createaccount": "Crea il mio nuovo account", "createuserandpass": "Scegli username e password", @@ -21,7 +21,7 @@ "invalidemail": "Indirizzo email non valido", "invalidmoodleversion": "Versione di Moodle non valida. La versione minima richiesta:", "invalidsite": "L'URL del sito non è valida", - "invalidurl": "L'URL non è valido", + "invalidurl": "L'URL inserito non è valido", "localmobileunexpectedresponse": "Il controllo delle Moodle Mobile Additional Feature ha restituito una risposta inattesa, sarai autenticato tramite i servizi Mobile standard.", "login": "Login", "loginbutton": "Login!", @@ -34,7 +34,7 @@ "newaccount": "Nuovo account", "newsitedescription": "Inserisci l'URL del sito Moodle al quale vuoi collegarti. Da notare che il sito deve essere configurato per funzionare con questa app.", "notloggedin": "Devi essere autenticato", - "password": "Password", + "password": "Shared Secret", "passwordrequired": "Password necessaria", "policyaccept": "Ho letto le condizioni e le accetto", "policyagree": "Per continuare ad usare questo sito, è necessario accettare le condizioni riportate.", diff --git a/www/core/components/login/lang/ja.json b/www/core/components/login/lang/ja.json index 7dab53a83d0..dcc69fa6709 100644 --- a/www/core/components/login/lang/ja.json +++ b/www/core/components/login/lang/ja.json @@ -15,8 +15,8 @@ "invalidemail": "無効なメールアドレスです。", "invalidmoodleversion": "Moodleのバージョンが古すぎます。少なくともこれより新しいMoodleである必要があります:", "invalidsite": "サイトURLが正しくありません。", - "invalidurl": "無効なURLです。", - "login": "ログイン", + "invalidurl": "あなたが入力したURLは正しくありません。", + "login": "あなたのアカウントにログインする:", "loginbutton": "ログイン", "logininsiterequired": "ブラウザウインドウからサイトにログインする必要があります。", "loginsteps": "このサイトにフルアクセスするため、あなたは最初にアカウントを作成する必要があります。", @@ -25,7 +25,7 @@ "missinglastname": "姓が入力されていません。", "mobileservicesnotenabled": "あなたのサイトではモバイルサービスが有効になっていません。モバイルアクセスが必要と思うなら、あなたのMoodleサイト管理者にその相談をしてください。", "newaccount": "新しいアカウント", - "password": "共有秘密鍵", + "password": "パスワード", "passwordrequired": "パスワードがありません", "policyaccept": "私は内容を理解および同意します。", "policyagree": "このサイトを継続して利用するにはあなたは使用許諾に同意する必要があります。同意しますか?", diff --git a/www/core/components/login/lang/lt.json b/www/core/components/login/lang/lt.json index f5e96ef8b35..d591b88110a 100644 --- a/www/core/components/login/lang/lt.json +++ b/www/core/components/login/lang/lt.json @@ -4,14 +4,14 @@ "cancel": "Atšaukti", "checksiteversion": "Patikrintkite, ar svetainė naudoja Moodle 2.4. arba vėlesnę versiją.", "confirmdeletesite": "Ar tikrai norite ištrinti svetainę {{sitename}}?", - "connect": "Prisijungta!", + "connect": "Prijungti", "connecttomoodle": "Prisijungti prie Moodle", "contactyouradministrator": "Susisiekite su svetainės administratoriumi, jei reikalinga pagalba.", "contactyouradministratorissue": "Dėl šių klausimų prašome susisiekti su administratoriumi: {{$a}}", "createaccount": "Kurti naują mano paskyrą", "createuserandpass": "Pasirinkite savo naudotojo vardą ir slaptažodį", "credentialsdescription": "Prisijungti naudojant vartotojo vardą ir slaptažodį.", - "emailconfirmsent": "

    Informacija išsiųsta Jūsų nurodytu adresu {{$a}}

    Tai padės sėkmingai užbaigti registraciją.

    Jeigu nepavyksta, susisiekite su svetainės administratoriumi.

    ", + "emailconfirmsent": "

    El. laiškas išsiųstas jūsų adresu {{$a}}

    .

    Jame pateikti paprasti nurodymai, kaip užbaigti registraciją.

    Jei iškils kokių sunkumų, kreipkitės į svetainės administratorių.

    ", "emailnotmatch": "El. paštas nesutampa", "enterthewordsabove": "Įvesti aukščiau rodomus žodžius", "erroraccesscontrolalloworigin": "Kryžminis veiksmas buvo atmestas. Patikrinkite: https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -19,7 +19,7 @@ "errorupdatesite": "Klaida atnaujinant svetainės kodą.", "firsttime": "Ar jūs čia pirmą kartą?", "getanothercaptcha": "Gauti kitą CAPTCHA", - "help": "Žinynas", + "help": "Pagalba", "helpmelogin": "

    Visame pasaulyje Moodle svetainių yra labai daug. Ši programėlė gali prisijungti prie Moodle svetainių, turinčių specialią Moodle programėlių prieigą.

    Jeigu negalite prisijungti, praneškite apie tai Moodle administratoriui ir paprašykite perskaityti http://docs.moodle.org/en/Mobile_app

    Norėdami išbandyti programėlės demo versiją surinkite teacher (dėstytojui) ar student (besimokančiajam) Svetainės adreso lauke ir paspauskite Prisijungti mygtuką.

    ", "instructions": "Instrukcijos", "invalidaccount": "Prašome patikrinti prisijungimo duomenis arba paprašyti administratoriaus patikrinti svetainės nustatymus.", @@ -28,14 +28,14 @@ "invalidmoodleversion": "Negaliojanti Moodle versija. Turi būt ne senesnė nei 2.4.", "invalidsite": "URL adresas netinkamas.", "invalidtime": "Netinkamas laikas", - "invalidurl": "Klaidingas URL", + "invalidurl": "Jūsų ką tik įvestas URL yra neleistinas", "invalidvaluemax": "Didžiausia vertė {{$a}}", "invalidvaluemin": "Mažiausia vertė {{$a}}", "localmobileunexpectedresponse": "Moodle Mobilių Papildomų Funkcijų patikra gavo netikėtą atsakymą, būsite autentifikuojamas naudojant standartines mobilias paslaugas.", "login": "Prisijungti", "loginbutton": "Prisijungti", "logininsiterequired": "Prisijunkite prie svetainės naršyklės lange.", - "loginsteps": "Sveiki! Jei norite gauti visą prieigą prie kursų, turite šioje svetainėje sukurti savo paskyrą. Kiekvieni kursai taip pat gali turėti vienkartinius registracijos raktus, kurių reikės vėliau. Reikia atlikti tokius veiksmus:
    1. Užpildykite naujos paskyros formą, pateikdami savo informaciją.
    2. Jūsų el. pašto adresu bus iš karto išsiųstas el. laiškas.
    3. \n
    4. Perskaitykite el. laišką ir spustelėkite jame esantį saitą.
    5. \n
    6. Jūsų paskyra bus patvirtinta ir galėsite prisijungti.
    7. \n
    8. Tada pasirinkite kursus, kuriuose norite dalyvauti.
    9. \n
    10. Jei jūsų paprašys registracijos rakto, naudokite gautą iš dėstytojo. Taip įsiregistruosite į kursus.
    11. Dabar galėsite pasiekti visą kursų informacija. Nuo šiol jums tereikės įvesti asmeninį naudotojo vardą ir slaptažodį (šio puslapio formoje), kad prisijungtumėte ir pasiektumėte visus kursus, kuriuose įsiregistravote.
    ", + "loginsteps": "Jei norite gauti visą prieigą prie svetainės, turite pirmiausiai sukurti savo paskyrą.", "missingemail": "Nėra el. pašto adreso", "missingfirstname": "Nėra pavadinimo", "missinglastname": "Nėra pavardės", @@ -43,7 +43,7 @@ "newaccount": "Nauja paskyra", "newsitedescription": "Įveskite Moodle svetainės URL adresą. Atkreipkite dėmesį, kad gali būti nesukonfigūruotas dirbti su šia programėle.", "notloggedin": "Turite prisijungti", - "password": "Bendra paslaptis", + "password": "Slaptažodis", "passwordrequired": "Reikalingas slaptažodis", "policyaccept": "Suprantu ir sutinku", "policyagree": "Norėdami toliau naudotis šia svetaine, turite sutikti su šia strategija. Ar sutinkate?", diff --git a/www/core/components/login/lang/nl.json b/www/core/components/login/lang/nl.json index c0cf35dece7..0ce52512c27 100644 --- a/www/core/components/login/lang/nl.json +++ b/www/core/components/login/lang/nl.json @@ -4,14 +4,14 @@ "cancel": "Annuleer", "checksiteversion": "Controleer of je site minstens Moodle 2.4 of nieuwe gebruikt.", "confirmdeletesite": "Weet je zeker dat je de site {{sitename}} wil verwijderen?", - "connect": "Verbinden!", + "connect": "Verbind", "connecttomoodle": "Verbinden met Moodle", "contactyouradministrator": "Neem contact op met je site-beheerder voor meer hulp.", "contactyouradministratorissue": "Vraag aan je site-beheerder om volgend probleem te onderzoeken: {{$a}}", "createaccount": "Maak mijn nieuwe account aan", "createuserandpass": "Kies een gebruikersnaam en wachtwoord", "credentialsdescription": "Geef je gebruikersnaam en wachtwoord op om je aan te melden", - "emailconfirmsent": "

    Er zou een e-mail gestuurd moeten zijn naar jouw adres {{$a}}

    Het bericht bevat eenvoudige instructies om je registratie te voltooien.

    Als je problemen blijft ondervinden, neem dan contact op met de sitebeheerder.

    ", + "emailconfirmsent": "

    Als het goed is, is er een e-mail verzonden naar {{$a}}

    \n

    Daarin staan eenvoudige instructies voor het voltooien van de registratie.

    \n

    Indien je moeilijkheden blijft ondervinden, neem dan contact op met je sitebeheerder.

    ", "emailnotmatch": "E-mailadressen komen niet overeen", "enterthewordsabove": "Vul hier bovenstaande woorden in", "erroraccesscontrolalloworigin": "De Cross-Origin call die je probeerde uit te voeren, werd geweigerd. Controleer https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Ongeldige Moodleversie. De vereiste minimumversie is:", "invalidsite": "Deze site-URL is niet geldig.", "invalidtime": "Ongeldige tijd", - "invalidurl": "Ongeldige url", + "invalidurl": "De URL die je net gaf is niet geldig", "invalidvaluemax": "De maximum waarde is {{$a}}", "invalidvaluemin": "De minimum waard eis {{$a}}", "localmobileunexpectedresponse": "Moodle Mobile Additional Features Check gaf een onverwacht antwoord. Je zult aanmelden via de standaard Mobile service.", "loggedoutssodescription": "Je moet opnieuw aanmelden. Je moet aanmelden met een browservenster.", - "login": "Login", + "login": "Login met je account", "loginbutton": "Inloggen", "logininsiterequired": "Je dient via een browser in te loggen op je Moodle site", "loginsteps": "Om volledige toegang tot deze site te krijgen, moet je een account maken.", @@ -44,7 +44,7 @@ "newaccount": "Nieuwe account", "newsitedescription": "Geef de URL van je Moodle site. Merk op dat die misschien niet geconfigureerd is om met deze app te werken.", "notloggedin": "Je moet ingelogd zijn.", - "password": "Gedeeld geheim", + "password": "Wachtwoord", "passwordrequired": "Wachtwoord vereist", "policyaccept": "Ik begrijp het en ga akkoord", "policyagree": "Je moet akkoord gaan met deze overeenkomst voor je verder kunt gaan met het gebruiken van deze site. Ga je akkoord?", diff --git a/www/core/components/login/lang/pl.json b/www/core/components/login/lang/pl.json index b4472737bff..3fbd9ef1040 100644 --- a/www/core/components/login/lang/pl.json +++ b/www/core/components/login/lang/pl.json @@ -15,7 +15,7 @@ "invalidemail": "Niewłaściwy adres e-mail", "invalidmoodleversion": "Nieprawidłowa wersja Moodle. Minimalna wymagana wersja to: ", "invalidsite": "Adres strony jest nieprawidłowy.", - "invalidurl": "Niepoprawny URL", + "invalidurl": "URL właśnie wprowadzony nie jest poprawny", "login": "Zaloguj się", "logininsiterequired": "Musisz się zalogować do strony w oknie przeglądarki.", "loginsteps": "Aby otrzymać pełny dostęp do kursów w tym serwisie, musisz najpierw utworzyć konto.", @@ -24,7 +24,7 @@ "missinglastname": "Pominięto nazwisko", "mobileservicesnotenabled": "Usługi mobile nie są włączone na twojej stronie.Skontaktuj się z administratorem strony Moodle jeżeli uważasz, że dostęp mobilny powinien być włączony.", "newaccount": "Nowe konto", - "password": "Wspólne tajne hasło", + "password": "Hasło", "passwordrequired": "Hasło wymagane", "policyaccept": "Rozumiem i zgadzam się", "policyagree": "Musisz zaakceptować te zasady, żeby używać strony. Czy zgadzasz się?", diff --git a/www/core/components/login/lang/pt-br.json b/www/core/components/login/lang/pt-br.json index e46b244e75a..0fbd58b4cce 100644 --- a/www/core/components/login/lang/pt-br.json +++ b/www/core/components/login/lang/pt-br.json @@ -4,14 +4,14 @@ "cancel": "Cancelar", "checksiteversion": "Verifique se seu site usa Moodle 2.4 ou superior.", "confirmdeletesite": "Você tem certeza que quer excluir o site {{sitename}}?", - "connect": "Conectar!", + "connect": "Conectar", "connecttomoodle": "Conectar ao moodle", "contactyouradministrator": "Contate o administrador do site para ter mais ajuda.", "contactyouradministratorissue": "Por favor, pergunte ao administrador para verificar o seguinte problema: {{$a}}", "createaccount": "Cadastrar este novo usuário", "createuserandpass": "Escolha seu usuário e senha", "credentialsdescription": "Por favor, informe seu nome de usuário e senha para efetuar o login", - "emailconfirmsent": "

    Um e-mail irá ser enviado para o seu endereço em {{$a}}

    Ele irá conter instruções fáceis para completar seu registro.

    Se você continua a ter dificuldades, contate o administrador do site.

    ", + "emailconfirmsent": "

    Uma mensagem foi enviada para o seu endereço {{$a}}

    Esta mensagem contém instruções para completar a sua inscrição.

    Se você encontrar dificuldades contate o administrador.

    ", "emailnotmatch": "Os e-mail não coincidem", "enterthewordsabove": "Digite as palavras acima", "erroraccesscontrolalloworigin": "A chamada de Cross-Origin que você está tentando executar foi rejeitada. Por favor, verifique https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "Versão do Moodle inválida. A versão mínima requerida é:", "invalidsite": "A URL do siteé inválida.", "invalidtime": "Tempo inválido", - "invalidurl": "Url inválida", + "invalidurl": "A URL inserida não é válida", "invalidvaluemax": "O valor máximo é {{$a}}", "invalidvaluemin": "O valor minimo é{{$a}}", "localmobileunexpectedresponse": "Verificação do Moodle Mobile Additional Features retornou uma resposta inesperada, você ira se autenticar usando o serviço Mobile padrão", "loggedoutssodescription": "Você tem que autenticar novamente. Você precisa fazer login no site em uma janela do navegador.", - "login": "Acessar", + "login": "Login em sua conta", "loginbutton": "Entrar", "logininsiterequired": "É preciso logar no site num navegador.", "loginsteps": "Para ter acesso completo a este site, você primeiro precisa criar uma conta.", @@ -44,7 +44,7 @@ "newaccount": "Cadastramento de novo usuário", "newsitedescription": "Por favor, digite a URL do seu site Moodle. Note que, pode ser que ele não esteja configurado para trabalhar com este app.", "notloggedin": "Você precisa estar logado.", - "password": "Segredo compartilhado", + "password": "Senha", "passwordrequired": "Senha necessária", "policyaccept": "Eu compreendo e concordo", "policyagree": "Para utilizar este site você precisa aceitar o acordo sobre a política de uso do site. Você aceita os termos deste acordo?", diff --git a/www/core/components/login/lang/pt.json b/www/core/components/login/lang/pt.json index 80424147ec3..9faa9559aea 100644 --- a/www/core/components/login/lang/pt.json +++ b/www/core/components/login/lang/pt.json @@ -4,14 +4,14 @@ "cancel": "Cancelar", "checksiteversion": "Verifique se seu site usa o Moodle 2.4 ou posterior.", "confirmdeletesite": "Tem a certeza que pretende remover o site {{sitename}}?", - "connect": "Ligar!", + "connect": "Ligar", "connecttomoodle": "Ligação ao Moodle", "contactyouradministrator": "Contacte o administrador do site para obter mais ajuda.", "contactyouradministratorissue": "Solicite ao administrador que verifique o seguinte problema: {{$a}}", "createaccount": "Criar a minha conta", "createuserandpass": "Escolha um nome de utilizador e senha", "credentialsdescription": "Por favor, digite o nome de utilizador e senha para entrar", - "emailconfirmsent": "

    Um e-mail deve ter sido enviado para o seu endereço {{$a}}

    . Contém instruções fáceis para concluir o seu registo. Se continuar a ter dificuldades, entre em contacto com o administrador do site.

    ", + "emailconfirmsent": "

    Acaba de ser enviada uma mensagem para o seu endereço {{$a}}, com instruções fáceis para completar a sua inscrição.

    Se tiver alguma dificuldade em completar o registo, contacte o administrador do site.

    ", "emailnotmatch": "Os e-mails não coincidem", "enterthewordsabove": "Insira as palavras indicadas acima", "erroraccesscontrolalloworigin": "A acção de Cross-Origin que tentou executar foi rejeitada. Por favor, consulte mais informações em https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,12 +28,12 @@ "invalidmoodleversion": "A versão do Moodle é inválida. É necessária a versão 2.4 ou superior.", "invalidsite": "O URL do site é inválido.", "invalidtime": "Hora inválida", - "invalidurl": "URL inválido", + "invalidurl": "O URL que introduziu não é válido", "invalidvaluemax": "O valor máximo é {{$a}}", "invalidvaluemin": "O valor mínimo é {{$a}}", "localmobileunexpectedresponse": "A verificação do Moodle Mobile Additional Features teve um erro inesperado, a ligação será feita através do serviço Mobile padrão.", "loggedoutssodescription": "Tem de autenticar-se novamente. A autenticação no site tem de ser numa janela do navegador.", - "login": "Entrar", + "login": "Autentique-se com seus dados de acesso", "loginbutton": "Iniciar sessão", "logininsiterequired": "Precisa de entrar no site através de uma janela de navegador.", "loginsteps": "Para ter acesso completo a este site, primeiro precisa de criar uma nova conta de utilizador.", @@ -44,7 +44,7 @@ "newaccount": "Nova conta", "newsitedescription": "Por favor, digite o URL do seu site Moodle. Note que o mesmo poderá não estar configurado para funcionar nesta aplicação.", "notloggedin": "Precisa de estar autenticado.", - "password": "Senha partilhada", + "password": "Senha", "passwordrequired": "Senha necessária", "policyaccept": "Compreendo e concordo", "policyagree": "Deverá aceitar este regulamento para poder proceder a utilizar este site. Aceita o regulamento?", @@ -69,7 +69,7 @@ "startsignup": "Criar nova conta", "stillcantconnect": "Continua com problemas na ligação?", "supplyinfo": "Insira alguma informação sobre si", - "username": "Nome de utilizador", + "username": "Utilizador", "usernamerequired": "É necessário o nome de utilizador", "usernotaddederror": "Utilizador não adicionado - erro.", "visitchangepassword": "Pretende visitar o site para alterar a senha?", diff --git a/www/core/components/login/lang/ro.json b/www/core/components/login/lang/ro.json index 7eac7e64d7d..3ee06d65b14 100644 --- a/www/core/components/login/lang/ro.json +++ b/www/core/components/login/lang/ro.json @@ -2,7 +2,7 @@ "authenticating": "Autentificare", "cancel": "Anulează", "confirmdeletesite": "Sunteți sigur că doriți sa ștergeți siteul {{sitename}}?", - "connect": "Conectare!", + "connect": "Conectează", "connecttomoodle": "Conectare la Moodle", "createaccount": "Creează noul meu cont", "createuserandpass": "Alege un nume de utilizator şi o parolă", @@ -21,7 +21,7 @@ "invalidemail": "Adresă de email incorectă", "invalidmoodleversion": "Versiunea Moodle este invalidă. Versiunea minimă este 2.4", "invalidsite": "Adresa URL este invalidă.", - "invalidurl": "URL incorect", + "invalidurl": "URL-ul pe care l-aţi introdus nu este corect", "localmobileunexpectedresponse": "Verificarea Moodle Mobile Additional Features a returnat un răspuns neașteptat. veți fi autentificat folosind serviciul standard.", "login": "Autentificare", "loginbutton": "Logat!", @@ -34,7 +34,7 @@ "newaccount": "Cont nou", "newsitedescription": "Introduceți adresa URL a siteului dumneavoastră, dar există posibilitatea ca acesta să nu fie configurat pentru a funcționa cu această aplicație.", "notloggedin": "Trebuie să fiți logat.", - "password": "Cheie înscriere", + "password": "Parolă", "passwordrequired": "Este necesară introducerea parolei", "policyaccept": "Înţeleg şi sunt de acord", "policyagree": "Pentru a continua să folosiţi acest site, trebuie să fiţi de acord cu termenii de utilizare specificaţi. Sunteţi de acord?", @@ -52,7 +52,7 @@ "siteurlrequired": "Este necesară adresa URL a siteului, de exemplu http://www.yourmoodlesite.abc sau https://www.yourmoodlesite.efg", "startsignup": "Creează cont", "supplyinfo": "Detalii suplimentare", - "username": "Utilizator", + "username": "Nume de utilizator", "usernamerequired": "Este necesar numele de utilizator", "usernotaddederror": "Utilizatorul nu a fost adăugat - eroare", "webservicesnotenabled": "Serviciul Web nu este activat pe siteul dumneavoastră. Va rugăm să contactați administratorul siteului dumneavoastră dacă considerați ca ar trebui activat accesul pentru mobil." diff --git a/www/core/components/login/lang/ru.json b/www/core/components/login/lang/ru.json index cb180bd40f9..5581e5945d2 100644 --- a/www/core/components/login/lang/ru.json +++ b/www/core/components/login/lang/ru.json @@ -1,8 +1,8 @@ { "authenticating": "Аутентификация", - "cancel": "Отмена", + "cancel": "Отменить", "confirmdeletesite": "Вы уверены, что хотите удалить сайт {{sitename}}?", - "connect": "Подключено!", + "connect": "Подключить", "connecttomoodle": "Подключение к Moodle", "createaccount": "Сохранить", "createuserandpass": "Выберите имя пользователя и пароль", @@ -14,14 +14,14 @@ "errorupdatesite": "При обновлении ключа сайта произошла ошибка.", "firsttime": "Вы в первый раз на нашем сайте?", "getanothercaptcha": "Получить другой CAPTCHA (тест для различения людей и компьютеров)", - "help": "Справка", + "help": "Помощь", "helpmelogin": "

    Во всем мире есть тысячи сайтов Moodle. Это приложение может подключаться только к тем сайтам Moodle, на которых разрешен доступ конкретному виду мобильного приложения.

    Если Вы не можете подключиться к сайту Moodle, то необходимо связаться с администратором сайта, к которому Вы хотите подключиться, и попросить его прочитать http://docs.moodle.org/en/Mobile_app

    Чтобы проверить приложение на демо-сайте Moodle, выберите учитель или студент,введите URL-адрес сайта в соответствующее поле и нажмите кнопку «Добавить».

    ", "instructions": "Инструкции", "invalidaccount": "Пожалуйста, проверьте свои регистрационные данные или обратитесь к администратору сайта, чтобы он проверил настройки сайта.", "invalidemail": "Некорректный формат адреса электронной почты", "invalidmoodleversion": "Неверная версия Moodle. Минимальная требуемая версия - 2.4.", "invalidsite": "URL-адрес сайта недействителен.", - "invalidurl": "Некорректный URL", + "invalidurl": "Вы указали некорректный адрес", "login": "Вход", "loginbutton": "Вход!", "logininsiterequired": "Вы должны войти на сайт в окне браузера.", @@ -33,7 +33,7 @@ "newaccount": "Новая учетная запись", "newsitedescription": "Пожалуйста, введите URL-адрес своего сайта Moodle. Учтите, что он может быть не настроен для работы с этим приложением.", "notloggedin": "Вы должны быть идентифицированы.", - "password": "Общий секретный ключ", + "password": "Пароль", "passwordrequired": "Требуется пароль", "policyaccept": "Я понял(а) и согласен(на)", "policyagree": "Чтобы продолжить работу с этим сайтом, Вы должны принять Пользовательское соглашение. Вы согласны?", diff --git a/www/core/components/login/lang/sr-cr.json b/www/core/components/login/lang/sr-cr.json index d4ba2b2f360..02536b4de35 100644 --- a/www/core/components/login/lang/sr-cr.json +++ b/www/core/components/login/lang/sr-cr.json @@ -1,34 +1,56 @@ { "auth_email": "Самостална регистрација на основу е-адресе", "authenticating": "Провера идентитета", + "cancel": "Одустани", "checksiteversion": "Проверите да ли ваш сајт користи Moodle 2.4 или новију верзију.", "confirmdeletesite": "Да ли сте сигурни да желите да обришете сајт {{sitename}}?", - "connect": "Повежите се!", + "connect": "Успостави везу", "connecttomoodle": "Повежите се са Moodleom", "contactyouradministrator": "Обратите се администратору вашег сајта за даљу помоћ.", "contactyouradministratorissue": "Замолите администратора да провери следећи проблем: {{$a}}", + "createaccount": "Креирај мој нови кориснички налог", + "createuserandpass": "Изаберите своје корисничко име и лозинку за приступ систему", "credentialsdescription": "За пријаву на систем унесите своје корисничко име и лозинку.", - "emailconfirmsent": "

    Требало би да је послата порука на вашу е-адресу {{$a}}

    Порука садржи једноставна упутства о даљем поступку регистрације.

    Ако и даље имате проблема, обратите се администратору сајта.

    ", + "emailconfirmsent": "

    Требало би да је послата е-порука на вашу адресу {{$a}}

    \n

    Порука садржи једноставна упутства о даљем поступку регистрације.

    \n

    Ако и даље имате проблема, контактирајте администратора.

    ", "emailnotmatch": "Адресе е-поште се не поклапају", + "enterthewordsabove": "Унесите реч изнад", "erroraccesscontrolalloworigin": "Cross-Origin позив који покушавате да изведете је одбијен. Молимо, проверите https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", "errordeletesite": "Дошло је до грешке приликом брисања овог сајта. Молим, покушајте поново.", "errorupdatesite": "Дошло је до грешке приликом ажурирању токена сајта.", + "firsttime": "Да ли сте овде први пут?", + "getanothercaptcha": "Преузмите други CAPTCHА", + "help": "Помоћ", "helpmelogin": "

    Широм света постоји више хиљада Moodle сајтова. Ова апликација може се повезати само са Moodle сајтовима који су наменски омогућили приступ апликацијама за мобилне уређаје.

    Ако не можете да се повежете са вашим Moodle сајтом потребно је да се обратите Moodle администратору сајта са којим желите да се повежете и да га замолите да прочитаhttp://docs.moodle.org/en/Mobile_app

    За тестирање апликације на Moodle демо сајту унесите teacher или student у поље Адреса сајта и кликните на дугме Повежи се!.

    ", + "instructions": "Упутства", "invalidaccount": "Проверите своје податке за пријаву или замолите вашег администратора да провери конфигурацију сајта.", "invaliddate": "Неисправан датум", + "invalidemail": "Неисправна адреса електронске поште", "invalidmoodleversion": "Неисправна Moodle верзија. Неопходна је, минимално, верзија 2.4.", "invalidsite": "URL адреса сајт није исправна.", "invalidtime": "Неисправно време", + "invalidurl": "Неисправан url", "invalidvaluemax": "Максимална вредност је {{$a}}", "invalidvaluemin": "Минимална вредност је {{$a}}", "localmobileunexpectedresponse": "Провера Moodle Mobile додатних функционалности вратила је неочекиван одговор. Ваш идентитет биће проверен помоћу стандардног мобилнog сервиса.", "loggedoutssodescription": "Морате поново да потврдите свој идентитет. Потребно је да се пријавите на сајт у прозору веб читача.", + "login": "Пријава", "loginbutton": "Пријава", "logininsiterequired": "Потребно је да се пријавите на сајт у прозору веб читача.", + "loginsteps": "Како бисте имали пуни приступ овом сајту морате креирати кориснички налог.", + "missingemail": "Недостаје адреса е-поште", + "missingfirstname": "Недостаје име", + "missinglastname": "Недостаје презиме", "mobileservicesnotenabled": "Мобилни сервиси нису омогућени на вашем сајту. Обратите се администратору вашег Moodle сајта ако мислите да мобилни приступ треба да буде омогућен.", + "newaccount": "Нови кориснички налог", "newsitedescription": "Унесите URL адресу вашег Moodle сајта. Имајте на уму да сајт можда није конфигурисан да ради са овом апликацијом.", "notloggedin": "Морате бити пријављени.", + "password": "Лозинка", "passwordrequired": "Неопходна је лозинка", + "policyaccept": "Разумем и пристајем", + "policyagree": "Да би сте наставили коришћење овог сајта морате се сложити са правилима коришћења. Да ли се слажете?", + "policyagreement": "Сагласност са правилником о коришћењу сајта", + "policyagreementclick": "Линк ка правилнику о коришћењу сајта", + "potentialidps": "Пријавите се користећи свој налог на:", "problemconnectingerror": "Имамо проблема да се повежемо са", "problemconnectingerrorcontinue": "Добро проверите да ли сте правилно унели адресу и покушајте поново.", "profileinvaliddata": "Неисправна вредност", @@ -36,14 +58,20 @@ "reconnect": "Повежите се поново", "reconnectdescription": "Ваш токен за проверу идентитета је неисправан или је истекао. Морате поново да успоставите везу са сајтом.", "reconnectssodescription": "Ваш токен за проверу идентитета је неисправан или је истекао. Морате поново да успоставите везу са сајтом. Потребно је да се пријавите на сајт у прозору веб читача.", + "security_question": "Безбедносно питање", + "selectacountry": "Изабери државу", "signupplugindisabled": "{{$a}} није омогућен.", "siteaddress": "Адреса сајта", "siteinmaintenance": "Ваш сајт је у режиму одржавања", "sitepolicynotagreederror": "Сагласност са политиком сајта није потврђена.", "siteurl": "URL адреса сајта", "siteurlrequired": "Неопходна је URL адреса, нпр. http://www.yourmoodlesite.abc или https://www.yourmoodlesite.efg", + "startsignup": "Креирај нови налог", "stillcantconnect": "Још увек не можете да се повежете?", + "supplyinfo": "Више детаља", + "username": "Корисничко име", "usernamerequired": "Корисничко име је неопходно", + "usernotaddederror": "Корисник није додат - грешка", "visitchangepassword": "Да ли желите да посетите сајт како бисте променили лозинку?", "webservicesnotenabled": "Веб сервиси нису омогућени на вашем сајту. Обратите се администратору вашег Moodle сајта ако мислите да мобилни приступ треба да буде омогућен." } \ No newline at end of file diff --git a/www/core/components/login/lang/sr-lt.json b/www/core/components/login/lang/sr-lt.json index 63bb0dd2d9f..c6c52fd2e54 100644 --- a/www/core/components/login/lang/sr-lt.json +++ b/www/core/components/login/lang/sr-lt.json @@ -1,34 +1,56 @@ { "auth_email": "Samostalna registracija na osnovu e-adrese", "authenticating": "Provera identiteta", + "cancel": "Odustani", "checksiteversion": "Proverite da li vaš sajt koristi Moodle 2.4 ili noviju verziju.", "confirmdeletesite": "Da li ste sigurni da želite da obrišete sajt {{sitename}}?", - "connect": "Povežite se!", + "connect": "Uspostavi vezu", "connecttomoodle": "Povežite se sa Moodleom", "contactyouradministrator": "Obratite se administratoru vašeg sajta za dalju pomoć.", "contactyouradministratorissue": "Zamolite administratora da proveri sledeći problem: {{$a}}", + "createaccount": "Kreiraj moj novi korisnički nalog", + "createuserandpass": "Izaberite svoje korisničko ime i lozinku za pristup sistemu", "credentialsdescription": "Za prijavu na sistem unesite svoje korisničko ime i lozinku.", - "emailconfirmsent": "

    Trebalo bi da je poslata poruka na vašu e-adresu {{$a}}

    Poruka sadrži jednostavna uputstva o daljem postupku registracije.

    Ako i dalje imate problema, obratite se administratoru sajta.

    ", + "emailconfirmsent": "

    Trebalo bi da je poslata e-poruka na vašu adresu {{$a}}

    \n

    Poruka sadrži jednostavna uputstva o daljem postupku registracije.

    \n

    Ako i dalje imate problema, kontaktirajte administratora.

    ", "emailnotmatch": "Adrese e-pošte se ne poklapaju", + "enterthewordsabove": "Unesite reč iznad", "erroraccesscontrolalloworigin": "Cross-Origin poziv koji pokušavate da izvedete je odbijen. Molimo, proverite https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", "errordeletesite": "Došlo je do greške prilikom brisanja ovog sajta. Molim, pokušajte ponovo.", "errorupdatesite": "Došlo je do greške prilikom ažuriranju tokena sajta.", + "firsttime": "Da li ste ovde prvi put?", + "getanothercaptcha": "Preuzmite drugi CAPTCHA", + "help": "Pomoć", "helpmelogin": "

    Širom sveta postoji više hiljada Moodle sajtova. Ova aplikacija može se povezati samo sa Moodle sajtovima koji su namenski omogućili pristup aplikacijama za mobilne uređaje.

    Ako ne možete da se povežete sa vašim Moodle sajtom potrebno je da se obratite Moodle administratoru sajta sa kojim želite da se povežete i da ga zamolite da pročitahttp://docs.moodle.org/en/Mobile_app

    Za testiranje aplikacije na Moodle demo sajtu unesite teacher ili student u polje Adresa sajta i kliknite na dugme Poveži se!.

    ", + "instructions": "Uputstva", "invalidaccount": "Proverite svoje podatke za prijavu ili zamolite vašeg administratora da proveri konfiguraciju sajta.", "invaliddate": "Neispravan datum", + "invalidemail": "Neispravna adresa elektronske pošte", "invalidmoodleversion": "Neispravna Moodle verzija. Neophodna je, minimalno, verzija 2.4.", "invalidsite": "URL adresa sajt nije ispravna.", "invalidtime": "Neispravno vreme", + "invalidurl": "Neispravan url", "invalidvaluemax": "Maksimalna vrednost je {{$a}}", "invalidvaluemin": "Minimalna vrednost je {{$a}}", "localmobileunexpectedresponse": "Provera Moodle Mobile dodatnih funkcionalnosti vratila je neočekivan odgovor. Vaš identitet biće proveren pomoću standardnog mobilnog servisa.", "loggedoutssodescription": "Morate ponovo da potvrdite svoj identitet. Potrebno je da se prijavite na sajt u prozoru veb čitača.", + "login": "Prijava", "loginbutton": "Prijava", "logininsiterequired": "Potrebno je da se prijavite na sajt u prozoru veb čitača.", + "loginsteps": "Kako biste imali puni pristup ovom sajtu morate kreirati korisnički nalog.", + "missingemail": "Nedostaje adresa e-pošte", + "missingfirstname": "Nedostaje ime", + "missinglastname": "Nedostaje prezime", "mobileservicesnotenabled": "Mobilni servisi nisu omogućeni na vašem sajtu. Obratite se administratoru vašeg Moodle sajta ako mislite da mobilni pristup treba da bude omogućen.", + "newaccount": "Novi korisnički nalog", "newsitedescription": "Unesite URL adresu vašeg Moodle sajta. Imajte na umu da sajt možda nije konfigurisan da radi sa ovom aplikacijom.", "notloggedin": "Morate biti prijavljeni.", + "password": "Lozinka", "passwordrequired": "Neophodna je lozinka", + "policyaccept": "Razumem i pristajem", + "policyagree": "Da bi ste nastavili korišćenje ovog sajta morate se složiti sa pravilima korišćenja. Da li se slažete?", + "policyagreement": "Saglasnost sa pravilnikom o korišćenju sajta", + "policyagreementclick": "Link ka pravilniku o korišćenju sajta", + "potentialidps": "Prijavite se koristeći svoj nalog na:", "problemconnectingerror": "Imamo problema da se povežemo sa", "problemconnectingerrorcontinue": "Dobro proverite da li ste pravilno uneli adresu i pokušajte ponovo.", "profileinvaliddata": "Neispravna vrednost", @@ -36,14 +58,20 @@ "reconnect": "Povežite se ponovo", "reconnectdescription": "Vaš token za proveru identiteta je neispravan ili je istekao. Morate ponovo da uspostavite vezu sa sajtom.", "reconnectssodescription": "Vaš token za proveru identiteta je neispravan ili je istekao. Morate ponovo da uspostavite vezu sa sajtom. Potrebno je da se prijavite na sajt u prozoru veb čitača.", + "security_question": "Bezbednosno pitanje", + "selectacountry": "Izaberi državu", "signupplugindisabled": "{{$a}} nije omogućen.", "siteaddress": "Adresa sajta", "siteinmaintenance": "Vaš sajt je u režimu održavanja", "sitepolicynotagreederror": "Saglasnost sa politikom sajta nije potvrđena.", "siteurl": "URL adresa sajta", "siteurlrequired": "Neophodna je URL adresa, npr. http://www.yourmoodlesite.abc ili https://www.yourmoodlesite.efg", + "startsignup": "Kreiraj novi nalog", "stillcantconnect": "Još uvek ne možete da se povežete?", + "supplyinfo": "Više detalja", + "username": "Korisničko ime", "usernamerequired": "Korisničko ime je neophodno", + "usernotaddederror": "Korisnik nije dodat - greška", "visitchangepassword": "Da li želite da posetite sajt kako biste promenili lozinku?", "webservicesnotenabled": "Veb servisi nisu omogućeni na vašem sajtu. Obratite se administratoru vašeg Moodle sajta ako mislite da mobilni pristup treba da bude omogućen." } \ No newline at end of file diff --git a/www/core/components/login/lang/sv.json b/www/core/components/login/lang/sv.json index b4041bf5a3d..87c32b79e13 100644 --- a/www/core/components/login/lang/sv.json +++ b/www/core/components/login/lang/sv.json @@ -2,16 +2,16 @@ "authenticating": "Autentisera", "cancel": "Avbryt", "confirmdeletesite": "Är du säker på att du vill ta bort webbsidan {{sitename}}?", - "connect": "Anslut!", + "connect": "Anslut", "connecttomoodle": "Anslut till Moodle", "createaccount": "Skapa mitt nya konto", "createuserandpass": "Skapa ett nytt användarnamn och lösenord för att logga in med.", "credentialsdescription": "Ange ditt användarnamn och lösenord för att logga på", - "emailconfirmsent": "

    Vi har skickat ett e-postbrev som Du bör ha fått
    till Din adress på {{$a}}

    \n

    Det innehåller enkla instruktioner som hjälper Dig
    att fullfölja Din registrering.

    \n

    Om Du stöter på problem, är Du välkommen att
    kontakta den som ansvarar för webbplatsen.

    ", + "emailconfirmsent": "

    Vi har skickat ett e-postbrev som du bör ha fått
    till din adress på {{$a}}

    \n

    Det innehåller enkla instruktioner som hjälper dig
    att fullfölja din registrering.

    \n

    Om du stöter på problem, är du välkommen att
    kontakta den som ansvarar för webbplatsen.

    ", "enterthewordsabove": "Mata in de ovanstående orden", "errordeletesite": "Ett fel inträffade vid borttagning av denna webbsida. Var god försök igen.", "errorupdatesite": "Ett fel inträffade vid uppdatering av webbplatsens token.", - "firsttime": "Är det första gången Du är här?", + "firsttime": "Är det första gången du är här?", "getanothercaptcha": "Skaffa en CAPTCHA till", "help": "Hjälp", "helpmelogin": "

    För att logga in måste du kontrollera att: 1. Moodle webbplats är version 2.4 eller högre
    2. Moodle administratören har aktiverat Mobil åtkomst

    För att testa appen på en Moodle demo site skriv lärare eller elev i i fält för Användarnamn och klicka på Lägg till knapp . Besök Moodle webbplats för mer detaljerad Moodle information och hjälp. ", @@ -20,12 +20,12 @@ "invalidemail": "Ogiltig e-postadress", "invalidmoodleversion": "Ogiltig Moodle version. Lägsta version som krävs är", "invalidsite": "Den webbadress är ogiltig.", - "invalidurl": "Ogiltig url", + "invalidurl": "Den URL som du just matade in är inte giltig", "localmobileunexpectedresponse": "Kontrollen för Moodle mobila funktioner returnerade ett oväntat svar. Du kommer att autentiseras med mobila standard tjänsten.", - "login": "Logga in", + "login": "Inloggning", "loginbutton": "Logga In!", "logininsiterequired": "Du måste logga in på webbplatsen via en webbläsare", - "loginsteps": "Hej!\n
    \nDu måste bl.a. skapa ett nytt användarkonto på denna webbplats för att få tillgång till de kurser som Du vill delta i. Varje individuell kurs kan också ha en engångsnyckel \"kursnyckel\". Den behöver Du dock inte förrän senare.\n Så här skapar Du Ditt konto:\n

      \n
    1. Fyll i formuläret på sidan \nNytt konto med de efterfrågade\nuppgifterna om Dig själv.
    2. \n
    3. Ett e-postmeddelande kommer därefter\nomedelbart att sändas till\nDin e-postadress.
    4. \n
    5. Läs din e-post, och klicka på webblänken som den innehåller.
    6. \n
    7. Ditt konto kommer därmed att bekräftas\noch Du kommer att loggas in.
    8. \n
    9. Nu kan Du välja vilken kurs Du\nvill delta i.
    10. \n
    11. Om Du måste ange en \"kursnyckel\" - så\nfår Du använda den som Din lärare har\ngivit Dig. Med den kan Du registrera\nDig på en sådan kurs som kräver det.
    12. \n
    13. Nu kan Du använda hela kursen.\nFrån och med nu behöver Du bara skriva\nin Ditt användarnamn och lösenord\n(i formuläret till vänster på denna sida)\nför att logga in och för att nå de kurser\nsom Du är registrerad på.
    14. \n
    \nOBS! Genom att Du bekräftar kontot så samtycker\nDu till databehandling enligt Personuppgiftslagen.\nOm Du är osäker på vad det innebär så kan Du hitta\nmer information här: 'http://www.datainspektionen.se/lagar-och-regler/personuppgiftslagen/\n'\n\nLycka till!", + "loginsteps": "Hej!\n
    \nDu måste bl.a. skapa ett nytt användarkonto på denna webbplats för att få tillgång till de kurser som du vill delta i. Varje individuell kurs kan också ha en engångsnyckel \"kursnyckel\". Den behöver du dock inte förrän senare.\n Så här skapar du ditt konto:\n
      \n
    1. Fyll i formuläret på sidan \nNytt konto med de efterfrågade\nuppgifterna om dig själv.
    2. \n
    3. Ett e-postmeddelande kommer därefter\nomedelbart att sändas till\ndin e-postadress.
    4. \n
    5. Läs din e-post, och klicka på webblänken som den innehåller.
    6. \n
    7. Ditt konto kommer därmed att bekräftas\noch du kommer att loggas in.
    8. \n
    9. Nu kan du välja vilken kurs du\nvill delta i.
    10. \n
    11. Om du måste ange en \"kursnyckel\" - så\nfår du använda den som din lärare har\ngivit dig. Med den kan du registrera\ndig på en sådan kurs som kräver det.
    12. \n
    13. Nu kan du använda hela kursen.\nFrån och med nu behöver du bara skriva\nin ditt användarnamn och lösenord\n(i formuläret till vänster på denna sida)\nför att logga in och för att nå de kurser\nsom du är registrerad på.
    14. \n
    \nOBS! Genom att du bekräftar kontot så samtycker\ndu till databehandling enligt Personuppgiftslagen.\nOm du är osäker på vad det innebär så kan du hitta\nmer information här: 'http://www.datainspektionen.se/lagar-och-regler/personuppgiftslagen/\n'\n\nLycka till!", "missingemail": "E-postadress saknas", "missingfirstname": "Förnamn saknas", "missinglastname": "Efternamn saknas", @@ -33,10 +33,10 @@ "newaccount": "Nytt konto", "newsitedescription": "Ange webbadressen till din Moodle webbplats. Observera att den kan vara konfigurerad så att den inte fungerar med appen", "notloggedin": "Du måste vara inloggad.", - "password": "Lösenord", + "password": "Kursnyckel", "passwordrequired": "Lösenord krävs", "policyaccept": "Jag förstår och accepterar", - "policyagree": "Du måste acceptera denna policy för få fortsätta att använda denna webbplats. Accepterar Du denna policy?", + "policyagree": "Du måste acceptera denna policy för få fortsätta att använda denna webbplats. Accepterar du denna policy?", "policyagreement": "Avtal angående webbplatsens policy.", "policyagreementclick": "Klicka här för att läsa avtalet angående webbplatsens policy.", "potentialidps": "Logga in med ditt konto på:", diff --git a/www/core/components/login/lang/tr.json b/www/core/components/login/lang/tr.json index 46bf85328fd..f038892a59f 100644 --- a/www/core/components/login/lang/tr.json +++ b/www/core/components/login/lang/tr.json @@ -17,8 +17,8 @@ "invalidemail": "Geçersiz e-posta adresi", "invalidmoodleversion": "Geçersiz Moodle sürümü. Sitenizin Sürümünün şundan aşağı olmaması gerekir:", "invalidsite": "Bu site adresi geçersizdir.", - "invalidurl": "Geçersiz URL", - "login": "Giriş yap", + "invalidurl": "Girdiğiniz URL geçerli değil", + "login": "Giriş", "logininsiterequired": "Bir tarayıcı penceresinde siteye giriş yapmanız gerekiyor.", "loginsteps": "Bu siteye tam erişim için önce bir hesap oluşturmalısınız.", "missingemail": "E-posta adresi eksik", @@ -26,7 +26,7 @@ "missinglastname": "Soyadı eksik", "mobileservicesnotenabled": "Mobil Hizmetler sitenizde etkin değildir. Mobil erişimin etkin olduğunu düşünüyorsanız, Lütfen Moodle site yöneticinize başvurun.", "newaccount": "Yeni hesap", - "password": "Şifre", + "password": "Kayıt anahtarı", "passwordrequired": "Şifre zorunludur", "policyaccept": "Anladım ve kabul ediyorum", "policyagree": "Bu siteyi kullanmaya devam etmek için bu sözleşmeyi kabul etmelisiniz. Kabul ediyor musunuz?", diff --git a/www/core/components/login/lang/uk.json b/www/core/components/login/lang/uk.json index 1504411013a..ea30adb385f 100644 --- a/www/core/components/login/lang/uk.json +++ b/www/core/components/login/lang/uk.json @@ -4,14 +4,14 @@ "cancel": "Скасувати", "checksiteversion": "Переконайтеся, що ваш сайт використовує Moodle 2.4 або більш пізньої версії.", "confirmdeletesite": "Видалити сайт {{sitename}}?", - "connect": "З'єднано!", + "connect": "З’єднання", "connecttomoodle": "Підключитись до Moodle", "contactyouradministrator": "Зверніться до адміністратора сайту для подальшої допомоги.", "contactyouradministratorissue": "Будь ласка, зверніться до адміністратора, щоб перевірити наступне питання: {{$a}}", "createaccount": "Створити запис", "createuserandpass": "Створити користувача для входу в систему", "credentialsdescription": "Будь ласка, введіть Ваше ім'я користувача та пароль, щоб увійти в систему.", - "emailconfirmsent": "

    Лист повинен бути відправлений на Вашу електронну адресу в {{$a}}

    Він містить прості інструкції для завершення реєстрації.

    Якщо ви продовжуєте зазнавати труднощів, зверніться до адміністратора сайту.

    ", + "emailconfirmsent": "На зазначену Вами адресу електронної пошти ({{$a}}) було відправлено листа з інструкціями із завершення реєстрації. Якщо у Вас з'являться проблеми з реєстрацією, зв'яжіться з адміністратором сайту.", "emailnotmatch": "Email не співпадають", "enterthewordsabove": "Введіть символи, які бачите вище", "erroraccesscontrolalloworigin": "Cross-Origin дзвінок був відхилений. Будь ласка, перевірте https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -28,7 +28,7 @@ "invalidmoodleversion": "Невірна версія Moodle. Мінімальна версія 2.4.", "invalidsite": "URL сайту недійсний.", "invalidtime": "Невірний час", - "invalidurl": "Неправильний URL", + "invalidurl": "Введений вами URL неправильний", "invalidvaluemax": "Максимальне значення {{$a}}", "invalidvaluemin": "Мінімальне значення {{$a}}", "localmobileunexpectedresponse": "Moodle Mobile Additional Features при перевірці повернуло несподівану відповідь, ви будете проходити перевірку автентичності з використанням стандартного мобільного сервісу.", @@ -44,7 +44,7 @@ "newaccount": "Новий обліковий запис", "newsitedescription": "Будь ласка, введіть адресу вашого сайту Moodle. Зверніть увагу, що це може бути не налаштоване для роботи з цим додатком.", "notloggedin": "Ви повинні увійти в систему.", - "password": "Відкритий ключ", + "password": "Пароль", "passwordrequired": "Пароль необхідний", "policyaccept": "Я розумію та погоджуюся", "policyagree": "Ви повинні погодитися з цими правилами для використання цього сайту. Ви згодні?", @@ -69,7 +69,7 @@ "startsignup": "Створити новий обліковий запис", "stillcantconnect": "До сих пір не можете підключитися?", "supplyinfo": "Більше інформації", - "username": "Ім’я входу", + "username": "Псевдо", "usernamerequired": "Ім'я користувача необхідне", "usernotaddederror": "Користувач не доданий - помилка", "visitchangepassword": "Ви хочете відвідати сайт, щоб змінити пароль?", diff --git a/www/core/components/login/lang/zh-cn.json b/www/core/components/login/lang/zh-cn.json index 64f858f8e48..c52e6caccd2 100644 --- a/www/core/components/login/lang/zh-cn.json +++ b/www/core/components/login/lang/zh-cn.json @@ -15,8 +15,8 @@ "invalidemail": "Email地址无效", "invalidmoodleversion": "无效的Moodle版本。最低版本要求是:", "invalidsite": "网站URL是无效的。", - "invalidurl": "无效的 网页地址", - "login": "登录", + "invalidurl": "您刚刚输入的 URL 不合法", + "login": "登录您的账号", "logininsiterequired": "您需要在浏览器窗口中登录该站点。", "loginsteps": "为了能完全访问此网站,您首先需要创建一个帐户。", "missingemail": "Email地址没填", @@ -24,7 +24,7 @@ "missinglastname": "姓没填", "mobileservicesnotenabled": "您的站点没有启用移动服务,如果您觉得有必要开启移动接入功能,请与站点管理员联系。", "newaccount": "新帐号", - "password": "设置密码", + "password": "密码", "passwordrequired": "需要密码", "policyaccept": "我了解和同意了", "policyagree": "如要继续使用此站,您必须同意此协议。您同意么?", diff --git a/www/core/components/login/lang/zh-tw.json b/www/core/components/login/lang/zh-tw.json index bb2823d16de..3065f563403 100644 --- a/www/core/components/login/lang/zh-tw.json +++ b/www/core/components/login/lang/zh-tw.json @@ -4,14 +4,14 @@ "cancel": "取消", "checksiteversion": "請檢查您的網站是否使用Moodle 2.4或更高版本.", "confirmdeletesite": "您確定要刪除網站{{sitename}}嗎?", - "connect": "連線!", + "connect": "連結", "connecttomoodle": "連上Moodle平台", "contactyouradministrator": "連絡你的網站管理員以取得更多的協助.", "contactyouradministratorissue": "請求管理員檢查以下問題: {{$ a}}", "createaccount": "建立我的新帳號", "createuserandpass": "請選擇您的帳號名稱和密碼", "credentialsdescription": "請提供您的帳號和密碼以便登入", - "emailconfirmsent": "

    電子郵件應該已經寄到您的地址 {{$ a}}

    它包含簡單的說明, 可以完成註冊.

    如果, 您仍然有困難, 請與網站管理員聯繫.", + "emailconfirmsent": "

    本系統已經送出電子郵件到 {{$a}}

    \n

    訊息內容包含如何完成註冊手續。

    \n

    請閱覽您的私人郵件 按下確認連結後 便可登入本系統,若是有問題請和系統管理員連絡。

    ", "emailnotmatch": "電子郵件內容不符", "enterthewordsabove": "輸入您在上圖中看到的字元", "erroraccesscontrolalloworigin": "您嘗試執行的Cross-Origin呼叫已被拒絕. 請檢查https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", @@ -19,7 +19,7 @@ "errorupdatesite": "更新網站權杖時出錯.", "firsttime": "您第一次來訪嗎?", "getanothercaptcha": "換一個字詞", - "help": "輔助說明", + "help": "幫助", "helpmelogin": "

    要登入前請確認:

    1. Moodle 入口網站版本要是2.4或更高
    2. Moodle 入口網站管理員有啟用手機存取.

    想測試Moodle示範入口網站型態須輸入teacherstudentUsername 欄位並點選Add button.

    Moodle文件網站有更詳細的資料及協助

    ", "instructions": "使用說明", "invalidaccount": "請檢查您的登人資料或請您的網站管理員檢查網站設定。", @@ -28,11 +28,11 @@ "invalidmoodleversion": "無效的Moodle版本。至少需要的版本為2.4", "invalidsite": "這網站網址無效.", "invalidtime": "無效的時間", - "invalidurl": "無效的URL網址", + "invalidurl": "輸入的網址無效", "invalidvaluemax": "最大值為 {{$a}}", "invalidvaluemin": "最小值為 {{$a}}", "localmobileunexpectedresponse": "Moodle行動其他功能檢查返回了無預期的回應, 您將使用標準行動服務進行身份驗證.", - "login": "登入", + "login": "登入您的帳號", "loginbutton": "登入", "logininsiterequired": "您的Moodle網站強制您以系統瀏覽器開啟. 將開啟新瀏覽器, 並重新導向這Moodle網站.", "loginsteps": "您好!如果您尚未申請帳號,為了能完整使用本網站課程,您需要先花一兩分鐘時間申請一個新帳號。此外,部分課程在初次選課時,還需要輸入開課教師所設定的選課密碼。\n

    申請帳號請依下列步驟進行:

    \n
      \n
    1. 請於 申請新帳號 表單中輸入個人相關資料。
    2. \n
    3. 一封電子郵件會立刻寄送到您的信箱中。
    4. \n
    5. 讀取您的電子郵件,點按信件中的網址連結。
    6. \n
    7. 您的帳號將得到確認,並且立刻登入本網站。
    8. \n
    9. 然後,請選擇您想要參加的課程。
    10. \n
    11. 如果系統提示要選課密鑰,請輸入教師提供給您的選課密碼,這樣才能註冊到該課程中。
    12. \n
    13. 從此,您只要輸入個人的帳號與密碼〈在左邊的表單中〉,就可以進入任何一個您已選修的課程中。
    14. \n
    ", @@ -43,7 +43,7 @@ "newaccount": "新帳號", "newsitedescription": "請輸入您的Moodle平台網址. 注意平台需要先設定好才能使用這個應用程式.", "notloggedin": "你必須先登入", - "password": "共用密碼", + "password": "密碼", "passwordrequired": "需要密碼", "policyaccept": "我了解並且同意", "policyagree": "您必須同意這協議才能繼續使用這個網站。您同意嗎?", @@ -67,7 +67,7 @@ "startsignup": "申請一個新帳號", "stillcantconnect": "一直無法連線嗎?", "supplyinfo": "更多細節", - "username": "帳號", + "username": "用戶名稱", "usernamerequired": "需要帳號", "usernotaddederror": "無法新增用戶- 未知的錯誤", "visitchangepassword": "您需要去拜訪這個網站變更密碼嗎?", diff --git a/www/core/components/question/lang/ar.json b/www/core/components/question/lang/ar.json index b9b6af53575..f2bdf1cf476 100644 --- a/www/core/components/question/lang/ar.json +++ b/www/core/components/question/lang/ar.json @@ -1,14 +1,14 @@ { - "answer": "أجب", + "answer": "إجابة", "answersaved": "تم حفظ الإجابة", - "complete": "كامل", - "correct": "صح", - "feedback": "تقرير", - "incorrect": "خطاء", + "complete": "تم/كامل", + "correct": "صحيح/صح", + "feedback": "اجابة تقييمية", + "incorrect": "خطأ", "information": "معلومات", "invalidanswer": "إجابة غير مكتملة", - "notanswered": "لم تتم الأجابة بعد", - "notyetanswered": "لم يتم الاجابة بعد", + "notanswered": "لم يتم الاجابة عليه", + "notyetanswered": "لم يتم الاجابة عليه بعد", "partiallycorrect": "إجابة جزئية", "questionno": "سؤال {{$a}}", "requiresgrading": "يتطلب التصحيح", diff --git a/www/core/components/question/lang/bg.json b/www/core/components/question/lang/bg.json index f375fb3b363..332093fefd8 100644 --- a/www/core/components/question/lang/bg.json +++ b/www/core/components/question/lang/bg.json @@ -1,15 +1,15 @@ { "answer": "Отговор", "answersaved": "Отговорът съхранен", - "complete": "Завършен", - "correct": "Вярно", - "feedback": "Обратна връзка", + "complete": "Отговорен", + "correct": "Правилно", + "feedback": "Съобщение", "incorrect": "Неправилно", "information": "Информация", "invalidanswer": "Непълен отговор", - "notanswered": "Още няма отговори", - "notyetanswered": "Още без отговор", - "partiallycorrect": "Частично верен", + "notanswered": "Не е отговорен", + "notyetanswered": "Все още не е даден отговор", + "partiallycorrect": "Отчасти верен", "questionno": "Въпрос {{$a}}", "requiresgrading": "Изисква оценяване", "unknown": "Неизвестно" diff --git a/www/core/components/question/lang/ca.json b/www/core/components/question/lang/ca.json index e31c6bbe967..aece96d8870 100644 --- a/www/core/components/question/lang/ca.json +++ b/www/core/components/question/lang/ca.json @@ -1,21 +1,21 @@ { "answer": "Resposta", "answersaved": "Resposta desada", - "complete": "Complet", - "correct": "Correcta", + "complete": "Completa", + "correct": "Correcte", "errorattachmentsnotsupported": "L'aplicació encara no admet l'adjunció de fitxers.", "errorinlinefilesnotsupported": "L'aplicació encara no és compatible amb l'edició de fitxers en línia.", "errorquestionnotsupported": "L'aplicació no accepta aquest tipus de pregunta: {{$a}}.", "feedback": "Retroacció", "howtodraganddrop": "Feu un toc per seleccionar i feu un toc de nou per deixar anar.", - "incorrect": "Incorrecta", + "incorrect": "Incorrecte", "information": "Informació", "invalidanswer": "Resposta no vàlida o incompleta", - "notanswered": "No contestada encara", - "notyetanswered": "Encara no s'ha contestat", + "notanswered": "No s'ha respost", + "notyetanswered": "No s'ha respost encara", "partiallycorrect": "Parcialment correcte", "questionmessage": "Pregunta {{$a}}: {{$b}}", "questionno": "Pregunta {{$a}}", "requiresgrading": "Cal puntuar", - "unknown": "No es pot determinar l'estat" + "unknown": "Desconegut" } \ No newline at end of file diff --git a/www/core/components/question/lang/cs.json b/www/core/components/question/lang/cs.json index bbc66f32d73..ff6940799c5 100644 --- a/www/core/components/question/lang/cs.json +++ b/www/core/components/question/lang/cs.json @@ -1,21 +1,21 @@ { "answer": "Odpověď", "answersaved": "Odpověď uložena", - "complete": "Splněno", - "correct": "Správná odpověď", + "complete": "Hotovo", + "correct": "Správně", "errorattachmentsnotsupported": "Aplikace ještě nepodporuje připojování souborů k odpovědím.", "errorinlinefilesnotsupported": "Aplikace ještě nepodporuje úpravy vložených souborů.", "errorquestionnotsupported": "Tento typ úlohy není aplikací podporován: {{$a}}.", - "feedback": "Komentář", + "feedback": "Hodnocení", "howtodraganddrop": "Klepnutím vyberte potom klepněte na místo umístění.", - "incorrect": "Nesprávná odpověď", + "incorrect": "Nesprávně", "information": "Informace", "invalidanswer": "Neúplná odpověď", - "notanswered": "Dosud nezodpovězeno", + "notanswered": "Nezodpovězeno", "notyetanswered": "Dosud nezodpovězeno", - "partiallycorrect": "Částečně správná odpověď", + "partiallycorrect": "Částečně správně", "questionmessage": "Úloha {{$a}}: {{$b}}", "questionno": "Úloha {{$a}}", "requiresgrading": "Vyžaduje hodnocení", - "unknown": "Stav nelze určit" + "unknown": "Neznámý" } \ No newline at end of file diff --git a/www/core/components/question/lang/da.json b/www/core/components/question/lang/da.json index 843f20d8b39..d2bbaa071f2 100644 --- a/www/core/components/question/lang/da.json +++ b/www/core/components/question/lang/da.json @@ -1,15 +1,15 @@ { "answer": "Svar", "answersaved": "Besvaret", - "complete": "Færdiggør", + "complete": "Gennemført", "correct": "Rigtigt", - "feedback": "Tilbagemelding", + "feedback": "Feedback", "incorrect": "Forkert", "information": "Information", "invalidanswer": "Ufuldstændigt svar", - "notanswered": "Ikke besvaret endnu", - "notyetanswered": "Endnu ikke besvaret", - "partiallycorrect": "Delvist rigtigt", + "notanswered": "Ikke besvaret", + "notyetanswered": "Ikke besvaret", + "partiallycorrect": "Delvis rigtigt", "questionno": "Spørgsmål {{$a}}", "requiresgrading": "Kræver bedømmelse", "unknown": "Ukendt" diff --git a/www/core/components/question/lang/de.json b/www/core/components/question/lang/de.json index 8e1a1ff2bc6..a248f6250e5 100644 --- a/www/core/components/question/lang/de.json +++ b/www/core/components/question/lang/de.json @@ -1,21 +1,21 @@ { "answer": "Antwort", "answersaved": "Antwort gespeichert", - "complete": "Fertig", + "complete": "Vollständig", "correct": "Richtig", "errorattachmentsnotsupported": "Die App erlaubt keine Antworten mit Dateianhängen.", "errorinlinefilesnotsupported": "Die App unterstützt keine Bearbeitung von integrierten Dateien.", "errorquestionnotsupported": "Die App unterstützt diesen Fragetyp nicht: {{$a}}.", - "feedback": "Rückmeldung", + "feedback": "Feedback", "howtodraganddrop": "Tippen Sie zum Auswählen und tippen Sie noch einmal zum Ablegen.", "incorrect": "Falsch", "information": "Information", "invalidanswer": "Unvollständige Antwort", - "notanswered": "Nicht abgestimmt", - "notyetanswered": "unbeantwortet", + "notanswered": "Nicht beantwortet", + "notyetanswered": "Bisher nicht beantwortet", "partiallycorrect": "Teilweise richtig", "questionmessage": "Frage {{$a}}: {{$b}}", "questionno": "Frage {{$a}}", "requiresgrading": "Bewertung notwendig", - "unknown": "Der Status kann nicht bestimmt werden." + "unknown": "Unbekannt" } \ No newline at end of file diff --git a/www/core/components/question/lang/el.json b/www/core/components/question/lang/el.json index 283d84af335..13546545b41 100644 --- a/www/core/components/question/lang/el.json +++ b/www/core/components/question/lang/el.json @@ -6,14 +6,14 @@ "errorattachmentsnotsupported": "Η εφαρμογή δεν υποστηρίζει ακόμα την προσάρτηση αρχείων σε απαντήσεις.", "errorinlinefilesnotsupported": "Η εφαρμογή δεν υποστηρίζει ακόμα την επεξεργασία αρχείων.", "errorquestionnotsupported": "Αυτός ο τύπος ερωτήματος δεν υποστηρίζεται από την εφαρμογή: {{$a}}.", - "feedback": "Ανάδραση", + "feedback": "Επανατροφοδότηση", "howtodraganddrop": "Πατήστε για να επιλέξετε και στη συνέχεια, πατήστε για να αφήσετε.", "incorrect": "Λάθος", "invalidanswer": "Ημιτελής απάντηση", - "notanswered": "Δεν απαντήθηκε ακόμα", + "notanswered": "Δεν απαντήθηκε", "notyetanswered": "Δεν έχει απαντηθεί ακόμα", "partiallycorrect": "Μερικώς σωστή", "questionmessage": "Ερώτηση {{$a}}: {{$b}}", "questionno": "Ερώτηση {{$a}}", - "unknown": "Δεν είναι δυνατός ο προσδιορισμός της κατάστασης" + "unknown": "Άγνωστο" } \ No newline at end of file diff --git a/www/core/components/question/lang/es-mx.json b/www/core/components/question/lang/es-mx.json index c9008738aea..f304a7602ec 100644 --- a/www/core/components/question/lang/es-mx.json +++ b/www/core/components/question/lang/es-mx.json @@ -1,21 +1,21 @@ { "answer": "Respuesta", "answersaved": "Respuesta guardada", - "complete": "Completado", - "correct": "Correcto", + "complete": "Completada", + "correct": "Correcta", "errorattachmentsnotsupported": "La aplicación todavía no soporta anexarle archivos a las respuestas.", "errorinlinefilesnotsupported": "La aplicación aun no soporta el editar archivos en-línea.", "errorquestionnotsupported": "Este tipo de pregunta no está soportada por la App: {{$a}}.", - "feedback": "Comentario de retroalimentación", + "feedback": "Retroalimentación", "howtodraganddrop": "Tocar para seleccionar y tocar para soltar", "incorrect": "Incorrecta", "information": "Información", "invalidanswer": "Respuesta incompleta", - "notanswered": "Sin contestar aún", - "notyetanswered": "Aún no se ha dado respuesta", - "partiallycorrect": "Parcialmente correcto", + "notanswered": "Sin contestar", + "notyetanswered": "Sin responder aún", + "partiallycorrect": "Parcialmente correcta", "questionmessage": "Pregunta {{$a}}: {{$b}}", "questionno": "Pregunta {{$a}}", "requiresgrading": "Requiere re-calificar", - "unknown": "No se puede determinar el estatus" + "unknown": "Desconocido" } \ No newline at end of file diff --git a/www/core/components/question/lang/es.json b/www/core/components/question/lang/es.json index d42f0b106e2..eca0b6c7e61 100644 --- a/www/core/components/question/lang/es.json +++ b/www/core/components/question/lang/es.json @@ -1,21 +1,21 @@ { "answer": "Respuesta", "answersaved": "Respuesta guardada", - "complete": "Completado", - "correct": "Correcto", + "complete": "Finalizado", + "correct": "Correcta", "errorattachmentsnotsupported": "La aplicación no soporta adjuntar archivos a respuestas todavía.", "errorinlinefilesnotsupported": "La aplicación aun no soporta el editar archivos en-línea.", "errorquestionnotsupported": "Este tipo de pregunta no está soportada por la aplicación: {{$a}}.", - "feedback": "Comentario", + "feedback": "Retroalimentación", "howtodraganddrop": "Tocar para seleccionar y tocar para soltar.", "incorrect": "Incorrecta", "information": "Información", "invalidanswer": "Respuesta incompleta", - "notanswered": "Sin contestar aún", - "notyetanswered": "Aún no se ha dado respuesta", - "partiallycorrect": "Parcialmente correcto", + "notanswered": "Sin contestar", + "notyetanswered": "Sin responder aún", + "partiallycorrect": "Parcialmente correcta", "questionmessage": "Pregunta {{$a}}: {{$b}}", "questionno": "Pregunta {{$a}}", "requiresgrading": "Requiere calificación", - "unknown": "No se puede determinar el estado." + "unknown": "Desconocido" } \ No newline at end of file diff --git a/www/core/components/question/lang/eu.json b/www/core/components/question/lang/eu.json index d47acec2068..01be6f02930 100644 --- a/www/core/components/question/lang/eu.json +++ b/www/core/components/question/lang/eu.json @@ -1,21 +1,21 @@ { - "answer": "Erantzun", + "answer": "Erantzuna", "answersaved": "Erantzuna gorde da", - "complete": "Osoa", + "complete": "Osatu", "correct": "Zuzena", "errorattachmentsnotsupported": "App-ak oraindik ez du erantzunei fitxategiak eranstea onartzen.", "errorinlinefilesnotsupported": "App-ak oraindik ez du fitxategien lerro-arteko edizioa onartzen.", "errorquestionnotsupported": "Galdera mota hau ez dago app-an onartuta: {{$a}}", "feedback": "Feedbacka", "howtodraganddrop": "Sakatu aukeratzeko eta ondoren sakatu ezabatzeko.", - "incorrect": "Ez zuzena", + "incorrect": "Okerra", "information": "Informazioa", "invalidanswer": "Erantzuna ez dago osorik", - "notanswered": "Oraindik erantzun gabe", + "notanswered": "Erantzun gabea", "notyetanswered": "Erantzun gabea", "partiallycorrect": "Zuzena zati batean", "questionmessage": "{{$a}} galdera: {{$b}}", "questionno": "{{$a}} galdera", "requiresgrading": "Kalifikazioa behar du", - "unknown": "Ezin da egoera zehaztu" + "unknown": "Ezezaguna" } \ No newline at end of file diff --git a/www/core/components/question/lang/fa.json b/www/core/components/question/lang/fa.json index bf1d5eba5a2..64e56570cf2 100644 --- a/www/core/components/question/lang/fa.json +++ b/www/core/components/question/lang/fa.json @@ -1,15 +1,15 @@ { - "answer": "جواب", + "answer": "پاسخ", "answersaved": "پاسخ ذخیره شده", "complete": "کامل", - "correct": "صحیح", + "correct": "درست", "feedback": "بازخورد", "incorrect": "نادرست", "information": "توضیح", "invalidanswer": "پاسخ ناقص", - "notanswered": "هنوز پاسخ نداده‌اند", + "notanswered": "پاسخ داده نشده", "notyetanswered": "هنوز پاسخ داده نشده است", - "partiallycorrect": "نیمه درست", + "partiallycorrect": "پاسخ نیمه درست", "questionno": "سؤال {{$a}}", "requiresgrading": "نمره‌دهی لازم است", "unknown": "نامعلوم" diff --git a/www/core/components/question/lang/fr.json b/www/core/components/question/lang/fr.json index 53fa708cca6..82dddeba70a 100644 --- a/www/core/components/question/lang/fr.json +++ b/www/core/components/question/lang/fr.json @@ -1,7 +1,7 @@ { "answer": "Réponse", "answersaved": "Réponse enregistrée", - "complete": "Complet", + "complete": "Terminer", "correct": "Correct", "errorattachmentsnotsupported": "L'application ne permet pas encore d'annexer des fichiers aux réponses.", "errorinlinefilesnotsupported": "L'app ne permet pas encore la modification de fichiers en ligne.", @@ -11,11 +11,11 @@ "incorrect": "Incorrect", "information": "Description", "invalidanswer": "Réponse incomplète", - "notanswered": "Pas encore répondu", + "notanswered": "Non répondue", "notyetanswered": "Pas encore répondu", "partiallycorrect": "Partiellement correct", "questionmessage": "Question {{$a}} : {{$b}}", "questionno": "Question {{$a}}", "requiresgrading": "Nécessite évaluation", - "unknown": "Impossible de déterminer l'état" + "unknown": "Inconnu" } \ No newline at end of file diff --git a/www/core/components/question/lang/he.json b/www/core/components/question/lang/he.json index 1761f82c521..2d12cd98d1f 100644 --- a/www/core/components/question/lang/he.json +++ b/www/core/components/question/lang/he.json @@ -2,14 +2,14 @@ "answer": "תשובה", "answersaved": "תשובה נשמרה", "complete": "הושלם", - "correct": "נכון", - "feedback": "תגובות", - "incorrect": "לא נכון", + "correct": "תקין", + "feedback": "משוב", + "incorrect": "שגוי", "information": "מידע", "invalidanswer": "תשובה שלא הושלמה", - "notanswered": "שאלה זו טרם נענתה", - "notyetanswered": "עדין לא ענו", - "partiallycorrect": "תשובה נכונה חלקית", + "notanswered": "לא נענה", + "notyetanswered": "שאלה זו טרם נענתה", + "partiallycorrect": "נכון באופן חלקי", "questionno": "שאלה {{$a}}", "requiresgrading": "נדרש מתן ציון", "unknown": "לא ידוע" diff --git a/www/core/components/question/lang/hu.json b/www/core/components/question/lang/hu.json index 649b1988ef4..04328cffde1 100644 --- a/www/core/components/question/lang/hu.json +++ b/www/core/components/question/lang/hu.json @@ -1,14 +1,14 @@ { "answer": "Válasz", "answersaved": "A válasz elmentve", - "complete": "Teljes", + "complete": "Kész", "correct": "Helyes", "feedback": "Visszajelzés", "incorrect": "Hibás", "information": "Információ", "invalidanswer": "Hiányos válasz", - "notanswered": "Még nincs válasz", - "notyetanswered": "Megválaszolatlan", + "notanswered": "Nincs rá válasz", + "notyetanswered": "Még nincs rá válasz", "partiallycorrect": "Részben helyes", "questionno": "{{$a}}. kérdés", "requiresgrading": "Pontozandó", diff --git a/www/core/components/question/lang/it.json b/www/core/components/question/lang/it.json index 364ddbf3b09..23bcbb55847 100644 --- a/www/core/components/question/lang/it.json +++ b/www/core/components/question/lang/it.json @@ -2,16 +2,16 @@ "answer": "Risposta", "answersaved": "Risposta salvata", "complete": "Completo", - "correct": "Giusto", - "feedback": "Commento", - "incorrect": "Sbagliato", + "correct": "Risposta corretta", + "feedback": "Feedback", + "incorrect": "Risposta errata", "information": "Informazione", "invalidanswer": "Risposta incompleta", - "notanswered": "Senza scelta", - "notyetanswered": "Senza risposta", - "partiallycorrect": "Parzialmente corretto", + "notanswered": "Risposta non data", + "notyetanswered": "Risposta non ancora data", + "partiallycorrect": "Parzialmente corretta", "questionmessage": "Domanda {{$a}}: {{$b}}", "questionno": "Domanda {{$a}}", "requiresgrading": "Richiede valutazione", - "unknown": "Non è possibile determinare lo stato" + "unknown": "Sconosciuto" } \ No newline at end of file diff --git a/www/core/components/question/lang/ja.json b/www/core/components/question/lang/ja.json index ecce8b3b1e0..83e300c2604 100644 --- a/www/core/components/question/lang/ja.json +++ b/www/core/components/question/lang/ja.json @@ -1,15 +1,15 @@ { - "answer": "回答", + "answer": "答え", "answersaved": "解答保存", - "complete": "詳細", + "complete": "完了", "correct": "正解", "feedback": "フィードバック", "howtodraganddrop": "選んだものをタッチして、あてはまる所にタッチして入れましょう。", "incorrect": "不正解", "information": "情報", "invalidanswer": "不完全な答え", - "notanswered": "未投票", - "notyetanswered": "未回答", + "notanswered": "未解答", + "notyetanswered": "未解答", "partiallycorrect": "部分的に正解", "questionmessage": "問題 {{$a}}: {{$b}}", "questionno": "問題 {{$a}}", diff --git a/www/core/components/question/lang/lt.json b/www/core/components/question/lang/lt.json index 4e598e09955..fc31749789f 100644 --- a/www/core/components/question/lang/lt.json +++ b/www/core/components/question/lang/lt.json @@ -1,21 +1,21 @@ { - "answer": "Atsakyti", + "answer": "Atsakymas", "answersaved": "Atsakymas išsaugotas", - "complete": "Užbaigti", - "correct": "Teisingas", + "complete": "Baigta", + "correct": "Teisinga", "errorattachmentsnotsupported": "Programėlė nepalaiko pridėtų failų.", "errorinlinefilesnotsupported": "Programėlė nepalaiko redaguojamų failų", "errorquestionnotsupported": "Šis klausimo tipas programėlėje nepalaikomas: {{$a}}.", - "feedback": "Atsiliepimas", + "feedback": "Grįžtamasis ryšys", "howtodraganddrop": "Paspauskite pasirinkimui, tada perneškite.", - "incorrect": "Klaidinga", + "incorrect": "Neteisinga", "information": "Informacija", "invalidanswer": "Nepilnas atsakymas", - "notanswered": "Dar neatsakyta", - "notyetanswered": "Dar neatsakyta", + "notanswered": "Neatsakyta", + "notyetanswered": "Neatsakyta", "partiallycorrect": "Iš dalies teisingas", "questionmessage": "Klausimas {{$a}}: {{$b}}", "questionno": "Klausimas {{$a}}", "requiresgrading": "Reikia vertinimo", - "unknown": "Negalima nustatyti statuso" + "unknown": "Nežinoma" } \ No newline at end of file diff --git a/www/core/components/question/lang/nl.json b/www/core/components/question/lang/nl.json index 18382e872c6..48faa456e67 100644 --- a/www/core/components/question/lang/nl.json +++ b/www/core/components/question/lang/nl.json @@ -1,21 +1,21 @@ { "answer": "Antwoord", "answersaved": "Antwoord bewaard", - "complete": "Voltooid", + "complete": "Volledig", "correct": "Juist", "errorattachmentsnotsupported": "De applicatie ondersteunt nog geen blijlagen bij antwoorden.", "errorinlinefilesnotsupported": "Deze applicatie ondersteunt het inline bewerken van bestanden nog niet.", "errorquestionnotsupported": "Dit vraagtype wordt nog niet ondersteund door de app: {{$a}}.", "feedback": "Feedback", "howtodraganddrop": "Tik om te selecteren en tik om neer te zetten.", - "incorrect": "Niet juist", + "incorrect": "Fout", "information": "Informatie", "invalidanswer": "Onvolledig antwoord", - "notanswered": "Nog niet beantwoord", + "notanswered": "Niet beantwoord", "notyetanswered": "Nog niet beantwoord", "partiallycorrect": "Gedeeltelijk juist", "questionmessage": "Vraag {{$a}}: {{$b}}", "questionno": "Vraag {{$a}}", "requiresgrading": "Beoordelen vereist", - "unknown": "Kan status niet bepalen" + "unknown": "Onbekend" } \ No newline at end of file diff --git a/www/core/components/question/lang/pl.json b/www/core/components/question/lang/pl.json index 6e060784dd2..1371ba6c9df 100644 --- a/www/core/components/question/lang/pl.json +++ b/www/core/components/question/lang/pl.json @@ -1,14 +1,14 @@ { - "answer": "Odpowiedz", + "answer": "Odpowiedź", "answersaved": "Odpowiedź zapisana", - "complete": "Pełna wersja", + "complete": "Zakończone", "correct": "Poprawnie", "feedback": "Informacja zwrotna", - "incorrect": "Niepoprawnie", + "incorrect": "Niepoprawny(a)", "information": "Informacja", "invalidanswer": "Niekompletna odpowiedź", - "notanswered": "Jeszcze nie udzielono odpowiedzi", - "notyetanswered": "Brak odpowiedzi", + "notanswered": "Nie udzielono odpowiedzi", + "notyetanswered": "Nie udzielono odpowiedzi", "partiallycorrect": "Częściowo poprawnie", "questionno": "Pytanie {{$a}}", "requiresgrading": "Wymaga oceny", diff --git a/www/core/components/question/lang/pt-br.json b/www/core/components/question/lang/pt-br.json index 4f7986546d1..f5b6766c1a6 100644 --- a/www/core/components/question/lang/pt-br.json +++ b/www/core/components/question/lang/pt-br.json @@ -1,21 +1,21 @@ { "answer": "Resposta", "answersaved": "Resposta salva", - "complete": "Concluído", + "complete": "Completo", "correct": "Correto", "errorattachmentsnotsupported": "O aplicativo ainda não suporta anexar arquivos à resposta.", "errorinlinefilesnotsupported": "O aplicativo ainda não suporta a edição direta de arquivos.", "errorquestionnotsupported": "Esse tipo de questão não é suportada pelo aplicativo: {{$a}}.", - "feedback": "Comentários", + "feedback": "Feedback", "howtodraganddrop": "Toque para selecionar e então toque para soltar.", - "incorrect": "Errado", + "incorrect": "Incorreto", "information": "Informação", "invalidanswer": "Resposta incompleta", - "notanswered": "Nenhuma resposta", - "notyetanswered": "Ainda não respondeu", - "partiallycorrect": "Parcialmente correta", + "notanswered": "Não respondido", + "notyetanswered": "Ainda não respondida", + "partiallycorrect": "Parcialmente correto", "questionmessage": "Questão {{$a}}: {{$b}}", "questionno": "Questão {{$a}}", "requiresgrading": "Requer avaliação", - "unknown": "Não pôde determinar o estado" + "unknown": "Desconhecido" } \ No newline at end of file diff --git a/www/core/components/question/lang/pt.json b/www/core/components/question/lang/pt.json index abe2dc4c3bd..f0f684b92dd 100644 --- a/www/core/components/question/lang/pt.json +++ b/www/core/components/question/lang/pt.json @@ -1,21 +1,21 @@ { "answer": "Resposta", "answersaved": "Resposta guardada", - "complete": "Completo", + "complete": "Respondida", "correct": "Correto", "errorattachmentsnotsupported": "A aplicação ainda não suporta anexar ficheiros a respostas.", "errorinlinefilesnotsupported": "A aplicação ainda não suporta a edição de ficheiros online.", "errorquestionnotsupported": "Este tipo de pergunta não é suportado pela aplicação: {{$a}}.", - "feedback": "Comentários", + "feedback": "Feedback", "howtodraganddrop": "Toque para selecionar e depois toque para largar.", "incorrect": "Incorreto", "information": "Informação", "invalidanswer": "Resposta incompleta", - "notanswered": "Ainda não respondeu", + "notanswered": "Não respondida", "notyetanswered": "Por responder", "partiallycorrect": "Parcialmente correto", "questionmessage": "Pergunta {{$a}}: {{$b}}", "questionno": "Pergunta {{$a}}", "requiresgrading": "Requer avaliação", - "unknown": "Não é possível determinar o estado" + "unknown": "Desconhecido(a)" } \ No newline at end of file diff --git a/www/core/components/question/lang/ro.json b/www/core/components/question/lang/ro.json index a1bb7b725d9..f840f76f587 100644 --- a/www/core/components/question/lang/ro.json +++ b/www/core/components/question/lang/ro.json @@ -1,15 +1,15 @@ { - "answer": "Răspunde", + "answer": "Răspuns", "answersaved": "Răspuns salvat", - "complete": "Finalizează", + "complete": "Complet", "correct": "Corect", "feedback": "Feedback", "incorrect": "Incorect", "information": "Informații", "invalidanswer": "Răspuns incomplet", - "notanswered": "Nu a fost rezolvat încă", - "notyetanswered": "Incă nu s-a răspuns", - "partiallycorrect": "Parţial corect", + "notanswered": "Nu a primit răspuns", + "notyetanswered": "Nu a primit răspuns încă", + "partiallycorrect": "Parțial corect", "questionno": "Întrebare {{$a}}", "requiresgrading": "Trebuie să fie notată", "unknown": "Necunoscut" diff --git a/www/core/components/question/lang/ru.json b/www/core/components/question/lang/ru.json index 68d3259d734..fc2cd8ee320 100644 --- a/www/core/components/question/lang/ru.json +++ b/www/core/components/question/lang/ru.json @@ -1,15 +1,15 @@ { "answer": "Ответ", "answersaved": "Ответ сохранен", - "complete": "Завершено", + "complete": "Выполнен", "correct": "Верно", "feedback": "Отзыв", "incorrect": "Неверно", "information": "Информация", "invalidanswer": "Неполный ответ", - "notanswered": "Еще не ответили", + "notanswered": "Нет ответа", "notyetanswered": "Пока нет ответа", - "partiallycorrect": "Частично верно", + "partiallycorrect": "Частично правильный", "questionno": "Вопрос {{$a}}", "requiresgrading": "Требуется оценивание", "unknown": "неизвестно" diff --git a/www/core/components/question/lang/sr-cr.json b/www/core/components/question/lang/sr-cr.json index ffe53b968b1..eb8373f0d60 100644 --- a/www/core/components/question/lang/sr-cr.json +++ b/www/core/components/question/lang/sr-cr.json @@ -1,8 +1,21 @@ { + "answer": "Одговор", + "answersaved": "Одговор је сачуван", + "complete": "Потпуно", + "correct": "Тачно", "errorattachmentsnotsupported": "Апликација још увек не подржава могућност да се датотеке придруже уз одговоре.", "errorinlinefilesnotsupported": "Апликација још увек не подржава уређивање унутар датотека.", "errorquestionnotsupported": "Апликација не подржава овај тип питања: {{$a}}.", + "feedback": "Повратне информације", "howtodraganddrop": "Додирните за избор, затим још једном за спуштање.", + "incorrect": "Нетачно", + "information": "Информација", + "invalidanswer": "Непотпун одговор", + "notanswered": "Још нису одговорили", + "notyetanswered": "Није још одговорено", + "partiallycorrect": "Делимично тачно", "questionmessage": "Питање {{$a}}: {{$b}}", - "unknown": "Није могуће утврдити статус" + "questionno": "Питање {{$a}}", + "requiresgrading": "Захтева оцењивање", + "unknown": "Непознато" } \ No newline at end of file diff --git a/www/core/components/question/lang/sr-lt.json b/www/core/components/question/lang/sr-lt.json index 938634ec0ad..cd455cf48ae 100644 --- a/www/core/components/question/lang/sr-lt.json +++ b/www/core/components/question/lang/sr-lt.json @@ -1,8 +1,21 @@ { + "answer": "Odgovor", + "answersaved": "Odgovor je sačuvan", + "complete": "Potpuno", + "correct": "Tačno", "errorattachmentsnotsupported": "Aplikacija još uvek ne podržava mogućnost da se datoteke pridruže uz odgovore.", "errorinlinefilesnotsupported": "Aplikacija još uvek ne podržava uređivanje unutar datoteka.", "errorquestionnotsupported": "Aplikacija ne podržava ovaj tip pitanja: {{$a}}.", + "feedback": "Povratne informacije", "howtodraganddrop": "Dodirnite za izbor, zatim još jednom za spuštanje.", + "incorrect": "Netačno", + "information": "Informacija", + "invalidanswer": "Nepotpun odgovor", + "notanswered": "Još nisu odgovorili", + "notyetanswered": "Nije još odgovoreno", + "partiallycorrect": "Delimično tačno", "questionmessage": "Pitanje {{$a}}: {{$b}}", - "unknown": "Nije moguće utvrditi status" + "questionno": "Pitanje {{$a}}", + "requiresgrading": "Zahteva ocenjivanje", + "unknown": "Nepoznato" } \ No newline at end of file diff --git a/www/core/components/question/lang/sv.json b/www/core/components/question/lang/sv.json index c5026909e1f..9ef56c4f049 100644 --- a/www/core/components/question/lang/sv.json +++ b/www/core/components/question/lang/sv.json @@ -4,11 +4,11 @@ "complete": "Komplett", "correct": "Rätt", "feedback": "Återkoppling", - "incorrect": "Felaktigt", + "incorrect": "Felaktig", "information": "Information", "invalidanswer": "Ofullständigt svar", - "notanswered": "Inte ännu besvarad", - "notyetanswered": "Ännu inte besvarad", + "notanswered": "Ej besvarad", + "notyetanswered": "Inte besvarad än", "partiallycorrect": "Delvis korrekt", "questionno": "Fråga {{$a}}", "requiresgrading": "Kräver rättning", diff --git a/www/core/components/question/lang/tr.json b/www/core/components/question/lang/tr.json index 6de0e3edb23..08d1222bac0 100644 --- a/www/core/components/question/lang/tr.json +++ b/www/core/components/question/lang/tr.json @@ -1,14 +1,14 @@ { - "answer": "Yanıt", + "answer": "Cevap", "answersaved": "Cevap kaydedildi", - "complete": "Tamamlanmış", + "complete": "Tamamlandı", "correct": "Doğru", - "feedback": "Geri bildirim", + "feedback": "Geribildirim", "incorrect": "Yanlış", "information": "Bilgi", "invalidanswer": "Tamamlanmamış cevap", - "notanswered": "Henüz yanıtlanmadı", - "notyetanswered": "Henüz yanıtlanmamış", + "notanswered": "Cevaplanmadı", + "notyetanswered": "Henüz cevaplanmadı", "partiallycorrect": "Kısmen doğru", "questionno": "Soru {{$a}}", "requiresgrading": "Notlandırma gerekir", diff --git a/www/core/components/question/lang/uk.json b/www/core/components/question/lang/uk.json index a4c6af3fe0f..c883b7f6b21 100644 --- a/www/core/components/question/lang/uk.json +++ b/www/core/components/question/lang/uk.json @@ -6,16 +6,16 @@ "errorattachmentsnotsupported": "Додаток не підтримує прикріплення файлів відповідей", "errorinlinefilesnotsupported": "Додаток ще не підтримує редагування вбудованих файлів.", "errorquestionnotsupported": "Цей тип питання не підтримується додатком: {{$a}}.", - "feedback": "Відгук", + "feedback": "Коментар", "howtodraganddrop": "Натисніть, щоб вибрати і перемістить.", "incorrect": "Неправильно", "information": "Інформація", "invalidanswer": "Неповна відповідь", - "notanswered": "Відповіді ще не було", + "notanswered": "Відповіді не було", "notyetanswered": "Відповіді ще не було", "partiallycorrect": "Частково правильно", "questionmessage": "Питання {{$a}}: {{$b}}", "questionno": "Питання {{$a}}", "requiresgrading": "Потрібно оцінити", - "unknown": "Неможливо визначити статус" + "unknown": "Невідоме" } \ No newline at end of file diff --git a/www/core/components/question/lang/zh-cn.json b/www/core/components/question/lang/zh-cn.json index b0c02c82632..5f50a21a566 100644 --- a/www/core/components/question/lang/zh-cn.json +++ b/www/core/components/question/lang/zh-cn.json @@ -1,14 +1,14 @@ { - "answer": "回答", + "answer": "答案", "answersaved": "答案已保存", - "complete": "完全", + "complete": "完成", "correct": "正确", "feedback": "反馈", - "incorrect": "错误", + "incorrect": "不正确", "information": "说明", "invalidanswer": "答案不完成", - "notanswered": "未答", - "notyetanswered": "仍未作答", + "notanswered": "未回答", + "notyetanswered": "还未回答", "partiallycorrect": "部分正确", "questionno": "题目{{$a}}", "requiresgrading": "需要评分", diff --git a/www/core/components/question/lang/zh-tw.json b/www/core/components/question/lang/zh-tw.json index 865bf62f773..98bad903e59 100644 --- a/www/core/components/question/lang/zh-tw.json +++ b/www/core/components/question/lang/zh-tw.json @@ -1,21 +1,21 @@ { - "answer": "回答", + "answer": "答案", "answersaved": "答案已儲存", - "complete": "完全", - "correct": "正確", + "complete": "完成", + "correct": "答對", "errorattachmentsnotsupported": "本應用程序尚不支援將檔案附加到答案.", "errorinlinefilesnotsupported": "該應用程序尚不支援線上檔案的編輯.", "errorquestionnotsupported": "該應用程式不支援此問題類型: {{$ a}}.", "feedback": "回饋", "howtodraganddrop": "點一下選擇, 然後再點一下刪除.", - "incorrect": "不正確", + "incorrect": "答錯", "information": "資訊", "invalidanswer": "不完整的答案", - "notanswered": "尚未回答", - "notyetanswered": "還沒被填答", - "partiallycorrect": "部分正確", + "notanswered": "沒被回答", + "notyetanswered": "尚未回答", + "partiallycorrect": "部分答對", "questionmessage": "問題 {{$a}}: {{$b}}", "questionno": "試題{{$a}}", "requiresgrading": "需要計分", - "unknown": "無法偵測到狀態" + "unknown": "未知的" } \ No newline at end of file diff --git a/www/core/components/settings/lang/ar.json b/www/core/components/settings/lang/ar.json index fae7dd88622..0f8555c7b08 100644 --- a/www/core/components/settings/lang/ar.json +++ b/www/core/components/settings/lang/ar.json @@ -6,25 +6,25 @@ "deviceinfo": "معلومات الجهاز", "deviceos": "نظام تشغيل الجهاز", "disableall": "تعطيل الإعلامات بشكل مؤقت", - "disabled": "مُعطِّل", + "disabled": "معطل", "enabledebugging": "تمكين التصحيح", "enabledownloadsection": "تفعيل تنزيل الأقسام", "enabledownloadsectiondescription": "عطل هذا الخيار لكي تسرع تحميل أقسام المنهج", "estimatedfreespace": "تقدير المساحة الحرة", - "general": "عام", + "general": "بيانات عامة", "language": "اللغة", "license": "رخصة", "localnotifavailable": "إشعارات محلية موجودة", "loggedin": "متواجد", "loggedoff": "غير موجود", - "settings": "إعدادات", + "settings": "الإعدادات", "sites": "المواقع", "spaceusage": "المساحة المستخدمة", "synchronization": "تزامن", "synchronizenow": "زامن الأن", "synchronizing": "يتم التزامن", "syncsettings": "إعدادات المزامنة", - "total": "مجموع", + "total": "المجموع", "versioncode": "رمز الإصدار", "versionname": "اسم الإصدار" } \ No newline at end of file diff --git a/www/core/components/settings/lang/bg.json b/www/core/components/settings/lang/bg.json index 9ac4a91d33b..4713f2eaf86 100644 --- a/www/core/components/settings/lang/bg.json +++ b/www/core/components/settings/lang/bg.json @@ -4,17 +4,17 @@ "currentlanguage": "Текущ език", "deletesitefiles": "Сигурни ли сте, че искате да изтриете изтеглените от този сайт файлове?", "disableall": "Временно отменяне на съобщенията", - "disabled": "Блокирано", + "disabled": "Забранено", "enabledebugging": "Позволяване на диагностициране", "errordeletesitefiles": "Грешка при изтриването на файловете на сайта.", "errorsyncsite": "Грешка при синхронизацията на данните от сайта. Моля проверете Вашата връзка към Интернет и опитайте пак.", "estimatedfreespace": "Пресметнато свободно пространство", - "general": "Общо", + "general": "General", "language": "Език", "license": "Лиценз", "loggedin": "Онлайн", "loggedoff": "Офлайн", - "settings": "Настройки на заданието", + "settings": "Настройки", "spaceusage": "Използване на пространство", "synchronization": "Синхронизиране", "synchronizing": "Синхронизиране", diff --git a/www/core/components/settings/lang/ca.json b/www/core/components/settings/lang/ca.json index 66977c70db9..a57b970ccac 100644 --- a/www/core/components/settings/lang/ca.json +++ b/www/core/components/settings/lang/ca.json @@ -18,7 +18,7 @@ "deviceos": "OS del dispositiu", "devicewebworkers": "És compatible amb Device Web Workers", "disableall": "Inhabilita les notificacions temporalment", - "disabled": "Inhabilitat", + "disabled": "La missatgeria està inhabilitada en aquest lloc", "displayformat": "Format de visualització", "enabledebugging": "Habilita la depuració", "enabledownloadsection": "Habilita la descàrrega de seccions", @@ -30,7 +30,7 @@ "errorsyncsite": "S'ha produït un error sincronitzant les dades del lloc, comproveu la vostra connexió a internet i torneu-ho provar.", "estimatedfreespace": "Espai lliure estimat", "filesystemroot": "Arrel del fitxer de sistema", - "general": "General", + "general": "Dades generals", "language": "Idioma", "license": "Llicència", "localnotifavailable": "Notificacions locals disponibles", @@ -42,7 +42,7 @@ "networkstatus": "Estat de la connexió a Internet", "privacypolicy": "Política de privadesa", "reportinbackground": "Informa dels errors automàticament", - "settings": "Configuració", + "settings": "Paràmetres", "sites": "Llocs", "spaceusage": "Utilització de l'espai", "storagetype": "Tipus d'emmagatzematge", diff --git a/www/core/components/settings/lang/cs.json b/www/core/components/settings/lang/cs.json index b9c0291c9ee..2d3d282ff2e 100644 --- a/www/core/components/settings/lang/cs.json +++ b/www/core/components/settings/lang/cs.json @@ -18,7 +18,7 @@ "deviceos": "OS zařízení", "devicewebworkers": "Podporovaný Web Workers zařízení", "disableall": "Zakázat upozornění", - "disabled": "Vypnuto", + "disabled": "Zakázáno", "displayformat": "Formát zobrazení", "enabledebugging": "Povolit ladící informace", "enabledownloadsection": "Povolit stahování sekcí", @@ -30,7 +30,7 @@ "errorsyncsite": "Chyba synchronizace dat stránek, zkontrolujte své připojení k internetu a zkuste to znovu.", "estimatedfreespace": "Odhadované volné místo", "filesystemroot": "Kořen souborového systému", - "general": "Obecná nastavení", + "general": "Obecně", "language": "Jazyk", "license": "Licence", "localnotifavailable": "Je dostupné lokání oznámení", @@ -43,7 +43,7 @@ "privacypolicy": "Zásady ochrany osobních údajů", "processorsettings": "Nastavení procesoru", "reportinbackground": "Zobrazovat chyby automaticky", - "settings": "Nastavení úkolu", + "settings": "Nastavení", "sites": "Stránky", "spaceusage": "Použitý prostor", "storagetype": "Typ paměti", diff --git a/www/core/components/settings/lang/da.json b/www/core/components/settings/lang/da.json index d2ec20f3074..1ac0fb41308 100644 --- a/www/core/components/settings/lang/da.json +++ b/www/core/components/settings/lang/da.json @@ -14,7 +14,7 @@ "deviceinfo": "Enhedsinfo", "deviceos": "Enheds operativsystem", "disableall": "Deaktiver notifikationer", - "disabled": "Beskedsystemet er deaktiveret", + "disabled": "Deaktiveret", "displayformat": "Vis format", "enabledebugging": "Aktiver fejlsøgning", "enablesyncwifi": "Tillad kun synkronisering når tilsluttet Wi-Fi", @@ -22,7 +22,7 @@ "errorsyncsite": "Fejl ved synkronisering. Kontroller din Internettilslutning og prøv igen.", "estimatedfreespace": "Beregnet ledig plads", "filesystemroot": "Filsystemets rod", - "general": "Generelt", + "general": "Generelle data", "language": "Sprog", "license": "Licens", "localnotifavailable": "Lokale meddelelser tilgængelige", @@ -32,8 +32,9 @@ "navigatorlanguage": "Navigatorsprog", "navigatoruseragent": "Navigator userAgent", "networkstatus": "Status for internetforbindelse", + "processorsettings": "Processorindstillinger", "reportinbackground": "Anmeld fejl automatisk", - "settings": "Opgaveindstillinger", + "settings": "Indstillinger", "sites": "Websteder", "spaceusage": "Pladsforbrug", "storagetype": "Lagertype", @@ -42,7 +43,7 @@ "synchronizing": "Synkroniserer", "syncsettings": "Indstilling for synkronisering", "syncsitesuccess": "Websidens data er synkroniseret og alle mellemlagre tømt", - "total": "Total", + "total": "Totalt", "versioncode": "Versionsnummer", "versionname": "Versionsnavn", "wificonnection": "WiFi-forbindelse" diff --git a/www/core/components/settings/lang/de.json b/www/core/components/settings/lang/de.json index ae82a9b0020..ee00cd09e80 100644 --- a/www/core/components/settings/lang/de.json +++ b/www/core/components/settings/lang/de.json @@ -17,8 +17,8 @@ "deviceinfo": "Geräteinformationen", "deviceos": "Geräte-OS", "devicewebworkers": "Device Web Workers unterstützt", - "disableall": "Benachrichtungen ausschalten", - "disabled": "Deaktiviert", + "disableall": "Systemmitteilungen deaktivieren", + "disabled": "Die Mitteilungen sind für diese Website deaktiviert.", "displayformat": "Bildschirmformat", "enabledebugging": "Debugging aktivieren", "enabledownloadsection": "Herunterladen von Abschnitten aktivieren", @@ -30,7 +30,7 @@ "errorsyncsite": "Fehler beim Synchronisieren der Website. Prüfen Sie die Verbindung und versuchen Sie es noch einmal.", "estimatedfreespace": "Noch verfügbarer Speicherplatz", "filesystemroot": "Dateisystem (root)", - "general": "Grundeinträge", + "general": "Allgemeines", "language": "Sprache", "license": "Lizenz", "localnotifavailable": "Lokale Mitteilungen verfügbar", @@ -52,7 +52,7 @@ "synchronizing": "Synchronisieren ...", "syncsettings": "Synchronisieren", "syncsitesuccess": "Die Daten wurden synchronisiert.", - "total": "Insgesamt", + "total": "Gesamt", "versioncode": "Versionscode", "versionname": "Versionsname", "wificonnection": "WLAN-Verbindung" diff --git a/www/core/components/settings/lang/el.json b/www/core/components/settings/lang/el.json index cf6cad8002e..bb83893b28f 100644 --- a/www/core/components/settings/lang/el.json +++ b/www/core/components/settings/lang/el.json @@ -18,7 +18,7 @@ "deviceos": "Λειτουργικό σύστημα συσκευής", "devicewebworkers": "Υποστηρίζονται οι συσκευές Web Workers", "disableall": "Προσωρινή απενεργοποίηση ειδοποιήσεων", - "disabled": "Ανενεργό", + "disabled": "Απενεργοποιημένο", "displayformat": "Μορφή εμφάνισης", "enabledebugging": "Ενεργοποίηση εντοπισμού σφαλμάτων", "enabledownloadsection": "Ενεργοποιήστε τις ενότητες λήψης", @@ -30,7 +30,7 @@ "errorsyncsite": "Παρουσιάστηκε σφάλμα κατά το συγχρονισμό των δεδομένων ιστότοπου, ελέγξτε τη σύνδεση στο διαδίκτυο και δοκιμάστε ξανά.", "estimatedfreespace": "Εκτιμώμενος ελεύθερος χώρος", "filesystemroot": "Σύστημα αρχείων root", - "general": "Γενικά", + "general": "Γενικά δεδομένα", "language": "Γλώσσα", "license": "Άδεια GPL", "localnotifavailable": "Διαθέσιμες τοπικές ειδοποιήσεις", @@ -51,7 +51,7 @@ "synchronizing": "Γίνεται συγχρονισμός", "syncsettings": "Ρυθμίσεις συγχρονισμού", "syncsitesuccess": "Τα δεδομένα ιστότοπου συγχρονίστηκαν και όλες οι προσωρινές μνήμες ακυρώθηκαν.", - "total": "Συνολικά", + "total": "Συνολικό", "versioncode": "Κωδικός έκδοσης", "versionname": "Όνομα έκδοσης", "wificonnection": "Σύνδεση WiFi" diff --git a/www/core/components/settings/lang/es-mx.json b/www/core/components/settings/lang/es-mx.json index 970bc7fb067..44e2c3879b8 100644 --- a/www/core/components/settings/lang/es-mx.json +++ b/www/core/components/settings/lang/es-mx.json @@ -18,7 +18,7 @@ "deviceos": "Sistema Operativo del dispositivo", "devicewebworkers": "Trabajadores Web del Dispositivo soportados", "disableall": "Deshabilitar notificaciones", - "disabled": "Deshabilitado", + "disabled": "La mensajería está deshabilitada en este sitio", "displayformat": "Mostrar formato", "enabledebugging": "Activar modo depuración (debug)", "enabledownloadsection": "Habilitar descargar secciones", @@ -30,7 +30,7 @@ "errorsyncsite": "Error al sincronizarlos datos del sitio; por favor revise su conexión de Internet e inténtelo de nuevo.", "estimatedfreespace": "Espacio libre estimado", "filesystemroot": "Raíz del sistema-de-archivos", - "general": "General", + "general": "Datos generales", "language": "Idioma", "license": "Licencia", "localnotifavailable": "Notificaciones locales disponibles", @@ -43,7 +43,7 @@ "privacypolicy": "Política de privacidad", "processorsettings": "Configuraciones de procesador", "reportinbackground": "Reportar errores automáticamente", - "settings": "Configuración", + "settings": "Parámetros de la tarea", "sites": "Sitios", "spaceusage": "Espacio", "storagetype": "Tipo de almacenamiento", diff --git a/www/core/components/settings/lang/es.json b/www/core/components/settings/lang/es.json index 9e144842444..7d88421e720 100644 --- a/www/core/components/settings/lang/es.json +++ b/www/core/components/settings/lang/es.json @@ -18,7 +18,7 @@ "deviceos": "OS del dispositivo", "devicewebworkers": "Soporta Device Web Workers", "disableall": "Desactivar temporalmente las notificaciones", - "disabled": "Deshabilitado", + "disabled": "Desactivado", "displayformat": "Formato de visualización", "enabledebugging": "Activar modo debug", "enabledownloadsection": "Habilitar la descarga de secciones", @@ -30,7 +30,7 @@ "errorsyncsite": "Se ha producido un error sincronizando los datos del sitio, por favor compruebe su conexión a internet y pruebe de nuevo.", "estimatedfreespace": "Espacio libre (estimado)", "filesystemroot": "Raíz del sistema de archivos", - "general": "General", + "general": "Datos generales", "language": "Idioma", "license": "Licencia", "localnotifavailable": "Notificaciones locales disponibles", @@ -43,7 +43,7 @@ "privacypolicy": "Política de privacidad.", "processorsettings": "Ajustes de procesador", "reportinbackground": "Informar de los errores automáticamente", - "settings": "Configuración", + "settings": "Parámetros de la tarea", "sites": "Sitios", "spaceusage": "Espacio", "storagetype": "Tipo de almacenamiento", diff --git a/www/core/components/settings/lang/eu.json b/www/core/components/settings/lang/eu.json index 15413f586dc..c63efde543b 100644 --- a/www/core/components/settings/lang/eu.json +++ b/www/core/components/settings/lang/eu.json @@ -18,7 +18,7 @@ "deviceos": "Gailuaren SEa", "devicewebworkers": "Device Web Workers onartuak", "disableall": "Desgaitu jakinarazpenak", - "disabled": "Mezularitza desgaituta dago gune honetan", + "disabled": "Desgaituta", "displayformat": "Erakusteko modua", "enabledebugging": "Gaitu arazketa", "enabledownloadsection": "Gaitu gaien deskarga", @@ -30,20 +30,20 @@ "errorsyncsite": "Errorea guneko datuak sinkronizatzean, mesedez egiaztatu zure interneterako konexioa eta saiatu berriz.", "estimatedfreespace": "Estimatutako leku librea", "filesystemroot": "Fitxategi-sistemaren jatorria", - "general": "Orokorra", + "general": "Datu orokorrak", "language": "Hizkuntza", "license": "Lizentzia", "localnotifavailable": "Jakinarazpen lokalak eskuragarri", "locationhref": "Webview URLa", "loggedin": "Online", - "loggedoff": "Ez dago online", + "loggedoff": "Lineaz kanpo", "navigatorlanguage": "Nabigatzailearen hizkuntza", "navigatoruseragent": "Nabigatzailearen userAgent-a", "networkstatus": "Internet konexioaren egoera", "privacypolicy": "Pribatutasun politika.", "processorsettings": "Prozesadorearen ezarpenak", "reportinbackground": "Erroreak automatikoki jakinarazi", - "settings": "Zereginaren ezarpenak", + "settings": "Ezarpenak", "sites": "Guneak", "spaceusage": "Lekuaren erabilera", "storagetype": "Biltegi mota", diff --git a/www/core/components/settings/lang/fa.json b/www/core/components/settings/lang/fa.json index b0048cdfb24..338c8808fb7 100644 --- a/www/core/components/settings/lang/fa.json +++ b/www/core/components/settings/lang/fa.json @@ -9,14 +9,14 @@ "deviceinfo": "اطلاعات دستگاه", "deviceos": "سیستم‌عامل دستگاه", "disableall": "غیرفعال‌کردن اطلاعیه‌ها", - "disabled": "غیر فعال", + "disabled": "غیر فعال شده است", "enabledebugging": "فعالسازی اشکالزدایی", "enabledownloadsection": "فعال‌کردن دریافت قسمت‌ها", "enabledownloadsectiondescription": "برای سریع‌تر شدن بارگیری قسمت‌های درس این گزینه را غیرفعال کنید.", "enablerichtexteditor": "فعال‌کردن ویرایشگر متنی پیشرفته", "enablerichtexteditordescription": "اگر فعال باشد، در جاهایی که ممکن باشد یک ویرایشگر متنی پیشرفته نمایش داده خواهد شد.", "estimatedfreespace": "فضای آزاد تخمینی", - "general": "عمومی", + "general": "داده‌های کلی", "language": "زبان", "license": "اجازه‌نامه", "loggedin": "هنگام بودن در سایت", @@ -24,7 +24,7 @@ "privacypolicy": "خط مشی حفظ حریم خصوصی", "processorsettings": "تنظیمات پردازشگر", "reportinbackground": "گزارش خطاها به‌صورت خودکار", - "settings": "تنظیمات تکلیف", + "settings": "تنظیمات", "sites": "سایت‌ها", "spaceusage": "فضای مورد استفاده", "synchronization": "هماهنگسازی", diff --git a/www/core/components/settings/lang/fr.json b/www/core/components/settings/lang/fr.json index 5346109b332..81af1469a83 100644 --- a/www/core/components/settings/lang/fr.json +++ b/www/core/components/settings/lang/fr.json @@ -18,7 +18,7 @@ "deviceos": "Système d'exploitation de l'appareil", "devicewebworkers": "Web workers supportés", "disableall": "Désactiver les notifications", - "disabled": "Désactivée", + "disabled": "Désactivé", "displayformat": "Format d'affichage", "enabledebugging": "Activer débogage", "enabledownloadsection": "Activer le téléchargement des sections", @@ -30,20 +30,20 @@ "errorsyncsite": "Erreur de synchronisation des données. Veuillez vérifier votre connexion internet et essayer plus tard.", "estimatedfreespace": "Espace libre estimé", "filesystemroot": "Racine du système de fichiers", - "general": "Général", + "general": "Généralités", "language": "Langue", "license": "Licence", "localnotifavailable": "Notifications locales disponibles", "locationhref": "URL webview", - "loggedin": "Connectés :", - "loggedoff": "Hors ligne", + "loggedin": "En ligne", + "loggedoff": "Hors ligne", "navigatorlanguage": "Langue du navigateur", "navigatoruseragent": "UserAgent du navigateur", "networkstatus": "Statut de la connexion internet", "privacypolicy": "Politique de confidentialité", "processorsettings": "Réglage du processus d'envoi de messages", "reportinbackground": "Annoncer les erreurs automatiquement", - "settings": "Paramètres", + "settings": "Réglages", "sites": "Sites", "spaceusage": "Espace utilisé", "storagetype": "Type de stockage", diff --git a/www/core/components/settings/lang/he.json b/www/core/components/settings/lang/he.json index 85b2267e3b5..4b431f585e1 100644 --- a/www/core/components/settings/lang/he.json +++ b/www/core/components/settings/lang/he.json @@ -8,28 +8,28 @@ "deviceinfo": "מידע אודות המכשיר", "deviceos": "מערכת הפעלה של המכשיר", "disableall": "הודעות־מערכת כבויות זמנית", - "disabled": "לא זמין", + "disabled": "כבוי", "displayformat": "תבנית תצוגה", "enabledebugging": "הפעל ניפוי שגיאות", "errordeletesitefiles": "שגיאה במחיקת קבצי האתר.", "errorsyncsite": "שגיאה בסנכרון מידע האתר, אנא בדוק את החיבור לרשת האינטרנט ונסה שוב.", "estimatedfreespace": "אומדן מקום פנוי", - "general": "כללי", + "general": "נתונים כללים", "language": "שפת ממשק", - "license": "רשיון", + "license": "רישיון:", "localnotifavailable": "התראות מקומיות זמינות", "loggedin": "מקוון", "loggedoff": "לא מקוון", "networkstatus": "מצב חיבור לרשת האינטרנט", "reportinbackground": "דיווח על שגיאות באופן אוטומטי", - "settings": "הגדרות המטלה", + "settings": "הגדרות", "sites": "אתרים", "spaceusage": "זיכרון בשימוש", "synchronization": "סינכרון", "synchronizenow": "סינכרון עכשיו", "synchronizing": "מסנכרן", "syncsitesuccess": "מידע האתר סונכרן וכל זיכרון המטמון אופס.", - "total": "סך הכל", + "total": "כולל", "versioncode": "קוד גרסה", "versionname": "שם גרסה", "wificonnection": "חיבור אלחוטי" diff --git a/www/core/components/settings/lang/hu.json b/www/core/components/settings/lang/hu.json index 3def7a650fc..dabf3467e9f 100644 --- a/www/core/components/settings/lang/hu.json +++ b/www/core/components/settings/lang/hu.json @@ -4,16 +4,16 @@ "currentlanguage": "Aktuális nyelv", "deletesitefiles": "Biztosan törli a portálról a letöltött fájlokat?", "disableall": "Értesítésekkikapcsolása", - "disabled": "Ezen a portálon az üzenetküldés ki van kapcsolva", + "disabled": "Kikapcsolva", "enabledebugging": "Hibakeresés bekapcsolása", "estimatedfreespace": "Becsült szabad tárhely", - "general": "Általános", + "general": "Általános adatok", "language": "Nyelv", - "license": "Licenc", + "license": "Engedély:", "loggedin": "Bejelentkezve:", "loggedoff": "Kijelentkezve", "processorsettings": "Feldolgozó beállításai", - "settings": "Feladat beállításai", + "settings": "Beállítások", "sites": "Portálok", "spaceusage": "Tárhelyhasználat", "synchronization": "Szinkronizálás", diff --git a/www/core/components/settings/lang/it.json b/www/core/components/settings/lang/it.json index 72440991f47..e659bf2f70e 100644 --- a/www/core/components/settings/lang/it.json +++ b/www/core/components/settings/lang/it.json @@ -15,7 +15,7 @@ "deviceos": "SO del dispositivo", "devicewebworkers": "Dispositivi Web Worker supportati", "disableall": "Disabilita le notifiche", - "disabled": "In questo sito il messaging è disabilitato", + "disabled": "Disabilitato", "displayformat": "Formato di visualizzazione", "enabledebugging": "Abilita debugging", "enabledownloadsection": "Abilita scaricamento sezioni", @@ -24,7 +24,7 @@ "errorsyncsite": "Si è verificato un errore durante la sincronizzazione dei dati dal sito. Per favore verifica la connessione internet e riprova.", "estimatedfreespace": "Spazio libero stimato", "filesystemroot": "Root del filesystem", - "general": "Generale", + "general": "Dati generali", "language": "Lingua", "license": "Licenza", "localnotifavailable": "Notifiche locali disponibili", @@ -36,7 +36,7 @@ "networkstatus": "Stato della connessione internet", "processorsettings": "Impostazioni gestore", "reportinbackground": "Invia errori automaticamente", - "settings": "Impostazioni compito", + "settings": "Impostazioni", "sites": "Siti", "spaceusage": "Spazio utilizzato", "storagetype": "Tipo di storage", diff --git a/www/core/components/settings/lang/ja.json b/www/core/components/settings/lang/ja.json index b410de256b4..d5905770aad 100644 --- a/www/core/components/settings/lang/ja.json +++ b/www/core/components/settings/lang/ja.json @@ -4,16 +4,16 @@ "currentlanguage": "現在の言語", "deletesitefiles": "本当にこのサイトからダウンロードしたファイルを消去しますか?", "disableall": "通知を無効にする", - "disabled": "無効", + "disabled": "このサイトではメッセージングが無効にされています。", "enabledebugging": "デバッグを有効にする", "estimatedfreespace": "概算の空き容量", - "general": "一般", + "general": "一般設定", "language": "言語設定", "license": "ライセンス", "loggedin": "オンライン", "loggedoff": "オフライン", "processorsettings": "プロセッサ設定", - "settings": "課題設定", + "settings": "設定", "sites": "サイト", "spaceusage": "保存領域使用量", "synchronization": "同期", diff --git a/www/core/components/settings/lang/lt.json b/www/core/components/settings/lang/lt.json index d2474dd8a26..79f4bc7a512 100644 --- a/www/core/components/settings/lang/lt.json +++ b/www/core/components/settings/lang/lt.json @@ -18,7 +18,7 @@ "deviceos": "Įrenginio OS", "devicewebworkers": "Įrenginio palaikymas", "disableall": "Išjungti pranešimus", - "disabled": "Išjungtas", + "disabled": "Išjungta", "displayformat": "Rodyti formatą", "enabledebugging": "Leisti derinti", "enabledownloadsection": "Įgalinti sekciją parsiuntimą", @@ -30,7 +30,7 @@ "errorsyncsite": "Klaida sinchronizuojant svetainės duomenis, prašome patikrinti interneto ryšį ir pabandyti dar kartą.", "estimatedfreespace": "Laisva vieta", "filesystemroot": "Failų sistema pradžia", - "general": "Bendra", + "general": "Bendrieji duomenys", "language": "Kalba", "license": "Licencija", "localnotifavailable": "Prieinami vietos pranešimai", @@ -42,7 +42,7 @@ "networkstatus": "Interneto ryšio būsena", "processorsettings": "Procesoriaus nustatymai", "reportinbackground": "Automatiškai pranešti apie klaidas", - "settings": "Užduoties nuostatos", + "settings": "Parametrai", "sites": "Svetainės", "spaceusage": "Vietos naudojimas", "storagetype": "Atminties tipas", diff --git a/www/core/components/settings/lang/nl.json b/www/core/components/settings/lang/nl.json index 622189c6fe3..19bfb28d023 100644 --- a/www/core/components/settings/lang/nl.json +++ b/www/core/components/settings/lang/nl.json @@ -18,7 +18,7 @@ "deviceos": "Toestel OS", "devicewebworkers": "Ondersteunde Device Web Workers", "disableall": "Berichten uitschakelen", - "disabled": "De berichtenservice is uitgeschakeld op deze site", + "disabled": "Uitgeschakeld", "displayformat": "Schermformaat", "enabledebugging": "Foutopsporing inschakelen", "enabledownloadsection": "Downloadsecties inschakelen", @@ -30,7 +30,7 @@ "errorsyncsite": "Fout bij het synchroniseren van sitegegevens. Controleer je internetverbinding en probeer opnieuw.", "estimatedfreespace": "Geschatte vrije ruimte", "filesystemroot": "Root bestandssysteem", - "general": "Algemeen", + "general": "Algemene gegevens", "language": "Taal", "license": "Licentie", "localnotifavailable": "Lokale meldingen beschikbaar", @@ -43,7 +43,7 @@ "privacypolicy": "Privacy-beleid", "processorsettings": "Processor instellingen", "reportinbackground": "Fouten automatisch rapporteren", - "settings": "Opdracht instellingen", + "settings": "Instellingen", "sites": "Sites", "spaceusage": "Gebruikte ruimte", "storagetype": "Opslagtype", diff --git a/www/core/components/settings/lang/pl.json b/www/core/components/settings/lang/pl.json index 3fcc31d278d..dcb9cd0ddb3 100644 --- a/www/core/components/settings/lang/pl.json +++ b/www/core/components/settings/lang/pl.json @@ -3,17 +3,17 @@ "cacheexpirationtime": "Czas wygasania pamięci podręcznej (milisekundy)", "currentlanguage": "Aktualny język", "deletesitefiles": "Czy na pewno chcesz usunąć pliki pobrane z tej strony?", - "disableall": "Tymczasowo wyłącz powiadomienia", - "disabled": "Wyłączony", + "disableall": "Wyłącz powiadomienia", + "disabled": "Wyłączone", "enabledebugging": "Włącz debugowanie", "estimatedfreespace": "Szacowana wolna przestrzeń", - "general": "Ogólne", + "general": "Dane ogólne", "language": "Język", "license": "Licencja", "loggedin": "On-line", "loggedoff": "Nie zalogowany", - "settings": "Ustawienia zadania", + "settings": "Ustawienia", "sites": "Serwisy", "spaceusage": "Użyta przestrzeń", - "total": "Razem" + "total": "Ogólnie" } \ No newline at end of file diff --git a/www/core/components/settings/lang/pt-br.json b/www/core/components/settings/lang/pt-br.json index adf77cf5dfd..28da97a0787 100644 --- a/www/core/components/settings/lang/pt-br.json +++ b/www/core/components/settings/lang/pt-br.json @@ -18,7 +18,7 @@ "deviceos": "Dispositivo OS", "devicewebworkers": "Device Web Workers suportados", "disableall": "Desabilitar notificações", - "disabled": "Desativar", + "disabled": "Desabilitado", "displayformat": "Formato de exibição", "enabledebugging": "Ativar a depuração", "enabledownloadsection": "Ativar seções de download", @@ -30,7 +30,7 @@ "errorsyncsite": "Erro ao sincronizar os dados do site, por favor verifique sua conexão de internet e tente novamente.", "estimatedfreespace": "Espaço livre estimado", "filesystemroot": "Raiz do sistema de arquivos", - "general": "Geral", + "general": "Dados Gerais", "language": "Idioma", "license": "Licença", "localnotifavailable": "Notificações locais disponíveis", @@ -41,8 +41,9 @@ "navigatoruseragent": "Navegador userAgent", "networkstatus": "O status da conexão Internet", "privacypolicy": "Política de privacidade", + "processorsettings": "Configurações do processador", "reportinbackground": "Relatar erros automaticamente", - "settings": "Configurações da tarefa", + "settings": "Configurações", "sites": "Sites", "spaceusage": "Uso do espaço", "storagetype": "Tipo de armazenamento", diff --git a/www/core/components/settings/lang/pt.json b/www/core/components/settings/lang/pt.json index c9a0b3b0f7f..80e93eb0408 100644 --- a/www/core/components/settings/lang/pt.json +++ b/www/core/components/settings/lang/pt.json @@ -18,7 +18,7 @@ "deviceos": "Dispositivo OS", "devicewebworkers": "Device Web Workers suportados", "disableall": "Desativar notificações", - "disabled": "Desativar", + "disabled": "Desativado", "displayformat": "Formato de visualização", "enabledebugging": "Ativar a depuração", "enabledownloadsection": "Ativar secções de transferência", @@ -30,7 +30,7 @@ "errorsyncsite": "Erro ao sincronizar os dados do site, por favor verifique a sua ligação à internet e tente novamente.", "estimatedfreespace": "Espaço livre estimado", "filesystemroot": "Raíz do sistema de ficheiros", - "general": "Geral", + "general": "Dados gerais", "language": "Idioma", "license": "Licença", "localnotifavailable": "Notificações locais disponíveis", @@ -43,7 +43,7 @@ "privacypolicy": "Politica de privacidade", "processorsettings": "Configurações do processador", "reportinbackground": "Reportar erros automaticamente", - "settings": "Configurações", + "settings": "Configurações do trabalho", "sites": "Sites", "spaceusage": "Utilização do espaço", "storagetype": "Tipo de armazenamento", diff --git a/www/core/components/settings/lang/ro.json b/www/core/components/settings/lang/ro.json index fb34938dfd3..c241401f584 100644 --- a/www/core/components/settings/lang/ro.json +++ b/www/core/components/settings/lang/ro.json @@ -15,7 +15,7 @@ "deviceos": "Sistemul de operare al dispozitivului", "devicewebworkers": "Web Workers este suportat pe dispozitiv", "disableall": "Dezactivați temporar notificările", - "disabled": "Schimbul de mesaje este dezactivat pe acest site", + "disabled": "Dezactivat", "displayformat": "Dimensiunea ecranului", "enabledebugging": "Activați modulul de depanare", "enabledownloadsection": "Activați secțiunile pentru descărcare", @@ -25,9 +25,9 @@ "errorsyncsite": "A apărut o eroare la sincronizarea datelor de pe site, verificați conexiunea la internet și încercați din nou.", "estimatedfreespace": "Spațiu liber estimat", "filesystemroot": "Rădăcina sistemului de fișiere", - "general": "General", + "general": "Informaţii generale", "language": "Limba", - "license": "Licenţă", + "license": "Licență", "localnotifavailable": "Notificările locale sunt disponibile", "locationhref": "URL", "loggedin": "On-line", @@ -36,7 +36,7 @@ "navigatoruseragent": "Navigator userAgent", "networkstatus": "Starea conexiunii la Internet", "reportinbackground": "Erorile se raportează automat", - "settings": "Setările sarcinii de lucru", + "settings": "Setări", "sites": "Site-uri", "spaceusage": "Spațiu utilizat", "storagetype": "Tipul stocării", diff --git a/www/core/components/settings/lang/ru.json b/www/core/components/settings/lang/ru.json index 28769d7118a..21d2ac333cf 100644 --- a/www/core/components/settings/lang/ru.json +++ b/www/core/components/settings/lang/ru.json @@ -6,8 +6,8 @@ "currentlanguage": "Выбранный язык", "deletesitefiles": "Вы уверены, что хотите удалить файлы, скачанные с сайта «{{sitename}}»?", "deletesitefilestitle": "Удалить файлы сайта", - "disableall": "Временно отключить уведомления", - "disabled": "Выключить", + "disableall": "Отключить уведомления", + "disabled": "Отключено", "enabledebugging": "Включить отладку", "enabledownloadsection": "Показать материалы, доступные для скачивания", "enablerichtexteditor": "Включить текстовый редактор", @@ -16,18 +16,19 @@ "errordeletesitefiles": "Ошибка при удалении файлов сайта", "errorsyncsite": "Ошибка синхронизации данных сайта. Проверьте интернет-соединение и повторите попытку.", "estimatedfreespace": "Ориентировочное свободное место", - "general": "Основные", + "general": "Общие", "language": "Язык", - "license": "Лицензия", + "license": "Лицензия:", "loggedin": "На сайте", "loggedoff": "Вне сайта", + "processorsettings": "Настройки способа доставки сообщений", "reportinbackground": "Автоматически оповещать об ошибках", - "settings": "Параметры задания", + "settings": "Настройки", "sites": "Сайты", "spaceusage": "Используемое пространство", "synchronization": "Синхронизация", "synchronizing": "Синхронизация", "syncsettings": "Настройки синхронизации", "syncsitesuccess": "Данные синхронизации сайта и все кэши недействительны.", - "total": "Итог" + "total": "Итого" } \ No newline at end of file diff --git a/www/core/components/settings/lang/sr-cr.json b/www/core/components/settings/lang/sr-cr.json index 2001c299b89..e7f83e5471d 100644 --- a/www/core/components/settings/lang/sr-cr.json +++ b/www/core/components/settings/lang/sr-cr.json @@ -11,11 +11,14 @@ "cordovadeviceuuid": "UUID Cordova уређаја", "cordovaversion": "Cordova верзија", "credits": "Заслуге", + "currentlanguage": "Тренутно важећи језик", "deletesitefiles": "Да ли сте сигурни да желите да обришете преузете датотеке са сајта '{{sitename}}'?", "deletesitefilestitle": "Обриши датотеке сајта", "deviceinfo": "Информације о уређају", "deviceos": "Оперативни систем уређаја", "devicewebworkers": "Web Workers уређаји подржани", + "disableall": "Онемогући обавештења", + "disabled": "Онемогућено", "displayformat": "Формат приказа", "enabledebugging": "Омогући отклањање грешака", "enabledownloadsection": "Омогући преузимање секција.", @@ -27,13 +30,21 @@ "errorsyncsite": "Грешка приликом синхронизације података сајта. Молимо, проверите вашу интернет везу и покушајте поново.", "estimatedfreespace": "Процењени слободан простора", "filesystemroot": "Основни директоријум система датотека", + "general": "Опште", + "language": "Језик", + "license": "Лиценца", "localnotifavailable": "Локална обавештења доступна", "locationhref": "Webview URL адреса", + "loggedin": "Онлајн", + "loggedoff": "Офлајн", "navigatorlanguage": "Језик навигатора", "navigatoruseragent": "Кориснички агент навигатора", "networkstatus": "Статус инернет везе", "privacypolicy": "Политика приватности", + "processorsettings": "Подешавања процесора", "reportinbackground": "Пријави грешке аутоматски", + "settings": "Подешавања", + "sites": "Сајтови", "spaceusage": "Искориштеност простора", "storagetype": "Тип складишта", "synchronization": "Синхронизација", @@ -41,6 +52,7 @@ "synchronizing": "Синхронизовање", "syncsettings": "Подешавања синхронизације", "syncsitesuccess": "Подаци сајтa су синхронизовани и сав кеш је поништен.", + "total": "Укупно", "versioncode": "Верзија кôда", "versionname": "Назив верзије", "wificonnection": "WiFi веза" diff --git a/www/core/components/settings/lang/sr-lt.json b/www/core/components/settings/lang/sr-lt.json index 3dbe087bed0..d3fb7c76e35 100644 --- a/www/core/components/settings/lang/sr-lt.json +++ b/www/core/components/settings/lang/sr-lt.json @@ -11,11 +11,14 @@ "cordovadeviceuuid": "UUID Cordova uređaja", "cordovaversion": "Cordova verzija", "credits": "Zasluge", + "currentlanguage": "Trenutno važeći jezik", "deletesitefiles": "Da li ste sigurni da želite da obrišete preuzete datoteke sa sajta '{{sitename}}'?", "deletesitefilestitle": "Obriši datoteke sajta", "deviceinfo": "Informacija o uređaju", "deviceos": "Operativni sistem uređaja", "devicewebworkers": "Web Workers uređaji podržani", + "disableall": "Onemogući obaveštenja", + "disabled": "Onemogućeno", "displayformat": "Format prikaza", "enabledebugging": "Omogući otklanjanje grešaka", "enabledownloadsection": "Omogući preuzimanje sekcija.", @@ -27,13 +30,21 @@ "errorsyncsite": "Greška prilikom sinhronizacije podataka sajta. Molimo, proverite vašu internet vezu i pokušajte ponovo.", "estimatedfreespace": "Procenjeni slobodan prostora", "filesystemroot": "Osnovni direktorijum sistema datoteka", + "general": "Opšte", + "language": "Jezik", + "license": "Licenca", "localnotifavailable": "Lokalna obaveštenja dostupna", "locationhref": "Webview URL adresa", + "loggedin": "Onlajn", + "loggedoff": "Oflajn", "navigatorlanguage": "Jezik navigatora", "navigatoruseragent": "Korisnički agent navigatora", "networkstatus": "Status inernet veze", "privacypolicy": "Politika privatnosti", + "processorsettings": "Podešavanja procesora", "reportinbackground": "Prijavi greške automatski", + "settings": "Podešavanja", + "sites": "Sajtovi", "spaceusage": "Iskorištenost prostora", "storagetype": "Tip skladišta", "synchronization": "Sinhronizacija", @@ -41,6 +52,7 @@ "synchronizing": "Sinhronizovanje", "syncsettings": "Podešavanja sinhronizacije", "syncsitesuccess": "Podaci sajta su sinhronizovani i sav keš je poništen.", + "total": "Ukupno", "versioncode": "Verzija kôda", "versionname": "Naziv verzije", "wificonnection": "WiFi veza" diff --git a/www/core/components/settings/lang/sv.json b/www/core/components/settings/lang/sv.json index 6e667ace444..9daf57979e3 100644 --- a/www/core/components/settings/lang/sv.json +++ b/www/core/components/settings/lang/sv.json @@ -14,8 +14,8 @@ "deviceinfo": "Info mobil enhet", "deviceos": "Mobil enhet operativsystem", "devicewebworkers": "Enheten stödjer Web Workers", - "disableall": "Tillfälligt inaktivera meddelanden", - "disabled": "Avaktiverat", + "disableall": "Tillfälligt inaktivera notiser", + "disabled": "Avaktiverad", "displayformat": "Visningsformat", "enabledebugging": "Aktivera felsökning", "enabledownloadsection": "Aktivera hämtning sektioner", @@ -25,7 +25,7 @@ "errorsyncsite": "Fel vid synkronisering. Kontrollera din Internetanslutning och försök igen", "estimatedfreespace": "Beräknad ledigt utrymme", "filesystemroot": "Filsystem root", - "general": "Allmänt", + "general": "Allmänna data", "language": "Språk", "license": "Licens", "localnotifavailable": "Lokala meddelanden tillgängliga", @@ -36,7 +36,7 @@ "navigatoruseragent": "", "networkstatus": "Status för Internetanslutning", "reportinbackground": "Rapportera fel per automatik", - "settings": "Inställningar för inlämningsuppgift", + "settings": "Inställningar", "sites": "Webbplatser", "spaceusage": "Utrymmesanvändning", "storagetype": "Lagringstyp", @@ -45,7 +45,7 @@ "synchronizing": "Synkronisera", "syncsettings": "Synkronisation inställningar", "syncsitesuccess": "Webbsidedata synkroniserades och alla cachar ogiltigförklarades", - "total": "Totalt", + "total": "Summa", "versioncode": "Version kod", "versionname": "Version namn", "wificonnection": "WiFi-anslutning" diff --git a/www/core/components/settings/lang/tr.json b/www/core/components/settings/lang/tr.json index c6f1ea3ec9b..efbef267550 100644 --- a/www/core/components/settings/lang/tr.json +++ b/www/core/components/settings/lang/tr.json @@ -4,16 +4,16 @@ "currentlanguage": "Geçerli dil", "deletesitefiles": "Bu siteden indirdiğiniz dosyaları silmek istediğinizden eminmisiniz?", "disableall": "Bildirimleri devre dışı bırak", - "disabled": "Devre dışı bırakıldı", + "disabled": "Mesajlaşma bu sitede etkinleştirilmemiş", "enabledebugging": "Hata ayıklamayı etkinleştir", "estimatedfreespace": "Tahmini boş alan", - "general": "Genel", + "general": "Genel veri", "language": "Dil", "license": "Lisans", "loggedin": "Çevrimiçi", "loggedoff": "Çevrim içi değil", "processorsettings": "İşlemci ayarları", - "settings": "Ödev ayarları", + "settings": "Ayarlar", "sites": "Siteler", "spaceusage": "Kullanılan alan", "synchronization": "Eşitleme", diff --git a/www/core/components/settings/lang/uk.json b/www/core/components/settings/lang/uk.json index 19e3c097dcc..52526da3482 100644 --- a/www/core/components/settings/lang/uk.json +++ b/www/core/components/settings/lang/uk.json @@ -18,7 +18,7 @@ "deviceos": "ОС пристрою", "devicewebworkers": "Device Web Workers підтримується", "disableall": "Тимчасово заборонити повідомлення", - "disabled": "Повідомлення заборонені на цьому сайті", + "disabled": "Відключено", "displayformat": "Формат відображення", "enabledebugging": "Включити відладку", "enabledownloadsection": "Увімкнути секцію завантаження", @@ -30,7 +30,7 @@ "errorsyncsite": "Помилка синхронізації даних сайту, будь ласка, перевірте підключення до Інтернету і спробуйте ще раз.", "estimatedfreespace": "Розрахунковий вільний простір", "filesystemroot": "Коренева файлова система", - "general": "Основне", + "general": "Загальний", "language": "Мова інтерфейсу", "license": "Ліцензія", "localnotifavailable": "Доступні локальні сповіщення", @@ -42,7 +42,7 @@ "networkstatus": "Статус інтернет з'єднання", "privacypolicy": "Політика конфіденційності", "reportinbackground": "Відправляти помилки автоматично", - "settings": "Параметри завдання", + "settings": "Налаштування", "sites": "Сайти", "spaceusage": "Використане місце", "storagetype": "Тип сховища", @@ -51,7 +51,7 @@ "synchronizing": "Синхронізація", "syncsettings": "Налаштування синхронізації", "syncsitesuccess": "Дані сайту синхронізовані і всі кеші визнані недійсними.", - "total": "Підсумок", + "total": "Всього", "versioncode": "Версія коду", "versionname": "Ім'я версії", "wificonnection": "WiFi з'єднання" diff --git a/www/core/components/settings/lang/zh-cn.json b/www/core/components/settings/lang/zh-cn.json index 0ae3d4ba30e..01c03d8e577 100644 --- a/www/core/components/settings/lang/zh-cn.json +++ b/www/core/components/settings/lang/zh-cn.json @@ -4,17 +4,17 @@ "currentlanguage": "当前语言", "deletesitefiles": "您确定要删除从本站下载的文件?", "disableall": "临时禁用通知", - "disabled": "禁用", + "disabled": "不显示", "enabledebugging": "启用调试功能", "estimatedfreespace": "估计的可用空间", - "general": "常规项", + "general": "一般", "language": "语言", - "license": "许可证", + "license": "证书", "loggedin": "在线", "loggedoff": "离线", - "settings": "作业设置", + "settings": "设置", "sites": "网站", "spaceusage": "空间使用情况", "synchronization": "同步", - "total": "总计" + "total": "总分" } \ No newline at end of file diff --git a/www/core/components/settings/lang/zh-tw.json b/www/core/components/settings/lang/zh-tw.json index d63c5c6e165..0c793832389 100644 --- a/www/core/components/settings/lang/zh-tw.json +++ b/www/core/components/settings/lang/zh-tw.json @@ -18,7 +18,7 @@ "deviceos": "裝置作業系統", "devicewebworkers": "裝置網路工作站已支援", "disableall": "暫時關閉通知", - "disabled": "已關閉", + "disabled": "關閉", "displayformat": "顯示格式", "enabledebugging": "啟用除錯", "enabledownloadsection": "啟用下載區塊", @@ -30,9 +30,9 @@ "errorsyncsite": "同步網站資料時出錯, 請檢查您的網際網路連線, 然後重試.", "estimatedfreespace": "估計剩餘空間", "filesystemroot": "檔案系統根目錄", - "general": "一般", + "general": "一般的", "language": "語言", - "license": "授權條款", + "license": "授權方式", "localnotifavailable": "提供本端通知", "locationhref": "Webview網址", "loggedin": "線上", @@ -42,7 +42,7 @@ "networkstatus": "網際網路連線狀況", "processorsettings": "處理器的各項設定", "reportinbackground": "報表錯誤自動回報", - "settings": "作業設定", + "settings": "設定", "sites": "網站", "spaceusage": "使用空間", "storagetype": "儲存類型", @@ -51,7 +51,7 @@ "synchronizing": "同步中", "syncsettings": "同步設定", "syncsitesuccess": "網站資料同步與快取都無效", - "total": "總共", + "total": "總分", "versioncode": "版本碼", "versionname": "版本名稱", "wificonnection": "WiFi連線" diff --git a/www/core/components/sharedfiles/lang/ar.json b/www/core/components/sharedfiles/lang/ar.json index 9f9e759ba0b..e56fb17f780 100644 --- a/www/core/components/sharedfiles/lang/ar.json +++ b/www/core/components/sharedfiles/lang/ar.json @@ -1,4 +1,4 @@ { - "rename": "تغيير الاسم", + "rename": "إعادة تسمية", "replace": "استبدال" } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/ca.json b/www/core/components/sharedfiles/lang/ca.json index 56cb9344708..af0c921ccaf 100644 --- a/www/core/components/sharedfiles/lang/ca.json +++ b/www/core/components/sharedfiles/lang/ca.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "No hi ha llocs desats. Afegiu un lloc per poder compartir fitxers amb l'aplicació.", "nosharedfiles": "No hi ha fitxers compartits desats en aquest lloc.", "nosharedfilestoupload": "No hi ha fitxers per pujar. Si voleu pujar un fitxer des d'un altra aplicació, busqueu-lo i feu clic al botó «Obre a».", - "rename": "Reanomena", + "rename": "Canvia el nom", "replace": "Reemplaça", "sharedfiles": "Fitxers compartits", "successstorefile": "S'ha desat el fitxer amb èxit. Podeu seleccionar-lo i pujar-lo als vostres fitxers privats o adjuntar-lo a alguna activitat." diff --git a/www/core/components/sharedfiles/lang/cs.json b/www/core/components/sharedfiles/lang/cs.json index 2cd35a9d0d4..9a19d1f00b1 100644 --- a/www/core/components/sharedfiles/lang/cs.json +++ b/www/core/components/sharedfiles/lang/cs.json @@ -5,7 +5,7 @@ "nosharedfiles": "Na tomto webu nejsou uložené žádné sdílené soubory.", "nosharedfilestoupload": "Nemáte žádné nahrané soubory. Pokud chcete nahrát soubor z jiné aplikace, vyhledejte tento soubor a klikněte na tlačítko \"Otevřít v\".", "rename": "Přejmenovat", - "replace": "Nahradit", + "replace": "Přepsat", "sharedfiles": "Sdílené soubory", "successstorefile": "Soubor byl úspěšně uložen. Nyní můžete vybrat tento soubor a nahrát do vašich soukromých souborů nebo připojit ji do některých činností." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/de.json b/www/core/components/sharedfiles/lang/de.json index 6bbe564a7ac..aef668fe00a 100644 --- a/www/core/components/sharedfiles/lang/de.json +++ b/www/core/components/sharedfiles/lang/de.json @@ -5,7 +5,7 @@ "nosharedfiles": "Keine geteilten Dateien für diese Website", "nosharedfilestoupload": "Sie haben noch keine Dateien zum Hochladen freigegeben. Wenn Sie eine Datei aus einer anderen App hochladen möchten, suchen Sie diese Datei und tippen Sie auf die Taste 'Öffnen in'.", "rename": "Umbenennen", - "replace": "Ersetzen", + "replace": "Ersetze", "sharedfiles": "Geteilte Dateien", "successstorefile": "Die Datei wurde gespeichert. Sie können die Datei verwenden, um Sie in 'Meine Dateien' hochzuladen oder bei Aktivitäten anzuhängen." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/es-mx.json b/www/core/components/sharedfiles/lang/es-mx.json index d2732c41c62..6cd58565e88 100644 --- a/www/core/components/sharedfiles/lang/es-mx.json +++ b/www/core/components/sharedfiles/lang/es-mx.json @@ -5,7 +5,7 @@ "nosharedfiles": "No hay archivos compartidos en este sitio.", "nosharedfilestoupload": "Usted no tiene archivos para subir aquí. Si Usted desea subir un archivo desde otra App, localice ese archivo y haga click en el botón para 'Abrir en'.", "rename": "Renombrar", - "replace": "Remplazar", + "replace": "Reemplazar", "sharedfiles": "Archivos compartidos", "successstorefile": "Archivo almacenado exitosamente. Ahora Usted puede seleccionar a este archivo para subirlo a sus archivos privados, o anexarlo a algunas actividades." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/eu.json b/www/core/components/sharedfiles/lang/eu.json index cbbcb5eef04..a56363d095e 100644 --- a/www/core/components/sharedfiles/lang/eu.json +++ b/www/core/components/sharedfiles/lang/eu.json @@ -5,7 +5,7 @@ "nosharedfiles": "Ez dago artekatutako fitxategirik gune honetan.", "nosharedfilestoupload": "Ez duzu igotzeko fitxategirik hemen. Beste app baten bitartez fitxategia igo nahi baduzu, fitxategia aurkitu eta ondoren 'Ireki honekin' botoia sakatu.", "rename": "Berrizendatu", - "replace": "Ordeztu", + "replace": "Ordezkatu", "sharedfiles": "Partekatutako fitxategiak", "successstorefile": "Fitxategia ondo gorde da. Orain fitxategi hau aukeratu dezakezu zure gune pribatura igo edo jarduera bati eransteko." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/it.json b/www/core/components/sharedfiles/lang/it.json index 875611dd996..81869805f8b 100644 --- a/www/core/components/sharedfiles/lang/it.json +++ b/www/core/components/sharedfiles/lang/it.json @@ -1,5 +1,5 @@ { - "rename": "Rinomina", + "rename": "Cambia il nome", "replace": "Sostituisci", "sharedfiles": "File condivisi" } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/lt.json b/www/core/components/sharedfiles/lang/lt.json index ef379410c73..2e51ae1b0ed 100644 --- a/www/core/components/sharedfiles/lang/lt.json +++ b/www/core/components/sharedfiles/lang/lt.json @@ -4,8 +4,8 @@ "errorreceivefilenosites": "Svetainės nėra saugomos. Prieš dalintis failu, pridėkite svetainės nuorodą.", "nosharedfiles": "Šioje svetainėje nepatalpinti bendro naudojimo failai.", "nosharedfilestoupload": "Nėra įkeltų failų. Jeigu norite juos įkelti iš kitos programėlės, pažymėkite ir paspauskite mygtuką „Atidaryti“.", - "rename": "Pervadinti", - "replace": "Pakeisti", + "rename": "Pervardyti", + "replace": "Keisti", "sharedfiles": "Bendro naudojimo failai", "successstorefile": "Failas sėkmingai patalpintas. Galite jį perkelti į savo asmeninį aplanką arba įkelti tam tikrosiose veiklose." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/pt.json b/www/core/components/sharedfiles/lang/pt.json index 2c1daa00102..2200f805ed5 100644 --- a/www/core/components/sharedfiles/lang/pt.json +++ b/www/core/components/sharedfiles/lang/pt.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "Não existem sites armazenados. Adicione um site antes de partilhar um ficheiro com a aplicação.", "nosharedfiles": "Não existem quaisquer ficheiros partilhados armazenados neste site.", "nosharedfilestoupload": "Não tem ficheiros para fazer o carregamento aqui. Se quiser carregar um ficheiro de outra aplicação, localize o ficheiro e clique no botão 'Abrir em'.", - "rename": "Mudar nome", + "rename": "Renomear", "replace": "Substituir", "sharedfiles": "Ficheiros partilhados", "successstorefile": "Ficheiro armazenado com sucesso. A partir de agora pode selecionar este ficheiro para enviá-lo para os seus ficheiros privados ou anexá-lo em algumas atividades." diff --git a/www/core/components/sharedfiles/lang/sr-cr.json b/www/core/components/sharedfiles/lang/sr-cr.json index 3b9b852cf35..f341d57f6b1 100644 --- a/www/core/components/sharedfiles/lang/sr-cr.json +++ b/www/core/components/sharedfiles/lang/sr-cr.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "Не постоје меморисани сајтови. Молимо, додајте сајт пре него што покушате да поделите датотеке са апликацијом.", "nosharedfiles": "Не постоје дељене датотеке које се налазе на овом сајту.", "nosharedfilestoupload": "Овде немате датотеке које можете да отпремите. Ако желите да отпремите датотеку из друге апликације, пронађите ту датотеку и кликните на дугме 'Отвори у'.", - "rename": "Промени назив", + "rename": "Преименовање", "replace": "Замени", "sharedfiles": "Дељене датотеке", "successstorefile": "Датотека је успешно сачувана. Сада можете да изаберете ову датотеку да бисте је отпремили међу своје приватне датотеке или је придружили некој активности." diff --git a/www/core/components/sharedfiles/lang/sr-lt.json b/www/core/components/sharedfiles/lang/sr-lt.json index 796ef026796..2615dbff4fb 100644 --- a/www/core/components/sharedfiles/lang/sr-lt.json +++ b/www/core/components/sharedfiles/lang/sr-lt.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "Ne postoje memorisani sajtovi. Molimo, dodajte sajt pre nego što pokušate da podelite datoteke sa aplikacijom.", "nosharedfiles": "Ne postoje deljene datoteke koje se nalaze na ovom sajtu.", "nosharedfilestoupload": "Ovde nemate datoteke koje možete da otpremite. Ako želite da otpremite datoteku iz druge aplikacije, pronađite tu datoteku i kliknite na dugme 'Otvori u'.", - "rename": "Promeni naziv", + "rename": "Preimenovanje", "replace": "Zameni", "sharedfiles": "Deljene datoteke", "successstorefile": "Datoteka je uspešno sačuvana. Sada možete da izaberete ovu datoteku da biste je otpremili među svoje privatne datoteke ili je pridružili nekoj aktivnosti." diff --git a/www/core/components/sharedfiles/lang/sv.json b/www/core/components/sharedfiles/lang/sv.json index 117af22281c..aa1e826c0b2 100644 --- a/www/core/components/sharedfiles/lang/sv.json +++ b/www/core/components/sharedfiles/lang/sv.json @@ -1,4 +1,4 @@ { - "rename": "Döp om", + "rename": "Ändra namn", "replace": "Byt ut" } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/tr.json b/www/core/components/sharedfiles/lang/tr.json index 94ea98f2214..76c25af6f7c 100644 --- a/www/core/components/sharedfiles/lang/tr.json +++ b/www/core/components/sharedfiles/lang/tr.json @@ -1,5 +1,5 @@ { - "rename": "Yeniden adlandır", + "rename": "Ad değiştir", "replace": "Değiştir", "sharedfiles": "Paylaşılan dosyalar" } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/uk.json b/www/core/components/sharedfiles/lang/uk.json index 6a2a6c61255..f16da3ef448 100644 --- a/www/core/components/sharedfiles/lang/uk.json +++ b/www/core/components/sharedfiles/lang/uk.json @@ -5,7 +5,7 @@ "nosharedfiles": "Немає загальних файлів, що зберігаються на цьому сайті.", "nosharedfilestoupload": "У вас немає файлів для завантаження. Якщо ви хочете завантажити файл з іншої програми, знайдіть цей файл і натисніть кнопку «Відкрити\".", "rename": "Перейменувати", - "replace": "Перемістити", + "replace": "Замінити", "sharedfiles": "Розшарити файли", "successstorefile": "Файл успішно збережений. Тепер ви можете вибрати цей файл, щоб завантажити його на ваші особисті файли або прикріпити його в деяких видах діяльності." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/zh-tw.json b/www/core/components/sharedfiles/lang/zh-tw.json index 9e1a070f78b..29220712327 100644 --- a/www/core/components/sharedfiles/lang/zh-tw.json +++ b/www/core/components/sharedfiles/lang/zh-tw.json @@ -4,8 +4,8 @@ "errorreceivefilenosites": "沒有已存入的網站. 請在與應用程式共享文件之前新增網站.", "nosharedfiles": "此網站中沒有存入共享檔案.", "nosharedfilestoupload": "您沒有要在此處上傳的檔案. 如果您要從其他應用程式上傳檔案, 請找出該檔案, 然後按一下[開啟]按鈕.", - "rename": "重新命名", - "replace": "替代", + "rename": "改名", + "replace": "替換", "sharedfiles": "分享檔案", "successstorefile": "檔案已成功儲存.現在您可以選擇檔案進行上傳到您的個人檔案." } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/ar.json b/www/core/components/sidemenu/lang/ar.json index 79c72d2c731..79a0f6adb0d 100644 --- a/www/core/components/sidemenu/lang/ar.json +++ b/www/core/components/sidemenu/lang/ar.json @@ -2,7 +2,7 @@ "appsettings": "إعدادات التطبيق", "changesite": "الخروج", "help": "مساعدة", - "logout": "الخروج", - "mycourses": "مقرراتي", + "logout": "خروج", + "mycourses": "مقرراتي الدراسية", "website": "الموقع" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/ca.json b/www/core/components/sidemenu/lang/ca.json index 321730fec1f..d2e61d92b7b 100644 --- a/www/core/components/sidemenu/lang/ca.json +++ b/www/core/components/sidemenu/lang/ca.json @@ -2,7 +2,7 @@ "appsettings": "Paràmetres de l'aplicació", "changesite": "Canvia de lloc", "help": "Ajuda", - "logout": "Desconnecta", + "logout": "Surt", "mycourses": "Els meus cursos", "togglemenu": "Canvia menú", "website": "Lloc web" diff --git a/www/core/components/sidemenu/lang/cs.json b/www/core/components/sidemenu/lang/cs.json index 7de80a2bb9b..68c7fe8de79 100644 --- a/www/core/components/sidemenu/lang/cs.json +++ b/www/core/components/sidemenu/lang/cs.json @@ -1,8 +1,8 @@ { "appsettings": "Nastavení aplikace", "changesite": "Změnit stránky", - "help": "Nápověda", - "logout": "Odhlásit", + "help": "Pomoc", + "logout": "Odhlásit se", "mycourses": "Moje kurzy", "togglemenu": "Přepnout nabídku", "website": "Webová stránka" diff --git a/www/core/components/sidemenu/lang/de.json b/www/core/components/sidemenu/lang/de.json index 0ed4e3b6221..e700f3ddc90 100644 --- a/www/core/components/sidemenu/lang/de.json +++ b/www/core/components/sidemenu/lang/de.json @@ -2,7 +2,7 @@ "appsettings": "Einstellungen", "changesite": "Website wechseln", "help": "Hilfe", - "logout": "Abmelden", + "logout": "Logout", "mycourses": "Meine Kurse", "togglemenu": "Menü umschalten", "website": "Website" diff --git a/www/core/components/sidemenu/lang/el.json b/www/core/components/sidemenu/lang/el.json index 2e0168f9e01..114771adbff 100644 --- a/www/core/components/sidemenu/lang/el.json +++ b/www/core/components/sidemenu/lang/el.json @@ -2,7 +2,7 @@ "appsettings": "Ρυθμίσεις εφαρμογής", "changesite": "Αλλαγή ιστότοπου", "help": "Βοήθεια", - "logout": "Αποσύνδεση", + "logout": "Έξοδος", "mycourses": "Τα μαθήματά μου", "togglemenu": "Αλλαγή μενού", "website": "Ιστότοπος" diff --git a/www/core/components/sidemenu/lang/es-mx.json b/www/core/components/sidemenu/lang/es-mx.json index e2079172694..fb36a0997ba 100644 --- a/www/core/components/sidemenu/lang/es-mx.json +++ b/www/core/components/sidemenu/lang/es-mx.json @@ -2,7 +2,7 @@ "appsettings": "Configuraciones del App", "changesite": "Cambiar sitio", "help": "Ayuda", - "logout": "Salir del sitio", + "logout": "Salir", "mycourses": "Mis cursos", "togglemenu": "Alternar menú", "website": "Página web" diff --git a/www/core/components/sidemenu/lang/eu.json b/www/core/components/sidemenu/lang/eu.json index d6c4be2b4ea..c5757719d6e 100644 --- a/www/core/components/sidemenu/lang/eu.json +++ b/www/core/components/sidemenu/lang/eu.json @@ -2,7 +2,7 @@ "appsettings": "App-aren ezarpenak", "changesite": "Aldatu gunea", "help": "Laguntza", - "logout": "Irten", + "logout": "Saioa amaitu", "mycourses": "Nire ikastaroak", "togglemenu": "Aldatu menua", "website": "Webgunea" diff --git a/www/core/components/sidemenu/lang/fa.json b/www/core/components/sidemenu/lang/fa.json index 7d4184a0d64..34bdcc7018f 100644 --- a/www/core/components/sidemenu/lang/fa.json +++ b/www/core/components/sidemenu/lang/fa.json @@ -1,8 +1,8 @@ { "appsettings": "تنظیمات برنامه", "changesite": "خروج", - "help": "راهنما", - "logout": "خروج", + "help": "راهنمایی", + "logout": "خروج از سایت", "mycourses": "درس‌های من", "website": "پایگاه اینترنتی" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/he.json b/www/core/components/sidemenu/lang/he.json index defec49d009..df2620a0194 100644 --- a/www/core/components/sidemenu/lang/he.json +++ b/www/core/components/sidemenu/lang/he.json @@ -2,7 +2,7 @@ "appsettings": "הגדרות יישומון", "changesite": "התנתק", "help": "עזרה", - "logout": "התנתק", + "logout": "התנתקות", "mycourses": "הקורסים שלי", "togglemenu": "החלפת מצב תפריט", "website": "אתר אינטרנט" diff --git a/www/core/components/sidemenu/lang/it.json b/www/core/components/sidemenu/lang/it.json index b86c1c18949..9e368b1ef6f 100644 --- a/www/core/components/sidemenu/lang/it.json +++ b/www/core/components/sidemenu/lang/it.json @@ -2,7 +2,7 @@ "appsettings": "Impostazioni app", "changesite": "Cambia sito", "help": "Aiuto", - "logout": "Logout", + "logout": "Esci", "mycourses": "I miei corsi", "togglemenu": "Attiva/disattiva menu", "website": "Sito web" diff --git a/www/core/components/sidemenu/lang/lt.json b/www/core/components/sidemenu/lang/lt.json index 0f0cb015df4..4f3f66ea9f3 100644 --- a/www/core/components/sidemenu/lang/lt.json +++ b/www/core/components/sidemenu/lang/lt.json @@ -1,9 +1,9 @@ { "appsettings": "Programėlės nustatymai", "changesite": "Pakeisti svetainę", - "help": "Pagalba", - "logout": "Pakeisti svetainę", - "mycourses": "Mano mokymo programos", + "help": "Žinynas", + "logout": "Atsijungti", + "mycourses": "Mano kursai", "togglemenu": "Perjungti", "website": "Interneto svetainė" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/nl.json b/www/core/components/sidemenu/lang/nl.json index d06e70ec6d8..8a50f17cc30 100644 --- a/www/core/components/sidemenu/lang/nl.json +++ b/www/core/components/sidemenu/lang/nl.json @@ -2,7 +2,7 @@ "appsettings": "App instellingen", "changesite": "Naar andere site", "help": "Help", - "logout": "Afmelden", + "logout": "Log uit", "mycourses": "Mijn cursussen", "togglemenu": "Menu schakelen", "website": "Website" diff --git a/www/core/components/sidemenu/lang/pl.json b/www/core/components/sidemenu/lang/pl.json index db5b40a15cd..dc57d0910b1 100644 --- a/www/core/components/sidemenu/lang/pl.json +++ b/www/core/components/sidemenu/lang/pl.json @@ -1,7 +1,7 @@ { "changesite": "Wyloguj", "help": "Pomoc", - "logout": "Wyloguj", + "logout": "Wyloguj się", "mycourses": "Moje kursy", "website": "Witryna" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/pt.json b/www/core/components/sidemenu/lang/pt.json index f972c409f74..479ba8e4f48 100644 --- a/www/core/components/sidemenu/lang/pt.json +++ b/www/core/components/sidemenu/lang/pt.json @@ -2,7 +2,7 @@ "appsettings": "Configurações da aplicação", "changesite": "Mudar de site", "help": "Ajuda", - "logout": "Terminar sessão", + "logout": "Sair", "mycourses": "As minhas disciplinas", "togglemenu": "Alternar menu", "website": "Site" diff --git a/www/core/components/sidemenu/lang/ro.json b/www/core/components/sidemenu/lang/ro.json index ea5d1d106e0..1c5f17d9e01 100644 --- a/www/core/components/sidemenu/lang/ro.json +++ b/www/core/components/sidemenu/lang/ro.json @@ -2,7 +2,7 @@ "appsettings": "Setările aplicației", "changesite": "Schimbați siteul", "help": "Ajutor", - "logout": "Schimbați siteul", + "logout": "Ieşire", "mycourses": "Cursurile mele", "togglemenu": "Meniul pentru comutare", "website": "Website" diff --git a/www/core/components/sidemenu/lang/ru.json b/www/core/components/sidemenu/lang/ru.json index 668c559c737..541a10d3285 100644 --- a/www/core/components/sidemenu/lang/ru.json +++ b/www/core/components/sidemenu/lang/ru.json @@ -1,7 +1,7 @@ { "appsettings": "Настройки приложения", "changesite": "Выход", - "help": "Помощь", + "help": "Справка", "logout": "Выход", "mycourses": "Мои курсы", "website": "Сайт" diff --git a/www/core/components/sidemenu/lang/tr.json b/www/core/components/sidemenu/lang/tr.json index 57800da7afa..ace500a4db3 100644 --- a/www/core/components/sidemenu/lang/tr.json +++ b/www/core/components/sidemenu/lang/tr.json @@ -1,7 +1,7 @@ { "changesite": "Çıkış", "help": "Yardım", - "logout": "Çıkış", + "logout": "Çıkış yap", "mycourses": "Derslerim", "website": "Websitesi" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/uk.json b/www/core/components/sidemenu/lang/uk.json index 2442161b325..21328fec9b5 100644 --- a/www/core/components/sidemenu/lang/uk.json +++ b/www/core/components/sidemenu/lang/uk.json @@ -2,7 +2,7 @@ "appsettings": "Налаштування додатку", "changesite": "Змінити сайт", "help": "Допомога", - "logout": "Вийти", + "logout": "Вихід", "mycourses": "Мої курси", "togglemenu": "Перемикання меню", "website": "Веб-сайт" diff --git a/www/core/components/sidemenu/lang/zh-cn.json b/www/core/components/sidemenu/lang/zh-cn.json index ea6cd6e91e1..045f90c1630 100644 --- a/www/core/components/sidemenu/lang/zh-cn.json +++ b/www/core/components/sidemenu/lang/zh-cn.json @@ -1,7 +1,7 @@ { "changesite": "注销", "help": "帮助", - "logout": "注销", + "logout": "退出", "mycourses": "我的课程", "website": "网站" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/zh-tw.json b/www/core/components/sidemenu/lang/zh-tw.json index 412f2616441..e157aab2b0e 100644 --- a/www/core/components/sidemenu/lang/zh-tw.json +++ b/www/core/components/sidemenu/lang/zh-tw.json @@ -1,8 +1,8 @@ { "appsettings": "應用程式設定", "changesite": "更換網站", - "help": "協助", - "logout": "更換網站", + "help": "輔助說明", + "logout": "登出", "mycourses": "我的課程", "togglemenu": "切換功能選單", "website": "網站" diff --git a/www/core/components/user/lang/ar.json b/www/core/components/user/lang/ar.json index 33cf6dc0156..c2213eb9c76 100644 --- a/www/core/components/user/lang/ar.json +++ b/www/core/components/user/lang/ar.json @@ -3,10 +3,10 @@ "city": "المدينة/البلدة", "contact": "جهة اتصال", "country": "الدولة", - "description": "الوصف", - "details": "التفاصيل", + "description": "نص المقدمة", + "details": "تفاصيل متابعة اسكو", "editingteacher": "معلم", - "email": "عنوان البريد الإلكتروني", + "email": "بريد الإلكتروني", "emailagain": "إعادة إدخال البريد الإلكتروني للتأكيد ", "firstname": "الاسم الأول", "interests": "اهتمامات", @@ -15,7 +15,7 @@ "manager": "مدير", "newpicture": "صورة شخصية جديدة", "phone1": "هاتف", - "phone2": "الجوال", + "phone2": "رقم الهاتف المحمول", "roles": "أدوار", "student": "طالب", "viewprofile": "عرض الحساب", diff --git a/www/core/components/user/lang/bg.json b/www/core/components/user/lang/bg.json index 6141ac3935c..022f6afb2b1 100644 --- a/www/core/components/user/lang/bg.json +++ b/www/core/components/user/lang/bg.json @@ -1,22 +1,22 @@ { "address": "Адрес", "city": "Град/село", - "contact": "Контакти", + "contact": "Контакт", "country": "Държава", - "description": "Въвеждащ текст", + "description": "Описание", "details": "Подробности", "detailsnotavailable": "Детайлите за този потребител не са достъпни за Вас.", "editingteacher": "Учител", - "email": "Имейл адрес", + "email": "Имейл", "emailagain": "Имейл адрес (отново)", "firstname": "Име", "interests": "Интереси", - "invaliduser": "Невалиден потребител.", + "invaliduser": "Невалиден потребител", "lastname": "Фамилия", "manager": "Мениждър", "newpicture": "Нова снимка", "phone1": "Телефон", - "phone2": "Мобилен", + "phone2": "Мобилен телефон", "roles": "Роли", "student": "Студент", "teacher": "Не-редактиращ учител", diff --git a/www/core/components/user/lang/ca.json b/www/core/components/user/lang/ca.json index 94d4813e716..a5f782e392b 100644 --- a/www/core/components/user/lang/ca.json +++ b/www/core/components/user/lang/ca.json @@ -4,19 +4,19 @@ "contact": "Contacte", "country": "País", "description": "Descripció", - "details": "Detalls", + "details": "Detalls de seguiment", "detailsnotavailable": "No tens accés als detalls d'aquest usuari.", "editingteacher": "Professor", - "email": "Adreça electrònica", + "email": "Correu electrònic", "emailagain": "Correu electrònic (una altra vegada)", "firstname": "Nom", "interests": "Interessos", "invaliduser": "L'usuari no és vàlid", "lastname": "Cognoms", "manager": "Gestor", - "newpicture": "Nova imatge", + "newpicture": "Imatge nova", "phone1": "Telèfon", - "phone2": "Mòbil", + "phone2": "Telèfon mòbil", "roles": "Rols", "sendemail": "Correu-e", "student": "Estudiant", diff --git a/www/core/components/user/lang/cs.json b/www/core/components/user/lang/cs.json index c0978326868..5533c565060 100644 --- a/www/core/components/user/lang/cs.json +++ b/www/core/components/user/lang/cs.json @@ -3,20 +3,20 @@ "city": "Město/obec", "contact": "Kontakt", "country": "Země", - "description": "Úvodní text", - "details": "Detaily", + "description": "Popis", + "details": "Podrobnosti o průchodu", "detailsnotavailable": "Podrobnosti o tomto uživateli nejsou k dispozici.", "editingteacher": "Učitel", - "email": "E-mailová adresa", + "email": "Poslat e-mailem", "emailagain": "E-mail (znovu)", "firstname": "Křestní jméno", "interests": "Zájmy", - "invaliduser": "Neplatný uživatel.", + "invaliduser": "Neplatný uživatel", "lastname": "Příjmení", "manager": "Manažer", "newpicture": "Nový obrázek", "phone1": "Telefon", - "phone2": "Mobil", + "phone2": "Mobilní telefon", "roles": "Role", "sendemail": "Email", "student": "Student", diff --git a/www/core/components/user/lang/da.json b/www/core/components/user/lang/da.json index 507cc600278..102926802a6 100644 --- a/www/core/components/user/lang/da.json +++ b/www/core/components/user/lang/da.json @@ -3,15 +3,15 @@ "city": "By", "contact": "Kontakt", "country": "Land", - "description": "Introduktionstekst", - "details": "Detaljer", + "description": "Beskrivelse", + "details": "Følg detaljer", "detailsnotavailable": "Denne brugers data er ikke tilgængelige for dig.", "editingteacher": "Lærer", - "email": "E-mailadresse", + "email": "E-mail", "emailagain": "E-mail (igen)", "firstname": "Fornavn", "interests": "Interesser", - "invaliduser": "Ugyldig bruger.", + "invaliduser": "Ugyldig bruger", "lastname": "Efternavn", "manager": "Manager", "newpicture": "Nyt billede", @@ -20,6 +20,6 @@ "roles": "Roller", "student": "Studerende", "teacher": "Medlærer", - "viewprofile": "Vis Profil", + "viewprofile": "Vis profil", "webpage": "Webside" } \ No newline at end of file diff --git a/www/core/components/user/lang/de.json b/www/core/components/user/lang/de.json index aaf288443b2..9d95a7c6312 100644 --- a/www/core/components/user/lang/de.json +++ b/www/core/components/user/lang/de.json @@ -4,19 +4,19 @@ "contact": "Kontakt", "country": "Land", "description": "Beschreibung", - "details": "Details", + "details": "Trackingdetails", "detailsnotavailable": "Die Nutzerdetails zu dieser Person sind für Sie nicht verfügbar.", "editingteacher": "Trainer/in", - "email": "E-Mail-Adresse", + "email": "E-Mail", "emailagain": "E-Mail (wiederholen)", "firstname": "Vorname", "interests": "Persönliche Interessen", - "invaliduser": "Nutzer/in ungültig", + "invaliduser": "Ungültige Nutzer/in", "lastname": "Nachname", "manager": "Manager/in", "newpicture": "Neues Foto", "phone1": "Telefon", - "phone2": "Mobil", + "phone2": "Mobiltelefon", "roles": "Rollen", "sendemail": "E-Mail", "student": "Teilnehmer/in", diff --git a/www/core/components/user/lang/el.json b/www/core/components/user/lang/el.json index 007097ea4bb..2b3c68364dd 100644 --- a/www/core/components/user/lang/el.json +++ b/www/core/components/user/lang/el.json @@ -3,11 +3,11 @@ "city": "Πόλη/χωριό", "contact": "Επικοινωνία", "country": "Χώρα", - "description": "Κείμενο εισαγωγής", - "details": "Λεπτομέρειες", + "description": "Περιγραφή", + "details": "Παρακολούθηση λεπτομερειών", "detailsnotavailable": "Λεπτομέρειες για αυτό τον χρήστη δεν είναι διαθέσιμες.", "editingteacher": "Διδάσκων", - "email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου", + "email": "Ηλεκτρονικό Ταχυδρομείο", "emailagain": "Email (ξανά)", "firstname": "Όνομα", "interests": "Ενδιαφέροντα", @@ -16,10 +16,10 @@ "manager": "Διαχειριστής", "newpicture": "Νέα εικόνα", "phone1": "Τηλέφωνο", - "phone2": "Κινητό", + "phone2": "Κινητό τηλέφωνο", "roles": "Ρόλοι", "sendemail": "Email", - "student": "Μαθητής", + "student": "Φοιτητής", "teacher": "Διδάσκων χωρίς δικαιώματα αλλαγής", "viewprofile": "Επισκόπηση του προφίλ", "webpage": "Ιστοσελίδα" diff --git a/www/core/components/user/lang/es-mx.json b/www/core/components/user/lang/es-mx.json index f04ee84c54c..dabd4a46d5b 100644 --- a/www/core/components/user/lang/es-mx.json +++ b/www/core/components/user/lang/es-mx.json @@ -3,20 +3,20 @@ "city": "Ciudad", "contact": "Contacto", "country": "País", - "description": "Descripción -", - "details": "Detalles", + "description": "Descripción", + "details": "Detalles del seguimiento", "detailsnotavailable": "Los detalles de este usuario no están disponibles para Usted.", "editingteacher": "Profesor", - "email": "Dirección Email", + "email": "Email", "emailagain": "Correo (de nuevo)", "firstname": "Nombre", "interests": "Intereses", - "invaliduser": "Usuario inválido.", + "invaliduser": "Usuario no válido", "lastname": "Apellido(s)", "manager": "Mánager", "newpicture": "Imagen nueva", "phone1": "Teléfono", - "phone2": "Móvil", + "phone2": "Teléfono móvil", "roles": "Roles", "sendemail": "Email", "student": "Estudiante", diff --git a/www/core/components/user/lang/es.json b/www/core/components/user/lang/es.json index 53dbd5e228c..3839cc05d90 100644 --- a/www/core/components/user/lang/es.json +++ b/www/core/components/user/lang/es.json @@ -4,10 +4,10 @@ "contact": "Contacto", "country": "País", "description": "Descripción", - "details": "Detalles", + "details": "Detalles del rastreo SCO", "detailsnotavailable": "No tiene acceso a los detalles de este usuario.", "editingteacher": "Profesor", - "email": "Dirección de correo", + "email": "Email", "emailagain": "Correo (de nuevo)", "firstname": "Nombre", "interests": "Intereses", @@ -16,7 +16,7 @@ "manager": "Gestor", "newpicture": "Imagen nueva", "phone1": "Teléfono", - "phone2": "Móvil", + "phone2": "Teléfono móvil", "roles": "Roles", "sendemail": "Correo electrónico", "student": "Estudiante", diff --git a/www/core/components/user/lang/eu.json b/www/core/components/user/lang/eu.json index 346af5911ec..032d503d7e7 100644 --- a/www/core/components/user/lang/eu.json +++ b/www/core/components/user/lang/eu.json @@ -2,21 +2,21 @@ "address": "Helbidea", "city": "Hiria/Herria", "contact": "Kontaktua", - "country": "Herria", + "country": "Herrialdea", "description": "Deskribapena", - "details": "Xehetasunak", + "details": "Pistaren zehaztasunak", "detailsnotavailable": "Erabiltzaile honen xehetasunak ez daude zuretzat eskuragarri", "editingteacher": "Irakaslea", - "email": "E-posta helbidea", + "email": "E-posta", "emailagain": "E-posta (berriro)", "firstname": "Izena", "interests": "Interesguneak", - "invaliduser": "Erabiltzailea ez da zuzena.", + "invaliduser": "Erabiltzaile baliogabea", "lastname": "Deitura", "manager": "Kudeatzailea", "newpicture": "Irudi berria", "phone1": "Telefonoa", - "phone2": "Sakelekoa", + "phone2": "Telefono mugikorra", "roles": "Rolak", "sendemail": "E-posta", "student": "Ikaslea", diff --git a/www/core/components/user/lang/fa.json b/www/core/components/user/lang/fa.json index 23611349635..9980ecf4e7f 100644 --- a/www/core/components/user/lang/fa.json +++ b/www/core/components/user/lang/fa.json @@ -1,11 +1,11 @@ { "address": "آدرس", "city": "شهر/شهرک", - "contact": "مخاطب", + "contact": "تماس", "country": "کشور", - "description": "توضیح تکلیف", - "details": "جزئیات", - "email": "آدرس پست الکترونیک", + "description": "توصیف", + "details": "دنبال کردن جزئیات", + "email": "پست الکترونیک", "emailagain": "پست الکترونیک (دوباره)", "firstname": "نام", "interests": "علایق", @@ -13,7 +13,7 @@ "lastname": "نام خانوادگی", "newpicture": "عکس جدید", "phone1": "تلفن", - "phone2": "همراه", + "phone2": "تلفن همراه", "roles": "نقش‌ها", "student": "شاگرد", "viewprofile": "مشاهدهٔ صفحهٔ مشخصات فردی", diff --git a/www/core/components/user/lang/fr.json b/www/core/components/user/lang/fr.json index 75c5058d2bf..06e5d47b78d 100644 --- a/www/core/components/user/lang/fr.json +++ b/www/core/components/user/lang/fr.json @@ -4,22 +4,22 @@ "contact": "Contact", "country": "Pays", "description": "Description", - "details": "Détails", + "details": "Détails du parcours", "detailsnotavailable": "Vous n'avez pas accès aux informations de cet utilisateur.", "editingteacher": "Enseignant", - "email": "Adresse de courriel", + "email": "Courriel", "emailagain": "Courriel (confirmation)", "firstname": "Prénom", "interests": "Centres d'intérêt", - "invaliduser": "Utilisateur non valide.", + "invaliduser": "Utilisateur non valide", "lastname": "Nom", "manager": "Gestionnaire", "newpicture": "Nouvelle image", "phone1": "Téléphone", - "phone2": "Mobile", + "phone2": "Téléphone mobile", "roles": "Rôles", "sendemail": "Courriel", - "student": "Étudiant", + "student": "Participants", "teacher": "Enseignant non-éditeur", "viewprofile": "Consulter le profil", "webpage": "Page Web" diff --git a/www/core/components/user/lang/he.json b/www/core/components/user/lang/he.json index 76f6e8d241e..212f9bb5b8a 100644 --- a/www/core/components/user/lang/he.json +++ b/www/core/components/user/lang/he.json @@ -1,22 +1,22 @@ { "address": "כתובת", "city": "ישוב", - "contact": "צור קשר", + "contact": "ליצירת קשר", "country": "ארץ", - "description": "תיאור", - "details": "פרטים", + "description": "הנחיה למטלה", + "details": "דוח המעקב מפורט", "detailsnotavailable": "פרטי משתמש זה אינם זמינים לך.", "editingteacher": "מרצה", - "email": "כתובת דואר אלקטרוני", + "email": "דוא\"ל", "emailagain": "דואר אלקטרוני (שוב)", "firstname": "שם פרטי", "interests": "תחומי עניין", - "invaliduser": "משתמש לא תקף.", + "invaliduser": "משתמש שגוי", "lastname": "שם משפחה", "manager": "מנהל", "newpicture": "תמונה חדשה", "phone1": "טלפון", - "phone2": "סלולרי", + "phone2": "טלפון נייד", "roles": "תפקידים", "student": "סטודנט", "teacher": "עוזר/ת הוראה", diff --git a/www/core/components/user/lang/hu.json b/www/core/components/user/lang/hu.json index de2880aacb9..ea3235ea2d0 100644 --- a/www/core/components/user/lang/hu.json +++ b/www/core/components/user/lang/hu.json @@ -3,9 +3,9 @@ "city": "Helység", "contact": "Kapcsolat", "country": "Ország", - "description": "Bevezető szöveg", + "description": "Leírás", "details": "SCO nyomon követésének részletei", - "email": "E-mail cím", + "email": "E-mail", "emailagain": "E-mail (ismét)", "firstname": "Keresztnév", "interests": "Érdeklődési kör", diff --git a/www/core/components/user/lang/it.json b/www/core/components/user/lang/it.json index bdbd8e8b4ec..9aa43cad4d0 100644 --- a/www/core/components/user/lang/it.json +++ b/www/core/components/user/lang/it.json @@ -3,20 +3,20 @@ "city": "Città /Località", "contact": "Contatto", "country": "Nazione", - "description": "Commento", - "details": "Dettagli", + "description": "Descrizione", + "details": "Dettagli tracciamento", "detailsnotavailable": "Non puoi visualizzare i dettagli di questo utente.", "editingteacher": "Docente", - "email": "Indirizzo email", + "email": "Email", "emailagain": "Indirizzo email (ripeti)", "firstname": "Nome", "interests": "Interessi", - "invaliduser": "Utente non valido.", + "invaliduser": "Utente non valido", "lastname": "Cognome", "manager": "Manager", "newpicture": "Nuova immagine", "phone1": "Telefono", - "phone2": "Mobile", + "phone2": "Cellulare", "roles": "Ruoli", "student": "Studente", "teacher": "Docente non editor", diff --git a/www/core/components/user/lang/ja.json b/www/core/components/user/lang/ja.json index 1d661257fae..a07f54c15b6 100644 --- a/www/core/components/user/lang/ja.json +++ b/www/core/components/user/lang/ja.json @@ -1,11 +1,11 @@ { "address": "住所", "city": "都道府県", - "contact": "コンタクト", + "contact": "連絡先", "country": "国", "description": "説明", - "details": "詳細", - "email": "メールアドレス", + "details": "トラック詳細", + "email": "メール", "emailagain": "メールアドレス (もう一度)", "firstname": "名", "interests": "興味のあること", diff --git a/www/core/components/user/lang/lt.json b/www/core/components/user/lang/lt.json index 794c12956b1..5b7c9101b18 100644 --- a/www/core/components/user/lang/lt.json +++ b/www/core/components/user/lang/lt.json @@ -1,22 +1,22 @@ { "address": "Adresas", "city": "Miestas / miestelis", - "contact": "Kontaktai", + "contact": "Kontaktas", "country": "Šalis", - "description": "Aprašas", - "details": "Detalės", + "description": "Įžangos tekstas", + "details": "Sekimo išsami informacija", "detailsnotavailable": "Šio vartotojo duomenys jums nepasiekiami.", "editingteacher": "Dėstytojas", - "email": "El. pašto adresas", + "email": "El. laiškas", "emailagain": "El. paštas (dar kartą)", "firstname": "Vardas", "interests": "Pomėgiai", - "invaliduser": "Netinkamas vartotojas.", + "invaliduser": "Klaidingas naudotojas", "lastname": "Pavardė", "manager": "Valdytojas", "newpicture": "Naujas paveikslėlis", "phone1": "Telefonas", - "phone2": "Mobilus", + "phone2": "Mobilusis telefonas", "roles": "Vaidmenys", "student": "Besimokantysis", "teacher": "Neredaguojantis mokytojas", diff --git a/www/core/components/user/lang/nl.json b/www/core/components/user/lang/nl.json index 9e9b2898795..040c2592de8 100644 --- a/www/core/components/user/lang/nl.json +++ b/www/core/components/user/lang/nl.json @@ -3,15 +3,15 @@ "city": "Plaats", "contact": "Contact", "country": "Land", - "description": "Inleidende tekst", - "details": "Details", + "description": "Beschrijving", + "details": "SCO opvolgdetails", "detailsnotavailable": "Je kunt de details voor deze gebruiker niet bekijken.", "editingteacher": "Leraar", - "email": "E-mailadres", + "email": "E-mail", "emailagain": "E-mail (nogmaals)", "firstname": "Voornaam", "interests": "Interesses", - "invaliduser": "Ongeldige gebuiker", + "invaliduser": "Ongeldige gebruiker", "lastname": "Achternaam", "manager": "Manager", "newpicture": "Nieuwe foto", diff --git a/www/core/components/user/lang/pl.json b/www/core/components/user/lang/pl.json index 36dbf206198..e81808a5344 100644 --- a/www/core/components/user/lang/pl.json +++ b/www/core/components/user/lang/pl.json @@ -3,9 +3,9 @@ "city": "Miasto", "contact": "Połącz", "country": "Kraj", - "description": "Wstęp", + "description": "Opis", "details": "Szczegóły ścieżki", - "email": "E-mail", + "email": "e-mail", "emailagain": "E-mail (jeszcze raz)", "firstname": "Imię", "interests": "Zainteresowania", diff --git a/www/core/components/user/lang/pt-br.json b/www/core/components/user/lang/pt-br.json index 7ab46d831a7..e212093a063 100644 --- a/www/core/components/user/lang/pt-br.json +++ b/www/core/components/user/lang/pt-br.json @@ -3,20 +3,20 @@ "city": "Cidade/Município", "contact": "Contato", "country": "País", - "description": "Texto do link", - "details": "Detalhes", + "description": "Descrição", + "details": "Detalhes do registro", "detailsnotavailable": "Os detalhes desse usuário não estão disponíveis para você.", "editingteacher": "Professor", - "email": "Endereço de email", + "email": "Email", "emailagain": "Confirmar endereço de e-mail", "firstname": "Nome", "interests": "Interesses", - "invaliduser": "Usuário inválido.", + "invaliduser": "Usuário inválido", "lastname": "Sobrenome", "manager": "Gerente", "newpicture": "Nova imagem", "phone1": "Fone", - "phone2": "Celular", + "phone2": "Telefone celular", "roles": "Papéis", "sendemail": "Email", "student": "Estudante", diff --git a/www/core/components/user/lang/pt.json b/www/core/components/user/lang/pt.json index dd9f07a9a2c..7b0f3e6910f 100644 --- a/www/core/components/user/lang/pt.json +++ b/www/core/components/user/lang/pt.json @@ -4,10 +4,10 @@ "contact": "Contacto", "country": "País", "description": "Descrição", - "details": "Detalhes", + "details": "Detalhe do percurso", "detailsnotavailable": "Não tem acesso aos detalhes deste utilizador.", "editingteacher": "Professor", - "email": "Endereço de e-mail", + "email": "E-mail", "emailagain": "E-mail (novamente)", "firstname": "Nome", "interests": "Interesses", diff --git a/www/core/components/user/lang/ro.json b/www/core/components/user/lang/ro.json index 5e7dcf168ec..b6929b4f310 100644 --- a/www/core/components/user/lang/ro.json +++ b/www/core/components/user/lang/ro.json @@ -3,22 +3,22 @@ "city": "Oraş/localitate", "contact": "Contact", "country": "Ţara", - "description": "Text introductiv", - "details": "Detalii", + "description": "Descriere", + "details": "Detalii înregistrare activitate", "detailsnotavailable": "Detaliile acestui utilizator nu vă sunt disponibile.", "editingteacher": "Profesor", - "email": "Adresă email", + "email": "Email", "emailagain": "Email (reintroduceţi)", "firstname": "Prenume", "interests": "Interese", - "invaliduser": "Utilizator necunoscut.", + "invaliduser": "Utilizator incorect", "lastname": "Nume", "manager": "Manager", "newpicture": "Imagine nouă", "phone1": "Telefon", "phone2": "Mobil", "roles": "Roluri", - "student": "Student", + "student": "Cursant", "teacher": "Profesor asistent", "viewprofile": "Vezi profilul", "webpage": "Pagină Web" diff --git a/www/core/components/user/lang/ru.json b/www/core/components/user/lang/ru.json index 33bd27a775e..eec8fc8030f 100644 --- a/www/core/components/user/lang/ru.json +++ b/www/core/components/user/lang/ru.json @@ -3,20 +3,20 @@ "city": "Город", "contact": "Контакты", "country": "Страна", - "description": "Вступление", - "details": "Подробнее", + "description": "Описание", + "details": "Подробный отчет", "detailsnotavailable": "Вам не доступны подробности этого пользователя", "editingteacher": "Учитель", - "email": "Адрес электронной почты", + "email": "Email", "emailagain": "Адрес электронной почты (еще раз)", "firstname": "Имя", "interests": "Интересы", - "invaliduser": "Неправильный пользователь", + "invaliduser": "Некорректный пользователь", "lastname": "Фамилия", "manager": "Управляющий", "newpicture": "Новое изображение", "phone1": "Телефон", - "phone2": "Мобильный", + "phone2": "Мобильный телефон", "roles": "Роли", "student": "Студент", "teacher": "Учитель без права редактирования (ассистент)", diff --git a/www/core/components/user/lang/sr-cr.json b/www/core/components/user/lang/sr-cr.json index 8770ab16865..c97c7534c91 100644 --- a/www/core/components/user/lang/sr-cr.json +++ b/www/core/components/user/lang/sr-cr.json @@ -1,12 +1,26 @@ { + "address": "Адреса", + "city": "Место", "contact": "Контакт", - "details": "Подаци о кориснику", + "country": "Држава", + "description": "Опис", + "details": "Прати детаље", "detailsnotavailable": "Подаци о овом кориснику вам нису доступни.", "editingteacher": "Предавач", - "invaliduser": "Неисправан корисник.", + "email": "Адреса е-поште", + "emailagain": "Адреса е-поште (поново)", + "firstname": "Име", + "interests": "Интересовања", + "invaliduser": "Неисправан корисник", + "lastname": "Презиме", "manager": "Менаџер", - "phone2": "Мобилни", + "newpicture": "Нова слика", + "phone1": "Телефон", + "phone2": "Мобилни телефон", + "roles": "Улоге", "sendemail": "Е-пошта", "student": "Полазник", - "teacher": "Предавач без уређивачких права" + "teacher": "Предавач без уређивачких права", + "viewprofile": "Прегледај профил", + "webpage": "Веб страница" } \ No newline at end of file diff --git a/www/core/components/user/lang/sr-lt.json b/www/core/components/user/lang/sr-lt.json index 96a85eb0ff5..97e30a4e4c8 100644 --- a/www/core/components/user/lang/sr-lt.json +++ b/www/core/components/user/lang/sr-lt.json @@ -1,12 +1,26 @@ { + "address": "Adresa", + "city": "Mesto", "contact": "Kontakt", - "details": "Podaci o korisniku", + "country": "Država", + "description": "Opis", + "details": "Prati detalje", "detailsnotavailable": "Podaci o ovom korisniku vam nisu dostupni.", "editingteacher": "Predavač", - "invaliduser": "Neispravan korisnik.", + "email": "Adresa e-pošte", + "emailagain": "Adresa e-pošte (ponovo)", + "firstname": "Ime", + "interests": "Interesovanja", + "invaliduser": "Neispravan korisnik", + "lastname": "Prezime", "manager": "Menadžer", - "phone2": "Mobilni", + "newpicture": "Nova slika", + "phone1": "Telefon", + "phone2": "Mobilni telefon", + "roles": "Uloge", "sendemail": "E-pošta", "student": "Polaznik", - "teacher": "Predavač bez uređivačkih prava" + "teacher": "Predavač bez uređivačkih prava", + "viewprofile": "Pregledaj profil", + "webpage": "Web stranica" } \ No newline at end of file diff --git a/www/core/components/user/lang/sv.json b/www/core/components/user/lang/sv.json index 19f29bc1d7f..94ca7299b23 100644 --- a/www/core/components/user/lang/sv.json +++ b/www/core/components/user/lang/sv.json @@ -3,22 +3,22 @@ "city": "Stad/ort", "contact": "Kontakt", "country": "Land", - "description": "Introduktion", - "details": "Detaljer", + "description": "Beskrivning", + "details": "Detaljerad SCO spårning", "detailsnotavailable": "Detaljerna till denna användare är inte tillgängliga för dig.", "editingteacher": "Lärare", - "email": "E-postadress", + "email": "E-post", "emailagain": "E-post (igen)", "firstname": "Förnamn", "interests": "Intressen", - "invaliduser": "Ogiltig användare.", + "invaliduser": "Ogiltig användare", "lastname": "Efternamn", "manager": "Manager", "newpicture": "Ny bild", "phone1": "Telefon", - "phone2": "Mobil", + "phone2": "Mobiltelefon", "roles": "Roller", - "student": "Student", + "student": "Student/elev/deltagare/lärande", "teacher": "Icke editerande lärare", "viewprofile": "Visa profil", "webpage": "Webbsida" diff --git a/www/core/components/user/lang/tr.json b/www/core/components/user/lang/tr.json index 7dc39a77eef..0415b166cdc 100644 --- a/www/core/components/user/lang/tr.json +++ b/www/core/components/user/lang/tr.json @@ -1,21 +1,21 @@ { "address": "Adres", "city": "Şehir", - "contact": "Kişi", + "contact": "İletişim", "country": "Ülke", - "description": "Tanıtım metni", - "details": "Detaylar", + "description": "Açıklama", + "details": "İzleme ayrıntıları", "editingteacher": "Öğretmen", - "email": "E-posta adresi", + "email": "E-posta", "emailagain": "E-posta (tekrar)", "firstname": "Adı", "interests": "İlgi alanları", - "invaliduser": "Geçersiz kullanıcı.", + "invaliduser": "Geçersiz kullanıcı", "lastname": "Soyadı", "manager": "Yönetici", "newpicture": "Yeni resim", "phone1": "Telefon", - "phone2": "Mobil", + "phone2": "Cep telefonu", "roles": "Roller", "student": "Öğrenci", "teacher": "Düzenleme yetkisi olmayan öğretmen", diff --git a/www/core/components/user/lang/uk.json b/www/core/components/user/lang/uk.json index 4e829c3f276..94b6b0bd9ad 100644 --- a/www/core/components/user/lang/uk.json +++ b/www/core/components/user/lang/uk.json @@ -3,20 +3,20 @@ "city": "Місто", "contact": "Контакт", "country": "Країна", - "description": "Текст вступу", - "details": "Деталі", + "description": "Опис", + "details": "Деталі запису", "detailsnotavailable": "Деталі цього користувача вам не доступні", "editingteacher": "Вчитель", - "email": "Електронна пошта", + "email": "Ел.пошта", "emailagain": "Електронна пошта (повторно)", "firstname": "Ім'я", "interests": "Інтереси", - "invaliduser": "Невірний користувач.", + "invaliduser": "Неправильний користувач", "lastname": "Прізвище", "manager": "Менеджер", "newpicture": "Новий малюнок", "phone1": "Телефон", - "phone2": "Mobile", + "phone2": "Мобільний телефон", "roles": "Ролі", "sendemail": "Email", "student": "Студент", diff --git a/www/core/components/user/lang/zh-cn.json b/www/core/components/user/lang/zh-cn.json index a1d49df5eb3..f1e99807e98 100644 --- a/www/core/components/user/lang/zh-cn.json +++ b/www/core/components/user/lang/zh-cn.json @@ -1,11 +1,11 @@ { "address": "地址", "city": "市/县", - "contact": "联系方式", + "contact": "联系", "country": "国家和地区", - "description": "简要描述", - "details": "详情", - "email": "Email地址", + "description": "描述", + "details": "查看详情", + "email": "Email", "emailagain": "Email (重复)", "firstname": "名", "interests": "兴趣", diff --git a/www/core/components/user/lang/zh-tw.json b/www/core/components/user/lang/zh-tw.json index d54e254418d..bb119de2d5b 100644 --- a/www/core/components/user/lang/zh-tw.json +++ b/www/core/components/user/lang/zh-tw.json @@ -1,22 +1,22 @@ { "address": "地址", "city": "縣/市", - "contact": "連絡人", + "contact": "聯絡", "country": "國家", - "description": "簡介文字", - "details": "明細", + "description": "說明", + "details": "SCO 追蹤細節", "detailsnotavailable": "這個使用者的詳細資料無法提供給您", "editingteacher": "教師", - "email": "電子郵件信箱", + "email": "電子郵件", "emailagain": "電子郵件(再次確認)", "firstname": "名字", "interests": "興趣", - "invaliduser": "無效的使用者", + "invaliduser": "無效的用戶", "lastname": "姓氏", "manager": "管理者", "newpicture": "新照片", "phone1": "電話", - "phone2": "行動", + "phone2": "手機", "roles": "角色", "student": "學生", "teacher": "非編輯中的教師", diff --git a/www/core/lang/ar.json b/www/core/lang/ar.json index 60af9e74633..8bd2f54a65c 100644 --- a/www/core/lang/ar.json +++ b/www/core/lang/ar.json @@ -1,15 +1,15 @@ { "allparticipants": "كل المشاركين", "areyousure": "هل انت متأكد؟", - "back": "العودة", - "cancel": "إلغاء", + "back": "رجوع", + "cancel": "ألغي", "cannotconnect": "لا يمكن الاتصال: تحقق من أنك كتبت عنوان URL بشكل صحيح وأنك تستخدم موقع موودل 2.4 أو أحدث.", - "category": "التصنيف", + "category": "فئة", "choose": "اختر", "choosedots": "اختر...", "clicktohideshow": "انقر للطي أو التوسيع", - "close": "أغلق", - "comments": "تعليقاتك", + "close": "أغلاق النافذه", + "comments": "تعليقات", "commentscount": "التعليقات ({{$a}})", "completion-alt-auto-fail": "مكتمل (لم تحقق درحة النجاح)", "completion-alt-auto-n": "غير مكتمل", @@ -27,12 +27,12 @@ "decsep": ".", "delete": "حذف", "deleting": "حذف", - "description": "الوصف", + "description": "نص المقدمة", "done": "تم", - "download": "تحميل", + "download": "تنزيل", "downloading": "يتم التنزيل", - "edit": "حرر", - "error": "خطاء", + "edit": "تحرير", + "error": "حصل خطاء", "errordownloading": "خطأ عن تنزيل الملف", "filename": "اسم الملف", "folder": "مجلد", @@ -52,7 +52,7 @@ "loading": "يتم التحميل", "lostconnection": "فقدنا الاتصال تحتاج إلى إعادة الاتصال. المميز الخاص بك هو الآن غير صالح", "maxsizeandattachments": "الحجم الأقصى للملفات الجديدة: {{$a.size}}, أقصى عدد للمرفقات: {{$a.attachments}}", - "min": "الحد الأدنى", + "min": "أقل درجة", "mins": "دقائق", "mod_assign": "مهمة", "mod_assignment": "مهمة", @@ -77,14 +77,14 @@ "mod_workshop": "ورشة عمل", "moduleintro": "وصف", "mygroups": "مجموعاتي", - "name": "الاسم", + "name": "اسم", "networkerrormsg": "لم يتم تمكين الشبكة أو أنها لا تعمل.", "never": "مطلقاً", - "next": "التالي", + "next": "استمر", "no": "لا", "nocomments": "لا يوجد تعليقات", "nograde": "لا توجد درجة", - "none": "لا يوجد", + "none": "لا شئ", "nopasswordchangeforced": "لا يمكنك الاستمرار دون تغيير كلمة مرورك، لكن يبدو أنه لا يوجد صفحة متوفرة لتغييرها. رجاءً قم بالاتصال بمدير مودل.", "nopermissions": "عذراً ولكنك لا تملك حالياً الصلاحيات لتقوم بهذا ({{$a}})", "noresults": "لا توجد نتائج", @@ -97,31 +97,32 @@ "pagea": "صفحة {{$a}}", "phone": "هاتف", "pictureof": "صورة {{$a}}", - "previous": "السابق", + "previous": "الوضع السابق", "pulltorefresh": "اسحب للأسفل ليتم التحديث", - "refresh": "تحديث", - "required": "مفروض", + "refresh": "تنشيط", + "required": "مطلوب", "save": "حفظ", "search": "بحث", - "searching": "يتم البحث", + "searching": "بحث في", "searchresults": "نتائج البحث", "sec": "ثانية", "secs": "ثواني", "seemoredetail": "اضغط هنا لترى تفاصيل أكثر", - "send": "إرسل", + "send": "إرسال", "sending": "يتم الإرسال", "serverconnection": "خطأ في الاتصال بالخادم", - "show": "اظهر", + "show": "عرض", "site": "الموقع", "sizeb": "بايتز", "sizegb": "غيغابايت", "sizekb": "كيلو بايت", "sizemb": "ميغا بايب", + "sortby": "إفرز بـ", "start": "إبداء", - "submit": "سلم", + "submit": "سلم/قدم", "success": "نجاح", "teachers": "معلمون", - "time": "وقت", + "time": "الوقت", "timesup": "انتهى الوقت!", "today": "اليوم", "unexpectederror": "خطأ غير متوقع. الرجاء الإغلاق وإعادة فتح التطبيق للمحاولة مرة أخرى", @@ -131,7 +132,7 @@ "userdeleted": "تم حذف اشتراك هذا المستخدم", "userdetails": "تفاصيل المستخدم", "users": "المستخدمون", - "view": "معاينه", + "view": "استعراض", "viewprofile": "عرض الحساب", "year": "سنة", "years": "سنوات", diff --git a/www/core/lang/bg.json b/www/core/lang/bg.json index 1365af87752..980a09a4cc1 100644 --- a/www/core/lang/bg.json +++ b/www/core/lang/bg.json @@ -1,7 +1,7 @@ { "allparticipants": "Всички участници", "areyousure": "Сигурни ли сте?", - "back": "Обратно", + "back": "« Обратно", "cancel": "Отказване", "cannotconnect": "Не става свързване: Проверете дали написахте правилно адреса и дали сайтът използва Moodle версия 2.4 или по-нова.", "category": "Категория", @@ -9,8 +9,8 @@ "choosedots": "Изберете...", "clearsearch": "Изчисти търсенето", "clicktohideshow": "Кликнете за да разгънете или свиете ", - "close": "Затваряне", - "comments": "Ваши коментари", + "close": "Затваряне на прозореца", + "comments": "Коментари", "commentscount": "Коментари ({{$a}})", "completion-alt-manual-n": "Не е завършена дейността: {{$a}}. Изберете я за да я отбележите за завършена.", "completion-alt-manual-y": "Завършена е дейността: {{$a}}. Изберете я за да я отбележите за незавършена.", @@ -21,16 +21,16 @@ "coursedetails": "Информация за курсове", "date": "Дата", "day": "ден", - "days": "дни", + "days": "Дена", "decsep": ",", "delete": "Изтриване", "deleting": "Изтриване", - "description": "Въвеждащ текст", + "description": "Описание", "done": "Извършено", - "download": "Изтегляне", + "download": "Щракнете за да изтеглите експортирания файл с категории", "downloading": "Изтегляне", "edit": "Редактиране", - "error": "Грешка", + "error": "Възникна непозната грешка!", "errordownloading": "Грешка при теглене на файл", "filename": "Име на файл", "folder": "Папка", @@ -49,7 +49,7 @@ "loading": "Зареждане", "lostconnection": "Изгубихме връзка и трябва да се свържете отново. Вашият ключ сега е невалиден.", "maxsizeandattachments": "Максимален размер за нови файлове: {{$a.size}}, максимален брой файлове: {{$a.attachments}}", - "min": "мин", + "min": "Най-ниска", "mins": "мин.", "mod_assign": "Задание", "mod_assignment": "Задание", @@ -80,11 +80,11 @@ "name": "Име", "networkerrormsg": "Мрежата не е разрешена или не работи", "never": "Никога", - "next": "Още", + "next": "Следващ", "no": "Не", "nocomments": "Няма коментари", - "nograde": "Без оценка", - "none": "Нищо", + "nograde": "Няма оценка.", + "none": "Няма", "nopasswordchangeforced": "Не можете да продължите без да се променили паролата, обаче няма налична страница за промяната и. Моля, свържете се с Вашия Moodle администратор.", "nopermissions": "За съжаление Вие нямате право да правите това ({{$a}})", "noresults": "Няма резултати", @@ -92,32 +92,33 @@ "notice": "Съобщене", "now": "сега", "numwords": "{{$a}} думи", - "offline": "Не се изисква предаване онлайн", + "offline": "Офлайн", "online": "Онлайн", "phone": "Телефон", "pictureof": "Снимка на {{$a}}", - "previous": "Обратно", + "previous": "Предишна", "pulltorefresh": "", "refresh": "Опресняване", - "required": "Задължително", - "save": "Запазване", + "required": "Задължителен", + "save": "Запис", "search": "Търсене", - "searching": "Търсене в", + "searching": "Търсене в ...", "searchresults": "Резултати от търсенето", "sec": "сек.", "secs": "сек.", "seemoredetail": "Щракнете тук за повече подробности", - "send": "изпращане", + "send": "Изпращане", "sending": "Изпраща се", - "show": "Да се вижда", + "show": "Показване", "site": "Сайт", "sizeb": "байта", "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", "sizetb": "ТБ", + "sortby": "Нареждане по", "start": "Започване", - "submit": "Изпълняване", + "submit": "Качване", "success": "Успешно", "time": "Време", "timesup": "Времето изтече!", @@ -128,7 +129,7 @@ "userdeleted": "Тази потребителска регистрация е изтрита", "userdetails": "Информация за потребителя", "users": "Потребители", - "view": "Преглед", + "view": "Изглед", "viewprofile": "Разглеждане на профила", "whoops": "Опс!", "years": "години", diff --git a/www/core/lang/ca.json b/www/core/lang/ca.json index 3c4bb775308..11c1effe7d2 100644 --- a/www/core/lang/ca.json +++ b/www/core/lang/ca.json @@ -3,7 +3,7 @@ "allparticipants": "Tots els participants", "android": "Android", "areyousure": "Segur que voleu tirar endavant aquesta acció?", - "back": "Enrere", + "back": "« Enrere", "cancel": "Cancel·la", "cannotconnect": "No s'ha pogut connectar: Comproveu que l'URL és correcte i que el lloc Moodle utilitza la versió 2.4 o posterior.", "cannotdownloadfiles": "La descàrrega d'arxius està deshabilitada al vostre servei Mobile. Contacteu amb l'administrador.", @@ -13,7 +13,7 @@ "clearsearch": "Neteja la cerca", "clicktohideshow": "Feu clic per ampliar o reduir", "clicktoseefull": "Cliqueu per veure el contingut complet.", - "close": "Tanca", + "close": "Tanca finestra", "comments": "Comentaris", "commentscount": "Comentaris ({{$a}})", "commentsnotworking": "No s'han pogut recuperar els comentaris", @@ -36,11 +36,11 @@ "currentdevice": "Dispositiu actual", "datastoredoffline": "S'han desat les dades al dispositiu perquè no s'han pogut enviar. S'enviaran de manera automàtica més tard.", "date": "Data", - "day": "dia", - "days": "dies", + "day": "Dia (dies)", + "days": "Dies", "decsep": ",", "delete": "Suprimeix", - "deleting": "S'està eliminant", + "deleting": "S'està suprimint", "description": "Descripció", "dfdaymonthyear": "DD-MM-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -51,11 +51,11 @@ "discard": "Descarta", "dismiss": "Ignora", "done": "Fet", - "download": "Baixa", + "download": "Descarrega", "downloading": "S'està descarregant", "edit": "Edita", "emptysplit": "Aquesta pàgina estarà buida si el panell esquerre està buit o s'està carregant.", - "error": "Error", + "error": "S'ha produït un error", "errorchangecompletion": "S'ha produït un error en carregar l'estat de la compleció. Si us plau torneu a intentar-ho.", "errordeletefile": "S'ha produït un error en eliminar el fitxer. Torneu-ho a provar més tard.", "errordownloading": "S'ha produït un error en baixar el fitxer.", @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imatge", "imageviewer": "Visor d'imatges", - "info": "Informació", + "info": "Info", "ios": "iOS", "labelsep": ":", "lastmodified": "Darrera modificació", @@ -95,8 +95,8 @@ "loading": "S'està carregant...", "loadmore": "Carrega'n més", "lostconnection": "S'ha perdut la connexió. Necessita tornar a connectar. El testimoni ja no és vàlid.", - "maxsizeandattachments": "Mida màxima per als nous fitxers, {{$a.size}}, adjunts màxims: {{$a.attachments}}", - "min": "minut", + "maxsizeandattachments": "Mida màxima dels fitxers nous: {{$a.size}}, màxim d'adjuncions: {{$a.attachments}}", + "min": "Puntuació mínima", "mins": "minuts", "mod_assign": "Tasca", "mod_assignment": "Tasca", @@ -126,15 +126,15 @@ "mod_workshop": "Taller", "moduleintro": "Descripció", "mygroups": "Els meus grups", - "name": "Nom", + "name": "Nombre", "networkerrormsg": "La connexió a la xarxa no està habilitada o no funciona.", "never": "Mai", - "next": "Següent", + "next": "Continua", "no": "No", - "nocomments": "Sense comentaris", - "nograde": "Sense qualificació", + "nocomments": "No hi ha comentaris", + "nograde": "No hi ha qualificació.", "none": "Cap", - "nopasswordchangeforced": "No podeu continuar sense canviar la contrasenya.", + "nopasswordchangeforced": "No podeu continuar sense canviar la contrasenya, però no està disponible cap pàgina on pugueu canviar-la. Contacteu amb l'administració del vostre Moodle.", "nopermissions": "Actualment no teniu permisos per a fer això ({{$a}})", "noresults": "Sense resultats", "notapplicable": "n/a", @@ -142,7 +142,7 @@ "notsent": "No enviat", "now": "ara", "numwords": "{{$a}} paraules", - "offline": "No es requereix cap tramesa en línia", + "offline": "Fora de línia", "online": "En línia", "openfullimage": "Feu clic per veure la imatge a tamany complert", "openinbrowser": "Obre-ho al navegador", @@ -151,24 +151,24 @@ "percentagenumber": "{{$a}}%", "phone": "Telèfon", "pictureof": "Imatge {{$a}}", - "previous": "Anterior", + "previous": "Estat anterior", "pulltorefresh": "Estira per actualitzar", "redirectingtosite": "Sereu redireccionats al lloc web.", "refresh": "Refresca", - "required": "Necessari", + "required": "Requerit", "requireduserdatamissing": "En aquest perfil d'usuari hi manquen dades requerides. Si us plau ompliu aquestes dades i torneu a intentar-ho.
    {{$a}}", "retry": "Reintenta", "save": "Desa", - "search": "Cerca", - "searching": "S'està cercant", + "search": "Cerca...", + "searching": "Cerca a", "searchresults": "Resultats de la cerca", "sec": "segon", "secs": "segons", "seemoredetail": "Feu clic aquí per veure més detalls", - "send": "envia", + "send": "Envia", "sending": "S'està enviant", "serverconnection": "S'ha produït un error de connexió amb el servidor", - "show": "Mostrar", + "show": "Mostra", "showmore": "Mostra'n més...", "site": "Lloc", "sitemaintenance": "S'estan executant tasques de manteniment i el lloc no està disponible", @@ -178,13 +178,14 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Ho sentim...", + "sortby": "Ordena per", "start": "Inicia", - "submit": "Tramet", + "submit": "Envia", "success": "Èxit", "tablet": "Tablet", "teachers": "Professors", "thereisdatatosync": "Hi ha {{$a}} fora de línia per sincronitzar.", - "time": "Hora", + "time": "Temps", "timesup": "Temps esgotat", "today": "Avui", "tryagain": "Torna-ho a provar", @@ -198,16 +199,16 @@ "unzipping": "S'està descomprimint", "upgraderunning": "El lloc s'està actualitzant. Proveu-ho més tard.", "userdeleted": "S'ha suprimit aquest compte d'usuari", - "userdetails": "Més detall", + "userdetails": "Més dades de l'usuari", "users": "Usuaris", - "view": "Visualització", + "view": "Mostra", "viewprofile": "Mostra el perfil", "warningofflinedatadeleted": "Les dades fora de línia de {{component}} «{{name}}» s'han eliminat. {{error}}", "whoops": "Ui!", "whyisthishappening": "I això per què passa?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "La funció de webservice no està disponible.", - "year": "any", + "year": "Any(s)", "years": "anys", "yes": "Sí" } \ No newline at end of file diff --git a/www/core/lang/cs.json b/www/core/lang/cs.json index 188f6b3b442..5418ade47f0 100644 --- a/www/core/lang/cs.json +++ b/www/core/lang/cs.json @@ -3,8 +3,8 @@ "allparticipants": "Všichni účastníci", "android": "Android", "areyousure": "Opravdu?", - "back": "Zpět", - "cancel": "Přerušit", + "back": "« Zpět", + "cancel": "Zrušit", "cannotconnect": "Nelze se připojit: Ověřte, zda je zadali správně adresu URL a že používáte Moodle 2.4 nebo novější.", "cannotdownloadfiles": "Stahování souborů je vypnuto v Mobilních službách webu. Prosím, obraťte se na správce webu.", "category": "Kategorie", @@ -13,13 +13,13 @@ "clearsearch": "Vymazat vyhledávání", "clicktohideshow": "Klikněte pro rozbalení nebo sbalení", "clicktoseefull": "Kliknutím zobrazit celý obsah.", - "close": "Zavřít", - "comments": "Váš komentář", + "close": "Zavřít okno", + "comments": "Komentáře", "commentscount": "Komentáře ({{$a}})", "commentsnotworking": "Komentáře nemohou být obnoveny", - "completion-alt-auto-fail": "Splněno: {{$a}} ; ale nedosáhli se potřebné známky", + "completion-alt-auto-fail": "Splněno: {{$a}} (nebylo dosaženo požadované známky)", "completion-alt-auto-n": "Nesplněno: {{$a}}", - "completion-alt-auto-pass": "Splněno: {{$a}}; dosáhli se potřebné známky", + "completion-alt-auto-pass": "Splněno: {{$a}} (bylo dosaženo požadované známky)", "completion-alt-auto-y": "Splněno: {{$a}}", "completion-alt-manual-n": "Nesplněno: {{$a}}. Výběrem označíte jako splněné.", "completion-alt-manual-y": "Splněno: {{$a}}. Výběrem označíte jako nesplněné.", @@ -36,13 +36,13 @@ "currentdevice": "Aktuální zařízení", "datastoredoffline": "Data byla uložena na zařízení, protože nemohla být odeslána. Budou odeslána automaticky později.", "date": "Datum", - "day": "den", - "days": "dnů", + "day": "Dnů", + "days": "Dnů", "decsep": ",", "defaultvalue": "Výchozí ({{$a}})", "delete": "Odstranit", "deleting": "Odstraňování", - "description": "Úvodní text", + "description": "Popis", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dffulldate": "dddd, D MMMM YYYY h[:]mm A", @@ -52,11 +52,11 @@ "discard": "Odstranit", "dismiss": "Odmítnout", "done": "Hotovo", - "download": "Stáhnout", + "download": "Klikněte pro stažení exportovaného souboru", "downloading": "Stahování", "edit": "Upravit", "emptysplit": "Pokud je levý panel prázdný nebo se nahrává, zobrazí se tato stránka prázdná.", - "error": "Chyba", + "error": "Vyskytla se chyba", "errorchangecompletion": "Při změně stavu dokončení došlo k chybě. Prosím zkuste to znovu.", "errordeletefile": "Chyba při odstraňování souboru. Prosím zkuste to znovu.", "errordownloading": "Chyba při stahování souboru", @@ -80,24 +80,24 @@ "groupsseparate": "Oddělené skupiny", "groupsvisible": "Viditelné skupiny", "hasdatatosync": "{{$a}} má offline data, která mají být synchronizována.", - "help": "Nápověda", + "help": "Pomoc", "hide": "Skrýt", "hour": "hodina", "hours": "hodin", "humanreadablesize": "{{size}} {{unit}}", "image": "Obrázek", "imageviewer": "Prohlížeč obrázků", - "info": "Informace", + "info": "Info", "ios": "iOS", "labelsep": ": ", "lastmodified": "Naposledy změněno", "lastsync": "Poslední synchronizace", "listsep": ";", - "loading": "Nahrávání", + "loading": "Načítání...", "loadmore": "Načíst další", "lostconnection": "Ztratili jsme spojení, potřebujete se znovu připojit. Váš token je nyní neplatný", "maxsizeandattachments": "Maximální velikost nových souborů: {{$a.size}}, maximální přílohy: {{$a.attachments}}", - "min": "min.", + "min": "Minimální skóre", "mins": "min.", "mod_assign": "Úkol", "mod_assignment": "Úkol", @@ -127,23 +127,23 @@ "mod_workshop": "Workshop", "moduleintro": "Popis", "mygroups": "Moje skupiny", - "name": "Název", + "name": "Jméno", "networkerrormsg": "Síť není povolena nebo nefunguje.", "never": "Nikdy", - "next": "Další", + "next": "Pokračovat", "no": "Ne", - "nocomments": "Bez komentářů", - "nograde": "Bez známky", - "none": "Žádný", - "nopasswordchangeforced": "Nelze pokračovat beze změny hesla.", + "nocomments": "Nejsou žádné komentáře", + "nograde": "Žádné hodnocení.", + "none": "Nic", + "nopasswordchangeforced": "Nemůžete pokračovat dál bez změny hesla, ale stránka pro jeho změnu není k dispozici. Kontaktujte správce Vašeho eLearningu Moodle.", "nopermissions": "Je mi líto, ale momentálně nemáte oprávnění vykonat tuto operaci ({{$a}})", - "noresults": "Bez výsledků", + "noresults": "Žádné výsledky", "notapplicable": "n/a", "notice": "Poznámka", "notsent": "Neodesláno", "now": "nyní", "numwords": "{{$a}} slov", - "offline": "Offline", + "offline": "Nejsou požadovány odpovědi online", "online": "Online", "openfullimage": "Zde klikněte pro zobrazení obrázku v plné velikosti", "openinbrowser": "Otevřít v prohlížeči", @@ -152,24 +152,24 @@ "percentagenumber": "{{$a}}%", "phone": "Telefon", "pictureof": "Obrázek: {{$a}}", - "previous": "Předchozí", + "previous": "O krok zpět", "pulltorefresh": "Stáhněte pro obnovu", "redirectingtosite": "Budete přesměrováni na web.", "refresh": "Obnovit", - "required": "Vyžadováno", + "required": "Povinné", "requireduserdatamissing": "Tento uživatel nemá některá požadovaná data v profilu. Prosím, vyplňte tato data v systému Moodle a zkuste to znovu.
    {{$a}}", "retry": "Opakovat", "save": "Uložit", - "search": "Hledat", - "searching": "Hledání", + "search": "Vyhledat", + "searching": "Hledat v", "searchresults": "Výsledky hledání", "sec": "sek.", "secs": "sekund", "seemoredetail": "Více podrobností...", - "send": "odeslat", - "sending": "Odeslání", + "send": "Odeslat", + "sending": "Odesílání", "serverconnection": "Chyba spojení se serverem", - "show": "Zobrazit", + "show": "Ukázat", "showmore": "Zobrazit více...", "site": "Stránky", "sitemaintenance": "Na webu probíhá údržba a aktuálně není k dispozici", @@ -179,9 +179,10 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Promiňte...", + "sortby": "Třídit podle", "start": "Začátek", "submit": "Odeslat", - "success": "Úspěch!", + "success": "Úspěch", "tablet": "Tablet", "teachers": "Učitelé", "thereisdatatosync": "K dispozici jsou v offline režimu {{$a}}, které mají být synchronizovány.", @@ -202,14 +203,14 @@ "userdetails": "Detaily uživatele", "usernotfullysetup": "Uživatel není plně nastaven", "users": "Uživatelé", - "view": "Zobrazit", + "view": "Zobrazení", "viewprofile": "Zobrazit profil", "warningofflinedatadeleted": "Offline data z {{component}} \"{{name}}\" byla odstraněna. {{error}}", "whoops": "Herdekfilek!", "whyisthishappening": "Proč se to děje?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "Funkce webových služeb není k dispozici.", - "year": "rok", + "year": "Rok(y)", "years": "roky", "yes": "Ano" } \ No newline at end of file diff --git a/www/core/lang/da.json b/www/core/lang/da.json index fdb455e8fae..72894fffc8c 100644 --- a/www/core/lang/da.json +++ b/www/core/lang/da.json @@ -3,7 +3,7 @@ "allparticipants": "Alle deltagere", "android": "Android", "areyousure": "Er du sikker?", - "back": "Tilbage", + "back": "« Tilbage", "cancel": "Annuller", "cannotconnect": "Kan ikke tilslutte: kontroller at webadressen er rigtig og at dit websted bruger Moodle 2.4 eller nyere.", "cannotdownloadfiles": "Download af filer er deaktiveret i din mobilservice. Kontakt dit websteds administrator.", @@ -14,14 +14,14 @@ "clicktohideshow": "Klik for at udvide eller folde sammen", "clicktoseefull": "Klik for at se alt indhold.", "close": "Luk", - "comments": "Dine kommentarer", + "comments": "Kommentarer", "commentscount": "Kommentarer ({{$a}})", - "completion-alt-auto-fail": "Gennemført: {{$a}} (bestod ikke)", + "completion-alt-auto-fail": "Gennemført: {{$a}} (opnåede ikke beståelseskarakter)", "completion-alt-auto-n": "Ikke gennemført: {{$a}}", - "completion-alt-auto-pass": "Gennemført: {{$a}} (bestod)", + "completion-alt-auto-pass": "Gennemført: {{$a}} (opnåede beståelseskarakter)", "completion-alt-auto-y": "Gennemført: {{$a}}", - "completion-alt-manual-n": "Ikke gennemført: {{$a}}. Vælg til markering som gennemført.", - "completion-alt-manual-y": "Gennemført: {{$a}}. Vælg til markering som ikke gennemført.", + "completion-alt-manual-n": "Ikke gennemført: {{$a}}. Vælg for at markere som gennemført.", + "completion-alt-manual-y": "Gennemført: {{$a}}. Vælg for at markere som ikke gennemført.", "confirmcanceledit": "Er du sikker på at du vil forlade denne side? Alle ændringer vil gå tabt.", "confirmdeletefile": "Er du sikker på at du vil slette denne fil?", "confirmopeninbrowser": "Vil du åbne den i en browser?", @@ -31,17 +31,17 @@ "coursedetails": "Kursusdetaljer", "datastoredoffline": "Der blev gemt data på enheden da det ikke kunne sendes. Det vil blive sendt senere.", "date": "Dato", - "day": "dag", - "days": "dage", + "day": "Dag(e)", + "days": "Dage", "decsep": ",", "delete": "Slet", "deleting": "Sletter", - "description": "Introduktionstekst", + "description": "Beskrivelse", "done": "Færdig", - "download": "Download", + "download": "Klik for at downloade den eksporterede kategorifil", "downloading": "Downloader", "edit": "Rediger", - "error": "Fejl", + "error": "Fejl opstået", "errorchangecompletion": "En fejl opstod under ændring af gennemførelsesstatus. Prøv igen.", "errordownloading": "Fejl ved download af fil.", "errordownloadingsomefiles": "Fejl ved download af modulfiler. Nogle filer mangler måske.", @@ -62,16 +62,16 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Billede", "imageviewer": "Billedfremviser", - "info": "Information", + "info": "Info", "ios": "iOS", "labelsep": ":", - "lastmodified": "Sidst ændret", + "lastmodified": "Senest ændret", "lastsync": "Sidste sunkronisering", "listsep": ";", - "loading": "Indlæser", + "loading": "Indlæser...", "lostconnection": "Din godkendelse er ugyldig eller udløbet, så du skal genoprette forbindelsen til webstedet.", "maxsizeandattachments": "Maksimal størrelse på nye filer: {{$a.size}}, højeste antal bilag: {{$a.attachments}}", - "min": "min.", + "min": "Minimum point", "mins": "min.", "mod_assign": "Opgave", "mod_assignment": "Opgave", @@ -103,10 +103,10 @@ "name": "Navn", "networkerrormsg": "Netværk ikke aktiveret eller virker ikke.", "never": "Aldrig", - "next": "Næste", + "next": "Fortsæt", "no": "Nej", - "nocomments": "Ingen kommentarer", - "nograde": "Ingen karakter", + "nocomments": "Der er ingen kommentarer", + "nograde": "Ingen bedømmelse.", "none": "Ingen", "nopasswordchangeforced": "Du kan ikke fortsætte uden at ændre din adgangskode, men der er ingen tilgængelig side at ændre den på. Kontakt venligst din Moodleadministrator.", "nopermissions": "Beklager, men dette ({{$a}}) har du ikke tilladelse til.", @@ -115,7 +115,7 @@ "notice": "Bemærk", "now": "nu", "numwords": "{{$a}} ord", - "offline": "Offline", + "offline": "Der kræves ikke online-aflevering", "online": "Online", "openfullimage": "Klik her for at vise billedet i fuld størrelse.", "openinbrowser": "Åben i browser", @@ -123,34 +123,35 @@ "percentagenumber": "{{$a}}%", "phone": "Telefon", "pictureof": "Billede af {{$a}}", - "previous": "Forrige", + "previous": "Forrige tilstand", "pulltorefresh": "Træk for at opdatere", "refresh": "Genindlæs", - "required": "Påkrævet", + "required": "Krævet", "requireduserdatamissing": "Denne bruger mangler nogle krævede profildata. Udfyld venligst de manglende data i din Moodle og prøv igen.
    {{$a}}", "save": "Gem", - "search": "Søg", - "searching": "Søger", + "search": "Søg...", + "searching": "Søg i", "searchresults": "Søgeresultater", "sec": "sekunder", "secs": "sekunder", "seemoredetail": "Klik her for detaljer", - "send": "send", + "send": "Send", "sending": "Sender", "serverconnection": "Fejl ved forbindelse til server", "show": "Vis", "site": "Websted", "sizeb": "bytes", - "sizegb": "Gb", - "sizekb": "Kb", - "sizemb": "Mb", + "sizegb": "GB", + "sizekb": "KB", + "sizemb": "MB", "sizetb": "TB", + "sortby": "Sorter efter", "start": "Start", - "submit": "Gem", - "success": "Succes!", + "submit": "Send", + "success": "Succes", "tablet": "Tablet", - "teachers": "Undervisere", - "time": "Tidspunkt", + "teachers": "Lærere", + "time": "Tid", "timesup": "Tiden er gået!", "today": "I dag", "twoparagraphs": "{{p1}}

    {{p2}}", @@ -163,11 +164,11 @@ "userdetails": "Brugeroplysninger", "users": "Brugere", "view": "Vis", - "viewprofile": "Vis Profil", + "viewprofile": "Vis profil", "whoops": "Hovsa", "windowsphone": "Windowstelefon", "wsfunctionnotavailable": "Denne webservicefunktion er ikke tilgængelig.", - "year": "år", + "year": "År", "years": "år", "yes": "Ja" } \ No newline at end of file diff --git a/www/core/lang/de.json b/www/core/lang/de.json index 211871a577b..8ed54a59912 100644 --- a/www/core/lang/de.json +++ b/www/core/lang/de.json @@ -3,45 +3,45 @@ "allparticipants": "Alle Teilnehmer/innen", "android": "Android", "areyousure": "Sind Sie sicher?", - "back": "Zurück", + "back": "« Zurück", "cancel": "Abbrechen", "cannotconnect": "Die Verbindung ist nicht möglich. Prüfen Sie, ob die URL richtig ist und dass mindestens Moodle 2.4 verwendet wird.", "cannotdownloadfiles": "Das Herunterladen von Dateien ist im mobilen Webservice deaktiviert. Wenden Sie sich an den Administrator der Website.", - "category": "Kategorie", + "category": "Kursbereich", "choose": "Auswahl", "choosedots": "Auswählen...", "clearsearch": "Suche löschen", "clicktohideshow": "Zum Erweitern oder Zusammenfassen klicken", "clicktoseefull": "Tippen zum Anzeigen aller Inhalte", - "close": "Schließen", - "comments": "Ihr Feedback", + "close": "Fenster schließen", + "comments": "Kommentare", "commentscount": "Kommentare ({{$a}})", "commentsnotworking": "Kommentare können nicht mehr abgerufen werden", - "completion-alt-auto-fail": "Abgeschlossen: {{$a}} (Anforderung nicht erreicht)", + "completion-alt-auto-fail": "Abgeschlossen: {{$a}} (ohne Erfolg)", "completion-alt-auto-n": "Nicht abgeschlossen: {{$a}}", - "completion-alt-auto-pass": "Abgeschlossen: {{$a}} (Anforderung erreicht)", + "completion-alt-auto-pass": "Abgeschlossen: {{$a}} (mit Erfolg)", "completion-alt-auto-y": "Abgeschlossen: {{$a}}", - "completion-alt-manual-n": "Nicht abgeschlossen: {{$a}}. Auswählen, um als abgeschlossen zu markieren.", - "completion-alt-manual-y": "Abgeschlossen: {{$a}}. Auswählen, um als nicht abgeschlossen zu markieren.", + "completion-alt-manual-n": "Nicht abgeschlossen: {{$a}} - mit Auswahl als abgeschlossen markieren", + "completion-alt-manual-y": "Abgeschlossen: {{$a}} - mit Auswahl als nicht abgeschlossen markieren", "confirmcanceledit": "Möchten Sie diese Seite wirklich verlassen? Alle Änderungen gehen verloren!", "confirmdeletefile": "Möchten Sie diese Datei wirklich löschen?", "confirmloss": "Möchten Sie wirklich alle Änderungen verlieren?", "confirmopeninbrowser": "Möchten Sie dies im Browser öffnen?", "content": "Inhalt", "contenteditingsynced": "Der Inhalt, den Sie bearbeiten, wurde synchronisiert.", - "continue": "Weiter", + "continue": "Fortsetzen", "copiedtoclipboard": "Text in die Zwischenablage kopiert", "course": "Kurs", "coursedetails": "Kursdetails", "currentdevice": "Aktuelles Gerät", "datastoredoffline": "Daten wurden im Gerät gespeichert, da sie nicht gesendet werden konnten. Sie werden automatisch später gesendet.", "date": "Datum", - "day": "Tag", + "day": "Tag(e)", "days": "Tage", "decsep": ",", "defaultvalue": "Standard ({{$a}})", "delete": "Löschen", - "deleting": "Löschen ...", + "deleting": "Lösche", "description": "Beschreibung", "dfdaymonthyear": "DD.MM.YYYY", "dfdayweekmonth": "ddd, D. MMM", @@ -52,11 +52,11 @@ "discard": "Verwerfen", "dismiss": "Abbrechen", "done": "Erledigt", - "download": "Herunterladen", + "download": "Download", "downloading": "Herunterladen ...", "edit": "Bearbeiten", "emptysplit": "Diese Seite ist leer, wenn das linke Panel leer ist oder noch geladen wird.", - "error": "Fehler", + "error": "Fehler aufgetreten", "errorchangecompletion": "Fehler beim Ändern des Abschlussstatus. Versuchen Sie es noch einmal.", "errordeletefile": "Fehler beim Löschen der Datei. Versuchen Sie es noch einmal.", "errordownloading": "Fehler beim Laden der Datei", @@ -87,17 +87,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Bild", "imageviewer": "Bildanzeige", - "info": "Info", + "info": "Informationen", "ios": "iOS", "labelsep": ": ", "lastmodified": "Zuletzt geändert", "lastsync": "Letztes Synchronisieren", "listsep": ";", - "loading": "Wird geladen", + "loading": "Wird geladen...", "loadmore": "Mehr laden", "lostconnection": "Die Authentifizierung ist abgelaufen oder ungültig. Sie müssen sich neu verbinden.", "maxsizeandattachments": "Maximale Größe für neue Dateien: {{$a.size}}, Maximale Zahl von Anhängen: {{$a.attachments}}", - "min": "Minute", + "min": "Niedrigste Punktzahl", "mins": "Minuten", "mod_assign": "Aufgabe", "mod_assignment": "Aufgabe", @@ -132,10 +132,10 @@ "never": "Nie", "next": "Weiter", "no": "Nein", - "nocomments": "Noch keine Kommentare", - "nograde": "Keine Bewertung", - "none": "Keine", - "nopasswordchangeforced": "Sie können nicht weitermachen, ohne das Kennwort zu ändern.", + "nocomments": "Keine Kommentare", + "nograde": "Keine Bewertung.", + "none": "Kein", + "nopasswordchangeforced": "Ohne die Änderung des Kennworts können Sie nicht weitermachen. Falls die Seite zur Änderung des Kennworts nicht verfügbar ist, wenden Sie sich an den Administrator der Website.", "nopermissions": "Sie besitzen derzeit keine Rechte, dies zu tun ({{$a}}).", "noresults": "Keine Ergebnisse", "notapplicable": "n/a", @@ -143,7 +143,7 @@ "notsent": "Nicht gesendet", "now": "jetzt", "numwords": "{{$a}} Wörter", - "offline": "Offline", + "offline": "Keine Online-Abgabe notwendig", "online": "Online", "openfullimage": "Tippen Sie hier, um das Bild in voller Größe anzuzeigen", "openinbrowser": "Im Browser öffnen", @@ -152,24 +152,24 @@ "percentagenumber": "{{$a}}%", "phone": "Telefon", "pictureof": "Nutzerbild {{$a}}", - "previous": "Zurück", + "previous": "Letzter Zustand", "pulltorefresh": "Zum Aktualisieren runterziehen", "redirectingtosite": "Sie werden zur Website weitergeleitet.", - "refresh": "Aktualisieren", - "required": "Erforderlich", + "refresh": "Neu laden", + "required": "Notwendig", "requireduserdatamissing": "In diesem Nutzerprofil fehlen notwendige Daten. Füllen Sie die Daten in der Website aus und versuchen Sie es noch einmal.
    {{$a}}", "retry": "Neu versuchen", - "save": "Speichern", - "search": "Suchen", - "searching": "Suchen", + "save": "Sichern", + "search": "Suche", + "searching": "Suche in", "searchresults": "Suchergebnisse", "sec": "Sekunde", "secs": "Sekunden", "seemoredetail": "Hier klicken, um weitere Details sichtbar zu machen", "send": "Senden", - "sending": "Senden", + "sending": "wird gesendet", "serverconnection": "Fehler beim Aufbau der Verbindung zum Server", - "show": "Anzeigen", + "show": "Zeigen", "showmore": "Mehr anzeigen ...", "site": "Website", "sitemaintenance": "Wartungsmodus: Die Website ist im Moment nicht erreichbar!", @@ -179,9 +179,10 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Sorry ...", + "sortby": "Sortiert nach", "start": "Start", - "submit": "Speichern", - "success": "Fertig!", + "submit": "Übertragen", + "success": "erfolgreich", "tablet": "Tablet", "teachers": "Trainer/innen", "thereisdatatosync": "Die Offline-Daten {{$a}} müssen synchronisiert werden.", @@ -202,14 +203,14 @@ "userdetails": "Mehr Details", "usernotfullysetup": "Nutzerkonto unvollständig", "users": "Nutzer/innen", - "view": "Zum Kurs", + "view": "Anzeigen", "viewprofile": "Profil anzeigen", "warningofflinedatadeleted": "Die Offline-Daten von {{component}} '{{name}}' wurden gelöscht. {{error}}", "whoops": "Uuups!", "whyisthishappening": "Warum geschieht dies?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "Die Webservice-Funktion ist nicht verfügbar.", - "year": "Jahr", + "year": "Jahr(e)", "years": "Jahre", "yes": "Ja" } \ No newline at end of file diff --git a/www/core/lang/el.json b/www/core/lang/el.json index 0a1f805526f..f9e97706e12 100644 --- a/www/core/lang/el.json +++ b/www/core/lang/el.json @@ -3,26 +3,26 @@ "allparticipants": "Όλοι οι συμμετέχοντες", "android": "Android", "areyousure": "Είστε σίγουρος ;", - "back": "Πίσω", - "cancel": "Άκυρο", + "back": "< Επιστροφή", + "cancel": "Ακύρωση", "cannotconnect": "Δεν είναι δυνατή η σύνδεση: Βεβαιωθείτε ότι έχετε πληκτρολογήσει σωστά τη διεύθυνση URL και ότι το site σας χρησιμοποιεί το Moodle 2.4 ή νεότερη έκδοση.", "cannotdownloadfiles": "Το κατέβασμα αρχείων είναι απενεργοποιημένο. Παρακαλώ, επικοινωνήστε με το διαχειριστή του site σας.", - "category": "Τμήμα", + "category": "Κατηγορία", "choose": "Επιλέξτε", "choosedots": "Επιλέξτε...", "clearsearch": "Καθαρισμός αναζήτησης", "clicktohideshow": "Πατήστε για επέκταση ή κατάρρευση", "clicktoseefull": "Κάντε κλικ για να δείτε το πλήρες περιεχόμενο.", - "close": "Κλείσιμο", - "comments": "Τα σχόλιά σας", + "close": "Κλείσιμο παραθύρου", + "comments": "Σχόλια", "commentscount": "Σχόλια ({{$a}})", "commentsnotworking": "Τα σχόλια δεν μπορούν να ανακτηθούν", - "completion-alt-auto-fail": "Ολοκληρώθηκε: {{$a}} (δεν πετύχατε βαθμό πρόσβασης)", - "completion-alt-auto-n": "Δεν ολοκληρώθηκε: {{$a}}", - "completion-alt-auto-pass": "Ολοκληρώθηκε: {{$a}} (πετύχατε βαθμό πρόσβασης)", - "completion-alt-auto-y": "Ολοκληρώθηκε: {{$a}}", - "completion-alt-manual-n": "Δεν ολοκληρώθηκε: {{$a}}. Επιλέξτε για να οριστεί ως ολοκληρωμένο.", - "completion-alt-manual-y": "Ολοκληρώθηκε: {{$a}}. Επιλέξτε για να οριστεί ως μη ολοκληρωμένο.", + "completion-alt-auto-fail": "Ολοκληρωμένο (με βαθμό κάτω της βάσης)", + "completion-alt-auto-n": "Μη ολοκληρωμένο", + "completion-alt-auto-pass": "Ολοκληρωμένο (με βαθμό άνω της βάσης)", + "completion-alt-auto-y": "Ολοκληρωμένο", + "completion-alt-manual-n": "Μη ολοκληρωμένο, επιλέξτε για να το σημειώσετε ως ολοκληρωμένο", + "completion-alt-manual-y": "Ολοκληρωμένο, επιλέξτε για να το σημειώσετε ως μη ολοκληρωμένο", "confirmcanceledit": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν τη σελίδα; Όλες οι αλλαγές θα χαθούν.", "confirmdeletefile": "Είστε σίγουροι οτι θέλετε να διαγράψετε αυτό το αρχείο?", "confirmloss": "Είστε σίγουροι? Όλες οι αλλαγές θα χαθούν.", @@ -37,11 +37,11 @@ "datastoredoffline": "Τα δεδομένα αποθηκεύονται στη συσκευή, διότι δεν μπορούν να σταλούν. Θα αποσταλούν αυτόματα αργότερα.", "date": "Ημερομηνία", "day": "ημέρα", - "days": "ημέρες", + "days": "Ημέρες", "decsep": ",", "delete": "Διαγραφή", - "deleting": "Γίνεται διαγραφή", - "description": "Κείμενο εισαγωγής", + "deleting": "Διαγραφή", + "description": "Περιγραφή", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dffulldate": "dddd, D MMMM YYYY h[:]mm A", @@ -51,11 +51,11 @@ "discard": "Απόρριψη", "dismiss": "Απόρριψη", "done": "Ολοκληρώθηκε", - "download": "Μεταφόρτωση", + "download": "Κατέβασμα", "downloading": "Κατέβασμα", - "edit": "Edit", + "edit": "Επεξεργασία ", "emptysplit": "Αυτή η σελίδα θα εμφανιστεί κενή, εάν ο αριστερός πίνακας είναι κενός ή φορτώνεται.", - "error": "Σφάλμα", + "error": "Συνέβη κάποιο σφάλμα", "errorchangecompletion": "Παρουσιάστηκε σφάλμα κατά την αλλαγή της κατάστασης ολοκλήρωσης. Παρακαλώ προσπαθήστε ξανά.", "errordeletefile": "Σφάλμα κατά τη διαγραφή του αρχείου. Παρακαλώ προσπαθήστε ξανά.", "errordownloading": "Σφάλμα στο κατέβασμα του αρχείου.", @@ -91,11 +91,11 @@ "lastmodified": "Τελευταία τροποποίηση", "lastsync": "Τελευταίος συγχρονισμός", "listsep": ";", - "loading": "Φορτώνει", + "loading": "Φόρτωση...", "loadmore": "Φόρτωση περισσότερων", "lostconnection": "Η σύνδεσή σας είναι άκυρη ή έχει λήξει. Πρέπει να ξανασυνδεθείτε στο site.", "maxsizeandattachments": "Μέγιστο μέγεθος για νέα αρχεία: {{$a.size}}, μέγιστος αριθμός συνημμένων: {{$a.attachments}}", - "min": "λεπτό", + "min": "Ελάχιστος βαθμός", "mins": "λεπτά", "mod_assign": "Εργασία", "mod_assignment": "Εργασία", @@ -128,12 +128,12 @@ "name": "Όνομα", "networkerrormsg": "Το δίκτυο δεν είναι ενεργοποιημένο ή δεν δουλεύει.", "never": "Ποτέ", - "next": "Επόμενο", + "next": "Συνέχεια", "no": "Όχι", - "nocomments": "Χωρίς Σχόλια", - "nograde": "Δεν υπάρχει βαθμός", - "none": "Κανένας", - "nopasswordchangeforced": "Δεν μπορείτε να προχωρήσετε χωρίς να αλλάξετε τον κωδικό πρόσβασής σας.", + "nocomments": "Δεν υπάρχουν σχόλια", + "nograde": "Κανένα βαθμό.", + "none": "Κανένα", + "nopasswordchangeforced": "You cannot proceed without changing your password, however there is no available page for changing it. Please contact your Moodle Administrator.", "nopermissions": "Συγνώμη, αλλά επί του τρεχόντως δεν έχετε το δικαίωμα να το κάνετε αυτό ({{$a}})", "noresults": "Κανένα αποτέλεσμα", "notapplicable": "n/a", @@ -141,7 +141,7 @@ "notsent": "Δεν εστάλη", "now": "τώρα", "numwords": "{{$a}} λέξεις", - "offline": "Εκτός σύνδεσης", + "offline": "Δεν απαιτείται διαδικτυακή υποβολή", "online": "Συνδεδεμένος", "openfullimage": "Πατήστε εδώ για να δείτε την εικόνα σε πλήρες μέγεθος", "openinbrowser": "Ανοίξτε στον περιηγητή.", @@ -150,7 +150,7 @@ "percentagenumber": "{{$a}}%", "phone": "Τηλέφωνο", "pictureof": "Φωτογραφία {{$a}}", - "previous": "Προηγούμενο", + "previous": "Προηγούμενη κατάσταση", "pulltorefresh": "Τραβήξτε προς τα κάτω για ανανέωση", "redirectingtosite": "Θα μεταφερθείτε στο site.", "refresh": "Ανανέωση", @@ -158,15 +158,15 @@ "requireduserdatamissing": "Αυτός ο χρήστης δεν έχει συμπληρωμένα κάποια απαιτούμενα στοιχεία του προφίλ του. Συμπληρώστε τα δεδομένα στο Moodle σας και προσπαθήστε ξανά.
    {{$a}}", "retry": "Προσπαθήστε ξανά", "save": "Αποθήκευση", - "search": "Αναζήτηση", - "searching": "Αναζήτηση", - "searchresults": "Αποτελέσματα αναζήτησης", + "search": "Έρευνα", + "searching": "Αναζήτηση σε", + "searchresults": "Αναζήτηση στα αποτελέσματα", "sec": "δευτερόλεπτο", "secs": "δευτερόλεπτα", "seemoredetail": "Κάντε κλικ εδώ για να δείτε περισσότερες λεπτομέρειες", "send": "Αποστολή", - "sending": "Αποστολή", - "show": "Προβολή", + "sending": "Αποστέλλεται", + "show": "Εμφάνιση", "showmore": "Περισσότερα...", "site": "ιστοχώρος", "sitemaintenance": "Η ιστοσελίδα είναι υπό συντήρηση και δεν είναι άμεσα διαθέσιμη", @@ -176,13 +176,14 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Λυπάμαι...", + "sortby": "Ταξινόμηση κατά", "start": "Αρχή", "submit": "Υποβολή", - "success": "Επιτυχία!", + "success": "Επιτυχία", "tablet": "Tablet", "teachers": "Καθηγητές", "thereisdatatosync": "Υπάρχουν εκτός σύνδεσης {{$a}} για συγχρονισμό.", - "time": "Ώρα", + "time": "Χρόνος", "timesup": "Έληξε ο χρόνος!", "today": "Σήμερα", "tryagain": "Προσπαθήστε ξανά.", diff --git a/www/core/lang/es-mx.json b/www/core/lang/es-mx.json index 0ed3bc93f3a..6a7fba5bd32 100644 --- a/www/core/lang/es-mx.json +++ b/www/core/lang/es-mx.json @@ -3,7 +3,7 @@ "allparticipants": "Todos los participantes", "android": "Android", "areyousure": "¿Está Usted seguro?", - "back": "Atrás", + "back": "« Atrás", "cancel": "Cancelar", "cannotconnect": "No se puede conectar: Verifique que Usted escribió la URL correcta y que su sitio usa Moodle 2.4 o más reciente.", "cannotdownloadfiles": "La descarga de archivos está deshabilitada en su servicio Mobile. Por favor contacte a su administrador del sitio.", @@ -13,16 +13,16 @@ "clearsearch": "Limpiar búsqueda", "clicktohideshow": "Clic para expandir o colapsar", "clicktoseefull": "Hacer click para ver los contenidos completos.", - "close": "Cerrar", - "comments": "Sus comentarios", + "close": "Cerrar vista previa", + "comments": "Comentarios", "commentscount": "Comentarios ({{$a}})", "commentsnotworking": "No pueden recuperarse comentarios", - "completion-alt-auto-fail": "Completado: {{$a}} (no obtuvo calificación aprobatoria)", - "completion-alt-auto-n": "No completado: {{$a}}", - "completion-alt-auto-pass": "Completado: {{$a}} (obtuvo calificación aprobatoria)", - "completion-alt-auto-y": "Completado: {{$a}}", - "completion-alt-manual-n": "No-completado: {{$a}}. Seleccionar mara marcarlo como completado.", - "completion-alt-manual-y": "Completado: {{$a}}. Seleccionar mara marcarlo como no completado.", + "completion-alt-auto-fail": "Finalizado {{$a}} (no obtuvo calificación de aprobado)", + "completion-alt-auto-n": "Sin finalizar: {{$a}}", + "completion-alt-auto-pass": "Finalizado: {{$a}} (obtuvo calificación de aprobado)", + "completion-alt-auto-y": "Finalizado: {{$a}}", + "completion-alt-manual-n": "No finalizado; {{$a}}. Seleccione para marcar como finalizado", + "completion-alt-manual-y": "Finalizado; {{$a}} seleccione para marcar como no finalizado", "confirmcanceledit": "¿Está Usted seguro de que quiere abandonar esta página? Se perderán todos los cambios.", "confirmdeletefile": "¿Está seguro de que desea eliminar este archivo?", "confirmloss": "¿Está Usted seguro? Se perderán todos los cambios.", @@ -36,13 +36,13 @@ "currentdevice": "Dispositivo actual", "datastoredoffline": "Los datos se almacenaron en el dispositivo debido a que no se pudieron enviar. Serán enviados automáticamente más tarde.", "date": "Fecha", - "day": "día", - "days": "días", + "day": "Día(s)", + "days": "Días", "decsep": ".", "defaultvalue": "Valor por defecto ({{$a}})", "delete": "Eliminar", "deleting": "Eliminando", - "description": "Descripción -", + "description": "Descripción", "dfdaymonthyear": "MM-DD-AAAA", "dfdayweekmonth": "ddd, D MMM", "dffulldate": "dddd, D MMMM AAAA h[:]mm A", @@ -52,11 +52,11 @@ "discard": "Descartar", "dismiss": "Descartar", "done": "Hecho", - "download": "Descargar", + "download": "Haga clic para descargar el archivo de categorías exportadas", "downloading": "Descargando", - "edit": "Edición", + "edit": "Editar", "emptysplit": "Esta página aparecerá en blanco si el panel izquierdo está vacío o si está cargando.", - "error": "Error", + "error": "Ocurrió un error", "errorchangecompletion": "Ocurrió un error al cambiar el estatus de finalización. Por favor inténtelo nuevamente.", "errordeletefile": "Error al eliminar el archivo. Por favor inténtelo nuevamente.", "errordownloading": "Error al descargar archivo", @@ -87,17 +87,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagen", "imageviewer": "Visor de imágenes", - "info": "Información", + "info": "Info", "ios": "iOS", "labelsep": ":", - "lastmodified": "Última modificación", + "lastmodified": "Última modicficación", "lastsync": "Última sincronzación", "listsep": ";", - "loading": "Cargando", + "loading": "Cargando...", "loadmore": "Cargar más", "lostconnection": "Hemos perdido la conexión, necesita reconectar. Su ficha (token) ya no es válido", "maxsizeandattachments": "Tamaño máximo para archivos nuevos: {{$a.size}}, anexos máximos: {{$a.attachments}}", - "min": "minutos", + "min": "Puntuación mínima", "mins": "minutos", "mod_assign": "Tarea", "mod_assignment": "Tarea", @@ -130,21 +130,21 @@ "name": "Nombre", "networkerrormsg": "Red no disponible o no funcionando.", "never": "Nunca", - "next": "Siguiente", + "next": "Continuar", "no": "No", "nocomments": "No hay comentarios", - "nograde": "No hay calificación", - "none": "Ninguno/a", - "nopasswordchangeforced": "Usted no puede proceder sin cambiar su contraseña.", + "nograde": "Sin calificación.", + "none": "Ninguno(a)", + "nopasswordchangeforced": "No puede seguir sin cambiar su contraseña, sin embargo no existe ninguna página disponible para cambiarla. Por favor contacte a su administrador de Moodle.", "nopermissions": "Lo sentimos, pero por el momento no tiene permiso para hacer eso ({{$a}})", - "noresults": "No hay resultados", + "noresults": "Sin resultados", "notapplicable": "no disp.", "notice": "Aviso", "notsent": "No enviado", "now": "ahora", "numwords": "{{$a}} palabras", - "offline": "Fuera-de-línea", - "online": "En-línea", + "offline": "No se requieren entregas online", + "online": "En línea", "openfullimage": "Hacer click aquí para mostrar la imagen a tamaño completo", "openinbrowser": "Abrir en navegador", "othergroups": "Otros grupos", @@ -152,21 +152,21 @@ "percentagenumber": "{{$a}}%", "phone": "Teléfono", "pictureof": "Imagen de {{$a}}", - "previous": "Anterior", + "previous": "Estado previo", "pulltorefresh": "''Pull'' para refrescar", "redirectingtosite": "Usted será redireccionado al sitio.", "refresh": "Refrescar", - "required": "Obligatorio", + "required": "Requerido", "requireduserdatamissing": "A este usuario le faltan algunos datos requeridos del perfil. Por favor, llene estos datos en su Moodle e inténtelo nuevamente.
    {{$a}}", "retry": "Reintentar", "save": "Guardar", - "search": "Buscar", - "searching": "Buscando", - "searchresults": "Resultados de la búsqueda", + "search": "Búsqueda", + "searching": "Buscar en", + "searchresults": "Resultado", "sec": "segundos", "secs": "segundos", "seemoredetail": "Haga clic aquí para ver más detalles", - "send": "enviar", + "send": "Enviar", "sending": "Enviando", "serverconnection": "Error al conectarse al servidor", "show": "Mostrar", @@ -179,13 +179,14 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Lo siento...", + "sortby": "Ordenar por", "start": "Inicio", "submit": "Enviar", - "success": "¡Éxito!", + "success": "Éxito", "tablet": "Tableta", "teachers": "Profesores", "thereisdatatosync": "Existen {{$a}} fuera-de-línea para ser sincronizados/as.", - "time": "Hora", + "time": "Tiempo", "timesup": "¡Se ha pasado el tiempo!", "today": "Hoy", "tryagain": "Intentar nuevamente", @@ -202,14 +203,14 @@ "userdetails": "Detalles de usuario", "usernotfullysetup": "Usuario no cnfigurado completamente", "users": "Usuarios", - "view": "Vista", + "view": "Ver", "viewprofile": "Ver perfil", "warningofflinedatadeleted": "Los datos fuera-de-línea de {{component}} '{{name}}' han sido borrados. {{error}}", "whoops": "¡Órale!", "whyisthishappening": "¿Porqué está pasando esto?", "windowsphone": "Teléfono Windows", "wsfunctionnotavailable": "La función webservice no está disponible.", - "year": "año", + "year": "Año(s)", "years": "años", "yes": "Sí" } \ No newline at end of file diff --git a/www/core/lang/es.json b/www/core/lang/es.json index 24c93e6d7bd..d5b97d822ac 100644 --- a/www/core/lang/es.json +++ b/www/core/lang/es.json @@ -3,7 +3,7 @@ "allparticipants": "Todos los participantes", "android": "Android", "areyousure": "¿Està seguro?", - "back": "Atrás", + "back": "« Atrás", "cancel": "Cancelar", "cannotconnect": "No se puede conectar: Verifique que la URL es correcta y que el sitio Moodle usa la versión 2.4 o posterior.", "cannotdownloadfiles": "La descarga de archivos está deshabilitada en su servicio Mobile. Por favor contacte al administrador de su sitio.", @@ -13,8 +13,8 @@ "clearsearch": "Limpiar búsqueda", "clicktohideshow": "Clic para expandir o colapsar", "clicktoseefull": "Clic para ver el contenido al completo", - "close": "Cerrar", - "comments": "Sus comentarios", + "close": "Cerrar vista previa", + "comments": "Comentarios", "commentscount": "Comentarios ({{$a}})", "commentsnotworking": "No pueden recuperarse comentarios", "completion-alt-auto-fail": "Finalizado {{$a}} (no ha alcanzado la calificación de aprobado)", @@ -36,11 +36,11 @@ "currentdevice": "Dispositivo actual", "datastoredoffline": "Los datos se almacenaron en el dispositivo debido a que no se pudieron enviar. Serán enviados automáticamente más tarde.", "date": "Fecha", - "day": "día", - "days": "días", + "day": "Día(s)", + "days": "Días", "decsep": ",", - "delete": "Eliminar", - "deleting": "Borrando", + "delete": "Borrar", + "deleting": "Eliminando", "description": "Descripción", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -51,11 +51,11 @@ "discard": "Descartar", "dismiss": "Descartar", "done": "Hecho", - "download": "Descargar", + "download": "Haga clic para descargar el archivo de categorías exportadas", "downloading": "Descargando...", - "edit": "Edición", + "edit": "Editar", "emptysplit": "Esta página aparecerá en blanco si el panel izquierdo está vacío o si está cargando.", - "error": "Error", + "error": "Se produjo un error", "errorchangecompletion": "Ha ocurrido un error cargando el grado de realización. Por favor inténtalo de nuevo.", "errordeletefile": "Error al eliminar el archivo. Por favor inténtelo de nuevo.", "errordownloading": "Ocurrió un error descargando el archivo", @@ -86,17 +86,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagen", "imageviewer": "Visor de imágenes", - "info": "Información", + "info": "Info", "ios": "iOs", "labelsep": ":", "lastmodified": "Última modificación", "lastsync": "Última sincronización", "listsep": ";", - "loading": "Cargando", + "loading": "Cargando...", "loadmore": "Cargar más", "lostconnection": "Hemos perdido la conexión, necesita reconectar. Su token ya no es válido", "maxsizeandattachments": "Tamaño máximo para nuevos archivos: {{$a.size}}, número máximo de archivos adjuntos: {{$a.attachments}}", - "min": "minutos", + "min": "Calificación mínima", "mins": "minutos", "mod_assign": "Tarea", "mod_assignment": "Tarea", @@ -129,21 +129,21 @@ "name": "Nombre", "networkerrormsg": "Conexión no disponible o sin funcionar.", "never": "Nunca", - "next": "Siguiente", + "next": "Continuar", "no": "No", "nocomments": "No hay comentarios", - "nograde": "No hay calificación", - "none": "Ninguna", - "nopasswordchangeforced": "No puede continuar sin cambiar su contraseña.", + "nograde": "Sin calificación", + "none": "Ninguno", + "nopasswordchangeforced": "No puede seguir sin cambiar su contraseña, sin embargo no existe ninguna página disponible para cambiarla. Por favor contacte a su administrador de Moodle.", "nopermissions": "Lo sentimos, pero por el momento no tiene permiso para hacer eso ({{$a}})", - "noresults": "No hay resultados", + "noresults": "Sin resultados", "notapplicable": "n/a", "notice": "Noticia", "notsent": "No enviado", "now": "ahora", "numwords": "{{$a}} palabras", - "offline": "No se requieren entregas online", - "online": "Conectado", + "offline": "Fuera de línea", + "online": "En línea", "openfullimage": "Haga clic aquí para ver la imagen a tamaño completo", "openinbrowser": "Abrir en el navegador", "othergroups": "Otros grupos", @@ -151,21 +151,21 @@ "percentagenumber": "{{$a}}%", "phone": "Teléfono", "pictureof": "Imagen de {{$a}}", - "previous": "Anterior", + "previous": "Estado previo", "pulltorefresh": "Tirar para recargar", "redirectingtosite": "Será redirigido al sitio.", - "refresh": "Recargar", + "refresh": "Refrescar", "required": "Obligatorio", "requireduserdatamissing": "En este perfil de usuario faltan datos requeridos. Por favor, rellene estos datos e inténtelo otra vez.
    {{$a}}", "retry": "Reintentar", "save": "Guardar", - "search": "Buscar", - "searching": "Buscando", - "searchresults": "Resultados de la búsqueda", + "search": "Búsqueda", + "searching": "Buscar en", + "searchresults": "Resultado", "sec": "segundos", "secs": "segundos", "seemoredetail": "Haga clic aquí para ver más detalles", - "send": "enviar", + "send": "Enviar", "sending": "Enviando", "serverconnection": "Error al conectarse al servidor", "show": "Mostrar", @@ -178,13 +178,14 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Disculpe...", + "sortby": "Ordenar por", "start": "Inicio", "submit": "Enviar", "success": "Éxito", "tablet": "Tablet", "teachers": "Profesores", "thereisdatatosync": "Hay {{$a}} fuera de línea pendiente de ser sincronizado.", - "time": "Hora", + "time": "Tiempo", "timesup": "¡Se ha pasado el tiempo!", "today": "Hoy", "tryagain": "Intentar de nuevo", @@ -200,14 +201,14 @@ "userdeleted": "Esta cuenta se ha cancelado", "userdetails": "Detalles de usuario", "users": "Usuarios", - "view": "Vista", + "view": "Ver", "viewprofile": "Ver perfil", "warningofflinedatadeleted": "Los datos fuera de línea de {{component}} '{{name}}' han sido borrados. {{error}}", "whoops": "Oops!", "whyisthishappening": "¿Porqué está pasando esto?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "La función de webservice no está disponible.", - "year": "año", + "year": "Año(s)", "years": "años", "yes": "Sí" } \ No newline at end of file diff --git a/www/core/lang/eu.json b/www/core/lang/eu.json index d7c8d3dd593..747bcfe3930 100644 --- a/www/core/lang/eu.json +++ b/www/core/lang/eu.json @@ -3,7 +3,7 @@ "allparticipants": "Partaide guztiak", "android": "Android", "areyousure": "Ziur al zaude?", - "back": "Atzera", + "back": "« Atzera", "cancel": "Utzi", "cannotconnect": "Ezin izan da konektatu: URLa ondo idatzi duzula eta zure Moodle-ak 2.4 edo goragoko bertsioa erabiltzen duela egiaztatu ezazu.", "cannotdownloadfiles": "Fitxategiak jaistea ezgaituta dago zure Mobile zerbitzuan. Mesedez zure gune kudeatzailean harremanetan jarri zaitez.", @@ -13,8 +13,8 @@ "clearsearch": "Bilaketa garbia", "clicktohideshow": "Sakatu zabaltzeko edo tolesteko", "clicktoseefull": "Klik egin eduki guztiak ikusteko.", - "close": "Itxi", - "comments": "Zure iruzkinak", + "close": "Leihoa itxi", + "comments": "Iruzkinak", "commentscount": "Iruzkinak: ({{$a}})", "commentsnotworking": "Iruzkinak ezin izan dira atzitu", "completion-alt-auto-fail": "Osatuta: {{$a}} (ez dute gutxieneko kalifikazioa lortu)", @@ -36,8 +36,8 @@ "currentdevice": "Oraingo gailua", "datastoredoffline": "Gailu honetan gordetako informazioa ezin izan da bidali. Beranduago automatikoki bidaliko da.", "date": "Data", - "day": "egun(a)", - "days": "egun", + "day": "Egun", + "days": "Egun", "decsep": ",", "delete": "Ezabatu", "deleting": "Ezabatzen", @@ -51,11 +51,11 @@ "discard": "Baztertu", "dismiss": "Baztertu", "done": "Eginda", - "download": "Jaitsi", + "download": "Klikatu esportatutako kategoria-fitxategia deskargatzeko", "downloading": "Jaisten", "edit": "Editatu", "emptysplit": "Orri hau hutsik agertuko da ezkerreko panela hutsik badago edo kargatzen ari bada.", - "error": "Errorea", + "error": "Errorea gertatu da", "errorchangecompletion": "Errorea gertatu da osaketa-egoera aldatzean. Mesedez saiatu berriz.", "errordeletefile": "Errorea fitxategia ezabatzean. Mesedez, saiatu berriz.", "errordownloading": "Errorea fitxategia jaistean.", @@ -92,11 +92,11 @@ "lastmodified": "Azken aldaketa", "lastsync": "Azken sinkronizazioa", "listsep": ";", - "loading": "Kargatzen", + "loading": "Kargatzen...", "loadmore": "Kargatu gehiago", "lostconnection": "Zure token-a orain ez da baliozkoa edo iraungitu da, gunera berriz konektatu beharko zara.", "maxsizeandattachments": "Gehienezko tamaina fitxategi berrietarako: {{$a.size}}, gehienezko eranskin-kopurua: {{$a.attachments}}", - "min": "minutu", + "min": "Gutxieneko puntuazioa", "mins": "minutu", "mod_assign": "Zeregina", "mod_assignment": "Zeregina", @@ -129,12 +129,12 @@ "name": "Izena", "networkerrormsg": "Sarea ezgaituta dago edo ez dabil.", "never": "Inoiz ez", - "next": "Hurrengoa", + "next": "Jarraitu", "no": "Ez", - "nocomments": "Iruzkinik ez", - "nograde": "Kalifikaziorik ez", + "nocomments": "Ez dago iruzkinik", + "nograde": "Kalifikaziorik ez.", "none": "Bat ere ez", - "nopasswordchangeforced": "Ezin duzu jarraitu zure pasahitza aldatu gabe.", + "nopasswordchangeforced": "Ezin duzu aurrera egin pasahitza aldatu gabe, baina ez dago aldatzeko inongo orririk. Mesedez, jarri harremanetan zure Moodle Kudeatzailearekin.", "nopermissions": "Sentitzen dugu, baina oraingoz ez duzu hori egiteko baimenik ({{$a}})", "noresults": "Emaitzarik ez", "notapplicable": "ezin da aplikatu", @@ -142,8 +142,8 @@ "notsent": "Bidali gabea", "now": "orain", "numwords": "{{$a}} hitz", - "offline": "Lineaz kanpo", - "online": "On-line", + "offline": "Ez du online bidalketarik eskatzen", + "online": "Online", "openfullimage": "Klik egin hemen irudia jatorrizko tamainan ikusteko", "openinbrowser": "Ireki nabigatzailean", "othergroups": "Beste taldeak", @@ -151,21 +151,21 @@ "percentagenumber": "%{{$a}}", "phone": "Telefonoa", "pictureof": "{{$a}}-ren irudia", - "previous": "Aurrekoa", + "previous": "Aurreko egoera", "pulltorefresh": "Sakatu freskatzeko", "redirectingtosite": "Gunera berbideratua izango zara.", "refresh": "Freskatu", - "required": "Beharrezkoa", + "required": "Ezinbestekoa", "requireduserdatamissing": "Erabiltzaile honek beharrezkoak diren profileko datuak bete gabe ditu. Mesedez, bete itzazu datu hauek zure Moodle gunean eta saiatu berriz.
    {{$a}}", "retry": "Berriz saiatu", "save": "Gorde", - "search": "Bilatu", - "searching": "Bilatzen", + "search": "Bilatu...", + "searching": "Bilatu hemen", "searchresults": "Bilaketaren emaitzak", "sec": "seg", "secs": "segundu", "seemoredetail": "Klik egin hemen xehetasun gehiago ikusteko", - "send": "bidali", + "send": "Bidali", "sending": "Bidaltzen", "serverconnection": "Errorea zerbitzariarekin konektatzean", "show": "Erakutsi", @@ -178,13 +178,14 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Barkatu...", + "sortby": "Zeren arabera ordenatu", "start": "Hasiera", "submit": "Bidali", "success": "Ondo!", "tablet": "Tablet-a", "teachers": "Irakasleak", "thereisdatatosync": "Lineaz-kanpoko {{$a}} daude sinkronizatzeko .", - "time": "Ordua", + "time": "Denbora", "timesup": "Denbora amaitu egin da!", "today": "Gaur", "tryagain": "Saiatu berriz", @@ -207,7 +208,7 @@ "whyisthishappening": "Zergatik ari da hau gertatzen?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "Web-zerbitzu funtzioa ez dago eskuragarri.", - "year": "urtea", + "year": "Urte", "years": "urte", "yes": "Bai" } \ No newline at end of file diff --git a/www/core/lang/fa.json b/www/core/lang/fa.json index 0d4d923b0cc..1be357dd50d 100644 --- a/www/core/lang/fa.json +++ b/www/core/lang/fa.json @@ -1,15 +1,15 @@ { "allparticipants": "همهٔ اعضاء", "areyousure": "آیا مطمئن هستید؟", - "back": "بازگشت", + "back": "» بازگشت", "cancel": "انصراف", "cannotconnect": "اتصال به سایت ممکن نبود. بررسی کنید که نشانی سایت را درست وارد کرده باشید و اینکه سایت شما از مودل ۲٫۴ یا جدیدتر استفاده کند.", - "category": "طبقه", + "category": "دسته", "choose": "انتخاب کنید", "choosedots": "انتخاب کنید...", "clicktohideshow": "برای باز یا بسته شدن کلیک کنید", "close": "بستن پنجره", - "comments": "نظرات", + "comments": "توضیحات شما", "commentscount": "نظرات ({{$a}})", "completion-alt-auto-fail": "تکمیل شده است (بدون اکتساب نمرهٔ قبولی)", "completion-alt-auto-n": "تکمیل نشده است", @@ -32,11 +32,11 @@ "decsep": ".", "delete": "حذف", "deleting": "در حال حذف", - "description": "توضیح تکلیف", + "description": "توصیف", "done": "پر کرده است", - "download": "دریافت", + "download": "دریافت فایل", "edit": "ویرایش", - "error": "خطا", + "error": "خطا رخ داد", "errordownloading": "خطا در دانلود فایل", "folder": "پوشه", "forcepasswordchangenotice": "برای پیش‌روی باید رمز ورود خود را تغییر دهید.", @@ -48,14 +48,14 @@ "hour": "ساعت", "hours": "ساعت", "imageviewer": "نمایشگر تصویر", - "info": "توضیحات", + "info": "اطلاعات", "labelsep": ": ", "lastmodified": "آخرین تغییر", "listsep": ",", - "loading": "در حال بارگیری", + "loading": "دریافت اطلاعات...", "lostconnection": "اطلاعات توکن شناسایی شما معتبر نیست یا منقضی شده است. باید دوباره به سایت متصل شوید.", "maxsizeandattachments": "حداکثر اندازه برای فایل‌های جدید: {{$a.size}}، حداکثر تعداد فایل‌های پیوست: {{$a.attachments}}", - "min": "دقیقه", + "min": "کمترین امتیاز", "mins": "دقیقه", "mod_assign": "تکلیف", "mod_chat": "اتاق گفتگو", @@ -75,7 +75,7 @@ "never": "هیچ‌وقت", "next": "ادامه", "no": "خیر", - "nocomments": "بدون دیدگاه", + "nocomments": "نظری ارائه نشده است", "nograde": "بدون نمره", "none": "هیچ", "nopasswordchangeforced": "شما نمی‌توانید بدون تغییر رمز عبور ادامه دهید اما هیچ صفحه‌ای برای عوض کردن آن وجود ندارد. لطفا با مدیریت سایت تماس بگیرید.", @@ -90,18 +90,18 @@ "pagea": "صفحه {{$a}}", "phone": "تلفن", "pictureof": "عکس {{$a}}", - "previous": "قبلی", + "previous": "حالت قبلی", "pulltorefresh": "برای تازه‌سازی بکشید", "refresh": "تازه‌سازی", - "required": "لازم است", + "required": "الزامی بودن", "save": "ذخیره", - "search": "جستجو", + "search": "جستجو...", "searching": "در حال جستجو در ...", - "searchresults": "نتیجهٔ جستجو", + "searchresults": "نتایج جستجو", "sec": "ثانیه", "secs": "ثانیه", "seemoredetail": "برای دیدن جزئیات بیشتر اینجا را کلیک کنید", - "send": "فرستادن", + "send": "ارسال", "sending": "در حال ارسال", "serverconnection": "خطا در اتصال به کارگزار", "show": "نمایش", @@ -112,8 +112,9 @@ "sizekb": "کیلوبایت", "sizemb": "مگابایت", "sorry": "متاسفیم...", + "sortby": "مرتب شدن بر اساس", "start": "آغاز", - "submit": "ارائه", + "submit": "ارسال", "success": "موفق", "teachers": "استاد", "time": "زمان", diff --git a/www/core/lang/fr.json b/www/core/lang/fr.json index e6a40702a51..35acf20efac 100644 --- a/www/core/lang/fr.json +++ b/www/core/lang/fr.json @@ -3,7 +3,7 @@ "allparticipants": "Tous les participants", "android": "Android", "areyousure": "En êtes-vous bien sûr ?", - "back": "Retour", + "back": "« Retour", "cancel": "Annuler", "cannotconnect": "Connexion impossible : vérifiez que l'URL a été saisie correctement et que votre site utilise Moodle 2.4 ou ultérieur.", "cannotdownloadfiles": "Le téléchargement de fichiers est désactivé dans le service mobile de votre plateforme. Veuillez contacter l'administrateur de la plateforme.", @@ -13,8 +13,8 @@ "clearsearch": "Effacer la recherche", "clicktohideshow": "Cliquer pour déplier ou replier", "clicktoseefull": "Cliquer pour voir tout le contenu.", - "close": "Fermer", - "comments": "Vos commentaires", + "close": "Fermer la prévisualisation", + "comments": "Commentaires", "commentscount": "Commentaires ({{$a}})", "commentsnotworking": "Les commentaires ne peuvent pas être récupérés", "completion-alt-auto-fail": "Terminé : {{$a}} (n'a pas atteint la note pour passer)", @@ -36,12 +36,12 @@ "currentdevice": "Appareil actuel", "datastoredoffline": "Données stockées sur l'appareil, car elles n'ont pas pu être envoyées. Elles seront automatiquement envoyées ultérieurement.", "date": "Date", - "day": "jour", - "days": "jours", + "day": "Jour(s)", + "days": "Jours", "decsep": ",", "defaultvalue": "Défaut ({{$a}})", "delete": "Supprimer", - "deleting": "Suppression", + "deleting": "En cours de suppression", "description": "Description", "dfdaymonthyear": "DD-MM-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -52,11 +52,11 @@ "discard": "Ignorer", "dismiss": "Rejeter", "done": "Terminé", - "download": "Télécharger", + "download": "Cliquer pour télécharger le fichier exporté", "downloading": "Téléchargement en cours", "edit": "Modifier", "emptysplit": "Cette page paraîtra vide si le panneau de gauche est vide ou en cours de chargement.", - "error": "Erreur", + "error": "Une erreur est survenue", "errorchangecompletion": "Une erreur est survenue lors du changement de l'état d'achèvement. Veuillez essayer à nouveau.", "errordeletefile": "Erreur lors de la suppression du fichier. Veuillez essayer à nouveau.", "errordownloading": "Erreur lors du téléchargement du fichier.", @@ -87,17 +87,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Image", "imageviewer": "Lecteur d'images", - "info": "Info", + "info": "Information", "ios": "iOS", "labelsep": " ", - "lastmodified": "Modifié le", + "lastmodified": "Dernière modification", "lastsync": "Dernière synchronisation", "listsep": ";", - "loading": "Chargement", + "loading": "Chargement...", "loadmore": "Charger plus", "lostconnection": "Connexion perdue. Vous devez vous reconnecter. Votre jeton n'est plus valide", "maxsizeandattachments": "Taille maximale des nouveaux fichiers : {{$a.size}}. Nombre maximal d'annexes : {{$a.attachments}}", - "min": "min", + "min": "Score minimum", "mins": "min", "mod_assign": "Devoir", "mod_assignment": "Devoir", @@ -130,20 +130,20 @@ "name": "Nom", "networkerrormsg": "Réseau désactivé ou en panne.", "never": "Jamais", - "next": "Suivant", + "next": "Suite", "no": "Non", "nocomments": "Aucun commentaire", - "nograde": "Pas de note", + "nograde": "Aucune note.", "none": "Aucun", - "nopasswordchangeforced": "Vous ne pouvez pas continuer ans changer votre mot de passe.", + "nopasswordchangeforced": "Vous ne pouvez pas continuer sans modifier votre mot de passe. Cependant, il n'y a aucun moyen disponible de le modifier. Veuillez contacter l'administrateur de votre Moodle.", "nopermissions": "Désolé, vous n'avez actuellement pas les droits d'accès requis pour effectuer ceci ({{$a}})", - "noresults": "Aucun résultat", + "noresults": "Pas de résultat", "notapplicable": "n/a", "notice": "Remarque", "notsent": "Pas envoyé", "now": "maintenant", "numwords": "{{$a}} mots", - "offline": "Hors ligne", + "offline": "Aucun travail à remettre requis", "online": "En ligne", "openfullimage": "Cliquer ici pour afficher l'image en pleine grandeur", "openinbrowser": "Ouvrir dans le navigateur", @@ -152,7 +152,7 @@ "percentagenumber": "{{$a}} %", "phone": "Téléphone", "pictureof": "Avatar {{$a}}", - "previous": "Précédent", + "previous": "État précédent", "pulltorefresh": "Tirer pour actualiser", "redirectingtosite": "Vous allez être redirigé vers le site.", "refresh": "Actualiser", @@ -160,8 +160,8 @@ "requireduserdatamissing": "Il manque certaines données au profil de cet utilisateur. Veuillez compléter ces données dans votre plateforme Moodle et essayer à nouveau.
    {{$a}}", "retry": "Essayer à nouveau", "save": "Enregistrer", - "search": "Rechercher", - "searching": "Recherche", + "search": "Recherche", + "searching": "Rechercher dans", "searchresults": "Résultats de la recherche", "sec": "s", "secs": "s", @@ -179,13 +179,14 @@ "sizemb": "Mo", "sizetb": "To", "sorry": "Désolé...", + "sortby": "Trier par", "start": "Début", "submit": "Envoyer", - "success": "Succès !", + "success": "Succès", "tablet": "Tablette", "teachers": "Enseignants", "thereisdatatosync": "Il y a des {{$a}} locales à synchroniser", - "time": "Heure", + "time": "Temps", "timesup": "Le chrono est enclenché !", "today": "Aujourd'hui", "tryagain": "Essayer encore", @@ -202,14 +203,14 @@ "userdetails": "Informations détaillées", "usernotfullysetup": "Utilisateur pas complètement défini", "users": "Utilisateurs", - "view": "Affichage", + "view": "Afficher", "viewprofile": "Consulter le profil", "warningofflinedatadeleted": "Des données locales de {{component}} « {{name}} » ont été supprimées. {{error}}", "whoops": "Oups !", "whyisthishappening": "Que se passe-t-il ?", "windowsphone": "Windows phone", "wsfunctionnotavailable": "La fonction webservice n'est pas disponible", - "year": "année", + "year": "Année(s)", "years": "années", "yes": "Oui" } \ No newline at end of file diff --git a/www/core/lang/he.json b/www/core/lang/he.json index 63788a56caf..bbc7b0ed56f 100644 --- a/www/core/lang/he.json +++ b/www/core/lang/he.json @@ -2,7 +2,7 @@ "allparticipants": "כל המשתתפים", "android": "אנדרואיד", "areyousure": "האם את/ה בטוח/ה?", - "back": "חזרה", + "back": "« חזרה\n", "cancel": "ביטול", "cannotconnect": "אין אפשרות להתחבר: אנא ודא כי הזנת נכון את כתובת האתר ושהאתר הוא בגרסה 2.4 ומעלה.", "cannotdownloadfiles": "הורדת קבצים אינה מאופשרת במכשירים ניידים. יש לפנות למנהל/ת האתר להפעלת אפשרות זו.", @@ -11,35 +11,35 @@ "choosedots": "בחירה...", "clearsearch": "איפוס חיפוש", "clicktohideshow": "הקש להרחבה או לצמצום", - "close": "סגירה", - "comments": "ההערות שלך", + "close": "סגירת חלון", + "comments": "הערות", "commentscount": "({{$a}}) הערות", - "completion-alt-auto-fail": "הושלם: {{$a}} (לא הושג ציון עובר)", + "completion-alt-auto-fail": "הושלם: {{$a}} (לא השיג ציון עובר)", "completion-alt-auto-n": "לא הושלם: {{$a}}", - "completion-alt-auto-pass": "הושלם: {{$a}} (הושג ציון עובר)", + "completion-alt-auto-pass": "הושלם: {{$a}} (השיג ציון עובר)", "completion-alt-auto-y": "הושלם: {{$a}}", - "completion-alt-manual-n": "לא הושלם: {{$a}}. יש לבחור כדי לסמן כ:הושלם.", - "completion-alt-manual-y": "הושלם: {{$a}}. יש לבחור כדי לסמן כ:לא-הושלם.", + "completion-alt-manual-n": "{{$a}} לא הושלם. הקליקו לסימון כ\"הושלם\"", + "completion-alt-manual-y": "{{$a}} הושלם. הקליקו לסימון כ\"לא הושלם\"", "confirmdeletefile": "האם הינך בטוח כי ברצונך למחוק את קובץ זה?", "content": "תוכן", "continue": "המשך", "course": "קורס", "coursedetails": "פרטי הקורס", "date": "תאריך", - "day": "יום", + "day": "ימים", "days": "ימים", "decsep": ".", "delete": "מחיקה", "deleting": "מוחק", - "description": "תיאור", + "description": "הנחיה למטלה", "dfdayweekmonth": "dddd, D MMMM", "dflastweekdate": "dddd", "dftimedate": "hh[:]mm", "done": "גמור", - "download": "הורדה", + "download": "יש להקליק להורדת קובץ הקטגוריות שיוצא", "downloading": "מוריד", "edit": "עריכה", - "error": "טעות", + "error": "שגיאה התרחשה", "errordownloading": "שגיאה בהורדת קובץ", "errordownloadingsomefiles": "שגיאה בהורדת קבצי המודול. יתכן וחלק מהקבצים חסרים.", "filename": "שם הקובץ", @@ -56,12 +56,12 @@ "imageviewer": "מציג תמונות", "info": "מידע", "labelsep": ":", - "lastmodified": "שינוי אחרון", + "lastmodified": "עדכון אחרון", "listsep": ",", - "loading": "טוען...", + "loading": "טעינה", "lostconnection": "לקוד הזיהוי המאובטח שלך פג התוקף, ולכן החיבור נותק. עליך להתחבר שוב.", "maxsizeandattachments": "נפח קבצים מירבי: {{$a.size}}, מספר קבצים מצורפים מירבי: {{$a.attachments}}", - "min": "דקה", + "min": "תוצאה מינמלית", "mins": "דקות", "mod_assign": "מטלה", "mod_assignment": "מטלה", @@ -90,52 +90,53 @@ "mod_wiki": "ויקי (תוצר משותף)", "mod_workshop": "הערכת־עמיתים", "moduleintro": "הנחיה לפעילות", - "name": "שם:", + "name": "שם", "networkerrormsg": "הרשת לא מופעלת או לא עובדת.", - "never": "אף פעם לא", - "next": "הבא", + "never": "לעולם לא", + "next": "הבא אחריו", "no": "לא", - "nocomments": "ללא הערות", + "nocomments": "אין הערות", "nograde": "אין ציון", - "none": "אין", + "none": "ללא", "nopasswordchangeforced": "אינך יכול להמשיך ללא שינוי הסיסמה שלך. אך נכון לעכשיו אין דף זמין בו ניתן לשנותה. אנא צור קשר עם מנהל המוודל שלך.", "nopermissions": "למשתמש שלכם אין את ההרשאה לבצע את הפעולה \"{{$a}}\".\n
    \nיש לפנות למנהל(ת) המערכת שלכם לקבלת ההרשאות המתאימות.", - "noresults": "אין תוצאות", + "noresults": "לא נמצאו תוצאות", "notapplicable": "לא זמין", "notice": "לתשומת לב", "now": "עכשיו", "numwords": "{{$a}} מילים", - "offline": "לא מחובר", - "online": "מחובר", + "offline": "לא נדרשות הגשות מקוונות", + "online": "מקוון", "openfullimage": "יש להקליק כאן להצגת התמונה בגודל מלא", "openinbrowser": "תצוגה בדפדפן", "pagea": "עמוד {{$a}}", "phone": "טלפון", "pictureof": "תמונה של {{$a}}", - "previous": "קודם", + "previous": "מצב קודם", "pulltorefresh": "משיכה לרענון", "refresh": "רענון", - "required": "דרוש", + "required": "נדרש", "requireduserdatamissing": "למשתמש זה חסרים שדות נדרשים בפרופיל המשתמש. יש להשלים מידע זה באתר המוודל שלך ולנסות שוב.
    {{$a}}", "save": "שמירה", - "search": "חיפוש", - "searching": "חיפוש ב-", - "searchresults": "תוצאות חיפוש", + "search": "חפשו", + "searching": "מחפש ב...", + "searchresults": "תוצאות החיפוש", "sec": "שניה", "secs": "שניות", "seemoredetail": "הקליקו כאן כדי לראות פרטים נוספים", - "send": "שליחה", - "sending": "שולח", + "send": "לשלוח", + "sending": "שולחים", "serverconnection": "שגיאה בהתחברות לשרת", - "show": "הצגה", + "show": "תצוגה", "site": "מערכת", "sizeb": "בתים", "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", + "sortby": "מיון לפי", "start": "התחלה", - "submit": "שמירה", - "success": "הצלחה!", + "submit": "הגש", + "success": "הצלחה", "tablet": "טאבלט", "teachers": "מורים", "time": "זמן", @@ -148,10 +149,10 @@ "userdeleted": "חשבון משתמש זה נמחק", "userdetails": "מאפייניי המשתמש", "users": "משתמשים", - "view": "תצוגה", + "view": "צפיה", "viewprofile": "תצוגת מאפיינים", "whoops": "אוווווופס!", - "year": "שנה", + "year": "שנים", "years": "שנים", "yes": "כן" } \ No newline at end of file diff --git a/www/core/lang/hu.json b/www/core/lang/hu.json index 6376ed158d7..ab3c5d03b06 100644 --- a/www/core/lang/hu.json +++ b/www/core/lang/hu.json @@ -1,15 +1,15 @@ { "allparticipants": "Összes résztvevő", "areyousure": "Biztos?", - "back": "Vissza", - "cancel": "Mégse", + "back": "« Vissza", + "cancel": "Törlés", "cannotconnect": "Sikertelen kapcsolódás: ellenőrizze, jó-e az URL és a portál legalább 2.4-es Moodle-t használ-e.", "category": "Kategória", "choose": "Választás", "choosedots": "Választás...", "clicktohideshow": "Kattintson a kibontáshoz vagy a becsukáshoz.", - "close": "Bezárás", - "comments": "Megjegyzései", + "close": "Ablak bezárása", + "comments": "Megjegyzések", "commentscount": "Megjegyzések ({{$a}})", "completion-alt-auto-fail": "Teljesítve: {{$a}} (a teljesítési pontszámot nem érte el)", "completion-alt-auto-n": "Nincs teljesítve: {{$a}}", @@ -19,22 +19,22 @@ "completion-alt-manual-y": "Teljesítve: {{$a}}, teljesítetlenként való megjelöléséhez válassza ki.", "confirmdeletefile": "Biztosan törli ezt az állományt?", "content": "Tartalom", - "continue": "Folytatás", + "continue": "Tovább", "course": "Kurzus", "coursedetails": "Kurzusadatok", "date": "Dátum", "day": "nap", - "days": "nap", + "days": "Nap", "decsep": ",", "defaultvalue": "Alapeset ({{$a}})", "delete": "Törlés", "deleting": "Törlés", - "description": "Bevezető szöveg", + "description": "Leírás", "done": "Kész", - "download": "Letöltés", + "download": "Az exportált kategóriafájl letöltéséhez kattintson", "downloading": "Letöltés...", "edit": "Szerkesztés", - "error": "Hiba", + "error": "Hiba történt.", "errordownloading": "Nem sikerült letölteni az állományt.", "filename": "Állománynév", "folder": "Mappa", @@ -46,14 +46,14 @@ "hide": "Elrejtés", "hour": "óra", "hours": "óra", - "info": "Információ", + "info": "Információk", "labelsep": ":", - "lastmodified": "Utolsó módosítás", + "lastmodified": "Utolsó módosítás dátuma:", "listsep": ";", - "loading": "Betöltés", + "loading": "Betöltés...", "lostconnection": "A kapcsolat megszakadt, kacsolódjon újból. Jele érvénytelen.", "maxsizeandattachments": "Új állományok maximális mérete: {{$a.size}}, maximális csatolt állomány: {{$a.attachments}}", - "min": "p", + "min": "Min. pontszám", "mins": "perc", "mod_assign": "Feladat", "mod_chat": "Csevegés", @@ -68,44 +68,45 @@ "mod_survey": "Felmérés", "mod_wiki": "Wiki", "moduleintro": "Leírás", - "name": "Név:", + "name": "Név", "networkerrormsg": "A hálózat nincs bekapcsolva vagy nem működik.", "never": "Soha", - "next": "Következő", + "next": "Tovább", "no": "Nem", - "nocomments": "Nincs megjegyzés.", - "nograde": "Nincs pont", - "none": "Nincs", + "nocomments": "Nincs megjegyzés", + "nograde": "Nincs osztályzat", + "none": "Egy sem", "nopasswordchangeforced": "A továbblépéshez először módosítania kell a jelszavát, ehhez azonban nem áll rendelkezésre megfelelő oldal. Forduljon a Moodle rendszergazdájához.", "nopermissions": "Ehhez ({{$a}}) jelenleg nincs engedélye", "noresults": "Nincs eredmény", "notice": "Tájékoztatás", "now": "most", "numwords": "{{$a}} szó", - "offline": "Nincs szükség neten keresztüli leadásra", + "offline": "Offline", "online": "Online", "pagea": "{{$a}} oldal", "phone": "Telefon", "pictureof": "Kép", - "previous": "Előző", + "previous": "Előző állapot", "refresh": "Frissítés", "required": "Kitöltendő", "save": "Mentés", - "search": "Keresés", - "searching": "Hol keres?", + "search": "Keresés...", + "searching": "Keresés helye ...", "searchresults": "Keresési eredmények", "sec": "mp", "secs": "mp", "seemoredetail": "A részletekért kattintson ide", - "send": "Elküld", + "send": "küldés", "sending": "Küldés", "serverconnection": "Hiba a szerverhez csatlakozás közben", - "show": "Megjelenítés", + "show": "Mutat", "site": "Portál", "sizeb": "bájt", "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", + "sortby": "Rendezési szempont", "start": "Kezdés", "submit": "Leadás", "success": "Sikerült", @@ -121,9 +122,9 @@ "userdetails": "Felhasználó adatai", "usernotfullysetup": "A felhasználó beállítása még nincs kész", "users": "Felhasználó", - "view": "Nézet", + "view": "Megtekintés", "viewprofile": "Profil megtekintése", - "year": "év", + "year": "Év", "years": "év", "yes": "Igen" } \ No newline at end of file diff --git a/www/core/lang/it.json b/www/core/lang/it.json index fca22023ba9..df7d689b127 100644 --- a/www/core/lang/it.json +++ b/www/core/lang/it.json @@ -2,7 +2,7 @@ "allparticipants": "Tutti i partecipanti", "android": "Android", "areyousure": "Sei sicuro?", - "back": "Indietro", + "back": "« Back", "cancel": "Annulla", "cannotconnect": "Impossibile connettersi: verificare che l'URL sia corretto e che il sito usi Moodle 2.4 o versioni successive.", "cannotdownloadfiles": "Nel servizio Mobile Lo scaricamento di file è disabilitato. Per favore contatta l'amministratore del sito.", @@ -12,16 +12,16 @@ "clearsearch": "Pulisci la ricerca", "clicktohideshow": "Click per aprire e chiudere", "clicktoseefull": "Click per visualizzare il contenuto completo.", - "close": "Chiudi", - "comments": "I tuoi commenti", + "close": "Chiudi finestra", + "comments": "Commenti", "commentscount": "Commenti: ({{$a}})", "commentsnotworking": "Non è possibile scaricare i commenti", - "completion-alt-auto-fail": "Completato: {{$a}} (senza la sufficienza)", - "completion-alt-auto-n": "Non completato: {{$a}}", - "completion-alt-auto-pass": "Completato: {{$a}} (con la sufficienza)", - "completion-alt-auto-y": "Completato: {{$a}}", - "completion-alt-manual-n": "Non completato: {{$a}}. Selezionare per indicare come completato.", - "completion-alt-manual-y": "Completato: {{$a}}. Selezionare per indicare come non completato.", + "completion-alt-auto-fail": "Completato: {{$a}} (senza raggiungere la sufficienza)", + "completion-alt-auto-n": "Non completata: {{$a}}", + "completion-alt-auto-pass": "Completato: {{$a}} (raggiunta la sufficienza)", + "completion-alt-auto-y": "Completata: {{$a}}", + "completion-alt-manual-n": "Non completata: {{$a}}.\nSelezionarla per spuntarla come completata.", + "completion-alt-manual-y": "Completata: {{$a}}. Selezionarla per spuntarla come non completata.", "confirmcanceledit": "Sei sicuro di abbandonare questa pagina? Tutte le modifiche saranno perdute.", "confirmdeletefile": "Sei sicuro di voler eliminare questo file?", "confirmopeninbrowser": "Desideri aprirlo nel browser?", @@ -30,22 +30,22 @@ "course": "Corso", "coursedetails": "Dettagli corso", "date": "Data", - "day": "giorno", - "days": "giorni", + "day": "Giorni", + "days": "Giorni", "decsep": ",", "defaultvalue": "Default ({{$a}})", "delete": "Elimina", - "deleting": "Eliminazione in corso", - "description": "Commento", + "deleting": "Eliminazione", + "description": "Descrizione", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", "dfmediumdate": "LLL", "dftimedate": "h[:]mm A", "done": "Fatto", - "download": "Download", + "download": "Scarica", "downloading": "Scaricamento in corso", "edit": "Modifica", - "error": "Errore", + "error": "Si è verificato un errore", "errorchangecompletion": "Si è verificato un errore durante la modifica dello stato di completamento. Per favore riprova.", "errordeletefile": "Si è verificato un errore durante l'eliminazione del file. Per favore riprova.", "errordownloading": "Si è verificato un errore durante lo scaricamento del file.", @@ -70,16 +70,16 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Immagine", "imageviewer": "Visualizzatore di immagini", - "info": "Informazioni", + "info": "Informazione", "ios": "iOS", "labelsep": ": ", - "lastmodified": "Ultime modifiche", + "lastmodified": "Ultima modifica", "lastsync": "Ultima sincronizzazione", "listsep": ";", - "loading": "Caricamento in corso", + "loading": "Caricamento in corso...", "lostconnection": "La connessione è stata perduta. Il tuo token non è più valido.", "maxsizeandattachments": "Dimensione massima per i file nuovi: {{$a.size}}, numero massimo di allegati: {{$a.attachments}}", - "min": "min.", + "min": "Punteggio minimo", "mins": "min.", "mod_assign": "Compito", "mod_assignment": "Compito", @@ -109,13 +109,13 @@ "mod_workshop": "Workshop", "moduleintro": "Descrizione", "mygroups": "I miei gruppi", - "name": "Titolo", + "name": "Nome", "networkerrormsg": "La rete non è abilitata o non funziona.", "never": "Mai", - "next": "Successivo", + "next": "Continua", "no": "No", "nocomments": "Non ci sono commenti", - "nograde": "Senza valutazione", + "nograde": "Nessuna valutazione.", "none": "Nessuno", "nopasswordchangeforced": "Non puoi proseguire senza modificare la tua password, ma non c'è una pagina per cambiarla. Contatta il tuo amministratore Moodle.", "nopermissions": "Spiacente, ma attualmente non avete il permesso per fare questo ({{$a}})", @@ -124,7 +124,7 @@ "notice": "Nota", "now": "adesso", "numwords": "{{$a}} parole", - "offline": "Offline", + "offline": "Questo compito non richiede consegne online", "online": "Online", "openfullimage": "Click per visualizare l'immagine a dimensioni reali", "openinbrowser": "Apri nel browser", @@ -133,21 +133,21 @@ "percentagenumber": "{{$a}}%", "phone": "Telefono", "pictureof": "Immagine {{$a}}", - "previous": "Precedente", + "previous": "Stato precedente", "pulltorefresh": "Trascina per aggiornare", "refresh": "Aggiorna", - "required": "La risposta è obbligatoria", + "required": "Obbligatorio", "requireduserdatamissing": "Nel profilo di questo utente mancano alcuni dati. Per favore compila i dati mancanti in Moodle e riprova.
    {{$a}}", "retry": "Riprova", "save": "Salva", - "search": "Cerca", - "searching": "Ricerca in corso", - "searchresults": "Risultati della ricerca", + "search": "Ricerca", + "searching": "Cerca in", + "searchresults": "Risultati delle ricerche", "sec": "secondo", "secs": "secondi", "seemoredetail": "Clicca qui per ulteriori dettagli", - "send": "invia", - "sending": "Invio in c orso", + "send": "Invia", + "sending": "Invio in corso", "serverconnection": "Si è verificato un errore durante la connessione al server", "show": "Visualizza", "site": "Sito", @@ -156,12 +156,13 @@ "sizekb": "KB", "sizemb": "MB", "sizetb": "TB", + "sortby": "Ordina per", "start": "Apertura", "submit": "Invia", - "success": "OK!", + "success": "Operazione eseguita con successo", "tablet": "Tablet", "teachers": "Docenti", - "time": "Data/Ora", + "time": "Tempo", "timesup": "Tempo scaduto!", "today": "Oggi", "twoparagraphs": "{{p1}}

    {{p2}}", @@ -179,7 +180,7 @@ "whoops": "Oops!", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "La funzione webservice non è disponibile.", - "year": "anno", + "year": "Anni", "years": "anni", - "yes": "Sì" + "yes": "Si" } \ No newline at end of file diff --git a/www/core/lang/ja.json b/www/core/lang/ja.json index 27ba12cde6a..8bc1a53581f 100644 --- a/www/core/lang/ja.json +++ b/www/core/lang/ja.json @@ -3,7 +3,7 @@ "allparticipants": "すべての参加者", "android": "Android", "areyousure": "本当によろしいですか?", - "back": "戻る", + "back": "« 戻る", "cancel": "キャンセル", "cannotconnect": "接続できません:正しいURLを入力しているか、サイトのMoodleが2.4以降であることを確認してください。", "cannotdownloadfiles": "ダウンロードしようとしているファイルは、あなたのモバイルサービスでは無効になっています。あなたのサイト管理者に連絡してください。", @@ -13,16 +13,16 @@ "clearsearch": "検索のクリア", "clicktohideshow": "展開または折りたたむにはここをクリックしてください。", "clicktoseefull": "クリックで全てのコンテンツを見る", - "close": "閉じる", - "comments": "あなたのコメント", + "close": "ウィンドウを閉じる", + "comments": "コメント", "commentscount": "コメント ({{$a}})", "commentsnotworking": "コメントが取得できませんでした", - "completion-alt-auto-fail": "完了: {{$a}} (合格点に達していない)", - "completion-alt-auto-n": "未了: {{$a}}", - "completion-alt-auto-pass": "完了: {{$a}} (合格点達成)", + "completion-alt-auto-fail": "完了: {{$a}} (合格点未到達)", + "completion-alt-auto-n": "未完了: {{$a}}", + "completion-alt-auto-pass": "完了: {{$a}} (合格点到達)", "completion-alt-auto-y": "完了: {{$a}}", - "completion-alt-manual-n": "未了: {{$a}}。選択して完了に変更してください。", - "completion-alt-manual-y": "完了: {{$a}}。選択して未了に変更してください。", + "completion-alt-manual-n": "未完了: {{$a}} 完了マークするには選択してください。", + "completion-alt-manual-y": "完了: {{$a}} 未完了マークするには選択してください。", "confirmcanceledit": "本当にこのページを離れますか? 全ての変更が失われます。", "confirmdeletefile": "本当にこのファイルを削除してもよろしいですか?", "confirmloss": "本当ですか? すべての変更が失われます。", @@ -41,7 +41,7 @@ "decsep": ".", "defaultvalue": "デフォルト ({{$a}})", "delete": "削除", - "deleting": "消去中", + "deleting": "削除", "description": "説明", "dfdaymonthyear": "YYYY/MM/DD", "dfdayweekmonth": "MMM月D日(ddd)", @@ -52,11 +52,11 @@ "discard": "無視", "dismiss": "取消", "done": "完了", - "download": "ダウンロード", + "download": "エクスポートしたカテゴリファイルをダウンロードする", "downloading": "ダウンロード中", "edit": "編集", "emptysplit": "左パネルが空またはロード中のため本ページは空白", - "error": "エラー", + "error": "エラーが発生しました。", "errorchangecompletion": "完了状態の変更中にエラーが発生しました。再度実行してください。", "errordeletefile": "ファイル消去中にエラーが発生しました。再度実行してください。", "errordownloading": "ファイルダウンロードのエラー", @@ -87,17 +87,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "画像", "imageviewer": "画像ビューア", - "info": "情報", + "info": "インフォメーション", "ios": "iOS", "labelsep": ":", "lastmodified": "最終更新日時", "lastsync": "最後の同期", "listsep": ",", - "loading": "読み込み", + "loading": "読み込み中 ...", "loadmore": "続きを読み込む", "lostconnection": "あなたのトークンが無効になったため、再接続に必要な情報がサーバにはありません。", "maxsizeandattachments": "新しいファイルの最大サイズ: {{$a.size}} / 最大添付: {{$a.attachments}}", - "min": "分", + "min": "最小評点", "mins": "分", "mod_assign": "課題", "mod_chat": "チャット", @@ -116,12 +116,12 @@ "name": "名称", "networkerrormsg": "ネットワークが無効もしくは機能していません", "never": "なし", - "next": "次へ", + "next": "続ける", "no": "No", - "nocomments": "コメントなし", + "nocomments": "コメントはありません。", "nograde": "評点なし", "none": "なし", - "nopasswordchangeforced": "パスワードを変更するまで続きを実行できません。", + "nopasswordchangeforced": "あなたはパスワードを変更せずに次へ進むことはできません。しかし、パスワードを変更するため利用できるページがありません。あなたのMoodle管理者にご連絡ください。", "nopermissions": "申し訳ございません、現在、あなたは 「 {{$a}} 」を実行するためのパーミッションがありません。", "noresults": "該当データがありません。", "notapplicable": "なし", @@ -129,7 +129,7 @@ "notsent": "未送信", "now": "現在", "numwords": "{{$a}} 語", - "offline": "オフライン", + "offline": "オンライン提出不要", "online": "オンライン", "openfullimage": "クリックしてフルサイズの画像を表示", "openinbrowser": "ブラウザで開く", @@ -138,7 +138,7 @@ "percentagenumber": "{{$a}}%", "phone": "電話", "pictureof": "画像 {{$a}}", - "previous": "前へ", + "previous": "前の状態に戻す", "pulltorefresh": "引いて更新", "redirectingtosite": "サイトにリダイレクトされます。", "refresh": "リフレッシュ", @@ -146,8 +146,8 @@ "requireduserdatamissing": "このユーザは必須のプロフィールデータが欠けています。Moodleでデータを補い、再度開いてください。
    {{$a}}", "retry": "再実行", "save": "保存", - "search": "検索", - "searching": "検索中", + "search": "検索 ...", + "searching": "検索:", "searchresults": "検索結果", "sec": "秒", "secs": "秒", @@ -165,9 +165,10 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "すみません...", + "sortby": "並べ替え", "start": "開始", "submit": "送信", - "success": "成功!", + "success": "成功", "tablet": "タブレット", "teachers": "教師", "thereisdatatosync": "同期が必要なオフライン {{$a}} があります。", @@ -180,7 +181,7 @@ "unexpectederror": "不明なエラー。アプリを閉じて再起動してみてください。", "unicodenotsupported": "本サイトでは一部の絵文字がサポートされていません。それらは送信されたメッセージから削除されます。", "unicodenotsupportedcleanerror": "Unicode文字をクリアする際に空のテキストがありました。", - "unknown": "不明な", + "unknown": "不明", "unlimited": "無制限", "unzipping": "未展開の", "upgraderunning": "サイトはアップグレード中です。後ほどお試しください。", diff --git a/www/core/lang/lt.json b/www/core/lang/lt.json index 599e752d69d..6a86388bca6 100644 --- a/www/core/lang/lt.json +++ b/www/core/lang/lt.json @@ -3,26 +3,26 @@ "allparticipants": "Visi dalyviai", "android": "Android", "areyousure": "Ar Jūs tikras?", - "back": "Grįžti", + "back": "« Atgal", "cancel": "Atšaukti", "cannotconnect": "Negalima prisijungti: patikrinkite, ar teisingai įvedėte URL adresą, ar Jūsų svetainė naudoja Moodle 2.4. ar vėlesnę versiją.", "cannotdownloadfiles": "Jūsų mobiliuoju ryšiu negalima atsisiųsti failo. Prašome susisiekti su svetainės administratoriumi.", - "category": "Kursų kategorija", + "category": "Kategorija", "choose": "Pasirinkite", "choosedots": "Pasirinkite...", "clearsearch": "Išvalyti peiškos laukelį", "clicktohideshow": "Spustelėkite, kad išplėstumėte ar sutrauktumėte", "clicktoseefull": "Paspauskite norėdami pamatyti visą turinį.", - "close": "Uždaryti", - "comments": "Jūsų komentarai", + "close": "Uždaryti langą", + "comments": "Komentarai", "commentscount": "Komentarai ({{$a}})", "commentsnotworking": "Komentarų negalima ištaisyti", - "completion-alt-auto-fail": "Baigta: {{$a}} (nepasiekta)", + "completion-alt-auto-fail": "Užbaigta: {{$a}} (negautas išlaikymo įvertis)", "completion-alt-auto-n": "Nebaigta: {{$a}}", - "completion-alt-auto-pass": "Baigta: {{$a}} (pasiekta)", - "completion-alt-auto-y": "Baigta: {{$a}}", - "completion-alt-manual-n": "Nebaigta: {{$a}}. Pažymėti, kaip baigtą", - "completion-alt-manual-y": "Baigta: {{$a}}. Pažymėti, kaip nebaigtą.", + "completion-alt-auto-pass": "Užbaigta: {{$a}} (gautas išlaikymo įvertis)", + "completion-alt-auto-y": "Užbaigta: {{$a}}", + "completion-alt-manual-n": "Dar neužbaigta: {{$a}}. Pasirinkti pažymėti kaip užbaigtą", + "completion-alt-manual-y": "Užbaigta: {{$a}}. Pasirinkti pažymėti kaip nebaigtą", "confirmcanceledit": "Ar tikrai norite išeiti iš šio puslapio? Visi pakeitimai bus prarasti.", "confirmdeletefile": "Ar tikrai norite naikinti šį failą?", "confirmopeninbrowser": "Ar norite tai atidaryti naršyklėje?", @@ -34,12 +34,12 @@ "currentdevice": "Dabartinis prietaisas", "datastoredoffline": "Duomenys saugomi įrenginyje, nes šiuo metu negalima išsiųsti. Bus vėlaiu išsiųsti automatiškai.", "date": "Data", - "day": "diena", - "days": "dienos", + "day": "Diena(-os)", + "days": "Dienos", "decsep": ".", - "delete": "Naikinti", - "deleting": "Trinama", - "description": "Aprašas", + "delete": "Pašalinti", + "deleting": "Naikinama", + "description": "Įžangos tekstas", "dfdaymonthyear": "MM-DD-MMMM", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", @@ -48,10 +48,10 @@ "discard": "Atmesti", "dismiss": "Praleisti", "done": "Atlikta", - "download": "Atsisiųsti", + "download": "Spustelėkite, kad atsisiųstumėte eksportuotą kategorijos failą", "downloading": "Siunčiama", "edit": "Redaguoti", - "error": "Klaida", + "error": "Įvyko klaida", "errorchangecompletion": "Klaida keičiant baigimo būseną. Pabandykite dar kartą.", "errordeletefile": "Klaida trinant failą. Pabandykite dar kartą.", "errordownloading": "Klaida siunčiant failą.", @@ -74,7 +74,7 @@ "groupsseparate": "Atskiros grupės", "groupsvisible": "Matomos grupės", "hasdatatosync": "{{$a}} turi duomenis, kuriuos reikia sinchronizuoti.", - "help": "Žinynas", + "help": "Pagalba", "hide": "Slėpti", "hour": "valanda", "hours": "valandos", @@ -84,13 +84,13 @@ "info": "Informacija", "ios": "iOS", "labelsep": ":", - "lastmodified": "Paskutinį kartą modifikuota", + "lastmodified": "Paskutinį kartą keista", "lastsync": "Paskutinis sinchronizavimas", "listsep": ";", - "loading": "Įkeliama...", + "loading": "Kraunasi", "lostconnection": "Jūsų atpažinimo kodas neteisingas arba negalioja, turėsite vėl prisijungti prie svetainės.", "maxsizeandattachments": "Maksimalus naujo failo dydis: {{$a.size}}, maksimalus priedų skaičius: {{$a.attachments}}", - "min": "min.", + "min": "Mažiausias balas", "mins": "min.", "mod_assign": "Užduotis", "mod_assignment": "Užduotis", @@ -120,15 +120,15 @@ "mod_workshop": "Darbas grupėje", "moduleintro": "Aprašas", "mygroups": "Mano grupės", - "name": "Vardas", + "name": "Pavadinimas", "networkerrormsg": "Tinklas nepasiekiamas arba neveikia.", "never": "Niekada", - "next": "Pirmyn", + "next": "Tęsti", "no": "Ne", - "nocomments": "Jokių komentarų", - "nograde": "Nėra įverčio", - "none": "Nei vienas", - "nopasswordchangeforced": "Nepakeitus slaptažodžio, negalima tęsti.", + "nocomments": "Nėra komentarų", + "nograde": "Nėra įvertinimų.", + "none": "Nėra", + "nopasswordchangeforced": "Negalite tęsti nepakeitę slaptažodžio, tačiau nėra slaptažodžio keitimo puslapio. Susisiekite su „Moodle“ administratoriumi.", "nopermissions": "Atsiprašome, tačiau šiuo metu jūs neturite teisės atlikti šio veiksmo", "noresults": "Nėra rezultatų", "notapplicable": "netaikoma", @@ -136,7 +136,7 @@ "notsent": "Neišsiųsta", "now": "dabar", "numwords": "Žodžių: {{$a}}", - "offline": "Neprisijungęs", + "offline": "Nereikia įkelti darbų į svetainę", "online": "Prisijungęs", "openfullimage": "Paspauskite, norėdami matyti visą vaizdą", "openinbrowser": "Atidaryti naršyklėje", @@ -145,21 +145,21 @@ "percentagenumber": "{{$a}}%", "phone": "Telefonas", "pictureof": "{{$a}} paveikslėlis", - "previous": "Ankstesnis", + "previous": "Ankstesnė būsena", "pulltorefresh": "Atnaujinti", "redirectingtosite": "Būsite nukreiptas į svetainę.", "refresh": "Atnaujinti", - "required": "Būtina", + "required": "Privalomas", "requireduserdatamissing": "Trūkta vartotojo duomenų. Prašome užpildyti duomenis Moodle ir pabandyti dar kartą.
    {{$a}}", "retry": "Bandykite dar kartą", - "save": "Įrašyti", - "search": "Ieškoti", - "searching": "Ieškoma", + "save": "Išsaugoti", + "search": "Paieška", + "searching": "Ieškoti", "searchresults": "Ieškos rezultatai", "sec": "sek.", "secs": "sek.", "seemoredetail": "Spustelėkite čia, kad pamatytumėte daugiau informacijos", - "send": "siųsti", + "send": "Siųsti", "sending": "Siunčiama", "serverconnection": "Klaida jungiantis į serverį", "show": "Rodyti", @@ -172,9 +172,10 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Atsiprašome...", + "sortby": "Rūšiuoti pagal", "start": "Pradėti", "submit": "Pateikti", - "success": "Sėkmė!", + "success": "Sėkmingai", "tablet": "Planšetė", "teachers": "Dėstytojai", "thereisdatatosync": "Neprijungtas {{$a}}, kad sinchronizuotų.", @@ -185,7 +186,7 @@ "twoparagraphs": "{{p1}}

    {{p2}}", "uhoh": "Uh oh!", "unexpectederror": "Klaida. Uždarykite programėlę ir bandykite atidaryti dar kartą", - "unknown": "Nežinomas", + "unknown": "Nežinoma", "unlimited": "Neribota", "unzipping": "Išskleidžiama", "upgraderunning": "Naujinama svetainės versija, bandykite vėliau.", @@ -199,7 +200,7 @@ "whyisthishappening": "Kodėl tai nutiko?", "windowsphone": "Windows telefonas", "wsfunctionnotavailable": "Interneto paslaugų funkcija nepasiekiama.", - "year": "metai", + "year": "Metai (-ų)", "years": "metai", "yes": "Taip" } \ No newline at end of file diff --git a/www/core/lang/nl.json b/www/core/lang/nl.json index 59efdc360b6..4193e16acd3 100644 --- a/www/core/lang/nl.json +++ b/www/core/lang/nl.json @@ -3,7 +3,7 @@ "allparticipants": "Alle deelnemers", "android": "Android", "areyousure": "Weet je het zeker?", - "back": "Terug", + "back": "« Terug", "cancel": "Annuleer", "cannotconnect": "Kan niet verbinden: controleer of je de URL juist hebt ingegeven en dat je site Moodle 2.4 of recenter gebruikt.", "cannotdownloadfiles": "Bestanden downloaden is uitgeschakeld voor jouw mobiele service. Neem contact op met je systeembeheerder.", @@ -13,36 +13,36 @@ "clearsearch": "Zoekresultaten leegmaken", "clicktohideshow": "Klik om te vergroten of te verkleinen", "clicktoseefull": "Klik hier om de volledige inhoud te zien", - "close": "Sluit", - "comments": "Notities", + "close": "Sluit weergave test", + "comments": "Jouw commentaar", "commentscount": "Opmerkingen ({{$a}})", "commentsnotworking": "Opmerkingen konden niet opgehaald worden", - "completion-alt-auto-fail": "Voltooid: {{$a}} (slaagcijfer niet behaald)", + "completion-alt-auto-fail": "Voltooid: {{$a}} (bereikte het cijfer voor geslaagd niet)", "completion-alt-auto-n": "Niet voltooid: {{$a}}", - "completion-alt-auto-pass": "Voltooid: {{$a}} (slaagcijfer behaald)", + "completion-alt-auto-pass": "Voltooid: {{$a}} (slaagcijfer bereikt)", "completion-alt-auto-y": "Voltooid: {{$a}}", - "completion-alt-manual-n": "Niet voltooid: {{$a}}. Selecteer om als voltooid te markeren.", - "completion-alt-manual-y": "Voltooid: {{$a}}. Selecteer om als niet voltooid te markeren.", + "completion-alt-manual-n": "Niet voltooid: {{$a}}. Selecteer om te markeren als voltooid", + "completion-alt-manual-y": "voltooid: {{$a}}. Selecteer om als niet voltooid te markeren.", "confirmcanceledit": "Weet je zeker dat je deze pagina wil verlaten? Alle wijzigingen zullen verloren gaan.", "confirmdeletefile": "Wil je dit bestand echt verwijderen?", "confirmloss": "Ben je zeker? Alle wijzigingen zullen verloren gaan.", "confirmopeninbrowser": "Wil je het openen in je browser?", "content": "Inhoud", "contenteditingsynced": "De inhoud die je aan het bewerken bent, is gesynchroniseerd.", - "continue": "Ga door", + "continue": "Ga verder", "copiedtoclipboard": "Tekst gekopieerd naar klembord", "course": "Cursus", "coursedetails": "Cursusdetails", "currentdevice": "Huidig apparaat", "datastoredoffline": "Gegevens die bewaard werden op het toestel konden niet verstuurd worden. Ze zullen later automatisch verzonden worden.", "date": "Datum", - "day": "dag", - "days": "dagen", + "day": "Dag(en)", + "days": "Dagen", "decsep": ",", "defaultvalue": "Standaard ({{$a}})", "delete": "Verwijder", - "deleting": "Verwijderen.", - "description": "Inleidende tekst", + "deleting": "Verwijderen", + "description": "Beschrijving", "dfdaymonthyear": "MM-DD-JJJJ", "dfdayweekmonth": "ddd, D, MMM", "dffulldate": "dddd, D MMMM YYYY h[:]mm A", @@ -52,11 +52,11 @@ "discard": "Verwerpen", "dismiss": "Verwijderen", "done": "Voltooid", - "download": "Download", + "download": "Klik om het bestand met de geëxporteerde categorie te downloaden", "downloading": "Downloaden", - "edit": "Wijzig", + "edit": "Bewerk", "emptysplit": "Deze pagina zal leeg verschijnen als het linker paneel leeg of aan het laden is.", - "error": "Fout", + "error": "Er is een fout opgetreden", "errorchangecompletion": "Er is een fout opgetreden tijdens het wijzigen van de voltooiingsstatus. Probeer opnieuw.", "errordeletefile": "Fout tijdens het verwijderen van het bestand. Probeer opnieuw.", "errordownloading": "Fout bij downloaden bestand", @@ -87,17 +87,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Afbeelding", "imageviewer": "Afbeeldingsviewer", - "info": "Info", + "info": "Informatie", "ios": "iOS", "labelsep": ": ", - "lastmodified": "Laatste wijziging", + "lastmodified": "Laatst gewijzigd", "lastsync": "Laatste synchronisatie", "listsep": ";", - "loading": "Aan het laden", + "loading": "Laden...", "loadmore": "Meer laden", "lostconnection": "We zijn de verbinding kwijt en moeten opnieuw verbinden. Je token is nu ongeldig.", "maxsizeandattachments": "Maximale grootte voor nieuwe bestanden: {{$a.size}}, maximum aantal bijlagen: {{$a.attachments}}", - "min": "minuut", + "min": "Minimumscore", "mins": "minuten", "mod_assign": "Opdracht", "mod_assignment": "Opdracht", @@ -130,20 +130,20 @@ "name": "Naam", "networkerrormsg": "Netwerk niet ingeschakeld of werkt niet.", "never": "Nooit", - "next": "VolgendeAdm", + "next": "Volgende", "no": "Nee", - "nocomments": "Geen commentaren", - "nograde": "Nog geen cijfer", + "nocomments": "Er zijn geen opmerkingen", + "nograde": "Geen cijfer.", "none": "Geen", - "nopasswordchangeforced": "Je kunt niet verdergaan zonder je wachtwoord te veranderen.", + "nopasswordchangeforced": "Je kunt niet verdergaan zonder je wachtwoord te wijzigen, hoewel er geen pagina voorzien is om dat te doen. Neem contact op met je Moodlebeheerder", "nopermissions": "Sorry, maar je hebt nu niet het recht om dat te doen ({{$a}}).", - "noresults": "Geen resultaten", + "noresults": "Geen resultaat", "notapplicable": "n/a", "notice": "Opmerking", "notsent": "Niet verstuurd", "now": "Nu", "numwords": "{{$a}} woorden", - "offline": "Offline", + "offline": "Je hoeft niets online in te sturen", "online": "Online", "openfullimage": "Klik hier om de afbeelding op volledige grootte weer te geven", "openinbrowser": "Open in browser", @@ -152,24 +152,24 @@ "percentagenumber": "{{$a}}%", "phone": "Telefoon", "pictureof": "Foto van {{$a}}", - "previous": "Vorige", + "previous": "Vorige status", "pulltorefresh": "Slepen om te verversen", "redirectingtosite": "Je wordt doorgestuurd naar de site.", "refresh": "Vernieuw", - "required": "Verplicht", + "required": "Vereist", "requireduserdatamissing": "Er ontbreken vereiste gegevens in het profiel van deze gebruiker. Vul deze gegevens in op je Moodle site en probeer opnieuw.
    {{$a}}", "retry": "Probeer opnieuw", "save": "Bewaar", - "search": "Zoek", - "searching": "Zoeken", + "search": "Zoeken...", + "searching": "Zoek in", "searchresults": "Zoekresultaten", "sec": "seconde", "secs": "seconden", "seemoredetail": "Klik hier om meer details te zien", - "send": "Stuur", - "sending": "Sturen", + "send": "stuur", + "sending": "Versturen", "serverconnection": "Fout bij het verbinden met de server", - "show": "Toon", + "show": "Laat zien", "showmore": "Toon meer...", "site": "Site", "sitemaintenance": "De site is in onderhoud en is op dit ogenblik niet beschikbaar.", @@ -179,9 +179,10 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Sorry...", + "sortby": "Sorteer volgens", "start": "Start", - "submit": "Insturen", - "success": "Gelukt!", + "submit": "Verstuur", + "success": "Succes", "tablet": "Tablet", "teachers": "leraren", "thereisdatatosync": "Er zijn offline {{$a}} die moeten worden gesynchroniseerd.", @@ -202,7 +203,7 @@ "userdetails": "Gebruikersdetails", "usernotfullysetup": "Gebruiker niet volledig ingesteld", "users": "Gebruikers", - "view": "Bekijken", + "view": "Bekijk", "viewprofile": "Bekijk profiel", "warningofflinedatadeleted": "Offline data van {{component}} '{{name}}' is verwijderd. {{error}}", "whoops": "Oei!", diff --git a/www/core/lang/pl.json b/www/core/lang/pl.json index d01910cc16c..2074cef52c4 100644 --- a/www/core/lang/pl.json +++ b/www/core/lang/pl.json @@ -1,15 +1,15 @@ { "allparticipants": "Wszyscy uczestnicy", "areyousure": "Jesteś pewien?", - "back": "Wstecz", + "back": "« Powrót", "cancel": "Anuluj", "cannotconnect": "Nie można się połączyć: Sprawdź, czy wpisałeś poprawyny adres URL i twoja strona używa Moodle 2.4 lub nowsze.", "category": "Kategoria", "choose": "Wybierz", "choosedots": "Wybierz ...", "clicktohideshow": "Kliknij, aby rozwinąć lub zwinąć", - "close": "Zamknij", - "comments": "Twój komentarz", + "close": "Zamknij okno", + "comments": "Komentarze", "commentscount": "Komentarze ({{$a}})", "completion-alt-auto-fail": "Ukończone: {{$a}} (bez pozytywnej oceny)", "completion-alt-auto-n": "Nie ukończone: {{$a}}", @@ -22,18 +22,18 @@ "continue": "Kontynuuj", "course": "Kurs", "coursedetails": "Szczegóły kursu", - "date": "Data", - "day": "dzień", - "days": "dni", + "date": "data", + "day": "Dzień/dni", + "days": "Dni", "decsep": ",", "delete": "Usuń", "deleting": "Usuwanie", - "description": "Wstęp", + "description": "Opis", "done": "Wykonane", - "download": "Pobierz", + "download": "Ściągnij", "downloading": "Pobieranie ...", - "edit": "Modyfikuj", - "error": "Błąd", + "edit": "Edytuj", + "error": "Wystąpił błąd", "filename": "Nazwa pliku", "folder": "Folder", "forcepasswordchangenotice": "W celu kontynuacji musisz zmienić swoje hasło", @@ -46,12 +46,12 @@ "hours": "godz.", "info": "Informacja", "labelsep": ": ", - "lastmodified": "Ostatnia modyfikacja", + "lastmodified": "Ostatnia modyfikacja:", "listsep": ";", - "loading": "Ładowanie", + "loading": "Ładuję ...", "lostconnection": "Straciliśmy połączenie i musisz się połączyć ponowne. Twój token jest teraz nieważny", "maxsizeandattachments": "Maksymalny rozmiar dla nowych plików: {{$a.size}}, maksimum załączników: {{$a.attachments}}", - "min": "min", + "min": "Min punkty", "mins": "min.", "mod_assign": "Zadanie", "mod_chat": "Czat", @@ -66,13 +66,13 @@ "mod_survey": "Ankieta", "mod_wiki": "Wiki", "moduleintro": "Opis", - "name": "Nazwa:", + "name": "Nazwa", "networkerrormsg": "Sieć jest wyłączona lub nie działa.", "never": "Nigdy", - "next": "Dalej", + "next": "Następny", "no": "Nie", "nocomments": "Brak komentarzy", - "nograde": "Brak oceny", + "nograde": "Brak oceny.", "none": "Żaden", "nopasswordchangeforced": "Nie możesz kontynuować bez zmiany hasła, jakkolwiek nie ma dostępnej strony do tej zmiany. Proszę skontaktować się z Administratorem Moodla.", "nopermissions": "Brak odpowiednich uprawnień do wykonania ({{$a}})", @@ -80,22 +80,22 @@ "notice": "Powiadomienie", "now": "teraz", "numwords": "{{$a}} słów", - "offline": "Wysyłanie online nie jest wymagane", + "offline": "Offline", "online": "Online", "pagea": "Strona {{$a}}", "phone": "Telefon", "pictureof": "Obraz {{$a}}", - "previous": "Poprzedni", - "refresh": "Odśwież", + "previous": "Poprzedni stan", + "refresh": "Odswież", "required": "Wymagane", "save": "Zapisz", - "search": "Wyszukaj", - "searching": "Szukaj w", - "searchresults": "Wyniki wyszukiwania", + "search": "Szukaj", + "searching": "Wyszukiwanie w ...", + "searchresults": "Szukaj w rezultatach", "sec": "sek", "secs": "sek.", "seemoredetail": "Kliknij aby zobaczyć więcej szczegółów", - "send": "wyślij", + "send": "Wyślij", "sending": "Wysyłanie", "serverconnection": "Błąd podczas łączenia się z serwerem", "show": "Pokaż", @@ -104,8 +104,9 @@ "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", + "sortby": "Posortuj według", "start": "Rozpocznij", - "submit": "Prześlij", + "submit": "Zatwierdź", "success": "Gotowe", "teachers": "Prowadzący", "time": "Czas", @@ -118,9 +119,9 @@ "userdeleted": "To konto użytkownika zostało usunięte", "userdetails": "Szczegóły użytkownika", "users": "Użytkownicy", - "view": "Wejście", + "view": "Przegląd", "viewprofile": "Zobacz profil", - "year": "rok", + "year": "Rok/lata", "years": "lata", "yes": "Tak" } \ No newline at end of file diff --git a/www/core/lang/pt-br.json b/www/core/lang/pt-br.json index a461e54702c..7f18ff238b8 100644 --- a/www/core/lang/pt-br.json +++ b/www/core/lang/pt-br.json @@ -3,7 +3,7 @@ "allparticipants": "Todos os participantes", "android": "Android", "areyousure": "Você tem certeza?", - "back": "Voltar", + "back": "« Voltar", "cancel": "Cancelar", "cannotconnect": "Não é possível conectar-se: Verifique se digitou a URL corretamente e se seu site usa o Moodle 2.4 ou posterior.", "cannotdownloadfiles": "Download de arquivos está desabilitado no seu serviço Mobile. Por favor, contate o administrador do site.", @@ -13,16 +13,16 @@ "clearsearch": "Limpar busca", "clicktohideshow": "Clique para expandir ou contrair", "clicktoseefull": "Clique para ver o conteúdo completo.", - "close": "Fechar", - "comments": "Seus comentários", + "close": "Fechar janela", + "comments": "Comentários", "commentscount": "Comentários ({{$a}})", "commentsnotworking": "Os comentários não podem ser recuperados", - "completion-alt-auto-fail": "Concluído: {{$a}} (não alcançou a nota para passar)", - "completion-alt-auto-n": "Não concluído: {{$a}}", - "completion-alt-auto-pass": "Concluído: {{$a}} (nota para passar foi alcançada)", + "completion-alt-auto-fail": "Concluído: {{$a}} (não obteve nota para aprovação)", + "completion-alt-auto-n": "Não concluído(s): {{$a}}", + "completion-alt-auto-pass": "Concluído: {{$a}} (foi atingida a nota de aprovação)", "completion-alt-auto-y": "Concluído: {{$a}}", - "completion-alt-manual-n": "Não concluído: {{$a}}. Selecione para marcar como concluída.", - "completion-alt-manual-y": "Concluído: {{$a}}. Selecione para marcar como não concluída.", + "completion-alt-manual-n": "Não concluído(s): {{$a}}. Selecione para marcar como concluído.", + "completion-alt-manual-y": "Concluído(s): {{$a}}. Selecione para marcar como não concluído.", "confirmcanceledit": "Você tem certeza que quer sair dessa página? Todas as mudanças serão perdidas.", "confirmdeletefile": "Você tem certeza que quer excluir este arquivo?", "confirmloss": "Você tem certeza? Todas as alterações serão perdidas.", @@ -36,12 +36,12 @@ "currentdevice": "Dispositivo atual", "datastoredoffline": "Os dados foram guardados no dispositivo porque não foi possível enviar agora. Os dados serão automaticamente enviados mais tarde.", "date": "Data", - "day": "dia", - "days": "dias", + "day": "Dia(s)", + "days": "Dias", "decsep": ",", - "delete": "Cancelar", + "delete": "Excluir", "deleting": "Excluindo", - "description": "Texto do link", + "description": "Descrição", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", @@ -50,10 +50,10 @@ "discard": "Descartar", "dismiss": "Dispersar", "done": "Feito", - "download": "Download", + "download": "Baixar", "downloading": "Baixando", "edit": "Editar", - "error": "Erro", + "error": "Ocorreu um erro", "errorchangecompletion": "Ocorreu um erro ao alterar o status de conclusão. Por favor, tente novamente.", "errordeletefile": "Erro ao excluir o arquivo. Por favor tente novamente.", "errordownloading": "Erro ao baixar o arquivo", @@ -84,16 +84,16 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagem", "imageviewer": "Visualizador de imagens", - "info": "Informações", + "info": "Informação", "ios": "iOS", "labelsep": ": ", - "lastmodified": "Última atualização", + "lastmodified": "Última modificação", "lastsync": "Última sincronização", "listsep": ";", - "loading": "Carregando", + "loading": "Carregando...", "lostconnection": "Perdemos conexão. Você precisa se reconectar. Seu token agora está inválido.", "maxsizeandattachments": "Tamanho máximo para novos arquivos: {{$a.size}}, máximo de anexos: {{$a.attachments}}", - "min": "minuto", + "min": "Pontuação mínima", "mins": "minutos", "mod_assign": "Tarefa", "mod_assignment": "Tarefa", @@ -126,21 +126,21 @@ "name": "Nome", "networkerrormsg": "Rede não habilitada ou não está funcionado", "never": "Nunca", - "next": "Próximo", + "next": "Próxima", "no": "Não", - "nocomments": "Nenhum comentário", - "nograde": "Nenhuma nota", + "nocomments": "Não existem comentários", + "nograde": "Não há nota", "none": "Nenhum", - "nopasswordchangeforced": "Você não pode proceder sem mudar sua senha.", + "nopasswordchangeforced": "Você não pode continuar sem mudar sua senha. Mas infelizmente não existe uma página para esse propósito.\nPor favor contate o Administrador Moodle.", "nopermissions": "Você não tem permissão para {{$a}}", - "noresults": "Nenhum resultado", + "noresults": "Sem resultados", "notapplicable": "n/a", "notice": "Notar", "notsent": "Não enviado", "now": "agora", "numwords": "{{$a}} palavras", - "offline": "Offline", - "online": "Online", + "offline": "Não há envios online solicitados", + "online": "Conectado", "openfullimage": "Clique aqui para exibir a imagem no tamanho completo", "openinbrowser": "Abrir no navegador", "othergroups": "Outros grupos", @@ -148,24 +148,24 @@ "percentagenumber": "{{$a}}%", "phone": "Fone", "pictureof": "Imagem de {{$a}}", - "previous": "Anterior", + "previous": "Estado anterior", "pulltorefresh": "Puxe para atualizar", "redirectingtosite": "Você será redirecionado para o site.", "refresh": "Atualizar", - "required": "Necessários", + "required": "Exigido", "requireduserdatamissing": "Este usuário não possui alguns dados de perfil exigidos. Por favor, preencha estes dados em seu Moodle e tente novamente.
    {{$a}}", "retry": "Tentar novamente", - "save": "Gravar", - "search": "Buscar", - "searching": "Procurando", + "save": "Salvar", + "search": "Busca", + "searching": "Buscar em", "searchresults": "Resultados da busca", "sec": "segundo", "secs": "segundos", "seemoredetail": "Clique aqui para mais detalhes", - "send": "enviar", + "send": "Enviar", "sending": "Enviando", "serverconnection": "Erro ao conectar ao servidor", - "show": "Mostrar", + "show": "Exibir", "showmore": "Exibir mais...", "site": "Site", "sitemaintenance": "Os site está em manutenção e atualmente não está disponível", @@ -175,13 +175,14 @@ "sizemb": "Mb", "sizetb": "TB", "sorry": "Desculpe...", + "sortby": "Ordenar por", "start": "Início", "submit": "Enviar", - "success": "Sucesso!", + "success": "Sucesso", "tablet": "Tablet", "teachers": "Professores", "thereisdatatosync": "Existem {{$a}} offline para ser sincronizados.", - "time": "Hora", + "time": "Duração", "timesup": "Acabou o tempo de duração!", "today": "Hoje", "tryagain": "Tente de novo", @@ -196,15 +197,16 @@ "upgraderunning": "O site está sendo atualizado, por favor, tente novamente mais tarde.", "userdeleted": "Esta conta de usuário foi cancelada", "userdetails": "Detalhes do usuário", + "usernotfullysetup": "O usuário não está totalmente configurado", "users": "Usuários", - "view": "Ver", + "view": "Visualizar", "viewprofile": "Ver perfil", "warningofflinedatadeleted": "Dados offline de {{component}} '{{name}}' foram excluídos. {{error}}", "whoops": "Oops!", "whyisthishappening": "Por que isso está acontecendo?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "A função do webservice não está disponível.", - "year": "ano", + "year": "Ano(s)", "years": "anos", "yes": "Sim" } \ No newline at end of file diff --git a/www/core/lang/pt.json b/www/core/lang/pt.json index 8914e8b66a2..73eb3906a63 100644 --- a/www/core/lang/pt.json +++ b/www/core/lang/pt.json @@ -3,7 +3,7 @@ "allparticipants": "Todos", "android": "Android", "areyousure": "Tem a certeza?", - "back": "Voltar", + "back": "« Voltar", "cancel": "Cancelar", "cannotconnect": "Não é possível estabelecer a ligação: Verifique se digitou o URL corretamente e se o seu site Moodle possui a versão 2.4 ou superior.", "cannotdownloadfiles": "O seu serviço Moodle não permite descarregar ficheiros. Por favor, contacte o administrador do site.", @@ -13,16 +13,16 @@ "clearsearch": "Limpar pesquisa", "clicktohideshow": "Clique para expandir ou contrair", "clicktoseefull": "Clique para ver todos os conteúdos.", - "close": "Fechar", - "comments": "Os seus comentários", + "close": "Fechar janela", + "comments": "Comentários", "commentscount": "Comentários ({{$a}})", "commentsnotworking": "Não foi possível recuperar os comentários", - "completion-alt-auto-fail": "Concluído: {{$a}} (não alcançou a nota mínima para passar)", - "completion-alt-auto-n": "Não concluído: {{$a}}", - "completion-alt-auto-pass": "Concluído: {{$a}} (alcançou a nota mínima para passar)", - "completion-alt-auto-y": "Concluído: {{$a}}", - "completion-alt-manual-n": "Não concluído: {{$a}}. Selecione para marcar como concluída.", - "completion-alt-manual-y": "Concluído: {{$a}}. Selecione para marcar como não concluída.", + "completion-alt-auto-fail": "Concluída: {{$a}} (não atingiu nota de aprovação)", + "completion-alt-auto-n": "Não concluída: {{$a}}", + "completion-alt-auto-pass": "Concluída: {{$a}} (atingiu nota de aprovação)", + "completion-alt-auto-y": "Concluída: {{$a}}", + "completion-alt-manual-n": "Não concluída: {{$a}}. Selecione para assinalar como concluída", + "completion-alt-manual-y": "Concluída: {{$a}}. Selecione para dar como não concluída", "confirmcanceledit": "Tem a certeza de que pretende sair desta página? Todas as alterações serão perdidas.", "confirmdeletefile": "Tem a certeza de que pretende apagar este ficheiro?", "confirmloss": "Tem a certeza absoluta? Todas as alterações serão perdidas.", @@ -36,8 +36,8 @@ "currentdevice": "Dispositivo atual", "datastoredoffline": "Dados armazenados no dispositivo por não ter sido possível enviar. Serão automaticamente enviados mais tarde.", "date": "Data", - "day": "dia", - "days": "dias", + "day": "Dia(s)", + "days": "Dias", "decsep": ",", "delete": "Apagar", "deleting": "A apagar", @@ -51,11 +51,11 @@ "discard": "Descartar", "dismiss": "Dispensar", "done": "Concluído", - "download": "Descarregar", + "download": "Clique para descarregar o ficheiro de categorias exportado", "downloading": "A descarregar", "edit": "Editar", "emptysplit": "Esta página aparecerá em branco se o painel esquerdo estiver vazio ou enquanto estiver a ser carregado.", - "error": "Erro", + "error": "Ocorreu um erro", "errorchangecompletion": "Ocorreu um erro ao alterar o estado de conclusão. Por favor, tente novamente.", "errordeletefile": "Erro ao apagar o ficheiro. Por favor, tente novamente.", "errordownloading": "Erro ao descarregar ficheiro.", @@ -86,17 +86,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagem", "imageviewer": "Visualizador de imagens", - "info": "Informações", + "info": "Informação", "ios": "iOS", "labelsep": ": ", - "lastmodified": "Última alteração", + "lastmodified": "Modificado pela última vez:", "lastsync": "Última sincronização", "listsep": ";", - "loading": "A carregar", + "loading": "A carregar...", "loadmore": "Ver mais", "lostconnection": "O seu token é inválido ou expirou, terá de se autenticar novamente no site.", "maxsizeandattachments": "Tamanho máximo para novos ficheiros: {{$a.size}}, número máximo de anexos: {{$a.attachments}}", - "min": "minuto", + "min": "Pontuação mínima", "mins": "minutos", "mod_assign": "Trabalho", "mod_assignment": "Trabalho", @@ -126,15 +126,15 @@ "mod_workshop": "Workshop", "moduleintro": "Descrição", "mygroups": "Meus grupos", - "name": "Designação", + "name": "Nome", "networkerrormsg": "A rede está desativada ou não está a funcionar corretamente.", "never": "Nunca", - "next": "Seguinte", + "next": "Continuar", "no": "Não", - "nocomments": "Sem comentários", - "nograde": "Nenhuma nota", - "none": "Nenhum", - "nopasswordchangeforced": "Não pode prosseguir sem alterar sua senha.", + "nocomments": "Não existem comentários", + "nograde": "Sem avaliação", + "none": "Nenhuma", + "nopasswordchangeforced": "Não consegue prosseguir sem modificar a senha, entretanto não existe nenhuma página disponível para a mudar. Por favor contate o Administrador do site Moodle.", "nopermissions": "Atualmente, não tem permissões para realizar a operação {{$a}}", "noresults": "Sem resultados", "notapplicable": "n/a", @@ -142,8 +142,8 @@ "notsent": "Não enviado", "now": "agora", "numwords": "{{$a}} palavra(s)", - "offline": "Offline", - "online": "Online", + "offline": "Não é necessário submeter nada online", + "online": "Inativo", "openfullimage": "Clique aqui para exibir a imagem em tamanho real", "openinbrowser": "Abrir no navegador", "othergroups": "Outros grupos", @@ -151,17 +151,17 @@ "percentagenumber": "{{$a}}%", "phone": "Telefone", "pictureof": "Fotografia de {{$a}}", - "previous": "Anterior", + "previous": "Estado anterior", "pulltorefresh": "Puxe para atualizar", "redirectingtosite": "Irá ser redirecionado para o site.", "refresh": "Atualizar", - "required": "Resposta obrigatória", + "required": "Obrigatório", "requireduserdatamissing": "Este utilizador não possui todos os dados de perfil obrigatórios. Por favor, preencha estes dados no seu Moodle e tente novamente.
    {{$a}}", "retry": "Tentar novamente", - "save": "Gravar", - "search": "Procurar", - "searching": "A procurar", - "searchresults": "Procurar resultados", + "save": "Guardar", + "search": "Pesquisa", + "searching": "Pesquisar em", + "searchresults": "Resultados da procura", "sec": "segundo", "secs": "segundos", "seemoredetail": "Clique aqui para ver mais detalhes", @@ -178,13 +178,14 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "Desculpe...", + "sortby": "Ordenar por", "start": "Iniciar", - "submit": "Enviar", - "success": "Sucesso!", + "submit": "Submeter", + "success": "Operação realizada com sucesso!", "tablet": "Tablet", "teachers": "Professores", "thereisdatatosync": "Existem {{$a}} offline que têm de ser sincronizados.", - "time": "Hora", + "time": "Tempo", "timesup": "O tempo terminou!", "today": "Hoje", "tryagain": "Tente novamente", @@ -193,7 +194,7 @@ "unexpectederror": "Erro inesperado. Por favor, feche e abra novamente a aplicação para tentar de novo", "unicodenotsupported": "Alguns emojis não são suportados neste site. Estes caracteres serão removidos quando a mensagem for enviada.", "unicodenotsupportedcleanerror": "Foi encontrado texto vazio ao limpar caracteres Unicode.", - "unknown": "Desconhecido", + "unknown": "Desconhecido(a)", "unlimited": "Ilimitado(a)", "unzipping": "A descomprimir", "upgraderunning": "O site está em processo de atualização, por favor, tente novamente mais tarde.", @@ -208,7 +209,7 @@ "whyisthishappening": "Por que é que isto está a acontecer?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "A função do webservice não está disponível.", - "year": "ano", + "year": "Ano(s)", "years": "anos", "yes": "Sim" } \ No newline at end of file diff --git a/www/core/lang/ro.json b/www/core/lang/ro.json index 68b050e23b9..6cbdac71897 100644 --- a/www/core/lang/ro.json +++ b/www/core/lang/ro.json @@ -2,7 +2,7 @@ "allparticipants": "Toţi participanţii", "android": "Adroid", "areyousure": "Ești sigur?", - "back": "Înapoi", + "back": "« Înapoi", "cancel": "Anulează", "cannotconnect": "A apărut o eroare conectare: verificați dacă ați scris corect adresa URL căutată și dacă siteul folosește cel puțin versiune de Moodle 2.4", "cannotdownloadfiles": "Descărcarea de fișiere este dezactivată pentru serviciul mobil. Contactați administratorul siteului.", @@ -12,37 +12,37 @@ "clearsearch": "Curățați căutările", "clicktohideshow": "Click pentru maximizare sau minimizare", "clicktoseefull": "Apăsați pentru a vedea întregul conținut", - "close": "Închide", - "comments": "Comentariile dumneavoastră", + "close": "Închide fereastra", + "comments": "Comentarii", "commentscount": "Comentarii ({{$a}})", - "completion-alt-auto-fail": "Realizat: {{$a}} (nu este suficient pentru promovare)", - "completion-alt-auto-n": "Nerealizat: {{$a}}", - "completion-alt-auto-pass": "Realizat: {{$a}} (este obținută nota pentru promovare)", - "completion-alt-auto-y": "Realizat: {{$a}}", - "completion-alt-manual-n": "Nerealizat: {{$a}}. Selectați pentru a fi marcat ca realizat.", - "completion-alt-manual-y": "Realizat: {{$a}}. Selectați pentru a fi marcat ca nerealizat.", + "completion-alt-auto-fail": "Finalizat: {{$a}} (nu a obținut notă de trecere)", + "completion-alt-auto-n": "Nu s-a finalizat: {{$a}}", + "completion-alt-auto-pass": "Finalizat: {{$a}} (s-a obținut notă de trecere)", + "completion-alt-auto-y": "Finalizat: {{$a}}", + "completion-alt-manual-n": "Necompletat: {{$a}}. Selectați pentru a-l seta ca fiind completat.", + "completion-alt-manual-y": "Completat: {{$a}}. Selectați pentru a-l seta ca fiind necompletat.", "confirmdeletefile": "Sunteți sigur că doriți să ștergeți acest fișier?", "confirmopeninbrowser": "Doriți să deschideți într-un browser?", "content": "Conţinut", - "continue": "Continuă", + "continue": "Mai departe", "course": "Curs", "coursedetails": "Detalii curs", - "date": "Dată", - "day": "zi", - "days": "zile", + "date": "Data", + "day": "Zi(Zile)", + "days": "Zile", "decsep": ",", - "delete": "Şterge", - "deleting": "Se șterge", - "description": "Text introductiv", + "delete": "Ștergeți", + "deleting": "În curs de ştergere", + "description": "Descriere", "dfdayweekmonth": "zzz, Z LLL", "dflastweekdate": "zzz", "dfmediumdate": "LLL", "dftimedate": "o[:]mm A", "done": "Terminat", - "download": "Descarcă", + "download": "Executaţi clic pentru a descărca fişierul cu categorii exportate", "downloading": "Se descarcă", - "edit": "Editează", - "error": "Eroare", + "edit": "Editare", + "error": "A apărut o eroare", "errorchangecompletion": "A apărut o eroare în timpul schimbării nivelului de completare a cursului. Încercați din nou!", "errordownloading": "A apărut o eroare la descărcarea fișierului.", "errordownloadingsomefiles": "A apărut o eroare la descărcarea fișierelor modulului. Unele fișiere pot lipsi.", @@ -63,16 +63,16 @@ "humanreadablesize": "{{mărime}} {{unitate}}", "image": "Imagine", "imageviewer": "Vizualizator pentru imagini", - "info": "Info", + "info": "Informaţii", "ios": "iOS", "labelsep": ":", - "lastmodified": "Ultima modificare", + "lastmodified": "Modificat ultima dată", "lastsync": "Ultima sincronizare", "listsep": ";", - "loading": "Se încarcă", + "loading": "Încărcare ...", "lostconnection": "Tokenul pentru autentificare este invalid sau a expirat; trebuie să va reconectați!", "maxsizeandattachments": "Dimensiunea maximă pentru fișierele noi: {{$a.size}}, atașamente maxime: {{$a.attachments}}", - "min": "min", + "min": "Punctaj minim", "mins": "min", "mod_assign": "Temă", "mod_assignment": "Temă", @@ -104,19 +104,19 @@ "name": "Nume", "networkerrormsg": "Rețea de date inexistentă sau nefuncțională", "never": "Niciodată", - "next": "Următorul", + "next": "Înainte", "no": "Nu", - "nocomments": "Nu sunt comentarii", - "nograde": "Nicio notă", - "none": "nici unul", + "nocomments": "Nu există comentarii", + "nograde": "Fără notă.", + "none": "Niciunul", "nopasswordchangeforced": "Nu puteţi trece mai departe fără să vă schimbaţi parola, însă nu există nicio pagină în care să realizaţi această operaţiune. Vă rugăm contactaţi un administrator Moodle.", "nopermissions": "Ne pare rău, dar în acest moment nu aveţi permisiunea să realizaţi această operaţiune ({{$a}})", - "noresults": "Niciun rezultat", + "noresults": "Nu sunt rezultate", "notapplicable": "n/a", "notice": "Notificare", "now": "acum", "numwords": "{{$a}} cuvinte", - "offline": "Offline", + "offline": "Nu se solicită răspunsuri online", "online": "Online", "openfullimage": "Apăsați aici pentru a vizualiza imaginea la dimensiunea întreagă", "openinbrowser": "Deschideți în browser", @@ -124,34 +124,35 @@ "percentagenumber": "{{$a}}%", "phone": "Telefon", "pictureof": "Imaginea {{$a}}", - "previous": "Precedent", + "previous": "Status anterior", "pulltorefresh": "Trageți în jos pentru actualizare", - "refresh": "Reîncarcă", - "required": "Obligatoriu", + "refresh": "Actualizați", + "required": "Necesar", "requireduserdatamissing": "Acest utilizator are unele date de profil obligatorii necompletate. Completați aceste date în contul din Moodle și încercați din nou.
    {{$a}}", - "save": "Salvare", - "search": "Caută", - "searching": "Căutare", - "searchresults": "Rezultate căutare", + "save": "Salvează", + "search": "Căutați", + "searching": "Căutare în", + "searchresults": "Rezultatele căutării", "sec": "sec", "secs": "secs", "seemoredetail": "Apasă aici pentru mai multe detalii", - "send": "Trimis", + "send": "trimis", "sending": "Se trimite", "serverconnection": "Eroare la conectarea la server", - "show": "Afişare", + "show": "Afișați", "site": "Site", "sizeb": "bytes", "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", "sizetb": "TB", + "sortby": "Sortează după", "start": "Start", "submit": "Trimite", - "success": "Succes!", + "success": "Succes", "tablet": "Tabletă", "teachers": "Profesori", - "time": "Ora", + "time": "Timp", "timesup": "Timpul a expirat!", "today": "Azi", "twoparagraphs": "{{p1}}

    {{p2}}", @@ -168,7 +169,7 @@ "whoops": "Ops!", "windowsphone": "Telefon cu sistem de operare Windows", "wsfunctionnotavailable": "Această funcție Web nu este disponibilă.", - "year": "an", + "year": "An (Ani)", "years": "ani", "yes": "Da" } \ No newline at end of file diff --git a/www/core/lang/ru.json b/www/core/lang/ru.json index e9f8b22367f..8c1e361e574 100644 --- a/www/core/lang/ru.json +++ b/www/core/lang/ru.json @@ -2,8 +2,8 @@ "allparticipants": "Все участники", "android": "Android", "areyousure": "Вы уверены?", - "back": "Назад", - "cancel": "Отмена", + "back": "« Назад", + "cancel": "Отменить", "cannotconnect": "Не удается подключиться: убедитесь, что Вы ввели правильный URL-адрес и что сайт использует Moodle 2.4 или более поздней версии.", "cannotdownloadfiles": "Скачивание файла отключено для мобильных служб. Пожалуйста, свяжитесь с администратором сайта.", "category": "Категория", @@ -11,8 +11,8 @@ "choosedots": "Выберите...", "clearsearch": "Очистить поиск", "clicktohideshow": "Нажмите, чтобы раскрыть или скрыть", - "close": "Закрыть", - "comments": "Ваши комментарии", + "close": "Закрыть окно", + "comments": "Комментарии", "commentscount": "Комментарии ({{$a}})", "completion-alt-auto-fail": "Выполнено: {{$a}} (оценка ниже проходного балла)", "completion-alt-auto-n": "Не выполнено: {{$a}}", @@ -27,18 +27,18 @@ "course": "Курс", "coursedetails": "Информация о курсе", "date": "Дата", - "day": "день", - "days": "дн.", + "day": "дн.", + "days": "Дней", "decsep": ",", "defaultvalue": "Значение по умолчанию ({{$a}})", "delete": "Удалить", "deleting": "Удаление", - "description": "Вступление", + "description": "Описание", "done": "Завершено", - "download": "Скачать", + "download": "Нажмите «Продолжить», чтобы загрузить файл экспортируемой категории.", "downloading": "Загрузка", "edit": "Редактировать", - "error": "Ошибка", + "error": "Произошла ошибка", "errordownloading": "Ошибка загрузки файла", "filename": "Имя файла", "folder": "Папка", @@ -46,19 +46,19 @@ "fulllistofcourses": "Все курсы", "groupsseparate": "Изолированные группы", "groupsvisible": "Видимые группы", - "help": "Справка", + "help": "Помощь", "hide": "Скрыть", "hour": "ч.", "hours": "час.", "humanreadablesize": "{{size}} {{unit}}", - "info": "Информация", + "info": "информация", "labelsep": ":", - "lastmodified": "Последнее изменение", + "lastmodified": "Последние изменения:", "listsep": ";", - "loading": "Загрузка", + "loading": "Загрузка...", "lostconnection": "Ваш ключ аутентификации недействителен или просрочен. Вам придется повторно подключиться к сайту.", "maxsizeandattachments": "Максимальный размер новых файлов: {{$a.size}}, максимальное количество прикрепленных файлов: {{$a.attachments}}", - "min": "мин.", + "min": "Минимальный балл", "mins": "мин.", "mod_assign": "Задание", "mod_assignment": "Задание", @@ -87,14 +87,14 @@ "mod_wiki": "Вики", "mod_workshop": "Семинар", "moduleintro": "Описание", - "name": "Название:", + "name": "Название", "networkerrormsg": "Сеть не работает или работа в ней не разрешена.", "never": "Никогда", - "next": "Далее", + "next": "Следующий", "no": "Нет", "nocomments": "Нет комментариев", - "nograde": "Без оценки", - "none": "Пусто", + "nograde": "Нет оценки.", + "none": "Никто", "nopasswordchangeforced": "Вы не можете продолжать работу без смены пароля, однако страница для его изменения не доступна. Пожалуйста, свяжитесь с администратором сайта.", "nopermissions": "Извините, но у Вас нет прав сделать это ({{$a}})", "noresults": "Нет результатов", @@ -102,19 +102,19 @@ "notice": "Уведомление", "now": "сейчас", "numwords": "всего слов - {{$a}}", - "offline": "Ответ вне сайта", + "offline": "Вне сайта", "online": "На сайте", "openinbrowser": "Открыть в браузере", "pagea": "Страница {{$a}}", "phone": "Телефон", "pictureof": "Изображение пользователя {{$a}}", - "previous": "Назад", + "previous": "Предыдущее состояние", "pulltorefresh": "Потяните, чтобы обновить", "refresh": "Обновить", - "required": "Необходимо заполнить", + "required": "Обязательный", "save": "Сохранить", - "search": "Найти", - "searching": "Искать в", + "search": "Искать", + "searching": "Поиск в...", "searchresults": "Результаты поиска", "sec": "сек.", "secs": "сек.", @@ -130,6 +130,7 @@ "sizekb": "Кбайт", "sizemb": "Мбайт", "sizetb": "Тб", + "sortby": "Сортировать по", "start": "Начало", "submit": "Отправить", "success": "Успешно", @@ -143,11 +144,12 @@ "upgraderunning": "Сайт обновляется, повторите попытку позже.", "userdeleted": "Учетная запись пользователя была удалена", "userdetails": "Подробная информация о пользователе", + "usernotfullysetup": "Пользователь не полностью настроен", "users": "Пользователи", "view": "Просмотр", "viewprofile": "Просмотр профиля", "whoops": "Ой!", - "year": "г.", + "year": "Год(ы)", "years": "г.", "yes": "Да" } \ No newline at end of file diff --git a/www/core/lang/sr-cr.json b/www/core/lang/sr-cr.json index 68915a26c2f..7f2925b317f 100644 --- a/www/core/lang/sr-cr.json +++ b/www/core/lang/sr-cr.json @@ -1,25 +1,47 @@ { "accounts": "Налози", + "allparticipants": "Сви учесници", "android": "Андроид", + "areyousure": "Да ли сте сигурни?", + "back": "Назад", + "cancel": "Одустани", "cannotconnect": "Није могуће успоставити везу. Проверите да ли сте унели исправну URL адресу и да ли ваш сајт користи Moodle 2.4 или новију верзију.", "cannotdownloadfiles": "Преузимање датотека је онемогућено у подешавањима вашег мобилног сервиса. Обратите се администратору сајта.", + "category": "Категорија", + "choose": "Изабери", + "choosedots": "Изабери...", "clearsearch": "Обриши претрагу", + "clicktohideshow": "Кликните да бисте раширили или скупили", "clicktoseefull": "Кликните да бисте видели комплетан садржај.", + "close": "Затвори", + "comments": "Коментари", + "commentscount": "Коментари ({{$a}})", "commentsnotworking": "Коментари не могу да буду преузети", - "completion-alt-auto-fail": "Завршено: {{$a}} (није постигнута прелазна оцена)", + "completion-alt-auto-fail": "Завршено: {{$a}} (није постигао/ла прелазну оцену)", "completion-alt-auto-n": "Није завршено: {{$a}}", - "completion-alt-auto-pass": "Завршено: {{$a}} (постигнута прелазна оцена)", + "completion-alt-auto-pass": "Завршено: {{$a}} (постигао/ла прелазну оцену)", "completion-alt-auto-y": "Завршено: {{$a}}", - "completion-alt-manual-n": "Није завршено: {{$a}}. Изаберите да бисте означили као завршено.", - "completion-alt-manual-y": "Завршено: {{$a}}. Изаберите да бисте означили као незавршено.", + "completion-alt-manual-n": "Није завршено: {{$a}}. Изабери да би означио као завршено", + "completion-alt-manual-y": "Завршено: {{$a}}. Изабери да би означио као незавршено.", "confirmcanceledit": "Да ли сте сигурни да желите да напустите ову страницу? Све промене ће бити изгубљене.", + "confirmdeletefile": "Да ли сте сигурни да желите да обришете ову датотетеку?", "confirmloss": "Да ли сте сигурни? Све промене ће бити изгубљене.", "confirmopeninbrowser": "Да ли желите да отворите у веб читачу?", + "content": "Садржај", "contenteditingsynced": "Садржај који уређујете је синхронизован.", + "continue": "Настави", "copiedtoclipboard": "Текст копиран у клипборд", + "course": "Курс", + "coursedetails": "Подаци о курсeвима", "currentdevice": "Тренутни уређај", "datastoredoffline": "Подаци су сачувани у мобилном уређају, зато што не могу да се пошаљу. Аутоматски ће бити послати касније.", + "date": "Датум", + "day": "дан", + "days": "дан/а", + "decsep": ",", + "delete": "Обриши", "deleting": "Брисање", + "description": "Опис", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dffulldate": "dddd, D MMMM YYYY h[:]mm A", @@ -28,8 +50,12 @@ "dftimedate": "h[:]mm A", "discard": "Одбаци", "dismiss": "Обустави", + "done": "Урађено", + "download": "Преузми", "downloading": "Преузимање", + "edit": "Уреди", "emptysplit": "Ова страница ће се појавити празна уколико је леви панел празан или се учитава.", + "error": "Грешка", "errorchangecompletion": "Дошло је до грешке приликом промене статуса завршетка. Молимо, покушајте поново.", "errordeletefile": "Грешка приликом брисања датотеке. Молимо, покушајте поново.", "errordownloading": "Грешка приликом преузимања датотеке.", @@ -44,41 +70,110 @@ "errorrenamefile": "Грешка приликом покушаја промене назива датотеке. Молимо, покушајте поново.", "errorsync": "Дошло је до грешке приликом синхронизацији. Молимо, покушајте поново.", "errorsyncblocked": "{{$a}} тренутно не може да се синхронизује због текућег процеса. Молимо, покушајте поново касније. Ако се проблем и даље буде постојао, покушајте поново да покренете апликацију.", + "filename": "Име датотеке", "filenameexist": "Назив датотеке већ постоји: {{$a}}", + "folder": "Директоријум", + "forcepasswordchangenotice": "Морате променити своју лозинку да бисте наставили", + "fulllistofcourses": "Сви курсеви", "fullnameandsitename": "{{fullname}} ({{sitename}})", + "groupsseparate": "Одвојене групе", + "groupsvisible": "Видљиве групе", "hasdatatosync": "{{$a}} има офлајн податке које треба синхронизовати.", + "help": "Помоћ", + "hide": "Сакриј", + "hour": "h", + "hours": "сат/а/и", "humanreadablesize": "{{size}} {{unit}}", "image": "Слика", "imageviewer": "Приказивач слике", - "info": "Инфо", + "info": "Информација", "ios": "iOS", + "labelsep": ":", + "lastmodified": "Последња измена", "lastsync": "Последња синхронизација", + "listsep": ";", + "loading": "Учитавање", "loadmore": "Учитај још", "lostconnection": "Ваш токен за потврду идентитета је неважећи или је истекао. Мораћете поново да успоставите везу са сајтом.", + "maxsizeandattachments": "Максимална величина за нове датотеке: {{$a.size}}, макисималан број прилога: {{$a.attachments}}", + "min": "min", + "mins": "min", + "mod_assign": "Задатак", + "mod_chat": "Причаоница", + "mod_choice": "Избор", + "mod_data": "База података", + "mod_feedback": "Упитник (Feedback)", + "mod_forum": "Форум", + "mod_lesson": "Лекција", + "mod_lti": "Екстерни алат", + "mod_quiz": "Тест", + "mod_scorm": "SCORM пакет", + "mod_survey": "Упитник (Survey)", + "mod_wiki": "Wiki", + "moduleintro": "Опис", "mygroups": "Моје групе", + "name": "Име", "networkerrormsg": "Мрежа није укључена или не ради.", - "nopasswordchangeforced": "Не можете наставити без промене своје лозинке.", + "never": "Никад", + "next": "Следећи", + "no": "Не", + "nocomments": "Нема коментара", + "nograde": "Нема оцене", + "none": "Ниједан", + "nopasswordchangeforced": "Нисте у могућности да наставите даље без промене корисничког имена, међутим не постоји расположива страница за промену. Молимо контактирајте Moodle администратора.", + "nopermissions": "Жао нам је, али тренутно немате дозволу да то радите ({{$a}})", + "noresults": "Нема резултата", "notapplicable": "n/a", + "notice": "Напомена", "notsent": "Није послато", - "offline": "Офлајн", - "online": "Онлајн", + "now": "сада", + "numwords": "{{$a}} реч(и)", + "offline": "Не тражи се онлајн предаја рада", + "online": "Online", "openfullimage": "Кликните овде да бисте приказали слику у пуној величини", "openinbrowser": "Отвори у веб читачу", "othergroups": "Друге групе", + "pagea": "Страница {{$a}}", "percentagenumber": "{{$a}}%", + "phone": "Телефон", + "pictureof": "Слика {{$a}}", + "previous": "Претходни", "pulltorefresh": "Повуците за освежавање", "redirectingtosite": "Бићете преусмерени на сајт.", + "refresh": "Освежи", + "required": "Обавезно", "requireduserdatamissing": "Овај корисник нема у свом профилу неке неопходне податке. Молимо вас, унесети ове податке у ваш Moodle и покушајте поново.
    {{$a}}", "retry": "Покушај поново", - "searching": "Претраживање", - "sending": "Слање", + "save": "Сачувај", + "search": "Претрага", + "searching": "Претражи у", + "searchresults": "Резултати претраге", + "sec": "сек", + "secs": "s", + "seemoredetail": "Кликните овде за више детеља", + "send": "Пошаљи", + "sending": "Шаље се", + "serverconnection": "Грешка у повезивању са сервером", + "show": "Прикажи", "showmore": "Прикажи још...", + "site": "Сајт", "sitemaintenance": "Сајт је у режиму одржавања и тренутно није доступан", + "sizeb": "бајта", + "sizegb": "Gb", + "sizekb": "Kb", + "sizemb": "Mb", "sizetb": "TB", "sorry": "Извините...", - "success": "Успешно!", + "sortby": "Сортирај по", + "start": "Почетак", + "submit": "Проследи", + "success": "Успешно", "tablet": "Таблет", + "teachers": "Предавачи", "thereisdatatosync": "Број офлајн податак које треба синхронизовати: {{$a}}", + "time": "Време", + "timesup": "Време је истекло!", + "today": "Данас", "tryagain": "Покушај поново", "twoparagraphs": "{{p1}}

    {{p2}}", "uhoh": "Ух!", @@ -86,10 +181,21 @@ "unicodenotsupported": "Неки емотикони нису подржани на овом сајту. Такви карактери ће бити уклоњени приликом слања поруке.", "unicodenotsupportedcleanerror": "Приликом чишћења Unicode карактера пронађен је празан текст.", "unknown": "Непознато", + "unlimited": "Неограничено", "unzipping": "Распакивање", + "upgraderunning": "Сајт се ажурира, молимо покушајте касније", + "userdeleted": "Овај кориснички налог је обрисан", + "userdetails": "Детаљи о кориснику", + "usernotfullysetup": "Корисник није у потпуности подешен", + "users": "Корисници", + "view": "Приказ", + "viewprofile": "Прегледај профил", "warningofflinedatadeleted": "Офлајн подаци компоненте {{component}} '{{name}}' су обрисани. {{error}}", "whoops": "Упс!", "whyisthishappening": "Зашто се ово дешава?", "windowsphone": "Windows Phone", - "wsfunctionnotavailable": "Функција Webservice није доступна." + "wsfunctionnotavailable": "Функција Webservice није доступна.", + "year": "година", + "years": "година", + "yes": "Да" } \ No newline at end of file diff --git a/www/core/lang/sr-lt.json b/www/core/lang/sr-lt.json index efcfe49fee4..311b111ce0c 100644 --- a/www/core/lang/sr-lt.json +++ b/www/core/lang/sr-lt.json @@ -1,25 +1,47 @@ { "accounts": "Nalozi", + "allparticipants": "Svi učesnici", "android": "Android", + "areyousure": "Da li ste sigurni?", + "back": "Nazad", + "cancel": "Odustani", "cannotconnect": "Nije moguće uspostaviti vezu. Proverite da li ste uneli ispravnu URL adresu i da li vaš sajt koristi Moodle 2.4 ili noviju verziju.", "cannotdownloadfiles": "Preuzimanje datoteka je onemogućeno u podešavanjima vašeg mobilnog servisa. Obratite se administratoru sajta.", + "category": "Kategorija", + "choose": "Izaberi", + "choosedots": "Izaberi...", "clearsearch": "Obriši pretragu", + "clicktohideshow": "Kliknite da biste raširili ili skupili", "clicktoseefull": "Kliknite da biste videli kompletan sadržaj.", + "close": "Zatvori", + "comments": "Komentari", + "commentscount": "Komentari ({{$a}})", "commentsnotworking": "Komentari ne mogu da budu preuzeti", - "completion-alt-auto-fail": "Završeno: {{$a}} (nije postignuta prelazna ocena)", + "completion-alt-auto-fail": "Završeno: {{$a}} (nije postigao/la prelaznu ocenu)", "completion-alt-auto-n": "Nije završeno: {{$a}}", - "completion-alt-auto-pass": "Završeno: {{$a}} (postignuta prelazna ocena)", + "completion-alt-auto-pass": "Završeno: {{$a}} (postigao/la prelaznu ocenu)", "completion-alt-auto-y": "Završeno: {{$a}}", - "completion-alt-manual-n": "Nije završeno: {{$a}}. Izaberite da biste označili kao završeno.", - "completion-alt-manual-y": "Završeno: {{$a}}. Izaberite da biste označili kao nezavršeno.", + "completion-alt-manual-n": "Nije završeno: {{$a}}. Izaberi da bi označio kao završeno", + "completion-alt-manual-y": "Završeno: {{$a}}. Izaberi da bi označio kao nezavršeno.", "confirmcanceledit": "Da li ste sigurni da želite da napustite ovu stranicu? Sve promene će biti izgubljene.", + "confirmdeletefile": "Da li ste sigurni da želite da obrišete ovu datoteteku?", "confirmloss": "Da li ste sigurni? Sve promene će biti izgubljene.", "confirmopeninbrowser": "Da li želite da otvorite u veb čitaču?", + "content": "Sadržaj", "contenteditingsynced": "Sadržaj koji uređujete je sinhronizovan.", + "continue": "Nastavi", "copiedtoclipboard": "Tekst kopiran u klipbord", + "course": "Kurs", + "coursedetails": "Podaci o kursevima", "currentdevice": "Trenutni uređaj", "datastoredoffline": "Podaci su sačuvani u mobilnom uređaju, zato što ne mogu da se pošalju. Automatski će biti poslati kasnije.", + "date": "Datum", + "day": "dan", + "days": "dan/a", + "decsep": ",", + "delete": "Obriši", "deleting": "Brisanje", + "description": "Opis", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dffulldate": "dddd, D MMMM YYYY h[:]mm A", @@ -28,8 +50,12 @@ "dftimedate": "h[:]mm A", "discard": "Odbaci", "dismiss": "Obustavi", + "done": "Urađeno", + "download": "Preuzmi", "downloading": "Preuzimanje", + "edit": "Uredi", "emptysplit": "Ova stranica će se pojaviti prazna ukoliko je levi panel prazan ili se učitava.", + "error": "Greška", "errorchangecompletion": "Došlo je do greške prilikom promene statusa završetka. Molimo, pokušajte ponovo.", "errordeletefile": "Greška prilikom brisanja datoteke. Molimo, pokušajte ponovo.", "errordownloading": "Greška prilikom preuzimanja datoteke.", @@ -44,41 +70,110 @@ "errorrenamefile": "Greška prilikom pokušaja promene naziva datoteke. Molimo, pokušajte ponovo.", "errorsync": "Došlo je do greške prilikom sinhronizaciji. Molimo, pokušajte ponovo.", "errorsyncblocked": "{{$a}} trenutno ne može da se sinhronizuje zbog tekućeg procesa. Molimo, pokušajte ponovo kasnije. Ako se problem i dalje bude postojao, pokušajte ponovo da pokrenete aplikaciju.", + "filename": "Ime datoteke", "filenameexist": "Naziv datoteke već postoji: {{$a}}", + "folder": "Direktorijum", + "forcepasswordchangenotice": "Morate promeniti svoju lozinku da biste nastavili", + "fulllistofcourses": "Svi kursevi", "fullnameandsitename": "{{fullname}} ({{sitename}})", + "groupsseparate": "Odvojene grupe", + "groupsvisible": "Vidljive grupe", "hasdatatosync": "{{$a}} ima oflajn podatke koje treba sinhronizovati.", + "help": "Pomoć", + "hide": "Sakrij", + "hour": "h", + "hours": "sat/a/i", "humanreadablesize": "{{size}} {{unit}}", "image": "Slika", "imageviewer": "Prikazivač slike", - "info": "Info", + "info": "Informacija", "ios": "iOS", + "labelsep": ":", + "lastmodified": "Poslednja izmena", "lastsync": "Poslednja sinhronizacija", + "listsep": ";", + "loading": "Učitavanje", "loadmore": "Učitaj još", "lostconnection": "Vaš token za potvrdu identiteta je nevažeći ili je istekao. Moraćete ponovo da uspostavite vezu sa sajtom.", + "maxsizeandattachments": "Maksimalna veličina za nove datoteke: {{$a.size}}, makisimalan broj priloga: {{$a.attachments}}", + "min": "min", + "mins": "min", + "mod_assign": "Zadatak", + "mod_chat": "Pričaonica", + "mod_choice": "Izbor", + "mod_data": "Baza podataka", + "mod_feedback": "Upitnik (Feedback)", + "mod_forum": "Forum", + "mod_lesson": "Lekcija", + "mod_lti": "Eksterni alat", + "mod_quiz": "Test", + "mod_scorm": "SCORM paket", + "mod_survey": "Upitnik (Survey)", + "mod_wiki": "Wiki", + "moduleintro": "Opis", "mygroups": "Moje grupe", + "name": "Ime", "networkerrormsg": "Mreža nije uključena ili ne radi.", - "nopasswordchangeforced": "Ne možete nastaviti bez promene svoje lozinke.", + "never": "Nikad", + "next": "Sledeći", + "no": "Ne", + "nocomments": "Nema komentara", + "nograde": "Nema ocene", + "none": "Nijedan", + "nopasswordchangeforced": "Niste u mogućnosti da nastavite dalje bez promene korisničkog imena, međutim ne postoji raspoloživa stranica za promenu. Molimo kontaktirajte Moodle administratora.", + "nopermissions": "Žao nam je, ali trenutno nemate dozvolu da to radite ({{$a}})", + "noresults": "Nema rezultata", "notapplicable": "n/a", + "notice": "Napomena", "notsent": "Nije poslato", - "offline": "Oflajn", - "online": "Onlajn", + "now": "sada", + "numwords": "{{$a}} reč(i)", + "offline": "Ne traži se onlajn predaja rada", + "online": "Online", "openfullimage": "Kliknite ovde da biste prikazali sliku u punoj veličini", "openinbrowser": "Otvori u veb čitaču", "othergroups": "Druge grupe", + "pagea": "Stranica {{$a}}", "percentagenumber": "{{$a}}%", + "phone": "Telefon", + "pictureof": "Slika {{$a}}", + "previous": "Prethodni", "pulltorefresh": "Povucite za osvežavanje", "redirectingtosite": "Bićete preusmereni na sajt.", + "refresh": "Osveži", + "required": "Obavezno", "requireduserdatamissing": "Ovaj korisnik nema u svom profilu neke neophodne podatke. Molimo vas, uneseti ove podatke u vaš Moodle i pokušajte ponovo.
    {{$a}}", "retry": "Pokušaj ponovo", - "searching": "Pretraživanje", - "sending": "Slanje", + "save": "Sačuvaj", + "search": "Pretraga", + "searching": "Pretraži u", + "searchresults": "Rezultati pretrage", + "sec": "sek", + "secs": "s", + "seemoredetail": "Kliknite ovde za više detelja", + "send": "Pošalji", + "sending": "Šalje se", + "serverconnection": "Greška u povezivanju sa serverom", + "show": "Prikaži", "showmore": "Prikaži još...", + "site": "Sajt", "sitemaintenance": "Sajt je u režimu održavanja i trenutno nije dostupan", + "sizeb": "bajta", + "sizegb": "Gb", + "sizekb": "Kb", + "sizemb": "Mb", "sizetb": "TB", "sorry": "Izvinite...", - "success": "Uspešno!", + "sortby": "Sortiraj po", + "start": "Početak", + "submit": "Prosledi", + "success": "Uspešno", "tablet": "Tablet", + "teachers": "Predavači", "thereisdatatosync": "Broj oflajn podatak koje treba sinhronizovati: {{$a}}", + "time": "Vreme", + "timesup": "Vreme je isteklo!", + "today": "Danas", "tryagain": "Pokušaj ponovo", "twoparagraphs": "{{p1}}

    {{p2}}", "uhoh": "Uh!", @@ -86,10 +181,21 @@ "unicodenotsupported": "Neki emotikoni nisu podržani na ovom sajtu. Takvi karakteri će biti uklonjeni prilikom slanja poruke.", "unicodenotsupportedcleanerror": "Prilikom čišćenja Unicode karaktera pronađen je prazan tekst.", "unknown": "Nepoznato", + "unlimited": "Neograničeno", "unzipping": "Raspakivanje", + "upgraderunning": "Sajt se ažurira, molimo pokušajte kasnije", + "userdeleted": "Ovaj korisnički nalog je obrisan", + "userdetails": "Detalji o korisniku", + "usernotfullysetup": "Korisnik nije u potpunosti podešen", + "users": "Korisnici", + "view": "Prikaz", + "viewprofile": "Pregledaj profil", "warningofflinedatadeleted": "Oflajn podaci komponente {{component}} '{{name}}' su obrisani. {{error}}", "whoops": "Ups!", "whyisthishappening": "Zašto se ovo dešava?", "windowsphone": "Windows Phone", - "wsfunctionnotavailable": "Funkcija Webservice nije dostupna." + "wsfunctionnotavailable": "Funkcija Webservice nije dostupna.", + "year": "godina", + "years": "godina", + "yes": "Da" } \ No newline at end of file diff --git a/www/core/lang/sv.json b/www/core/lang/sv.json index cfb7c45efd3..47effc624e5 100644 --- a/www/core/lang/sv.json +++ b/www/core/lang/sv.json @@ -2,7 +2,7 @@ "allparticipants": "Alla deltagare", "android": "Android", "areyousure": "Är du säker?", - "back": "Tillbaka", + "back": "« Tillbaka", "cancel": "Avbryt", "cannotconnect": "Kan inte ansluta: Kontrollera att webbadressen är korrekt och att din webbplats använder Moodle 2.4 eller senare", "cannotdownloadfiles": "Nedladdning av filer är inaktiverad. Vänligen kontakta webbsidans administratör.", @@ -12,15 +12,15 @@ "clearsearch": "Rensa sökning", "clicktohideshow": "Klicka för att expandera eller fälla ihop", "clicktoseefull": "Klicka för att se hela innehållet", - "close": "Stäng", - "comments": "Dina kommentarer", + "close": "Stäng fönster", + "comments": "Kommentarer", "commentscount": "Kommentarer ({{$a}})", - "completion-alt-auto-fail": "Avslutad: {{$a}} (uppnådde inte gräns för godkänd)", + "completion-alt-auto-fail": "Fullföljd (uppnådde inte godkänt resultat)", "completion-alt-auto-n": "Inte avslutad: {{$a}}", - "completion-alt-auto-pass": "Avslutad: {{$a}} (uppnådde gräns för godkänd)", - "completion-alt-auto-y": "Avslutad: {{$a}}", - "completion-alt-manual-n": "Inte avslutad: {{$a}}. Välj att markera som avslutad", - "completion-alt-manual-y": "Avslutad: {{$a}}. Välj att markera som INTE avslutad", + "completion-alt-auto-pass": "Fullföljd (godkänt resultat)", + "completion-alt-auto-y": "Fullföljd", + "completion-alt-manual-n": "Ej fullföljd; välj för att markera som fullföljd", + "completion-alt-manual-y": "Fullföljd; välj för att markera som ej fullföljd", "confirmdeletefile": "Är Du säker på att Du vill ta bort den här filen?", "confirmopeninbrowser": "Vill du öppna den i webbläsaren ?", "content": "Innehåll", @@ -28,21 +28,21 @@ "course": "Kurs", "coursedetails": "Kursinformation", "date": "Datum", - "day": "dag", - "days": "dagar", + "day": "Dag(ar)", + "days": "Dagar", "decsep": ",", "delete": "Ta bort", - "deleting": "ta bort", - "description": "Introduktion", + "deleting": "Tar bort", + "description": "Beskrivning", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", "dfmediumdate": "", "dftimedate": "h[:]mm A", "done": "Färdig", - "download": "Ladda ner", + "download": "Klicka för att ladda ner den exporterade filen för kategorier", "downloading": "Laddar ner", "edit": "Redigera", - "error": "Fel", + "error": "Det uppstod ett fel", "errorchangecompletion": "Ett fel uppstod när du ändrade status för fullföljande. Var god försök igen.", "errordownloading": "Fel vid nedladdning av fil", "errordownloadingsomefiles": "Fel vid hämtning av modulens filer. Vissa filer kanske saknas .", @@ -52,7 +52,7 @@ "erroropenpopup": "Aktiviteten försöker öppna en popup . Detta stöds inte i den här appen.", "filename": "Filnamn", "folder": "Katalog", - "forcepasswordchangenotice": "Du måste använda Ditt lösenord för att kunna fortsätta.", + "forcepasswordchangenotice": "Du måste använda ditt lösenord för att kunna fortsätta.", "fulllistofcourses": "Alla kurser", "groupsseparate": "Olika grupper", "groupsvisible": "Synliga grupper", @@ -63,16 +63,16 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Bild", "imageviewer": "Bildvisare", - "info": "Info", + "info": "Information", "ios": "IOS", "labelsep": ":", "lastmodified": "Senast modifierad", "lastsync": "Senaste synkronisering", "listsep": ";", - "loading": "Laddar...", + "loading": "Laddar....", "lostconnection": "Vi förlorade anslutningen. Du måste ansluta igen. Din token är nu ogiltigt.", "maxsizeandattachments": "Maximal storlek för nya filer: {{$a.size}}, max bilagor: {{$a.attachments}}", - "min": "minut", + "min": "Min resultat", "mins": "minuter", "mod_assign": "Uppgift", "mod_assignment": "Uppgift", @@ -105,20 +105,20 @@ "name": "Namn", "networkerrormsg": "Nätverket är inte aktiverat eller fungerar inte", "never": "Aldrig", - "next": "Nästa", - "no": "Nej", - "nocomments": "Inga kommentarer", - "nograde": "Inget betyg", + "next": "Fortsätt", + "no": "Ingen", + "nocomments": "Det finns inga kommentarer", + "nograde": "Inget betyg.", "none": "Ingen", - "nopasswordchangeforced": "Du kan inte gå vidare utan att ändra Ditt lösenord, men det finns inte någon sida tillgänglig för att ändra det. Var snäll och kontakta Din administratör för Moodle.", + "nopasswordchangeforced": "Du kan inte gå vidare utan att ändra ditt lösenord, men det finns inte någon sida tillgänglig för att ändra det. Var snäll och kontakta din administratör för Moodle.", "nopermissions": "Du har tyvärr f.n. inte tillstånd att göra detta ({{$a}})", "noresults": "Inga resultat", "notapplicable": "n/a", "notice": "Meddelande", "now": "nu", "numwords": "{{$a}} ord", - "offline": "Offline", - "online": "Online", + "offline": "Ingen inlämning online krävs", + "online": "Uppkopplad", "openfullimage": "Klick här för att visa bilden i full storlek", "openinbrowser": "Öppna i webbläsare", "othergroups": "Andra grupper", @@ -126,19 +126,19 @@ "percentagenumber": "{{$a}}%", "phone": "Telefon", "pictureof": "Bild av {{$a}}", - "previous": "Tidigare", + "previous": "Föregående status", "pulltorefresh": "Dra för att uppdatera", - "refresh": "Uppdatera", + "refresh": "Återställ", "required": "Obligatorisk", "requireduserdatamissing": "Den här användaren saknar vissa nödvändiga profildata. Vänligen fyll i uppgifterna i din Moodle och försök igen.
    {{$a}}", "save": "Spara", - "search": "Sök", - "searching": "Söker", + "search": "Sök...", + "searching": "Sök i ", "searchresults": "Sökresultat", "sec": "Sekund", "secs": "Sekunder", "seemoredetail": "Klicka här för att se fler detaljer", - "send": "skicka", + "send": "Skicka", "sending": "Skickar", "serverconnection": "Fel vid anslutning till servern", "show": "Visa", @@ -148,9 +148,10 @@ "sizekb": "Kb", "sizemb": "Mb", "sizetb": "Tb", + "sortby": "Sortera enligt", "start": "Starta", - "submit": "Skicka in", - "success": "Succé!", + "submit": "Skicka", + "success": "Framgång", "tablet": "Tablet", "teachers": "Distanslärare/
    handledare/
    coacher", "time": "Tid", @@ -170,7 +171,7 @@ "whoops": "Hoppsan!", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "Webbtjänstfunktion är inte tillgänglig.", - "year": "år", + "year": "År", "years": "år", "yes": "Ja" } \ No newline at end of file diff --git a/www/core/lang/tr.json b/www/core/lang/tr.json index 295d277a503..a77ce3dff24 100644 --- a/www/core/lang/tr.json +++ b/www/core/lang/tr.json @@ -3,7 +3,7 @@ "allparticipants": "Bütün katılımcılar", "android": "Android", "areyousure": "Emin misiniz?", - "back": "Geri", + "back": "« Geri", "cancel": "İptal", "cannotconnect": "Bağlantı kurulamıyor: Doğru adres girdiğinizden ve sitenizin Moodle 2.4 ve sonrası sürüme sahip olduğundan emin olun.", "category": "Kategori", @@ -11,8 +11,8 @@ "choosedots": "Seçiniz...", "clearsearch": "Aramayı temizle", "clicktohideshow": "Genişlet/Daralt", - "close": "Kapat", - "comments": "Yorumlarınız", + "close": "Pencereyi kapat", + "comments": "Yorumlar", "commentscount": "Yorumlar ({{$a}})", "completion-alt-auto-fail": "Tamamlandı (geçer not almayı başaramadı)", "completion-alt-auto-n": "Tamamlanmadı", @@ -23,21 +23,21 @@ "confirmdeletefile": "Bu dosyayı silmek istediğinize emin misiniz?", "confirmopeninbrowser": "Tarayıcıda açmak istediğine emin misin?", "content": "İçerik", - "continue": "Devam", + "continue": "Devam et", "course": "Ders", "coursedetails": "Ders ayrıntıları", "date": "Tarih", - "day": "gün", - "days": "gün", + "day": "Gün", + "days": "Gün", "decsep": ",", "delete": "Sil", "deleting": "Siliniyor", - "description": "Tanıtım metni", + "description": "Açıklama", "done": "Tamamlandı", - "download": "İndir", + "download": "Verilen kategori dosyasını indirin", "downloading": "İndiriliyor...", - "edit": "Düzelt", - "error": "Hata", + "edit": "Düzenle ", + "error": "Hata oluştu", "errordownloading": "Dosya indirmede hata", "filename": "Dosya adı", "folder": "Klasör", @@ -53,13 +53,13 @@ "info": "Bilgi", "ios": "İOS", "labelsep": ":", - "lastmodified": "En son değiştirme", + "lastmodified": "Son değiştirme", "lastsync": "Son senkronizasyon", "listsep": ";", - "loading": "Yükleniyor...", + "loading": "Yükleniyor", "lostconnection": "Bağlantınızı kaybettik, yeniden bağlanmanız gerekiyor. Verileriniz artık geçerli değil.", "maxsizeandattachments": "Yeni dosyalar için en büyük boyut: {{$a.size}}, en fazla ek: {{$a.attachments}}", - "min": "dk", + "min": "Min puan", "mins": "dk", "mod_assign": "Ödev", "mod_book": "Kitap", @@ -88,33 +88,33 @@ "mod_workshop": "Çalıştay", "moduleintro": "Açıklama", "mygroups": "Gruplarım", - "name": "Ad", + "name": "Adı", "networkerrormsg": "Ağ etkin değil ya da çalışmıyor.", - "never": "Hiçbir zaman", - "next": "Sonraki", + "never": "Asla", + "next": "Devam et", "no": "Hayır", - "nocomments": "Yorum yok", - "nograde": "Not yok", - "none": "Yok", + "nocomments": "Hiç yorum yok", + "nograde": "Not yok.", + "none": "Hiçbiri", "nopasswordchangeforced": "Şifrenizi değiştirmeden ilerleyemezsiniz, ancak şifrenizi değiştirmek için bir sayfa yok. Lütfen Moodle Yöneticinizle iletişime geçin.", "nopermissions": "Üzgünüz, şu anda bunu yapmaya yetkiniz yok: {{$a}}", "noresults": "Sonuç yok", "notice": "Uyarı", "now": "şimdi", "numwords": "{{$a}} kelime", - "offline": "Çevrimdışı", + "offline": "Online gönderim gerekli değil", "online": "Çevrimiçi", "openinbrowser": "Tarayıcıda aç", "othergroups": "Diğer gruplar", "pagea": "Sayfa {{$a}}", "phone": "Telefon", "pictureof": "{{$a}} 'ın resmi", - "previous": "Önceki", + "previous": "Önceki durum", "refresh": "Yenile", "required": "Gerekli", "save": "Kaydet", - "search": "Ara", - "searching": "Aranıyor", + "search": "Arama...", + "searching": "Aranan", "searchresults": "Arama sonuçları", "sec": "sn", "secs": "sn", @@ -130,12 +130,13 @@ "sizekb": "KB", "sizemb": "MB", "sorry": "Üzgünüz...", + "sortby": "Sıralama ölçütü", "start": "Başla", "submit": "Gönder", "success": "Başarı", "tablet": "Tablet", "teachers": "Eğitimciler", - "time": "Zaman", + "time": "Süre", "timesup": "Süre doldu!", "today": "Bugün", "unexpectederror": "Beklenmeyen hata. Lütfen uygulamanızı yeniden açın ve tekrar deneyin", @@ -146,9 +147,9 @@ "userdetails": "Kullanıcı ayrıntıları", "usernotfullysetup": "Kullanıcı tam kurulum yapmadı", "users": "Kullanıcılar", - "view": "Görüntüle", + "view": "Görünüm", "viewprofile": "Profili görüntüle", - "year": "yıl", + "year": "Yıl", "years": "yıl", "yes": "Evet" } \ No newline at end of file diff --git a/www/core/lang/uk.json b/www/core/lang/uk.json index 65399cfaf7e..a316e7e3686 100644 --- a/www/core/lang/uk.json +++ b/www/core/lang/uk.json @@ -3,7 +3,7 @@ "allparticipants": "Усі учасники", "android": "Android", "areyousure": "Ви впевнені?", - "back": "Назад", + "back": "« Назад", "cancel": "Скасувати", "cannotconnect": "Неможливо з'єднатися: Переконайтеся, що ви ввели правильний URL і що сайт використовує Moodle 2.4 або більш пізню версію.", "cannotdownloadfiles": "Завантаження файлів відключено у вашій мобільній службі. Будь ласка, зверніться до адміністратора сайту.", @@ -13,16 +13,16 @@ "clearsearch": "Очистити пошук", "clicktohideshow": "Натисніть, щоб розгорнути або згорнути", "clicktoseefull": "Натисніть, щоб побачити весь вміст.", - "close": "Закрити", - "comments": "Ваші коментарі", + "close": "Закрити вікно", + "comments": "Коментарі", "commentscount": "Коментарі ({{$a}})", "commentsnotworking": "Коментар не може бути відновлений", - "completion-alt-auto-fail": "Виконано: {{$a}} (не досягли до рівня зарахування)", - "completion-alt-auto-n": "Не завершено: {{$a}}", - "completion-alt-auto-pass": "Виконано: {{$a}} (досягли до рівня зараховано)", - "completion-alt-auto-y": "Завершено: {{$a}}", - "completion-alt-manual-n": "Не завершено {{$a}}. Виберіть для відмічення як завершене.", - "completion-alt-manual-y": "Завершено {{$a}}. Виберіть для відмічення як незавершене.", + "completion-alt-auto-fail": "Виконано: {{$a}} (не вдалося досягти прохідного балу)", + "completion-alt-auto-n": "Не виконано: {{$a}}", + "completion-alt-auto-pass": "Виконано: {{$a}} (перевищено прохідний бал)", + "completion-alt-auto-y": "Виконано: {{$a}}", + "completion-alt-manual-n": "Не виконано: {{$a}}. Виберіть для позначення виконання", + "completion-alt-manual-y": "Виконано: {{$a}}. Виберіть для позначення не виконання", "confirmcanceledit": "Ви впевнені що хочете залишити цю сторінку? Всі зміни будуть втрачені.", "confirmdeletefile": "Ви впевнені, що хочете видалити цей файл?", "confirmloss": "Ви впевнені? Всі зміни будуть втрачені.", @@ -36,12 +36,12 @@ "currentdevice": "Поточний пристрій", "datastoredoffline": "Дані зберігаються в пристрої, оскільки не можуть бути надіслані. Вони будуть автоматично відправлені пізніше.", "date": "Дата", - "day": "день", - "days": "днів", + "day": "День(ів)", + "days": "Днів", "decsep": ",", - "delete": "Видалити", + "delete": "Вилучити", "deleting": "Видалення", - "description": "Текст вступу", + "description": "Опис", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dffulldate": "dddd, D MMMM YYYY h[:]mm A", @@ -51,11 +51,11 @@ "discard": "Скинути", "dismiss": "Відхилити", "done": "Зроблено", - "download": "Завантажити", + "download": "Натисніть для збереження файлу експорту на своєму комп'ютері.", "downloading": "Завантаження", "edit": "Редагувати", "emptysplit": "Ця сторінка буде виглядати порожньою, якщо ліва панель порожня або завантажується.", - "error": "Помилка", + "error": "Сталася помилка", "errorchangecompletion": "При зміні статусу завершення сталася помилка. Будь ласка спробуйте ще раз.", "errordeletefile": "Помилка видалення файлу. Будь ласка спробуйте ще раз.", "errordownloading": "Помилка завантаження файлу.", @@ -86,17 +86,17 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Зображення", "imageviewer": "Переглядач зображень", - "info": "Інфо", + "info": "Інформація", "ios": "iOS", "labelsep": ":", - "lastmodified": "Остання зміна", + "lastmodified": "Востаннє змінено", "lastsync": "Остання синхронізація", "listsep": ";", "loading": "Завантаження...", "loadmore": "Завантажити більше", "lostconnection": "Ваш маркер аутентифікації недійсний або закінчився, вам доведеться підключитися до сайту.", "maxsizeandattachments": "Макс. обсяг для нових файлів: {{$a.size}}, макс. кількість прикріплених файлів: {{$a.attachments}}", - "min": "хв", + "min": "Мін.оцінка", "mins": "хв", "mod_assign": "Завдання", "mod_chat": "Чат", @@ -112,24 +112,24 @@ "mod_wiki": "Вікі", "moduleintro": "Опис", "mygroups": "Мої групи", - "name": "Ім'я", + "name": "Назва", "networkerrormsg": "Мережа не включена або не працює.", "never": "Ніколи", - "next": "Далі", + "next": "Вперед", "no": "Ні", - "nocomments": "Немає коментарів", - "nograde": "Без оцінки", - "none": "Не вибрано", - "nopasswordchangeforced": "Ви не можете продовжити без зміни пароля.", + "nocomments": "Коментарів немає", + "nograde": "Немає оцінки.", + "none": "Немає", + "nopasswordchangeforced": "Ви не можете перейти не змінивши ваш пароль, але не вказано ніякої сторінки для цього процесу. Будь ласка, зверніться до вашого Адміністратора.", "nopermissions": "Вибачте, але ваші поточні права не дозволяють вам цього робити ({{$a}})", - "noresults": "Без результатів", + "noresults": "Результат відсутній", "notapplicable": "n/a", "notice": "Помітити", "notsent": "Не відправлено", "now": "зараз", "numwords": "{{$a}} слів", - "offline": "Offline", - "online": "Online", + "offline": "Не потрібно здавати в онлайні", + "online": "В мережі", "openfullimage": "Натисніть тут, щоб побачити зображення в повному розмірі", "openinbrowser": "Відкрити у браузері", "othergroups": "Інші групи", @@ -137,22 +137,22 @@ "percentagenumber": "{{$a}}%", "phone": "Телефон", "pictureof": "Фото {{$a}}", - "previous": "Назад", + "previous": "Попередній стан", "pulltorefresh": "Потягніть щоб оновити", "redirectingtosite": "Ви будете перенаправлені на сайт.", "refresh": "Оновити", - "required": "Необхідні", + "required": "Необхідне", "requireduserdatamissing": "Цей користувач не має деяких необхідних даних в профілі. Заповніть, будь ласка, ці дані у вашому профілі Moodle і спробуйте ще раз.
    {{$a}}", "retry": "Повторити", "save": "Зберегти", - "search": "Знайти", - "searching": "Пошук", + "search": "Пошук", + "searching": "Шукати в", "searchresults": "Результати пошуку", "sec": "сек", "secs": "сек", "seemoredetail": "Деталі...", - "send": "Відіслати", - "sending": "Відправка", + "send": "надіслати", + "sending": "Відсилання", "serverconnection": "Помилка з’єднання з сервером", "show": "Показати", "showmore": "Показати більше", @@ -164,9 +164,10 @@ "sizemb": "Мб", "sizetb": "TB", "sorry": "Вибачте...", + "sortby": "Сортувати за", "start": "Початок", - "submit": "Прийняти", - "success": "Успіх!", + "submit": "Надіслати", + "success": "Успішно", "tablet": "Планшет", "teachers": "Викладачі", "thereisdatatosync": "Офлайн {{$a}} повинні бути синхронізовані.", @@ -179,7 +180,7 @@ "unexpectederror": "Неочікувана помилка. Будь ласка, закрийте і знову відкрийте додаток, щоб спробувати ще раз", "unicodenotsupported": "Деякі Emoji не підтримуються на цьому сайті. Такі символи будуть видалені, коли повідомлення буде відправлено.", "unicodenotsupportedcleanerror": "Порожній текст був знайдений при чищенні Unicode символів.", - "unknown": "Невідомо", + "unknown": "Невідоме", "unlimited": "Не обмежено", "unzipping": "Розпакування", "upgraderunning": "Сайт оновлюється, повторіть спробу пізніше.", @@ -193,7 +194,7 @@ "whyisthishappening": "Чому це відбувається?", "windowsphone": "Windows Phone", "wsfunctionnotavailable": "Функція веб-сервіс не доступна.", - "year": "рік", + "year": "Роки", "years": "роки", "yes": "Так" } \ No newline at end of file diff --git a/www/core/lang/zh-cn.json b/www/core/lang/zh-cn.json index 61789cfd747..ca7d8d0dfac 100644 --- a/www/core/lang/zh-cn.json +++ b/www/core/lang/zh-cn.json @@ -1,15 +1,15 @@ { "allparticipants": "所有成员", "areyousure": "你确定吗?", - "back": "返回", + "back": "« 返回", "cancel": "取消", "cannotconnect": "无法连接:请确认您已经正确输入网址,并且您的网站使用了Moodle 2.4或更高版本。", - "category": "课程分类", + "category": "类别", "choose": "选择", "choosedots": "选择...", "clicktohideshow": "点击来展开或折叠", - "close": "关闭", - "comments": "您的评价", + "close": "关闭窗口", + "comments": "评论", "commentscount": "评论({{$a}})", "completion-alt-auto-fail": "已完成:{{$a}}(未及格)", "completion-alt-auto-n": "未完成:{{$a}}", @@ -24,15 +24,15 @@ "coursedetails": "课程详情", "date": "日期", "day": "天", - "days": "天", + "days": "天数", "decsep": ".", "delete": "删除", "deleting": "删除中", - "description": "简要描述", + "description": "描述", "done": "完成", - "download": "下载", + "download": "点击下载已导出的分类文件", "edit": "编辑", - "error": "错误", + "error": "发生了错误", "errordownloading": "下载文件时出错", "filename": "文件名", "folder": "文件夹", @@ -46,12 +46,12 @@ "hours": "小时", "info": "信息", "labelsep": ":", - "lastmodified": "最后修改", + "lastmodified": "最近修改", "listsep": ",", - "loading": "载入中", + "loading": "加载中...", "lostconnection": "我们失去了连接,因此您需要重新连接。您现在的令牌是无效的。", "maxsizeandattachments": "新文件的最大尺寸: {{$a.size}} ,最多附件:{{$a.attachments}}", - "min": "分钟", + "min": "最低分值", "mins": "分钟", "mod_assign": "作业", "mod_chat": "聊天", @@ -66,31 +66,31 @@ "mod_survey": "问卷调查", "mod_wiki": "Wiki协作", "moduleintro": "描述", - "name": "名字", + "name": "名称", "networkerrormsg": "网络未启用或不工作。", - "never": "从未", - "next": "向后", + "never": "从不", + "next": "下一步", "no": "否", - "nocomments": "无评论", - "nograde": "没有分数", - "none": "无", + "nocomments": "没有评论", + "nograde": "没有成绩。", + "none": "没有", "nopasswordchangeforced": "在您更改密码前不能继续操作,但系统找不到用来更改密码的页面,请与管理员联系。", "nopermissions": "很抱歉,您没有相应权限({{$a}})", "noresults": "没有结果", "notice": "注意", "now": "现在", "numwords": "{{$a}}单词", - "offline": "不需要在线提交", + "offline": "离线", "online": "在线", "pagea": "页码 {{$a}}", "phone": "电话", "pictureof": "{{$a}}的头像", - "previous": "向前", + "previous": "以前状态", "refresh": "刷新", - "required": "必需的", + "required": "必须回答", "save": "保存", "search": "搜索", - "searching": "搜索", + "searching": "搜索中……", "searchresults": "搜索结果", "sec": "秒", "secs": "秒", @@ -104,11 +104,12 @@ "sizegb": "GB", "sizekb": "KB", "sizemb": "MB", + "sortby": "排序", "start": "开始", "submit": "提交", "success": "成功", "teachers": "教师", - "time": "用时", + "time": "时间", "timesup": "时间到!", "today": "今天", "unexpectederror": "意外出错。请关闭并重新打开APP再试一次", @@ -118,7 +119,7 @@ "userdeleted": "该用户帐号已被删除", "userdetails": "用户细节", "users": "用户", - "view": "浏览", + "view": "查看", "viewprofile": "查看个人资料", "year": "年", "years": "年", diff --git a/www/core/lang/zh-tw.json b/www/core/lang/zh-tw.json index d0608dfbea4..198c9b7eeb7 100644 --- a/www/core/lang/zh-tw.json +++ b/www/core/lang/zh-tw.json @@ -3,26 +3,26 @@ "allparticipants": "所有參與者", "android": "安卓", "areyousure": "你確定嗎?", - "back": "返回", + "back": "« 回頭", "cancel": "取消", "cannotconnect": "無法連接:請確認您輸入之網址正確,且您的位置使用的是Moodle2.4版或更新版本。", "cannotdownloadfiles": "在您的行動服務中禁用檔案下載. 請與您的網站管理員聯繫.", - "category": "類別", + "category": "類目", "choose": "選擇", "choosedots": "選擇...", "clearsearch": "清除搜尋", "clicktohideshow": "點按展開或縮合", "clicktoseefull": "點擊以看到詳細內容", - "close": "關閉", - "comments": "評論", + "close": "關閉視窗", + "comments": "您的評語", "commentscount": "評論數({{$a}})", "commentsnotworking": "無法取得評論資料", - "completion-alt-auto-fail": "已完成: {{$a}} (did not achieve pass grade)", - "completion-alt-auto-n": "未完成: {{$a}}", - "completion-alt-auto-pass": "已完成: {{$a}} (achieved pass grade)", - "completion-alt-auto-y": "已完成: {{$a}}", - "completion-alt-manual-n": "未完成: {{$ a}}. 選擇標記為完成.", - "completion-alt-manual-y": "已完成: {{$ a}}. 選擇標記為未完成.", + "completion-alt-auto-fail": "已完成:{{$a}} (不及格)", + "completion-alt-auto-n": "尚未完成:{{$a}}", + "completion-alt-auto-pass": "已經完成:{{$a}} (及格)", + "completion-alt-auto-y": "已經完成:{{$a}}", + "completion-alt-manual-n": "未完成:{{$a}} 。點選標記為完成。", + "completion-alt-manual-y": "已完成:{{$a}} 。點選標記為未完成。", "confirmcanceledit": "您確定要離開此頁面嗎? 所有的修改將會遺失.", "confirmdeletefile": "你確定要刪除這一檔案?", "confirmopeninbrowser": "你想要在瀏覽器內開啟嗎?", @@ -35,12 +35,12 @@ "datastoredoffline": "儲存在設備中的資料,因為它之前無法發送. 它稍後將自動發送.", "date": "日期", "day": "日", - "days": "日", + "days": "天數", "decsep": ".", "defaultvalue": "預設 ({{$a}})", "delete": "刪除", "deleting": "刪除中", - "description": "簡介文字", + "description": "說明", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", @@ -49,10 +49,10 @@ "discard": "捨棄", "dismiss": "除去", "done": "完成", - "download": "下載", + "download": "點選可下載匯出的類別檔案", "downloading": "下載中", - "edit": "編修", - "error": "錯誤", + "edit": "編輯", + "error": "發生錯誤", "errorchangecompletion": "更改完成狀態時發生錯誤. 請再試一次.", "errordeletefile": "刪除檔案時出錯. 請再試一次.", "errordownloading": "下載檔案時發生錯誤", @@ -75,23 +75,23 @@ "groupsseparate": "分隔群組", "groupsvisible": "可視群組", "hasdatatosync": "此{{$ a}}有離線資料要同步.", - "help": "輔助說明", + "help": "幫助", "hide": "隱藏", "hour": "小時", "hours": "小時", "humanreadablesize": "{{size}} {{unit}}", "image": "圖片", "imageviewer": "影像檢視器", - "info": "資料", + "info": "資訊", "ios": "iOS", "labelsep": ":", "lastmodified": "最後修改", "lastsync": "最後同步", "listsep": ",", - "loading": "裝載中", + "loading": "載入中...", "lostconnection": "我們已斷了線,您需重新連線。您的口令目前是無效的。", "maxsizeandattachments": "新檔案的最大容量: {{$a.size}} ,最多附件:{{$a.attachments}}", - "min": "分鐘", + "min": "最低分", "mins": "分鐘", "mod_assign": "分配", "mod_assignment": "分配", @@ -123,13 +123,13 @@ "mygroups": "我的群組", "name": "名稱", "networkerrormsg": "網路未啟用或未運作。", - "never": "從不", - "next": "往後", + "never": "從未", + "next": "下一步", "no": "否", "nocomments": "沒有評論", - "nograde": "沒有成績", - "none": "無", - "nopasswordchangeforced": "你若沒有更新密碼無法進行此處理", + "nograde": "沒有成績。", + "none": "沒有", + "nopasswordchangeforced": "沒有修改密碼前您無法處理,這裡沒有提供可以變更的頁面,請聯絡您的Moodle管理員。", "nopermissions": "抱歉,但是您目前沒有權限執行({{$a}})", "noresults": "沒有結果", "notapplicable": "n/a", @@ -137,8 +137,8 @@ "notsent": "沒有傳送", "now": "現在", "numwords": "{{$a}}字數", - "offline": "離線", - "online": "上線", + "offline": "不需要線上繳交", + "online": "在線上", "openfullimage": "點擊這裡以圖像原尺寸顯示", "openinbrowser": "以瀏覽器開啟", "othergroups": "其他群組", @@ -146,22 +146,22 @@ "percentagenumber": "{{$a}}%", "phone": "電話", "pictureof": "{{$a}}的相片", - "previous": "向前", + "previous": "先前的狀態", "pulltorefresh": "拖曳更新", "redirectingtosite": "您將被重定向到網站.", - "refresh": "更新", - "required": "必須的", + "refresh": "重新整理", + "required": "必答", "requireduserdatamissing": "此使用者缺少一些必需的配置資料. 請在您的Moodle中填寫此數據, 然後重試.
    {{$ a}}", "retry": "重試", "save": "儲存", - "search": "搜尋", - "searching": "搜尋中", + "search": "搜尋中...", + "searching": "搜尋", "searchresults": "搜尋結果", "sec": "秒", "secs": "秒", "seemoredetail": "按此以觀看更多細節", - "send": "傳送", - "sending": "傳送中", + "send": "送出", + "sending": "正在傳送", "serverconnection": "連結到伺服器時發生錯誤", "show": "顯示", "showmore": "顯示更多...", @@ -173,9 +173,10 @@ "sizemb": "MB", "sizetb": "TB", "sorry": "抱歉...", + "sortby": "排序依據", "start": "開始", - "submit": "提交", - "success": "成功!", + "submit": "送出", + "success": "成功", "tablet": "平板", "teachers": "教師", "thereisdatatosync": "有離線的{{$ a}}要同步", @@ -186,7 +187,7 @@ "twoparagraphs": "{{p1}}

    {{p2}}", "uhoh": "噢哦!", "unexpectederror": "無法預期的錯誤. 請關閉並重新開啟應用程式, 再試一次.", - "unknown": "未知", + "unknown": "未知的", "unlimited": "無限制", "unzipping": "解壓縮中", "upgraderunning": "網站正在升級中,請稍後再試。", @@ -194,7 +195,7 @@ "userdetails": "用戶的詳細資料", "usernotfullysetup": "用戶沒有完全設定好", "users": "用戶", - "view": "瀏覽", + "view": "檢視", "viewprofile": "瀏覽個人資料", "warningofflinedatadeleted": "離線資料 {{component}} '{{name}}' 已被刪除. {{error}}", "whoops": "糟糕!", From d338285531076ee4bc7a03951b6043d687652309 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 27 Jul 2017 00:12:22 +0200 Subject: [PATCH 092/118] MOBILE-2156 lang: Re-sync with amos for new languages --- www/addons/calendar/lang/ar.json | 2 +- www/addons/calendar/lang/cs.json | 4 +-- www/addons/calendar/lang/da.json | 4 +-- www/addons/calendar/lang/de.json | 4 +-- www/addons/calendar/lang/es.json | 4 +-- www/addons/calendar/lang/eu.json | 2 +- www/addons/calendar/lang/fr.json | 2 +- www/addons/calendar/lang/he.json | 4 +-- www/addons/calendar/lang/it.json | 2 +- www/addons/calendar/lang/ja.json | 2 +- www/addons/calendar/lang/nl.json | 2 +- www/addons/calendar/lang/ru.json | 2 +- www/addons/calendar/lang/sr-cr.json | 2 +- www/addons/calendar/lang/sr-lt.json | 4 +-- www/addons/calendar/lang/sv.json | 2 +- www/addons/calendar/lang/uk.json | 4 +-- www/addons/competency/lang/cs.json | 2 +- www/addons/competency/lang/da.json | 2 +- www/addons/competency/lang/de.json | 2 +- www/addons/competency/lang/es.json | 2 +- www/addons/competency/lang/eu.json | 2 +- www/addons/competency/lang/fr.json | 2 +- www/addons/competency/lang/it.json | 2 +- www/addons/competency/lang/ja.json | 2 +- www/addons/competency/lang/nl.json | 2 +- www/addons/competency/lang/sr-cr.json | 2 +- www/addons/competency/lang/sr-lt.json | 2 +- www/addons/competency/lang/uk.json | 2 +- www/addons/coursecompletion/lang/ar.json | 20 ++++++------- www/addons/coursecompletion/lang/cs.json | 26 ++++++++--------- www/addons/coursecompletion/lang/da.json | 28 +++++++++---------- www/addons/coursecompletion/lang/de.json | 24 ++++++++-------- www/addons/coursecompletion/lang/el.json | 14 +++++----- www/addons/coursecompletion/lang/es.json | 10 +++---- www/addons/coursecompletion/lang/eu.json | 14 +++++----- www/addons/coursecompletion/lang/fr.json | 10 +++---- www/addons/coursecompletion/lang/he.json | 26 ++++++++--------- www/addons/coursecompletion/lang/it.json | 16 +++++------ www/addons/coursecompletion/lang/ja.json | 24 ++++++++-------- www/addons/coursecompletion/lang/nl.json | 20 ++++++------- www/addons/coursecompletion/lang/ru.json | 26 ++++++++--------- www/addons/coursecompletion/lang/sr-cr.json | 14 +++++----- www/addons/coursecompletion/lang/sr-lt.json | 14 +++++----- www/addons/coursecompletion/lang/sv.json | 22 +++++++-------- www/addons/coursecompletion/lang/uk.json | 26 ++++++++--------- www/addons/files/lang/ar.json | 2 +- www/addons/files/lang/cs.json | 4 +-- www/addons/files/lang/da.json | 4 +-- www/addons/files/lang/de.json | 4 +-- www/addons/files/lang/el.json | 2 +- www/addons/files/lang/es.json | 2 +- www/addons/files/lang/eu.json | 4 +-- www/addons/files/lang/fr.json | 4 +-- www/addons/files/lang/he.json | 2 +- www/addons/files/lang/it.json | 4 +-- www/addons/files/lang/ja.json | 4 +-- www/addons/files/lang/nl.json | 4 +-- www/addons/files/lang/ru.json | 2 +- www/addons/files/lang/sr-cr.json | 4 +-- www/addons/files/lang/sr-lt.json | 4 +-- www/addons/files/lang/uk.json | 4 +-- www/addons/messages/lang/ar.json | 4 +-- www/addons/messages/lang/cs.json | 6 ++-- www/addons/messages/lang/da.json | 4 +-- www/addons/messages/lang/de.json | 4 +-- www/addons/messages/lang/el.json | 6 ++-- www/addons/messages/lang/es.json | 4 +-- www/addons/messages/lang/eu.json | 4 +-- www/addons/messages/lang/fr.json | 6 ++-- www/addons/messages/lang/he.json | 6 ++-- www/addons/messages/lang/it.json | 6 ++-- www/addons/messages/lang/ja.json | 6 ++-- www/addons/messages/lang/nl.json | 4 +-- www/addons/messages/lang/ru.json | 4 +-- www/addons/messages/lang/sr-cr.json | 4 +-- www/addons/messages/lang/sr-lt.json | 4 +-- www/addons/messages/lang/sv.json | 6 ++-- www/addons/messages/lang/uk.json | 2 +- www/addons/mod/choice/lang/ar.json | 2 +- www/addons/mod/choice/lang/cs.json | 4 +-- www/addons/mod/choice/lang/da.json | 4 +-- www/addons/mod/choice/lang/de.json | 4 +-- www/addons/mod/choice/lang/el.json | 4 +-- www/addons/mod/choice/lang/es.json | 4 +-- www/addons/mod/choice/lang/eu.json | 4 +-- www/addons/mod/choice/lang/fr.json | 4 +-- www/addons/mod/choice/lang/it.json | 4 +-- www/addons/mod/choice/lang/ja.json | 4 +-- www/addons/mod/choice/lang/nl.json | 4 +-- www/addons/mod/choice/lang/sr-cr.json | 4 +-- www/addons/mod/choice/lang/sr-lt.json | 4 +-- www/addons/mod/choice/lang/sv.json | 4 +-- www/addons/mod/choice/lang/uk.json | 4 +-- www/addons/mod/folder/lang/cs.json | 2 +- www/addons/mod/folder/lang/da.json | 2 +- www/addons/mod/folder/lang/de.json | 2 +- www/addons/mod/folder/lang/eu.json | 2 +- www/addons/mod/folder/lang/fr.json | 2 +- www/addons/mod/folder/lang/he.json | 2 +- www/addons/mod/folder/lang/it.json | 2 +- www/addons/mod/folder/lang/ja.json | 2 +- www/addons/mod/folder/lang/nl.json | 2 +- www/addons/mod/folder/lang/sr-cr.json | 2 +- www/addons/mod/folder/lang/sr-lt.json | 2 +- www/addons/mod/forum/lang/da.json | 2 +- www/addons/mod/forum/lang/de.json | 2 +- www/addons/mod/forum/lang/fr.json | 2 +- www/addons/mod/forum/lang/he.json | 2 +- www/addons/mod/forum/lang/it.json | 2 +- www/addons/mod/forum/lang/ja.json | 2 +- www/addons/mod/forum/lang/nl.json | 2 +- www/addons/mod/forum/lang/ru.json | 2 +- www/addons/mod/forum/lang/sr-cr.json | 2 +- www/addons/mod/forum/lang/sr-lt.json | 2 +- www/addons/mod/forum/lang/sv.json | 2 +- www/addons/mod/forum/lang/uk.json | 2 +- www/addons/mod/glossary/lang/cs.json | 2 +- www/addons/mod/glossary/lang/da.json | 2 +- www/addons/mod/glossary/lang/de.json | 2 +- www/addons/mod/glossary/lang/el.json | 2 +- www/addons/mod/glossary/lang/es.json | 2 +- www/addons/mod/glossary/lang/eu.json | 2 +- www/addons/mod/glossary/lang/fr.json | 2 +- www/addons/mod/glossary/lang/ja.json | 2 +- www/addons/mod/glossary/lang/nl.json | 2 +- www/addons/mod/glossary/lang/sr-cr.json | 2 +- www/addons/mod/glossary/lang/sr-lt.json | 2 +- www/addons/mod/glossary/lang/sv.json | 2 +- www/addons/mod/glossary/lang/uk.json | 2 +- www/addons/mod/label/lang/he.json | 2 +- www/addons/mod/label/lang/ru.json | 2 +- www/addons/mod/label/lang/uk.json | 2 +- www/addons/mod/survey/lang/ar.json | 2 +- www/addons/mod/survey/lang/ja.json | 2 +- www/addons/mod/wiki/lang/cs.json | 2 +- www/addons/mod/wiki/lang/da.json | 2 +- www/addons/mod/wiki/lang/de.json | 2 +- www/addons/mod/wiki/lang/el.json | 2 +- www/addons/mod/wiki/lang/es.json | 2 +- www/addons/mod/wiki/lang/eu.json | 2 +- www/addons/mod/wiki/lang/fr.json | 2 +- www/addons/mod/wiki/lang/ja.json | 2 +- www/addons/mod/wiki/lang/nl.json | 2 +- www/addons/mod/wiki/lang/ru.json | 2 +- www/addons/mod/wiki/lang/sr-cr.json | 2 +- www/addons/mod/wiki/lang/sr-lt.json | 2 +- www/addons/mod/wiki/lang/uk.json | 2 +- www/addons/notes/lang/ar.json | 2 +- www/addons/notes/lang/cs.json | 2 +- www/addons/notes/lang/da.json | 2 +- www/addons/notes/lang/de.json | 2 +- www/addons/notes/lang/el.json | 2 +- www/addons/notes/lang/eu.json | 2 +- www/addons/notes/lang/fr.json | 2 +- www/addons/notes/lang/he.json | 2 +- www/addons/notes/lang/it.json | 2 +- www/addons/notes/lang/ja.json | 2 +- www/addons/notes/lang/nl.json | 2 +- www/addons/notes/lang/ru.json | 2 +- www/addons/notes/lang/sr-cr.json | 2 +- www/addons/notes/lang/sr-lt.json | 2 +- www/addons/notes/lang/sv.json | 2 +- www/addons/notes/lang/uk.json | 2 +- www/addons/notifications/lang/ar.json | 2 +- www/addons/notifications/lang/cs.json | 2 +- www/addons/notifications/lang/da.json | 2 +- www/addons/notifications/lang/de.json | 2 +- www/addons/notifications/lang/es.json | 4 +-- www/addons/notifications/lang/eu.json | 2 +- www/addons/notifications/lang/he.json | 2 +- www/addons/notifications/lang/ja.json | 2 +- www/addons/notifications/lang/nl.json | 2 +- www/addons/notifications/lang/sv.json | 2 +- www/addons/notifications/lang/uk.json | 2 +- www/addons/participants/lang/ar.json | 2 +- www/addons/participants/lang/cs.json | 4 +-- www/addons/participants/lang/da.json | 2 +- www/addons/participants/lang/de.json | 4 +-- www/addons/participants/lang/el.json | 2 +- www/addons/participants/lang/es.json | 2 +- www/addons/participants/lang/eu.json | 2 +- www/addons/participants/lang/fr.json | 2 +- www/addons/participants/lang/it.json | 4 +-- www/addons/participants/lang/ja.json | 2 +- www/addons/participants/lang/nl.json | 2 +- www/addons/participants/lang/sr-cr.json | 2 +- www/addons/participants/lang/sr-lt.json | 2 +- www/addons/participants/lang/sv.json | 2 +- www/addons/participants/lang/uk.json | 2 +- www/core/components/course/lang/ar.json | 4 +-- www/core/components/course/lang/cs.json | 2 +- www/core/components/course/lang/da.json | 2 +- www/core/components/course/lang/de.json | 2 +- www/core/components/course/lang/el.json | 2 +- www/core/components/course/lang/es.json | 4 +-- www/core/components/course/lang/eu.json | 2 +- www/core/components/course/lang/fr.json | 2 +- www/core/components/course/lang/he.json | 2 +- www/core/components/course/lang/it.json | 2 +- www/core/components/course/lang/ja.json | 2 +- www/core/components/course/lang/nl.json | 2 +- www/core/components/course/lang/ru.json | 2 +- www/core/components/course/lang/sr-cr.json | 4 +-- www/core/components/course/lang/sr-lt.json | 4 +-- www/core/components/course/lang/sv.json | 2 +- www/core/components/course/lang/uk.json | 4 +-- www/core/components/courses/lang/cs.json | 10 +++---- www/core/components/courses/lang/da.json | 6 ++-- www/core/components/courses/lang/de.json | 10 +++---- www/core/components/courses/lang/el.json | 8 +++--- www/core/components/courses/lang/es.json | 8 +++--- www/core/components/courses/lang/eu.json | 8 +++--- www/core/components/courses/lang/fr.json | 6 ++-- www/core/components/courses/lang/it.json | 6 ++-- www/core/components/courses/lang/nl.json | 10 +++---- www/core/components/courses/lang/sr-cr.json | 6 ++-- www/core/components/courses/lang/sr-lt.json | 6 ++-- www/core/components/courses/lang/sv.json | 10 +++---- www/core/components/courses/lang/uk.json | 10 +++---- www/core/components/fileuploader/lang/ar.json | 8 +++--- www/core/components/fileuploader/lang/cs.json | 10 +++---- www/core/components/fileuploader/lang/da.json | 6 ++-- www/core/components/fileuploader/lang/de.json | 6 ++-- www/core/components/fileuploader/lang/el.json | 8 +++--- www/core/components/fileuploader/lang/es.json | 6 ++-- www/core/components/fileuploader/lang/eu.json | 8 +++--- www/core/components/fileuploader/lang/fr.json | 10 +++---- www/core/components/fileuploader/lang/he.json | 8 +++--- www/core/components/fileuploader/lang/it.json | 10 +++---- www/core/components/fileuploader/lang/ja.json | 8 +++--- www/core/components/fileuploader/lang/nl.json | 12 ++++---- www/core/components/fileuploader/lang/ru.json | 8 +++--- .../components/fileuploader/lang/sr-cr.json | 10 +++---- .../components/fileuploader/lang/sr-lt.json | 10 +++---- www/core/components/fileuploader/lang/sv.json | 6 ++-- www/core/components/fileuploader/lang/uk.json | 8 +++--- www/core/components/login/lang/cs.json | 4 +-- www/core/components/login/lang/da.json | 2 +- www/core/components/login/lang/de.json | 2 +- www/core/components/login/lang/el.json | 2 +- www/core/components/login/lang/es.json | 2 +- www/core/components/login/lang/eu.json | 4 +-- www/core/components/login/lang/fr.json | 4 +-- www/core/components/login/lang/he.json | 2 +- www/core/components/login/lang/it.json | 2 +- www/core/components/login/lang/nl.json | 4 +-- www/core/components/login/lang/ru.json | 2 +- www/core/components/login/lang/sr-cr.json | 4 +-- www/core/components/login/lang/sr-lt.json | 4 +-- www/core/components/login/lang/sv.json | 2 +- www/core/components/login/lang/uk.json | 4 +-- www/core/components/question/lang/cs.json | 2 +- www/core/components/question/lang/de.json | 2 +- www/core/components/question/lang/el.json | 2 +- www/core/components/question/lang/es.json | 2 +- www/core/components/question/lang/eu.json | 2 +- www/core/components/question/lang/fr.json | 2 +- www/core/components/question/lang/it.json | 2 +- www/core/components/question/lang/nl.json | 2 +- www/core/components/question/lang/sr-cr.json | 2 +- www/core/components/question/lang/sr-lt.json | 2 +- www/core/components/question/lang/uk.json | 2 +- www/core/components/sharedfiles/lang/cs.json | 2 +- www/core/components/sharedfiles/lang/de.json | 2 +- www/core/components/sharedfiles/lang/eu.json | 2 +- .../components/sharedfiles/lang/sr-cr.json | 2 +- .../components/sharedfiles/lang/sr-lt.json | 2 +- www/core/components/sharedfiles/lang/uk.json | 2 +- www/core/components/sidemenu/lang/ar.json | 4 +-- www/core/components/sidemenu/lang/cs.json | 4 +-- www/core/components/sidemenu/lang/de.json | 2 +- www/core/components/sidemenu/lang/el.json | 2 +- www/core/components/sidemenu/lang/eu.json | 2 +- www/core/components/sidemenu/lang/he.json | 2 +- www/core/components/sidemenu/lang/it.json | 2 +- www/core/components/sidemenu/lang/nl.json | 2 +- www/core/components/sidemenu/lang/ru.json | 2 +- www/core/components/sidemenu/lang/uk.json | 2 +- www/core/components/user/lang/ar.json | 4 +-- www/core/components/user/lang/cs.json | 6 ++-- www/core/components/user/lang/da.json | 4 +-- www/core/components/user/lang/de.json | 6 ++-- www/core/components/user/lang/el.json | 6 ++-- www/core/components/user/lang/es.json | 4 +-- www/core/components/user/lang/eu.json | 6 ++-- www/core/components/user/lang/fr.json | 8 +++--- www/core/components/user/lang/he.json | 8 +++--- www/core/components/user/lang/it.json | 6 ++-- www/core/components/user/lang/ja.json | 4 +-- www/core/components/user/lang/nl.json | 4 +-- www/core/components/user/lang/ru.json | 6 ++-- www/core/components/user/lang/sr-cr.json | 6 ++-- www/core/components/user/lang/sr-lt.json | 6 ++-- www/core/components/user/lang/sv.json | 8 +++--- www/core/components/user/lang/uk.json | 6 ++-- www/core/lang/ar.json | 2 +- www/core/lang/cs.json | 16 +++++------ www/core/lang/da.json | 16 +++++------ www/core/lang/de.json | 22 +++++++-------- www/core/lang/el.json | 24 ++++++++-------- www/core/lang/es.json | 12 ++++---- www/core/lang/eu.json | 8 +++--- www/core/lang/fr.json | 12 ++++---- www/core/lang/he.json | 16 +++++------ www/core/lang/it.json | 24 ++++++++-------- www/core/lang/ja.json | 24 ++++++++-------- www/core/lang/nl.json | 22 +++++++-------- www/core/lang/sr-cr.json | 22 +++++++-------- www/core/lang/sr-lt.json | 22 +++++++-------- www/core/lang/sv.json | 22 +++++++-------- www/core/lang/uk.json | 28 +++++++++---------- 311 files changed, 789 insertions(+), 789 deletions(-) diff --git a/www/addons/calendar/lang/ar.json b/www/addons/calendar/lang/ar.json index 9bece3c914d..23e2ee91b94 100644 --- a/www/addons/calendar/lang/ar.json +++ b/www/addons/calendar/lang/ar.json @@ -3,5 +3,5 @@ "errorloadevent": "خطأ في تحميل الحدث", "errorloadevents": "خطأ في تحميل الأحداث", "noevents": "لا يوجد أي أحداث", - "notifications": "إشعارات" + "notifications": "الإشعارات" } \ No newline at end of file diff --git a/www/addons/calendar/lang/cs.json b/www/addons/calendar/lang/cs.json index 5dca11fb0e2..93d27c11dce 100644 --- a/www/addons/calendar/lang/cs.json +++ b/www/addons/calendar/lang/cs.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Výchozí čas oznámení", "errorloadevent": "Chyba při načítání události.", "errorloadevents": "Chyba při načítání událostí.", - "noevents": "Žádné nadcházející činnosti", - "notifications": "Informace" + "noevents": "Nejsou žádné události", + "notifications": "Upozornění" } \ No newline at end of file diff --git a/www/addons/calendar/lang/da.json b/www/addons/calendar/lang/da.json index 9af5235a51d..6826baea7eb 100644 --- a/www/addons/calendar/lang/da.json +++ b/www/addons/calendar/lang/da.json @@ -2,6 +2,6 @@ "calendarevents": "Kalenderbegivenheder", "errorloadevent": "Fejl ved indlæsning af begivenhed.", "errorloadevents": "Fejl ved indlæsning af begivenheder.", - "noevents": "Ingen forestående aktiviteter", - "notifications": "Beskeder" + "noevents": "Der er ingen begivenheder", + "notifications": "Notifikationer" } \ No newline at end of file diff --git a/www/addons/calendar/lang/de.json b/www/addons/calendar/lang/de.json index e38e81f16cd..ee64dc04300 100644 --- a/www/addons/calendar/lang/de.json +++ b/www/addons/calendar/lang/de.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Standardmäßige Benachrichtigungszeit", "errorloadevent": "Fehler beim Laden des Kalendereintrags", "errorloadevents": "Fehler beim Laden der Kalendereinträge", - "noevents": "Keine anstehenden Aktivitäten fällig", - "notifications": "Systemmitteilungen" + "noevents": "Keine Kalendereinträge", + "notifications": "Benachrichtigung" } \ No newline at end of file diff --git a/www/addons/calendar/lang/es.json b/www/addons/calendar/lang/es.json index 8149bc574d6..993aec44200 100644 --- a/www/addons/calendar/lang/es.json +++ b/www/addons/calendar/lang/es.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Tiempo de notificación por defecto", "errorloadevent": "Error cargando el evento.", "errorloadevents": "Error cargando los eventos.", - "noevents": "No hay actividades próximas pendientes", - "notifications": "Avisos" + "noevents": "No hay eventos", + "notifications": "Notificaciones" } \ No newline at end of file diff --git a/www/addons/calendar/lang/eu.json b/www/addons/calendar/lang/eu.json index 26477c604df..1158b9cd186 100644 --- a/www/addons/calendar/lang/eu.json +++ b/www/addons/calendar/lang/eu.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Berezko jakinarazpen-ordua", "errorloadevent": "Errorea gertakaria kargatzean.", "errorloadevents": "Errorea gertakariak kargatzean.", - "noevents": "Ez dago jardueren muga-egunik laster", + "noevents": "Ez dago ekitaldirik", "notifications": "Jakinarazpenak" } \ No newline at end of file diff --git a/www/addons/calendar/lang/fr.json b/www/addons/calendar/lang/fr.json index 9281fbdabb5..79e2b2edcac 100644 --- a/www/addons/calendar/lang/fr.json +++ b/www/addons/calendar/lang/fr.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Heure de notification par défaut", "errorloadevent": "Erreur de chargement de l'événement", "errorloadevents": "Erreur de chargement des événements", - "noevents": "Aucune activité", + "noevents": "Il n'y a pas d'événement", "notifications": "Notifications" } \ No newline at end of file diff --git a/www/addons/calendar/lang/he.json b/www/addons/calendar/lang/he.json index 3702664d6e1..368fb1895c4 100644 --- a/www/addons/calendar/lang/he.json +++ b/www/addons/calendar/lang/he.json @@ -2,6 +2,6 @@ "calendarevents": "אירועי לוח שנה", "errorloadevent": "שגיאה בטעינת האירוע.", "errorloadevents": "שגיאה בטעינת האירועים.", - "noevents": "לא קיימות פעילויות עתידיות להן מועד הגשה", - "notifications": "עדכונים והודעות" + "noevents": "אין אירועים", + "notifications": "התראות" } \ No newline at end of file diff --git a/www/addons/calendar/lang/it.json b/www/addons/calendar/lang/it.json index bd05740cedc..7dda0726c1e 100644 --- a/www/addons/calendar/lang/it.json +++ b/www/addons/calendar/lang/it.json @@ -2,6 +2,6 @@ "calendarevents": "Eventi nel calendario", "errorloadevent": "Si è verificato un errore durante il caricamento degli eventi.", "errorloadevents": "Si è verificato un errore durante il caricamento degli eventi.", - "noevents": "Non ci sono attività da svolgere", + "noevents": "Non ci sono eventi", "notifications": "Notifiche" } \ No newline at end of file diff --git a/www/addons/calendar/lang/ja.json b/www/addons/calendar/lang/ja.json index 8bdfec3c217..b6e5457e412 100644 --- a/www/addons/calendar/lang/ja.json +++ b/www/addons/calendar/lang/ja.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "デフォルト通知時間", "errorloadevent": "イベントの読み込み時にエラーがありました。", "errorloadevents": "イベントの読み込み時にエラーがありました。", - "noevents": "到来する活動期限はありません。", + "noevents": "イベントはありません", "notifications": "通知" } \ No newline at end of file diff --git a/www/addons/calendar/lang/nl.json b/www/addons/calendar/lang/nl.json index 16546e8a4ee..5c7174a3165 100644 --- a/www/addons/calendar/lang/nl.json +++ b/www/addons/calendar/lang/nl.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Standaard notificatietijd", "errorloadevent": "Fout bij het laden van de gebeurtenis.", "errorloadevents": "Fout bij het laden van de gebeurtenissen.", - "noevents": "Er zijn geen verwachte activiteiten", + "noevents": "Er zijn geen gebeurtenissen", "notifications": "Meldingen" } \ No newline at end of file diff --git a/www/addons/calendar/lang/ru.json b/www/addons/calendar/lang/ru.json index 001aa958044..0d17cabd368 100644 --- a/www/addons/calendar/lang/ru.json +++ b/www/addons/calendar/lang/ru.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Время уведомлений по умолчанию", "errorloadevent": "Ошибка при загрузке события", "errorloadevents": "Ошибка при загрузке событий", - "noevents": "Нет предстоящих заданий", + "noevents": "Нет событий", "notifications": "Уведомления" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sr-cr.json b/www/addons/calendar/lang/sr-cr.json index 90d189510bd..dba4ebcd807 100644 --- a/www/addons/calendar/lang/sr-cr.json +++ b/www/addons/calendar/lang/sr-cr.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Подразумевано време за слање обавештења", "errorloadevent": "Грешка приликом учитавања догађаја.", "errorloadevents": "Грешка приликом учитавања догађаја.", - "noevents": "Нема активности које се ускоро завршавају", + "noevents": "Нема догађаја", "notifications": "Обавештења" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sr-lt.json b/www/addons/calendar/lang/sr-lt.json index ef06104d1cf..7db382ef521 100644 --- a/www/addons/calendar/lang/sr-lt.json +++ b/www/addons/calendar/lang/sr-lt.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Podrazumevano vreme za slanje obaveštenja", "errorloadevent": "Greška prilikom učitavanja događaja.", "errorloadevents": "Greška prilikom učitavanja događaja.", - "noevents": "Nema aktivnosti koje se uskoro završavaju", - "notifications": "Obaveštenja" + "noevents": "Nema događaja", + "notifications": "Nema događaja" } \ No newline at end of file diff --git a/www/addons/calendar/lang/sv.json b/www/addons/calendar/lang/sv.json index 12cef7ef2eb..d5ac5c127d0 100644 --- a/www/addons/calendar/lang/sv.json +++ b/www/addons/calendar/lang/sv.json @@ -3,5 +3,5 @@ "errorloadevent": "Fel vid inläsning av händelse.", "errorloadevents": "Fel vid inläsning av händelser", "noevents": "Det finns inga händelser", - "notifications": "Administration" + "notifications": "Notifikationer" } \ No newline at end of file diff --git a/www/addons/calendar/lang/uk.json b/www/addons/calendar/lang/uk.json index e0b616f24a4..2e0930c7034 100644 --- a/www/addons/calendar/lang/uk.json +++ b/www/addons/calendar/lang/uk.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Час сповіщень за-замовчуванням", "errorloadevent": "Помилка завантаження події.", "errorloadevents": "Помилка завантаження подій.", - "noevents": "Наразі, заплановані активності відсутні", - "notifications": "Повідомлення" + "noevents": "Немає подій", + "notifications": "Сповіщення" } \ No newline at end of file diff --git a/www/addons/competency/lang/cs.json b/www/addons/competency/lang/cs.json index effff8797dc..c935260c6c1 100644 --- a/www/addons/competency/lang/cs.json +++ b/www/addons/competency/lang/cs.json @@ -12,7 +12,7 @@ "learningplans": "Studijní plány", "myplans": "Mé studijní plány", "noactivities": "Žádné činnosti", - "nocompetencies": "V tomto rámci nebyly vytvořeny žádné kompetence.", + "nocompetencies": "Žádné kompetence", "nocrossreferencedcompetencies": "K této kompetenci nebyly spojeny další průřezové kompetence.", "noevidence": "Bez záznamu", "noplanswerecreated": "Nebyly vytvořeny žádné studijní plány.", diff --git a/www/addons/competency/lang/da.json b/www/addons/competency/lang/da.json index f139228f22e..454bb170072 100644 --- a/www/addons/competency/lang/da.json +++ b/www/addons/competency/lang/da.json @@ -11,7 +11,7 @@ "learningplans": "Læringsplaner", "myplans": "Mine læringsplaner", "noactivities": "Ingen aktiviteter", - "nocompetencies": "Ingen kompetencer er oprettet i denne ramme.", + "nocompetencies": "Ingen kompetencer", "nocrossreferencedcompetencies": "Ingen andre kompetencer er krydsrefereret til denne kompetence.", "noevidence": "Ingen vidnesbyrd", "noplanswerecreated": "Der blev ikke oprettet nogen læringsplaner.", diff --git a/www/addons/competency/lang/de.json b/www/addons/competency/lang/de.json index 77056f4c882..30b34122700 100644 --- a/www/addons/competency/lang/de.json +++ b/www/addons/competency/lang/de.json @@ -12,7 +12,7 @@ "learningplans": "Lernpläne", "myplans": "Meine Lernpläne", "noactivities": "Keine Aktivitäten", - "nocompetencies": "Für diesen Kompetenzrahmen wurden keine Kompetenzen angelegt.", + "nocompetencies": "Keine Kompetenzen", "nocrossreferencedcompetencies": "Keine anderen Kompetenzen wurden zu dieser Kompetenz referiert.", "noevidence": "Keine Belege", "noplanswerecreated": "Bisher sind keine Lernpläne angelegt.", diff --git a/www/addons/competency/lang/es.json b/www/addons/competency/lang/es.json index 22b0ec02246..e6a18fa8d33 100644 --- a/www/addons/competency/lang/es.json +++ b/www/addons/competency/lang/es.json @@ -12,7 +12,7 @@ "learningplans": "Planes de aprendizaje", "myplans": "Mis planes de aprendizaje", "noactivities": "Sin actividades", - "nocompetencies": "No se han creado competencias para este marco.", + "nocompetencies": "Sin competencias", "nocrossreferencedcompetencies": "No se han referenciado otras competencias a esta competencia.", "noevidence": "Sin evidencias", "path": "Ruta", diff --git a/www/addons/competency/lang/eu.json b/www/addons/competency/lang/eu.json index 706620b8084..b039b18b496 100644 --- a/www/addons/competency/lang/eu.json +++ b/www/addons/competency/lang/eu.json @@ -9,7 +9,7 @@ "learningplans": "Ikasketa-planak", "myplans": "Nire ikasketa-planak", "noactivities": "Ez dago jarduerarik", - "nocompetencies": "Ezin izan gaitasunik sortu marko honetan.", + "nocompetencies": "Gaitasunik ez", "noevidence": "Ez dago ebidentziarik", "noplanswerecreated": "Ez da ikasketa-planik sortu.", "path": "Bidea:", diff --git a/www/addons/competency/lang/fr.json b/www/addons/competency/lang/fr.json index da75ef9eb86..e6510df8b0b 100644 --- a/www/addons/competency/lang/fr.json +++ b/www/addons/competency/lang/fr.json @@ -12,7 +12,7 @@ "learningplans": "Plans de formation", "myplans": "Mes plans de formation", "noactivities": "Aucune activité", - "nocompetencies": "Aucune compétence n'a été créée dans ce référentiel.", + "nocompetencies": "Aucune compétence", "nocrossreferencedcompetencies": "Aucune autre compétence n'est transversale pour cette compétence.", "noevidence": "Aucune preuve d'acquis", "noplanswerecreated": "Aucun plan de formation n'a été créé.", diff --git a/www/addons/competency/lang/it.json b/www/addons/competency/lang/it.json index a578afc6c20..d9cf5441319 100644 --- a/www/addons/competency/lang/it.json +++ b/www/addons/competency/lang/it.json @@ -12,7 +12,7 @@ "learningplans": "Piani di formazione", "myplans": "I miei piani di formazione", "noactivities": "Nessuna attività.", - "nocompetencies": "Questo quadro non ha competenze", + "nocompetencies": "Non sono presenti competenze", "nocrossreferencedcompetencies": "Non ci sono competenze con riferimenti incrociati a questa competenza", "noevidence": "Non sono presenti attestazioni.", "noplanswerecreated": "Non sono stati creati piani di formazione", diff --git a/www/addons/competency/lang/ja.json b/www/addons/competency/lang/ja.json index 0e42d5d3584..d959d9ab61a 100644 --- a/www/addons/competency/lang/ja.json +++ b/www/addons/competency/lang/ja.json @@ -12,7 +12,7 @@ "learningplans": "学習プラン", "myplans": "マイ学習プラン", "noactivities": "活動なし", - "nocompetencies": "このフレームワークにコンピテンシーは作成されていません。", + "nocompetencies": "コンピテンシーなし", "nocrossreferencedcompetencies": "このコンピテンシーに相互参照されている他のコンピテンシーはありません。", "noevidence": "エビデンスなし", "noplanswerecreated": "学習プランは作成されませんでした。", diff --git a/www/addons/competency/lang/nl.json b/www/addons/competency/lang/nl.json index b6e8ddd757e..f03e99ab177 100644 --- a/www/addons/competency/lang/nl.json +++ b/www/addons/competency/lang/nl.json @@ -12,7 +12,7 @@ "learningplans": "Studieplannen", "myplans": "Mijn studieplannen", "noactivities": "Geen activiteiten", - "nocompetencies": "Er zijn nog geen competenties gemaakt in dit framework", + "nocompetencies": "Geen competenties", "nocrossreferencedcompetencies": "Er zijn geen andere competenties met een kruisverwijzing naar deze competentie.", "noevidence": "Geen bewijs", "noplanswerecreated": "Er zijn nog geen studieplannen gemaakt", diff --git a/www/addons/competency/lang/sr-cr.json b/www/addons/competency/lang/sr-cr.json index c1e8de7be78..d9f5a2c019b 100644 --- a/www/addons/competency/lang/sr-cr.json +++ b/www/addons/competency/lang/sr-cr.json @@ -12,7 +12,7 @@ "learningplans": "Планови учења", "myplans": "Моји планови учења", "noactivities": "Нема активности", - "nocompetencies": "Ниједна компетенција није креирана у овом оквиру.", + "nocompetencies": "Нема компетенција", "nocrossreferencedcompetencies": "Ниједна друга компетенција није унакрсно повезана са овом компетенцијом.", "noevidence": "Нема доказа", "noplanswerecreated": "Није креиран ниједан план учења.", diff --git a/www/addons/competency/lang/sr-lt.json b/www/addons/competency/lang/sr-lt.json index 443a40f4ff4..2a3c179861a 100644 --- a/www/addons/competency/lang/sr-lt.json +++ b/www/addons/competency/lang/sr-lt.json @@ -12,7 +12,7 @@ "learningplans": "Planovi učenja", "myplans": "Moji planovi učenja", "noactivities": "Nema aktivnosti", - "nocompetencies": "Nijedna kompetencija nije kreirana u ovom okviru.", + "nocompetencies": "Nema kompetencija", "nocrossreferencedcompetencies": "Nijedna druga kompetencija nije unakrsno povezana sa ovom kompetencijom.", "noevidence": "Nema dokaza", "noplanswerecreated": "Nije kreiran nijedan plan učenja.", diff --git a/www/addons/competency/lang/uk.json b/www/addons/competency/lang/uk.json index 047fc924f5a..376f4e9d48f 100644 --- a/www/addons/competency/lang/uk.json +++ b/www/addons/competency/lang/uk.json @@ -12,7 +12,7 @@ "learningplans": "Навчальний план", "myplans": "Мої навчальні плани", "noactivities": "Жодної діяльності", - "nocompetencies": "Жодної компетентності не створено у цьому репозиторії", + "nocompetencies": "Немає компетенції", "nocrossreferencedcompetencies": "Жодна інша компетентність не пов'язана з даною", "noevidence": "Жодного підтвердження", "noplanswerecreated": "Жодного навчального плану не було створено", diff --git a/www/addons/coursecompletion/lang/ar.json b/www/addons/coursecompletion/lang/ar.json index 9069a17e684..f88bc955bca 100644 --- a/www/addons/coursecompletion/lang/ar.json +++ b/www/addons/coursecompletion/lang/ar.json @@ -1,21 +1,21 @@ { - "complete": "كامل", + "complete": "مكتمل", "completecourse": "مقرر مكتمل", - "completed": "تم", + "completed": "تم إكمال المقرر", "completiondate": "تاريخ إكمال المقرر", "couldnotloadreport": "لا يمكن تحميل تقرير إكمال المقرر، الرجاء المحاولة في وقت آخر", - "coursecompletion": "إكمال المقرر الدراسي", - "criteria": "معايير", - "criteriagroup": "مجموعة المعايير", + "coursecompletion": "إكمال المقرر", + "criteria": "المعايير", + "criteriagroup": "معايير المجموعة", "criteriarequiredall": "كل المعايير في الأسفل مطلوبة", - "criteriarequiredany": "أي معيار في الأسفل مطلوب", + "criteriarequiredany": "أي معايير في الأسفل مطلوبة", "inprogress": "قيد التنفيذ", - "manualselfcompletion": "إكمال يدوي ذاتي", + "manualselfcompletion": "إكمال ذاتي يدوي", "notyetstarted": "لم يبدأ بعد", - "pending": "معلق", - "required": "مفروض", + "pending": "قيد الانتظار", + "required": "مطلوب", "requiredcriteria": "المعايير المطلوبة", "requirement": "المتطلبات", - "status": "الوضع", + "status": "الحالة", "viewcoursereport": "عرض تقرير المقرر" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/cs.json b/www/addons/coursecompletion/lang/cs.json index 2b2ffccd75f..f54632d92c0 100644 --- a/www/addons/coursecompletion/lang/cs.json +++ b/www/addons/coursecompletion/lang/cs.json @@ -1,21 +1,21 @@ { - "complete": "Splněno", + "complete": "Absolvováno", "completecourse": "Absolvovaný kurz", - "completed": "Hhotovo", + "completed": "Splněno", "completiondate": "Datum ukončení", "couldnotloadreport": "Nelze načíst zprávu o absolvování kurzu, zkuste to prosím později.", - "coursecompletion": "Studenti musí absolvovat tento kurz", - "criteria": "Podmínky", + "coursecompletion": "Absolvování kurzu", + "criteria": "Kritéria", "criteriagroup": "Skupina podmínek", - "criteriarequiredall": "Všechny podmínky musí být splněny", - "criteriarequiredany": "Jakákoli z podmínek musí být splněna", - "inprogress": "Probíhající", - "manualselfcompletion": "Označení absolvování kurzu samotným studentem", + "criteriarequiredall": "Jsou požadovány všechny podmínky", + "criteriarequiredany": "Je požadována libovolná podmínka", + "inprogress": "Probíhá", + "manualselfcompletion": "Ručně nastavené absolvování kurzu samotným studentem", "notyetstarted": "Zatím nezačalo", - "pending": "Probíhající", - "required": "Vyžadováno", - "requiredcriteria": "Vyžadované podmínky", + "pending": "Čeká", + "required": "Požadováno", + "requiredcriteria": "Požadovaná kriteria", "requirement": "Požadavek", - "status": "Stav", - "viewcoursereport": "Zobrazit přehled kurzu" + "status": "Status", + "viewcoursereport": "Zobrazit sestavu kurzu" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/da.json b/www/addons/coursecompletion/lang/da.json index 825ffc76c20..9d2cdeb93a0 100644 --- a/www/addons/coursecompletion/lang/da.json +++ b/www/addons/coursecompletion/lang/da.json @@ -1,21 +1,21 @@ { - "complete": "Færdiggør", + "complete": "Fuldfør", "completecourse": "Fuldfør kursus", - "completed": "Gennemført", + "completed": "Fuldført", "completiondate": "Afslutningsdato", "couldnotloadreport": "Kunne ikke indlæse rapporten vedrørende kursusfuldførelse, prøv igen senere.", - "coursecompletion": "Kursusgennemførelse", - "criteria": "Kriterie", - "criteriagroup": "Kriteriegruppe", - "criteriarequiredall": "Alle kriterier herunder er påkrævet", - "criteriarequiredany": "Et af kriterierne herunder er påkrævet", - "inprogress": "Igangværende", - "manualselfcompletion": "Manuel selvregistrering af gennemførelse", - "notyetstarted": "Ikke begyndt endnu", - "pending": "Behandles", - "required": "Påkrævet", - "requiredcriteria": "Påkrævede kriterier", + "coursecompletion": "Kursusfuldførelse", + "criteria": "Kriterier", + "criteriagroup": "Gruppe af kriterier", + "criteriarequiredall": "Alle nedenstående kriterier er påkrævet", + "criteriarequiredany": "Hvilken som helst af nedenstående kriterier er påkrævet", + "inprogress": "I gang", + "manualselfcompletion": "Manuel markering af færdiggørelse", + "notyetstarted": "Endnu ikke startet", + "pending": "Afventer", + "required": "Krævet", + "requiredcriteria": "Krævet kriterie", "requirement": "Krav", - "status": "Badgestatus", + "status": "Status", "viewcoursereport": "Se kursusrapport" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/de.json b/www/addons/coursecompletion/lang/de.json index 2ecdc1febf8..7125646d332 100644 --- a/www/addons/coursecompletion/lang/de.json +++ b/www/addons/coursecompletion/lang/de.json @@ -1,21 +1,21 @@ { - "complete": "Fertig", + "complete": "Abschließen", "completecourse": "Kurs abschließen", "completed": "Abgeschlossen", "completiondate": "Abschlussdatum", "couldnotloadreport": "Fehler beim Laden des Kursabschlussberichts. Versuchen Sie es später noch einmal.", - "coursecompletion": "Teilnehmer/innen müssen diesen Kurs abschließen.", + "coursecompletion": "Kursabschluss", "criteria": "Kriterien", "criteriagroup": "Kriteriengruppe", - "criteriarequiredall": "Alle nachfolgenden Kriterien sind notwendig", - "criteriarequiredany": "Eine der nachfolgenden Kriterien ist notwendig", - "inprogress": "In Bearbeitung", - "manualselfcompletion": "Manueller eigener Abschluss", - "notyetstarted": "Noch nicht begonnen", - "pending": "Unerledigt", - "required": "Erforderlich", - "requiredcriteria": "Notwendiges Kriterium", + "criteriarequiredall": "Alle nachfolgenden Kriterien sind notwendig.", + "criteriarequiredany": "Ein nachfolgendes Kriterium ist notwendig.", + "inprogress": "In Arbeit", + "manualselfcompletion": "Manueller Selbstabschluss", + "notyetstarted": "Nicht begonnen", + "pending": "Nicht erledigt", + "required": "Notwendig", + "requiredcriteria": "Notwendige Kriterien", "requirement": "Anforderung", - "status": "Existierende Einschreibungen erlauben", - "viewcoursereport": "Kursbericht ansehen" + "status": "Status", + "viewcoursereport": "Kursbericht anzeigen" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/el.json b/www/addons/coursecompletion/lang/el.json index 8ba062f3e82..a6fb10fd47b 100644 --- a/www/addons/coursecompletion/lang/el.json +++ b/www/addons/coursecompletion/lang/el.json @@ -1,21 +1,21 @@ { "complete": "Ολοκλήρωση", "completecourse": "Ολοκλήρωση μαθήματος", - "completed": "ολοκληρώθηκε", + "completed": "Ολοκληρωμένο", "completiondate": "Ημερομηνία ολοκλήρωσης", "couldnotloadreport": "Δεν ήταν δυνατή η φόρτωση της αναφοράς ολοκλήρωσης του μαθήματος, δοκιμάστε ξανά αργότερα.", "coursecompletion": "Ολοκλήρωση μαθήματος", "criteria": "Κριτήρια", "criteriagroup": "Ομάδα κριτηρίων", - "criteriarequiredall": "Όλα τα παρακάτω κριτήρια είναι απαραίτητα", - "criteriarequiredany": "Τα παρακάτω κριτήρια είναι απαραίτητα", + "criteriarequiredall": "Όλα τα παρακάτω κριτήρια είναι υποχρεωτικά", + "criteriarequiredany": "Οποιοδήποτε από τα παρακάτω κριτήρια είναι υποχρεωτικά", "inprogress": "Σε εξέλιξη", - "manualselfcompletion": "Χειροκίνητη αυτό-ολοκλήρωση", + "manualselfcompletion": "Μη αυτόματη ολοκλήρωση", "notyetstarted": "Δεν έχει ξεκινήσει ακόμα", - "pending": "Σε εκκρεμότητα", + "pending": "Εκκρεμής", "required": "Απαιτείται", "requiredcriteria": "Απαιτούμενα κριτήρια", "requirement": "Απαίτηση", - "status": "Επιτρέπεται η πρόσβαση στους επισκέπτες", - "viewcoursereport": "Προβολή αναφορά μαθήματος" + "status": "Κατάσταση", + "viewcoursereport": "Δείτε την αναφορά μαθήματος" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/es.json b/www/addons/coursecompletion/lang/es.json index a061fa0356e..89ef5e6ecd0 100644 --- a/www/addons/coursecompletion/lang/es.json +++ b/www/addons/coursecompletion/lang/es.json @@ -1,21 +1,21 @@ { - "complete": "Finalizado", + "complete": "Completado", "completecourse": "Curso completado", - "completed": "completada", + "completed": "Finalizado", "completiondate": "Fecha de finalización", "couldnotloadreport": "No se puede cargar el informe de finalización del curso, por favor inténtalo de nuevo más tarde.", - "coursecompletion": "Los usuarios deben finalizar este curso.", + "coursecompletion": "Finalización del curso", "criteria": "Criterios", "criteriagroup": "Grupo de criterios", "criteriarequiredall": "Son necesarios todos los criterios que aparecen más abajo", "criteriarequiredany": "Es necesario cualquiera de los criterios que aparecen más abajo", - "inprogress": "En progreso", + "inprogress": "En curso", "manualselfcompletion": "Autocompletar manualmente", "notyetstarted": "Aún no comenzado", "pending": "Pendiente", "required": "Obligatorio", "requiredcriteria": "Criterios necesarios", "requirement": "Requisito", - "status": "Estado de la insignia", + "status": "Estado", "viewcoursereport": "Ver informe del curso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/eu.json b/www/addons/coursecompletion/lang/eu.json index 295f4ed6d7c..4735d6035c9 100644 --- a/www/addons/coursecompletion/lang/eu.json +++ b/www/addons/coursecompletion/lang/eu.json @@ -1,21 +1,21 @@ { - "complete": "Osatu", + "complete": "Osoa", "completecourse": "Ikastaroa osatu", - "completed": "Osatua", + "completed": "Osatuta", "completiondate": "Osaketa-data", "couldnotloadreport": "Ezin izan da ikastaro-osaketaren txostena kargatu, mesedez saiatu beranduago.", - "coursecompletion": "Erabiltzaileek ikastaro hau osatu behar dute", + "coursecompletion": "Ikastaro-osaketa", "criteria": "Irizpidea", "criteriagroup": "Irizpide-multzoa", "criteriarequiredall": "Beheko irizpide guztiak dira beharrezko", "criteriarequiredany": "Beheko hainbat irizpide dira beharrezko", - "inprogress": "Martxan", + "inprogress": "Ari da", "manualselfcompletion": "Norberak eskuz osatu", "notyetstarted": "Ez da hasi", - "pending": "Zain", - "required": "Ezinbestekoa", + "pending": "Egin gabe", + "required": "Beharrezkoa", "requiredcriteria": "Irizpidea behar da", "requirement": "Eskakizuna", - "status": "Dominen egoera", + "status": "Egoera", "viewcoursereport": "Ikastaroaren txostena ikusi" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/fr.json b/www/addons/coursecompletion/lang/fr.json index e0290d8a8bb..9b7c1642571 100644 --- a/www/addons/coursecompletion/lang/fr.json +++ b/www/addons/coursecompletion/lang/fr.json @@ -1,10 +1,10 @@ { - "complete": "Complet", + "complete": "Terminer", "completecourse": "Terminer le cours", "completed": "Terminé", "completiondate": "Date d'achèvement", "couldnotloadreport": "Impossible de charger le rapport d'achèvement de cours. Veuillez essayer plus tard.", - "coursecompletion": "Achèvement de cours", + "coursecompletion": "Achèvement du cours", "criteria": "Critères", "criteriagroup": "Groupe de critères", "criteriarequiredall": "Tous les critères ci-dessous sont requis", @@ -12,10 +12,10 @@ "inprogress": "En cours", "manualselfcompletion": "Auto-achèvement manuel", "notyetstarted": "Pas encore commencé", - "pending": "En suspens", + "pending": "En attente", "required": "Requis", "requiredcriteria": "Critères requis", "requirement": "Condition", - "status": "Statut du badge", - "viewcoursereport": "Consulter le rapport du cours" + "status": "Statut", + "viewcoursereport": "Afficher le rapport du cours" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/he.json b/www/addons/coursecompletion/lang/he.json index 021aaa2b398..dca12273f76 100644 --- a/www/addons/coursecompletion/lang/he.json +++ b/www/addons/coursecompletion/lang/he.json @@ -1,20 +1,20 @@ { - "complete": "הושלם", + "complete": "השלמה", "completecourse": "השלמת קורס", "completed": "הושלם", "completiondate": "תאריך השלמה", - "coursecompletion": "השלמת הקורס", - "criteria": "תנאי", - "criteriagroup": "קבוצת תנאים", - "criteriarequiredall": "כל התנאים המצויינים מטה נדרשים", - "criteriarequiredany": "לפחות אחד מהתנאים המצויינים מטה נדרשים", - "inprogress": "בלמידה", - "manualselfcompletion": "השלמה עצמאית ידנית", - "notyetstarted": "עדיין לא התחיל", - "pending": "בתהליך למידה", - "required": "דרוש", - "requiredcriteria": "תנאי נדרש", + "coursecompletion": "השלמת קורס", + "criteria": "מדד־הערכה", + "criteriagroup": "קבוצת מדדיי־הערכה", + "criteriarequiredall": "כל מדדיי־הערכה להלן נדרשים", + "criteriarequiredany": "אחד ממדדיי־הערכה להלן נדרש", + "inprogress": "בתהליך", + "manualselfcompletion": "הזנת השלמה עצמית", + "notyetstarted": "עדיין לא החל", + "pending": "בהמתנה", + "required": "נדרש", + "requiredcriteria": "מדד־הערכה נדרש", "requirement": "דרישה", - "status": "סטטוס ההישג", + "status": "מצב", "viewcoursereport": "צפיה בדוח הקורס" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/it.json b/www/addons/coursecompletion/lang/it.json index 85d2a1d7320..6521061e031 100644 --- a/www/addons/coursecompletion/lang/it.json +++ b/www/addons/coursecompletion/lang/it.json @@ -1,21 +1,21 @@ { - "complete": "Completo", + "complete": "Completato", "completecourse": "Corso completato", - "completed": "Completata", + "completed": "Completato", "completiondate": "Data di completamento", "couldnotloadreport": "Non è stato possibile caricare il report di completamento del corso, per favore riporva.", - "coursecompletion": "Completamento corso", + "coursecompletion": "Completamento del corso", "criteria": "Criteri", "criteriagroup": "Gruppo di criteri", "criteriarequiredall": "E' richiesto il soddisfacimento di tutti i criteri elencati", "criteriarequiredany": "E' richiesto il soddisfacimento di almeno uno dei criteri elencati", - "inprogress": "In corso", + "inprogress": "In svolgimento", "manualselfcompletion": "Conferma personale di completamento", - "notyetstarted": "Non ancora iniziato", + "notyetstarted": "Non iniziato", "pending": "In attesa", - "required": "Obbligatorio", + "required": "Da soddisfare", "requiredcriteria": "Criteri da soddisfare", "requirement": "Requisito", - "status": "Stato badge", - "viewcoursereport": "Visualizza il report del corso" + "status": "Stato", + "viewcoursereport": "Visualizza report del corso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ja.json b/www/addons/coursecompletion/lang/ja.json index df8a2b8634d..344ea673aea 100644 --- a/www/addons/coursecompletion/lang/ja.json +++ b/www/addons/coursecompletion/lang/ja.json @@ -1,21 +1,21 @@ { - "complete": "詳細", + "complete": "完了", "completecourse": "コース完了", - "completed": "完了", + "completed": "完了しました", "completiondate": "完了した日", "couldnotloadreport": "コース完了の読み込みができませんでした。後でもう一度試してください。", - "coursecompletion": "ユーザはこのコースを完了する必要があります。", + "coursecompletion": "コース完了", "criteria": "クライテリア", "criteriagroup": "クライテリアグループ", - "criteriarequiredall": "下記のクライテリアすべてが必須である", - "criteriarequiredany": "下記いくつかのクライテリアが必須である", + "criteriarequiredall": "以下すべてのクライテリアが必要", + "criteriarequiredany": "以下のクライテリアいずれかが必要", "inprogress": "進行中", - "manualselfcompletion": "手動による自己完了", - "notyetstarted": "未開始", - "pending": "保留", - "required": "必須", - "requiredcriteria": "必須クライテリア", + "manualselfcompletion": "手動自己完了", + "notyetstarted": "まだ開始されていない", + "pending": "保留中", + "required": "必要な", + "requiredcriteria": "必要なクライテリア", "requirement": "要求", - "status": "ステータス", - "viewcoursereport": "コースレポートを表示する" + "status": "状態", + "viewcoursereport": "コースレポートを見る" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/nl.json b/www/addons/coursecompletion/lang/nl.json index e8fdb985c1f..78f31da0ac9 100644 --- a/www/addons/coursecompletion/lang/nl.json +++ b/www/addons/coursecompletion/lang/nl.json @@ -1,21 +1,21 @@ { - "complete": "Voltooid", + "complete": "Voltooi", "completecourse": "Voltooi cursus", - "completed": "Volledig", + "completed": "Voltooid", "completiondate": "Voltooiingsdatum", "couldnotloadreport": "Kon het voltooiingsrapport van de cursus niet laden. Probeer later opnieuw.", - "coursecompletion": "Cursus voltooien", + "coursecompletion": "Cursus voltooiing", "criteria": "Criteria", "criteriagroup": "Criteria groep", "criteriarequiredall": "Alle onderstaande criteria zijn vereist", - "criteriarequiredany": "Al onderstaande criteria zijn vereist", - "inprogress": "Actief", - "manualselfcompletion": "Manueel voltooien", - "notyetstarted": "Nog niet begonnen", - "pending": "Bezig", - "required": "Verplicht", + "criteriarequiredany": "Alle onderstaande criteria zijn vereist", + "inprogress": "Bezig", + "manualselfcompletion": "Handmatige zelf-voltooiing", + "notyetstarted": "Nog niet gestart", + "pending": "Nog bezig", + "required": "Vereist", "requiredcriteria": "Vereiste criteria", "requirement": "Vereiste", - "status": "Badge status", + "status": "Status", "viewcoursereport": "Bekijk cursusrapport" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/ru.json b/www/addons/coursecompletion/lang/ru.json index 1c6b6de220a..dbd50c8ad09 100644 --- a/www/addons/coursecompletion/lang/ru.json +++ b/www/addons/coursecompletion/lang/ru.json @@ -1,20 +1,20 @@ { - "complete": "Завершено", + "complete": "Завершить", "completecourse": "Завершить курс", - "completed": "Выполнено", + "completed": "Завершен", "completiondate": "Дата завершения", - "coursecompletion": "Окончание курса", + "coursecompletion": "Завершение курса", "criteria": "Критерии", - "criteriagroup": "Группа критериев", - "criteriarequiredall": "Требуются соответствие всем указанным ниже критериям", - "criteriarequiredany": "Требуется соответствие любому из указанных ниже критериев", - "inprogress": "В процессе", - "manualselfcompletion": "Пользователь может сам поставить отметку о выполнении", - "notyetstarted": "Еще не началось", - "pending": "Ожидается", - "required": "Необходимо заполнить", + "criteriagroup": "Критерии группы", + "criteriarequiredall": "Все приведенные ниже критерии являются обязательными", + "criteriarequiredany": "Некоторые из нижеуказанных критериев обязательны", + "inprogress": "В прогрессе", + "manualselfcompletion": "Ручное самостоятельное завершение", + "notyetstarted": "Еще не начался", + "pending": "На рассмотрении", + "required": "Необходимый", "requiredcriteria": "Необходимые критерии", "requirement": "Требование", - "status": "Статус значка", - "viewcoursereport": "Просмотреть отчет по курсу" + "status": "Статус", + "viewcoursereport": "Посмотреть отчет курса" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sr-cr.json b/www/addons/coursecompletion/lang/sr-cr.json index 26e18b26b42..610e78602a3 100644 --- a/www/addons/coursecompletion/lang/sr-cr.json +++ b/www/addons/coursecompletion/lang/sr-cr.json @@ -1,21 +1,21 @@ { - "complete": "Потпуно", + "complete": "Заврши", "completecourse": "Заврши курс", "completed": "Завршено", "completiondate": "Датум завршетка", "couldnotloadreport": "Није могуће учитати извештај о завршетку курса. Молимо вас, покушајте поново касније.", - "coursecompletion": "Завршеност курса", + "coursecompletion": "Завршетак курса", "criteria": "Критеријуми", "criteriagroup": "Група критеријума", "criteriarequiredall": "Сви доле наведени критеријуми су неопходни", "criteriarequiredany": "Било који од доле наведених критеријума је неопходан", "inprogress": "У току", "manualselfcompletion": "Ручни самостални завршетак", - "notyetstarted": "Није још почео", - "pending": "Не чекању", - "required": "Обавезно", - "requiredcriteria": "Обавезни критеријуми", + "notyetstarted": "Још није започето", + "pending": "На чекању", + "required": "Неопходно", + "requiredcriteria": "Неопходни критеријуми", "requirement": "Услов", - "status": "Статус беџа", + "status": "Статус", "viewcoursereport": "Прикажи извештај са курса" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sr-lt.json b/www/addons/coursecompletion/lang/sr-lt.json index 89da4bf9058..6553f9f3960 100644 --- a/www/addons/coursecompletion/lang/sr-lt.json +++ b/www/addons/coursecompletion/lang/sr-lt.json @@ -1,21 +1,21 @@ { - "complete": "Potpuno", + "complete": "Završi", "completecourse": "Završi kurs", "completed": "Završeno", "completiondate": "Datum završetka", "couldnotloadreport": "Nije moguće učitati izveštaj o završetku kursa. Molimo vas, pokušajte ponovo kasnije.", - "coursecompletion": "Završenost kursa", + "coursecompletion": "Završetak kursa", "criteria": "Kriterijumi", "criteriagroup": "Grupa kriterijuma", "criteriarequiredall": "Svi dole navedeni kriterijumi su neophodni", "criteriarequiredany": "Bilo koji od dole navedenih kriterijuma je neophodan", "inprogress": "U toku", "manualselfcompletion": "Ručni samostalni završetak", - "notyetstarted": "Nije još počeo", - "pending": "Ne čekanju", - "required": "Obavezno", - "requiredcriteria": "Obavezni kriterijumi", + "notyetstarted": "Još nije započeto", + "pending": "Na čekanju", + "required": "Neophodno", + "requiredcriteria": "Neophodni kriterijumi", "requirement": "Uslov", - "status": "Status bedža", + "status": "Status", "viewcoursereport": "Prikaži izveštaj sa kursa" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/sv.json b/www/addons/coursecompletion/lang/sv.json index df193278ade..1a9665c3d8e 100644 --- a/www/addons/coursecompletion/lang/sv.json +++ b/www/addons/coursecompletion/lang/sv.json @@ -1,21 +1,21 @@ { "complete": "Komplett", "completecourse": "", - "completed": "Slutfört", + "completed": "Fullföljt", "completiondate": "Datum för fullföljande", "couldnotloadreport": "Det gick inte att läsa in rapporten för fullföljande av kursen, vänligen försök igen senare .", - "coursecompletion": "Fullgörande av kurs", - "criteria": "Kriterier", - "criteriagroup": "Kriterier för grupp", - "criteriarequiredall": "Alla kriterier är obligatoriska", - "criteriarequiredany": "Alla kriterier nedan är obligatoriska", - "inprogress": "Pågår", - "manualselfcompletion": "Studenten markerar själv som fullföljd", - "notyetstarted": "Har ännu inte påbörjats", + "coursecompletion": "Fullföljande av kurs", + "criteria": "Villkor", + "criteriagroup": "Villkor grupp", + "criteriarequiredall": "Alla villkor nedan måste vara uppfyllda", + "criteriarequiredany": "Något villkor nedan måste vara uppfylld", + "inprogress": "Pågående", + "manualselfcompletion": "Manuell fullföljande av deltagare", + "notyetstarted": "Ännu inte börjat", "pending": "Avvaktar", "required": "Obligatorisk", - "requiredcriteria": "Obligatoriskt kriterium", + "requiredcriteria": "Obligatorisk villkor", "requirement": "Krav", - "status": "Status för märke", + "status": "Status", "viewcoursereport": "Visa kursrapport" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/uk.json b/www/addons/coursecompletion/lang/uk.json index 8078ba36f3d..790fda5169e 100644 --- a/www/addons/coursecompletion/lang/uk.json +++ b/www/addons/coursecompletion/lang/uk.json @@ -1,21 +1,21 @@ { - "complete": "Завершено", + "complete": "Завершити", "completecourse": "Завершити курсу", - "completed": "Виконано", + "completed": "Завершено", "completiondate": "Дата завершення", "couldnotloadreport": "Не вдалося завантажити звіт про закінчення курсу, будь ласка, спробуйте ще раз пізніше.", - "coursecompletion": "Курс закінчено", - "criteria": "Критерій", + "coursecompletion": "Завершення курсу", + "criteria": "Критерія", "criteriagroup": "Група критеріїв", - "criteriarequiredall": "Потрібна відповідність всім вказаним критеріям", - "criteriarequiredany": "Потрібна відповідність будь-якому критерію", - "inprogress": "В процесі", - "manualselfcompletion": "Самореєстрація завершення", - "notyetstarted": "Ще не почато", - "pending": "Очікується", - "required": "Необхідні", - "requiredcriteria": "Необхідний критерій", + "criteriarequiredall": "Всі критерії нижче обов'язкові", + "criteriarequiredany": "Будь-яка критерія нижче обов'язкова", + "inprogress": "В процесі...", + "manualselfcompletion": "Самостійне завершення", + "notyetstarted": "Не розпочато", + "pending": "В очікуванні", + "required": "Необхідно", + "requiredcriteria": "Необхідна критерія", "requirement": "Вимога", - "status": "Статус відзнаки", + "status": "Статус", "viewcoursereport": "Переглянути звіт курсу" } \ No newline at end of file diff --git a/www/addons/files/lang/ar.json b/www/addons/files/lang/ar.json index 2ab44cda49c..3521b2b6f32 100644 --- a/www/addons/files/lang/ar.json +++ b/www/addons/files/lang/ar.json @@ -4,5 +4,5 @@ "files": "ملفات", "privatefiles": "ملفات خاصة", "sitefiles": "ملفات الموقع", - "uploadfiles": "إرسل ملفات التغذية الراجعة" + "uploadfiles": "رفع ملفات" } \ No newline at end of file diff --git a/www/addons/files/lang/cs.json b/www/addons/files/lang/cs.json index becf830a35d..2336beb6bc4 100644 --- a/www/addons/files/lang/cs.json +++ b/www/addons/files/lang/cs.json @@ -2,12 +2,12 @@ "admindisableddownload": "Upozorňujeme, že správce Moodle zakázal stahování souborů, soubory si můžete prohlížet, ale ne stáhnout.", "clicktoupload": "Kliknutím na tlačítko níže nahrát soubory do vašich osobních souborů.", "couldnotloadfiles": "Seznam souborů, které nelze načíst .", - "emptyfilelist": "Žádný soubor k zobrazení", + "emptyfilelist": "Žádný soubor k zobrazení.", "erroruploadnotworking": "Bohužel v současné době není možné nahrávat na stránky vašeho Moodle.", "files": "Soubory", "myprivatefilesdesc": "Soubory, které jsou dostupné v soukromé oblasti na těchto stránkách Moodle.", "privatefiles": "Osobní soubory", "sitefiles": "Soubory stránek", "sitefilesdesc": "Další soubory, které jsou dostupné na těchto stránkách Moodle.", - "uploadfiles": "Poslat zpětnovazební soubory" + "uploadfiles": "Nahrát soubory" } \ No newline at end of file diff --git a/www/addons/files/lang/da.json b/www/addons/files/lang/da.json index 5f9d7d54b3b..1453d08f9f7 100644 --- a/www/addons/files/lang/da.json +++ b/www/addons/files/lang/da.json @@ -2,12 +2,12 @@ "admindisableddownload": "Bemærk venligst at din Moodleadministrator har deaktiveret download af filer. Du kan se filerne men ikke downloade dem.", "clicktoupload": "Klik på knappen nedenfor for at uploade filer til dine private filer.", "couldnotloadfiles": "Fillisten kunne ikke hentes", - "emptyfilelist": "Der er ingen filer at vise", + "emptyfilelist": "Der er ingen filer at vise.", "erroruploadnotworking": "Desværre er det p.t. ikke muligt at uploade filer til dit site.", "files": "Filer", "myprivatefilesdesc": "Filerne som er tilgængelige i dit private område på dette Moodlewebsted.", "privatefiles": "Private filer", "sitefiles": "Site filer", "sitefilesdesc": "De andre filer som er tilgængelige for dig på denne Moodlewebside.", - "uploadfiles": "Send feedbackfiler" + "uploadfiles": "Upload filer" } \ No newline at end of file diff --git a/www/addons/files/lang/de.json b/www/addons/files/lang/de.json index 16517d7cc60..39a046af215 100644 --- a/www/addons/files/lang/de.json +++ b/www/addons/files/lang/de.json @@ -2,12 +2,12 @@ "admindisableddownload": "Das Herunterladen von Dateien ist deaktiviert. Sie können nur die Dateiliste sehen.", "clicktoupload": "Tippen Sie auf die Taste, um Dateien in 'Meine Dateien' hochzuladen.", "couldnotloadfiles": "Die Dateiliste konnte nicht geladen werden.", - "emptyfilelist": "Es liegen keine Dateien vor", + "emptyfilelist": "Keine Dateien", "erroruploadnotworking": "Im Moment können keine Dateien zur Website hochgeladen werden.", "files": "Dateien", "myprivatefilesdesc": "Diese Dateien liegen in Ihrem persönlichen Bereich auf dieser Website.", "privatefiles": "Meine Dateien", "sitefiles": "Dateien", "sitefilesdesc": "Weitere Dateien, die für Sie in anderen Bereichen der Website verfügbar sind.", - "uploadfiles": "Feedbackdateien senden" + "uploadfiles": "Dateien hochladen" } \ No newline at end of file diff --git a/www/addons/files/lang/el.json b/www/addons/files/lang/el.json index 105bb0c0877..8f435d24e4f 100644 --- a/www/addons/files/lang/el.json +++ b/www/addons/files/lang/el.json @@ -9,5 +9,5 @@ "privatefiles": "Προσωπικά αρχεία", "sitefiles": "Αρχεία του ιστοχώρου", "sitefilesdesc": "Άλλα αρχεία που είναι στη διάθεσή σας σε αυτό το site Moodle.", - "uploadfiles": "Αποστολή αρχείου ανατροφοδότησης" + "uploadfiles": "Μεταφορτώστε αρχεία" } \ No newline at end of file diff --git a/www/addons/files/lang/es.json b/www/addons/files/lang/es.json index 7521ea196f2..cca19793086 100644 --- a/www/addons/files/lang/es.json +++ b/www/addons/files/lang/es.json @@ -9,5 +9,5 @@ "privatefiles": "Ficheros privados", "sitefiles": "Archivos del sitio", "sitefilesdesc": "Los otros archivos que están disponibles para Usted en este sitio Moodle.", - "uploadfiles": "Mandar archivos de retroalimentación" + "uploadfiles": "Subir archivos" } \ No newline at end of file diff --git a/www/addons/files/lang/eu.json b/www/addons/files/lang/eu.json index 4648a027001..30106de97bd 100644 --- a/www/addons/files/lang/eu.json +++ b/www/addons/files/lang/eu.json @@ -2,12 +2,12 @@ "admindisableddownload": "Mesedez ohartu zaitez zure Moodle administratzaileak fitxategien jaitsiera ezgaitu duela, fitxategiak arakatu ditzakezu baina ezin dituzu jaitsi.", "clicktoupload": "Klik egin beheko botoian fitxategiak zure gune pribatura igotzeko.", "couldnotloadfiles": "Ezin izan da fitxategien zerrenda kargatu.", - "emptyfilelist": "Ez dago erakusteko fitxategirik", + "emptyfilelist": "Ez dago fitxategirik erakusteko.", "erroruploadnotworking": "Zoritxarrez une honetan ezin dira fitxategiak zure gunera igo.", "files": "Fitxategiak", "myprivatefilesdesc": "Moodle gune honetako zure gune pribatuan eskuragarri dauden fitxategiak.", "privatefiles": "Fitxategi pribatuak", "sitefiles": "Guneko fitxategiak", "sitefilesdesc": "Zure Moodle gunean eskuragarri dauden beste fitxategiak.", - "uploadfiles": "bidali feedback-fitxategiak" + "uploadfiles": "Igo fitxategiak" } \ No newline at end of file diff --git a/www/addons/files/lang/fr.json b/www/addons/files/lang/fr.json index ce819c482cb..a1237a3feeb 100644 --- a/www/addons/files/lang/fr.json +++ b/www/addons/files/lang/fr.json @@ -2,12 +2,12 @@ "admindisableddownload": "L'administrateur de votre Moodle a désactivé le téléchargement des fichiers. Vous pouvez les consulter, mais pas les télécharger.", "clicktoupload": "Cliquer sur le bouton ci-dessous pour déposer les fichiers dans vos fichiers personnels.", "couldnotloadfiles": "La liste des fichiers n'a pas pu être chargée.", - "emptyfilelist": "Il n'y a pas de fichier à afficher", + "emptyfilelist": "Aucun fichier à afficher.", "erroruploadnotworking": "Il n'est actuellement pas possible de déposer des fichiers sur votre site.", "files": "Fichiers", "myprivatefilesdesc": "Les fichiers disponibles dans votre zone privée sur cette plateforme Moodle.", "privatefiles": "Fichiers personnels", "sitefiles": "Fichiers du site", "sitefilesdesc": "Les autres fichiers disponibles sur cette plateforme Moodle.", - "uploadfiles": "Envoyer des fichiers de feedback" + "uploadfiles": "Déposer des fichiers" } \ No newline at end of file diff --git a/www/addons/files/lang/he.json b/www/addons/files/lang/he.json index 6f612548ac8..0ed31567503 100644 --- a/www/addons/files/lang/he.json +++ b/www/addons/files/lang/he.json @@ -2,7 +2,7 @@ "admindisableddownload": "יש לשים לב כי מנהל/ת אתר המוודל שלך, ביטל/ה את אפשרות להורדת הקבצים. באפשרותך לעיין בקבצים אך לא להורידם.", "clicktoupload": "להעלאת הקבצים לקבצים הפרטיים שלך, יש להקליק על הכפתור למטה.", "couldnotloadfiles": "לא ניתן לטעון את רשימת הקבצים.", - "emptyfilelist": "אין קבצים להציג", + "emptyfilelist": "אין קבצים להצגה.", "files": "קבצים", "myprivatefilesdesc": "הקבצים הזמינים לך באזור הפרטי באתר מוודל זה.", "privatefiles": "הקבצים שלי", diff --git a/www/addons/files/lang/it.json b/www/addons/files/lang/it.json index d9b1f96d205..3f198893008 100644 --- a/www/addons/files/lang/it.json +++ b/www/addons/files/lang/it.json @@ -2,12 +2,12 @@ "admindisableddownload": "L'amministratore del sito Moodle ha disabilitato il download dei file. Puoi navigare tra i file ma non potrai scaricarli.", "clicktoupload": "Fai click sul pulsante sotto per caricare i file nei File personali", "couldnotloadfiles": "Non è stato possibile caricare l'elenco dei file.", - "emptyfilelist": "Non ci sono file da visualizzare", + "emptyfilelist": "Non ci sono file da visualizzare.", "erroruploadnotworking": "Al momento non è possibile caricare file sul sito.", "files": "File", "myprivatefilesdesc": "I file memorizzati nell'omonima area di Moodle", "privatefiles": "File personali", "sitefiles": "File del sito", "sitefilesdesc": "Altri file del sito Moodle ai quali puoi accedere.", - "uploadfiles": "Invia file di commento" + "uploadfiles": "Carica file" } \ No newline at end of file diff --git a/www/addons/files/lang/ja.json b/www/addons/files/lang/ja.json index 648ed7d331a..de63504d659 100644 --- a/www/addons/files/lang/ja.json +++ b/www/addons/files/lang/ja.json @@ -2,12 +2,12 @@ "admindisableddownload": "あなたのMoodle管理者に、ファイルのダウンロードを無効にするよう知らせてください。そうすれば、ファイルをデバイスにダウンロードせず閲覧のみにすることができます。", "clicktoupload": "ファイルをあなたのプライベートファイル領域にアップロードするには、下のボタンをクリックしてください。", "couldnotloadfiles": "以下のファイルが読み込みできませんでした。", - "emptyfilelist": "表示するファイルはありません。", + "emptyfilelist": "表示するファイルがありません。", "erroruploadnotworking": "残念ながら、現在、あなたのサイトにファイルをアップロードすることはできません。", "files": "ファイル", "myprivatefilesdesc": "ファイルはMoodleサイト上のあなたのプライベート領域にあります。", "privatefiles": "プライベートファイル", "sitefiles": "サイトファイル", "sitefilesdesc": "本Moodleサイトであなたが利用できる他のファイル", - "uploadfiles": "フィードバックファイルを送信する" + "uploadfiles": "アップロードファイル" } \ No newline at end of file diff --git a/www/addons/files/lang/nl.json b/www/addons/files/lang/nl.json index e4f5e1dc248..2b091df63b0 100644 --- a/www/addons/files/lang/nl.json +++ b/www/addons/files/lang/nl.json @@ -2,12 +2,12 @@ "admindisableddownload": "Je Moodle beheerder heeft het downloaden van bestanden uitgeschakeld. Je kunt door de bestandenlijst bladeren, maar ze niet downloaden.", "clicktoupload": "Klik op onderstaande knop om bestanden naar je privé-bestanden te uploaden.", "couldnotloadfiles": "De bestandenlijst kon niet geladen worden.", - "emptyfilelist": "Er zijn geen bestanden om te tonen", + "emptyfilelist": "Er zijn geen bestanden te tonen.", "erroruploadnotworking": "Jammer genoeg kun je op dit ogenblik geen bestanden uploaden naar de site.", "files": "Bestanden", "myprivatefilesdesc": "Jouw bestanden op deze Moodle-site.", "privatefiles": "Privébestanden", "sitefiles": "Sitebestanden", "sitefilesdesc": "Andere bestanden op deze Moodle-site.", - "uploadfiles": "Stuur feedbackbestanden" + "uploadfiles": "Bestanden uploaden" } \ No newline at end of file diff --git a/www/addons/files/lang/ru.json b/www/addons/files/lang/ru.json index 10418095e77..7da775bb875 100644 --- a/www/addons/files/lang/ru.json +++ b/www/addons/files/lang/ru.json @@ -8,5 +8,5 @@ "privatefiles": "Личные файлы", "sitefiles": "Файлы сайта", "sitefilesdesc": "Другие файлы, доступные на этом сайте Moodle", - "uploadfiles": "Отправить файлы с отзывами" + "uploadfiles": "Загрузка файлов" } \ No newline at end of file diff --git a/www/addons/files/lang/sr-cr.json b/www/addons/files/lang/sr-cr.json index 8fad2e69c6e..7e6b552125d 100644 --- a/www/addons/files/lang/sr-cr.json +++ b/www/addons/files/lang/sr-cr.json @@ -2,12 +2,12 @@ "admindisableddownload": "Имајте у виду да је ваш Moodle администратор онемогућио преузимање датотека. Датотеке можете да прегледате, али не и да их преузмете.", "clicktoupload": "Кликните на доње дугме како бисте отпремили датотеке међу своје приватне датотеке.", "couldnotloadfiles": "Списак датотека не може бити учитан.", - "emptyfilelist": "Нема датотека за приказ", + "emptyfilelist": "Нема датотека за приказ.", "erroruploadnotworking": "Нажалост, тренутно није могуће отпремити датотеке на ваш сајт.", "files": "Датотеке", "myprivatefilesdesc": "Датотеке које су доступне у вашем приватном простору на овом Moodle сајту.", "privatefiles": "Приватне датотеке", "sitefiles": "Датотеке сајта", "sitefilesdesc": "Остале датотеке које су доступне на овом Moodle сајту.", - "uploadfiles": "Пошаљи датотеке са повратним информацијама" + "uploadfiles": "Отпреми датотеке" } \ No newline at end of file diff --git a/www/addons/files/lang/sr-lt.json b/www/addons/files/lang/sr-lt.json index 2375580de0e..8779139baab 100644 --- a/www/addons/files/lang/sr-lt.json +++ b/www/addons/files/lang/sr-lt.json @@ -2,12 +2,12 @@ "admindisableddownload": "Imajte u vidu da je vaš Moodle administrator onemogućio preuzimanje datoteka. Datoteke možete da pregledate, ali ne i da ih preuzmete.", "clicktoupload": "Kliknite na donje dugme kako biste otpremili datoteke među svoje privatne datoteke.", "couldnotloadfiles": "Spisak datoteka ne može biti učitan.", - "emptyfilelist": "Nema datoteka za prikaz", + "emptyfilelist": "Nema datoteka za prikaz.", "erroruploadnotworking": "Nažalost, trenutno nije moguće otpremiti datoteke na vaš sajt.", "files": "Datoteke", "myprivatefilesdesc": "Datoteke koje su dostupne u vašem privatnom prostoru na ovom Moodle sajtu.", "privatefiles": "Privatne datoteke", "sitefiles": "Datoteke sajta", "sitefilesdesc": "Ostale datoteke koje su dostupne na ovom Moodle sajtu.", - "uploadfiles": "Pošalji datoteke sa povratnim informacijama" + "uploadfiles": "Otpremi datoteke" } \ No newline at end of file diff --git a/www/addons/files/lang/uk.json b/www/addons/files/lang/uk.json index 4043adc3905..083a9f56194 100644 --- a/www/addons/files/lang/uk.json +++ b/www/addons/files/lang/uk.json @@ -2,12 +2,12 @@ "admindisableddownload": "Зверніть увагу, що ваш адміністратор Moodle відключив завантаження файлів. Ви можете переглядати файли, але не завантажувати їх.", "clicktoupload": "Натисніть на кнопку нижче, щоб завантажити ваші особисті файли.", "couldnotloadfiles": "Список файлів не може бути завантажений.", - "emptyfilelist": "Немає файлів для показу", + "emptyfilelist": "Немає файлів для показу.", "erroruploadnotworking": "На жаль, в даний час не представляється можливим завантажувати файли на ваш сайт.", "files": "Файли", "myprivatefilesdesc": "Файли, які доступні у приватній області на цьому сайті Moodle.", "privatefiles": "Особисті файли", "sitefiles": "Файли сайту", "sitefilesdesc": "Інші файли, які доступні для вас на цьому сайті Moodle.", - "uploadfiles": "Надіслати файл-відгук(и)" + "uploadfiles": "Завантажити файли" } \ No newline at end of file diff --git a/www/addons/messages/lang/ar.json b/www/addons/messages/lang/ar.json index 81750633333..5d656811d75 100644 --- a/www/addons/messages/lang/ar.json +++ b/www/addons/messages/lang/ar.json @@ -10,8 +10,8 @@ "messages": "رسائل", "mustbeonlinetosendmessages": "لابد أن تكون متصل بالأنترنت لكي ترسل أي رسائل", "newmessage": "رسالة جديدة", - "nomessages": "لا توجد رسائل بعد", - "nousersfound": "لا يوجد مستخدمون", + "nomessages": "لا يوجد رسائل", + "nousersfound": "لا يوجد مستخدمين", "removecontact": "ازل عنوان الاتصال", "send": "إرسال", "sendmessage": "إرسل رسالة", diff --git a/www/addons/messages/lang/cs.json b/www/addons/messages/lang/cs.json index 18c655d4826..d3aa98a5834 100644 --- a/www/addons/messages/lang/cs.json +++ b/www/addons/messages/lang/cs.json @@ -18,10 +18,10 @@ "messagepreferences": "Nastavení zpráv", "messages": "Zprávy", "mustbeonlinetosendmessages": "Pro odesílání zpráv musíte být online", - "newmessage": "Nová zpráva", + "newmessage": "Nová zpráva...", "newmessages": "Nové zprávy", - "nomessages": "Zatím žádné zprávy", - "nousersfound": "Nenalezeni žádní uživatelé", + "nomessages": "Žádné zprávy.", + "nousersfound": "Nebyl nalezen žádný uživatel", "removecontact": "Odebrat kontakt", "removecontactconfirm": "Kontakt bude odstraněn ze seznamu kontaktů.", "send": "Odeslat", diff --git a/www/addons/messages/lang/da.json b/www/addons/messages/lang/da.json index 0449e80699a..c05ede1157e 100644 --- a/www/addons/messages/lang/da.json +++ b/www/addons/messages/lang/da.json @@ -16,8 +16,8 @@ "messagepreferences": "Indstillinger for beskeder", "messages": "Beskeder", "mustbeonlinetosendmessages": "Du skal være online for at sende beskeder", - "newmessage": "Ny besked", - "nomessages": "Ingen beskeder endnu", + "newmessage": "Ny besked...", + "nomessages": "Ingen besked.", "nousersfound": "Ingen brugere fundet", "removecontact": "Fjern kontakt", "send": "Send", diff --git a/www/addons/messages/lang/de.json b/www/addons/messages/lang/de.json index 6deac3f090b..6a5fde2d14d 100644 --- a/www/addons/messages/lang/de.json +++ b/www/addons/messages/lang/de.json @@ -18,10 +18,10 @@ "messagepreferences": "Mitteilungen", "messages": "Mitteilungen", "mustbeonlinetosendmessages": "Sie müssen online sein, um Mitteilungen zu senden", - "newmessage": "Neue Mitteilung", + "newmessage": "Neue Mitteilung ...", "newmessages": "Neue Mitteilungen", "nomessages": "Keine Mitteilungen", - "nousersfound": "Keine Nutzer/innen gefunden", + "nousersfound": "Keine Personen gefunden", "removecontact": "Kontakt entfernen", "removecontactconfirm": "Der Kontakt wird aus Ihrer Kontaktliste gelöscht.", "send": "Senden", diff --git a/www/addons/messages/lang/el.json b/www/addons/messages/lang/el.json index 714e6df2eb0..894c8fd4a8c 100644 --- a/www/addons/messages/lang/el.json +++ b/www/addons/messages/lang/el.json @@ -16,10 +16,10 @@ "messagepreferences": "Προτιμήσεις μηνύματος", "messages": "Μηνύματα", "mustbeonlinetosendmessages": "Πρέπει να είστε συνδεδεμένοι για να στείλετε μηνύματα", - "newmessage": "Νέο μήνυμα", + "newmessage": "Νέο μήνυμα...", "newmessages": "Νέα μηνύματα", - "nomessages": "Δεν υπάρχουν ακόμα μηνύματα", - "nousersfound": "Δε βρέθηκαν χρήστες", + "nomessages": "Κανένα μήνυμα.", + "nousersfound": "Δεν βρέθηκαν χρήστες", "removecontact": "Αφαίρεσε την επαφή", "removecontactconfirm": "Η επαφή θα καταργηθεί από τη λίστα επαφών σας.", "send": "Αποστολή", diff --git a/www/addons/messages/lang/es.json b/www/addons/messages/lang/es.json index 351337a98eb..129117cec61 100644 --- a/www/addons/messages/lang/es.json +++ b/www/addons/messages/lang/es.json @@ -18,9 +18,9 @@ "messagepreferences": "Preferencias de mensajes", "messages": "Mensajes", "mustbeonlinetosendmessages": "Debe conectarse para enviar mensajes", - "newmessage": "Nuevo mensaje", + "newmessage": "Nuevo mensaje...", "newmessages": "Nuevos mensajes", - "nomessages": "Aún no hay mensajes", + "nomessages": "No hay mensajes en espera", "nousersfound": "No se encuentran usuarios", "removecontact": "Eliminar contacto", "removecontactconfirm": "El contacto se eliminará de su lista de contactos.", diff --git a/www/addons/messages/lang/eu.json b/www/addons/messages/lang/eu.json index 0da6ce51bb0..7b4d166b262 100644 --- a/www/addons/messages/lang/eu.json +++ b/www/addons/messages/lang/eu.json @@ -18,9 +18,9 @@ "messagepreferences": "Mezuen hobespenak", "messages": "Mezuak", "mustbeonlinetosendmessages": "Online egon behar zara mezuak bidaltzeko.", - "newmessage": "Mezu berria", + "newmessage": "Mezu berria...", "newmessages": "Mezu beriak", - "nomessages": "Ez dago mezurik oraindik", + "nomessages": "Mezurik ez.", "nousersfound": "Ez da erabiltzailerik aurkitu", "removecontact": "Ezabatu kontaktua", "removecontactconfirm": "Kontaktua zure kontaktuen zerrendatik ezabatuko da.", diff --git a/www/addons/messages/lang/fr.json b/www/addons/messages/lang/fr.json index 454057f6d63..90f17d9f58f 100644 --- a/www/addons/messages/lang/fr.json +++ b/www/addons/messages/lang/fr.json @@ -18,10 +18,10 @@ "messagepreferences": "Préférences des messages", "messages": "Messages personnels", "mustbeonlinetosendmessages": "Vous devez être en ligne pour envoyer des messages", - "newmessage": "Nouveau message", + "newmessage": "Nouveau message...", "newmessages": "Nouveaux messages", - "nomessages": "Pas encore de messages", - "nousersfound": "Aucun utilisateur n'a été trouvé", + "nomessages": "Aucun message.", + "nousersfound": "Aucun utilisateur trouvé", "removecontact": "Supprimer ce contact", "removecontactconfirm": "Le contact sera retiré de votre liste.", "send": "Envoyer", diff --git a/www/addons/messages/lang/he.json b/www/addons/messages/lang/he.json index 9cc287e1b26..b0db251c2c8 100644 --- a/www/addons/messages/lang/he.json +++ b/www/addons/messages/lang/he.json @@ -15,9 +15,9 @@ "messagepreferences": "העדפות מסרים", "messages": "מסרים", "mustbeonlinetosendmessages": "עליך להיות מחובר/ת בכדי לשלוח מסר.", - "newmessage": "הודעה חדשה", - "nomessages": "אין הודעות עדיין", - "nousersfound": "לתשומת-לב", + "newmessage": "מסר חדש...", + "nomessages": "אין מסרים.", + "nousersfound": "לא נמצאו משתמשים", "removecontact": "הסרת איש הקשר", "send": "לשלוח", "sendmessage": "שליחת מסר", diff --git a/www/addons/messages/lang/it.json b/www/addons/messages/lang/it.json index 6acc19d9b7d..9052dd21da0 100644 --- a/www/addons/messages/lang/it.json +++ b/www/addons/messages/lang/it.json @@ -16,9 +16,9 @@ "messagepreferences": "Preferenze messaggi", "messages": "Messaggi", "mustbeonlinetosendmessages": "Per inviare messaggi devi essere online", - "newmessage": "Nuovo messaggio", - "nomessages": "Non ci sono ancora messaggi", - "nousersfound": "Non trovato alcun utente", + "newmessage": "Nuovo messaggio...", + "nomessages": "Non ci sono messaggi.", + "nousersfound": "Non sono stati trovati utenti", "removecontact": "Cancella contatti", "send": "Invia", "sendmessage": "Invia messaggio", diff --git a/www/addons/messages/lang/ja.json b/www/addons/messages/lang/ja.json index da389c600e2..ab1c8913529 100644 --- a/www/addons/messages/lang/ja.json +++ b/www/addons/messages/lang/ja.json @@ -18,10 +18,10 @@ "messagepreferences": "メッセージプリファレンス", "messages": "メッセージ", "mustbeonlinetosendmessages": "メッセージを送信するにはオンラインでなければなりません。", - "newmessage": "新しいメッセージ", + "newmessage": "新規メッセージ...", "newmessages": "新規メッセージ...", - "nomessages": "メッセージはありません。", - "nousersfound": "ユーザは見つかりませんでした。", + "nomessages": "メッセージがありません。", + "nousersfound": "ユーザが見つかりません", "removecontact": "コンタクトから削除する", "removecontactconfirm": "連絡先はあなたの連絡先リストから削除されます。", "send": "送信", diff --git a/www/addons/messages/lang/nl.json b/www/addons/messages/lang/nl.json index 36315f2cc2e..c8e2675c258 100644 --- a/www/addons/messages/lang/nl.json +++ b/www/addons/messages/lang/nl.json @@ -18,9 +18,9 @@ "messagepreferences": "Berichten voorkeuren", "messages": "Berichten", "mustbeonlinetosendmessages": "Je moet online zijn om berichten te versturen", - "newmessage": "Nieuw bericht", + "newmessage": "Nieuw bericht...", "newmessages": "Nieuwe berichten", - "nomessages": "Nog geen berichten", + "nomessages": "Geen berichten.", "nousersfound": "Geen gebruikers gevonden", "removecontact": "Verwijder contactpersoon", "removecontactconfirm": "Contact zal verwijderd worden van je contactenlijst.", diff --git a/www/addons/messages/lang/ru.json b/www/addons/messages/lang/ru.json index 37c1774bd10..4c6677f9138 100644 --- a/www/addons/messages/lang/ru.json +++ b/www/addons/messages/lang/ru.json @@ -16,9 +16,9 @@ "messagepreferences": "Настройки сообщений", "messages": "Сообщения", "mustbeonlinetosendmessages": "Вы должны быть на сайте, чтобы отправлять сообщения", - "newmessage": "Новое сообщение", + "newmessage": "Новое сообщение...", "newmessages": "Новые сообщения", - "nomessages": "Нет ни одного сообщения", + "nomessages": "Нет сообщений", "nousersfound": "Пользователи не найдены", "removecontact": "Удалить собеседника из моего списка", "send": "Отправить", diff --git a/www/addons/messages/lang/sr-cr.json b/www/addons/messages/lang/sr-cr.json index fdd16352919..18a467fa43c 100644 --- a/www/addons/messages/lang/sr-cr.json +++ b/www/addons/messages/lang/sr-cr.json @@ -16,9 +16,9 @@ "messagepreferences": "Параметри порука", "messages": "Поруке", "mustbeonlinetosendmessages": "Морате бити онлајн како бисте слали поруке", - "newmessage": "Нова порука", + "newmessage": "Нове поруке...", "newmessages": "Нове поруке", - "nomessages": "Још нема порука", + "nomessages": "Нема порука.", "nousersfound": "Није пронађен ниједан корисник", "removecontact": "Обриши контакт", "removecontactconfirm": "Особа ће бити уклоњена са ваше листе контаката.", diff --git a/www/addons/messages/lang/sr-lt.json b/www/addons/messages/lang/sr-lt.json index a5c218640e8..3d5a353c5f5 100644 --- a/www/addons/messages/lang/sr-lt.json +++ b/www/addons/messages/lang/sr-lt.json @@ -16,9 +16,9 @@ "messagepreferences": "Parametri poruka", "messages": "Poruke", "mustbeonlinetosendmessages": "Morate biti onlajn kako biste slali poruke", - "newmessage": "Nova poruka", + "newmessage": "Nove poruke...", "newmessages": "Nove poruke", - "nomessages": "Još nema poruka", + "nomessages": "Nema poruka.", "nousersfound": "Nije pronađen nijedan korisnik", "removecontact": "Obriši kontakt", "removecontactconfirm": "Osoba će biti uklonjena sa vaše liste kontakata.", diff --git a/www/addons/messages/lang/sv.json b/www/addons/messages/lang/sv.json index 6a623453331..d17bc0228ef 100644 --- a/www/addons/messages/lang/sv.json +++ b/www/addons/messages/lang/sv.json @@ -16,9 +16,9 @@ "messagepreferences": "Välj inställningar för meddelanden", "messages": "Meddelanden", "mustbeonlinetosendmessages": "Du måste vara online för att skicka meddelanden", - "newmessage": "Nytt meddelande", - "nomessages": "Inga meddelanden än", - "nousersfound": "Det gick inte att hitta några användare", + "newmessage": "Ny meddelande...", + "nomessages": "Inga meddelanden", + "nousersfound": "Inga användare hittades", "removecontact": "Ta bort kontakt", "send": "Skicka", "sendmessage": "Skicka meddelande", diff --git a/www/addons/messages/lang/uk.json b/www/addons/messages/lang/uk.json index 12fc1146ab9..10cf5c336d1 100644 --- a/www/addons/messages/lang/uk.json +++ b/www/addons/messages/lang/uk.json @@ -17,7 +17,7 @@ "mustbeonlinetosendmessages": "Ви повинні бути онлайн, щоб відправляти повідомлення", "newmessage": "Нове повідомлення...", "newmessages": "Нові повідомлення", - "nomessages": "Ще немає повідомлень", + "nomessages": "Повідомлення відсутні.", "nousersfound": "Користувачів не знайдено", "removecontact": "Видалити контакт", "removecontactconfirm": "Контакт буде видалено зі списку контактів.", diff --git a/www/addons/mod/choice/lang/ar.json b/www/addons/mod/choice/lang/ar.json index 60ff70d91f6..507d25fbe0c 100644 --- a/www/addons/mod/choice/lang/ar.json +++ b/www/addons/mod/choice/lang/ar.json @@ -4,7 +4,7 @@ "full": "(كامل)", "noresultsviewable": "حالياً لا يمكن معاينة النتائج", "notopenyet": "عذرا، هذا النشاط سيكون متوفر في {{$a}}", - "numberofuser": "عدد المستخدمين", + "numberofuser": "عدد المشاركين", "numberofuserinpercentage": "عدد المستخدمين كنسبة", "removemychoice": "استبعد خياري", "responses": "إجابات", diff --git a/www/addons/mod/choice/lang/cs.json b/www/addons/mod/choice/lang/cs.json index f9a22aaf32e..aaa5ea9560c 100644 --- a/www/addons/mod/choice/lang/cs.json +++ b/www/addons/mod/choice/lang/cs.json @@ -6,8 +6,8 @@ "full": "(Obsazeno)", "noresultsviewable": "Výsledky nejsou momentálně k dispozici", "notopenyet": "Je nám líto, tato činnost není až do {{$a}} dostupná.", - "numberofuser": "Počet odpovědí", - "numberofuserinpercentage": "Počet odpovědí v procentech", + "numberofuser": "Počet účastníků", + "numberofuserinpercentage": "Procentní podíl účastníků", "previewonly": "Toto je náhled dostupných možností v této anketě. Hlasovat budete moci od {{$a}}.", "removemychoice": "Odstranit mou volbu", "responses": "Odpovědi", diff --git a/www/addons/mod/choice/lang/da.json b/www/addons/mod/choice/lang/da.json index e462afcd51a..3ef6b107e4d 100644 --- a/www/addons/mod/choice/lang/da.json +++ b/www/addons/mod/choice/lang/da.json @@ -6,8 +6,8 @@ "full": "(Fuld)", "noresultsviewable": "Resultaterne er ikke tilgængelige på nuværende tidspunkt.", "notopenyet": "Denne aktivitet er tilgængelig fra {{$a}}", - "numberofuser": "Antal svar", - "numberofuserinpercentage": "Antal svar i procent", + "numberofuser": "Antal deltagere", + "numberofuserinpercentage": "Procentdel af deltagerne", "previewonly": "Dette er en forhåndsvisning af de tilgængelige valgmuligheder i denne afstemning. Du kan ikke indsende dine valg før {{$a}}.", "removemychoice": "Slet mit valg", "responses": "Besvarelser", diff --git a/www/addons/mod/choice/lang/de.json b/www/addons/mod/choice/lang/de.json index be13d38af77..a7bea8a7061 100644 --- a/www/addons/mod/choice/lang/de.json +++ b/www/addons/mod/choice/lang/de.json @@ -6,8 +6,8 @@ "full": "(Nicht verfügbar)", "noresultsviewable": "Ergebnisse sind aktuell nicht sichtbar.", "notopenyet": "Die Aktivität ist nicht verfügbar bis {{$a}}.", - "numberofuser": "Anzahl der Antworten", - "numberofuserinpercentage": "Prozent der Antworten", + "numberofuser": "Anzahl", + "numberofuserinpercentage": "Prozent", "previewonly": "Diese Vorschau zeigt die verfügbaren Optionen für diese Aktivität. Sie können Ihre Wahl nicht vor {{$a}} einreichen.", "removemychoice": "Meine Auswahl löschen", "responses": "Stimmabgaben", diff --git a/www/addons/mod/choice/lang/el.json b/www/addons/mod/choice/lang/el.json index 4b17c064e80..31602f11f93 100644 --- a/www/addons/mod/choice/lang/el.json +++ b/www/addons/mod/choice/lang/el.json @@ -4,8 +4,8 @@ "full": "(Πλήρες)", "noresultsviewable": "Τα αποτελέσματα δεν είναι ορατά προς το παρόν.", "notopenyet": "Συγνώμη, αυτή η δραστηριότητα δεν είναι διαθέσιμη μέχρι {{$a}}", - "numberofuser": "Αριθμός απαντήσεων", - "numberofuserinpercentage": "Ποσοστό απαντήσεων", + "numberofuser": "Πλήθος συμμετεχόντων", + "numberofuserinpercentage": "Ποσοστό συμμετεχόντων", "removemychoice": "Διαγραφή της επιλογής μου", "responses": "Απαντήσεις", "responsesresultgraphdescription": "{{number}}% των χρηστών επέλεξε: {{text}}.", diff --git a/www/addons/mod/choice/lang/es.json b/www/addons/mod/choice/lang/es.json index 74076baa791..b14f860dda6 100644 --- a/www/addons/mod/choice/lang/es.json +++ b/www/addons/mod/choice/lang/es.json @@ -6,8 +6,8 @@ "full": "(Lleno)", "noresultsviewable": "Los resultados no pueden verse en este momento.", "notopenyet": "Lo sentimos, esta actividad no estará disponible hasta {{$a}}", - "numberofuser": "Número de respuestas", - "numberofuserinpercentage": "Porcentaje de respuestas", + "numberofuser": "Número de participantes", + "numberofuserinpercentage": "Porcentaje de participantes", "previewonly": "Esta es solamente una previsualización de las opciones disponibles para esta actividad. No podrá enviar su respuesta a la consulta hasta el {{$a}}.", "removemychoice": "Eliminar mi elección", "responses": "Respuestas", diff --git a/www/addons/mod/choice/lang/eu.json b/www/addons/mod/choice/lang/eu.json index 62e0810b4c4..ceb6eff44db 100644 --- a/www/addons/mod/choice/lang/eu.json +++ b/www/addons/mod/choice/lang/eu.json @@ -6,8 +6,8 @@ "full": "(Beteta)", "noresultsviewable": "Emaitzak ezin dira orain ikusi", "notopenyet": "Barkatu, baina jarduera hau ez dago erabiltzeko moduan {{$a}} arte.", - "numberofuser": "Erantzun-kopurua", - "numberofuserinpercentage": "Erantzunen portzentajea", + "numberofuser": "Partaide-kopurua", + "numberofuserinpercentage": "Partaideen ehunekoa", "previewonly": "Hau jarduera honetan eskuragarri dauden aukeren aurrebista besterik ez da. Ezingo duzu zure erantzuna bidali {{$a}}-(e)ra arte.", "removemychoice": "Ezabatu nire aukera", "responses": "Erantzunak", diff --git a/www/addons/mod/choice/lang/fr.json b/www/addons/mod/choice/lang/fr.json index 9ca0f50c2ea..05e3f3b9c99 100644 --- a/www/addons/mod/choice/lang/fr.json +++ b/www/addons/mod/choice/lang/fr.json @@ -6,8 +6,8 @@ "full": "(complet)", "noresultsviewable": "Les résultats ne sont actuellement pas visibles.", "notopenyet": "Désolé, cette activité ne sera disponible que le {{$a}}", - "numberofuser": "Nombre de réponses", - "numberofuserinpercentage": "Pourcentage de réponses", + "numberofuser": "Nombre de participants", + "numberofuserinpercentage": "Pourcentage de participants", "previewonly": "Cet affichage est une prévisualisation des options disponibles pour cette activité. Vous ne pourrez pas enregistrer votre choix avant le {{$a}}.", "removemychoice": "Retirer mon vote", "responses": "Réponses", diff --git a/www/addons/mod/choice/lang/it.json b/www/addons/mod/choice/lang/it.json index 01597a9058a..c44e97ee335 100644 --- a/www/addons/mod/choice/lang/it.json +++ b/www/addons/mod/choice/lang/it.json @@ -6,8 +6,8 @@ "full": "(Completo)", "noresultsviewable": "I risultati non sono al momento visualizzabili.", "notopenyet": "Spiacente, questa attività non è disponibile fino al {{$a}}", - "numberofuser": "Numero di risposte", - "numberofuserinpercentage": "Percentuale delle risposte", + "numberofuser": "Numero di partecipanti", + "numberofuserinpercentage": "Percentuale dei partecipanti", "previewonly": "Questa è un'anteprima delle scelte disponibili. Potrai inviare la tua scelta solo dal {{$a}}.", "removemychoice": "Elimina la mia scelta", "responses": "Scelte", diff --git a/www/addons/mod/choice/lang/ja.json b/www/addons/mod/choice/lang/ja.json index a5fee422a43..5f5b78343c7 100644 --- a/www/addons/mod/choice/lang/ja.json +++ b/www/addons/mod/choice/lang/ja.json @@ -6,8 +6,8 @@ "full": "(上限到達)", "noresultsviewable": "現在、投票結果は閲覧できません。", "notopenyet": "申し訳ございません、この活動は {{$a}} まで利用することができません。", - "numberofuser": "投票者数", - "numberofuserinpercentage": "投票者数 (%)", + "numberofuser": "参加者数", + "numberofuserinpercentage": "参加者の割合", "previewonly": "これはこの活動で利用可能なオプションのプレビューです。あなたの投票は {{$a}} まで送信することができません。", "removemychoice": "私の投票を削除する", "responses": "投票結果", diff --git a/www/addons/mod/choice/lang/nl.json b/www/addons/mod/choice/lang/nl.json index d7e7f4cd7f3..b2be190c0c9 100644 --- a/www/addons/mod/choice/lang/nl.json +++ b/www/addons/mod/choice/lang/nl.json @@ -6,8 +6,8 @@ "full": "(volledig)", "noresultsviewable": "De resultaten zijn nu niet zichtbaar.", "notopenyet": "Deze activiteit is niet beschikbaar tot {{$a}}", - "numberofuser": "Aantal antwoorden", - "numberofuserinpercentage": "Percentage antwoorden", + "numberofuser": "Aantal deelnemers", + "numberofuserinpercentage": "Deelnemerspercentage", "previewonly": "Dit is slechts een voorbeeld van de beschikbare opties voor deze activiteit. Je zult je keuze niet kunnen maken voor {{$a}}.", "removemychoice": "Verwijder mijn keuze", "responses": "Antwoorden", diff --git a/www/addons/mod/choice/lang/sr-cr.json b/www/addons/mod/choice/lang/sr-cr.json index 9a18723e91c..10465df2265 100644 --- a/www/addons/mod/choice/lang/sr-cr.json +++ b/www/addons/mod/choice/lang/sr-cr.json @@ -6,8 +6,8 @@ "full": "(Попуњено)", "noresultsviewable": "Резултати тренутно нису видљиви.", "notopenyet": "Нажалост, ова активност није доступна до {{$a}}", - "numberofuser": "Број одговора", - "numberofuserinpercentage": "Проценат одговора", + "numberofuser": "Број учесника", + "numberofuserinpercentage": "Проценат учесника", "previewonly": "Ово је само приказ доступних опција за ову активност. Нећете бити у могућности да извршите одабир до {{$a}}.", "removemychoice": "Уклони мој избор", "responses": "Одговори", diff --git a/www/addons/mod/choice/lang/sr-lt.json b/www/addons/mod/choice/lang/sr-lt.json index b9bfa00cb81..7fc4232b84d 100644 --- a/www/addons/mod/choice/lang/sr-lt.json +++ b/www/addons/mod/choice/lang/sr-lt.json @@ -6,8 +6,8 @@ "full": "(Popunjeno)", "noresultsviewable": "Rezultati trenutno nisu vidljivi.", "notopenyet": "Nažalost, ova aktivnost nije dostupna do {{$a}}", - "numberofuser": "Broj odgovora", - "numberofuserinpercentage": "Procenat odgovora", + "numberofuser": "Broj učesnika", + "numberofuserinpercentage": "Procenat učesnika", "previewonly": "Ovo je samo prikaz dostupnih opcija za ovu aktivnost. Nećete biti u mogućnosti da izvršite odabir do {{$a}}.", "removemychoice": "Ukloni moj izbor", "responses": "Odgovori", diff --git a/www/addons/mod/choice/lang/sv.json b/www/addons/mod/choice/lang/sv.json index f76c9f090e3..9b79b1cc765 100644 --- a/www/addons/mod/choice/lang/sv.json +++ b/www/addons/mod/choice/lang/sv.json @@ -6,8 +6,8 @@ "full": "(Full)", "noresultsviewable": "Det går f.n. inte att visa resultaten.", "notopenyet": "Den här aktiviteten är tyvärr inte tillgänglig förrän {{$a}}", - "numberofuser": "Antal användare", - "numberofuserinpercentage": "Antalet användare i procent.", + "numberofuser": "Antal deltagare", + "numberofuserinpercentage": "Procent av deltagarna", "previewonly": "Detta är bara en förhandsvisning av de tillgängliga alternativen för den här aktiviteten . Du kommer inte att kunna lämna in ditt val innan {{$a}}", "removemychoice": "Ta bort mitt val", "responses": "Svar", diff --git a/www/addons/mod/choice/lang/uk.json b/www/addons/mod/choice/lang/uk.json index 583a6f28d04..7c22b1890c7 100644 --- a/www/addons/mod/choice/lang/uk.json +++ b/www/addons/mod/choice/lang/uk.json @@ -6,8 +6,8 @@ "full": "(Все)", "noresultsviewable": "В даний час результати не можна побачити.", "notopenyet": "Цей ресурс буде недоступний до {{$a}}", - "numberofuser": "Кількість користувачів", - "numberofuserinpercentage": "Кількість користувачів у відсотках", + "numberofuser": "Кількість учасників", + "numberofuserinpercentage": "Відсоток учасників", "previewonly": "Це лише попередній перегляд доступних варіантів для цієї діяльності. Ви не можете відправити відповідь до {{$a}}.", "removemychoice": "Видалити мій вибір", "responses": "Відповіді", diff --git a/www/addons/mod/folder/lang/cs.json b/www/addons/mod/folder/lang/cs.json index 04e2822f6a0..66b256adf4c 100644 --- a/www/addons/mod/folder/lang/cs.json +++ b/www/addons/mod/folder/lang/cs.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Žádný soubor k zobrazení", + "emptyfilelist": "Žádný soubor k zobrazení.", "errorwhilegettingfolder": "Chyba při načítání dat složky." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/da.json b/www/addons/mod/folder/lang/da.json index c53b3a994ed..2337bed4841 100644 --- a/www/addons/mod/folder/lang/da.json +++ b/www/addons/mod/folder/lang/da.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Der er ingen filer at vise", + "emptyfilelist": "Der er ingen filer at vise.", "errorwhilegettingfolder": "Fejl ved hentning af mappedata." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/de.json b/www/addons/mod/folder/lang/de.json index 00b4ea2a954..022d05baeea 100644 --- a/www/addons/mod/folder/lang/de.json +++ b/www/addons/mod/folder/lang/de.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Es liegen keine Dateien vor", + "emptyfilelist": "Keine Dateien", "errorwhilegettingfolder": "Fehler beim Laden der Verzeichnisdaten" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/eu.json b/www/addons/mod/folder/lang/eu.json index 07dae0aef65..27a3ccc6636 100644 --- a/www/addons/mod/folder/lang/eu.json +++ b/www/addons/mod/folder/lang/eu.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Ez dago erakusteko fitxategirik", + "emptyfilelist": "Ez dago fitxategirik erakusteko.", "errorwhilegettingfolder": "Errorea karpetaren datuak eskuratzean." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/fr.json b/www/addons/mod/folder/lang/fr.json index e16e5c1aeb4..86d36f87890 100644 --- a/www/addons/mod/folder/lang/fr.json +++ b/www/addons/mod/folder/lang/fr.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Il n'y a pas de fichier à afficher", + "emptyfilelist": "Aucun fichier à afficher.", "errorwhilegettingfolder": "Erreur lors de l'obtention des données du dossier." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/he.json b/www/addons/mod/folder/lang/he.json index 1c2ec27977b..55811600621 100644 --- a/www/addons/mod/folder/lang/he.json +++ b/www/addons/mod/folder/lang/he.json @@ -1,3 +1,3 @@ { - "emptyfilelist": "אין קבצים להציג" + "emptyfilelist": "אין קבצים להציג." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/it.json b/www/addons/mod/folder/lang/it.json index b828249f904..93e13593395 100644 --- a/www/addons/mod/folder/lang/it.json +++ b/www/addons/mod/folder/lang/it.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Non ci sono file da visualizzare", + "emptyfilelist": "Non ci sono file da visualizzare.", "errorwhilegettingfolder": "Si è verificato un errore durante la ricezione dei dati della cartella." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/ja.json b/www/addons/mod/folder/lang/ja.json index 8634d70f046..61980e500fc 100644 --- a/www/addons/mod/folder/lang/ja.json +++ b/www/addons/mod/folder/lang/ja.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "表示するファイルはありません。", + "emptyfilelist": "表示するファイルがありません。", "errorwhilegettingfolder": "フォルダのデータを取得中にエラーが発生しました。" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/nl.json b/www/addons/mod/folder/lang/nl.json index 7b544820480..92b48519e9d 100644 --- a/www/addons/mod/folder/lang/nl.json +++ b/www/addons/mod/folder/lang/nl.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Er zijn geen bestanden om te tonen", + "emptyfilelist": "Geen bestanden.", "errorwhilegettingfolder": "Fout bij het ophalen van de mapgegevens" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/sr-cr.json b/www/addons/mod/folder/lang/sr-cr.json index 3ed8d5f00a0..a65fb8697c7 100644 --- a/www/addons/mod/folder/lang/sr-cr.json +++ b/www/addons/mod/folder/lang/sr-cr.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Нема датотека за приказ", + "emptyfilelist": "Нема датотека за приказ.", "errorwhilegettingfolder": "Грешка приликом преузимања података за 'Директоријум'" } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/sr-lt.json b/www/addons/mod/folder/lang/sr-lt.json index 847b0b05eff..9bfdf403335 100644 --- a/www/addons/mod/folder/lang/sr-lt.json +++ b/www/addons/mod/folder/lang/sr-lt.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Nema datoteka za prikaz", + "emptyfilelist": "Nema datoteka za prikaz.", "errorwhilegettingfolder": "Greška prilikom preuzimanja podataka za 'Direktorijum'" } \ No newline at end of file diff --git a/www/addons/mod/forum/lang/da.json b/www/addons/mod/forum/lang/da.json index 38dca8ad7f1..bdbd7c0a872 100644 --- a/www/addons/mod/forum/lang/da.json +++ b/www/addons/mod/forum/lang/da.json @@ -9,7 +9,7 @@ "discussionsubscription": "Abonnement på tråd", "edit": "Rediger", "erroremptymessage": "Indlægget kan ikke være tomt.", - "erroremptysubject": "Indlæggets emne kan ikke være tomt.", + "erroremptysubject": "Emnefeltet kan ikke være tomt", "errorgetforum": "Fejl ved hentning af forumdata.", "errorgetgroups": "Fejl ved hentning af gruppeindstillinger.", "forumnodiscussionsyet": "Der er endnu ingen indlæg i dette forum.", diff --git a/www/addons/mod/forum/lang/de.json b/www/addons/mod/forum/lang/de.json index bee3c7cb0d4..22814dbf13e 100644 --- a/www/addons/mod/forum/lang/de.json +++ b/www/addons/mod/forum/lang/de.json @@ -10,7 +10,7 @@ "discussionsubscription": "Themenabonnement", "edit": "Bearbeiten", "erroremptymessage": "Die Mitteilung darf nicht leer sein.", - "erroremptysubject": "Der Betreff darf nicht leer sein.", + "erroremptysubject": "Das Forenthema darf nicht leer sein.", "errorgetforum": "Fehler beim Laden der Forendaten", "errorgetgroups": "Fehler beim Laden der Gruppeneinstellungen", "forumnodiscussionsyet": "Keine Themen im Forum", diff --git a/www/addons/mod/forum/lang/fr.json b/www/addons/mod/forum/lang/fr.json index 566c52681f0..09bf43de5be 100644 --- a/www/addons/mod/forum/lang/fr.json +++ b/www/addons/mod/forum/lang/fr.json @@ -10,7 +10,7 @@ "discussionsubscription": "Abonnement à la discussion", "edit": "Modifier", "erroremptymessage": "Un message ne peut pas être vide", - "erroremptysubject": "L'objet d'un message ne peut pas être vide", + "erroremptysubject": "L'objet du message ne peut pas être vide", "errorgetforum": "Erreur de récupération des données de forum.", "errorgetgroups": "Erreur lors de l'obtention des réglages de groupe.", "forumnodiscussionsyet": "Il n'y a pas encore de message dans ce forum", diff --git a/www/addons/mod/forum/lang/he.json b/www/addons/mod/forum/lang/he.json index 3b4e2e70b17..21f3b132b0c 100644 --- a/www/addons/mod/forum/lang/he.json +++ b/www/addons/mod/forum/lang/he.json @@ -10,7 +10,7 @@ "discussionsubscription": "מנוי לעדכונים בדיון", "edit": "עריכה", "erroremptymessage": "הודעת הפרסום איננה יכולה להיות ריקה", - "erroremptysubject": "הנושא הפרסום אינו יכול להיות ריק", + "erroremptysubject": "נושא ההודעה אינו יכול להיות ריק", "errorgetforum": "שגיאה בטעינת מידע הפורום.", "errorgetgroups": "שגיאה בטעינת הגדרות קבוצה.", "forumnodiscussionsyet": "עדיין לא קיימים נושאי דיונים בפורום זה.", diff --git a/www/addons/mod/forum/lang/it.json b/www/addons/mod/forum/lang/it.json index c54ee597c31..ad1b8b1ed8b 100644 --- a/www/addons/mod/forum/lang/it.json +++ b/www/addons/mod/forum/lang/it.json @@ -10,7 +10,7 @@ "discussionsubscription": "Sottoscrizione della discussione", "edit": "Modifica", "erroremptymessage": "Il corpo del messaggio non può essere vuoto", - "erroremptysubject": "L'oggetto non può essere vuoto", + "erroremptysubject": "L'oggetto dell'intervento non può essere vuoto", "errorgetforum": "Si è verificato un errore durante la ricezione dei dati del forum.", "errorgetgroups": "Si è verificato un errore durante la ricezione delle impostazioni gruppo.", "forumnodiscussionsyet": "In questo forum non sono presenti discussioni", diff --git a/www/addons/mod/forum/lang/ja.json b/www/addons/mod/forum/lang/ja.json index c3c4562c07c..df4dba7bc16 100644 --- a/www/addons/mod/forum/lang/ja.json +++ b/www/addons/mod/forum/lang/ja.json @@ -10,7 +10,7 @@ "discussionsubscription": "ディスカッション購読", "edit": "編集", "erroremptymessage": "投稿メッセージを空にすることはできません。", - "erroremptysubject": "投稿件名を空にすることはできません。", + "erroremptysubject": "投稿の件名は必須です", "errorgetforum": "フォーラムのデータ取得中にエラーが発生しました。", "errorgetgroups": "グループ設定の取得中にエラーが発生しました。", "forumnodiscussionsyet": "このフォーラムにはまだディスカッショントピックがありません", diff --git a/www/addons/mod/forum/lang/nl.json b/www/addons/mod/forum/lang/nl.json index 8f7fe7dad45..83fddedda47 100644 --- a/www/addons/mod/forum/lang/nl.json +++ b/www/addons/mod/forum/lang/nl.json @@ -10,7 +10,7 @@ "discussionsubscription": "Inschrijving discussie", "edit": "Wijzig", "erroremptymessage": "Bericht kan niet leeg zijn", - "erroremptysubject": "Onderwerp kan niet leeg zijn", + "erroremptysubject": "Onderwerp mag niet leeg zijn", "errorgetforum": "Fout bij het ophalen van forumgegevens", "errorgetgroups": "Fout bij het ophalen van groepinstellingen.", "forumnodiscussionsyet": "Er zijn nog geen discussies in dit forum", diff --git a/www/addons/mod/forum/lang/ru.json b/www/addons/mod/forum/lang/ru.json index 46a510d03d2..3faffe0f076 100644 --- a/www/addons/mod/forum/lang/ru.json +++ b/www/addons/mod/forum/lang/ru.json @@ -10,7 +10,7 @@ "discussionsubscription": "Подписаться на эту тему.", "edit": "Редактировать", "erroremptymessage": "Сообщение не может быть пустым", - "erroremptysubject": "Тема сообщения не может быть пустой", + "erroremptysubject": "Заголовок сообщения не может быть пустым", "errorgetforum": "Ошибка при получении данных форума", "errorgetgroups": "Ошибка получения параметров группы", "forumnodiscussionsyet": "В этом форуме ещё нет тем для обсуждения", diff --git a/www/addons/mod/forum/lang/sr-cr.json b/www/addons/mod/forum/lang/sr-cr.json index a29562d23f2..0b8b9f761b2 100644 --- a/www/addons/mod/forum/lang/sr-cr.json +++ b/www/addons/mod/forum/lang/sr-cr.json @@ -10,7 +10,7 @@ "discussionsubscription": "Претплата на дискусију", "edit": "Уреди", "erroremptymessage": "Тело поруке не може бити празно", - "erroremptysubject": "Тема (наслов) поруке не може бити празна", + "erroremptysubject": "Тема поруке не може бити празна", "errorgetforum": "Грешка приликом преузимања података за 'Форум'", "errorgetgroups": "Грешка приликом преузимања подешавања група.", "forumnodiscussionsyet": "Још нема тема за дискусију на овом форуму.", diff --git a/www/addons/mod/forum/lang/sr-lt.json b/www/addons/mod/forum/lang/sr-lt.json index e655f26c3b4..c71aef2a6fc 100644 --- a/www/addons/mod/forum/lang/sr-lt.json +++ b/www/addons/mod/forum/lang/sr-lt.json @@ -10,7 +10,7 @@ "discussionsubscription": "Pretplata na diskusiju", "edit": "Uredi", "erroremptymessage": "Telo poruke ne može biti prazno", - "erroremptysubject": "Tema (naslov) poruke ne može biti prazna", + "erroremptysubject": "Tema poruke ne može biti prazna", "errorgetforum": "Greška prilikom preuzimanja podataka za 'Forum'", "errorgetgroups": "Greška prilikom preuzimanja podešavanja grupa.", "forumnodiscussionsyet": "Greška prilikom preuzimanja podešavanja grupa.", diff --git a/www/addons/mod/forum/lang/sv.json b/www/addons/mod/forum/lang/sv.json index d8da791577b..41354d355f0 100644 --- a/www/addons/mod/forum/lang/sv.json +++ b/www/addons/mod/forum/lang/sv.json @@ -10,7 +10,7 @@ "discussionsubscription": "Prenumeration på diskussion", "edit": "Redigera", "erroremptymessage": "Meddelandet i inlägget kan inte vara tomt", - "erroremptysubject": "Ämnesrubriken för inlägget kan inte vara tom.", + "erroremptysubject": "Rubriken kan inte vara tom", "errorgetforum": "Fel att få forum innehåll", "errorgetgroups": "Fel vid hämtning av gruppinställningar", "forumnodiscussionsyet": "Det finns inga diskussionsämnen ännu i detta forum.", diff --git a/www/addons/mod/forum/lang/uk.json b/www/addons/mod/forum/lang/uk.json index bf8cfd7742c..5fec7fdc11b 100644 --- a/www/addons/mod/forum/lang/uk.json +++ b/www/addons/mod/forum/lang/uk.json @@ -9,7 +9,7 @@ "discussionsubscription": "Підписатися на дискусію", "edit": "Редагувати", "erroremptymessage": "Повідомлення не може бути порожнім", - "erroremptysubject": "Тема повідомлення не може бути порожньою", + "erroremptysubject": "Заголовок не повинен бути пустим", "errorgetforum": "Помилка отримання даних форуму", "errorgetgroups": "Помилка отримання групових налаштувань.", "forumnodiscussionsyet": "Відсутні обговорення в даному форумі.", diff --git a/www/addons/mod/glossary/lang/cs.json b/www/addons/mod/glossary/lang/cs.json index db30da2ce2e..9d81e677a27 100644 --- a/www/addons/mod/glossary/lang/cs.json +++ b/www/addons/mod/glossary/lang/cs.json @@ -1,6 +1,6 @@ { "attachment": "Příloha", - "browsemode": "Režim náhledu", + "browsemode": "Prohlížení příspěvků", "byalphabet": "Abecedně", "byauthor": "Skupina podle autora", "bycategory": "Skupina podle kategorie", diff --git a/www/addons/mod/glossary/lang/da.json b/www/addons/mod/glossary/lang/da.json index 41338f8fc3e..2e7da2ee000 100644 --- a/www/addons/mod/glossary/lang/da.json +++ b/www/addons/mod/glossary/lang/da.json @@ -1,6 +1,6 @@ { "attachment": "Bilag", - "browsemode": "Forhåndsvisning", + "browsemode": "Skim indlæg", "byalphabet": "Alfabetisk", "byauthor": "Grupper efter forfatter", "bynewestfirst": "Nyeste først", diff --git a/www/addons/mod/glossary/lang/de.json b/www/addons/mod/glossary/lang/de.json index c5afa42c3fc..03bb7f1a602 100644 --- a/www/addons/mod/glossary/lang/de.json +++ b/www/addons/mod/glossary/lang/de.json @@ -1,6 +1,6 @@ { "attachment": "Anhang", - "browsemode": "Vorschaumodus", + "browsemode": "Einträge durchblättern", "byalphabet": "Alphabetisch", "byauthor": "Nach Autor/in", "bycategory": "Nach Kategorie", diff --git a/www/addons/mod/glossary/lang/el.json b/www/addons/mod/glossary/lang/el.json index 0b1990425e5..6a40931cf03 100644 --- a/www/addons/mod/glossary/lang/el.json +++ b/www/addons/mod/glossary/lang/el.json @@ -1,6 +1,6 @@ { "attachment": "Επισυναπτόμενο", - "browsemode": "Φάση Προεπισκόπισης", + "browsemode": "Περιήγηση στις καταχωρήσεις", "byalphabet": "Αλφαβητικά", "byauthor": "Ομαδοποίηση ανά συγγραφέα", "bycategory": "Ομαδοποίηση ανά κατηγορία", diff --git a/www/addons/mod/glossary/lang/es.json b/www/addons/mod/glossary/lang/es.json index 6cbdcc4dc0e..ba144c727bc 100644 --- a/www/addons/mod/glossary/lang/es.json +++ b/www/addons/mod/glossary/lang/es.json @@ -1,6 +1,6 @@ { "attachment": "Adjuntar insignia al mensaje", - "browsemode": "Modo de presentación preliminar", + "browsemode": "Navegar por las entradas", "byalphabet": "Alfabéticamente", "byauthor": "Agrupado por autor", "bycategory": "Agrupar por categoría", diff --git a/www/addons/mod/glossary/lang/eu.json b/www/addons/mod/glossary/lang/eu.json index 96f4a794e08..5aa5b982604 100644 --- a/www/addons/mod/glossary/lang/eu.json +++ b/www/addons/mod/glossary/lang/eu.json @@ -1,6 +1,6 @@ { "attachment": "Eranskina", - "browsemode": "Aurrebista-modua", + "browsemode": "Aztertu sarrerak", "byalphabet": "Alfabetikoki", "byauthor": "Taldekatu egilearen arabera", "bycategory": "Taldekatu kategoriaren arabera", diff --git a/www/addons/mod/glossary/lang/fr.json b/www/addons/mod/glossary/lang/fr.json index 976057ed4e7..f72096c8b1b 100644 --- a/www/addons/mod/glossary/lang/fr.json +++ b/www/addons/mod/glossary/lang/fr.json @@ -1,6 +1,6 @@ { "attachment": "Annexe", - "browsemode": "Mode prévisualisation", + "browsemode": "Parcourir les articles", "byalphabet": "Alphabétiquement", "byauthor": "Grouper par auteur", "bycategory": "Grouper par catégorie", diff --git a/www/addons/mod/glossary/lang/ja.json b/www/addons/mod/glossary/lang/ja.json index 619f8f31178..b68170abdd2 100644 --- a/www/addons/mod/glossary/lang/ja.json +++ b/www/addons/mod/glossary/lang/ja.json @@ -1,6 +1,6 @@ { "attachment": "メッセージにバッジを添付する", - "browsemode": "プレビューモード", + "browsemode": "エントリをブラウズ", "byalphabet": "アルファベット順", "byauthor": "著者でグループ", "bycategory": "カテゴリでグループ", diff --git a/www/addons/mod/glossary/lang/nl.json b/www/addons/mod/glossary/lang/nl.json index a7e834e6b2a..5a53d5a1d7a 100644 --- a/www/addons/mod/glossary/lang/nl.json +++ b/www/addons/mod/glossary/lang/nl.json @@ -1,6 +1,6 @@ { "attachment": "Bijlage", - "browsemode": "Probeermodus", + "browsemode": "Blader door items", "byalphabet": "Alfabetisch", "byauthor": "Groepeer per auteur", "bycategory": "Groepeer per categorie", diff --git a/www/addons/mod/glossary/lang/sr-cr.json b/www/addons/mod/glossary/lang/sr-cr.json index d816bfc641b..79d5aec0558 100644 --- a/www/addons/mod/glossary/lang/sr-cr.json +++ b/www/addons/mod/glossary/lang/sr-cr.json @@ -1,6 +1,6 @@ { "attachment": "Прилог", - "browsemode": "Режим прегледа", + "browsemode": "Прегледај појмове", "byalphabet": "Азбучним редом", "byauthor": "Групиши по аутору", "bycategory": "Групиши по категорији", diff --git a/www/addons/mod/glossary/lang/sr-lt.json b/www/addons/mod/glossary/lang/sr-lt.json index 4ee4c923d4a..4edfb5a1f41 100644 --- a/www/addons/mod/glossary/lang/sr-lt.json +++ b/www/addons/mod/glossary/lang/sr-lt.json @@ -1,6 +1,6 @@ { "attachment": "Prilog", - "browsemode": "Režim pregleda", + "browsemode": "Pregledaj pojmove", "byalphabet": "Abecednim redom", "byauthor": "Grupiši po autoru", "bycategory": "Grupiši po kategoriji", diff --git a/www/addons/mod/glossary/lang/sv.json b/www/addons/mod/glossary/lang/sv.json index 3cfa169d56c..7fb8c3d2643 100644 --- a/www/addons/mod/glossary/lang/sv.json +++ b/www/addons/mod/glossary/lang/sv.json @@ -1,6 +1,6 @@ { "attachment": "Bilaga", - "browsemode": "Läge för förhandsgranskning", + "browsemode": "Bläddrar bland poster", "byalphabet": "Alfabetiskt", "byauthor": "Sortera efter författare", "bynewestfirst": "Nyaste först", diff --git a/www/addons/mod/glossary/lang/uk.json b/www/addons/mod/glossary/lang/uk.json index a2186b273c3..fecbe90319d 100644 --- a/www/addons/mod/glossary/lang/uk.json +++ b/www/addons/mod/glossary/lang/uk.json @@ -1,6 +1,6 @@ { "attachment": "Прикріпити відзнаку до повідомлення", - "browsemode": "Режим перегляду", + "browsemode": "Перегляд записів", "byalphabet": "По алфавіту", "byauthor": "Групувати за автором", "bycategory": "Групувати за категорією", diff --git a/www/addons/mod/label/lang/he.json b/www/addons/mod/label/lang/he.json index 232aff3b2bf..7f0814d0381 100644 --- a/www/addons/mod/label/lang/he.json +++ b/www/addons/mod/label/lang/he.json @@ -1,3 +1,3 @@ { - "label": "תווית לשאלה מותנית (באנגלית)" + "label": "תווית" } \ No newline at end of file diff --git a/www/addons/mod/label/lang/ru.json b/www/addons/mod/label/lang/ru.json index d174e316226..974254476a8 100644 --- a/www/addons/mod/label/lang/ru.json +++ b/www/addons/mod/label/lang/ru.json @@ -1,3 +1,3 @@ { - "label": "Отмечено" + "label": "Пояснение" } \ No newline at end of file diff --git a/www/addons/mod/label/lang/uk.json b/www/addons/mod/label/lang/uk.json index dc1348438f8..f1dd990cbfb 100644 --- a/www/addons/mod/label/lang/uk.json +++ b/www/addons/mod/label/lang/uk.json @@ -1,3 +1,3 @@ { - "label": "Напис" + "label": "Лейба" } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/ar.json b/www/addons/mod/survey/lang/ar.json index 30dd1d2fed3..dd271b759c7 100644 --- a/www/addons/mod/survey/lang/ar.json +++ b/www/addons/mod/survey/lang/ar.json @@ -2,5 +2,5 @@ "ifoundthat": "وجدت أن", "ipreferthat": "أفضل أن", "responses": "إجابات", - "results": "نتائج" + "results": "النتائج" } \ No newline at end of file diff --git a/www/addons/mod/survey/lang/ja.json b/www/addons/mod/survey/lang/ja.json index 6e207332222..35fbcedcc0d 100644 --- a/www/addons/mod/survey/lang/ja.json +++ b/www/addons/mod/survey/lang/ja.json @@ -4,6 +4,6 @@ "ifoundthat": "私は次のことを発見しました:", "ipreferthat": "私は次のことが好きです:", "responses": "回答", - "results": "受験結果", + "results": "結果", "surveycompletednograph": "あなたはこの調査を完了しました。" } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/cs.json b/www/addons/mod/wiki/lang/cs.json index 052676bb598..89723ca1da7 100644 --- a/www/addons/mod/wiki/lang/cs.json +++ b/www/addons/mod/wiki/lang/cs.json @@ -10,7 +10,7 @@ "newpagetitle": "Nový název stránky", "nocontent": "Pro tuto stránku není obsah", "notingroup": "Není ve skupině", - "page": "Stránka: {{$a}}", + "page": "Stránka", "pageexists": "Tato stránka již existuje.", "pagename": "Název stránky", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/da.json b/www/addons/mod/wiki/lang/da.json index c888f404157..9b83d403406 100644 --- a/www/addons/mod/wiki/lang/da.json +++ b/www/addons/mod/wiki/lang/da.json @@ -8,7 +8,7 @@ "newpagetitle": "Ny sidetitel", "nocontent": "Der er intet indhold til denne side", "notingroup": "Ikke i gruppe", - "page": "Side: {{$a}}", + "page": "Side", "pageexists": "Denne side findes allerede.", "pagename": "Sidenavn", "subwiki": "Underwiki", diff --git a/www/addons/mod/wiki/lang/de.json b/www/addons/mod/wiki/lang/de.json index 6fe1fc4dba9..7bb8187eaff 100644 --- a/www/addons/mod/wiki/lang/de.json +++ b/www/addons/mod/wiki/lang/de.json @@ -10,7 +10,7 @@ "newpagetitle": "Titel für neue Seite\n", "nocontent": "Kein Inhalt auf dieser Seite", "notingroup": "Nicht in Gruppen", - "page": "Seite: {{$a}}", + "page": "Seite", "pageexists": "Diese Seite existiert bereits.", "pagename": "Seitenname", "subwiki": "Teilwiki", diff --git a/www/addons/mod/wiki/lang/el.json b/www/addons/mod/wiki/lang/el.json index 8eec41f7ee2..7a3a3058446 100644 --- a/www/addons/mod/wiki/lang/el.json +++ b/www/addons/mod/wiki/lang/el.json @@ -3,7 +3,7 @@ "errornowikiavailable": "Αυτό το wiki δεν έχει ακόμα περιεχόμενο.", "gowikihome": "Go Wiki home", "notingroup": "Συγγνώμη, αλλά πρέπει να είστε μέλος ομάδας για να δείτε αυτό την ομάδα συζητήσεων.", - "page": "Σελίδα: {{$a}}", + "page": "Σελίδα", "subwiki": "Subwiki", "titleshouldnotbeempty": "Ο τίτλος δεν πρέπει να είναι κενός", "viewpage": "Δείτε τη σελίδα", diff --git a/www/addons/mod/wiki/lang/es.json b/www/addons/mod/wiki/lang/es.json index 3bbe24f3157..b31f110029b 100644 --- a/www/addons/mod/wiki/lang/es.json +++ b/www/addons/mod/wiki/lang/es.json @@ -10,7 +10,7 @@ "newpagetitle": "Título nuevo de la página", "nocontent": "No hay contenido para esta página", "notingroup": "No está en un grupo", - "page": "Página: {{$a}}", + "page": "Página", "pageexists": "Esta página ya existe.", "pagename": "Nombre de la página", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/eu.json b/www/addons/mod/wiki/lang/eu.json index f6b07f7639d..dee4d7b3f1e 100644 --- a/www/addons/mod/wiki/lang/eu.json +++ b/www/addons/mod/wiki/lang/eu.json @@ -10,7 +10,7 @@ "newpagetitle": "Orri berriaren izenburua", "nocontent": "Ez dago edukirik orri honetarako", "notingroup": "Ez dago taldean", - "page": "Orria: {{$a}}", + "page": "Orria", "pageexists": "Orri hau badago dagoeneko.", "pagename": "Orriaren izena", "subwiki": "Azpiwikia", diff --git a/www/addons/mod/wiki/lang/fr.json b/www/addons/mod/wiki/lang/fr.json index e18eeba1d13..3d4ff31273f 100644 --- a/www/addons/mod/wiki/lang/fr.json +++ b/www/addons/mod/wiki/lang/fr.json @@ -10,7 +10,7 @@ "newpagetitle": "Titre de la nouvelle page", "nocontent": "Cette page n'a pas de contenu", "notingroup": "Pas dans le groupe", - "page": "Page : {{$a}}", + "page": "Page", "pageexists": "Cette page existe déjà.", "pagename": "Nom de page", "subwiki": "Sous-wiki", diff --git a/www/addons/mod/wiki/lang/ja.json b/www/addons/mod/wiki/lang/ja.json index 6d79d901d29..602d4646668 100644 --- a/www/addons/mod/wiki/lang/ja.json +++ b/www/addons/mod/wiki/lang/ja.json @@ -10,7 +10,7 @@ "newpagetitle": "新しいページタイトル", "nocontent": "このページにはコンテンツがありません。", "notingroup": "グループ外", - "page": "ページ: {{$a}}", + "page": "ページ", "pageexists": "このページはすでに存在します。", "pagename": "ページ名", "subwiki": "サブwiki", diff --git a/www/addons/mod/wiki/lang/nl.json b/www/addons/mod/wiki/lang/nl.json index de4427ee53d..2d4ec194f27 100644 --- a/www/addons/mod/wiki/lang/nl.json +++ b/www/addons/mod/wiki/lang/nl.json @@ -10,7 +10,7 @@ "newpagetitle": "Nieuwe paginatitel", "nocontent": "Er is geen inhoud voor deze pagina", "notingroup": "Niet in groep", - "page": "Pagina: {{$a}}", + "page": "Pagina", "pageexists": "Deze pagina bestaat al.", "pagename": "Paginanaam", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/ru.json b/www/addons/mod/wiki/lang/ru.json index efca795f742..d1aad170e59 100644 --- a/www/addons/mod/wiki/lang/ru.json +++ b/www/addons/mod/wiki/lang/ru.json @@ -9,7 +9,7 @@ "newpagetitle": "Заголовок новой страницы", "nocontent": "Нет содержимого у этой страницы", "notingroup": "Не в группе", - "page": "Страница: {{$a}}", + "page": "Страница", "pageexists": "Такая страница уже существует.", "pagename": "Название страницы", "titleshouldnotbeempty": "Заголовок не должен быть пустым", diff --git a/www/addons/mod/wiki/lang/sr-cr.json b/www/addons/mod/wiki/lang/sr-cr.json index 8213c338216..9620e198c9d 100644 --- a/www/addons/mod/wiki/lang/sr-cr.json +++ b/www/addons/mod/wiki/lang/sr-cr.json @@ -10,7 +10,7 @@ "newpagetitle": "Наслов нове странице", "nocontent": "На овој страници нема садржаја", "notingroup": "Није у групи", - "page": "Страница: {{$a}}", + "page": "Страница", "pageexists": "Ова страница већ постоји.", "pagename": "Назив странице", "subwiki": "Подвики", diff --git a/www/addons/mod/wiki/lang/sr-lt.json b/www/addons/mod/wiki/lang/sr-lt.json index 9b1e7853897..11efcb2e226 100644 --- a/www/addons/mod/wiki/lang/sr-lt.json +++ b/www/addons/mod/wiki/lang/sr-lt.json @@ -10,7 +10,7 @@ "newpagetitle": "Naslov nove stranice", "nocontent": "Na ovoj stranici nema sadržaja", "notingroup": "Nije u grupi", - "page": "Stranica: {{$a}}", + "page": "Stranica", "pageexists": "Ova stranica već postoji.", "pagename": "Naziv stranice", "subwiki": "Podviki", diff --git a/www/addons/mod/wiki/lang/uk.json b/www/addons/mod/wiki/lang/uk.json index 7e2a88dd8db..cd89e56c9cc 100644 --- a/www/addons/mod/wiki/lang/uk.json +++ b/www/addons/mod/wiki/lang/uk.json @@ -10,7 +10,7 @@ "newpagetitle": "Заголовок нової сторінки", "nocontent": "Немає контенту для цієї сторінки", "notingroup": "Не в групі", - "page": "Сторінка: {{$a}}", + "page": "Сторінка", "pageexists": "Ця сторінка вже існує. Перенаправити до неї.", "pagename": "Назва сторінки", "subwiki": "Субвікі", diff --git a/www/addons/notes/lang/ar.json b/www/addons/notes/lang/ar.json index df8de0cf069..30b58e0c705 100644 --- a/www/addons/notes/lang/ar.json +++ b/www/addons/notes/lang/ar.json @@ -2,7 +2,7 @@ "addnewnote": "إضافة ملاحظة جديدة", "coursenotes": "ملاحظات المقرر الدراسي", "note": "ملحوظة", - "notes": "تحليلك وملاحظاتك الخاصة", + "notes": "ملاحظات", "personalnotes": "ملاحظات شخصية", "publishstate": "السياق", "sitenotes": "ملاحظات الموقع" diff --git a/www/addons/notes/lang/cs.json b/www/addons/notes/lang/cs.json index 984816ff5e7..fd3b1a46f42 100644 --- a/www/addons/notes/lang/cs.json +++ b/www/addons/notes/lang/cs.json @@ -4,7 +4,7 @@ "eventnotecreated": "Poznámka vytvořena", "nonotes": "Doposud neexistují žádné poznámky tohoto typu", "note": "Poznámka", - "notes": "Vaše soukromé postřehy a poznámky", + "notes": "Poznámky", "personalnotes": "Osobní poznámky", "publishstate": "Kontext", "sitenotes": "Poznámky stránek", diff --git a/www/addons/notes/lang/da.json b/www/addons/notes/lang/da.json index cf35362b164..3dadb18f0eb 100644 --- a/www/addons/notes/lang/da.json +++ b/www/addons/notes/lang/da.json @@ -4,7 +4,7 @@ "eventnotecreated": "Note oprettet", "nonotes": "Der er endnu ingen noter af denne type", "note": "Note", - "notes": "Dine private kommentarer og noter", + "notes": "Noter", "personalnotes": "Personlige noter", "publishstate": "Sammenhæng", "sitenotes": "Webstedsnoter", diff --git a/www/addons/notes/lang/de.json b/www/addons/notes/lang/de.json index 06d550d7211..b4ed60eb088 100644 --- a/www/addons/notes/lang/de.json +++ b/www/addons/notes/lang/de.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anmerkung angelegt", "nonotes": "Keine Anmerkungen", "note": "Anmerkung", - "notes": "Ihre persönliche Analyse und Anmerkungen", + "notes": "Anmerkungen", "personalnotes": "Meine Anmerkungen", "publishstate": "Kontext", "sitenotes": "Anmerkungen zur Website", diff --git a/www/addons/notes/lang/el.json b/www/addons/notes/lang/el.json index 9bc5d02d49e..e796b19cabe 100644 --- a/www/addons/notes/lang/el.json +++ b/www/addons/notes/lang/el.json @@ -4,7 +4,7 @@ "eventnotecreated": "Το σημείωμα δημιουργήθηκε", "nonotes": "Δεν υπάρχουν σημειώσεις αυτού του τύπου ακόμα", "note": "Σημείωση", - "notes": "Οι προσωπικές σας αναλύσεις και σημειώσεις", + "notes": "Σημειώσεις", "personalnotes": "Προσωπικές σημειώσεις", "publishstate": "Γενικό πλαίσιο", "sitenotes": "Σημειώσεις της ιστοσελίδας", diff --git a/www/addons/notes/lang/eu.json b/www/addons/notes/lang/eu.json index 8656c9594fd..f8935fec248 100644 --- a/www/addons/notes/lang/eu.json +++ b/www/addons/notes/lang/eu.json @@ -4,7 +4,7 @@ "eventnotecreated": "Oharra gehituta", "nonotes": "Oraindik ez dago mota honetako oharrik.", "note": "Oharra", - "notes": "Zure analisi pribatua eta oharrak", + "notes": "Oharrak", "personalnotes": "Ohar pertsonalak", "publishstate": "Testuingurua", "sitenotes": "Guneko oharrak", diff --git a/www/addons/notes/lang/fr.json b/www/addons/notes/lang/fr.json index 346f886976d..21d624c4af2 100644 --- a/www/addons/notes/lang/fr.json +++ b/www/addons/notes/lang/fr.json @@ -4,7 +4,7 @@ "eventnotecreated": "Annotation créée", "nonotes": "Il n'y a pas encore d'annotation de ce type", "note": "Annotation", - "notes": "Votre analyse et vos remarques personnelles", + "notes": "Annotations", "personalnotes": "Annotations personnelles", "publishstate": "Contexte", "sitenotes": "Annotations du site", diff --git a/www/addons/notes/lang/he.json b/www/addons/notes/lang/he.json index 2e3c5dd9644..416427b2dec 100644 --- a/www/addons/notes/lang/he.json +++ b/www/addons/notes/lang/he.json @@ -4,7 +4,7 @@ "eventnotecreated": "הערה נוצרה", "nonotes": "עדיין לא קיימות הערות מסוג זה", "note": "הערה", - "notes": "ההערות והניתוח הפרטיים שלך.", + "notes": "הערות", "personalnotes": "הערות אישיות", "publishstate": "תוכן", "sitenotes": "הערות אתר", diff --git a/www/addons/notes/lang/it.json b/www/addons/notes/lang/it.json index 90c300a1f85..0e9b001f16c 100644 --- a/www/addons/notes/lang/it.json +++ b/www/addons/notes/lang/it.json @@ -4,7 +4,7 @@ "eventnotecreated": "Creata annotazione", "nonotes": "Non sono presenti annotazioni di questo tipo.", "note": "Annotazione", - "notes": "Le tue note e analisi", + "notes": "Annotazioni", "personalnotes": "Annotazioni personali", "publishstate": "Contesto", "sitenotes": "Annotazioni del sito", diff --git a/www/addons/notes/lang/ja.json b/www/addons/notes/lang/ja.json index ae48a7ac252..6b3304c8067 100644 --- a/www/addons/notes/lang/ja.json +++ b/www/addons/notes/lang/ja.json @@ -4,7 +4,7 @@ "eventnotecreated": "作成したノート", "nonotes": "このタイプのノートはまだ存在しません", "note": "ノート", - "notes": "あなたの個人分析およびノート", + "notes": "ノート", "personalnotes": "パーソナルノート", "publishstate": "コンテキスト", "sitenotes": "サイトノート", diff --git a/www/addons/notes/lang/nl.json b/www/addons/notes/lang/nl.json index 64e66285bed..49a0c0209c4 100644 --- a/www/addons/notes/lang/nl.json +++ b/www/addons/notes/lang/nl.json @@ -4,7 +4,7 @@ "eventnotecreated": "Notitie gemaakt", "nonotes": "Er zijn nog geen notities van dit type.", "note": "Notitie", - "notes": "Je persoonlijke analyse en aantekeningen", + "notes": "Notities", "personalnotes": "Persoonlijke notities", "publishstate": "Context", "sitenotes": "Site notities", diff --git a/www/addons/notes/lang/ru.json b/www/addons/notes/lang/ru.json index 5b45804576d..ce3b230d19d 100644 --- a/www/addons/notes/lang/ru.json +++ b/www/addons/notes/lang/ru.json @@ -4,7 +4,7 @@ "eventnotecreated": "Заметка создана", "nonotes": "Тут нет заметок такого типа", "note": "Заметка", - "notes": "Ваши анализы и заметки", + "notes": "Заметки", "personalnotes": "Личные заметки", "publishstate": "Контекст", "sitenotes": "Заметки сайта", diff --git a/www/addons/notes/lang/sr-cr.json b/www/addons/notes/lang/sr-cr.json index afe5cd9b24d..0690900c3c5 100644 --- a/www/addons/notes/lang/sr-cr.json +++ b/www/addons/notes/lang/sr-cr.json @@ -4,7 +4,7 @@ "eventnotecreated": "Белешка креирана", "nonotes": "Још не постоје белешке овог типа", "note": "Белешка", - "notes": "Ваше приватне анализе и белешке", + "notes": "Белешке", "personalnotes": "Личне белешке", "publishstate": "Контекст", "sitenotes": "Белешке сајта", diff --git a/www/addons/notes/lang/sr-lt.json b/www/addons/notes/lang/sr-lt.json index 11b505f9b4b..d4a1ef87e7f 100644 --- a/www/addons/notes/lang/sr-lt.json +++ b/www/addons/notes/lang/sr-lt.json @@ -4,7 +4,7 @@ "eventnotecreated": "Beleška kreirana", "nonotes": "Još ne postoje beleške ovog tipa", "note": "Beleška", - "notes": "Vaše privatne analize i beleške", + "notes": "Beleške", "personalnotes": "Lične beleške", "publishstate": "Kontekst", "sitenotes": "Beleške sajta", diff --git a/www/addons/notes/lang/sv.json b/www/addons/notes/lang/sv.json index 75049c59549..8fcd87edc6d 100644 --- a/www/addons/notes/lang/sv.json +++ b/www/addons/notes/lang/sv.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anteckning skapade", "nonotes": "Det finns inga anteckningar av denna typ ännu", "note": "Anteckning", - "notes": "Din privata analys och anteckningar", + "notes": "Anteckningar", "personalnotes": "Personliga anteckningar", "publishstate": "Sammanhang", "sitenotes": "Webbplats anteckningar", diff --git a/www/addons/notes/lang/uk.json b/www/addons/notes/lang/uk.json index 9c2ba1ac6bb..8c815080c16 100644 --- a/www/addons/notes/lang/uk.json +++ b/www/addons/notes/lang/uk.json @@ -4,7 +4,7 @@ "eventnotecreated": "Записка створена", "nonotes": "Наразі немає записок такого типу", "note": "Записка", - "notes": "Ваш особистий аналіз і нотатки", + "notes": "Записки", "personalnotes": "Персональні записки", "publishstate": "Контекст", "sitenotes": "Записки сайту", diff --git a/www/addons/notifications/lang/ar.json b/www/addons/notifications/lang/ar.json index cab5daac101..edbc8f11446 100644 --- a/www/addons/notifications/lang/ar.json +++ b/www/addons/notifications/lang/ar.json @@ -1,5 +1,5 @@ { "errorgetnotifications": "خطأ في الحصول على الإشعارات", - "notifications": "إشعارات", + "notifications": "الإشعارات", "therearentnotificationsyet": "لا توجد إشعارات" } \ No newline at end of file diff --git a/www/addons/notifications/lang/cs.json b/www/addons/notifications/lang/cs.json index 7e1d1531bb2..b6fcbaa749e 100644 --- a/www/addons/notifications/lang/cs.json +++ b/www/addons/notifications/lang/cs.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Chyba při načítání oznámení.", "notificationpreferences": "Nastavení oznámení", - "notifications": "Informace", + "notifications": "Oznámení", "playsound": "Přehrát zvuk", "therearentnotificationsyet": "Nejsou žádná sdělení" } \ No newline at end of file diff --git a/www/addons/notifications/lang/da.json b/www/addons/notifications/lang/da.json index 2e190040f35..56219f0789c 100644 --- a/www/addons/notifications/lang/da.json +++ b/www/addons/notifications/lang/da.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Fejl ved hentning af underretninger", "notificationpreferences": "Indstillinger for underretninger", - "notifications": "Beskeder", + "notifications": "Underretninger", "therearentnotificationsyet": "Der er ingen underretninger" } \ No newline at end of file diff --git a/www/addons/notifications/lang/de.json b/www/addons/notifications/lang/de.json index 115925c10ca..b89ba1477d5 100644 --- a/www/addons/notifications/lang/de.json +++ b/www/addons/notifications/lang/de.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Fehler beim Laden der Mitteilungen", "notificationpreferences": "Systemmitteilungen", - "notifications": "Mitteilungen", + "notifications": "Systemmitteilungen", "playsound": "Sound abspielen", "therearentnotificationsyet": "Keine Mitteilungen" } \ No newline at end of file diff --git a/www/addons/notifications/lang/es.json b/www/addons/notifications/lang/es.json index 1049b40c7a5..db11ade05af 100644 --- a/www/addons/notifications/lang/es.json +++ b/www/addons/notifications/lang/es.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Error al obtener notificaciones", - "notificationpreferences": "Preferencias de notificación", - "notifications": "Avisos", + "notificationpreferences": "Preferencias de notificaciones", + "notifications": "Notificaciones", "playsound": "Reproducir sonido", "therearentnotificationsyet": "No hay notificaciones" } \ No newline at end of file diff --git a/www/addons/notifications/lang/eu.json b/www/addons/notifications/lang/eu.json index 2363a8e19af..256b8e1fe3e 100644 --- a/www/addons/notifications/lang/eu.json +++ b/www/addons/notifications/lang/eu.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Errorea jakinarazpenak jasotzean", - "notificationpreferences": "Jakinarazpenen hobespenak", + "notificationpreferences": "Jakinarazpen hobespenak", "notifications": "Jakinarazpenak", "playsound": "Erreproduzitu soinua", "therearentnotificationsyet": "Ez dago jakinarazpenik" diff --git a/www/addons/notifications/lang/he.json b/www/addons/notifications/lang/he.json index 39e5a6ed7a5..1c1591b94ed 100644 --- a/www/addons/notifications/lang/he.json +++ b/www/addons/notifications/lang/he.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "שגיאה בטעינת התראות", "notificationpreferences": "העדפות הודעות", - "notifications": "עדכונים והודעות", + "notifications": "התראות", "therearentnotificationsyet": "אין התראות" } \ No newline at end of file diff --git a/www/addons/notifications/lang/ja.json b/www/addons/notifications/lang/ja.json index 8c6ea812ddf..22daa00358e 100644 --- a/www/addons/notifications/lang/ja.json +++ b/www/addons/notifications/lang/ja.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "通知の取得中にエラーが発生しました。", - "notificationpreferences": "通知プリファレンス", + "notificationpreferences": "通知の設定", "notifications": "通知", "playsound": "音を出力", "therearentnotificationsyet": "通知はありません" diff --git a/www/addons/notifications/lang/nl.json b/www/addons/notifications/lang/nl.json index 1f96952c939..c884b7364ea 100644 --- a/www/addons/notifications/lang/nl.json +++ b/www/addons/notifications/lang/nl.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Fout bij het ophalen van notificaties", - "notificationpreferences": "Meldingen voorkeuren", + "notificationpreferences": "Notificatievoorkeuren", "notifications": "Meldingen", "playsound": "Speel geluid", "therearentnotificationsyet": "Er zijn geen meldingen" diff --git a/www/addons/notifications/lang/sv.json b/www/addons/notifications/lang/sv.json index ce4f0ccc515..8029962c563 100644 --- a/www/addons/notifications/lang/sv.json +++ b/www/addons/notifications/lang/sv.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Fel att få meddelanden", "notificationpreferences": "Välj inställningar för notiser", - "notifications": "Administration", + "notifications": "Meddelanden", "therearentnotificationsyet": "Det finns inga meddelanden" } \ No newline at end of file diff --git a/www/addons/notifications/lang/uk.json b/www/addons/notifications/lang/uk.json index 791d1338ac3..c3d124173af 100644 --- a/www/addons/notifications/lang/uk.json +++ b/www/addons/notifications/lang/uk.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Помилка отримання сповіщень", "notificationpreferences": "Налаштування сповіщень", - "notifications": "Повідомлення", + "notifications": "Сповіщення", "playsound": "Грати звук", "therearentnotificationsyet": "Немає сповіщень" } \ No newline at end of file diff --git a/www/addons/participants/lang/ar.json b/www/addons/participants/lang/ar.json index 91db007489d..8c013f870e2 100644 --- a/www/addons/participants/lang/ar.json +++ b/www/addons/participants/lang/ar.json @@ -1,4 +1,4 @@ { "noparticipants": "لم يتم العثور على مشاركين في هذا المقرر الدراسي", - "participants": "المشتركون" + "participants": "المشاركين" } \ No newline at end of file diff --git a/www/addons/participants/lang/cs.json b/www/addons/participants/lang/cs.json index 311ee521366..2092b03a730 100644 --- a/www/addons/participants/lang/cs.json +++ b/www/addons/participants/lang/cs.json @@ -1,4 +1,4 @@ { - "noparticipants": "Pro tento kurz nenalezen žádný účastník", - "participants": "Přispěvatelé" + "noparticipants": "Pro tento kurz nenalezeni účastníci", + "participants": "Účastníci" } \ No newline at end of file diff --git a/www/addons/participants/lang/da.json b/www/addons/participants/lang/da.json index 28829f714a6..69f209799f8 100644 --- a/www/addons/participants/lang/da.json +++ b/www/addons/participants/lang/da.json @@ -1,4 +1,4 @@ { - "noparticipants": "Ingen deltagere fundet.", + "noparticipants": "Ingen deltagere fundet på dette kursus", "participants": "Deltagere" } \ No newline at end of file diff --git a/www/addons/participants/lang/de.json b/www/addons/participants/lang/de.json index 343c2a2709e..95a259f09bd 100644 --- a/www/addons/participants/lang/de.json +++ b/www/addons/participants/lang/de.json @@ -1,4 +1,4 @@ { - "noparticipants": "Keine Teilnehmer/innen für diesen Kurs gefunden", - "participants": "Teilnehmer/innen" + "noparticipants": "Keine Personen für diesen Kurs gefunden", + "participants": "Personen" } \ No newline at end of file diff --git a/www/addons/participants/lang/el.json b/www/addons/participants/lang/el.json index e1a786afbb1..846f209c0b0 100644 --- a/www/addons/participants/lang/el.json +++ b/www/addons/participants/lang/el.json @@ -1,4 +1,4 @@ { - "noparticipants": "Δε βρέθηκαν συμμετέχονες γι' αυτό το μάθημα", + "noparticipants": "Δεν βρέθηκαν συμμετέχοντες σε αυτό το μάθημα", "participants": "Συμμετέχοντες" } \ No newline at end of file diff --git a/www/addons/participants/lang/es.json b/www/addons/participants/lang/es.json index 62113ad2ef9..c64b8bf86b4 100644 --- a/www/addons/participants/lang/es.json +++ b/www/addons/participants/lang/es.json @@ -1,4 +1,4 @@ { - "noparticipants": "No se encontraron participantes en este curso", + "noparticipants": "No se han encontrado participantes en este curso", "participants": "Participantes" } \ No newline at end of file diff --git a/www/addons/participants/lang/eu.json b/www/addons/participants/lang/eu.json index 0a84454d0c0..b716ea85dad 100644 --- a/www/addons/participants/lang/eu.json +++ b/www/addons/participants/lang/eu.json @@ -1,4 +1,4 @@ { - "noparticipants": "Ez da partaiderik aurkitu ikastaro honetarako", + "noparticipants": "Ez da parte-hartzailerik aurkitu ikastaro honetan", "participants": "Partaideak" } \ No newline at end of file diff --git a/www/addons/participants/lang/fr.json b/www/addons/participants/lang/fr.json index 0a75ac6f8c8..fc97610a609 100644 --- a/www/addons/participants/lang/fr.json +++ b/www/addons/participants/lang/fr.json @@ -1,4 +1,4 @@ { - "noparticipants": "Aucun participant trouvé", + "noparticipants": "Aucun participant trouvé dans ce cours", "participants": "Participants" } \ No newline at end of file diff --git a/www/addons/participants/lang/it.json b/www/addons/participants/lang/it.json index 21d39dce004..0d16202be57 100644 --- a/www/addons/participants/lang/it.json +++ b/www/addons/participants/lang/it.json @@ -1,4 +1,4 @@ { - "noparticipants": "Non sono stati trovati partecipanti.", - "participants": "Sono autorizzati ad inserire record" + "noparticipants": "In questo corso non sono stati trovati partecipanti", + "participants": "Partecipanti" } \ No newline at end of file diff --git a/www/addons/participants/lang/ja.json b/www/addons/participants/lang/ja.json index 8fbbcbb3976..3656df9f659 100644 --- a/www/addons/participants/lang/ja.json +++ b/www/addons/participants/lang/ja.json @@ -1,4 +1,4 @@ { - "noparticipants": "このコースには参加者が登録されていません。", + "noparticipants": "このコースには参加者がいません。", "participants": "参加者" } \ No newline at end of file diff --git a/www/addons/participants/lang/nl.json b/www/addons/participants/lang/nl.json index 33b07998414..2beef686f18 100644 --- a/www/addons/participants/lang/nl.json +++ b/www/addons/participants/lang/nl.json @@ -1,4 +1,4 @@ { - "noparticipants": "Geen gebruikers gevonden in deze cursus", + "noparticipants": "Geen deelnemers gevonden in deze cursus", "participants": "Deelnemers" } \ No newline at end of file diff --git a/www/addons/participants/lang/sr-cr.json b/www/addons/participants/lang/sr-cr.json index 2c8a28575f0..5c5170c3c41 100644 --- a/www/addons/participants/lang/sr-cr.json +++ b/www/addons/participants/lang/sr-cr.json @@ -1,4 +1,4 @@ { - "noparticipants": "Није пронађен ни један учесник на овом курсу", + "noparticipants": "Ниједан учесник није пронађен на овом курсу.", "participants": "Учесници" } \ No newline at end of file diff --git a/www/addons/participants/lang/sr-lt.json b/www/addons/participants/lang/sr-lt.json index eba071633fd..090378abb39 100644 --- a/www/addons/participants/lang/sr-lt.json +++ b/www/addons/participants/lang/sr-lt.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nije pronađen ni jedan učesnik na ovom kursu", + "noparticipants": "Nijedan učesnik nije pronađen na ovom kursu.", "participants": "Učesnici" } \ No newline at end of file diff --git a/www/addons/participants/lang/sv.json b/www/addons/participants/lang/sv.json index 27833cf5412..ab7780c8f28 100644 --- a/www/addons/participants/lang/sv.json +++ b/www/addons/participants/lang/sv.json @@ -1,4 +1,4 @@ { - "noparticipants": "Inga deltagare hittades för denna kurs", + "noparticipants": "Inga deltagare hittades för kursen", "participants": "Deltagare" } \ No newline at end of file diff --git a/www/addons/participants/lang/uk.json b/www/addons/participants/lang/uk.json index 9a3ebc4a3b3..2a8bcb3747e 100644 --- a/www/addons/participants/lang/uk.json +++ b/www/addons/participants/lang/uk.json @@ -1,4 +1,4 @@ { - "noparticipants": "Не знайдені учасники для цього курсу", + "noparticipants": "Учасників не знайдено за цим курсом", "participants": "Учасники" } \ No newline at end of file diff --git a/www/core/components/course/lang/ar.json b/www/core/components/course/lang/ar.json index 47a7f04e4bb..ab7fafab59b 100644 --- a/www/core/components/course/lang/ar.json +++ b/www/core/components/course/lang/ar.json @@ -1,8 +1,8 @@ { "allsections": "كل الأقسام", - "contents": "محتويات", + "contents": "المحتويات", "couldnotloadsections": "لم يتم تحميل كل الأقسام، من فضلك حاول مرة أخرى لاحقاَ", "errordownloadingsection": "خطأ عن تنزيل الأقسام", "hiddenfromstudents": "مخفي عن الطلاب", - "showall": "عرض الكل {{$a}}" + "showall": "عرض الكل" } \ No newline at end of file diff --git a/www/core/components/course/lang/cs.json b/www/core/components/course/lang/cs.json index 6de4fc23e30..e8cac178795 100644 --- a/www/core/components/course/lang/cs.json +++ b/www/core/components/course/lang/cs.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Skryté před studenty", "nocontentavailable": "V tuto chvíli není k dispozici žádný obsah.", "overriddennotice": "Vaše výsledná známka za tuto činnost byla ručně upravena.", - "showall": "Ukázat všechny {{$a}}", + "showall": "Zobrazit vše", "useactivityonbrowser": "Můžete i nadále používat jej pomocí prohlížeče zařízení." } \ No newline at end of file diff --git a/www/core/components/course/lang/da.json b/www/core/components/course/lang/da.json index 2d70a448b4f..9242ee4ca2d 100644 --- a/www/core/components/course/lang/da.json +++ b/www/core/components/course/lang/da.json @@ -9,5 +9,5 @@ "hiddenfromstudents": "Skjult for studerende", "nocontentavailable": "Intet indhold tilgængeligt lige nu.", "overriddennotice": "Din endelige karakter fra denne aktivitet blev justeret manuelt.", - "showall": "Vis alle {{$a}}" + "showall": "Vis alt" } \ No newline at end of file diff --git a/www/core/components/course/lang/de.json b/www/core/components/course/lang/de.json index ef581d50890..16ab12b9912 100644 --- a/www/core/components/course/lang/de.json +++ b/www/core/components/course/lang/de.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Für Teilnehmer/innen verborgen", "nocontentavailable": "Momentan sind keine Inhalte verfügbar", "overriddennotice": "Die endgültige Bewertung zu dieser Aktivität wurde manuell bearbeitet.", - "showall": "Alle {{$a}} anzeigen", + "showall": "Alles anzeigen", "useactivityonbrowser": "Sie können dafür weiterhin den normalen Browser verwenden." } \ No newline at end of file diff --git a/www/core/components/course/lang/el.json b/www/core/components/course/lang/el.json index abc9558d36b..ee4ca9da68c 100644 --- a/www/core/components/course/lang/el.json +++ b/www/core/components/course/lang/el.json @@ -17,5 +17,5 @@ "hiddenfromstudents": "Κρυμμένο από τους σπουδαστές", "nocontentavailable": "Δεν υπάρχει περιεχόμενο διαθέσιμο αυτή τη στιγμή.", "overriddennotice": "Ο τελικός βαθμός από αυτή τη δραστηριότητα ρυθμίστηκε χειροκίνητα.", - "showall": "Προβολή όλων {{$a}}" + "showall": "Προβολή όλων" } \ No newline at end of file diff --git a/www/core/components/course/lang/es.json b/www/core/components/course/lang/es.json index b17f87a0442..140acb12ae9 100644 --- a/www/core/components/course/lang/es.json +++ b/www/core/components/course/lang/es.json @@ -9,7 +9,7 @@ "confirmdownload": "Está a punto de descargar {{size}}. ¿Está seguro de que desea continuar?", "confirmdownloadunknownsize": "No se puede calcular el tamaño de la descarga. ¿Está seguro que quiere descargarlo?", "confirmpartialdownloadsize": "Está a punto de descargar al menos {{size}}. ¿Está seguro de querer continuar?", - "contents": "Contenido", + "contents": "Contenidos", "couldnotloadsectioncontent": "No se ha podido cargar el contenido de la sección, por favor inténtelo más tarde.", "couldnotloadsections": "No se ha podido cargar las secciones, por favor inténtelo más tarde.", "errordownloadingsection": "Error durante la descarga de la sección.", @@ -17,6 +17,6 @@ "hiddenfromstudents": "No mostrado a los estudiantes", "nocontentavailable": "No hay contenido disponible en este momento.", "overriddennotice": "La calificación final de esta actividad ha sido ajustada manualmente.", - "showall": "Mostrar {{$a}}", + "showall": "Mostrar todo", "useactivityonbrowser": "Puede acceder a esta actividad mediante el navegador de su dispositivo." } \ No newline at end of file diff --git a/www/core/components/course/lang/eu.json b/www/core/components/course/lang/eu.json index 5c01bf83579..c42572550ec 100644 --- a/www/core/components/course/lang/eu.json +++ b/www/core/components/course/lang/eu.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Ezkutuan ikasleentzat", "nocontentavailable": "Ez dago edukirik eskuragarri momentu honetan.", "overriddennotice": "Jarduera honetako zure azken kalifikazioa eskuz egokitu da.", - "showall": "Erakutsi denak: {{$a}}", + "showall": "Erakutsi denak", "useactivityonbrowser": "Zure gailuko nabigatzailea erabilita erabili dezakezu." } \ No newline at end of file diff --git a/www/core/components/course/lang/fr.json b/www/core/components/course/lang/fr.json index a0ac1336588..fa5ca9f7fb7 100644 --- a/www/core/components/course/lang/fr.json +++ b/www/core/components/course/lang/fr.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Caché pour les participants", "nocontentavailable": "Aucun contenu disponible actuellement.", "overriddennotice": "Votre note finale pour cette activité a été ajustée manuellement.", - "showall": "Afficher tous les {{$a}}", + "showall": "Tout afficher", "useactivityonbrowser": "Vous pouvez continuer à l'utiliser avec le navigateur de votre appareil." } \ No newline at end of file diff --git a/www/core/components/course/lang/he.json b/www/core/components/course/lang/he.json index 413e5343000..1789a2e476e 100644 --- a/www/core/components/course/lang/he.json +++ b/www/core/components/course/lang/he.json @@ -6,5 +6,5 @@ "hiddenfromstudents": "מוסתר בפני סטודנטים", "nocontentavailable": "אין תוכן זמין כרגע.", "overriddennotice": "הציון הסופי שלך מפעילות זו הותאם ידנית.", - "showall": "תצוגת כל ה-{{$a}}" + "showall": "הראה הכל" } \ No newline at end of file diff --git a/www/core/components/course/lang/it.json b/www/core/components/course/lang/it.json index 82112c25cdd..2f6968177c8 100644 --- a/www/core/components/course/lang/it.json +++ b/www/core/components/course/lang/it.json @@ -9,5 +9,5 @@ "hiddenfromstudents": "Nascosta agli studenti", "nocontentavailable": "Non sono presenti contenuti.", "overriddennotice": "La tua valutazione finale da questa attività è stata modificata manualmente.", - "showall": "Visualizza tutti i {{$a}}" + "showall": "Visualizza tutto" } \ No newline at end of file diff --git a/www/core/components/course/lang/ja.json b/www/core/components/course/lang/ja.json index 2e41ef36acc..2059fb9fb13 100644 --- a/www/core/components/course/lang/ja.json +++ b/www/core/components/course/lang/ja.json @@ -3,5 +3,5 @@ "contents": "コンテンツ", "hiddenfromstudents": "学生から非表示", "overriddennotice": "この活動に関するあなたの評点は手動で調整されました。", - "showall": "すべての {{$a}} を表示する" + "showall": "すべて表示" } \ No newline at end of file diff --git a/www/core/components/course/lang/nl.json b/www/core/components/course/lang/nl.json index 3f619164387..e341c7adfe2 100644 --- a/www/core/components/course/lang/nl.json +++ b/www/core/components/course/lang/nl.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Verborgen voor leerlingen", "nocontentavailable": "Geen inhoud beschikbaar.", "overriddennotice": "Je totaalcijfer voor deze activiteit is manueel aangepast.", - "showall": "Laat alle {{$a}} zien", + "showall": "Toon alle", "useactivityonbrowser": "Je kunt de activiteit nog steeds via de browser van je apparaat gebruiken" } \ No newline at end of file diff --git a/www/core/components/course/lang/ru.json b/www/core/components/course/lang/ru.json index 0d6968e390e..6a0a1c3f43a 100644 --- a/www/core/components/course/lang/ru.json +++ b/www/core/components/course/lang/ru.json @@ -6,5 +6,5 @@ "hiddenfromstudents": "Скрыто от студентов", "nocontentavailable": "Нет контента, доступного в данный момент", "overriddennotice": "Ваша итоговая оценка за этот элемента курса была скорректирована вручную.", - "showall": "Показать все {{$a}}" + "showall": "Показать все" } \ No newline at end of file diff --git a/www/core/components/course/lang/sr-cr.json b/www/core/components/course/lang/sr-cr.json index 15ed523e7b2..40ab9bef16c 100644 --- a/www/core/components/course/lang/sr-cr.json +++ b/www/core/components/course/lang/sr-cr.json @@ -9,7 +9,7 @@ "confirmdownload": "Намеравате да преузмете {{size}}. Да ли сте сигурни да желите да наставите?", "confirmdownloadunknownsize": "Нисмо могли да израчунамо величину преузимање. Да ли сте сигурни да желите да преузмете?", "confirmpartialdownloadsize": "Намеравате да преузмете најмање {{size}}. Да ли сте сигурни да желите да наставите?", - "contents": "Садржај", + "contents": "Садржаји", "couldnotloadsectioncontent": "Није могуће учитати садржај секције, покушајте поново касније.", "couldnotloadsections": "Није могуће учитати секције, покушајте поново касније.", "errordownloadingsection": "Грешка приликом преузимања секције.", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Сакривено од полазника", "nocontentavailable": "Никакав садржај није доступан у овом тренутку.", "overriddennotice": "Ваша завршна оцена за ову активност је ручно подешена", - "showall": "Прикажи свих {{$a}}", + "showall": "Прикажи све", "useactivityonbrowser": "Још увек можете да га користите помоћу веб читача вашег уређаја." } \ No newline at end of file diff --git a/www/core/components/course/lang/sr-lt.json b/www/core/components/course/lang/sr-lt.json index a1522ae721c..744f10eb4f0 100644 --- a/www/core/components/course/lang/sr-lt.json +++ b/www/core/components/course/lang/sr-lt.json @@ -9,7 +9,7 @@ "confirmdownload": "Nameravate da preuzmete {{size}}. Da li ste sigurni da želite da nastavite?", "confirmdownloadunknownsize": "Nismo mogli da izračunamo veličinu preuzimanje. Da li ste sigurni da želite da preuzmete?", "confirmpartialdownloadsize": "Nameravate da preuzmete najmanje {{size}}. Da li ste sigurni da želite da nastavite?", - "contents": "Sadržaj", + "contents": "Sadržaji", "couldnotloadsectioncontent": "Nije moguće učitati sadržaj sekcije, pokušajte ponovo kasnije.", "couldnotloadsections": "Nije moguće učitati sekcije, pokušajte ponovo kasnije.", "errordownloadingsection": "Greška prilikom preuzimanja sekcije.", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Sakriveno od polaznika", "nocontentavailable": "Nikakav sadržaj nije dostupan u ovom trenutku.", "overriddennotice": "Vaša završna ocena za ovu aktivnost je ručno podešena", - "showall": "Prikaži svih {{$a}}", + "showall": "Prikaži sve", "useactivityonbrowser": "Još uvek možete da ga koristite pomoću veb čitača vašeg uređaja." } \ No newline at end of file diff --git a/www/core/components/course/lang/sv.json b/www/core/components/course/lang/sv.json index ecabe8e2fc5..0063575e970 100644 --- a/www/core/components/course/lang/sv.json +++ b/www/core/components/course/lang/sv.json @@ -10,5 +10,5 @@ "hiddenfromstudents": "Dolt för studenter/deltagare/elever/lärande", "nocontentavailable": "Inget innehåll tillgängligt för tillfället.", "overriddennotice": "Ditt sammanfattningsbetyg för den här aktiviteten har justerats manuellt.", - "showall": "Visa alla {{$a}}" + "showall": "Visa alla" } \ No newline at end of file diff --git a/www/core/components/course/lang/uk.json b/www/core/components/course/lang/uk.json index faf2b294bc7..232aa47f117 100644 --- a/www/core/components/course/lang/uk.json +++ b/www/core/components/course/lang/uk.json @@ -9,7 +9,7 @@ "confirmdownload": "Ви збираєтеся завантажити {{size}}. Ви впевнені, що хочете продовжити?", "confirmdownloadunknownsize": "Ми не змогли розрахувати розмір файлу. Ви впевнені, що ви хочете завантажити?", "confirmpartialdownloadsize": "Ви збираєтеся завантажити принаймні {{size}}. Ви впевнені, що хочете продовжити?", - "contents": "Зміст", + "contents": "Контент", "couldnotloadsectioncontent": "Не вдалося завантажити вміст розділу, будь ласка, спробуйте ще раз пізніше.", "couldnotloadsections": "Не вдалося завантажити розділи, будь ласка, спробуйте ще раз пізніше.", "errordownloadingsection": "Помилка в завантаженні.", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Сховане від студентів", "nocontentavailable": "Немає контенту, доступного в даний момент.", "overriddennotice": "Ваші фінальні бали з даної активності були відкореговані вручну.", - "showall": "Показати всі {{$a}}", + "showall": "Показати все", "useactivityonbrowser": "Ви все ще можете використовувати його за допомогою браузера пристрою." } \ No newline at end of file diff --git a/www/core/components/courses/lang/cs.json b/www/core/components/courses/lang/cs.json index 59626b53315..3edb8f247c1 100644 --- a/www/core/components/courses/lang/cs.json +++ b/www/core/components/courses/lang/cs.json @@ -5,7 +5,7 @@ "categories": "Kategorie", "confirmselfenrol": "Jste si jisti, že chcete zapsat se do tohoto kurzu?", "courses": "Kurzy", - "enrolme": "Zapsat se do kurzu", + "enrolme": "Zapsat se", "errorloadcategories": "Při načítání kategorií došlo k chybě.", "errorloadcourses": "Při načítání kurzů došlo k chybě.", "errorsearching": "Při vyhledávání došlo k chybě.", @@ -13,12 +13,12 @@ "filtermycourses": "Filtrovat mé kurzy", "frontpage": "Titulní stránka", "mycourses": "Moje kurzy", - "nocourses": "Žádné dostupné informace o kurzech", + "nocourses": "O kurzu nejsou žádné informace.", "nocoursesyet": "Žádný kurz v této kategorii", - "nosearchresults": "Vaše vyhledávání nepřineslo žádný výsledek", - "notenroled": "Nejste zapsáni v tomto kurzu", + "nosearchresults": "Z vašeho hledání nebyly nalezeny žádné výsledky", + "notenroled": "V tomto kurzu nejste zapsán", "notenrollable": "Do tohoto kurzu se nemůžete sami zapsat.", - "password": "Heslo", + "password": "Klíč zápisu", "search": "Vyhledat", "searchcourses": "Vyhledat kurzy", "searchcoursesadvice": "Můžete použít tlačítko Vyhledat kurzy, pracovat jako host nebo se zapsat do kurzů, které to umožňují.", diff --git a/www/core/components/courses/lang/da.json b/www/core/components/courses/lang/da.json index 7c3706806c8..d55c5eb24b7 100644 --- a/www/core/components/courses/lang/da.json +++ b/www/core/components/courses/lang/da.json @@ -11,12 +11,12 @@ "filtermycourses": "Filtrer mit kursus", "frontpage": "Forside", "mycourses": "Mine kurser", - "nocourses": "Du er ikke tilmeldt nogen kurser.", + "nocourses": "Der er ingen kursusoplysninger at vise.", "nocoursesyet": "Der er ingen kurser i denne kategori", - "nosearchresults": "Der var ingen beskeder der opfyldte søgekriteriet", + "nosearchresults": "Din søgning gav ingen resultater", "notenroled": "Du er ikke tilmeldt dette kursus", "notenrollable": "Du kan ikke selv tilmelde dig dette kursus.", - "password": "Adgangskode", + "password": "Tilmeldingsnøgle", "search": "Søg...", "searchcourses": "Søg kurser", "searchcoursesadvice": "Du kan bruge knappen kursussøgning for at få adgang som gæst eller tilmelde dig kurser der tillader det.", diff --git a/www/core/components/courses/lang/de.json b/www/core/components/courses/lang/de.json index 861a406fe43..25280c83d2e 100644 --- a/www/core/components/courses/lang/de.json +++ b/www/core/components/courses/lang/de.json @@ -5,7 +5,7 @@ "categories": "Kategorien", "confirmselfenrol": "Möchten Sie sich selbst in diesen Kurs einschreiben?", "courses": "Kurse", - "enrolme": "Einschreiben", + "enrolme": "Selbst einschreiben", "errorloadcategories": "Fehler beim Laden der Kursbereiche", "errorloadcourses": "Fehler beim Laden der Kurse", "errorsearching": "Fehler beim Suchen", @@ -13,12 +13,12 @@ "filtermycourses": "Meine Kurse filtern", "frontpage": "Startseite", "mycourses": "Meine Kurse", - "nocourses": "Keine Kursinformationen", + "nocourses": "Keine Kursinformation", "nocoursesyet": "Keine Kurse in diesem Kursbereich", - "nosearchresults": "Keine Ergebnisse", - "notenroled": "Sie sind nicht in diesen Kurs eingeschrieben", + "nosearchresults": "Keine Suchergebnisse", + "notenroled": "Sie sind nicht in diesen Kurs eingeschrieben.", "notenrollable": "Sie können sich nicht selbst in diesen Kurs einschreiben.", - "password": "Kennwort", + "password": "Einschreibeschlüssel", "search": "Suche", "searchcourses": "Kurse suchen", "searchcoursesadvice": "Sie können Kurse suchen, um als Gast teilzunehmen oder sich selbst einzuschreiben, falls dies erlaubt ist.", diff --git a/www/core/components/courses/lang/el.json b/www/core/components/courses/lang/el.json index 819d0105246..e662603390c 100644 --- a/www/core/components/courses/lang/el.json +++ b/www/core/components/courses/lang/el.json @@ -13,12 +13,12 @@ "filtermycourses": "Φιλτράρισμα των μαθημάτων μου", "frontpage": "Αρχική σελίδα", "mycourses": "Τα μαθήματά μου", - "nocourses": "Δεν υπάρχει πληροφορία του μαθήματος για προβολή.", + "nocourses": "Δεν υπάρχουν πληροφορίες για αυτό το μάθημα.", "nocoursesyet": "Δεν υπάρχουν μαθήματα σε αυτήν την κατηγορία", - "nosearchresults": "Δε βρέθηκαν αποτελέσματα για την αναζήτησή σας", - "notenroled": "Δεν είσαι εγγεγραμμένος σε αυτό το μάθημα", + "nosearchresults": "Δεν βρέθηκαν αποτελέσματα", + "notenroled": "Δεν έχετε εγγραφεί σε αυτό το μάθημα", "notenrollable": "Δεν μπορείτε να αυτο-εγγραφείτε σε αυτό το μάθημα.", - "password": "Κωδικός πρόσβασης", + "password": "Κλειδί εγγραφής", "search": "Έρευνα", "searchcourses": "Αναζήτηση μαθημάτων", "searchcoursesadvice": "Μπορείτε να χρησιμοποιήσετε το κουμπί Αναζήτηση μαθημάτων για πρόσβαση ως επισκέπτης ή για να αυτο-εγγραφείτε σε μαθήματα που το επιτρέπουν.", diff --git a/www/core/components/courses/lang/es.json b/www/core/components/courses/lang/es.json index 71e6707f3a3..07e585e13d0 100644 --- a/www/core/components/courses/lang/es.json +++ b/www/core/components/courses/lang/es.json @@ -13,12 +13,12 @@ "filtermycourses": "Filtrar mis cursos", "frontpage": "Página Principal", "mycourses": "Mis cursos", - "nocourses": "Sin cursos", + "nocourses": "No hay información del curso para mostrar.", "nocoursesyet": "No hay cursos en esta categoría", - "nosearchresults": "La búsqueda no produjo resultados", - "notenroled": "Usted no está matriculado en este curso", + "nosearchresults": "No hay resultados para su búsqueda", + "notenroled": "No está inscrito en este curso", "notenrollable": "No puede auto-matricularse en este curso.", - "password": "Contraseña", + "password": "Clave", "search": "Búsqueda", "searchcourses": "Buscar cursos", "searchcoursesadvice": "Puede utilizar el botón de buscar cursos para acceder como invitado o auto-matricularse en los cursos que lo permitan.", diff --git a/www/core/components/courses/lang/eu.json b/www/core/components/courses/lang/eu.json index a0adcc52721..b5c88bc0330 100644 --- a/www/core/components/courses/lang/eu.json +++ b/www/core/components/courses/lang/eu.json @@ -5,7 +5,7 @@ "categories": "Kategoriak", "confirmselfenrol": "Ziur zaude ikastaro honetan izena eman nahi duzula?", "courses": "Ikastaroak", - "enrolme": "Matrikula nazazu", + "enrolme": "Matrikulatu nazazu", "errorloadcategories": "Errorea gertatu da kategoriak kargatzean.", "errorloadcourses": "Errore bat gertatu da ikastaroak kargatzean.", "errorsearching": "Errorea gertatu da bilatzean.", @@ -13,12 +13,12 @@ "filtermycourses": "Nire ikastaroak iragazi", "frontpage": "Hasiera-orria", "mycourses": "Nire ikastaroak", - "nocourses": "Ez dago ikastaroei buruzko informaziorik", + "nocourses": "Ez dago erakusteko ikastaro-informaziorik.", "nocoursesyet": "Ez dago ikastarorik kategoria honetan", - "nosearchresults": "Zure bilaketak du ezer topatu", + "nosearchresults": "Ez da emaitzik aurkitu zure bilaketarentzat", "notenroled": "Ez zaude matrikulatuta ikastaro honetan", "notenrollable": "Ezin duzu zeure burua matrikulatu ikastaro honetan.", - "password": "Pasahitza", + "password": "Matrikulazio-giltza", "search": "Bilatu...", "searchcourses": "Bilatu ikastaroak", "searchcoursesadvice": "Bilatu botoia erabil dezakezu ikastaroak topatu eta bisitari gisa sartu edo bertan matrikulatzeko ikastaroak baimentzen badu.", diff --git a/www/core/components/courses/lang/fr.json b/www/core/components/courses/lang/fr.json index abc9016dbc1..703265270ca 100644 --- a/www/core/components/courses/lang/fr.json +++ b/www/core/components/courses/lang/fr.json @@ -13,12 +13,12 @@ "filtermycourses": "Filtrer mes cours", "frontpage": "Page d'accueil", "mycourses": "Mes cours", - "nocourses": "Aucune information de cours à afficher.", + "nocourses": "Aucune information de cours à afficher", "nocoursesyet": "Il n'y a pas encore de cours", - "nosearchresults": "Cette recherche n'a fourni aucun résultat", + "nosearchresults": "Votre recherche n'a donné aucun résultat", "notenroled": "Vous n'êtes pas inscrit à ce cours", "notenrollable": "Vous ne pouvez pas vous inscrire vous-même à ce cours.", - "password": "Mot de passe", + "password": "Clef d'inscription", "search": "Recherche", "searchcourses": "Rechercher les cours", "searchcoursesadvice": "Veuillez utiliser le bouton de recherche de cours pour accéder anonymement à des cours ou vous inscrire vous-même à des cours qui le permettent.", diff --git a/www/core/components/courses/lang/it.json b/www/core/components/courses/lang/it.json index 72658419e6d..f0f3a476b70 100644 --- a/www/core/components/courses/lang/it.json +++ b/www/core/components/courses/lang/it.json @@ -11,12 +11,12 @@ "filtermycourses": "Filtra i miei corsi", "frontpage": "Pagina home", "mycourses": "I miei corsi", - "nocourses": "Non sono presenti informazioni sui corsi.", + "nocourses": "Non sono presenti informazioni sul corso.", "nocoursesyet": "Questa categoria non ha corsi", - "nosearchresults": "La tua ricerca non ha prodotto risultati", + "nosearchresults": "La ricerca non ha prodotto risultati", "notenroled": "Non sei iscritto in questo corso", "notenrollable": "Non puoi iscriverti al corso.", - "password": "Password", + "password": "Chiave di iscrizione", "search": "Ricerca", "searchcourses": "Cerca corsi", "searchcoursesadvice": "Puoi utilizzare la ricerca corsi per accedere come ospite oppure iscriverti nei corsi che lo consentono.", diff --git a/www/core/components/courses/lang/nl.json b/www/core/components/courses/lang/nl.json index 7d30698aa76..71fd4592a9e 100644 --- a/www/core/components/courses/lang/nl.json +++ b/www/core/components/courses/lang/nl.json @@ -5,7 +5,7 @@ "categories": "Categorieën", "confirmselfenrol": "Weet je zeker dat je je wil aanmelden in deze cursus?", "courses": "Cursussen", - "enrolme": "Laat me in de cursus", + "enrolme": "Meld me aan", "errorloadcategories": "Er is een fout opgetreden bij het ophalen van categorieën", "errorloadcourses": "Er is een fout opgetreden tijdens het laden van de cursussen.", "errorsearching": "Er is een fout opgetreden tijdens het zoeken.", @@ -13,12 +13,12 @@ "filtermycourses": "Filter mijn cursussen", "frontpage": "Startpagina", "mycourses": "Mijn cursussen", - "nocourses": "Geen cursusinformatie", + "nocourses": "Geen cursusinformatie beschikbaar.", "nocoursesyet": "Er zijn geen cursussen in deze categorie", - "nosearchresults": "Geen resultaten", - "notenroled": "Je bent niet aangemeld in deze cursus", + "nosearchresults": "Je zoekopdracht gaf geen resultaten", + "notenroled": "Je bent niet aangemeld in deze cursus.", "notenrollable": "Je kunt jezelf niet aanmelden in deze cursus.", - "password": "Wachtwoord", + "password": "Aanmeldingssleutel", "search": "Zoeken...", "searchcourses": "Zoek cursussen", "searchcoursesadvice": "Je kunt via de cursus zoekknop toegang krijgen als gast of jezelf aanmelden in cursussen die dit toestaan.", diff --git a/www/core/components/courses/lang/sr-cr.json b/www/core/components/courses/lang/sr-cr.json index 53f58f1e921..12cd32f1434 100644 --- a/www/core/components/courses/lang/sr-cr.json +++ b/www/core/components/courses/lang/sr-cr.json @@ -13,12 +13,12 @@ "filtermycourses": "Филтрирај моје курсеве", "frontpage": "Насловна страница", "mycourses": "Моји курсеви", - "nocourses": "Нема информација о курсу за приказ.", + "nocourses": "Нема информација о курсевима за приказ.", "nocoursesyet": "Нема курсева у овој категорији", - "nosearchresults": "Ваша претрага није дала резултате", + "nosearchresults": "Није било резултата ваше претраге", "notenroled": "Нисте уписани на овај курс", "notenrollable": "Не можете сами да се упишете на овај курс.", - "password": "Лозинка", + "password": "Приступна лозинка курса", "search": "Претрага", "searchcourses": "Претражи курсеве", "searchcoursesadvice": "Можете користити дугме за претрагу курсева како бисте им приступили као гост или се уписали на курсеве који то допуштају.", diff --git a/www/core/components/courses/lang/sr-lt.json b/www/core/components/courses/lang/sr-lt.json index 154bd44b629..9a1e41e0d6d 100644 --- a/www/core/components/courses/lang/sr-lt.json +++ b/www/core/components/courses/lang/sr-lt.json @@ -13,12 +13,12 @@ "filtermycourses": "Filtriraj moje kurseve", "frontpage": "Naslovna stranica", "mycourses": "Moji kursevi", - "nocourses": "Nema informacija o kursu koje bi se mogle prikazati.", + "nocourses": "Nema informacija o kursevima za prikaz.", "nocoursesyet": "Nema kurseva u ovoj kategoriji", - "nosearchresults": "Vaša pretraga nije dala rezultate", + "nosearchresults": "Nije bilo rezultata vaše pretrage", "notenroled": "Niste upisani na ovaj kurs", "notenrollable": "Ne možete sami da se upišete na ovaj kurs.", - "password": "Lozinka", + "password": "Pristupna lozinka kursa", "search": "Pretraga", "searchcourses": "Pretraži kurseve", "searchcoursesadvice": "Možete koristiti dugme za pretragu kurseva kako biste im pristupili kao gost ili se upisali na kurseve koji to dopuštaju.", diff --git a/www/core/components/courses/lang/sv.json b/www/core/components/courses/lang/sv.json index 2906fc39e80..dd610088dbb 100644 --- a/www/core/components/courses/lang/sv.json +++ b/www/core/components/courses/lang/sv.json @@ -4,19 +4,19 @@ "categories": "Kategorier", "confirmselfenrol": "Är du säker att du vill registrera dig i den här kursen ?", "courses": "Kurser", - "enrolme": "Koppla mig", + "enrolme": "Registrera mig", "errorloadcourses": "Ett fel uppstod vid inläsning av kursen", "errorsearching": "Fel uppstod vid sökning", "errorselfenrol": "Fel uppstod vid registrering", "filtermycourses": "Filtrera mina kurser", "frontpage": "Ingångssidan", "mycourses": "Mina kurser", - "nocourses": "Det finns ingen kursinformation att visa.", + "nocourses": "Ingen kursinfomration att visa", "nocoursesyet": "Inga kurser i denna kategori", - "nosearchresults": "Din sökning gav inga träffar", - "notenroled": "Du är inte registrerad i den här kursen", + "nosearchresults": "Inga sökningsresultat", + "notenroled": "Du är inte registrerad i kursen", "notenrollable": "Du kan inte självregistrera dig i kursen", - "password": "Lösenord", + "password": "Kursnyckel", "search": "Sök...", "searchcourses": "Sök kurser", "searchcoursesadvice": "Du kan använda knappen \"Sök kurser\" för att få tillgång som gäst eller registrera dig på kurser som tillåter det .", diff --git a/www/core/components/courses/lang/uk.json b/www/core/components/courses/lang/uk.json index 8c07d6d8e74..33b4e8511f2 100644 --- a/www/core/components/courses/lang/uk.json +++ b/www/core/components/courses/lang/uk.json @@ -5,7 +5,7 @@ "categories": "Категорії", "confirmselfenrol": "Ви впевнені, що хочете зареєструвати себе в цьому курсі?", "courses": "Курси", - "enrolme": "Зареєструвати мене", + "enrolme": "Відрахувати мене", "errorloadcategories": "Сталася помилка під час завантаження категорій.", "errorloadcourses": "Сталася помилка під час завантаження курсів.", "errorsearching": "Під час пошуку сталася помилка.", @@ -13,12 +13,12 @@ "filtermycourses": "Відфільтрувати мої курси", "frontpage": "Титульна сторінка", "mycourses": "Мої курси", - "nocourses": "Немає інформації курсу для показу.", + "nocourses": "Інформація про курс відсутня.", "nocoursesyet": "У цій категорії немає курсів", - "nosearchresults": "Пошук не дав результатів", - "notenroled": "Ви не зареєстровані як студент цього курсу", + "nosearchresults": "Ніяких результатів пошуку", + "notenroled": "Ви не зареєстровані в цьому курсі", "notenrollable": "Ви не можете зареєструвати себе в цьому курсі.", - "password": "Пароль", + "password": "Ключ подачі заявок", "search": "Пошук", "searchcourses": "Пошук курсів", "searchcoursesadvice": "Ви можете використовувати кнопку пошуку курсів, щоб отримати доступ в якості гостя або зареєструвати себе в курсах, які дозволяють це.", diff --git a/www/core/components/fileuploader/lang/ar.json b/www/core/components/fileuploader/lang/ar.json index 912a2980157..3756250ce62 100644 --- a/www/core/components/fileuploader/lang/ar.json +++ b/www/core/components/fileuploader/lang/ar.json @@ -5,12 +5,12 @@ "errorcapturingimage": "خطأ في التقاط الصورة", "errorcapturingvideo": "خطأ في التقاط الفيديو", "errormustbeonlinetoupload": "لابد أن تكون متصل بالأنترنت لكي يتم رفع الملفات", - "errorreadingfile": "خطاء في قراءة ملف \"{{$a}}\"", - "file": "تم تسليم الملف بنجاح", + "errorreadingfile": "خطأ في قراءة الملف", + "file": "ملف", "fileuploaded": "الملف الذي تم رفعه", "maxbytesfile": "حجم الملف {{$a.file}} كبير جداً . الحد الأقصى الذي تستطيع رفعه هو {{$a.size}}.", "readingfile": "يتم قراءة الملف", - "uploadafile": "تحميل ملف", - "uploading": "يتم التحميل", + "uploadafile": "إرفع ملف", + "uploading": "يتم الرفع", "video": "فيديو" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/cs.json b/www/core/components/fileuploader/lang/cs.json index 9bbe338c058..4c0277d01ff 100644 --- a/www/core/components/fileuploader/lang/cs.json +++ b/www/core/components/fileuploader/lang/cs.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Chyba při načítání snímku z alba.", "errormustbeonlinetoupload": "Při nahrávání souboru musíte být online.", "errornoapp": "Pro provedení této akce nemáte nainstalovanou aplikaci .", - "errorreadingfile": "Chyba při čtení souboru \"{{$a}}\"", + "errorreadingfile": "Chyba při čtení souboru.", "errorwhileuploading": "Při pokusu o nahrání souboru došlo k chybě .", - "file": "Odevzdat soubor(y)", + "file": "Soubor", "fileuploaded": "Soubor nahrán", - "maxbytesfile": "Soubor {{$a.file}} je příliš velký. Maximální velikost, kterou můžete nahrát, je {{$a.size}}.", + "maxbytesfile": "Soubor {{$a.file}} je příliš veliký. Maximální velikost nahrávaného souboru je {{$a.size}}.", "photoalbums": "Fotoalba", "readingfile": "Čtení souboru", "selectafile": "Vyberte soubor", - "uploadafile": "Vložit soubor", - "uploading": "Nahrávání ...", + "uploadafile": "Nahrát soubor", + "uploading": "Nahrávání", "uploadingperc": "Nahrávání: {{$a}}%", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/da.json b/www/core/components/fileuploader/lang/da.json index dc1027bb59f..3fe2280526b 100644 --- a/www/core/components/fileuploader/lang/da.json +++ b/www/core/components/fileuploader/lang/da.json @@ -9,14 +9,14 @@ "errorgettingimagealbum": "Fejl ved indhentning af billede fra album", "errormustbeonlinetoupload": "Du skal være online for at uploade filer.", "errornoapp": "Du har ikke installeret en app som kan udføre denne handling.", - "errorreadingfile": "Fejl under læsning af filen \"{{$a}}\"", + "errorreadingfile": "Fejl ved læsning af fil.", "errorwhileuploading": "En fejl opstod under upload af filen.", - "file": "Filafleveringer", + "file": "Fil", "fileuploaded": "Filen er uploadet.", "maxbytesfile": "Filen {{$a.file}} er for stor. Maksimal upload-størrelse er {{$a.size}}.", "photoalbums": "Fotoalbum", "readingfile": "Læser fil", "uploadafile": "Upload en fil", - "uploading": "Uploader...", + "uploading": "Uploader", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/de.json b/www/core/components/fileuploader/lang/de.json index deb3a49511c..e54ab178c4f 100644 --- a/www/core/components/fileuploader/lang/de.json +++ b/www/core/components/fileuploader/lang/de.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Fehler beim Laden aus dem Fotoalbum", "errormustbeonlinetoupload": "Dateien können nur online hochgeladen werden.", "errornoapp": "Keine App zum Ausführen dieser Aktion gefunden", - "errorreadingfile": "Fehler beim Lesen der Datei \"{{$a}}\"", + "errorreadingfile": "Fehler beim Lesen der Datei", "errorwhileuploading": "Fehler beim Hochladen der Datei", - "file": "Dateiabgabe", + "file": "Datei", "fileuploaded": "Datei hochgeladen", "maxbytesfile": "Die Datei {{$a.file}} ist zu groß. Die maximale Größe zum Hochladen ist {{$a.size}}.", "photoalbums": "Fotoalbum", "readingfile": "Datei lesen", "selectafile": "Wählen Sie eine Datei.", "uploadafile": "Datei hochladen", - "uploading": "Wird hochgeladen...", + "uploading": "Hochladen", "uploadingperc": "Hochladen: {{$a}}%", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/el.json b/www/core/components/fileuploader/lang/el.json index 935202c4c47..57aa3c4745c 100644 --- a/www/core/components/fileuploader/lang/el.json +++ b/www/core/components/fileuploader/lang/el.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Σφάλμα κατά τη λήψη εικόνας από το αλμπουμ.", "errormustbeonlinetoupload": "Πρέπει να είστε συνδεδεμένοι για να ανεβάσετε αρχεία.", "errornoapp": "Δεν έχετε εγκατεστημένη εφαρμογή για να εκτελέσετε αυτή την ενέργεια.", - "errorreadingfile": "Σφάλμα στην ανάγνωση του αρχείου \"{{$a}}\"", + "errorreadingfile": "Σφάλμα ανάγνωσης αρχείου.", "errorwhileuploading": "Παρουσιάστηκε σφάλμα κατά το ανέβασμα του αρχείου.", - "file": "Υποβολές αρχείων", + "file": "Αρχείο", "fileuploaded": "Το αρχείο ανέβηκε επιτυχώς.", "maxbytesfile": "Το αρχείο {{$a.file}} είναι πολύ μεγάλο. Το μέγιστο μέγεθος που μπορείτε να ανεβάσετε είναι {{$a.size}}.", "photoalbums": "Άλμπουμ φωτογραφιών", "readingfile": "Ανάγνωση αρχείου", "selectafile": "Επιλογή αρχείου", - "uploadafile": "Φόρτωση ενός αρχείου", - "uploading": "Ανέβασμα...", + "uploadafile": "Ανεβάστε ένα αρχείο", + "uploading": "Ανέβασμα", "uploadingperc": "Ανέβασμα: {{$a}}%", "video": "Βίντεο" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/es.json b/www/core/components/fileuploader/lang/es.json index 395013fec2f..46688459cf2 100644 --- a/www/core/components/fileuploader/lang/es.json +++ b/www/core/components/fileuploader/lang/es.json @@ -1,5 +1,5 @@ { - "addfiletext": "Añadir fichero", + "addfiletext": "añadir archivo", "audio": "Audio", "camera": "Cámara", "confirmuploadfile": "Usted va a subir {{size}}. ¿Desea continuar?", @@ -12,14 +12,14 @@ "errornoapp": "Usted no tiene una app instalada para realizar esta acción.", "errorreadingfile": "Error al leer el archivo \"{{$a}}\"", "errorwhileuploading": "Ocurrió un error al subir un archivo.", - "file": "Archivos enviados", + "file": "Archivo", "fileuploaded": "Archivo subido", "maxbytesfile": "El archivo {{$a.file}} es demasido grande. El tamaño máximo que puede subir es {{$a.size}}.", "photoalbums": "Álbumes de fotos", "readingfile": "Leyendo archivo", "selectafile": "Seleccionar un archivo", "uploadafile": "Subir un archivo", - "uploading": "Subiendo...", + "uploading": "Subiendo", "uploadingperc": "Subiendo: {{$a}}%", "video": "Vídeo" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/eu.json b/www/core/components/fileuploader/lang/eu.json index 695c4b4155e..8d5ff8b0cef 100644 --- a/www/core/components/fileuploader/lang/eu.json +++ b/www/core/components/fileuploader/lang/eu.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Errorea irudia bildumatik jasotzean.", "errormustbeonlinetoupload": "Online egon behar zara fitxategiak igotzeko.", "errornoapp": "Ez daukazu ekintza hau burutzeko app-ik instalatuta.", - "errorreadingfile": "Errorea \"{{$a}}\" fitxategia irakurtzean", + "errorreadingfile": "Errorea fitxategia irakurtzean.", "errorwhileuploading": "Errorea gertatu da fitxategia igotzean.", - "file": "Fitxategi-bidalketak", + "file": "Fitxategia", "fileuploaded": "Fitxategia ondo igo da.", "maxbytesfile": "{{$a.file}} fitxategia oso handia da. Igo ditzakezun fitxategien gehienezko tamaina {{$a.size}} da.", "photoalbums": "Argazki-bildumak", "readingfile": "Fitxategia irakurtzen", "selectafile": "Aukeratu fitxategi bat", - "uploadafile": "Fitxategia igo", - "uploading": "Igotzen...", + "uploadafile": "Igo fitxategia", + "uploading": "Igotzen", "uploadingperc": "Igotzen: %{{$a}}", "video": "Bideoa" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/fr.json b/www/core/components/fileuploader/lang/fr.json index 5f5d1b86bda..13eb0148fcf 100644 --- a/www/core/components/fileuploader/lang/fr.json +++ b/www/core/components/fileuploader/lang/fr.json @@ -1,5 +1,5 @@ { - "addfiletext": "Ajouter un fichier", + "addfiletext": "Ajouter le fichier", "audio": "Audio", "camera": "Caméra", "confirmuploadfile": "Vous allez déposer {{size}}. Voulez-vous vraiment continuer ?", @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Erreur lors de la récupération de l'image de l'album.", "errormustbeonlinetoupload": "Vous devez être en ligne pour déposer des fichiers.", "errornoapp": "Vous n'avez pas d'app installée pour effectuer cette action.", - "errorreadingfile": "Erreur lors de la lecture du fichier « {{$a}} »", + "errorreadingfile": "Erreur de lecture du fichier.", "errorwhileuploading": "Une erreur est survenue lors du dépôt du fichier.", - "file": "Remises de fichiers", + "file": "Fichier", "fileuploaded": "Le fichier a été déposé.", - "maxbytesfile": "La taille du fichier {{$a.file}} est trop grande. La taille maximale d'un fichier à déposer est de {{$a.size}}.", + "maxbytesfile": "Le fichier {{$a.file}} est trop gros. La taille maximale permise est de {{$a.size}}.", "photoalbums": "Albums photos", "readingfile": "Lecture du fichier", "selectafile": "Choisir un fichier", "uploadafile": "Déposer un fichier", - "uploading": "En cours de dépôt...", + "uploading": "Envoi", "uploadingperc": "Dépôt en cours : {{$a}} %", "video": "Vidéo" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/he.json b/www/core/components/fileuploader/lang/he.json index f217f7b9441..b6dda48ad1e 100644 --- a/www/core/components/fileuploader/lang/he.json +++ b/www/core/components/fileuploader/lang/he.json @@ -9,13 +9,13 @@ "errorgettingimagealbum": "שגיאה בטעינת תמונה מאלבום.", "errormustbeonlinetoupload": "עליך להיות מחובר/ת בכדי להעלות קבצים.", "errornoapp": "לא נמצא יישומון זמין לביצוע פעולה הזו.", - "errorreadingfile": "שגיאה בקריאת קובץ \"{{$a}}\"", + "errorreadingfile": "שגיאה בקריאת קובץ.", "errorwhileuploading": "התרחשה שגיאה בזמן הניסיון להעלות את הקובץ.", - "file": "קבצי הגשה", + "file": "קובץ", "fileuploaded": "הקובץ הועלה בהצלחה.", "photoalbums": "אלבומי תמונות", "readingfile": "קורא קובץ", - "uploadafile": "העלאת קובץ", - "uploading": "מעלה את הקובץ...", + "uploadafile": "העלה קובץ", + "uploading": "מעלה קבצים", "video": "וידאו" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/it.json b/www/core/components/fileuploader/lang/it.json index 1803ccc8b64..a6eac6c923f 100644 --- a/www/core/components/fileuploader/lang/it.json +++ b/www/core/components/fileuploader/lang/it.json @@ -10,15 +10,15 @@ "errorgettingimagealbum": "Si è verificato un errore durante la ricezione dell'immagine dall'album.", "errormustbeonlinetoupload": "Devi essere online per caricare file.", "errornoapp": "Non hai un'app per svolgere questa azione.", - "errorreadingfile": "Si è verificato un errore leggendo il file \"{{$a}}\"", + "errorreadingfile": "Si è verificato un errore durante la lettura del file.", "errorwhileuploading": "Si è verificato un errore durante il caricamento del file.", - "file": "Consegna file", + "file": "File", "fileuploaded": "File caricato correttamente", - "maxbytesfile": "Il file {{$a.file}} è troppo grande. La dimensione massima che è possibile caricare è pari a {{$a.size}}.", + "maxbytesfile": "Il file {{$a.file}} è troppo grande. La dimensione massima consentita è {{$a.size}}.", "photoalbums": "Album fotografico", "readingfile": "Letture file in corso", - "uploadafile": "Carica un file sul server", - "uploading": "Caricamento in corso...", + "uploadafile": "Carica un file", + "uploading": "Caricamento in corso", "uploadingperc": "Caricamento: {{$a}}%", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/ja.json b/www/core/components/fileuploader/lang/ja.json index 07f74ac15b3..86f29cfe14c 100644 --- a/www/core/components/fileuploader/lang/ja.json +++ b/www/core/components/fileuploader/lang/ja.json @@ -1,14 +1,14 @@ { - "addfiletext": "ファイルを追加する", + "addfiletext": "ファイル追加", "confirmuploadfile": "{{$a}}をアップロードしようとしています。続けますか?", "errorcapturingaudio": "音声キャプチャーのエラー", "errorcapturingvideo": "ビデオキャプチャーのエラー", - "errorreadingfile": "ファイル「 {{$a}} 」の読み取り中にエラーが発生しました。", - "file": "ファイル提出", + "errorreadingfile": "ファイル\"{{$a}}\"の読み取りエラー", + "file": "ファイル", "fileuploaded": "アップロードしたファイル", "maxbytesfile": "ファイル {{$a.file}} は大きすぎます。あなたがアップロードできる最大サイズは {{$a.size}} です。", "readingfile": "ファイル読み取り", "uploadafile": "ファイルをアップロードする", - "uploading": "アップロード中 ...", + "uploading": "アップロード中", "video": "ビデオ" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/nl.json b/www/core/components/fileuploader/lang/nl.json index 6f8c6a9ce35..bded0b189f9 100644 --- a/www/core/components/fileuploader/lang/nl.json +++ b/www/core/components/fileuploader/lang/nl.json @@ -1,5 +1,5 @@ { - "addfiletext": "Bestand toevoegen", + "addfiletext": "Voeg bestand toe", "audio": "Audio", "camera": "Camera", "confirmuploadfile": "Je gaat {{size}} uploaden. Weet je zeker dat je wil verder gaan?", @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Fout bij het ophalen van een foto uit het album.", "errormustbeonlinetoupload": "Je moet online zijn om bestanden te kunnen uploaden.", "errornoapp": "Je hebt geen app geïnstalleerd om dit te kunnen doen.", - "errorreadingfile": "Fout bij het lezen van bestand \"{{$a}}\"", + "errorreadingfile": "Fout bij het lezen van het bestand.", "errorwhileuploading": "Er is een fout opgetreden tijdens het uploaden van het bestand.", - "file": "Ingestuurde bestanden", + "file": "Bestand", "fileuploaded": "Het uploaden van het bestand is gelukt.", - "maxbytesfile": "Het bestand {{$a.file}} is te groot. De maximale grootte die je kunt uploaden is {{$a.size}}.", + "maxbytesfile": "Het bestand {{$a.file}} is te groot. De maximale uploadgrootte is {{$a.size}}.", "photoalbums": "Foto-albums", "readingfile": "Bestand lezen", "selectafile": "Selecteer een bestand", - "uploadafile": "Upload een bestand", - "uploading": "Uploaden...", + "uploadafile": "Bestand uploaden", + "uploading": "Aan het uploaden", "uploadingperc": "Uploaden: {{$a}}%", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/ru.json b/www/core/components/fileuploader/lang/ru.json index 1a99421f194..50c3136d898 100644 --- a/www/core/components/fileuploader/lang/ru.json +++ b/www/core/components/fileuploader/lang/ru.json @@ -9,14 +9,14 @@ "errorgettingimagealbum": "Ошибка получения изображения из альбома", "errormustbeonlinetoupload": "Вы должны быть на сайте, чтобы загружать файлы.", "errornoapp": "У Вас не установлено приложение для выполнения этого действия.", - "errorreadingfile": "Ошибка чтения файла «{{$a}}»", + "errorreadingfile": "Ошибка при чтении файла", "errorwhileuploading": "Произошла ошибка во время загрузки файла", - "file": "Ответ в виде файла", + "file": "Файл", "fileuploaded": "Файл загружен", "maxbytesfile": "Файл «{{$a.file}}» слишком большой. Максимальный размер файла, который Вы можете загрузить: {{$a.size}}.", "photoalbums": "Фотоальбомы", "readingfile": "Чтение файла", - "uploadafile": "Загрузить файл", - "uploading": "Идет загрузка файла на сервер...", + "uploadafile": "Загрузка файла", + "uploading": "Загрузка", "video": "Видео" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/sr-cr.json b/www/core/components/fileuploader/lang/sr-cr.json index 1a2a53dbd8f..74ec8641949 100644 --- a/www/core/components/fileuploader/lang/sr-cr.json +++ b/www/core/components/fileuploader/lang/sr-cr.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Грешка приликом преузимања слике из албума.", "errormustbeonlinetoupload": "Морате бити онлајн како бисте отпремили датотеке.", "errornoapp": "Немате инсталирану апликацију која може да изведе ову акцију.", - "errorreadingfile": "Грешка при читању датотеке \"{{$a}}\"", + "errorreadingfile": "Грешка приликом учитавања датотеке.", "errorwhileuploading": "Дошло је до грешке приликом отпремања датотеке.", - "file": "Предате датотеке", + "file": "Датотека", "fileuploaded": "Датотека је успешно отпремљена.", - "maxbytesfile": "Датотека {{$a.file}} је превелика. Максимална величина датотеке коју можете поставити је {{$a.size}}.", + "maxbytesfile": "Датотека {{$a.file}} је превелика. Максимална величина коју можете да отпремите је {{$a.size}}.", "photoalbums": "Фото албум", "readingfile": "Учитавање датотеке", "selectafile": "Изабери датотеку", - "uploadafile": "Постављање датотеке", - "uploading": "Постављање...", + "uploadafile": "Отпреми датотеку", + "uploading": "Отпремање", "uploadingperc": "Отпремање: {{$a}}%", "video": "Видео" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/sr-lt.json b/www/core/components/fileuploader/lang/sr-lt.json index 3425c337e0c..5da78d54b07 100644 --- a/www/core/components/fileuploader/lang/sr-lt.json +++ b/www/core/components/fileuploader/lang/sr-lt.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Greška prilikom preuzimanja slike iz albuma.", "errormustbeonlinetoupload": "Morate biti onlajn kako biste otpremili datoteke.", "errornoapp": "Nemate instaliranu aplikaciju koja može da izvede ovu akciju.", - "errorreadingfile": "Greška pri čitanju datoteke \"{{$a}}\"", + "errorreadingfile": "Greška prilikom učitavanja datoteke.", "errorwhileuploading": "Došlo je do greške prilikom otpremanja datoteke.", - "file": "Datoteka", + "file": "Датотека", "fileuploaded": "Datoteka je uspešno otpremljena.", - "maxbytesfile": "Datoteka {{$a.file}} je prevelika. Maksimalna veličina datoteke koju možete postaviti je {{$a.size}}.", + "maxbytesfile": "Datoteka {{$a.file}} je prevelika. Maksimalna veličina koju možete da otpremite je {{$a.size}}.", "photoalbums": "Foto album", "readingfile": "Učitavanje datoteke", "selectafile": "Izaberi datoteku", - "uploadafile": "Postavljanje datoteke", - "uploading": "Postavljanje...", + "uploadafile": "Otpremi datoteku", + "uploading": "Otpremanje", "uploadingperc": "Otpremanje: {{$a}}%", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/sv.json b/www/core/components/fileuploader/lang/sv.json index 5842440a4d5..05123140c0e 100644 --- a/www/core/components/fileuploader/lang/sv.json +++ b/www/core/components/fileuploader/lang/sv.json @@ -8,13 +8,13 @@ "errorgettingimagealbum": "Fel att få bild från album.", "errormustbeonlinetoupload": "Du måste vara online för att ladda upp filer.", "errornoapp": "Du behöver att ha en app installerat för att utföra den här åtgärden.", - "errorreadingfile": "Fel i samband med läsningen av filen \"{{$a}}\"", + "errorreadingfile": "Fel vid läsning av fil.", "errorwhileuploading": "Ett fel uppstod under filöverföringen.", - "file": "Filinlämningar", + "file": "Fil", "fileuploaded": "Fil laddades upp", "photoalbums": "Fotoalbum", "readingfile": "Läsa fil", "uploadafile": "Ladda upp en fil", - "uploading": "Laddar upp...", + "uploading": "Laddar upp", "video": "Video" } \ No newline at end of file diff --git a/www/core/components/fileuploader/lang/uk.json b/www/core/components/fileuploader/lang/uk.json index f6be6aa599c..74292f36a85 100644 --- a/www/core/components/fileuploader/lang/uk.json +++ b/www/core/components/fileuploader/lang/uk.json @@ -10,16 +10,16 @@ "errorgettingimagealbum": "Помилка отримання зображення з альбома.", "errormustbeonlinetoupload": "Ви повинні бути в мережі для завантаження файлів.", "errornoapp": "У вас немає програми, встановленої для виконання цієї дії.", - "errorreadingfile": "Помилка при читанні файлу \"{{$a}}\"", + "errorreadingfile": "Помилка читання файлу.", "errorwhileuploading": "Помилка при завантаженні файлу.", - "file": "Завантаження файлу", + "file": "Файл", "fileuploaded": "Файл був успішно завантажений.", - "maxbytesfile": "Файл {{$a.file}} занадто великий. Максимальний розмір, який ви можете завантажити - {{$a.size}}.", + "maxbytesfile": "Файл {{$a.file}} завеликий. Максимум {{$a.size}}.", "photoalbums": "Фото альбом.", "readingfile": "Читання файлу", "selectafile": "Виберіть файл", "uploadafile": "Завантажити файл", - "uploading": "Завантаження...", + "uploading": "Завантаження", "uploadingperc": "Завантаження: {{$a}}%", "video": "Відео" } \ No newline at end of file diff --git a/www/core/components/login/lang/cs.json b/www/core/components/login/lang/cs.json index 05d01526f05..be81328f5eb 100644 --- a/www/core/components/login/lang/cs.json +++ b/www/core/components/login/lang/cs.json @@ -4,14 +4,14 @@ "cancel": "Zrušit", "checksiteversion": "Zkontrolujte, zda web používá Moodle 2.4 nebo novější.", "confirmdeletesite": "Jste si jisti, že chcete smazat web {{sitename}}?", - "connect": "Spojit", + "connect": "Připojit!", "connecttomoodle": "Připojit k Moodle", "contactyouradministrator": "Pro další pomoc se obraťte na správce webu.", "contactyouradministratorissue": "Požádejte správce, prosím, aby zkontroloval následující problém: {{$a}}", "createaccount": "Vytvořit můj nový účet", "createuserandpass": "Vytvořit nové uživatelské jméno a heslo pro přihlášení", "credentialsdescription": "Pro přihlášení uveďte své uživatelské jméno a heslo.", - "emailconfirmsent": "

    Na vaši adresu {{$a}} byl odeslán e-mail s jednoduchými pokyny k dokončení vaší registrace.

    Narazíte-li na nějaké obtíže, spojte se se správcem těchto stránek.

    ", + "emailconfirmsent": "

    E-mail by měl být zaslán na Vaši adresu na {{$a}}

    Obsahuje jednoduché instrukce pro dokončení registrace.

    Pokud budou potíže pokračovat, obraťte se na správce webu.

    ", "emailnotmatch": "E-maily se neshodují", "enterthewordsabove": "Vložte výše uvedená slova", "erroraccesscontrolalloworigin": "Cross-Origin volání - váš pokus o provedení byl odmítnut. Zkontrolujte prosím https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/da.json b/www/core/components/login/lang/da.json index 2814f984626..3422796cb2b 100644 --- a/www/core/components/login/lang/da.json +++ b/www/core/components/login/lang/da.json @@ -2,7 +2,7 @@ "authenticating": "Godkender", "cancel": "Annuller", "confirmdeletesite": "Er du sikker på at du ønsker at slette websiden {{sitename}}?", - "connect": "Forbind", + "connect": "Tilslut!", "connecttomoodle": "Tilslut til Moodle", "createaccount": "Opret ny profil", "createuserandpass": "Vælg brugernavn og adgangskode", diff --git a/www/core/components/login/lang/de.json b/www/core/components/login/lang/de.json index deda25e1172..a4a0ede5015 100644 --- a/www/core/components/login/lang/de.json +++ b/www/core/components/login/lang/de.json @@ -11,7 +11,7 @@ "createaccount": "Zugang anlegen (Registrierung)", "createuserandpass": "Wählen Sie Ihren Anmeldenamen und Ihr Kennwort", "credentialsdescription": "Geben Sie den Anmeldenamen und das Kennwort ein. ", - "emailconfirmsent": "

    Um sicherzugehen, dass sich niemand unberechtigt über die von Ihnen angegebene E-Mail anmeldet, wird eine automatische Benachrichtigung an diese Adresse {{$a}} gesendet. Je nach Netzlast trifft sie sofort oder auch etwas später bei Ihnen ein.

    \n

    Die Benachrichtigung enthält eine Anleitung, wie Sie Ihre Registrierung bestätigen.\nDanach sind Sie auf dieser Moodle-Seite registriert und können sofort loslegen.

    \n

    Bei Problemen wenden Sie sich bitte an die Administrator/innen der Website.

    ", + "emailconfirmsent": "

    In Kürze wird eine E-Mail an {{$a}} gesendet.

    Sie finden eine einfache Anleitung, wie Sie die Registrierung abschließen. Bei Schwierigkeiten wenden Sie sich an den Administrator der Website.

    ", "emailnotmatch": "Die E-Mail-Adressen stimmen nicht überein.", "enterthewordsabove": "Geben Sie die gezeigten Wörter ein", "erroraccesscontrolalloworigin": "Der Cross-Origin Aufruf wurde zurückgewiesen. Weitere Informationen: https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/el.json b/www/core/components/login/lang/el.json index 6ed49de1648..171e2d567ae 100644 --- a/www/core/components/login/lang/el.json +++ b/www/core/components/login/lang/el.json @@ -11,7 +11,7 @@ "createaccount": "Δημιουργία του λογαριασμού μου", "createuserandpass": "Δημιουργία ενός νέου ονόματος χρήστη και κωδικού πρόσβασης για είσοδο στον δικτυακό τόπο", "credentialsdescription": "Δώστε το όνομα χρήστη και τον κωδικό πρόσβασής σας για να συνδεθείτε.", - "emailconfirmsent": "

    Ένα μήνυμα ηλεκτρονικού ταχυδρομείου θα πρέπει να έχει σταλεί στη διεύθυνσή σας, {{$a}}

    \n

    Περιέχει απλές οδηγίες για την ολοκλήρωση της εγγραφής σας.

    \n

    Αν συνεχίζετε να αντιμετωπίζετε δυσκολίες, επικοινωνήστε με το διαχειριστή του δικτυακού τόπου.

    ", + "emailconfirmsent": "

    Ένα email έχει σταλεί στη διεύθυνση σας {{$a}}

    Περιέχει εύκολες οδηγίες για να ολοκληρώσετε την εγγραφή σας.

    Εάν συνεχίσετε να έχετε δυσκολίες επικοινωνήστε με το διαχειριστή του site.

    ", "emailnotmatch": "Οι διευθύνσεις email δεν ταιριάζουν", "enterthewordsabove": "Enter the words above", "erroraccesscontrolalloworigin": "Η κλήση πολλαπλών προελεύσεων (Cross-Origin call) που προσπαθείτε να εκτελέσετε έχει απορριφθεί. Παρακαλώ ελέγξτε https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/es.json b/www/core/components/login/lang/es.json index 2bf64c84d37..55002468575 100644 --- a/www/core/components/login/lang/es.json +++ b/www/core/components/login/lang/es.json @@ -11,7 +11,7 @@ "createaccount": "Crear cuenta", "createuserandpass": "Crear un nuevo usuario y contraseña para acceder al sistema", "credentialsdescription": "Introduzca su nombre se usuario y contraseña para entrar", - "emailconfirmsent": "

    Hemos enviado un correo electrónico a {{$a}}

    \n

    En él encontrará instrucciones sencillas para concluir el proceso.

    \n

    Si tuviera alguna dificultad, contacte con el Administrador del Sistema.

    ", + "emailconfirmsent": "

    Se ha enviado un email a su dirección {{$a}}

    Contiene instrucciones para completar el proceso de registro.

    Si continúa teniendo algún problema, contacte con el administrador de su sitio.

    ", "emailnotmatch": "Las direcciones de correo no coinciden.", "enterthewordsabove": "Escriba las palabras de arriba", "erroraccesscontrolalloworigin": "La llamada Cross-Origin que está intentando ha sido rechazada. Por favor visite https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/eu.json b/www/core/components/login/lang/eu.json index d8feb394e24..8d949589d7b 100644 --- a/www/core/components/login/lang/eu.json +++ b/www/core/components/login/lang/eu.json @@ -4,14 +4,14 @@ "cancel": "Utzi", "checksiteversion": "Egiaztatu zure Moodle guneak 2.4 bertsioa edo aurreragokoa erabiltzen duela.", "confirmdeletesite": "Ziur zaude {{sitename}} gunea ezabatu nahi duzula?", - "connect": "Konektatu", + "connect": "Konektatu!", "connecttomoodle": "Moodle-ra konektatu", "contactyouradministrator": "Zure guneko kudeatzailearekin harremanetan jarri laguntza gehiagorako.", "contactyouradministratorissue": "Mesedez, eskatu zure kudeatzaileari hurrengo arazoa ikuskatu dezala: {{$a}}", "createaccount": "Nire kontu berria sortu", "createuserandpass": "Aukeratu zure erabiltzaile-izena eta pasahitza", "credentialsdescription": "Mesedez saioa hasteko zure sartu erabiltzaile eta pasahitza.", - "emailconfirmsent": "

    E-posta mezu bat bidali dugu zure hurrengo helbide honetara: {{$a}}

    \n

    Izena ematen amaitzeko argibide erraz batzuk ditu.

    \n

    Arazorik baduzu, jarri harremanetan kudeatzailearekin.

    ", + "emailconfirmsent": "

    Zure {{$a}} helbidera mezu bat bidali da.

    Zure erregistroa amaitzeko argibide erraz batzuk ditu.

    Arazorik baduzu, jarri harremanetan kudeatzailearekin.

    ", "emailnotmatch": "E-posta helbideak ez datoz bat", "enterthewordsabove": "Idatzi goiko hitzak", "erroraccesscontrolalloworigin": "Saiatzen ari zaren Cross-Origin deia ez da onartu. Ikusi mesedez https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/fr.json b/www/core/components/login/lang/fr.json index 631db476ebc..503d86ff74d 100644 --- a/www/core/components/login/lang/fr.json +++ b/www/core/components/login/lang/fr.json @@ -4,14 +4,14 @@ "cancel": "Annuler", "checksiteversion": "Veuillez vérifier que votre site utilise Moodle 2.4 ou une version ultérieure.", "confirmdeletesite": "Voulez-vous vraiment supprimer la plateforme {{sitename}} ?", - "connect": "Connecter", + "connect": "Connecter !", "connecttomoodle": "Connexion à Moodle", "contactyouradministrator": "Veuillez contacter l'administrateur de la plateforme pour plus d'aide.", "contactyouradministratorissue": "Veuillez demander à l'administrateur de la plateforme de vérifier l'élément suivant : {{$a}}", "createaccount": "Créer mon compte", "createuserandpass": "Créer un compte", "credentialsdescription": "Veuillez fournir votre nom d'utilisateur et votre mot de passe pour vous connecter.", - "emailconfirmsent": "

    Un message vous a été envoyé à l'adresse de courriel {{$a}}.

    Il contient les instructions pour terminer votre enregistrement.

    Si vous rencontrez des difficultés, veuillez contacter l'administrateur du site.

    ", + "emailconfirmsent": "

    Un message vous a été envoyé par courriel à l'adresse {{$a}}

    Il contient des instructions vous permettant de terminer votre enregistrement.

    En cas de difficulté, viellez contacter l'administrateur de la plateforme.

    ", "emailnotmatch": "Les adresses de courriel ne correspondent pas", "enterthewordsabove": "Tapez les mots ci-dessus", "erroraccesscontrolalloworigin": "La tentative d'appel « Cross-Origin » que vous avez effectuée a été rejetée. Veuillez consulter https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/he.json b/www/core/components/login/lang/he.json index 9d40a0cfdfa..ea395994ef0 100644 --- a/www/core/components/login/lang/he.json +++ b/www/core/components/login/lang/he.json @@ -2,7 +2,7 @@ "authenticating": "מאמת נתונים", "cancel": "ביטול", "confirmdeletesite": "האם את/ה בטוח/ה שברצונך למחוק את האתר {{sitename}}?", - "connect": "חיבור", + "connect": "התחברות!", "connecttomoodle": "התחברות למוודל", "createaccount": "יצירת חשבון חדש", "createuserandpass": "הזנת שם־משתמש וסיסמה", diff --git a/www/core/components/login/lang/it.json b/www/core/components/login/lang/it.json index bea999f99be..a5d397edeb6 100644 --- a/www/core/components/login/lang/it.json +++ b/www/core/components/login/lang/it.json @@ -2,7 +2,7 @@ "authenticating": "Autenticazione in corso", "cancel": "Annulla", "confirmdeletesite": "Sei sicuro di eliminare il sito {{sitename}}?", - "connect": "Connetti", + "connect": "Collegati!", "connecttomoodle": "Collegati a Moodle", "createaccount": "Crea il mio nuovo account", "createuserandpass": "Scegli username e password", diff --git a/www/core/components/login/lang/nl.json b/www/core/components/login/lang/nl.json index 0ce52512c27..3df19ef3dd5 100644 --- a/www/core/components/login/lang/nl.json +++ b/www/core/components/login/lang/nl.json @@ -4,14 +4,14 @@ "cancel": "Annuleer", "checksiteversion": "Controleer of je site minstens Moodle 2.4 of nieuwe gebruikt.", "confirmdeletesite": "Weet je zeker dat je de site {{sitename}} wil verwijderen?", - "connect": "Verbind", + "connect": "Verbinden!", "connecttomoodle": "Verbinden met Moodle", "contactyouradministrator": "Neem contact op met je site-beheerder voor meer hulp.", "contactyouradministratorissue": "Vraag aan je site-beheerder om volgend probleem te onderzoeken: {{$a}}", "createaccount": "Maak mijn nieuwe account aan", "createuserandpass": "Kies een gebruikersnaam en wachtwoord", "credentialsdescription": "Geef je gebruikersnaam en wachtwoord op om je aan te melden", - "emailconfirmsent": "

    Als het goed is, is er een e-mail verzonden naar {{$a}}

    \n

    Daarin staan eenvoudige instructies voor het voltooien van de registratie.

    \n

    Indien je moeilijkheden blijft ondervinden, neem dan contact op met je sitebeheerder.

    ", + "emailconfirmsent": "

    Er zou een e-mail gestuurd moeten zijn naar jouw adres {{$a}}

    Het bericht bevat eenvoudige instructies om je registratie te voltooien.

    Als je problemen blijft ondervinden, neem dan contact op met de sitebeheerder.

    ", "emailnotmatch": "E-mailadressen komen niet overeen", "enterthewordsabove": "Vul hier bovenstaande woorden in", "erroraccesscontrolalloworigin": "De Cross-Origin call die je probeerde uit te voeren, werd geweigerd. Controleer https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/ru.json b/www/core/components/login/lang/ru.json index 5581e5945d2..549581702a7 100644 --- a/www/core/components/login/lang/ru.json +++ b/www/core/components/login/lang/ru.json @@ -2,7 +2,7 @@ "authenticating": "Аутентификация", "cancel": "Отменить", "confirmdeletesite": "Вы уверены, что хотите удалить сайт {{sitename}}?", - "connect": "Подключить", + "connect": "Подключено!", "connecttomoodle": "Подключение к Moodle", "createaccount": "Сохранить", "createuserandpass": "Выберите имя пользователя и пароль", diff --git a/www/core/components/login/lang/sr-cr.json b/www/core/components/login/lang/sr-cr.json index 02536b4de35..8cb06921b18 100644 --- a/www/core/components/login/lang/sr-cr.json +++ b/www/core/components/login/lang/sr-cr.json @@ -4,14 +4,14 @@ "cancel": "Одустани", "checksiteversion": "Проверите да ли ваш сајт користи Moodle 2.4 или новију верзију.", "confirmdeletesite": "Да ли сте сигурни да желите да обришете сајт {{sitename}}?", - "connect": "Успостави везу", + "connect": "Повежите се!", "connecttomoodle": "Повежите се са Moodleom", "contactyouradministrator": "Обратите се администратору вашег сајта за даљу помоћ.", "contactyouradministratorissue": "Замолите администратора да провери следећи проблем: {{$a}}", "createaccount": "Креирај мој нови кориснички налог", "createuserandpass": "Изаберите своје корисничко име и лозинку за приступ систему", "credentialsdescription": "За пријаву на систем унесите своје корисничко име и лозинку.", - "emailconfirmsent": "

    Требало би да је послата е-порука на вашу адресу {{$a}}

    \n

    Порука садржи једноставна упутства о даљем поступку регистрације.

    \n

    Ако и даље имате проблема, контактирајте администратора.

    ", + "emailconfirmsent": "

    Требало би да је послата порука на вашу е-адресу {{$a}}

    Порука садржи једноставна упутства о даљем поступку регистрације.

    Ако и даље имате проблема, обратите се администратору сајта.

    ", "emailnotmatch": "Адресе е-поште се не поклапају", "enterthewordsabove": "Унесите реч изнад", "erroraccesscontrolalloworigin": "Cross-Origin позив који покушавате да изведете је одбијен. Молимо, проверите https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/sr-lt.json b/www/core/components/login/lang/sr-lt.json index c6c52fd2e54..337bb4983ae 100644 --- a/www/core/components/login/lang/sr-lt.json +++ b/www/core/components/login/lang/sr-lt.json @@ -4,14 +4,14 @@ "cancel": "Odustani", "checksiteversion": "Proverite da li vaš sajt koristi Moodle 2.4 ili noviju verziju.", "confirmdeletesite": "Da li ste sigurni da želite da obrišete sajt {{sitename}}?", - "connect": "Uspostavi vezu", + "connect": "Povežite se!", "connecttomoodle": "Povežite se sa Moodleom", "contactyouradministrator": "Obratite se administratoru vašeg sajta za dalju pomoć.", "contactyouradministratorissue": "Zamolite administratora da proveri sledeći problem: {{$a}}", "createaccount": "Kreiraj moj novi korisnički nalog", "createuserandpass": "Izaberite svoje korisničko ime i lozinku za pristup sistemu", "credentialsdescription": "Za prijavu na sistem unesite svoje korisničko ime i lozinku.", - "emailconfirmsent": "

    Trebalo bi da je poslata e-poruka na vašu adresu {{$a}}

    \n

    Poruka sadrži jednostavna uputstva o daljem postupku registracije.

    \n

    Ako i dalje imate problema, kontaktirajte administratora.

    ", + "emailconfirmsent": "

    Trebalo bi da je poslata poruka na vašu e-adresu {{$a}}

    Poruka sadrži jednostavna uputstva o daljem postupku registracije.

    Ako i dalje imate problema, obratite se administratoru sajta.

    ", "emailnotmatch": "Adrese e-pošte se ne poklapaju", "enterthewordsabove": "Unesite reč iznad", "erroraccesscontrolalloworigin": "Cross-Origin poziv koji pokušavate da izvedete je odbijen. Molimo, proverite https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/sv.json b/www/core/components/login/lang/sv.json index 87c32b79e13..dbd8ed5a7a2 100644 --- a/www/core/components/login/lang/sv.json +++ b/www/core/components/login/lang/sv.json @@ -2,7 +2,7 @@ "authenticating": "Autentisera", "cancel": "Avbryt", "confirmdeletesite": "Är du säker på att du vill ta bort webbsidan {{sitename}}?", - "connect": "Anslut", + "connect": "Anslut!", "connecttomoodle": "Anslut till Moodle", "createaccount": "Skapa mitt nya konto", "createuserandpass": "Skapa ett nytt användarnamn och lösenord för att logga in med.", diff --git a/www/core/components/login/lang/uk.json b/www/core/components/login/lang/uk.json index ea30adb385f..3288bf24510 100644 --- a/www/core/components/login/lang/uk.json +++ b/www/core/components/login/lang/uk.json @@ -4,14 +4,14 @@ "cancel": "Скасувати", "checksiteversion": "Переконайтеся, що ваш сайт використовує Moodle 2.4 або більш пізньої версії.", "confirmdeletesite": "Видалити сайт {{sitename}}?", - "connect": "З’єднання", + "connect": "З'єднано!", "connecttomoodle": "Підключитись до Moodle", "contactyouradministrator": "Зверніться до адміністратора сайту для подальшої допомоги.", "contactyouradministratorissue": "Будь ласка, зверніться до адміністратора, щоб перевірити наступне питання: {{$a}}", "createaccount": "Створити запис", "createuserandpass": "Створити користувача для входу в систему", "credentialsdescription": "Будь ласка, введіть Ваше ім'я користувача та пароль, щоб увійти в систему.", - "emailconfirmsent": "На зазначену Вами адресу електронної пошти ({{$a}}) було відправлено листа з інструкціями із завершення реєстрації. Якщо у Вас з'являться проблеми з реєстрацією, зв'яжіться з адміністратором сайту.", + "emailconfirmsent": "

    Лист повинен бути відправлений на Вашу електронну адресу в {{$a}}

    Він містить прості інструкції для завершення реєстрації.

    Якщо ви продовжуєте зазнавати труднощів, зверніться до адміністратора сайту.

    ", "emailnotmatch": "Email не співпадають", "enterthewordsabove": "Введіть символи, які бачите вище", "erroraccesscontrolalloworigin": "Cross-Origin дзвінок був відхилений. Будь ласка, перевірте https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/question/lang/cs.json b/www/core/components/question/lang/cs.json index ff6940799c5..f9f9a4b0557 100644 --- a/www/core/components/question/lang/cs.json +++ b/www/core/components/question/lang/cs.json @@ -17,5 +17,5 @@ "questionmessage": "Úloha {{$a}}: {{$b}}", "questionno": "Úloha {{$a}}", "requiresgrading": "Vyžaduje hodnocení", - "unknown": "Neznámý" + "unknown": "Stav nelze určit" } \ No newline at end of file diff --git a/www/core/components/question/lang/de.json b/www/core/components/question/lang/de.json index a248f6250e5..75ee149e500 100644 --- a/www/core/components/question/lang/de.json +++ b/www/core/components/question/lang/de.json @@ -17,5 +17,5 @@ "questionmessage": "Frage {{$a}}: {{$b}}", "questionno": "Frage {{$a}}", "requiresgrading": "Bewertung notwendig", - "unknown": "Unbekannt" + "unknown": "Der Status kann nicht bestimmt werden." } \ No newline at end of file diff --git a/www/core/components/question/lang/el.json b/www/core/components/question/lang/el.json index 13546545b41..b8f5de69e9c 100644 --- a/www/core/components/question/lang/el.json +++ b/www/core/components/question/lang/el.json @@ -15,5 +15,5 @@ "partiallycorrect": "Μερικώς σωστή", "questionmessage": "Ερώτηση {{$a}}: {{$b}}", "questionno": "Ερώτηση {{$a}}", - "unknown": "Άγνωστο" + "unknown": "Δεν είναι δυνατός ο προσδιορισμός της κατάστασης" } \ No newline at end of file diff --git a/www/core/components/question/lang/es.json b/www/core/components/question/lang/es.json index eca0b6c7e61..7ea9607d522 100644 --- a/www/core/components/question/lang/es.json +++ b/www/core/components/question/lang/es.json @@ -17,5 +17,5 @@ "questionmessage": "Pregunta {{$a}}: {{$b}}", "questionno": "Pregunta {{$a}}", "requiresgrading": "Requiere calificación", - "unknown": "Desconocido" + "unknown": "No se puede determinar el estado." } \ No newline at end of file diff --git a/www/core/components/question/lang/eu.json b/www/core/components/question/lang/eu.json index 01be6f02930..75d807d6c04 100644 --- a/www/core/components/question/lang/eu.json +++ b/www/core/components/question/lang/eu.json @@ -17,5 +17,5 @@ "questionmessage": "{{$a}} galdera: {{$b}}", "questionno": "{{$a}} galdera", "requiresgrading": "Kalifikazioa behar du", - "unknown": "Ezezaguna" + "unknown": "Ezin da egoera zehaztu" } \ No newline at end of file diff --git a/www/core/components/question/lang/fr.json b/www/core/components/question/lang/fr.json index 82dddeba70a..1284a6a8d2a 100644 --- a/www/core/components/question/lang/fr.json +++ b/www/core/components/question/lang/fr.json @@ -17,5 +17,5 @@ "questionmessage": "Question {{$a}} : {{$b}}", "questionno": "Question {{$a}}", "requiresgrading": "Nécessite évaluation", - "unknown": "Inconnu" + "unknown": "Impossible de déterminer l'état" } \ No newline at end of file diff --git a/www/core/components/question/lang/it.json b/www/core/components/question/lang/it.json index 23bcbb55847..20bb79efc49 100644 --- a/www/core/components/question/lang/it.json +++ b/www/core/components/question/lang/it.json @@ -13,5 +13,5 @@ "questionmessage": "Domanda {{$a}}: {{$b}}", "questionno": "Domanda {{$a}}", "requiresgrading": "Richiede valutazione", - "unknown": "Sconosciuto" + "unknown": "Non è possibile determinare lo stato" } \ No newline at end of file diff --git a/www/core/components/question/lang/nl.json b/www/core/components/question/lang/nl.json index 48faa456e67..871c95b1c10 100644 --- a/www/core/components/question/lang/nl.json +++ b/www/core/components/question/lang/nl.json @@ -17,5 +17,5 @@ "questionmessage": "Vraag {{$a}}: {{$b}}", "questionno": "Vraag {{$a}}", "requiresgrading": "Beoordelen vereist", - "unknown": "Onbekend" + "unknown": "Kan status niet bepalen" } \ No newline at end of file diff --git a/www/core/components/question/lang/sr-cr.json b/www/core/components/question/lang/sr-cr.json index eb8373f0d60..b541c6bb2fe 100644 --- a/www/core/components/question/lang/sr-cr.json +++ b/www/core/components/question/lang/sr-cr.json @@ -17,5 +17,5 @@ "questionmessage": "Питање {{$a}}: {{$b}}", "questionno": "Питање {{$a}}", "requiresgrading": "Захтева оцењивање", - "unknown": "Непознато" + "unknown": "Није могуће утврдити статус" } \ No newline at end of file diff --git a/www/core/components/question/lang/sr-lt.json b/www/core/components/question/lang/sr-lt.json index cd455cf48ae..fe47446c308 100644 --- a/www/core/components/question/lang/sr-lt.json +++ b/www/core/components/question/lang/sr-lt.json @@ -17,5 +17,5 @@ "questionmessage": "Pitanje {{$a}}: {{$b}}", "questionno": "Pitanje {{$a}}", "requiresgrading": "Zahteva ocenjivanje", - "unknown": "Nepoznato" + "unknown": "Nije moguće utvrditi status" } \ No newline at end of file diff --git a/www/core/components/question/lang/uk.json b/www/core/components/question/lang/uk.json index c883b7f6b21..f83c00f0b3f 100644 --- a/www/core/components/question/lang/uk.json +++ b/www/core/components/question/lang/uk.json @@ -17,5 +17,5 @@ "questionmessage": "Питання {{$a}}: {{$b}}", "questionno": "Питання {{$a}}", "requiresgrading": "Потрібно оцінити", - "unknown": "Невідоме" + "unknown": "Неможливо визначити статус" } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/cs.json b/www/core/components/sharedfiles/lang/cs.json index 9a19d1f00b1..2cd35a9d0d4 100644 --- a/www/core/components/sharedfiles/lang/cs.json +++ b/www/core/components/sharedfiles/lang/cs.json @@ -5,7 +5,7 @@ "nosharedfiles": "Na tomto webu nejsou uložené žádné sdílené soubory.", "nosharedfilestoupload": "Nemáte žádné nahrané soubory. Pokud chcete nahrát soubor z jiné aplikace, vyhledejte tento soubor a klikněte na tlačítko \"Otevřít v\".", "rename": "Přejmenovat", - "replace": "Přepsat", + "replace": "Nahradit", "sharedfiles": "Sdílené soubory", "successstorefile": "Soubor byl úspěšně uložen. Nyní můžete vybrat tento soubor a nahrát do vašich soukromých souborů nebo připojit ji do některých činností." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/de.json b/www/core/components/sharedfiles/lang/de.json index aef668fe00a..6bbe564a7ac 100644 --- a/www/core/components/sharedfiles/lang/de.json +++ b/www/core/components/sharedfiles/lang/de.json @@ -5,7 +5,7 @@ "nosharedfiles": "Keine geteilten Dateien für diese Website", "nosharedfilestoupload": "Sie haben noch keine Dateien zum Hochladen freigegeben. Wenn Sie eine Datei aus einer anderen App hochladen möchten, suchen Sie diese Datei und tippen Sie auf die Taste 'Öffnen in'.", "rename": "Umbenennen", - "replace": "Ersetze", + "replace": "Ersetzen", "sharedfiles": "Geteilte Dateien", "successstorefile": "Die Datei wurde gespeichert. Sie können die Datei verwenden, um Sie in 'Meine Dateien' hochzuladen oder bei Aktivitäten anzuhängen." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/eu.json b/www/core/components/sharedfiles/lang/eu.json index a56363d095e..cbbcb5eef04 100644 --- a/www/core/components/sharedfiles/lang/eu.json +++ b/www/core/components/sharedfiles/lang/eu.json @@ -5,7 +5,7 @@ "nosharedfiles": "Ez dago artekatutako fitxategirik gune honetan.", "nosharedfilestoupload": "Ez duzu igotzeko fitxategirik hemen. Beste app baten bitartez fitxategia igo nahi baduzu, fitxategia aurkitu eta ondoren 'Ireki honekin' botoia sakatu.", "rename": "Berrizendatu", - "replace": "Ordezkatu", + "replace": "Ordeztu", "sharedfiles": "Partekatutako fitxategiak", "successstorefile": "Fitxategia ondo gorde da. Orain fitxategi hau aukeratu dezakezu zure gune pribatura igo edo jarduera bati eransteko." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/sr-cr.json b/www/core/components/sharedfiles/lang/sr-cr.json index f341d57f6b1..3b9b852cf35 100644 --- a/www/core/components/sharedfiles/lang/sr-cr.json +++ b/www/core/components/sharedfiles/lang/sr-cr.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "Не постоје меморисани сајтови. Молимо, додајте сајт пре него што покушате да поделите датотеке са апликацијом.", "nosharedfiles": "Не постоје дељене датотеке које се налазе на овом сајту.", "nosharedfilestoupload": "Овде немате датотеке које можете да отпремите. Ако желите да отпремите датотеку из друге апликације, пронађите ту датотеку и кликните на дугме 'Отвори у'.", - "rename": "Преименовање", + "rename": "Промени назив", "replace": "Замени", "sharedfiles": "Дељене датотеке", "successstorefile": "Датотека је успешно сачувана. Сада можете да изаберете ову датотеку да бисте је отпремили међу своје приватне датотеке или је придружили некој активности." diff --git a/www/core/components/sharedfiles/lang/sr-lt.json b/www/core/components/sharedfiles/lang/sr-lt.json index 2615dbff4fb..796ef026796 100644 --- a/www/core/components/sharedfiles/lang/sr-lt.json +++ b/www/core/components/sharedfiles/lang/sr-lt.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "Ne postoje memorisani sajtovi. Molimo, dodajte sajt pre nego što pokušate da podelite datoteke sa aplikacijom.", "nosharedfiles": "Ne postoje deljene datoteke koje se nalaze na ovom sajtu.", "nosharedfilestoupload": "Ovde nemate datoteke koje možete da otpremite. Ako želite da otpremite datoteku iz druge aplikacije, pronađite tu datoteku i kliknite na dugme 'Otvori u'.", - "rename": "Preimenovanje", + "rename": "Promeni naziv", "replace": "Zameni", "sharedfiles": "Deljene datoteke", "successstorefile": "Datoteka je uspešno sačuvana. Sada možete da izaberete ovu datoteku da biste je otpremili među svoje privatne datoteke ili je pridružili nekoj aktivnosti." diff --git a/www/core/components/sharedfiles/lang/uk.json b/www/core/components/sharedfiles/lang/uk.json index f16da3ef448..6a2a6c61255 100644 --- a/www/core/components/sharedfiles/lang/uk.json +++ b/www/core/components/sharedfiles/lang/uk.json @@ -5,7 +5,7 @@ "nosharedfiles": "Немає загальних файлів, що зберігаються на цьому сайті.", "nosharedfilestoupload": "У вас немає файлів для завантаження. Якщо ви хочете завантажити файл з іншої програми, знайдіть цей файл і натисніть кнопку «Відкрити\".", "rename": "Перейменувати", - "replace": "Замінити", + "replace": "Перемістити", "sharedfiles": "Розшарити файли", "successstorefile": "Файл успішно збережений. Тепер ви можете вибрати цей файл, щоб завантажити його на ваші особисті файли або прикріпити його в деяких видах діяльності." } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/ar.json b/www/core/components/sidemenu/lang/ar.json index 79a0f6adb0d..79c72d2c731 100644 --- a/www/core/components/sidemenu/lang/ar.json +++ b/www/core/components/sidemenu/lang/ar.json @@ -2,7 +2,7 @@ "appsettings": "إعدادات التطبيق", "changesite": "الخروج", "help": "مساعدة", - "logout": "خروج", - "mycourses": "مقرراتي الدراسية", + "logout": "الخروج", + "mycourses": "مقرراتي", "website": "الموقع" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/cs.json b/www/core/components/sidemenu/lang/cs.json index 68c7fe8de79..7de80a2bb9b 100644 --- a/www/core/components/sidemenu/lang/cs.json +++ b/www/core/components/sidemenu/lang/cs.json @@ -1,8 +1,8 @@ { "appsettings": "Nastavení aplikace", "changesite": "Změnit stránky", - "help": "Pomoc", - "logout": "Odhlásit se", + "help": "Nápověda", + "logout": "Odhlásit", "mycourses": "Moje kurzy", "togglemenu": "Přepnout nabídku", "website": "Webová stránka" diff --git a/www/core/components/sidemenu/lang/de.json b/www/core/components/sidemenu/lang/de.json index e700f3ddc90..0ed4e3b6221 100644 --- a/www/core/components/sidemenu/lang/de.json +++ b/www/core/components/sidemenu/lang/de.json @@ -2,7 +2,7 @@ "appsettings": "Einstellungen", "changesite": "Website wechseln", "help": "Hilfe", - "logout": "Logout", + "logout": "Abmelden", "mycourses": "Meine Kurse", "togglemenu": "Menü umschalten", "website": "Website" diff --git a/www/core/components/sidemenu/lang/el.json b/www/core/components/sidemenu/lang/el.json index 114771adbff..2e0168f9e01 100644 --- a/www/core/components/sidemenu/lang/el.json +++ b/www/core/components/sidemenu/lang/el.json @@ -2,7 +2,7 @@ "appsettings": "Ρυθμίσεις εφαρμογής", "changesite": "Αλλαγή ιστότοπου", "help": "Βοήθεια", - "logout": "Έξοδος", + "logout": "Αποσύνδεση", "mycourses": "Τα μαθήματά μου", "togglemenu": "Αλλαγή μενού", "website": "Ιστότοπος" diff --git a/www/core/components/sidemenu/lang/eu.json b/www/core/components/sidemenu/lang/eu.json index c5757719d6e..d6c4be2b4ea 100644 --- a/www/core/components/sidemenu/lang/eu.json +++ b/www/core/components/sidemenu/lang/eu.json @@ -2,7 +2,7 @@ "appsettings": "App-aren ezarpenak", "changesite": "Aldatu gunea", "help": "Laguntza", - "logout": "Saioa amaitu", + "logout": "Irten", "mycourses": "Nire ikastaroak", "togglemenu": "Aldatu menua", "website": "Webgunea" diff --git a/www/core/components/sidemenu/lang/he.json b/www/core/components/sidemenu/lang/he.json index df2620a0194..defec49d009 100644 --- a/www/core/components/sidemenu/lang/he.json +++ b/www/core/components/sidemenu/lang/he.json @@ -2,7 +2,7 @@ "appsettings": "הגדרות יישומון", "changesite": "התנתק", "help": "עזרה", - "logout": "התנתקות", + "logout": "התנתק", "mycourses": "הקורסים שלי", "togglemenu": "החלפת מצב תפריט", "website": "אתר אינטרנט" diff --git a/www/core/components/sidemenu/lang/it.json b/www/core/components/sidemenu/lang/it.json index 9e368b1ef6f..b86c1c18949 100644 --- a/www/core/components/sidemenu/lang/it.json +++ b/www/core/components/sidemenu/lang/it.json @@ -2,7 +2,7 @@ "appsettings": "Impostazioni app", "changesite": "Cambia sito", "help": "Aiuto", - "logout": "Esci", + "logout": "Logout", "mycourses": "I miei corsi", "togglemenu": "Attiva/disattiva menu", "website": "Sito web" diff --git a/www/core/components/sidemenu/lang/nl.json b/www/core/components/sidemenu/lang/nl.json index 8a50f17cc30..d06e70ec6d8 100644 --- a/www/core/components/sidemenu/lang/nl.json +++ b/www/core/components/sidemenu/lang/nl.json @@ -2,7 +2,7 @@ "appsettings": "App instellingen", "changesite": "Naar andere site", "help": "Help", - "logout": "Log uit", + "logout": "Afmelden", "mycourses": "Mijn cursussen", "togglemenu": "Menu schakelen", "website": "Website" diff --git a/www/core/components/sidemenu/lang/ru.json b/www/core/components/sidemenu/lang/ru.json index 541a10d3285..668c559c737 100644 --- a/www/core/components/sidemenu/lang/ru.json +++ b/www/core/components/sidemenu/lang/ru.json @@ -1,7 +1,7 @@ { "appsettings": "Настройки приложения", "changesite": "Выход", - "help": "Справка", + "help": "Помощь", "logout": "Выход", "mycourses": "Мои курсы", "website": "Сайт" diff --git a/www/core/components/sidemenu/lang/uk.json b/www/core/components/sidemenu/lang/uk.json index 21328fec9b5..2442161b325 100644 --- a/www/core/components/sidemenu/lang/uk.json +++ b/www/core/components/sidemenu/lang/uk.json @@ -2,7 +2,7 @@ "appsettings": "Налаштування додатку", "changesite": "Змінити сайт", "help": "Допомога", - "logout": "Вихід", + "logout": "Вийти", "mycourses": "Мої курси", "togglemenu": "Перемикання меню", "website": "Веб-сайт" diff --git a/www/core/components/user/lang/ar.json b/www/core/components/user/lang/ar.json index c2213eb9c76..a22b70dffda 100644 --- a/www/core/components/user/lang/ar.json +++ b/www/core/components/user/lang/ar.json @@ -4,7 +4,7 @@ "contact": "جهة اتصال", "country": "الدولة", "description": "نص المقدمة", - "details": "تفاصيل متابعة اسكو", + "details": "التفاصيل", "editingteacher": "معلم", "email": "بريد الإلكتروني", "emailagain": "إعادة إدخال البريد الإلكتروني للتأكيد ", @@ -15,7 +15,7 @@ "manager": "مدير", "newpicture": "صورة شخصية جديدة", "phone1": "هاتف", - "phone2": "رقم الهاتف المحمول", + "phone2": "الجوال", "roles": "أدوار", "student": "طالب", "viewprofile": "عرض الحساب", diff --git a/www/core/components/user/lang/cs.json b/www/core/components/user/lang/cs.json index 5533c565060..d6a2f04ff29 100644 --- a/www/core/components/user/lang/cs.json +++ b/www/core/components/user/lang/cs.json @@ -4,19 +4,19 @@ "contact": "Kontakt", "country": "Země", "description": "Popis", - "details": "Podrobnosti o průchodu", + "details": "Detaily", "detailsnotavailable": "Podrobnosti o tomto uživateli nejsou k dispozici.", "editingteacher": "Učitel", "email": "Poslat e-mailem", "emailagain": "E-mail (znovu)", "firstname": "Křestní jméno", "interests": "Zájmy", - "invaliduser": "Neplatný uživatel", + "invaliduser": "Neplatný uživatel.", "lastname": "Příjmení", "manager": "Manažer", "newpicture": "Nový obrázek", "phone1": "Telefon", - "phone2": "Mobilní telefon", + "phone2": "Mobil", "roles": "Role", "sendemail": "Email", "student": "Student", diff --git a/www/core/components/user/lang/da.json b/www/core/components/user/lang/da.json index 102926802a6..934282c82cc 100644 --- a/www/core/components/user/lang/da.json +++ b/www/core/components/user/lang/da.json @@ -4,14 +4,14 @@ "contact": "Kontakt", "country": "Land", "description": "Beskrivelse", - "details": "Følg detaljer", + "details": "Detaljer", "detailsnotavailable": "Denne brugers data er ikke tilgængelige for dig.", "editingteacher": "Lærer", "email": "E-mail", "emailagain": "E-mail (igen)", "firstname": "Fornavn", "interests": "Interesser", - "invaliduser": "Ugyldig bruger", + "invaliduser": "Ugyldig bruger.", "lastname": "Efternavn", "manager": "Manager", "newpicture": "Nyt billede", diff --git a/www/core/components/user/lang/de.json b/www/core/components/user/lang/de.json index 9d95a7c6312..c5acfba8273 100644 --- a/www/core/components/user/lang/de.json +++ b/www/core/components/user/lang/de.json @@ -4,19 +4,19 @@ "contact": "Kontakt", "country": "Land", "description": "Beschreibung", - "details": "Trackingdetails", + "details": "Details", "detailsnotavailable": "Die Nutzerdetails zu dieser Person sind für Sie nicht verfügbar.", "editingteacher": "Trainer/in", "email": "E-Mail", "emailagain": "E-Mail (wiederholen)", "firstname": "Vorname", "interests": "Persönliche Interessen", - "invaliduser": "Ungültige Nutzer/in", + "invaliduser": "Nutzer/in ungültig", "lastname": "Nachname", "manager": "Manager/in", "newpicture": "Neues Foto", "phone1": "Telefon", - "phone2": "Mobiltelefon", + "phone2": "Mobil", "roles": "Rollen", "sendemail": "E-Mail", "student": "Teilnehmer/in", diff --git a/www/core/components/user/lang/el.json b/www/core/components/user/lang/el.json index 2b3c68364dd..b3f61aab273 100644 --- a/www/core/components/user/lang/el.json +++ b/www/core/components/user/lang/el.json @@ -4,7 +4,7 @@ "contact": "Επικοινωνία", "country": "Χώρα", "description": "Περιγραφή", - "details": "Παρακολούθηση λεπτομερειών", + "details": "Λεπτομέρειες", "detailsnotavailable": "Λεπτομέρειες για αυτό τον χρήστη δεν είναι διαθέσιμες.", "editingteacher": "Διδάσκων", "email": "Ηλεκτρονικό Ταχυδρομείο", @@ -16,10 +16,10 @@ "manager": "Διαχειριστής", "newpicture": "Νέα εικόνα", "phone1": "Τηλέφωνο", - "phone2": "Κινητό τηλέφωνο", + "phone2": "Κινητό", "roles": "Ρόλοι", "sendemail": "Email", - "student": "Φοιτητής", + "student": "Μαθητής", "teacher": "Διδάσκων χωρίς δικαιώματα αλλαγής", "viewprofile": "Επισκόπηση του προφίλ", "webpage": "Ιστοσελίδα" diff --git a/www/core/components/user/lang/es.json b/www/core/components/user/lang/es.json index 3839cc05d90..42dfd84651d 100644 --- a/www/core/components/user/lang/es.json +++ b/www/core/components/user/lang/es.json @@ -4,7 +4,7 @@ "contact": "Contacto", "country": "País", "description": "Descripción", - "details": "Detalles del rastreo SCO", + "details": "Detalles", "detailsnotavailable": "No tiene acceso a los detalles de este usuario.", "editingteacher": "Profesor", "email": "Email", @@ -16,7 +16,7 @@ "manager": "Gestor", "newpicture": "Imagen nueva", "phone1": "Teléfono", - "phone2": "Teléfono móvil", + "phone2": "Móvil", "roles": "Roles", "sendemail": "Correo electrónico", "student": "Estudiante", diff --git a/www/core/components/user/lang/eu.json b/www/core/components/user/lang/eu.json index 032d503d7e7..c0d05d48750 100644 --- a/www/core/components/user/lang/eu.json +++ b/www/core/components/user/lang/eu.json @@ -4,19 +4,19 @@ "contact": "Kontaktua", "country": "Herrialdea", "description": "Deskribapena", - "details": "Pistaren zehaztasunak", + "details": "Xehetasunak", "detailsnotavailable": "Erabiltzaile honen xehetasunak ez daude zuretzat eskuragarri", "editingteacher": "Irakaslea", "email": "E-posta", "emailagain": "E-posta (berriro)", "firstname": "Izena", "interests": "Interesguneak", - "invaliduser": "Erabiltzaile baliogabea", + "invaliduser": "Erabiltzailea ez da zuzena.", "lastname": "Deitura", "manager": "Kudeatzailea", "newpicture": "Irudi berria", "phone1": "Telefonoa", - "phone2": "Telefono mugikorra", + "phone2": "Sakelekoa", "roles": "Rolak", "sendemail": "E-posta", "student": "Ikaslea", diff --git a/www/core/components/user/lang/fr.json b/www/core/components/user/lang/fr.json index 06e5d47b78d..55ae03508ff 100644 --- a/www/core/components/user/lang/fr.json +++ b/www/core/components/user/lang/fr.json @@ -4,22 +4,22 @@ "contact": "Contact", "country": "Pays", "description": "Description", - "details": "Détails du parcours", + "details": "Détails", "detailsnotavailable": "Vous n'avez pas accès aux informations de cet utilisateur.", "editingteacher": "Enseignant", "email": "Courriel", "emailagain": "Courriel (confirmation)", "firstname": "Prénom", "interests": "Centres d'intérêt", - "invaliduser": "Utilisateur non valide", + "invaliduser": "Utilisateur non valide.", "lastname": "Nom", "manager": "Gestionnaire", "newpicture": "Nouvelle image", "phone1": "Téléphone", - "phone2": "Téléphone mobile", + "phone2": "Mobile", "roles": "Rôles", "sendemail": "Courriel", - "student": "Participants", + "student": "Étudiant", "teacher": "Enseignant non-éditeur", "viewprofile": "Consulter le profil", "webpage": "Page Web" diff --git a/www/core/components/user/lang/he.json b/www/core/components/user/lang/he.json index 212f9bb5b8a..6eb90b319d2 100644 --- a/www/core/components/user/lang/he.json +++ b/www/core/components/user/lang/he.json @@ -1,22 +1,22 @@ { "address": "כתובת", "city": "ישוב", - "contact": "ליצירת קשר", + "contact": "צור קשר", "country": "ארץ", "description": "הנחיה למטלה", - "details": "דוח המעקב מפורט", + "details": "פרטים", "detailsnotavailable": "פרטי משתמש זה אינם זמינים לך.", "editingteacher": "מרצה", "email": "דוא\"ל", "emailagain": "דואר אלקטרוני (שוב)", "firstname": "שם פרטי", "interests": "תחומי עניין", - "invaliduser": "משתמש שגוי", + "invaliduser": "משתמש לא תקף.", "lastname": "שם משפחה", "manager": "מנהל", "newpicture": "תמונה חדשה", "phone1": "טלפון", - "phone2": "טלפון נייד", + "phone2": "סלולרי", "roles": "תפקידים", "student": "סטודנט", "teacher": "עוזר/ת הוראה", diff --git a/www/core/components/user/lang/it.json b/www/core/components/user/lang/it.json index 9aa43cad4d0..8d2c83785c7 100644 --- a/www/core/components/user/lang/it.json +++ b/www/core/components/user/lang/it.json @@ -4,19 +4,19 @@ "contact": "Contatto", "country": "Nazione", "description": "Descrizione", - "details": "Dettagli tracciamento", + "details": "Dettagli", "detailsnotavailable": "Non puoi visualizzare i dettagli di questo utente.", "editingteacher": "Docente", "email": "Email", "emailagain": "Indirizzo email (ripeti)", "firstname": "Nome", "interests": "Interessi", - "invaliduser": "Utente non valido", + "invaliduser": "Utente non valido.", "lastname": "Cognome", "manager": "Manager", "newpicture": "Nuova immagine", "phone1": "Telefono", - "phone2": "Cellulare", + "phone2": "Mobile", "roles": "Ruoli", "student": "Studente", "teacher": "Docente non editor", diff --git a/www/core/components/user/lang/ja.json b/www/core/components/user/lang/ja.json index a07f54c15b6..7b191daf6d3 100644 --- a/www/core/components/user/lang/ja.json +++ b/www/core/components/user/lang/ja.json @@ -1,10 +1,10 @@ { "address": "住所", "city": "都道府県", - "contact": "連絡先", + "contact": "コンタクト", "country": "国", "description": "説明", - "details": "トラック詳細", + "details": "詳細", "email": "メール", "emailagain": "メールアドレス (もう一度)", "firstname": "名", diff --git a/www/core/components/user/lang/nl.json b/www/core/components/user/lang/nl.json index 040c2592de8..0ca1abf5ab6 100644 --- a/www/core/components/user/lang/nl.json +++ b/www/core/components/user/lang/nl.json @@ -4,14 +4,14 @@ "contact": "Contact", "country": "Land", "description": "Beschrijving", - "details": "SCO opvolgdetails", + "details": "Details", "detailsnotavailable": "Je kunt de details voor deze gebruiker niet bekijken.", "editingteacher": "Leraar", "email": "E-mail", "emailagain": "E-mail (nogmaals)", "firstname": "Voornaam", "interests": "Interesses", - "invaliduser": "Ongeldige gebruiker", + "invaliduser": "Ongeldige gebuiker", "lastname": "Achternaam", "manager": "Manager", "newpicture": "Nieuwe foto", diff --git a/www/core/components/user/lang/ru.json b/www/core/components/user/lang/ru.json index eec8fc8030f..0ded3856726 100644 --- a/www/core/components/user/lang/ru.json +++ b/www/core/components/user/lang/ru.json @@ -4,19 +4,19 @@ "contact": "Контакты", "country": "Страна", "description": "Описание", - "details": "Подробный отчет", + "details": "Подробнее", "detailsnotavailable": "Вам не доступны подробности этого пользователя", "editingteacher": "Учитель", "email": "Email", "emailagain": "Адрес электронной почты (еще раз)", "firstname": "Имя", "interests": "Интересы", - "invaliduser": "Некорректный пользователь", + "invaliduser": "Неправильный пользователь", "lastname": "Фамилия", "manager": "Управляющий", "newpicture": "Новое изображение", "phone1": "Телефон", - "phone2": "Мобильный телефон", + "phone2": "Мобильный", "roles": "Роли", "student": "Студент", "teacher": "Учитель без права редактирования (ассистент)", diff --git a/www/core/components/user/lang/sr-cr.json b/www/core/components/user/lang/sr-cr.json index c97c7534c91..d9c657dc5ac 100644 --- a/www/core/components/user/lang/sr-cr.json +++ b/www/core/components/user/lang/sr-cr.json @@ -4,19 +4,19 @@ "contact": "Контакт", "country": "Држава", "description": "Опис", - "details": "Прати детаље", + "details": "Подаци о кориснику", "detailsnotavailable": "Подаци о овом кориснику вам нису доступни.", "editingteacher": "Предавач", "email": "Адреса е-поште", "emailagain": "Адреса е-поште (поново)", "firstname": "Име", "interests": "Интересовања", - "invaliduser": "Неисправан корисник", + "invaliduser": "Неисправан корисник.", "lastname": "Презиме", "manager": "Менаџер", "newpicture": "Нова слика", "phone1": "Телефон", - "phone2": "Мобилни телефон", + "phone2": "Мобилни", "roles": "Улоге", "sendemail": "Е-пошта", "student": "Полазник", diff --git a/www/core/components/user/lang/sr-lt.json b/www/core/components/user/lang/sr-lt.json index 97e30a4e4c8..6f944737893 100644 --- a/www/core/components/user/lang/sr-lt.json +++ b/www/core/components/user/lang/sr-lt.json @@ -4,19 +4,19 @@ "contact": "Kontakt", "country": "Država", "description": "Opis", - "details": "Prati detalje", + "details": "Podaci o korisniku", "detailsnotavailable": "Podaci o ovom korisniku vam nisu dostupni.", "editingteacher": "Predavač", "email": "Adresa e-pošte", "emailagain": "Adresa e-pošte (ponovo)", "firstname": "Ime", "interests": "Interesovanja", - "invaliduser": "Neispravan korisnik", + "invaliduser": "Neispravan korisnik.", "lastname": "Prezime", "manager": "Menadžer", "newpicture": "Nova slika", "phone1": "Telefon", - "phone2": "Mobilni telefon", + "phone2": "Mobilni", "roles": "Uloge", "sendemail": "E-pošta", "student": "Polaznik", diff --git a/www/core/components/user/lang/sv.json b/www/core/components/user/lang/sv.json index 94ca7299b23..de1a0d62c87 100644 --- a/www/core/components/user/lang/sv.json +++ b/www/core/components/user/lang/sv.json @@ -4,21 +4,21 @@ "contact": "Kontakt", "country": "Land", "description": "Beskrivning", - "details": "Detaljerad SCO spårning", + "details": "Detaljer", "detailsnotavailable": "Detaljerna till denna användare är inte tillgängliga för dig.", "editingteacher": "Lärare", "email": "E-post", "emailagain": "E-post (igen)", "firstname": "Förnamn", "interests": "Intressen", - "invaliduser": "Ogiltig användare", + "invaliduser": "Ogiltig användare.", "lastname": "Efternamn", "manager": "Manager", "newpicture": "Ny bild", "phone1": "Telefon", - "phone2": "Mobiltelefon", + "phone2": "Mobil", "roles": "Roller", - "student": "Student/elev/deltagare/lärande", + "student": "Student", "teacher": "Icke editerande lärare", "viewprofile": "Visa profil", "webpage": "Webbsida" diff --git a/www/core/components/user/lang/uk.json b/www/core/components/user/lang/uk.json index 94b6b0bd9ad..dc4c1e7d015 100644 --- a/www/core/components/user/lang/uk.json +++ b/www/core/components/user/lang/uk.json @@ -4,19 +4,19 @@ "contact": "Контакт", "country": "Країна", "description": "Опис", - "details": "Деталі запису", + "details": "Деталі", "detailsnotavailable": "Деталі цього користувача вам не доступні", "editingteacher": "Вчитель", "email": "Ел.пошта", "emailagain": "Електронна пошта (повторно)", "firstname": "Ім'я", "interests": "Інтереси", - "invaliduser": "Неправильний користувач", + "invaliduser": "Невірний користувач.", "lastname": "Прізвище", "manager": "Менеджер", "newpicture": "Новий малюнок", "phone1": "Телефон", - "phone2": "Мобільний телефон", + "phone2": "Mobile", "roles": "Ролі", "sendemail": "Email", "student": "Студент", diff --git a/www/core/lang/ar.json b/www/core/lang/ar.json index 8bd2f54a65c..cdd15900df0 100644 --- a/www/core/lang/ar.json +++ b/www/core/lang/ar.json @@ -103,7 +103,7 @@ "required": "مطلوب", "save": "حفظ", "search": "بحث", - "searching": "بحث في", + "searching": "يتم البحث", "searchresults": "نتائج البحث", "sec": "ثانية", "secs": "ثواني", diff --git a/www/core/lang/cs.json b/www/core/lang/cs.json index 5418ade47f0..6ac7d06210e 100644 --- a/www/core/lang/cs.json +++ b/www/core/lang/cs.json @@ -17,9 +17,9 @@ "comments": "Komentáře", "commentscount": "Komentáře ({{$a}})", "commentsnotworking": "Komentáře nemohou být obnoveny", - "completion-alt-auto-fail": "Splněno: {{$a}} (nebylo dosaženo požadované známky)", + "completion-alt-auto-fail": "Splněno: {{$a}} ; ale nedosáhli se potřebné známky", "completion-alt-auto-n": "Nesplněno: {{$a}}", - "completion-alt-auto-pass": "Splněno: {{$a}} (bylo dosaženo požadované známky)", + "completion-alt-auto-pass": "Splněno: {{$a}}; dosáhli se potřebné známky", "completion-alt-auto-y": "Splněno: {{$a}}", "completion-alt-manual-n": "Nesplněno: {{$a}}. Výběrem označíte jako splněné.", "completion-alt-manual-y": "Splněno: {{$a}}. Výběrem označíte jako nesplněné.", @@ -87,7 +87,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Obrázek", "imageviewer": "Prohlížeč obrázků", - "info": "Info", + "info": "Informace", "ios": "iOS", "labelsep": ": ", "lastmodified": "Naposledy změněno", @@ -135,7 +135,7 @@ "nocomments": "Nejsou žádné komentáře", "nograde": "Žádné hodnocení.", "none": "Nic", - "nopasswordchangeforced": "Nemůžete pokračovat dál bez změny hesla, ale stránka pro jeho změnu není k dispozici. Kontaktujte správce Vašeho eLearningu Moodle.", + "nopasswordchangeforced": "Nelze pokračovat beze změny hesla.", "nopermissions": "Je mi líto, ale momentálně nemáte oprávnění vykonat tuto operaci ({{$a}})", "noresults": "Žádné výsledky", "notapplicable": "n/a", @@ -143,7 +143,7 @@ "notsent": "Neodesláno", "now": "nyní", "numwords": "{{$a}} slov", - "offline": "Nejsou požadovány odpovědi online", + "offline": "Offline", "online": "Online", "openfullimage": "Zde klikněte pro zobrazení obrázku v plné velikosti", "openinbrowser": "Otevřít v prohlížeči", @@ -161,13 +161,13 @@ "retry": "Opakovat", "save": "Uložit", "search": "Vyhledat", - "searching": "Hledat v", + "searching": "Hledání", "searchresults": "Výsledky hledání", "sec": "sek.", "secs": "sekund", "seemoredetail": "Více podrobností...", "send": "Odeslat", - "sending": "Odesílání", + "sending": "Odeslání", "serverconnection": "Chyba spojení se serverem", "show": "Ukázat", "showmore": "Zobrazit více...", @@ -182,7 +182,7 @@ "sortby": "Třídit podle", "start": "Začátek", "submit": "Odeslat", - "success": "Úspěch", + "success": "Úspěch!", "tablet": "Tablet", "teachers": "Učitelé", "thereisdatatosync": "K dispozici jsou v offline režimu {{$a}}, které mají být synchronizovány.", diff --git a/www/core/lang/da.json b/www/core/lang/da.json index 72894fffc8c..a81cfdb8695 100644 --- a/www/core/lang/da.json +++ b/www/core/lang/da.json @@ -16,12 +16,12 @@ "close": "Luk", "comments": "Kommentarer", "commentscount": "Kommentarer ({{$a}})", - "completion-alt-auto-fail": "Gennemført: {{$a}} (opnåede ikke beståelseskarakter)", + "completion-alt-auto-fail": "Gennemført: {{$a}} (bestod ikke)", "completion-alt-auto-n": "Ikke gennemført: {{$a}}", - "completion-alt-auto-pass": "Gennemført: {{$a}} (opnåede beståelseskarakter)", + "completion-alt-auto-pass": "Gennemført: {{$a}} (bestod)", "completion-alt-auto-y": "Gennemført: {{$a}}", - "completion-alt-manual-n": "Ikke gennemført: {{$a}}. Vælg for at markere som gennemført.", - "completion-alt-manual-y": "Gennemført: {{$a}}. Vælg for at markere som ikke gennemført.", + "completion-alt-manual-n": "Ikke gennemført: {{$a}}. Vælg til markering som gennemført.", + "completion-alt-manual-y": "Gennemført: {{$a}}. Vælg til markering som ikke gennemført.", "confirmcanceledit": "Er du sikker på at du vil forlade denne side? Alle ændringer vil gå tabt.", "confirmdeletefile": "Er du sikker på at du vil slette denne fil?", "confirmopeninbrowser": "Vil du åbne den i en browser?", @@ -62,7 +62,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Billede", "imageviewer": "Billedfremviser", - "info": "Info", + "info": "Information", "ios": "iOS", "labelsep": ":", "lastmodified": "Senest ændret", @@ -115,7 +115,7 @@ "notice": "Bemærk", "now": "nu", "numwords": "{{$a}} ord", - "offline": "Der kræves ikke online-aflevering", + "offline": "Offline", "online": "Online", "openfullimage": "Klik her for at vise billedet i fuld størrelse.", "openinbrowser": "Åben i browser", @@ -130,7 +130,7 @@ "requireduserdatamissing": "Denne bruger mangler nogle krævede profildata. Udfyld venligst de manglende data i din Moodle og prøv igen.
    {{$a}}", "save": "Gem", "search": "Søg...", - "searching": "Søg i", + "searching": "Søger", "searchresults": "Søgeresultater", "sec": "sekunder", "secs": "sekunder", @@ -148,7 +148,7 @@ "sortby": "Sorter efter", "start": "Start", "submit": "Send", - "success": "Succes", + "success": "Succes!", "tablet": "Tablet", "teachers": "Lærere", "time": "Tid", diff --git a/www/core/lang/de.json b/www/core/lang/de.json index 8ed54a59912..ecccdb261e4 100644 --- a/www/core/lang/de.json +++ b/www/core/lang/de.json @@ -17,12 +17,12 @@ "comments": "Kommentare", "commentscount": "Kommentare ({{$a}})", "commentsnotworking": "Kommentare können nicht mehr abgerufen werden", - "completion-alt-auto-fail": "Abgeschlossen: {{$a}} (ohne Erfolg)", + "completion-alt-auto-fail": "Abgeschlossen: {{$a}} (Anforderung nicht erreicht)", "completion-alt-auto-n": "Nicht abgeschlossen: {{$a}}", - "completion-alt-auto-pass": "Abgeschlossen: {{$a}} (mit Erfolg)", + "completion-alt-auto-pass": "Abgeschlossen: {{$a}} (Anforderung erreicht)", "completion-alt-auto-y": "Abgeschlossen: {{$a}}", - "completion-alt-manual-n": "Nicht abgeschlossen: {{$a}} - mit Auswahl als abgeschlossen markieren", - "completion-alt-manual-y": "Abgeschlossen: {{$a}} - mit Auswahl als nicht abgeschlossen markieren", + "completion-alt-manual-n": "Nicht abgeschlossen: {{$a}}. Auswählen, um als abgeschlossen zu markieren.", + "completion-alt-manual-y": "Abgeschlossen: {{$a}}. Auswählen, um als nicht abgeschlossen zu markieren.", "confirmcanceledit": "Möchten Sie diese Seite wirklich verlassen? Alle Änderungen gehen verloren!", "confirmdeletefile": "Möchten Sie diese Datei wirklich löschen?", "confirmloss": "Möchten Sie wirklich alle Änderungen verlieren?", @@ -41,7 +41,7 @@ "decsep": ",", "defaultvalue": "Standard ({{$a}})", "delete": "Löschen", - "deleting": "Lösche", + "deleting": "Löschen ...", "description": "Beschreibung", "dfdaymonthyear": "DD.MM.YYYY", "dfdayweekmonth": "ddd, D. MMM", @@ -87,7 +87,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Bild", "imageviewer": "Bildanzeige", - "info": "Informationen", + "info": "Info", "ios": "iOS", "labelsep": ": ", "lastmodified": "Zuletzt geändert", @@ -135,7 +135,7 @@ "nocomments": "Keine Kommentare", "nograde": "Keine Bewertung.", "none": "Kein", - "nopasswordchangeforced": "Ohne die Änderung des Kennworts können Sie nicht weitermachen. Falls die Seite zur Änderung des Kennworts nicht verfügbar ist, wenden Sie sich an den Administrator der Website.", + "nopasswordchangeforced": "Sie können nicht weitermachen, ohne das Kennwort zu ändern.", "nopermissions": "Sie besitzen derzeit keine Rechte, dies zu tun ({{$a}}).", "noresults": "Keine Ergebnisse", "notapplicable": "n/a", @@ -143,7 +143,7 @@ "notsent": "Nicht gesendet", "now": "jetzt", "numwords": "{{$a}} Wörter", - "offline": "Keine Online-Abgabe notwendig", + "offline": "Offline", "online": "Online", "openfullimage": "Tippen Sie hier, um das Bild in voller Größe anzuzeigen", "openinbrowser": "Im Browser öffnen", @@ -161,13 +161,13 @@ "retry": "Neu versuchen", "save": "Sichern", "search": "Suche", - "searching": "Suche in", + "searching": "Suchen", "searchresults": "Suchergebnisse", "sec": "Sekunde", "secs": "Sekunden", "seemoredetail": "Hier klicken, um weitere Details sichtbar zu machen", "send": "Senden", - "sending": "wird gesendet", + "sending": "Senden", "serverconnection": "Fehler beim Aufbau der Verbindung zum Server", "show": "Zeigen", "showmore": "Mehr anzeigen ...", @@ -182,7 +182,7 @@ "sortby": "Sortiert nach", "start": "Start", "submit": "Übertragen", - "success": "erfolgreich", + "success": "Fertig!", "tablet": "Tablet", "teachers": "Trainer/innen", "thereisdatatosync": "Die Offline-Daten {{$a}} müssen synchronisiert werden.", diff --git a/www/core/lang/el.json b/www/core/lang/el.json index f9e97706e12..c5cae2c9145 100644 --- a/www/core/lang/el.json +++ b/www/core/lang/el.json @@ -17,12 +17,12 @@ "comments": "Σχόλια", "commentscount": "Σχόλια ({{$a}})", "commentsnotworking": "Τα σχόλια δεν μπορούν να ανακτηθούν", - "completion-alt-auto-fail": "Ολοκληρωμένο (με βαθμό κάτω της βάσης)", - "completion-alt-auto-n": "Μη ολοκληρωμένο", - "completion-alt-auto-pass": "Ολοκληρωμένο (με βαθμό άνω της βάσης)", - "completion-alt-auto-y": "Ολοκληρωμένο", - "completion-alt-manual-n": "Μη ολοκληρωμένο, επιλέξτε για να το σημειώσετε ως ολοκληρωμένο", - "completion-alt-manual-y": "Ολοκληρωμένο, επιλέξτε για να το σημειώσετε ως μη ολοκληρωμένο", + "completion-alt-auto-fail": "Ολοκληρώθηκε: {{$a}} (δεν πετύχατε βαθμό πρόσβασης)", + "completion-alt-auto-n": "Δεν ολοκληρώθηκε: {{$a}}", + "completion-alt-auto-pass": "Ολοκληρώθηκε: {{$a}} (πετύχατε βαθμό πρόσβασης)", + "completion-alt-auto-y": "Ολοκληρώθηκε: {{$a}}", + "completion-alt-manual-n": "Δεν ολοκληρώθηκε: {{$a}}. Επιλέξτε για να οριστεί ως ολοκληρωμένο.", + "completion-alt-manual-y": "Ολοκληρώθηκε: {{$a}}. Επιλέξτε για να οριστεί ως μη ολοκληρωμένο.", "confirmcanceledit": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν τη σελίδα; Όλες οι αλλαγές θα χαθούν.", "confirmdeletefile": "Είστε σίγουροι οτι θέλετε να διαγράψετε αυτό το αρχείο?", "confirmloss": "Είστε σίγουροι? Όλες οι αλλαγές θα χαθούν.", @@ -40,7 +40,7 @@ "days": "Ημέρες", "decsep": ",", "delete": "Διαγραφή", - "deleting": "Διαγραφή", + "deleting": "Γίνεται διαγραφή", "description": "Περιγραφή", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -133,7 +133,7 @@ "nocomments": "Δεν υπάρχουν σχόλια", "nograde": "Κανένα βαθμό.", "none": "Κανένα", - "nopasswordchangeforced": "You cannot proceed without changing your password, however there is no available page for changing it. Please contact your Moodle Administrator.", + "nopasswordchangeforced": "Δεν μπορείτε να προχωρήσετε χωρίς να αλλάξετε τον κωδικό πρόσβασής σας.", "nopermissions": "Συγνώμη, αλλά επί του τρεχόντως δεν έχετε το δικαίωμα να το κάνετε αυτό ({{$a}})", "noresults": "Κανένα αποτέλεσμα", "notapplicable": "n/a", @@ -141,7 +141,7 @@ "notsent": "Δεν εστάλη", "now": "τώρα", "numwords": "{{$a}} λέξεις", - "offline": "Δεν απαιτείται διαδικτυακή υποβολή", + "offline": "Εκτός σύνδεσης", "online": "Συνδεδεμένος", "openfullimage": "Πατήστε εδώ για να δείτε την εικόνα σε πλήρες μέγεθος", "openinbrowser": "Ανοίξτε στον περιηγητή.", @@ -159,13 +159,13 @@ "retry": "Προσπαθήστε ξανά", "save": "Αποθήκευση", "search": "Έρευνα", - "searching": "Αναζήτηση σε", + "searching": "Αναζήτηση", "searchresults": "Αναζήτηση στα αποτελέσματα", "sec": "δευτερόλεπτο", "secs": "δευτερόλεπτα", "seemoredetail": "Κάντε κλικ εδώ για να δείτε περισσότερες λεπτομέρειες", "send": "Αποστολή", - "sending": "Αποστέλλεται", + "sending": "Αποστολή", "show": "Εμφάνιση", "showmore": "Περισσότερα...", "site": "ιστοχώρος", @@ -179,7 +179,7 @@ "sortby": "Ταξινόμηση κατά", "start": "Αρχή", "submit": "Υποβολή", - "success": "Επιτυχία", + "success": "Επιτυχία!", "tablet": "Tablet", "teachers": "Καθηγητές", "thereisdatatosync": "Υπάρχουν εκτός σύνδεσης {{$a}} για συγχρονισμό.", diff --git a/www/core/lang/es.json b/www/core/lang/es.json index d5b97d822ac..eac73c2ea02 100644 --- a/www/core/lang/es.json +++ b/www/core/lang/es.json @@ -40,7 +40,7 @@ "days": "Días", "decsep": ",", "delete": "Borrar", - "deleting": "Eliminando", + "deleting": "Borrando", "description": "Descripción", "dfdaymonthyear": "MM-DD-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagen", "imageviewer": "Visor de imágenes", - "info": "Info", + "info": "Información", "ios": "iOs", "labelsep": ":", "lastmodified": "Última modificación", @@ -134,7 +134,7 @@ "nocomments": "No hay comentarios", "nograde": "Sin calificación", "none": "Ninguno", - "nopasswordchangeforced": "No puede seguir sin cambiar su contraseña, sin embargo no existe ninguna página disponible para cambiarla. Por favor contacte a su administrador de Moodle.", + "nopasswordchangeforced": "No puede continuar sin cambiar su contraseña.", "nopermissions": "Lo sentimos, pero por el momento no tiene permiso para hacer eso ({{$a}})", "noresults": "Sin resultados", "notapplicable": "n/a", @@ -142,8 +142,8 @@ "notsent": "No enviado", "now": "ahora", "numwords": "{{$a}} palabras", - "offline": "Fuera de línea", - "online": "En línea", + "offline": "No se requieren entregas online", + "online": "Conectado", "openfullimage": "Haga clic aquí para ver la imagen a tamaño completo", "openinbrowser": "Abrir en el navegador", "othergroups": "Otros grupos", @@ -160,7 +160,7 @@ "retry": "Reintentar", "save": "Guardar", "search": "Búsqueda", - "searching": "Buscar en", + "searching": "Buscando", "searchresults": "Resultado", "sec": "segundos", "secs": "segundos", diff --git a/www/core/lang/eu.json b/www/core/lang/eu.json index 747bcfe3930..399292e7c4b 100644 --- a/www/core/lang/eu.json +++ b/www/core/lang/eu.json @@ -134,7 +134,7 @@ "nocomments": "Ez dago iruzkinik", "nograde": "Kalifikaziorik ez.", "none": "Bat ere ez", - "nopasswordchangeforced": "Ezin duzu aurrera egin pasahitza aldatu gabe, baina ez dago aldatzeko inongo orririk. Mesedez, jarri harremanetan zure Moodle Kudeatzailearekin.", + "nopasswordchangeforced": "Ezin duzu jarraitu zure pasahitza aldatu gabe.", "nopermissions": "Sentitzen dugu, baina oraingoz ez duzu hori egiteko baimenik ({{$a}})", "noresults": "Emaitzarik ez", "notapplicable": "ezin da aplikatu", @@ -142,8 +142,8 @@ "notsent": "Bidali gabea", "now": "orain", "numwords": "{{$a}} hitz", - "offline": "Ez du online bidalketarik eskatzen", - "online": "Online", + "offline": "Lineaz kanpo", + "online": "On-line", "openfullimage": "Klik egin hemen irudia jatorrizko tamainan ikusteko", "openinbrowser": "Ireki nabigatzailean", "othergroups": "Beste taldeak", @@ -160,7 +160,7 @@ "retry": "Berriz saiatu", "save": "Gorde", "search": "Bilatu...", - "searching": "Bilatu hemen", + "searching": "Bilatzen", "searchresults": "Bilaketaren emaitzak", "sec": "seg", "secs": "segundu", diff --git a/www/core/lang/fr.json b/www/core/lang/fr.json index 35acf20efac..b3cee4e200c 100644 --- a/www/core/lang/fr.json +++ b/www/core/lang/fr.json @@ -41,7 +41,7 @@ "decsep": ",", "defaultvalue": "Défaut ({{$a}})", "delete": "Supprimer", - "deleting": "En cours de suppression", + "deleting": "Suppression", "description": "Description", "dfdaymonthyear": "DD-MM-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -87,7 +87,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Image", "imageviewer": "Lecteur d'images", - "info": "Information", + "info": "Info", "ios": "iOS", "labelsep": " ", "lastmodified": "Dernière modification", @@ -135,7 +135,7 @@ "nocomments": "Aucun commentaire", "nograde": "Aucune note.", "none": "Aucun", - "nopasswordchangeforced": "Vous ne pouvez pas continuer sans modifier votre mot de passe. Cependant, il n'y a aucun moyen disponible de le modifier. Veuillez contacter l'administrateur de votre Moodle.", + "nopasswordchangeforced": "Vous ne pouvez pas continuer ans changer votre mot de passe.", "nopermissions": "Désolé, vous n'avez actuellement pas les droits d'accès requis pour effectuer ceci ({{$a}})", "noresults": "Pas de résultat", "notapplicable": "n/a", @@ -143,7 +143,7 @@ "notsent": "Pas envoyé", "now": "maintenant", "numwords": "{{$a}} mots", - "offline": "Aucun travail à remettre requis", + "offline": "Hors ligne", "online": "En ligne", "openfullimage": "Cliquer ici pour afficher l'image en pleine grandeur", "openinbrowser": "Ouvrir dans le navigateur", @@ -161,7 +161,7 @@ "retry": "Essayer à nouveau", "save": "Enregistrer", "search": "Recherche", - "searching": "Rechercher dans", + "searching": "Recherche", "searchresults": "Résultats de la recherche", "sec": "s", "secs": "s", @@ -182,7 +182,7 @@ "sortby": "Trier par", "start": "Début", "submit": "Envoyer", - "success": "Succès", + "success": "Succès !", "tablet": "Tablette", "teachers": "Enseignants", "thereisdatatosync": "Il y a des {{$a}} locales à synchroniser", diff --git a/www/core/lang/he.json b/www/core/lang/he.json index bbc7b0ed56f..7672a3ed83c 100644 --- a/www/core/lang/he.json +++ b/www/core/lang/he.json @@ -14,12 +14,12 @@ "close": "סגירת חלון", "comments": "הערות", "commentscount": "({{$a}}) הערות", - "completion-alt-auto-fail": "הושלם: {{$a}} (לא השיג ציון עובר)", + "completion-alt-auto-fail": "הושלם: {{$a}} (לא הושג ציון עובר)", "completion-alt-auto-n": "לא הושלם: {{$a}}", - "completion-alt-auto-pass": "הושלם: {{$a}} (השיג ציון עובר)", + "completion-alt-auto-pass": "הושלם: {{$a}} (הושג ציון עובר)", "completion-alt-auto-y": "הושלם: {{$a}}", - "completion-alt-manual-n": "{{$a}} לא הושלם. הקליקו לסימון כ\"הושלם\"", - "completion-alt-manual-y": "{{$a}} הושלם. הקליקו לסימון כ\"לא הושלם\"", + "completion-alt-manual-n": "לא הושלם: {{$a}}. יש לבחור כדי לסמן כ:הושלם.", + "completion-alt-manual-y": "הושלם: {{$a}}. יש לבחור כדי לסמן כ:לא-הושלם.", "confirmdeletefile": "האם הינך בטוח כי ברצונך למחוק את קובץ זה?", "content": "תוכן", "continue": "המשך", @@ -105,8 +105,8 @@ "notice": "לתשומת לב", "now": "עכשיו", "numwords": "{{$a}} מילים", - "offline": "לא נדרשות הגשות מקוונות", - "online": "מקוון", + "offline": "לא מחובר", + "online": "מחובר", "openfullimage": "יש להקליק כאן להצגת התמונה בגודל מלא", "openinbrowser": "תצוגה בדפדפן", "pagea": "עמוד {{$a}}", @@ -125,7 +125,7 @@ "secs": "שניות", "seemoredetail": "הקליקו כאן כדי לראות פרטים נוספים", "send": "לשלוח", - "sending": "שולחים", + "sending": "שולח", "serverconnection": "שגיאה בהתחברות לשרת", "show": "תצוגה", "site": "מערכת", @@ -136,7 +136,7 @@ "sortby": "מיון לפי", "start": "התחלה", "submit": "הגש", - "success": "הצלחה", + "success": "הצלחה!", "tablet": "טאבלט", "teachers": "מורים", "time": "זמן", diff --git a/www/core/lang/it.json b/www/core/lang/it.json index df7d689b127..b09cf8ff07a 100644 --- a/www/core/lang/it.json +++ b/www/core/lang/it.json @@ -16,12 +16,12 @@ "comments": "Commenti", "commentscount": "Commenti: ({{$a}})", "commentsnotworking": "Non è possibile scaricare i commenti", - "completion-alt-auto-fail": "Completato: {{$a}} (senza raggiungere la sufficienza)", - "completion-alt-auto-n": "Non completata: {{$a}}", - "completion-alt-auto-pass": "Completato: {{$a}} (raggiunta la sufficienza)", - "completion-alt-auto-y": "Completata: {{$a}}", - "completion-alt-manual-n": "Non completata: {{$a}}.\nSelezionarla per spuntarla come completata.", - "completion-alt-manual-y": "Completata: {{$a}}. Selezionarla per spuntarla come non completata.", + "completion-alt-auto-fail": "Completato: {{$a}} (senza la sufficienza)", + "completion-alt-auto-n": "Non completato: {{$a}}", + "completion-alt-auto-pass": "Completato: {{$a}} (con la sufficienza)", + "completion-alt-auto-y": "Completato: {{$a}}", + "completion-alt-manual-n": "Non completato: {{$a}}. Selezionare per indicare come completato.", + "completion-alt-manual-y": "Completato: {{$a}}. Selezionare per indicare come non completato.", "confirmcanceledit": "Sei sicuro di abbandonare questa pagina? Tutte le modifiche saranno perdute.", "confirmdeletefile": "Sei sicuro di voler eliminare questo file?", "confirmopeninbrowser": "Desideri aprirlo nel browser?", @@ -35,7 +35,7 @@ "decsep": ",", "defaultvalue": "Default ({{$a}})", "delete": "Elimina", - "deleting": "Eliminazione", + "deleting": "Eliminazione in corso", "description": "Descrizione", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", @@ -70,7 +70,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Immagine", "imageviewer": "Visualizzatore di immagini", - "info": "Informazione", + "info": "Informazioni", "ios": "iOS", "labelsep": ": ", "lastmodified": "Ultima modifica", @@ -124,7 +124,7 @@ "notice": "Nota", "now": "adesso", "numwords": "{{$a}} parole", - "offline": "Questo compito non richiede consegne online", + "offline": "Offline", "online": "Online", "openfullimage": "Click per visualizare l'immagine a dimensioni reali", "openinbrowser": "Apri nel browser", @@ -141,13 +141,13 @@ "retry": "Riprova", "save": "Salva", "search": "Ricerca", - "searching": "Cerca in", + "searching": "Ricerca in corso", "searchresults": "Risultati delle ricerche", "sec": "secondo", "secs": "secondi", "seemoredetail": "Clicca qui per ulteriori dettagli", "send": "Invia", - "sending": "Invio in corso", + "sending": "Invio in c orso", "serverconnection": "Si è verificato un errore durante la connessione al server", "show": "Visualizza", "site": "Sito", @@ -159,7 +159,7 @@ "sortby": "Ordina per", "start": "Apertura", "submit": "Invia", - "success": "Operazione eseguita con successo", + "success": "OK!", "tablet": "Tablet", "teachers": "Docenti", "time": "Tempo", diff --git a/www/core/lang/ja.json b/www/core/lang/ja.json index 8bc1a53581f..3a3aed50aec 100644 --- a/www/core/lang/ja.json +++ b/www/core/lang/ja.json @@ -17,12 +17,12 @@ "comments": "コメント", "commentscount": "コメント ({{$a}})", "commentsnotworking": "コメントが取得できませんでした", - "completion-alt-auto-fail": "完了: {{$a}} (合格点未到達)", - "completion-alt-auto-n": "未完了: {{$a}}", - "completion-alt-auto-pass": "完了: {{$a}} (合格点到達)", + "completion-alt-auto-fail": "完了: {{$a}} (合格点に達していない)", + "completion-alt-auto-n": "未了: {{$a}}", + "completion-alt-auto-pass": "完了: {{$a}} (合格点達成)", "completion-alt-auto-y": "完了: {{$a}}", - "completion-alt-manual-n": "未完了: {{$a}} 完了マークするには選択してください。", - "completion-alt-manual-y": "完了: {{$a}} 未完了マークするには選択してください。", + "completion-alt-manual-n": "未了: {{$a}}。選択して完了に変更してください。", + "completion-alt-manual-y": "完了: {{$a}}。選択して未了に変更してください。", "confirmcanceledit": "本当にこのページを離れますか? 全ての変更が失われます。", "confirmdeletefile": "本当にこのファイルを削除してもよろしいですか?", "confirmloss": "本当ですか? すべての変更が失われます。", @@ -41,7 +41,7 @@ "decsep": ".", "defaultvalue": "デフォルト ({{$a}})", "delete": "削除", - "deleting": "削除", + "deleting": "消去中", "description": "説明", "dfdaymonthyear": "YYYY/MM/DD", "dfdayweekmonth": "MMM月D日(ddd)", @@ -87,7 +87,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "画像", "imageviewer": "画像ビューア", - "info": "インフォメーション", + "info": "情報", "ios": "iOS", "labelsep": ":", "lastmodified": "最終更新日時", @@ -121,7 +121,7 @@ "nocomments": "コメントはありません。", "nograde": "評点なし", "none": "なし", - "nopasswordchangeforced": "あなたはパスワードを変更せずに次へ進むことはできません。しかし、パスワードを変更するため利用できるページがありません。あなたのMoodle管理者にご連絡ください。", + "nopasswordchangeforced": "パスワードを変更するまで続きを実行できません。", "nopermissions": "申し訳ございません、現在、あなたは 「 {{$a}} 」を実行するためのパーミッションがありません。", "noresults": "該当データがありません。", "notapplicable": "なし", @@ -129,7 +129,7 @@ "notsent": "未送信", "now": "現在", "numwords": "{{$a}} 語", - "offline": "オンライン提出不要", + "offline": "オフライン", "online": "オンライン", "openfullimage": "クリックしてフルサイズの画像を表示", "openinbrowser": "ブラウザで開く", @@ -147,7 +147,7 @@ "retry": "再実行", "save": "保存", "search": "検索 ...", - "searching": "検索:", + "searching": "検索中", "searchresults": "検索結果", "sec": "秒", "secs": "秒", @@ -168,7 +168,7 @@ "sortby": "並べ替え", "start": "開始", "submit": "送信", - "success": "成功", + "success": "成功!", "tablet": "タブレット", "teachers": "教師", "thereisdatatosync": "同期が必要なオフライン {{$a}} があります。", @@ -181,7 +181,7 @@ "unexpectederror": "不明なエラー。アプリを閉じて再起動してみてください。", "unicodenotsupported": "本サイトでは一部の絵文字がサポートされていません。それらは送信されたメッセージから削除されます。", "unicodenotsupportedcleanerror": "Unicode文字をクリアする際に空のテキストがありました。", - "unknown": "不明", + "unknown": "不明な", "unlimited": "無制限", "unzipping": "未展開の", "upgraderunning": "サイトはアップグレード中です。後ほどお試しください。", diff --git a/www/core/lang/nl.json b/www/core/lang/nl.json index 4193e16acd3..bb80cd061e0 100644 --- a/www/core/lang/nl.json +++ b/www/core/lang/nl.json @@ -17,12 +17,12 @@ "comments": "Jouw commentaar", "commentscount": "Opmerkingen ({{$a}})", "commentsnotworking": "Opmerkingen konden niet opgehaald worden", - "completion-alt-auto-fail": "Voltooid: {{$a}} (bereikte het cijfer voor geslaagd niet)", + "completion-alt-auto-fail": "Voltooid: {{$a}} (slaagcijfer niet behaald)", "completion-alt-auto-n": "Niet voltooid: {{$a}}", - "completion-alt-auto-pass": "Voltooid: {{$a}} (slaagcijfer bereikt)", + "completion-alt-auto-pass": "Voltooid: {{$a}} (slaagcijfer behaald)", "completion-alt-auto-y": "Voltooid: {{$a}}", - "completion-alt-manual-n": "Niet voltooid: {{$a}}. Selecteer om te markeren als voltooid", - "completion-alt-manual-y": "voltooid: {{$a}}. Selecteer om als niet voltooid te markeren.", + "completion-alt-manual-n": "Niet voltooid: {{$a}}. Selecteer om als voltooid te markeren.", + "completion-alt-manual-y": "Voltooid: {{$a}}. Selecteer om als niet voltooid te markeren.", "confirmcanceledit": "Weet je zeker dat je deze pagina wil verlaten? Alle wijzigingen zullen verloren gaan.", "confirmdeletefile": "Wil je dit bestand echt verwijderen?", "confirmloss": "Ben je zeker? Alle wijzigingen zullen verloren gaan.", @@ -41,7 +41,7 @@ "decsep": ",", "defaultvalue": "Standaard ({{$a}})", "delete": "Verwijder", - "deleting": "Verwijderen", + "deleting": "Verwijderen.", "description": "Beschrijving", "dfdaymonthyear": "MM-DD-JJJJ", "dfdayweekmonth": "ddd, D, MMM", @@ -87,7 +87,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Afbeelding", "imageviewer": "Afbeeldingsviewer", - "info": "Informatie", + "info": "Info", "ios": "iOS", "labelsep": ": ", "lastmodified": "Laatst gewijzigd", @@ -135,7 +135,7 @@ "nocomments": "Er zijn geen opmerkingen", "nograde": "Geen cijfer.", "none": "Geen", - "nopasswordchangeforced": "Je kunt niet verdergaan zonder je wachtwoord te wijzigen, hoewel er geen pagina voorzien is om dat te doen. Neem contact op met je Moodlebeheerder", + "nopasswordchangeforced": "Je kunt niet verdergaan zonder je wachtwoord te veranderen.", "nopermissions": "Sorry, maar je hebt nu niet het recht om dat te doen ({{$a}}).", "noresults": "Geen resultaat", "notapplicable": "n/a", @@ -143,7 +143,7 @@ "notsent": "Niet verstuurd", "now": "Nu", "numwords": "{{$a}} woorden", - "offline": "Je hoeft niets online in te sturen", + "offline": "Offline", "online": "Online", "openfullimage": "Klik hier om de afbeelding op volledige grootte weer te geven", "openinbrowser": "Open in browser", @@ -161,13 +161,13 @@ "retry": "Probeer opnieuw", "save": "Bewaar", "search": "Zoeken...", - "searching": "Zoek in", + "searching": "Zoeken", "searchresults": "Zoekresultaten", "sec": "seconde", "secs": "seconden", "seemoredetail": "Klik hier om meer details te zien", "send": "stuur", - "sending": "Versturen", + "sending": "Sturen", "serverconnection": "Fout bij het verbinden met de server", "show": "Laat zien", "showmore": "Toon meer...", @@ -182,7 +182,7 @@ "sortby": "Sorteer volgens", "start": "Start", "submit": "Verstuur", - "success": "Succes", + "success": "Gelukt!", "tablet": "Tablet", "teachers": "leraren", "thereisdatatosync": "Er zijn offline {{$a}} die moeten worden gesynchroniseerd.", diff --git a/www/core/lang/sr-cr.json b/www/core/lang/sr-cr.json index 7f2925b317f..ac8fa8b0c9b 100644 --- a/www/core/lang/sr-cr.json +++ b/www/core/lang/sr-cr.json @@ -17,12 +17,12 @@ "comments": "Коментари", "commentscount": "Коментари ({{$a}})", "commentsnotworking": "Коментари не могу да буду преузети", - "completion-alt-auto-fail": "Завршено: {{$a}} (није постигао/ла прелазну оцену)", + "completion-alt-auto-fail": "Завршено: {{$a}} (није постигнута прелазна оцена)", "completion-alt-auto-n": "Није завршено: {{$a}}", - "completion-alt-auto-pass": "Завршено: {{$a}} (постигао/ла прелазну оцену)", + "completion-alt-auto-pass": "Завршено: {{$a}} (постигнута прелазна оцена)", "completion-alt-auto-y": "Завршено: {{$a}}", - "completion-alt-manual-n": "Није завршено: {{$a}}. Изабери да би означио као завршено", - "completion-alt-manual-y": "Завршено: {{$a}}. Изабери да би означио као незавршено.", + "completion-alt-manual-n": "Није завршено: {{$a}}. Изаберите да бисте означили као завршено.", + "completion-alt-manual-y": "Завршено: {{$a}}. Изаберите да бисте означили као незавршено.", "confirmcanceledit": "Да ли сте сигурни да желите да напустите ову страницу? Све промене ће бити изгубљене.", "confirmdeletefile": "Да ли сте сигурни да желите да обришете ову датотетеку?", "confirmloss": "Да ли сте сигурни? Све промене ће бити изгубљене.", @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Слика", "imageviewer": "Приказивач слике", - "info": "Информација", + "info": "Инфо", "ios": "iOS", "labelsep": ":", "lastmodified": "Последња измена", @@ -120,7 +120,7 @@ "nocomments": "Нема коментара", "nograde": "Нема оцене", "none": "Ниједан", - "nopasswordchangeforced": "Нисте у могућности да наставите даље без промене корисничког имена, међутим не постоји расположива страница за промену. Молимо контактирајте Moodle администратора.", + "nopasswordchangeforced": "Не можете наставити без промене своје лозинке.", "nopermissions": "Жао нам је, али тренутно немате дозволу да то радите ({{$a}})", "noresults": "Нема резултата", "notapplicable": "n/a", @@ -128,8 +128,8 @@ "notsent": "Није послато", "now": "сада", "numwords": "{{$a}} реч(и)", - "offline": "Не тражи се онлајн предаја рада", - "online": "Online", + "offline": "Офлајн", + "online": "Онлајн", "openfullimage": "Кликните овде да бисте приказали слику у пуној величини", "openinbrowser": "Отвори у веб читачу", "othergroups": "Друге групе", @@ -146,13 +146,13 @@ "retry": "Покушај поново", "save": "Сачувај", "search": "Претрага", - "searching": "Претражи у", + "searching": "Претраживање", "searchresults": "Резултати претраге", "sec": "сек", "secs": "s", "seemoredetail": "Кликните овде за више детеља", "send": "Пошаљи", - "sending": "Шаље се", + "sending": "Слање", "serverconnection": "Грешка у повезивању са сервером", "show": "Прикажи", "showmore": "Прикажи још...", @@ -167,7 +167,7 @@ "sortby": "Сортирај по", "start": "Почетак", "submit": "Проследи", - "success": "Успешно", + "success": "Успешно!", "tablet": "Таблет", "teachers": "Предавачи", "thereisdatatosync": "Број офлајн податак које треба синхронизовати: {{$a}}", diff --git a/www/core/lang/sr-lt.json b/www/core/lang/sr-lt.json index 311b111ce0c..d622c1ce0a9 100644 --- a/www/core/lang/sr-lt.json +++ b/www/core/lang/sr-lt.json @@ -17,12 +17,12 @@ "comments": "Komentari", "commentscount": "Komentari ({{$a}})", "commentsnotworking": "Komentari ne mogu da budu preuzeti", - "completion-alt-auto-fail": "Završeno: {{$a}} (nije postigao/la prelaznu ocenu)", + "completion-alt-auto-fail": "Završeno: {{$a}} (nije postignuta prelazna ocena)", "completion-alt-auto-n": "Nije završeno: {{$a}}", - "completion-alt-auto-pass": "Završeno: {{$a}} (postigao/la prelaznu ocenu)", + "completion-alt-auto-pass": "Završeno: {{$a}} (postignuta prelazna ocena)", "completion-alt-auto-y": "Završeno: {{$a}}", - "completion-alt-manual-n": "Nije završeno: {{$a}}. Izaberi da bi označio kao završeno", - "completion-alt-manual-y": "Završeno: {{$a}}. Izaberi da bi označio kao nezavršeno.", + "completion-alt-manual-n": "Nije završeno: {{$a}}. Izaberite da biste označili kao završeno.", + "completion-alt-manual-y": "Završeno: {{$a}}. Izaberite da biste označili kao nezavršeno.", "confirmcanceledit": "Da li ste sigurni da želite da napustite ovu stranicu? Sve promene će biti izgubljene.", "confirmdeletefile": "Da li ste sigurni da želite da obrišete ovu datoteteku?", "confirmloss": "Da li ste sigurni? Sve promene će biti izgubljene.", @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Slika", "imageviewer": "Prikazivač slike", - "info": "Informacija", + "info": "Info", "ios": "iOS", "labelsep": ":", "lastmodified": "Poslednja izmena", @@ -120,7 +120,7 @@ "nocomments": "Nema komentara", "nograde": "Nema ocene", "none": "Nijedan", - "nopasswordchangeforced": "Niste u mogućnosti da nastavite dalje bez promene korisničkog imena, međutim ne postoji raspoloživa stranica za promenu. Molimo kontaktirajte Moodle administratora.", + "nopasswordchangeforced": "Ne možete nastaviti bez promene svoje lozinke.", "nopermissions": "Žao nam je, ali trenutno nemate dozvolu da to radite ({{$a}})", "noresults": "Nema rezultata", "notapplicable": "n/a", @@ -128,8 +128,8 @@ "notsent": "Nije poslato", "now": "sada", "numwords": "{{$a}} reč(i)", - "offline": "Ne traži se onlajn predaja rada", - "online": "Online", + "offline": "Oflajn", + "online": "Onlajn", "openfullimage": "Kliknite ovde da biste prikazali sliku u punoj veličini", "openinbrowser": "Otvori u veb čitaču", "othergroups": "Druge grupe", @@ -146,13 +146,13 @@ "retry": "Pokušaj ponovo", "save": "Sačuvaj", "search": "Pretraga", - "searching": "Pretraži u", + "searching": "Pretraživanje", "searchresults": "Rezultati pretrage", "sec": "sek", "secs": "s", "seemoredetail": "Kliknite ovde za više detelja", "send": "Pošalji", - "sending": "Šalje se", + "sending": "Slanje", "serverconnection": "Greška u povezivanju sa serverom", "show": "Prikaži", "showmore": "Prikaži još...", @@ -167,7 +167,7 @@ "sortby": "Sortiraj po", "start": "Početak", "submit": "Prosledi", - "success": "Uspešno", + "success": "Uspešno!", "tablet": "Tablet", "teachers": "Predavači", "thereisdatatosync": "Broj oflajn podatak koje treba sinhronizovati: {{$a}}", diff --git a/www/core/lang/sv.json b/www/core/lang/sv.json index 47effc624e5..abbe11de849 100644 --- a/www/core/lang/sv.json +++ b/www/core/lang/sv.json @@ -15,12 +15,12 @@ "close": "Stäng fönster", "comments": "Kommentarer", "commentscount": "Kommentarer ({{$a}})", - "completion-alt-auto-fail": "Fullföljd (uppnådde inte godkänt resultat)", + "completion-alt-auto-fail": "Avslutad: {{$a}} (uppnådde inte gräns för godkänd)", "completion-alt-auto-n": "Inte avslutad: {{$a}}", - "completion-alt-auto-pass": "Fullföljd (godkänt resultat)", - "completion-alt-auto-y": "Fullföljd", - "completion-alt-manual-n": "Ej fullföljd; välj för att markera som fullföljd", - "completion-alt-manual-y": "Fullföljd; välj för att markera som ej fullföljd", + "completion-alt-auto-pass": "Avslutad: {{$a}} (uppnådde gräns för godkänd)", + "completion-alt-auto-y": "Avslutad: {{$a}}", + "completion-alt-manual-n": "Inte avslutad: {{$a}}. Välj att markera som avslutad", + "completion-alt-manual-y": "Avslutad: {{$a}}. Välj att markera som INTE avslutad", "confirmdeletefile": "Är Du säker på att Du vill ta bort den här filen?", "confirmopeninbrowser": "Vill du öppna den i webbläsaren ?", "content": "Innehåll", @@ -32,7 +32,7 @@ "days": "Dagar", "decsep": ",", "delete": "Ta bort", - "deleting": "Tar bort", + "deleting": "ta bort", "description": "Beskrivning", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd", @@ -63,7 +63,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Bild", "imageviewer": "Bildvisare", - "info": "Information", + "info": "Info", "ios": "IOS", "labelsep": ":", "lastmodified": "Senast modifierad", @@ -117,8 +117,8 @@ "notice": "Meddelande", "now": "nu", "numwords": "{{$a}} ord", - "offline": "Ingen inlämning online krävs", - "online": "Uppkopplad", + "offline": "Offline", + "online": "Online", "openfullimage": "Klick här för att visa bilden i full storlek", "openinbrowser": "Öppna i webbläsare", "othergroups": "Andra grupper", @@ -133,7 +133,7 @@ "requireduserdatamissing": "Den här användaren saknar vissa nödvändiga profildata. Vänligen fyll i uppgifterna i din Moodle och försök igen.
    {{$a}}", "save": "Spara", "search": "Sök...", - "searching": "Sök i ", + "searching": "Söker", "searchresults": "Sökresultat", "sec": "Sekund", "secs": "Sekunder", @@ -151,7 +151,7 @@ "sortby": "Sortera enligt", "start": "Starta", "submit": "Skicka", - "success": "Framgång", + "success": "Succé!", "tablet": "Tablet", "teachers": "Distanslärare/
    handledare/
    coacher", "time": "Tid", diff --git a/www/core/lang/uk.json b/www/core/lang/uk.json index a316e7e3686..8fa63c712a4 100644 --- a/www/core/lang/uk.json +++ b/www/core/lang/uk.json @@ -17,12 +17,12 @@ "comments": "Коментарі", "commentscount": "Коментарі ({{$a}})", "commentsnotworking": "Коментар не може бути відновлений", - "completion-alt-auto-fail": "Виконано: {{$a}} (не вдалося досягти прохідного балу)", - "completion-alt-auto-n": "Не виконано: {{$a}}", - "completion-alt-auto-pass": "Виконано: {{$a}} (перевищено прохідний бал)", - "completion-alt-auto-y": "Виконано: {{$a}}", - "completion-alt-manual-n": "Не виконано: {{$a}}. Виберіть для позначення виконання", - "completion-alt-manual-y": "Виконано: {{$a}}. Виберіть для позначення не виконання", + "completion-alt-auto-fail": "Виконано: {{$a}} (не досягли до рівня зарахування)", + "completion-alt-auto-n": "Не завершено: {{$a}}", + "completion-alt-auto-pass": "Виконано: {{$a}} (досягли до рівня зараховано)", + "completion-alt-auto-y": "Завершено: {{$a}}", + "completion-alt-manual-n": "Не завершено {{$a}}. Виберіть для відмічення як завершене.", + "completion-alt-manual-y": "Завершено {{$a}}. Виберіть для відмічення як незавершене.", "confirmcanceledit": "Ви впевнені що хочете залишити цю сторінку? Всі зміни будуть втрачені.", "confirmdeletefile": "Ви впевнені, що хочете видалити цей файл?", "confirmloss": "Ви впевнені? Всі зміни будуть втрачені.", @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Зображення", "imageviewer": "Переглядач зображень", - "info": "Інформація", + "info": "Інфо", "ios": "iOS", "labelsep": ":", "lastmodified": "Востаннє змінено", @@ -120,7 +120,7 @@ "nocomments": "Коментарів немає", "nograde": "Немає оцінки.", "none": "Немає", - "nopasswordchangeforced": "Ви не можете перейти не змінивши ваш пароль, але не вказано ніякої сторінки для цього процесу. Будь ласка, зверніться до вашого Адміністратора.", + "nopasswordchangeforced": "Ви не можете продовжити без зміни пароля.", "nopermissions": "Вибачте, але ваші поточні права не дозволяють вам цього робити ({{$a}})", "noresults": "Результат відсутній", "notapplicable": "n/a", @@ -128,8 +128,8 @@ "notsent": "Не відправлено", "now": "зараз", "numwords": "{{$a}} слів", - "offline": "Не потрібно здавати в онлайні", - "online": "В мережі", + "offline": "Offline", + "online": "Online", "openfullimage": "Натисніть тут, щоб побачити зображення в повному розмірі", "openinbrowser": "Відкрити у браузері", "othergroups": "Інші групи", @@ -146,13 +146,13 @@ "retry": "Повторити", "save": "Зберегти", "search": "Пошук", - "searching": "Шукати в", + "searching": "Пошук", "searchresults": "Результати пошуку", "sec": "сек", "secs": "сек", "seemoredetail": "Деталі...", "send": "надіслати", - "sending": "Відсилання", + "sending": "Відправка", "serverconnection": "Помилка з’єднання з сервером", "show": "Показати", "showmore": "Показати більше", @@ -167,7 +167,7 @@ "sortby": "Сортувати за", "start": "Початок", "submit": "Надіслати", - "success": "Успішно", + "success": "Успіх!", "tablet": "Планшет", "teachers": "Викладачі", "thereisdatatosync": "Офлайн {{$a}} повинні бути синхронізовані.", @@ -180,7 +180,7 @@ "unexpectederror": "Неочікувана помилка. Будь ласка, закрийте і знову відкрийте додаток, щоб спробувати ще раз", "unicodenotsupported": "Деякі Emoji не підтримуються на цьому сайті. Такі символи будуть видалені, коли повідомлення буде відправлено.", "unicodenotsupportedcleanerror": "Порожній текст був знайдений при чищенні Unicode символів.", - "unknown": "Невідоме", + "unknown": "Невідомо", "unlimited": "Не обмежено", "unzipping": "Розпакування", "upgraderunning": "Сайт оновлюється, повторіть спробу пізніше.", From 74a9f3ebfe761657b7574abccaf48874fcc26b67 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 08:20:58 +0200 Subject: [PATCH 093/118] MOBILE-2178 database: Allow managing own entries --- www/addons/mod/data/lang/en.json | 1 - www/addons/mod/data/services/helper.js | 2 +- www/addons/mod/data/templates/action.html | 2 +- www/core/lang/en.json | 1 + 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index b1931a4b23f..8ad92b9ec45 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -33,7 +33,6 @@ "recorddeleted": "Entry deleted", "recorddisapproved": "Entry unapproved", "resetsettings": "Reset filters", - "restore": "Restore", "search": "Search", "selectedrequired": "All selected required", "timeadded": "Time added", diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 53666cb89e1..84b84d359c2 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -101,7 +101,7 @@ angular.module('mm.addons.mod_data') replacements.timeadded = true; replacements.timemodified = true; - replacements.edit = accessInfo.canmanageentries || (accessInfo.inreadonlyperiod && record.canmanageentry); + replacements.edit = record.canmanageentry; // This already checks capabilities and readonly period. replacements.delete = replacements.edit; replacements.approve = database.approval && accessInfo.canapprove && !record.approved; replacements.disapprove = database.approval && accessInfo.canapprove && record.approved; diff --git a/www/addons/mod/data/templates/action.html b/www/addons/mod/data/templates/action.html index 91581409647..1675b58fe80 100644 --- a/www/addons/mod/data/templates/action.html +++ b/www/addons/mod/data/templates/action.html @@ -1,7 +1,7 @@ - + diff --git a/www/core/lang/en.json b/www/core/lang/en.json index d48edfa86b1..783417f3a48 100644 --- a/www/core/lang/en.json +++ b/www/core/lang/en.json @@ -163,6 +163,7 @@ "refresh": "Refresh", "required": "Required", "requireduserdatamissing": "This user lacks some required profile data. Please, fill this data in your Moodle and try again.
    {{$a}}", + "restore": "Restore", "retry": "Retry", "save": "Save", "search": " Search...", From 876bcd7b893657dce983e3ddf118fe1a576da3c7 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 08:44:34 +0200 Subject: [PATCH 094/118] MOBILE-2178 database: Fix cache presets in search entries --- www/addons/mod/data/services/data.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 58096d51985..a4bdbc3c841 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -798,8 +798,8 @@ angular.module('mm.addons.mod_data') perpage: perPage || mmaModDataPerPage }, preSets = { - getCache: 0, - saveCache: 1, + getFromCache: 0, + saveToCache: 1, emergencyCache: 1 }; From 736a8be7ff596915bde9b13ccf27ef2dcbef94d7 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 09:02:32 +0200 Subject: [PATCH 095/118] MOBILE-2178 lesson: Change lesson string --- www/addons/mod/lesson/lang/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/addons/mod/lesson/lang/en.json b/www/addons/mod/lesson/lang/en.json index 92a9bb049b6..f9425621099 100644 --- a/www/addons/mod/lesson/lang/en.json +++ b/www/addons/mod/lesson/lang/en.json @@ -22,7 +22,7 @@ "emptypassword": "Password cannot be empty", "enterpassword": "Please enter the password:", "eolstudentoutoftimenoanswers": "You did not answer any questions. You have received a 0 for this lesson.", - "errorprefetchrandombranch": "This lesson contains a jump to a random content page, it cannot be attempted in the app until it has been started in web.", + "errorprefetchrandombranch": "This lesson contains a jump to a random content page. It can't be attempted in the app until it has been started in a web browser.", "errorreviewretakenotlast": "This attempt can no longer be reviewed because another attempt has been finished.", "finish": "Finish", "finishretakeoffline": "This attempt was finished offline.", From 253e957afc5ddde54a4667b1ade39251378a82c8 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 10:31:54 +0200 Subject: [PATCH 096/118] MOBILE-2178 database: Remove 'fields' from offline storage indexes Storing an array of objects in an index makes the app crash in iOS --- www/addons/mod/data/services/data_offline.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/www/addons/mod/data/services/data_offline.js b/www/addons/mod/data/services/data_offline.js index 7a16d8d1755..4cab769cdf0 100644 --- a/www/addons/mod/data/services/data_offline.js +++ b/www/addons/mod/data/services/data_offline.js @@ -37,9 +37,6 @@ angular.module('mm.addons.mod_data') { name: 'entryid' }, - { - name: 'fields' - }, { name: 'timemodified' }, From 3fab7f5e4a5400888f5894c8f985f89cd5ebf575 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 10:32:22 +0200 Subject: [PATCH 097/118] MOBILE-2178 database: Prefetch getFields WS call --- www/addons/mod/data/services/data.js | 17 +++++++++++++---- .../mod/data/services/prefetch_handler.js | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index a4bdbc3c841..c2de10b9f0f 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -829,11 +829,13 @@ angular.module('mm.addons.mod_data') * @module mm.addons.mod_data * @ngdoc method * @name $mmaModData#getFields - * @param {Number} dataId Data ID. - * @param {String} [siteId] Site ID. If not defined, current site. - * @return {Promise} Promise resolved when the database is retrieved. + * @param {Number} dataId Data ID. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the fields are retrieved. */ - self.getFields = function(dataId, siteId) { + self.getFields = function(dataId, forceCache, ignoreCache, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { var params = { databaseid: dataId @@ -842,6 +844,13 @@ angular.module('mm.addons.mod_data') cacheKey: getFieldsCacheKey(dataId) }; + if (forceCache) { + preSets.omitExpires = true; + } else if (ignoreCache) { + preSets.getFromCache = 0; + preSets.emergencyCache = 0; + } + return site.read('mod_data_get_fields', params, preSets).then(function(response) { if (response && response.fields) { return response.fields; diff --git a/www/addons/mod/data/services/prefetch_handler.js b/www/addons/mod/data/services/prefetch_handler.js index 493a2723e16..e7956f1a06f 100644 --- a/www/addons/mod/data/services/prefetch_handler.js +++ b/www/addons/mod/data/services/prefetch_handler.js @@ -323,6 +323,8 @@ angular.module('mm.addons.mod_data') var database = info.database, promises = []; + promises.push($mmaModData.getFields(database.id, false, true, siteId)); + promises.push($mmFilepool.addFilesToQueueByUrl(siteId, info.files, self.component, module.id)); angular.forEach(info.groups, function(group) { From b1225c34ebcee15fc801e46e872f1c0fa78074fd Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 11:08:31 +0200 Subject: [PATCH 098/118] MOBILE-2178 database: Allow viewing offline entries --- www/addons/mod/data/controllers/edit.js | 26 +------------- www/addons/mod/data/controllers/entry.js | 2 +- www/addons/mod/data/services/helper.js | 44 +++++++++++++++++++++++- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index afb0eb308f0..90bec456681 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -87,31 +87,7 @@ angular.module('mm.addons.mod_data') $scope.fields[field.id] = field; }); - if (entryId > 0) { - return $mmaModData.getEntry(data.id, entryId); - } - - for (var x in offlineActions) { - if (offlineActions[x].action == 'add') { - offlineEntry = offlineActions[x]; - - var siteInfo = $mmSite.getInfo(), - entryData = { - id: offlineEntry.entryid, - canmanageentry: true, - approved: !data.approval || data.manageapproved, - dataid: offlineEntry.dataid, - groupid: offlineEntry.groupid, - timecreated: -offlineEntry.entryid, - timemodified: -offlineEntry.entryid, - userid: siteInfo.userid, - fullname: siteInfo.fullname, - contents: {} - }; - - return {entry: entryData}; - } - } + return $mmaModDataHelper.getEntry(data, entryId, offlineActions); }).then(function(entryData) { if (entryData) { entry = entryData.entry; diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index d63244fe152..82731060624 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -87,7 +87,7 @@ angular.module('mm.addons.mod_data') $scope.fields[field.id] = field; }); - return $mmaModData.getEntry(data.id, entryId); + return $mmaModDataHelper.getEntry(data, entryId, offlineActions); }); }).then(function(entry) { entry = entry.entry; diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 84b84d359c2..e0c89e45707 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataHelper */ .factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q, mmaModDataComponent, $mmFileUploader, $mmSite, - $mmaModDataOffline, $mmFS, $mmFileUploaderHelper) { + $mmaModDataOffline, $mmFS, $mmFileUploaderHelper, $mmSitesManager) { var self = { searchOther: { @@ -660,6 +660,48 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Get an online or offline entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getEntry + * @param {Object} data Database. + * @param {Number} entryId Entry ID. + * @param {Object} [offlineActions] Offline data with the actions done. Required for offline entries. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved with the entry. + */ + self.getEntry = function(data, entryId, offlineActions, siteId) { + if (entryId > 0) { + // It's an online entry, get it from WS. + return $mmaModData.getEntry(data.id, entryId, siteId); + } + + // It's an offline entry, search it in the offline actions. + return $mmSitesManager.getSite(siteId).then(function(site) { + for (var x in offlineActions) { + if (offlineActions[x].action == 'add') { + var offlineEntry = offlineActions[x], + siteInfo = site.getInfo(), + entryData = { + id: offlineEntry.entryid, + canmanageentry: true, + approved: !data.approval || data.manageapproved, + dataid: offlineEntry.dataid, + groupid: offlineEntry.groupid, + timecreated: -offlineEntry.entryid, + timemodified: -offlineEntry.entryid, + userid: siteInfo.userid, + fullname: siteInfo.fullname, + contents: {} + }; + + return {entry: entryData}; + } + } + }); + }; return self; }); From 99a47b87b69cedc9ff55dbaa65624e1b0670b7d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Thu, 27 Jul 2017 08:13:15 -0400 Subject: [PATCH 099/118] MOBILE-2178 database: Case insensitive match replacing action templates --- www/addons/mod/data/services/helper.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index e0c89e45707..437cc323324 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -55,7 +55,7 @@ angular.module('mm.addons.mod_data') angular.forEach(fields, function(field) { replace = "[[" + field.name + "]]"; replace = replace.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - replace = new RegExp(replace, 'g'); + replace = new RegExp(replace, 'gi'); // Replace field by a generic directive. render = ''; @@ -63,7 +63,7 @@ angular.module('mm.addons.mod_data') }); angular.forEach(actions, function(enabled, action) { - replace = new RegExp("##" + action + "##", 'g'); + replace = new RegExp("##" + action + "##", 'gi'); if (enabled) { if (action == "moreurl") { // Render more url directly because it can be part of an HTML attribute. @@ -196,7 +196,7 @@ angular.module('mm.addons.mod_data') angular.forEach(fields, function(field) { replace = "[[" + field.name + "]]"; replace = replace.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - replace = new RegExp(replace, 'g'); + replace = new RegExp(replace, 'gi'); // Replace field by a generic directive. var render = ''; @@ -205,7 +205,7 @@ angular.module('mm.addons.mod_data') // Not pluginable other search elements. angular.forEach(self.searchOther, function(field, name) { - replace = new RegExp("##" + field + "##", 'g'); + replace = new RegExp("##" + field + "##", 'gi'); // Replace field by the text input. var render = ''; @@ -315,7 +315,7 @@ angular.module('mm.addons.mod_data') angular.forEach(fields, function(field) { replace = "[[" + field.name + "]]"; replace = replace.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - replace = new RegExp(replace, 'g'); + replace = new RegExp(replace, 'gi'); // Replace field by a generic directive. var render = ''; @@ -324,7 +324,7 @@ angular.module('mm.addons.mod_data') // Replace the field id tag. replace = "[[" + field.name + "#id]]"; replace = replace.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - replace = new RegExp(replace, 'g'); + replace = new RegExp(replace, 'gi'); template = template.replace(replace, 'field_'+ field.id); }); From 754ba55dbebcb77d4aeb3c6dca44937326632157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Thu, 27 Jul 2017 08:23:17 -0400 Subject: [PATCH 100/118] MOBILE-2178 database: Fix url field type on show mode --- www/addons/mod/data/fields/url/template.html | 2 +- www/addons/mod/data/scss/styles.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/www/addons/mod/data/fields/url/template.html b/www/addons/mod/data/fields/url/template.html index e313e99289b..a49c0438d7b 100644 --- a/www/addons/mod/data/fields/url/template.html +++ b/www/addons/mod/data/fields/url/template.html @@ -1,3 +1,3 @@ -{{text}} \ No newline at end of file +{{field.name}} \ No newline at end of file diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss index bad4851771e..a45596daa7d 100644 --- a/www/addons/mod/data/scss/styles.scss +++ b/www/addons/mod/data/scss/styles.scss @@ -103,6 +103,7 @@ width: 100%; margin: -1px; border: 1px solid $gray; + overflow: hidden; } .item-checkbox { From 4dbd06a7400fd421ac2464e443d8be1b6962cf63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Thu, 27 Jul 2017 08:52:50 -0400 Subject: [PATCH 101/118] MOBILE-2178 formattext: Get video data from data-setup-lazy attribute --- www/core/directives/formattext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/core/directives/formattext.js b/www/core/directives/formattext.js index 4c43b72edc3..9e1556e1f97 100644 --- a/www/core/directives/formattext.js +++ b/www/core/directives/formattext.js @@ -342,7 +342,7 @@ angular.module('mm.core') return; } - var data = JSON.parse(el.getAttribute('data-setup') || '{}'), + var data = JSON.parse(el.getAttribute('data-setup') || el.getAttribute('data-setup-lazy') || '{}'), youtubeId = data.techOrder && data.techOrder[0] && data.techOrder[0] == 'youtube' && data.sources && data.sources[0] && data.sources[0].src && youtubeGetId(data.sources[0].src); From c9949839ec2afc7a5872dd6e853817b0d214ce64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Thu, 27 Jul 2017 09:06:38 -0400 Subject: [PATCH 102/118] MOBILE-2178 database: Do not allow to edit a deleted offline entry --- www/addons/mod/data/services/helper.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 437cc323324..8fe80e34b4f 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -101,10 +101,10 @@ angular.module('mm.addons.mod_data') replacements.timeadded = true; replacements.timemodified = true; - replacements.edit = record.canmanageentry; // This already checks capabilities and readonly period. - replacements.delete = replacements.edit; - replacements.approve = database.approval && accessInfo.canapprove && !record.approved; - replacements.disapprove = database.approval && accessInfo.canapprove && record.approved; + replacements.edit = record.canmanageentry && !record.deleted; // This already checks capabilities and readonly period. + replacements.delete = record.canmanageentry; + replacements.approve = database.approval && accessInfo.canapprove && !record.approved && !record.deleted; + replacements.disapprove = database.approval && accessInfo.canapprove && record.approved && !record.deleted; replacements.approvalstatus = database.approval; replacements.comments = database.comments; From 57fec3f3d6d5fec62641bc30c4156b03c63837c7 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 13:02:56 +0200 Subject: [PATCH 103/118] MOBILE-2178 database: Update fields data when PTR --- .../mod/data/fields/checkbox/directive.js | 7 +- .../mod/data/fields/checkbox/template.html | 2 +- www/addons/mod/data/fields/date/directive.js | 7 +- www/addons/mod/data/fields/date/template.html | 2 +- www/addons/mod/data/fields/file/directive.js | 33 +++++-- .../mod/data/fields/latlong/directive.js | 38 +++++---- .../mod/data/fields/latlong/template.html | 4 +- www/addons/mod/data/fields/menu/directive.js | 1 - www/addons/mod/data/fields/menu/template.html | 2 +- .../mod/data/fields/multimenu/directive.js | 7 +- .../mod/data/fields/multimenu/template.html | 2 +- .../mod/data/fields/number/directive.js | 4 - .../mod/data/fields/number/template.html | 2 +- .../mod/data/fields/picture/directive.js | 85 ++++++++++++------- .../mod/data/fields/radiobutton/directive.js | 1 - .../mod/data/fields/radiobutton/template.html | 2 +- www/addons/mod/data/fields/text/directive.js | 4 - www/addons/mod/data/fields/text/template.html | 2 +- .../mod/data/fields/textarea/directive.js | 27 +++--- .../mod/data/fields/textarea/template.html | 2 +- www/addons/mod/data/fields/url/directive.js | 4 - www/addons/mod/data/fields/url/template.html | 2 +- 22 files changed, 142 insertions(+), 98 deletions(-) diff --git a/www/addons/mod/data/fields/checkbox/directive.js b/www/addons/mod/data/fields/checkbox/directive.js index 9615d28647c..16e95b2ca4e 100644 --- a/www/addons/mod/data/fields/checkbox/directive.js +++ b/www/addons/mod/data/fields/checkbox/directive.js @@ -14,6 +14,12 @@ angular.module('mm.addons.mod_data') +.filter('mmaModDataFieldCheckboxFormat', function() { + return function(text) { + return text.split("##").join("
    "); + }; +}) + /** * Directive to render data checkbox field. * @@ -29,7 +35,6 @@ angular.module('mm.addons.mod_data') link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; if (scope.mode == 'show') { - scope.text = scope.value && scope.value.content ? scope.value.content.split("##").join("
    ") : ""; return; } diff --git a/www/addons/mod/data/fields/checkbox/template.html b/www/addons/mod/data/fields/checkbox/template.html index 04ab7849e15..82c3ac440c3 100644 --- a/www/addons/mod/data/fields/checkbox/template.html +++ b/www/addons/mod/data/fields/checkbox/template.html @@ -4,4 +4,4 @@ {{ option }} {{ 'mma.mod_data.selectedrequired' | translate }} -{{ text }} \ No newline at end of file +{{ value.content | mmaModDataFieldCheckboxFormat }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/date/directive.js b/www/addons/mod/data/fields/date/directive.js index 859ed4c1064..9626c53b9f0 100644 --- a/www/addons/mod/data/fields/date/directive.js +++ b/www/addons/mod/data/fields/date/directive.js @@ -14,6 +14,12 @@ angular.module('mm.addons.mod_data') +.filter('mmaModDataFieldDateFormat', function() { + return function(text) { + return text * 1000; + }; +}) + /** * Directive to render data date field. * @@ -29,7 +35,6 @@ angular.module('mm.addons.mod_data') link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; if (scope.mode == 'show') { - scope.text = scope.value ? scope.value.content * 1000 : ""; return; } diff --git a/www/addons/mod/data/fields/date/template.html b/www/addons/mod/data/fields/date/template.html index e9bac5373f2..783d1fc842b 100644 --- a/www/addons/mod/data/fields/date/template.html +++ b/www/addons/mod/data/fields/date/template.html @@ -2,4 +2,4 @@ {{ error }} {{ 'mma.mod_data.usedate' | translate }} -{{ text | mmFormatDate:"dfdaymonthyear" }} \ No newline at end of file +{{ value.content | mmaModDataFieldDateFormat | mmFormatDate:"dfdaymonthyear" }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/file/directive.js b/www/addons/mod/data/fields/file/directive.js index 149b59fcce7..238d362ce52 100644 --- a/www/addons/mod/data/fields/file/directive.js +++ b/www/addons/mod/data/fields/file/directive.js @@ -22,6 +22,24 @@ angular.module('mm.addons.mod_data') * @name mmaModDataFieldFile */ .directive('mmaModDataFieldFile', function($mmFileSession, mmaModDataComponent) { + + /** + * Get the files from the input value. + * + * @param {Object} value Input value. + * @return {Object[]} List of files. + */ + function getFiles(value) { + var files = (value && value.files) || []; + + // Reduce to first element. + if (files.length > 0) { + files = [files[0]]; + } + + return files; + } + return { restrict: 'A', priority: 100, @@ -32,14 +50,15 @@ angular.module('mm.addons.mod_data') scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; - scope.files = (scope.value && scope.value.files) || []; - - // Reduce to first element. - if (scope.files.length > 0) { - scope.files = [scope.files[0]]; - } + if (scope.mode == 'show') { + // Displaying the list of files, watch the value to update the list if it changes. + scope.$watch('value', function(newValue) { + scope.files = getFiles(newValue); + }); + } else { + // Edit mode, the list shouldn't change so there is no need to watch it. + scope.files = getFiles(scope.value); - if (scope.mode == 'edit') { scope.maxSizeBytes = parseInt(scope.field.param3, 10); $mmFileSession.setFiles(mmaModDataComponent, scope.database.id + '_' + scope.field.id, scope.files); } diff --git a/www/addons/mod/data/fields/latlong/directive.js b/www/addons/mod/data/fields/latlong/directive.js index 0f214ac81d0..9d3bf66b413 100644 --- a/www/addons/mod/data/fields/latlong/directive.js +++ b/www/addons/mod/data/fields/latlong/directive.js @@ -14,6 +14,25 @@ angular.module('mm.addons.mod_data') +.filter('mmaModDataFieldLatLongFormat', function() { + return function(value) { + var north = (value && parseFloat(value.content)) || "", + east = (value && parseFloat(value.content1)) || ""; + + if (north !== '' || east !== '') { + north = north ? north.toFixed(4) : '0.0000'; + east = east ? east.toFixed(4) : '0.0000'; + + var latitude = north < 0 ? -north + '°S' : north + '°N', + longitude = east < 0 ? -east + '°W' : east + '°E', + link = ionic.Platform.isAndroid() ? 'geo:' + north + ',' + east : + 'http://maps.apple.com/?ll=' + north + ',' + east + '&near=' + north + ',' + east; + + return '' + latitude + ' ' + longitude + ''; + } + }; +}) + /** * Directive to render data latlong field. * @@ -29,22 +48,9 @@ angular.module('mm.addons.mod_data') link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; if (scope.value) { - scope.north = (scope.value && parseFloat(scope.value.content)) || ""; - scope.east = (scope.value && parseFloat(scope.value.content1)) || ""; - - if (scope.mode == 'show') { - if (scope.north != "" || scope.east != "") { - scope.north = scope.north ? parseFloat(scope.north).toFixed(4) : '0.0000'; - scope.east = scope.east ? parseFloat(scope.east).toFixed(4) : '0.0000'; - scope.latitude = scope.north < 0 ? -scope.north + '°S' : scope.north + '°N'; - scope.longitude = scope.east < 0 ? -scope.east + '°W' : scope.east + '°E'; - - if (ionic.Platform.isIOS()) { - scope.link = "http://maps.apple.com/?ll=" + scope.north + "," + scope.east + "&near=" + scope.north + "," + scope.east; - } else { - scope.link = "geo:"+scope.north+","+scope.east; - } - } + if (scope.mode == 'edit') { + scope.north = (scope.value && parseFloat(scope.value.content)) || ""; + scope.east = (scope.value && parseFloat(scope.value.content1)) || ""; } } } diff --git a/www/addons/mod/data/fields/latlong/template.html b/www/addons/mod/data/fields/latlong/template.html index 545ed0137b5..5f0383efcde 100644 --- a/www/addons/mod/data/fields/latlong/template.html +++ b/www/addons/mod/data/fields/latlong/template.html @@ -10,6 +10,4 @@ °E - - {{latitude}} {{longitude}} - + diff --git a/www/addons/mod/data/fields/menu/directive.js b/www/addons/mod/data/fields/menu/directive.js index fb046e29fa4..d4d6bcbbd4d 100644 --- a/www/addons/mod/data/fields/menu/directive.js +++ b/www/addons/mod/data/fields/menu/directive.js @@ -29,7 +29,6 @@ angular.module('mm.addons.mod_data') link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; if (scope.mode == 'show') { - scope.text = scope.value ? scope.value.content : ""; return; } diff --git a/www/addons/mod/data/fields/menu/template.html b/www/addons/mod/data/fields/menu/template.html index 38a0de74239..0966a1b3f34 100644 --- a/www/addons/mod/data/fields/menu/template.html +++ b/www/addons/mod/data/fields/menu/template.html @@ -6,4 +6,4 @@
    - diff --git a/www/addons/mod/data/fields/multimenu/handler.js b/www/addons/mod/data/fields/multimenu/handler.js index 8fa7078568c..8d29c4496b2 100644 --- a/www/addons/mod/data/fields/multimenu/handler.js +++ b/www/addons/mod/data/fields/multimenu/handler.js @@ -68,7 +68,7 @@ angular.module('mm.addons.mod_data') self.getFieldEditData = function(field, inputData) { var fieldName = 'f_' + field.id; - if (inputData[fieldName].length > 0) { + if (inputData[fieldName] && inputData[fieldName].length > 0) { var options = inputData[fieldName].split('###'); if (options.length > 0) { return [{ @@ -81,6 +81,22 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/number/directive.js b/www/addons/mod/data/fields/number/directive.js index 448f00855db..327f67c0c1e 100644 --- a/www/addons/mod/data/fields/number/directive.js +++ b/www/addons/mod/data/fields/number/directive.js @@ -28,7 +28,7 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/number/template.html', link: function(scope) { if (scope.mode == 'edit' && scope.value) { - scope.value = parseFloat(scope.value.content); + scope.val = parseFloat(scope.value.content); } } }; diff --git a/www/addons/mod/data/fields/number/handler.js b/www/addons/mod/data/fields/number/handler.js index 46fd202ba44..e99268e5914 100644 --- a/www/addons/mod/data/fields/number/handler.js +++ b/www/addons/mod/data/fields/number/handler.js @@ -62,6 +62,22 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/number/template.html b/www/addons/mod/data/fields/number/template.html index 246b94e3dfb..91c9c4cb065 100644 --- a/www/addons/mod/data/fields/number/template.html +++ b/www/addons/mod/data/fields/number/template.html @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/www/addons/mod/data/fields/picture/directive.js b/www/addons/mod/data/fields/picture/directive.js index ee9d61efc24..590217a2b4b 100644 --- a/www/addons/mod/data/fields/picture/directive.js +++ b/www/addons/mod/data/fields/picture/directive.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataFieldPicture */ -.directive('mmaModDataFieldPicture', function(mmaModDataComponent) { +.directive('mmaModDataFieldPicture', function(mmaModDataComponent, $mmFileSession) { return { restrict: 'A', priority: 100, @@ -31,6 +31,9 @@ angular.module('mm.addons.mod_data') scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; scope.maxSizeBytes = parseInt(scope.field.param3, 10); + + scope.files = angular.copy((scope.value && scope.value.files) || []); + $mmFileSession.setFiles(mmaModDataComponent, scope.database.id + '_' + scope.field.id, scope.files); } } }; diff --git a/www/addons/mod/data/fields/picture/handler.js b/www/addons/mod/data/fields/picture/handler.js index 8d464a8d8b8..01fe1754214 100644 --- a/www/addons/mod/data/fields/picture/handler.js +++ b/www/addons/mod/data/fields/picture/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldPictureHandler */ -.factory('$mmaModDataFieldPictureHandler', function() { +.factory('$mmaModDataFieldPictureHandler', function($mmFileSession, mmaModDataComponent, $mmFileUploaderHelper) { var self = {}; @@ -43,6 +43,49 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field edit data in the input data. + * + * @param {Object} field Defines the field to be rendered. + * @return {Promise} With name and value of the data to be sent. + */ + self.getFieldEditData = function(field) { + var files = self.getFieldEditFiles(field); + if (!!files.length) { + return [{ + fieldid: field.id, + subfield: 'file', + files: files + }]; + } + return false; + }; + + /** + * Get field edit files in the input data. + * + * @param {Object} field Defines the field.. + * @return {Promise} With name and value of the data to be sent. + */ + self.getFieldEditFiles = function(field) { + return $mmFileSession.getFiles(mmaModDataComponent, field.dataid + '_' + field.id); + }; + + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var files = $mmFileSession.getFiles(mmaModDataComponent, field.dataid + '_' + field.id) || [], + originalFiles = (originalData && originalData.files) || []; + + return $mmFileUploaderHelper.areFileListDifferent(files, originalFiles); + }; + return self; }) diff --git a/www/addons/mod/data/fields/radiobutton/directive.js b/www/addons/mod/data/fields/radiobutton/directive.js index 6d152555648..48e1e23039e 100644 --- a/www/addons/mod/data/fields/radiobutton/directive.js +++ b/www/addons/mod/data/fields/radiobutton/directive.js @@ -30,7 +30,7 @@ angular.module('mm.addons.mod_data') scope.options = scope.field.param1.split("\n"); if (scope.mode == 'edit' && scope.value) { - scope.value = scope.value.content; + scope.val = scope.value.content; } } }; diff --git a/www/addons/mod/data/fields/radiobutton/handler.js b/www/addons/mod/data/fields/radiobutton/handler.js index a599e6af342..93d09562ad0 100644 --- a/www/addons/mod/data/fields/radiobutton/handler.js +++ b/www/addons/mod/data/fields/radiobutton/handler.js @@ -62,6 +62,22 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/radiobutton/template.html b/www/addons/mod/data/fields/radiobutton/template.html index 6d99d81b8f1..ffeb42e0abf 100644 --- a/www/addons/mod/data/fields/radiobutton/template.html +++ b/www/addons/mod/data/fields/radiobutton/template.html @@ -1,6 +1,6 @@
    - diff --git a/www/addons/mod/data/fields/text/directive.js b/www/addons/mod/data/fields/text/directive.js index 9fcb4f4d3f8..7517e5775ba 100644 --- a/www/addons/mod/data/fields/text/directive.js +++ b/www/addons/mod/data/fields/text/directive.js @@ -28,7 +28,7 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/text/template.html', link: function(scope) { if (scope.mode == 'edit' && scope.value) { - scope.value = scope.value.content; + scope.val = scope.value.content; } } }; diff --git a/www/addons/mod/data/fields/text/handler.js b/www/addons/mod/data/fields/text/handler.js index 755f5768fe2..1eeec43b579 100644 --- a/www/addons/mod/data/fields/text/handler.js +++ b/www/addons/mod/data/fields/text/handler.js @@ -61,6 +61,22 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/text/template.html b/www/addons/mod/data/fields/text/template.html index 189f72e0ffe..0b3cbb41a5c 100644 --- a/www/addons/mod/data/fields/text/template.html +++ b/www/addons/mod/data/fields/text/template.html @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/www/addons/mod/data/fields/textarea/directive.js b/www/addons/mod/data/fields/textarea/directive.js index c6d8ecb8094..3a2544bcc07 100644 --- a/www/addons/mod/data/fields/textarea/directive.js +++ b/www/addons/mod/data/fields/textarea/directive.js @@ -30,13 +30,18 @@ angular.module('mm.addons.mod_data') // Check if rich text editor is enabled. if (scope.mode == 'edit') { $mmUtil.isRichTextEditorEnabled().then(function(enabled) { - var text = scope.value ? $mmText.replacePluginfileUrls(scope.value.content, scope.value.files) : ""; + var files = (scope.value && scope.value.files) || [], + text = scope.value ? $mmText.replacePluginfileUrls(scope.value.content, files) : ""; // Get the text. scope.model = { text: text }; }); + + scope.firstRender = function() { + scope.value.content = scope.model.text; + }; } } }; diff --git a/www/addons/mod/data/fields/textarea/handler.js b/www/addons/mod/data/fields/textarea/handler.js index be9fce8766b..8ac11fd309f 100644 --- a/www/addons/mod/data/fields/textarea/handler.js +++ b/www/addons/mod/data/fields/textarea/handler.js @@ -43,31 +43,19 @@ angular.module('mm.addons.mod_data') return false; }; - /** - * Get the text to submit. - * - * @param {Object} field Field. - * @param {Object} inputData Data entered in the edit form. - * @return {String} Text to submit. - */ - function getTextToSubmit(plugin, text) { - - - return - } - /** * Get field edit data in the input data. * - * @param {Object} field Defines the field to be rendered. - * @param {Object} inputData Data entered in the edit form. - * @return {Array} With name and value of the data to be sent. + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Promise} With name and value of the data to be sent. */ - self.getFieldEditData = function(field, inputData) { + self.getFieldEditData = function(field, inputData, originalData) { var fieldName = 'f_' + field.id; if (inputData[fieldName]) { return $mmUtil.isRichTextEditorEnabled().then(function(enabled) { - var files = field.files ? field.files : [], + var files = self.getFieldEditFiles(field, inputData, originalData), text = $mmText.restorePluginfileUrls(inputData[fieldName], files); if (!enabled) { @@ -78,12 +66,44 @@ angular.module('mm.addons.mod_data') return [{ fieldid: field.id, value: text + }, + { + fieldid: field.id, + files: files }]; }); } return false; }; + /** + * Get field edit files in the input data. + * + * @param {Object} field Defines the field.. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Promise} With name and value of the data to be sent. + */ + self.getFieldEditFiles = function(field, inputData, originalData) { + return (originalData && originalData.files) || []; + }; + + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/textarea/template.html b/www/addons/mod/data/fields/textarea/template.html index 7759a113d91..5a357df6990 100644 --- a/www/addons/mod/data/fields/textarea/template.html +++ b/www/addons/mod/data/fields/textarea/template.html @@ -1,5 +1,5 @@
    - +
    \ No newline at end of file diff --git a/www/addons/mod/data/fields/url/directive.js b/www/addons/mod/data/fields/url/directive.js index dd641ac988d..92b942ab12a 100644 --- a/www/addons/mod/data/fields/url/directive.js +++ b/www/addons/mod/data/fields/url/directive.js @@ -28,7 +28,7 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/url/template.html', link: function(scope) { if (scope.mode == 'edit' && scope.value) { - scope.value = scope.value.content; + scope.val = scope.value.content; } } }; diff --git a/www/addons/mod/data/fields/url/handler.js b/www/addons/mod/data/fields/url/handler.js index bc71b7fb7db..fa38a7bfffb 100644 --- a/www/addons/mod/data/fields/url/handler.js +++ b/www/addons/mod/data/fields/url/handler.js @@ -43,7 +43,7 @@ angular.module('mm.addons.mod_data') return false; }; - /** + /** * Get field edit data in the input data. * * @param {Object} field Defines the field to be rendered. @@ -61,6 +61,22 @@ angular.module('mm.addons.mod_data') return false; }; + /** + * Get field data in changed. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalData Original form data entered. + * @return {Boolean} If the field has changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var fieldName = 'f_' + field.id, + input = inputData[fieldName] || "", + originalData = (originalData && originalData.content) || ""; + + return input != originalData; + }; + return self; }) diff --git a/www/addons/mod/data/fields/url/template.html b/www/addons/mod/data/fields/url/template.html index 78f2af414af..cc75865221f 100644 --- a/www/addons/mod/data/fields/url/template.html +++ b/www/addons/mod/data/fields/url/template.html @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/www/addons/mod/data/services/fieldsdelegate.js b/www/addons/mod/data/services/fieldsdelegate.js index 96e528cbb3f..285463979b8 100644 --- a/www/addons/mod/data/services/fieldsdelegate.js +++ b/www/addons/mod/data/services/fieldsdelegate.js @@ -69,7 +69,7 @@ angular.module('mm.addons.mod_data') /** * Get database data in the input data to search. * - * @module mm.addons.mod_assign + * @module mm.addons.mod_data * @ngdoc method * @name $mmaModDataFieldsDelegate#getFieldSearchData * @param {Object} field Defines the field to be rendered. @@ -87,38 +87,60 @@ angular.module('mm.addons.mod_data') /** * Get database data in the input data to add or update entry. * - * @module mm.addons.mod_assign + * @module mm.addons.mod_data * @ngdoc method * @name $mmaModDataFieldsDelegate#getFieldEditData - * @param {Object} field Defines the field to be rendered. - * @param {Object} inputData Data entered in the search form. - * @return {Array} Name and data field. + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @param {Object} originalData Original form data entered. + * @return {Array} Name and data field. */ - self.getFieldEditData = function(field, inputData) { + self.getFieldEditData = function(field, inputData, originalData) { var handler = self.getPluginHandler(field.type); if (handler && handler.getFieldEditData) { - return handler.getFieldEditData(field, inputData); + return handler.getFieldEditData(field, inputData, originalData); } return false; }; /** - * Get files used by this plugin. - * The files returned by this function will be prefetched when the user prefetches the database. + * Get database data in the input files to add or update entry. * * @module mm.addons.mod_data * @ngdoc method - * @name $mmaModDataFieldsDelegate#getPluginFiles - * @param {Object} field Defines the field. - * @param {Object} content Defines the content that contains the files. - * @return {Array} List of files. + * @name $mmaModDataFieldsDelegate#getFieldEditFiles + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @param {Object} originalData Original form data entered. + * @return {Array} Name and data field. */ - self.getPluginFiles = function(field, content) { + self.getFieldEditFiles = function(field, inputData, originalData) { var handler = self.getPluginHandler(field.type); - if (handler && handler.getPluginFiles) { - return handler.getPluginFiles(field, content); + if (handler && handler.getFieldEditFiles) { + return handler.getFieldEditFiles(field, inputData, originalData); } - return content.files; + return []; + }; + + /** + * Check if the data has changed for a certain field. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#hasFieldDataChanged + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the search form. + * @param {Object} originalData Original form data entered. + * @return {Promise} Promise rejected if has changed, resolved if no changes. + */ + self.hasFieldDataChanged = function(field, inputData, originalData) { + var handler = self.getPluginHandler(field.type); + if (handler && handler.hasFieldDataChanged) { + return $q.when(handler.hasFieldDataChanged(field, inputData, originalData)).then(function(result) { + return result ? $q.reject() : $q.when(); + }); + } + return $q.when(); }; /** @@ -168,10 +190,13 @@ angular.module('mm.addons.mod_data') * returning an object defining these properties. See {@link $mmUtil#resolveObject}. * - getFieldSearchData(field, inputData) Optional. * Should return name and data entered to the field. - * - getFieldEditData(field, inputData) Optional. - * Should return name and data entered to the field. - * - getPluginFiles(plugin, inputData) Optional. - * Should return file list of the field. + * - getFieldEditData(field, inputData, originalData) Optional. + * Should return fielid and data entered to the field in a promise + * or array. + * - hasFieldDataChanged(field, inputData, originalData) Optional. + * Should return if field has been changed by the user. + * - getFieldEditFiles(field, inputData, originalData) Optional. + * Should return an array of files stored in temp store. */ self.registerHandler = function(addon, pluginType, handler) { if (typeof handlers[pluginType] !== 'undefined') { diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index baba019d798..b83972ac25d 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataHelper */ -.factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q) { +.factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q, mmaModDataComponent, $mmFileUploader) { var self = { searchOther: { @@ -186,13 +186,15 @@ angular.module('mm.addons.mod_data') * @module mm.addons.mod_data * @ngdoc method * @name $mmaModDataHelper#getEditDataFromForm - * @param {Object} form Form (DOM element). - * @param {Array} fields Fields that defines every content in the entry. - * @return {Object} Object with the answers. + * @param {Object} form Form (DOM element). + * @param {Array} fields Fields that defines every content in the entry. + * @param {Number} [dataId] Database Id. If set, fils will be uploaded and itemId set. + * @param {Object} entryContents Original entry contents indexed by field id. + * @return {Promise} That contains object with the answers. */ - self.getEditDataFromForm = function(form, fields) { + self.getEditDataFromForm = function(form, fields, dataId, entryContents) { if (!form || !form.elements) { - return {}; + return $q.when({}); } var formData = getFormData(form); @@ -201,23 +203,132 @@ angular.module('mm.addons.mod_data') var edit = [], promises = []; angular.forEach(fields, function(field) { - promises.push($q.when($mmaModDataFieldsDelegate.getFieldEditData(field, formData)).then(function (fieldData) { + promises.push($q.when($mmaModDataFieldsDelegate.getFieldEditData(field, formData, entryContents[field.id] || undefined)) + .then(function (fieldData) { if (fieldData) { + var proms = []; + angular.forEach(fieldData, function(data) { - data.value = JSON.stringify(data.value); - // WS wants values in Json format. - edit.push(data); + var dataProm; + + // Upload Files if asked. + if (dataId && data.files) { + dataProm = self.uploadOrStoreFiles(dataId, data.fieldid, undefined, data.files).then(function(itemId) { + delete data.files; + data.value = itemId; + }); + } else { + dataProm = $q.when(); + } + + proms.push(dataProm.then(function() { + if (data.value) { + data.value = JSON.stringify(data.value); + } + + // WS wants values in Json format. + edit.push(data); + })); }); + + return $q.all(proms); } })); }); return $q.all(promises).then(function() { - console.error(formData, edit); return edit; }); }; + /** + * Retrieve the temp files to be updated. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getEditTmpFiles + * @param {Object} form Form (DOM element). + * @param {Array} fields Fields that defines every content in the entry. + * @param {Number} [dataId] Database Id. If set, fils will be uploaded and itemId set. + * @param {Object} entryContents Original entry contents indexed by field id. + * @return {Promise} That contains object with the files. + */ + self.getEditTmpFiles = function(form, fields, dataId, entryContents) { + if (!form || !form.elements) { + return $q.when([]); + } + + var formData = getFormData(form); + + // Filter and translate fields to each field plugin. + var promises = []; + angular.forEach(fields, function(field) { + promises.push( + $q.when($mmaModDataFieldsDelegate.getFieldEditFiles(field, formData, entryContents[field.id] || undefined)) + ); + }); + + return $q.all(promises).then(function(fieldsFiles) { + var files = []; + + angular.forEach(fieldsFiles, function(fieldFiles) { + files = files.concat(fieldFiles); + }); + return files; + }); + }; + + /** + * Check if data has been changed by the user. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#hasEditDataChanged + * @param {Object} form Form (DOM element). + * @param {Array} fields Fields that defines every content in the entry. + * @param {Number} [dataId] Database Id. If set, fils will be uploaded and itemId set. + * @param {Object} entryContents Original entry contents indexed by field id. + * @return {Promise} True if changed, false if not. + */ + self.hasEditDataChanged = function(form, fields, dataId, entryContents) { + var inputData = getFormData(form), + promises = []; + + angular.forEach(fields, function(field) { + promises.push($mmaModDataFieldsDelegate.hasFieldDataChanged(field, inputData, entryContents[field.id] || undefined)); + }); + // Will reject on first change detected. + return $q.all(promises).then(function() { + // No changes. + return false; + }).catch(function() { + // Has changes. + return true; + }); + }; + + /** + * Upload or store some files, depending if the user is offline or not. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#uploadOrStoreFiles + * @param {Number} dataId Database ID. + * @param {Number} [itemId] Draft ID to use. Undefined or 0 to create a new draft ID. + * @param {Number} [timecreated] The time the entry was created. + * @param {Object[]} files List of files. + * @param {Boolean} offline True if files sould be stored for offline, false to upload them. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if success. + */ + self.uploadOrStoreFiles = function(dataId, itemId, timecreated, files, offline, siteId) { + if (offline) { + // @todo in future issues. + //return self.storeFiles(dataId, timecreated, files, siteId); + } + return $mmFileUploader.uploadOrReuploadFiles(files, mmaModDataComponent, itemId, siteId); + }; + /** * Add a prefix to all rules in a CSS string. * diff --git a/www/addons/mod/data/templates/edit.html b/www/addons/mod/data/templates/edit.html index 9bd0062315b..275ed7517ea 100644 --- a/www/addons/mod/data/templates/edit.html +++ b/www/addons/mod/data/templates/edit.html @@ -4,7 +4,6 @@
    {{ 'mm.core.save' | translate }} -
    {{ 'mm.core.groupsseparate' | translate }} diff --git a/www/addons/mod/data/templates/index.html b/www/addons/mod/data/templates/index.html index d6e9d29c44e..3ce95a59c5f 100644 --- a/www/addons/mod/data/templates/index.html +++ b/www/addons/mod/data/templates/index.html @@ -68,7 +68,12 @@

    {{ 'mma.mod_data.numrecords' | translate: {$a: numEntries } }}

    - +
    + +
    + {{ 'mma.mod_data.resetsettings' | translate}} diff --git a/www/core/directives/multipleselect.js b/www/core/directives/multipleselect.js index 0fff7861e06..0b93e7d2388 100644 --- a/www/core/directives/multipleselect.js +++ b/www/core/directives/multipleselect.js @@ -56,6 +56,9 @@ angular.module('mm.core') scope.optionsRender = []; scope.selectedOptions = getSelectedOptionsText(); + if (scope.name) { + scope.selectedValues = getSelectedOptionsValues(); + } element.on('click', function(e) { e.preventDefault(); From 9c0317a9a868299e987a35ec8c99022eb4987ada Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 28 Jun 2017 15:43:30 +0200 Subject: [PATCH 047/118] MOBILE-839 login: Fix SSO login in Windows --- www/core/components/login/main.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/www/core/components/login/main.js b/www/core/components/login/main.js index 75880aea5d9..77987043fc8 100644 --- a/www/core/components/login/main.js +++ b/www/core/components/login/main.js @@ -376,14 +376,8 @@ angular.module('mm.core.login', []) url = url.replace(ssoScheme, ''); // Some platforms like Windows add a slash at the end. Remove it. - if (url.slice(-1) == '/') { - url = url.substring(0, url.length - 1); - } - // Some sites add a # at the end of the URL. If it's there, remove it. - if (url.slice(-1) == '#') { - url = url.substring(0, url.length - 1); - } + url = url.replace(/\/?#?\/?$/, ''); // Decode from base64. try { From 30bac534a49ce3e72dc96c1ac8a8bca60129ca1b Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 28 Jun 2017 15:44:03 +0200 Subject: [PATCH 048/118] MOBILE-839 styles: Hide pseudo-elements in date input --- www/core/scss/styles.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index 8af1907df25..5c0985bd3cf 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -1655,3 +1655,7 @@ h2.invert { border-color: transparent; background: none; } + +::-webkit-calendar-picker-indicator, ::-webkit-inner-spin-button, ::-webkit-clear-button { + display: none; +} From 2bebb0d544b30d7bfe97d1e0a7e985ce49023bba Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 28 Jun 2017 15:44:37 +0200 Subject: [PATCH 049/118] MOBILE-839 desktop: Improve error handling in capture media --- .../emulator/services/mediacapture.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/www/core/components/emulator/services/mediacapture.js b/www/core/components/emulator/services/mediacapture.js index 473ff8cc621..211f437bda9 100644 --- a/www/core/components/emulator/services/mediacapture.js +++ b/www/core/components/emulator/services/mediacapture.js @@ -50,9 +50,10 @@ angular.module('mm.core.emulator') function captureMedia(type, successCallback, errorCallback, options) { options = options || {}; + var loadingModal; + try { var scope = $rootScope.$new(), - loadingModal = $mmUtil.showModalLoading(), facingMode = 'environment', mimetype, extension, @@ -60,6 +61,8 @@ angular.module('mm.core.emulator') returnData = false, // Image only. isCaptureImage = false; // To identify if it's capturing an image using media capture plugin (instead of camera). + loadingModal = $mmUtil.showModalLoading(); + if (type == 'captureimage') { isCaptureImage = true; type = 'image'; @@ -117,7 +120,7 @@ angular.module('mm.core.emulator') audio: !scope.isImage }; - navigator.mediaDevices.getUserMedia(constraints).then(function(localMediaStream) { + return navigator.mediaDevices.getUserMedia(constraints).then(function(localMediaStream) { var streamVideo, previewMedia, canvas, @@ -304,10 +307,14 @@ angular.module('mm.core.emulator') scope.$on('$destroy', function() { scope.modal.remove(); }); - }).catch(errorCallback); - }, errorCallback); + }); + }).catch(function(err) { + loadingModal && loadingModal.dismiss(); + errorCallback && errorCallback(err); + }); } catch(ex) { - errorCallback(ex.toString()); + loadingModal && loadingModal.dismiss(); + errorCallback && errorCallback(ex.toString()); } } From 5e0a62debb009b12bddffd9458a11b721795eb2e Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 29 Jun 2017 09:01:34 +0200 Subject: [PATCH 050/118] MOBILE-2158 lesson: Improve retrieve buttons for content pages --- www/addons/mod/lesson/services/helper.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/www/addons/mod/lesson/services/helper.js b/www/addons/mod/lesson/services/helper.js index 7999d10a59e..0e6e1cd9aa9 100644 --- a/www/addons/mod/lesson/services/helper.js +++ b/www/addons/mod/lesson/services/helper.js @@ -93,8 +93,7 @@ angular.module('mm.addons.mod_lesson') var buttons = [], rootElement = document.createElement('div'), buttonsContainer, - forms, - isLegacy = false; + forms; // Get the container of the buttons if it exists. rootElement.innerHTML = html; @@ -106,14 +105,12 @@ angular.module('mm.addons.mod_lesson') // No buttons found. return buttons; } - isLegacy = true; buttonsContainer = rootElement; } forms = buttonsContainer.querySelectorAll('form'); angular.forEach(forms, function(form) { - var buttonSelector = isLegacy ? 'input[type="submit"]' : 'button[type="submit"]', - buttonEl = form.querySelector(buttonSelector), + var buttonEl = form.querySelector('input[type="submit"], button[type="submit"]'), inputs = form.querySelectorAll('input'), button; @@ -125,7 +122,7 @@ angular.module('mm.addons.mod_lesson') button = { id: buttonEl.id, title: buttonEl.title || buttonEl.value, - content: isLegacy ? buttonEl.value : buttonEl.innerHTML.trim(), + content: buttonEl.tagName == 'INPUT' ? buttonEl.value : buttonEl.innerHTML.trim(), data: {} }; From dc4a5daa702936df6ead781c0702f27be94694bf Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 29 Jun 2017 16:28:12 +0200 Subject: [PATCH 051/118] MOBILE-839 udesktop Fix promise not resolved when open file --- www/core/lib/util.js | 1 + 1 file changed, 1 insertion(+) diff --git a/www/core/lib/util.js b/www/core/lib/util.js index 1e4f82db24b..3dd00b5cddb 100644 --- a/www/core/lib/util.js +++ b/www/core/lib/util.js @@ -296,6 +296,7 @@ angular.module('mm.core') // It's a desktop app, send an event so the file is opened. It has to be done with an event // because opening the file from here (renderer process) doesn't focus the opened app. require('electron').ipcRenderer.send('openItem', path); + deferred.resolve(); } else if (window.plugins) { var extension = $mmFS.getFileExtension(path), mimetype = $mmFS.getMimeType(extension); From 3513336a767a43fa8726543937b702a20b847001 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 29 Jun 2017 10:09:12 -0700 Subject: [PATCH 052/118] MOBILE-839 desktop: Focus app when notification clicked --- .../components/emulator/services/localnotif.js | 16 ++++++++++++++-- www/electron.js | 10 +++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/www/core/components/emulator/services/localnotif.js b/www/core/components/emulator/services/localnotif.js index 9ad132cad7f..2d063e6e19f 100644 --- a/www/core/components/emulator/services/localnotif.js +++ b/www/core/components/emulator/services/localnotif.js @@ -488,6 +488,18 @@ angular.module('mm.core.emulator') return options; } + /** + * Function called when a notification is clicked. + * + * @param {Object} notification Clicked notification. + * @return {Void} + */ + function notificationClicked(notification) { + $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + // Focus the app. + require('electron').ipcRenderer.send('focusApp'); + } + /** * Parse a interval and convert it to a number of milliseconds (0 if not valid). * Code extracted from the Cordova plugin. @@ -570,7 +582,7 @@ angular.module('mm.core.emulator') // Listen for click events. notifInstance.on('activated', function() { - $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + notificationClicked(notification); }); notifInstance.show() @@ -592,7 +604,7 @@ angular.module('mm.core.emulator') // Listen for click events. notifInstance.onclick = function() { - $rootScope.$broadcast('$cordovaLocalNotification:click', notification, 'foreground'); + notificationClicked(notification); }; } } diff --git a/www/electron.js b/www/electron.js index 9a354b1d504..16bfff11106 100644 --- a/www/electron.js +++ b/www/electron.js @@ -102,12 +102,18 @@ if (shouldQuit) { function appLaunched(url) { // App was launched again with a URL. Focus the main window and send an event to treat the URL. + if (mainWindow) { + focusApp(); + mainWindow.webContents.send('mmAppLaunched', url); // Send an event to the main window. + } +} + +function focusApp() { if (mainWindow) { if (mainWindow.isMinimized()) { mainWindow.restore(); } mainWindow.focus(); - mainWindow.webContents.send('mmAppLaunched', url); // Send an event to the main window. } } @@ -124,3 +130,5 @@ ipcMain.on('closeSecondaryWindows', () => { } } }); + +ipcMain.on('focusApp', focusApp); From d49025a483c8ad5458a8f8e059d814ecbabd26d9 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 30 Jun 2017 08:48:57 +0200 Subject: [PATCH 053/118] MOBILE-839 desktop: Show error if cannot get stream. --- .../emulator/services/mediacapture.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/www/core/components/emulator/services/mediacapture.js b/www/core/components/emulator/services/mediacapture.js index 211f437bda9..98d5e34557d 100644 --- a/www/core/components/emulator/services/mediacapture.js +++ b/www/core/components/emulator/services/mediacapture.js @@ -162,17 +162,37 @@ angular.module('mm.core.emulator') } if (scope.isImage || scope.isVideo) { + var hasLoaded = false, + waitTimeout; + // Set the stream as the source of the video. streamVideo = modal.modalEl.querySelector('video.mm-webcam-stream'); streamVideo.src = $window.URL.createObjectURL(localMediaStream); // Stream ready, show modal. streamVideo.onloadedmetadata = function() { + if (hasLoaded) { + // Already loaded or timeout triggered, stop. + return; + } + + hasLoaded = true; + $timeout.cancel(waitTimeout); loadingModal.dismiss(); modal.show(); scope.readyToCapture = true; streamVideo.onloadedmetadata = null; }; + + // If stream isn't ready in a while, show error. + waitTimeout = $timeout(function() { + if (!hasLoaded) { + // Show error. + hasLoaded = true; + loadingModal.dismiss(); + errorCallback && errorCallback({code: -1, message: 'Cannot connect to webcam.'}); + } + }, 10000); } else { // No need to wait to show the modal. loadingModal.dismiss(); From 0fad7629c7ad964afec97ff4511faba68d92e011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Wed, 28 Jun 2017 13:07:36 +0200 Subject: [PATCH 054/118] MOBILE-2121 data: Show error messages --- www/addons/mod/data/controllers/edit.js | 65 +++++++++++++++---- www/addons/mod/data/directives/field.js | 1 + .../mod/data/fields/checkbox/handler.js | 14 ++-- .../mod/data/fields/checkbox/template.html | 3 +- www/addons/mod/data/fields/date/directive.js | 4 +- www/addons/mod/data/fields/date/handler.js | 16 ++--- www/addons/mod/data/fields/date/template.html | 3 +- www/addons/mod/data/fields/file/handler.js | 14 ++-- www/addons/mod/data/fields/file/template.html | 3 +- .../mod/data/fields/latlong/directive.js | 4 +- www/addons/mod/data/fields/latlong/handler.js | 14 ++-- .../mod/data/fields/latlong/template.html | 3 +- www/addons/mod/data/fields/menu/handler.js | 14 ++-- www/addons/mod/data/fields/menu/template.html | 3 +- .../mod/data/fields/multimenu/handler.js | 14 ++-- .../mod/data/fields/multimenu/template.html | 3 +- .../mod/data/fields/number/directive.js | 2 +- www/addons/mod/data/fields/number/handler.js | 14 ++-- .../mod/data/fields/number/template.html | 5 +- .../mod/data/fields/picture/directive.js | 1 + www/addons/mod/data/fields/picture/handler.js | 42 ++++++++---- .../mod/data/fields/picture/template.html | 9 ++- .../mod/data/fields/radiobutton/handler.js | 14 ++-- .../mod/data/fields/radiobutton/template.html | 3 +- www/addons/mod/data/fields/text/handler.js | 14 ++-- www/addons/mod/data/fields/text/template.html | 5 +- .../mod/data/fields/textarea/directive.js | 3 + .../mod/data/fields/textarea/handler.js | 59 +++++++++-------- .../mod/data/fields/textarea/template.html | 3 +- www/addons/mod/data/fields/url/handler.js | 14 ++-- www/addons/mod/data/fields/url/template.html | 2 +- www/addons/mod/data/lang/en.json | 2 + www/addons/mod/data/services/data.js | 2 +- .../mod/data/services/fieldsdelegate.js | 44 ++++++------- www/addons/mod/data/services/helper.js | 15 +++-- www/addons/mod/data/templates/index.html | 2 +- 36 files changed, 259 insertions(+), 174 deletions(-) diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index f8f4e1b3240..b9f52d71b5d 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -22,11 +22,14 @@ angular.module('mm.addons.mod_data') * @name mmaModDataEditCtrl */ .controller('mmaModDataEditCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $q, $mmUtil, $mmaModDataHelper, - $mmGroups, $ionicHistory, $mmEvents, mmaModDataEventEntryChanged, $mmSite, $translate, $mmFileUploaderHelper) { + $mmGroups, $ionicHistory, $mmEvents, mmaModDataEventEntryChanged, $mmSite, $translate, $mmFileUploaderHelper, $timeout, + $ionicScrollDelegate) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, data, + scrollView, + siteId = $mmSite.getId(), entryId = $stateParams.entryid || false; $scope.title = module.name; @@ -46,8 +49,6 @@ angular.module('mm.addons.mod_data') $scope.title = data.name || $scope.title; $scope.data = databaseData; - $scope.database = data; - return $mmaModData.getDatabaseAccessInformation(data.id); }).then(function(accessData) { $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); @@ -111,40 +112,78 @@ angular.module('mm.addons.mod_data') $scope.entryContents).then(function(changed) { if (!changed) { - return returnToEntryList(); + if (entryId) { + return returnToEntryList(); + } else { + // New entry, no changes means no field filled, warn the user. + return $q.reject('mma.mod_data.emptyaddform'); + } } var modal = $mmUtil.showModalLoading('mm.core.sending', true); return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, $scope.entryContents).then(function(editData) { + if (editData.length > 0) { if (entryId) { return $mmaModData.editEntry(entryId, editData); - } else { - return $mmaModData.addEntry(data.id, editData, $scope.selectedGroup); } + return $mmaModData.addEntry(data.id, editData, $scope.selectedGroup); } }).then(function(result) { if (!result) { - // Nothing done, just go back. - return returnToEntryList(); + // No field filled, warn the user. + return $q.reject('mma.mod_data.emptyaddform'); } // This is done if entry is updated when editing or creating if not. if ((entryId && result.updated) || (!entryId && result.newentryid)) { + var promises = []; + entryId = entryId || result.newentryid; - $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: data.id, entryId: entryId, siteId: $mmSite.getId()}); - return returnToEntryList(); + + promises.push($mmaModData.invalidateEntryData(data.id, entryId, siteId)); + promises.push($mmaModData.invalidateEntriesData(data.id, siteId)); + + return $q.all(promises).then(function() { + $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: data.id, entryId: entryId, siteId: siteId}); + }).finally(function() { + return returnToEntryList(); + }); + } else { + $scope.errors = {}; + angular.forEach(result.fieldnotifications, function(field) { + for (var x in $scope.fields) { + if ($scope.fields[x].name == field.fieldname) { + $scope.errors[$scope.fields[x].id] = field.notification; + return; + } + } + }); + $timeout(function() { + scrollToFirstError(); + }); } - }).catch(function(error) { - $mmUtil.showErrorModalDefault(error, 'Cannot edit entry', true); }).finally(function() { modal.dismiss(); }); + }).catch(function(error) { + $mmUtil.showErrorModalDefault(error, 'Cannot edit entry', true); + return $q.reject(); }); }; + // Scroll to first error. + function scrollToFirstError() { + if (!scrollView) { + scrollView = $ionicScrollDelegate.$getByHandle('mmaModDataEntryScroll'); + } + if (!$mmUtil.scrollToElement(document.body, '.mm-data-error', scrollView)) { + scrollView && scrollView.scrollTop && scrollView.scrollTop(); + } + } + function returnToEntryList() { return $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, $scope.entryContents).then(function(files) { @@ -166,7 +205,7 @@ angular.module('mm.addons.mod_data') return $mmUtil.showConfirm($translate('mm.core.confirmcanceledit')); }).then(function() { // Delete the local files from the tmp folder. - $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + return $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, $scope.entryContents).then(function(files) { $mmFileUploaderHelper.clearTmpFiles(files); }); diff --git a/www/addons/mod/data/directives/field.js b/www/addons/mod/data/directives/field.js index 60c79eb329a..c7eab2dfbf0 100644 --- a/www/addons/mod/data/directives/field.js +++ b/www/addons/mod/data/directives/field.js @@ -29,6 +29,7 @@ angular.module('mm.addons.mod_data') field: '=', value: '=?', database: '=?', + error: '=?', mode: '@' }, templateUrl: 'addons/mod/data/templates/field.html', diff --git a/www/addons/mod/data/fields/checkbox/handler.js b/www/addons/mod/data/fields/checkbox/handler.js index 1fdee4bc853..e2fd082c7c8 100644 --- a/www/addons/mod/data/fields/checkbox/handler.js +++ b/www/addons/mod/data/fields/checkbox/handler.js @@ -90,12 +90,12 @@ angular.module('mm.addons.mod_data') /** * Get field data in changed. * - * @param {Object} field Defines the field to be rendered. - * @param {Object} inputData Data entered in the edit form. - * @param {Object} originalData Original form data entered. - * @return {Boolean} If the field has changes. + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalFieldData Original field entered data. + * @return {Boolean} If the field has changes. */ - self.hasFieldDataChanged = function(field, inputData, originalData) { + self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, checkboxes = []; @@ -105,8 +105,8 @@ angular.module('mm.addons.mod_data') } }); - originalData = (originalData && originalData.content) || ""; - return checkboxes.join("##") != originalData; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; + return checkboxes.join("##") != originalFieldData; }; return self; diff --git a/www/addons/mod/data/fields/checkbox/template.html b/www/addons/mod/data/fields/checkbox/template.html index b2304beb661..df1592037fa 100644 --- a/www/addons/mod/data/fields/checkbox/template.html +++ b/www/addons/mod/data/fields/checkbox/template.html @@ -1,5 +1,6 @@ - + + {{ error }} {{ option }} {{ 'mma.mod_data.selectedrequired' | translate }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/date/directive.js b/www/addons/mod/data/fields/date/directive.js index 7844ee95216..e544c7b941d 100644 --- a/www/addons/mod/data/fields/date/directive.js +++ b/www/addons/mod/data/fields/date/directive.js @@ -31,8 +31,8 @@ angular.module('mm.addons.mod_data') scope.enable = true; } else { scope.value = { - content: Math.floor(Date.now() / 1000) - }; + content: Math.floor(Date.now() / 1000) + }; scope.enable = false; } scope.val = new Date(scope.value.content * 1000).toISOString().substr(0, 10); diff --git a/www/addons/mod/data/fields/date/handler.js b/www/addons/mod/data/fields/date/handler.js index 65aa27354ff..0d3c9f5e826 100644 --- a/www/addons/mod/data/fields/date/handler.js +++ b/www/addons/mod/data/fields/date/handler.js @@ -102,18 +102,18 @@ angular.module('mm.addons.mod_data') /** * Get field data in changed. * - * @param {Object} field Defines the field to be rendered. - * @param {Object} inputData Data entered in the edit form. - * @param {Object} originalData Original form data entered. - * @return {Boolean} If the field has changes. + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalFieldData Original field entered data. + * @return {Boolean} If the field has changes. */ - self.hasFieldDataChanged = function(field, inputData, originalData) { + self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, input = inputData[fieldName] || "", - originalData = (originalData && originalData.content && - new Date(originalData.content * 1000).toISOString().substr(0, 10)) || ""; + originalFieldData = (originalFieldData && originalFieldData.content && + new Date(originalFieldData.content * 1000).toISOString().substr(0, 10)) || ""; - return input != originalData; + return input != originalFieldData; }; return self; diff --git a/www/addons/mod/data/fields/date/template.html b/www/addons/mod/data/fields/date/template.html index 6fb55039f52..9dccb227e02 100644 --- a/www/addons/mod/data/fields/date/template.html +++ b/www/addons/mod/data/fields/date/template.html @@ -1,3 +1,4 @@ - + +{{ error }} {{ 'mma.mod_data.usedate' | translate }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/file/handler.js b/www/addons/mod/data/fields/file/handler.js index 45fe97dde67..ef530875b86 100644 --- a/www/addons/mod/data/fields/file/handler.js +++ b/www/addons/mod/data/fields/file/handler.js @@ -51,7 +51,7 @@ angular.module('mm.addons.mod_data') */ self.getFieldEditData = function(field) { var files = self.getFieldEditFiles(field); - if (!!files.length) { + if (files.length) { return [{ fieldid: field.id, subfield: 'file', @@ -74,14 +74,14 @@ angular.module('mm.addons.mod_data') /** * Get field data in changed. * - * @param {Object} field Defines the field to be rendered. - * @param {Object} inputData Data entered in the edit form. - * @param {Object} originalData Original form data entered. - * @return {Boolean} If the field has changes. + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalFieldData Original field entered data. + * @return {Boolean} If the field has changes. */ - self.hasFieldDataChanged = function(field, inputData, originalData) { + self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var files = $mmFileSession.getFiles(mmaModDataComponent, field.dataid + '_' + field.id) || [], - originalFiles = (originalData && originalData.files) || []; + originalFiles = (originalFieldData && originalFieldData.files) || []; return $mmFileUploaderHelper.areFileListDifferent(files, originalFiles); }; diff --git a/www/addons/mod/data/fields/file/template.html b/www/addons/mod/data/fields/file/template.html index 053317062c8..dea9aa1eaae 100644 --- a/www/addons/mod/data/fields/file/template.html +++ b/www/addons/mod/data/fields/file/template.html @@ -1,3 +1,4 @@ - + +{{ error }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/latlong/directive.js b/www/addons/mod/data/fields/latlong/directive.js index ce46f8dae9b..9d6c0f68cc0 100644 --- a/www/addons/mod/data/fields/latlong/directive.js +++ b/www/addons/mod/data/fields/latlong/directive.js @@ -28,8 +28,8 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/latlong/template.html', link: function(scope) { if (scope.value) { - scope.north = parseFloat(scope.value.content); - scope.east = parseFloat(scope.value.content1); + scope.north = scope.value && parseFloat(scope.value.content); + scope.east = scope.value && parseFloat(scope.value.content1); } } }; diff --git a/www/addons/mod/data/fields/latlong/handler.js b/www/addons/mod/data/fields/latlong/handler.js index 1d2e25a8477..5daf7f39263 100644 --- a/www/addons/mod/data/fields/latlong/handler.js +++ b/www/addons/mod/data/fields/latlong/handler.js @@ -75,17 +75,17 @@ angular.module('mm.addons.mod_data') /** * Get field data in changed. * - * @param {Object} field Defines the field to be rendered. - * @param {Object} inputData Data entered in the edit form. - * @param {Object} originalData Original form data entered. - * @return {Boolean} If the field has changes. + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @param {Object} originalFieldData Original field entered data. + * @return {Boolean} If the field has changes. */ - self.hasFieldDataChanged = function(field, inputData, originalData) { + self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, lat = inputData[fieldName + '_0'] || "", long = inputData[fieldName + '_1'] || "", - originalLat = (originalData && originalData.content) || "", - originalLong = (originalData && originalData.content1) || ""; + originalLat = (originalFieldData && originalFieldData.content) || "", + originalLong = (originalFieldData && originalFieldData.content1) || ""; return lat != originalLat || long != originalLong; }; diff --git a/www/addons/mod/data/fields/latlong/template.html b/www/addons/mod/data/fields/latlong/template.html index 1745e268c0a..0b1fa4eef79 100644 --- a/www/addons/mod/data/fields/latlong/template.html +++ b/www/addons/mod/data/fields/latlong/template.html @@ -1,5 +1,6 @@ - + +{{ error }}
    + +
    + {{ 'mm.core.hasdatatosync' | translate:{$a: moduleName} }} +
    +
    {{ 'mm.core.groupsseparate' | translate }} {{ 'mm.core.groupsvisible' | translate }} @@ -54,7 +59,7 @@

    {{ 'mma.mod_data.numrecords' | translate: {$a: numEntries } }}

    - {{ entries }} + {{ entriesRendered }}
    diff --git a/www/core/directives/link.js b/www/core/directives/link.js index 4e067bc5179..5c6bc32f62e 100644 --- a/www/core/directives/link.js +++ b/www/core/directives/link.js @@ -67,7 +67,7 @@ angular.module('mm.core') } } else { // Check if URL does not have any protocol, so it's a relative URL. - if (!$mmUtil.isAbsoluteURL(url)) { + if (!$mmUtil.isAbsoluteURL(href)) { // Add the site URL at the begining. if (href.charAt(0) == '/') { href = $mmSite.getURL() + href; diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index 62f14561477..09dd660264c 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -353,6 +353,13 @@ p.item-text-wrap { height: 100%; border-radius: 50%; } +.avatar-round { + max-width: 40px; + max-height: 40px; + width: 100%; + height: 100%; + border-radius: 50%; +} // Split pane. .mm-split-pane { From 604edd5dd864ad52b736f0dbf08deb1556e17a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Thu, 6 Jul 2017 13:18:56 +0200 Subject: [PATCH 065/118] MOBILE-2127 data: Offline approve, disapprove and delete actions --- www/addons/mod/data/controllers/entry.js | 38 ++++++++++++++++--- www/addons/mod/data/controllers/index.js | 33 +++++++--------- www/addons/mod/data/directives/action.js | 13 ++++++- .../mod/data/fields/picture/template.html | 4 +- www/addons/mod/data/lang/en.json | 1 + www/addons/mod/data/services/helper.js | 37 ++++++++++++++++-- www/addons/mod/data/templates/action.html | 3 +- www/addons/mod/data/templates/entry.html | 8 +++- 8 files changed, 103 insertions(+), 34 deletions(-) diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 1288a632512..fd4ec958def 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -23,7 +23,7 @@ angular.module('mm.addons.mod_data') */ .controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, $mmEvents, $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged, - $ionicHistory) { + $ionicHistory, $mmaModDataOffline) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -31,7 +31,9 @@ angular.module('mm.addons.mod_data') page = $stateParams.page || false, data, entryChangedObserver, - scrollView; + scrollView, + access, + offlineActions = []; $scope.title = module.name; $scope.description = module.description; @@ -40,6 +42,7 @@ angular.module('mm.addons.mod_data') $scope.component = mmaModDataComponent; $scope.databaseLoaded = false; $scope.selectedGroup = $stateParams.group || 0; + $scope.entries = {}; function fetchEntryData(refresh) { return $mmaModData.getDatabase(courseId, module.id).then(function(databaseData) { @@ -49,12 +52,11 @@ angular.module('mm.addons.mod_data') $scope.description = data.intro || $scope.description; $scope.data = databaseData; - $scope.database = data; - return setEntryIdFromPage(data.id, page, $scope.selectedGroup).then(function() { return $mmaModData.getDatabaseAccessInformation(data.id); }); }).then(function(accessData) { + access = accessData; return $mmGroups.getActivityGroupInfo(data.coursemodule, accessData.canmanageentries).then(function(groupInfo) { $scope.groupInfo = groupInfo; @@ -72,11 +74,37 @@ angular.module('mm.addons.mod_data') } } + return $mmaModDataOffline.getEntryActions(data.id, entryId); + }); + }).then(function(actions) { + offlineActions = actions; + $scope.hasOffline = !!offlineActions.length; + + return $mmaModData.getFields(data.id).then(function(fieldsData) { + $scope.fields = {}; + angular.forEach(fieldsData, function(field) { + $scope.fields[field.id] = field; + }); + return $mmaModData.getEntry(data.id, entryId); }); }).then(function(entry) { + entry = entry.entry; $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - $scope.entryContents = entry.entryviewcontents; + + // Index contents by fieldid. + var contents = {}; + angular.forEach(entry.contents, function(field) { + contents[field.fieldid] = field; + }); + entry.contents = contents; + + $scope.entry = $mmaModDataHelper.applyOfflineActions(entry, offlineActions); + $scope.entries[entryId] = $scope.entry; + + var actions = $mmaModDataHelper.getActions(data, access, $scope.entry); + + $scope.entryRendered = $mmaModDataHelper.displayShowFields(data.singletemplate, $scope.fields, entryId, 'show', actions); return $mmaModDataHelper.getPageInfoByEntry(data.id, entryId, $scope.selectedGroup).then(function(result) { $scope.previousId = result.previousId; diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 10ff6c25bcb..ff7fac33e43 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -145,23 +145,15 @@ angular.module('mm.addons.mod_data') return $mmaModDataOffline.getDatabaseEntries(data.id).then(function(offlineEntries) { $scope.hasOffline = !!offlineEntries.length; - $scope.offlineEntries = {}; + $scope.offlineActions = {}; // Only show offline entries on first page. if ($scope.search.page == 0 && $scope.hasOffline) { angular.forEach(offlineEntries, function(entry) { - if (typeof $scope.offlineEntries[entry.entryid] == "undefined") { - $scope.offlineEntries[entry.entryid] = { - actions: [], - entry: false, - id: entry.entryid, - - }; - } - if (entry.action == 'add') { - $scope.offlineEntries[entry.entryid].entry = entry.fields; + if (typeof $scope.offlineActions[entry.entryid] == "undefined") { + $scope.offlineActions[entry.entryid] = []; } - $scope.offlineEntries[entry.entryid].actions.push(entry); + $scope.offlineActions[entry.entryid].push(entry); }); } }); @@ -185,7 +177,7 @@ angular.module('mm.addons.mod_data') } }).then(function(entries) { $scope.numEntries = entries && entries.totalcount; - $scope.isEmpty = $scope.numEntries <= 0 && $scope.offlineEntries.length <= 0; + $scope.isEmpty = $scope.numEntries <= 0 && $scope.offlineActions.length <= 0; $scope.hasNextPage = (($scope.search.page + 1) * mmaModDataPerPage) < $scope.numEntries; $scope.entriesRendered = ""; @@ -194,23 +186,24 @@ angular.module('mm.addons.mod_data') var entriesHTML = data.listtemplateheader; - $scope.entryContents = {}; - angular.forEach(entries.entries, function(entry) { + + // Index contents by fieldid. var contents = {}; angular.forEach(entry.contents, function(field) { contents[field.fieldid] = field; }); - $scope.entryContents[entry.id] = contents; + entry.contents = contents; + + if (typeof $scope.offlineActions[entry.id] != "undefined") { + entry = $mmaModDataHelper.applyOfflineActions(entry, $scope.offlineActions[entry.id]); + } $scope.entries[entry.id] = entry; var actions = $mmaModDataHelper.getActions(data, $scope.access, entry); entriesHTML += $mmaModDataHelper.displayShowFields(data.listtemplate, $scope.fields, entry.id, 'list', actions); - if (typeof $scope.offlineEntries[entry.id] != "undefined") { - $scope.offlineEntries[entry.id].entry = entry; - } }); entriesHTML += data.listtemplatefooter; @@ -363,7 +356,7 @@ angular.module('mm.addons.mod_data') // Refresh entry on change. entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { - if (data.id == eventData.dataId && $mmSite.getId() == eventData.siteId) { + if (data.id == eventData.dataId && siteId == eventData.siteId) { $scope.databaseLoaded = false; return fetchDatabaseData(true); } diff --git a/www/addons/mod/data/directives/action.js b/www/addons/mod/data/directives/action.js index 0500ce5008b..35772abe366 100644 --- a/www/addons/mod/data/directives/action.js +++ b/www/addons/mod/data/directives/action.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataField */ -.directive('mmaModDataAction', function($mmSite, $mmUser) { +.directive('mmaModDataAction', function($mmSite, $mmUser, $mmaModDataOffline, $mmSite, $mmEvents, mmaModDataEventEntryChanged) { return { restrict: 'E', priority: 100, @@ -39,6 +39,17 @@ angular.module('mm.addons.mod_data') scope.userpicture = profile.profileimageurl; }); } + + scope.undoDelete = function(entryId) { + var dataId = scope.database.id, + entryId = scope.entry.id; + return $mmaModDataOffline.getEntry(dataId, entryId, 'delete').then(function(entry) { + // Found. Just delete the action. + return $mmaModDataOffline.deleteEntry(dataId, entryId, 'delete'); + }).then(function() { + $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: dataId, entryId: entryId, siteId: $mmSite.getId()}); + }); + }; } }; }); diff --git a/www/addons/mod/data/fields/picture/template.html b/www/addons/mod/data/fields/picture/template.html index 89493cb4e80..908b6e8cca1 100644 --- a/www/addons/mod/data/fields/picture/template.html +++ b/www/addons/mod/data/fields/picture/template.html @@ -7,5 +7,5 @@ -{{title}} -{{title}} +{{title}} +{{title}} diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index 01844673606..02625ac2d3a 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -31,6 +31,7 @@ "recorddeleted": "Entry deleted", "recorddisapproved": "Entry unapproved", "resetsettings": "Reset filters", + "restore": "Restore", "search": "Search", "selectedrequired": "All selected required", "timeadded": "Time added", diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 67b88943f25..7dc10838bb5 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -44,7 +44,7 @@ angular.module('mm.addons.mod_data') * @return {String} Generated HTML. */ self.displayShowFields = function(template, fields, entryId, mode, actions) { - var replace; + var replace, render; // Replace the fields found on template. angular.forEach(fields, function(field) { @@ -53,14 +53,14 @@ angular.module('mm.addons.mod_data') replace = new RegExp(replace, 'g'); // Replace field by a generic directive. - var render = ''; + render = ''; template = template.replace(replace, render); }); angular.forEach(actions, function(enabled, action) { replace = new RegExp("##" + action + "##", 'g'); if (enabled) { - var render = ''; + render = ''; template = template.replace(replace, render); } else { template = template.replace(replace, ""); @@ -106,6 +106,35 @@ angular.module('mm.addons.mod_data') return replacements; }; + /** + * Returns the record with the offline actions applied. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#applyOfflineActions + * @param {Object} record Entry to modify. + * @param {Object} offlineActions Offline data with the actions done. + * @return {Object} Modified entry. + */ + self.applyOfflineActions = function(record, offlineActions) { + console.error(record, offlineActions); + + angular.forEach(offlineActions, function(action) { + switch (action.action) { + case 'approve': + record.approved = true; + break; + case 'disapprove': + record.approved = false; + break; + case 'delete': + record.deleted = true; + break; + } + }); + return record; + }; + /** * Displays Advanced Search Fields. * @@ -501,7 +530,7 @@ angular.module('mm.addons.mod_data') * @return {Promise} Containing and array of EntryId. */ self.getAllEntriesIds = function(dataId, groupId, siteId) { - return $mmaModData.fetchAllEntries(dataId, groupId, undefined, undefined, undefined, undefined, true, undefined, siteId) + return $mmaModData.fetchAllEntries(dataId, groupId, undefined, undefined, undefined, true, undefined, undefined, siteId) .then(function(entries) { return entries.map(function(entry) { return entry.id; diff --git a/www/addons/mod/data/templates/action.html b/www/addons/mod/data/templates/action.html index 63cde9545e0..5d2c9026dd3 100644 --- a/www/addons/mod/data/templates/action.html +++ b/www/addons/mod/data/templates/action.html @@ -1,6 +1,7 @@ - + + diff --git a/www/addons/mod/data/templates/entry.html b/www/addons/mod/data/templates/entry.html index 759db3c2cc0..e24fee064a2 100644 --- a/www/addons/mod/data/templates/entry.html +++ b/www/addons/mod/data/templates/entry.html @@ -9,6 +9,12 @@ + + +
    + {{ 'mm.core.hasdatatosync' | translate:{$a: moduleName} }} +
    +
    {{ 'mm.core.groupsseparate' | translate }} {{ 'mm.core.groupsvisible' | translate }} @@ -21,7 +27,7 @@ - {{ entryContents }} + {{ entryRendered }}
    From d60c32b231487f0fe3ba3ee2f17198acfabc7aa4 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 10 Jul 2017 15:12:00 +0200 Subject: [PATCH 066/118] MOBILE-2127 fs: Fix copy file in browser --- www/core/lib/fs.js | 44 +++++++++++++------------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/www/core/lib/fs.js b/www/core/lib/fs.js index fbd69d7f431..41898cfb023 100644 --- a/www/core/lib/fs.js +++ b/www/core/lib/fs.js @@ -765,41 +765,23 @@ angular.module('mm.core') from = self.removeStartingSlash(from.replace(basePath, '')); to = self.removeStartingSlash(to.replace(basePath, '')); + var fromFileAndDir = self.getFileAndDirectoryFromPath(from), + toFileAndDir = self.getFileAndDirectoryFromPath(to); + return self.init().then(function() { + if (toFileAndDir.directory) { + // Create the target directory if it doesn't exist. + return self.createDir(toFileAndDir.directory); + } + }).then(function() { if (isHTMLAPI) { - // In Cordova API we need to calculate the longest matching path to make it work. - // $cordovaFile.copyFile('a/', 'b/c.ext', 'a/', 'b/d.ext') doesn't work. - // cordovaFile.copyFile('a/b/', 'c.ext', 'a/b/', 'd.ext') works. - var commonPath = basePath, - dirsA = from.split('/'), - dirsB = to.split('/'); + // In HTML API, the file name cannot include a directory, otherwise it fails. + var fromDir = self.concatenatePaths(basePath, fromFileAndDir.directory), + toDir = self.concatenatePaths(basePath, toFileAndDir.directory); - for (var i = 0; i < dirsA.length; i++) { - var dir = dirsA[i]; - if (dirsB[i] === dir) { - // Found a common folder, add it to common path and remove it from each specific path. - dir = dir + '/'; - commonPath = self.concatenatePaths(commonPath, dir); - from = from.replace(dir, ''); - to = to.replace(dir, ''); - } else { - // Folder doesn't match, stop searching. - break; - } - } - - return $cordovaFile.copyFile(commonPath, from, commonPath, to); + return $cordovaFile.copyFile(fromDir, fromFileAndDir.name, toDir, toFileAndDir.name); } else { - // Check if to contains a directory. - var toFile = self.getFileAndDirectoryFromPath(to); - if (toFile.directory == '') { - return $cordovaFile.copyFile(basePath, from, basePath, to); - } else { - // Ensure directory is created. - return self.createDir(toFile.directory).then(function() { - return $cordovaFile.copyFile(basePath, from, basePath, to); - }); - } + return $cordovaFile.copyFile(basePath, from, basePath, to); } }); }; From d617e9b0018828c38de40a8b8fbd63beffc51814 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Mon, 10 Jul 2017 15:48:31 +0200 Subject: [PATCH 067/118] MOBILE-2127 fs: Fix missing parameter error in browser --- www/core/components/emulator/services/file.js | 10 +++++----- www/core/components/fileuploader/services/helper.js | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/www/core/components/emulator/services/file.js b/www/core/components/emulator/services/file.js index 4de40822e7e..01885a7f874 100644 --- a/www/core/components/emulator/services/file.js +++ b/www/core/components/emulator/services/file.js @@ -216,7 +216,7 @@ angular.module('mm.core.emulator') } } - successCallback(entries); + successCallback && successCallback(entries); } catch(ex) { errorCallback && errorCallback(ex); } @@ -259,7 +259,7 @@ angular.module('mm.core.emulator') $window.Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) { // Not supported. - errorCallback('Not supported'); + errorCallback && errorCallback('Not supported'); }; $window.Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { @@ -318,9 +318,9 @@ angular.module('mm.core.emulator') var removeFn = this.isDirectory ? fs.rmdir : fs.unlink; removeFn(this.fullPath, function(err) { if (err < 0) { - errorCallback(err); + errorCallback && errorCallback(err); } else { - successCallback(); + successCallback && successCallback(); } }); }; @@ -521,7 +521,7 @@ angular.module('mm.core.emulator') // Success, return the DirectoryEntry or FileEntry. function success() { var constructorFn = isDir ? DirectoryEntry : FileEntry; - successCallback(new constructorFn(filename, fileDirPath)); + successCallback && successCallback(new constructorFn(filename, fileDirPath)); } // Create the file/dir. diff --git a/www/core/components/fileuploader/services/helper.js b/www/core/components/fileuploader/services/helper.js index ac06e7d6d48..8e3bdc60cd6 100644 --- a/www/core/components/fileuploader/services/helper.js +++ b/www/core/components/fileuploader/services/helper.js @@ -69,7 +69,8 @@ angular.module('mm.core.fileuploader') // Delete the local files from the tmp folder. files.forEach(function(file) { if (!file.offline && file.remove) { - file.remove(); + // Pass an empty function to prevent missing parameter error. + file.remove(function() {}); } }); }; From cade2c20800fe9de74d4e59a818f769682f23f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 7 Jul 2017 13:07:12 +0200 Subject: [PATCH 068/118] MOBILE-2127 data: Edit entries in offline mode --- www/addons/mod/data/controllers/edit.js | 76 ++++++---- www/addons/mod/data/controllers/entry.js | 5 +- www/addons/mod/data/controllers/index.js | 24 ++-- .../mod/data/fields/checkbox/handler.js | 31 +++- www/addons/mod/data/fields/date/handler.js | 41 +++++- www/addons/mod/data/fields/file/directive.js | 2 +- www/addons/mod/data/fields/file/handler.js | 39 ++++- www/addons/mod/data/fields/file/template.html | 4 +- www/addons/mod/data/fields/latlong/handler.js | 45 +++++- www/addons/mod/data/fields/menu/handler.js | 35 ++++- .../mod/data/fields/multimenu/handler.js | 36 ++++- www/addons/mod/data/fields/number/handler.js | 35 ++++- .../mod/data/fields/picture/directive.js | 34 +++-- www/addons/mod/data/fields/picture/handler.js | 55 +++++++- .../mod/data/fields/picture/template.html | 2 +- .../mod/data/fields/radiobutton/handler.js | 35 ++++- www/addons/mod/data/fields/text/handler.js | 35 ++++- .../mod/data/fields/textarea/handler.js | 53 ++++++- www/addons/mod/data/fields/url/handler.js | 35 ++++- www/addons/mod/data/lang/en.json | 4 +- www/addons/mod/data/scss/styles.scss | 7 +- www/addons/mod/data/services/data.js | 121 +++++++++++++++- www/addons/mod/data/services/data_offline.js | 5 +- .../mod/data/services/fieldsdelegate.js | 57 ++++++++ www/addons/mod/data/services/helper.js | 133 ++++++++++++++++-- www/core/lib/filesession.js | 1 + www/core/lib/fs.js | 2 +- 27 files changed, 853 insertions(+), 99 deletions(-) diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index b9f52d71b5d..b2ed0bad570 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -23,20 +23,23 @@ angular.module('mm.addons.mod_data') */ .controller('mmaModDataEditCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $q, $mmUtil, $mmaModDataHelper, $mmGroups, $ionicHistory, $mmEvents, mmaModDataEventEntryChanged, $mmSite, $translate, $mmFileUploaderHelper, $timeout, - $ionicScrollDelegate) { + $ionicScrollDelegate, $mmApp, $mmaModDataOffline) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, data, scrollView, + offlineActions, siteId = $mmSite.getId(), - entryId = $stateParams.entryid || false; + offline = !$mmApp.isOnline(), + entryId = $stateParams.entryid || false, + editing = entryId > 0, + entry; $scope.title = module.name; $scope.component = mmaModDataComponent; $scope.databaseLoaded = false; $scope.selectedGroup = $stateParams.group || 0; - $scope.entryContents = {}; // Block leaving the view, we want to show a confirm to the user if there's unsaved data. $mmUtil.blockLeaveView($scope, cancel); @@ -53,16 +56,8 @@ angular.module('mm.addons.mod_data') }).then(function(accessData) { $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - if (entryId) { - // Editing, group is set. - return $mmaModData.getEntry(data.id, entryId).then(function(entryData) { - $scope.entryContents = {}; - angular.forEach(entryData.entry.contents, function(field) { - $scope.entryContents[field.fieldid] = field; - }); - }); - } else { - // Adding, get groups. + if (!editing) { + // Adding, get groups because it's not set. return $mmGroups.getActivityGroupInfo(data.coursemodule, accessData.canmanageentries).then(function(groupInfo) { $scope.groupInfo = groupInfo; @@ -82,14 +77,37 @@ angular.module('mm.addons.mod_data') }); } }).then(function() { + return $mmaModDataOffline.getEntryActions(data.id, entryId); + }).then(function(actions) { + offlineActions = actions; + return $mmaModData.getFields(data.id); - }).then(function(fields) { + }).then(function(fieldsData) { $scope.fields = {}; - angular.forEach(fields, function(field) { + angular.forEach(fieldsData, function(field) { $scope.fields[field.id] = field; }); - $scope.editForm = $mmaModDataHelper.displayEditFields(data.addtemplate, $scope.fields, $scope.entryContents); + if (editing) { + return $mmaModData.getEntry(data.id, entryId); + } + }).then(function(entryData) { + if (entryData) { + entry = entryData.entry; + + // Index contents by fieldid. + var contents = {}; + angular.forEach(entry.contents, function(field) { + contents[field.fieldid] = field; + }); + entry.contents = contents; + } + + return $mmaModDataHelper.applyOfflineActions(entry, offlineActions, $scope.fields); + }).then(function(entryData) { + $scope.entry = entryData; + + $scope.editForm = $mmaModDataHelper.displayEditFields(data.addtemplate, $scope.fields, entryData.contents); }).catch(function(message) { $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); return $q.reject(); @@ -109,7 +127,7 @@ angular.module('mm.addons.mod_data') // Saves data. $scope.save = function() { return $mmaModDataHelper.hasEditDataChanged(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, - $scope.entryContents).then(function(changed) { + $scope.entry.contents).then(function(changed) { if (!changed) { if (entryId) { @@ -122,14 +140,24 @@ angular.module('mm.addons.mod_data') var modal = $mmUtil.showModalLoading('mm.core.sending', true); - return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, - $scope.entryContents).then(function(editData) { + return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, entryId, + $scope.entry.contents, offline).catch(function(e) { + if (!offline) { + // Cannot submit in online, prepare for offline usage. + offline = true; + + return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + entryId, $scope.entry.contents, offline); + } + + return $q.reject(e); + }).then(function(editData) { if (editData.length > 0) { if (entryId) { - return $mmaModData.editEntry(entryId, editData); + return $mmaModData.editEntry(data.id, entryId, courseId, editData, $scope.fields, undefined, offline); } - return $mmaModData.addEntry(data.id, editData, $scope.selectedGroup); + return $mmaModData.addEntry(data.id, editData, $scope.selectedGroup, undefined, offline); } }).then(function(result) { if (!result) { @@ -186,7 +214,7 @@ angular.module('mm.addons.mod_data') function returnToEntryList() { return $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, - $scope.entryContents).then(function(files) { + $scope.entry.contents).then(function(files) { $mmFileUploaderHelper.clearTmpFiles(files); }).finally(function() { // Go back to discussions list. @@ -197,7 +225,7 @@ angular.module('mm.addons.mod_data') // Just ask to confirm the lost of data. function cancel() { return $mmaModDataHelper.hasEditDataChanged(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, - $scope.entryContents).then(function(changed) { + $scope.entry.contents).then(function(changed) { if (!changed) { return $q.when(); } @@ -206,7 +234,7 @@ angular.module('mm.addons.mod_data') }).then(function() { // Delete the local files from the tmp folder. return $mmaModDataHelper.getEditTmpFiles(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, - $scope.entryContents).then(function(files) { + $scope.entry.contents).then(function(files) { $mmFileUploaderHelper.clearTmpFiles(files); }); }); diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index fd4ec958def..18afe166244 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -99,7 +99,10 @@ angular.module('mm.addons.mod_data') }); entry.contents = contents; - $scope.entry = $mmaModDataHelper.applyOfflineActions(entry, offlineActions); + return $mmaModDataHelper.applyOfflineActions(entry, offlineActions, $scope.fields); + }).then(function(entryData) { + $scope.entry = entryData; + $scope.entries[entryId] = $scope.entry; var actions = $mmaModDataHelper.getActions(data, access, $scope.entry); diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index ff7fac33e43..1e09e2d5f81 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -184,10 +184,9 @@ angular.module('mm.addons.mod_data') if (!$scope.isEmpty) { $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - var entriesHTML = data.listtemplateheader; + var promises = []; angular.forEach(entries.entries, function(entry) { - // Index contents by fieldid. var contents = {}; angular.forEach(entry.contents, function(field) { @@ -196,19 +195,26 @@ angular.module('mm.addons.mod_data') entry.contents = contents; if (typeof $scope.offlineActions[entry.id] != "undefined") { - entry = $mmaModDataHelper.applyOfflineActions(entry, $scope.offlineActions[entry.id]); + promises.push($mmaModDataHelper.applyOfflineActions(entry, $scope.offlineActions[entry.id], $scope.fields)); + } else { + promises.push($q.when(entry)); } + }); - $scope.entries[entry.id] = entry; + return $q.all(promises).then(function(entries) { + var entriesHTML = data.listtemplateheader; - var actions = $mmaModDataHelper.getActions(data, $scope.access, entry); + angular.forEach(entries, function(entry) { + $scope.entries[entry.id] = entry; - entriesHTML += $mmaModDataHelper.displayShowFields(data.listtemplate, $scope.fields, entry.id, 'list', actions); - }); + var actions = $mmaModDataHelper.getActions(data, $scope.access, entry); - entriesHTML += data.listtemplatefooter; + entriesHTML += $mmaModDataHelper.displayShowFields(data.listtemplate, $scope.fields, entry.id, 'list', actions); + }); + entriesHTML += data.listtemplatefooter; - $scope.entriesRendered = entriesHTML; + $scope.entriesRendered = entriesHTML; + }); } else if (!$scope.search.searching) { $scope.canSearch = false; } diff --git a/www/addons/mod/data/fields/checkbox/handler.js b/www/addons/mod/data/fields/checkbox/handler.js index e2fd082c7c8..0bc19b82fb2 100644 --- a/www/addons/mod/data/fields/checkbox/handler.js +++ b/www/addons/mod/data/fields/checkbox/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldCheckboxHandler */ -.factory('$mmaModDataFieldCheckboxHandler', function() { +.factory('$mmaModDataFieldCheckboxHandler', function($translate) { var self = {}; @@ -109,6 +109,35 @@ angular.module('mm.addons.mod_data') return checkboxes.join("##") != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = (offlineContent[''] && offlineContent[''].join("##")) || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/date/handler.js b/www/addons/mod/data/fields/date/handler.js index 0d3c9f5e826..d71db316ded 100644 --- a/www/addons/mod/data/fields/date/handler.js +++ b/www/addons/mod/data/fields/date/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldDateHandler */ -.factory('$mmaModDataFieldDateHandler', function() { +.factory('$mmaModDataFieldDateHandler', function($translate) { var self = {}; @@ -109,13 +109,48 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content && + input = inputData[fieldName] || ""; + + originalFieldData = (originalFieldData && originalFieldData.content && new Date(originalFieldData.content * 1000).toISOString().substr(0, 10)) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && + (!inputData || inputData.length < 2 || !inputData[0].value || !inputData[1].value || !inputData[2].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + var date = Date.UTC(offlineContent['year'] || "", offlineContent['month'] ? offlineContent['month'] - 1 : "", + offlineContent['day'] || ""); + date = Math.floor(date / 1000); + + originalContent.content = date || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/file/directive.js b/www/addons/mod/data/fields/file/directive.js index a167fc85690..149b59fcce7 100644 --- a/www/addons/mod/data/fields/file/directive.js +++ b/www/addons/mod/data/fields/file/directive.js @@ -32,7 +32,7 @@ angular.module('mm.addons.mod_data') scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; - scope.files = angular.copy(scope.value && scope.value.files) || []; + scope.files = (scope.value && scope.value.files) || []; // Reduce to first element. if (scope.files.length > 0) { diff --git a/www/addons/mod/data/fields/file/handler.js b/www/addons/mod/data/fields/file/handler.js index c1482b1ce21..e026a464613 100644 --- a/www/addons/mod/data/fields/file/handler.js +++ b/www/addons/mod/data/fields/file/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldFileHandler */ -.factory('$mmaModDataFieldFileHandler', function($mmFileSession, mmaModDataComponent, $mmFileUploaderHelper) { +.factory('$mmaModDataFieldFileHandler', function($mmFileSession, mmaModDataComponent, $mmFileUploaderHelper, $translate) { var self = {}; @@ -90,6 +90,43 @@ angular.module('mm.addons.mod_data') return $mmFileUploaderHelper.areFileListDifferent(files, originalFiles); }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @param {Array} offlineFiles Array with all the offline files in the field. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent, offlineFiles) { + if (offlineContent && offlineContent.file && offlineContent.file.offline > 0) { + originalContent.content = offlineFiles[0].filename; + originalContent.files = [offlineFiles[0]]; + } else if (offlineContent && offlineContent.file && offlineContent.file.online && offlineContent.file.online.length > 0) { + originalContent.content = offlineContent.file.online[0].filename; + originalContent.files = [offlineContent.file.online[0]]; + } + + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/file/template.html b/www/addons/mod/data/fields/file/template.html index 1facd582efa..713ac633e29 100644 --- a/www/addons/mod/data/fields/file/template.html +++ b/www/addons/mod/data/fields/file/template.html @@ -1,10 +1,10 @@ {{ error }} - +
    - +
    \ No newline at end of file diff --git a/www/addons/mod/data/fields/latlong/handler.js b/www/addons/mod/data/fields/latlong/handler.js index 5daf7f39263..bcaa7822cae 100644 --- a/www/addons/mod/data/fields/latlong/handler.js +++ b/www/addons/mod/data/fields/latlong/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldLatlongHandler */ -.factory('$mmaModDataFieldLatlongHandler', function() { +.factory('$mmaModDataFieldLatlongHandler', function($translate) { var self = {}; @@ -90,6 +90,49 @@ angular.module('mm.addons.mod_data') return lat != originalLat || long != originalLong; }; + + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + var valuecount = 0; + + // The lat long class has two values that need to be checked. + angular.forEach(inputData, function(value) { + if (typeof value.value != "undefined" && value.value != "") { + valuecount++; + } + }); + + // If we get here then only one field has been filled in. + if (valuecount == 1) { + return $translate.instant('mma.mod_data.latlongboth'); + } else if (field.required && valuecount == 0) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[0] || ""; + originalContent.content1 = offlineContent[1] || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/menu/handler.js b/www/addons/mod/data/fields/menu/handler.js index eaea337eaa1..22c3a4e1f41 100644 --- a/www/addons/mod/data/fields/menu/handler.js +++ b/www/addons/mod/data/fields/menu/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldMenuHandler */ -.factory('$mmaModDataFieldMenuHandler', function() { +.factory('$mmaModDataFieldMenuHandler', function($translate) { var self = {}; @@ -72,12 +72,41 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[''] || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/multimenu/handler.js b/www/addons/mod/data/fields/multimenu/handler.js index 338cd3cc3fc..209aad1c94a 100644 --- a/www/addons/mod/data/fields/multimenu/handler.js +++ b/www/addons/mod/data/fields/multimenu/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldMultimenuHandler */ -.factory('$mmaModDataFieldMultimenuHandler', function() { +.factory('$mmaModDataFieldMultimenuHandler', function($translate) { var self = {}; @@ -91,12 +91,42 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = (offlineContent[''] && offlineContent[''].join("###")) || ""; + return originalContent; + }; + + return self; }) diff --git a/www/addons/mod/data/fields/number/handler.js b/www/addons/mod/data/fields/number/handler.js index ecf5fafca93..1aed84480cc 100644 --- a/www/addons/mod/data/fields/number/handler.js +++ b/www/addons/mod/data/fields/number/handler.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldNumberHandler */ -.factory('$mmaModDataFieldNumberHandler', function() { +.factory('$mmaModDataFieldNumberHandler', function($translate) { var self = {}; @@ -72,12 +72,41 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || inputData[0].value == "")) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[''] || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/picture/directive.js b/www/addons/mod/data/fields/picture/directive.js index 9648787bfc4..7c81317bfa2 100644 --- a/www/addons/mod/data/fields/picture/directive.js +++ b/www/addons/mod/data/fields/picture/directive.js @@ -22,29 +22,40 @@ angular.module('mm.addons.mod_data') * @name mmaModDataFieldPicture */ .directive('mmaModDataFieldPicture', function(mmaModDataComponent, $mmFileSession) { + + // Find file in a list. + function findFile(files, filenameSeek) { + for (var x in files) { + if (files[x].filename == filenameSeek) { + return files[x]; + } + } + return false; + } + return { restrict: 'A', priority: 100, templateUrl: 'addons/mod/data/fields/picture/template.html', link: function(scope) { if (scope.mode != 'search') { - var files = angular.copy(scope.value && scope.value.files) || []; + var files = scope.value && scope.value.files || []; scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; - scope.image = false; // Get image or thumb. if (files.length > 0) { var filenameSeek = scope.mode == 'list' ? 'thumb_' + scope.value.content : scope.value.content; - for (var x in files) { - if (files[x].filename == filenameSeek) { - scope.image = angular.copy(files[x]); - break; - } + scope.image = findFile(files, filenameSeek); + + if (!scope.image && scope.mode == 'list') { + scope.image = findFile(files, scope.value.content); } + scope.files = [scope.image]; } else { + scope.image = false; scope.files = []; } @@ -55,7 +66,14 @@ angular.module('mm.addons.mod_data') } else { scope.entryId = (scope.value && scope.value.recordid) || false; scope.title = (scope.value && scope.value.content1) || ""; - scope.imageUrl = (scope.image && scope.image.fileurl) || false; + scope.imageUrl = false; + if (scope.image) { + if (scope.image.offline) { + scope.imageUrl = (scope.image && scope.image.toURL()) || false; + } else { + scope.imageUrl = (scope.image && scope.image.fileurl) || false; + } + } scope.width = scope.field.param1 || ""; scope.height = scope.field.param2 || ""; } diff --git a/www/addons/mod/data/fields/picture/handler.js b/www/addons/mod/data/fields/picture/handler.js index a62bac04be4..2d933e07e11 100644 --- a/www/addons/mod/data/fields/picture/handler.js +++ b/www/addons/mod/data/fields/picture/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldPictureHandler */ -.factory('$mmaModDataFieldPictureHandler', function($mmFileSession, mmaModDataComponent, $mmFileUploaderHelper) { +.factory('$mmaModDataFieldPictureHandler', function($mmFileSession, mmaModDataComponent, $mmFileUploaderHelper, $translate) { var self = {}; @@ -102,7 +102,7 @@ angular.module('mm.addons.mod_data') var filenameSeek = (originalFieldData && originalFieldData.content) || ""; for (var x in originalFiles) { if (originalFiles[x].filename == filenameSeek) { - originalFiles = angular.copy(originalFiles[x]); + originalFiles = originalFiles[x]; break; } } @@ -114,6 +114,57 @@ angular.module('mm.addons.mod_data') return altText != originalAltText || $mmFileUploaderHelper.areFileListDifferent(files, originalFiles); }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required) { + if (!inputData || !inputData.length) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + var found = false; + for (var x in inputData) { + if (typeof inputData[x].subfield !="undefined" && inputData[x].subfield == 'file') { + found = !!inputData[x].value; + break; + } + } + + if (!found) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @param {Array} offlineFiles Array with all the offline files in the field. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent, offlineFiles) { + if (offlineContent && offlineContent.file && offlineContent.file.offline > 0) { + originalContent.content = offlineFiles[0].filename; + originalContent.files = [offlineFiles[0]]; + } else if (offlineContent && offlineContent.file && offlineContent.file.online && offlineContent.file.online.length > 0) { + originalContent.content = offlineContent.file.online[0].filename; + originalContent.files = [offlineContent.file.online[0]]; + } + + originalContent.content1 = offlineContent.alttext || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/picture/template.html b/www/addons/mod/data/fields/picture/template.html index 908b6e8cca1..9b92ee53e3b 100644 --- a/www/addons/mod/data/fields/picture/template.html +++ b/www/addons/mod/data/fields/picture/template.html @@ -1,7 +1,7 @@ {{ error }} - + {{ 'mma.mod_data.alttext' | translate }} diff --git a/www/addons/mod/data/fields/radiobutton/handler.js b/www/addons/mod/data/fields/radiobutton/handler.js index f20c02d307f..29974029339 100644 --- a/www/addons/mod/data/fields/radiobutton/handler.js +++ b/www/addons/mod/data/fields/radiobutton/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldRadiobuttonHandler */ -.factory('$mmaModDataFieldRadiobuttonHandler', function() { +.factory('$mmaModDataFieldRadiobuttonHandler', function($translate) { var self = {}; @@ -72,12 +72,41 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[''] || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/text/handler.js b/www/addons/mod/data/fields/text/handler.js index e679ed58422..a6b0db201e8 100644 --- a/www/addons/mod/data/fields/text/handler.js +++ b/www/addons/mod/data/fields/text/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldTextHandler */ -.factory('$mmaModDataFieldTextHandler', function() { +.factory('$mmaModDataFieldTextHandler', function($translate) { var self = {}; @@ -71,12 +71,41 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[''] || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/textarea/handler.js b/www/addons/mod/data/fields/textarea/handler.js index 96017e9b8b3..3f6f49081fe 100644 --- a/www/addons/mod/data/fields/textarea/handler.js +++ b/www/addons/mod/data/fields/textarea/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldTextareaHandler */ -.factory('$mmaModDataFieldTextareaHandler', function($mmText, $mmUtil) { +.factory('$mmaModDataFieldTextareaHandler', function($mmText, $mmUtil, $translate) { var self = {}; @@ -105,12 +105,59 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required) { + if (!inputData || !inputData.length) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + var found = false; + for (var x in inputData) { + if (!inputData[x].subfield) { + found = inputData[x].value; + break; + } + } + + if (!found) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[''] || ""; + if (originalContent.content.length > 0 && originalContent.files.length > 0) { + // Take the original files since we cannot edit them on the app. + originalContent.content = $mmText.replacePluginfileUrls(originalContent.content, originalContent.files); + } + + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/fields/url/handler.js b/www/addons/mod/data/fields/url/handler.js index b4fbf6539b2..98fc6a168b9 100644 --- a/www/addons/mod/data/fields/url/handler.js +++ b/www/addons/mod/data/fields/url/handler.js @@ -21,7 +21,7 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataFieldUrlHandler */ -.factory('$mmaModDataFieldUrlHandler', function() { +.factory('$mmaModDataFieldUrlHandler', function($translate) { var self = {}; @@ -71,12 +71,41 @@ angular.module('mm.addons.mod_data') */ self.hasFieldDataChanged = function(field, inputData, originalFieldData) { var fieldName = 'f_' + field.id, - input = inputData[fieldName] || "", - originalFieldData = (originalFieldData && originalFieldData.content) || ""; + input = inputData[fieldName] || ""; + originalFieldData = (originalFieldData && originalFieldData.content) || ""; return input != originalFieldData; }; + /** + * Check and get field requeriments. + * + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + if (field.required && (!inputData || !inputData.length || !inputData[0].value)) { + return $translate.instant('mma.mod_data.errormustsupplyvalue'); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @return {Object} Data overriden + */ + self.overrideData = function(originalContent, offlineContent) { + originalContent.content = offlineContent[''] || ""; + return originalContent; + }; + return self; }) diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index 02625ac2d3a..b1931a4b23f 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -17,8 +17,10 @@ "entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.", "errorapproving": "Error approving or unapproving entry.", "errordeleting": "Error deleting the entry.", + "errormustsupplyvalue": "You must supply a value here.", "expired": "Sorry, this activity closed on {{$a}} and is no longer available", "fields": "Fields", + "latlongboth": "Both latitude and longitude are required.", "menuchoose": "Choose...", "more": "More", "nomatch": "No matching entries found!", @@ -37,4 +39,4 @@ "timeadded": "Time added", "timemodified": "Time modified", "usedate": "Include in search." -} \ No newline at end of file +} diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss index 61002f7dacb..d1a9230dbce 100644 --- a/www/addons/mod/data/scss/styles.scss +++ b/www/addons/mod/data/scss/styles.scss @@ -8,13 +8,18 @@ .mm-data-contents { overflow: visible; white-space: normal; - word-break: break-all; + word-break: break-word; padding: $item-padding; background-color: white; border-top-width: $item-border-width; border-bottom-width: $item-border-width; border-style: solid; border-color: $item-default-border; + + td { + padding-left: 2px; + padding-right: 2px; + } } #mma-mod_data-advanced-search-form, diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index d088c2ba4d1..b03e5182354 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModData */ .factory('$mmaModData', function($q, $mmSitesManager, mmaModDataComponent, $mmFilepool, $mmSite, mmaModDataPerPage, $mmApp, $mmUtil, - $mmaModDataOffline) { + $mmaModDataOffline, $mmaModDataFieldsDelegate) { var self = {}; /** @@ -413,7 +413,7 @@ angular.module('mm.addons.mod_data') // Get if the opposite action is not synced. var action = approve ? 'disapprove' : 'approve'; - return $mmaModDataOffline.getEntry(dataId, entryId, action, siteId).then(function(entry) { + return $mmaModDataOffline.getEntry(dataId, entryId, action, siteId).then(function() { // Found. Just delete the action. return $mmaModDataOffline.deleteEntry(dataId, entryId, action, siteId); }).catch(function() { @@ -446,7 +446,7 @@ angular.module('mm.addons.mod_data') * * @module mm.addons.mod_data * @ngdoc method - * @name $mmaModData#approveEntry + * @name $mmaModData#approveEntryOnline * @param {Number} entryId Entry ID. * @param {Boolean} approve Whether to approve (true) or unapprove the entry. * @return {Promise} Promise resolved when the action is done. Rejected with object containing @@ -532,7 +532,7 @@ angular.module('mm.addons.mod_data') * * @module mm.addons.mod_data * @ngdoc method - * @name $mmaModData#deleteEntry + * @name $mmaModData#deleteEntryOnline * @param {Number} entryId Entry ID. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when the action is done. Rejected with object containing @@ -586,19 +586,128 @@ angular.module('mm.addons.mod_data') * @module mm.addons.mod_data * @ngdoc method * @name $mmaModData#editEntry + * @param {Number} dataId Database ID. + * @param {Number} entryId Entry ID. + * @param {Number} courseId Entry ID. + * @param {Object} fields The fields that define the contents; + * @param {Object} contents The contents data to be updated. + * @param {String} [siteId] Site ID. If not defined, current site. + * @param {Boolean} forceOffline Force editing entry in offline. + * @return {Promise} Promise resolved when the action is done. + */ + self.editEntry = function(dataId, entryId, courseId, contents, fields, siteId, forceOffline) { + siteId = siteId || $mmSite.getId(); + var justAdded = false, + groupId; + + if (!$mmApp.isOnline() || forceOffline) { + var notifications = checkFields(fields, contents); + if (notifications) { + return { + fieldnotifications: notifications + }; + } + } + + // Get if the opposite action is not synced. + return $mmaModDataOffline.getEntryActions(dataId, entryId, siteId).then(function(entries) { + if (entries && entries.length) { + // Found. Delete add and edit actions first. + var proms = []; + angular.forEach(entries, function(entry) { + if (entry.action == 'add') { + justAdded = true; + groupId = entry.groupid; + proms.push($mmaModDataOffline.deleteEntry(dataId, entryId, entry.action, siteId)); + } else if (entry.action == 'edit') { + proms.push($mmaModDataOffline.deleteEntry(dataId, entryId, entry.action, siteId)); + } + }); + + return $q.all(proms); + } + }).then(function(){ + if (justAdded) { + // The field was added offline, add again and stop. + return self.addEntry(dataId, contents, groupId, siteId, forceOffline); + } + + if (!$mmApp.isOnline() || forceOffline) { + // App is offline, store the action. + return storeOffline(); + } + + return self.editEntryOnline(entryId, contents, siteId).catch(function(error) { + if (error && !error.wserror) { + // Couldn't connect to server, store in offline. + return storeOffline(); + } else { + // The WebService has thrown an error or offline not supported, reject. + return $q.reject(error.error); + } + }); + }); + + // Convenience function to store a data to be synchronized later. + function storeOffline() { + return $mmaModDataOffline.saveEntry(dataId, entryId, 'edit', courseId, contents, undefined, siteId).then(function() { + return { + updated: true + }; + }); + } + }; + + function checkFields(fields, contents) { + var notifications = [], + notification, + contentsIndexed = {}; + + angular.forEach(contents, function(content) { + if (typeof contentsIndexed[content.fieldid] == "undefined") { + contentsIndexed[content.fieldid] = []; + } + contentsIndexed[content.fieldid].push(content); + }); + + // App is offline, check required fields. + angular.forEach(fields, function(field) { + notification = $mmaModDataFieldsDelegate.getFieldsNotifications(field, contentsIndexed[field.id]); + if (notification) { + notifications.push({ + fieldname: field.name, + notification: notification + }); + } + }); + + return notifications.length ? notifications : false; + } + + /** + * Updates an existing entry. It does not cache calls. It will fail if offline or cannot connect. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#editEntryOnline * @param {Number} entryId Entry ID. * @param {Object} data The fields data to be updated. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when the action is done. */ - self.editEntry = function(entryId, data, siteId) { + self.editEntryOnline = function(entryId, data, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { var params = { entryid: entryId, data: data }; - return site.write('mod_data_update_entry', params); + return site.write('mod_data_update_entry', params).catch(function(error) { + return $q.reject({ + error: error, + wserror: $mmUtil.isWebServiceError(error) + }); + }); }); }; diff --git a/www/addons/mod/data/services/data_offline.js b/www/addons/mod/data/services/data_offline.js index c404cc7a9b4..cdbe21b4f00 100644 --- a/www/addons/mod/data/services/data_offline.js +++ b/www/addons/mod/data/services/data_offline.js @@ -224,12 +224,13 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataOffline#getEntryFolder * @param {Number} dataId Database ID. * @param {Number} entryId The ID of the entry. + * @param {Number} fieldId Field ID. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved with the path. */ - self.getEntryFolder = function(dataId, entryId, siteId) { + self.getEntryFieldFolder = function(dataId, entryId, fieldId ,siteId) { return self.getDatabaseFolder(dataId, siteId).then(function(folderPath) { - return $mmFS.concatenatePaths(folderPath, 'entry_' + entryId); + return $mmFS.concatenatePaths(folderPath, 'entry_' + entryId + '_' + fieldId); }); }; diff --git a/www/addons/mod/data/services/fieldsdelegate.js b/www/addons/mod/data/services/fieldsdelegate.js index 234f019219e..e8cff5b87d7 100644 --- a/www/addons/mod/data/services/fieldsdelegate.js +++ b/www/addons/mod/data/services/fieldsdelegate.js @@ -122,6 +122,20 @@ angular.module('mm.addons.mod_data') return []; }; + /** + * Check if field type manage files or not. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#hasFiles + * @param {Object} field Defines the field to be checked. + * @return {Boolean} If the field type manages files. + */ + self.hasFiles = function(field) { + var handler = self.getPluginHandler(field.type); + return handler && handler.getFieldEditFiles; + }; + /** * Check if the data has changed for a certain field. * @@ -143,6 +157,44 @@ angular.module('mm.addons.mod_data') return $q.when(); }; + /** + * Check and get field requeriments. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#getFieldsNotification + * @param {Object} field Defines the field to be rendered. + * @param {Object} inputData Data entered in the edit form. + * @return {String} String with the notification or false. + */ + self.getFieldsNotifications = function(field, inputData) { + var handler = self.getPluginHandler(field.type); + if (handler && handler.getFieldsNotifications) { + return handler.getFieldsNotifications(field, inputData); + } + return false; + }; + + /** + * Override field content data with offline submission. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataFieldsDelegate#overrideData + * @param {Object} field Defines the field to be rendered. + * @param {Object} originalContent Original data to be overriden. + * @param {Array} offlineContent Array with all the offline data to override. + * @param {Array} offlineFiles Array with all the offline files in the field. + * @return {Object} Data overriden + */ + self.overrideData = function(field, originalContent, offlineContent, offlineFiles) { + var handler = self.getPluginHandler(field.type); + if (handler && handler.overrideData) { + return handler.overrideData(originalContent, offlineContent, offlineFiles); + } + return originalContent; + }; + /** * Get the directive to use for a certain feedback plugin. * @@ -197,6 +249,11 @@ angular.module('mm.addons.mod_data') * Should return if field has been changed by the user. * - getFieldEditFiles(field, inputData, originalFieldData) Optional. * Should return an array of files stored in temp store. + * - getFieldsNotifications(field, inputData) Optional. + * Should return an array of notifications before sending data. + * - overrideData(originalContent, offlineContent, offlineFiles) Optional. + * Should return and object with the overriden content from offline + * submission. */ self.registerHandler = function(addon, pluginType, handler) { if (typeof handlers[pluginType] !== 'undefined') { diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 7dc10838bb5..350d22e2f08 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -21,7 +21,8 @@ angular.module('mm.addons.mod_data') * @ngdoc service * @name $mmaModDataHelper */ -.factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q, mmaModDataComponent, $mmFileUploader) { +.factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q, mmaModDataComponent, $mmFileUploader, $mmSite, + $mmaModDataOffline, $mmFS, $mmFileUploaderHelper) { var self = { searchOther: { @@ -44,6 +45,10 @@ angular.module('mm.addons.mod_data') * @return {String} Generated HTML. */ self.displayShowFields = function(template, fields, entryId, mode, actions) { + if (!template) { + return ""; + } + var replace, render; // Replace the fields found on template. @@ -114,11 +119,11 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataHelper#applyOfflineActions * @param {Object} record Entry to modify. * @param {Object} offlineActions Offline data with the actions done. + * @param {Object} fields Entry defined fields indexed by fieldid. * @return {Object} Modified entry. */ - self.applyOfflineActions = function(record, offlineActions) { - console.error(record, offlineActions); - + self.applyOfflineActions = function(record, offlineActions, fields) { + var promises = []; angular.forEach(offlineActions, function(action) { switch (action.action) { case 'approve': @@ -130,9 +135,38 @@ angular.module('mm.addons.mod_data') case 'delete': record.deleted = true; break; + case 'edit': + var offlineContents = {}; + angular.forEach(action.fields, function(offlineContent) { + if (typeof offlineContents[offlineContent.fieldid] == "undefined") { + offlineContents[offlineContent.fieldid] = {}; + } + + if (offlineContent.subfield) { + offlineContents[offlineContent.fieldid][offlineContent.subfield] = JSON.parse(offlineContent.value); + } else { + offlineContents[offlineContent.fieldid][''] = JSON.parse(offlineContent.value); + } + }); + + // Override field contents. + angular.forEach(fields, function(field) { + if ($mmaModDataFieldsDelegate.hasFiles(field)) { + promises.push(self.getStoredFiles(record.dataid, record.id, field.id).then(function(offlineFiles) { + record.contents[field.id] = $mmaModDataFieldsDelegate.overrideData(field, record.contents[field.id], + offlineContents[field.id], offlineFiles); + })); + } else { + record.contents[field.id] = $mmaModDataFieldsDelegate.overrideData(field, record.contents[field.id], + offlineContents[field.id]); + } + }); + break; } }); - return record; + return $q.all(promises).then(function() { + return record; + }); }; /** @@ -146,6 +180,10 @@ angular.module('mm.addons.mod_data') * @return {String} Generated HTML. */ self.displayAdvancedSearchFields = function(template, fields) { + if (!template) { + return ""; + } + var replace; // Replace the fields found on template. @@ -261,6 +299,10 @@ angular.module('mm.addons.mod_data') * @return {String} Generated HTML. */ self.displayEditFields = function(template, fields) { + if (!template) { + return ""; + } + var replace; // Replace the fields found on template. @@ -270,7 +312,7 @@ angular.module('mm.addons.mod_data') replace = new RegExp(replace, 'g'); // Replace field by a generic directive. - var render = ''; + var render = ''; template = template.replace(replace, render); // Replace the field id tag. @@ -294,14 +336,19 @@ angular.module('mm.addons.mod_data') * @param {Object} form Form (DOM element). * @param {Array} fields Fields that defines every content in the entry. * @param {Number} [dataId] Database Id. If set, files will be uploaded and itemId set. - * @param {Object} entryContents Original entry contents indexed by field id. + * @param {Number} entryId Entry Id. + * @param {Object} entryContents Original entry contents indexed by field id. + * @param {Boolean} offline True to prepare the data for an offline uploading, false otherwise. + * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} That contains object with the answers. */ - self.getEditDataFromForm = function(form, fields, dataId, entryContents) { + self.getEditDataFromForm = function(form, fields, dataId, entryId, entryContents, offline, siteId) { if (!form || !form.elements) { return $q.when({}); } + siteId = siteId || $mmSite.getId(); + var formData = getFormData(form); // Filter and translate fields to each field plugin. @@ -318,7 +365,7 @@ angular.module('mm.addons.mod_data') // Upload Files if asked. if (dataId && data.files) { - dataProm = self.uploadOrStoreFiles(dataId, 0, undefined, data.files).then(function(itemId) { + dataProm = self.uploadOrStoreFiles(dataId, 0, entryId, data.fieldid, data.files, offline, siteId).then(function(itemId) { delete data.files; data.value = itemId; }); @@ -423,20 +470,80 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataHelper#uploadOrStoreFiles * @param {Number} dataId Database ID. * @param {Number} [itemId] Draft ID to use. Undefined or 0 to create a new draft ID. - * @param {Number} [timecreated] The time the entry was created. + * @param {Number} entryId Entry ID or, if creating, timemodified. + * @param {Number} fieldId Field ID. * @param {Object[]} files List of files. * @param {Boolean} offline True if files sould be stored for offline, false to upload them. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved if success. */ - self.uploadOrStoreFiles = function(dataId, itemId, timecreated, files, offline, siteId) { + self.uploadOrStoreFiles = function(dataId, itemId, entryId, fieldId, files, offline, siteId) { if (offline) { - // @todo in future issues. - //return self.storeFiles(dataId, timecreated, files, siteId); + return self.storeFiles(dataId, entryId, fieldId, files, siteId); } return $mmFileUploader.uploadOrReuploadFiles(files, mmaModDataComponent, itemId, siteId); }; + /** + * Given a list of files (either online files or local files), store the local files in a local folder + * to be submitted later. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#storeFiles + * @param {Number} dataId Database ID. + * @param {Number} entryId Entry ID or, if creating, timemodified. + * @param {Number} fieldId Field ID. + * @param {Object[]} files List of files. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if success, rejected otherwise. + */ + self.storeFiles = function(dataId, entryId, fieldId, files, siteId) { + // Get the folder where to store the files. + return $mmaModDataOffline.getEntryFieldFolder(dataId, entryId, fieldId, siteId).then(function(folderPath) { + return $mmFileUploader.storeFilesToUpload(folderPath, files); + }); + }; + + /** + * Delete stored attachment files for an entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#deleteStoredFiles + * @param {Number} dataId Database ID. + * @param {Number} entryId Entry ID or, if creating, timemodified. + * @param {Number} fieldId Field ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when deleted. + */ + self.deleteStoredFiles = function(dataId, entryId, fieldId, siteId) { + return $mmaModDataOffline.getEntryFieldFolder(dataId, entryId, fieldId, siteId).then(function(folderPath) { + return $mmFS.removeDir(folderPath); + }); + }; + + /** + * Get a list of stored attachment files for a new entry. See $mmaModDataHelper#storeFiles. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getStoredFiles + * @param {Number} dataId Database ID. + * @param {Number} entryId Entry ID or, if creating, timemodified. + * @param {Number} fieldId Field ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved with the files. + */ + self.getStoredFiles = function(dataId, entryId, fieldId, siteId) { + return $mmaModDataOffline.getEntryFieldFolder(dataId, entryId, fieldId, siteId).then(function(folderPath) { + return $mmFileUploaderHelper.getStoredFiles(folderPath).catch(function(b) { + // Ignore not found files. + return []; + }); + }); + }; + /** * Add a prefix to all rules in a CSS string. * diff --git a/www/core/lib/filesession.js b/www/core/lib/filesession.js index 5d7d51b36d7..1bcded70804 100644 --- a/www/core/lib/filesession.js +++ b/www/core/lib/filesession.js @@ -98,6 +98,7 @@ angular.module('mm.core') * @param {String} component Component Name. * @param {String|Number} id File area identifier. * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Array} Array of files in session. */ self.getFiles = function(component, id, siteId) { siteId = siteId || $mmSite.getId(); diff --git a/www/core/lib/fs.js b/www/core/lib/fs.js index 41898cfb023..30f4435d8ba 100644 --- a/www/core/lib/fs.js +++ b/www/core/lib/fs.js @@ -413,7 +413,7 @@ angular.module('mm.core') * * @module mm.core * @ngdoc method - * @name $mmFS#getFileSizeFromFileEntry + * @name $mmFS#getFileObjectFromFileEntry * @param {String} path Relative path to the file. * @return {Promise} Promise to be resolved when the size is calculated. */ From 43bfa52ce12f4695a79c47902fdad5caddb0aaf1 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 14 Jul 2017 14:38:39 +0200 Subject: [PATCH 069/118] MOBILE-2175 sidemenu: Support 'app' custom items --- www/core/components/sidemenu/templates/menu.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/core/components/sidemenu/templates/menu.html b/www/core/components/sidemenu/templates/menu.html index f7acee79e28..3118087551f 100644 --- a/www/core/components/sidemenu/templates/menu.html +++ b/www/core/components/sidemenu/templates/menu.html @@ -40,7 +40,7 @@

    {{siteinfo.fullname}}

  • - + {{item.label}} From 8e374a3597261bdcccd5f19df6f4b20a07845818 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 14 Jul 2017 16:17:17 +0200 Subject: [PATCH 070/118] MOBILE-2170 ionic: Fix scroll with trackpad when hovering deep items --- www/core/main.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/www/core/main.js b/www/core/main.js index 3436248ff2c..289fb5aef6c 100644 --- a/www/core/main.js +++ b/www/core/main.js @@ -277,6 +277,7 @@ angular.module('mm.core', ['pascalprecht.translate']) } } }); + $window.addEventListener('native.keyboardhide', function(e) { $mmEvents.trigger(mmCoreEventKeyboardHide, e); @@ -285,6 +286,16 @@ angular.module('mm.core', ['pascalprecht.translate']) ionic.trigger('resize'); } }); + + if (!$mmApp.isDevice()) { + // Re-define getParentOrSelfWithClass to change the default value of the depth param. + // This is to allow scrolling with trackpad when hovering deep elements. + var originalFunction = ionic.DomUtil.getParentOrSelfWithClass; + ionic.DomUtil.getParentOrSelfWithClass = function(e, className, depth) { + depth = depth || 20; + return originalFunction(e, className, depth); + }; + } }); // Send event when device goes online. From 6c6fd78fa939a6933923b3320ffc5e67e100515e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Wed, 12 Jul 2017 16:32:52 +0200 Subject: [PATCH 071/118] MOBILE-2127 data: Add entries in offline mode --- www/addons/mod/data/controllers/edit.js | 54 +++++++++++--- www/addons/mod/data/controllers/index.js | 47 +++++++++++- www/addons/mod/data/fields/file/handler.js | 2 +- www/addons/mod/data/fields/picture/handler.js | 2 +- .../mod/data/fields/textarea/handler.js | 2 +- www/addons/mod/data/services/data.js | 74 ++++++++++++++++--- www/addons/mod/data/services/data_offline.js | 11 ++- .../mod/data/services/fieldsdelegate.js | 4 +- www/addons/mod/data/services/helper.js | 16 ++-- 9 files changed, 175 insertions(+), 37 deletions(-) diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index b2ed0bad570..7d07431cc7d 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -33,7 +33,6 @@ angular.module('mm.addons.mod_data') siteId = $mmSite.getId(), offline = !$mmApp.isOnline(), entryId = $stateParams.entryid || false, - editing = entryId > 0, entry; $scope.title = module.name; @@ -56,7 +55,7 @@ angular.module('mm.addons.mod_data') }).then(function(accessData) { $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - if (!editing) { + if (entryId !== false) { // Adding, get groups because it's not set. return $mmGroups.getActivityGroupInfo(data.coursemodule, accessData.canmanageentries).then(function(groupInfo) { $scope.groupInfo = groupInfo; @@ -88,9 +87,31 @@ angular.module('mm.addons.mod_data') $scope.fields[field.id] = field; }); - if (editing) { + if (entryId > 0) { return $mmaModData.getEntry(data.id, entryId); } + + for (var x in offlineActions) { + if (offlineActions[x].action == 'add') { + offlineEntry = offlineActions[x]; + + var siteInfo = $mmSite.getInfo(), + entryData = { + id: offlineEntry.entryid, + canmanageentry: true, + approved: !data.approval || data.manageapproved, + dataid: offlineEntry.dataid, + groupid: offlineEntry.groupid, + timecreated: -offlineEntry.entryid, + timemodified: -offlineEntry.entryid, + userid: siteInfo.userid, + fullname: siteInfo.fullname, + contents: {} + }; + + return $q.when({entry: entryData}); + } + } }).then(function(entryData) { if (entryData) { entry = entryData.entry; @@ -101,13 +122,16 @@ angular.module('mm.addons.mod_data') contents[field.fieldid] = field; }); entry.contents = contents; + } else { + entry = {}; + entry.contents = {}; } return $mmaModDataHelper.applyOfflineActions(entry, offlineActions, $scope.fields); }).then(function(entryData) { $scope.entry = entryData; - $scope.editForm = $mmaModDataHelper.displayEditFields(data.addtemplate, $scope.fields, entryData.contents); + $scope.editForm = $mmaModDataHelper.displayEditFields(data.addtemplate, $scope.fields, entry.contents); }).catch(function(message) { $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); return $q.reject(); @@ -140,24 +164,34 @@ angular.module('mm.addons.mod_data') var modal = $mmUtil.showModalLoading('mm.core.sending', true); - return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, entryId, - $scope.entry.contents, offline).catch(function(e) { + // Create an ID to assign files. + var entryTemp = entryId; + if ((typeof entryId == "undefined" || entryId === false) && offline) { + entryTemp = - (new Date().getTime()); + } + + return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, + entryTemp, $scope.entry.contents, offline).catch(function(e) { if (!offline) { // Cannot submit in online, prepare for offline usage. offline = true; + if (typeof entryTemp == "undefined") { + entryTemp = - (new Date().getTime()); + } return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, - entryId, $scope.entry.contents, offline); + entryTemp, $scope.entry.contents, offline); } return $q.reject(e); }).then(function(editData) { if (editData.length > 0) { - if (entryId) { + if (entryId !== false) { return $mmaModData.editEntry(data.id, entryId, courseId, editData, $scope.fields, undefined, offline); } - return $mmaModData.addEntry(data.id, editData, $scope.selectedGroup, undefined, offline); + return $mmaModData.addEntry(data.id, entryTemp, courseId, editData, $scope.selectedGroup, $scope.fields, undefined, + offline); } }).then(function(result) { if (!result) { @@ -166,7 +200,7 @@ angular.module('mm.addons.mod_data') } // This is done if entry is updated when editing or creating if not. - if ((entryId && result.updated) || (!entryId && result.newentryid)) { + if ((entryId !== false && result.updated) || (!entryId && result.newentryid)) { var promises = []; entryId = entryId || result.newentryid; diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 1e09e2d5f81..36fa90e6d37 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -146,14 +146,22 @@ angular.module('mm.addons.mod_data') $scope.hasOffline = !!offlineEntries.length; $scope.offlineActions = {}; + $scope.offlineEntries = {}; // Only show offline entries on first page. if ($scope.search.page == 0 && $scope.hasOffline) { angular.forEach(offlineEntries, function(entry) { - if (typeof $scope.offlineActions[entry.entryid] == "undefined") { - $scope.offlineActions[entry.entryid] = []; + if (entry.entryid > 0) { + if (typeof $scope.offlineActions[entry.entryid] == "undefined") { + $scope.offlineActions[entry.entryid] = []; + } + $scope.offlineActions[entry.entryid].push(entry); + } else { + if (typeof $scope.offlineActions[entry.entryid] == "undefined") { + $scope.offlineEntries[entry.entryid] = []; + } + $scope.offlineEntries[entry.entryid].push(entry); } - $scope.offlineActions[entry.entryid].push(entry); }); } }); @@ -184,7 +192,38 @@ angular.module('mm.addons.mod_data') if (!$scope.isEmpty) { $scope.cssTemplate = $mmaModDataHelper.prefixCSS(data.csstemplate, '.mma-data-entries-' + data.id); - var promises = []; + var siteInfo = $mmSite.getInfo(), + promises = []; + + angular.forEach($scope.offlineEntries, function(offlineActions) { + var entry; + + angular.forEach(offlineActions, function(offlineEntry) { + if (offlineEntry.action == 'add') { + entry = { + id: offlineEntry.entryid, + canmanageentry: true, + approved: !data.approval || data.manageapproved, + dataid: offlineEntry.dataid, + groupid: offlineEntry.groupid, + timecreated: -offlineEntry.entryid, + timemodified: -offlineEntry.entryid, + userid: siteInfo.userid, + fullname: siteInfo.fullname, + contents: {} + }; + } + }); + + if (entry) { + if (offlineActions.length > 0) { + promises.push($mmaModDataHelper.applyOfflineActions(entry, offlineActions, $scope.fields)); + } else { + promises.push($q.when(entry)); + } + } + + }); angular.forEach(entries.entries, function(entry) { // Index contents by fieldid. diff --git a/www/addons/mod/data/fields/file/handler.js b/www/addons/mod/data/fields/file/handler.js index e026a464613..7c6d6123d36 100644 --- a/www/addons/mod/data/fields/file/handler.js +++ b/www/addons/mod/data/fields/file/handler.js @@ -116,7 +116,7 @@ angular.module('mm.addons.mod_data') * @return {Object} Data overriden */ self.overrideData = function(originalContent, offlineContent, offlineFiles) { - if (offlineContent && offlineContent.file && offlineContent.file.offline > 0) { + if (offlineContent && offlineContent.file && offlineContent.file.offline > 0 && offlineFiles && offlineFiles.length > 0) { originalContent.content = offlineFiles[0].filename; originalContent.files = [offlineFiles[0]]; } else if (offlineContent && offlineContent.file && offlineContent.file.online && offlineContent.file.online.length > 0) { diff --git a/www/addons/mod/data/fields/picture/handler.js b/www/addons/mod/data/fields/picture/handler.js index 2d933e07e11..d78e5bbe986 100644 --- a/www/addons/mod/data/fields/picture/handler.js +++ b/www/addons/mod/data/fields/picture/handler.js @@ -153,7 +153,7 @@ angular.module('mm.addons.mod_data') * @return {Object} Data overriden */ self.overrideData = function(originalContent, offlineContent, offlineFiles) { - if (offlineContent && offlineContent.file && offlineContent.file.offline > 0) { + if (offlineContent && offlineContent.file && offlineContent.file.offline > 0 && offlineFiles && offlineFiles.length > 0) { originalContent.content = offlineFiles[0].filename; originalContent.files = [offlineFiles[0]]; } else if (offlineContent && offlineContent.file && offlineContent.file.online && offlineContent.file.online.length > 0) { diff --git a/www/addons/mod/data/fields/textarea/handler.js b/www/addons/mod/data/fields/textarea/handler.js index 3f6f49081fe..524f8e92c60 100644 --- a/www/addons/mod/data/fields/textarea/handler.js +++ b/www/addons/mod/data/fields/textarea/handler.js @@ -150,7 +150,7 @@ angular.module('mm.addons.mod_data') */ self.overrideData = function(originalContent, offlineContent) { originalContent.content = offlineContent[''] || ""; - if (originalContent.content.length > 0 && originalContent.files.length > 0) { + if (originalContent.content.length > 0 && originalContent.files && originalContent.files.length > 0) { // Take the original files since we cannot edit them on the app. originalContent.content = $mmText.replacePluginfileUrls(originalContent.content, originalContent.files); } diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index b03e5182354..c2aab5107d8 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -437,7 +437,7 @@ angular.module('mm.addons.mod_data') // Convenience function to store a data to be synchronized later. function storeOffline() { var action = approve ? 'approve' : 'disapprove'; - return $mmaModDataOffline.saveEntry(dataId, entryId, action, courseId, false, undefined, siteId); + return $mmaModDataOffline.saveEntry(dataId, entryId, action, courseId, undefined, false, undefined, siteId); } }; @@ -523,7 +523,7 @@ angular.module('mm.addons.mod_data') // Convenience function to store a data to be synchronized later. function storeOffline() { - return $mmaModDataOffline.saveEntry(dataId, entryId, 'delete', courseId, false, undefined, siteId); + return $mmaModDataOffline.saveEntry(dataId, entryId, 'delete', courseId, undefined, false, undefined, siteId); } }; @@ -560,12 +560,62 @@ angular.module('mm.addons.mod_data') * @ngdoc method * @name $mmaModData#addEntry * @param {Number} dataId Data instance ID. + * @param {Number} entryId Provisiona entry ID when offline. + * @param {Number} courseId Course ID. + * @param {Object} contents The fields data to be created. + * @param {Number} [groupId] Group id, 0 means that the function will determine the user group. + * @param {Object} fields The fields that define the contents. + * @param {String} [siteId] Site ID. If not defined, current site. + * @param {Boolean} forceOffline Force editing entry in offline. + * @return {Promise} Promise resolved when the action is done. + */ + self.addEntry = function(dataId, entryId, courseId, contents, groupId, fields, siteId, forceOffline) { + siteId = siteId || $mmSite.getId(); + + if (!$mmApp.isOnline() || forceOffline) { + var notifications = checkFields(fields, contents); + if (notifications) { + return { + fieldnotifications: notifications + }; + } + } + + return self.addEntryOnline(dataId, contents, groupId, siteId).catch(function(error) { + if (error && !error.wserror) { + // Couldn't connect to server, store in offline. + return storeOffline(); + } else { + // The WebService has thrown an error or offline not supported, reject. + return $q.reject(error.error); + } + }); + + // Convenience function to store a data to be synchronized later. + function storeOffline() { + return $mmaModDataOffline.saveEntry(dataId, entryId, 'add', courseId, groupId, contents, undefined, siteId) + .then(function(entry) { + return { + // Return provissional entry Id. + newentryid: entry[1] + }; + }); + } + }; + + /** + * Adds a new entry to a database. It does not cache calls. It will fail if offline or cannot connect. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#addEntry + * @param {Number} dataId Data instance ID. * @param {Object} data The fields data to be created. * @param {Number} [groupId] Group id, 0 means that the function will determine the user group. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when the action is done. */ - self.addEntry = function(dataId, data, groupId, siteId) { + self.addEntryOnline = function(dataId, data, groupId, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { var params = { databaseid: dataId, @@ -576,7 +626,12 @@ angular.module('mm.addons.mod_data') params.groupid = groupId; } - return site.write('mod_data_add_entry', params); + return site.write('mod_data_add_entry', params).catch(function(error) { + return $q.reject({ + error: error, + wserror: $mmUtil.isWebServiceError(error) + }); + }); }); }; @@ -588,9 +643,9 @@ angular.module('mm.addons.mod_data') * @name $mmaModData#editEntry * @param {Number} dataId Database ID. * @param {Number} entryId Entry ID. - * @param {Number} courseId Entry ID. - * @param {Object} fields The fields that define the contents; + * @param {Number} courseId Course ID. * @param {Object} contents The contents data to be updated. + * @param {Object} fields The fields that define the contents. * @param {String} [siteId] Site ID. If not defined, current site. * @param {Boolean} forceOffline Force editing entry in offline. * @return {Promise} Promise resolved when the action is done. @@ -609,7 +664,7 @@ angular.module('mm.addons.mod_data') } } - // Get if the opposite action is not synced. + // Get other not not synced actions. return $mmaModDataOffline.getEntryActions(dataId, entryId, siteId).then(function(entries) { if (entries && entries.length) { // Found. Delete add and edit actions first. @@ -629,7 +684,7 @@ angular.module('mm.addons.mod_data') }).then(function(){ if (justAdded) { // The field was added offline, add again and stop. - return self.addEntry(dataId, contents, groupId, siteId, forceOffline); + return self.addEntry(dataId, entryId, courseId, contents, groupId, fields, siteId, forceOffline); } if (!$mmApp.isOnline() || forceOffline) { @@ -650,7 +705,8 @@ angular.module('mm.addons.mod_data') // Convenience function to store a data to be synchronized later. function storeOffline() { - return $mmaModDataOffline.saveEntry(dataId, entryId, 'edit', courseId, contents, undefined, siteId).then(function() { + return $mmaModDataOffline.saveEntry(dataId, entryId, 'edit', courseId, undefined, contents, undefined, siteId) + .then(function() { return { updated: true }; diff --git a/www/addons/mod/data/services/data_offline.js b/www/addons/mod/data/services/data_offline.js index cdbe21b4f00..fdd057dae39 100644 --- a/www/addons/mod/data/services/data_offline.js +++ b/www/addons/mod/data/services/data_offline.js @@ -28,6 +28,9 @@ angular.module('mm.addons.mod_data') { name: 'courseid' }, + { + name: 'groupid' + }, { name: 'action' }, @@ -175,23 +178,25 @@ angular.module('mm.addons.mod_data') * @param {String} entryId Database entry Id. If action is add entryId should be 0 and -timemodified will be used. * @param {String} action Action to be done to the entry: [add, edit, delete, approve, disapprove] * @param {Number} courseId Course ID of the database. + * @param {Number} [groupId] Group ID. ONly provided when adding. * @param {Array} [fields] Array of field data of the entry if needed. * @param {Number} [timemodified] The time the entry was modified. If not defined, current time. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved if stored, rejected if failure. */ - self.saveEntry = function(dataId, entryId, action, courseId, fields, timemodified, siteId) { + self.saveEntry = function(dataId, entryId, action, courseId, groupId, fields, timemodified, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { timemodified = timemodified || new Date().getTime(); + entryId = typeof entryId == "undefined" || entryId === false ? -timemodified : entryId; var entry = { dataid: dataId, courseid: courseId, + groupid: groupId, action: action, - entryid: entryId || -timemodified, + entryid: entryId, fields: fields, timemodified: timemodified }; - return site.getDb().insert(mmaModDataEntriesStore, entry); }); }; diff --git a/www/addons/mod/data/services/fieldsdelegate.js b/www/addons/mod/data/services/fieldsdelegate.js index e8cff5b87d7..275f2121675 100644 --- a/www/addons/mod/data/services/fieldsdelegate.js +++ b/www/addons/mod/data/services/fieldsdelegate.js @@ -189,8 +189,8 @@ angular.module('mm.addons.mod_data') */ self.overrideData = function(field, originalContent, offlineContent, offlineFiles) { var handler = self.getPluginHandler(field.type); - if (handler && handler.overrideData) { - return handler.overrideData(originalContent, offlineContent, offlineFiles); + if (handler && handler.overrideData && offlineContent) { + return handler.overrideData(originalContent || {}, offlineContent, offlineFiles); } return originalContent; }; diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 350d22e2f08..25338582bb2 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -135,6 +135,7 @@ angular.module('mm.addons.mod_data') case 'delete': record.deleted = true; break; + case 'add': case 'edit': var offlineContents = {}; angular.forEach(action.fields, function(offlineContent) { @@ -365,9 +366,9 @@ angular.module('mm.addons.mod_data') // Upload Files if asked. if (dataId && data.files) { - dataProm = self.uploadOrStoreFiles(dataId, 0, entryId, data.fieldid, data.files, offline, siteId).then(function(itemId) { + dataProm = self.uploadOrStoreFiles(dataId, 0, entryId, data.fieldid, data.files, offline, siteId).then(function(filesResult) { delete data.files; - data.value = itemId; + data.value = filesResult; }); } else { dataProm = $q.when(); @@ -478,10 +479,13 @@ angular.module('mm.addons.mod_data') * @return {Promise} Promise resolved if success. */ self.uploadOrStoreFiles = function(dataId, itemId, entryId, fieldId, files, offline, siteId) { - if (offline) { - return self.storeFiles(dataId, entryId, fieldId, files, siteId); + if (files.length) { + if (offline) { + return self.storeFiles(dataId, entryId, fieldId, files, siteId); + } + return $mmFileUploader.uploadOrReuploadFiles(files, mmaModDataComponent, itemId, siteId); } - return $mmFileUploader.uploadOrReuploadFiles(files, mmaModDataComponent, itemId, siteId); + return $q.when(0); }; /** @@ -537,7 +541,7 @@ angular.module('mm.addons.mod_data') */ self.getStoredFiles = function(dataId, entryId, fieldId, siteId) { return $mmaModDataOffline.getEntryFieldFolder(dataId, entryId, fieldId, siteId).then(function(folderPath) { - return $mmFileUploaderHelper.getStoredFiles(folderPath).catch(function(b) { + return $mmFileUploaderHelper.getStoredFiles(folderPath).catch(function() { // Ignore not found files. return []; }); From 851379a375070b154cfee88ffcfc02052f3b4b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 17 Jul 2017 16:48:59 +0200 Subject: [PATCH 072/118] MOBILE-2127 data: Sync activity --- www/addons/mod/data/controllers/edit.js | 7 +- www/addons/mod/data/controllers/entry.js | 17 +- www/addons/mod/data/controllers/index.js | 45 ++- www/addons/mod/data/directives/action.js | 10 +- .../mod/data/fields/checkbox/handler.js | 3 - www/addons/mod/data/fields/date/handler.js | 7 +- www/addons/mod/data/fields/file/handler.js | 3 - www/addons/mod/data/fields/latlong/handler.js | 11 +- www/addons/mod/data/fields/menu/handler.js | 3 - .../mod/data/fields/multimenu/handler.js | 3 - www/addons/mod/data/fields/number/handler.js | 3 - www/addons/mod/data/fields/picture/handler.js | 3 - .../mod/data/fields/radiobutton/handler.js | 3 - www/addons/mod/data/fields/text/handler.js | 3 - .../mod/data/fields/textarea/handler.js | 3 - www/addons/mod/data/fields/url/handler.js | 3 - www/addons/mod/data/main.js | 7 + www/addons/mod/data/services/data.js | 46 ++- www/addons/mod/data/services/data_offline.js | 4 +- www/addons/mod/data/services/data_sync.js | 343 ++++++++++++++++++ .../mod/data/services/fieldsdelegate.js | 7 +- www/addons/mod/data/services/handlers.js | 87 ++++- www/addons/mod/data/templates/action.html | 2 +- 23 files changed, 535 insertions(+), 88 deletions(-) create mode 100644 www/addons/mod/data/services/data_sync.js diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index 7d07431cc7d..afb0eb308f0 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -109,7 +109,7 @@ angular.module('mm.addons.mod_data') contents: {} }; - return $q.when({entry: entryData}); + return {entry: entryData}; } } }).then(function(entryData) { @@ -166,7 +166,7 @@ angular.module('mm.addons.mod_data') // Create an ID to assign files. var entryTemp = entryId; - if ((typeof entryId == "undefined" || entryId === false) && offline) { + if (typeof entryId == "undefined" || entryId === false) { entryTemp = - (new Date().getTime()); } @@ -175,9 +175,6 @@ angular.module('mm.addons.mod_data') if (!offline) { // Cannot submit in online, prepare for offline usage. offline = true; - if (typeof entryTemp == "undefined") { - entryTemp = - (new Date().getTime()); - } return $mmaModDataHelper.getEditDataFromForm(document.forms['mma-mod_data-edit-form'], $scope.fields, data.id, entryTemp, $scope.entry.contents, offline); diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 18afe166244..d63244fe152 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -23,7 +23,7 @@ angular.module('mm.addons.mod_data') */ .controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, $mmEvents, $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged, - $ionicHistory, $mmaModDataOffline) { + $ionicHistory, $mmaModDataOffline, mmaModDataEventAutomSynced) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -31,6 +31,7 @@ angular.module('mm.addons.mod_data') page = $stateParams.page || false, data, entryChangedObserver, + syncObserver, scrollView, access, offlineActions = []; @@ -211,7 +212,21 @@ angular.module('mm.addons.mod_data') } }); + // Refresh entry on sync. + syncObserver = $mmEvents.on(mmaModDataEventAutomSynced, function(eventData) { + if (eventData.entryid == entryId && data.id == eventData.dataid && $mmSite.getId() == eventData.siteid) { + if (eventData.deleted) { + // If deleted, go back. + $ionicHistory.goBack(); + } else { + $scope.databaseLoaded = false; + return fetchEntryData(true); + } + } + }); + $scope.$on('$destroy', function() { entryChangedObserver && entryChangedObserver.off && entryChangedObserver.off(); + syncObserver && syncObserver.off && syncObserver.off(); }); }); diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 36fa90e6d37..8638d4ee982 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -23,7 +23,8 @@ angular.module('mm.addons.mod_data') */ .controller('mmaModDataIndexCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $mmCourseHelper, $q, $mmText, $translate, $mmEvents, mmCoreEventOnlineStatusChanged, $mmApp, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, - mmaModDataEventEntryChanged, $ionicModal, mmaModDataPerPage, $state, $mmComments, $mmaModDataOffline) { + mmaModDataEventEntryChanged, $ionicModal, mmaModDataPerPage, $state, $mmComments, $mmaModDataOffline, $mmaModDataSync, + mmaModDataEventAutomSynced) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -31,6 +32,7 @@ angular.module('mm.addons.mod_data') data, entryChangedObserver, onlineObserver, + syncObserver, hasComments = false; $scope.title = module.name; @@ -65,9 +67,14 @@ angular.module('mm.addons.mod_data') $scope.data = databaseData; $scope.database = data; - + if (sync) { + // Try to synchronize the database. + return syncDatabase(showErrors).catch(function() { + // Ignore errors. + }); + } + }).then(function() { return $mmaModData.getDatabaseAccessInformation(data.id); - }).then(function(accessData) { $scope.access = accessData; @@ -135,7 +142,7 @@ angular.module('mm.addons.mod_data') $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); return $q.reject(); - }).finally(function(){ + }).finally(function() { $scope.databaseLoaded = true; }); } @@ -288,6 +295,22 @@ angular.module('mm.addons.mod_data') }); } + // Tries to synchronize the database. + function syncDatabase(showErrors) { + return $mmaModDataSync.syncDatabase(data.id).then(function(result) { + if (result.warnings && result.warnings.length) { + $mmUtil.showErrorModal(result.warnings[0]); + } + + return result.updated; + }).catch(function(error) { + if (showErrors) { + $mmUtil.showErrorModalDefault(error, 'mm.core.errorsync', true); + } + return $q.reject(); + }); + } + fetchDatabaseData(false, true).then(function() { $mmaModData.logView(data.id).then(function() { $mmCourse.checkModuleCompletion(courseId, module.completionstatus); @@ -356,7 +379,7 @@ angular.module('mm.addons.mod_data') return fetchEntriesData().catch(function(message) { $mmUtil.showErrorModalDefault(message, 'mm.course.errorgetmodule', true); return $q.reject(); - }).finally(function(){ + }).finally(function() { $scope.databaseLoaded = true; }); }; @@ -399,7 +422,7 @@ angular.module('mm.addons.mod_data') $scope.isOnline = online; }); - // Refresh entry on change. + // Refresh entries on change. entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { if (data.id == eventData.dataId && siteId == eventData.siteId) { $scope.databaseLoaded = false; @@ -407,8 +430,18 @@ angular.module('mm.addons.mod_data') } }); + // Refresh entries on sync. + syncObserver = $mmEvents.on(mmaModDataEventAutomSynced, function(eventData) { + // Update just when all database is synced. + if (data.id == eventData.dataid && siteId == eventData.siteid && typeof eventData.entryid == "undefined") { + $scope.databaseLoaded = false; + return fetchDatabaseData(true); + } + }); + $scope.$on('$destroy', function() { onlineObserver && onlineObserver.off && onlineObserver.off(); entryChangedObserver && entryChangedObserver.off && entryChangedObserver.off(); + syncObserver && syncObserver.off && syncObserver.off(); }); }); diff --git a/www/addons/mod/data/directives/action.js b/www/addons/mod/data/directives/action.js index 35772abe366..c934ee8d8c8 100644 --- a/www/addons/mod/data/directives/action.js +++ b/www/addons/mod/data/directives/action.js @@ -19,9 +19,9 @@ angular.module('mm.addons.mod_data') * * @module mm.addons.mod_data * @ngdoc directive - * @name mmaModDataField + * @name mmaModDataAction */ -.directive('mmaModDataAction', function($mmSite, $mmUser, $mmaModDataOffline, $mmSite, $mmEvents, mmaModDataEventEntryChanged) { +.directive('mmaModDataAction', function($mmSite, $mmUser, $mmaModDataOffline, $mmEvents, mmaModDataEventEntryChanged) { return { restrict: 'E', priority: 100, @@ -40,10 +40,10 @@ angular.module('mm.addons.mod_data') }); } - scope.undoDelete = function(entryId) { - var dataId = scope.database.id, + scope.undoDelete = function() { + var dataId = scope.database.id; entryId = scope.entry.id; - return $mmaModDataOffline.getEntry(dataId, entryId, 'delete').then(function(entry) { + return $mmaModDataOffline.getEntry(dataId, entryId, 'delete').then(function() { // Found. Just delete the action. return $mmaModDataOffline.deleteEntry(dataId, entryId, 'delete'); }).then(function() { diff --git a/www/addons/mod/data/fields/checkbox/handler.js b/www/addons/mod/data/fields/checkbox/handler.js index 0bc19b82fb2..d7d89c69554 100644 --- a/www/addons/mod/data/fields/checkbox/handler.js +++ b/www/addons/mod/data/fields/checkbox/handler.js @@ -126,9 +126,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/date/handler.js b/www/addons/mod/data/fields/date/handler.js index d71db316ded..a41d81653e3 100644 --- a/www/addons/mod/data/fields/date/handler.js +++ b/www/addons/mod/data/fields/date/handler.js @@ -135,16 +135,13 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden */ self.overrideData = function(originalContent, offlineContent) { - var date = Date.UTC(offlineContent['year'] || "", offlineContent['month'] ? offlineContent['month'] - 1 : "", - offlineContent['day'] || ""); + var date = Date.UTC(offlineContent.year || "", offlineContent.month ? offlineContent.month - 1 : "", + offlineContent.day || ""); date = Math.floor(date / 1000); originalContent.content = date || ""; diff --git a/www/addons/mod/data/fields/file/handler.js b/www/addons/mod/data/fields/file/handler.js index 7c6d6123d36..9785294c354 100644 --- a/www/addons/mod/data/fields/file/handler.js +++ b/www/addons/mod/data/fields/file/handler.js @@ -107,9 +107,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @param {Array} offlineFiles Array with all the offline files in the field. diff --git a/www/addons/mod/data/fields/latlong/handler.js b/www/addons/mod/data/fields/latlong/handler.js index bcaa7822cae..9922c1397a1 100644 --- a/www/addons/mod/data/fields/latlong/handler.js +++ b/www/addons/mod/data/fields/latlong/handler.js @@ -99,19 +99,19 @@ angular.module('mm.addons.mod_data') * @return {String} String with the notification or false. */ self.getFieldsNotifications = function(field, inputData) { - var valuecount = 0; + var valueCount = 0; // The lat long class has two values that need to be checked. angular.forEach(inputData, function(value) { if (typeof value.value != "undefined" && value.value != "") { - valuecount++; + valueCount++; } }); // If we get here then only one field has been filled in. - if (valuecount == 1) { + if (valueCount == 1) { return $translate.instant('mma.mod_data.latlongboth'); - } else if (field.required && valuecount == 0) { + } else if (field.required && valueCount == 0) { return $translate.instant('mma.mod_data.errormustsupplyvalue'); } return false; @@ -120,9 +120,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/menu/handler.js b/www/addons/mod/data/fields/menu/handler.js index 22c3a4e1f41..08af08fefb9 100644 --- a/www/addons/mod/data/fields/menu/handler.js +++ b/www/addons/mod/data/fields/menu/handler.js @@ -95,9 +95,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/multimenu/handler.js b/www/addons/mod/data/fields/multimenu/handler.js index 209aad1c94a..ada5c6c7704 100644 --- a/www/addons/mod/data/fields/multimenu/handler.js +++ b/www/addons/mod/data/fields/multimenu/handler.js @@ -114,9 +114,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/number/handler.js b/www/addons/mod/data/fields/number/handler.js index 1aed84480cc..0229ff1b1cb 100644 --- a/www/addons/mod/data/fields/number/handler.js +++ b/www/addons/mod/data/fields/number/handler.js @@ -95,9 +95,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/picture/handler.js b/www/addons/mod/data/fields/picture/handler.js index d78e5bbe986..e8fd592b4a6 100644 --- a/www/addons/mod/data/fields/picture/handler.js +++ b/www/addons/mod/data/fields/picture/handler.js @@ -144,9 +144,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @param {Array} offlineFiles Array with all the offline files in the field. diff --git a/www/addons/mod/data/fields/radiobutton/handler.js b/www/addons/mod/data/fields/radiobutton/handler.js index 29974029339..93fd7d5d740 100644 --- a/www/addons/mod/data/fields/radiobutton/handler.js +++ b/www/addons/mod/data/fields/radiobutton/handler.js @@ -95,9 +95,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/text/handler.js b/www/addons/mod/data/fields/text/handler.js index a6b0db201e8..909a1e2b92c 100644 --- a/www/addons/mod/data/fields/text/handler.js +++ b/www/addons/mod/data/fields/text/handler.js @@ -94,9 +94,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/textarea/handler.js b/www/addons/mod/data/fields/textarea/handler.js index 524f8e92c60..0e04c8951ae 100644 --- a/www/addons/mod/data/fields/textarea/handler.js +++ b/www/addons/mod/data/fields/textarea/handler.js @@ -141,9 +141,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/fields/url/handler.js b/www/addons/mod/data/fields/url/handler.js index 98fc6a168b9..8719873723f 100644 --- a/www/addons/mod/data/fields/url/handler.js +++ b/www/addons/mod/data/fields/url/handler.js @@ -94,9 +94,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. * @return {Object} Data overriden diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index 105f0cd808c..3ce8a7aa2eb 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -17,6 +17,8 @@ angular.module('mm.addons.mod_data', ['mm.core']) .constant('mmaModDataComponent', 'mmaModData') .constant('mmaModDataEventEntryChanged', 'mma-mod_data_entry_changed') .constant('mmaModDataPerPage', 25) +.constant('mmaModDataEventAutomSynced', 'mma_mod_data_autom_synced') +.constant('mmaModDataSyncTime', 300000) // In milliseconds. .config(function($stateProvider) { @@ -81,4 +83,9 @@ angular.module('mm.addons.mod_data', ['mm.core']) $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:approve', '$mmaModDataHandlers.approveEntryLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:delete', '$mmaModDataHandlers.deleteEntryLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:edit', '$mmaModDataHandlers.editEntryLinksHandler'); +}) + +.run(function($mmCronDelegate) { + // Register sync handler. + $mmCronDelegate.register('mmaModData', '$mmaModDataHandlers.syncHandler'); }); diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index c2aab5107d8..dcb5962cbd7 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -404,7 +404,7 @@ angular.module('mm.addons.mod_data') * @param {Number} dataId Database ID. * @param {Number} entryId Entry ID. * @param {Boolean} approve Whether to approve (true) or unapprove the entry. - * @param {Number} courseId Entry ID. + * @param {Number} courseId Course ID. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when the action is done. */ @@ -447,10 +447,11 @@ angular.module('mm.addons.mod_data') * @module mm.addons.mod_data * @ngdoc method * @name $mmaModData#approveEntryOnline - * @param {Number} entryId Entry ID. - * @param {Boolean} approve Whether to approve (true) or unapprove the entry. - * @return {Promise} Promise resolved when the action is done. Rejected with object containing - * the error message (if any) and a boolean indicating if the error was returned by WS. + * @param {Number} entryId Entry ID. + * @param {Boolean} approve Whether to approve (true) or unapprove the entry. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the action is done. Rejected with object containing the error message + * (if any) and a boolean indicating if the error was returned by WS. */ self.approveEntryOnline = function(entryId, approve, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { @@ -477,7 +478,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModData#deleteEntry * @param {Number} dataId Database ID. * @param {Number} entryId Entry ID. - * @param {Number} courseId Entry ID. + * @param {Number} courseId Course ID. * @param {String} [siteId] Site ID. If not defined, current site. * @return {Promise} Promise resolved when the action is done. */ @@ -485,7 +486,7 @@ angular.module('mm.addons.mod_data') siteId = siteId || $mmSite.getId(); var justAdded = false; - // Get if the opposite action is not synced. + // Check if the opposite action is not synced and just delete it. return $mmaModDataOffline.getEntryActions(dataId, entryId, siteId).then(function(entries) { if (entries && entries.length) { // Found. Delete other actions first. @@ -499,7 +500,7 @@ angular.module('mm.addons.mod_data') return $q.all(proms); } - }).then(function(){ + }).then(function() { if (justAdded) { // The field was added offline, delete and stop. return; @@ -560,7 +561,7 @@ angular.module('mm.addons.mod_data') * @ngdoc method * @name $mmaModData#addEntry * @param {Number} dataId Data instance ID. - * @param {Number} entryId Provisiona entry ID when offline. + * @param {Number} entryId EntryId or provisional entry ID when offline. * @param {Number} courseId Course ID. * @param {Object} contents The fields data to be created. * @param {Number} [groupId] Group id, 0 means that the function will determine the user group. @@ -608,8 +609,8 @@ angular.module('mm.addons.mod_data') * * @module mm.addons.mod_data * @ngdoc method - * @name $mmaModData#addEntry - * @param {Number} dataId Data instance ID. + * @name $mmaModData#addEntryOnline + * @param {Number} dataId Database ID. * @param {Object} data The fields data to be created. * @param {Number} [groupId] Group id, 0 means that the function will determine the user group. * @param {String} [siteId] Site ID. If not defined, current site. @@ -626,7 +627,12 @@ angular.module('mm.addons.mod_data') params.groupid = groupId; } - return site.write('mod_data_add_entry', params).catch(function(error) { + return site.write('mod_data_add_entry', params).then(function(result) { + if (result.newentryid) { + return result; + } + return $q.reject(); + }).catch(function(error) { return $q.reject({ error: error, wserror: $mmUtil.isWebServiceError(error) @@ -681,7 +687,7 @@ angular.module('mm.addons.mod_data') return $q.all(proms); } - }).then(function(){ + }).then(function() { if (justAdded) { // The field was added offline, add again and stop. return self.addEntry(dataId, entryId, courseId, contents, groupId, fields, siteId, forceOffline); @@ -714,6 +720,13 @@ angular.module('mm.addons.mod_data') } }; + /** + * Convenience function to check fields requeriments here named "notifications" + * + * @param {Object} fields The fields that define the contents. + * @param {Object} contents The contents data of the fields. + * @return {Array} Array of notifications if any or false. + */ function checkFields(fields, contents) { var notifications = [], notification, @@ -758,7 +771,12 @@ angular.module('mm.addons.mod_data') data: data }; - return site.write('mod_data_update_entry', params).catch(function(error) { + return site.write('mod_data_update_entry', params).then(function(result) { + if (result.updated) { + return result; + } + return $q.reject(); + }).catch(function(error) { return $q.reject({ error: error, wserror: $mmUtil.isWebServiceError(error) diff --git a/www/addons/mod/data/services/data_offline.js b/www/addons/mod/data/services/data_offline.js index fdd057dae39..7a16d8d1755 100644 --- a/www/addons/mod/data/services/data_offline.js +++ b/www/addons/mod/data/services/data_offline.js @@ -226,7 +226,7 @@ angular.module('mm.addons.mod_data') * * @module mm.addons.mod_data * @ngdoc method - * @name $mmaModDataOffline#getEntryFolder + * @name $mmaModDataOffline#getEntryFieldFolder * @param {Number} dataId Database ID. * @param {Number} entryId The ID of the entry. * @param {Number} fieldId Field ID. @@ -235,7 +235,7 @@ angular.module('mm.addons.mod_data') */ self.getEntryFieldFolder = function(dataId, entryId, fieldId ,siteId) { return self.getDatabaseFolder(dataId, siteId).then(function(folderPath) { - return $mmFS.concatenatePaths(folderPath, 'entry_' + entryId + '_' + fieldId); + return $mmFS.concatenatePaths(folderPath, entryId + '_' + fieldId); }); }; diff --git a/www/addons/mod/data/services/data_sync.js b/www/addons/mod/data/services/data_sync.js new file mode 100644 index 00000000000..20300452faa --- /dev/null +++ b/www/addons/mod/data/services/data_sync.js @@ -0,0 +1,343 @@ +// (C) Copyright 2015 Martin Dougiamas +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +angular.module('mm.addons.mod_data') + +/** + * Data synchronization service. + * + * @module mm.addons.mod_data + * @ngdoc service + * @name $mmaModDataSync + */ +.factory('$mmaModDataSync', function($log, $mmaModData, $mmSite, $mmSitesManager, $q, $mmaModDataOffline, $mmCourse, $mmUtil, + $mmApp, $mmEvents, $translate, mmaModDataSyncTime, $mmSync, mmaModDataEventAutomSynced, mmaModDataComponent, + $mmSyncBlock, $mmLang, $mmaModDataHelper) { + + $log = $log.getInstance('$mmaModDataSync'); + + // Inherit self from $mmSync. + var self = $mmSync.createChild(mmaModDataComponent, mmaModDataSyncTime); + + /** + * Check if a database has data to synchronize. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataSync#hasDataToSync + * @param {Number} dataId Database ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved with boolean: true if has data to sync, false otherwise. + */ + self.hasDataToSync = function(dataId, siteId) { + return $mmaModDataOffline.hasOfflineData(dataId, siteId); + }; + + /** + * Try to synchronize all data that need it and haven't been synchronized in a while. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataSync#syncAllDatabases + * @param {String} [siteId] Site ID to sync. If not defined, sync all sites. + * @return {Promise} Promise resolved when the sync is done. + */ + self.syncAllDatabases = function(siteId) { + if (!$mmApp.isOnline()) { + $log.debug('Cannot sync all databases because device is offline.'); + return $q.reject(); + } + + var promise; + if (!siteId) { + // No site ID defined, sync all sites. + $log.debug('Try to sync database in all sites.'); + promise = $mmSitesManager.getSitesIds(); + } else { + $log.debug('Try to sync database in site ' + siteId); + promise = $q.when([siteId]); + } + + return promise.then(function(siteIds) { + var sitePromises = []; + + angular.forEach(siteIds, function(siteId) { + // Sync submissions. + sitePromises.push($mmaModDataOffline.getAllEntries(siteId).then(function(offlineActions) { + var promises = {}; + + // Do not sync same database twice. + angular.forEach(offlineActions, function(action) { + if (typeof promises[action.dataid] != 'undefined') { + return; + } + + promises[action.dataid] = self.syncDatabaseIfNeeded(action.dataid, siteId) + .then(function(result) { + if (result && result.updated) { + // Sync done. Send event. + $mmEvents.trigger(mmaModDataEventAutomSynced, { + siteid: siteId, + dataid: action.dataid, + warnings: result.warnings + }); + } + }); + }); + // Promises will be an object so, convert to an array first; + promises = $mmUtil.objectToArray(promises); + + return $q.all(promises); + })); + }); + + return $q.all(sitePromises); + }); + }; + + /** + * Sync a database only if a certain time has passed since the last time. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataSync#syncDatabaseIfNeeded + * @param {Number} dataId Database ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is synced or if it doesn't need to be synced. + */ + self.syncDatabaseIfNeeded = function(dataId, siteId) { + return self.isSyncNeeded(dataId, siteId).then(function(needed) { + if (needed) { + return self.syncDatabase(dataId, siteId); + } + }); + }; + + /** + * Try to synchronize a database. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataSync#syncDatabase + * @param {Number} dataId Data ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if sync is successful, rejected otherwise. + */ + self.syncDatabase = function(dataId, siteId) { + siteId = siteId || $mmSite.getId(); + + var syncPromise, + data, + courseId, + result = { + warnings: [], + updated: false + }; + + if (self.isSyncing(dataId, siteId)) { + // There's already a sync ongoing for this discussion, return the promise. + return self.getOngoingSync(dataId, siteId); + } + + // Verify that data isn't blocked. + if ($mmSyncBlock.isBlocked(mmaModDataComponent, dataId, siteId)) { + $log.debug('Cannot sync database ' + dataId + ' because it is blocked.'); + var modulename = $mmCourse.translateModuleName('data'); + return $mmLang.translateAndReject('mm.core.errorsyncblocked', {$a: modulename}); + } + + $log.debug('Try to sync database ' + dataId); + + // Get offline actions to be sent. + syncPromise = $mmaModDataOffline.getDatabaseEntries(dataId, siteId).catch(function() { + // No offline data found, return empty array. + return []; + }).then(function(offlineActions) { + if (!offlineActions.length) { + // Nothing to sync. + return; + } else if (!$mmApp.isOnline()) { + // Cannot sync in offline. + return $q.reject(); + } + + courseId = offlineActions[0].courseid; + + return $mmaModData.getDatabaseById(courseId, dataId, siteId).then(function(database) { + data = database; + + var promises = [], + offlineEntries = {}; + + angular.forEach(offlineActions, function(entry) { + if (typeof offlineEntries[entry.entryid] == "undefined") { + offlineEntries[entry.entryid] = []; + } + offlineEntries[entry.entryid].push(entry); + }); + + angular.forEach(offlineEntries, function(entryActions) { + promises.push(syncEntry(data, entryActions, result.warnings, siteId)); + }); + + return $q.all(promises); + }).then(function() { + if (result.updated) { + // Data has been sent to server. Now invalidate the WS calls. + return $mmaModData.invalidateContent(data.cmid, courseId, siteId).catch(function() { + // Ignore errors. + }); + } + }); + }).then(function() { + // Sync finished, set sync time. + return self.setSyncTime(dataId, siteId).catch(function() { + // Ignore errors. + }); + }).then(function() { + // All done, return the warnings. + return result; + }); + + return self.addOngoingSync(dataId, syncPromise, siteId); + }; + + /** + * Synchronize an entry. + * + * @param {Object} data Database. + * @param {Object} entryActions Entry actions. + * @param {Object[]} warnings List of warnings. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if success, rejected otherwise. + */ + function syncEntry(data, entryActions, warnings, siteId) { + var discardError, + timePromise, + entryId = 0, + deleted = false, + promises = []; + + // Sort entries by timemodified. + entryActions = entryActions.sort(function(a, b) { + return a.timemodified - b.timemodified; + }); + + entryId = entryActions[0].entryid; + + if (entryId > 0) { + timePromise = $mmaModData.getEntry(data.id, entryActions[0].entryid, siteId).then(function(entry) { + return entry.entry.timemodified; + }).catch(function() { + return -1; + }); + } else { + timePromise = $q.when(0); + } + + return timePromise.then(function(timemodified) { + if (timemodified < 0 || timemodified >= entryActions[0].timemodified) { + // The entry was not found in Moodle or the entry has been modified, discard the action. + discardError = $translate.instant('mma.mod_data.warningsubmissionmodified'); + return; + } + + angular.forEach(entryActions, function(action) { + var actionPromise, + proms = []; + + entryId = action.entryid > 0 ? action.entryid : entryId; + + if (action.fields) { + angular.forEach(action.fields, function(field) { + // Upload Files if asked. + var value = JSON.parse(field.value); + if (value.online || value.offline) { + var files = value.online || [], + fileProm = value.offline ? $mmaModDataHelper.getStoredFiles(action.dataid, entryId, field.fieldid) : + $q.when([]); + + proms.push(fileProm.then(function(offlineFiles) { + files = files.concat(offlineFiles); + return $mmaModDataHelper.uploadOrStoreFiles(action.dataid, 0, entryId, field.fieldid, files, false, + siteId).then(function(filesResult) { + field.value = JSON.stringify(filesResult); + }); + })); + } + }); + } + + actionPromise = $q.all(proms).then(function() { + // Perform the action. + switch (action.action) { + case 'add': + return $mmaModData.addEntryOnline(action.dataid, action.fields, data.groupid, siteId) + .then(function(result) { + entryId = result.newentryid; + }); + case 'edit': + return $mmaModData.editEntryOnline(entryId, action.fields, siteId); + case 'approve': + return $mmaModData.approveEntryOnline(entryId, true, siteId); + case 'disapprove': + return $mmaModData.approveEntryOnline(entryId, false, siteId); + case 'delete': + return $mmaModData.deleteEntryOnline(entryId, siteId).then(function() { + deleted = true; + }); + } + }); + + promises.push(actionPromise.catch(function(error) { + if (error && error.wserror) { + // The WebService has thrown an error, this means it cannot be performed. Discard. + discardError = error.error; + } else { + // Couldn't connect to server, reject. + return $q.reject(error && error.error); + } + }).then(function() { + // Delete the offline data. + return $mmaModDataOffline.deleteEntry(action.dataid, action.entryid, action.action, siteId); + })); + }); + return $q.all(promises); + }).then(function() { + if (discardError) { + // Submission was discarded, add a warning. + var message = $translate.instant('mm.core.warningofflinedatadeleted', { + component: $mmCourse.translateModuleName('data'), + name: data.name, + error: discardError + }); + + if (warnings.indexOf(message) == -1) { + warnings.push(message); + } + } + + // Sync done. Send event. + $mmEvents.trigger(mmaModDataEventAutomSynced, { + siteid: siteId, + dataid: action.dataid, + entryid: action.entryid, + warnings: warnings, + deleted: deleted + }); + }); + } + + return self; +}); diff --git a/www/addons/mod/data/services/fieldsdelegate.js b/www/addons/mod/data/services/fieldsdelegate.js index 275f2121675..5e3f3c0cd0a 100644 --- a/www/addons/mod/data/services/fieldsdelegate.js +++ b/www/addons/mod/data/services/fieldsdelegate.js @@ -178,9 +178,6 @@ angular.module('mm.addons.mod_data') /** * Override field content data with offline submission. * - * @module mm.addons.mod_data - * @ngdoc method - * @name $mmaModDataFieldsDelegate#overrideData * @param {Object} field Defines the field to be rendered. * @param {Object} originalContent Original data to be overriden. * @param {Array} offlineContent Array with all the offline data to override. @@ -196,7 +193,7 @@ angular.module('mm.addons.mod_data') }; /** - * Get the directive to use for a certain feedback plugin. + * Get the directive to use for a certain database plugin. * * @module mm.addons.mod_data * @ngdoc method @@ -252,7 +249,7 @@ angular.module('mm.addons.mod_data') * - getFieldsNotifications(field, inputData) Optional. * Should return an array of notifications before sending data. * - overrideData(originalContent, offlineContent, offlineFiles) Optional. - * Should return and object with the overriden content from offline + * Should return an object with the overriden content from offline * submission. */ self.registerHandler = function(addon, pluginType, handler) { diff --git a/www/addons/mod/data/services/handlers.js b/www/addons/mod/data/services/handlers.js index 65c5ac4ca47..343d607e42e 100644 --- a/www/addons/mod/data/services/handlers.js +++ b/www/addons/mod/data/services/handlers.js @@ -23,7 +23,8 @@ angular.module('mm.addons.mod_data') */ .factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, $q, mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, $mmContentLinkHandlerFactory, - mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged, $translate) { + mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged, $translate, + $mmaModDataSync) { var self = {}; /** @@ -215,6 +216,23 @@ angular.module('mm.addons.mod_data') }]; }; + /** + * Convenience function to help get courseId. + * @param {Number} dataId Database Id. + * @param {Number} siteId Site Id, if not set, current site will be used. + * @param {Number} courseId Course Id if already set. + * @return {Promise} Resolved with course Id when done. + */ + function getActivityCourseIdIfNotSet(dataId, siteId, courseId) { + if (courseId) { + return $q.when(courseId); + } + + return $mmCourse.getModuleBasicInfoByInstance(dataId, 'data', siteId).then(function(module) { + return module.course; + }); + } + /** * Content links handler for database approve/disapprove entry. * Match mod/data/view.php?d=6&approve=5 with a valid data id and entryid. @@ -243,12 +261,13 @@ angular.module('mm.addons.mod_data') entryId = parseInt(params.approve, 10) || parseInt(params.disapprove, 10), approve = parseInt(params.approve, 10) ? true : false; - return $mmCourse.getModuleBasicInfoByInstance(dataId, 'data', siteId).then(function(module) { + return getActivityCourseIdIfNotSet(dataId, siteId, courseId).then(function(cId) { + courseId = cId; // Approve/disapprove entry. - return $mmaModData.approveEntry(dataId, entryId, approve, module.course, siteId).catch(function(message) { + return $mmaModData.approveEntry(dataId, entryId, approve, courseId, siteId).catch(function(message) { modal.dismiss(); - $mmUtil.showErrorModal(message, 'mma.mod_data.errorapproving', true); + $mmUtil.showErrorModalDefault(message, 'mma.mod_data.errorapproving', true); return $q.reject(); }); @@ -300,11 +319,13 @@ angular.module('mm.addons.mod_data') dataId = parseInt(params.d, 10), entryId = parseInt(params.delete, 10); - return $mmCourse.getModuleBasicInfoByInstance(dataId, 'data', siteId).then(function(module) { + return getActivityCourseIdIfNotSet(dataId, siteId, courseId).then(function(cId) { + courseId = cId; + // Delete entry. - return $mmaModData.deleteEntry(dataId, entryId, module.course, siteId, true).catch(function(message) { + return $mmaModData.deleteEntry(dataId, entryId, courseId, siteId, true).catch(function(message) { modal.dismiss(); - $mmUtil.showErrorModal(message, 'mma.mod_data.errordeleting', true); + $mmUtil.showErrorModalDefault(message, 'mma.mod_data.errordeleting', true); return $q.reject(); }); @@ -375,5 +396,57 @@ angular.module('mm.addons.mod_data') }]; }; + /** + * Synchronization handler. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#syncHandler + */ + self.syncHandler = function() { + + var self = {}; + + /** + * Execute the process. + * Receives the ID of the site affected, undefined for all sites. + * + * @param {String} [siteId] ID of the site affected, undefined for all sites. + * @return {Promise} Promise resolved when done, rejected if failure. + */ + self.execute = function(siteId) { + return $mmaModDataSync.syncAllDatabases(siteId); + }; + + /** + * Get the time between consecutive executions. + * + * @return {Number} Time between consecutive executions (in ms). + */ + self.getInterval = function() { + return 600000; // 10 minutes. + }; + + /** + * Whether it's a synchronization process or not. + * + * @return {Boolean} True if is a sync process, false otherwise. + */ + self.isSync = function() { + return true; + }; + + /** + * Whether the process uses network or not. + * + * @return {Boolean} True if uses network, false otherwise. + */ + self.usesNetwork = function() { + return true; + }; + + return self; + }; + return self; }); diff --git a/www/addons/mod/data/templates/action.html b/www/addons/mod/data/templates/action.html index 5d2c9026dd3..91581409647 100644 --- a/www/addons/mod/data/templates/action.html +++ b/www/addons/mod/data/templates/action.html @@ -1,7 +1,7 @@ - + From 4838d4f1d9b4aedf74d01daa79ffbad33e196e1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Thu, 20 Jul 2017 12:40:35 +0200 Subject: [PATCH 073/118] MOBILE-2131 data: Apply UX changes --- www/addons/mod/data/controllers/index.js | 5 ++++ www/addons/mod/data/scss/styles.scss | 30 ++++++++++++++++++- .../mod/data/templates/search-modal.html | 7 +++-- www/core/scss/styles.scss | 17 +++++++++++ 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 8638d4ee982..258873390b1 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -395,6 +395,11 @@ angular.module('mm.addons.mod_data') $scope.searchEntries(0); }; + // Switches between advanced to normal search + $scope.switchAdvanced = function(enable) { + $scope.search.searchingAdvanced = enable; + }; + // Opens add entries form $scope.gotoAddEntries = function() { var stateParams = { diff --git a/www/addons/mod/data/scss/styles.scss b/www/addons/mod/data/scss/styles.scss index d1a9230dbce..f563d867542 100644 --- a/www/addons/mod/data/scss/styles.scss +++ b/www/addons/mod/data/scss/styles.scss @@ -19,6 +19,7 @@ td { padding-left: 2px; padding-right: 2px; + vertical-align: top; } } @@ -27,6 +28,9 @@ table { width: 100%; } + td { + vertical-align: top; + } textarea, input[type="text"], @@ -66,6 +70,22 @@ padding: 16px 0 16px 16px; } + mm-attachments + .item-stacked-label { + border-top: 0px; + padding: 0; + margin-right: 1px; + + ion-label { + margin: 0; + padding-left: 16px; + } + + input { + border: 0; + margin: 0; + } + } + mm-attachments .item { width: 100%; margin: -1px; @@ -76,10 +96,14 @@ margin-right: 1px; } - .item-select select { + .item-input.item-select { + margin-bottom: -6px; + + select { width: 100%; left: 0; max-width: none; + } } .item-input.mm-latlong { @@ -93,4 +117,8 @@ border: 0; } } + + .mm-item-has-rich-text-editor { + margin-right: 1px; + } } \ No newline at end of file diff --git a/www/addons/mod/data/templates/search-modal.html b/www/addons/mod/data/templates/search-modal.html index 88468aac721..8402fcd17a3 100644 --- a/www/addons/mod/data/templates/search-modal.html +++ b/www/addons/mod/data/templates/search-modal.html @@ -5,6 +5,10 @@

    {{ 'mma.mod_data.search' | translate}}

    +
    -
  • From dd878332f232ff91ce96c23fcb806f6cc21dc330 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 25 Jul 2017 09:22:04 +0200 Subject: [PATCH 081/118] MOBILE-2178 scorm: Hide module spinner if WS call fails --- www/addons/mod/scorm/services/handlers.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/www/addons/mod/scorm/services/handlers.js b/www/addons/mod/scorm/services/handlers.js index 6badb7af26e..8e9bf9b482c 100644 --- a/www/addons/mod/scorm/services/handlers.js +++ b/www/addons/mod/scorm/services/handlers.js @@ -153,6 +153,9 @@ angular.module('mm.addons.mod_scorm') $scope.$on('$destroy', function() { statusObserver && statusObserver.off && statusObserver.off(); }); + }).catch(function() { + // Error getting SCORM, hide the spinner. + $scope.spinner = false; }); }; }; From b9280b655c3edc54bb2e3b8de6a9ffa988a4ad24 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 25 Jul 2017 12:06:03 +0200 Subject: [PATCH 082/118] MOBILE-2178 upload: Fix wrong max size in upload File --- .../fileuploader/services/handlers.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/www/core/components/fileuploader/services/handlers.js b/www/core/components/fileuploader/services/handlers.js index 3f612ae4d04..1cc6ea3e1d6 100644 --- a/www/core/components/fileuploader/services/handlers.js +++ b/www/core/components/fileuploader/services/handlers.js @@ -247,25 +247,25 @@ angular.module('mm.core.fileuploader') if (!uploadFileScope) { // Create a scope for the on change directive. uploadFileScope = $rootScope.$new(); + } - uploadFileScope.filePicked = function(evt) { - var input = evt.srcElement; - var file = input.files[0]; - input.value = ''; // Unset input. - if (!file) { - return; + uploadFileScope.filePicked = function(evt) { + var input = evt.srcElement; + var file = input.files[0]; + input.value = ''; // Unset input. + if (!file) { + return; + } + + // Upload the picked file. + $mmFileUploaderHelper.uploadFileObject(file, maxSize, upload, allowOffline).then(function(result) { + $mmFileUploaderHelper.fileUploaded(result); + }).catch(function(error) { + if (error) { + $mmUtil.showErrorModal(error); } - - // Upload the picked file. - $mmFileUploaderHelper.uploadFileObject(file, maxSize, upload, allowOffline).then(function(result) { - $mmFileUploaderHelper.fileUploaded(result); - }).catch(function(error) { - if (error) { - $mmUtil.showErrorModal(error); - } - }); - }; - } + }); + }; $compile(input)(uploadFileScope); From f8b847f654c7e6cf4aa60c198f1444fe28b34279 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 25 Jul 2017 13:00:27 +0200 Subject: [PATCH 083/118] MOBILE-2178 database: Fix database prefetch --- www/addons/mod/data/controllers/index.js | 1 - www/addons/mod/data/services/prefetch_handler.js | 6 +++--- www/core/components/course/services/prefetchfactory.js | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 258873390b1..230f022cd21 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -66,7 +66,6 @@ angular.module('mm.addons.mod_data') $scope.description = data.intro || $scope.description; $scope.data = databaseData; - $scope.database = data; if (sync) { // Try to synchronize the database. return syncDatabase(showErrors).catch(function() { diff --git a/www/addons/mod/data/services/prefetch_handler.js b/www/addons/mod/data/services/prefetch_handler.js index bfd3afb8fa4..493a2723e16 100644 --- a/www/addons/mod/data/services/prefetch_handler.js +++ b/www/addons/mod/data/services/prefetch_handler.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataPrefetchHandler */ .factory('$mmaModDataPrefetchHandler', function($mmaModData, mmaModDataComponent, $mmFilepool, $q, $mmUtil, $mmPrefetchFactory, - $mmSite, $mmGroups, $mmCourse) { + $mmSite, $mmGroups, $mmCourse, $mmComments) { var self = $mmPrefetchFactory.createPrefetchHandler(mmaModDataComponent); @@ -130,7 +130,7 @@ angular.module('mm.addons.mod_data') var promises = []; angular.forEach(groups, function(group) { - promises.push($mmaModData.fetchAllEntries(dataId, group.id, undefined, undefined, undefined, undefined, forceCache, + promises.push($mmaModData.fetchAllEntries(dataId, group.id, undefined, undefined, undefined, forceCache, ignoreCache, siteId)); }); @@ -319,7 +319,7 @@ angular.module('mm.addons.mod_data') siteId = siteId || $mmSite.getId(); // Prefetch the database data. - return getDatabaseInfoHelper(module, courseId, false, true, siteId).then(function(info) { + return getDatabaseInfoHelper(module, courseId, false, false, true, siteId).then(function(info) { var database = info.database, promises = []; diff --git a/www/core/components/course/services/prefetchfactory.js b/www/core/components/course/services/prefetchfactory.js index b651a2d01e6..db6dabfbd0a 100644 --- a/www/core/components/course/services/prefetchfactory.js +++ b/www/core/components/course/services/prefetchfactory.js @@ -278,7 +278,7 @@ angular.module('mm.core.course') } if (module.description) { - return $q.when($mmUtil.extractDownloadableFilesFromHtmlAsFakeFileObjects(module.description)); + return $mmUtil.extractDownloadableFilesFromHtmlAsFakeFileObjects(module.description); } return []; From ca56066c57df0b318e258ba9319895ccde89294a Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 25 Jul 2017 13:15:17 +0200 Subject: [PATCH 084/118] MOBILE-2178 database: Fix isEmpty and pagination in list --- www/addons/mod/data/controllers/index.js | 6 +++--- www/addons/mod/data/templates/index.html | 1 - www/core/scss/styles.scss | 4 ++++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 230f022cd21..d131c30e69e 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -190,9 +190,9 @@ angular.module('mm.addons.mod_data') $scope.search.page); } }).then(function(entries) { - $scope.numEntries = entries && entries.totalcount; - $scope.isEmpty = $scope.numEntries <= 0 && $scope.offlineActions.length <= 0; - $scope.hasNextPage = (($scope.search.page + 1) * mmaModDataPerPage) < $scope.numEntries; + var numEntries = (entries && entries.entries && entries.entries.length) || 0; + $scope.isEmpty = !numEntries && Object.keys($scope.offlineActions).length <= 0; + $scope.hasNextPage = numEntries >= mmaModDataPerPage && (($scope.search.page + 1) * mmaModDataPerPage) < entries.totalcount; $scope.entriesRendered = ""; if (!$scope.isEmpty) { diff --git a/www/addons/mod/data/templates/index.html b/www/addons/mod/data/templates/index.html index 5015b47d459..fb2446fbac7 100644 --- a/www/addons/mod/data/templates/index.html +++ b/www/addons/mod/data/templates/index.html @@ -49,7 +49,6 @@
    -{{ text }} \ No newline at end of file +{{ value.content }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/multimenu/directive.js b/www/addons/mod/data/fields/multimenu/directive.js index 2c03ba665bb..612b71d7f7b 100644 --- a/www/addons/mod/data/fields/multimenu/directive.js +++ b/www/addons/mod/data/fields/multimenu/directive.js @@ -14,6 +14,12 @@ angular.module('mm.addons.mod_data') +.filter('mmaModDataFieldMultimenuFormat', function() { + return function(text) { + return text.split("##").join("
    "); + }; +}) + /** * Directive to render data multimenu field. * @@ -29,7 +35,6 @@ angular.module('mm.addons.mod_data') link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; if (scope.mode == 'show') { - scope.text = scope.value && scope.value.content ? scope.value.content.split("##").join("
    ") : ""; return; } diff --git a/www/addons/mod/data/fields/multimenu/template.html b/www/addons/mod/data/fields/multimenu/template.html index d5ff2a43fb2..bae95d7a2ce 100644 --- a/www/addons/mod/data/fields/multimenu/template.html +++ b/www/addons/mod/data/fields/multimenu/template.html @@ -2,4 +2,4 @@ {{ error }} {{ 'mma.mod_data.selectedrequired' | translate }} -{{ text }} \ No newline at end of file +{{ value.content | mmaModDataFieldMultimenuFormat }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/number/directive.js b/www/addons/mod/data/fields/number/directive.js index 7b0708dc79a..b3dcb81413d 100644 --- a/www/addons/mod/data/fields/number/directive.js +++ b/www/addons/mod/data/fields/number/directive.js @@ -28,10 +28,6 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/number/template.html', link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; - if (scope.mode == 'show') { - scope.text = scope.value ? scope.value.content : ""; - return; - } if (scope.mode == 'edit' && scope.value) { scope.val = scope.value && parseFloat(scope.value.content); diff --git a/www/addons/mod/data/fields/number/template.html b/www/addons/mod/data/fields/number/template.html index ee80050dfb6..4f1dd5780ab 100644 --- a/www/addons/mod/data/fields/number/template.html +++ b/www/addons/mod/data/fields/number/template.html @@ -1,4 +1,4 @@ {{ error }} -{{ text }} \ No newline at end of file +{{ value.content }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/picture/directive.js b/www/addons/mod/data/fields/picture/directive.js index 7c81317bfa2..cf5a0419f5b 100644 --- a/www/addons/mod/data/fields/picture/directive.js +++ b/www/addons/mod/data/fields/picture/directive.js @@ -33,49 +33,68 @@ angular.module('mm.addons.mod_data') return false; } + /** + * Given an input value, extract the image files and all the required data. + * + * @param {Object} scope Directive's scope. + * @param {Object} value Field value. + * @return {Void} + */ + function treatFiles(scope, value) { + var files = value && value.files || []; + + // Get image or thumb. + if (files.length > 0) { + var filenameSeek = scope.mode == 'list' ? 'thumb_' + value.content : value.content; + scope.image = findFile(files, filenameSeek); + + if (!scope.image && scope.mode == 'list') { + scope.image = findFile(files, value.content); + } + + scope.files = [scope.image]; + } else { + scope.image = false; + scope.files = []; + } + + if (scope.mode == 'edit') { + scope.maxSizeBytes = parseInt(scope.field.param3, 10); + $mmFileSession.setFiles(mmaModDataComponent, scope.database.id + '_' + scope.field.id, scope.files); + scope.alttext = (value && value.content1) || ""; + } else { + scope.entryId = (value && value.recordid) || false; + scope.title = (value && value.content1) || ""; + scope.imageUrl = false; + if (scope.image) { + if (scope.image.offline) { + scope.imageUrl = (scope.image && scope.image.toURL()) || false; + } else { + scope.imageUrl = (scope.image && scope.image.fileurl) || false; + } + } + scope.width = scope.field.param1 || ""; + scope.height = scope.field.param2 || ""; + } + } + return { restrict: 'A', priority: 100, templateUrl: 'addons/mod/data/fields/picture/template.html', link: function(scope) { if (scope.mode != 'search') { - var files = scope.value && scope.value.files || []; - scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; - // Get image or thumb. - if (files.length > 0) { - var filenameSeek = scope.mode == 'list' ? 'thumb_' + scope.value.content : scope.value.content; - scope.image = findFile(files, filenameSeek); - - if (!scope.image && scope.mode == 'list') { - scope.image = findFile(files, scope.value.content); - } - - scope.files = [scope.image]; - } else { - scope.image = false; - scope.files = []; - } - - if (scope.mode == 'edit') { - scope.maxSizeBytes = parseInt(scope.field.param3, 10); - $mmFileSession.setFiles(mmaModDataComponent, scope.database.id + '_' + scope.field.id, scope.files); - scope.alttext = (scope.value && scope.value.content1) || ""; + if (scope.mode == 'show') { + // Displaying the list of files, watch the value to update the list if it changes. + scope.$watch('value', function(newValue) { + treatFiles(scope, newValue); + }); } else { - scope.entryId = (scope.value && scope.value.recordid) || false; - scope.title = (scope.value && scope.value.content1) || ""; - scope.imageUrl = false; - if (scope.image) { - if (scope.image.offline) { - scope.imageUrl = (scope.image && scope.image.toURL()) || false; - } else { - scope.imageUrl = (scope.image && scope.image.fileurl) || false; - } - } - scope.width = scope.field.param1 || ""; - scope.height = scope.field.param2 || ""; + // Edit mode, the list shouldn't change so there is no need to watch it. + treatFiles(scope, scope.value); } } } diff --git a/www/addons/mod/data/fields/radiobutton/directive.js b/www/addons/mod/data/fields/radiobutton/directive.js index 4d33daace68..86eaf2bd78f 100644 --- a/www/addons/mod/data/fields/radiobutton/directive.js +++ b/www/addons/mod/data/fields/radiobutton/directive.js @@ -29,7 +29,6 @@ angular.module('mm.addons.mod_data') link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; if (scope.mode == 'show') { - scope.text = scope.value ? scope.value.content : ""; return; } diff --git a/www/addons/mod/data/fields/radiobutton/template.html b/www/addons/mod/data/fields/radiobutton/template.html index 38a0de74239..0966a1b3f34 100644 --- a/www/addons/mod/data/fields/radiobutton/template.html +++ b/www/addons/mod/data/fields/radiobutton/template.html @@ -6,4 +6,4 @@
    -{{ text }} \ No newline at end of file +{{ value.content }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/text/directive.js b/www/addons/mod/data/fields/text/directive.js index dc6352f4a16..18bdb2c3362 100644 --- a/www/addons/mod/data/fields/text/directive.js +++ b/www/addons/mod/data/fields/text/directive.js @@ -28,10 +28,6 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/text/template.html', link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; - if (scope.mode == 'show') { - scope.text = scope.value ? scope.value.content : ""; - return; - } if (scope.mode == 'edit' && scope.value) { scope.val = scope.value.content; diff --git a/www/addons/mod/data/fields/text/template.html b/www/addons/mod/data/fields/text/template.html index 926a77c56c0..3fe5aa19cba 100644 --- a/www/addons/mod/data/fields/text/template.html +++ b/www/addons/mod/data/fields/text/template.html @@ -1,4 +1,4 @@ {{ error }} -{{ text }} \ No newline at end of file +{{ value.content }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/textarea/directive.js b/www/addons/mod/data/fields/textarea/directive.js index 58edaf071c7..66662e9d2ad 100644 --- a/www/addons/mod/data/fields/textarea/directive.js +++ b/www/addons/mod/data/fields/textarea/directive.js @@ -14,6 +14,13 @@ angular.module('mm.addons.mod_data') +.filter('mmaModDataFieldTextareaFormat', function($mmText) { + return function(value) { + var files = (value && value.files) || []; + return value ? $mmText.replacePluginfileUrls(value.content, files) : ''; + }; +}) + /** * Directive to render data textarea field. * @@ -21,7 +28,7 @@ angular.module('mm.addons.mod_data') * @ngdoc directive * @name mmaModDataFieldTextarea */ -.directive('mmaModDataFieldTextarea', function($mmUtil, $mmText, mmaModDataComponent) { +.directive('mmaModDataFieldTextarea', function($mmText, mmaModDataComponent) { return { restrict: 'A', priority: 100, @@ -31,24 +38,18 @@ angular.module('mm.addons.mod_data') if (scope.mode == 'show') { scope.component = mmaModDataComponent; scope.componentId = scope.database.coursemodule; - - var files = (scope.value && scope.value.files) || []; - - scope.text = scope.value ? $mmText.replacePluginfileUrls(scope.value.content, files) : ""; return; } // Check if rich text editor is enabled. if (scope.mode == 'edit') { - $mmUtil.isRichTextEditorEnabled().then(function(enabled) { - var files = (scope.value && scope.value.files) || [], - text = scope.value ? $mmText.replacePluginfileUrls(scope.value.content, files) : ""; + var files = (scope.value && scope.value.files) || [], + text = scope.value ? $mmText.replacePluginfileUrls(scope.value.content, files) : ""; - // Get the text. - scope.model = { - text: text - }; - }); + // Get the text. + scope.model = { + text: text + }; scope.firstRender = function() { if (!scope.value) { diff --git a/www/addons/mod/data/fields/textarea/template.html b/www/addons/mod/data/fields/textarea/template.html index f3623b92ab7..4260325d1a6 100644 --- a/www/addons/mod/data/fields/textarea/template.html +++ b/www/addons/mod/data/fields/textarea/template.html @@ -4,4 +4,4 @@
    -{{ text }} \ No newline at end of file +{{ value | mmaModDataFieldTextareaFormat }} \ No newline at end of file diff --git a/www/addons/mod/data/fields/url/directive.js b/www/addons/mod/data/fields/url/directive.js index e621cbe2e3f..5306dbd9904 100644 --- a/www/addons/mod/data/fields/url/directive.js +++ b/www/addons/mod/data/fields/url/directive.js @@ -28,10 +28,6 @@ angular.module('mm.addons.mod_data') templateUrl: 'addons/mod/data/fields/url/template.html', link: function(scope) { scope.mode = scope.mode == 'list' ? 'show' : scope.mode; - if (scope.mode == 'show') { - scope.text = scope.value ? scope.value.content : ""; - return; - } if (scope.mode == 'edit' && scope.value) { scope.val = scope.value.content; diff --git a/www/addons/mod/data/fields/url/template.html b/www/addons/mod/data/fields/url/template.html index a49c0438d7b..1a97133288e 100644 --- a/www/addons/mod/data/fields/url/template.html +++ b/www/addons/mod/data/fields/url/template.html @@ -1,3 +1,3 @@ -
    {{field.name}} \ No newline at end of file +{{field.name}} From c698bd67f06a3c00f71780419797ace843b163b1 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 13:21:46 +0200 Subject: [PATCH 104/118] MOBILE-2178 database: Allow editing offline entries in offline --- www/addons/mod/data/services/data.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index c2de10b9f0f..5454e64c275 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -680,7 +680,11 @@ angular.module('mm.addons.mod_data') }).then(function() { if (justAdded) { // The field was added offline, add again and stop. - return self.addEntry(dataId, entryId, courseId, contents, groupId, fields, siteId, forceOffline); + return self.addEntry(dataId, entryId, courseId, contents, groupId, fields, siteId, forceOffline) + .then(function(result) { + result.updated = true; + return result; + }); } if (!$mmApp.isOnline() || forceOffline) { From 7f34948e0ed5ed6deae669c305fc9e54c78f1dde Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 27 Jul 2017 15:38:15 +0200 Subject: [PATCH 105/118] MOBILE-2178 database: Fix sync errors and autom sync detection --- www/addons/mod/data/controllers/entry.js | 6 ++-- www/addons/mod/data/controllers/index.js | 2 +- www/addons/mod/data/services/data_offline.js | 23 +++++++++++++- www/addons/mod/data/services/data_sync.js | 33 +++++++++++--------- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 82731060624..be4b8fdea49 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -214,13 +214,15 @@ angular.module('mm.addons.mod_data') // Refresh entry on sync. syncObserver = $mmEvents.on(mmaModDataEventAutomSynced, function(eventData) { - if (eventData.entryid == entryId && data.id == eventData.dataid && $mmSite.getId() == eventData.siteid) { + if ((eventData.entryid == entryId || eventData.offlineentryid == entryId) && data.id == eventData.dataid && + $mmSite.getId() == eventData.siteid) { if (eventData.deleted) { // If deleted, go back. $ionicHistory.goBack(); } else { + entryId = eventData.entryid; $scope.databaseLoaded = false; - return fetchEntryData(true); + fetchEntryData(true); } } }); diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index d131c30e69e..168499440ce 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -439,7 +439,7 @@ angular.module('mm.addons.mod_data') // Update just when all database is synced. if (data.id == eventData.dataid && siteId == eventData.siteid && typeof eventData.entryid == "undefined") { $scope.databaseLoaded = false; - return fetchDatabaseData(true); + fetchDatabaseData(true); } }); diff --git a/www/addons/mod/data/services/data_offline.js b/www/addons/mod/data/services/data_offline.js index 4cab769cdf0..916a46ae8cc 100644 --- a/www/addons/mod/data/services/data_offline.js +++ b/www/addons/mod/data/services/data_offline.js @@ -62,6 +62,27 @@ angular.module('mm.addons.mod_data') var self = {}; + /** + * Delete all the actions of an entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataOffline#deleteAllEntryActions + * @param {Number} dataId Database ID. + * @param {Number} entryId Database entry ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if deleted, rejected if failure. + */ + self.deleteAllEntryActions = function(dataId, entryId, siteId) { + return self.getEntryActions(dataId, entryId, siteId).then(function(actions) { + var promises = []; + angular.forEach(actions, function(action) { + promises.push(self.deleteEntry(dataId, entryId, action.action, siteId)); + }); + return $q.all(promises); + }); + }; + /** * Delete an stored entry. * @@ -122,7 +143,7 @@ angular.module('mm.addons.mod_data') * @param {Number} dataId Database ID. * @param {String} entryId Database entry Id. * @param {String} [siteId] Site ID. If not defined, current site. - * @return {Promise} Promise resolved with entry. + * @return {Promise} Promise resolved with entry actions. */ self.getEntryActions = function(dataId, entryId, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { diff --git a/www/addons/mod/data/services/data_sync.js b/www/addons/mod/data/services/data_sync.js index 20300452faa..5618175fa6c 100644 --- a/www/addons/mod/data/services/data_sync.js +++ b/www/addons/mod/data/services/data_sync.js @@ -188,7 +188,7 @@ angular.module('mm.addons.mod_data') }); angular.forEach(offlineEntries, function(entryActions) { - promises.push(syncEntry(data, entryActions, result.warnings, siteId)); + promises.push(syncEntry(data, entryActions, result, siteId)); }); return $q.all(promises); @@ -216,16 +216,17 @@ angular.module('mm.addons.mod_data') /** * Synchronize an entry. * - * @param {Object} data Database. - * @param {Object} entryActions Entry actions. - * @param {Object[]} warnings List of warnings. - * @param {String} [siteId] Site ID. If not defined, current site. - * @return {Promise} Promise resolved if success, rejected otherwise. + * @param {Object} data Database. + * @param {Object} entryActions Entry actions. + * @param {Object} result Object with the result of the sync. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved if success, rejected otherwise. */ - function syncEntry(data, entryActions, warnings, siteId) { + function syncEntry(data, entryActions, result, siteId) { var discardError, timePromise, entryId = 0, + offlineId, deleted = false, promises = []; @@ -237,20 +238,22 @@ angular.module('mm.addons.mod_data') entryId = entryActions[0].entryid; if (entryId > 0) { - timePromise = $mmaModData.getEntry(data.id, entryActions[0].entryid, siteId).then(function(entry) { + timePromise = $mmaModData.getEntry(data.id, entryId, siteId).then(function(entry) { return entry.entry.timemodified; }).catch(function() { return -1; }); } else { + offlineId = entryId; timePromise = $q.when(0); } return timePromise.then(function(timemodified) { if (timemodified < 0 || timemodified >= entryActions[0].timemodified) { // The entry was not found in Moodle or the entry has been modified, discard the action. + result.updated = true; discardError = $translate.instant('mma.mod_data.warningsubmissionmodified'); - return; + return $mmaModDataOffline.deleteAllEntryActions(data.id, entryId, siteId); } angular.forEach(entryActions, function(action) { @@ -310,6 +313,7 @@ angular.module('mm.addons.mod_data') } }).then(function() { // Delete the offline data. + result.updated = true; return $mmaModDataOffline.deleteEntry(action.dataid, action.entryid, action.action, siteId); })); }); @@ -323,17 +327,18 @@ angular.module('mm.addons.mod_data') error: discardError }); - if (warnings.indexOf(message) == -1) { - warnings.push(message); + if (result.warnings.indexOf(message) == -1) { + result.warnings.push(message); } } // Sync done. Send event. $mmEvents.trigger(mmaModDataEventAutomSynced, { siteid: siteId, - dataid: action.dataid, - entryid: action.entryid, - warnings: warnings, + dataid: data.id, + entryid: entryId, + offlineentryid: offlineId, + warnings: result.warnings, deleted: deleted }); }); From cf352f71e1dfb1d07fdde33cc3b875857a2dc83f Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 27 Jul 2017 17:30:17 +0200 Subject: [PATCH 106/118] MOBILE-2178 release: Delete unused old language files --- www/addons/calendar/lang/es_mx.json | 3 --- www/addons/calendar/lang/pt_br.json | 4 ---- www/addons/calendar/lang/zh_cn.json | 4 ---- www/addons/calendar/lang/zh_tw.json | 3 --- www/addons/frontpage/lang/es_mx.json | 3 --- www/addons/frontpage/lang/pt_br.json | 3 --- www/addons/frontpage/lang/zh_cn.json | 3 --- www/addons/frontpage/lang/zh_tw.json | 3 --- www/addons/messages/lang/es_mx.json | 13 ------------ www/addons/messages/lang/pt_br.json | 13 ------------ www/addons/messages/lang/zh_cn.json | 13 ------------ www/addons/messages/lang/zh_tw.json | 13 ------------ www/addons/mod/assign/lang/es_mx.json | 10 ---------- www/addons/mod/assign/lang/pt_br.json | 10 ---------- www/addons/mod/assign/lang/zh_cn.json | 10 ---------- www/addons/mod/assign/lang/zh_tw.json | 10 ---------- www/addons/mod/book/lang/es_mx.json | 3 --- www/addons/mod/book/lang/pt_br.json | 3 --- www/addons/mod/book/lang/zh_cn.json | 3 --- www/addons/mod/book/lang/zh_tw.json | 3 --- www/addons/mod/chat/lang/es_mx.json | 13 ------------ www/addons/mod/chat/lang/pt_br.json | 13 ------------ www/addons/mod/chat/lang/zh_cn.json | 13 ------------ www/addons/mod/chat/lang/zh_tw.json | 13 ------------ www/addons/mod/folder/lang/es_mx.json | 3 --- www/addons/mod/folder/lang/pt_br.json | 3 --- www/addons/mod/folder/lang/zh_cn.json | 3 --- www/addons/mod/folder/lang/zh_tw.json | 3 --- www/addons/mod/forum/lang/es_mx.json | 1 - www/addons/mod/forum/lang/pt_br.json | 3 --- www/addons/mod/forum/lang/zh_cn.json | 3 --- www/addons/mod/forum/lang/zh_tw.json | 3 --- www/addons/mod/imscp/lang/es_mx.json | 3 --- www/addons/mod/imscp/lang/pt_br.json | 3 --- www/addons/mod/imscp/lang/zh_cn.json | 3 --- www/addons/mod/imscp/lang/zh_tw.json | 3 --- www/addons/mod/label/lang/es_mx.json | 3 --- www/addons/mod/label/lang/pt_br.json | 3 --- www/addons/mod/label/lang/zh_cn.json | 3 --- www/addons/mod/label/lang/zh_tw.json | 3 --- www/addons/mod/page/lang/es_mx.json | 1 - www/addons/mod/page/lang/pt_br.json | 1 - www/addons/mod/page/lang/zh_cn.json | 1 - www/addons/mod/page/lang/zh_tw.json | 1 - www/addons/mod/resource/lang/es_mx.json | 1 - www/addons/mod/resource/lang/pt_br.json | 1 - www/addons/mod/resource/lang/zh_cn.json | 1 - www/addons/mod/resource/lang/zh_tw.json | 1 - www/addons/mod/url/lang/es_mx.json | 1 - www/addons/mod/url/lang/pt_br.json | 1 - www/addons/mod/url/lang/zh_cn.json | 1 - www/addons/mod/url/lang/zh_tw.json | 1 - www/addons/notes/lang/es_mx.json | 9 --------- www/addons/notes/lang/pt_br.json | 9 --------- www/addons/notes/lang/zh_cn.json | 9 --------- www/addons/notes/lang/zh_tw.json | 9 --------- www/addons/notifications/lang/es_mx.json | 4 ---- www/addons/notifications/lang/pt_br.json | 4 ---- www/addons/notifications/lang/zh_cn.json | 4 ---- www/addons/notifications/lang/zh_tw.json | 4 ---- www/addons/participants/lang/cs.json | 4 ---- www/addons/participants/lang/es_mx.json | 3 --- www/addons/participants/lang/it.json | 4 ---- www/addons/participants/lang/pt_br.json | 3 --- www/addons/participants/lang/zh_cn.json | 3 --- www/addons/participants/lang/zh_tw.json | 3 --- www/core/components/course/lang/es_mx.json | 4 ---- www/core/components/course/lang/pt_br.json | 4 ---- www/core/components/course/lang/zh_cn.json | 4 ---- www/core/components/course/lang/zh_tw.json | 4 ---- www/core/components/courses/lang/es_mx.json | 5 ----- www/core/components/courses/lang/pt_br.json | 5 ----- www/core/components/courses/lang/zh_cn.json | 5 ----- www/core/components/courses/lang/zh_tw.json | 5 ----- www/core/components/grades/lang/es_mx.json | 12 ----------- www/core/components/grades/lang/pt_br.json | 13 ------------ www/core/components/grades/lang/zh_cn.json | 13 ------------ www/core/components/grades/lang/zh_tw.json | 12 ----------- www/core/components/login/lang/es_mx.json | 21 -------------------- www/core/components/login/lang/pt_br.json | 21 -------------------- www/core/components/login/lang/zh_cn.json | 21 -------------------- www/core/components/login/lang/zh_tw.json | 21 -------------------- www/core/components/settings/lang/es_mx.json | 15 -------------- www/core/components/settings/lang/pt_br.json | 15 -------------- www/core/components/settings/lang/zh_cn.json | 15 -------------- www/core/components/settings/lang/zh_tw.json | 15 -------------- www/core/components/sidemenu/lang/es_mx.json | 6 ------ www/core/components/sidemenu/lang/pt_br.json | 6 ------ www/core/components/sidemenu/lang/zh_cn.json | 6 ------ www/core/components/sidemenu/lang/zh_tw.json | 6 ------ www/core/components/user/lang/es_mx.json | 17 ---------------- www/core/components/user/lang/pt_br.json | 17 ---------------- www/core/components/user/lang/zh_cn.json | 17 ---------------- www/core/components/user/lang/zh_tw.json | 17 ---------------- 94 files changed, 634 deletions(-) delete mode 100644 www/addons/calendar/lang/es_mx.json delete mode 100644 www/addons/calendar/lang/pt_br.json delete mode 100644 www/addons/calendar/lang/zh_cn.json delete mode 100644 www/addons/calendar/lang/zh_tw.json delete mode 100644 www/addons/frontpage/lang/es_mx.json delete mode 100644 www/addons/frontpage/lang/pt_br.json delete mode 100644 www/addons/frontpage/lang/zh_cn.json delete mode 100644 www/addons/frontpage/lang/zh_tw.json delete mode 100644 www/addons/messages/lang/es_mx.json delete mode 100644 www/addons/messages/lang/pt_br.json delete mode 100644 www/addons/messages/lang/zh_cn.json delete mode 100644 www/addons/messages/lang/zh_tw.json delete mode 100644 www/addons/mod/assign/lang/es_mx.json delete mode 100644 www/addons/mod/assign/lang/pt_br.json delete mode 100644 www/addons/mod/assign/lang/zh_cn.json delete mode 100644 www/addons/mod/assign/lang/zh_tw.json delete mode 100644 www/addons/mod/book/lang/es_mx.json delete mode 100644 www/addons/mod/book/lang/pt_br.json delete mode 100644 www/addons/mod/book/lang/zh_cn.json delete mode 100644 www/addons/mod/book/lang/zh_tw.json delete mode 100644 www/addons/mod/chat/lang/es_mx.json delete mode 100644 www/addons/mod/chat/lang/pt_br.json delete mode 100644 www/addons/mod/chat/lang/zh_cn.json delete mode 100644 www/addons/mod/chat/lang/zh_tw.json delete mode 100644 www/addons/mod/folder/lang/es_mx.json delete mode 100644 www/addons/mod/folder/lang/pt_br.json delete mode 100644 www/addons/mod/folder/lang/zh_cn.json delete mode 100644 www/addons/mod/folder/lang/zh_tw.json delete mode 100644 www/addons/mod/forum/lang/es_mx.json delete mode 100644 www/addons/mod/forum/lang/pt_br.json delete mode 100644 www/addons/mod/forum/lang/zh_cn.json delete mode 100644 www/addons/mod/forum/lang/zh_tw.json delete mode 100644 www/addons/mod/imscp/lang/es_mx.json delete mode 100644 www/addons/mod/imscp/lang/pt_br.json delete mode 100644 www/addons/mod/imscp/lang/zh_cn.json delete mode 100644 www/addons/mod/imscp/lang/zh_tw.json delete mode 100644 www/addons/mod/label/lang/es_mx.json delete mode 100644 www/addons/mod/label/lang/pt_br.json delete mode 100644 www/addons/mod/label/lang/zh_cn.json delete mode 100644 www/addons/mod/label/lang/zh_tw.json delete mode 100644 www/addons/mod/page/lang/es_mx.json delete mode 100644 www/addons/mod/page/lang/pt_br.json delete mode 100644 www/addons/mod/page/lang/zh_cn.json delete mode 100644 www/addons/mod/page/lang/zh_tw.json delete mode 100644 www/addons/mod/resource/lang/es_mx.json delete mode 100644 www/addons/mod/resource/lang/pt_br.json delete mode 100644 www/addons/mod/resource/lang/zh_cn.json delete mode 100644 www/addons/mod/resource/lang/zh_tw.json delete mode 100644 www/addons/mod/url/lang/es_mx.json delete mode 100644 www/addons/mod/url/lang/pt_br.json delete mode 100644 www/addons/mod/url/lang/zh_cn.json delete mode 100644 www/addons/mod/url/lang/zh_tw.json delete mode 100644 www/addons/notes/lang/es_mx.json delete mode 100644 www/addons/notes/lang/pt_br.json delete mode 100644 www/addons/notes/lang/zh_cn.json delete mode 100644 www/addons/notes/lang/zh_tw.json delete mode 100644 www/addons/notifications/lang/es_mx.json delete mode 100644 www/addons/notifications/lang/pt_br.json delete mode 100644 www/addons/notifications/lang/zh_cn.json delete mode 100644 www/addons/notifications/lang/zh_tw.json delete mode 100644 www/addons/participants/lang/cs.json delete mode 100644 www/addons/participants/lang/es_mx.json delete mode 100644 www/addons/participants/lang/it.json delete mode 100644 www/addons/participants/lang/pt_br.json delete mode 100644 www/addons/participants/lang/zh_cn.json delete mode 100644 www/addons/participants/lang/zh_tw.json delete mode 100644 www/core/components/course/lang/es_mx.json delete mode 100644 www/core/components/course/lang/pt_br.json delete mode 100644 www/core/components/course/lang/zh_cn.json delete mode 100644 www/core/components/course/lang/zh_tw.json delete mode 100644 www/core/components/courses/lang/es_mx.json delete mode 100644 www/core/components/courses/lang/pt_br.json delete mode 100644 www/core/components/courses/lang/zh_cn.json delete mode 100644 www/core/components/courses/lang/zh_tw.json delete mode 100644 www/core/components/grades/lang/es_mx.json delete mode 100644 www/core/components/grades/lang/pt_br.json delete mode 100644 www/core/components/grades/lang/zh_cn.json delete mode 100644 www/core/components/grades/lang/zh_tw.json delete mode 100644 www/core/components/login/lang/es_mx.json delete mode 100644 www/core/components/login/lang/pt_br.json delete mode 100644 www/core/components/login/lang/zh_cn.json delete mode 100644 www/core/components/login/lang/zh_tw.json delete mode 100644 www/core/components/settings/lang/es_mx.json delete mode 100644 www/core/components/settings/lang/pt_br.json delete mode 100644 www/core/components/settings/lang/zh_cn.json delete mode 100644 www/core/components/settings/lang/zh_tw.json delete mode 100644 www/core/components/sidemenu/lang/es_mx.json delete mode 100644 www/core/components/sidemenu/lang/pt_br.json delete mode 100644 www/core/components/sidemenu/lang/zh_cn.json delete mode 100644 www/core/components/sidemenu/lang/zh_tw.json delete mode 100644 www/core/components/user/lang/es_mx.json delete mode 100644 www/core/components/user/lang/pt_br.json delete mode 100644 www/core/components/user/lang/zh_cn.json delete mode 100644 www/core/components/user/lang/zh_tw.json diff --git a/www/addons/calendar/lang/es_mx.json b/www/addons/calendar/lang/es_mx.json deleted file mode 100644 index 43fb72dee96..00000000000 --- a/www/addons/calendar/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notifications": "Notificaciones" -} \ No newline at end of file diff --git a/www/addons/calendar/lang/pt_br.json b/www/addons/calendar/lang/pt_br.json deleted file mode 100644 index 3037d7d8cf5..00000000000 --- a/www/addons/calendar/lang/pt_br.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "noevents": "Sem eventos", - "notifications": "Notificação" -} \ No newline at end of file diff --git a/www/addons/calendar/lang/zh_cn.json b/www/addons/calendar/lang/zh_cn.json deleted file mode 100644 index 5fc1088f46f..00000000000 --- a/www/addons/calendar/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "noevents": "没有事件", - "notifications": "通知" -} \ No newline at end of file diff --git a/www/addons/calendar/lang/zh_tw.json b/www/addons/calendar/lang/zh_tw.json deleted file mode 100644 index 24e3b1a572b..00000000000 --- a/www/addons/calendar/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notifications": "通知" -} \ No newline at end of file diff --git a/www/addons/frontpage/lang/es_mx.json b/www/addons/frontpage/lang/es_mx.json deleted file mode 100644 index 30cd142b296..00000000000 --- a/www/addons/frontpage/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sitehome": "Portada" -} \ No newline at end of file diff --git a/www/addons/frontpage/lang/pt_br.json b/www/addons/frontpage/lang/pt_br.json deleted file mode 100644 index 107c32efb31..00000000000 --- a/www/addons/frontpage/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sitehome": "Página principal" -} \ No newline at end of file diff --git a/www/addons/frontpage/lang/zh_cn.json b/www/addons/frontpage/lang/zh_cn.json deleted file mode 100644 index 20eac284d87..00000000000 --- a/www/addons/frontpage/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sitehome": "首页" -} \ No newline at end of file diff --git a/www/addons/frontpage/lang/zh_tw.json b/www/addons/frontpage/lang/zh_tw.json deleted file mode 100644 index 6bff0d94024..00000000000 --- a/www/addons/frontpage/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sitehome": "首頁" -} \ No newline at end of file diff --git a/www/addons/messages/lang/es_mx.json b/www/addons/messages/lang/es_mx.json deleted file mode 100644 index 8de8efc8eff..00000000000 --- a/www/addons/messages/lang/es_mx.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "addcontact": "Añadir como contacto", - "blockcontact": "Bloquear contacto", - "contactlistempty": "La lista de contactos está vacía", - "contactname": "Nombre del contacto", - "contacts": "Contactos", - "messages": "mi Messenger", - "nomessages": "No hay mensajes en espera", - "removecontact": "Eliminar contacto", - "send": "Enviar", - "sendmessage": "Enviar un mensaje", - "unblockcontact": "Desbloquear contacto" -} \ No newline at end of file diff --git a/www/addons/messages/lang/pt_br.json b/www/addons/messages/lang/pt_br.json deleted file mode 100644 index fb4e3394639..00000000000 --- a/www/addons/messages/lang/pt_br.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "addcontact": "Adicionar como contato", - "blockcontact": "Bloquear contato", - "contactlistempty": "Lista de contatos vazia", - "contactname": "Nome para contato", - "contacts": "Contatos", - "messages": "Mensagens", - "nomessages": "Não há mensagens pendentes", - "removecontact": "Remover contato", - "send": "Enviar", - "sendmessage": "Envie uma mensagem", - "unblockcontact": "Desbloquear contato" -} \ No newline at end of file diff --git a/www/addons/messages/lang/zh_cn.json b/www/addons/messages/lang/zh_cn.json deleted file mode 100644 index 708e5a301b9..00000000000 --- a/www/addons/messages/lang/zh_cn.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "addcontact": "添加为联系人", - "blockcontact": "屏蔽联系人", - "contactlistempty": "您的联系人名单是空的", - "contactname": "联系人", - "contacts": "联系人", - "messages": "消息", - "nomessages": "没有新消息", - "removecontact": "删除联系人", - "send": "发送", - "sendmessage": "发送消息", - "unblockcontact": "不再阻拦联系人" -} \ No newline at end of file diff --git a/www/addons/messages/lang/zh_tw.json b/www/addons/messages/lang/zh_tw.json deleted file mode 100644 index b86c20e0f95..00000000000 --- a/www/addons/messages/lang/zh_tw.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "addcontact": "加入通訊錄", - "blockcontact": "封鎖聯絡人", - "contactlistempty": "您的通訊錄是空的", - "contactname": "聯絡人姓名", - "contacts": "通訊錄", - "messages": "我的簡訊", - "nomessages": "沒有待處理的簡訊", - "removecontact": "刪除聯絡人", - "send": "傳送", - "sendmessage": "傳送訊息", - "unblockcontact": "不再封鎖聯絡" -} \ No newline at end of file diff --git a/www/addons/mod/assign/lang/es_mx.json b/www/addons/mod/assign/lang/es_mx.json deleted file mode 100644 index 5e29ef33e38..00000000000 --- a/www/addons/mod/assign/lang/es_mx.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "addsubmission": "Añadir envío", - "allowsubmissionsfromdate": "Permitir envíos desde", - "attemptnumber": "Número de intento", - "cutoffdate": "Fecha de corte", - "duedate": "Fecha de entrega", - "duedateno": "No hay fecha de entrega", - "submissions": "Entregas", - "viewsubmission": "Ver entrega" -} \ No newline at end of file diff --git a/www/addons/mod/assign/lang/pt_br.json b/www/addons/mod/assign/lang/pt_br.json deleted file mode 100644 index ebcaf06b692..00000000000 --- a/www/addons/mod/assign/lang/pt_br.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "addsubmission": "Adicionar tarefa", - "allowsubmissionsfromdate": "Permite envios a partir de", - "attemptnumber": "Número da tentativa", - "cutoffdate": "Data limite", - "duedate": "Data de entrega", - "duedateno": "Nenhuma data de entrega", - "submissions": "Tarefas enviadas", - "viewsubmission": "Ver envio" -} \ No newline at end of file diff --git a/www/addons/mod/assign/lang/zh_cn.json b/www/addons/mod/assign/lang/zh_cn.json deleted file mode 100644 index 59341a88ccf..00000000000 --- a/www/addons/mod/assign/lang/zh_cn.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "addsubmission": "添加提交", - "allowsubmissionsfromdate": "开启时间", - "attemptnumber": "作业提交次数", - "cutoffdate": "提交截止时间", - "duedate": "截止时间", - "duedateno": "无截止时间", - "submissions": "提交信息", - "viewsubmission": "查看提交" -} \ No newline at end of file diff --git a/www/addons/mod/assign/lang/zh_tw.json b/www/addons/mod/assign/lang/zh_tw.json deleted file mode 100644 index 16a48d2186a..00000000000 --- a/www/addons/mod/assign/lang/zh_tw.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "addsubmission": "繳交作業", - "allowsubmissionsfromdate": "開始繳交時間", - "attemptnumber": "作業提交次數", - "cutoffdate": "拒收作業時間", - "duedate": "規定繳交時間", - "duedateno": "沒有規定繳交時間", - "submissions": "繳交", - "viewsubmission": "檢視繳交的作業" -} \ No newline at end of file diff --git a/www/addons/mod/book/lang/es_mx.json b/www/addons/mod/book/lang/es_mx.json deleted file mode 100644 index d5d45d924a2..00000000000 --- a/www/addons/mod/book/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "errorchapter": "Error al leer capítulo del libro." -} \ No newline at end of file diff --git a/www/addons/mod/book/lang/pt_br.json b/www/addons/mod/book/lang/pt_br.json deleted file mode 100644 index 4c5835d59ae..00000000000 --- a/www/addons/mod/book/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "errorchapter": "Erro ao ler capítulo de livro." -} \ No newline at end of file diff --git a/www/addons/mod/book/lang/zh_cn.json b/www/addons/mod/book/lang/zh_cn.json deleted file mode 100644 index 52b287ee7da..00000000000 --- a/www/addons/mod/book/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "errorchapter": "读取图书章节发生错误。" -} \ No newline at end of file diff --git a/www/addons/mod/book/lang/zh_tw.json b/www/addons/mod/book/lang/zh_tw.json deleted file mode 100644 index 32642d09bd0..00000000000 --- a/www/addons/mod/book/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "errorchapter": "讀取章節發生錯誤" -} \ No newline at end of file diff --git a/www/addons/mod/chat/lang/es_mx.json b/www/addons/mod/chat/lang/es_mx.json deleted file mode 100644 index d3e0fbd4d66..00000000000 --- a/www/addons/mod/chat/lang/es_mx.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "beep": "Bip", - "currentusers": "Usuarios", - "enterchat": "Entrar a la sala", - "entermessage": "Escriba su mensaje", - "messagebeepsyou": "{{$a}} le acaba de enviar un beep", - "messageenter": "{{$a}} entró a la sala", - "messageexit": "{{$a}} salió de la sala", - "nomessages": "Aún no hay mensajes", - "send": "Enviar", - "sessionstart": "La siguiente sesión de chat comenzará en: {{$a}}", - "talk": "Charla" -} \ No newline at end of file diff --git a/www/addons/mod/chat/lang/pt_br.json b/www/addons/mod/chat/lang/pt_br.json deleted file mode 100644 index af36af4277c..00000000000 --- a/www/addons/mod/chat/lang/pt_br.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "beep": "Bip", - "currentusers": "Usuários atuais", - "enterchat": "Clique aqui para entrar no chat agora", - "entermessage": "Digite sua mensagem", - "messagebeepsyou": "{{$a}} está bipando você!", - "messageenter": "{{$a}} entrou no chat", - "messageexit": "{{$a}} abandonou este chat", - "nomessages": "Nenhuma mensagem ainda", - "send": "Enviar", - "sessionstart": "A próxima sessão de chat irá começar em {{$a}}", - "talk": "Falar" -} \ No newline at end of file diff --git a/www/addons/mod/chat/lang/zh_cn.json b/www/addons/mod/chat/lang/zh_cn.json deleted file mode 100644 index b8c1f9af432..00000000000 --- a/www/addons/mod/chat/lang/zh_cn.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "beep": "呼叫", - "currentusers": "当前用户", - "enterchat": "进入聊天室", - "entermessage": "输入您的信息", - "messagebeepsyou": "{{$a}}刚刚呼叫您!", - "messageenter": "{{$a}}刚刚进入聊天室", - "messageexit": "{{$a}}已退出聊天室", - "nomessages": "无消息", - "send": "发送", - "sessionstart": "聊天会话开始时间:{{$a}}", - "talk": "交谈" -} \ No newline at end of file diff --git a/www/addons/mod/chat/lang/zh_tw.json b/www/addons/mod/chat/lang/zh_tw.json deleted file mode 100644 index 511cfbb8352..00000000000 --- a/www/addons/mod/chat/lang/zh_tw.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "beep": "呼叫", - "currentusers": "當前用戶", - "enterchat": "點選這裡進入聊天室", - "entermessage": "輸入您的訊息", - "messagebeepsyou": "{{$a}} 呼叫您", - "messageenter": "{{$a}} 剛加入這次聊天", - "messageexit": "{{$a}} 已退出這次聊天", - "nomessages": "尚無訊息", - "send": "傳送", - "sessionstart": "下一個對話時段將開始於:{{$a}}", - "talk": "交談" -} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/es_mx.json b/www/addons/mod/folder/lang/es_mx.json deleted file mode 100644 index 3a342984727..00000000000 --- a/www/addons/mod/folder/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "emptyfilelist": "No hay archivos que mostrar" -} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/pt_br.json b/www/addons/mod/folder/lang/pt_br.json deleted file mode 100644 index 0821fd73ad7..00000000000 --- a/www/addons/mod/folder/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "emptyfilelist": "Não há arquivos para exibir" -} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/zh_cn.json b/www/addons/mod/folder/lang/zh_cn.json deleted file mode 100644 index edc8a70a528..00000000000 --- a/www/addons/mod/folder/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "emptyfilelist": "没有可显示的文件" -} \ No newline at end of file diff --git a/www/addons/mod/folder/lang/zh_tw.json b/www/addons/mod/folder/lang/zh_tw.json deleted file mode 100644 index c53d23b870f..00000000000 --- a/www/addons/mod/folder/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "emptyfilelist": "沒有可以顯示的檔案" -} \ No newline at end of file diff --git a/www/addons/mod/forum/lang/es_mx.json b/www/addons/mod/forum/lang/es_mx.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/forum/lang/es_mx.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/forum/lang/pt_br.json b/www/addons/mod/forum/lang/pt_br.json deleted file mode 100644 index 9f3e79857ff..00000000000 --- a/www/addons/mod/forum/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "forumnodiscussionsyet": "Não existem tópicos neste fórum ainda" -} \ No newline at end of file diff --git a/www/addons/mod/forum/lang/zh_cn.json b/www/addons/mod/forum/lang/zh_cn.json deleted file mode 100644 index 266cde0a80d..00000000000 --- a/www/addons/mod/forum/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "forumnodiscussionsyet": "此论坛中还没有讨论话题" -} \ No newline at end of file diff --git a/www/addons/mod/forum/lang/zh_tw.json b/www/addons/mod/forum/lang/zh_tw.json deleted file mode 100644 index 21e18ea567e..00000000000 --- a/www/addons/mod/forum/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "forumnodiscussionsyet": "這個討論區還沒有討論主題" -} \ No newline at end of file diff --git a/www/addons/mod/imscp/lang/es_mx.json b/www/addons/mod/imscp/lang/es_mx.json deleted file mode 100644 index 175d34d526d..00000000000 --- a/www/addons/mod/imscp/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "deploymenterror": "¡Error en paquete de contenidos!" -} \ No newline at end of file diff --git a/www/addons/mod/imscp/lang/pt_br.json b/www/addons/mod/imscp/lang/pt_br.json deleted file mode 100644 index cb7e6aec6a1..00000000000 --- a/www/addons/mod/imscp/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "deploymenterror": "Erro no conte" -} \ No newline at end of file diff --git a/www/addons/mod/imscp/lang/zh_cn.json b/www/addons/mod/imscp/lang/zh_cn.json deleted file mode 100644 index 29923d4664e..00000000000 --- a/www/addons/mod/imscp/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "deploymenterror": "内容包有错!" -} \ No newline at end of file diff --git a/www/addons/mod/imscp/lang/zh_tw.json b/www/addons/mod/imscp/lang/zh_tw.json deleted file mode 100644 index f2f35ec5337..00000000000 --- a/www/addons/mod/imscp/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "deploymenterror": "內容包有錯誤!" -} \ No newline at end of file diff --git a/www/addons/mod/label/lang/es_mx.json b/www/addons/mod/label/lang/es_mx.json deleted file mode 100644 index 129eb9e3838..00000000000 --- a/www/addons/mod/label/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "label": "Etiqueta" -} \ No newline at end of file diff --git a/www/addons/mod/label/lang/pt_br.json b/www/addons/mod/label/lang/pt_br.json deleted file mode 100644 index fdfc1ff9392..00000000000 --- a/www/addons/mod/label/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "label": "Rótulo" -} \ No newline at end of file diff --git a/www/addons/mod/label/lang/zh_cn.json b/www/addons/mod/label/lang/zh_cn.json deleted file mode 100644 index 4bbc4110d7a..00000000000 --- a/www/addons/mod/label/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "label": "标签" -} \ No newline at end of file diff --git a/www/addons/mod/label/lang/zh_tw.json b/www/addons/mod/label/lang/zh_tw.json deleted file mode 100644 index c1a016fd047..00000000000 --- a/www/addons/mod/label/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "label": "標籤" -} \ No newline at end of file diff --git a/www/addons/mod/page/lang/es_mx.json b/www/addons/mod/page/lang/es_mx.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/page/lang/es_mx.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/page/lang/pt_br.json b/www/addons/mod/page/lang/pt_br.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/page/lang/pt_br.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/page/lang/zh_cn.json b/www/addons/mod/page/lang/zh_cn.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/page/lang/zh_cn.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/page/lang/zh_tw.json b/www/addons/mod/page/lang/zh_tw.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/page/lang/zh_tw.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/resource/lang/es_mx.json b/www/addons/mod/resource/lang/es_mx.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/resource/lang/es_mx.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/resource/lang/pt_br.json b/www/addons/mod/resource/lang/pt_br.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/resource/lang/pt_br.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/resource/lang/zh_cn.json b/www/addons/mod/resource/lang/zh_cn.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/resource/lang/zh_cn.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/resource/lang/zh_tw.json b/www/addons/mod/resource/lang/zh_tw.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/resource/lang/zh_tw.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/url/lang/es_mx.json b/www/addons/mod/url/lang/es_mx.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/url/lang/es_mx.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/url/lang/pt_br.json b/www/addons/mod/url/lang/pt_br.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/url/lang/pt_br.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/url/lang/zh_cn.json b/www/addons/mod/url/lang/zh_cn.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/url/lang/zh_cn.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/mod/url/lang/zh_tw.json b/www/addons/mod/url/lang/zh_tw.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/www/addons/mod/url/lang/zh_tw.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/www/addons/notes/lang/es_mx.json b/www/addons/notes/lang/es_mx.json deleted file mode 100644 index 0eb20a78105..00000000000 --- a/www/addons/notes/lang/es_mx.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "addnewnote": "Añadir una nota nueva", - "coursenotes": "Notas del curso", - "eventnotecreated": "Nota creada", - "note": "Nota", - "personalnotes": "Notas personales", - "publishstate": "Contexto", - "sitenotes": "Notas del sitio" -} \ No newline at end of file diff --git a/www/addons/notes/lang/pt_br.json b/www/addons/notes/lang/pt_br.json deleted file mode 100644 index 3d49facd550..00000000000 --- a/www/addons/notes/lang/pt_br.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "addnewnote": "Escrever uma nova anotação", - "coursenotes": "Anotações do Curso", - "eventnotecreated": "Anotação criada", - "note": "Anotação", - "personalnotes": "Anotações individuais", - "publishstate": "Estado", - "sitenotes": "Anotações do site" -} \ No newline at end of file diff --git a/www/addons/notes/lang/zh_cn.json b/www/addons/notes/lang/zh_cn.json deleted file mode 100644 index 786909fa20c..00000000000 --- a/www/addons/notes/lang/zh_cn.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "addnewnote": "添加新备注", - "coursenotes": "课程备注", - "eventnotecreated": "创建了笔记", - "note": "备注", - "personalnotes": "私人备注", - "publishstate": "上下文", - "sitenotes": "全站备注" -} \ No newline at end of file diff --git a/www/addons/notes/lang/zh_tw.json b/www/addons/notes/lang/zh_tw.json deleted file mode 100644 index 2b90c1325c7..00000000000 --- a/www/addons/notes/lang/zh_tw.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "addnewnote": "添加一筆新註記", - "coursenotes": "課程註記", - "eventnotecreated": "已建立註記", - "note": "註記", - "personalnotes": "個人的註記", - "publishstate": "使用的情境", - "sitenotes": "網站註記" -} \ No newline at end of file diff --git a/www/addons/notifications/lang/es_mx.json b/www/addons/notifications/lang/es_mx.json deleted file mode 100644 index 80b4b5e0dbc..00000000000 --- a/www/addons/notifications/lang/es_mx.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "notifications": "Notificaciones", - "therearentnotificationsyet": "No hay notificaciones" -} \ No newline at end of file diff --git a/www/addons/notifications/lang/pt_br.json b/www/addons/notifications/lang/pt_br.json deleted file mode 100644 index 3913f917f41..00000000000 --- a/www/addons/notifications/lang/pt_br.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "notifications": "Notificação", - "therearentnotificationsyet": "Não há notificações" -} \ No newline at end of file diff --git a/www/addons/notifications/lang/zh_cn.json b/www/addons/notifications/lang/zh_cn.json deleted file mode 100644 index 7d236d7f15d..00000000000 --- a/www/addons/notifications/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "notifications": "通知", - "therearentnotificationsyet": "没有通知" -} \ No newline at end of file diff --git a/www/addons/notifications/lang/zh_tw.json b/www/addons/notifications/lang/zh_tw.json deleted file mode 100644 index 957a61b5db7..00000000000 --- a/www/addons/notifications/lang/zh_tw.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "notifications": "通知", - "therearentnotificationsyet": "沒有通知訊息" -} \ No newline at end of file diff --git a/www/addons/participants/lang/cs.json b/www/addons/participants/lang/cs.json deleted file mode 100644 index 2092b03a730..00000000000 --- a/www/addons/participants/lang/cs.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "noparticipants": "Pro tento kurz nenalezeni účastníci", - "participants": "Účastníci" -} \ No newline at end of file diff --git a/www/addons/participants/lang/es_mx.json b/www/addons/participants/lang/es_mx.json deleted file mode 100644 index 9ec3327c06d..00000000000 --- a/www/addons/participants/lang/es_mx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "participants": "Participantes" -} \ No newline at end of file diff --git a/www/addons/participants/lang/it.json b/www/addons/participants/lang/it.json deleted file mode 100644 index 0d16202be57..00000000000 --- a/www/addons/participants/lang/it.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "noparticipants": "In questo corso non sono stati trovati partecipanti", - "participants": "Partecipanti" -} \ No newline at end of file diff --git a/www/addons/participants/lang/pt_br.json b/www/addons/participants/lang/pt_br.json deleted file mode 100644 index 9ec3327c06d..00000000000 --- a/www/addons/participants/lang/pt_br.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "participants": "Participantes" -} \ No newline at end of file diff --git a/www/addons/participants/lang/zh_cn.json b/www/addons/participants/lang/zh_cn.json deleted file mode 100644 index 36c81dc05e0..00000000000 --- a/www/addons/participants/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "participants": "课程参与者" -} \ No newline at end of file diff --git a/www/addons/participants/lang/zh_tw.json b/www/addons/participants/lang/zh_tw.json deleted file mode 100644 index 64c7fde824b..00000000000 --- a/www/addons/participants/lang/zh_tw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "participants": "參與者" -} \ No newline at end of file diff --git a/www/core/components/course/lang/es_mx.json b/www/core/components/course/lang/es_mx.json deleted file mode 100644 index 174565e66ba..00000000000 --- a/www/core/components/course/lang/es_mx.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "contents": "Contenidos", - "showall": "Mostrar todo" -} \ No newline at end of file diff --git a/www/core/components/course/lang/pt_br.json b/www/core/components/course/lang/pt_br.json deleted file mode 100644 index ff9e75afa9c..00000000000 --- a/www/core/components/course/lang/pt_br.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "contents": "Conteúdos", - "showall": "Mostrar todos" -} \ No newline at end of file diff --git a/www/core/components/course/lang/zh_cn.json b/www/core/components/course/lang/zh_cn.json deleted file mode 100644 index 4e4dcf0c8d2..00000000000 --- a/www/core/components/course/lang/zh_cn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "contents": "内容", - "showall": "全部显示" -} \ No newline at end of file diff --git a/www/core/components/course/lang/zh_tw.json b/www/core/components/course/lang/zh_tw.json deleted file mode 100644 index 378159a75b6..00000000000 --- a/www/core/components/course/lang/zh_tw.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "contents": "內容", - "showall": "顯示全部" -} \ No newline at end of file diff --git a/www/core/components/courses/lang/es_mx.json b/www/core/components/courses/lang/es_mx.json deleted file mode 100644 index d2a05393d10..00000000000 --- a/www/core/components/courses/lang/es_mx.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "filter": "Filtro", - "frontpage": "Portada", - "mycourses": "Mis cursos" -} \ No newline at end of file diff --git a/www/core/components/courses/lang/pt_br.json b/www/core/components/courses/lang/pt_br.json deleted file mode 100644 index 91cd85aa064..00000000000 --- a/www/core/components/courses/lang/pt_br.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "filter": "Filtrar", - "frontpage": "Página principal", - "mycourses": "Meus cursos" -} \ No newline at end of file diff --git a/www/core/components/courses/lang/zh_cn.json b/www/core/components/courses/lang/zh_cn.json deleted file mode 100644 index cc50f82219a..00000000000 --- a/www/core/components/courses/lang/zh_cn.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "filter": "过滤器", - "frontpage": "首页", - "mycourses": "我的课程" -} \ No newline at end of file diff --git a/www/core/components/courses/lang/zh_tw.json b/www/core/components/courses/lang/zh_tw.json deleted file mode 100644 index b682781fb0c..00000000000 --- a/www/core/components/courses/lang/zh_tw.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "filter": "過濾器", - "frontpage": "首頁", - "mycourses": "我的課程" -} \ No newline at end of file diff --git a/www/core/components/grades/lang/es_mx.json b/www/core/components/grades/lang/es_mx.json deleted file mode 100644 index fcf81895629..00000000000 --- a/www/core/components/grades/lang/es_mx.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "average": "Promedio", - "feedback": "Retroalimentación", - "grade": "Calificación", - "grades": "Calificaciones", - "itemname": "Nombre del ítem", - "lettergrade": "Calificación por letra", - "percentage": "Porcentaje", - "range": "Rango", - "rank": "Rango", - "weight": "Peso" -} \ No newline at end of file diff --git a/www/core/components/grades/lang/pt_br.json b/www/core/components/grades/lang/pt_br.json deleted file mode 100644 index 13ebd263418..00000000000 --- a/www/core/components/grades/lang/pt_br.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "average": "Média", - "contributiontocoursetotal": "Contribuição ao total do curso", - "feedback": "Feedback", - "grade": "Notas", - "grades": "Notas", - "itemname": "Item de nota", - "lettergrade": "Nota letra", - "percentage": "Porcentagem", - "range": "Range", - "rank": "Posição", - "weight": "Peso" -} \ No newline at end of file diff --git a/www/core/components/grades/lang/zh_cn.json b/www/core/components/grades/lang/zh_cn.json deleted file mode 100644 index 83d3c3b88be..00000000000 --- a/www/core/components/grades/lang/zh_cn.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "average": "平均", - "contributiontocoursetotal": "贡献课程总数", - "feedback": "反馈", - "grade": "成绩", - "grades": "成绩", - "itemname": "评分项", - "lettergrade": "字母评分", - "percentage": "百分比", - "range": "范围", - "rank": "排名", - "weight": "权重" -} \ No newline at end of file diff --git a/www/core/components/grades/lang/zh_tw.json b/www/core/components/grades/lang/zh_tw.json deleted file mode 100644 index bd929c3fda5..00000000000 --- a/www/core/components/grades/lang/zh_tw.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "average": "平均", - "feedback": "回饋", - "grade": "成績", - "grades": "成績", - "itemname": "成績項名稱", - "lettergrade": "文字等第", - "percentage": "百分比", - "range": "範圍", - "rank": "排名", - "weight": "加權" -} \ No newline at end of file diff --git a/www/core/components/login/lang/es_mx.json b/www/core/components/login/lang/es_mx.json deleted file mode 100644 index 2b074964071..00000000000 --- a/www/core/components/login/lang/es_mx.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "authenticating": "Autenticando", - "cancel": "Cancelar", - "connect": "Conectar", - "help": "Ayuda", - "helpmelogin": "

    Existen varios miles de sitios Moodle en el mundo. Esta App solamente puede conectarse a sitios Moodle que hayan habilitado específicamente el acceso por Mobile App.

    Si Usted no puede conectarse a su sitio Moodle, entonces Usted necesita contactar a un administrador de Moodle en el lugar en donde Usted quiere conectarse y pedirle que lea http://docs.moodle.org/en/Mobile_app

    Para probar la App en un sitio Demo de Moodle escriba teacher o student en el campo de URL del sitio botón para Añadir.

    ", - "invalidaccount": "Por favor, verifique sus datos de acceso, o consulte con el administrador para revisar la configuración del sitio.", - "invalidmoodleversion": "Versión de Moodle inválida. La versión mínima requerida es:", - "invalidsite": "La URL del sitio es inválida.", - "login": "Ingresar", - "logininsiterequired": "Usted necesita ingresar al sitio con una ventana del navegador.", - "mobileservicesnotenabled": "Los servicios móviles no están habilitados en su sitio. Por favor, contacte a su administrador del sitio Moodle si Usted piensa que se debería habilitar el acceso por dispositivos móviles.", - "password": "Contraseña", - "passwordrequired": "Contraseña obligatoria", - "siteinmaintenance": "Su sitio está en modo de mantenimiento", - "siteurl": "URL del sitio", - "siteurlrequired": "La URL del sitio es obligatoria, por ejemplo http://www.yourmoodlesite.es o https://www.yourmoodlesite.org", - "username": "Nombre de usuario", - "usernamerequired": "Nombre de usuario obligatorio", - "webservicesnotenabled": "Los servicios web no están habilitados en su sitio. Por favor, contacte a su administrador del sitio Moodle si Usted piensa que se debería habilitar el acceso por dispositivos móviles." -} \ No newline at end of file diff --git a/www/core/components/login/lang/pt_br.json b/www/core/components/login/lang/pt_br.json deleted file mode 100644 index 0ea1899f488..00000000000 --- a/www/core/components/login/lang/pt_br.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "authenticating": "Autenticação", - "cancel": "Cancelar", - "connect": "Conectar", - "help": "Ajuda", - "helpmelogin": "

    Existem milhares de sites usando Moodle no mundo. Este aplicativo somente pode conectar com um Moodle se este foi especialmente configurado para permitir o acesso móvel.

    \nSe não conseguir se conectar com o seu Moodle, vai precisar entrar em contato com a administradora do seu Moodle e pedir ela acessar http://docs.moodle.org/en/Mobile_app

    \n

    Para testar o aplicativo em um site Moodle demo, digite teacher ou estudent no campo Usuário e clique no botão Adicionar.

    ", - "invalidaccount": "Por favor, verifique os detalhes de seu Usuário ou peça ao administrador do site para verificar a configuração do site.", - "invalidmoodleversion": "Versão do Moodle inválida. A versão mínima requerida é:", - "invalidsite": "A URL do siteé inválida.", - "login": "Acessar", - "logininsiterequired": "É preciso logar no site num navegador.", - "mobileservicesnotenabled": "Os serviços móveis não estão habilitados no seu Moodle. Por favor contate a administradora do seu Moodle se achar que o acesso móvel deveria estar habilitado", - "password": "Senha", - "passwordrequired": "Senha necessária", - "siteinmaintenance": "O site está em modo de manutenção", - "siteurl": "URL do site", - "siteurlrequired": "URL do site é obrigatória, por exemplo http://www.yourmoodlesite.abc ou https://www.yourmoodlesite.efg", - "username": "Nome de Usuário", - "usernamerequired": "Nome de usuário exigido", - "webservicesnotenabled": "Web Services não estão ativados em seu site. Por favor, contate a administradora do seu Moodle se você achar que o acesso móvel deve ser ativado." -} \ No newline at end of file diff --git a/www/core/components/login/lang/zh_cn.json b/www/core/components/login/lang/zh_cn.json deleted file mode 100644 index f7c4ce0fbbf..00000000000 --- a/www/core/components/login/lang/zh_cn.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "authenticating": "验证中", - "cancel": "取消", - "connect": "连接", - "help": "帮助", - "helpmelogin": "

    全世界有成千上万的Moodle站点。本APP只能连接那些启用移动APP接入功能的Moodle站点。

    如果您无法连接该站点,请与相关站点管理员联系并请他们阅读以下文档http://docs.moodle.org/en/Mobile_app

    想要在Moodle演示站点中测试本APP,请在站点URL栏中输入teacher或者student,并点击添加按钮

    ", - "invalidaccount": "请检查您的登录信息,或请您的网站管理员检查网站设置。", - "invalidmoodleversion": "无效的Moodle版本。最低版本要求是:", - "invalidsite": "网站URL是无效的。", - "login": "登录", - "logininsiterequired": "您需要在浏览器窗口中登录该站点。", - "mobileservicesnotenabled": "您的站点没有启用移动服务,如果您觉得有必要开启移动接入功能,请与站点管理员联系。", - "password": "密码", - "passwordrequired": "需要密码", - "siteinmaintenance": "您的站点正使用维护模式", - "siteurl": "站点 URL", - "siteurlrequired": "需要填写站点URL,比如http://www.yourmoodlesite.abc 或https://www.yourmoodlesite.efg", - "username": "用户名", - "usernamerequired": "用户名必填", - "webservicesnotenabled": "您的站点未开启网络服务。如果您觉得应当启用移动接入功能,请与站点管理员联系。" -} \ No newline at end of file diff --git a/www/core/components/login/lang/zh_tw.json b/www/core/components/login/lang/zh_tw.json deleted file mode 100644 index 4b4a2e8a1c9..00000000000 --- a/www/core/components/login/lang/zh_tw.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "authenticating": "認證中", - "cancel": "取消", - "connect": "連結", - "help": "協助", - "helpmelogin": "

    要登入前請確認:

    1. Moodle 入口網站版本要是2.4或更高
    2. Moodle 入口網站管理員有啟用手機存取.

    想測試Moodle示範入口網站型態須輸入teacherstudentUsername 欄位並點選Add button.

    Moodle文件網站有更詳細的資料及協助

    ", - "invalidaccount": "請檢查您的登人資料或請您的網站管理員檢查網站設定。", - "invalidmoodleversion": "無效的Moodle版本。至少需要的版本是:", - "invalidsite": "這網站網址無效。", - "login": "登入", - "logininsiterequired": "您的Moodle網站強制您以系統瀏覽器開啟。將開啟新瀏覽器,並重新導向這Moodle網站。", - "mobileservicesnotenabled": "您的網站並未啟用行動服務。如果您想使用此功能,請連絡您的Moodle網站管理員。", - "password": "密碼", - "passwordrequired": "需要密碼", - "siteinmaintenance": "您的網站處於維護模式", - "siteurl": "網站網址", - "siteurlrequired": "需要網站網址,例如http://www.yourmoodle.tw", - "username": "帳號", - "usernamerequired": "需要帳號", - "webservicesnotenabled": "您的網站沒有啟用Web服務。如果您想用行動裝置連線,請聯繫您的Moodle網站管理員。" -} \ No newline at end of file diff --git a/www/core/components/settings/lang/es_mx.json b/www/core/components/settings/lang/es_mx.json deleted file mode 100644 index 5d713111ec6..00000000000 --- a/www/core/components/settings/lang/es_mx.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "about": "Acerca", - "cacheexpirationtime": "Tiempo de caducidad del caché (mili segundos)", - "deletesitefiles": "¿Está seguro de que desea borrar todos los archivos descargados de este sitio?", - "development": "Desarrollo", - "enabledebugging": "Activar modo depuración (debug)", - "estimatedfreespace": "Espacio libre (estimado)", - "general": "General", - "language": "Idioma", - "license": "Licencia", - "settings": "Ajustes", - "spaceusage": "Espacio", - "success": "Éxito", - "total": "Total" -} \ No newline at end of file diff --git a/www/core/components/settings/lang/pt_br.json b/www/core/components/settings/lang/pt_br.json deleted file mode 100644 index e5f10026fb4..00000000000 --- a/www/core/components/settings/lang/pt_br.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "about": "Sobre", - "cacheexpirationtime": "Tempo de expiração do cache (milisegundos)", - "deletesitefiles": "Tem certeza que deseja deletar os arquivos baixados a partir deste site?", - "development": "Desenvolvimento", - "enabledebugging": "Ativar a depuração", - "estimatedfreespace": "Espaço livre estimado", - "general": "Geral", - "language": "Idioma", - "license": "Licença", - "settings": "Configurações", - "spaceusage": "Uso do espaço", - "success": "Sucesso", - "total": "Total" -} \ No newline at end of file diff --git a/www/core/components/settings/lang/zh_cn.json b/www/core/components/settings/lang/zh_cn.json deleted file mode 100644 index 77ecdafdca6..00000000000 --- a/www/core/components/settings/lang/zh_cn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "about": "关于", - "cacheexpirationtime": "缓存过期时间(毫秒)", - "deletesitefiles": "您确定要删除从本站下载的文件?", - "development": "开发", - "enabledebugging": "启用调试功能", - "estimatedfreespace": "估计的可用空间", - "general": "常规", - "language": "语言", - "license": "许可", - "settings": "设置", - "spaceusage": "空间使用情况", - "success": "成功", - "total": "总共" -} \ No newline at end of file diff --git a/www/core/components/settings/lang/zh_tw.json b/www/core/components/settings/lang/zh_tw.json deleted file mode 100644 index 47eb50a9521..00000000000 --- a/www/core/components/settings/lang/zh_tw.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "about": "關於", - "cacheexpirationtime": "快取到期時間(毫秒)", - "deletesitefiles": "您確定您想由此位置刪除已下載檔案?", - "development": "開發", - "enabledebugging": "啟用除錯", - "estimatedfreespace": "估計尚餘空間", - "general": "一般", - "language": "語言", - "license": "授權", - "settings": "設定", - "spaceusage": "使用空間", - "success": "成功", - "total": "總計" -} \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/es_mx.json b/www/core/components/sidemenu/lang/es_mx.json deleted file mode 100644 index eebe619eeba..00000000000 --- a/www/core/components/sidemenu/lang/es_mx.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "help": "Ayuda", - "changesite": "Salir", - "mycourses": "Mis cursos", - "website": "Página web" -} \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/pt_br.json b/www/core/components/sidemenu/lang/pt_br.json deleted file mode 100644 index 63423de66e4..00000000000 --- a/www/core/components/sidemenu/lang/pt_br.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "help": "Ajuda", - "changesite": "Sair", - "mycourses": "Meus cursos", - "website": "Site" -} \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/zh_cn.json b/www/core/components/sidemenu/lang/zh_cn.json deleted file mode 100644 index d1edbf326e5..00000000000 --- a/www/core/components/sidemenu/lang/zh_cn.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "help": "帮助", - "changesite": "注销", - "mycourses": "我的课程", - "website": "网站" -} \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/zh_tw.json b/www/core/components/sidemenu/lang/zh_tw.json deleted file mode 100644 index 6d6578b1638..00000000000 --- a/www/core/components/sidemenu/lang/zh_tw.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "help": "協助", - "changesite": "登出", - "mycourses": "我的課程", - "website": "網站" -} \ No newline at end of file diff --git a/www/core/components/user/lang/es_mx.json b/www/core/components/user/lang/es_mx.json deleted file mode 100644 index 3c101e861d8..00000000000 --- a/www/core/components/user/lang/es_mx.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "address": "Dirección", - "city": "Ciudad", - "contact": "Contacto", - "country": "País", - "description": "Descripción", - "details": "Detalles", - "email": "Email", - "interests": "Intereses", - "invaliduser": "Usuario no válido", - "manager": "Mánager", - "phone1": "Teléfono", - "phone2": "Móvil", - "roles": "Roles", - "student": "Estudiante", - "webpage": "Página web" -} \ No newline at end of file diff --git a/www/core/components/user/lang/pt_br.json b/www/core/components/user/lang/pt_br.json deleted file mode 100644 index 379cccabd73..00000000000 --- a/www/core/components/user/lang/pt_br.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "address": "Endereço", - "city": "Cidade", - "contact": "Contato", - "country": "País", - "description": "Descrição", - "details": "Detalhes", - "email": "Email", - "interests": "Interesses", - "invaliduser": "Usuário inválido", - "manager": "Gerente", - "phone1": "Telefone", - "phone2": "Celular", - "roles": "Papéis", - "student": "Estudante", - "webpage": "Página web" -} \ No newline at end of file diff --git a/www/core/components/user/lang/zh_cn.json b/www/core/components/user/lang/zh_cn.json deleted file mode 100644 index cd89bebc64e..00000000000 --- a/www/core/components/user/lang/zh_cn.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "address": "地址", - "city": "城市", - "contact": "联系方式", - "country": "国家", - "description": "描述", - "details": "详情", - "email": "Email", - "interests": "兴趣", - "invaliduser": "无效的用户", - "manager": "管理员", - "phone1": "电话", - "phone2": "手机", - "roles": "角色", - "student": "学生", - "webpage": "网页" -} \ No newline at end of file diff --git a/www/core/components/user/lang/zh_tw.json b/www/core/components/user/lang/zh_tw.json deleted file mode 100644 index 5a45095611c..00000000000 --- a/www/core/components/user/lang/zh_tw.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "address": "住址", - "city": "城市", - "contact": "連絡人", - "country": "國家", - "description": "描述", - "details": "明細", - "email": "電子郵件", - "interests": "興趣", - "invaliduser": "無效的用戶", - "manager": "管理員", - "phone1": "電話", - "phone2": "行動", - "roles": "角色", - "student": "學生", - "webpage": "網頁" -} \ No newline at end of file From 46dac078d6bd36f084fdaea03ce8af3c628dd08e Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 27 Jul 2017 18:20:00 +0200 Subject: [PATCH 107/118] MOBILE-2178 release: Auto-translate strings --- www/addons/mod/data/lang/ar.json | 1 - www/addons/mod/data/lang/bg.json | 1 - www/addons/mod/data/lang/ca.json | 1 - www/addons/mod/data/lang/cs.json | 1 - www/addons/mod/data/lang/da.json | 1 - www/addons/mod/data/lang/de.json | 1 - www/addons/mod/data/lang/el.json | 1 - www/addons/mod/data/lang/es-mx.json | 1 - www/addons/mod/data/lang/es.json | 1 - www/addons/mod/data/lang/eu.json | 1 - www/addons/mod/data/lang/fa.json | 1 - www/addons/mod/data/lang/fr.json | 1 - www/addons/mod/data/lang/he.json | 1 - www/addons/mod/data/lang/hu.json | 1 - www/addons/mod/data/lang/it.json | 1 - www/addons/mod/data/lang/ja.json | 1 - www/addons/mod/data/lang/lt.json | 1 - www/addons/mod/data/lang/nl.json | 1 - www/addons/mod/data/lang/pl.json | 1 - www/addons/mod/data/lang/pt-br.json | 1 - www/addons/mod/data/lang/pt.json | 1 - www/addons/mod/data/lang/ro.json | 1 - www/addons/mod/data/lang/ru.json | 1 - www/addons/mod/data/lang/sr-cr.json | 1 - www/addons/mod/data/lang/sr-lt.json | 1 - www/addons/mod/data/lang/sv.json | 1 - www/addons/mod/data/lang/tr.json | 1 - www/addons/mod/data/lang/uk.json | 1 - www/addons/mod/data/lang/zh-cn.json | 1 - www/addons/mod/data/lang/zh-tw.json | 1 - www/core/components/login/lang/ar.json | 2 +- www/core/components/login/lang/bg.json | 2 +- www/core/components/login/lang/cs.json | 2 +- www/core/components/login/lang/da.json | 2 +- www/core/components/login/lang/de.json | 4 ++-- www/core/components/login/lang/es-mx.json | 2 +- www/core/components/login/lang/es.json | 2 +- www/core/components/login/lang/eu.json | 2 +- www/core/components/login/lang/fa.json | 2 +- www/core/components/login/lang/fr.json | 2 +- www/core/components/login/lang/he.json | 2 +- www/core/components/login/lang/hu.json | 2 +- www/core/components/login/lang/it.json | 2 +- www/core/components/login/lang/ja.json | 2 +- www/core/components/login/lang/nl.json | 2 +- www/core/components/login/lang/pt-br.json | 2 +- www/core/components/login/lang/pt.json | 2 +- www/core/components/login/lang/sv.json | 4 ++-- www/core/components/login/lang/tr.json | 4 ++-- www/core/components/login/lang/zh-cn.json | 2 +- www/core/components/login/lang/zh-tw.json | 2 +- www/core/lang/ar.json | 2 +- www/core/lang/bg.json | 2 +- www/core/lang/ca.json | 2 +- www/core/lang/cs.json | 2 +- www/core/lang/da.json | 2 +- www/core/lang/de.json | 2 +- www/core/lang/el.json | 2 +- www/core/lang/es-mx.json | 2 +- www/core/lang/es.json | 2 +- www/core/lang/eu.json | 2 +- www/core/lang/fa.json | 2 +- www/core/lang/fr.json | 2 +- www/core/lang/he.json | 2 +- www/core/lang/hu.json | 2 +- www/core/lang/it.json | 2 +- www/core/lang/ja.json | 2 +- www/core/lang/lt.json | 2 +- www/core/lang/nl.json | 2 +- www/core/lang/pl.json | 2 +- www/core/lang/pt-br.json | 2 +- www/core/lang/pt.json | 2 +- www/core/lang/ro.json | 2 +- www/core/lang/ru.json | 2 +- www/core/lang/sv.json | 2 +- www/core/lang/tr.json | 2 +- www/core/lang/uk.json | 2 +- www/core/lang/zh-cn.json | 2 +- www/core/lang/zh-tw.json | 2 +- 79 files changed, 52 insertions(+), 82 deletions(-) diff --git a/www/addons/mod/data/lang/ar.json b/www/addons/mod/data/lang/ar.json index bb5d5765bd9..241c0dfb51c 100644 --- a/www/addons/mod/data/lang/ar.json +++ b/www/addons/mod/data/lang/ar.json @@ -23,7 +23,6 @@ "recordapproved": "تم الموافقه على السجل", "recorddeleted": "تم حذف السجل", "resetsettings": "إعادة تعين الحقول", - "restore": "إسترجاع", "search": "بحث", "selectedrequired": "كل المختار مطلوب", "timeadded": "وقت الإضافة", diff --git a/www/addons/mod/data/lang/bg.json b/www/addons/mod/data/lang/bg.json index 6f8107d536b..2210bbfe18e 100644 --- a/www/addons/mod/data/lang/bg.json +++ b/www/addons/mod/data/lang/bg.json @@ -27,7 +27,6 @@ "recorddeleted": "Записът изтрит", "recorddisapproved": "Записът не е одобрен", "resetsettings": "Нулиране на филтрите", - "restore": "Възстановяване", "search": "Търсене", "selectedrequired": "Всичко избрано се изисква", "timeadded": "Време на добавяне", diff --git a/www/addons/mod/data/lang/ca.json b/www/addons/mod/data/lang/ca.json index 4bfabe7bca6..fc0c0d549bd 100644 --- a/www/addons/mod/data/lang/ca.json +++ b/www/addons/mod/data/lang/ca.json @@ -29,7 +29,6 @@ "recorddeleted": "S'ha suprimit l'entrada", "recorddisapproved": "Entrada no aprovada", "resetsettings": "Reinicialitza els filtres", - "restore": "Restaura", "search": "Cerca", "selectedrequired": "Cal que estigui tot seleccionat", "timeadded": "Hora de la incorporació", diff --git a/www/addons/mod/data/lang/cs.json b/www/addons/mod/data/lang/cs.json index 894d9e69c39..8430a087b16 100644 --- a/www/addons/mod/data/lang/cs.json +++ b/www/addons/mod/data/lang/cs.json @@ -29,7 +29,6 @@ "recorddeleted": "Záznam byl smazán", "recorddisapproved": "Neschválený záznam", "resetsettings": "Resetovat filtry", - "restore": "Obnovit", "search": "Vyhledat", "selectedrequired": "Všechna zvolená povinná", "timeadded": "Čas vložení", diff --git a/www/addons/mod/data/lang/da.json b/www/addons/mod/data/lang/da.json index e1d919142bb..6509111b86e 100644 --- a/www/addons/mod/data/lang/da.json +++ b/www/addons/mod/data/lang/da.json @@ -29,7 +29,6 @@ "recorddeleted": "Posten er slettet", "recorddisapproved": "Posten er ikke godkendt", "resetsettings": "Nulstil filtre", - "restore": "Genopret", "search": "Søg", "selectedrequired": "Alle valgte er påkrævet", "timeadded": "Tilføjet", diff --git a/www/addons/mod/data/lang/de.json b/www/addons/mod/data/lang/de.json index 54878e639d4..47de37fa0c4 100644 --- a/www/addons/mod/data/lang/de.json +++ b/www/addons/mod/data/lang/de.json @@ -29,7 +29,6 @@ "recorddeleted": "Datensatz gelöscht", "recorddisapproved": "Eintrag nicht freigegeben", "resetsettings": "Filter zurücksetzen", - "restore": "Wiederherstellen", "search": "Suche", "selectedrequired": "Gesamte Auswahl ist erforderlich", "timeadded": "Zeit erstellt", diff --git a/www/addons/mod/data/lang/el.json b/www/addons/mod/data/lang/el.json index 16838aa7d78..8afbe5fdcc4 100644 --- a/www/addons/mod/data/lang/el.json +++ b/www/addons/mod/data/lang/el.json @@ -24,7 +24,6 @@ "recordapproved": "Η καταχώρηση εγκρίθηκε", "recorddeleted": "Η καταχώρηση διαγράφθηκε", "resetsettings": "Επανορισμός φίλτρων", - "restore": "Επαναφορά", "search": "Αναζήτηση", "selectedrequired": "Απαιτούνται όλα τα επιλεγμένα", "timeadded": "Προστέθηκε χρόνος", diff --git a/www/addons/mod/data/lang/es-mx.json b/www/addons/mod/data/lang/es-mx.json index f7c26455a61..dc1cd76ec53 100644 --- a/www/addons/mod/data/lang/es-mx.json +++ b/www/addons/mod/data/lang/es-mx.json @@ -29,7 +29,6 @@ "recorddeleted": "Entrada eliminada", "recorddisapproved": "Entrada desaprobada", "resetsettings": "Restablecer filtros", - "restore": "Restaurar", "search": "Buscar", "selectedrequired": "Se requieren todos los seleccionados", "timeadded": "Tiempo añadido", diff --git a/www/addons/mod/data/lang/es.json b/www/addons/mod/data/lang/es.json index 832a1d7c511..f03697158fa 100644 --- a/www/addons/mod/data/lang/es.json +++ b/www/addons/mod/data/lang/es.json @@ -29,7 +29,6 @@ "recorddeleted": "Entrada eliminada", "recorddisapproved": "Entrada desaprobada", "resetsettings": "Restablecer filtros", - "restore": "Restaurar", "search": "Buscar", "selectedrequired": "Se requieren todos los seleccionados", "timeadded": "Tiempo añadido", diff --git a/www/addons/mod/data/lang/eu.json b/www/addons/mod/data/lang/eu.json index d5e1d820eda..e7e02cdd912 100644 --- a/www/addons/mod/data/lang/eu.json +++ b/www/addons/mod/data/lang/eu.json @@ -29,7 +29,6 @@ "recorddeleted": "Sarrera ezabatu da", "recorddisapproved": "Onartu gabeko sarrera", "resetsettings": "Berrabiarazi iragazkiak", - "restore": "Berreskuratu", "search": "Bilatu", "selectedrequired": "Aukeratutako guztia beharrezkoa", "timeadded": "Denbora gehituta", diff --git a/www/addons/mod/data/lang/fa.json b/www/addons/mod/data/lang/fa.json index 9d90d4bef82..c6a248a09b0 100644 --- a/www/addons/mod/data/lang/fa.json +++ b/www/addons/mod/data/lang/fa.json @@ -25,7 +25,6 @@ "recordapproved": "دادهٔ ورودی تایید شد", "recorddeleted": "حذف شد", "resetsettings": "بازنشانی فیلترها", - "restore": "بازیابی", "search": "جستجو", "selectedrequired": "تمامی گزینه‌های انتخاب شده لازم هستند", "timeadded": "زمان اضافه شدن", diff --git a/www/addons/mod/data/lang/fr.json b/www/addons/mod/data/lang/fr.json index 777e6974ade..0646a2b15e6 100644 --- a/www/addons/mod/data/lang/fr.json +++ b/www/addons/mod/data/lang/fr.json @@ -29,7 +29,6 @@ "recorddeleted": "Fiche supprimée", "recorddisapproved": "Fiche désapprouvée", "resetsettings": "Réinitialiser les filtres", - "restore": "Restauration", "search": "Recherche", "selectedrequired": "Toute la sélection requise", "timeadded": "Date ajout", diff --git a/www/addons/mod/data/lang/he.json b/www/addons/mod/data/lang/he.json index 8ec3817a5c1..e3495248234 100644 --- a/www/addons/mod/data/lang/he.json +++ b/www/addons/mod/data/lang/he.json @@ -29,7 +29,6 @@ "recorddeleted": "הפריט נמחק", "recorddisapproved": "הפריט לא מאושר", "resetsettings": "איפוס שדות", - "restore": "שחזור", "search": "חיפוש", "selectedrequired": "כל הנבחרים דרושים", "timeadded": "זמן הוספה", diff --git a/www/addons/mod/data/lang/hu.json b/www/addons/mod/data/lang/hu.json index bfca2794430..a42ee251c97 100644 --- a/www/addons/mod/data/lang/hu.json +++ b/www/addons/mod/data/lang/hu.json @@ -29,7 +29,6 @@ "recorddeleted": "Bejegyzés törölve", "recorddisapproved": "Nem jóváhagyott fogalom", "resetsettings": "Szűrők visszaállítása", - "restore": "Helyreállítás", "search": "Keresés", "selectedrequired": "Minden kiválasztott szükséges", "timeadded": "Időpont hozzáadva", diff --git a/www/addons/mod/data/lang/it.json b/www/addons/mod/data/lang/it.json index 32e3bd0c051..81aa26d1e83 100644 --- a/www/addons/mod/data/lang/it.json +++ b/www/addons/mod/data/lang/it.json @@ -29,7 +29,6 @@ "recorddeleted": "Il record è stato eliminato", "recorddisapproved": "Record disapprovato", "resetsettings": "Reimposta filtri", - "restore": "Ripristino", "search": "Cerca", "selectedrequired": "Necessari tutti i selezionati", "timeadded": "Data/ora inserimento", diff --git a/www/addons/mod/data/lang/ja.json b/www/addons/mod/data/lang/ja.json index 9a3ae2261e4..a779faabe27 100644 --- a/www/addons/mod/data/lang/ja.json +++ b/www/addons/mod/data/lang/ja.json @@ -29,7 +29,6 @@ "recorddeleted": "エントリが削除されました。", "recorddisapproved": "エントリ未承認", "resetsettings": "フィルタをリセットする", - "restore": "リストア", "search": "検索", "selectedrequired": "選択したすべてを含む", "timeadded": "追加日時", diff --git a/www/addons/mod/data/lang/lt.json b/www/addons/mod/data/lang/lt.json index ea0077d0407..1c83b6faf07 100644 --- a/www/addons/mod/data/lang/lt.json +++ b/www/addons/mod/data/lang/lt.json @@ -29,7 +29,6 @@ "recorddeleted": "Įrašas panaikintas", "recorddisapproved": "Įrašas nepatvirtintas", "resetsettings": "Nustatyti filtrus iš naujo", - "restore": "Atkurti", "search": "Ieškoti", "selectedrequired": "Visi pasirinkti būtini", "timeadded": "Įtraukimo laikas", diff --git a/www/addons/mod/data/lang/nl.json b/www/addons/mod/data/lang/nl.json index d4cbe01011f..0b0fd8fdb7b 100644 --- a/www/addons/mod/data/lang/nl.json +++ b/www/addons/mod/data/lang/nl.json @@ -29,7 +29,6 @@ "recorddeleted": "Record verwijderd", "recorddisapproved": "Item verworpen", "resetsettings": "Reset filters", - "restore": "Terugzetten", "search": "Zoek", "selectedrequired": "Alle geselecteerde vereist", "timeadded": "Toegevoegd op", diff --git a/www/addons/mod/data/lang/pl.json b/www/addons/mod/data/lang/pl.json index 9d0f4a0409b..3d8d44e49c3 100644 --- a/www/addons/mod/data/lang/pl.json +++ b/www/addons/mod/data/lang/pl.json @@ -29,7 +29,6 @@ "recorddeleted": "Wpis usunięty", "recorddisapproved": "Wpis odrzucony", "resetsettings": "Resetuj pola", - "restore": "Odtwórz", "search": "Szukaj", "selectedrequired": "Wszystkie zaznaczone są wymagane", "timeadded": "Dodano czas", diff --git a/www/addons/mod/data/lang/pt-br.json b/www/addons/mod/data/lang/pt-br.json index 4b8d2b11374..6574d31f4c8 100644 --- a/www/addons/mod/data/lang/pt-br.json +++ b/www/addons/mod/data/lang/pt-br.json @@ -29,7 +29,6 @@ "recorddeleted": "Item cancelado", "recorddisapproved": "Entrada não aprovada", "resetsettings": "Reconfigurar filtros", - "restore": "Restaurar", "search": "Busca", "selectedrequired": "Todos os itens selecionados são obrigatórios", "timeadded": "Tempo adicionado", diff --git a/www/addons/mod/data/lang/pt.json b/www/addons/mod/data/lang/pt.json index 8da56197e36..fe1adf4e1cb 100644 --- a/www/addons/mod/data/lang/pt.json +++ b/www/addons/mod/data/lang/pt.json @@ -29,7 +29,6 @@ "recorddeleted": "Registo apagado", "recorddisapproved": "Entrada não aprovada", "resetsettings": "Reiniciar filtros", - "restore": "Restaurar", "search": "Pesquisar", "selectedrequired": "Todos os selecionados são obrigatórios", "timeadded": "Data de criação", diff --git a/www/addons/mod/data/lang/ro.json b/www/addons/mod/data/lang/ro.json index 0f73ca747ca..76ddb872d74 100644 --- a/www/addons/mod/data/lang/ro.json +++ b/www/addons/mod/data/lang/ro.json @@ -28,7 +28,6 @@ "recorddeleted": "Articol şters", "recorddisapproved": "Postare neaprobată", "resetsettings": "Resetează filtre", - "restore": "Restaurează", "search": "Căutare", "selectedrequired": "Toate elementele selectate sunt obligatorii", "timeadded": "Ora la care a fost adăugat", diff --git a/www/addons/mod/data/lang/ru.json b/www/addons/mod/data/lang/ru.json index 5598d7b1238..260f25ebd98 100644 --- a/www/addons/mod/data/lang/ru.json +++ b/www/addons/mod/data/lang/ru.json @@ -29,7 +29,6 @@ "recorddeleted": "Запись удалена", "recorddisapproved": "Снято одобрение записи", "resetsettings": "Сбросить фильтры", - "restore": "Восстановить", "search": "Поиск", "selectedrequired": "Требуются все выбранные", "timeadded": "Время добавления", diff --git a/www/addons/mod/data/lang/sr-cr.json b/www/addons/mod/data/lang/sr-cr.json index 6a73cae005c..b85aeb9798a 100644 --- a/www/addons/mod/data/lang/sr-cr.json +++ b/www/addons/mod/data/lang/sr-cr.json @@ -29,7 +29,6 @@ "recorddeleted": "Унос је обрисан", "recorddisapproved": "Унос није одобрен", "resetsettings": "Ресетуј филтере", - "restore": "Рестаурирање резервнe копијe", "search": "Тражи", "selectedrequired": "Све изабрано обавезно", "timeadded": "Време додавања", diff --git a/www/addons/mod/data/lang/sr-lt.json b/www/addons/mod/data/lang/sr-lt.json index 68b43ff3628..954c9f4bb36 100644 --- a/www/addons/mod/data/lang/sr-lt.json +++ b/www/addons/mod/data/lang/sr-lt.json @@ -29,7 +29,6 @@ "recorddeleted": "Unos je obrisan", "recorddisapproved": "Unos nije odobren", "resetsettings": "Resetuj filtere", - "restore": "Restauriranje rezervne kopije", "search": "Traži", "selectedrequired": "Sve izabrano obavezno", "timeadded": "Vreme dodavanja", diff --git a/www/addons/mod/data/lang/sv.json b/www/addons/mod/data/lang/sv.json index 9a13c464c2e..a99d7225328 100644 --- a/www/addons/mod/data/lang/sv.json +++ b/www/addons/mod/data/lang/sv.json @@ -25,7 +25,6 @@ "recordapproved": "Bidraget har godkänts", "recorddeleted": "Bidraget har tagits bort", "resetsettings": "Filter för återställning", - "restore": "Återställ", "search": "Sök", "selectedrequired": "Alla de valda är obligatoriska", "timeadded": "Tillagd när", diff --git a/www/addons/mod/data/lang/tr.json b/www/addons/mod/data/lang/tr.json index 6b427b298c4..c250d4477cb 100644 --- a/www/addons/mod/data/lang/tr.json +++ b/www/addons/mod/data/lang/tr.json @@ -29,7 +29,6 @@ "recorddeleted": "Kayıt silindi", "recorddisapproved": "Giriş onaylanmadı", "resetsettings": "Alanları Temizle", - "restore": "Geri yükle", "search": "Ara", "selectedrequired": "Tüm seçililer gereklidir", "timeadded": "Ekleme zamanı", diff --git a/www/addons/mod/data/lang/uk.json b/www/addons/mod/data/lang/uk.json index ceb6004b6ca..5221866c401 100644 --- a/www/addons/mod/data/lang/uk.json +++ b/www/addons/mod/data/lang/uk.json @@ -29,7 +29,6 @@ "recorddeleted": "Запис вилучено", "recorddisapproved": "Запис не схвалено", "resetsettings": "Скинути фільтри", - "restore": "Відновлення", "search": "Пошук", "selectedrequired": "Всі відібрані вимоги", "timeadded": "Час введення", diff --git a/www/addons/mod/data/lang/zh-cn.json b/www/addons/mod/data/lang/zh-cn.json index 071feda8d5d..6ee9c6d0542 100644 --- a/www/addons/mod/data/lang/zh-cn.json +++ b/www/addons/mod/data/lang/zh-cn.json @@ -28,7 +28,6 @@ "recorddeleted": "记录已删除", "recorddisapproved": "不可进入", "resetsettings": "重置字段", - "restore": "恢复", "search": "搜索", "selectedrequired": "全选", "timeadded": "追加时间", diff --git a/www/addons/mod/data/lang/zh-tw.json b/www/addons/mod/data/lang/zh-tw.json index 0ca1685c558..7ccf7b95f73 100644 --- a/www/addons/mod/data/lang/zh-tw.json +++ b/www/addons/mod/data/lang/zh-tw.json @@ -29,7 +29,6 @@ "recorddeleted": "資料已刪除", "recorddisapproved": "不可進入", "resetsettings": "重設欄位", - "restore": "還原", "search": "搜尋", "selectedrequired": "所有必要的選擇", "timeadded": "新增的時間", diff --git a/www/core/components/login/lang/ar.json b/www/core/components/login/lang/ar.json index a94d3680494..7dcb9e22afa 100644 --- a/www/core/components/login/lang/ar.json +++ b/www/core/components/login/lang/ar.json @@ -26,7 +26,7 @@ "missinglastname": "الاسم الأخير لم يتم تحدده", "newaccount": "حساب مشترك جديد", "newsitedescription": "من فضلك أدخل رابط موقع نظام التعلم الإلكتروني مودل الخاص بك. لاحظ انه من الممكن أن يكون لم يتم إعداده للعمل مع هذا التطبيق.", - "password": "كلمة مرور", + "password": "كلمة المرور", "passwordrequired": "كلمة المرور مطلوبة", "policyaccept": "لقد فهمت وأوافق", "policyagree": "يجب الموافقة على هذه الشروط للإستمرار في إستخدام الموقع. هل أنت موافق؟", diff --git a/www/core/components/login/lang/bg.json b/www/core/components/login/lang/bg.json index aba3a7656a7..c21497bd5f6 100644 --- a/www/core/components/login/lang/bg.json +++ b/www/core/components/login/lang/bg.json @@ -17,7 +17,7 @@ "invalidmoodleversion": "Невалидна версия на Moodle. Най-старата изискване версия е 2.4.", "invalidsite": "Интернет адресът на сайта е невалиден.", "invalidurl": "URL-ът, който току що въведохте не е валиден", - "login": "Влизане във Вашия профил", + "login": "Вход", "loginbutton": "Вход!", "logininsiterequired": "Трябва да влезете в сайта през прозорец на браузър.", "loginsteps": "За пълен достъп до този сайт трябва първо да си създадете профил.", diff --git a/www/core/components/login/lang/cs.json b/www/core/components/login/lang/cs.json index be81328f5eb..e6b11b3d959 100644 --- a/www/core/components/login/lang/cs.json +++ b/www/core/components/login/lang/cs.json @@ -33,7 +33,7 @@ "invalidvaluemin": "Minimální hodnota je {{$a}}", "localmobileunexpectedresponse": "Kontrola rozšířených vlastností Moodle Mobile vrátil neočekávanou odezvu, budete ověřen pomocí standardních služeb mobilu .", "loggedoutssodescription": "Musíte se znovu autentizovat. Musíte se přihlásit na stránky v okně prohlížeče.", - "login": "Přihlásit ke svému účtu", + "login": "Přihlásit se", "loginbutton": "Přihlásit se", "logininsiterequired": "Váš Moodlu vás nutí k přihlášení pomocí prohlížeče. Nová instance prohlížeče otevře přesměrování na vaše stránky Moodle.", "loginsteps": "K plnému přístupu na tyto stránky, musíte nejprve vytvořit účet.", diff --git a/www/core/components/login/lang/da.json b/www/core/components/login/lang/da.json index 3422796cb2b..ba85230503e 100644 --- a/www/core/components/login/lang/da.json +++ b/www/core/components/login/lang/da.json @@ -23,7 +23,7 @@ "invalidsite": "Denne webadresse er ugyldig.", "invalidurl": "Den URL, du har skrevet, er ikke korrekt", "localmobileunexpectedresponse": "Du har fået en uventet reaktion fra Moodle Mobile Additional Features, så du vil blive godkendt ved hjælp af standard Mobile service.", - "login": "Log ind på din konto", + "login": "Log ind", "loginbutton": "Login", "logininsiterequired": "Du skal logge på websiden via en browser", "loginsteps": "For at få fuld adgang til dette site, skal du oprette en brugerkonto.", diff --git a/www/core/components/login/lang/de.json b/www/core/components/login/lang/de.json index a4a0ede5015..bd82889ef7c 100644 --- a/www/core/components/login/lang/de.json +++ b/www/core/components/login/lang/de.json @@ -33,7 +33,7 @@ "invalidvaluemin": "Der Minimalwert ist {{$a}}.", "localmobileunexpectedresponse": "Die Verbindung zum Plugin 'Moodle Mobile - Zusatzfeatures' ist fehlgeschlagen. Sie werden über den standardmäßigen mobilen Webservice authentifiziert.", "loggedoutssodescription": "Sie müssen sich erneut authentifizieren. Melden Sie sich dafür im Browser auf der Website im Browser an..", - "login": "Mit Ihrem Nutzerkonto anmelden", + "login": "Login", "loginbutton": "Anmelden", "logininsiterequired": "Sie müssen sich für diese Website im Browser anmelden.", "loginsteps": "Für den vollen Zugriff auf diese Website benötigen Sie ein Nutzerkonto.", @@ -44,7 +44,7 @@ "newaccount": "Neuer Zugang", "newsitedescription": "Geben Sie die URL zu Ihrer Website ein. Eventuell ist Ihre Website nicht für diese App freigegeben.", "notloggedin": "Sie müssen eingeloggt sein.", - "password": "Öffentliches Kennwort", + "password": "Kennwort", "passwordrequired": "Kennwort fehlt", "policyaccept": "Ich verstehe den Text und stimme ihm zu", "policyagree": "Lesen Sie diese Zustimmungserklärung sorgfältig. Sie müssen erst zustimmen, um diese Website weiter nutzen zu können. Stimmen Sie zu?", diff --git a/www/core/components/login/lang/es-mx.json b/www/core/components/login/lang/es-mx.json index 858db740994..bdb60787d92 100644 --- a/www/core/components/login/lang/es-mx.json +++ b/www/core/components/login/lang/es-mx.json @@ -33,7 +33,7 @@ "invalidvaluemin": "El valor mínimo es {{$a}}", "localmobileunexpectedresponse": "La revisión de las características Adicionales de Moodle Mobile regresó una respuesta inesperada; Usted será autenticado usando el servicio Mobile estándar.", "loggedoutssodescription": "Usted tiene que autenticarse nuevamente. Usted necesita ingresar al sitio en una ventana del navegador.", - "login": "Ingresar a su cuenta", + "login": "Ingresar", "loginbutton": "Ingreso", "logininsiterequired": "Usted necesita ingresar al sitio con una ventana del navegador.", "loginsteps": "Para acceso completo a este sitio, Usted necesita primeramente crear una cuenta.", diff --git a/www/core/components/login/lang/es.json b/www/core/components/login/lang/es.json index 55002468575..65a96778338 100644 --- a/www/core/components/login/lang/es.json +++ b/www/core/components/login/lang/es.json @@ -33,7 +33,7 @@ "invalidvaluemin": "El valor mínimo es {{$a}}", "localmobileunexpectedresponse": "Las características adicionales de Moodle Mobile han devuelto una respuesta inesperada, debe autenticarse utilizando el servicio estándar de Mobile.", "loggedoutssodescription": "Tiene que autenticarse nuevamente. Necesita acceder al sitio en una ventana del navegador.", - "login": "Acceder con su cuenta", + "login": "Acceder", "loginbutton": "Acceder", "logininsiterequired": "Para autentificarse en el sitio se ha de abrir una ventana de navegador.", "loginsteps": "Hola. Para acceder al sistema tómese un minuto para\ncrear una cuenta.\nCada curso puede disponer de una \"clave de acceso\"\nque sólo tendrá que usar la primera vez.\nEstos son los pasos:\n
      \n
    1. Rellene el Formulario de Registro con sus datos.
    2. \n
    3. El sistema le enviará un correo para verificar que su dirección sea correcta.
    4. \n
    5. Lea el correo y confirme su matrícula.
    6. \n
    7. Su registro será confirmado y usted podrá acceder al curso.
    8. \n
    9. Seleccione el curso en el que desea participar.
    10. \n
    11. Si algún curso en particular le solicita una \"contraseña de acceso\"\nutilice la que le facilitaron cuando se matriculó.\nAsí quedará matriculado.
    12. \n
    13. A partir de ese momento no necesitará utilizar más que su nombre de usuario y contraseña\nen el formulario de la página\npara entrar a cualquier curso en el que esté matriculado.
    14. \n
    ", diff --git a/www/core/components/login/lang/eu.json b/www/core/components/login/lang/eu.json index 8d949589d7b..c2a9af12681 100644 --- a/www/core/components/login/lang/eu.json +++ b/www/core/components/login/lang/eu.json @@ -33,7 +33,7 @@ "invalidvaluemin": "Gutxieneko balioa {{$a}} da.", "localmobileunexpectedresponse": "Moodle Mobile-ko Funtzio Aurreratuen kontrolak ezusteko erantzuna eman du, Mobile zerbitzu estandarra erabilita autentifikatuko zaitugu.", "loggedoutssodescription": "Berriz autentifikatu behar duzua. Gunean nabigatzaile leiho baten bitartez hasi behar duzu saioa.", - "login": "Sartu zure kontuan", + "login": "Sartu", "loginbutton": "Hasi saioa", "logininsiterequired": "Gunean web-nabigatzaile baten bidez sartu behar zara.", "loginsteps": "Gune honetara sarbide osoa izateko, lehenik eta behin kontua sortu behar duzu. in ikastarotara sartzeko web-gune honetako erabiltzaile izan behar duzu\neta horretarako kontu bat sortu behar duzu.\n\nNola sortu kontu berria:\n
      \n
    1. Sakatu lotura honetan KONTU BERRIA eta formularioa bete zure datuekin.
    2. \n
    3. E-posta mezu bat bidaliko dugu berehala zure e-posta helbidera.
    4. \n
    5. Mezua irakurri eta agertzen den loturan klik egin.
    6. \n
    7. Zure kontua berretsi eta barruan izango zara.
    8. \n
    9. Orduan, nahi duzun ikastaroa aukeratu.
    10. \n
    11. \"Partaide-giltza\" bat eskatzen badizu, erabili matrikulatutakoan eman zizutena
    12. \n
    13. Kontu berria sortutakoan, eta zenbait kasutan matrikula egindakoan, ikastarorako sarbidea izango duzu.
    14. \n
    15. Hemendik aurrera zure erabiltzaile-izena eta pasahitza besterik ez dituzu sartu beharko hasiera orrian zeure ikastaroan parte hartzeko.
    16. \n
    ", diff --git a/www/core/components/login/lang/fa.json b/www/core/components/login/lang/fa.json index ede4296c505..e5cd574fd10 100644 --- a/www/core/components/login/lang/fa.json +++ b/www/core/components/login/lang/fa.json @@ -26,7 +26,7 @@ "missinglastname": "نام خانوادگی را وارد کنید", "mobileservicesnotenabled": "سرویس دسترسی موبایل در سایت شما فعال نیست", "newaccount": "حساب کاربری جدید", - "password": "کلمهٔ رمز", + "password": "رمز ورود", "passwordrequired": "گذرواژه مورد نیاز است", "policyaccept": "موافقم و می‌پذیرم", "policyagree": "برای ادامهٔ استفاده از این سایت باید موافقت خود را با خط مشی آن اعلام کنید. آیا موافقید؟", diff --git a/www/core/components/login/lang/fr.json b/www/core/components/login/lang/fr.json index 503d86ff74d..c13712a0f07 100644 --- a/www/core/components/login/lang/fr.json +++ b/www/core/components/login/lang/fr.json @@ -33,7 +33,7 @@ "invalidvaluemin": "La valeur minimale est {{$a}}", "localmobileunexpectedresponse": "La vérification des fonctionnalités additionnelles de Moodle Mobile a envoyé une réponse inattendue. Vous allez être connecté au moyen du service mobile standard.", "loggedoutssodescription": "Veuillez vous ré-authentifier en vous connectant au site au moyen d'un navigateur web.", - "login": "Connexion à votre compte", + "login": "Connexion", "loginbutton": "Se connecter", "logininsiterequired": "Vous devez vous connecter au moyen d'un navigateur.", "loginsteps": "Pour un accès complet à ce site, veuillez créer un compte utilisateur.", diff --git a/www/core/components/login/lang/he.json b/www/core/components/login/lang/he.json index ea395994ef0..2c5cbdf946a 100644 --- a/www/core/components/login/lang/he.json +++ b/www/core/components/login/lang/he.json @@ -21,7 +21,7 @@ "invalidmoodleversion": "גרסת מוודל לא תקינה. נדרשת גרסה 2.4 ומעלה.", "invalidsite": "כתובת האתר אינה תקינה.", "invalidurl": "כתובת ה-URL (אינטרנט) שהזנת כרגע לא תקפה.", - "login": "התחברות לחשבונך", + "login": "התחברות", "loginbutton": "כניסה!", "logininsiterequired": "עליך להתחבר לאתר בחלון דפדפן.", "loginsteps": "שלום לך! לקבלת גישה מלאה לקורסים עליך להקדיש דקה לפתיחת חשבון חדש באתר זה.\nלכל אחד מהקורסים הבודדים יכול להיות גם \"מפתח רישום\" שתצטרך רק מאוחר יותר. להלן שלבי פתיחת החשבון:\n
      \n
    1. מלא את הטופס חשבון חדש בפרטים שלך
    2. \n
    3. דואר אלקטרוני יישלח מיידית לכתובת הדואר האלקטרוני שסיפקת (אם לא נמצא, נא לחפש גם בדואר הזבל או הספאם).
    4. \n
    5. קרא את הדואר אלקטרוני שלך ולחץ על קישור האינטרנט שהוא מכיל.
    6. \n
    7. החשבון שלך יאושר ואתה תהיה מחובר.
    8. \n
    9. עכשיו בחר את הקורס בו תרצה להשתתף.
    10. \n
    11. אם מבקשים ממך \"מפתח רישום\" השתמש בזה שנתן לך המורה שלך. זה \"ירשום\" אותך לקורס.
    12. \n
    13. עכשיו יש בידך גישה לכל הקורס. מעתה והלאה כל שתצטרך בכדי להתחבר ולהיכנס לכל קורס שנרשמת אליו הוא שם המשתמש שלך והסיסמה (בטופס המופיע בדף זה).
    14. \n
    ", diff --git a/www/core/components/login/lang/hu.json b/www/core/components/login/lang/hu.json index 0a23a2b4fce..03351032c9f 100644 --- a/www/core/components/login/lang/hu.json +++ b/www/core/components/login/lang/hu.json @@ -16,7 +16,7 @@ "invalidmoodleversion": "Érvénytelen Moodle-verzió. A minimális verziószám a 2.4.", "invalidsite": "A portál-URL nem érvényes.", "invalidurl": "A megadott URL nem érvényes", - "login": "Lépjen be fiókjába", + "login": "Belépés", "logininsiterequired": "A portálra böngészőablakban kell bejelentkeznie.", "loginsteps": "Ahhoz, hogy teljesen hozzáférjen a portálhoz, először új fiókot kell létrehoznia.", "missingemail": "Hiányzó e-mail cím", diff --git a/www/core/components/login/lang/it.json b/www/core/components/login/lang/it.json index a5d397edeb6..bc68e3db17c 100644 --- a/www/core/components/login/lang/it.json +++ b/www/core/components/login/lang/it.json @@ -34,7 +34,7 @@ "newaccount": "Nuovo account", "newsitedescription": "Inserisci l'URL del sito Moodle al quale vuoi collegarti. Da notare che il sito deve essere configurato per funzionare con questa app.", "notloggedin": "Devi essere autenticato", - "password": "Shared Secret", + "password": "Password", "passwordrequired": "Password necessaria", "policyaccept": "Ho letto le condizioni e le accetto", "policyagree": "Per continuare ad usare questo sito, è necessario accettare le condizioni riportate.", diff --git a/www/core/components/login/lang/ja.json b/www/core/components/login/lang/ja.json index dcc69fa6709..33dced4b80e 100644 --- a/www/core/components/login/lang/ja.json +++ b/www/core/components/login/lang/ja.json @@ -16,7 +16,7 @@ "invalidmoodleversion": "Moodleのバージョンが古すぎます。少なくともこれより新しいMoodleである必要があります:", "invalidsite": "サイトURLが正しくありません。", "invalidurl": "あなたが入力したURLは正しくありません。", - "login": "あなたのアカウントにログインする:", + "login": "ログイン", "loginbutton": "ログイン", "logininsiterequired": "ブラウザウインドウからサイトにログインする必要があります。", "loginsteps": "このサイトにフルアクセスするため、あなたは最初にアカウントを作成する必要があります。", diff --git a/www/core/components/login/lang/nl.json b/www/core/components/login/lang/nl.json index 3df19ef3dd5..d8dae79b1fe 100644 --- a/www/core/components/login/lang/nl.json +++ b/www/core/components/login/lang/nl.json @@ -33,7 +33,7 @@ "invalidvaluemin": "De minimum waard eis {{$a}}", "localmobileunexpectedresponse": "Moodle Mobile Additional Features Check gaf een onverwacht antwoord. Je zult aanmelden via de standaard Mobile service.", "loggedoutssodescription": "Je moet opnieuw aanmelden. Je moet aanmelden met een browservenster.", - "login": "Login met je account", + "login": "Login", "loginbutton": "Inloggen", "logininsiterequired": "Je dient via een browser in te loggen op je Moodle site", "loginsteps": "Om volledige toegang tot deze site te krijgen, moet je een account maken.", diff --git a/www/core/components/login/lang/pt-br.json b/www/core/components/login/lang/pt-br.json index 0fbd58b4cce..739bc3eb83d 100644 --- a/www/core/components/login/lang/pt-br.json +++ b/www/core/components/login/lang/pt-br.json @@ -33,7 +33,7 @@ "invalidvaluemin": "O valor minimo é{{$a}}", "localmobileunexpectedresponse": "Verificação do Moodle Mobile Additional Features retornou uma resposta inesperada, você ira se autenticar usando o serviço Mobile padrão", "loggedoutssodescription": "Você tem que autenticar novamente. Você precisa fazer login no site em uma janela do navegador.", - "login": "Login em sua conta", + "login": "Acessar", "loginbutton": "Entrar", "logininsiterequired": "É preciso logar no site num navegador.", "loginsteps": "Para ter acesso completo a este site, você primeiro precisa criar uma conta.", diff --git a/www/core/components/login/lang/pt.json b/www/core/components/login/lang/pt.json index 9faa9559aea..a218e010b94 100644 --- a/www/core/components/login/lang/pt.json +++ b/www/core/components/login/lang/pt.json @@ -33,7 +33,7 @@ "invalidvaluemin": "O valor mínimo é {{$a}}", "localmobileunexpectedresponse": "A verificação do Moodle Mobile Additional Features teve um erro inesperado, a ligação será feita através do serviço Mobile padrão.", "loggedoutssodescription": "Tem de autenticar-se novamente. A autenticação no site tem de ser numa janela do navegador.", - "login": "Autentique-se com seus dados de acesso", + "login": "Entrar", "loginbutton": "Iniciar sessão", "logininsiterequired": "Precisa de entrar no site através de uma janela de navegador.", "loginsteps": "Para ter acesso completo a este site, primeiro precisa de criar uma nova conta de utilizador.", diff --git a/www/core/components/login/lang/sv.json b/www/core/components/login/lang/sv.json index dbd8ed5a7a2..94336186f13 100644 --- a/www/core/components/login/lang/sv.json +++ b/www/core/components/login/lang/sv.json @@ -22,7 +22,7 @@ "invalidsite": "Den webbadress är ogiltig.", "invalidurl": "Den URL som du just matade in är inte giltig", "localmobileunexpectedresponse": "Kontrollen för Moodle mobila funktioner returnerade ett oväntat svar. Du kommer att autentiseras med mobila standard tjänsten.", - "login": "Inloggning", + "login": "Logga in", "loginbutton": "Logga In!", "logininsiterequired": "Du måste logga in på webbplatsen via en webbläsare", "loginsteps": "Hej!\n
    \nDu måste bl.a. skapa ett nytt användarkonto på denna webbplats för att få tillgång till de kurser som du vill delta i. Varje individuell kurs kan också ha en engångsnyckel \"kursnyckel\". Den behöver du dock inte förrän senare.\n Så här skapar du ditt konto:\n
      \n
    1. Fyll i formuläret på sidan \nNytt konto med de efterfrågade\nuppgifterna om dig själv.
    2. \n
    3. Ett e-postmeddelande kommer därefter\nomedelbart att sändas till\ndin e-postadress.
    4. \n
    5. Läs din e-post, och klicka på webblänken som den innehåller.
    6. \n
    7. Ditt konto kommer därmed att bekräftas\noch du kommer att loggas in.
    8. \n
    9. Nu kan du välja vilken kurs du\nvill delta i.
    10. \n
    11. Om du måste ange en \"kursnyckel\" - så\nfår du använda den som din lärare har\ngivit dig. Med den kan du registrera\ndig på en sådan kurs som kräver det.
    12. \n
    13. Nu kan du använda hela kursen.\nFrån och med nu behöver du bara skriva\nin ditt användarnamn och lösenord\n(i formuläret till vänster på denna sida)\nför att logga in och för att nå de kurser\nsom du är registrerad på.
    14. \n
    \nOBS! Genom att du bekräftar kontot så samtycker\ndu till databehandling enligt Personuppgiftslagen.\nOm du är osäker på vad det innebär så kan du hitta\nmer information här: 'http://www.datainspektionen.se/lagar-och-regler/personuppgiftslagen/\n'\n\nLycka till!", @@ -33,7 +33,7 @@ "newaccount": "Nytt konto", "newsitedescription": "Ange webbadressen till din Moodle webbplats. Observera att den kan vara konfigurerad så att den inte fungerar med appen", "notloggedin": "Du måste vara inloggad.", - "password": "Kursnyckel", + "password": "Lösenord", "passwordrequired": "Lösenord krävs", "policyaccept": "Jag förstår och accepterar", "policyagree": "Du måste acceptera denna policy för få fortsätta att använda denna webbplats. Accepterar du denna policy?", diff --git a/www/core/components/login/lang/tr.json b/www/core/components/login/lang/tr.json index f038892a59f..e417e613e87 100644 --- a/www/core/components/login/lang/tr.json +++ b/www/core/components/login/lang/tr.json @@ -18,7 +18,7 @@ "invalidmoodleversion": "Geçersiz Moodle sürümü. Sitenizin Sürümünün şundan aşağı olmaması gerekir:", "invalidsite": "Bu site adresi geçersizdir.", "invalidurl": "Girdiğiniz URL geçerli değil", - "login": "Giriş", + "login": "Giriş yap", "logininsiterequired": "Bir tarayıcı penceresinde siteye giriş yapmanız gerekiyor.", "loginsteps": "Bu siteye tam erişim için önce bir hesap oluşturmalısınız.", "missingemail": "E-posta adresi eksik", @@ -26,7 +26,7 @@ "missinglastname": "Soyadı eksik", "mobileservicesnotenabled": "Mobil Hizmetler sitenizde etkin değildir. Mobil erişimin etkin olduğunu düşünüyorsanız, Lütfen Moodle site yöneticinize başvurun.", "newaccount": "Yeni hesap", - "password": "Kayıt anahtarı", + "password": "Şifre", "passwordrequired": "Şifre zorunludur", "policyaccept": "Anladım ve kabul ediyorum", "policyagree": "Bu siteyi kullanmaya devam etmek için bu sözleşmeyi kabul etmelisiniz. Kabul ediyor musunuz?", diff --git a/www/core/components/login/lang/zh-cn.json b/www/core/components/login/lang/zh-cn.json index c52e6caccd2..7c5cb7f013d 100644 --- a/www/core/components/login/lang/zh-cn.json +++ b/www/core/components/login/lang/zh-cn.json @@ -16,7 +16,7 @@ "invalidmoodleversion": "无效的Moodle版本。最低版本要求是:", "invalidsite": "网站URL是无效的。", "invalidurl": "您刚刚输入的 URL 不合法", - "login": "登录您的账号", + "login": "登录", "logininsiterequired": "您需要在浏览器窗口中登录该站点。", "loginsteps": "为了能完全访问此网站,您首先需要创建一个帐户。", "missingemail": "Email地址没填", diff --git a/www/core/components/login/lang/zh-tw.json b/www/core/components/login/lang/zh-tw.json index 3065f563403..654cba89766 100644 --- a/www/core/components/login/lang/zh-tw.json +++ b/www/core/components/login/lang/zh-tw.json @@ -32,7 +32,7 @@ "invalidvaluemax": "最大值為 {{$a}}", "invalidvaluemin": "最小值為 {{$a}}", "localmobileunexpectedresponse": "Moodle行動其他功能檢查返回了無預期的回應, 您將使用標準行動服務進行身份驗證.", - "login": "登入您的帳號", + "login": "登入", "loginbutton": "登入", "logininsiterequired": "您的Moodle網站強制您以系統瀏覽器開啟. 將開啟新瀏覽器, 並重新導向這Moodle網站.", "loginsteps": "您好!如果您尚未申請帳號,為了能完整使用本網站課程,您需要先花一兩分鐘時間申請一個新帳號。此外,部分課程在初次選課時,還需要輸入開課教師所設定的選課密碼。\n

    申請帳號請依下列步驟進行:

    \n
      \n
    1. 請於 申請新帳號 表單中輸入個人相關資料。
    2. \n
    3. 一封電子郵件會立刻寄送到您的信箱中。
    4. \n
    5. 讀取您的電子郵件,點按信件中的網址連結。
    6. \n
    7. 您的帳號將得到確認,並且立刻登入本網站。
    8. \n
    9. 然後,請選擇您想要參加的課程。
    10. \n
    11. 如果系統提示要選課密鑰,請輸入教師提供給您的選課密碼,這樣才能註冊到該課程中。
    12. \n
    13. 從此,您只要輸入個人的帳號與密碼〈在左邊的表單中〉,就可以進入任何一個您已選修的課程中。
    14. \n
    ", diff --git a/www/core/lang/ar.json b/www/core/lang/ar.json index cdd15900df0..f8500db1399 100644 --- a/www/core/lang/ar.json +++ b/www/core/lang/ar.json @@ -1,7 +1,7 @@ { "allparticipants": "كل المشاركين", "areyousure": "هل انت متأكد؟", - "back": "رجوع", + "back": "العودة", "cancel": "ألغي", "cannotconnect": "لا يمكن الاتصال: تحقق من أنك كتبت عنوان URL بشكل صحيح وأنك تستخدم موقع موودل 2.4 أو أحدث.", "category": "فئة", diff --git a/www/core/lang/bg.json b/www/core/lang/bg.json index 980a09a4cc1..ed2182d2b21 100644 --- a/www/core/lang/bg.json +++ b/www/core/lang/bg.json @@ -1,7 +1,7 @@ { "allparticipants": "Всички участници", "areyousure": "Сигурни ли сте?", - "back": "« Обратно", + "back": "Обратно", "cancel": "Отказване", "cannotconnect": "Не става свързване: Проверете дали написахте правилно адреса и дали сайтът използва Moodle версия 2.4 или по-нова.", "category": "Категория", diff --git a/www/core/lang/ca.json b/www/core/lang/ca.json index 11c1effe7d2..ccc449aef4c 100644 --- a/www/core/lang/ca.json +++ b/www/core/lang/ca.json @@ -3,7 +3,7 @@ "allparticipants": "Tots els participants", "android": "Android", "areyousure": "Segur que voleu tirar endavant aquesta acció?", - "back": "« Enrere", + "back": "Enrere", "cancel": "Cancel·la", "cannotconnect": "No s'ha pogut connectar: Comproveu que l'URL és correcte i que el lloc Moodle utilitza la versió 2.4 o posterior.", "cannotdownloadfiles": "La descàrrega d'arxius està deshabilitada al vostre servei Mobile. Contacteu amb l'administrador.", diff --git a/www/core/lang/cs.json b/www/core/lang/cs.json index 6ac7d06210e..f43346b1255 100644 --- a/www/core/lang/cs.json +++ b/www/core/lang/cs.json @@ -3,7 +3,7 @@ "allparticipants": "Všichni účastníci", "android": "Android", "areyousure": "Opravdu?", - "back": "« Zpět", + "back": "Zpět", "cancel": "Zrušit", "cannotconnect": "Nelze se připojit: Ověřte, zda je zadali správně adresu URL a že používáte Moodle 2.4 nebo novější.", "cannotdownloadfiles": "Stahování souborů je vypnuto v Mobilních službách webu. Prosím, obraťte se na správce webu.", diff --git a/www/core/lang/da.json b/www/core/lang/da.json index a81cfdb8695..f3f98b8acbb 100644 --- a/www/core/lang/da.json +++ b/www/core/lang/da.json @@ -3,7 +3,7 @@ "allparticipants": "Alle deltagere", "android": "Android", "areyousure": "Er du sikker?", - "back": "« Tilbage", + "back": "Tilbage", "cancel": "Annuller", "cannotconnect": "Kan ikke tilslutte: kontroller at webadressen er rigtig og at dit websted bruger Moodle 2.4 eller nyere.", "cannotdownloadfiles": "Download af filer er deaktiveret i din mobilservice. Kontakt dit websteds administrator.", diff --git a/www/core/lang/de.json b/www/core/lang/de.json index ecccdb261e4..99401c583d7 100644 --- a/www/core/lang/de.json +++ b/www/core/lang/de.json @@ -3,7 +3,7 @@ "allparticipants": "Alle Teilnehmer/innen", "android": "Android", "areyousure": "Sind Sie sicher?", - "back": "« Zurück", + "back": "Zurück", "cancel": "Abbrechen", "cannotconnect": "Die Verbindung ist nicht möglich. Prüfen Sie, ob die URL richtig ist und dass mindestens Moodle 2.4 verwendet wird.", "cannotdownloadfiles": "Das Herunterladen von Dateien ist im mobilen Webservice deaktiviert. Wenden Sie sich an den Administrator der Website.", diff --git a/www/core/lang/el.json b/www/core/lang/el.json index c5cae2c9145..09a4738dde3 100644 --- a/www/core/lang/el.json +++ b/www/core/lang/el.json @@ -3,7 +3,7 @@ "allparticipants": "Όλοι οι συμμετέχοντες", "android": "Android", "areyousure": "Είστε σίγουρος ;", - "back": "< Επιστροφή", + "back": "Πίσω", "cancel": "Ακύρωση", "cannotconnect": "Δεν είναι δυνατή η σύνδεση: Βεβαιωθείτε ότι έχετε πληκτρολογήσει σωστά τη διεύθυνση URL και ότι το site σας χρησιμοποιεί το Moodle 2.4 ή νεότερη έκδοση.", "cannotdownloadfiles": "Το κατέβασμα αρχείων είναι απενεργοποιημένο. Παρακαλώ, επικοινωνήστε με το διαχειριστή του site σας.", diff --git a/www/core/lang/es-mx.json b/www/core/lang/es-mx.json index 6a7fba5bd32..541896c8613 100644 --- a/www/core/lang/es-mx.json +++ b/www/core/lang/es-mx.json @@ -3,7 +3,7 @@ "allparticipants": "Todos los participantes", "android": "Android", "areyousure": "¿Está Usted seguro?", - "back": "« Atrás", + "back": "Atrás", "cancel": "Cancelar", "cannotconnect": "No se puede conectar: Verifique que Usted escribió la URL correcta y que su sitio usa Moodle 2.4 o más reciente.", "cannotdownloadfiles": "La descarga de archivos está deshabilitada en su servicio Mobile. Por favor contacte a su administrador del sitio.", diff --git a/www/core/lang/es.json b/www/core/lang/es.json index eac73c2ea02..f46bf4c1915 100644 --- a/www/core/lang/es.json +++ b/www/core/lang/es.json @@ -3,7 +3,7 @@ "allparticipants": "Todos los participantes", "android": "Android", "areyousure": "¿Està seguro?", - "back": "« Atrás", + "back": "Atrás", "cancel": "Cancelar", "cannotconnect": "No se puede conectar: Verifique que la URL es correcta y que el sitio Moodle usa la versión 2.4 o posterior.", "cannotdownloadfiles": "La descarga de archivos está deshabilitada en su servicio Mobile. Por favor contacte al administrador de su sitio.", diff --git a/www/core/lang/eu.json b/www/core/lang/eu.json index 399292e7c4b..64a96e6e58e 100644 --- a/www/core/lang/eu.json +++ b/www/core/lang/eu.json @@ -3,7 +3,7 @@ "allparticipants": "Partaide guztiak", "android": "Android", "areyousure": "Ziur al zaude?", - "back": "« Atzera", + "back": "Atzera", "cancel": "Utzi", "cannotconnect": "Ezin izan da konektatu: URLa ondo idatzi duzula eta zure Moodle-ak 2.4 edo goragoko bertsioa erabiltzen duela egiaztatu ezazu.", "cannotdownloadfiles": "Fitxategiak jaistea ezgaituta dago zure Mobile zerbitzuan. Mesedez zure gune kudeatzailean harremanetan jarri zaitez.", diff --git a/www/core/lang/fa.json b/www/core/lang/fa.json index 1be357dd50d..b76dc72cc48 100644 --- a/www/core/lang/fa.json +++ b/www/core/lang/fa.json @@ -1,7 +1,7 @@ { "allparticipants": "همهٔ اعضاء", "areyousure": "آیا مطمئن هستید؟", - "back": "» بازگشت", + "back": "بازگشت", "cancel": "انصراف", "cannotconnect": "اتصال به سایت ممکن نبود. بررسی کنید که نشانی سایت را درست وارد کرده باشید و اینکه سایت شما از مودل ۲٫۴ یا جدیدتر استفاده کند.", "category": "دسته", diff --git a/www/core/lang/fr.json b/www/core/lang/fr.json index b3cee4e200c..2605de7b114 100644 --- a/www/core/lang/fr.json +++ b/www/core/lang/fr.json @@ -3,7 +3,7 @@ "allparticipants": "Tous les participants", "android": "Android", "areyousure": "En êtes-vous bien sûr ?", - "back": "« Retour", + "back": "Retour", "cancel": "Annuler", "cannotconnect": "Connexion impossible : vérifiez que l'URL a été saisie correctement et que votre site utilise Moodle 2.4 ou ultérieur.", "cannotdownloadfiles": "Le téléchargement de fichiers est désactivé dans le service mobile de votre plateforme. Veuillez contacter l'administrateur de la plateforme.", diff --git a/www/core/lang/he.json b/www/core/lang/he.json index 7672a3ed83c..0c54986a098 100644 --- a/www/core/lang/he.json +++ b/www/core/lang/he.json @@ -2,7 +2,7 @@ "allparticipants": "כל המשתתפים", "android": "אנדרואיד", "areyousure": "האם את/ה בטוח/ה?", - "back": "« חזרה\n", + "back": "חזרה", "cancel": "ביטול", "cannotconnect": "אין אפשרות להתחבר: אנא ודא כי הזנת נכון את כתובת האתר ושהאתר הוא בגרסה 2.4 ומעלה.", "cannotdownloadfiles": "הורדת קבצים אינה מאופשרת במכשירים ניידים. יש לפנות למנהל/ת האתר להפעלת אפשרות זו.", diff --git a/www/core/lang/hu.json b/www/core/lang/hu.json index ab3c5d03b06..a2db374e12b 100644 --- a/www/core/lang/hu.json +++ b/www/core/lang/hu.json @@ -1,7 +1,7 @@ { "allparticipants": "Összes résztvevő", "areyousure": "Biztos?", - "back": "« Vissza", + "back": "Vissza", "cancel": "Törlés", "cannotconnect": "Sikertelen kapcsolódás: ellenőrizze, jó-e az URL és a portál legalább 2.4-es Moodle-t használ-e.", "category": "Kategória", diff --git a/www/core/lang/it.json b/www/core/lang/it.json index b09cf8ff07a..1ab08758210 100644 --- a/www/core/lang/it.json +++ b/www/core/lang/it.json @@ -2,7 +2,7 @@ "allparticipants": "Tutti i partecipanti", "android": "Android", "areyousure": "Sei sicuro?", - "back": "« Back", + "back": "Indietro", "cancel": "Annulla", "cannotconnect": "Impossibile connettersi: verificare che l'URL sia corretto e che il sito usi Moodle 2.4 o versioni successive.", "cannotdownloadfiles": "Nel servizio Mobile Lo scaricamento di file è disabilitato. Per favore contatta l'amministratore del sito.", diff --git a/www/core/lang/ja.json b/www/core/lang/ja.json index 3a3aed50aec..7c3934c1c38 100644 --- a/www/core/lang/ja.json +++ b/www/core/lang/ja.json @@ -3,7 +3,7 @@ "allparticipants": "すべての参加者", "android": "Android", "areyousure": "本当によろしいですか?", - "back": "« 戻る", + "back": "戻る", "cancel": "キャンセル", "cannotconnect": "接続できません:正しいURLを入力しているか、サイトのMoodleが2.4以降であることを確認してください。", "cannotdownloadfiles": "ダウンロードしようとしているファイルは、あなたのモバイルサービスでは無効になっています。あなたのサイト管理者に連絡してください。", diff --git a/www/core/lang/lt.json b/www/core/lang/lt.json index 6a86388bca6..2246e0b4405 100644 --- a/www/core/lang/lt.json +++ b/www/core/lang/lt.json @@ -3,7 +3,7 @@ "allparticipants": "Visi dalyviai", "android": "Android", "areyousure": "Ar Jūs tikras?", - "back": "« Atgal", + "back": "Grįžti", "cancel": "Atšaukti", "cannotconnect": "Negalima prisijungti: patikrinkite, ar teisingai įvedėte URL adresą, ar Jūsų svetainė naudoja Moodle 2.4. ar vėlesnę versiją.", "cannotdownloadfiles": "Jūsų mobiliuoju ryšiu negalima atsisiųsti failo. Prašome susisiekti su svetainės administratoriumi.", diff --git a/www/core/lang/nl.json b/www/core/lang/nl.json index bb80cd061e0..30bbaafe113 100644 --- a/www/core/lang/nl.json +++ b/www/core/lang/nl.json @@ -3,7 +3,7 @@ "allparticipants": "Alle deelnemers", "android": "Android", "areyousure": "Weet je het zeker?", - "back": "« Terug", + "back": "Terug", "cancel": "Annuleer", "cannotconnect": "Kan niet verbinden: controleer of je de URL juist hebt ingegeven en dat je site Moodle 2.4 of recenter gebruikt.", "cannotdownloadfiles": "Bestanden downloaden is uitgeschakeld voor jouw mobiele service. Neem contact op met je systeembeheerder.", diff --git a/www/core/lang/pl.json b/www/core/lang/pl.json index 2074cef52c4..6529c2a0ea7 100644 --- a/www/core/lang/pl.json +++ b/www/core/lang/pl.json @@ -1,7 +1,7 @@ { "allparticipants": "Wszyscy uczestnicy", "areyousure": "Jesteś pewien?", - "back": "« Powrót", + "back": "Wstecz", "cancel": "Anuluj", "cannotconnect": "Nie można się połączyć: Sprawdź, czy wpisałeś poprawyny adres URL i twoja strona używa Moodle 2.4 lub nowsze.", "category": "Kategoria", diff --git a/www/core/lang/pt-br.json b/www/core/lang/pt-br.json index 7f18ff238b8..8776c6c504d 100644 --- a/www/core/lang/pt-br.json +++ b/www/core/lang/pt-br.json @@ -3,7 +3,7 @@ "allparticipants": "Todos os participantes", "android": "Android", "areyousure": "Você tem certeza?", - "back": "« Voltar", + "back": "Voltar", "cancel": "Cancelar", "cannotconnect": "Não é possível conectar-se: Verifique se digitou a URL corretamente e se seu site usa o Moodle 2.4 ou posterior.", "cannotdownloadfiles": "Download de arquivos está desabilitado no seu serviço Mobile. Por favor, contate o administrador do site.", diff --git a/www/core/lang/pt.json b/www/core/lang/pt.json index 73eb3906a63..477b29aee06 100644 --- a/www/core/lang/pt.json +++ b/www/core/lang/pt.json @@ -3,7 +3,7 @@ "allparticipants": "Todos", "android": "Android", "areyousure": "Tem a certeza?", - "back": "« Voltar", + "back": "Voltar", "cancel": "Cancelar", "cannotconnect": "Não é possível estabelecer a ligação: Verifique se digitou o URL corretamente e se o seu site Moodle possui a versão 2.4 ou superior.", "cannotdownloadfiles": "O seu serviço Moodle não permite descarregar ficheiros. Por favor, contacte o administrador do site.", diff --git a/www/core/lang/ro.json b/www/core/lang/ro.json index 6cbdac71897..c160b4b4196 100644 --- a/www/core/lang/ro.json +++ b/www/core/lang/ro.json @@ -2,7 +2,7 @@ "allparticipants": "Toţi participanţii", "android": "Adroid", "areyousure": "Ești sigur?", - "back": "« Înapoi", + "back": "Înapoi", "cancel": "Anulează", "cannotconnect": "A apărut o eroare conectare: verificați dacă ați scris corect adresa URL căutată și dacă siteul folosește cel puțin versiune de Moodle 2.4", "cannotdownloadfiles": "Descărcarea de fișiere este dezactivată pentru serviciul mobil. Contactați administratorul siteului.", diff --git a/www/core/lang/ru.json b/www/core/lang/ru.json index 8c1e361e574..437ec3ce5dc 100644 --- a/www/core/lang/ru.json +++ b/www/core/lang/ru.json @@ -2,7 +2,7 @@ "allparticipants": "Все участники", "android": "Android", "areyousure": "Вы уверены?", - "back": "« Назад", + "back": "Назад", "cancel": "Отменить", "cannotconnect": "Не удается подключиться: убедитесь, что Вы ввели правильный URL-адрес и что сайт использует Moodle 2.4 или более поздней версии.", "cannotdownloadfiles": "Скачивание файла отключено для мобильных служб. Пожалуйста, свяжитесь с администратором сайта.", diff --git a/www/core/lang/sv.json b/www/core/lang/sv.json index abbe11de849..ff3dd964b43 100644 --- a/www/core/lang/sv.json +++ b/www/core/lang/sv.json @@ -2,7 +2,7 @@ "allparticipants": "Alla deltagare", "android": "Android", "areyousure": "Är du säker?", - "back": "« Tillbaka", + "back": "Tillbaka", "cancel": "Avbryt", "cannotconnect": "Kan inte ansluta: Kontrollera att webbadressen är korrekt och att din webbplats använder Moodle 2.4 eller senare", "cannotdownloadfiles": "Nedladdning av filer är inaktiverad. Vänligen kontakta webbsidans administratör.", diff --git a/www/core/lang/tr.json b/www/core/lang/tr.json index a77ce3dff24..abf9c0a88d4 100644 --- a/www/core/lang/tr.json +++ b/www/core/lang/tr.json @@ -3,7 +3,7 @@ "allparticipants": "Bütün katılımcılar", "android": "Android", "areyousure": "Emin misiniz?", - "back": "« Geri", + "back": "Geri", "cancel": "İptal", "cannotconnect": "Bağlantı kurulamıyor: Doğru adres girdiğinizden ve sitenizin Moodle 2.4 ve sonrası sürüme sahip olduğundan emin olun.", "category": "Kategori", diff --git a/www/core/lang/uk.json b/www/core/lang/uk.json index 8fa63c712a4..d252f7e6d40 100644 --- a/www/core/lang/uk.json +++ b/www/core/lang/uk.json @@ -3,7 +3,7 @@ "allparticipants": "Усі учасники", "android": "Android", "areyousure": "Ви впевнені?", - "back": "« Назад", + "back": "Назад", "cancel": "Скасувати", "cannotconnect": "Неможливо з'єднатися: Переконайтеся, що ви ввели правильний URL і що сайт використовує Moodle 2.4 або більш пізню версію.", "cannotdownloadfiles": "Завантаження файлів відключено у вашій мобільній службі. Будь ласка, зверніться до адміністратора сайту.", diff --git a/www/core/lang/zh-cn.json b/www/core/lang/zh-cn.json index ca7d8d0dfac..30daa5f4231 100644 --- a/www/core/lang/zh-cn.json +++ b/www/core/lang/zh-cn.json @@ -1,7 +1,7 @@ { "allparticipants": "所有成员", "areyousure": "你确定吗?", - "back": "« 返回", + "back": "返回", "cancel": "取消", "cannotconnect": "无法连接:请确认您已经正确输入网址,并且您的网站使用了Moodle 2.4或更高版本。", "category": "类别", diff --git a/www/core/lang/zh-tw.json b/www/core/lang/zh-tw.json index 198c9b7eeb7..5144e85b257 100644 --- a/www/core/lang/zh-tw.json +++ b/www/core/lang/zh-tw.json @@ -3,7 +3,7 @@ "allparticipants": "所有參與者", "android": "安卓", "areyousure": "你確定嗎?", - "back": "« 回頭", + "back": "返回", "cancel": "取消", "cannotconnect": "無法連接:請確認您輸入之網址正確,且您的位置使用的是Moodle2.4版或更新版本。", "cannotdownloadfiles": "在您的行動服務中禁用檔案下載. 請與您的網站管理員聯繫.", From fb0357cabfbd79bf5436768cc6d6f4ea13fb013d Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 27 Jul 2017 18:23:52 +0200 Subject: [PATCH 108/118] MOBILE-2178 release: Auto-translated strings --- www/addons/calendar/lang/ca.json | 2 +- www/addons/calendar/lang/es-mx.json | 4 +-- www/addons/calendar/lang/lt.json | 2 +- www/addons/calendar/lang/pt.json | 2 +- www/addons/calendar/lang/zh-cn.json | 4 +-- www/addons/calendar/lang/zh-tw.json | 2 +- www/addons/competency/lang/ca.json | 2 +- www/addons/competency/lang/es-mx.json | 2 +- www/addons/competency/lang/lt.json | 2 +- www/addons/competency/lang/pt.json | 2 +- www/addons/competency/lang/zh-tw.json | 2 +- www/addons/coursecompletion/lang/ca.json | 18 ++++++------ www/addons/coursecompletion/lang/es-mx.json | 26 ++++++++--------- www/addons/coursecompletion/lang/lt.json | 22 +++++++-------- www/addons/coursecompletion/lang/pt.json | 18 ++++++------ www/addons/coursecompletion/lang/zh-tw.json | 28 +++++++++---------- www/addons/files/lang/ca.json | 4 +-- www/addons/files/lang/de.json | 6 ++-- www/addons/files/lang/es-mx.json | 4 +-- www/addons/files/lang/lt.json | 4 +-- www/addons/files/lang/pt.json | 4 +-- www/addons/files/lang/zh-tw.json | 4 +-- www/addons/messages/lang/es-mx.json | 2 +- www/addons/messages/lang/lt.json | 2 +- www/addons/messages/lang/zh-tw.json | 2 +- www/addons/mod/data/lang/de.json | 2 ++ www/addons/mod/data/lang/es-mx.json | 2 ++ www/addons/mod/data/lang/nl.json | 2 ++ www/addons/mod/data/lang/sr-cr.json | 2 ++ www/addons/mod/data/lang/sr-lt.json | 2 ++ www/addons/mod/feedback/lang/de.json | 2 +- www/addons/mod/feedback/lang/es-mx.json | 2 +- www/addons/mod/feedback/lang/nl.json | 2 +- www/addons/mod/folder/lang/ca.json | 2 +- www/addons/mod/folder/lang/es-mx.json | 2 +- www/addons/mod/folder/lang/lt.json | 2 +- www/addons/mod/folder/lang/pt.json | 2 +- www/addons/mod/folder/lang/zh-tw.json | 2 +- www/addons/mod/forum/lang/zh-tw.json | 2 +- www/addons/mod/glossary/lang/ca.json | 2 +- www/addons/mod/glossary/lang/es-mx.json | 2 +- www/addons/mod/glossary/lang/lt.json | 2 +- www/addons/mod/glossary/lang/pt.json | 2 +- www/addons/mod/glossary/lang/zh-tw.json | 2 +- www/addons/mod/label/lang/lt.json | 2 +- www/addons/mod/lesson/lang/de.json | 1 + www/addons/mod/lesson/lang/es-mx.json | 7 +++-- www/addons/mod/lesson/lang/nl.json | 3 +- www/addons/mod/lesson/lang/sr-cr.json | 3 +- www/addons/mod/lesson/lang/sr-lt.json | 3 +- www/addons/mod/survey/lang/zh-tw.json | 2 +- www/addons/mod/wiki/lang/ca.json | 2 +- www/addons/mod/wiki/lang/es-mx.json | 2 +- www/addons/mod/wiki/lang/lt.json | 2 +- www/addons/mod/wiki/lang/pt.json | 2 +- www/addons/mod/wiki/lang/tr.json | 2 +- www/addons/mod/wiki/lang/zh-tw.json | 2 +- www/addons/notes/lang/ca.json | 2 +- www/addons/notes/lang/es-mx.json | 2 +- www/addons/notes/lang/lt.json | 2 +- www/addons/notes/lang/pt.json | 2 +- www/addons/notes/lang/zh-tw.json | 2 +- www/addons/notifications/lang/ca.json | 2 +- www/addons/notifications/lang/es-mx.json | 2 +- www/addons/notifications/lang/lt.json | 2 +- www/addons/notifications/lang/zh-cn.json | 2 +- www/addons/notifications/lang/zh-tw.json | 2 +- www/addons/participants/lang/ca.json | 2 +- www/addons/participants/lang/cs.json | 4 +++ www/addons/participants/lang/es-mx.json | 2 +- www/addons/participants/lang/it.json | 4 +++ www/addons/participants/lang/lt.json | 2 +- www/addons/participants/lang/pt.json | 4 +-- www/addons/participants/lang/tr.json | 2 +- www/addons/participants/lang/zh-cn.json | 2 +- www/addons/participants/lang/zh-tw.json | 4 +-- www/core/components/course/lang/ca.json | 2 +- www/core/components/course/lang/es-mx.json | 4 +-- www/core/components/course/lang/lt.json | 4 +-- www/core/components/course/lang/pt.json | 2 +- www/core/components/course/lang/tr.json | 4 +-- www/core/components/course/lang/zh-cn.json | 2 +- www/core/components/course/lang/zh-tw.json | 4 +-- www/core/components/courses/lang/ca.json | 6 ++-- www/core/components/courses/lang/es-mx.json | 6 ++-- www/core/components/courses/lang/lt.json | 8 +++--- www/core/components/courses/lang/pt.json | 8 +++--- www/core/components/courses/lang/zh-tw.json | 8 +++--- www/core/components/fileuploader/lang/ca.json | 8 +++--- .../components/fileuploader/lang/es-mx.json | 8 +++--- www/core/components/fileuploader/lang/lt.json | 8 +++--- www/core/components/fileuploader/lang/pt.json | 10 +++---- www/core/components/fileuploader/lang/tr.json | 2 +- .../components/fileuploader/lang/zh-cn.json | 2 +- .../components/fileuploader/lang/zh-tw.json | 10 +++---- www/core/components/login/lang/de.json | 2 +- www/core/components/login/lang/es-mx.json | 4 +-- www/core/components/login/lang/lt.json | 4 +-- www/core/components/login/lang/pt.json | 4 +-- www/core/components/login/lang/zh-tw.json | 4 +-- www/core/components/question/lang/ca.json | 2 +- www/core/components/question/lang/es-mx.json | 2 +- www/core/components/question/lang/lt.json | 2 +- www/core/components/question/lang/pt.json | 2 +- www/core/components/question/lang/zh-tw.json | 2 +- www/core/components/settings/lang/de.json | 4 +-- www/core/components/sharedfiles/lang/ca.json | 2 +- www/core/components/sharedfiles/lang/de.json | 4 +-- .../components/sharedfiles/lang/es-mx.json | 2 +- www/core/components/sharedfiles/lang/lt.json | 4 +-- www/core/components/sharedfiles/lang/pt.json | 2 +- www/core/components/sharedfiles/lang/tr.json | 2 +- .../components/sharedfiles/lang/zh-tw.json | 4 +-- www/core/components/sidemenu/lang/ca.json | 2 +- www/core/components/sidemenu/lang/de.json | 2 +- www/core/components/sidemenu/lang/es-mx.json | 2 +- www/core/components/sidemenu/lang/lt.json | 6 ++-- www/core/components/sidemenu/lang/pt.json | 2 +- www/core/components/sidemenu/lang/tr.json | 2 +- www/core/components/sidemenu/lang/zh-cn.json | 2 +- www/core/components/sidemenu/lang/zh-tw.json | 4 +-- www/core/components/user/lang/ca.json | 2 +- www/core/components/user/lang/es-mx.json | 4 +-- www/core/components/user/lang/lt.json | 6 ++-- www/core/components/user/lang/pt.json | 2 +- www/core/components/user/lang/tr.json | 6 ++-- www/core/components/user/lang/zh-cn.json | 4 +-- www/core/components/user/lang/zh-tw.json | 6 ++-- www/core/lang/ca.json | 10 +++---- www/core/lang/de.json | 9 ++++-- www/core/lang/es-mx.json | 17 +++++++---- www/core/lang/lt.json | 10 +++---- www/core/lang/nl.json | 7 ++++- www/core/lang/pt.json | 12 ++++---- www/core/lang/sr-cr.json | 7 ++++- www/core/lang/sr-lt.json | 7 ++++- www/core/lang/tr.json | 4 +-- www/core/lang/zh-tw.json | 14 +++++----- 138 files changed, 321 insertions(+), 273 deletions(-) create mode 100644 www/addons/participants/lang/cs.json create mode 100644 www/addons/participants/lang/it.json diff --git a/www/addons/calendar/lang/ca.json b/www/addons/calendar/lang/ca.json index a2a8930c77d..cc1ee634071 100644 --- a/www/addons/calendar/lang/ca.json +++ b/www/addons/calendar/lang/ca.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Hora de notificació per defecte", "errorloadevent": "S'ha produït un error carregant l'esdeveniment.", "errorloadevents": "S'ha produït un error carregant els esdeveniments.", - "noevents": "Cap activitat venç properament", + "noevents": "No hi ha cap esdeveniment", "notifications": "Notificacions" } \ No newline at end of file diff --git a/www/addons/calendar/lang/es-mx.json b/www/addons/calendar/lang/es-mx.json index d4be495ef94..872b31813b4 100644 --- a/www/addons/calendar/lang/es-mx.json +++ b/www/addons/calendar/lang/es-mx.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Hora de notificación por defecto", "errorloadevent": "Error al cargar evento.", "errorloadevents": "Error al cargar eventos.", - "noevents": "No hay actividades próximas pendientes", - "notifications": "Avisos" + "noevents": "No hay eventos", + "notifications": "Notificaciones" } \ No newline at end of file diff --git a/www/addons/calendar/lang/lt.json b/www/addons/calendar/lang/lt.json index 38fab7b87a5..84444f84a30 100644 --- a/www/addons/calendar/lang/lt.json +++ b/www/addons/calendar/lang/lt.json @@ -2,6 +2,6 @@ "calendarevents": "Renginių kalendorius", "errorloadevent": "Klaida įkeliant renginį.", "errorloadevents": "Klaida įkeliant renginius.", - "noevents": "Nėra numatytų artėjančių veiklų", + "noevents": "Renginių nėra", "notifications": "Pranešimai" } \ No newline at end of file diff --git a/www/addons/calendar/lang/pt.json b/www/addons/calendar/lang/pt.json index a65b11f461a..6cb58c20e8d 100644 --- a/www/addons/calendar/lang/pt.json +++ b/www/addons/calendar/lang/pt.json @@ -3,6 +3,6 @@ "defaultnotificationtime": "Hora de notificação predefinida", "errorloadevent": "Erro ao carregar evento.", "errorloadevents": "Erro ao carregar eventos.", - "noevents": "Nenhuma atividade programada", + "noevents": "Sem eventos", "notifications": "Notificações" } \ No newline at end of file diff --git a/www/addons/calendar/lang/zh-cn.json b/www/addons/calendar/lang/zh-cn.json index 4afe676ce56..5fc1088f46f 100644 --- a/www/addons/calendar/lang/zh-cn.json +++ b/www/addons/calendar/lang/zh-cn.json @@ -1,4 +1,4 @@ { - "noevents": "没有即将到期的活动", - "notifications": "通告" + "noevents": "没有事件", + "notifications": "通知" } \ No newline at end of file diff --git a/www/addons/calendar/lang/zh-tw.json b/www/addons/calendar/lang/zh-tw.json index a6d35c00472..f880be3d54c 100644 --- a/www/addons/calendar/lang/zh-tw.json +++ b/www/addons/calendar/lang/zh-tw.json @@ -2,6 +2,6 @@ "calendarevents": "行事曆", "errorloadevent": "載入事件時出現錯誤", "errorloadevents": "載入事件時出現錯誤", - "noevents": "沒有即將到期的活動", + "noevents": "沒有事件", "notifications": "通知" } \ No newline at end of file diff --git a/www/addons/competency/lang/ca.json b/www/addons/competency/lang/ca.json index 80f7da7b125..60ba1a02774 100644 --- a/www/addons/competency/lang/ca.json +++ b/www/addons/competency/lang/ca.json @@ -10,7 +10,7 @@ "learningplans": "Plans d'aprenentatge", "myplans": "Els meus plans d'aprenentatge", "noactivities": "Cap activitat", - "nocompetencies": "No s'han creat competències en aquest marc.", + "nocompetencies": "Cap competència", "nocrossreferencedcompetencies": "No hi ha competències amb referències a aquesta.", "noevidence": "Cap evidència", "noplanswerecreated": "No s'ha creat cap pla d'aprenentatge.", diff --git a/www/addons/competency/lang/es-mx.json b/www/addons/competency/lang/es-mx.json index f1a9d12780f..89fed0897ca 100644 --- a/www/addons/competency/lang/es-mx.json +++ b/www/addons/competency/lang/es-mx.json @@ -12,7 +12,7 @@ "learningplans": "Planes de aprendizaje", "myplans": "Mis planes de aprendizaje", "noactivities": "Sin actividades", - "nocompetencies": "No se han creado competencias en esta estructura.", + "nocompetencies": "Sin competencias", "nocrossreferencedcompetencies": "No se han referenciado cruzadamente otras competencias con esta competencia.", "noevidence": "Sin evidencia", "noplanswerecreated": "No se crearon planes de aprendizaje.", diff --git a/www/addons/competency/lang/lt.json b/www/addons/competency/lang/lt.json index cc846b39a81..e7f4c88b879 100644 --- a/www/addons/competency/lang/lt.json +++ b/www/addons/competency/lang/lt.json @@ -10,7 +10,7 @@ "learningplans": "Mokymosi planai", "myplans": "Mano mokymosi planai", "noactivities": "Nėra veiklų", - "nocompetencies": "Šioje sistemoje nebuvo sukurta kompetencijų.", + "nocompetencies": "Nėra kompetencijų", "nocrossreferencedcompetencies": "Jokios kitos kompetencijos nebuvo susietos kryžmine nuoroda su šia kompetencija.", "noevidence": "Nėra įrodymų", "noplanswerecreated": "Nebuvo sukurta mokymosi planų.", diff --git a/www/addons/competency/lang/pt.json b/www/addons/competency/lang/pt.json index a4a75b2de01..f8d90d2f944 100644 --- a/www/addons/competency/lang/pt.json +++ b/www/addons/competency/lang/pt.json @@ -12,7 +12,7 @@ "learningplans": "Planos de aprendizagem", "myplans": "Os meus planos de aprendizagem", "noactivities": "Nenhuma atividade associada", - "nocompetencies": "Ainda não foram criadas competências neste quadro.", + "nocompetencies": "Sem competências", "nocrossreferencedcompetencies": "Nenhuma competência foi referenciada a esta competência.", "noevidence": "Não foi adicionado nenhum comprovativo", "noplanswerecreated": "Nenhum plano de aprendizagem foi criado.", diff --git a/www/addons/competency/lang/zh-tw.json b/www/addons/competency/lang/zh-tw.json index 90a00057bf4..9106adffc4f 100644 --- a/www/addons/competency/lang/zh-tw.json +++ b/www/addons/competency/lang/zh-tw.json @@ -12,7 +12,7 @@ "learningplans": "學習計畫", "myplans": "我的學習計畫", "noactivities": "沒有活動", - "nocompetencies": "在這一架構中沒有核心能力被建立", + "nocompetencies": "沒有功能", "nocrossreferencedcompetencies": "沒有其他核心能力被交互參照這一核心能力", "noevidence": "沒有證據", "noplanswerecreated": "沒有學習計畫被建立", diff --git a/www/addons/coursecompletion/lang/ca.json b/www/addons/coursecompletion/lang/ca.json index 9a6429f37c6..c8c2a11d5e0 100644 --- a/www/addons/coursecompletion/lang/ca.json +++ b/www/addons/coursecompletion/lang/ca.json @@ -1,21 +1,21 @@ { - "complete": "Completa", + "complete": "Complet", "completecourse": "Curs complet", - "completed": "completat", + "completed": "Completat", "completiondate": "Data de compleció", "couldnotloadreport": "No es pot carregar l'informe de compleció del curs, torneu a intentar-ho més tard.", - "coursecompletion": "Compleció de curs", + "coursecompletion": "Compleció del curs", "criteria": "Criteris", "criteriagroup": "Grup de criteris", - "criteriarequiredall": "Cal que es compleixin tots els criteris que es mostren a continuació", - "criteriarequiredany": "Cal que es compleixi algun dels criteris que es mostren a continuació", - "inprogress": "En progrés", + "criteriarequiredall": "Calen tots els criteris del dessota", + "criteriarequiredany": "Cal qualsevol dels criteris del dessota", + "inprogress": "En curs", "manualselfcompletion": "Auto-compleció manual", "notyetstarted": "No s'ha començat encara", - "pending": "Pendent", - "required": "Requerit", + "pending": "Pendents", + "required": "Necessari", "requiredcriteria": "Criteri requerit", "requirement": "Requisit", - "status": "Estat de la insígnia", + "status": "Estat", "viewcoursereport": "Visualitza l'informe del curs" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/es-mx.json b/www/addons/coursecompletion/lang/es-mx.json index 40d6b0459ae..0252ef2ea82 100644 --- a/www/addons/coursecompletion/lang/es-mx.json +++ b/www/addons/coursecompletion/lang/es-mx.json @@ -1,21 +1,21 @@ { - "complete": "Completado", + "complete": "Completo", "completecourse": "Curso completo", - "completed": "Finalizado", + "completed": "Completado", "completiondate": "Fecha de terminación", "couldnotloadreport": "No pudo cargarse el reporte de finalización del curso; por favor inténtelo más tarde.", - "coursecompletion": "Finalización de curso", - "criteria": "Criterios", - "criteriagroup": "Grupo de criterios", - "criteriarequiredall": "Son necesarios todos los criterios que aparecen más abajo", - "criteriarequiredany": "Es necesario cualquiera de los criterios que aparecen más abajo", - "inprogress": "En curso", - "manualselfcompletion": "Auto-finalizar manualmente", - "notyetstarted": "Aún no ha comenzado", + "coursecompletion": "Finalización del curso", + "criteria": "Criterio", + "criteriagroup": "Grupo de criterio", + "criteriarequiredall": "Todos los criterios debajo son necesarios", + "criteriarequiredany": "Cualquiera de los criterios debajo es necesarios", + "inprogress": "en progreso", + "manualselfcompletion": "Auto finalización manual", + "notyetstarted": "Todavía no iniciado", "pending": "Pendiente", - "required": "Obligatorio", - "requiredcriteria": "Criterios necesarios", + "required": "Requerido", + "requiredcriteria": "Criterio requerido", "requirement": "Requisito", - "status": "Estatus de insignias", + "status": "Estatus", "viewcoursereport": "Ver reporte del curso" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/lt.json b/www/addons/coursecompletion/lang/lt.json index e26747a5ead..c6813474cf2 100644 --- a/www/addons/coursecompletion/lang/lt.json +++ b/www/addons/coursecompletion/lang/lt.json @@ -1,21 +1,21 @@ { - "complete": "Užbaigti", + "complete": "Visas", "completecourse": "Visa kursų medžiaga", - "completed": "Baigtas", + "completed": "Užbaigta", "completiondate": "Užbaigimo data", "couldnotloadreport": "Nepavyko įkelti kursų baigimo ataskaitos, prašome pabandyti vėliau.", - "coursecompletion": "Kurso baigimas", + "coursecompletion": "Kursų užbaigimas", "criteria": "Kriterijai", "criteriagroup": "Kriterijų grupė", - "criteriarequiredall": "Visi žemiau pateikti kriterijai yra būtini", - "criteriarequiredany": "Bet kuris žemiau pateiktas kriterijus yra būtinas", - "inprogress": "Atliekama", - "manualselfcompletion": "Savas užbaigimas neautomatiniu būdu", - "notyetstarted": "Dar nepradėta", + "criteriarequiredall": "Visi žemiau esantys kriterijai yra privalomi", + "criteriarequiredany": "Kiekvienas kriterijus, esantis žemiau, yra privalomas", + "inprogress": "Nebaigta", + "manualselfcompletion": "Savarankiško mokymosi vadovas", + "notyetstarted": "Nepradėta", "pending": "Laukiama", - "required": "Būtina", - "requiredcriteria": "Būtini kriterijai", + "required": "Privaloma", + "requiredcriteria": "Privalomi kriterijai", "requirement": "Būtina sąlyga", - "status": "Pasiekimo būsena", + "status": "Būsena", "viewcoursereport": "Peržiūrėti kursų ataskaitą" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/pt.json b/www/addons/coursecompletion/lang/pt.json index 7de6a08cbaa..5f2bd4dc942 100644 --- a/www/addons/coursecompletion/lang/pt.json +++ b/www/addons/coursecompletion/lang/pt.json @@ -1,21 +1,21 @@ { - "complete": "Completo", + "complete": "Concluído", "completecourse": "Disciplina concluída", - "completed": "Completou", + "completed": "Concluído", "completiondate": "Data de conclusão", "couldnotloadreport": "Não foi possível carregar o relatório de conclusão da disciplina, por favor tente mais tarde.", - "coursecompletion": "Os utilizadores têm de completar esta disciplina", + "coursecompletion": "Conclusão da disciplina", "criteria": "Critérios", "criteriagroup": "Grupo de critérios", - "criteriarequiredall": "Todos os critérios abaixo são exigidos", - "criteriarequiredany": "Qualquer dos critérios abaixo é necessário", + "criteriarequiredall": "É exigido o cumprimento de todos os critérios abaixo", + "criteriarequiredany": "É exigido o cumprimento de qualquer um dos critérios abaixo", "inprogress": "Em progresso", "manualselfcompletion": "Conclusão manual pelo próprio", - "notyetstarted": "Ainda não iniciou", + "notyetstarted": "Não iniciou", "pending": "Pendente", - "required": "Obrigatório", - "requiredcriteria": "Critério obrigatório", + "required": "Exigido", + "requiredcriteria": "Critério exigido", "requirement": "Requisito", - "status": "Estado da Medalha", + "status": "Estado", "viewcoursereport": "Ver relatório da disciplina" } \ No newline at end of file diff --git a/www/addons/coursecompletion/lang/zh-tw.json b/www/addons/coursecompletion/lang/zh-tw.json index 2e6a01c0622..55f600fc398 100644 --- a/www/addons/coursecompletion/lang/zh-tw.json +++ b/www/addons/coursecompletion/lang/zh-tw.json @@ -1,21 +1,21 @@ { - "complete": "完全", + "complete": "完成", "completecourse": "完成課程", - "completed": "完成", + "completed": "已完成", "completiondate": "完成日期", "couldnotloadreport": "無法載入課程完成報表,請稍後再試.", - "coursecompletion": "課程進度", - "criteria": "規準", - "criteriagroup": "各種判斷條件", - "criteriarequiredall": "必須滿足以下所有條件", - "criteriarequiredany": "必須滿足以下任一條件", - "inprogress": "進行中", + "coursecompletion": "課程完成度", + "criteria": "條件", + "criteriagroup": "條件群組", + "criteriarequiredall": "以下所有的條件都為必填", + "criteriarequiredany": "以下任何條件都為必須", + "inprogress": "處理中", "manualselfcompletion": "手動自我完成", - "notyetstarted": "尚未開始", - "pending": "等待中", - "required": "必答", - "requiredcriteria": "必要條件", + "notyetstarted": "還沒有開始", + "pending": "暫緩", + "required": "必須的", + "requiredcriteria": "必須條件", "requirement": "需要", - "status": "獎章狀態", - "viewcoursereport": "查看課程報告" + "status": "狀態", + "viewcoursereport": "檢視課程報表" } \ No newline at end of file diff --git a/www/addons/files/lang/ca.json b/www/addons/files/lang/ca.json index 90887bf7b3f..035be4b1f33 100644 --- a/www/addons/files/lang/ca.json +++ b/www/addons/files/lang/ca.json @@ -2,12 +2,12 @@ "admindisableddownload": "Teniu en compte que l'administrador de Moodle ha desactivat la descàrrega d'arxius; podeu visualitzar els arxius, però no descarregar-los.", "clicktoupload": "Feu clic al botó del dessota per pujar arxius a l'àrea del vostres fitxers.", "couldnotloadfiles": "La llista d'arxius no s'ha pogut carregar.", - "emptyfilelist": "No hi ha fitxers per mostrar", + "emptyfilelist": "No hi ha fitxers per mostrar.", "erroruploadnotworking": "No es poden pujar fitxers al vostre lloc ara mateix.", "files": "Fitxers", "myprivatefilesdesc": "Els arxius que teniu disponibles a la vostra àrea privada en aquest lloc Moodle.", "privatefiles": "Fitxers privats", "sitefiles": "Fitxers del lloc", "sitefilesdesc": "Els altres arxius que es troben disponibles en aquest lloc Moodle.", - "uploadfiles": "Envia fitxers de retroacció" + "uploadfiles": "Puja fitxers" } \ No newline at end of file diff --git a/www/addons/files/lang/de.json b/www/addons/files/lang/de.json index 39a046af215..337b5b880d1 100644 --- a/www/addons/files/lang/de.json +++ b/www/addons/files/lang/de.json @@ -1,11 +1,11 @@ { "admindisableddownload": "Das Herunterladen von Dateien ist deaktiviert. Sie können nur die Dateiliste sehen.", - "clicktoupload": "Tippen Sie auf die Taste, um Dateien in 'Meine Dateien' hochzuladen.", - "couldnotloadfiles": "Die Dateiliste konnte nicht geladen werden.", + "clicktoupload": "Tippen Sie auf die Taste, um Dateien in den Bereich 'Meine Dateien' hochzuladen.", + "couldnotloadfiles": "Die Liste der Dateien konnte nicht geladen werden.", "emptyfilelist": "Keine Dateien", "erroruploadnotworking": "Im Moment können keine Dateien zur Website hochgeladen werden.", "files": "Dateien", - "myprivatefilesdesc": "Diese Dateien liegen in Ihrem persönlichen Bereich auf dieser Website.", + "myprivatefilesdesc": "Dateien, die in Ihrem persönlichen Bereich auf dieser Website liegen.", "privatefiles": "Meine Dateien", "sitefiles": "Dateien", "sitefilesdesc": "Weitere Dateien, die für Sie in anderen Bereichen der Website verfügbar sind.", diff --git a/www/addons/files/lang/es-mx.json b/www/addons/files/lang/es-mx.json index 3a779e4d667..38849f29131 100644 --- a/www/addons/files/lang/es-mx.json +++ b/www/addons/files/lang/es-mx.json @@ -2,12 +2,12 @@ "admindisableddownload": "Por favor tome nota de que su administrador de Moodle deshabilitó las descargas de archivos; Usted puede ver los archivos pero no puede descargarlos.", "clicktoupload": "Haga click en el botón inferior para subir archivos a sus archivos privados.", "couldnotloadfiles": "La lista de archivos no pudo cargarse.", - "emptyfilelist": "No hay archivos que mostrar", + "emptyfilelist": "No hay archivos para mostrar.", "erroruploadnotworking": "Desafortunadamente ahorita no es posible subir archivos a su sitio.", "files": "Archivos", "myprivatefilesdesc": "Los archivos que están disponibles en su área privada en este sitio Moodle.", "privatefiles": "Archivos privados", "sitefiles": "Archivos del sitio", "sitefilesdesc": "Los otros archivos que están disponibles para Usted en este sitio Moodle.", - "uploadfiles": "Mandar archivos de retroalimentación" + "uploadfiles": "Subir archivos" } \ No newline at end of file diff --git a/www/addons/files/lang/lt.json b/www/addons/files/lang/lt.json index 1e5b2c5b2f2..82157441c00 100644 --- a/www/addons/files/lang/lt.json +++ b/www/addons/files/lang/lt.json @@ -2,12 +2,12 @@ "admindisableddownload": "Primename, kad Moodle administratorius panaikino galimybę parsisiųsti failus, failų atsisiųsti negalima, galite tik naršyti.", "clicktoupload": "Paspauskite mygtuką, esantį žemiau, kad galėtumėte atsisiųsti failus į privatų aplanką.", "couldnotloadfiles": "Negalima užkrauti failų sąrašo.", - "emptyfilelist": "Nėra rodytinų failų", + "emptyfilelist": "Nėra ką rodyti.", "erroruploadnotworking": "Deja, failo į pasirinktą svetainę įkelti negalima.", "files": "Failai", "myprivatefilesdesc": "Jūsų privatūs failai Moodle svetainėje.", "privatefiles": "Asmeniniai failai", "sitefiles": "Svetainės failai", "sitefilesdesc": "Kiti failai Moodle svetainėje", - "uploadfiles": "Siųsti grįžtamojo ryšio failus" + "uploadfiles": "Įkelti failus" } \ No newline at end of file diff --git a/www/addons/files/lang/pt.json b/www/addons/files/lang/pt.json index aad6d0a66be..e37a1840902 100644 --- a/www/addons/files/lang/pt.json +++ b/www/addons/files/lang/pt.json @@ -2,12 +2,12 @@ "admindisableddownload": "Tenha en atenção que o administrador do Moodle desativou a opção de descarregar ficheiros. Poderá navegar nos ficheiros mas não conseguirá descarregá-los.", "clicktoupload": "Clique no botão abaixo para carregar ficheiros para os seus ficheiros privados.", "couldnotloadfiles": "Não foi possível carregar a lista de ficheiros", - "emptyfilelist": "Este repositório está vazio", + "emptyfilelist": "Não há ficheiros", "erroruploadnotworking": "Infelizmente não é possível carregar ficheiros para o seu site.", "files": "Anexos", "myprivatefilesdesc": "Ficheiros disponíveis na sua área privada neste site Moodle", "privatefiles": "Ficheiros privados", "sitefiles": "Ficheiros do site", "sitefilesdesc": "Os outros ficheiros que estão disponíveis para si neste site Moodle.", - "uploadfiles": "Enviar ficheiros de feedback" + "uploadfiles": "Carregar ficheiros" } \ No newline at end of file diff --git a/www/addons/files/lang/zh-tw.json b/www/addons/files/lang/zh-tw.json index 7f0cc12450e..78c6090acee 100644 --- a/www/addons/files/lang/zh-tw.json +++ b/www/addons/files/lang/zh-tw.json @@ -2,12 +2,12 @@ "admindisableddownload": "請注意, 您的Moodle管理員禁止檔案下載, 您可以瀏覽檔案, 但不能下載它們.", "clicktoupload": "點選這個按鈕,將檔案上傳到你的個人檔案區", "couldnotloadfiles": "這些檔案是不能被載入的", - "emptyfilelist": "沒有可以顯示的檔案", + "emptyfilelist": "沒有檔案可以顯示", "erroruploadnotworking": "很抱歉, 目前無法將檔案上傳到您的網站.", "files": "檔案", "myprivatefilesdesc": "在此Moodle網站上, 您的私有區域中有可用的文件", "privatefiles": "私人檔案", "sitefiles": "網站檔案", "sitefilesdesc": "您在此Moodle網站上有可用的其他文件.", - "uploadfiles": "送出回饋檔案" + "uploadfiles": "上傳檔案" } \ No newline at end of file diff --git a/www/addons/messages/lang/es-mx.json b/www/addons/messages/lang/es-mx.json index da63ffaf879..666045c556a 100644 --- a/www/addons/messages/lang/es-mx.json +++ b/www/addons/messages/lang/es-mx.json @@ -21,7 +21,7 @@ "newmessage": "Nuevo mensaje", "newmessages": "Nuevos mensajes", "nomessages": "Aún no hay mensajes", - "nousersfound": "No se encuentran usuarios", + "nousersfound": "No se encontraron usuarios", "removecontact": "Eliminar contacto", "removecontactconfirm": "El contacto será quitado de su lista de contactos.", "send": "Enviar", diff --git a/www/addons/messages/lang/lt.json b/www/addons/messages/lang/lt.json index ba0d4980bbf..99ebd5052e4 100644 --- a/www/addons/messages/lang/lt.json +++ b/www/addons/messages/lang/lt.json @@ -16,7 +16,7 @@ "mustbeonlinetosendmessages": "Norėdamas išsiųsti žinutę, turite prisijungti", "newmessage": "Nauja žinutė", "nomessages": "Žinučių dar nėra", - "nousersfound": "Nerasta naudotojų", + "nousersfound": "Vartotojas nerastas", "removecontact": "Pašalinti kontaktą", "send": "Siųsti", "sendmessage": "Siųsti žinutę", diff --git a/www/addons/messages/lang/zh-tw.json b/www/addons/messages/lang/zh-tw.json index de4e6fccf0f..60b1bfa8db2 100644 --- a/www/addons/messages/lang/zh-tw.json +++ b/www/addons/messages/lang/zh-tw.json @@ -18,7 +18,7 @@ "mustbeonlinetosendmessages": "您必須上線才能發送訊息", "newmessage": "新簡訊", "nomessages": "尚無訊息", - "nousersfound": "找不到用戶", + "nousersfound": "沒有使用者", "removecontact": "刪除聯絡人", "send": "送出", "sendmessage": "傳送簡訊", diff --git a/www/addons/mod/data/lang/de.json b/www/addons/mod/data/lang/de.json index 47de37fa0c4..f9e7fff488f 100644 --- a/www/addons/mod/data/lang/de.json +++ b/www/addons/mod/data/lang/de.json @@ -13,6 +13,8 @@ "emptyaddform": "Sie haben keine Einträge vorgenommen!", "entrieslefttoadd": "Sie müssen {{$a.entriesleft}} (weitere) Einträge vornehmen, um diese Aktivität zu beenden.", "entrieslefttoaddtoview": "Sie müssen {{$a.entrieslefttoview}} (weitere) Einträge vornehmen, bevor Sie andere Teilnehmerbeiträge betrachten können.", + "errorapproving": "Fehler beim Freigeben bzw. Ablehnen des Eintrags", + "errordeleting": "Fehler beim Löschen des Eintrags", "errormustsupplyvalue": "Sie müssen hier einen Wert eintragen.", "expired": "Die Aktivität wurde am {{$a}} abgeschlossen und ist nicht weiter verfügbar.", "fields": "Felder", diff --git a/www/addons/mod/data/lang/es-mx.json b/www/addons/mod/data/lang/es-mx.json index dc1cd76ec53..44cb6f922de 100644 --- a/www/addons/mod/data/lang/es-mx.json +++ b/www/addons/mod/data/lang/es-mx.json @@ -13,6 +13,8 @@ "emptyaddform": "¡No ha rellenado ningún campo!", "entrieslefttoadd": "Debe añadir {{$a.entriesleft}} entrada(s) más antes de poder ver las entradas de otro participante.", "entrieslefttoaddtoview": "Debe añadir {{$a.entrieslefttoview}} entrada(s) antes de poder ver las entradas de otros participantes.", + "errorapproving": "Error al aprobar o des_aprobar una entrada.", + "errordeleting": "Error al eliminar la entrada.", "errormustsupplyvalue": "Usted debe proporcionar un valor aquí.", "expired": "Lo sentimos, esta actividad se cerró el {{$a}} y ya no está disponible", "fields": "Campos", diff --git a/www/addons/mod/data/lang/nl.json b/www/addons/mod/data/lang/nl.json index 0b0fd8fdb7b..deb0be88f87 100644 --- a/www/addons/mod/data/lang/nl.json +++ b/www/addons/mod/data/lang/nl.json @@ -13,6 +13,8 @@ "emptyaddform": "Je hebt geen velden ingevuld!", "entrieslefttoadd": "Je moet {{$a.entriesleft}} meer item(s) ingeven voor je de items van anderen kunt zien.", "entrieslefttoaddtoview": "je moet {{$a.entrieslefttoview}} items meer toevoegen voor je de items van anderen kan zien.", + "errorapproving": "Fout bij het goedkeuren of verwerpen van het nieuwe item.", + "errordeleting": "Fout bij het verwijderen van het item.", "errormustsupplyvalue": "Je moet hier een waarde geven.", "expired": "Deze activiteit is gesloten op {{$a}} en is niet langer beschikbaar", "fields": "Velden", diff --git a/www/addons/mod/data/lang/sr-cr.json b/www/addons/mod/data/lang/sr-cr.json index b85aeb9798a..a8ce67ae329 100644 --- a/www/addons/mod/data/lang/sr-cr.json +++ b/www/addons/mod/data/lang/sr-cr.json @@ -13,6 +13,8 @@ "emptyaddform": "Нисте испунили ниједно поље!", "entrieslefttoadd": "Морате да додате још {{$a.entriesleft}} унос(а) како бисте завршили ову активност", "entrieslefttoaddtoview": "Морате да додате још {{$a.entrieslefttoview}} уноса пре него што будете могли да видите уносе других корисника.", + "errorapproving": "Грешка приликом одобравања или неодобравања уноса.", + "errordeleting": "Грешка приликом брисања уноса.", "errormustsupplyvalue": "Морате овде задати вредност.", "expired": "Нажалост, ова активност је затворена {$}} и више није доступна", "fields": "Поља", diff --git a/www/addons/mod/data/lang/sr-lt.json b/www/addons/mod/data/lang/sr-lt.json index 954c9f4bb36..01163f8f244 100644 --- a/www/addons/mod/data/lang/sr-lt.json +++ b/www/addons/mod/data/lang/sr-lt.json @@ -13,6 +13,8 @@ "emptyaddform": "Niste ispunili nijedno polje!", "entrieslefttoadd": "Morate da dodate još {{$a.entriesleft}} unos(a) kako biste završili ovu aktivnost", "entrieslefttoaddtoview": "Morate da dodate još {{$a.entrieslefttoview}} unosa pre nego što budete mogli da vidite unose drugih korisnika.", + "errorapproving": "Greška prilikom odobravanja ili neodobravanja unosa.", + "errordeleting": "Greška prilikom brisanja unosa.", "errormustsupplyvalue": "Morate ovde zadati vrednost.", "expired": "Nažalost, ova aktivnost je zatvorena {$}} i više nije dostupna", "fields": "Polja", diff --git a/www/addons/mod/feedback/lang/de.json b/www/addons/mod/feedback/lang/de.json index 6484534ca06..4bb27721583 100644 --- a/www/addons/mod/feedback/lang/de.json +++ b/www/addons/mod/feedback/lang/de.json @@ -3,7 +3,7 @@ "anonymous": "Anonym", "anonymous_entries": "Anonyme Einträge ({{$a}})", "average": "Mittelwert", - "captchaofflinewarning": "Ein Feedback mit Captcha kann offline nicht beendet werden. Captcha funktioniert nicht, wenn der Server nicht konfiguriert ist oder der Server nicht antwortet.", + "captchaofflinewarning": "Ein Feedback mit Captcha kann nicht offline beendet werden. Captcha funktioniert nur, wenn der Server antwortet.", "complete_the_form": "Formular ausfüllen...", "completed_feedbacks": "Ausgefüllte Feedbacks", "continue_the_form": "Beantwortung der Fragen fortsetzen ...", diff --git a/www/addons/mod/feedback/lang/es-mx.json b/www/addons/mod/feedback/lang/es-mx.json index b09def04c16..48c0b709868 100644 --- a/www/addons/mod/feedback/lang/es-mx.json +++ b/www/addons/mod/feedback/lang/es-mx.json @@ -3,7 +3,7 @@ "anonymous": "Anónima", "anonymous_entries": "Respuestas anónimas ({{$a}})", "average": "Promedio", - "captchaofflinewarning": "La retroalimentación con captcha no puede ser completada si no está configurada, si está en modo fuera-de-línea o con el servidor tirado.", + "captchaofflinewarning": "La retroalimentación con captcha no puede ser completada fuera-de-línea, o si no está configurada, o con el servidor tirado.", "complete_the_form": "Responda a las preguntas...", "completed_feedbacks": "Respuestas enviadas", "continue_the_form": "Continuar contestando las preguntas...", diff --git a/www/addons/mod/feedback/lang/nl.json b/www/addons/mod/feedback/lang/nl.json index 32c689ca443..46203a58213 100644 --- a/www/addons/mod/feedback/lang/nl.json +++ b/www/addons/mod/feedback/lang/nl.json @@ -3,7 +3,7 @@ "anonymous": "Anoniem", "anonymous_entries": "Anoniem ingevulde formulieren ({{$a}})", "average": "Gemiddelde", - "captchaofflinewarning": "Feedback met captcha kan niet voltooid worden als dat niet geconfigureerd is, in offline modus of wanneer de server onbereikbaar is.", + "captchaofflinewarning": "Feedback met captcha kan niet offline voltooid worden of wanneer dat niet geconfigureerd is of wanneer de server onbereikbaar is.", "complete_the_form": "Beantwoord de vragen...", "completed_feedbacks": "Ingevulde antwoorden", "continue_the_form": "Ga verder met het beantwoorden van de vragen...", diff --git a/www/addons/mod/folder/lang/ca.json b/www/addons/mod/folder/lang/ca.json index 2208f493a4b..b2f87d440ac 100644 --- a/www/addons/mod/folder/lang/ca.json +++ b/www/addons/mod/folder/lang/ca.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "No hi ha fitxers per mostrar", + "emptyfilelist": "No hi ha fitxers per mostrar.", "errorwhilegettingfolder": "S'ha produït un error en recuperar les dades de la carpeta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/es-mx.json b/www/addons/mod/folder/lang/es-mx.json index e2f470725df..5b9563d5c0d 100644 --- a/www/addons/mod/folder/lang/es-mx.json +++ b/www/addons/mod/folder/lang/es-mx.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "No hay archivos que mostrar", + "emptyfilelist": "No hay archivos para mostrar.", "errorwhilegettingfolder": "Error al obtener datos de carpeta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/lt.json b/www/addons/mod/folder/lang/lt.json index a80a862764e..e174a7c5a50 100644 --- a/www/addons/mod/folder/lang/lt.json +++ b/www/addons/mod/folder/lang/lt.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Nėra rodytinų failų", + "emptyfilelist": "Nėra ką rodyti.", "errorwhilegettingfolder": "Klaida gaunant duomenis iš aplanko." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/pt.json b/www/addons/mod/folder/lang/pt.json index 74865d321a4..d197c86f233 100644 --- a/www/addons/mod/folder/lang/pt.json +++ b/www/addons/mod/folder/lang/pt.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "Este repositório está vazio", + "emptyfilelist": "Não há ficheiros para mostrar.", "errorwhilegettingfolder": "Erro ao obter os dados da pasta." } \ No newline at end of file diff --git a/www/addons/mod/folder/lang/zh-tw.json b/www/addons/mod/folder/lang/zh-tw.json index d7ff3cf3a76..5300a974982 100644 --- a/www/addons/mod/folder/lang/zh-tw.json +++ b/www/addons/mod/folder/lang/zh-tw.json @@ -1,4 +1,4 @@ { - "emptyfilelist": "沒有可以顯示的檔案", + "emptyfilelist": "沒有檔案可以顯示", "errorwhilegettingfolder": "當讀取資料夾資料時發生錯誤" } \ No newline at end of file diff --git a/www/addons/mod/forum/lang/zh-tw.json b/www/addons/mod/forum/lang/zh-tw.json index 81db9790069..6a91914a48c 100644 --- a/www/addons/mod/forum/lang/zh-tw.json +++ b/www/addons/mod/forum/lang/zh-tw.json @@ -14,7 +14,7 @@ "errorgetforum": "讀取討論區資料發生錯誤", "errorgetgroups": "讀取群組設定發生錯誤", "forumnodiscussionsyet": "這個討論區還沒有討論主題", - "group": "分組", + "group": "群組", "message": "訊息", "modeflatnewestfirst": "以平舖方式呈現回應的貼文,最晚貼出的在前", "modeflatoldestfirst": "以平舖方式呈現回應的貼文,最早貼出的在前", diff --git a/www/addons/mod/glossary/lang/ca.json b/www/addons/mod/glossary/lang/ca.json index 2351376a71d..f5a0cfc5ded 100644 --- a/www/addons/mod/glossary/lang/ca.json +++ b/www/addons/mod/glossary/lang/ca.json @@ -1,6 +1,6 @@ { "attachment": "Adjunta la insígnia al missatge", - "browsemode": "Mode exploració", + "browsemode": "Navegueu per les entrades", "byalphabet": "Alfabèticament", "byauthor": "Agrupat per autor", "bycategory": "Agrupa per categoria", diff --git a/www/addons/mod/glossary/lang/es-mx.json b/www/addons/mod/glossary/lang/es-mx.json index f8b36fd05f5..8cb29128da9 100644 --- a/www/addons/mod/glossary/lang/es-mx.json +++ b/www/addons/mod/glossary/lang/es-mx.json @@ -1,6 +1,6 @@ { "attachment": "Anexar insignia al mensaje", - "browsemode": "Modo de presentación preliminar", + "browsemode": "Ver entradas", "byalphabet": "Alfabéticamente", "byauthor": "Agrupar por autor", "bycategory": "Agrupar por categoría", diff --git a/www/addons/mod/glossary/lang/lt.json b/www/addons/mod/glossary/lang/lt.json index 23f3f7fe92b..016538035b9 100644 --- a/www/addons/mod/glossary/lang/lt.json +++ b/www/addons/mod/glossary/lang/lt.json @@ -1,6 +1,6 @@ { "attachment": "Priedas", - "browsemode": "Peržiūros režimas", + "browsemode": "Peržiūrėti įrašus", "byalphabet": "Abėcėlės tvarka", "byauthor": "Pagal autorių", "bynewestfirst": "Naujausi", diff --git a/www/addons/mod/glossary/lang/pt.json b/www/addons/mod/glossary/lang/pt.json index c672ec0b9a3..6887c9ff44c 100644 --- a/www/addons/mod/glossary/lang/pt.json +++ b/www/addons/mod/glossary/lang/pt.json @@ -1,6 +1,6 @@ { "attachment": "Anexo", - "browsemode": "Modo de pré-visualização", + "browsemode": "Ver entradas", "byalphabet": "Alfabeticamente", "byauthor": "Agrupar por autor", "bycategory": "Agrupar por categoria", diff --git a/www/addons/mod/glossary/lang/zh-tw.json b/www/addons/mod/glossary/lang/zh-tw.json index b7204b9d753..8c24d72719a 100644 --- a/www/addons/mod/glossary/lang/zh-tw.json +++ b/www/addons/mod/glossary/lang/zh-tw.json @@ -1,6 +1,6 @@ { "attachment": "附件", - "browsemode": "預覽模式", + "browsemode": "瀏覽條目", "byalphabet": "按字母順序排列", "byauthor": "以作者為分群", "bynewestfirst": "最新的優先", diff --git a/www/addons/mod/label/lang/lt.json b/www/addons/mod/label/lang/lt.json index 8aba433e8cd..f9a1ca059d8 100644 --- a/www/addons/mod/label/lang/lt.json +++ b/www/addons/mod/label/lang/lt.json @@ -1,3 +1,3 @@ { - "label": "Žyma" + "label": "Etiketė" } \ No newline at end of file diff --git a/www/addons/mod/lesson/lang/de.json b/www/addons/mod/lesson/lang/de.json index f3f317f9c91..dd4695db26b 100644 --- a/www/addons/mod/lesson/lang/de.json +++ b/www/addons/mod/lesson/lang/de.json @@ -22,6 +22,7 @@ "emptypassword": "Das Kennwort muss eingegeben werden", "enterpassword": "Bitte geben Sie das Kennwort ein:", "eolstudentoutoftimenoanswers": "Sie haben keine Fragen beantwortet. Sie erhalten daher 0 Punkte für die Lektion.", + "errorprefetchrandombranch": "Diese Lektion enthält einen Sprung zu einer zufälligen Seite. Sie kann nicht in der App versucht werden, ohne im Web begonnen zu sein.", "errorreviewretakenotlast": "Dieser Versuch kann nicht erneut angesehen werden, weil ein weiterer Versuch beendet wurde.", "finish": "Fertigstellen", "finishretakeoffline": "Dieser Versuch wurde offline beendet.", diff --git a/www/addons/mod/lesson/lang/es-mx.json b/www/addons/mod/lesson/lang/es-mx.json index 073ea430c66..b45c0a2544c 100644 --- a/www/addons/mod/lesson/lang/es-mx.json +++ b/www/addons/mod/lesson/lang/es-mx.json @@ -22,9 +22,10 @@ "emptypassword": "La contraseña no puede estar vacía", "enterpassword": "Por favor, escriba la contraseña:", "eolstudentoutoftimenoanswers": "No ha contestado a ninguna pregunta. En esta lección ha obtenido 0 puntos.", - "errorreviewretakenotlast": "Este intento no puede ser revisado más porque se ha terminado otro intento.", + "errorprefetchrandombranch": "Esta lección contiene un salto hacia una página aleatoria de contenido; no puede ser intentada en la App hasta que haya sido comenzada en web.", + "errorreviewretakenotlast": "Este intento ya no puede ser revisado más porque se ha terminado otro intento.", "finish": "Terminar", - "finishretakeoffline": "Este intento se ha terminado en fuera-de-línea.", + "finishretakeoffline": "Este intento fue terminado fuera-de-línea.", "firstwrong": "Lo sentimos, usted ha contestado incorrectamente. ¡Le gustaría volver a intentar la pregunta de nuevo? (si Usted contesta ahora la pregunta correctamente, no contará hacia su puntaje final).", "gotoendoflesson": "Ir al final de lección", "grade": "Calificación", @@ -75,7 +76,7 @@ "timeremaining": "Tiempo restante", "timetaken": "Tiempo empleado", "unseenpageinbranch": "Pregunta no vista dentro de una página de conenidos", - "warningretakefinished": "Este intento fue terminado en el sitio.", + "warningretakefinished": "Este intento fue terminado en el sitio web.", "welldone": "¡Bien hecho!", "youhaveseen": "Usted ya ha visto más de una página de esta lección.
    ¿Desea comenzar desde la última página vista?", "youranswer": "Su respuesta", diff --git a/www/addons/mod/lesson/lang/nl.json b/www/addons/mod/lesson/lang/nl.json index 9d533a812b8..1dfe7b3bc47 100644 --- a/www/addons/mod/lesson/lang/nl.json +++ b/www/addons/mod/lesson/lang/nl.json @@ -22,9 +22,10 @@ "emptypassword": "Wachtwoord kan niet leeg zijn", "enterpassword": "Geef het wachtwoord:", "eolstudentoutoftimenoanswers": "Je hebt geen enkele vraag beantwoord. Je hebt een 0 voor deze les", + "errorprefetchrandombranch": "Deze les bevat een sprong naar een willekeurige inhoudspagina. De les kan niet gestart worden in de app zonder dat die gestart is op het web.", "errorreviewretakenotlast": "Deze poging kan niet meer nagekeken worden omdat er al een andere poging voltooid is.", "finish": "Einde", - "finishretakeoffline": "Deze poging is voltooid in offline modus", + "finishretakeoffline": "Deze poging is voltooid in offline modus.", "firstwrong": "Je antwoord is fout. Wil je de vraag opnieuw proberen te beantwoorden? Als je het antwoord weet, zul je er geen punten meer mee verdienen.", "gotoendoflesson": "Ga naar het einde van de les", "grade": "Cijfer", diff --git a/www/addons/mod/lesson/lang/sr-cr.json b/www/addons/mod/lesson/lang/sr-cr.json index fe5901ac751..a09a8dc2437 100644 --- a/www/addons/mod/lesson/lang/sr-cr.json +++ b/www/addons/mod/lesson/lang/sr-cr.json @@ -22,6 +22,7 @@ "emptypassword": "Поље за лозинку не може бити празно", "enterpassword": "Молимо унесите лозинку:", "eolstudentoutoftimenoanswers": "Нисте одговорили ни на једно питање. Ваша оцена за ову лекцију је 0.", + "errorprefetchrandombranch": "Ова лекција садржи прелаз на наусимично одабрану страницу са садржајем, па је није могуће урадити у апликацији док се не покрене на веб сајту.", "errorreviewretakenotlast": "Ова покушај не може више бити прегледан зато што је завршен други покушај.", "finish": "Заврши", "finishretakeoffline": "Овај покушај је завршен у офлајн режиму.", @@ -75,7 +76,7 @@ "timeremaining": "Преостало време", "timetaken": "Потрошено време", "unseenpageinbranch": "Још неприказано питање унутар стране са садржајем и гранањем", - "warningretakefinished": "Покушај је завршен на сајту.", + "warningretakefinished": "Покушај је завршен на веб сајту.", "welldone": "Браво!", "youhaveseen": "Већ сте видели више од једне странице ове лекције.
    Желите ли почети од последње странице коју сте видели?", "youranswer": "Ваш одговор", diff --git a/www/addons/mod/lesson/lang/sr-lt.json b/www/addons/mod/lesson/lang/sr-lt.json index 03505574aa4..a98cc2242e1 100644 --- a/www/addons/mod/lesson/lang/sr-lt.json +++ b/www/addons/mod/lesson/lang/sr-lt.json @@ -22,6 +22,7 @@ "emptypassword": "Polje za lozinku ne može biti prazno", "enterpassword": "Molimo unesite lozinku:", "eolstudentoutoftimenoanswers": "Niste odgovorili ni na jedno pitanje. Vaša ocena za ovu lekciju je 0.", + "errorprefetchrandombranch": "Ova lekcija sadrži prelaz na nausimično odabranu stranicu sa sadržajem, pa je nije moguće uraditi u aplikaciji dok se ne pokrene na veb sajtu.", "errorreviewretakenotlast": "Ova pokušaj ne može više biti pregledan zato što je završen drugi pokušaj.", "finish": "Završi", "finishretakeoffline": "Ovaj pokušaj je završen u oflajn režimu.", @@ -75,7 +76,7 @@ "timeremaining": "Preostalo vreme", "timetaken": "Potrošeno vreme", "unseenpageinbranch": "Još neprikazano pitanje unutar strane sa sadržajem i grananjem", - "warningretakefinished": "Pokušaj je završen na sajtu.", + "warningretakefinished": "Pokušaj je završen na veb sajtu.", "welldone": "Bravo!", "youhaveseen": "Već ste videli više od jedne stranice ove lekcije.
    Želite li početi od poslednje stranice koju ste videli?", "youranswer": "Vaš odgovor", diff --git a/www/addons/mod/survey/lang/zh-tw.json b/www/addons/mod/survey/lang/zh-tw.json index 924e0d4c800..e6ad7be4230 100644 --- a/www/addons/mod/survey/lang/zh-tw.json +++ b/www/addons/mod/survey/lang/zh-tw.json @@ -4,6 +4,6 @@ "ifoundthat": "我發現", "ipreferthat": "我希望的是", "responses": "回應", - "results": "票選結果", + "results": "結果", "surveycompletednograph": "你已經完成這一份問卷。" } \ No newline at end of file diff --git a/www/addons/mod/wiki/lang/ca.json b/www/addons/mod/wiki/lang/ca.json index fb0c7bfab1e..b827bb47066 100644 --- a/www/addons/mod/wiki/lang/ca.json +++ b/www/addons/mod/wiki/lang/ca.json @@ -10,7 +10,7 @@ "newpagetitle": "Títol de la pàgina nova", "nocontent": "No hi ha contingut per a aquesta pàgina", "notingroup": "No en grup", - "page": "Pàgina: {{$a}}", + "page": "Pàgina", "pageexists": "Aquesta pàgina ja existeix.", "pagename": "Nom de la pàgina", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/es-mx.json b/www/addons/mod/wiki/lang/es-mx.json index 5a53592ed79..cbd65b371f9 100644 --- a/www/addons/mod/wiki/lang/es-mx.json +++ b/www/addons/mod/wiki/lang/es-mx.json @@ -10,7 +10,7 @@ "newpagetitle": "Título nuevo de la página", "nocontent": "No hay contenido para esta página", "notingroup": "No está en un grupo", - "page": "Página: {{$a}}", + "page": "Página", "pageexists": "Esta página ya existe.", "pagename": "Nombre de página", "subwiki": "Sub-wiki", diff --git a/www/addons/mod/wiki/lang/lt.json b/www/addons/mod/wiki/lang/lt.json index 7523e9211c2..52f7834015f 100644 --- a/www/addons/mod/wiki/lang/lt.json +++ b/www/addons/mod/wiki/lang/lt.json @@ -10,7 +10,7 @@ "newpagetitle": "Naujo puslapio pavadinimas", "nocontent": "Nėra šio puslapio turinio", "notingroup": "Nėra grupėje", - "page": "Puslapis: {{$a}}", + "page": "Puslapis", "pageexists": "Šis puslapis jau yra.", "pagename": "Puslapio pavadinimas", "subwiki": "Subwiki", diff --git a/www/addons/mod/wiki/lang/pt.json b/www/addons/mod/wiki/lang/pt.json index 21749d0a238..83154bc5718 100644 --- a/www/addons/mod/wiki/lang/pt.json +++ b/www/addons/mod/wiki/lang/pt.json @@ -10,7 +10,7 @@ "newpagetitle": "Novo título da página", "nocontent": "Não há nenhum conteúdo nesta página", "notingroup": "Não está em nenhum grupo", - "page": "Página: {{$a}}", + "page": "Página", "pageexists": "Esta página já existe.", "pagename": "Nome da página", "subwiki": "SubWiki", diff --git a/www/addons/mod/wiki/lang/tr.json b/www/addons/mod/wiki/lang/tr.json index f1167632e26..8ddfdfd95b3 100644 --- a/www/addons/mod/wiki/lang/tr.json +++ b/www/addons/mod/wiki/lang/tr.json @@ -7,7 +7,7 @@ "newpagetitle": "Yeni sayfa başlığı", "nocontent": "Bu sayfa için içerik yok", "notingroup": "Grupta değil", - "page": "Sayfa: {{$a}}", + "page": "Sayfa", "pageexists": "Bu sayfa zaten var.", "pagename": "Sayfa adı", "wrongversionlock": "Başka bir kullanıcı sizin düzenlemeniz sırasında bu sayfayı düzenledi ve içeriğiniz geçersiz." diff --git a/www/addons/mod/wiki/lang/zh-tw.json b/www/addons/mod/wiki/lang/zh-tw.json index 30fd50ff0d8..14abc591524 100644 --- a/www/addons/mod/wiki/lang/zh-tw.json +++ b/www/addons/mod/wiki/lang/zh-tw.json @@ -10,7 +10,7 @@ "newpagetitle": "新頁面標題", "nocontent": "在這一頁裡沒有內容", "notingroup": "不在群體", - "page": "頁", + "page": "分頁", "pageexists": "這頁面已經存在。", "pagename": "頁面名稱", "subwiki": "Subwiki", diff --git a/www/addons/notes/lang/ca.json b/www/addons/notes/lang/ca.json index 9367384a78e..1c044e61b29 100644 --- a/www/addons/notes/lang/ca.json +++ b/www/addons/notes/lang/ca.json @@ -4,7 +4,7 @@ "eventnotecreated": "S'ha creat la nota", "nonotes": "Encara no hi ha notes d'aquest tipus", "note": "Anotació", - "notes": "El teu anàlisi privat i les teves notes", + "notes": "Anotacions", "personalnotes": "Anotacions personals", "publishstate": "Context", "sitenotes": "Anotacions del lloc", diff --git a/www/addons/notes/lang/es-mx.json b/www/addons/notes/lang/es-mx.json index 1c91ea47373..aabd17d948f 100644 --- a/www/addons/notes/lang/es-mx.json +++ b/www/addons/notes/lang/es-mx.json @@ -4,7 +4,7 @@ "eventnotecreated": "Nota creada", "nonotes": "Todavía no hay notas de este tipo todavía", "note": "Nota", - "notes": "Su análisis privado y sus notas", + "notes": "Notas", "personalnotes": "Notas personales", "publishstate": "Contexto", "sitenotes": "Notas del sitio", diff --git a/www/addons/notes/lang/lt.json b/www/addons/notes/lang/lt.json index e9213ee0c0e..ac321d27d1b 100644 --- a/www/addons/notes/lang/lt.json +++ b/www/addons/notes/lang/lt.json @@ -4,7 +4,7 @@ "eventnotecreated": "Užrašas sukurtas", "nonotes": "Nėra jokių šios temos užrašų", "note": "Užrašas", - "notes": "Pastabos", + "notes": "Užrašai", "personalnotes": "Asmeniniai užrašai", "publishstate": "Teksto ištrauka", "sitenotes": "Svetainės užrašai", diff --git a/www/addons/notes/lang/pt.json b/www/addons/notes/lang/pt.json index 5763cbe46e1..28e62fa379b 100644 --- a/www/addons/notes/lang/pt.json +++ b/www/addons/notes/lang/pt.json @@ -4,7 +4,7 @@ "eventnotecreated": "Anotação criada", "nonotes": "Ainda não existem anotações deste tipo", "note": "Anotação", - "notes": "Análise privada e anotações", + "notes": "Anotações", "personalnotes": "Anotações pessoais", "publishstate": "Contexto", "sitenotes": "Anotações do site", diff --git a/www/addons/notes/lang/zh-tw.json b/www/addons/notes/lang/zh-tw.json index 2f1fd0f1429..6671dca17e8 100644 --- a/www/addons/notes/lang/zh-tw.json +++ b/www/addons/notes/lang/zh-tw.json @@ -4,7 +4,7 @@ "eventnotecreated": "註記已被建立", "nonotes": "還沒有這種類型的註記", "note": "註記", - "notes": "您個人的分析和筆記", + "notes": "註記", "personalnotes": "個人註記", "publishstate": "上下文", "sitenotes": "網站註記", diff --git a/www/addons/notifications/lang/ca.json b/www/addons/notifications/lang/ca.json index 077c0e53ffd..324cd60ecdb 100644 --- a/www/addons/notifications/lang/ca.json +++ b/www/addons/notifications/lang/ca.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "S'ha produït un error carregant les notificacions", - "notificationpreferences": "Preferències de les notificacions", + "notificationpreferences": "Preferències de notificació", "notifications": "Notificacions", "playsound": "Reprodueix el so", "therearentnotificationsyet": "No hi ha notificacions" diff --git a/www/addons/notifications/lang/es-mx.json b/www/addons/notifications/lang/es-mx.json index 1049b40c7a5..238d8cfaa15 100644 --- a/www/addons/notifications/lang/es-mx.json +++ b/www/addons/notifications/lang/es-mx.json @@ -1,7 +1,7 @@ { "errorgetnotifications": "Error al obtener notificaciones", "notificationpreferences": "Preferencias de notificación", - "notifications": "Avisos", + "notifications": "Notificaciones", "playsound": "Reproducir sonido", "therearentnotificationsyet": "No hay notificaciones" } \ No newline at end of file diff --git a/www/addons/notifications/lang/lt.json b/www/addons/notifications/lang/lt.json index 9487770171a..965ea666726 100644 --- a/www/addons/notifications/lang/lt.json +++ b/www/addons/notifications/lang/lt.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "Klaida gaunant pranešimus", - "notificationpreferences": "Pranešimų nuostatos", + "notificationpreferences": "Pranešimų nustatymai", "notifications": "Pranešimai", "therearentnotificationsyet": "Nėra jokių pranešimų" } \ No newline at end of file diff --git a/www/addons/notifications/lang/zh-cn.json b/www/addons/notifications/lang/zh-cn.json index 3afb489f861..7d236d7f15d 100644 --- a/www/addons/notifications/lang/zh-cn.json +++ b/www/addons/notifications/lang/zh-cn.json @@ -1,4 +1,4 @@ { - "notifications": "通告", + "notifications": "通知", "therearentnotificationsyet": "没有通知" } \ No newline at end of file diff --git a/www/addons/notifications/lang/zh-tw.json b/www/addons/notifications/lang/zh-tw.json index 92e6514797c..f885ca29ff4 100644 --- a/www/addons/notifications/lang/zh-tw.json +++ b/www/addons/notifications/lang/zh-tw.json @@ -1,6 +1,6 @@ { "errorgetnotifications": "取得通知資料發生錯誤", - "notificationpreferences": "通知的偏好", + "notificationpreferences": "通知偏好設定", "notifications": "通知", "therearentnotificationsyet": "沒有通知訊息" } \ No newline at end of file diff --git a/www/addons/participants/lang/ca.json b/www/addons/participants/lang/ca.json index 8fd771b0c76..3c6638a3af7 100644 --- a/www/addons/participants/lang/ca.json +++ b/www/addons/participants/lang/ca.json @@ -1,4 +1,4 @@ { - "noparticipants": "No s'ha trobat cap participant en aquest curs", + "noparticipants": "No s'han trobat participants per aquest curs", "participants": "Participants" } \ No newline at end of file diff --git a/www/addons/participants/lang/cs.json b/www/addons/participants/lang/cs.json new file mode 100644 index 00000000000..2092b03a730 --- /dev/null +++ b/www/addons/participants/lang/cs.json @@ -0,0 +1,4 @@ +{ + "noparticipants": "Pro tento kurz nenalezeni účastníci", + "participants": "Účastníci" +} \ No newline at end of file diff --git a/www/addons/participants/lang/es-mx.json b/www/addons/participants/lang/es-mx.json index 62113ad2ef9..56f80358ad5 100644 --- a/www/addons/participants/lang/es-mx.json +++ b/www/addons/participants/lang/es-mx.json @@ -1,4 +1,4 @@ { - "noparticipants": "No se encontraron participantes en este curso", + "noparticipants": "No se encontraron participantes para este curso", "participants": "Participantes" } \ No newline at end of file diff --git a/www/addons/participants/lang/it.json b/www/addons/participants/lang/it.json new file mode 100644 index 00000000000..0d16202be57 --- /dev/null +++ b/www/addons/participants/lang/it.json @@ -0,0 +1,4 @@ +{ + "noparticipants": "In questo corso non sono stati trovati partecipanti", + "participants": "Partecipanti" +} \ No newline at end of file diff --git a/www/addons/participants/lang/lt.json b/www/addons/participants/lang/lt.json index 714a8ffda94..b675a2848f1 100644 --- a/www/addons/participants/lang/lt.json +++ b/www/addons/participants/lang/lt.json @@ -1,4 +1,4 @@ { - "noparticipants": "Nerasta šių kursų dalyvių", + "noparticipants": "Dalyvaujančių šiuose kursuose nėra", "participants": "Dalyviai" } \ No newline at end of file diff --git a/www/addons/participants/lang/pt.json b/www/addons/participants/lang/pt.json index 5fa07c6b1a2..e7a2e39536f 100644 --- a/www/addons/participants/lang/pt.json +++ b/www/addons/participants/lang/pt.json @@ -1,4 +1,4 @@ { - "noparticipants": "Não foram encontrados participantes para esta disciplina", - "participants": "Utilizadores" + "noparticipants": "Nenhum participante encontrado nesta disciplina", + "participants": "Participantes" } \ No newline at end of file diff --git a/www/addons/participants/lang/tr.json b/www/addons/participants/lang/tr.json index 9532bf04f39..05e3c834e4a 100644 --- a/www/addons/participants/lang/tr.json +++ b/www/addons/participants/lang/tr.json @@ -1,4 +1,4 @@ { - "noparticipants": "Bu ders için hiç katılımcı bulunamadı", + "noparticipants": "Bu derste hiç katılımcı bulunamadı", "participants": "Katılımcılar" } \ No newline at end of file diff --git a/www/addons/participants/lang/zh-cn.json b/www/addons/participants/lang/zh-cn.json index 8c621b3fa17..f2ce4c8e36a 100644 --- a/www/addons/participants/lang/zh-cn.json +++ b/www/addons/participants/lang/zh-cn.json @@ -1,4 +1,4 @@ { "noparticipants": "未找到此项课程的参与者", - "participants": "成员" + "participants": "课程参与者" } \ No newline at end of file diff --git a/www/addons/participants/lang/zh-tw.json b/www/addons/participants/lang/zh-tw.json index 69584ab153f..f2aba39a343 100644 --- a/www/addons/participants/lang/zh-tw.json +++ b/www/addons/participants/lang/zh-tw.json @@ -1,4 +1,4 @@ { - "noparticipants": "這一課程找不到參與者", - "participants": "成員" + "noparticipants": "這個課程沒有參與者", + "participants": "參與者" } \ No newline at end of file diff --git a/www/core/components/course/lang/ca.json b/www/core/components/course/lang/ca.json index fb53f90a1eb..4d5f44fc1cc 100644 --- a/www/core/components/course/lang/ca.json +++ b/www/core/components/course/lang/ca.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Ocult per a l'estudiantat", "nocontentavailable": "No hi ha contingut disponible en aquest moment.", "overriddennotice": "La vostra qualificació final en aquesta activitat s'ha modificat manualment.", - "showall": "Mostra'ls tots ({{$a}})", + "showall": "Mostra-ho tot", "useactivityonbrowser": "Tot i així, podeu fer-la servir al navegador del dispositiu." } \ No newline at end of file diff --git a/www/core/components/course/lang/es-mx.json b/www/core/components/course/lang/es-mx.json index 225893e56e3..1745ce4e20a 100644 --- a/www/core/components/course/lang/es-mx.json +++ b/www/core/components/course/lang/es-mx.json @@ -9,7 +9,7 @@ "confirmdownload": "Usted está a punto de descargar {{size}}. ¿Está Usted seguro de querer continuar?", "confirmdownloadunknownsize": "No pudimos calcular el tamaño de la descarga. ¿Está Usted seguro de querer descargarla?", "confirmpartialdownloadsize": "Usted está a punto de descargar al menos {{size}}. ¿Está Usted seguro de querer continuar?", - "contents": "Contenido", + "contents": "Contenidos", "couldnotloadsectioncontent": "No pudo cargarse el contenido de la sección; por favor inténtelo nuevamente después.", "couldnotloadsections": "No pudieron cargarse las secciones; por favor inténtelo nuevamente después.", "errordownloadingsection": "Error al descargar sección", @@ -17,6 +17,6 @@ "hiddenfromstudents": "Oculto de estudiantes", "nocontentavailable": "Sin contenido disponible al momento.", "overriddennotice": "La calificación final de esta actividad ha sido ajustada manualmente.", - "showall": "Mostrar {{$a}}", + "showall": "Mostrar todo", "useactivityonbrowser": "Usted todavía puede usarla si usa su navegador del dispositivo." } \ No newline at end of file diff --git a/www/core/components/course/lang/lt.json b/www/core/components/course/lang/lt.json index 39c1c02b24e..d348b5e7c7f 100644 --- a/www/core/components/course/lang/lt.json +++ b/www/core/components/course/lang/lt.json @@ -8,7 +8,7 @@ "confirmdownload": "Norite atsisiųsti {{size}}. Ar norite tęsti?", "confirmdownloadunknownsize": "Negalima apskaičiuoti failo, kurį norite atsisiųsti, dydžio. Ar tikrai norite atsisiųsti?", "confirmpartialdownloadsize": "Norite atsisiųsti mažiausiai {{size}}. Ar tikrai norite tęsti?", - "contents": "Turinys", + "contents": "Turiniai", "couldnotloadsectioncontent": "Negalima užkrauti pasirinkto turinio, prašome pamėginti vėliau.", "couldnotloadsections": "Negalima užkrauti pasirinkto turinio, prašome pamėginti vėliau.", "errordownloadingsection": "Klaida atsisiunčiant.", @@ -16,6 +16,6 @@ "hiddenfromstudents": "Paslėpta nuo besimokančiųjų", "nocontentavailable": "Turinys šiuo metu nepasiekiamas.", "overriddennotice": "Šios veiklos galutinis įvertis buvo koreguotas rankiniu būdu.", - "showall": "Rodyti visus {{$a}}", + "showall": "Rodyti visus", "useactivityonbrowser": "Galite naudoti savo naršyklėje." } \ No newline at end of file diff --git a/www/core/components/course/lang/pt.json b/www/core/components/course/lang/pt.json index 8ba4d0a7688..7ac9f081fbd 100644 --- a/www/core/components/course/lang/pt.json +++ b/www/core/components/course/lang/pt.json @@ -17,6 +17,6 @@ "hiddenfromstudents": "Oculto para os alunos", "nocontentavailable": "Nenhum conteúdo disponível neste momento.", "overriddennotice": "A sua nota final nesta atividade foi alterada manualmente na pauta.", - "showall": "Mostrar tudo {{$a}}", + "showall": "Mostrar todos", "useactivityonbrowser": "Ainda pode usá-lo se utilizar o navegador dos seus dispositivos." } \ No newline at end of file diff --git a/www/core/components/course/lang/tr.json b/www/core/components/course/lang/tr.json index f3d9b003fd5..027484a1cc3 100644 --- a/www/core/components/course/lang/tr.json +++ b/www/core/components/course/lang/tr.json @@ -1,7 +1,7 @@ { "allsections": "Tüm Bölümler", - "contents": "İçerik", + "contents": "İçerik(ler)", "hiddenfromstudents": "Öğrencilerden gizli", "overriddennotice": "Bu etkinlikteki final notunuz, elle ayarlandı.", - "showall": "Tümünü göster: {{$a}}" + "showall": "Tümünü göster" } \ No newline at end of file diff --git a/www/core/components/course/lang/zh-cn.json b/www/core/components/course/lang/zh-cn.json index 5a50033ab9f..c60b61bdc0b 100644 --- a/www/core/components/course/lang/zh-cn.json +++ b/www/core/components/course/lang/zh-cn.json @@ -2,5 +2,5 @@ "contents": "内容", "hiddenfromstudents": "对学生隐藏", "overriddennotice": "您在该活动中的最终成绩将自动调整。", - "showall": "显示所有({{$a}})" + "showall": "全部显示" } \ No newline at end of file diff --git a/www/core/components/course/lang/zh-tw.json b/www/core/components/course/lang/zh-tw.json index 10ecfebf0bf..c9c97c2ef45 100644 --- a/www/core/components/course/lang/zh-tw.json +++ b/www/core/components/course/lang/zh-tw.json @@ -8,7 +8,7 @@ "confirmdownload": "您即將下載{{size}}. 您確定您要繼續嗎?", "confirmdownloadunknownsize": "我們無法計算下載的容量. 您確定要下載嗎?", "confirmpartialdownloadsize": "您即將下載至少 {{size}}. 您確定您要繼續嗎?", - "contents": "目錄", + "contents": "內容", "couldnotloadsectioncontent": "無法載入區塊內容, 請稍後再試.", "couldnotloadsections": "無法載入區塊, 請稍後再試.", "errordownloadingsection": "載入區塊時發生錯誤", @@ -16,6 +16,6 @@ "hiddenfromstudents": "對學生隱藏", "nocontentavailable": "目前無內容可使用", "overriddennotice": "您在這活動的最後成績是手動調整的。", - "showall": "顯示全部{{$a}}", + "showall": "顯示全部", "useactivityonbrowser": "你可以以瀏覽器一直使用" } \ No newline at end of file diff --git a/www/core/components/courses/lang/ca.json b/www/core/components/courses/lang/ca.json index 739d5c8e7fd..20ba97b397c 100644 --- a/www/core/components/courses/lang/ca.json +++ b/www/core/components/courses/lang/ca.json @@ -13,12 +13,12 @@ "filtermycourses": "Filtrar els meus cursos", "frontpage": "Pàgina principal", "mycourses": "Els meus cursos", - "nocourses": "No hi ha informació de cursos per mostrar.", + "nocourses": "No hi ha informació del curs per mostrar.", "nocoursesyet": "No hi ha cursos en aquesta categoria", - "nosearchresults": "La cerca no ha obtingut resultats", + "nosearchresults": "No hi ha resultats per la vostra cerca", "notenroled": "No us heu inscrit en aquest curs", "notenrollable": "No podeu autoinscriure-us en aquest curs.", - "password": "Contrasenya", + "password": "Clau d'inscripció", "search": "Cerca...", "searchcourses": "Cerca cursos", "searchcoursesadvice": "Podeu fer servir el botó de cercar cursos per accedir als cursos com a convidat o autoinscriure-us en cursos que ho permetin.", diff --git a/www/core/components/courses/lang/es-mx.json b/www/core/components/courses/lang/es-mx.json index ff09fef87cc..f01124ceca1 100644 --- a/www/core/components/courses/lang/es-mx.json +++ b/www/core/components/courses/lang/es-mx.json @@ -13,12 +13,12 @@ "filtermycourses": "<<Hemos enviado un correo electrónico a {{$a}}

    \n

    En él encontrará instrucciones sencillas para concluir el proceso.

    \n

    Si tuviera alguna dificultad, contacte con el Administrador del Sistema.

    ", + "emailconfirmsent": "

    Debería de haberse enviado un Email a su dirección en {{$a}}

    El Email contiene instrucciones sencillas para completar su registro.

    Si continúa teniendo dificultades, contacte al administrador del sitio.

    ", "emailnotmatch": "No coinciden los Emails", "enterthewordsabove": "Escriba las palabras de arriba", "erroraccesscontrolalloworigin": "La llamada de Orígen Cruzado (''Cross-Origin'') que Usted está tratando de realizar ha sido rechazada. Por favor revise https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/lt.json b/www/core/components/login/lang/lt.json index d591b88110a..f1c04c57d49 100644 --- a/www/core/components/login/lang/lt.json +++ b/www/core/components/login/lang/lt.json @@ -4,14 +4,14 @@ "cancel": "Atšaukti", "checksiteversion": "Patikrintkite, ar svetainė naudoja Moodle 2.4. arba vėlesnę versiją.", "confirmdeletesite": "Ar tikrai norite ištrinti svetainę {{sitename}}?", - "connect": "Prijungti", + "connect": "Prisijungta!", "connecttomoodle": "Prisijungti prie Moodle", "contactyouradministrator": "Susisiekite su svetainės administratoriumi, jei reikalinga pagalba.", "contactyouradministratorissue": "Dėl šių klausimų prašome susisiekti su administratoriumi: {{$a}}", "createaccount": "Kurti naują mano paskyrą", "createuserandpass": "Pasirinkite savo naudotojo vardą ir slaptažodį", "credentialsdescription": "Prisijungti naudojant vartotojo vardą ir slaptažodį.", - "emailconfirmsent": "

    El. laiškas išsiųstas jūsų adresu {{$a}}

    .

    Jame pateikti paprasti nurodymai, kaip užbaigti registraciją.

    Jei iškils kokių sunkumų, kreipkitės į svetainės administratorių.

    ", + "emailconfirmsent": "

    Informacija išsiųsta Jūsų nurodytu adresu {{$a}}

    Tai padės sėkmingai užbaigti registraciją.

    Jeigu nepavyksta, susisiekite su svetainės administratoriumi.

    ", "emailnotmatch": "El. paštas nesutampa", "enterthewordsabove": "Įvesti aukščiau rodomus žodžius", "erroraccesscontrolalloworigin": "Kryžminis veiksmas buvo atmestas. Patikrinkite: https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/pt.json b/www/core/components/login/lang/pt.json index a218e010b94..e7d8c53e078 100644 --- a/www/core/components/login/lang/pt.json +++ b/www/core/components/login/lang/pt.json @@ -4,14 +4,14 @@ "cancel": "Cancelar", "checksiteversion": "Verifique se seu site usa o Moodle 2.4 ou posterior.", "confirmdeletesite": "Tem a certeza que pretende remover o site {{sitename}}?", - "connect": "Ligar", + "connect": "Ligar!", "connecttomoodle": "Ligação ao Moodle", "contactyouradministrator": "Contacte o administrador do site para obter mais ajuda.", "contactyouradministratorissue": "Solicite ao administrador que verifique o seguinte problema: {{$a}}", "createaccount": "Criar a minha conta", "createuserandpass": "Escolha um nome de utilizador e senha", "credentialsdescription": "Por favor, digite o nome de utilizador e senha para entrar", - "emailconfirmsent": "

    Acaba de ser enviada uma mensagem para o seu endereço {{$a}}, com instruções fáceis para completar a sua inscrição.

    Se tiver alguma dificuldade em completar o registo, contacte o administrador do site.

    ", + "emailconfirmsent": "

    Um e-mail deve ter sido enviado para o seu endereço {{$a}}

    . Contém instruções fáceis para concluir o seu registo. Se continuar a ter dificuldades, entre em contacto com o administrador do site.

    ", "emailnotmatch": "Os e-mails não coincidem", "enterthewordsabove": "Insira as palavras indicadas acima", "erroraccesscontrolalloworigin": "A acção de Cross-Origin que tentou executar foi rejeitada. Por favor, consulte mais informações em https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/login/lang/zh-tw.json b/www/core/components/login/lang/zh-tw.json index 654cba89766..110d8e28784 100644 --- a/www/core/components/login/lang/zh-tw.json +++ b/www/core/components/login/lang/zh-tw.json @@ -4,14 +4,14 @@ "cancel": "取消", "checksiteversion": "請檢查您的網站是否使用Moodle 2.4或更高版本.", "confirmdeletesite": "您確定要刪除網站{{sitename}}嗎?", - "connect": "連結", + "connect": "連線!", "connecttomoodle": "連上Moodle平台", "contactyouradministrator": "連絡你的網站管理員以取得更多的協助.", "contactyouradministratorissue": "請求管理員檢查以下問題: {{$ a}}", "createaccount": "建立我的新帳號", "createuserandpass": "請選擇您的帳號名稱和密碼", "credentialsdescription": "請提供您的帳號和密碼以便登入", - "emailconfirmsent": "

    本系統已經送出電子郵件到 {{$a}}

    \n

    訊息內容包含如何完成註冊手續。

    \n

    請閱覽您的私人郵件 按下確認連結後 便可登入本系統,若是有問題請和系統管理員連絡。

    ", + "emailconfirmsent": "

    電子郵件應該已經寄到您的地址 {{$ a}}

    它包含簡單的說明, 可以完成註冊.

    如果, 您仍然有困難, 請與網站管理員聯繫.", "emailnotmatch": "電子郵件內容不符", "enterthewordsabove": "輸入您在上圖中看到的字元", "erroraccesscontrolalloworigin": "您嘗試執行的Cross-Origin呼叫已被拒絕. 請檢查https://docs.moodle.org/dev/Moodle_Mobile_development_using_Chrome_or_Chromium", diff --git a/www/core/components/question/lang/ca.json b/www/core/components/question/lang/ca.json index aece96d8870..52bd86fd1d3 100644 --- a/www/core/components/question/lang/ca.json +++ b/www/core/components/question/lang/ca.json @@ -17,5 +17,5 @@ "questionmessage": "Pregunta {{$a}}: {{$b}}", "questionno": "Pregunta {{$a}}", "requiresgrading": "Cal puntuar", - "unknown": "Desconegut" + "unknown": "No es pot determinar l'estat" } \ No newline at end of file diff --git a/www/core/components/question/lang/es-mx.json b/www/core/components/question/lang/es-mx.json index f304a7602ec..adeff045b27 100644 --- a/www/core/components/question/lang/es-mx.json +++ b/www/core/components/question/lang/es-mx.json @@ -17,5 +17,5 @@ "questionmessage": "Pregunta {{$a}}: {{$b}}", "questionno": "Pregunta {{$a}}", "requiresgrading": "Requiere re-calificar", - "unknown": "Desconocido" + "unknown": "No se puede determinar el estatus" } \ No newline at end of file diff --git a/www/core/components/question/lang/lt.json b/www/core/components/question/lang/lt.json index fc31749789f..3a47ab0fc41 100644 --- a/www/core/components/question/lang/lt.json +++ b/www/core/components/question/lang/lt.json @@ -17,5 +17,5 @@ "questionmessage": "Klausimas {{$a}}: {{$b}}", "questionno": "Klausimas {{$a}}", "requiresgrading": "Reikia vertinimo", - "unknown": "Nežinoma" + "unknown": "Negalima nustatyti statuso" } \ No newline at end of file diff --git a/www/core/components/question/lang/pt.json b/www/core/components/question/lang/pt.json index f0f684b92dd..f00329c4791 100644 --- a/www/core/components/question/lang/pt.json +++ b/www/core/components/question/lang/pt.json @@ -17,5 +17,5 @@ "questionmessage": "Pergunta {{$a}}: {{$b}}", "questionno": "Pergunta {{$a}}", "requiresgrading": "Requer avaliação", - "unknown": "Desconhecido(a)" + "unknown": "Não é possível determinar o estado" } \ No newline at end of file diff --git a/www/core/components/question/lang/zh-tw.json b/www/core/components/question/lang/zh-tw.json index 98bad903e59..f7fe56dce37 100644 --- a/www/core/components/question/lang/zh-tw.json +++ b/www/core/components/question/lang/zh-tw.json @@ -17,5 +17,5 @@ "questionmessage": "問題 {{$a}}: {{$b}}", "questionno": "試題{{$a}}", "requiresgrading": "需要計分", - "unknown": "未知的" + "unknown": "無法偵測到狀態" } \ No newline at end of file diff --git a/www/core/components/settings/lang/de.json b/www/core/components/settings/lang/de.json index ee00cd09e80..e02a3a9c1f1 100644 --- a/www/core/components/settings/lang/de.json +++ b/www/core/components/settings/lang/de.json @@ -13,7 +13,7 @@ "credits": "Mitwirkende", "currentlanguage": "Eingestellte Sprache", "deletesitefiles": "Möchten Sie wirklich alle von der Website '{{sitename}}' geladenen Dateien löschen?", - "deletesitefilestitle": "Website-Dateien löschen", + "deletesitefilestitle": "Dateien löschen", "deviceinfo": "Geräteinformationen", "deviceos": "Geräte-OS", "devicewebworkers": "Device Web Workers unterstützt", @@ -26,7 +26,7 @@ "enablerichtexteditor": "Texteditor aktivieren", "enablerichtexteditordescription": "Wenn diese Option aktiviert ist, wird an passenden Stellen ein Texteditor angezeigt.", "enablesyncwifi": "Nur mit WLAN synchronierieren", - "errordeletesitefiles": "Fehler beim Löschen der Website-Dateien", + "errordeletesitefiles": "Fehler beim Löschen der Dateien", "errorsyncsite": "Fehler beim Synchronisieren der Website. Prüfen Sie die Verbindung und versuchen Sie es noch einmal.", "estimatedfreespace": "Noch verfügbarer Speicherplatz", "filesystemroot": "Dateisystem (root)", diff --git a/www/core/components/sharedfiles/lang/ca.json b/www/core/components/sharedfiles/lang/ca.json index af0c921ccaf..56cb9344708 100644 --- a/www/core/components/sharedfiles/lang/ca.json +++ b/www/core/components/sharedfiles/lang/ca.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "No hi ha llocs desats. Afegiu un lloc per poder compartir fitxers amb l'aplicació.", "nosharedfiles": "No hi ha fitxers compartits desats en aquest lloc.", "nosharedfilestoupload": "No hi ha fitxers per pujar. Si voleu pujar un fitxer des d'un altra aplicació, busqueu-lo i feu clic al botó «Obre a».", - "rename": "Canvia el nom", + "rename": "Reanomena", "replace": "Reemplaça", "sharedfiles": "Fitxers compartits", "successstorefile": "S'ha desat el fitxer amb èxit. Podeu seleccionar-lo i pujar-lo als vostres fitxers privats o adjuntar-lo a alguna activitat." diff --git a/www/core/components/sharedfiles/lang/de.json b/www/core/components/sharedfiles/lang/de.json index 6bbe564a7ac..0284aaba1ae 100644 --- a/www/core/components/sharedfiles/lang/de.json +++ b/www/core/components/sharedfiles/lang/de.json @@ -3,9 +3,9 @@ "chooseactionrepeatedfile": "Eine Datei mit diesem Namen existiert bereits. Möchten Sie die vorhandene Datei ersetzen oder möchten Sie sie umbenennen in '{{$a}}'?", "errorreceivefilenosites": "Keine Websites gespeichert. Fügen Sie zuerst eine Website hinzu, bevor Sie eine Datei über die App freigeben.", "nosharedfiles": "Keine geteilten Dateien für diese Website", - "nosharedfilestoupload": "Sie haben noch keine Dateien zum Hochladen freigegeben. Wenn Sie eine Datei aus einer anderen App hochladen möchten, suchen Sie diese Datei und tippen Sie auf die Taste 'Öffnen in'.", + "nosharedfilestoupload": "Sie haben hier noch keine Datei zum Hochladen. Wenn Sie eine Datei aus einer anderen App hochladen möchten, suchen Sie diese Datei und tippen Sie auf die Taste 'Öffnen in'.", "rename": "Umbenennen", "replace": "Ersetzen", "sharedfiles": "Geteilte Dateien", - "successstorefile": "Die Datei wurde gespeichert. Sie können die Datei verwenden, um Sie in 'Meine Dateien' hochzuladen oder bei Aktivitäten anzuhängen." + "successstorefile": "Die Datei wurde gespeichert. Sie können die Datei in den Bereich 'Meine Dateien' hochladen oder bei Aktivitäten anhängen." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/es-mx.json b/www/core/components/sharedfiles/lang/es-mx.json index 6cd58565e88..d2732c41c62 100644 --- a/www/core/components/sharedfiles/lang/es-mx.json +++ b/www/core/components/sharedfiles/lang/es-mx.json @@ -5,7 +5,7 @@ "nosharedfiles": "No hay archivos compartidos en este sitio.", "nosharedfilestoupload": "Usted no tiene archivos para subir aquí. Si Usted desea subir un archivo desde otra App, localice ese archivo y haga click en el botón para 'Abrir en'.", "rename": "Renombrar", - "replace": "Reemplazar", + "replace": "Remplazar", "sharedfiles": "Archivos compartidos", "successstorefile": "Archivo almacenado exitosamente. Ahora Usted puede seleccionar a este archivo para subirlo a sus archivos privados, o anexarlo a algunas actividades." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/lt.json b/www/core/components/sharedfiles/lang/lt.json index 2e51ae1b0ed..ef379410c73 100644 --- a/www/core/components/sharedfiles/lang/lt.json +++ b/www/core/components/sharedfiles/lang/lt.json @@ -4,8 +4,8 @@ "errorreceivefilenosites": "Svetainės nėra saugomos. Prieš dalintis failu, pridėkite svetainės nuorodą.", "nosharedfiles": "Šioje svetainėje nepatalpinti bendro naudojimo failai.", "nosharedfilestoupload": "Nėra įkeltų failų. Jeigu norite juos įkelti iš kitos programėlės, pažymėkite ir paspauskite mygtuką „Atidaryti“.", - "rename": "Pervardyti", - "replace": "Keisti", + "rename": "Pervadinti", + "replace": "Pakeisti", "sharedfiles": "Bendro naudojimo failai", "successstorefile": "Failas sėkmingai patalpintas. Galite jį perkelti į savo asmeninį aplanką arba įkelti tam tikrosiose veiklose." } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/pt.json b/www/core/components/sharedfiles/lang/pt.json index 2200f805ed5..2c1daa00102 100644 --- a/www/core/components/sharedfiles/lang/pt.json +++ b/www/core/components/sharedfiles/lang/pt.json @@ -4,7 +4,7 @@ "errorreceivefilenosites": "Não existem sites armazenados. Adicione um site antes de partilhar um ficheiro com a aplicação.", "nosharedfiles": "Não existem quaisquer ficheiros partilhados armazenados neste site.", "nosharedfilestoupload": "Não tem ficheiros para fazer o carregamento aqui. Se quiser carregar um ficheiro de outra aplicação, localize o ficheiro e clique no botão 'Abrir em'.", - "rename": "Renomear", + "rename": "Mudar nome", "replace": "Substituir", "sharedfiles": "Ficheiros partilhados", "successstorefile": "Ficheiro armazenado com sucesso. A partir de agora pode selecionar este ficheiro para enviá-lo para os seus ficheiros privados ou anexá-lo em algumas atividades." diff --git a/www/core/components/sharedfiles/lang/tr.json b/www/core/components/sharedfiles/lang/tr.json index 76c25af6f7c..94ea98f2214 100644 --- a/www/core/components/sharedfiles/lang/tr.json +++ b/www/core/components/sharedfiles/lang/tr.json @@ -1,5 +1,5 @@ { - "rename": "Ad değiştir", + "rename": "Yeniden adlandır", "replace": "Değiştir", "sharedfiles": "Paylaşılan dosyalar" } \ No newline at end of file diff --git a/www/core/components/sharedfiles/lang/zh-tw.json b/www/core/components/sharedfiles/lang/zh-tw.json index 29220712327..9e1a070f78b 100644 --- a/www/core/components/sharedfiles/lang/zh-tw.json +++ b/www/core/components/sharedfiles/lang/zh-tw.json @@ -4,8 +4,8 @@ "errorreceivefilenosites": "沒有已存入的網站. 請在與應用程式共享文件之前新增網站.", "nosharedfiles": "此網站中沒有存入共享檔案.", "nosharedfilestoupload": "您沒有要在此處上傳的檔案. 如果您要從其他應用程式上傳檔案, 請找出該檔案, 然後按一下[開啟]按鈕.", - "rename": "改名", - "replace": "替換", + "rename": "重新命名", + "replace": "替代", "sharedfiles": "分享檔案", "successstorefile": "檔案已成功儲存.現在您可以選擇檔案進行上傳到您的個人檔案." } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/ca.json b/www/core/components/sidemenu/lang/ca.json index d2e61d92b7b..321730fec1f 100644 --- a/www/core/components/sidemenu/lang/ca.json +++ b/www/core/components/sidemenu/lang/ca.json @@ -2,7 +2,7 @@ "appsettings": "Paràmetres de l'aplicació", "changesite": "Canvia de lloc", "help": "Ajuda", - "logout": "Surt", + "logout": "Desconnecta", "mycourses": "Els meus cursos", "togglemenu": "Canvia menú", "website": "Lloc web" diff --git a/www/core/components/sidemenu/lang/de.json b/www/core/components/sidemenu/lang/de.json index 0ed4e3b6221..4f3285f040c 100644 --- a/www/core/components/sidemenu/lang/de.json +++ b/www/core/components/sidemenu/lang/de.json @@ -5,5 +5,5 @@ "logout": "Abmelden", "mycourses": "Meine Kurse", "togglemenu": "Menü umschalten", - "website": "Website" + "website": "Website im Browser" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/es-mx.json b/www/core/components/sidemenu/lang/es-mx.json index fb36a0997ba..e2079172694 100644 --- a/www/core/components/sidemenu/lang/es-mx.json +++ b/www/core/components/sidemenu/lang/es-mx.json @@ -2,7 +2,7 @@ "appsettings": "Configuraciones del App", "changesite": "Cambiar sitio", "help": "Ayuda", - "logout": "Salir", + "logout": "Salir del sitio", "mycourses": "Mis cursos", "togglemenu": "Alternar menú", "website": "Página web" diff --git a/www/core/components/sidemenu/lang/lt.json b/www/core/components/sidemenu/lang/lt.json index 4f3f66ea9f3..0f0cb015df4 100644 --- a/www/core/components/sidemenu/lang/lt.json +++ b/www/core/components/sidemenu/lang/lt.json @@ -1,9 +1,9 @@ { "appsettings": "Programėlės nustatymai", "changesite": "Pakeisti svetainę", - "help": "Žinynas", - "logout": "Atsijungti", - "mycourses": "Mano kursai", + "help": "Pagalba", + "logout": "Pakeisti svetainę", + "mycourses": "Mano mokymo programos", "togglemenu": "Perjungti", "website": "Interneto svetainė" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/pt.json b/www/core/components/sidemenu/lang/pt.json index 479ba8e4f48..f972c409f74 100644 --- a/www/core/components/sidemenu/lang/pt.json +++ b/www/core/components/sidemenu/lang/pt.json @@ -2,7 +2,7 @@ "appsettings": "Configurações da aplicação", "changesite": "Mudar de site", "help": "Ajuda", - "logout": "Sair", + "logout": "Terminar sessão", "mycourses": "As minhas disciplinas", "togglemenu": "Alternar menu", "website": "Site" diff --git a/www/core/components/sidemenu/lang/tr.json b/www/core/components/sidemenu/lang/tr.json index ace500a4db3..57800da7afa 100644 --- a/www/core/components/sidemenu/lang/tr.json +++ b/www/core/components/sidemenu/lang/tr.json @@ -1,7 +1,7 @@ { "changesite": "Çıkış", "help": "Yardım", - "logout": "Çıkış yap", + "logout": "Çıkış", "mycourses": "Derslerim", "website": "Websitesi" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/zh-cn.json b/www/core/components/sidemenu/lang/zh-cn.json index 045f90c1630..ea6cd6e91e1 100644 --- a/www/core/components/sidemenu/lang/zh-cn.json +++ b/www/core/components/sidemenu/lang/zh-cn.json @@ -1,7 +1,7 @@ { "changesite": "注销", "help": "帮助", - "logout": "退出", + "logout": "注销", "mycourses": "我的课程", "website": "网站" } \ No newline at end of file diff --git a/www/core/components/sidemenu/lang/zh-tw.json b/www/core/components/sidemenu/lang/zh-tw.json index e157aab2b0e..412f2616441 100644 --- a/www/core/components/sidemenu/lang/zh-tw.json +++ b/www/core/components/sidemenu/lang/zh-tw.json @@ -1,8 +1,8 @@ { "appsettings": "應用程式設定", "changesite": "更換網站", - "help": "輔助說明", - "logout": "登出", + "help": "協助", + "logout": "更換網站", "mycourses": "我的課程", "togglemenu": "切換功能選單", "website": "網站" diff --git a/www/core/components/user/lang/ca.json b/www/core/components/user/lang/ca.json index a5f782e392b..fe01cc4b106 100644 --- a/www/core/components/user/lang/ca.json +++ b/www/core/components/user/lang/ca.json @@ -4,7 +4,7 @@ "contact": "Contacte", "country": "País", "description": "Descripció", - "details": "Detalls de seguiment", + "details": "Detalls", "detailsnotavailable": "No tens accés als detalls d'aquest usuari.", "editingteacher": "Professor", "email": "Correu electrònic", diff --git a/www/core/components/user/lang/es-mx.json b/www/core/components/user/lang/es-mx.json index dabd4a46d5b..4a165259a1c 100644 --- a/www/core/components/user/lang/es-mx.json +++ b/www/core/components/user/lang/es-mx.json @@ -4,14 +4,14 @@ "contact": "Contacto", "country": "País", "description": "Descripción", - "details": "Detalles del seguimiento", + "details": "Detalles", "detailsnotavailable": "Los detalles de este usuario no están disponibles para Usted.", "editingteacher": "Profesor", "email": "Email", "emailagain": "Correo (de nuevo)", "firstname": "Nombre", "interests": "Intereses", - "invaliduser": "Usuario no válido", + "invaliduser": "Usuario inválido.", "lastname": "Apellido(s)", "manager": "Mánager", "newpicture": "Imagen nueva", diff --git a/www/core/components/user/lang/lt.json b/www/core/components/user/lang/lt.json index 5b7c9101b18..2f4a8565e55 100644 --- a/www/core/components/user/lang/lt.json +++ b/www/core/components/user/lang/lt.json @@ -1,17 +1,17 @@ { "address": "Adresas", "city": "Miestas / miestelis", - "contact": "Kontaktas", + "contact": "Kontaktai", "country": "Šalis", "description": "Įžangos tekstas", - "details": "Sekimo išsami informacija", + "details": "Detalės", "detailsnotavailable": "Šio vartotojo duomenys jums nepasiekiami.", "editingteacher": "Dėstytojas", "email": "El. laiškas", "emailagain": "El. paštas (dar kartą)", "firstname": "Vardas", "interests": "Pomėgiai", - "invaliduser": "Klaidingas naudotojas", + "invaliduser": "Netinkamas vartotojas.", "lastname": "Pavardė", "manager": "Valdytojas", "newpicture": "Naujas paveikslėlis", diff --git a/www/core/components/user/lang/pt.json b/www/core/components/user/lang/pt.json index 7b0f3e6910f..21a6936bf0c 100644 --- a/www/core/components/user/lang/pt.json +++ b/www/core/components/user/lang/pt.json @@ -4,7 +4,7 @@ "contact": "Contacto", "country": "País", "description": "Descrição", - "details": "Detalhe do percurso", + "details": "Detalhes", "detailsnotavailable": "Não tem acesso aos detalhes deste utilizador.", "editingteacher": "Professor", "email": "E-mail", diff --git a/www/core/components/user/lang/tr.json b/www/core/components/user/lang/tr.json index 0415b166cdc..49ebb7e3098 100644 --- a/www/core/components/user/lang/tr.json +++ b/www/core/components/user/lang/tr.json @@ -1,16 +1,16 @@ { "address": "Adres", "city": "Şehir", - "contact": "İletişim", + "contact": "Kişi", "country": "Ülke", "description": "Açıklama", - "details": "İzleme ayrıntıları", + "details": "Detaylar", "editingteacher": "Öğretmen", "email": "E-posta", "emailagain": "E-posta (tekrar)", "firstname": "Adı", "interests": "İlgi alanları", - "invaliduser": "Geçersiz kullanıcı", + "invaliduser": "Geçersiz kullanıcı.", "lastname": "Soyadı", "manager": "Yönetici", "newpicture": "Yeni resim", diff --git a/www/core/components/user/lang/zh-cn.json b/www/core/components/user/lang/zh-cn.json index f1e99807e98..e87f7ac73ef 100644 --- a/www/core/components/user/lang/zh-cn.json +++ b/www/core/components/user/lang/zh-cn.json @@ -1,10 +1,10 @@ { "address": "地址", "city": "市/县", - "contact": "联系", + "contact": "联系方式", "country": "国家和地区", "description": "描述", - "details": "查看详情", + "details": "详情", "email": "Email", "emailagain": "Email (重复)", "firstname": "名", diff --git a/www/core/components/user/lang/zh-tw.json b/www/core/components/user/lang/zh-tw.json index bb119de2d5b..36c566c489c 100644 --- a/www/core/components/user/lang/zh-tw.json +++ b/www/core/components/user/lang/zh-tw.json @@ -1,17 +1,17 @@ { "address": "地址", "city": "縣/市", - "contact": "聯絡", + "contact": "連絡人", "country": "國家", "description": "說明", - "details": "SCO 追蹤細節", + "details": "明細", "detailsnotavailable": "這個使用者的詳細資料無法提供給您", "editingteacher": "教師", "email": "電子郵件", "emailagain": "電子郵件(再次確認)", "firstname": "名字", "interests": "興趣", - "invaliduser": "無效的用戶", + "invaliduser": "無效的使用者", "lastname": "姓氏", "manager": "管理者", "newpicture": "新照片", diff --git a/www/core/lang/ca.json b/www/core/lang/ca.json index ccc449aef4c..3dda981a8e4 100644 --- a/www/core/lang/ca.json +++ b/www/core/lang/ca.json @@ -40,7 +40,7 @@ "days": "Dies", "decsep": ",", "delete": "Suprimeix", - "deleting": "S'està suprimint", + "deleting": "S'està eliminant", "description": "Descripció", "dfdaymonthyear": "DD-MM-YYYY", "dfdayweekmonth": "ddd, D MMM", @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imatge", "imageviewer": "Visor d'imatges", - "info": "Info", + "info": "Informació", "ios": "iOS", "labelsep": ":", "lastmodified": "Darrera modificació", @@ -134,7 +134,7 @@ "nocomments": "No hi ha comentaris", "nograde": "No hi ha qualificació.", "none": "Cap", - "nopasswordchangeforced": "No podeu continuar sense canviar la contrasenya, però no està disponible cap pàgina on pugueu canviar-la. Contacteu amb l'administració del vostre Moodle.", + "nopasswordchangeforced": "No podeu continuar sense canviar la contrasenya.", "nopermissions": "Actualment no teniu permisos per a fer això ({{$a}})", "noresults": "Sense resultats", "notapplicable": "n/a", @@ -142,7 +142,7 @@ "notsent": "No enviat", "now": "ara", "numwords": "{{$a}} paraules", - "offline": "Fora de línia", + "offline": "No es requereix cap tramesa en línia", "online": "En línia", "openfullimage": "Feu clic per veure la imatge a tamany complert", "openinbrowser": "Obre-ho al navegador", @@ -160,7 +160,7 @@ "retry": "Reintenta", "save": "Desa", "search": "Cerca...", - "searching": "Cerca a", + "searching": "S'està cercant", "searchresults": "Resultats de la cerca", "sec": "segon", "secs": "segons", diff --git a/www/core/lang/de.json b/www/core/lang/de.json index 99401c583d7..95f5238af2c 100644 --- a/www/core/lang/de.json +++ b/www/core/lang/de.json @@ -7,6 +7,10 @@ "cancel": "Abbrechen", "cannotconnect": "Die Verbindung ist nicht möglich. Prüfen Sie, ob die URL richtig ist und dass mindestens Moodle 2.4 verwendet wird.", "cannotdownloadfiles": "Das Herunterladen von Dateien ist im mobilen Webservice deaktiviert. Wenden Sie sich an den Administrator der Website.", + "captureaudio": "Audio aufnehmen", + "capturedimage": "Foto aufgenommen.", + "captureimage": "Foto aufnehmen", + "capturevideo": "Video aufnehmen", "category": "Kursbereich", "choose": "Auswahl", "choosedots": "Auswählen...", @@ -90,8 +94,9 @@ "info": "Info", "ios": "iOS", "labelsep": ": ", + "lastdownloaded": "Zuletzt heruntergeladen", "lastmodified": "Zuletzt geändert", - "lastsync": "Letztes Synchronisieren", + "lastsync": "Zuletzt synchronisiert", "listsep": ";", "loading": "Wird geladen...", "loadmore": "Mehr laden", @@ -128,7 +133,7 @@ "moduleintro": "Beschreibung", "mygroups": "Meine Gruppen", "name": "Name", - "networkerrormsg": "Kein Netzwerk", + "networkerrormsg": "Problem mit der Verbindung. Prüfen Sie die Verbindung und versuchen Sie es noch einmal.", "never": "Nie", "next": "Weiter", "no": "Nein", diff --git a/www/core/lang/es-mx.json b/www/core/lang/es-mx.json index 541896c8613..d701e3c7b2a 100644 --- a/www/core/lang/es-mx.json +++ b/www/core/lang/es-mx.json @@ -7,6 +7,10 @@ "cancel": "Cancelar", "cannotconnect": "No se puede conectar: Verifique que Usted escribió la URL correcta y que su sitio usa Moodle 2.4 o más reciente.", "cannotdownloadfiles": "La descarga de archivos está deshabilitada en su servicio Mobile. Por favor contacte a su administrador del sitio.", + "captureaudio": "Grabar audio", + "capturedimage": "Foto tomada.", + "captureimage": "Tomar foto", + "capturevideo": "Grabar video", "category": "Categoría", "choose": "Elegir", "choosedots": "Elegir...", @@ -87,9 +91,10 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagen", "imageviewer": "Visor de imágenes", - "info": "Info", + "info": "Información", "ios": "iOS", "labelsep": ":", + "lastdownloaded": "Última descarga", "lastmodified": "Última modicficación", "lastsync": "Última sincronzación", "listsep": ";", @@ -128,14 +133,14 @@ "moduleintro": "Descripción", "mygroups": "Mis grupos", "name": "Nombre", - "networkerrormsg": "Red no disponible o no funcionando.", + "networkerrormsg": "Hubo un problema para conectarse al sitio. Por favor revise su conexión e inténtelo nuevamente.", "never": "Nunca", "next": "Continuar", "no": "No", "nocomments": "No hay comentarios", "nograde": "Sin calificación.", "none": "Ninguno(a)", - "nopasswordchangeforced": "No puede seguir sin cambiar su contraseña, sin embargo no existe ninguna página disponible para cambiarla. Por favor contacte a su administrador de Moodle.", + "nopasswordchangeforced": "Usted no puede proceder sin cambiar su contraseña.", "nopermissions": "Lo sentimos, pero por el momento no tiene permiso para hacer eso ({{$a}})", "noresults": "Sin resultados", "notapplicable": "no disp.", @@ -143,8 +148,8 @@ "notsent": "No enviado", "now": "ahora", "numwords": "{{$a}} palabras", - "offline": "No se requieren entregas online", - "online": "En línea", + "offline": "Fuera-de-línea", + "online": "En-línea", "openfullimage": "Hacer click aquí para mostrar la imagen a tamaño completo", "openinbrowser": "Abrir en navegador", "othergroups": "Otros grupos", @@ -161,7 +166,7 @@ "retry": "Reintentar", "save": "Guardar", "search": "Búsqueda", - "searching": "Buscar en", + "searching": "Buscando", "searchresults": "Resultado", "sec": "segundos", "secs": "segundos", diff --git a/www/core/lang/lt.json b/www/core/lang/lt.json index 2246e0b4405..dc367aa81da 100644 --- a/www/core/lang/lt.json +++ b/www/core/lang/lt.json @@ -38,7 +38,7 @@ "days": "Dienos", "decsep": ".", "delete": "Pašalinti", - "deleting": "Naikinama", + "deleting": "Trinama", "description": "Įžangos tekstas", "dfdaymonthyear": "MM-DD-MMMM", "dfdayweekmonth": "ddd, D MMM", @@ -128,7 +128,7 @@ "nocomments": "Nėra komentarų", "nograde": "Nėra įvertinimų.", "none": "Nėra", - "nopasswordchangeforced": "Negalite tęsti nepakeitę slaptažodžio, tačiau nėra slaptažodžio keitimo puslapio. Susisiekite su „Moodle“ administratoriumi.", + "nopasswordchangeforced": "Nepakeitus slaptažodžio, negalima tęsti.", "nopermissions": "Atsiprašome, tačiau šiuo metu jūs neturite teisės atlikti šio veiksmo", "noresults": "Nėra rezultatų", "notapplicable": "netaikoma", @@ -136,7 +136,7 @@ "notsent": "Neišsiųsta", "now": "dabar", "numwords": "Žodžių: {{$a}}", - "offline": "Nereikia įkelti darbų į svetainę", + "offline": "Neprisijungęs", "online": "Prisijungęs", "openfullimage": "Paspauskite, norėdami matyti visą vaizdą", "openinbrowser": "Atidaryti naršyklėje", @@ -154,7 +154,7 @@ "retry": "Bandykite dar kartą", "save": "Išsaugoti", "search": "Paieška", - "searching": "Ieškoti", + "searching": "Ieškoma", "searchresults": "Ieškos rezultatai", "sec": "sek.", "secs": "sek.", @@ -186,7 +186,7 @@ "twoparagraphs": "{{p1}}

    {{p2}}", "uhoh": "Uh oh!", "unexpectederror": "Klaida. Uždarykite programėlę ir bandykite atidaryti dar kartą", - "unknown": "Nežinoma", + "unknown": "Nežinomas", "unlimited": "Neribota", "unzipping": "Išskleidžiama", "upgraderunning": "Naujinama svetainės versija, bandykite vėliau.", diff --git a/www/core/lang/nl.json b/www/core/lang/nl.json index 30bbaafe113..d2f51f30b51 100644 --- a/www/core/lang/nl.json +++ b/www/core/lang/nl.json @@ -7,6 +7,10 @@ "cancel": "Annuleer", "cannotconnect": "Kan niet verbinden: controleer of je de URL juist hebt ingegeven en dat je site Moodle 2.4 of recenter gebruikt.", "cannotdownloadfiles": "Bestanden downloaden is uitgeschakeld voor jouw mobiele service. Neem contact op met je systeembeheerder.", + "captureaudio": "Audio opnemen", + "capturedimage": "Foto genomen.", + "captureimage": "Maak foto", + "capturevideo": "Film opnemen", "category": "Categorie", "choose": "Kies", "choosedots": "Kies...", @@ -90,6 +94,7 @@ "info": "Info", "ios": "iOS", "labelsep": ": ", + "lastdownloaded": "Laatste download", "lastmodified": "Laatst gewijzigd", "lastsync": "Laatste synchronisatie", "listsep": ";", @@ -128,7 +133,7 @@ "moduleintro": "Beschrijving", "mygroups": "Mijn groepen", "name": "Naam", - "networkerrormsg": "Netwerk niet ingeschakeld of werkt niet.", + "networkerrormsg": "Er was een probleem met het verbinden met de site. Controleer je verbinding en probeer opnieuw.", "never": "Nooit", "next": "Volgende", "no": "Nee", diff --git a/www/core/lang/pt.json b/www/core/lang/pt.json index 477b29aee06..bc73453706a 100644 --- a/www/core/lang/pt.json +++ b/www/core/lang/pt.json @@ -86,7 +86,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "Imagem", "imageviewer": "Visualizador de imagens", - "info": "Informação", + "info": "Informações", "ios": "iOS", "labelsep": ": ", "lastmodified": "Modificado pela última vez:", @@ -134,7 +134,7 @@ "nocomments": "Não existem comentários", "nograde": "Sem avaliação", "none": "Nenhuma", - "nopasswordchangeforced": "Não consegue prosseguir sem modificar a senha, entretanto não existe nenhuma página disponível para a mudar. Por favor contate o Administrador do site Moodle.", + "nopasswordchangeforced": "Não pode prosseguir sem alterar sua senha.", "nopermissions": "Atualmente, não tem permissões para realizar a operação {{$a}}", "noresults": "Sem resultados", "notapplicable": "n/a", @@ -142,8 +142,8 @@ "notsent": "Não enviado", "now": "agora", "numwords": "{{$a}} palavra(s)", - "offline": "Não é necessário submeter nada online", - "online": "Inativo", + "offline": "Offline", + "online": "Online", "openfullimage": "Clique aqui para exibir a imagem em tamanho real", "openinbrowser": "Abrir no navegador", "othergroups": "Outros grupos", @@ -160,7 +160,7 @@ "retry": "Tentar novamente", "save": "Guardar", "search": "Pesquisa", - "searching": "Pesquisar em", + "searching": "A procurar", "searchresults": "Resultados da procura", "sec": "segundo", "secs": "segundos", @@ -194,7 +194,7 @@ "unexpectederror": "Erro inesperado. Por favor, feche e abra novamente a aplicação para tentar de novo", "unicodenotsupported": "Alguns emojis não são suportados neste site. Estes caracteres serão removidos quando a mensagem for enviada.", "unicodenotsupportedcleanerror": "Foi encontrado texto vazio ao limpar caracteres Unicode.", - "unknown": "Desconhecido(a)", + "unknown": "Desconhecido", "unlimited": "Ilimitado(a)", "unzipping": "A descomprimir", "upgraderunning": "O site está em processo de atualização, por favor, tente novamente mais tarde.", diff --git a/www/core/lang/sr-cr.json b/www/core/lang/sr-cr.json index ac8fa8b0c9b..eb73433f6fe 100644 --- a/www/core/lang/sr-cr.json +++ b/www/core/lang/sr-cr.json @@ -7,6 +7,10 @@ "cancel": "Одустани", "cannotconnect": "Није могуће успоставити везу. Проверите да ли сте унели исправну URL адресу и да ли ваш сајт користи Moodle 2.4 или новију верзију.", "cannotdownloadfiles": "Преузимање датотека је онемогућено у подешавањима вашег мобилног сервиса. Обратите се администратору сајта.", + "captureaudio": "Сними аудио", + "capturedimage": "Снимљена слика", + "captureimage": "Усликај", + "capturevideo": "Сними видео", "category": "Категорија", "choose": "Изабери", "choosedots": "Изабери...", @@ -89,6 +93,7 @@ "info": "Инфо", "ios": "iOS", "labelsep": ":", + "lastdownloaded": "Последњи пут преузето", "lastmodified": "Последња измена", "lastsync": "Последња синхронизација", "listsep": ";", @@ -113,7 +118,7 @@ "moduleintro": "Опис", "mygroups": "Моје групе", "name": "Име", - "networkerrormsg": "Мрежа није укључена или не ради.", + "networkerrormsg": "Било је проблема са повезивањем на сајт. Проверите везу и покушајте поново.", "never": "Никад", "next": "Следећи", "no": "Не", diff --git a/www/core/lang/sr-lt.json b/www/core/lang/sr-lt.json index d622c1ce0a9..a35a6e51d90 100644 --- a/www/core/lang/sr-lt.json +++ b/www/core/lang/sr-lt.json @@ -7,6 +7,10 @@ "cancel": "Odustani", "cannotconnect": "Nije moguće uspostaviti vezu. Proverite da li ste uneli ispravnu URL adresu i da li vaš sajt koristi Moodle 2.4 ili noviju verziju.", "cannotdownloadfiles": "Preuzimanje datoteka je onemogućeno u podešavanjima vašeg mobilnog servisa. Obratite se administratoru sajta.", + "captureaudio": "Snimi audio", + "capturedimage": "Snimljena slika", + "captureimage": "Uslikaj", + "capturevideo": "Snimi video", "category": "Kategorija", "choose": "Izaberi", "choosedots": "Izaberi...", @@ -89,6 +93,7 @@ "info": "Info", "ios": "iOS", "labelsep": ":", + "lastdownloaded": "Poslednji put preuzeto", "lastmodified": "Poslednja izmena", "lastsync": "Poslednja sinhronizacija", "listsep": ";", @@ -113,7 +118,7 @@ "moduleintro": "Opis", "mygroups": "Moje grupe", "name": "Ime", - "networkerrormsg": "Mreža nije uključena ili ne radi.", + "networkerrormsg": "Bilo je problema sa povezivanjem na sajt. Proverite vezu i pokušajte ponovo.", "never": "Nikad", "next": "Sledeći", "no": "Ne", diff --git a/www/core/lang/tr.json b/www/core/lang/tr.json index abf9c0a88d4..bf24a08c858 100644 --- a/www/core/lang/tr.json +++ b/www/core/lang/tr.json @@ -102,7 +102,7 @@ "notice": "Uyarı", "now": "şimdi", "numwords": "{{$a}} kelime", - "offline": "Online gönderim gerekli değil", + "offline": "Çevrimdışı", "online": "Çevrimiçi", "openinbrowser": "Tarayıcıda aç", "othergroups": "Diğer gruplar", @@ -114,7 +114,7 @@ "required": "Gerekli", "save": "Kaydet", "search": "Arama...", - "searching": "Aranan", + "searching": "Aranıyor", "searchresults": "Arama sonuçları", "sec": "sn", "secs": "sn", diff --git a/www/core/lang/zh-tw.json b/www/core/lang/zh-tw.json index 5144e85b257..50105704266 100644 --- a/www/core/lang/zh-tw.json +++ b/www/core/lang/zh-tw.json @@ -82,7 +82,7 @@ "humanreadablesize": "{{size}} {{unit}}", "image": "圖片", "imageviewer": "影像檢視器", - "info": "資訊", + "info": "資料", "ios": "iOS", "labelsep": ":", "lastmodified": "最後修改", @@ -129,7 +129,7 @@ "nocomments": "沒有評論", "nograde": "沒有成績。", "none": "沒有", - "nopasswordchangeforced": "沒有修改密碼前您無法處理,這裡沒有提供可以變更的頁面,請聯絡您的Moodle管理員。", + "nopasswordchangeforced": "你若沒有更新密碼無法進行此處理", "nopermissions": "抱歉,但是您目前沒有權限執行({{$a}})", "noresults": "沒有結果", "notapplicable": "n/a", @@ -137,8 +137,8 @@ "notsent": "沒有傳送", "now": "現在", "numwords": "{{$a}}字數", - "offline": "不需要線上繳交", - "online": "在線上", + "offline": "離線", + "online": "上線", "openfullimage": "點擊這裡以圖像原尺寸顯示", "openinbrowser": "以瀏覽器開啟", "othergroups": "其他群組", @@ -155,13 +155,13 @@ "retry": "重試", "save": "儲存", "search": "搜尋中...", - "searching": "搜尋", + "searching": "搜尋中", "searchresults": "搜尋結果", "sec": "秒", "secs": "秒", "seemoredetail": "按此以觀看更多細節", "send": "送出", - "sending": "正在傳送", + "sending": "傳送中", "serverconnection": "連結到伺服器時發生錯誤", "show": "顯示", "showmore": "顯示更多...", @@ -187,7 +187,7 @@ "twoparagraphs": "{{p1}}

    {{p2}}", "uhoh": "噢哦!", "unexpectederror": "無法預期的錯誤. 請關閉並重新開啟應用程式, 再試一次.", - "unknown": "未知的", + "unknown": "未知", "unlimited": "無限制", "unzipping": "解壓縮中", "upgraderunning": "網站正在升級中,請稍後再試。", From d1d53d1912c96e909a3b7841e0c793c81fd72f12 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 28 Jul 2017 08:49:42 +0200 Subject: [PATCH 109/118] MOBILE-2178 database: Show offline new entries if no online --- www/addons/mod/data/controllers/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/addons/mod/data/controllers/index.js b/www/addons/mod/data/controllers/index.js index 168499440ce..16d48783748 100644 --- a/www/addons/mod/data/controllers/index.js +++ b/www/addons/mod/data/controllers/index.js @@ -191,7 +191,7 @@ angular.module('mm.addons.mod_data') } }).then(function(entries) { var numEntries = (entries && entries.entries && entries.entries.length) || 0; - $scope.isEmpty = !numEntries && Object.keys($scope.offlineActions).length <= 0; + $scope.isEmpty = !numEntries && !Object.keys($scope.offlineActions).length && !Object.keys($scope.offlineEntries).length; $scope.hasNextPage = numEntries >= mmaModDataPerPage && (($scope.search.page + 1) * mmaModDataPerPage) < entries.totalcount; $scope.entriesRendered = ""; From 8222b41ab6f5017b6ed66559ab76afacede67477 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 28 Jul 2017 12:06:42 +0200 Subject: [PATCH 110/118] MOBILE-2178 ionic: Fix keyboard hiding deep input elements --- www/core/main.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/www/core/main.js b/www/core/main.js index 289fb5aef6c..7889fd96dfa 100644 --- a/www/core/main.js +++ b/www/core/main.js @@ -287,11 +287,12 @@ angular.module('mm.core', ['pascalprecht.translate']) } }); - if (!$mmApp.isDevice()) { - // Re-define getParentOrSelfWithClass to change the default value of the depth param. - // This is to allow scrolling with trackpad when hovering deep elements. - var originalFunction = ionic.DomUtil.getParentOrSelfWithClass; - ionic.DomUtil.getParentOrSelfWithClass = function(e, className, depth) { + // In desktop, re-define getParentOrSelfWithClass to allow scrolling with trackpad when hovering deep elements. + // In iOS, re-define getParentWithClass to prevent the keyboard to hide deep input elements. + var fnName = !$mmApp.isDevice() ? 'getParentOrSelfWithClass' : (ionic.Platform.isIOS() ? 'getParentWithClass' : ''); + if (fnName) { + var originalFunction = ionic.DomUtil[fnName]; + ionic.DomUtil[fnName] = function(e, className, depth) { depth = depth || 20; return originalFunction(e, className, depth); }; From b02a850f218452e14d26551f7ca7a0583fc57804 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 28 Jul 2017 12:54:24 +0200 Subject: [PATCH 111/118] MOBILE-2178 database: Show comments in single view --- www/addons/mod/data/controllers/entry.js | 1 + www/addons/mod/data/directives/action.js | 3 ++- www/addons/mod/data/services/helper.js | 6 ++++-- www/addons/mod/data/templates/action.html | 2 +- www/addons/mod/data/templates/entry.html | 1 + www/core/components/comments/services/comments.js | 4 ++-- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index be4b8fdea49..5d2f448722a 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -109,6 +109,7 @@ angular.module('mm.addons.mod_data') var actions = $mmaModDataHelper.getActions(data, access, $scope.entry); $scope.entryRendered = $mmaModDataHelper.displayShowFields(data.singletemplate, $scope.fields, entryId, 'show', actions); + $scope.showComments = actions.comments; return $mmaModDataHelper.getPageInfoByEntry(data.id, entryId, $scope.selectedGroup).then(function(result) { $scope.previousId = result.previousId; diff --git a/www/addons/mod/data/directives/action.js b/www/addons/mod/data/directives/action.js index c934ee8d8c8..747edede8f9 100644 --- a/www/addons/mod/data/directives/action.js +++ b/www/addons/mod/data/directives/action.js @@ -28,7 +28,8 @@ angular.module('mm.addons.mod_data') scope: { action: '@', database: '=', - entry: '=?' + entry: '=?', + mode: '@' }, templateUrl: 'addons/mod/data/templates/action.html', link: function(scope) { diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 437cc323324..606c63d591c 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -58,7 +58,8 @@ angular.module('mm.addons.mod_data') replace = new RegExp(replace, 'gi'); // Replace field by a generic directive. - render = ''; + render = ''; template = template.replace(replace, render); }); @@ -69,7 +70,8 @@ angular.module('mm.addons.mod_data') // Render more url directly because it can be part of an HTML attribute. render = $mmSite.getURL() + '/mod/data/view.php?d={{data.id}}&rid=' + entryId; } else { - render = ''; + render = ''; } template = template.replace(replace, render); } else { diff --git a/www/addons/mod/data/templates/action.html b/www/addons/mod/data/templates/action.html index 1675b58fe80..e0e34ec144e 100644 --- a/www/addons/mod/data/templates/action.html +++ b/www/addons/mod/data/templates/action.html @@ -5,7 +5,7 @@ - + {{url}}/mod/data/view.php?d={{entry.dataid}}&rid={{entry.id}} {{ entry.timecreated * 1000 | mmFormatDate:"dffulldate" }} diff --git a/www/addons/mod/data/templates/entry.html b/www/addons/mod/data/templates/entry.html index e24fee064a2..65dd300b012 100644 --- a/www/addons/mod/data/templates/entry.html +++ b/www/addons/mod/data/templates/entry.html @@ -30,6 +30,7 @@ {{ entryRendered }}

    +