|  |  | @ -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 | 
			
		
	
	
		
			
				
					|  |  | @ -251,6 +293,24 @@ class Factory implements IFactory { | 
			
		
	
		
			
				
					|  |  |  | 		return array_search($lang, $languages) !== false; | 
			
		
	
		
			
				
					|  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	/** | 
			
		
	
		
			
				
					|  |  |  | 	 * @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 | 
			
		
	
	
		
			
				
					|  |  | 
 |