Update to get default language settings with correct POSIX locale form
Also add phpunit test
This commit is contained in:
325
4dev/tests/CoreLibsLanguageGetSettingsTest.php
Normal file
325
4dev/tests/CoreLibsLanguageGetSettingsTest.php
Normal file
@@ -0,0 +1,325 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Language\GetSettings
|
||||||
|
*
|
||||||
|
* @coversDefaultClass \CoreLibs\Language\GetSettings
|
||||||
|
* @testdox \CoreLibs\Language\GetSettings method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsLanguageGetSettingsTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* set all constant variables that must be set before call
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
define('DEFAULT_LANG', 'en_US');
|
||||||
|
// default web page encoding setting
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
// default lang + encoding
|
||||||
|
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
||||||
|
// site
|
||||||
|
define('SITE_LANG', DEFAULT_LANG);
|
||||||
|
// just set
|
||||||
|
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
||||||
|
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
||||||
|
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
||||||
|
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
|
||||||
|
// array session
|
||||||
|
$_SESSION = [];
|
||||||
|
global $_SESSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all the test data
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function setLangEncodingProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: locale/lang
|
||||||
|
// 1: domain
|
||||||
|
// 2: path
|
||||||
|
// 3: SESSION DEFAULT_CHARSE
|
||||||
|
// 4: GLOBALS: OVERRIDE_LANG
|
||||||
|
// 5: SESSION: DEFAULT_LANG
|
||||||
|
// 6: expected array
|
||||||
|
'no params, all default constants' => [
|
||||||
|
// 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__
|
||||||
@@ -13,38 +13,55 @@ class GetSettings
|
|||||||
/**
|
/**
|
||||||
* Sets encoding and language
|
* Sets encoding and language
|
||||||
* Can be overridden with language + path to mo file
|
* 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:
|
||||||
* <lang>.<encoding>
|
* <lang>.<encoding>
|
||||||
* <lang>_<country>.<encoding>
|
* <lang>_<country>.<encoding>
|
||||||
* <lang>_<country>@<subset>.<encoding>
|
* <lang>_<country>.<encoding>@<subset>
|
||||||
|
* If no encoding is set in the is, UTF-8 is assumed
|
||||||
*
|
*
|
||||||
* @param string|null $language
|
* Returned is an array with array indes and dictionary index
|
||||||
* @param string|null $path
|
* 0~4 array are
|
||||||
* @return array
|
* 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<int|string,string> Settings as array/dictionary
|
||||||
*/
|
*/
|
||||||
public static function setLangEncoding(
|
public static function setLangEncoding(
|
||||||
?string $language = null,
|
?string $locale = null,
|
||||||
?string $domain = null,
|
?string $domain = null,
|
||||||
?string $path = null
|
?string $path = null
|
||||||
): array {
|
): array {
|
||||||
$lang = '';
|
$lang = '';
|
||||||
$lang_short = '';
|
$lang_short = '';
|
||||||
$encoding = '';
|
$encoding = '';
|
||||||
// if language is set, extract
|
// if is is set, extract
|
||||||
if (!empty($language)) {
|
if (!empty($locale)) {
|
||||||
preg_match(
|
preg_match(
|
||||||
"/^(([a-z]{2,})(_[A-Z]{2,})?(@[a-z]{1,})?)(\.([\w-])+)?$/",
|
// language code
|
||||||
$language,
|
'/^(?P<lang>[a-z]{2,3})'
|
||||||
|
// _ country code
|
||||||
|
. '(?:_(?P<country>[A-Z]{2}))?'
|
||||||
|
// . charset
|
||||||
|
. '(?:\\.(?P<charset>[-A-Za-z0-9_]+))?'
|
||||||
|
// @ modifier
|
||||||
|
. '(?:@(?P<modifier>[-A-Za-z0-9_]+))?$/',
|
||||||
|
$locale,
|
||||||
$matches
|
$matches
|
||||||
);
|
);
|
||||||
// 1: lang (always)
|
// lang short part
|
||||||
$lang = $matches[1] ?? '';
|
$lang_short = $matches['lang'] ?? '';
|
||||||
// 2: lang short part
|
$lang = $lang_short;
|
||||||
$lang_short = $matches[2] ?? '';
|
// lang + country if country is set
|
||||||
// 3: [ignore] sub part, if set, combined with lang
|
if (!empty($matches['country'])) {
|
||||||
// 4: [ignore] possible sub part, combined with lang in 1
|
$lang = sprintf('%s_%s', $lang_short, $matches['country']);
|
||||||
// 6: encoding if set
|
}
|
||||||
$encoding = $matches[5] ?? '';
|
// encoding if set
|
||||||
|
$encoding = strtoupper($matches['charset'] ?? 'UTF-8');
|
||||||
}
|
}
|
||||||
// if domain is set, must be alphanumeric, if not unset
|
// if domain is set, must be alphanumeric, if not unset
|
||||||
if (
|
if (
|
||||||
|
|||||||
Reference in New Issue
Block a user