Switch to php-gettext 5.x:

- Don't use compiled PHP translations, switch back to gettext .mo compiled files
 - Bring npm easygettext back for JS parsing and generation
This commit is contained in:
Buster "Silver Eagle" Neece 2022-04-27 12:50:39 -05:00
parent f109600159
commit fec35a2432
No known key found for this signature in database
GPG Key ID: 9FC8B9E008872109
46 changed files with 7234 additions and 122660 deletions

View File

@ -74,14 +74,17 @@ jobs:
- name: Clear existing locales. - name: Clear existing locales.
if: github.event_name == 'push' || github.event_name == 'schedule' if: github.event_name == 'push' || github.event_name == 'schedule'
run: | run: |
rm -rf resources/locale/compiled
rm -rf resources/locale/compiled_js
rm -rf resources/locale/*.UTF-8 rm -rf resources/locale/*.UTF-8
mkdir -p resources/locale/compiled
- name: Generate new translations from existing code. - name: Generate new translations from existing code.
if: github.event_name == 'push' || github.event_name == 'schedule' if: github.event_name == 'push' || github.event_name == 'schedule'
run: bin/console locale:generate run: |
cd frontend
npm ci
npm run generate-locales
cd ..
bin/console locale:generate
- name: Pull latest translations. - name: Pull latest translations.
if: github.event_name == 'push' || github.event_name == 'schedule' if: github.event_name == 'push' || github.event_name == 'schedule'
@ -103,7 +106,7 @@ jobs:
bin/console locale:import bin/console locale:import
cd frontend cd frontend
npm ci npm run import-locales
npm run build npm run build
- name: Build OpenAPI Docs - name: Build OpenAPI Docs
@ -149,8 +152,7 @@ jobs:
name: assets name: assets
if-no-files-found: error if-no-files-found: error
path: | path: |
resources/locale/compiled resources/locale
resources/locale/translations.json
web/static/dist web/static/dist
web/static/webpack_dist web/static/webpack_dist
web/static/webpack.json web/static/webpack.json

View File

@ -46,5 +46,15 @@ frontend-bash:
frontend-build: frontend-build:
docker-compose -p azuracast_frontend -f frontend/docker-compose.yml build docker-compose -p azuracast_frontend -f frontend/docker-compose.yml build
docker-compose -p azuracast_frontend --env-file=.env -f frontend/docker-compose.yml run -e NODE_ENV=development --rm frontend npm run dev-build docker-compose -p azuracast_frontend --env-file=.env -f frontend/docker-compose.yml run -e NODE_ENV=development --rm frontend npm run build
generate-locales:
docker-compose -p azuracast_frontend -f frontend/docker-compose.yml build
docker-compose -p azuracast_frontend --env-file=.env -f frontend/docker-compose.yml run -e NODE_ENV=development --rm frontend npm run generate-locales
docker-compose exec --user=azuracast web azuracast_cli locale:generate
import-locales:
docker-compose -p azuracast_frontend -f frontend/docker-compose.yml build
docker-compose -p azuracast_frontend --env-file=.env -f frontend/docker-compose.yml run -e NODE_ENV=development --rm frontend npm run import-locales
docker-compose exec --user=azuracast web azuracast_cli locale:import

View File

@ -40,7 +40,9 @@
"doctrine/migrations": "^3.0", "doctrine/migrations": "^3.0",
"doctrine/orm": "^2.6", "doctrine/orm": "^2.6",
"dragonmantank/cron-expression": "^3.1", "dragonmantank/cron-expression": "^3.1",
"gettext/gettext": "^4.4", "gettext/gettext": "^5",
"gettext/php-scanner": "^1.3",
"gettext/translator": "^1.1",
"guzzlehttp/guzzle": "^7.0", "guzzlehttp/guzzle": "^7.0",
"guzzlehttp/oauth-subscriber": "^0.6.0", "guzzlehttp/oauth-subscriber": "^0.6.0",
"http-interop/http-factory-guzzle": "^1.0", "http-interop/http-factory-guzzle": "^1.0",
@ -105,9 +107,6 @@
"symfony/polyfill-php80": "1.99", "symfony/polyfill-php80": "1.99",
"symfony/polyfill-php81": "1.99" "symfony/polyfill-php81": "1.99"
}, },
"conflict": {
"gettext/gettext": ">=5"
},
"require-dev": { "require-dev": {
"codeception/codeception": "^5.0.0-RC1", "codeception/codeception": "^5.0.0-RC1",
"codeception/module-asserts": "^3", "codeception/module-asserts": "^3",

282
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "82acd00082268f9690add5cfab77425a", "content-hash": "7c8e1da340da4f9fd035df272403daf9",
"packages": [ "packages": [
{ {
"name": "aws/aws-crt-php", "name": "aws/aws-crt-php",
@ -2434,35 +2434,28 @@
}, },
{ {
"name": "gettext/gettext", "name": "gettext/gettext",
"version": "v4.8.6", "version": "v5.6.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-gettext/Gettext.git", "url": "https://github.com/php-gettext/Gettext.git",
"reference": "bbeb8f4d3077663739aecb4551b22e720c0e9efe" "reference": "017e249601d32b9a88c2eb4c10eac89bf582a7d3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-gettext/Gettext/zipball/bbeb8f4d3077663739aecb4551b22e720c0e9efe", "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/017e249601d32b9a88c2eb4c10eac89bf582a7d3",
"reference": "bbeb8f4d3077663739aecb4551b22e720c0e9efe", "reference": "017e249601d32b9a88c2eb4c10eac89bf582a7d3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"gettext/languages": "^2.3", "gettext/languages": "^2.3",
"php": ">=5.4.0" "php": "^7.2|^8.0"
}, },
"require-dev": { "require-dev": {
"illuminate/view": "^5.0.x-dev", "brick/varexporter": "^0.3.5",
"phpunit/phpunit": "^4.8|^5.7|^6.5", "friendsofphp/php-cs-fixer": "^3.2",
"squizlabs/php_codesniffer": "^3.0", "oscarotero/php-cs-fixer-config": "^2.0",
"symfony/yaml": "~2", "phpunit/phpunit": "^8.0|^9.0",
"twig/extensions": "*", "squizlabs/php_codesniffer": "^3.0"
"twig/twig": "^1.31|^2.0"
},
"suggest": {
"illuminate/view": "Is necessary if you want to use the Blade extractor",
"symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator",
"twig/extensions": "Is necessary if you want to use the Twig extractor",
"twig/twig": "Is necessary if you want to use the Twig extractor"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -2483,7 +2476,7 @@
} }
], ],
"description": "PHP gettext manager", "description": "PHP gettext manager",
"homepage": "https://github.com/oscarotero/Gettext", "homepage": "https://github.com/php-gettext/Gettext",
"keywords": [ "keywords": [
"JS", "JS",
"gettext", "gettext",
@ -2494,8 +2487,8 @@
], ],
"support": { "support": {
"email": "oom@oscarotero.com", "email": "oom@oscarotero.com",
"issues": "https://github.com/oscarotero/Gettext/issues", "issues": "https://github.com/php-gettext/Gettext/issues",
"source": "https://github.com/php-gettext/Gettext/tree/v4.8.6" "source": "https://github.com/php-gettext/Gettext/tree/v5.6.1"
}, },
"funding": [ "funding": [
{ {
@ -2511,7 +2504,7 @@
"type": "patreon" "type": "patreon"
} }
], ],
"time": "2021-10-19T10:44:53+00:00" "time": "2021-12-04T11:33:21+00:00"
}, },
{ {
"name": "gettext/languages", "name": "gettext/languages",
@ -2587,6 +2580,139 @@
], ],
"time": "2021-11-11T17:30:39+00:00" "time": "2021-11-11T17:30:39+00:00"
}, },
{
"name": "gettext/php-scanner",
"version": "v1.3.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/PHP-Scanner.git",
"reference": "989a2cffa1d0f43d13b14c83a50429119b5eb8e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/PHP-Scanner/zipball/989a2cffa1d0f43d13b14c83a50429119b5eb8e4",
"reference": "989a2cffa1d0f43d13b14c83a50429119b5eb8e4",
"shasum": ""
},
"require": {
"gettext/gettext": "^5.5.0",
"nikic/php-parser": "^4.2",
"php": ">=7.2"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.15",
"oscarotero/php-cs-fixer-config": "^1.0",
"phpunit/phpunit": "^8.0",
"squizlabs/php_codesniffer": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Gettext\\Scanner\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oscar Otero",
"email": "oom@oscarotero.com",
"homepage": "http://oscarotero.com",
"role": "Developer"
}
],
"description": "PHP scanner for gettext",
"homepage": "https://github.com/php-gettext/PHP-Scanner",
"keywords": [
"gettext",
"i18n",
"php",
"scanner",
"translation"
],
"support": {
"email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/PHP-Scanner/issues",
"source": "https://github.com/php-gettext/PHP-Scanner/tree/v1.3.1"
},
"time": "2022-03-18T11:47:55+00:00"
},
{
"name": "gettext/translator",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Translator.git",
"reference": "b18ff33e8203de623854561f5e47e992fc5c50bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-gettext/Translator/zipball/b18ff33e8203de623854561f5e47e992fc5c50bb",
"reference": "b18ff33e8203de623854561f5e47e992fc5c50bb",
"shasum": ""
},
"require": {
"php": "^7.2|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.15",
"gettext/gettext": "^5.0.0",
"oscarotero/php-cs-fixer-config": "^1.0",
"phpunit/phpunit": "^8.0",
"squizlabs/php_codesniffer": "^3.0"
},
"suggest": {
"gettext/gettext": "Is necessary to load and generate array files used by the translator"
},
"type": "library",
"autoload": {
"psr-4": {
"Gettext\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oscar Otero",
"email": "oom@oscarotero.com",
"homepage": "http://oscarotero.com",
"role": "Developer"
}
],
"description": "Gettext translator functions",
"homepage": "https://github.com/php-gettext/Translator",
"keywords": [
"gettext",
"i18n",
"php",
"translator"
],
"support": {
"email": "oom@oscarotero.com",
"issues": "https://github.com/php-gettext/Translator/issues",
"source": "https://github.com/php-gettext/Translator/tree/v1.1.1"
},
"funding": [
{
"url": "https://paypal.me/oscarotero",
"type": "custom"
},
{
"url": "https://github.com/oscarotero",
"type": "github"
},
{
"url": "https://www.patreon.com/misteroom",
"type": "patreon"
}
],
"time": "2022-02-23T20:29:40+00:00"
},
{ {
"name": "graham-campbell/guzzle-factory", "name": "graham-campbell/guzzle-factory",
"version": "v5.0.3", "version": "v5.0.3",
@ -4633,6 +4759,62 @@
}, },
"time": "2018-02-13T20:26:39+00:00" "time": "2018-02-13T20:26:39+00:00"
}, },
{
"name": "nikic/php-parser",
"version": "v4.13.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=7.0"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov"
}
],
"description": "A PHP parser written in PHP",
"keywords": [
"parser",
"php"
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
},
"time": "2021-11-30T19:35:32+00:00"
},
{ {
"name": "pagerfanta/core", "name": "pagerfanta/core",
"version": "v3.6.1", "version": "v3.6.1",
@ -10955,62 +11137,6 @@
}, },
"time": "2022-01-20T13:18:17+00:00" "time": "2022-01-20T13:18:17+00:00"
}, },
{
"name": "nikic/php-parser",
"version": "v4.13.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=7.0"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov"
}
],
"description": "A PHP parser written in PHP",
"keywords": [
"parser",
"php"
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
},
"time": "2021-11-30T19:35:32+00:00"
},
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
"version": "2.0.3", "version": "2.0.3",

View File

@ -16,6 +16,9 @@ RUN USER=node && \
mkdir -p /etc/fixuid && \ mkdir -p /etc/fixuid && \
printf "user: $USER\ngroup: $GROUP\npaths:\n - /\n - /data/frontend/node_modules\n" > /etc/fixuid/config.yml printf "user: $USER\ngroup: $GROUP\npaths:\n - /\n - /data/frontend/node_modules\n" > /etc/fixuid/config.yml
COPY ./entrypoint.sh /
RUN chmod a+x /entrypoint.sh
# Define working directory. # Define working directory.
WORKDIR /data/frontend WORKDIR /data/frontend
@ -27,5 +30,5 @@ VOLUME /data/frontend/node_modules
ENV NODE_ENV=production ENV NODE_ENV=production
# Define default command. # Define default command.
ENTRYPOINT ["fixuid"] ENTRYPOINT ["/entrypoint.sh"]
CMD ["npm", "run", "dev"] CMD ["bash"]

8
frontend/entrypoint.sh Normal file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
fixuid
cd /data/frontend
npm ci
exec "$@"

File diff suppressed because it is too large Load Diff

View File

@ -2,10 +2,10 @@
"name": "azuracast", "name": "azuracast",
"license": "Apache-2.0", "license": "Apache-2.0",
"scripts": { "scripts": {
"dev": "npm ci && bash",
"dev-build": "npm ci && npm run build",
"build": "gulp", "build": "gulp",
"watch": "gulp watch" "watch": "gulp watch",
"generate-locales": "gettext-extract --attribute v-translate --keywords '$gettext' --output ../resources/locale/frontend.pot $(find ./vue -type f -name '*.vue')",
"import-locales": "gettext-compile --output ../resources/locale/translations.json $(find ../resources/locale/*.UTF-8/LC_MESSAGES -type f -name 'default.po')"
}, },
"dependencies": { "dependencies": {
"@babel/core": "^7.15.5", "@babel/core": "^7.15.5",
@ -28,6 +28,7 @@
"codemirror": "^5.62.3", "codemirror": "^5.62.3",
"css-loader": "^6.5.0", "css-loader": "^6.5.0",
"del": "^6", "del": "^6",
"easygettext": "^2.17.0",
"gulp": "^4.0.2", "gulp": "^4.0.2",
"gulp-babel": "^8.0.0", "gulp-babel": "^8.0.0",
"gulp-clean-css": "^4", "gulp-clean-css": "^4",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -6,6 +6,9 @@ namespace App\Console\Command\Locale;
use App\Console\Command\CommandAbstract; use App\Console\Command\CommandAbstract;
use App\Environment; use App\Environment;
use Gettext\Generator\PoGenerator;
use Gettext\Loader\PoLoader;
use Gettext\Scanner\PhpScanner;
use Gettext\Translations; use Gettext\Translations;
use RecursiveDirectoryIterator; use RecursiveDirectoryIterator;
use RecursiveIteratorIterator; use RecursiveIteratorIterator;
@ -35,45 +38,45 @@ class GenerateCommand extends CommandAbstract
$exportDir = $this->environment->getBaseDirectory() . '/resources/locale'; $exportDir = $this->environment->getBaseDirectory() . '/resources/locale';
$dest_file = $exportDir . '/default.pot'; $translations = Translations::create('default');
$destFile = $exportDir . '/default.pot';
$translations = new Translations(); // Import the JS-generated files if they exist
$frontendJsFile = $exportDir . '/frontend.pot';
// Find all JS/Vue file translations. if (is_file($frontendJsFile)) {
$directory = new RecursiveDirectoryIterator($this->environment->getBaseDirectory() . '/frontend/vue'); $translations = (new PoLoader())->loadFile($frontendJsFile, $translations);
$iterator = new RecursiveIteratorIterator($directory); @unlink($frontendJsFile);
$vueRegex = new RegexIterator($iterator, '/^.+\.(vue)$/i', RegexIterator::GET_MATCH);
foreach ($vueRegex as $pathMatch) {
$translations->addFromVueJsFile($pathMatch[0]);
}
$jsRegex = new RegexIterator($iterator, '/^.+\.(js)$/i', RegexIterator::GET_MATCH);
foreach ($jsRegex as $pathMatch) {
$translations->addFromJsCodeFile($pathMatch[0]);
} }
// Find all PHP/PHTML files in the application's code. // Find all PHP/PHTML files in the application's code.
$translatable_folders = [ $translatableFolders = [
$this->environment->getBaseDirectory() . '/src', $this->environment->getBaseDirectory() . '/src',
$this->environment->getBaseDirectory() . '/config', $this->environment->getBaseDirectory() . '/config',
$this->environment->getViewsDirectory(), $this->environment->getViewsDirectory(),
]; ];
foreach ($translatable_folders as $folder) { $phpScanner = new PhpScanner($translations);
$phpScanner->setDefaultDomain('default');
foreach ($translatableFolders as $folder) {
$directory = new RecursiveDirectoryIterator($folder); $directory = new RecursiveDirectoryIterator($folder);
$iterator = new RecursiveIteratorIterator($directory); $iterator = new RecursiveIteratorIterator($directory);
$regex = new RegexIterator($iterator, '/^.+\.(phtml|php)$/i', RegexIterator::GET_MATCH); $regex = new RegexIterator($iterator, '/^.+\.(phtml|php)$/i', RegexIterator::GET_MATCH);
foreach ($regex as $path_match) { foreach ($regex as $path_match) {
$path = $path_match[0]; $path = $path_match[0];
$translations->addFromPhpCodeFile($path); $phpScanner->scanFile($path);
} }
} }
$translations->ksort(); @unlink($destFile);
$translations->toPoFile($dest_file); $poGenerator = new PoGenerator();
$poGenerator->generateFile(
$translations,
$destFile
);
$io->success('Locales generated.'); $io->success('Locales generated.');
return 0; return 0;

View File

@ -7,8 +7,8 @@ namespace App\Console\Command\Locale;
use App\Console\Command\CommandAbstract; use App\Console\Command\CommandAbstract;
use App\Enums\SupportedLocales; use App\Enums\SupportedLocales;
use App\Environment; use App\Environment;
use Gettext\Translation; use Gettext\Generator\MoGenerator;
use Gettext\Translations; use Gettext\Loader\PoLoader;
use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
@ -32,58 +32,26 @@ class ImportCommand extends CommandAbstract
$io = new SymfonyStyle($input, $output); $io = new SymfonyStyle($input, $output);
$io->title('Import Locales'); $io->title('Import Locales');
$localeBase = $this->environment->getBaseDirectory() . '/resources/locale'; $localesBase = $this->environment->getBaseDirectory() . '/resources/locale';
$jsTranslations = [];
$supportedLocales = SupportedLocales::cases(); $supportedLocales = SupportedLocales::cases();
$defaultLocale = SupportedLocales::default(); $defaultLocale = SupportedLocales::default();
$poLoader = new PoLoader();
$moGenerator = new MoGenerator();
foreach ($supportedLocales as $supportedLocale) { foreach ($supportedLocales as $supportedLocale) {
if ($supportedLocale === $defaultLocale) { if ($supportedLocale === $defaultLocale) {
continue; continue;
} }
$locale_source = $localeBase . '/' . $supportedLocale->value . '/LC_MESSAGES/default.po'; $localeFolder = $localesBase . '/' . $supportedLocale->value . '/LC_MESSAGES';
$localeSource = $localeFolder . '/default.po';
$localeDest = $localeFolder . '/default.mo';
if (is_file($locale_source)) { if (is_file($localeSource)) {
$translations = Translations::fromPoFile($locale_source); $translations = $poLoader->loadFile($localeSource);
$moGenerator->generateFile($translations, $localeDest);
// Temporary inclusion of frontend translations
$frontendTranslations = $localeBase . '/' . $supportedLocale->value . '/LC_MESSAGES/frontend.po';
if (is_file($frontendTranslations)) {
$frontendTranslations = Translations::fromPoFile($frontendTranslations);
$translations->mergeWith($frontendTranslations);
}
$locale_dest = $localeBase . '/compiled/' . $supportedLocale->value . '.php';
$translations->toPhpArrayFile($locale_dest);
$localeJsKey = str_replace('.UTF-8', '', $supportedLocale->value);
/** @var Translation $translation */
foreach ($translations as $translation) {
if ($translation->isDisabled() || !$translation->hasTranslation()) {
continue;
}
if ($translation->hasPlural()) {
$string = [
$translation->getTranslation(),
];
$pluralStrings = $translation->getPluralTranslations();
if (count($pluralStrings) > 0) {
$string = array_merge($string, $pluralStrings);
}
} else {
$string = $translation->getTranslation();
}
$jsTranslations[$localeJsKey][$translation->getOriginal()] = $string;
}
ksort($jsTranslations[$localeJsKey]);
$io->writeln( $io->writeln(
__('Imported locale: %s', $supportedLocale->value . ' (' . $supportedLocale->getLocalName() . ')') __('Imported locale: %s', $supportedLocale->value . ' (' . $supportedLocale->getLocalName() . ')')
@ -91,14 +59,6 @@ class ImportCommand extends CommandAbstract
} }
} }
$jsTranslations = json_encode(
$jsTranslations,
JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
);
$jsTranslationsPath = $localeBase . '/translations.json';
file_put_contents($jsTranslationsPath, $jsTranslations);
$io->success('Locales imported.'); $io->success('Locales imported.');
return 0; return 0;
} }

