Compare commits

...

9 Commits

Author SHA1 Message Date
Clemens Schwaighofer
f085ccaa38 update phpunit call script for testing 2022-04-25 18:26:30 +09:00
Clemens Schwaighofer
6c3c1a908d PHPunit fixes for PHP 7.4 2022-04-25 17:01:28 +09:00
Clemens Schwaighofer
388b90913a translation creation script 2022-04-25 13:58:43 +09:00
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
32 changed files with 403 additions and 228 deletions

14
4dev/bin/create_mo.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env bash
base_folder='/var/www/html/developers/clemens/core_data/php_libraries/trunk/www/';
# locale gettext po to mo translator master
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
file=$(basename $file .po);
echo "Translate language ${file}";
locale=$(echo "${file}" | cut -d "-" -f 1);
domain=$(echo "${file}" | cut -d "-" -f 2);
msgfmt -o ${base_folder}/includes/locale/${locale}/LC_MESSAGES/${domain}.mo ${base_folder}../4dev/locale/${locale}-${domain}.po;
done;
# __END__

View File

@@ -1,4 +1,37 @@
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/"; base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
# -c phpunit.xml # -c phpunit.xml
# --testdox # --testdox
${base}www/vendor/bin/phpunit -c ${base}phpunit.xml ${base}4dev/tests/ # call with "t" to give verbose testdox output
# call with 7.3, 7.4, 8.0, 8.1 to force a certain php version
opt_testdox="";
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
opt_testdox="--testdox";
fi;
php_bin="";
case "${1}" in
"7.3") php_bin="/usr/bin/php7.3 "; ;;
"7.4") php_bin="/usr/bin/php7.4 "; ;;
"8.0") php_bin="/usr/bin/php8.0 "; ;;
"8.1") php_bin="/usr/bin/php8.1 "; ;;
esac;
if [ -z "${php_bin}" ]; then
case "${2}" in
"7.3") php_bin="/usr/bin/php7.3 "; ;;
"7.4") php_bin="/usr/bin/php7.4 "; ;;
"8.0") php_bin="/usr/bin/php8.0 "; ;;
"8.1") php_bin="/usr/bin/php8.1 "; ;;
esac;
fi;
phpunit_call="${php_bin}${base}www/vendor/bin/phpunit ${opt_testdox} -c ${base}phpunit.xml ${base}4dev/tests/";
${phpunit_call};
if [ ! -z "${php_bin}" ]; then
echo "CALLED WITH PHP: ${php_bin}"$(${php_bin} --version);
else
echo "Default PHP used: "$(php --version);
fi;
# __END__

View File

@@ -2,8 +2,7 @@
# AUTHOR: Clemens Schwaighofer # AUTHOR: Clemens Schwaighofer
# CREATED: 2005/08/09 # CREATED: 2005/08/09
# SHORT DESCRIPTION: # SHORT DESCRIPTION:
# Backned English Messages file for gettext # Backend English Messages file for gettext
# to craete: msgfmt -o <output.po> <input.mo>
# ********************************************************************/ # ********************************************************************/
msgid "" msgid ""

View File

@@ -1,4 +1,9 @@
# to craete: msgfmt -o <output.po> <input.mo> # ********************************************************************
# AUTHOR: Clemens Schwaighofer
# CREATED: 2005/08/09
# SHORT DESCRIPTION:
# Frontend English Messages file for gettext
# ********************************************************************/
msgid "" msgid ""
msgstr "" msgstr ""

View File

@@ -2,8 +2,7 @@
# AUTHOR: Clemens Schwaighofer # AUTHOR: Clemens Schwaighofer
# CREATED: 2018/03/28 # CREATED: 2018/03/28
# SHORT DESCRIPTION: # SHORT DESCRIPTION:
# Backend Japanese Messages file for gettext # Backend Japanese Messages file for gettext>
# to craete: msgfmt -o <output.po> <input.mo>
# ********************************************************************/ # ********************************************************************/
msgid "" msgid ""

View File

@@ -1,4 +1,9 @@
# to craete: msgfmt -o <output.po> <input.mo> # ********************************************************************
# AUTHOR: Clemens Schwaighofer
# CREATED: 2005/08/09
# SHORT DESCRIPTION:
# Frontend Japanese Messages file for gettext
# ********************************************************************/
msgid "" msgid ""
msgstr "" msgstr ""

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

