Merge pull request #7351 from nextcloud/change-default-german-language

use formal version of German by default
This commit is contained in:
Roeland Jago Douma 2017-12-06 08:30:14 +01:00 committed by GitHub
commit 6e45034745
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 73 additions and 4 deletions

View File

@ -157,7 +157,11 @@ $CONFIG = array(
* language codes such as ``en`` for English, ``de`` for German, and ``fr`` for * language codes such as ``en`` for English, ``de`` for German, and ``fr`` for
* French. It overrides automatic language detection on public pages like login * French. It overrides automatic language detection on public pages like login
* or shared items. User's language preferences configured under "personal -> * or shared items. User's language preferences configured under "personal ->
* language" override this setting after they have logged in. * language" override this setting after they have logged in. Nextcloud has two
* distinguished language codes for German, 'de' and 'de_DE'. 'de' is used for
* informal German and 'de_DE' for formal German. By setting this value to 'de_DE'
* you can enforce the formal version of German unless the user has chosen
* something different explicitly.
* *
* Defaults to ``en`` * Defaults to ``en``
*/ */

View File

@ -260,7 +260,7 @@ class Factory implements IFactory {
foreach ($available as $available_language) { foreach ($available as $available_language) {
if ($preferred_language === strtolower($available_language)) { if ($preferred_language === strtolower($available_language)) {
return $available_language; return $this->respectDefaultLanguage($app, $available_language);
} }
} }
@ -276,6 +276,31 @@ class Factory implements IFactory {
throw new LanguageNotFoundException(); 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 (is_string($defaultLanguage) &&
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 * Checks if $sub is a subdirectory of $parent
* *

View File

@ -368,12 +368,17 @@ class FactoryTest extends TestCase {
* @param string $expected * @param string $expected
*/ */
public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected) { public function testGetLanguageFromRequest($app, $header, array $availableLanguages, $expected) {
$factory = $this->getFactory(['findAvailableLanguages']); $factory = $this->getFactory(['findAvailableLanguages', 'respectDefaultLanguage']);
$factory->expects($this->once()) $factory->expects($this->once())
->method('findAvailableLanguages') ->method('findAvailableLanguages')
->with($app) ->with($app)
->willReturn($availableLanguages); ->willReturn($availableLanguages);
$factory->expects($this->any())
->method('respectDefaultLanguage')->willReturnCallback(function($app, $lang) {
return $lang;
});
$this->request->expects($this->once()) $this->request->expects($this->once())
->method('getHeader') ->method('getHeader')
->with('ACCEPT_LANGUAGE') ->with('ACCEPT_LANGUAGE')
@ -497,7 +502,7 @@ class FactoryTest extends TestCase {
->with($this->equalTo('ACCEPT_LANGUAGE')) ->with($this->equalTo('ACCEPT_LANGUAGE'))
->willReturn($browserLang); ->willReturn($browserLang);
$factory = $this->getFactory(['languageExists', 'findAvailableLanguages']); $factory = $this->getFactory(['languageExists', 'findAvailableLanguages', 'respectDefaultLanguage']);
$factory->expects($this->any()) $factory->expects($this->any())
->method('languageExists') ->method('languageExists')
->will($this->returnCallback(function ($app, $lang) use ($availableLang) { ->will($this->returnCallback(function ($app, $lang) use ($availableLang) {
@ -508,9 +513,44 @@ class FactoryTest extends TestCase {
->will($this->returnCallback(function ($app) use ($availableLang) { ->will($this->returnCallback(function ($app) use ($availableLang) {
return $availableLang; return $availableLang;
})); }));
$factory->expects($this->any())
->method('respectDefaultLanguage')->willReturnCallback(function($app, $lang) {
return $lang;
});
$lang = $factory->findLanguage(null); $lang = $factory->findLanguage(null);
$this->assertSame($expected, $lang); $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);
}
} }