View File

@ -8,7 +8,9 @@ namespace App\Enums;
use App\Environment; use App\Environment;
use App\Http\ServerRequest; use App\Http\ServerRequest;
use Gettext\Translator; use Gettext\GettextTranslator;
use Gettext\TranslatorFunctions;
use Gettext\TranslatorInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
enum SupportedLocales: string enum SupportedLocales: string
@ -62,24 +64,19 @@ enum SupportedLocales: string
return self::stripLocaleEncoding($this); return self::stripLocaleEncoding($this);
} }
public function createTranslator(Environment $environment): Translator public function createTranslator(Environment $environment): TranslatorInterface
{ {
$translator = new Translator(); $translator = new GettextTranslator();
$translator->setLanguage($this->value);
$localeBase = $environment->getBaseDirectory() . '/resources/locale/compiled'; $translator->loadDomain('default', $environment->getBaseDirectory() . '/resources/locale');
$localePath = $localeBase . '/' . $this->value . '.php';
if (file_exists($localePath)) {
$translator->loadTranslations($localePath);
}
return $translator; return $translator;
} }
public function register(Environment $environment): void public function register(Environment $environment): void
{ {
$translator = $this->createTranslator($environment); $translator = $this->createTranslator($environment);
$translator->register();
TranslatorFunctions::register($translator);
// Register translation superglobal functions // Register translation superglobal functions
setlocale(LC_ALL, $this->value); setlocale(LC_ALL, $this->value);

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Http; namespace App\Http;
use App\Entity; use App\Entity;
use App\Enums\SupportedLocales;
use App\Environment; use App\Environment;
use App\Exception; use App\Exception;
use App\Exception\NotLoggedInException; use App\Exception\NotLoggedInException;
@ -13,7 +14,6 @@ use App\Middleware\InjectSession;
use App\Session\Flash; use App\Session\Flash;
use App\View; use App\View;
use DI\FactoryInterface; use DI\FactoryInterface;
use Gettext\Translator;
use Monolog\Logger; use Monolog\Logger;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
@ -110,8 +110,8 @@ class ErrorHandler extends \Slim\Handlers\ErrorHandler
protected function respond(): ResponseInterface protected function respond(): ResponseInterface
{ {
if (!function_exists('__')) { if (!function_exists('__')) {
$translator = new Translator(); $locale = SupportedLocales::default();
$translator->register(); $locale->register($this->environment);
} }
// Special handling for cURL requests. // Special handling for cURL requests.