Skip to content

Commit e25d86f

Browse files
committed
Add name to language information
This is necessary for the status output command in the crowdin bridge.
1 parent 4718cb6 commit e25d86f

File tree

9 files changed

+179
-53
lines changed

9 files changed

+179
-53
lines changed

src/Configuration/ConfigurationReader.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace FriendsOfTYPO3\CrowdinBase\Configuration;
66

7+
use FriendsOfTYPO3\CrowdinBase\Configuration\Entity\Language;
78
use FriendsOfTYPO3\CrowdinBase\Configuration\Entity\Project;
89
use FriendsOfTYPO3\CrowdinBase\Configuration\Exception\InvalidConfigurationFileException;
910
use FriendsOfTYPO3\CrowdinBase\Configuration\Exception\UnavailableConfigurationFileException;
@@ -39,7 +40,7 @@ public function read(): array
3940
* projects: array<non-empty-string, array{
4041
* id: int,
4142
* extensionKey: non-empty-string,
42-
* languages: list<non-empty-string>,
43+
* languages: list<Language>,
4344
* }>
4445
* } $configuration
4546
*/
@@ -54,11 +55,21 @@ public function read(): array
5455

5556
$projects = [];
5657
foreach ($configuration['projects'] as $identifier => $project) {
58+
/**
59+
* @var array{
60+
* id: int,
61+
* extensionKey: non-empty-string,
62+
* languages: list<array{id: non-empty-string, name: non-empty-string}>
63+
* } $project
64+
*/
5765
$projects[] = new Project(
5866
$project['id'],
5967
$identifier,
6068
$project['extensionKey'],
61-
$project['languages'],
69+
array_map(
70+
static fn(array $language): Language => new Language($language['id'], $language['name']),
71+
$project['languages']
72+
),
6273
);
6374
}
6475

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FriendsOfTYPO3\CrowdinBase\Configuration\Entity;
6+
7+
/**
8+
* Entity for a language
9+
*/
10+
final readonly class Language
11+
{
12+
/**
13+
* @param non-empty-string $id The id, for example: "de"
14+
* @param non-empty-string $name The name, for example: "German"
15+
*/
16+
public function __construct(
17+
public string $id,
18+
public string $name,
19+
) {}
20+
}

