CoreLibs data update for v8.0.3

This commit is contained in:
2023-03-10 15:11:58 +09:00
parent d9b71a64b3
commit db02bdd102
13 changed files with 672 additions and 105 deletions

View File

@@ -196,7 +196,12 @@ class Login
/** @var array<string,mixed> options */ /** @var array<string,mixed> options */
private $options = []; private $options = [];
/** @var array<string,string> locale options: locale, domain, encoding (opt), path */ /** @var array<string,string> locale options: locale, domain, encoding (opt), path */
private $locale = []; private $locale = [
'locale' => '',
'domain' => '',
'encoding' => '',
'path' => '',
];
/** @var \CoreLibs\Debug\Logging logger */ /** @var \CoreLibs\Debug\Logging logger */
public $log; public $log;
@@ -555,12 +560,12 @@ class Login
); );
// set path // set path
$options['locale_path'] = BASE . INCLUDES . LOCALE; $options['locale_path'] = BASE . INCLUDES . LOCALE;
$_SESSION['LOCALE_PATH'] = $options['locale_path'];
} }
$_SESSION['LOCALE_PATH'] = $options['locale_path'];
// LANG: LOCALE // LANG: LOCALE
if (empty($options['site_locale'])) { if (empty($options['site_locale'])) {
trigger_error( trigger_error(
'loginMainCall: SITE_LOCALE or DEFAULT_LOCALE should not be used', 'loginMainCall: SITE_LOCALE should not be used',
E_USER_DEPRECATED E_USER_DEPRECATED
); );
$options['site_locale'] = defined('SITE_LOCALE') && !empty(SITE_LOCALE) ? $options['site_locale'] = defined('SITE_LOCALE') && !empty(SITE_LOCALE) ?
@@ -580,7 +585,6 @@ class Login
); );
// set domain // set domain
$options['site_domain'] = SITE_DOMAIN; $options['site_domain'] = SITE_DOMAIN;
$_SESSION['DEFAULT_DOMAIN'] = $options['site_domain'];
} elseif ( } elseif (
defined('CONTENT_PATH') defined('CONTENT_PATH')
) { ) {
@@ -592,6 +596,16 @@ class Login
$options['set_domain'] = str_replace(DIRECTORY_SEPARATOR, '', CONTENT_PATH); $options['set_domain'] = str_replace(DIRECTORY_SEPARATOR, '', CONTENT_PATH);
} }
} }
$_SESSION['DEFAULT_DOMAIN'] = $options['site_domain'];
// LANG: ENCODING
if (empty($options['site_encoding'])) {
trigger_error(
'loginMainCall: SITE_ENCODING should not be used',
E_USER_DEPRECATED
);
$options['site_encoding'] = defined('SITE_ENCODING') && !empty(SITE_ENCODING) ?
SITE_ENCODING : 'UTF-8';
}
// write array to options // write array to options
$this->options = $options; $this->options = $options;
@@ -905,6 +919,7 @@ class Login
// rgb: nnn.n for each // rgb: nnn.n for each
// hsl: nnn.n for first, nnn.n% for 2nd, 3rd // hsl: nnn.n for first, nnn.n% for 2nd, 3rd
// Check\Colors::validateColor() // Check\Colors::validateColor()
// LANGUAGE/LOCALE/ENCODING:
$_SESSION['LANG'] = $res['locale'] ?? 'en'; $_SESSION['LANG'] = $res['locale'] ?? 'en';
$_SESSION['DEFAULT_CHARSET'] = $res['encoding'] ?? 'UTF-8'; $_SESSION['DEFAULT_CHARSET'] = $res['encoding'] ?? 'UTF-8';
$_SESSION['DEFAULT_LOCALE'] = $_SESSION['LANG'] $_SESSION['DEFAULT_LOCALE'] = $_SESSION['LANG']
@@ -1195,7 +1210,8 @@ class Login
} }
/** /**
* set locale and load mo translator * set locale
* if invalid, set to empty string
* *
* @return void * @return void
*/ */
@@ -1204,22 +1220,52 @@ class Login
// ** LANGUAGE SET AFTER LOGIN ** // ** LANGUAGE SET AFTER LOGIN **
// set the locale // set the locale
if ( if (
!empty($_SESSION['DEFAULT_LOCALE']) !empty($_SESSION['DEFAULT_LOCALE']) &&
preg_match("/^[-A-Za-z0-9_.@]+$/", $_SESSION['DEFAULT_LOCALE'])
) { ) {
$locale = $_SESSION['DEFAULT_LOCALE']; $locale = $_SESSION['DEFAULT_LOCALE'];
} else { } elseif (
!preg_match("/^[-A-Za-z0-9_.@]+$/", $this->options['site_locale'])
) {
$locale = $this->options['site_locale']; $locale = $this->options['site_locale'];
} else {
$locale = '';
} }
// set the charset
preg_match('/(?:\\.(?P<charset>[-A-Za-z0-9_]+))/', $locale, $matches);
$locale_encoding = $matches['charset'] ?? '';
if (!empty($locale_encoding)) {
$encoding = strtoupper($locale_encoding);
} elseif (
!empty($_SESSION['DEFAULT_CHARSET']) &&
preg_match("/^[-A-Za-z0-9_]+$/", $_SESSION['DEFAULT_CHARSET'])
) {
$encoding = $_SESSION['DEFAULT_CHARSET'];
} elseif (
!preg_match("/^[-A-Za-z0-9_]+$/", $this->options['site_encoding'])
) {
$encoding = $this->options['site_encoding'];
} else {
$encoding = '';
}
// check domain
$domain = $this->options['site_domain'];
if (
!preg_match("/^\w+$/", $this->options['site_domain'])
) {
$domain = '';
}
$path = $this->options['locale_path'];
if (!is_dir($path)) {
$path = '';
}
// domain and path are a must set from class options
$this->locale = [ $this->locale = [
'locale' => $locale, 'locale' => $locale,
'domain' => $this->options['site_domain'], 'domain' => $domain,
'path' => $this->options['locale_path'], 'encoding' => $encoding,
'path' => $path,
]; ];
$this->l = new \CoreLibs\Language\L10n(
$this->locale['locale'],
$this->locale['domain'],
$this->locale['path']
);
} }
/** /**
@@ -1824,6 +1870,12 @@ EOM;
$this->loginLogoutUser(); $this->loginLogoutUser();
// ** LANGUAGE SET AFTER LOGIN ** // ** LANGUAGE SET AFTER LOGIN **
$this->loginSetLocale(); $this->loginSetLocale();
// load translator
$this->l = new \CoreLibs\Language\L10n(
$this->locale['locale'],
$this->locale['domain'],
$this->locale['path']
);
// if the password change flag is okay, run the password change method // if the password change flag is okay, run the password change method
if ($this->password_change) { if ($this->password_change) {
$this->loginPasswordChange(); $this->loginPasswordChange();
@@ -2396,6 +2448,53 @@ EOM;
): bool|string { ): bool|string {
return $this->loginGetEditAccessData($edit_access_id, $data_key); return $this->loginGetEditAccessData($edit_access_id, $data_key);
} }
/**
* Return locale settings with
* locale
* domain
* encoding
* path
*
* empty string if not set
*
* @return array<string,string> Locale settings
*/
public function loginGetLocale(): array
{
return $this->locale;
}
/**
* return header color or null for not set
*
* @return string|null Header color in RGB hex with leading sharp
*/
public function loginGetHeaderColor(): ?string
{
return $_SESSION['HEADER_COLOR'] ?? null;
}
/**
* Return the current loaded list of pages the user can access
*
* @return array<mixed>
*/
public function loginGetPages(): array
{
return $_SESSION['PAGES'] ?? [];
}
/**
* Get the current set EUID (edit user id)
*
* @return string EUID as string
*/
public function loginGetEuid(): string
{
return $this->euid;
}
} }
// __END__ // __END__

