summaryrefslogtreecommitdiffstats
path: root/lib/private/L10N/Factory.php
diff options
context:
space:
mode:
authorThomas Citharel <tcit@tcit.fr>2017-07-07 11:17:54 +0200
committerGeorg Ehrke <developer@georgehrke.com>2018-06-27 13:19:21 +0200
commit4a9f8623b50ab0ba6a7fd411c0750a6bd5f63c14 (patch)
treeab2a2fc068236db4a415391275ddf6dab75ea485 /lib/private/L10N/Factory.php
parent93011579fe27624ed746b54f1094da556d019f5a (diff)
downloadnextcloud-server-4a9f8623b50ab0ba6a7fd411c0750a6bd5f63c14.tar.gz
nextcloud-server-4a9f8623b50ab0ba6a7fd411c0750a6bd5f63c14.zip
Fix review & tests
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
Diffstat (limited to 'lib/private/L10N/Factory.php')
-rw-r--r--lib/private/L10N/Factory.php60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/private/L10N/Factory.php b/lib/private/L10N/Factory.php
index c84bc53f9e4..a6b91d53e4f 100644
--- a/lib/private/L10N/Factory.php
+++ b/lib/private/L10N/Factory.php
@@ -115,6 +115,10 @@ class Factory implements IFactory {
$lang = $this->findLanguage($app);
}
+ if ($locale === null || !$this->localeExists($locale)) {
+ $locale = $this->findLocale($app, $lang);
+ }
+
if (!isset($this->instances[$lang][$app])) {
$this->instances[$lang][$app] = new L10N(
$this, $app, $lang, $locale,
@@ -186,6 +190,38 @@ class Factory implements IFactory {
return 'en';
}
+ public function findLocale($app = null, $lang = null)
+ {
+ if ($this->config->getSystemValue('installed', false)) {
+ $userId = null !== $this->userSession->getUser() ? $this->userSession->getUser()->getUID() : null;
+ $userLocale = null;
+ if (null !== $userId) {
+ $userLocale = $this->config->getUserValue($userId, 'core', 'locale', null);
+ }
+ } else {
+ $userId = null;
+ $userLocale = null;
+ }
+
+ if ($userLocale && $this->localeExists($userLocale)) {
+ return $userLocale;
+ }
+
+ // If no user locale set, use lang as locale
+ if (null !== $lang && $this->localeExists($lang)) {
+ return $lang;
+ }
+
+ // Default : use system default locale
+ $defaultLocale = $this->config->getSystemValue('default_locale', false);
+ if ($defaultLocale !== false && $this->localeExists($defaultLocale)) {
+ return $defaultLocale;
+ }
+
+ // At last, return USA
+ return 'en_US';
+ }
+
/**
* Find all available languages for an app
*
@@ -237,6 +273,12 @@ class Factory implements IFactory {
return $available;
}
+ public function findAvailableLocales()
+ {
+ $localeData = file_get_contents(__DIR__ . '/locales.json');
+ return json_decode($localeData, true);
+ }
+
/**
* @param string|null $app App id or null for core
* @param string $lang
@@ -252,6 +294,24 @@ class Factory implements IFactory {
}
/**
+ * @param string $locale
+ * @return bool
+ */
+ public function localeExists($locale) {
+ if ($locale === 'en') { //english is always available
+ return true;
+ }
+
+ $locales = $this->findAvailableLocales();
+
+ $userLocale = array_filter($locales, function($value) use ($locale) {
+ return $locale === $value['code'];
+ });
+
+ return !empty($userLocale);
+ }
+
+ /**
* @param string|null $app
* @return string
* @throws LanguageNotFoundException