@@ -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
@@ -566,7 +566,7 @@ final class CoreLibsDBIOTest extends TestCase
public function testDbSetDebug( public function testDbSetDebug(
string $connection, string $connection,
?bool $set, ?bool $set,
bool $expected, bool $expected
): void { ): void {
$db = new \CoreLibs\DB\IO( $db = new \CoreLibs\DB\IO(
self::$db_config[$connection], self::$db_config[$connection],
@@ -599,7 +599,7 @@ final class CoreLibsDBIOTest extends TestCase
public function testDbToggleDebug( public function testDbToggleDebug(
string $connection, string $connection,
?bool $toggle, ?bool $toggle,
bool $expected, bool $expected
): void { ): void {
$db = new \CoreLibs\DB\IO( $db = new \CoreLibs\DB\IO(
self::$db_config[$connection], self::$db_config[$connection],
@@ -1734,7 +1734,7 @@ final class CoreLibsDBIOTest extends TestCase
$expected, $expected,
string $warning, string $warning,
string $error, string $error,
string $insert_data, string $insert_data
): void { ): void {
// self::$log->setLogLevelAll('debug', true); // self::$log->setLogLevelAll('debug', true);
// self::$log->setLogLevelAll('print', true); // self::$log->setLogLevelAll('print', true);
@@ -1871,7 +1871,7 @@ final class CoreLibsDBIOTest extends TestCase
$expected, $expected,
string $warning, string $warning,
string $error, string $error,
string $insert_data, string $insert_data
): void { ): void {
// self::$log->setLogLevelAll('debug', true); // self::$log->setLogLevelAll('debug', true);
// self::$log->setLogLevelAll('print', true); // self::$log->setLogLevelAll('print', true);
@@ -2034,7 +2034,7 @@ final class CoreLibsDBIOTest extends TestCase
array $cursor_ext_checks, array $cursor_ext_checks,
string $warning, string $warning,
string $error, string $error,
string $insert_data, string $insert_data
): void { ): void {
// self::$log->setLogLevelAll('debug', true); // self::$log->setLogLevelAll('debug', true);
// self::$log->setLogLevelAll('print', true); // self::$log->setLogLevelAll('print', true);
@@ -2356,7 +2356,7 @@ final class CoreLibsDBIOTest extends TestCase
string $error_execute, string $error_execute,
string $expected_data_query, string $expected_data_query,
array $expected_data, array $expected_data,
string $insert_data, string $insert_data
): void { ): void {
// self::$log->setLogLevelAll('debug', true); // self::$log->setLogLevelAll('debug', true);
// self::$log->setLogLevelAll('print', true); // self::$log->setLogLevelAll('print', true);
@@ -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,
@@ -3009,7 +3010,7 @@ final class CoreLibsDBIOTest extends TestCase
string $insert, string $insert,
?string $pk_name, ?string $pk_name,
string $table, string $table,
string $primary_key, string $primary_key
): void { ): void {
// self::$log->setLogLevelAll('debug', true); // self::$log->setLogLevelAll('debug', true);
// self::$log->setLogLevelAll('print', true); // self::$log->setLogLevelAll('print', true);

View File

@@ -730,7 +730,7 @@ final class CoreLibsDebugLoggingTest extends TestCase
bool $expected_debug, bool $expected_debug,
string $expected_file, string $expected_file,
string $expected_string_start, string $expected_string_start,
string $expected_string_contains, string $expected_string_contains
): void { ): void {
// must run with below matrix // must run with below matrix
// level | debug | print | echo | debug() | printErrorMsg() | file // level | debug | print | echo | debug() | printErrorMsg() | file

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

@@ -240,7 +240,7 @@ final class CoreLibsLanguageGetLocaleTest extends TestCase
?string $path, ?string $path,
?string $SESSION_DEFAULT_LOCALE, ?string $SESSION_DEFAULT_LOCALE,
?string $SESSION_DEFAULT_CHARSET, ?string $SESSION_DEFAULT_CHARSET,
array $expected, array $expected
): void { ): void {
$return_lang_settings = []; $return_lang_settings = [];
global $_SESSION; global $_SESSION;

View File

@@ -109,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',
@@ -120,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',
@@ -131,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',
@@ -142,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',
@@ -154,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',
@@ -167,6 +172,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
// //
'', '',
'', '',
'',
null, null,
'Original', 'Original',
'Original', 'Original',
@@ -185,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
@@ -196,10 +203,11 @@ 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,
string $translated, string $translated
): void { ): void {
if ($locale === null) { if ($locale === null) {
$l10n = new \CoreLibs\Language\L10n(); $l10n = new \CoreLibs\Language\L10n();
@@ -217,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(),
@@ -255,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',
@@ -275,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
@@ -285,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',
], ],
@@ -300,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',
@@ -309,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',
] ]
@@ -329,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
@@ -351,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
@@ -361,8 +383,9 @@ 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 {
if ($locale === null) { if ($locale === null) {
$l10n = new \CoreLibs\Language\L10n(); $l10n = new \CoreLibs\Language\L10n();
@@ -384,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,
@@ -435,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(),
@@ -731,7 +763,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
string $type, string $type,
string $var, string $var,
string $value, string $value,
string $expected, string $expected
): void { ): void {
switch ($type) { switch ($type) {
case 'global': case 'global':
@@ -994,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),
@@ -1005,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

@@ -68,6 +68,9 @@ print "S::DEBUSTRING(s): " . DebugSupport::debugString('SET') . "<br>";
print "S::DEBUSTRING(''): " . DebugSupport::debugString('') . "<br>"; print "S::DEBUSTRING(''): " . DebugSupport::debugString('') . "<br>";
print "S::DEBUSTRING(,s): " . DebugSupport::debugString(null, '{-}') . "<br>"; print "S::DEBUSTRING(,s): " . DebugSupport::debugString(null, '{-}') . "<br>";
// get test
print "LOG FOLDER: " . $debug->getSetting('log_folder') . "<br>";
// debug // debug
print "C->DEBUG: " . $debug->debug('CLASS-TEST-DEBUG', 'Class Test Debug') . "<br>"; print "C->DEBUG: " . $debug->debug('CLASS-TEST-DEBUG', 'Class Test Debug') . "<br>";
print "C->DEBUG(html): " . $debug->debug('CLASS-TEST-DEBUG', 'HTML TAG<br><b>BOLD</b>') . "<br>"; print "C->DEBUG(html): " . $debug->debug('CLASS-TEST-DEBUG', 'HTML TAG<br><b>BOLD</b>') . "<br>";

View File

@@ -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,7 +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_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

@@ -14,7 +14,12 @@
<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

@@ -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

@@ -20,7 +20,7 @@ class DateTime
4 => 'Thu', 4 => 'Thu',
5 => 'Fri', 5 => 'Fri',
6 => 'Sat', 6 => 'Sat',
7 => 'Sun' 7 => 'Sun',
]; ];
/** @var array<int,string> */ /** @var array<int,string> */
public const DAY_LONG = [ public const DAY_LONG = [
@@ -30,7 +30,7 @@ class DateTime
4 => 'Thursday', 4 => 'Thursday',
5 => 'Friday', 5 => 'Friday',
6 => 'Saturday', 6 => 'Saturday',
7 => 'Sunday' 7 => 'Sunday',
]; ];
/** @var array<int,string> */ /** @var array<int,string> */
public const MONTH_LONG = [ public const MONTH_LONG = [
@@ -45,7 +45,7 @@ class DateTime
9 => 'September', 9 => 'September',
10 => 'October', 10 => 'October',
11 => 'November', 11 => 'November',
12 => 'December' 12 => 'December',
]; ];
/** @var array<int,string> */ /** @var array<int,string> */
public const MONTH_SHORT = [ public const MONTH_SHORT = [
@@ -60,7 +60,7 @@ class DateTime
9 => 'Sep', 9 => 'Sep',
10 => 'Oct', 10 => 'Oct',
11 => 'Nov', 11 => 'Nov',
12 => 'Dec' 12 => 'Dec',
]; ];
/** /**
@@ -349,7 +349,7 @@ class DateTime
try { try {
$start = new \DateTime($start_date); $start = new \DateTime($start_date);
$end = new \DateTime($end_date); $end = new \DateTime($end_date);
} catch (Exception) { } catch (Exception $e) {
if ($return_named === true) { if ($return_named === true) {
return [ return [
'overall' => 0, 'overall' => 0,

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

@@ -401,10 +401,10 @@ class Logging
/** /**
* Temporary method to read all class variables for testing purpose * Temporary method to read all class variables for testing purpose
* @param string $name * @param string $name what variable to return
* @return mixed can be anything, bool, string, int, array * @return mixed can be anything, bool, string, int, array
*/ */
public function getSetting(string $name): mixed public function getSetting(string $name) //:mixed DOES not work with PHP 7.4
{ {
// for debug purpose only // for debug purpose only
return $this->{$name}; return $this->{$name};

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 */
@@ -77,7 +79,7 @@ class L10n
public function __construct( public function __construct(
string $locale = '', string $locale = '',
string $domain = '', string $domain = '',
string $path = '', string $path = ''
) { ) {
// auto load language only if at least locale and domain is set // auto load language only if at least locale and domain is set
if (!empty($locale) && !empty($domain)) { if (!empty($locale) && !empty($domain)) {
@@ -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
* *

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;
@@ -170,14 +172,15 @@ class SmartyExtend extends \Smarty
// 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 // opt load functions so we can use legacy init for smarty run perhaps
$this->l10n->loadFunctions(); \CoreLibs\Language\L10n::loadFunctions();
__setlocale(LC_MESSAGES, $locale['locale']); _setlocale(LC_MESSAGES, $locale['locale']);
__textdomain($this->domain); _textdomain($this->domain);
__bindtextdomain($this->domain, $this->lang_dir); _bindtextdomain($this->domain, $this->lang_dir);
__bind_textdomain_codeset($this->domain, $this->encoding); _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']);
@@ -312,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;
@@ -120,55 +113,54 @@ function smarty_block_t($params, $text, $template, &$repeat)
// use plural if required parameters are set // use plural if required parameters are set
if (isset($count) && isset($plural)) { if (isset($count) && isset($plural)) {
if (isset($domain) && isset($context)) { if (isset($domain) && isset($context)) {
if (is_callable('__dnpgettext')) { if (is_callable('_dnpgettext')) {
$text = __dnpgettext($domain, $context, $text, $plural, $count); $text = _dnpgettext($domain, $context, $text, $plural, $count);
} }/* elseif (is_callable('dnpgettext')) {
$text = dnpgettext($domain, $context, $text, $plural, $count);
} */
} elseif (isset($domain)) { } elseif (isset($domain)) {
if (is_callable('__dngettext')) { if (is_callable('_dngettext')) {
$text = __dngettext($domain, $text, $plural, $count); $text = _dngettext($domain, $text, $plural, $count);
} elseif (is_callable('dngettext')) {
$text = dngettext($domain, $text, $plural, $count);
} }
} elseif (isset($context)) { } elseif (isset($context)) {
if (is_callable('__npgettext')) { if (is_callable('_npgettext')) {
$text == __npgettext($context, $text, $plural, $count); $text = _npgettext($context, $text, $plural, $count);
} elseif ( }/* elseif (is_callable('npgettext')) {
$template->l10n instanceof \CoreLibs\Language\L10n && $text = npgettext($context, $text, $plural, $count);
method_exists($template->l10n, '__pn') } */
) { } else {
$text = $template->l10n->__pn($text, $plural, $count); if (is_callable('_ngettext')) {
$text = _ngettext($text, $plural, $count);
} elseif (is_callable('ngettext')) {
$text = ngettext($text, $plural, $count);
} }
} elseif (
$template->l10n instanceof \CoreLibs\Language\L10n &&
method_exists($template->l10n, '__n')
) {
$text = $template->l10n->__n($text, $plural, $count);
// $text == __ngettext($text, $plural, $count);
} }
} else { // use normal } else { // use normal
if (isset($domain) && isset($context)) { if (isset($domain) && isset($context)) {
if (is_callable('__dpgettext')) { if (is_callable('_dpgettext')) {
$text = __dpgettext($domain, $context, $text); $text = _dpgettext($domain, $context, $text);
} }/* elseif (is_callable('dpgettext')) {
$text = dpgettext($domain, $context, $text);
} */
} elseif (isset($domain)) { } elseif (isset($domain)) {
if (is_callable('__dgettext')) { if (is_callable('_dgettext')) {
$text = __dgettext($domain, $text); $text = _dgettext($domain, $text);
} elseif (is_callable('dpgettext')) {
$text = dgettext($domain, $text);
} }
} elseif (isset($context)) { } elseif (isset($context)) {
if (is_callable('__pgettext')) { if (is_callable('_pgettext')) {
$text = __pgettext($context, $text); $text = _pgettext($context, $text);
} elseif ( }/* elseif (is_callable('pgettext')) {
$template->l10n instanceof \CoreLibs\Language\L10n && $text = pgettext($context, $text);
method_exists($template->l10n, '__p') } */
) {
$text = $template->l10n->__p($context, $text);
}
} else { } else {
if (is_callable('__gettext')) { if (is_callable('_gettext')) {
$text = __gettext($text); $text = _gettext($text);
} elseif ( } elseif (is_callable('gettext')) {
$template->l10n instanceof \CoreLibs\Language\L10n && $text = gettext($text);
method_exists($template->l10n, '__')
) {
$text = $template->l10n->__($text);
} }
} }
} }
@@ -180,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':
@@ -187,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;