diff --git a/core/js/l10n.js b/core/js/l10n.js index fb93d7b789..c19f523b30 100644 --- a/core/js/l10n.js +++ b/core/js/l10n.js @@ -66,13 +66,21 @@ OC.L10N = { * @param {Function|String} [pluralForm] optional plural function or plural string */ register: function(appName, bundle, pluralForm) { - this._bundles[appName] = bundle || {}; + var self = this; + if (_.isUndefined(this._bundles[appName])) { + this._bundles[appName] = bundle || {}; - if (_.isFunction(pluralForm)) { - this._pluralFunctions[appName] = pluralForm; + if (_.isFunction(pluralForm)) { + this._pluralFunctions[appName] = pluralForm; + } else { + // generate plural function based on form + this._pluralFunctions[appName] = this._generatePluralFunction(pluralForm); + } } else { - // generate plural function based on form - this._pluralFunctions[appName] = this._generatePluralFunction(pluralForm); + // Theme overwriting the default language + _.each(bundle, function(translation, key) { + self._bundles[appName][key] = translation + }); } }, diff --git a/lib/private/template/jsresourcelocator.php b/lib/private/template/jsresourcelocator.php index 4df1ac8c7f..6ea7b6291c 100644 --- a/lib/private/template/jsresourcelocator.php +++ b/lib/private/template/jsresourcelocator.php @@ -31,8 +31,24 @@ class JSResourceLocator extends ResourceLocator { public function doFind($script) { $theme_dir = 'themes/'.$this->theme.'/'; if (strpos($script, '3rdparty') === 0 - && $this->appendIfExist($this->thirdpartyroot, $script.'.js') - || $this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$script.'.js') + && $this->appendIfExist($this->thirdpartyroot, $script.'.js')) { + return; + } + + if (strpos($script, '/l10n/') !== false) { + // For language files we try to load them all, so themes can overwrite + // single l10n strings without having to translate all of them. + $found = 0; + $found += $this->appendIfExist($this->serverroot, 'core/'.$script.'.js'); + $found += $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$script.'.js'); + $found += $this->appendIfExist($this->serverroot, $script.'.js'); + $found += $this->appendIfExist($this->serverroot, $theme_dir.$script.'.js'); + $found += $this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$script.'.js'); + + if ($found) { + return; + } + } else if ($this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$script.'.js') || $this->appendIfExist($this->serverroot, $theme_dir.$script.'.js') || $this->appendIfExist($this->serverroot, $script.'.js') || $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$script.'.js') @@ -40,6 +56,7 @@ class JSResourceLocator extends ResourceLocator { ) { return; } + $app = substr($script, 0, strpos($script, '/')); $script = substr($script, strpos($script, '/')+1); $app_path = \OC_App::getAppPath($app);