8000 [Translation] Add icu message support for the lokalise provider by DanielBadura · Pull Request #45368 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[Translation] Add icu message support for the lokalise provider #45368

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: 5.4
Choose a base branch
from
Prev Previous commit
Next Next commit
update tests and add new ones
  • Loading branch information
DanielBadura committed Jun 15, 2022
commit 1607e565e75d5342f76f22eb40cb949150d16bf4
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use Symfony\Component\HttpClient\MockHttpClient;
use Symfony\Component\HttpClient\Response\MockResponse;
use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProvider;
use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProviderFactory;
use Symfony\Component\Translation\Provider\Dsn;
use Symfony\Component\Translation\Provider\ProviderFactoryInterface;
Expand Down Expand Up @@ -57,6 +58,16 @@ public function testBaseUri()
$this->assertMatchesRegularExpression('/https:\/\/api.lokalise.com\/api2\/projects\/PROJECT_ID\/*/', $response->getRequestUrl());
}

public function testIntlIcuEnabled()
{
$response = new MockResponse(json_encode(['files' => []]));
$httpClient = new MockHttpClient([$response]);
$factory = new LokaliseProviderFactory($httpClient, $this->getLogger(), $this->getDefaultLocale(), $this->getLoader(), true);
$provider = $factory->create(new Dsn('lokalise://PROJECT_ID:API_KEY@default'));

$this->assertInstanceOf(LokaliseProvider::class, $provider);
}

public function createFactory(): ProviderFactoryInterface
{
return new LokaliseProviderFactory($this->getClient(), $this->getLogger(), $this->getDefaultLocale(), $this->getLoader());
Expand Down
10000
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\Loader\XliffFileLoader;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\MessageCatalogueInterface;
use Symfony\Component\Translation\Provider\ProviderInterface;
use Symfony\Component\Translation\Test\ProviderTestCase;
use Symfony\Component\Translation\TranslatorBag;
Expand All @@ -27,9 +28,9 @@

class LokaliseProviderTest extends ProviderTestCase
{
public function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint): ProviderInterface
public function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint, bool $intlIcuEnabled): ProviderInterface
{
return new LokaliseProvider($client, $loader, $logger, $defaultLocale, $endpoint);
return new LokaliseProvider($client, $loader, $logger, $defaultLocale, $endpoint, $intlIcuEnabled);
}

public function toStringProvider(): iterable
Expand All @@ -38,23 +39,23 @@ public function toStringProvider(): iterable
$this->createProvider($this->getClient()->withOptions([
'base_uri' => 'https://api.lokalise.com/api2/projects/PROJECT_ID/',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com'),
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com', false),
'lokalise://api.lokalise.com',
];

yield [
$this->createProvider($this->getClient()->withOptions([
'base_uri' => 'https://example.com',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'example.com'),
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'example.com', false),
'lokalise://example.com',
];

yield [
$this->createProvider($this->getClient()->withOptions([
'base_uri' => 'https://example.com:99',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'example.com:99'),
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'example.com:99', false),
'lokalise://example.com:99',
];
}
Expand Down Expand Up @@ -231,7 +232,7 @@ public function testCompleteWriteProcess()
]))->withOptions([
'base_uri' => 'https://api.lokalise.com/api2/projects/PROJECT_ID/',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com');
]), $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com', false);