src/Configuration/Entity/Project.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
final readonly class Project
1111
{
1212
/**
13-
* @param list<non-empty-string> $languages
13+
* @param int $id The Crowdin ID, for example: 368353
14+
* @param string $identifier The Crowdin identifier, for example: "typo3-extension-news"
15+
* @param string $name The TYPO3 extension key, for example: "news"
16+
* @param list<Language> $languages
1417
*/
1518
public function __construct(
1619
public int $id,

src/Repository/ProjectRepository.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace FriendsOfTYPO3\CrowdinBase\Repository;
66

77
use CrowdinApiClient\Crowdin;
8+
use FriendsOfTYPO3\CrowdinBase\Configuration\Entity\Language;
89
use FriendsOfTYPO3\CrowdinBase\Configuration\Entity\Project;
910

1011
/**
@@ -36,7 +37,12 @@ public function findAll(): array
3637
$item->getId(),
3738
$item->getIdentifier(),
3839
$item->getName(),
39-
$languageIds,
40+
array_values(
41+
array_map(
42+
static fn(array $targetLanguage): Language => new Language($targetLanguage['id'], $targetLanguage['name']),
43+
$item->getTargetLanguages()
44+
)
45+
),
4046
);
4147
}
4248

tests/Configuration/ConfigurationReaderTest.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,30 @@ public function readReturnsConfigurationCorrectly(): void
2727
self::assertSame('typo3-extension-news', $actual[0]->identifier);
2828
self::assertSame(368353, $actual[0]->id);
2929
self::assertSame('news', $actual[0]->name);
30-
self::assertSame(["km", "pt-BR", "ro", "ru"], $actual[0]->languages);
30+
self::assertSame('km', $actual[0]->languages[0]->id);
31+
self::assertSame('Khmer', $actual[0]->languages[0]->name);
32+
self::assertSame('pt-BR', $actual[0]->languages[1]->id);
33+
self::assertSame('Portuguese, Brazilian', $actual[0]->languages[1]->name);
34+
self::assertSame('ru', $actual[0]->languages[2]->id);
35+
self::assertSame('Russian', $actual[0]->languages[2]->name);
3136

3237
self::assertSame('typo3-cms', $actual[1]->identifier);
3338
self::assertSame(368815, $actual[1]->id);
3439
self::assertSame('typo3-cms', $actual[1]->name);
35-
self::assertSame(["de", "el", "eo", "es-ES"], $actual[1]->languages);
40+
self::assertSame('el', $actual[1]->languages[0]->id);
41+
self::assertSame('Greek', $actual[1]->languages[0]->name);
42+
self::assertSame('eo', $actual[1]->languages[1]->id);
43+
self::assertSame('Esperanto', $actual[1]->languages[1]->name);
3644

3745
self::assertSame('typo3-extension-ttaddress', $actual[2]->identifier);
3846
self::assertSame(369561, $actual[2]->id);
3947
self::assertSame('tt_address', $actual[2]->name);
40-
self::assertSame(["pt-BR", "pt-PT", "ro", "sv-SE", "uk"], $actual[2]->languages);
48+
self::assertSame('ro', $actual[2]->languages[0]->id);
49+
self::assertSame('Romanian', $actual[2]->languages[0]->name);
50+
self::assertSame('uk', $actual[2]->languages[1]->id);
51+
self::assertSame('Ukrainian', $actual[2]->languages[1]->name);
4152
}
4253

43-
4454
#[Test]
4555
public function readWithNonExistentFileThrowsException(): void
4656
{

tests/Configuration/ConfigurationWriterTest.php

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
namespace FriendsOfTYPO3\CrowdinBase\Tests\Configuration;
77

8-
use FriendsOfTYPO3\CrowdinBase\Configuration\Exception\ConfigurationFileWriteException;
9-
use FriendsOfTYPO3\CrowdinBase\Configuration\ConfigurationReader;
108
use FriendsOfTYPO3\CrowdinBase\Configuration\ConfigurationWriter;
11-
use FriendsOfTYPO3\CrowdinBase\Configuration\Exception\InvalidConfigurationDataException;
9+
use FriendsOfTYPO3\CrowdinBase\Configuration\Entity\Language;
1210
use FriendsOfTYPO3\CrowdinBase\Configuration\Entity\Project;
11+
use FriendsOfTYPO3\CrowdinBase\Configuration\Exception\ConfigurationFileWriteException;
12+
use FriendsOfTYPO3\CrowdinBase\Configuration\Exception\InvalidConfigurationDataException;
1313
use FriendsOfTYPO3\CrowdinBase\Extension\ExtensionKeyGenerator;
1414
use PHPUnit\Framework\Attributes\CoversClass;
1515
use PHPUnit\Framework\Attributes\Test;
@@ -23,26 +23,24 @@ public function writeCreatesConfigurationFileCorrectly(): void
2323
{
2424
$configurationFile = '/tmp/crowdin-base-configuration-writer-test/' . uniqid();
2525
$projects = [
26-
new Project(1, 'typo3-extension-some-identifier', 'typo3 extension news', ['de']),
27-
new Project(2, 'typo3-extension-another-identifier', 'typo3 extension tt_address', ['fr', 'it']),
26+
new Project(
27+
1,
28+
'typo3-extension-some-identifier',
29+
'news',
30+
[new Language('de', 'German')]
31+
),
32+
new Project(
33+
2,
34+
'typo3-extension-another-identifier',
35+
'typo3 extension tt_address',
36+
[new Language('fr', 'French'), new Language('it', 'Italian')]
37+
),
2838
];
2939
$subject = new ConfigurationWriter(new ExtensionKeyGenerator(), $configurationFile, []);
3040

3141
$subject->write($projects);
32-
$configurationReader = new ConfigurationReader($configurationFile);
33-
$actual = $configurationReader->read();
34-
35-
self::assertCount(2, $actual);
36-
37-
self::assertSame(2, $actual[0]->id);
38-
self::assertSame('typo3-extension-another-identifier', $actual[0]->identifier);
39-
self::assertSame('tt_address', $actual[0]->name);
40-
self::assertSame(['fr', 'it'], $actual[0]->languages);
4142

42-
self::assertSame(1, $actual[1]->id);
43-
self::assertSame('typo3-extension-some-identifier', $actual[1]->identifier);
44-
self::assertSame('news', $actual[1]->name);
45-
self::assertSame(['de'], $actual[1]->languages);
43+
self::assertJsonFileEqualsJsonFile(__DIR__ . '/Output/configuration.json', $configurationFile);
4644

4745
unlink($configurationFile);
4846
}
@@ -52,17 +50,24 @@ public function writeCreatesConfigurationFileWithoutGivenSkippedProjectsCorrectl
5250
{
5351
$configurationFile = '/tmp/crowdin-base-configuration-writer-test/' . uniqid();
5452
$projects = [
55-
new Project(1, 'typo3-extension-some-identifier', 'typo3 extension news', ['de']),
56-
new Project(2, 'typo3-extension-another-identifier', 'typo3 extension tt_address', ['fr', 'it']),
53+
new Project(
54+
1,
55+
'typo3-extension-some-identifier',
56+
'news',
57+
[new Language('de', 'German')]
58+
),
59+
new Project(
60+
2,
61+
'typo3-extension-another-identifier',
62+
'typo3 extension tt_address',
63+
[new Language('fr', 'French'), new Language('it', 'Italian')]
64+
),
5765
];
5866
$subject = new ConfigurationWriter(new ExtensionKeyGenerator(), $configurationFile, ['typo3-extension-some-identifier']);
5967

6068
$subject->write($projects);
61-
$configurationReader = new ConfigurationReader($configurationFile);
62-
$actual = $configurationReader->read();
6369

64-
self::assertCount(1, $actual);
65-
self::assertSame(2, $actual[0]->id);
70+
self::assertJsonFileEqualsJsonFile(__DIR__ . '/Output/configuration-without-skipped.json', $configurationFile);
6671

6772
unlink($configurationFile);
6873
}
@@ -74,7 +79,12 @@ public function writeThrowsErrorOnInvalidJson(): void
7479

7580
$configurationFile = '/tmp/crowdin-base-configuration-writer-test/' . uniqid();
7681
$projects = [
77-
new Project(1, 'typo3-extension-some-identifier', "typo3 extension news\xB1\x31", ['de']),
82+
new Project(
83+
1,
84+
'typo3-extension-some-identifier',
85+
"typo3 extension news\xB1\x31",
86+
[new Language('de', 'German')]
87+
),
7888
];
7989
$subject = new ConfigurationWriter(new ExtensionKeyGenerator(), $configurationFile, []);
8090

@@ -90,7 +100,12 @@ public function writeThrowsErrorIfConfigurationFileCannotBeWritten(): void
90100
mkdir(dirname($configurationFile));
91101
chmod(dirname($configurationFile), 0500);
92102
$projects = [
93-
new Project(1, 'typo3-extension-some-identifier', "typo3 extension news", ['de']),
103+
new Project(
104+
1,
105+
'typo3-extension-some-identifier',
106+
'news',
107+
[new Language('de', 'German')]
108+
),
94109
];
95110

96111
$subject = new ConfigurationWriter(new ExtensionKeyGenerator(), $configurationFile, []);

tests/Configuration/Fixture/configuration.json

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,48 @@
33
"typo3-extension-news": {
44
"id": 368353,
55
"extensionKey": "news",
6-
"languages": [
7-
"km",
8-
"pt-BR",
9-
"ro",
10-
"ru"
11-
]
6+
"languages": [
7+
{
8+
"id": "km",
9+
"name": "Khmer"
10+
},
11+
{
12+
"id": "pt-BR",
13+
"name": "Portuguese, Brazilian"
14+
},
15+
{
16+
"id": "ru",
17+
"name": "Russian"
18+
}
19+
]
1220
},
1321
"typo3-cms": {
1422
"id": 368815,
1523
"extensionKey": "typo3-cms",
16-
"languages": [
17-
"de",
18-
"el",
19-
"eo",
20-
"es-ES"
21-
]
24+
"languages": [
25+
{
26+
"id": "el",
27+
"name": "Greek"
28+
},
29+
{
30+
"id": "eo",
31+
"name": "Esperanto"
32+
}
33+
]
2234
},
2335
"typo3-extension-ttaddress": {
2436
"id": 369561,
2537
"extensionKey": "tt_address",
26-
"languages": [
27-
"pt-BR",
28-
"pt-PT",
29-
"ro",
30-
"sv-SE",
31-
"uk"
32-
]
38+
"languages": [
39+
{
40+
"id": "ro",
41+
"name": "Romanian"
42+
},
43+
{
44+
"id": "uk",
45+
"name": "Ukrainian"
46+
}
47+
]
3348
}
3449
}
3550
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"projects": {
3+
"typo3-extension-another-identifier": {
4+
"id": 2,
5+
"extensionKey": "tt_address",
6+
"languages": [
7+
{
8+
"id": "fr",
9+
"name": "French"
10+
},
11+
{
12+
"id": "it",
13+
"name": "Italian"
14+
}
15+
]
16+
}
17+
}
18+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"projects": {
3+
"typo3-extension-another-identifier": {
4+
"id": 2,
5+
"extensionKey": "tt_address",
6+
"languages": [
7+
{
8+
"id": "fr",
9+
"name": "French"
10+
},
11+
{
12+
"id": "it",
13+
"name": "Italian"
14+
}
15+
]
16+
},
17+
"typo3-extension-some-identifier": {
18+
"id": 1,
19+
"extensionKey": "news",
20+
"languages": [
21+
{
22+
"id": "de",
23+
"name": "German"
24+
}
25+
]
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)