Skip to content

Commit

Permalink
use formal version of German if default_language is set to 'de_DE'
Browse files Browse the repository at this point in the history
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
  • Loading branch information
schiessle committed Nov 30, 2017
1 parent 49ec86a commit 8b73434
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 3 deletions.
26 changes: 25 additions & 1 deletion lib/private/L10N/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ private function getLanguageFromRequest($app) {

foreach ($available as $available_language) {
if ($preferred_language === strtolower($available_language)) {
return $available_language;
return $this->respectDefaultLanguage($app, $available_language);
}
}

Expand All @@ -276,6 +276,30 @@ private function getLanguageFromRequest($app) {
throw new LanguageNotFoundException();
}

/**
* if default language is set to de_DE (formal German) this should be
* preferred to 'de' (non-formal German) if possible
*
* @param string|null $app
* @param string $lang
* @return string
*/
protected function respectDefaultLanguage($app, $lang) {
$result = $lang;
$defaultLanguage = $this->config->getSystemValue('default_language', false);

// use formal version of german ("Sie" instead of "Du") if the default
// language is set to 'de_DE' if possible
if (strtolower($lang) === 'de'
&& strtolower($defaultLanguage) === 'de_de' &&
$this->languageExists($app, 'de_DE')
) {
$result = 'de_DE';
}

return $result;
}

/**
* Checks if $sub is a subdirectory of $parent
*
Expand Down
44 changes: 42 additions & 2 deletions tests/lib/L10N/FactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -368,12 +368,17 @@ public function dataSetLanguageFromRequest() {
* @param string $expected
*/
public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected) {
$factory = $this->getFactory(['findAvailableLanguages']);
$factory = $this->getFactory(['findAvailableLanguages', 'respectDefaultLanguage']);
$factory->expects($this->once())
->method('findAvailableLanguages')
->with($app)
->willReturn($availableLanguages);

$factory->expects($this->any())
->method('respectDefaultLanguage')->willReturnCallback(function($app, $lang) {
return $lang;
});

$this->request->expects($this->once())
->method('getHeader')
->with('ACCEPT_LANGUAGE')
Expand Down Expand Up @@ -497,7 +502,7 @@ public function testFindLanguage($loggedIn, $availableLang, $expected) {
->with($this->equalTo('ACCEPT_LANGUAGE'))
->willReturn($browserLang);

$factory = $this->getFactory(['languageExists', 'findAvailableLanguages']);
$factory = $this->getFactory(['languageExists', 'findAvailableLanguages', 'respectDefaultLanguage']);
$factory->expects($this->any())
->method('languageExists')
->will($this->returnCallback(function ($app, $lang) use ($availableLang) {
Expand All @@ -508,9 +513,44 @@ public function testFindLanguage($loggedIn, $availableLang, $expected) {
->will($this->returnCallback(function ($app) use ($availableLang) {
return $availableLang;
}));
$factory->expects($this->any())
->method('respectDefaultLanguage')->willReturnCallback(function($app, $lang) {
return $lang;
});

$lang = $factory->findLanguage(null);
$this->assertSame($expected, $lang);

}

public function dataTestRespectDefaultLanguage() {
return [
['de', 'de_DE', true, 'de_DE'],
['de', 'de', true, 'de'],
['de', false, true, 'de'],
['fr', 'de_DE', true, 'fr'],
];
}

/**
* test if we respect default language if possible
*
* @dataProvider dataTestRespectDefaultLanguage
*
* @param string $lang
* @param string $defaultLanguage
* @param bool $langExists
* @param string $expected
*/
public function testRespectDefaultLanguage($lang, $defaultLanguage, $langExists, $expected) {
$factory = $this->getFactory(['languageExists']);
$factory->expects($this->any())
->method('languageExists')->willReturn($langExists);
$this->config->expects($this->any())
->method('getSystemValue')->with('default_language', false)->willReturn($defaultLanguage);

$result = $this->invokePrivate($factory, 'respectDefaultLanguage', ['app', $lang]);
$this->assertSame($expected, $result);
}

}

0 comments on commit 8b73434

Please sign in to comment.