View File

@@ -121,14 +121,13 @@ class Backend
* @param \CoreLibs\Debug\Logging $log Logging class * @param \CoreLibs\Debug\Logging $log Logging class
* @param \CoreLibs\Create\Session $session Session interface class * @param \CoreLibs\Create\Session $session Session interface class
* @param \CoreLibs\Language\L10n $l10n l10n language class * @param \CoreLibs\Language\L10n $l10n l10n language class
* @param array<string,string> $locale locale data read from setLocale * @param int|null $set_default_acl_level Default ACL level
*/ */
public function __construct( public function __construct(
\CoreLibs\DB\IO $db, \CoreLibs\DB\IO $db,
\CoreLibs\Debug\Logging $log, \CoreLibs\Debug\Logging $log,
\CoreLibs\Create\Session $session, \CoreLibs\Create\Session $session,
\CoreLibs\Language\L10n $l10n, \CoreLibs\Language\L10n $l10n,
array $locale,
?int $set_default_acl_level = null ?int $set_default_acl_level = null
) { ) {
// attach db class // attach db class
@@ -142,12 +141,12 @@ class Backend
// get the language sub class & init it // get the language sub class & init it
$this->l = $l10n; $this->l = $l10n;
// parse and read, legacy stuff // parse and read, legacy stuff
$locale = $this->l->getLocaleAsArray();
$this->encoding = $locale['encoding']; $this->encoding = $locale['encoding'];
$this->lang = $locale['lang']; $this->lang = $locale['lang'];
// get first part from lang $this->lang_short = $locale['lang_short'];
$this->lang_short = explode('_', $locale['lang'])[0]; $this->domain = $locale['domain'];
$this->domain = $this->l->getDomain(); $this->lang_dir = $locale['path'];
$this->lang_dir = $this->l->getBaseLocalePath();
// set the page name // set the page name
$this->page_name = \CoreLibs\Get\System::getPageName(); $this->page_name = \CoreLibs\Get\System::getPageName();

View File

@@ -35,6 +35,8 @@ class EditBase
private $form; private $form;
/** @var \CoreLibs\Debug\Logging */ /** @var \CoreLibs\Debug\Logging */
public $log; public $log;
/** @var \CoreLibs\ACL\Login */
public $login;
/** /**
* construct form generator * construct form generator
@@ -42,18 +44,24 @@ class EditBase
* @param array<mixed> $db_config db config array, mandatory * @param array<mixed> $db_config db config array, mandatory
* @param \CoreLibs\Debug\Logging $log Logging class, null auto set * @param \CoreLibs\Debug\Logging $log Logging class, null auto set
* @param \CoreLibs\Language\L10n $l10n l10n language class, null auto set * @param \CoreLibs\Language\L10n $l10n l10n language class, null auto set
* @param array<string,string> $locale locale array from ::setLocale, * @param \CoreLibs\ACL\Login $login login class for ACL settings
* null auto set * @param array<string,mixed> $options Various settings options
*/ */
public function __construct( public function __construct(
array $db_config, array $db_config,
\CoreLibs\Debug\Logging $log, \CoreLibs\Debug\Logging $log,
\CoreLibs\Language\L10n $l10n, \CoreLibs\Language\L10n $l10n,
array $locale \CoreLibs\ACL\Login $login,
array $options
) { ) {
$this->log = $log; $this->log = $log;
$this->login = $login;
// smarty template engine (extended Translation version) // smarty template engine (extended Translation version)
$this->smarty = new \CoreLibs\Template\SmartyExtend($l10n, $locale); $this->smarty = new \CoreLibs\Template\SmartyExtend(
$l10n,
$options['cache_id'] ?? '',
$options['compile_id'] ?? '',
);
// turn off set log per class // turn off set log per class
$log->setLogPer('class', false); $log->setLogPer('class', false);
@@ -62,7 +70,7 @@ class EditBase
$db_config, $db_config,
$log, $log,
$l10n, $l10n,
$locale $this->login->loginGetAcl()
); );
if ($this->form->mobile_phone) { if ($this->form->mobile_phone) {
echo "I am sorry, but this page cannot be viewed by a mobile phone"; echo "I am sorry, but this page cannot be viewed by a mobile phone";
@@ -272,23 +280,16 @@ class EditBase
// MENU START // MENU START
// request some session vars // request some session vars
if (empty($_SESSION['HEADER_COLOR'])) { $this->DATA['HEADER_COLOR'] = $this->login->loginGetHeaderColor() ?? '#E0E2FF';
$this->DATA['HEADER_COLOR'] = '#E0E2FF'; $this->DATA['USER_NAME'] = $this->login->loginGetAcl()['user_name'] ?? '';
} else { $this->DATA['EUID'] = $this->login->loginGetEuid();
$this->DATA['HEADER_COLOR'] = $_SESSION['HEADER_COLOR']; $this->DATA['GROUP_NAME'] = $this->login->loginGetAcl()['group_name'] ?? '';
} $this->DATA['ACCESS_LEVEL'] = $this->login->loginGetAcl()['base'] ?? '';
$this->DATA['USER_NAME'] = $_SESSION['USER_NAME']; // below is old and to removed when edit_body.tpl is updates
$this->DATA['EUID'] = $_SESSION['EUID']; $this->DATA['GROUP_LEVEL'] = $this->DATA['ACCESS_LEVEL'];
$this->DATA['GROUP_NAME'] = $_SESSION['GROUP_NAME']; $PAGES = $this->login->loginGetPages();
$this->DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL'];
$PAGES = $_SESSION['PAGES'];
//$this->form->log->debug('menu', $this->form->log->prAr($PAGES)); //$this->form->log->debug('menu', $this->form->log->prAr($PAGES));
// build nav from $PAGES ...
if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = [];
}
$menuarray = []; $menuarray = [];
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) { foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) { if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
@@ -574,7 +575,7 @@ class EditBase
$set_admin_stylesheet = $set_admin_stylesheet ?? ADMIN_STYLESHEET; $set_admin_stylesheet = $set_admin_stylesheet ?? ADMIN_STYLESHEET;
$set_default_encoding = $set_default_encoding ?? DEFAULT_ENCODING; $set_default_encoding = $set_default_encoding ?? DEFAULT_ENCODING;
$set_css = $set_css ?? LAYOUT . CSS; $set_css = $set_css ?? LAYOUT . CSS;
$set_css = $set_js ?? LAYOUT . JS; $set_js = $set_js ?? LAYOUT . JS;
$set_root = $set_root ?? ROOT; $set_root = $set_root ?? ROOT;
$set_content_path = $set_content_path ?? CONTENT_PATH; $set_content_path = $set_content_path ?? CONTENT_PATH;

View File

@@ -405,9 +405,9 @@ class IO
$db_debug_override ?? $db_debug_override ??
// from db config setting // from db config setting
$db_config['db_debug'] ?? $db_config['db_debug'] ??
// should be handled from outside // [DEPRECATED] should be handled from outside
$_SESSION['DB_DEBUG'] ?? $_SESSION['DB_DEBUG'] ??
// globals should be deprecated // [DEPRECATED] globals should be deprecated
$GLOBALS['DB_DEBUG'] ?? $GLOBALS['DB_DEBUG'] ??
false false
); );

View File

@@ -251,22 +251,22 @@ class Logging
'debug', 'debug',
$this->options['debug_all'] ?? $this->options['debug_all'] ??
// for user login, should be handled outside like globals // for user login, should be handled outside like globals
$_SESSION['DEBUG_ALL'] ?? $_SESSION['DEBUG_ALL'] ?? // DEPRECATED
$GLOBALS['DEBUG_ALL'] ?? $GLOBALS['DEBUG_ALL'] ?? // DEPRECATED
false false
); );
$this->setLogLevelAll( $this->setLogLevelAll(
'print', 'print',
$this->options['print_all'] ?? $this->options['print_all'] ??
// for user login, should be handled outside like globals // for user login, should be handled outside like globals
$_SESSION['DEBUG_ALL'] ?? $_SESSION['DEBUG_ALL'] ?? // DEPRECATED
$GLOBALS['PRINT_ALL'] ?? $GLOBALS['PRINT_ALL'] ?? // DEPRECATED
false false
); );
$this->setLogLevelAll( $this->setLogLevelAll(
'echo', 'echo',
$this->options['echo_all'] ?? $this->options['echo_all'] ??
$GLOBALS['ECHO_ALL'] ?? $GLOBALS['ECHO_ALL'] ?? // DEPRECATED
false false
); );
@@ -274,32 +274,32 @@ class Logging
// add file date is default on // add file date is default on
$this->setGetLogPrintFileDate( $this->setGetLogPrintFileDate(
$this->options['print_file_date'] ?? $this->options['print_file_date'] ??
$GLOBALS['LOG_PRINT_FILE_DATE'] ?? $GLOBALS['LOG_PRINT_FILE_DATE'] ?? // DEPRECATED
true true
); );
// all other logging file name flags are off // all other logging file name flags are off
$this->setLogPer( $this->setLogPer(
'level', 'level',
$this->options['per_level'] ?? $this->options['per_level'] ??
$GLOBALS['LOG_PER_LEVEL'] ?? $GLOBALS['LOG_PER_LEVEL'] ?? // DEPRECATED
false false
); );
$this->setLogPer( $this->setLogPer(
'class', 'class',
$this->options['per_class'] ?? $this->options['per_class'] ??
$GLOBALS['LOG_PER_CLASS'] ?? $GLOBALS['LOG_PER_CLASS'] ?? // DEPRECATED
false false
); );
$this->setLogPer( $this->setLogPer(
'page', 'page',
$this->options['per_page'] ?? $this->options['per_page'] ??
$GLOBALS['LOG_PER_PAGE'] ?? $GLOBALS['LOG_PER_PAGE'] ?? // DEPRECATED
false false
); );
$this->setLogPer( $this->setLogPer(
'run', 'run',
$this->options['per_run'] ?? $this->options['per_run'] ??
$GLOBALS['LOG_PER_RUN'] ?? $GLOBALS['LOG_PER_RUN'] ?? // DEPRECATED
false false
); );
// set log per date // set log per date

View File

@@ -21,6 +21,7 @@ class GetLocale
* @param string|null $encoding override encoding * @param string|null $encoding override encoding
* @param string|null $path override path * @param string|null $path override path
* @return array<string,string> locale, domain, encoding, path * @return array<string,string> locale, domain, encoding, path
* @deprecated use GetLocale::setLocaleSession(...) instead
*/ */
public static function setLocale( public static function setLocale(
?string $locale = null, ?string $locale = null,
@@ -28,6 +29,10 @@ class GetLocale
?string $encoding = null, ?string $encoding = null,
?string $path = null ?string $path = null
): array { ): array {
trigger_error(
'Use \CoreLibs\Language\GetLocale::setLocaleSession(...) instead',
E_USER_DEPRECATED
);
// locale must match at least basic rules // locale must match at least basic rules
if ( if (
empty($locale) || empty($locale) ||
@@ -137,6 +142,113 @@ class GetLocale
'path' => $path, 'path' => $path,
]; ];
} }
/**
* NOTE: For getting the login info via login class use ->loginGetLocale()
*
* Set locale from session or from override parameters
* This is the prefered version to setLocale
* It usese the following SESSION VARIABLES
* DEFAULT_LOCALE
* DEFAULT_DOMAIN
* DEFAULT_CHARSET (should be set from DEFAULT_LOCALE)
* LOCALE_PATH
* in the return array, null set invalid information
*
* @param string $locale override locale
* @param string $domain override domain
* @param string $encoding override encoding
* @param string $path override path
* @return array<string,string> locale, domain, encoding, path
* @return array<string,string|null> Return list of set locale information
* @deprecated This version will be removed in a future version use ACL\Login->loginGetLocale() instead
*/
public static function setLocaleFromSession(
string $locale,
string $domain,
string $encoding,
string $path
): array {
// locale must match at least basic rules
if (
!empty($_SESSION['DEFAULT_LOCALE']) &&
preg_match("/^[-A-Za-z0-9_.@]+$/", $_SESSION['DEFAULT_LOCALE'])
) {
// parse from session (logged in)
$locale = $_SESSION['DEFAULT_LOCALE'];
} elseif (
empty($locale) ||
!preg_match("/^[-A-Za-z0-9_.@]+$/", $locale)
) {
$locale = null;
}
// if domain is set, must be alphanumeric, if not unset
if (
!empty($_SESSION['DEFAULT_DOMAIN']) &&
preg_match("/^\w+$/", $_SESSION['DEFAULT_DOMAIN'])
) {
$domain = $_SESSION['DEFAULT_DOMAIN'];
} elseif (
empty($domain) ||
!preg_match("/^\w+$/", $domain)
) {
$domain = null;
}
// check that override encoding matches locale encoding
// if locale encoding is set
preg_match('/(?:\\.(?P<charset>[-A-Za-z0-9_]+))/', $locale ?? '', $matches);
$locale_encoding = $matches['charset'] ?? null;
if (!empty($locale_encoding)) {
$encoding = strtoupper($locale_encoding);
} elseif (
!empty($_SESSION['DEFAULT_CHARSET']) &&
preg_match("/^[-A-Za-z0-9_]+$/", $_SESSION['DEFAULT_CHARSET'])
) {
$encoding = $_SESSION['DEFAULT_CHARSET'];
} elseif (
empty($encoding) ||
// not valid encoding
!preg_match("/^[-A-Za-z0-9_]+$/", $encoding)
) {
$encoding = null;
}
// path checks if set, if not valid path unset to default BASE path
if (
!empty($_SESSION['LOCALE_PATH']) &&
is_dir($_SESSION['LOCALE_PATH'])
) {
$path = $_SESSION['LOCALE_PATH'];
} elseif (
empty($path) ||
!is_dir($path)
) {
$path = null;
}
// extract lang & country from locale string, else set to en
if (
preg_match(
// lang
'/^(?P<lang>[a-z]{2,3})'
// country code
. '(?:_(?P<country>[A-Z]{2}))?/',
$locale ?? '',
$matches
)
) {
$lang = ($matches['lang'] ?? 'en')
// add country only if set
. (!empty($matches['country']) ? '_' . $matches['country'] : '');
} else {
$lang = null;
}
return [
'locale' => $locale,
'lang' => $lang,
'domain' => $domain,
'encoding' => $encoding,
'path' => $path,
];
}
} }
// __END__ // __END__

