Merge pull request #5623 from nextcloud/locale-setting
Add user locale/region setting
This commit is contained in:
commit
61842f66ee
|
@ -123,6 +123,7 @@ abstract class AUserData extends OCSController {
|
|||
$data[AccountManager::PROPERTY_TWITTER] = $userAccount[AccountManager::PROPERTY_TWITTER]['value'];
|
||||
$data['groups'] = $gids;
|
||||
$data['language'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'lang');
|
||||
$data['locale'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'locale');
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ declare(strict_types=1);
|
|||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
* @author Tom Needham <tom@owncloud.com>
|
||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||
* @author Thomas Citharel <tcit@tcit.fr>
|
||||
*
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
|
@ -430,6 +431,11 @@ class UsersController extends AUserData {
|
|||
$permittedFields[] = 'language';
|
||||
}
|
||||
|
||||
if ($this->config->getSystemValue('force_locale', false) === false ||
|
||||
$this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
|
||||
$permittedFields[] = 'locale';
|
||||
}
|
||||
|
||||
if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
|
||||
$federatedFileSharing = new \OCA\FederatedFileSharing\AppInfo\Application();
|
||||
$shareProvider = $federatedFileSharing->getFederatedShareProvider();
|
||||
|
@ -456,6 +462,7 @@ class UsersController extends AUserData {
|
|||
$permittedFields[] = AccountManager::PROPERTY_EMAIL;
|
||||
$permittedFields[] = 'password';
|
||||
$permittedFields[] = 'language';
|
||||
$permittedFields[] = 'locale';
|
||||
$permittedFields[] = AccountManager::PROPERTY_PHONE;
|
||||
$permittedFields[] = AccountManager::PROPERTY_ADDRESS;
|
||||
$permittedFields[] = AccountManager::PROPERTY_WEBSITE;
|
||||
|
@ -505,6 +512,12 @@ class UsersController extends AUserData {
|
|||
}
|
||||
$this->config->setUserValue($targetUser->getUID(), 'core', 'lang', $value);
|
||||
break;
|
||||
case 'locale':
|
||||
if (!$this->l10nFactory->localeExists($value)) {
|
||||
throw new OCSException('Invalid locale', 102);
|
||||
}
|
||||
$this->config->setUserValue($targetUser->getUID(), 'core', 'locale', $value);
|
||||
break;
|
||||
case AccountManager::PROPERTY_EMAIL:
|
||||
if (filter_var($value, FILTER_VALIDATE_EMAIL) || $value === '') {
|
||||
$targetUser->setEMailAddress($value);
|
||||
|
|
|
@ -760,7 +760,7 @@ class UsersControllerTest extends TestCase {
|
|||
->method('getBackendClassName')
|
||||
->will($this->returnValue('Database'));
|
||||
$targetUser
|
||||
->expects($this->exactly(5))
|
||||
->expects($this->exactly(6))
|
||||
->method('getUID')
|
||||
->will($this->returnValue('UID'));
|
||||
|
||||
|
@ -780,6 +780,7 @@ class UsersControllerTest extends TestCase {
|
|||
'twitter' => 'twitter',
|
||||
'groups' => ['group0', 'group1', 'group2'],
|
||||
'language' => 'de',
|
||||
'locale' => null,
|
||||
];
|
||||
$this->assertEquals($expected, $this->invokePrivate($this->api, 'getUserData', ['UID']));
|
||||
}
|
||||
|
@ -865,7 +866,7 @@ class UsersControllerTest extends TestCase {
|
|||
->method('getBackendClassName')
|
||||
->will($this->returnValue('Database'));
|
||||
$targetUser
|
||||
->expects($this->exactly(5))
|
||||
->expects($this->exactly(6))
|
||||
->method('getUID')
|
||||
->will($this->returnValue('UID'));
|
||||
$this->accountManager->expects($this->any())->method('getUser')
|
||||
|
@ -895,6 +896,7 @@ class UsersControllerTest extends TestCase {
|
|||
'twitter' => 'twitter',
|
||||
'groups' => [],
|
||||
'language' => 'da',
|
||||
'locale' => null,
|
||||
];
|
||||
$this->assertEquals($expected, $this->invokePrivate($this->api, 'getUserData', ['UID']));
|
||||
}
|
||||
|
@ -1004,7 +1006,7 @@ class UsersControllerTest extends TestCase {
|
|||
->method('getEMailAddress')
|
||||
->will($this->returnValue('subadmin@nextcloud.com'));
|
||||
$targetUser
|
||||
->expects($this->exactly(5))
|
||||
->expects($this->exactly(6))
|
||||
->method('getUID')
|
||||
->will($this->returnValue('UID'));
|
||||
$targetUser
|
||||
|
@ -1050,6 +1052,7 @@ class UsersControllerTest extends TestCase {
|
|||
'twitter' => 'twitter',
|
||||
'groups' => [],
|
||||
'language' => 'ru',
|
||||
'locale' => null,
|
||||
];
|
||||
$this->assertEquals($expected, $this->invokePrivate($this->api, 'getUserData', ['UID']));
|
||||
}
|
||||
|
@ -1236,7 +1239,7 @@ class UsersControllerTest extends TestCase {
|
|||
->with('UserToEdit')
|
||||
->will($this->returnValue($targetUser));
|
||||
$this->groupManager
|
||||
->expects($this->exactly(2))
|
||||
->expects($this->exactly(3))
|
||||
->method('isAdmin')
|
||||
->with('UID')
|
||||
->will($this->returnValue(true));
|
||||
|
@ -1271,7 +1274,7 @@ class UsersControllerTest extends TestCase {
|
|||
->with('UserToEdit')
|
||||
->will($this->returnValue($targetUser));
|
||||
$this->groupManager
|
||||
->expects($this->exactly(2))
|
||||
->expects($this->exactly(3))
|
||||
->method('isAdmin')
|
||||
->with('UID')
|
||||
->will($this->returnValue(true));
|
||||
|
|
|
@ -178,6 +178,29 @@ $CONFIG = array(
|
|||
*/
|
||||
'force_language' => 'en',
|
||||
|
||||
/**
|
||||
* This sets the default locale on your Nextcloud server, using ISO_639
|
||||
* language codes such as ``en`` for English, ``de`` for German, and ``fr`` for
|
||||
* French, and ISO-3166 country codes such as ``GB``, ``US``, ``CA``, as defined
|
||||
* in RFC 5646. It overrides automatic locale detection on public pages like
|
||||
* login or shared items. User's locale preferences configured under "personal
|
||||
* -> locale" override this setting after they have logged in.
|
||||
*
|
||||
* Defaults to ``en``
|
||||
*/
|
||||
'default_locale' => 'en_US',
|
||||
|
||||
/**
|
||||
* With this setting a locale can be forced for all users. If a locale is
|
||||
* forced, the users are also unable to change their locale in the personal
|
||||
* settings. If users shall be unable to change their locale, but users have
|
||||
* different languages, this value can be set to ``true`` instead of a locale
|
||||
* code.
|
||||
*
|
||||
* Defaults to ``false``
|
||||
*/
|
||||
'force_locale' => 'en_US',
|
||||
|
||||
/**
|
||||
* Set the default app to open on login. Use the app names as they appear in the
|
||||
* URL after clicking them in the Apps menu, such as documents, calendar, and
|
||||
|
|
|
@ -402,6 +402,10 @@ img, object, video, button, textarea, input, select, div[contenteditable='true']
|
|||
background-image: url('../img/actions/tag.svg?v=1');
|
||||
}
|
||||
|
||||
.icon-timezone {
|
||||
background-image: url('../img/actions/timezone.svg?v=1');
|
||||
}
|
||||
|
||||
.icon-toggle {
|
||||
background-image: url('../img/actions/toggle.svg?v=1');
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<svg enable-background="new 0 0 15 15" version="1.1" viewBox="0 0 15 15" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
|
||||
<path d="m14.982 7c-0.246-3.744-3.238-6.737-6.982-6.983v-0.017h-1v0.017c-3.744 0.246-6.737 3.239-6.983 6.983h-0.017v1h0.017c0.246 3.744 3.239 6.736 6.983 6.982v0.018h1v-0.018c3.744-0.246 6.736-3.238 6.982-6.982h0.018v-1h-0.018zm-10.287-5.365c-0.483 0.642-0.884 1.447-1.176 2.365h-1.498c0.652-1.017 1.578-1.84 2.674-2.365zm-3.197 3.365h1.758c-0.134 0.632-0.219 1.303-0.246 2h-1.991c0.053-0.704 0.219-1.377 0.479-2zm-0.479 3h1.991c0.027 0.697 0.112 1.368 0.246 2h-1.758c-0.26-0.623-0.426-1.296-0.479-2zm1.002 3h1.497c0.292 0.918 0.693 1.723 1.177 2.365-1.096-0.525-2.022-1.347-2.674-2.365zm4.979 2.936c-1.028-0.275-1.913-1.379-2.45-2.936h2.45v2.936zm0-3.936h-2.731c-0.141-0.623-0.23-1.296-0.259-2h2.99v2zm0-3h-2.99c0.029-0.704 0.118-1.377 0.259-2h2.731v2zm0-3h-2.45c0.537-1.557 1.422-2.661 2.45-2.935v2.935zm5.979 0h-1.496c-0.293-0.918-0.693-1.723-1.178-2.365 1.095 0.525 2.022 1.348 2.674 2.365zm-4.979-2.935c1.027 0.274 1.913 1.378 2.45 2.935h-2.45v-2.935zm0 3.935h2.73c0.142 0.623 0.229 1.296 0.26 2h-2.99v-2zm0 3h2.99c-0.029 0.704-0.118 1.377-0.26 2h-2.73v-2zm0 5.936v-2.936h2.45c-0.537 1.557-1.423 2.661-2.45 2.936zm2.305-0.571c0.483-0.643 0.885-1.447 1.178-2.365h1.496c-0.652 1.018-1.579 1.84-2.674 2.365zm3.197-3.365h-1.758c0.134-0.632 0.219-1.303 0.246-2h1.99c-0.052 0.704-0.218 1.377-0.478 2zm-1.512-3c-0.027-0.697-0.112-1.368-0.246-2h1.758c0.26 0.623 0.426 1.296 0.479 2h-1.991z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -791,6 +791,15 @@ var OCP = {},
|
|||
* @return {String} locale string
|
||||
*/
|
||||
getLocale: function() {
|
||||
return $('html').data('locale');
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the user's language
|
||||
*
|
||||
* @returns {String} language string
|
||||
*/
|
||||
getLanguage: function () {
|
||||
return $('html').prop('lang');
|
||||
},
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" >
|
||||
<html class="ng-csp" data-placeholder-focus="false" lang="<?php p($_['language']); ?>" data-locale="<?php p($_['locale']); ?>" >
|
||||
<head data-user="<?php p($_['user_uid']); ?>" data-user-displayname="<?php p($_['user_displayname']); ?>" data-requesttoken="<?php p($_['requesttoken']); ?>">
|
||||
<meta charset="utf-8">
|
||||
<title>
|
||||
|
|
|
@ -54,6 +54,11 @@ class Factory implements IFactory {
|
|||
*/
|
||||
protected $availableLanguages = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $availableLocales = [];
|
||||
|
||||
/**
|
||||
* @var array Structure: string => callable
|
||||
*/
|
||||
|
@ -97,9 +102,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);
|
||||
|
@ -110,13 +116,22 @@ class Factory implements IFactory {
|
|||
$lang = $forceLang;
|
||||
}
|
||||
|
||||
$forceLocale = $this->config->getSystemValue('force_locale', false);
|
||||
if (is_string($forceLocale)) {
|
||||
$locale = $forceLocale;
|
||||
}
|
||||
|
||||
if ($lang === null || !$this->languageExists($app, $lang)) {
|
||||
$lang = $this->findLanguage($app);
|
||||
}
|
||||
|
||||
if ($locale === null || !$this->localeExists($locale)) {
|
||||
$locale = $this->findLocale($lang);
|
||||
}
|
||||
|
||||
if (!isset($this->instances[$lang][$app])) {
|
||||
$this->instances[$lang][$app] = new L10N(
|
||||
$this, $app, $lang,
|
||||
$this, $app, $lang, $locale,
|
||||
$this->getL10nFilesForApp($app, $lang)
|
||||
);
|
||||
}
|
||||
|
@ -185,6 +200,48 @@ class Factory implements IFactory {
|
|||
return 'en';
|
||||
}
|
||||
|
||||
/**
|
||||
* find the best locale
|
||||
*
|
||||
* @param string $lang
|
||||
* @return null|string
|
||||
*/
|
||||
public function findLocale($lang = null) {
|
||||
$forceLocale = $this->config->getSystemValue('force_locale', false);
|
||||
if (is_string($forceLocale) && $this->localeExists($forceLocale)) {
|
||||
return $forceLocale;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Default : use system default locale
|
||||
$defaultLocale = $this->config->getSystemValue('default_locale', false);
|
||||
if ($defaultLocale !== false && $this->localeExists($defaultLocale)) {
|
||||
return $defaultLocale;
|
||||
}
|
||||
|
||||
// If no user locale set, use lang as locale
|
||||
if (null !== $lang && $this->localeExists($lang)) {
|
||||
return $lang;
|
||||
}
|
||||
|
||||
// At last, return USA
|
||||
return 'en_US';
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all available languages for an app
|
||||
*
|
||||
|
@ -236,6 +293,20 @@ class Factory implements IFactory {
|
|||
return $available;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array|mixed
|
||||
*/
|
||||
public function findAvailableLocales() {
|
||||
if (!empty($this->availableLocales)) {
|
||||
return $this->availableLocales;
|
||||
}
|
||||
|
||||
$localeData = file_get_contents(\OC::$SERVERROOT . '/resources/locales.json');
|
||||
$this->availableLocales = \json_decode($localeData, true);
|
||||
|
||||
return $this->availableLocales;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|null $app App id or null for core
|
||||
* @param string $lang
|
||||
|
@ -250,6 +321,23 @@ 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
|
||||
|
|
|
@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||
*
|
||||
* @author Georg Ehrke <oc.list@georgehrke.com>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Thomas Citharel <tcit@tcit.fr>
|
||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||
*
|
||||
* @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(): string {
|
||||
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 = []) {
|
||||
if (null === $this->locale) {
|
||||
// Use the language of the instance
|
||||
$locale = $this->getLanguageCode();
|
||||
if ($locale === 'sr@latin') {
|
||||
$locale = 'sr_latn';
|
||||
$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;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*
|
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
* @author Morris Jobke <hey@morrisjobke.de>
|
||||
* @author Thomas Citharel <tcit@tcit.fr>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -106,6 +107,7 @@ class PersonalInfo implements ISettings {
|
|||
}
|
||||
|
||||
$languageParameters = $this->getLanguages($user);
|
||||
$localeParameters = $this->getLocales($user);
|
||||
$messageParameters = $this->getMessageParameters($userData);
|
||||
|
||||
$parameters = [
|
||||
|
@ -134,7 +136,7 @@ class PersonalInfo implements ISettings {
|
|||
'twitterVerification' => $userData[AccountManager::PROPERTY_TWITTER]['verified'],
|
||||
'groups' => $this->getGroups($user),
|
||||
'passwordChangeSupported' => $user->canChangePassword(),
|
||||
] + $messageParameters + $languageParameters;
|
||||
] + $messageParameters + $languageParameters + $localeParameters;
|
||||
|
||||
|
||||
return new TemplateResponse('settings', 'settings/personal/personal.info', $parameters, '');
|
||||
|
@ -218,6 +220,41 @@ class PersonalInfo implements ISettings {
|
|||
);
|
||||
}
|
||||
|
||||
private function getLocales(IUser $user) {
|
||||
$forceLanguage = $this->config->getSystemValue('force_locale', false);
|
||||
if($forceLanguage !== false) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$uid = $user->getUID();
|
||||
|
||||
$userLocaleString = $this->config->getUserValue($uid, 'core', 'locale', 'en_US');
|
||||
|
||||
$userLang = $this->config->getUserValue($uid, 'core', 'lang', $this->l10nFactory->findLanguage());
|
||||
|
||||
$localeCodes = $this->l10nFactory->findAvailableLocales();
|
||||
|
||||
$userLocale = array_filter($localeCodes, function($value) use ($userLocaleString) {
|
||||
return $userLocaleString === $value['code'];
|
||||
});
|
||||
|
||||
if (!empty($userLocale))
|
||||
{
|
||||
$userLocale = reset($userLocale);
|
||||
}
|
||||
|
||||
$localesForLanguage = array_filter($localeCodes, function($localeCode) use ($userLang) {
|
||||
return 0 === strpos($localeCode['code'], $userLang);
|
||||
});
|
||||
|
||||
return [
|
||||
'activelocaleLang' => $userLocaleString,
|
||||
'activelocale' => $userLocale,
|
||||
'locales' => $localeCodes,
|
||||
'localesForLanguage' => $localesForLanguage,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $userData
|
||||
* @return array
|
||||
|
|
|
@ -131,10 +131,11 @@ class TemplateLayout extends \OC_Template {
|
|||
parent::__construct('core', 'layout.base');
|
||||
|
||||
}
|
||||
// Send the language to our layouts
|
||||
// Send the language and the locale to our layouts
|
||||
$lang = \OC::$server->getL10NFactory()->findLanguage();
|
||||
$lang = str_replace('_', '-', $lang);
|
||||
$this->assign('language', $lang);
|
||||
$this->assign('locale', \OC::$server->getL10NFactory()->findLocale($lang));
|
||||
|
||||
if(\OC::$server->getSystemConfig()->getValue('installed', false)) {
|
||||
if (empty(self::$versionHash)) {
|
||||
|
|
|
@ -8,6 +8,7 @@ declare(strict_types=1);
|
|||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Morris Jobke <hey@morrisjobke.de>
|
||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||
* @author Thomas Citharel <tcit@tcit.fr>
|
||||
*
|
||||
* @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 14.0.0
|
||||
*/
|
||||
public function getLocaleCode(): string;
|
||||
}
|
||||
|
|
|
@ -44,6 +44,13 @@ interface IFactory {
|
|||
*/
|
||||
public function findLanguage($app = null);
|
||||
|
||||
/**
|
||||
* @param string|null $lang user language as default locale
|
||||
* @return string locale If nothing works it returns 'en_US'
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function findLocale($lang = null);
|
||||
|
||||
/**
|
||||
* Find all available languages for an app
|
||||
*
|
||||
|
@ -53,6 +60,12 @@ interface IFactory {
|
|||
*/
|
||||
public function findAvailableLanguages($app = null);
|
||||
|
||||
/**
|
||||
* @return array an array of available
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function findAvailableLocales();
|
||||
|
||||
/**
|
||||
* @param string|null $app App id or null for core
|
||||
* @param string $lang
|
||||
|
@ -60,4 +73,20 @@ interface IFactory {
|
|||
* @since 9.0.0
|
||||
*/
|
||||
public function languageExists($app, $lang);
|
||||
|
||||
/**
|
||||
* @param string $locale
|
||||
* @return bool
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function localeExists($locale);
|
||||
|
||||
/**
|
||||
* Creates a function from the plural string
|
||||
*
|
||||
* @param string $string
|
||||
* @return string Unique function name
|
||||
* @since 14.0.0
|
||||
*/
|
||||
public function createPluralFunction($string);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,436 @@
|
|||
[
|
||||
{ "code":"af_NA", "name":"Afrikaans (Namibia)"},
|
||||
{ "code":"af_ZA", "name":"Afrikaans (South Africa)"},
|
||||
{ "code":"af", "name":"Afrikaans"},
|
||||
{ "code":"ak_GH", "name":"Akan (Ghana)"},
|
||||
{ "code":"ak", "name":"Akan"},
|
||||
{ "code":"sq_AL", "name":"Albanian (Albania)"},
|
||||
{ "code":"sq", "name":"Albanian"},
|
||||
{ "code":"am_ET", "name":"Amharic (Ethiopia)"},
|
||||
{ "code":"am", "name":"Amharic"},
|
||||
{ "code":"ar_DZ", "name":"Arabic (Algeria)"},
|
||||
{ "code":"ar_BH", "name":"Arabic (Bahrain)"},
|
||||
{ "code":"ar_EG", "name":"Arabic (Egypt)"},
|
||||
{ "code":"ar_IQ", "name":"Arabic (Iraq)"},
|
||||
{ "code":"ar_JO", "name":"Arabic (Jordan)"},
|
||||
{ "code":"ar_KW", "name":"Arabic (Kuwait)"},
|
||||
{ "code":"ar_LB", "name":"Arabic (Lebanon)"},
|
||||
{ "code":"ar_LY", "name":"Arabic (Libya)"},
|
||||
{ "code":"ar_MA", "name":"Arabic (Morocco)"},
|
||||
{ "code":"ar_OM", "name":"Arabic (Oman)"},
|
||||
{ "code":"ar_QA", "name":"Arabic (Qatar)"},
|
||||
{ "code":"ar_SA", "name":"Arabic (Saudi Arabia)"},
|
||||
{ "code":"ar_SD", "name":"Arabic (Sudan)"},
|
||||
{ "code":"ar_SY", "name":"Arabic (Syria)"},
|
||||
{ "code":"ar_TN", "name":"Arabic (Tunisia)"},
|
||||
{ "code":"ar_AE", "name":"Arabic (United Arab Emirates)"},
|
||||
{ "code":"ar_YE", "name":"Arabic (Yemen)"},
|
||||
{ "code":"ar", "name":"Arabic"},
|
||||
{ "code":"hy_AM", "name":"Armenian (Armenia)"},
|
||||
{ "code":"hy", "name":"Armenian"},
|
||||
{ "code":"as_IN", "name":"Assamese (India)"},
|
||||
{ "code":"as", "name":"Assamese"},
|
||||
{ "code":"asa_TZ", "name":"Asu (Tanzania)"},
|
||||
{ "code":"asa", "name":"Asu"},
|
||||
{ "code":"az_Cyrl", "name":"Azerbaijani (Cyrillic)"},
|
||||
{ "code":"az_Cyrl_AZ", "name":"Azerbaijani (Cyrillic, Azerbaijan)"},
|
||||
{ "code":"az_Latn", "name":"Azerbaijani (Latin)"},
|
||||
{ "code":"az_Latn_AZ", "name":"Azerbaijani (Latin, Azerbaijan)"},
|
||||
{ "code":"az", "name":"Azerbaijani"},
|
||||
{ "code":"bm_ML", "name":"Bambara (Mali)"},
|
||||
{ "code":"bm", "name":"Bambara"},
|
||||
{ "code":"eu_ES", "name":"Basque (Spain)"},
|
||||
{ "code":"eu", "name":"Basque"},
|
||||
{ "code":"be_BY", "name":"Belarusian (Belarus)"},
|
||||
{ "code":"be", "name":"Belarusian"},
|
||||
{ "code":"bem_ZM", "name":"Bemba (Zambia)"},
|
||||
{ "code":"bem", "name":"Bemba"},
|
||||
{ "code":"bez_TZ", "name":"Bena (Tanzania)"},
|
||||
{ "code":"bez", "name":"Bena"},
|
||||
{ "code":"bn_BD", "name":"Bengali (Bangladesh)"},
|
||||
{ "code":"bn_IN", "name":"Bengali (India)"},
|
||||
{ "code":"bn", "name":"Bengali"},
|
||||
{ "code":"bs_BA", "name":"Bosnian (Bosnia and Herzegovina)"},
|
||||
{ "code":"bs", "name":"Bosnian"},
|
||||
{ "code":"bg_BG", "name":"Bulgarian (Bulgaria)"},
|
||||
{ "code":"bg", "name":"Bulgarian"},
|
||||
{ "code":"my_MM", "name":"Burmese (Myanmar [Burma])"},
|
||||
{ "code":"my", "name":"Burmese"},
|
||||
{ "code":"ca_ES", "name":"Catalan (Spain)"},
|
||||
{ "code":"ca", "name":"Catalan"},
|
||||
{ "code":"tzm_Latn", "name":"Central Morocco Tamazight (Latin)"},
|
||||
{ "code":"tzm_Latn_MA", "name":"Central Morocco Tamazight (Latin, Morocco)"},
|
||||
{ "code":"tzm", "name":"Central Morocco Tamazight"},
|
||||
{ "code":"chr_US", "name":"Cherokee (United States)"},
|
||||
{ "code":"chr", "name":"Cherokee"},
|
||||
{ "code":"cgg_UG", "name":"Chiga (Uganda)"},
|
||||
{ "code":"cgg", "name":"Chiga"},
|
||||
{ "code":"zh_Hans", "name":"Chinese (Simplified Han)"},
|
||||
{ "code":"zh_Hans_CN", "name":"Chinese (Simplified Han, China)"},
|
||||
{ "code":"zh_Hans_HK", "name":"Chinese (Simplified Han, Hong Kong SAR China)"},
|
||||
{ "code":"zh_Hans_MO", "name":"Chinese (Simplified Han, Macau SAR China)"},
|
||||
{ "code":"zh_Hans_SG", "name":"Chinese (Simplified Han, Singapore)"},
|
||||
{ "code":"zh_Hant", "name":"Chinese (Traditional Han)"},
|
||||
{ "code":"zh_Hant_HK", "name":"Chinese (Traditional Han, Hong Kong SAR China)"},
|
||||
{ "code":"zh_Hant_MO", "name":"Chinese (Traditional Han, Macau SAR China)"},
|
||||
{ "code":"zh_Hant_TW", "name":"Chinese (Traditional Han, Taiwan)"},
|
||||
{ "code":"zh", "name":"Chinese"},
|
||||
{ "code":"kw_GB", "name":"Cornish (United Kingdom)"},
|
||||
{ "code":"kw", "name":"Cornish"},
|
||||
{ "code":"hr_HR", "name":"Croatian (Croatia)"},
|
||||
{ "code":"hr", "name":"Croatian"},
|
||||
{ "code":"cs_CZ", "name":"Czech (Czech Republic)"},
|
||||
{ "code":"cs", "name":"Czech"},
|
||||
{ "code":"da_DK", "name":"Danish (Denmark)"},
|
||||
{ "code":"da", "name":"Danish"},
|
||||
{ "code":"nl_BE", "name":"Dutch (Belgium)"},
|
||||
{ "code":"nl_NL", "name":"Dutch (Netherlands)"},
|
||||
{ "code":"nl", "name":"Dutch"},
|
||||
{ "code":"ebu_KE", "name":"Embu (Kenya)"},
|
||||
{ "code":"ebu", "name":"Embu"},
|
||||
{ "code":"en_AS", "name":"English (American Samoa)"},
|
||||
{ "code":"en_AU", "name":"English (Australia)"},
|
||||
{ "code":"en_BE", "name":"English (Belgium)"},
|
||||
{ "code":"en_BZ", "name":"English (Belize)"},
|
||||
{ "code":"en_BW", "name":"English (Botswana)"},
|
||||
{ "code":"en_CA", "name":"English (Canada)"},
|
||||
{ "code":"en_GU", "name":"English (Guam)"},
|
||||
{ "code":"en_HK", "name":"English (Hong Kong SAR China)"},
|
||||
{ "code":"en_IN", "name":"English (India)"},
|
||||
{ "code":"en_IE", "name":"English (Ireland)"},
|
||||
{ "code":"en_JM", "name":"English (Jamaica)"},
|
||||
{ "code":"en_MT", "name":"English (Malta)"},
|
||||
{ "code":"en_MH", "name":"English (Marshall Islands)"},
|
||||
{ "code":"en_MU", "name":"English (Mauritius)"},
|
||||
{ "code":"en_NA", "name":"English (Namibia)"},
|
||||
{ "code":"en_NZ", "name":"English (New Zealand)"},
|
||||
{ "code":"en_MP", "name":"English (Northern Mariana Islands)"},
|
||||
{ "code":"en_PK", "name":"English (Pakistan)"},
|
||||
{ "code":"en_PH", "name":"English (Philippines)"},
|
||||
{ "code":"en_SG", "name":"English (Singapore)"},
|
||||
{ "code":"en_ZA", "name":"English (South Africa)"},
|
||||
{ "code":"en_TT", "name":"English (Trinidad and Tobago)"},
|
||||
{ "code":"en_UM", "name":"English (U.S. Minor Outlying Islands)"},
|
||||
{ "code":"en_VI", "name":"English (U.S. Virgin Islands)"},
|
||||
{ "code":"en_GB", "name":"English (United Kingdom)"},
|
||||
{ "code":"en_US", "name":"English (United States)"},
|
||||
{ "code":"en_ZW", "name":"English (Zimbabwe)"},
|
||||
{ "code":"en", "name":"English"},
|
||||
{ "code":"eo", "name":"Esperanto"},
|
||||
{ "code":"et_EE", "name":"Estonian (Estonia)"},
|
||||
{ "code":"et", "name":"Estonian"},
|
||||
{ "code":"ee_GH", "name":"Ewe (Ghana)"},
|
||||
{ "code":"ee_TG", "name":"Ewe (Togo)"},
|
||||
{ "code":"ee", "name":"Ewe"},
|
||||
{ "code":"fo_FO", "name":"Faroese (Faroe Islands)"},
|
||||
{ "code":"fo", "name":"Faroese"},
|
||||
{ "code":"fil_PH", "name":"Filipino (Philippines)"},
|
||||
{ "code":"fil", "name":"Filipino"},
|
||||
{ "code":"fi_FI", "name":"Finnish (Finland)"},
|
||||
{ "code":"fi", "name":"Finnish"},
|
||||
{ "code":"fr_BE", "name":"French (Belgium)"},
|
||||
{ "code":"fr_BJ", "name":"French (Benin)"},
|
||||
{ "code":"fr_BF", "name":"French (Burkina Faso)"},
|
||||
{ "code":"fr_BI", "name":"French (Burundi)"},
|
||||
{ "code":"fr_CM", "name":"French (Cameroon)"},
|
||||
{ "code":"fr_CA", "name":"French (Canada)"},
|
||||
{ "code":"fr_CF", "name":"French (Central African Republic)"},
|
||||
{ "code":"fr_TD", "name":"French (Chad)"},
|
||||
{ "code":"fr_KM", "name":"French (Comoros)"},
|
||||
{ "code":"fr_CG", "name":"French (Congo - Brazzaville)"},
|
||||
{ "code":"fr_CD", "name":"French (Congo - Kinshasa)"},
|
||||
{ "code":"fr_CI", "name":"French (Côte d’Ivoire)"},
|
||||
{ "code":"fr_DJ", "name":"French (Djibouti)"},
|
||||
{ "code":"fr_GQ", "name":"French (Equatorial Guinea)"},
|
||||
{ "code":"fr_FR", "name":"French (France)"},
|
||||
{ "code":"fr_GA", "name":"French (Gabon)"},
|
||||
{ "code":"fr_GP", "name":"French (Guadeloupe)"},
|
||||
{ "code":"fr_GN", "name":"French (Guinea)"},
|
||||
{ "code":"fr_LU", "name":"French (Luxembourg)"},
|
||||
{ "code":"fr_MG", "name":"French (Madagascar)"},
|
||||
{ "code":"fr_ML", "name":"French (Mali)"},
|
||||
{ "code":"fr_MQ", "name":"French (Martinique)"},
|
||||
{ "code":"fr_MC", "name":"French (Monaco)"},
|
||||
{ "code":"fr_NE", "name":"French (Niger)"},
|
||||
{ "code":"fr_RW", "name":"French (Rwanda)"},
|
||||
{ "code":"fr_RE", "name":"French (Réunion)"},
|
||||
{ "code":"fr_BL", "name":"French (Saint Barthélemy)"},
|
||||
{ "code":"fr_MF", "name":"French (Saint Martin)"},
|
||||
{ "code":"fr_SN", "name":"French (Senegal)"},
|
||||
{ "code":"fr_CH", "name":"French (Switzerland)"},
|
||||
{ "code":"fr_TG", "name":"French (Togo)"},
|
||||
{ "code":"fr", "name":"French"},
|
||||
{ "code":"ff_SN", "name":"Fulah (Senegal)"},
|
||||
{ "code":"ff", "name":"Fulah"},
|
||||
{ "code":"gl_ES", "name":"Galician (Spain)"},
|
||||
{ "code":"gl", "name":"Galician"},
|
||||
{ "code":"lg_UG", "name":"Ganda (Uganda)"},
|
||||
{ "code":"lg", "name":"Ganda"},
|
||||
{ "code":"ka_GE", "name":"Georgian (Georgia)"},
|
||||
{ "code":"ka", "name":"Georgian"},
|
||||
{ "code":"de_AT", "name":"German (Austria)"},
|
||||
{ "code":"de_BE", "name":"German (Belgium)"},
|
||||
{ "code":"de_DE", "name":"German (Germany)"},
|
||||
{ "code":"de_LI", "name":"German (Liechtenstein)"},
|
||||
{ "code":"de_LU", "name":"German (Luxembourg)"},
|
||||
{ "code":"de_CH", "name":"German (Switzerland)"},
|
||||
{ "code":"de", "name":"German"},
|
||||
{ "code":"el_CY", "name":"Greek (Cyprus)"},
|
||||
{ "code":"el_GR", "name":"Greek (Greece)"},
|
||||
{ "code":"el", "name":"Greek"},
|
||||
{ "code":"gu_IN", "name":"Gujarati (India)"},
|
||||
{ "code":"gu", "name":"Gujarati"},
|
||||
{ "code":"guz_KE", "name":"Gusii (Kenya)"},
|
||||
{ "code":"guz", "name":"Gusii"},
|
||||
{ "code":"ha_Latn", "name":"Hausa (Latin)"},
|
||||
{ "code":"ha_Latn_GH", "name":"Hausa (Latin, Ghana)"},
|
||||
{ "code":"ha_Latn_NE", "name":"Hausa (Latin, Niger)"},
|
||||
{ "code":"ha_Latn_NG", "name":"Hausa (Latin, Nigeria)"},
|
||||
{ "code":"ha", "name":"Hausa"},
|
||||
{ "code":"haw_US", "name":"Hawaiian (United States)"},
|
||||
{ "code":"haw", "name":"Hawaiian"},
|
||||
{ "code":"he_IL", "name":"Hebrew (Israel)"},
|
||||
{ "code":"he", "name":"Hebrew"},
|
||||
{ "code":"hi_IN", "name":"Hindi (India)"},
|
||||
{ "code":"hi", "name":"Hindi"},
|
||||
{ "code":"hu_HU", "name":"Hungarian (Hungary)"},
|
||||
{ "code":"hu", "name":"Hungarian"},
|
||||
{ "code":"is_IS", "name":"Icelandic (Iceland)"},
|
||||
{ "code":"is", "name":"Icelandic"},
|
||||
{ "code":"ig_NG", "name":"Igbo (Nigeria)"},
|
||||
{ "code":"ig", "name":"Igbo"},
|
||||
{ "code":"id_ID", "name":"Indonesian (Indonesia)"},
|
||||
{ "code":"id", "name":"Indonesian"},
|
||||
{ "code":"ga_IE", "name":"Irish (Ireland)"},
|
||||
{ "code":"ga", "name":"Irish"},
|
||||
{ "code":"it_IT", "name":"Italian (Italy)"},
|
||||
{ "code":"it_CH", "name":"Italian (Switzerland)"},
|
||||
{ "code":"it", "name":"Italian"},
|
||||
{ "code":"ja_JP", "name":"Japanese (Japan)"},
|
||||
{ "code":"ja", "name":"Japanese"},
|
||||
{ "code":"kea_CV", "name":"Kabuverdianu (Cape Verde)"},
|
||||
{ "code":"kea", "name":"Kabuverdianu"},
|
||||
{ "code":"kab_DZ", "name":"Kabyle (Algeria)"},
|
||||
{ "code":"kab", "name":"Kabyle"},
|
||||
{ "code":"kl_GL", "name":"Kalaallisut (Greenland)"},
|
||||
{ "code":"kl", "name":"Kalaallisut"},
|
||||
{ "code":"kln_KE", "name":"Kalenjin (Kenya)"},
|
||||
{ "code":"kln", "name":"Kalenjin"},
|
||||
{ "code":"kam_KE", "name":"Kamba (Kenya)"},
|
||||
{ "code":"kam", "name":"Kamba"},
|
||||
{ "code":"kn_IN", "name":"Kannada (India)"},
|
||||
{ "code":"kn", "name":"Kannada"},
|
||||
{ "code":"kk_Cyrl", "name":"Kazakh (Cyrillic)"},
|
||||
{ "code":"kk_Cyrl_KZ", "name":"Kazakh (Cyrillic, Kazakhstan)"},
|
||||
{ "code":"kk", "name":"Kazakh"},
|
||||
{ "code":"km_KH", "name":"Khmer (Cambodia)"},
|
||||
{ "code":"km", "name":"Khmer"},
|
||||
{ "code":"ki_KE", "name":"Kikuyu (Kenya)"},
|
||||
{ "code":"ki", "name":"Kikuyu"},
|
||||
{ "code":"rw_RW", "name":"Kinyarwanda (Rwanda)"},
|
||||
{ "code":"rw", "name":"Kinyarwanda"},
|
||||
{ "code":"kok_IN", "name":"Konkani (India)"},
|
||||
{ "code":"kok", "name":"Konkani"},
|
||||
{ "code":"ko_KR", "name":"Korean (South Korea)"},
|
||||
{ "code":"ko", "name":"Korean"},
|
||||
{ "code":"khq_ML", "name":"Koyra Chiini (Mali)"},
|
||||
{ "code":"khq", "name":"Koyra Chiini"},
|
||||
{ "code":"ses_ML", "name":"Koyraboro Senni (Mali)"},
|
||||
{ "code":"ses", "name":"Koyraboro Senni"},
|
||||
{ "code":"lag_TZ", "name":"Langi (Tanzania)"},
|
||||
{ "code":"lag", "name":"Langi"},
|
||||
{ "code":"lv_LV", "name":"Latvian (Latvia)"},
|
||||
{ "code":"lv", "name":"Latvian"},
|
||||
{ "code":"lt_LT", "name":"Lithuanian (Lithuania)"},
|
||||
{ "code":"lt", "name":"Lithuanian"},
|
||||
{ "code":"luo_KE", "name":"Luo (Kenya)"},
|
||||
{ "code":"luo", "name":"Luo"},
|
||||
{ "code":"luy_KE", "name":"Luyia (Kenya)"},
|
||||
{ "code":"luy", "name":"Luyia"},
|
||||
{ "code":"mk_MK", "name":"Macedonian (Macedonia)"},
|
||||
{ "code":"mk", "name":"Macedonian"},
|
||||
{ "code":"jmc_TZ", "name":"Machame (Tanzania)"},
|
||||
{ "code":"jmc", "name":"Machame"},
|
||||
{ "code":"kde_TZ", "name":"Makonde (Tanzania)"},
|
||||
{ "code":"kde", "name":"Makonde"},
|
||||
{ "code":"mg_MG", "name":"Malagasy (Madagascar)"},
|
||||
{ "code":"mg", "name":"Malagasy"},
|
||||
{ "code":"ms_BN", "name":"Malay (Brunei)"},
|
||||
{ "code":"ms_MY", "name":"Malay (Malaysia)"},
|
||||
{ "code":"ms", "name":"Malay"},
|
||||
{ "code":"ml_IN", "name":"Malayalam (India)"},
|
||||
{ "code":"ml", "name":"Malayalam"},
|
||||
{ "code":"mt_MT", "name":"Maltese (Malta)"},
|
||||
{ "code":"mt", "name":"Maltese"},
|
||||
{ "code":"gv_GB", "name":"Manx (United Kingdom)"},
|
||||
{ "code":"gv", "name":"Manx"},
|
||||
{ "code":"mr_IN", "name":"Marathi (India)"},
|
||||
{ "code":"mr", "name":"Marathi"},
|
||||
{ "code":"mas_KE", "name":"Masai (Kenya)"},
|
||||
{ "code":"mas_TZ", "name":"Masai (Tanzania)"},
|
||||
{ "code":"mas", "name":"Masai"},
|
||||
{ "code":"mer_KE", "name":"Meru (Kenya)"},
|
||||
{ "code":"mer", "name":"Meru"},
|
||||
{ "code":"mfe_MU", "name":"Morisyen (Mauritius)"},
|
||||
{ "code":"mfe", "name":"Morisyen"},
|
||||
{ "code":"naq_NA", "name":"Nama (Namibia)"},
|
||||
{ "code":"naq", "name":"Nama"},
|
||||
{ "code":"ne_IN", "name":"Nepali (India)"},
|
||||
{ "code":"ne_NP", "name":"Nepali (Nepal)"},
|
||||
{ "code":"ne", "name":"Nepali"},
|
||||
{ "code":"nd_ZW", "name":"North Ndebele (Zimbabwe)"},
|
||||
{ "code":"nd", "name":"North Ndebele"},
|
||||
{ "code":"nb_NO", "name":"Norwegian Bokmål (Norway)"},
|
||||
{ "code":"nb", "name":"Norwegian Bokmål"},
|
||||
{ "code":"nn_NO", "name":"Norwegian Nynorsk (Norway)"},
|
||||
{ "code":"nn", "name":"Norwegian Nynorsk"},
|
||||
{ "code":"nyn_UG", "name":"Nyankole (Uganda)"},
|
||||
{ "code":"nyn", "name":"Nyankole"},
|
||||
{ "code":"or_IN", "name":"Oriya (India)"},
|
||||
{ "code":"or", "name":"Oriya"},
|
||||
{ "code":"om_ET", "name":"Oromo (Ethiopia)"},
|
||||
{ "code":"om_KE", "name":"Oromo (Kenya)"},
|
||||
{ "code":"om", "name":"Oromo"},
|
||||
{ "code":"ps_AF", "name":"Pashto (Afghanistan)"},
|
||||
{ "code":"ps", "name":"Pashto"},
|
||||
{ "code":"fa_AF", "name":"Persian (Afghanistan)"},
|
||||
{ "code":"fa_IR", "name":"Persian (Iran)"},
|
||||
{ "code":"fa", "name":"Persian"},
|
||||
{ "code":"pl_PL", "name":"Polish (Poland)"},
|
||||
{ "code":"pl", "name":"Polish"},
|
||||
{ "code":"pt_BR", "name":"Portuguese (Brazil)"},
|
||||
{ "code":"pt_GW", "name":"Portuguese (Guinea-Bissau)"},
|
||||
{ "code":"pt_MZ", "name":"Portuguese (Mozambique)"},
|
||||
{ "code":"pt_PT", "name":"Portuguese (Portugal)"},
|
||||
{ "code":"pt", "name":"Portuguese"},
|
||||
{ "code":"pa_Arab", "name":"Punjabi (Arabic)"},
|
||||
{ "code":"pa_Arab_PK", "name":"Punjabi (Arabic, Pakistan)"},
|
||||
{ "code":"pa_Guru", "name":"Punjabi (Gurmukhi)"},
|
||||
{ "code":"pa_Guru_IN", "name":"Punjabi (Gurmukhi, India)"},
|
||||
{ "code":"pa", "name":"Punjabi"},
|
||||
{ "code":"ro_MD", "name":"Romanian (Moldova)"},
|
||||
{ "code":"ro_RO", "name":"Romanian (Romania)"},
|
||||
{ "code":"ro", "name":"Romanian"},
|
||||
{ "code":"rm_CH", "name":"Romansh (Switzerland)"},
|
||||
{ "code":"rm", "name":"Romansh"},
|
||||
{ "code":"rof_TZ", "name":"Rombo (Tanzania)"},
|
||||
{ "code":"rof", "name":"Rombo"},
|
||||
{ "code":"ru_MD", "name":"Russian (Moldova)"},
|
||||
{ "code":"ru_RU", "name":"Russian (Russia)"},
|
||||
{ "code":"ru_UA", "name":"Russian (Ukraine)"},
|
||||
{ "code":"ru", "name":"Russian"},
|
||||
{ "code":"rwk_TZ", "name":"Rwa (Tanzania)"},
|
||||
{ "code":"rwk", "name":"Rwa"},
|
||||
{ "code":"saq_KE", "name":"Samburu (Kenya)"},
|
||||
{ "code":"saq", "name":"Samburu"},
|
||||
{ "code":"sg_CF", "name":"Sango (Central African Republic)"},
|
||||
{ "code":"sg", "name":"Sango"},
|
||||
{ "code":"seh_MZ", "name":"Sena (Mozambique)"},
|
||||
{ "code":"seh", "name":"Sena"},
|
||||
{ "code":"sr_Cyrl", "name":"Serbian (Cyrillic)"},
|
||||
{ "code":"sr_Cyrl_BA", "name":"Serbian (Cyrillic, Bosnia and Herzegovina)"},
|
||||
{ "code":"sr_Cyrl_ME", "name":"Serbian (Cyrillic, Montenegro)"},
|
||||
{ "code":"sr_Cyrl_RS", "name":"Serbian (Cyrillic, Serbia)"},
|
||||
{ "code":"sr_Latn", "name":"Serbian (Latin)"},
|
||||
{ "code":"sr_Latn_BA", "name":"Serbian (Latin, Bosnia and Herzegovina)"},
|
||||
{ "code":"sr_Latn_ME", "name":"Serbian (Latin, Montenegro)"},
|
||||
{ "code":"sr_Latn_RS", "name":"Serbian (Latin, Serbia)"},
|
||||
{ "code":"sr", "name":"Serbian"},
|
||||
{ "code":"sn_ZW", "name":"Shona (Zimbabwe)"},
|
||||
{ "code":"sn", "name":"Shona"},
|
||||
{ "code":"ii_CN", "name":"Sichuan Yi (China)"},
|
||||
{ "code":"ii", "name":"Sichuan Yi"},
|
||||
{ "code":"si_LK", "name":"Sinhala (Sri Lanka)"},
|
||||
{ "code":"si", "name":"Sinhala"},
|
||||
{ "code":"sk_SK", "name":"Slovak (Slovakia)"},
|
||||
{ "code":"sk", "name":"Slovak"},
|
||||
{ "code":"sl_SI", "name":"Slovenian (Slovenia)"},
|
||||
{ "code":"sl", "name":"Slovenian"},
|
||||
{ "code":"xog_UG", "name":"Soga (Uganda)"},
|
||||
{ "code":"xog", "name":"Soga"},
|
||||
{ "code":"so_DJ", "name":"Somali (Djibouti)"},
|
||||
{ "code":"so_ET", "name":"Somali (Ethiopia)"},
|
||||
{ "code":"so_KE", "name":"Somali (Kenya)"},
|
||||
{ "code":"so_SO", "name":"Somali (Somalia)"},
|
||||
{ "code":"so", "name":"Somali"},
|
||||
{ "code":"es_AR", "name":"Spanish (Argentina)"},
|
||||
{ "code":"es_BO", "name":"Spanish (Bolivia)"},
|
||||
{ "code":"es_CL", "name":"Spanish (Chile)"},
|
||||
{ "code":"es_CO", "name":"Spanish (Colombia)"},
|
||||
{ "code":"es_CR", "name":"Spanish (Costa Rica)"},
|
||||
{ "code":"es_DO", "name":"Spanish (Dominican Republic)"},
|
||||
{ "code":"es_EC", "name":"Spanish (Ecuador)"},
|
||||
{ "code":"es_SV", "name":"Spanish (El Salvador)"},
|
||||
{ "code":"es_GQ", "name":"Spanish (Equatorial Guinea)"},
|
||||
{ "code":"es_GT", "name":"Spanish (Guatemala)"},
|
||||
{ "code":"es_HN", "name":"Spanish (Honduras)"},
|
||||
{ "code":"es_419", "name":"Spanish (Latin America)"},
|
||||
{ "code":"es_MX", "name":"Spanish (Mexico)"},
|
||||
{ "code":"es_NI", "name":"Spanish (Nicaragua)"},
|
||||
{ "code":"es_PA", "name":"Spanish (Panama)"},
|
||||
{ "code":"es_PY", "name":"Spanish (Paraguay)"},
|
||||
{ "code":"es_PE", "name":"Spanish (Peru)"},
|
||||
{ "code":"es_PR", "name":"Spanish (Puerto Rico)"},
|
||||
{ "code":"es_ES", "name":"Spanish (Spain)"},
|
||||
{ "code":"es_US", "name":"Spanish (United States)"},
|
||||
{ "code":"es_UY", "name":"Spanish (Uruguay)"},
|
||||
{ "code":"es_VE", "name":"Spanish (Venezuela)"},
|
||||
{ "code":"es", "name":"Spanish"},
|
||||
{ "code":"sw_KE", "name":"Swahili (Kenya)"},
|
||||
{ "code":"sw_TZ", "name":"Swahili (Tanzania)"},
|
||||
{ "code":"sw", "name":"Swahili"},
|
||||
{ "code":"sv_FI", "name":"Swedish (Finland)"},
|
||||
{ "code":"sv_SE", "name":"Swedish (Sweden)"},
|
||||
{ "code":"sv", "name":"Swedish"},
|
||||
{ "code":"gsw_CH", "name":"Swiss German (Switzerland)"},
|
||||
{ "code":"gsw", "name":"Swiss German"},
|
||||
{ "code":"shi_Latn", "name":"Tachelhit (Latin)"},
|
||||
{ "code":"shi_Latn_MA", "name":"Tachelhit (Latin, Morocco)"},
|
||||
{ "code":"shi_Tfng", "name":"Tachelhit (Tifinagh)"},
|
||||
{ "code":"shi_Tfng_MA", "name":"Tachelhit (Tifinagh, Morocco)"},
|
||||
{ "code":"shi", "name":"Tachelhit"},
|
||||
{ "code":"dav_KE", "name":"Taita (Kenya)"},
|
||||
{ "code":"dav", "name":"Taita"},
|
||||
{ "code":"ta_IN", "name":"Tamil (India)"},
|
||||
{ "code":"ta_LK", "name":"Tamil (Sri Lanka)"},
|
||||
{ "code":"ta", "name":"Tamil"},
|
||||
{ "code":"te_IN", "name":"Telugu (India)"},
|
||||
{ "code":"te", "name":"Telugu"},
|
||||
{ "code":"teo_KE", "name":"Teso (Kenya)"},
|
||||
{ "code":"teo_UG", "name":"Teso (Uganda)"},
|
||||
{ "code":"teo", "name":"Teso"},
|
||||
{ "code":"th_TH", "name":"Thai (Thailand)"},
|
||||
{ "code":"th", "name":"Thai"},
|
||||
{ "code":"bo_CN", "name":"Tibetan (China)"},
|
||||
{ "code":"bo_IN", "name":"Tibetan (India)"},
|
||||
{ "code":"bo", "name":"Tibetan"},
|
||||
{ "code":"ti_ER", "name":"Tigrinya (Eritrea)"},
|
||||
{ "code":"ti_ET", "name":"Tigrinya (Ethiopia)"},
|
||||
{ "code":"ti", "name":"Tigrinya"},
|
||||
{ "code":"to_TO", "name":"Tonga (Tonga)"},
|
||||
{ "code":"to", "name":"Tonga"},
|
||||
{ "code":"tr_TR", "name":"Turkish (Turkey)"},
|
||||
{ "code":"tr", "name":"Turkish"},
|
||||
{ "code":"uk_UA", "name":"Ukrainian (Ukraine)"},
|
||||
{ "code":"uk", "name":"Ukrainian"},
|
||||
{ "code":"ur_IN", "name":"Urdu (India)"},
|
||||
{ "code":"ur_PK", "name":"Urdu (Pakistan)"},
|
||||
{ "code":"ur", "name":"Urdu"},
|
||||
{ "code":"uz_Arab", "name":"Uzbek (Arabic)"},
|
||||
{ "code":"uz_Arab_AF", "name":"Uzbek (Arabic, Afghanistan)"},
|
||||
{ "code":"uz_Cyrl", "name":"Uzbek (Cyrillic)"},
|
||||
{ "code":"uz_Cyrl_UZ", "name":"Uzbek (Cyrillic, Uzbekistan)"},
|
||||
{ "code":"uz_Latn", "name":"Uzbek (Latin)"},
|
||||
{ "code":"uz_Latn_UZ", "name":"Uzbek (Latin, Uzbekistan)"},
|
||||
{ "code":"uz", "name":"Uzbek"},
|
||||
{ "code":"vi_VN", "name":"Vietnamese (Vietnam)"},
|
||||
{ "code":"vi", "name":"Vietnamese"},
|
||||
{ "code":"vun_TZ", "name":"Vunjo (Tanzania)"},
|
||||
{ "code":"vun", "name":"Vunjo"},
|
||||
{ "code":"cy_GB", "name":"Welsh (United Kingdom)"},
|
||||
{ "code":"cy", "name":"Welsh"},
|
||||
{ "code":"yo_NG", "name":"Yoruba (Nigeria)"},
|
||||
{ "code":"yo", "name":"Yoruba"},
|
||||
{ "code":"zu_ZA", "name":"Zulu (South Africa)"},
|
||||
{ "code":"zu", "name":"Zulu"}
|
||||
]
|
|
@ -103,7 +103,7 @@ input {
|
|||
.profile-settings-container {
|
||||
display: inline-grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: 1fr 2fr 1fr;
|
||||
grid-template-rows: 1fr 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.personal-show-container {
|
||||
|
@ -118,7 +118,8 @@ input {
|
|||
|
||||
select {
|
||||
&#timezone,
|
||||
&#languageinput {
|
||||
&#languageinput,
|
||||
&#localeinput {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
@ -145,7 +146,8 @@ input {
|
|||
}
|
||||
.personal-info {
|
||||
margin-right: 10%;
|
||||
margin-bottom: 20px;
|
||||
margin-bottom: 12px;
|
||||
margin-top: 12px;
|
||||
}
|
||||
.personal-info[class^='icon-'], .personal-info[class*=' icon-'] {
|
||||
background-position: 0px 2px;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* 2013, Morris Jobke <morris.jobke@gmail.com>
|
||||
* 2016, Christoph Wurst <christoph@owncloud.com>
|
||||
* 2017, Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
* 2017, Thomas Citharel <tcit@tcit.fr>
|
||||
* This file is licensed under the Affero General Public License version 3 or later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
@ -294,6 +295,32 @@ $(document).ready(function () {
|
|||
};
|
||||
$("#languageinput").change(updateLanguage);
|
||||
|
||||
var updateLocale = function () {
|
||||
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
|
||||
OC.PasswordConfirmation.requirePasswordConfirmation(updateLocale);
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedLocale = $("#localeinput").val(),
|
||||
user = OC.getCurrentUser();
|
||||
|
||||
$.ajax({
|
||||
url: OC.linkToOCS('cloud/users', 2) + user['uid'],
|
||||
method: 'PUT',
|
||||
data: {
|
||||
key: 'locale',
|
||||
value: selectedLocale
|
||||
},
|
||||
success: function() {
|
||||
moment.locale(selectedLocale);
|
||||
},
|
||||
fail: function() {
|
||||
OC.Notification.showTemporary(t('settings', 'An error occured while changing your locale. Please reload the page and try again.'));
|
||||
}
|
||||
});
|
||||
};
|
||||
$("#localeinput").change(updateLocale);
|
||||
|
||||
var uploadparms = {
|
||||
pasteZone: null,
|
||||
done: function (e, data) {
|
||||
|
@ -414,4 +441,12 @@ $(document).ready(function () {
|
|||
}, user.displayName);
|
||||
});
|
||||
|
||||
window.setInterval(function() {
|
||||
$('#localeexample-time').text(moment().format('LTS'));
|
||||
$('#localeexample-date').text(moment().format('L'));
|
||||
$('#localeexample-fdow').text(t('settings', 'Week starts on {fdow}',
|
||||
{fdow: moment().weekday(0).format('dddd')}));
|
||||
|
||||
}, 1000);
|
||||
|
||||
OC.Settings.updateAvatar = updateAvatar;
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
* @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
*
|
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
* @author Thomas Citharel <tcit@tcit.fr>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -341,6 +342,40 @@ vendor_style('jcrop/css/jquery.Jcrop');
|
|||
</form>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<div class="personal-settings-setting-box personal-settings-locale-box">
|
||||
<?php if (isset($_['activelocale'])) { ?>
|
||||
<form id="locale" class="section">
|
||||
<h2>
|
||||
<label for="localeinput"><?php p($l->t('Locale'));?></label>
|
||||
</h2>
|
||||
<select id="localeinput" name="lang" data-placeholder="<?php p($l->t('Locale'));?>">
|
||||
<option value="<?php p($_['activelocale']['code']);?>">
|
||||
<?php p($_['activelocale']['name']);?>
|
||||
</option>
|
||||
<optgroup label="––––––––––"></optgroup>
|
||||
<?php foreach($_['localesForLanguage'] as $locale):?>
|
||||
<option value="<?php p($locale['code']);?>">
|
||||
<?php p($locale['name']);?>
|
||||
</option>
|
||||
<?php endforeach;?>
|
||||
<optgroup label="––––––––––"></optgroup>
|
||||
<option value="<?php p($_['activelocale']['code']);?>">
|
||||
<?php p($_['activelocale']['name']);?>
|
||||
</option>
|
||||
<?php foreach($_['locales'] as $locale):?>
|
||||
<option value="<?php p($locale['code']);?>">
|
||||
<?php p($locale['name']);?>
|
||||
</option>
|
||||
<?php endforeach;?>
|
||||
</select>
|
||||
<div id="localeexample" class="personal-info icon-timezone">
|
||||
<p id="localeexample-time"></p>
|
||||
<p id="localeexample-date"></p>
|
||||
<p id="localeexample-fdow"></p>
|
||||
</div>
|
||||
</form>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<div class="personal-settings-setting-box personal-settings-password-box">
|
||||
<?php
|
||||
if($_['passwordChangeSupported']) {
|
||||
|
|
|
@ -38,7 +38,7 @@ class L10nTest extends TestCase {
|
|||
|
||||
public function testGermanPluralTranslations() {
|
||||
$transFile = \OC::$SERVERROOT.'/tests/data/l10n/de.json';
|
||||
$l = new L10N($this->getFactory(), 'test', 'de', [$transFile]);
|
||||
$l = new L10N($this->getFactory(), 'test', 'de', 'de_AT', [$transFile]);
|
||||
|
||||
$this->assertEquals('1 Datei', (string) $l->n('%n file', '%n files', 1));
|
||||
$this->assertEquals('2 Dateien', (string) $l->n('%n file', '%n files', 2));
|
||||
|
@ -46,7 +46,7 @@ class L10nTest extends TestCase {
|
|||
|
||||
public function testRussianPluralTranslations() {
|
||||
$transFile = \OC::$SERVERROOT.'/tests/data/l10n/ru.json';
|
||||
$l = new L10N($this->getFactory(), 'test', 'ru', [$transFile]);
|
||||
$l = new L10N($this->getFactory(), 'test', 'ru', 'ru_UA',[$transFile]);
|
||||
|
||||
$this->assertEquals('1 файл', (string)$l->n('%n file', '%n files', 1));
|
||||
$this->assertEquals('2 файла', (string)$l->n('%n file', '%n files', 2));
|
||||
|
@ -70,7 +70,7 @@ class L10nTest extends TestCase {
|
|||
|
||||
public function testCzechPluralTranslations() {
|
||||
$transFile = \OC::$SERVERROOT.'/tests/data/l10n/cs.json';
|
||||
$l = new L10N($this->getFactory(), 'test', 'cs', [$transFile]);
|
||||
$l = new L10N($this->getFactory(), 'test', 'cs', 'cs_CZ', [$transFile]);
|
||||
|
||||
$this->assertEquals('1 okno', (string)$l->n('%n window', '%n windows', 1));
|
||||
$this->assertEquals('2 okna', (string)$l->n('%n window', '%n windows', 2));
|
||||
|
@ -80,51 +80,51 @@ class L10nTest extends TestCase {
|
|||
public function localizationData() {
|
||||
return array(
|
||||
// timestamp as string
|
||||
array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'datetime', '1234567890'),
|
||||
array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'datetime', '1234567890'),
|
||||
array('February 13, 2009', 'en', 'date', '1234567890'),
|
||||
array('13. Februar 2009', 'de', 'date', '1234567890'),
|
||||
array('11:31:30 PM GMT+0', 'en', 'time', '1234567890'),
|
||||
array('23:31:30 GMT+0', 'de', 'time', '1234567890'),
|
||||
array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'en_US', 'datetime', '1234567890'),
|
||||
array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'de_DE', 'datetime', '1234567890'),
|
||||
array('February 13, 2009', 'en', 'en_US', 'date', '1234567890'),
|
||||
array('13. Februar 2009', 'de', 'de_DE', 'date', '1234567890'),
|
||||
array('11:31:30 PM GMT+0', 'en', 'en_US', 'time', '1234567890'),
|
||||
array('23:31:30 GMT+0', 'de', 'de_DE', 'time', '1234567890'),
|
||||
|
||||
// timestamp as int
|
||||
array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'datetime', 1234567890),
|
||||
array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'datetime', 1234567890),
|
||||
array('February 13, 2009', 'en', 'date', 1234567890),
|
||||
array('13. Februar 2009', 'de', 'date', 1234567890),
|
||||
array('11:31:30 PM GMT+0', 'en', 'time', 1234567890),
|
||||
array('23:31:30 GMT+0', 'de', 'time', 1234567890),
|
||||
array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'en_US', 'datetime', 1234567890),
|
||||
array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'de_DE', 'datetime', 1234567890),
|
||||
array('February 13, 2009', 'en', 'en_US', 'date', 1234567890),
|
||||
array('13. Februar 2009', 'de', 'de_DE', 'date', 1234567890),
|
||||
array('11:31:30 PM GMT+0', 'en', 'en_US', 'time', 1234567890),
|
||||
array('23:31:30 GMT+0', 'de', 'de_DE', 'time', 1234567890),
|
||||
|
||||
// DateTime object
|
||||
array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'datetime', new DateTime('@1234567890')),
|
||||
array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'datetime', new DateTime('@1234567890')),
|
||||
array('February 13, 2009', 'en', 'date', new DateTime('@1234567890')),
|
||||
array('13. Februar 2009', 'de', 'date', new DateTime('@1234567890')),
|
||||
array('11:31:30 PM GMT+0', 'en', 'time', new DateTime('@1234567890')),
|
||||
array('23:31:30 GMT+0', 'de', 'time', new DateTime('@1234567890')),
|
||||
array('February 13, 2009 at 11:31:30 PM GMT+0', 'en', 'en_US', 'datetime', new DateTime('@1234567890')),
|
||||
array('13. Februar 2009 um 23:31:30 GMT+0', 'de', 'de_DE', 'datetime', new DateTime('@1234567890')),
|
||||
array('February 13, 2009', 'en', 'en_US', 'date', new DateTime('@1234567890')),
|
||||
array('13. Februar 2009', 'de', 'de_DE', 'date', new DateTime('@1234567890')),
|
||||
array('11:31:30 PM GMT+0', 'en', 'en_US', 'time', new DateTime('@1234567890')),
|
||||
array('23:31:30 GMT+0', 'de', 'de_DE', 'time', new DateTime('@1234567890')),
|
||||
|
||||
// en_GB
|
||||
array('13 February 2009 at 23:31:30 GMT+0', 'en_GB', 'datetime', new DateTime('@1234567890')),
|
||||
array('13 February 2009', 'en_GB', 'date', new DateTime('@1234567890')),
|
||||
array('23:31:30 GMT+0', 'en_GB', 'time', new DateTime('@1234567890')),
|
||||
array('13 February 2009 at 23:31:30 GMT+0', 'en-GB', 'datetime', new DateTime('@1234567890')),
|
||||
array('13 February 2009', 'en-GB', 'date', new DateTime('@1234567890')),
|
||||
array('23:31:30 GMT+0', 'en-GB', 'time', new DateTime('@1234567890')),
|
||||
array('13 February 2009 at 23:31:30 GMT+0', 'en_GB', 'en_GB', 'datetime', new DateTime('@1234567890')),
|
||||
array('13 February 2009', 'en_GB', 'en_GB', 'date', new DateTime('@1234567890')),
|
||||
array('23:31:30 GMT+0', 'en_GB', 'en_GB', 'time', new DateTime('@1234567890')),
|
||||
array('13 February 2009 at 23:31:30 GMT+0', 'en-GB', 'en_GB', 'datetime', new DateTime('@1234567890')),
|
||||
array('13 February 2009', 'en-GB', 'en_GB', 'date', new DateTime('@1234567890')),
|
||||
array('23:31:30 GMT+0', 'en-GB', 'en_GB', 'time', new DateTime('@1234567890')),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider localizationData
|
||||
*/
|
||||
public function testNumericStringLocalization($expectedDate, $lang, $type, $value) {
|
||||
$l = new L10N($this->getFactory(), 'test', $lang, []);
|
||||
public function testNumericStringLocalization($expectedDate, $lang, $locale, $type, $value) {
|
||||
$l = new L10N($this->getFactory(), 'test', $lang, $locale, []);
|
||||
$this->assertSame($expectedDate, $l->l($type, $value));
|
||||
}
|
||||
|
||||
public function firstDayData() {
|
||||
return array(
|
||||
array(1, 'de'),
|
||||
array(0, 'en'),
|
||||
array(1, 'de', 'de_DE'),
|
||||
array(0, 'en', 'en_US'),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -132,16 +132,17 @@ class L10nTest extends TestCase {
|
|||
* @dataProvider firstDayData
|
||||
* @param $expected
|
||||
* @param $lang
|
||||
* @param $locale
|
||||
*/
|
||||
public function testFirstWeekDay($expected, $lang) {
|
||||
$l = new L10N($this->getFactory(), 'test', $lang, []);
|
||||
public function testFirstWeekDay($expected, $lang, $locale) {
|
||||
$l = new L10N($this->getFactory(), 'test', $lang, $locale, []);
|
||||
$this->assertSame($expected, $l->l('firstday', 'firstday'));
|
||||
}
|
||||
|
||||
public function jsDateData() {
|
||||
return array(
|
||||
array('dd.MM.yy', 'de'),
|
||||
array('M/d/yy', 'en'),
|
||||
array('dd.MM.yy', 'de', 'de_DE'),
|
||||
array('M/d/yy', 'en', 'en_US'),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -149,9 +150,10 @@ class L10nTest extends TestCase {
|
|||
* @dataProvider jsDateData
|
||||
* @param $expected
|
||||
* @param $lang
|
||||
* @param $locale
|
||||
*/
|
||||
public function testJSDate($expected, $lang) {
|
||||
$l = new L10N($this->getFactory(), 'test', $lang, []);
|
||||
public function testJSDate($expected, $lang, $locale) {
|
||||
$l = new L10N($this->getFactory(), 'test', $lang, $locale, []);
|
||||
$this->assertSame($expected, $l->l('jsdate', 'jsdate'));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue