Compare commits

..

8 Commits

Author SHA1 Message Date
Clemens Schwaighofer
07aea9d7b2 Add local set to L10n class and use it in Smarty Extended
The actual locale name of the folder where the mo file is located can be
queried with getLocaleSet()

This is used in smarty extended to set the smarty translation template
for javascript strings
2022-04-25 10:15:11 +09:00
Clemens Schwaighofer
edcdbee523 phpunit tests update for acl login, db io, fix smarty extended class 2022-04-25 09:52:13 +09:00
Clemens Schwaighofer
43b51895f0 Bug fixes in ACL\Login and DB\IO\Extended 2022-04-22 15:32:06 +09:00
Clemens Schwaighofer
d0e294ecf5 Fix Language encoding move documentation 2022-04-18 17:57:04 +09:00
Clemens Schwaighofer
3c35341e8b Bug fix in smarty block.t plugin
Equal instead of assign for plural text translate calls.

Update smarty tests with more detail checks of translations
2022-04-18 10:52:37 +09:00
Clemens Schwaighofer
daf1f9263c Change all function L10n calls to one underscore, test updates
That change is done to be compatible with the phpmyadmin translator
class so this can be a drop in replacement or other way around.

Update smarty block.t to only check for _* functions and not any pre
loaded language class
2022-04-18 10:33:45 +09:00
Clemens Schwaighofer
805c695d68 Language\L10n method name fixes, update Smarty block.t.php
__pn for context plural has now correct name __np

Update smarty plugin block.t.php to use __* named gettext methods for
all calls, for __n/__np/__/__p calls we fallback to check internal set
class on l10n object variable.

This will be removed in future calls
2022-04-15 16:53:02 +09:00
Clemens Schwaighofer
ffdd45e32a Fix phpUnit tests with constant settings and missing checks
BASE constant setting: moved all to same base folder in 4dev/tests
check all other CONSTANT settings if they are already set and skip (used
only in Language default set)

Add missing phpunit check for array merge recursive
2022-04-15 15:19:30 +09:00
21 changed files with 507 additions and 236 deletions

View File

@@ -13,18 +13,73 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsACLLoginTest extends TestCase final class CoreLibsACLLoginTest extends TestCase
{ {
private static $db;
private static $log;
/** /**
* Undocumented function * start DB conneciton, setup DB, etc
* *
* @return void * @return void
*/ */
protected function setUp(): void public static function setUpBeforeClass(): void
{ {
if (!extension_loaded('pgsql')) { if (!extension_loaded('pgsql')) {
$this->markTestSkipped( self::markTestSkipped(
'The PgSQL extension is not available.' 'The PgSQL extension is not available.'
); );
} }
// logger is always needed
// define basic connection set valid and one invalid
self::$log = new \CoreLibs\Debug\Logging([
// 'log_folder' => __DIR__ . DIRECTORY_SEPARATOR . 'log',
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
'file_id' => 'CoreLibs-ACL-Login-Test',
'debug_all' => false,
'echo_all' => false,
'print_all' => false,
]);
// if we do have pgsql, we need to create a test DB or check that one
// exists and clean the table to zero state
self::$db = new \CoreLibs\DB\IO(
[
'db_name' => 'corelibs_acl_login_test',
'db_user' => 'corelibs_acl_login_test',
'db_pass' => 'corelibs_acl_login_test',
'db_host' => 'localhost',
'db_port' => 5432,
'db_schema' => 'public',
'db_type' => 'pgsql',
'db_encoding' => '',
'db_ssl' => 'allow', // allow, disable, require, prefer
'db_debug' => true,
],
self::$log
);
if (!self::$db->dbGetConnectionStatus()) {
self::markTestSkipped(
'Cannot connect to valid Test DB for ACL\Login test.'
);
}
/*
// check if they already exist, drop them
if ($db->dbShowTableMetaData('table_with_primary_key') !== false) {
$db->dbExec("DROP TABLE table_with_primary_key");
$db->dbExec("DROP TABLE table_without_primary_key");
$db->dbExec("DROP TABLE test_meta");
}
*/
}
/**
* close db
*
* @return void
*/
public static function tearDownAfterClass(): void
{
if (self::$db->dbGetConnectionStatus()) {
self::$db->dbClose();
}
} }
/** /**

View File

@@ -7,6 +7,7 @@ declare(strict_types=1);
namespace tests; namespace tests;
use Exception;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
/** /**
@@ -274,7 +275,6 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
} }
/** /**
* TODO: create provider for n array merge
* provides array listing for the merge test * provides array listing for the merge test
* *
* @return array * @return array
@@ -282,6 +282,61 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
public function arrayMergeRecursiveProvider(): array public function arrayMergeRecursiveProvider(): array
{ {
return [ return [
// 0: expected
// 1..n: to merge arrays
// n+1: trigger for handle keys as string
'two arrays' => [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 1, 'b' => 2],
['b' => 2, 'c' => 3],
],
'two arrays, string flag' => [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 1, 'b' => 2],
['b' => 2, 'c' => 3],
true,
],
// non hash arrays
'non hash array merge, no string flag' => [
[3, 4, 5],
[1, 2, 3],
[3, 4, 5],
],
'non hash array merge, string flag' => [
[1, 2, 3, 3, 4, 5],
[1, 2, 3],
[3, 4, 5],
true
],
];
}
/**
* for warning checks
*
* @return array
*/
public function arrayMergeRecursiveProviderWarning(): array
{
return [
// error <2 arguments
'too view arguments' => [
'arrayMergeRecursive needs two or more array arguments',
[1]
],
// error <2 arrays
'only one array' => [
'arrayMergeRecursive needs two or more array arguments',
[1],
true,
],
// error element is not array
'non array between array' => [
'arrayMergeRecursive encountered a non array argument',
[1],
'string',
[2]
],
]; ];
} }
@@ -626,21 +681,43 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
* Undocumented function * Undocumented function
* *
* @covers ::arrayMergeRecursive * @covers ::arrayMergeRecursive
* @#dataProvider arrayMergeRecursiveProvider * @dataProvider arrayMergeRecursiveProvider
* @testdox arrayMergeRecursive ... will be $expected [$_dataName] * @testdox arrayMergeRecursive ... [$_dataName]
* *
* @param array $input nested array set as each parameter
* @param bool $flag
* @param bool|array $expected
* @return void * @return void
* array $input, bool $flag, $expected *
*/ */
public function testArrayMergeRecursive(): void public function testArrayMergeRecursive(): void
{ {
$this->assertTrue(true, 'Implement proper test run'); $arrays = func_get_args();
$this->markTestIncomplete( // first is expected array, always
'testArrayMergeRecursive has not been implemented yet.' $expected = array_shift($arrays);
$output = \CoreLibs\Combined\ArrayHandler::arrayMergeRecursive(
...$arrays
); );
$this->assertEquals(
$expected,
$output
);
}
/**
* Undocumented function
*
* @covers ::arrayMergeRecursive
* @dataProvider arrayMergeRecursiveProviderWarning
* @testdox arrayMergeRecursive with E_USER_WARNING [$_dataName]
*
* @return void
*/
public function testArrayMergeRecursiveWarningA(): void
{
$arrays = func_get_args();
// first is expected warning
$warning = array_shift($arrays);
$this->expectWarning();
$this->expectWarningMessage($warning);
\CoreLibs\Combined\ArrayHandler::arrayMergeRecursive(...$arrays);
} }
/** /**

View File

@@ -68,6 +68,7 @@ final class CoreLibsCreateSessionTest extends TestCase
*/ */
public function testStartSession(string $input, string $type, $expected_n, $expected_i): void public function testStartSession(string $input, string $type, $expected_n, $expected_i): void
{ {
// NEEDS MOCKING
/* $session_id = ''; /* $session_id = '';
switch ($type) { switch ($type) {
case 'p': case 'p':
@@ -97,7 +98,8 @@ final class CoreLibsCreateSessionTest extends TestCase
if ($type == 'g') { if ($type == 'g') {
unset($GLOBALS['SET_SESSION_NAME']); unset($GLOBALS['SET_SESSION_NAME']);
} */ } */
$this->markTestSkipped('No implementation for Create\Session. Cannot run session_start in CLI'); $this->markTestSkipped('[CoreLibsCreateSessionTest] No implementation '
. 'for Create\Session. Cannot run session_start in CLI');
} }
} }

View File

@@ -145,7 +145,7 @@ final class CoreLibsDBIOTest extends TestCase
); );
if (!$db->dbGetConnectionStatus()) { if (!$db->dbGetConnectionStatus()) {
self::markTestSkipped( self::markTestSkipped(
'Cannot connect to valid Test DB.' 'Cannot connect to valid Test DB for DB\IO test.'
); );
} }
// check if they already exist, drop them // check if they already exist, drop them
@@ -2709,7 +2709,8 @@ final class CoreLibsDBIOTest extends TestCase
// comarep all, except timestamp that is a regex // comarep all, except timestamp that is a regex
foreach ($expected_history as $key => $value) { foreach ($expected_history as $key => $value) {
// check if starts with / because this is regex (timestamp) // check if starts with / because this is regex (timestamp)
if (strpos($value, "/") === 0) { // if (substr($expected_2, 0, 1) == '/) {
if (strpos($value, '/') === 0) {
// this is regex // this is regex
$this->assertMatchesRegularExpression( $this->assertMatchesRegularExpression(
$value, $value,

View File

@@ -54,14 +54,16 @@ final class CoreLibsDebugLoggingTest extends TestCase
'no options set, constant set' => [ 'no options set, constant set' => [
null, null,
[ [
'log_folder' => '/tmp/', 'log_folder' => str_replace('/configs', '', __DIR__)
. DIRECTORY_SEPARATOR . 'log/',
'debug_all' => false, 'debug_all' => false,
'print_all' => false, 'print_all' => false,
], ],
[ [
'constant' => [ 'constant' => [
'BASE' => '/tmp', 'BASE' => str_replace('/configs', '', __DIR__)
'LOG' => '/' . DIRECTORY_SEPARATOR,
'LOG' => 'log/'
] ]
] ]
], ],

View File

@@ -90,11 +90,16 @@ final class CoreLibsGetSystemTest extends TestCase
public function getPageNameProvider(): array public function getPageNameProvider(): array
{ {
return [ return [
// 0: input
// 1: expected default/WITH_EXTENSION
// 2: expected NO_EXTENSION
// 3: expected FULL_PATH, if first and last character are / use regex
'original set' => [ 'original set' => [
0 => null, // input 0 => null,
1 => 'phpunit', 1 => 'phpunit',
2 => 'phpunit', 2 => 'phpunit',
3 => 'www/vendor/bin/phpunit', // NOTE: this can change // NOTE: this can change, so it is a regex check
3 => "/^(\/?.*\/?)?www\/vendor\/bin\/phpunit$/",
], ],
'some path with extension' => [ 'some path with extension' => [
0 => '/some/path/to/file.txt', 0 => '/some/path/to/file.txt',
@@ -147,11 +152,13 @@ final class CoreLibsGetSystemTest extends TestCase
list ($host, $port) = \CoreLibs\Get\System::getHostName(); list ($host, $port) = \CoreLibs\Get\System::getHostName();
$this->assertEquals( $this->assertEquals(
$expected_host, $expected_host,
$host $host,
'failed expected host assert'
); );
$this->assertEquals( $this->assertEquals(
$expected_port, $expected_port,
$port $port,
'faile expected port assert'
); );
} }
@@ -176,20 +183,38 @@ final class CoreLibsGetSystemTest extends TestCase
// default 0, // default 0,
$this->assertEquals( $this->assertEquals(
$expected_0, $expected_0,
\CoreLibs\Get\System::getPageName() \CoreLibs\Get\System::getPageName(),
'failed default assert'
); );
$this->assertEquals( $this->assertEquals(
$expected_0, $expected_0,
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::WITH_EXTENSION) \CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::WITH_EXTENSION),
'failed WITH_EXTESION assert'
); );
$this->assertEquals( $this->assertEquals(
$expected_1, $expected_1,
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::NO_EXTENSION) \CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::NO_EXTENSION),
); 'failed NO_EXTENSION assert'
$this->assertEquals(
$expected_2,
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::FULL_PATH)
); );
// FULL PATH check can be equals or regex
$page_name_full_path = \CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::FULL_PATH);
if (
substr($expected_2, 0, 1) == '/' &&
substr($expected_2, -1, 1) == '/'
) {
// this is regex
$this->assertMatchesRegularExpression(
$expected_2,
$page_name_full_path,
'failed FULL_PATH assert regex'
);
} else {
$this->assertEquals(
$expected_2,
$page_name_full_path,
'failed FULL_PATH assert equals'
);
}
} }
} }

View File

@@ -22,17 +22,36 @@ 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
define('DEFAULT_ENCODING', 'UTF-8'); if (!defined('DEFAULT_ENCODING')) {
// default lang + encoding define('DEFAULT_ENCODING', 'UTF-8');
define('DEFAULT_LOCALE', 'en_US.UTF-8'); }
if (!defined('DEFAULT_LOCALE')) {
// default lang + encoding
define('DEFAULT_LOCALE', 'en_US.UTF-8');
}
// site // site
define('SITE_ENCODING', DEFAULT_ENCODING); if (!defined('SITE_ENCODING')) {
define('SITE_LOCALE', DEFAULT_LOCALE); define('SITE_ENCODING', DEFAULT_ENCODING);
}
if (!defined('SITE_LOCALE')) {
define('SITE_LOCALE', DEFAULT_LOCALE);
}
// just set // just set
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR); if (!defined('BASE')) {
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR); define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR); }
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR); if (!defined('INCLUDES')) {
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
}
if (!defined('LANG')) {
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
}
if (!defined('LOCALE')) {
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
}
if (!defined('CONTENT_PATH')) {
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
}
// array session // array session
$_SESSION = []; $_SESSION = [];
global $_SESSION; global $_SESSION;

View File

@@ -22,19 +22,37 @@ final class CoreLibsLanguageL10nTest extends TestCase
*/ */
public static function setUpBeforeClass(): void public static function setUpBeforeClass(): void
{ {
define('DEFAULT_LANG', 'en_US');
// default web page encoding setting // default web page encoding setting
define('DEFAULT_ENCODING', 'UTF-8'); if (!defined('DEFAULT_ENCODING')) {
// default lang + encoding define('DEFAULT_ENCODING', 'UTF-8');
define('DEFAULT_LOCALE', 'en_US.UTF-8'); }
if (!defined('DEFAULT_LOCALE')) {
// default lang + encoding
define('DEFAULT_LOCALE', 'en_US.UTF-8');
}
// site // site
define('SITE_LANG', DEFAULT_LANG); if (!defined('SITE_ENCODING')) {
define('SITE_ENCODING', DEFAULT_ENCODING);
}
if (!defined('SITE_LOCALE')) {
define('SITE_LOCALE', DEFAULT_LOCALE);
}
// just set // just set
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR); if (!defined('BASE')) {
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR); define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
define('LANG', 'lang' . DIRECTORY_SEPARATOR); }
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR); if (!defined('INCLUDES')) {
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR); define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
}
if (!defined('LANG')) {
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
}
if (!defined('LOCALE')) {
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
}
if (!defined('CONTENT_PATH')) {
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
}
} }
/** /**
@@ -91,10 +109,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
// 2: encoding // 2: encoding
// 3: path // 3: path
// 4: locale expected // 4: locale expected
// 5: domain exepcted // 5: locale set expected
// 6: context (null for none) // 6: domain exepcted
// 7: test string in // 7: context (null for none)
// 8: test translated // 8: test string in
// 9: test translated
// new style load // new style load
'gettext load en' => [ 'gettext load en' => [
'en_US.UTF-8', 'en_US.UTF-8',
@@ -102,6 +121,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
__DIR__ . 'includes/locale/', __DIR__ . 'includes/locale/',
// //
'en_US.UTF-8', 'en_US.UTF-8',
'en_US',
'frontend', 'frontend',
null, null,
'Original', 'Original',
@@ -113,6 +133,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
__DIR__ . 'includes/locale/', __DIR__ . 'includes/locale/',
// //
'en_US.UTF-8', 'en_US.UTF-8',
'en_US',
'frontend', 'frontend',
'context', 'context',
'Original', 'Original',
@@ -124,6 +145,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
__DIR__ . 'includes/locale/', __DIR__ . 'includes/locale/',
// //
'ja_JP.UTF-8', 'ja_JP.UTF-8',
'ja_JP',
'admin', 'admin',
null, null,
'Original', 'Original',
@@ -136,6 +158,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
'frontend', 'frontend',
// //
'en_US.UTF-8', 'en_US.UTF-8',
'en_US',
'frontend', 'frontend',
'context', 'context',
'Original', 'Original',
@@ -149,6 +172,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
// //
'', '',
'', '',
'',
null, null,
'Original', 'Original',
'Original', 'Original',
@@ -167,6 +191,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
* @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 $domain_expected * @param string $domain_expected
* @param ?string $context * @param ?string $context
* @param string $original * @param string $original
@@ -178,6 +203,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
?string $domain, ?string $domain,
?string $path, ?string $path,
string $locale_expected, string $locale_expected,
string $locale_set_expected,
string $domain_expected, string $domain_expected,
?string $context, ?string $context,
string $original, string $original,
@@ -199,6 +225,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
$l10n->getLocale(), $l10n->getLocale(),
'Locale assert failed' 'Locale assert failed'
); );
$this->assertEquals(
$locale_set_expected,
$l10n->getLocaleSet(),
'Locale set assert failed'
);
$this->assertEquals( $this->assertEquals(
$domain_expected, $domain_expected,
$l10n->getDomain(), $l10n->getDomain(),
@@ -237,15 +268,17 @@ final class CoreLibsLanguageL10nTest extends TestCase
// 3: load error // 3: load error
// 4: input string to translated // 4: input string to translated
// 5: expected locale // 5: expected locale
// 6: expected domain // 6: expected locale set
// 7: expected translation // 7: expected domain
// 8: change locale // 8: expected translation
// 9: change domain // 9: change locale
// 10: change path // 10: change domain
// 11: change load error // 11: change path
// 12: expected locale // 12: change load error
// 13: expected domain // 13: expected locale
// 14: expected translation // 14: expected locale set
// 15: expected domain
// 16: expected translation
'load and change (en->ja)' => [ 'load and change (en->ja)' => [
// set 0-2 // set 0-2
'en_US.UTF-8', 'en_US.UTF-8',
@@ -257,6 +290,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
'Original', 'Original',
// check setter 5-7 // check setter 5-7
'en_US.UTF-8', 'en_US.UTF-8',
'en_US',
'frontend', 'frontend',
'Translated frontend en_US', 'Translated frontend en_US',
// set new 8-10 // set new 8-10
@@ -267,6 +301,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
false, false,
// check new setter 12-14 // check new setter 12-14
'ja_JP.UTF-8', 'ja_JP.UTF-8',
'ja_JP',
'frontend', 'frontend',
'Translated frontend ja_JP', 'Translated frontend ja_JP',
], ],
@@ -282,6 +317,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
// check setter 5-7 // check setter 5-7
'', '',
'', '',
'',
'Original', 'Original',
// set new 8-10 // set new 8-10
'en_US.UTF-8', 'en_US.UTF-8',
@@ -291,6 +327,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
false, false,
// check new setter 12-14 // check new setter 12-14
'en_US.UTF-8', 'en_US.UTF-8',
'en_US',
'frontend', 'frontend',
'Translated frontend en_US', 'Translated frontend en_US',
] ]
@@ -311,12 +348,14 @@ final class CoreLibsLanguageL10nTest extends TestCase
* @param bool $load_error * @param bool $load_error
* @param string $original * @param string $original
* @param string $locale_expected_a * @param string $locale_expected_a
* @param string $locale_set_expected_a
* @param string $domain_expected_a * @param string $domain_expected_a
* @param string $translated_a * @param string $translated_a
* @param string|null $locale_new * @param string|null $locale_new
* @param string|null $domain_new * @param string|null $domain_new
* @param string|null $path_new * @param string|null $path_new
* @param bool $load_error_new * @param bool $load_error_new
* @param string $locale_set_expected_b
* @param string $locale_expected_b * @param string $locale_expected_b
* @param string $domain_expected_b * @param string $domain_expected_b
* @param string $translated_b * @param string $translated_b
@@ -333,6 +372,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
string $original, string $original,
// 5-7 // 5-7
string $locale_expected_a, string $locale_expected_a,
string $locale_set_expected_a,
string $domain_expected_a, string $domain_expected_a,
string $translated_a, string $translated_a,
// 8-10 // 8-10
@@ -343,6 +383,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
bool $load_error_new, bool $load_error_new,
// 12-14 // 12-14
string $locale_expected_b, string $locale_expected_b,
string $locale_set_expected_b,
string $domain_expected_b, string $domain_expected_b,
string $translated_b, string $translated_b,
): void { ): void {
@@ -366,6 +407,10 @@ final class CoreLibsLanguageL10nTest extends TestCase
$locale_expected_a, $locale_expected_a,
$l10n->getLocale(), $l10n->getLocale(),
'Locale init assert failed' 'Locale init assert failed'
);$this->assertEquals(
$locale_set_expected_a,
$l10n->getLocaleSet(),
'Locale Set init assert failed'
); );
$this->assertEquals( $this->assertEquals(
$domain_expected_a, $domain_expected_a,
@@ -417,6 +462,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
$l10n->getLocale(), $l10n->getLocale(),
'Locale change assert failed' 'Locale change assert failed'
); );
$this->assertEquals(
$locale_set_expected_b,
$l10n->getLocaleSet(),
'Locale Set change assert failed'
);
$this->assertEquals( $this->assertEquals(
$domain_expected_b, $domain_expected_b,
$l10n->getDomain(), $l10n->getDomain(),
@@ -527,7 +577,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
} else { } else {
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$l10n->__pn($context, $original_single, $original_plural, $n), $l10n->__np($context, $original_single, $original_plural, $n),
'assert failed for plural: ' . $n . ' in context: ' . $context 'assert failed for plural: ' . $n . ' in context: ' . $context
); );
} }
@@ -949,7 +999,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
/** /**
* fuctions check * fuctions check
* TODO: others d/dn/dp/dpn gettext functions * TODO: others d/dn/dp/dnp gettext functions
* *
* @covers __setlocale * @covers __setlocale
* @covers __bindtextdomain * @covers __bindtextdomain
@@ -976,10 +1026,10 @@ final class CoreLibsLanguageL10nTest extends TestCase
string $translated string $translated
): void { ): void {
\CoreLibs\Language\L10n::loadFunctions(); \CoreLibs\Language\L10n::loadFunctions();
__setlocale(LC_MESSAGES, $locale); _setlocale(LC_MESSAGES, $locale);
__textdomain($domain); _textdomain($domain);
__bindtextdomain($domain, $path); _bindtextdomain($domain, $path);
__bind_textdomain_codeset($domain, $encoding); _bind_textdomain_codeset($domain, $encoding);
$this->assertEquals( $this->assertEquals(
$translated, $translated,
__($original), __($original),
@@ -987,7 +1037,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
); );
$this->assertEquals( $this->assertEquals(
$translated, $translated,
__gettext($original), _gettext($original),
'function gettext assert failed' 'function gettext assert failed'
); );
} }

View File

@@ -1,58 +0,0 @@
<?php
declare(strict_types=1);
namespace test;
use PHPUnit\Framework\TestCase;
final class TemplateMethodsTest extends TestCase
{
public static function setUpBeforeClass(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function setUp(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function assertPreConditions(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
}
public function testOne(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
$this->assertTrue(true);
}
public function testTwo(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
$this->assertTrue(false);
}
protected function assertPostConditions(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function tearDown(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
}
public static function tearDownAfterClass(): void
{
fwrite(STDOUT, __METHOD__ . "\n");
}
protected function onNotSuccessfulTest(\Throwable $t): void
{
fwrite(STDOUT, __METHOD__ . "\n");
throw $t;
}
}

View File

@@ -95,7 +95,7 @@ $single_string = 'single';
$multi_string = 'multi'; $multi_string = 'multi';
for ($n = 0; $n <= 3; $n++) { for ($n = 0; $n <= 3; $n++) {
echo "CONTEXT MULTI TEST $n: " . $single_string . "/" . $multi_string . " => " echo "CONTEXT MULTI TEST $n: " . $single_string . "/" . $multi_string . " => "
. $l->__pn($context, $single_string, $multi_string, $n) . "<br>"; . $l->__np($context, $single_string, $multi_string, $n) . "<br>";
} }
// change domain // change domain
$domain = 'frontend'; $domain = 'frontend';
@@ -138,6 +138,7 @@ echo "LOAD ERROR: " . $l->getLoadError() . "<br>";
echo "INPUT TEST: " . $string . " => " . $l->__($string) . "<br>"; echo "INPUT TEST: " . $string . " => " . $l->__($string) . "<br>";
echo "TROUGH LOAD: " . $l->getTranslatorClass()->gettext($string) . "<br>"; echo "TROUGH LOAD: " . $l->getTranslatorClass()->gettext($string) . "<br>";
$lang = 'en';
$domain = 'admin'; $domain = 'admin';
echo "<br><b>STATIC TYPE TEST</b><br>"; echo "<br><b>STATIC TYPE TEST</b><br>";
// static tests from l10n_load // static tests from l10n_load
@@ -154,18 +155,30 @@ echo "<br><b>FUNCTIONS</b><br>";
// real statisc test // real statisc test
L10n::loadFunctions(); L10n::loadFunctions();
$locale = 'ja'; $locale = 'ja';
__setlocale(LC_MESSAGES, $locale); _setlocale(LC_MESSAGES, $locale);
__textdomain($domain); _textdomain($domain);
__bindtextdomain($domain, $path); _bindtextdomain($domain, $path);
__bind_textdomain_codeset($domain, $encoding); _bind_textdomain_codeset($domain, $encoding);
echo "INPUT TEST $locale: " . $string . " => " . __($string) . "<br>"; echo "INPUT TEST $locale: " . $string . " => " . __($string) . "<br>";
$single_string = 'single';
$multi_string = 'multi';
for ($n = 0; $n <= 3; $n++) {
echo "MULTI TEST $n: " . $single_string . "/" . $multi_string . " => "
. _ngettext($single_string, $multi_string, $n) . "<br>";
}
$locale = 'en_US.UTF-8'; $locale = 'en_US.UTF-8';
__setlocale(LC_MESSAGES, $locale); _setlocale(LC_MESSAGES, $locale);
__textdomain($domain); _textdomain($domain);
__bindtextdomain($domain, $path); _bindtextdomain($domain, $path);
__bind_textdomain_codeset($domain, $encoding); _bind_textdomain_codeset($domain, $encoding);
echo "INPUT TEST $locale: " . $string . " => " . __($string) . "<br>"; echo "INPUT TEST $locale: " . $string . " => " . __($string) . "<br>";
$single_string = 'single';
$multi_string = 'multi';
for ($n = 0; $n <= 3; $n++) {
echo "MULTI TEST $n: " . $single_string . "/" . $multi_string . " => "
. _ngettext($single_string, $multi_string, $n) . "<br>";
}
print "</body></html>"; print "</body></html>";

View File

@@ -74,6 +74,7 @@ $smarty->setSmartyPaths();
// smarty test // smarty test
$smarty->DATA['SMARTY_TEST'] = 'Test Data'; $smarty->DATA['SMARTY_TEST'] = 'Test Data';
$smarty->DATA['TRANSLATE_TEST'] = $l10n->__('Are we translated?'); $smarty->DATA['TRANSLATE_TEST'] = $l10n->__('Are we translated?');
$smarty->DATA['TRANSLATE_TEST_FUNCTION'] = _gettext('Are we translated?');
$smarty->DATA['TRANSLATE_TEST_SMARTY'] = $smarty->l10n->__('Are we translated?'); $smarty->DATA['TRANSLATE_TEST_SMARTY'] = $smarty->l10n->__('Are we translated?');
$smarty->DATA['replace'] = 'Replaced'; $smarty->DATA['replace'] = 'Replaced';
// variable variables // variable variables

View File

@@ -7,13 +7,19 @@
<div> <div>
<b>Outside translation test</b><br> <b>Outside translation test</b><br>
TRANSLATION CLASS (OUT): {$TRANSLATE_TEST}<br> TRANSLATION CLASS (OUT): {$TRANSLATE_TEST}<br>
TRANSLATION CLASS (SMARTY): {$TRANSLATE_TEST_SMARTY} TRANSLATION CLASS (OUT FUNCTION): {$TRANSLATE_TEST_FUNCTION}<br>
TRANSLATION CLASS (SMARTY): {$TRANSLATE_TEST_SMARTY}<br>
</div> </div>
<div> <div>
<b>Translate Test with replace:</b><br> <b>Translate Test with replace:</b><br>
ORIGINAL: Original with string: %1 ({$replace})<br> ORIGINAL: Original with string: %1 ({$replace})<br>
TRANSLATED: {t 1=$replace}Original with string: %1{/t}<br> TRANSLATED: {t 1=$replace}Original with string: %1{/t}<br>
TRANSLATED (escape): {t escape=on 1=$replace}Original with string: %1{/t} TRANSLATED (escape): {t escape=on 1=$replace}Original with string: %1{/t}<br>
{capture assign="extra_title"}{t}INPUT TEST{/t}{/capture}
Capture test: {$extra_title}<br>
{section name=plural_test start=0 loop=3}
Plural test {$smarty.section.plural_test.index}: {t count=$smarty.section.plural_test.index plural="multi"}single{/t}<br>
{/section}
</div> </div>
<div> <div>
<b>Variable variables:</b><br> <b>Variable variables:</b><br>

View File

@@ -1,37 +0,0 @@
<div>
{$SMARTY_TEST}
</div>
<div>
TRANSLATION CLASS (OUT): {$TRANSLATE_TEST}
</div>
<div>
TRANSLATION CLASS (SMARTY): {$TRANSLATE_TEST_SMARTY}
</div>
<div>
<select id="drop_down_test" name="drop_down_test">
{html_options options=$drop_down_test selected=$drop_down_test_selected}
</select>
</div>
<div class="jq-container">
<div id="jq-test" class="jp-test">
<div id="test-div" class="test-div">
Some content here or asdfasdfasf
</div>
<div id="translate-div">
{* TRANSLATION SMARTY: {t}I should be translated{/t} *}
TRANSLATION SMARTY: I should be translated
</div>
</div>
</div>
<div class="loop-test">
<div>LOOP TEST</div>
{section name=page_list start=1 loop=$loop_start+1}
<div>LOOP OUTPUT: {$smarty.section.page_list.index}</div>
{/section}
</div>
{* progresss indicator *}
<div id="indicator"></div>
{* the action confirm box *}
<div id="actionBox" class="actionBoxElement"></div>
{* The Overlay box *}
<div id="overlayBox" class="overlayBoxElement"></div>

View File

@@ -885,13 +885,13 @@ class Login
$this->acl['show_ea_extra'] = false; $this->acl['show_ea_extra'] = false;
} }
// set the default edit access // set the default edit access
$this->acl['default_edit_access'] = $_SESSION['UNIT_DEFAULT']; $this->acl['default_edit_access'] = $_SESSION['UNIT_DEFAULT'] ?? null;
// integrate the type acl list, but only for the keyword -> level // integrate the type acl list, but only for the keyword -> level
foreach ($this->default_acl_list as $level => $data) { foreach ($this->default_acl_list as $level => $data) {
$this->acl['min'][$data['type']] = $level; $this->acl['min'][$data['type']] = $level;
} }
// set the full acl list too // set the full acl list too
$this->acl['acl_list'] = $_SESSION['DEFAULT_ACL_LIST']; $this->acl['acl_list'] = $_SESSION['DEFAULT_ACL_LIST'] ?? [];
// debug // debug
// $this->debug('ACL', $this->print_ar($this->acl)); // $this->debug('ACL', $this->print_ar($this->acl));
} }
@@ -1453,7 +1453,8 @@ EOM;
* checks that the given edit access id is valid for this user * checks that the given edit access id is valid for this user
* @param int|null $edit_access_id edit access id to check * @param int|null $edit_access_id edit access id to check
* @return int|null same edit access id if ok * @return int|null same edit access id if ok
* or the default edit access id if given one is not valid * or the default edit access id
* if given one is not valid
*/ */
public function loginCheckEditAccessId(?int $edit_access_id): ?int public function loginCheckEditAccessId(?int $edit_access_id): ?int
{ {
@@ -1463,7 +1464,7 @@ EOM;
is_array($_SESSION['UNIT']) && is_array($_SESSION['UNIT']) &&
!array_key_exists($edit_access_id, $_SESSION['UNIT']) !array_key_exists($edit_access_id, $_SESSION['UNIT'])
) { ) {
return (int)$_SESSION['UNIT_DEFAULT']; return $_SESSION['UNIT_DEFAULT'] ?? null;
} else { } else {
return $edit_access_id; return $edit_access_id;
} }

