diff --git a/4dev/tests/CoreLibsLanguageGetSettingsTest.php b/4dev/tests/CoreLibsLanguageGetSettingsTest.php new file mode 100644 index 00000000..14fb8d9c --- /dev/null +++ b/4dev/tests/CoreLibsLanguageGetSettingsTest.php @@ -0,0 +1,325 @@ + [ + // lang, domain, path + null, null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + null, null, null, + // return array + [ + 0 => 'UTF-8', + 1 => 'en_US', + 2 => 'en', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'en_US', + 'lang_short' => 'en', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + 'no params, session charset and lang' => [ + // lang, domain, path + null, null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + 'UTF-8', null, 'ja_JP', + // return array + [ + 0 => 'UTF-8', + 1 => 'ja_JP', + 2 => 'ja', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'ja_JP', + 'lang_short' => 'ja', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + 'no params, session charset and lang short' => [ + // lang, domain, path + null, null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + 'UTF-8', null, 'ja', + // return array + [ + 0 => 'UTF-8', + 1 => 'ja', + 2 => 'ja', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'ja', + 'lang_short' => 'ja', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + // globals override lang + 'no params, session charset and lang, default lang override' => [ + // lang, domain, path + null, null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + 'UTF-8', 'en_US', 'ja_JP', + // return array + [ + 0 => 'UTF-8', + 1 => 'en_US', + 2 => 'en', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'en_US', + 'lang_short' => 'en', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + // globals override lang short + 'no params, session charset and lang, default lang short override' => [ + // lang, domain, path + null, null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + 'UTF-8', 'en', 'ja_JP', + // return array + [ + 0 => 'UTF-8', + 1 => 'en', + 2 => 'en', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'en', + 'lang_short' => 'en', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + // param lang (no override) + 'locale param only, no override' => [ + // lang, domain, path + 'ja.UTF-8', null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + null, null, null, + // return array + [ + 0 => 'UTF-8', + 1 => 'ja', + 2 => 'ja', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'ja', + 'lang_short' => 'ja', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + // different locale setting + 'locale complex param only, no override' => [ + // lang, domain, path + 'ja_JP.SJIS', null, null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + null, null, null, + // return array + [ + 0 => 'SJIS', + 1 => 'ja_JP', + 2 => 'ja', + 3 => 'frontend', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'SJIS', + 'lang' => 'ja_JP', + 'lang_short' => 'ja', + 'domain' => 'frontend', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + // param lang and domain (no override) + 'locale, domain params, no override' => [ + // lang, domain, path + 'ja.UTF-8', 'admin', null, + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + null, null, null, + // return array + [ + 0 => 'UTF-8', + 1 => 'ja', + 2 => 'ja', + 3 => 'admin', + 4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'ja', + 'lang_short' => 'ja', + 'domain' => 'admin', + 'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/", + ], + ], + // all params set (no override) + 'all params, no override' => [ + // lang, domain, path + 'ja.UTF-8', 'admin', __DIR__ . '/locale_other/', + // global set no session + // SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG + null, null, null, + // return array + [ + 0 => 'UTF-8', + 1 => 'ja', + 2 => 'ja', + 3 => 'admin', + 4 => "/^\/(.*\/)?locale_other\/$/", + 'encoding' => 'UTF-8', + 'lang' => 'ja', + 'lang_short' => 'ja', + 'domain' => 'admin', + 'path' => "/^\/(.*\/)?locale_other\/$/", + ], + ], + // TODO invalid params (bad path) (no override) + // TODO param calls, but with override set + ]; + } + + /** + * Undocumented function + * + * @covers ::setLangEncoding + * @dataProvider setLangEncodingProvider + * @testdox lang settings lang $language, domain $domain, path $path; null session char: $SESSION_DEFAULT_CHARSET, null global lang: $GLOBAL_OVERRIDE_LANG, null session lang: $SESSION_DEFAULT_LANG [$_dataName] + * + * @return void + */ + public function testSetLangEncoding( + ?string $language, + ?string $domain, + ?string $path, + ?string $SESSION_DEFAULT_CHARSET, + ?string $GLOBAL_OVERRIDE_LANG, + ?string $SESSION_DEFAULT_LANG, + array $expected, + ): void { + $return_lang_settings = []; + global $_SESSION; + // set override + if ($SESSION_DEFAULT_CHARSET !== null) { + $_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET; + } + if ($GLOBAL_OVERRIDE_LANG !== null) { + $GLOBALS['OVERRIDE_LANG'] = $GLOBAL_OVERRIDE_LANG; + } + if ($SESSION_DEFAULT_LANG !== null) { + $_SESSION['DEFAULT_LANG'] = $SESSION_DEFAULT_LANG; + } + // function call + if ($language === null && $domain === null && $path === null) { + $return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding(); + } elseif ($language !== null && $domain === null && $path === null) { + $return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding( + $language + ); + } elseif ($language !== null && $domain !== null && $path === null) { + $return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding( + $language, + $domain + ); + } else { + $return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding( + $language, + $domain, + $path + ); + } + // print "RETURN: " . print_r($return_lang_settings, true) . "\n"; + + foreach ( + [ + 0, 1, 2, 3, 4, + 'encoding', 'lang', 'lang_short', 'domain', 'path' + ] as $key + ) { + $value = $expected[$key]; + if (strpos($value, "/") === 0) { + // this is regex + $this->assertMatchesRegularExpression( + $value, + $return_lang_settings[$key] + ); + } else { + // assert equal + $this->assertEquals( + $value, + $return_lang_settings[$key], + ); + } + } + // unset all vars + $_SESSION = []; + unset($GLOBALS['OVERRIDE_LANG']); + } +} + +// __END__ diff --git a/www/lib/CoreLibs/Language/GetSettings.php b/www/lib/CoreLibs/Language/GetSettings.php index 2b98ccec..1543ad01 100644 --- a/www/lib/CoreLibs/Language/GetSettings.php +++ b/www/lib/CoreLibs/Language/GetSettings.php @@ -13,38 +13,55 @@ class GetSettings /** * Sets encoding and language * Can be overridden with language + path to mo file - * If language is set it must be in the format of: + * If locale is set it must be in the format of: * . * _. - * _@. + * _.@ + * If no encoding is set in the is, UTF-8 is assumed * - * @param string|null $language - * @param string|null $path - * @return array + * Returned is an array with array indes and dictionary index + * 0~4 array are + * encoding: 0 + * lang: 1 + * lang_short: 2 + * domain: 3 + * path: 4 + * + * @param string|null $locale A valid locale name + * @param string|null $path A valid path where the mo files will be based + * @return array Settings as array/dictionary */ public static function setLangEncoding( - ?string $language = null, + ?string $locale = null, ?string $domain = null, ?string $path = null ): array { $lang = ''; $lang_short = ''; $encoding = ''; - // if language is set, extract - if (!empty($language)) { + // if is is set, extract + if (!empty($locale)) { preg_match( - "/^(([a-z]{2,})(_[A-Z]{2,})?(@[a-z]{1,})?)(\.([\w-])+)?$/", - $language, + // language code + '/^(?P[a-z]{2,3})' + // _ country code + . '(?:_(?P[A-Z]{2}))?' + // . charset + . '(?:\\.(?P[-A-Za-z0-9_]+))?' + // @ modifier + . '(?:@(?P[-A-Za-z0-9_]+))?$/', + $locale, $matches ); - // 1: lang (always) - $lang = $matches[1] ?? ''; - // 2: lang short part - $lang_short = $matches[2] ?? ''; - // 3: [ignore] sub part, if set, combined with lang - // 4: [ignore] possible sub part, combined with lang in 1 - // 6: encoding if set - $encoding = $matches[5] ?? ''; + // lang short part + $lang_short = $matches['lang'] ?? ''; + $lang = $lang_short; + // lang + country if country is set + if (!empty($matches['country'])) { + $lang = sprintf('%s_%s', $lang_short, $matches['country']); + } + // encoding if set + $encoding = strtoupper($matches['charset'] ?? 'UTF-8'); } // if domain is set, must be alphanumeric, if not unset if (