View File

@@ -32,12 +32,18 @@ use CoreLibs\Language\Core\GetTextReader;
class L10n class L10n
{ {
/** @var string the default fallback encoding if nothing is set */
public const DEFAULT_CHARSET = 'UTF-8';
/** @var string the current locale */ /** @var string the current locale */
private $locale = ''; private $locale = '';
/** @var string the SET locale as WHERE the domain file is */ /** @var string the SET locale as WHERE the domain file is */
private $locale_set = ''; private $locale_set = '';
/** @var string the default selected/active domain */ /** @var string the default selected/active domain */
private $domain = ''; private $domain = '';
/** @var string encoding, as from locale or set from outside */
private $override_encoding = self::DEFAULT_CHARSET;
/** @var string encoding set during the parse Locale */
private $encoding = '';
/** @var array<string,array<string,GetTextReader>> locale > domain = translator */ /** @var array<string,array<string,GetTextReader>> locale > domain = translator */
private $domains = []; private $domains = [];
/** @var array<string,string> bound paths for domains */ /** @var array<string,string> bound paths for domains */
@@ -71,15 +77,18 @@ class L10n
* if locale is not empty will load translation * if locale is not empty will load translation
* else getTranslator needs to be called * else getTranslator needs to be called
* *
* @param string $locale language name, default empty string * @param string $locale language name, default empty string
* will return self instance * will return self instance
* @param string $domain override CONTENT_PATH . $encoding name for mo file * @param string $domain override CONTENT_PATH . $encoding name for mo file
* @param string $path path, if empty fallback on default internal path * @param string $path path, if empty fallback on default internal path
* @param string $encoding Optional encoding, should be set if locale has
* no encoding, defaults to UTF-8
*/ */
public function __construct( public function __construct(
string $locale = '', string $locale = '',
string $domain = '', string $domain = '',
string $path = '' string $path = '',
string $encoding = ''
) { ) {
// auto load language only if at least locale and domain is set // auto load language only if at least locale and domain is set
// New: path must be set too, or we fall through // New: path must be set too, or we fall through
@@ -103,7 +112,7 @@ class L10n
$path = $domain; $path = $domain;
$domain = $_domain; $domain = $_domain;
} }
$this->getTranslator($locale, $domain, $path); $this->getTranslator($locale, $domain, $path, $encoding);
} }
} }
@@ -137,13 +146,15 @@ class L10n
* *
* @param string $locale language name, if not set, try previous set * @param string $locale language name, if not set, try previous set
* @param string $domain set name for mo file, if not set, try previous set * @param string $domain set name for mo file, if not set, try previous set
* @param string $path path, if not set try to get from paths array, else self * @param string $path path, if not set try to get from paths array, else self
* @param string $override_encoding if locale does not env encoding set, use this one
* @return GetTextReader the main gettext reader object * @return GetTextReader the main gettext reader object
*/ */
public function getTranslator( public function getTranslator(
string $locale = '', string $locale = '',
string $domain = '', string $domain = '',
string $path = '' string $path = '',
string $override_encoding = '',
): GetTextReader { ): GetTextReader {
// set local if not from parameter // set local if not from parameter
if (empty($locale)) { if (empty($locale)) {
@@ -153,11 +164,16 @@ class L10n
if (empty($domain)) { if (empty($domain)) {
$domain = $this->domain; $domain = $this->domain;
} }
// override encoding for unset
if (!empty($override_encoding)) {
$this->override_encoding = $override_encoding;
}
// store old settings // store old settings
$old_mofile = $this->mofile; $old_mofile = $this->mofile;
$old_lang = $this->locale; $old_lang = $this->locale;
$old_lang_set = $this->locale_set; $old_lang_set = $this->locale_set;
$old_domain = $this->domain; $old_domain = $this->domain;
$old_encoding = $this->encoding;
$old_base_locale_path = $this->base_locale_path; $old_base_locale_path = $this->base_locale_path;
$old_base_content_path = $this->base_content_path; $old_base_content_path = $this->base_content_path;
@@ -186,6 +202,7 @@ class L10n
// now we loop over lang compositions to get the base path // now we loop over lang compositions to get the base path
// then we check // then we check
$locales = $this->listLocales($locale); $locales = $this->listLocales($locale);
$encoding = $this->getEncodingFromLocale($locale);
foreach ($locales as $_locale) { foreach ($locales as $_locale) {
$this->base_content_path = $_locale . DIRECTORY_SEPARATOR $this->base_content_path = $_locale . DIRECTORY_SEPARATOR
. 'LC_MESSAGES' . DIRECTORY_SEPARATOR; . 'LC_MESSAGES' . DIRECTORY_SEPARATOR;
@@ -202,6 +219,7 @@ class L10n
if (is_readable($this->mofile)) { if (is_readable($this->mofile)) {
// locale and domain current wanted // locale and domain current wanted
$this->locale = $locale; $this->locale = $locale;
$this->encoding = $encoding;
$this->domain = $domain; $this->domain = $domain;
// set empty domains path with current locale // set empty domains path with current locale
if (empty($this->domains[$locale])) { if (empty($this->domains[$locale])) {
@@ -225,6 +243,7 @@ class L10n
$this->mofile = $old_mofile; $this->mofile = $old_mofile;
$this->locale = $old_lang; $this->locale = $old_lang;
$this->locale_set = $old_lang_set; $this->locale_set = $old_lang_set;
$this->encoding = $old_encoding;
$this->domain = $old_domain; $this->domain = $old_domain;
$this->base_locale_path = $old_base_locale_path; $this->base_locale_path = $old_base_locale_path;
$this->base_content_path = $old_base_content_path; $this->base_content_path = $old_base_content_path;
@@ -258,21 +277,36 @@ class L10n
return $this->l10n; return $this->l10n;
} }
/**
* Extract encoding from Locale, or fallback to override one if not set
*
* @param string $locale
* @return string
*/
private function getEncodingFromLocale(string $locale): string
{
// extract charset from $locale
// if not set get override encoding
preg_match('/(?:\\.(?P<charset>[-A-Za-z0-9_]+))/', $locale, $matches);
return $matches['charset'] ?? $this->override_encoding;
}
/** /**
* Get the local as array same to the GetLocale::setLocale return * Get the local as array same to the GetLocale::setLocale return
* This does not set from outside, but only what is set in the l10n class * This does not set from outside, but only what is set in the l10n class
* *
* @return array{locale: string, lang: string|null, domain: string, encoding: string|null, path: string} * @return array{locale: string, lang: string, lang_short: string, domain: string, encoding: string, path: string}
*/ */
public function getLocaleAsArray(): array public function getLocaleAsArray(): array
{ {
$locale = L10n::parseLocale($this->getLocale()); $locale = L10n::parseLocale($this->getLocale());
return [ return [
'locale' => $this->getLocale(), 'locale' => $this->getLocale(),
'lang' => $locale['lang'] 'lang' => ($locale['lang'] ?? '')
. (!empty($locale['country']) ? '_' . $locale['country'] : ''), . (!empty($locale['country']) ? '_' . $locale['country'] : ''),
'lang_short' => $locale['lang'] ?? '',
'domain' => $this->getDomain(), 'domain' => $this->getDomain(),
'encoding' => $locale['charset'], 'encoding' => $this->getEncoding(),
'path' => $this->getBaseLocalePath(), 'path' => $this->getBaseLocalePath(),
]; ];
} }
@@ -515,6 +549,37 @@ class L10n
return $this->locale_set; return $this->locale_set;
} }
/**
* Set override encoding
*
* @param string $encoding
* @return void
*/
public function setOverrideEncoding(string $encoding): void
{
$this->override_encoding = $encoding;
}
/**
* return current set override encoding
*
* @return string
*/
public function getOverrideEncoding(): string
{
return $this->override_encoding;
}
/**
* Current set encoding
*
* @return string
*/
public function getEncoding(): string
{
return $this->encoding;
}
/** /**
* get current set language * get current set language
* *

View File

@@ -277,6 +277,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
private $acl_admin = 0; private $acl_admin = 0;
/** @var array<mixed> */ /** @var array<mixed> */
public $security_level; public $security_level;
/** @var array<string,mixed> Login ACL */
public $login_acl = [];
// layout publics // layout publics
/** @var int */ /** @var int */
public $table_width; public $table_width;
@@ -308,7 +310,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* @param array<mixed> $db_config db config array, mandatory * @param array<mixed> $db_config db config array, mandatory
* @param \CoreLibs\Debug\Logging $log Logging class * @param \CoreLibs\Debug\Logging $log Logging class
* @param \CoreLibs\Language\L10n $l10n l10n language class * @param \CoreLibs\Language\L10n $l10n l10n language class
* @param array<string,string> $locale locale array from ::setLocale * @param array<string,mixed> $login_acl Login ACL array,
* at least base/admin should be set
* @param array<mixed>|null $table_arrays Override table array data * @param array<mixed>|null $table_arrays Override table array data
* instead of try to load from * instead of try to load from
* include file * include file
@@ -318,7 +321,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
array $db_config, array $db_config,
\CoreLibs\Debug\Logging $log, \CoreLibs\Debug\Logging $log,
\CoreLibs\Language\L10n $l10n, \CoreLibs\Language\L10n $l10n,
array $locale, array $login_acl,
?array $table_arrays = null, ?array $table_arrays = null,
) { ) {
// init logger if not set // init logger if not set
@@ -327,19 +330,19 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->log->setLogPer('class', false); $this->log->setLogPer('class', false);
// init the language class // init the language class
$this->l = $l10n; $this->l = $l10n;
// legacy lang vars set // parse and read, legacy stuff
$locale = $this->l->getLocaleAsArray();
$this->encoding = $locale['encoding']; $this->encoding = $locale['encoding'];
$this->lang = $locale['lang']; $this->lang = $locale['lang'];
// get first part from lang $this->lang_short = $locale['lang_short'];
$this->lang_short = explode('_', $locale['lang'])[0]; $this->domain = $locale['domain'];
$this->domain = $this->l->getDomain(); $this->lang_dir = $locale['path'];
$this->lang_dir = $this->l->getBaseLocalePath();
// load config array // load config array
// get table array definitions for current page name // get table array definitions for current page name
$this->login_acl = $login_acl;
// security settings // security settings
$this->base_acl_level = (int)$_SESSION['BASE_ACL_LEVEL']; $this->base_acl_level = $this->login_acl['base'] ?? 0;
$this->acl_admin = (int)$_SESSION['ADMIN']; $this->acl_admin = $this->login_acl['admin'] ?? 0;
// replace any non valid variable names and set my page name // replace any non valid variable names and set my page name
$this->my_page_name = str_replace( $this->my_page_name = str_replace(
@@ -377,7 +380,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->base_acl_level, $this->base_acl_level,
$this->acl_admin $this->acl_admin
); );
// $this->log->debug('SESSION FORM', 'sessin: ' . $this->log->prAr($_SESSION));
// here should be a check if the config_array is correct ... // here should be a check if the config_array is correct ...
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) { if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
$this->field_array = $config_array['show_fields']; $this->field_array = $config_array['show_fields'];

View File

@@ -160,13 +160,11 @@ class SmartyExtend extends \Smarty
* also registers the getvar caller plugin * also registers the getvar caller plugin
* *
* @param \CoreLibs\Language\L10n $l10n l10n language class * @param \CoreLibs\Language\L10n $l10n l10n language class
* @param array<string,string> $locale locale data read from setLocale
* @param string|null $cache_id * @param string|null $cache_id
* @param string|null $compile_id * @param string|null $compile_id
*/ */
public function __construct( public function __construct(
\CoreLibs\Language\L10n $l10n, \CoreLibs\Language\L10n $l10n,
array $locale,
?string $cache_id = null, ?string $cache_id = null,
?string $compile_id = null ?string $compile_id = null
) { ) {
@@ -192,13 +190,12 @@ class SmartyExtend extends \Smarty
// iinit lang // iinit lang
$this->l10n = $l10n; $this->l10n = $l10n;
// parse and read, legacy stuff // parse and read, legacy stuff
$locale = $this->l10n->getLocaleAsArray();
$this->encoding = $locale['encoding']; $this->encoding = $locale['encoding'];
$this->lang = $locale['lang']; $this->lang = $locale['lang'];
// get first part from lang $this->lang_short = $locale['lang_short'];
$this->lang_short = explode('_', $locale['lang'])[0]; $this->domain = $locale['domain'];
$this->domain = $this->l10n->getDomain(); $this->lang_dir = $locale['path'];
$this->locale_set = $this->l10n->getLocaleSet();
$this->lang_dir = $this->l10n->getBaseLocalePath();
// opt load functions so we can use legacy init for smarty run perhaps // opt load functions so we can use legacy init for smarty run perhaps
\CoreLibs\Language\L10n::loadFunctions(); \CoreLibs\Language\L10n::loadFunctions();
@@ -566,6 +563,7 @@ class SmartyExtend extends \Smarty
* @param string|null $set_page_width PAGE_WIDTH * @param string|null $set_page_width PAGE_WIDTH
* @param string|null $set_stylesheet STYLESHEET * @param string|null $set_stylesheet STYLESHEET
* @param string|null $set_javascript JAVASCRIPT * @param string|null $set_javascript JAVASCRIPT
* @param string|null $set_user_name _SESSION['USER_NAME']
* @return void * @return void
*/ */
private function setSmartyVars( private function setSmartyVars(
@@ -582,7 +580,8 @@ class SmartyExtend extends \Smarty
?string $set_admin_javascript = null, ?string $set_admin_javascript = null,
?string $set_page_width = null, ?string $set_page_width = null,
?string $set_stylesheet = null, ?string $set_stylesheet = null,
?string $set_javascript = null ?string $set_javascript = null,
?string $set_user_name = null,
): void { ): void {
// trigger deprecation // trigger deprecation
if ( if (
@@ -597,7 +596,8 @@ class SmartyExtend extends \Smarty
$admin_call === true && ( $admin_call === true && (
$set_admin_stylesheet === null || $set_admin_stylesheet === null ||
$set_admin_javascript === null || $set_admin_javascript === null ||
$set_page_width === null $set_page_width === null ||
$set_user_name === null
) )
) || ) ||
( (
@@ -626,6 +626,7 @@ class SmartyExtend extends \Smarty
$set_page_width = $set_page_width ?? PAGE_WIDTH; $set_page_width = $set_page_width ?? PAGE_WIDTH;
$set_stylesheet = $set_stylesheet ?? STYLESHEET; $set_stylesheet = $set_stylesheet ?? STYLESHEET;
$set_javascript = $set_javascript ?? JAVASCRIPT; $set_javascript = $set_javascript ?? JAVASCRIPT;
$set_user_name = $set_user_name ?? $_SESSION['USER_NAME'] ?? '';
// depreacte call globals cms on null 4mcs // depreacte call globals cms on null 4mcs
if ( if (
$cms === null && $cms === null &&
@@ -734,7 +735,7 @@ class SmartyExtend extends \Smarty
$this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR; $this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR;
$this->DATA['JS_FILE_UPLOADER'] = $this->JS_FILE_UPLOADER; $this->DATA['JS_FILE_UPLOADER'] = $this->JS_FILE_UPLOADER;
// user name // user name
$this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : ''; $this->DATA['USER_NAME'] = $set_user_name;
// the template part to include into the body // the template part to include into the body
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME; $this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE; $this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;

View File

@@ -7,6 +7,14 @@ namespace tests;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\MockObject;
/*
Not yet covered tests:
- loginGetLocale
- loginGetHeaderColor
- loginGetPages
- loginGetEuid
*/
/** /**
* Test class for ACL\Login * Test class for ACL\Login
* @coversDefaultClass \CoreLibs\ACL\Login * @coversDefaultClass \CoreLibs\ACL\Login
@@ -1114,6 +1122,7 @@ final class CoreLibsACLLoginTest extends TestCase
'logout_target' => '', 'logout_target' => '',
'site_locale' => 'en_US.UTF-8', 'site_locale' => 'en_US.UTF-8',
'site_domain' => 'admin', 'site_domain' => 'admin',
'site_encoding' => 'UTF-8',
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR 'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
. 'includes' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR
. 'locale' . DIRECTORY_SEPARATOR, . 'locale' . DIRECTORY_SEPARATOR,
@@ -1796,6 +1805,7 @@ final class CoreLibsACLLoginTest extends TestCase
'logout_target' => '', 'logout_target' => '',
'site_locale' => 'en_US.UTF-8', 'site_locale' => 'en_US.UTF-8',
'site_domain' => 'admin', 'site_domain' => 'admin',
'site_encoding' => 'UTF-8',
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR 'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
. 'includes' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR
. 'locale' . DIRECTORY_SEPARATOR, . 'locale' . DIRECTORY_SEPARATOR,
@@ -1909,6 +1919,7 @@ final class CoreLibsACLLoginTest extends TestCase
'logout_target' => '', 'logout_target' => '',
'site_locale' => 'en_US.UTF-8', 'site_locale' => 'en_US.UTF-8',
'site_domain' => 'admin', 'site_domain' => 'admin',
'site_encoding' => 'UTF-8',
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR 'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
. 'includes' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR
. 'locale' . DIRECTORY_SEPARATOR, . 'locale' . DIRECTORY_SEPARATOR,
@@ -1996,6 +2007,7 @@ final class CoreLibsACLLoginTest extends TestCase
'logout_target' => '', 'logout_target' => '',
'site_locale' => 'en_US.UTF-8', 'site_locale' => 'en_US.UTF-8',
'site_domain' => 'admin', 'site_domain' => 'admin',
'site_encoding' => 'UTF-8',
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR 'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
. 'includes' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR
. 'locale' . DIRECTORY_SEPARATOR, . 'locale' . DIRECTORY_SEPARATOR,
@@ -2091,6 +2103,7 @@ final class CoreLibsACLLoginTest extends TestCase
'logout_target' => '', 'logout_target' => '',
'site_locale' => 'en_US.UTF-8', 'site_locale' => 'en_US.UTF-8',
'site_domain' => 'admin', 'site_domain' => 'admin',
'site_encoding' => 'UTF-8',
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR 'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
. 'includes' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR
. 'locale' . DIRECTORY_SEPARATOR, . 'locale' . DIRECTORY_SEPARATOR,

View File

@@ -14,6 +14,13 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsLanguageGetLocaleTest extends TestCase final class CoreLibsLanguageGetLocaleTest extends TestCase
{ {
public const SITE_ENCODING = 'UTF-8';
public const SITE_LOCALE = 'en_US.UTF-8';
public const SITE_DOMAIN = 'admin';
public const LOCALE_PATH = __DIR__ . DIRECTORY_SEPARATOR
. 'includes' . DIRECTORY_SEPARATOR
. 'locale' . DIRECTORY_SEPARATOR;
/** /**
* set all constant variables that must be set before call * set all constant variables that must be set before call
* *
@@ -22,7 +29,7 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
public static function setUpBeforeClass(): void public static function setUpBeforeClass(): void
{ {
// default web page encoding setting // default web page encoding setting
if (!defined('DEFAULT_ENCODING')) { /* if (!defined('DEFAULT_ENCODING')) {
define('DEFAULT_ENCODING', 'UTF-8'); define('DEFAULT_ENCODING', 'UTF-8');
} }
if (!defined('DEFAULT_LOCALE')) { if (!defined('DEFAULT_LOCALE')) {
@@ -35,9 +42,9 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
} }
if (!defined('SITE_LOCALE')) { if (!defined('SITE_LOCALE')) {
define('SITE_LOCALE', DEFAULT_LOCALE); define('SITE_LOCALE', DEFAULT_LOCALE);
} } */
// just set // just set
if (!defined('BASE')) { /* if (!defined('BASE')) {
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR); define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
} }
if (!defined('INCLUDES')) { if (!defined('INCLUDES')) {
@@ -51,7 +58,7 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
} }
if (!defined('CONTENT_PATH')) { if (!defined('CONTENT_PATH')) {
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR); define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
} } */
// array session // array session
$_SESSION = []; $_SESSION = [];
global $_SESSION; global $_SESSION;
@@ -62,7 +69,7 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
* *
* @return array<mixed> * @return array<mixed>
*/ */
public function setLocaleProvider(): array /* public function setLocaleProvider(): array
{ {
return [ return [
// 0: locale // 0: locale
@@ -233,7 +240,7 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
// TODO invalid params (bad path) (no override) // TODO invalid params (bad path) (no override)
// TODO param calls, but with override set // TODO param calls, but with override set
]; ];
} } */
/** /**
* Undocumented function * Undocumented function
@@ -252,7 +259,7 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
* @param string|null $deprecation_message * @param string|null $deprecation_message
* @return void * @return void
*/ */
public function testsetLocale( /* public function testsetLocale(
?string $language, ?string $language,
?string $domain, ?string $domain,
?string $encoding, ?string $encoding,
@@ -347,6 +354,214 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
// unset all vars // unset all vars
$_SESSION = []; $_SESSION = [];
unset($GLOBALS['OVERRIDE_LANG']); unset($GLOBALS['OVERRIDE_LANG']);
} */
/**
* all the test data
*
* @return array<mixed>
*/
public function setLocaleFromSessionProvider(): array
{
return [
// 0: locale
// 1: domain
// 2: encoding
// 3: path
// 4: SESSION: DEFAULT_LOCALE
// 5: SESSION: DEFAULT_CHARSET
// 5: SESSION: DEFAULT_DOMAIN
// 6: SESSION: LOCALE_PATH
// 6: expected array
// 7: deprecation message
'all session vars set' => [
// lang, domain, encoding, path
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
// SESSION SETTINGS: locale, charset, domain, path
'ja_JP.UTF-8', 'UTF-8', 'admin', __DIR__ . '/locale_other/',
// return array
[
'locale' => 'ja_JP.UTF-8',
'lang' => 'ja_JP',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?locale_other\/$/",
],
],
// param lang and domain (no override)
'no session set, only parameters' => [
// lang, domain, encoding, path
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
// SESSION SETTINGS: locale, charset, domain, path
null, null, null, null,
// return array
[
'locale' => 'en_US.UTF-8',
'lang' => 'en_US',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// special parse session check for locales
'all session vars set, short lang' => [
// lang, domain, encoding, path
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
// SESSION SETTINGS: locale, charset, domain, path
'ja', 'UTF-8', 'admin', __DIR__ . '/locale_other/',
// return array
[
'locale' => 'ja',
'lang' => 'ja',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?locale_other\/$/",
],
],
// lang with modifier
// param lang and domain (no override)
'long locale, domain, encoding params, no sessions' => [
// lang, domain, encoding, path
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
// SESSION SETTINGS: locale, charset, domain, path
'de_CH.UTF-8@euro', 'admin', 'UTF-8', __DIR__ . '/includes/locale/',
// return array
[
'locale' => 'de_CH.UTF-8@euro',
'lang' => 'de_CH',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// missing session values check
// special parse session check for locales
'session missing encoding, set from parameters' => [
// lang, domain, encoding, path
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
// SESSION SETTINGS: locale, charset, domain, path
'ja', null, 'admin', __DIR__ . '/locale_other/',
// return array
[
'locale' => 'ja',
'lang' => 'ja',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?locale_other\/$/",
],
],
// null return check for invalid entries
'no session set, only parameters, all invalid' => [
// lang, domain, encoding, path
'###', '&&&&', '$$$$', 'foo_bar_path',
// SESSION SETTINGS: locale, charset, domain, path
null, null, null, null,
// return array
[
'locale' => null,
'lang' => null,
'domain' => null,
'encoding' => null,
'path' => null,
],
],
// invalid session names, fall backup
'all session vars are invalid, fallback' => [
// lang, domain, encoding, path
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
// SESSION SETTINGS: locale, charset, domain, path
'###', '&&&&', '$$$$', 'foo_bar_path',
// return array
[
'locale' => 'en_US.UTF-8',
'lang' => 'en_US',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
];
}
/**
* Undocumented function
*
* @covers ::setLocale
* @dataProvider setLocaleFromSessionProvider
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
*
* @param string| $language
* @param string| $domain
* @param string| $encoding
* @param string| $path
* @param string|null $SESSION_DEFAULT_LOCALE
* @param string|null $SESSION_DEFAULT_CHARSET
* @param string|null $SESSION_DEFAULT_DOMAIN
* @param string|null $SESSION_LOCALE_PATH
* @param array<mixed> $expected
* @return void
*/
public function testsetLocaleFromSession(
string $language,
string $domain,
string $encoding,
string $path,
?string $SESSION_DEFAULT_LOCALE,
?string $SESSION_DEFAULT_CHARSET,
?string $SESSION_DEFAULT_DOMAIN,
?string $SESSION_LOCALE_PATH,
array $expected,
): void {
$return_lang_settings = [];
global $_SESSION;
// set override
if ($SESSION_DEFAULT_LOCALE !== null) {
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
}
if ($SESSION_DEFAULT_CHARSET !== null) {
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
}
if ($SESSION_DEFAULT_DOMAIN !== null) {
$_SESSION['DEFAULT_DOMAIN'] = $SESSION_DEFAULT_DOMAIN;
}
if ($SESSION_LOCALE_PATH !== null) {
$_SESSION['LOCALE_PATH'] = $SESSION_LOCALE_PATH;
}
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocaleFromSession(
$language,
$domain,
$encoding,
$path
);
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
foreach (
[
'locale', 'lang', 'domain', 'encoding', 'path'
] as $key
) {
$value = $expected[$key];
if (
!empty($value) &&
strpos($value, "/") === 0
) {
// this is regex
$this->assertMatchesRegularExpression(
$value,
$return_lang_settings[$key] ?? '',
'assert regex failed for ' . $key
);
} else {
// assert equal
$this->assertEquals(
$value,
$return_lang_settings[$key],
'assert equal failed for ' . $key
);
}
}
// unset all vars
$_SESSION = [];
unset($GLOBALS['OVERRIDE_LANG']);
} }
} }

View File

@@ -84,94 +84,141 @@ final class CoreLibsLanguageL10nTest extends TestCase
{ {
return [ return [
// 0: locale // 0: locale
// 1: domain // 1: encoding
// 2: encoding // 2: domain
// 3: path // 3: path
// 4: locale expected // 4: locale expected
// 5: locale set expected // 5: locale set expected
// 6: lang expected // 6: lang expected
// 7: encoding expected // 7: lang short expected
// 8: domain exepcted // 8: encoding expected
// 9: context (null for none) // 9: domain exepcted
// 10: test string in // 10: context (null for none)
// 11: test translated // 11: test string in
// 12: deprecation message (until removed) // 12: test translated
// 13: deprecation message (until removed)
// new style load // new style load
'gettext load en' => [ 'gettext load en' => [
'en_US.UTF-8', 'en_US.UTF-8',
'UTF-8',
'frontend', 'frontend',
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR, __DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
// // 4, 5, 6, 7, 8, 9
'en_US.UTF-8', 'en_US.UTF-8',
'en_US', 'en_US',
'en_US', 'en_US',
'en',
'UTF-8', 'UTF-8',
'frontend', 'frontend',
// 10
null, null,
// 11, 12
'Original', 'Original',
'Translated frontend en_US', 'Translated frontend en_US',
// 13
null, null,
], ],
'gettext load en' => [ 'gettext load en' => [
'en_US.UTF-8', 'en_US.UTF-8',
'UTF-8',
'frontend', 'frontend',
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR, __DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
// //
'en_US.UTF-8', 'en_US.UTF-8',
'en_US', 'en_US',
'en_US', 'en_US',
'en',
'UTF-8', 'UTF-8',
'frontend', 'frontend',
//
'context', 'context',
//
'Original', 'Original',
'Original context frontend en_US', 'Original context frontend en_US',
//
null, null,
], ],
'gettext load ja' => [ 'gettext load ja' => [
'ja_JP.UTF-8', 'ja_JP.UTF-8',
'UTF-8',
'admin', 'admin',
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR, __DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
// //
'ja_JP.UTF-8', 'ja_JP.UTF-8',
'ja_JP', 'ja_JP',
'ja_JP', 'ja_JP',
'ja',
'UTF-8', 'UTF-8',
'admin', 'admin',
//
null, null,
//
'Original', 'Original',
'Translated admin ja_JP', 'Translated admin ja_JP',
//
null,
],
// load short locale with different encoding
'gettext load short ja no encoding' => [
'ja',
'SJIS',
'admin',
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
//
'ja',
'ja',
'ja',
'ja',
'SJIS',
'admin',
//
null,
//
'Original',
'Translated admin ja_JP',
//
null, null,
], ],
// mixed path and domain [DEPRECATED] // mixed path and domain [DEPRECATED]
'mixed path and domain [DEPRECATED]' => [ 'mixed path and domain [DEPRECATED]' => [
'en_US.UTF-8', 'en_US.UTF-8',
'UTF-8',
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR, __DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
'frontend', 'frontend',
// //
'en_US.UTF-8', 'en_US.UTF-8',
'en_US', 'en_US',
'en_US', 'en_US',
'en',
'UTF-8', 'UTF-8',
'frontend', 'frontend',
//
'context', 'context',
//
'Original', 'Original',
'Original context frontend en_US', 'Original context frontend en_US',
//
'L10n constructor parameter switch is no longer supported. domain is 2nd, path is 3rd parameter' 'L10n constructor parameter switch is no longer supported. domain is 2nd, path is 3rd parameter'
], ],
// unset path // unset path
'unset path with locale and domain [DEPRECATED]' => [ 'unset path with locale and domain [DEPRECATED]' => [
'ja_JP.UTF-8', 'ja_JP.UTF-8',
'UTF-8',
'admin', 'admin',
null, null,
// //
'ja_JP.UTF-8', 'ja_JP.UTF-8',
'ja_JP', 'ja_JP',
'ja_JP', 'ja_JP',
'ja',
'UTF-8', 'UTF-8',
'admin', 'admin',
//
null, null,
//
'Original', 'Original',
'Translated admin ja_JP', 'Translated admin ja_JP',
//
'Empty path parameter is no longer allowed if locale and domain are set', 'Empty path parameter is no longer allowed if locale and domain are set',
], ],
// null set // null set
@@ -179,15 +226,20 @@ final class CoreLibsLanguageL10nTest extends TestCase
'', '',
'', '',
'', '',
'',
// //
'', '',
'', '',
'', '',
'', '',
'', // unset on empty call
'', '',
//
null, null,
//
'Original', 'Original',
'Original', 'Original',
//
null, null,
] ]
]; ];
@@ -201,11 +253,13 @@ final class CoreLibsLanguageL10nTest extends TestCase
* @testdox check l10n init with Locale $locale, Path $path, Domain $domain, Legacy: $legacy with $context [$_dataName] * @testdox check l10n init with Locale $locale, Path $path, Domain $domain, Legacy: $legacy with $context [$_dataName]
* *
* @param string|null $locale * @param string|null $locale
* @param string|null $encoding
* @param string|null $domain * @param string|null $domain
* @param string|null $path * @param string|null $path
* @param string $locale_expected * @param string $locale_expected
* @param string $locale_set_expected * @param string $locale_set_expected
* @param string $lang_expected * @param string $lang_expected
* @param string $lang_short_expected
* @param string $encoding_expected * @param string $encoding_expected
* @param string $domain_expected * @param string $domain_expected
* @param string|null $context * @param string|null $context
@@ -216,11 +270,13 @@ final class CoreLibsLanguageL10nTest extends TestCase
*/ */
public function testL10nObject( public function testL10nObject(
?string $locale, ?string $locale,
?string $encoding,
?string $domain, ?string $domain,
?string $path, ?string $path,
string $locale_expected, string $locale_expected,
string $locale_set_expected, string $locale_set_expected,
string $lang_expected, string $lang_expected,
string $lang_short_expected,
string $encoding_expected, string $encoding_expected,
string $domain_expected, string $domain_expected,
?string $context, ?string $context,
@@ -241,16 +297,18 @@ final class CoreLibsLanguageL10nTest extends TestCase
if ($locale === null) { if ($locale === null) {
$l10n = new \CoreLibs\Language\L10n(); $l10n = new \CoreLibs\Language\L10n();
} elseif ($domain === null) { } elseif ($domain === null) {
// same as if locale is null // deprecated, locale + domain must be set, handled like empty calls
$l10n = new \CoreLibs\Language\L10n($locale); $l10n = new \CoreLibs\Language\L10n($locale);
} elseif ($path === null) { } elseif ($path === null) {
// deprecated, path must be set // deprecated, path must be set, will thow DEPRECATION error, handled like empty
$l10n = new \CoreLibs\Language\L10n($locale, $domain); $l10n = new \CoreLibs\Language\L10n($locale, $domain);
} else { } elseif ($encoding === null) {
// if encoding not found will be UTF-8
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path); $l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
} else {
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path, $encoding);
} }
restore_error_handler(); restore_error_handler();
// print "LOC: " . $locale . ", " . $l10n->getLocale() . ", " . $locale_expected . "\n";
// print "MO: " . $l10n->getMoFile() . "\n"; // print "MO: " . $l10n->getMoFile() . "\n";
$this->assertEquals( $this->assertEquals(
$locale_expected, $locale_expected,
@@ -286,6 +344,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
[ [
'locale' => $locale_expected, 'locale' => $locale_expected,
'lang' => $lang_expected, 'lang' => $lang_expected,
'lang_short' => $lang_short_expected,
'domain' => $domain_expected, 'domain' => $domain_expected,
'encoding' => $encoding_expected, 'encoding' => $encoding_expected,
'path' => $path 'path' => $path

View File

@@ -0,0 +1 @@
ja_JP