$translatorBag = new TranslatorBag();
$translatorBag->addCatalogue(new MessageCatalogue('en', [
Expand All @@ -256,6 +257,7 @@ public function testReadForOneLocaleAndOneDomain(string $locale, string $domain,
$expectedBody = json_encode([
'format' => 'symfony_xliff',
'original_filenames' => true,
'placeholder_format' => 'symfony',
'directory_prefix' => '%LANG_ISO%',
'filter_langs' => [$locale],
'filter_filenames' => [$domain.'.xliff'],
Expand Down Expand Up @@ -285,7 +287,7 @@ public function testReadForOneLocaleAndOneDomain(string $locale, string $domain,
$provider = $this->createProvider((new MockHttpClient($response))->withOptions([
'base_uri' => 'https://api.lokalise.com/api2/projects/PROJECT_ID/',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $loader, $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com');
]), $loader, $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com', false);
$translatorBag = $provider->read([$domain], [$locale]);

// We don't want to assert equality of metadata here, due to the ArrayLoader usage.
Expand Down Expand Up @@ -329,7 +331,7 @@ public function testReadForManyLocalesAndManyDomains(array $locales, array $doma
$provider = $this->createProvider((new MockHttpClient($response))->withOptions([
'base_uri' => 'https://api.lokalise.com/api2/projects/PROJECT_ID/',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $loader, $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com');
]), $loader, $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com', false);

$translatorBag = $provider->read($domains, $locales);
// We don't want to assert equality of metadata here, due to the ArrayLoader usage.
Expand Down Expand Up @@ -412,7 +414,8 @@ public function testDeleteProcess()
$this->getLoader(),
$this->getLogger(),
$this->getDefaultLocale(),
'api.lokalise.com'
'api.lokalise.com',
false
);

$provider->delete($translatorBag);
Expand Down Expand Up @@ -601,4 +604,119 @@ public function getResponsesForManyLocalesAndManyDomains(): \Generator
$expectedTranslatorBag,
];
}

/**
* @dataProvider getResponsesForOneLocaleAndOneDomainWithIntlIcuEnabled
*/
public function testReadForOneLocaleAndOneDomainWithIntlIcuEnabled(string $locale, string $domain, string $responseContent, TranslatorBag $expectedTranslatorBag)
{
$response = function (string $method, string $url, array $options = []) use ($locale, $domain, $responseContent): ResponseInterface {
$expectedBody = json_encode([
'format' => 'symfony_xliff',
'original_filenames' => true,
'placeholder_format' => 'icu',
'directory_prefix' => '%LANG_ISO%',
'filter_langs' => [$locale],
'filter_filenames' => [$domain.'.xliff'],
'export_empty_as' => 'skip',
]);

$this->assertSame('POST', $method);
$this->assertSame('https://api.lokalise.com/api2/projects/PROJECT_ID/files/export', $url);
$this->assertJsonStringEqualsJsonString($expectedBody, $options['body']);

return new MockResponse(json_encode([
'files' => [
$locale => [
$domain.'.xliff' => [
'content' => $responseContent,
],
],
],
]));
};

$loader = $this->getLoader();
$loader->expects($this->once())
->method('load')
->willReturn((new XliffFileLoader())->load($responseContent, $locale, $domain));

$provider = $this->createProvider((new MockHttpClient($response))->withOptions([
'base_uri' => 'https://api.lokalise.com/api2/projects/PROJECT_ID/',
'headers' => ['X-Api-Token' => 'API_KEY'],
]), $loader, $this->getLogger(), $this->getDefaultLocale(), 'api.lokalise.com', true);
$translatorBag = $provider->read([$domain], [$locale]);

// We don't want to assert equality of metadata here, due to the ArrayLoader usage.
foreach ($translatorBag->getCatalogues() as $catalogue) {
$catalogue->deleteMetadata('', '');
}

$this->assertEquals($expectedTranslatorBag->getCatalogues(), $translatorBag->getCatalogues());
}

public function getResponsesForOneLocaleAndOneDomainWithIntlIcuEnabled(): \Generator
{
$arrayLoader = new ArrayLoader();

$expectedTranslatorBagEn = new TranslatorBag();
$expectedTranslatorBagEn->addCatalogue($arrayLoader->load([
'index.hello' => 'Hello',
'index.greetings' => 'Welcome, {firstname}!',
], 'en', 'messages' . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX));

yield ['en', 'messages', <<<'XLIFF'
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="" datatype="plaintext" xml:space="preserve" source-language="en" target-language="en">
<header>
<tool tool-id="lokalise.com" tool-name="Lokalise"/>
</header>
<body>
<trans-unit id="index.greetings" resname="index.greetings">
<source>index.greetings</source>
<target>Welcome, {firstname}!</target>
</trans-unit>
<trans-unit id="index.hello" resname="index.hello">
<source>index.hello</source>
<target>Hello</target>
</trans-unit>
</body>
</file>
</xliff>
XLIFF
,
$expectedTranslatorBagEn,
];

$expectedTranslatorBagFr = new TranslatorBag();
$expectedTranslatorBagFr->addCatalogue($arrayLoader->load([
'index.hello' => 'Bonjour',
'index.greetings' => 'Bienvenue, {firstname} !',
], 'fr', 'messages' . MessageCatalogueInterface::INTL_DOMAIN_SUFFIX));

yield ['fr', 'messages', <<<'XLIFF'
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="" datatype="plaintext" xml:space="preserve" source-language="en" target-language="fr">
<header>
<tool tool-id="lokalise.com" tool-name="Lokalise"/>
</header>
<body>
<trans-unit id="index.greetings" resname="index.greetings">
<source>index.greetings</source>
<target>Bienvenue, {firstname} !</target>
</trans-unit>
<trans-unit id="index.hello" resname="index.hello">
<source>index.hello</source>
<target>Bonjour</target>
</trans-unit>
</body>
</file>
</xliff>
XLIFF
,
$expectedTranslatorBagFr,
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ abstract class ProviderTestCase extends TestCase
protected $loader;
protected $xliffFileDumper;

abstract public function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint): ProviderInterface;
abstract public function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint, bool $intlIcuEnabled): ProviderInterface;

/**
* @return iterable<array{0: string, 1: ProviderInterface}>
Expand Down
0