Merge pull request #655 from MyIgel/ci-build-translation

CI: Build translation files for container and release archive, load .po if .mo not generated
This commit is contained in:
msquare 2019-10-13 13:03:10 +02:00 committed by GitHub
commit f7bbcfb345
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 58 additions and 7 deletions

1
.gitignore vendored
View File

@ -24,6 +24,7 @@ _vimrc_local.vim
/public/coverage /public/coverage
/coverage /coverage
/unittests.xml /unittests.xml
/resources/lang/*/*.mo
# Composer files # Composer files
/vendor/ /vendor/

View File

@ -58,6 +58,11 @@ The following instructions explain how to get, build and run the latest engelsys
```bash ```bash
yarn build yarn build
``` ```
* Optionally (for better performance)
* Generate translation files
```bash
find resources/lang/ -type f -name '*.po' -exec sh -c 'file="{}"; msgfmt "${file%.*}.po" -o "${file%.*}.mo"' \;
```
### Configuration and Setup ### Configuration and Setup
* The webserver must have write access to the ```import``` and ```storage``` directories and read access for all other directories * The webserver must have write access to the ```import``` and ```storage``` directories and read access for all other directories

View File

@ -4,7 +4,12 @@ COPY ./ /app/
RUN composer --no-ansi install --no-dev --ignore-platform-reqs RUN composer --no-ansi install --no-dev --ignore-platform-reqs
RUN composer --no-ansi dump-autoload --optimize RUN composer --no-ansi dump-autoload --optimize
# Intermediate container for less layers # Intermediate containers for less layers
FROM alpine as translation
RUN apk add gettext
COPY resources/lang/ /data
RUN find /data -type f -name '*.po' -exec sh -c 'file="{}"; msgfmt "${file%.*}.po" -o "${file%.*}.mo"' \;
FROM alpine as data FROM alpine as data
COPY .babelrc .browserslistrc composer.json LICENSE package.json README.md webpack.config.js yarn.lock /app/ COPY .babelrc .browserslistrc composer.json LICENSE package.json README.md webpack.config.js yarn.lock /app/
COPY bin/ /app/bin COPY bin/ /app/bin
@ -13,11 +18,11 @@ COPY db/ /app/db
RUN mkdir /app/import/ RUN mkdir /app/import/
COPY includes/ /app/includes COPY includes/ /app/includes
COPY public/ /app/public COPY public/ /app/public
COPY resources/lang /app/resources/lang
COPY resources/views /app/resources/views COPY resources/views /app/resources/views
COPY src/ /app/src COPY src/ /app/src
COPY storage/ /app/storage COPY storage/ /app/storage
COPY --from=translation /data/ /app/resources/lang
COPY --from=composer /app/vendor/ /app/vendor COPY --from=composer /app/vendor/ /app/vendor
COPY --from=composer /app/composer.lock /app/ COPY --from=composer /app/composer.lock /app/

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -5,6 +5,7 @@ namespace Engelsystem\Helpers\Translation;
use Engelsystem\Config\Config; use Engelsystem\Config\Config;
use Engelsystem\Container\ServiceProvider; use Engelsystem\Container\ServiceProvider;
use Gettext\Translations; use Gettext\Translations;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\Session;
class TranslationServiceProvider extends ServiceProvider class TranslationServiceProvider extends ServiceProvider
@ -67,14 +68,18 @@ class TranslationServiceProvider extends ServiceProvider
public function getTranslator(string $locale): GettextTranslator public function getTranslator(string $locale): GettextTranslator
{ {
if (!isset($this->translators[$locale])) { if (!isset($this->translators[$locale])) {
$file = $this->app->get('path.lang') . '/' . $locale . '/default.mo'; $file = $this->getFile($locale);
/** @var GettextTranslator $translator */ /** @var GettextTranslator $translator */
$translator = $this->app->make(GettextTranslator::class); $translator = $this->app->make(GettextTranslator::class);
/** @var Translations $translations */ /** @var Translations $translations */
$translations = $this->app->make(Translations::class); $translations = $this->app->make(Translations::class);
if (Str::endsWith($file, '.mo')) {
$translations->addFromMoFile($file); $translations->addFromMoFile($file);
} else {
$translations->addFromPoFile($file);
}
$translator->loadTranslations($translations); $translator->loadTranslations($translations);
@ -83,4 +88,20 @@ class TranslationServiceProvider extends ServiceProvider
return $this->translators[$locale]; return $this->translators[$locale];
} }
/**
* @param string $locale
* @return string
*/
protected function getFile(string $locale): string
{
$filepath = $file = $this->app->get('path.lang') . '/' . $locale . '/default';
$file = $filepath . '.mo';
if (!file_exists($file)) {
$file = $filepath . '.po';
}
return $file;
}
} }

View File

@ -0,0 +1,3 @@
# Testing content
msgid "foo.bar"
msgstr "B Arr!"

View File

@ -12,7 +12,7 @@ use Symfony\Component\HttpFoundation\Session\Session;
class TranslationServiceProviderTest extends ServiceProviderTest class TranslationServiceProviderTest extends ServiceProviderTest
{ {
/** /**
* @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::register() * @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::register
*/ */
public function testRegister(): void public function testRegister(): void
{ {
@ -30,7 +30,7 @@ class TranslationServiceProviderTest extends ServiceProviderTest
/** @var TranslationServiceProvider|MockObject $serviceProvider */ /** @var TranslationServiceProvider|MockObject $serviceProvider */
$serviceProvider = $this->getMockBuilder(TranslationServiceProvider::class) $serviceProvider = $this->getMockBuilder(TranslationServiceProvider::class)
->setConstructorArgs([$app]) ->setConstructorArgs([$app])
->setMethods(['setLocale']) ->onlyMethods(['setLocale'])
->getMock(); ->getMock();
$app->expects($this->exactly(2)) $app->expects($this->exactly(2))
@ -71,7 +71,7 @@ class TranslationServiceProviderTest extends ServiceProviderTest
} }
/** /**
* @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::getTranslator() * @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::getTranslator
*/ */
public function testGetTranslator(): void public function testGetTranslator(): void
{ {
@ -87,4 +87,20 @@ class TranslationServiceProviderTest extends ServiceProviderTest
// Retry from cache // Retry from cache
$serviceProvider->getTranslator('fo_OO'); $serviceProvider->getTranslator('fo_OO');
} }
/**
* @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::getTranslator
* @covers \Engelsystem\Helpers\Translation\TranslationServiceProvider::getFile
*/
public function testGetTranslatorFromPo(): void
{
$app = $this->getApp(['get']);
$this->setExpects($app, 'get', ['path.lang'], __DIR__ . '/Assets');
$serviceProvider = new TranslationServiceProvider($app);
// Get translator using a .po file
$translator = $serviceProvider->getTranslator('ba_RR');
$this->assertEquals('B Arr!', $translator->gettext('foo.bar'));
}
} }