View File

@@ -218,7 +218,8 @@ class ArrayHandler
continue; continue;
} }
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
// if string or if key is assumed to be string do key match else add new entry // if string or if key is assumed to be string do key match
// else add new entry
if (is_string($key) || $key_is_string === false) { if (is_string($key) || $key_is_string === false) {
if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) { if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) {
// $merged[$key] = call_user_func(__METHOD__, $merged[$key], $value, $key_is_string); // $merged[$key] = call_user_func(__METHOD__, $merged[$key], $value, $key_is_string);

View File

@@ -503,7 +503,7 @@ class ArrayIO extends \CoreLibs\DB\IO
// max id, falls INSERT // max id, falls INSERT
$q = 'SELECT MAX(' . $this->pk_name . ') + 1 AS pk_id FROM ' . $this->table_name; $q = 'SELECT MAX(' . $this->pk_name . ') + 1 AS pk_id FROM ' . $this->table_name;
if (is_array($res = $this->dbReturnRow($q))) { if (is_array($res = $this->dbReturnRow($q))) {
$pk_id = $res['pkd_id']; $pk_id = $res['pk_id'];
} else { } else {
$pk_id = 1; $pk_id = 1;
} }

View File

@@ -5,7 +5,7 @@
* Language\Encoding::__mbMimeEncode -> Convert\MimeEncode::__mbMimeEncode * Language\Encoding::__mbMimeEncode -> Convert\MimeEncode::__mbMimeEncode
* Langauge\Encoding::checkConvertEncoding -> Check\Encoding::checkConvertEncoding * Langauge\Encoding::checkConvertEncoding -> Check\Encoding::checkConvertEncoding
* Langauge\Encoding::setErrorChar -> Check\Encoding::setErrorChar * Langauge\Encoding::setErrorChar -> Check\Encoding::setErrorChar
* Langauge\Encoding::getErrorChar -> Encoding::getErrorChar * Langauge\Encoding::getErrorChar -> Check\Encoding::getErrorChar
* Langauge\Encoding::convertEncoding -> Convert\Encoding::convertEncoding * Langauge\Encoding::convertEncoding -> Convert\Encoding::convertEncoding
*/ */

View File

@@ -14,7 +14,7 @@
* __ : returns string (translated or original if not found) * __ : returns string (translated or original if not found)
* __n : plural string * __n : plural string
* __p : string with context * __p : string with context
* __pb: string with context and plural * __np: string with context and plural
* *
* HISTORY: * HISTORY:
* 2022/4/15 (cs) drop all old folder layout support, new folder base * 2022/4/15 (cs) drop all old folder layout support, new folder base
@@ -34,6 +34,8 @@ class L10n
{ {
/** @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 */
private $locale_set = '';
/** @var string the default selected/active domain */ /** @var string the default selected/active domain */
private $domain = ''; private $domain = '';
/** @var array<string,array<string,GetTextReader>> locale > domain = translator */ /** @var array<string,array<string,GetTextReader>> locale > domain = translator */
@@ -141,6 +143,7 @@ class L10n
// 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_domain = $this->domain; $old_domain = $this->domain;
$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;
@@ -172,6 +175,7 @@ class L10n
. $this->base_content_path . $this->base_content_path
. $domain . '.mo'; . $domain . '.mo';
if (file_exists($this->mofile)) { if (file_exists($this->mofile)) {
$this->locale_set = $_locale;
break; break;
} }
} }
@@ -202,6 +206,7 @@ class L10n
// else fall back to the old ones // else fall back to the old ones
$this->mofile = $old_mofile; $this->mofile = $old_mofile;
$this->locale = $old_lang; $this->locale = $old_lang;
$this->locale_set = $old_lang_set;
$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;
@@ -454,7 +459,7 @@ class L10n
} }
/** /**
* get current set locale * get current set locale (want locale)
* *
* @return string * @return string
*/ */
@@ -463,6 +468,16 @@ class L10n
return $this->locale; return $this->locale;
} }
/**
* current set locale where mo file is located
*
* @return string
*/
public function getLocaleSet(): string
{
return $this->locale_set;
}
/** /**
* get current set language * get current set language
* *
@@ -601,7 +616,7 @@ class L10n
* @param int $number number value * @param int $number number value
* @return string * @return string
*/ */
public function __pn(string $context, string $single, string $plural, int $number): string public function __np(string $context, string $single, string $plural, int $number): string
{ {
if ($this->l10n === null) { if ($this->l10n === null) {
return $number > 1 ? $plural : $single; return $number > 1 ? $plural : $single;

View File

@@ -1,8 +1,16 @@
<?php <?php
/*********************************************************************
* Original: https://github.com/phpmyadmin/motranslator
* Has the same function names, but uses a different base system
* setlocale -> setLocale
* bindtextdomain -> setTextDomain
* textdomain -> setDomain
*********************************************************************/
declare(strict_types=1); declare(strict_types=1);
use CoreLibs\Language\L10n; use CoreLibs\Language\L10n as Loader;
/** /**
* Sets a requested locale. * Sets a requested locale.
@@ -12,9 +20,9 @@ use CoreLibs\Language\L10n;
* *
* @return string Set or current locale * @return string Set or current locale
*/ */
function __setlocale(int $category, string $locale): string function _setlocale(int $category, string $locale): string
{ {
return L10n::getInstance()->setLocale($locale); return Loader::getInstance()->setLocale($locale);
} }
/** /**
@@ -23,9 +31,9 @@ function __setlocale(int $category, string $locale): string
* @param string $domain Domain name * @param string $domain Domain name
* @param string $path Path where to find locales * @param string $path Path where to find locales
*/ */
function __bindtextdomain(string $domain, string $path): void function _bindtextdomain(string $domain, string $path): void
{ {
L10n::getInstance()->setTextDomain($domain, $path); Loader::getInstance()->setTextDomain($domain, $path);
} }
/** /**
@@ -39,7 +47,7 @@ function __bindtextdomain(string $domain, string $path): void
* @param string $domain Domain where to set character set * @param string $domain Domain where to set character set
* @param string $codeset Character set to set * @param string $codeset Character set to set
*/ */
function __bind_textdomain_codeset(string $domain, string $codeset): void function _bind_textdomain_codeset(string $domain, string $codeset): void
{ {
} }
@@ -48,9 +56,9 @@ function __bind_textdomain_codeset(string $domain, string $codeset): void
* *
* @param string $domain Domain name * @param string $domain Domain name
*/ */
function __textdomain(string $domain): void function _textdomain(string $domain): void
{ {
L10n::getInstance()->setDomain($domain); Loader::getInstance()->setDomain($domain);
} }
/** /**
@@ -60,9 +68,9 @@ function __textdomain(string $domain): void
* *
* @return string translated string (or original, if not found) * @return string translated string (or original, if not found)
*/ */
function __gettext(string $msgid): string function _gettext(string $msgid): string
{ {
return L10n::getInstance()->getTranslator()->gettext( return Loader::getInstance()->getTranslator()->gettext(
$msgid $msgid
); );
} }
@@ -76,7 +84,7 @@ function __gettext(string $msgid): string
*/ */
function __(string $msgid): string function __(string $msgid): string
{ {
return L10n::getInstance()->getTranslator()->gettext( return Loader::getInstance()->getTranslator()->gettext(
$msgid $msgid
); );
} }
@@ -90,9 +98,9 @@ function __(string $msgid): string
* *
* @return string translated plural form * @return string translated plural form
*/ */
function __ngettext(string $msgid, string $msgidPlural, int $number): string function _ngettext(string $msgid, string $msgidPlural, int $number): string
{ {
return L10n::getInstance()->getTranslator()->ngettext( return Loader::getInstance()->getTranslator()->ngettext(
$msgid, $msgid,
$msgidPlural, $msgidPlural,
$number $number
@@ -107,9 +115,9 @@ function __ngettext(string $msgid, string $msgidPlural, int $number): string
* *
* @return string translated plural form * @return string translated plural form
*/ */
function __pgettext(string $msgctxt, string $msgid): string function _pgettext(string $msgctxt, string $msgid): string
{ {
return L10n::getInstance()->getTranslator()->pgettext( return Loader::getInstance()->getTranslator()->pgettext(
$msgctxt, $msgctxt,
$msgid $msgid
); );
@@ -125,9 +133,9 @@ function __pgettext(string $msgctxt, string $msgid): string
* *
* @return string translated plural form * @return string translated plural form
*/ */
function __npgettext(string $msgctxt, string $msgid, string $msgidPlural, int $number): string function _npgettext(string $msgctxt, string $msgid, string $msgidPlural, int $number): string
{ {
return L10n::getInstance()->getTranslator()->npgettext( return Loader::getInstance()->getTranslator()->npgettext(
$msgctxt, $msgctxt,
$msgid, $msgid,
$msgidPlural, $msgidPlural,
@@ -143,9 +151,9 @@ function __npgettext(string $msgctxt, string $msgid, string $msgidPlural, int $n
* *
* @return string translated string (or original, if not found) * @return string translated string (or original, if not found)
*/ */
function __dgettext(string $domain, string $msgid): string function _dgettext(string $domain, string $msgid): string
{ {
return L10n::getInstance()->getTranslator('', '', $domain)->gettext( return Loader::getInstance()->getTranslator('', '', $domain)->gettext(
$msgid $msgid
); );
} }
@@ -160,9 +168,9 @@ function __dgettext(string $domain, string $msgid): string
* *
* @return string translated plural form * @return string translated plural form
*/ */
function __dngettext(string $domain, string $msgid, string $msgidPlural, int $number): string function _dngettext(string $domain, string $msgid, string $msgidPlural, int $number): string
{ {
return L10n::getInstance()->getTranslator('', '', $domain)->ngettext( return Loader::getInstance()->getTranslator('', '', $domain)->ngettext(
$msgid, $msgid,
$msgidPlural, $msgidPlural,
$number $number
@@ -178,9 +186,9 @@ function __dngettext(string $domain, string $msgid, string $msgidPlural, int $nu
* *
* @return string translated plural form * @return string translated plural form
*/ */
function __dpgettext(string $domain, string $msgctxt, string $msgid): string function _dpgettext(string $domain, string $msgctxt, string $msgid): string
{ {
return L10n::getInstance()->getTranslator('', '', $domain)->pgettext( return Loader::getInstance()->getTranslator('', '', $domain)->pgettext(
$msgctxt, $msgctxt,
$msgid $msgid
); );
@@ -197,9 +205,9 @@ function __dpgettext(string $domain, string $msgctxt, string $msgid): string
* *
* @return string translated plural form * @return string translated plural form
*/ */
function __dnpgettext(string $domain, string $msgctxt, string $msgid, string $msgidPlural, int $number): string function _dnpgettext(string $domain, string $msgctxt, string $msgid, string $msgidPlural, int $number): string
{ {
return L10n::getInstance()->getTranslator('', '', $domain)->npgettext( return Loader::getInstance()->getTranslator('', '', $domain)->npgettext(
$msgctxt, $msgctxt,
$msgid, $msgid,
$msgidPlural, $msgidPlural,

View File

@@ -32,6 +32,8 @@ class SmartyExtend extends \Smarty
/** @var string */ /** @var string */
public $lang; public $lang;
/** @var string */ /** @var string */
public $locale_set;
/** @var string */
public $lang_short; public $lang_short;
/** @var string */ /** @var string */
public $domain; public $domain;
@@ -164,16 +166,22 @@ class SmartyExtend extends \Smarty
parent::__construct(); parent::__construct();
// iinit lang // iinit lang
$this->l10n = $l10n; $this->l10n = $l10n;
// opt load functions so we can use legacy init for smarty run perhaps
$this->l10n->loadFunctions();
// parse and read, legacy stuff // parse and read, legacy stuff
$this->encoding = $locale['encoding']; $this->encoding = $locale['encoding'];
$this->lang = $locale['lang']; $this->lang = $locale['lang'];
// get first part from lang // get first part from lang
$this->lang_short = explode('_', $locale['lang'])[0]; $this->lang_short = explode('_', $locale['lang'])[0];
$this->domain = $this->l10n->getDomain(); $this->domain = $this->l10n->getDomain();
$this->locale_set = $this->l10n->getLocaleSet();
$this->lang_dir = $this->l10n->getBaseLocalePath(); $this->lang_dir = $this->l10n->getBaseLocalePath();
// opt load functions so we can use legacy init for smarty run perhaps
\CoreLibs\Language\L10n::loadFunctions();
_setlocale(LC_MESSAGES, $locale['locale']);
_textdomain($this->domain);
_bindtextdomain($this->domain, $this->lang_dir);
_bind_textdomain_codeset($this->domain, $this->encoding);
// register smarty variable // register smarty variable
$this->registerPlugin('modifier', 'getvar', [&$this, 'getTemplateVars']); $this->registerPlugin('modifier', 'getvar', [&$this, 'getTemplateVars']);
@@ -307,16 +315,24 @@ class SmartyExtend extends \Smarty
} }
// javascript translate data as template for auto translate // javascript translate data as template for auto translate
if (empty($this->TEMPLATE_TRANSLATE)) { if (empty($this->TEMPLATE_TRANSLATE)) {
$this->TEMPLATE_TRANSLATE = 'jsTranslate_' . $this->lang . '.tpl'; $this->TEMPLATE_TRANSLATE = 'jsTranslate_'
. $this->locale_set . '.' . $this->encoding
. '.tpl';
} else { } else {
// we assume we have some fixed set // we assume we have some fixed set
// we must add _<$this->lang> // we must add _<$this->lang>
// if .tpl, put before .tpl // if .tpl, put before .tpl
// if not .tpl, add _<$this->lang>.tpl // if not .tpl, add _<$this->lang>.tpl
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) { if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
$this->TEMPLATE_TRANSLATE = str_replace('.tpl', '_' . $this->lang . '.tpl', $this->TEMPLATE_TRANSLATE); $this->TEMPLATE_TRANSLATE = str_replace(
'.tpl',
'-' . $this->locale_set . '.' . $this->encoding . '.tpl',
$this->TEMPLATE_TRANSLATE
);
} else { } else {
$this->TEMPLATE_TRANSLATE .= '_' . $this->lang . '.tpl'; $this->TEMPLATE_TRANSLATE .= '_'
. $this->locale_set . '.' . $this->encoding
. '.tpl';
} }
} }
// if we can't find it, dump it // if we can't find it, dump it

View File

@@ -3,30 +3,19 @@
/** /**
* smarty-gettext.php - Gettext support for smarty * smarty-gettext.php - Gettext support for smarty
* *
* ------------------------------------------------------------------------- *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the Free Software *
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
* ------------------------------------------------------------------------- *
*
* To register as a smarty block function named 't', use: * To register as a smarty block function named 't', use:
* $smarty->register_block('t', 'smarty_translate'); * $smarty->register_block('t', 'smarty_translate');
* *
* NOTE: native php support for conext sensitive does not exist
* Those jumps are disabled
*
* @package smarty-gettext * @package smarty-gettext
* @version $Id: block.t.php 4738 2022-05-06 01:28:48Z clemens $ * @version $Id: block.t.php 4738 2022-05-06 01:28:48Z clemens $
* @link http://smarty-gettext.sf.net/ * @link http://smarty-gettext.sf.net/
* @author Sagi Bashari <sagi@boom.org.il> * @author Sagi Bashari <sagi@boom.org.il>
* @copyright 2004 Sagi Bashari * @copyright 2004 Sagi Bashari
* @copyright Elan Ruusamäe
* @copyright Clemens Schwaighofer
*/ */
/** /**
@@ -39,7 +28,7 @@
*/ */
function smarty_gettext_strarg($str/*, $varargs... */) function smarty_gettext_strarg($str/*, $varargs... */)
{ {
$tr = array(); $tr = [];
$p = 0; $p = 0;
$nargs = func_num_args(); $nargs = func_num_args();
@@ -68,14 +57,18 @@ function smarty_gettext_strarg($str/*, $varargs... */)
* - escape - sets escape mode: * - escape - sets escape mode:
* - 'html' for HTML escaping, this is the default. * - 'html' for HTML escaping, this is the default.
* - 'js' for javascript escaping. * - 'js' for javascript escaping.
* - 'url' for url escaping.
* - 'no'/'off'/0 - turns off escaping * - 'no'/'off'/0 - turns off escaping
* - plural - The plural version of the text (2nd parameter of ngettext()) * - plural - The plural version of the text (2nd parameter of ngettext())
* - count - The item count for plural mode (3rd parameter of ngettext()) * - count - The item count for plural mode (3rd parameter of ngettext())
* - domain - Textdomain to be used, default if skipped (dgettext() instead of gettext())
* - context - gettext context. reserved for future use.
*
*/ */
// cs modified: __ calls instead of direct gettext calls // cs modified: __ calls instead of direct gettext calls
function smarty_block_t($params, $text, $template, &$repeat) function smarty_block_t($params, $text)
{ {
if (!isset($text)) { if (!isset($text)) {
return $text; return $text;
@@ -101,11 +94,75 @@ function smarty_block_t($params, $text, $template, &$repeat)
} }
} }
// get domain param
if (isset($params['domain'])) {
$domain = $params['domain'];
unset($params['domain']);
} else {
$domain = null;
}
// get context param
if (isset($params['context'])) {
$context = $params['context'];
unset($params['context']);
} else {
$context = null;
}
// use plural if required parameters are set // use plural if required parameters are set
if (isset($count) && isset($plural)) { if (isset($count) && isset($plural)) {
$text = $template->l10n->__ngettext($text, $plural, $count); if (isset($domain) && isset($context)) {
if (is_callable('_dnpgettext')) {
$text = _dnpgettext($domain, $context, $text, $plural, $count);
}/* elseif (is_callable('dnpgettext')) {
$text = dnpgettext($domain, $context, $text, $plural, $count);
} */
} elseif (isset($domain)) {
if (is_callable('_dngettext')) {
$text = _dngettext($domain, $text, $plural, $count);
} elseif (is_callable('dngettext')) {
$text = dngettext($domain, $text, $plural, $count);
}
} elseif (isset($context)) {
if (is_callable('_npgettext')) {
$text = _npgettext($context, $text, $plural, $count);
}/* elseif (is_callable('npgettext')) {
$text = npgettext($context, $text, $plural, $count);
} */
} else {
if (is_callable('_ngettext')) {
$text = _ngettext($text, $plural, $count);
} elseif (is_callable('ngettext')) {
$text = ngettext($text, $plural, $count);
}
}
} else { // use normal } else { // use normal
$text = $template->l10n->__($text); if (isset($domain) && isset($context)) {
if (is_callable('_dpgettext')) {
$text = _dpgettext($domain, $context, $text);
}/* elseif (is_callable('dpgettext')) {
$text = dpgettext($domain, $context, $text);
} */
} elseif (isset($domain)) {
if (is_callable('_dgettext')) {
$text = _dgettext($domain, $text);
} elseif (is_callable('dpgettext')) {
$text = dgettext($domain, $text);
}
} elseif (isset($context)) {
if (is_callable('_pgettext')) {
$text = _pgettext($context, $text);
}/* elseif (is_callable('pgettext')) {
$text = pgettext($context, $text);
} */
} else {
if (is_callable('_gettext')) {
$text = _gettext($text);
} elseif (is_callable('gettext')) {
$text = gettext($text);
}
}
} }
// run strarg if there are parameters // run strarg if there are parameters
@@ -115,6 +172,7 @@ function smarty_block_t($params, $text, $template, &$repeat)
switch ($escape) { switch ($escape) {
case 'html': case 'html':
// default
$text = nl2br(htmlspecialchars($text)); $text = nl2br(htmlspecialchars($text));
break; break;
case 'javascript': case 'javascript':
@@ -122,13 +180,29 @@ function smarty_block_t($params, $text, $template, &$repeat)
// javascript escape // javascript escape
$text = strtr( $text = strtr(
$text, $text,
array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/') [
'\\' => '\\\\',
"'" => "\\'",
'"' => '\\"',
"\r" => '\\r',
"\n" => '\\n',
'</' => '<\/'
]
); );
break; break;
case 'url': case 'url':
// url escape // url escape
$text = urlencode($text); $text = urlencode($text);
break; break;
// below is a list for explicit OFF
case 'no':
case 'off':
case 'false':
case '0':
case 0:
// explicit OFF
default:
break;
} }
return $text; return $text;