|
| 1 | +<?php |
| 2 | + |
| 3 | +// This script should be run after adding a new message to translate. |
| 4 | +// It will ensure that all messages in "*.en.xlf" files are propagated to all languages. |
| 5 | +// The resulting diff should then be submitted as a PR on the lowest maintained branch, |
| 6 | +// possibly after using GPT to translate all the targets it contains |
| 7 | +// (state="needs-review-translation" should then be used on corresponding target tags.) |
| 8 | + |
| 9 | +use Symfony\Component\Finder\Finder; |
| 10 | +use Symfony\Component\Translation\Loader\XliffFileLoader; |
| 11 | +use Symfony\Component\Translation\MessageCatalogue; |
| 12 | + |
| 13 | +require __DIR__.'/../vendor/autoload.php'; |
| 14 | + |
| 15 | +function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, string $domain) |
| 16 | +{ |
| 17 | + $dom = new \DOMDocument('1.0', 'utf-8'); |
| 18 | + $dom->formatOutput = true; |
| 19 | + |
| 20 | + $xliff = $dom->appendChild($dom->createElement('xliff')); |
| 21 | + $xliff->setAttribute('version', '1.2'); |
| 22 | + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); |
| 23 | + |
| 24 | + $xliffFile = $xliff->appendChild($dom->createElement('file')); |
| 25 | + $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale)); |
| 26 | + $xliffFile->setAttribute('target-language', 'no' === $messages->getLocale() ? 'nb' : str_replace('_', '-', $messages->getLocale())); |
| 27 | + $xliffFile->setAttribute('datatype', 'plaintext'); |
| 28 | + $xliffFile->setAttribute('original', 'file.ext'); |
| 29 | + |
| 30 | + $xliffBody = $xliffFile->appendChild($dom->createElement('body')); |
| 31 | + foreach ($messages->all($domain) as $source => $target) { |
| 32 | + $translation = $dom->createElement('trans-unit'); |
| 33 | + $metadata = $messages->getMetadata($source, $domain); |
| 34 | + |
| 35 | + $translation->setAttribute('id', $metadata['id']); |
| 36 | + |
| 37 | + $s = $translation->appendChild($dom->createElement('source')); |
| 38 | + $s->appendChild($dom->createTextNode($source)); |
| 39 | + |
| 40 | + $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); |
| 41 | + |
| 42 | + $targetElement = $dom->createElement('target'); |
| 43 | <
10000
code class="diff-text syntax-highlighted-line addition">+ |
| 44 | + if ('en' !== $messages->getLocale() && $target === $source && 'Error' !== $source) { |
| 45 | + $targetElement->setAttribute('state', 'needs-translation'); |
| 46 | + } |
| 47 | + if (isset($metadata['target-attributes'])) { |
| 48 | + foreach ($metadata['target-attributes'] as $key => $value) { |
| 49 | + $targetElement->setAttribute($key, $value); |
| 50 | + } |
| 51 | + } |
| 52 | + |
| 53 | + $t = $translation->appendChild($targetElement); |
| 54 | + $t->appendChild($text); |
| 55 | + |
| 56 | + $xliffBody->appendChild($translation); |
| 57 | + } |
| 58 | + |
| 59 | + return preg_replace('/^ +/m', '$0$0', $dom->saveXML()); |
| 60 | +} |
| 61 | + |
| 62 | + |
| 63 | +foreach (['Security/Core' => 'security', 'Form' => 'validators', 'Validator' => 'validators'] as $component => $domain) { |
| 64 | + $dir = __DIR__.'/../src/Symfony/Component/'.$component.'/Resources/translations'; |
| 65 | + |
| 66 | + $enCatalogue = (new XliffFileLoader())->load($dir.'/'.$domain.'.en.xlf', 'en', $domain); |
| 67 | + $finder = new Finder(); |
| 68 | + |
| 69 | + foreach ($finder->files()->in($dir)->name('*.xlf') as $file) { |
| 70 | + $locale = substr($file->getBasename(), 1 + strlen($domain), -4); |
| 71 | + |
| 72 | + $catalogue = (new XliffFileLoader())->load($file, $locale, $domain); |
| 73 | + $localeCatalogue = new MessageCatalogue($locale); |
| 74 | + |
| 75 | + foreach ($enCatalogue->all($domain) as $id => $translation) { |
| 76 | + $metadata = []; |
| 77 | + if ($catalogue->defines($id, $domain)) { |
| 78 | + $translation = $catalogue->get($id, $domain); |
| 79 | + $metadata = $catalogue->getMetadata($id, $domain); |
| 80 | + } |
| 81 | + $metadata['id'] = $enCatalogue->getMetadata($id, $domain)['id']; |
| 82 | + $localeCatalogue->set($id, $translation, $domain); |
| 83 | + $localeCatalogue->setMetadata($id, $metadata, $domain); |
| 84 | + } |
| 85 | + |
| 86 | + file_put_contents($file, dumpXliff1('en', $localeCatalogue, $domain)); |
| 87 | + } |
| 88 | +} |
0 commit comments