From ea380b2918b298259f7f45a3e4671f50d89e6c13 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 5 Jul 2017 17:37:12 +0200 Subject: [PATCH] Allow apps to specify locale for localisation Signed-off-by: Thomas Citharel --- lib/private/L10N/Factory.php | 5 +++-- lib/private/L10N/L10N.php | 39 ++++++++++++++++++++++++++---------- lib/public/IL10N.php | 9 +++++++++ 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/lib/private/L10N/Factory.php b/lib/private/L10N/Factory.php index e8a734f412..c84bc53f9e 100644 --- a/lib/private/L10N/Factory.php +++ b/lib/private/L10N/Factory.php @@ -97,9 +97,10 @@ class Factory implements IFactory { * * @param string $app * @param string|null $lang + * @param string|null $locale * @return \OCP\IL10N */ - public function get($app, $lang = null) { + public function get($app, $lang = null, $locale = null) { $app = \OC_App::cleanAppId($app); if ($lang !== null) { $lang = str_replace(array('\0', '/', '\\', '..'), '', (string) $lang); @@ -116,7 +117,7 @@ class Factory implements IFactory { if (!isset($this->instances[$lang][$app])) { $this->instances[$lang][$app] = new L10N( - $this, $app, $lang, + $this, $app, $lang, $locale, $this->getL10nFilesForApp($app, $lang) ); } diff --git a/lib/private/L10N/L10N.php b/lib/private/L10N/L10N.php index a9b1b7377a..7087fcae04 100644 --- a/lib/private/L10N/L10N.php +++ b/lib/private/L10N/L10N.php @@ -5,6 +5,7 @@ declare(strict_types=1); * * @author Georg Ehrke * @author Joas Schilling + * @author Thomas Citharel * @author Roeland Jago Douma * * @license AGPL-3.0 @@ -41,6 +42,9 @@ class L10N implements IL10N { /** @var string Language of this object */ protected $lang; + /** @var string Locale of this object */ + protected $locale; + /** @var string Plural forms (string) */ private $pluralFormString = 'nplurals=2; plural=(n != 1);'; @@ -54,12 +58,14 @@ class L10N implements IL10N { * @param IFactory $factory * @param string $app * @param string $lang + * @param string $locale * @param array $files */ - public function __construct(IFactory $factory, $app, $lang, array $files) { + public function __construct(IFactory $factory, $app, $lang, $locale, array $files) { $this->factory = $factory; $this->app = $app; $this->lang = $lang; + $this->locale = $locale; foreach ($files as $languageFile) { $this->load($languageFile); @@ -75,6 +81,15 @@ class L10N implements IL10N { return $this->lang; } + /** + * The code (en_US, fr_CA, ...) of the locale that is used for this instance + * + * @return string locale + */ + public function getLocaleCode() { + return $this->locale; + } + /** * Translating * @param string $text The text we need a translation for @@ -143,17 +158,19 @@ class L10N implements IL10N { * - jsdate: Returns the short JS date format */ public function l(string $type, $data = null, array $options = []) { - // Use the language of the instance - $locale = $this->getLanguageCode(); - if ($locale === 'sr@latin') { - $locale = 'sr_latn'; + if (null === $this->locale) { + // Use the language of the instance + $this->locale = $this->getLanguageCode(); + } + if ($this->locale === 'sr@latin') { + $this->locale = 'sr_latn'; } if ($type === 'firstday') { - return (int) Calendar::getFirstWeekday($locale); + return (int) Calendar::getFirstWeekday($this->locale); } if ($type === 'jsdate') { - return (string) Calendar::getDateFormat('short', $locale); + return (string) Calendar::getDateFormat('short', $this->locale); } $value = new \DateTime(); @@ -171,13 +188,13 @@ class L10N implements IL10N { $width = $options['width']; switch ($type) { case 'date': - return (string) Calendar::formatDate($value, $width, $locale); + return (string) Calendar::formatDate($value, $width, $this->locale); case 'datetime': - return (string) Calendar::formatDatetime($value, $width, $locale); + return (string) Calendar::formatDatetime($value, $width, $this->locale); case 'time': - return (string) Calendar::formatTime($value, $width, $locale); + return (string) Calendar::formatTime($value, $width, $this->locale); case 'weekdayName': - return (string) Calendar::getWeekdayName($value, $width, $locale); + return (string) Calendar::getWeekdayName($value, $width, $this->locale); default: return false; } diff --git a/lib/public/IL10N.php b/lib/public/IL10N.php index 2e55c151f6..43d19059d9 100644 --- a/lib/public/IL10N.php +++ b/lib/public/IL10N.php @@ -8,6 +8,7 @@ declare(strict_types=1); * @author Joas Schilling * @author Morris Jobke * @author Roeland Jago Douma + * @author Thomas Citharel * * @license AGPL-3.0 * @@ -107,4 +108,12 @@ interface IL10N { * @since 7.0.0 */ public function getLanguageCode(): string ; + + /** + * * The code (en_US, fr_CA, ...) of the locale that is used for this IL10N object + * + * @return string locale + * @since 13.0.0 + */ + public function getLocaleCode(); }