mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #2806 from tractorcow/pulls/bug-member-locale
BUG Default Member.Locale now chooses a better default value when i18n.locale is not a valid translation
This commit is contained in:
commit
bb9f84afd5
@ -2208,6 +2208,24 @@ class i18n extends Object implements TemplateGlobalProvider {
|
|||||||
return (array)Config::inst()->get('i18n', 'all_locales');
|
return (array)Config::inst()->get('i18n', 'all_locales');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches a given locale with the closest translation available in the system
|
||||||
|
*
|
||||||
|
* @param string $locale locale code
|
||||||
|
* @return string Locale of closest available translation, if available
|
||||||
|
*/
|
||||||
|
public static function get_closest_translation($locale) {
|
||||||
|
|
||||||
|
// Check if exact match
|
||||||
|
$pool = self::get_existing_translations();
|
||||||
|
if(isset($pool[$locale])) return $locale;
|
||||||
|
|
||||||
|
// Fallback to best locale for common language
|
||||||
|
$lang = self::get_lang_from_locale($locale);
|
||||||
|
$candidate = self::get_locale_from_lang($lang);
|
||||||
|
if(isset($pool[$candidate])) return $candidate;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches the root-directory for module-directories
|
* Searches the root-directory for module-directories
|
||||||
* (identified by having a _config.php on their first directory-level).
|
* (identified by having a _config.php on their first directory-level).
|
||||||
|
@ -176,7 +176,7 @@ class Member extends DataObject implements TemplateGlobalProvider {
|
|||||||
*/
|
*/
|
||||||
public function populateDefaults() {
|
public function populateDefaults() {
|
||||||
parent::populateDefaults();
|
parent::populateDefaults();
|
||||||
$this->Locale = i18n::get_locale();
|
$this->Locale = i18n::get_closest_translation(i18n::get_locale());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function requireDefaultRecords() {
|
public function requireDefaultRecords() {
|
||||||
|
@ -102,6 +102,32 @@ class i18nTest extends SapphireTest {
|
|||||||
$this->assertTrue(isset($translations['de_DE']), 'Checking for de_DE translation');
|
$this->assertTrue(isset($translations['de_DE']), 'Checking for de_DE translation');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetClosestTranslation() {
|
||||||
|
|
||||||
|
// Validate necessary assumptions for this test
|
||||||
|
$translations = i18n::get_existing_translations();
|
||||||
|
$this->assertTrue(isset($translations['en_US']));
|
||||||
|
$this->assertTrue(isset($translations['en_GB']));
|
||||||
|
$this->assertTrue(isset($translations['es_ES']));
|
||||||
|
$this->assertTrue(isset($translations['es_AR']));
|
||||||
|
$this->assertFalse(isset($translations['en_ZZ']));
|
||||||
|
$this->assertFalse(isset($translations['es_ZZ']));
|
||||||
|
$this->assertFalse(isset($translations['zz_ZZ']));
|
||||||
|
|
||||||
|
// Test indeterminate locales
|
||||||
|
$this->assertEmpty(i18n::get_closest_translation('zz_ZZ'));
|
||||||
|
|
||||||
|
// Test english fallback
|
||||||
|
$this->assertEquals('en_US', i18n::get_closest_translation('en_US'));
|
||||||
|
$this->assertEquals('en_GB', i18n::get_closest_translation('en_GB'));
|
||||||
|
$this->assertEquals('en_US', i18n::get_closest_translation('en_ZZ'));
|
||||||
|
|
||||||
|
// Test spanish fallbacks
|
||||||
|
$this->assertEquals('es_AR', i18n::get_closest_translation('es_AR'));
|
||||||
|
$this->assertEquals('es_ES', i18n::get_closest_translation('es_ES'));
|
||||||
|
$this->assertEquals('es_ES', i18n::get_closest_translation('es_XX'));
|
||||||
|
}
|
||||||
|
|
||||||
public function testDataObjectFieldLabels() {
|
public function testDataObjectFieldLabels() {
|
||||||
$oldLocale = i18n::get_locale();
|
$oldLocale = i18n::get_locale();
|
||||||
i18n::set_locale('de_DE');
|
i18n::set_locale('de_DE');
|
||||||
|
Loading…
Reference in New Issue
Block a user