DevelopmentLoader.php
1 month ago
JsonFileLoader.php
1 month ago
LoaderCache.php
2 years ago
LoaderInterface.php
1 month ago
DevelopmentLoader.php
79 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * Matomo - free/libre analytics platform |
| 5 | * |
| 6 | * @link https://matomo.org |
| 7 | * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later |
| 8 | */ |
| 9 | namespace Piwik\Translation\Loader; |
| 10 | |
| 11 | /** |
| 12 | * Loads a pseudo-language for developers. |
| 13 | */ |
| 14 | class DevelopmentLoader implements \Piwik\Translation\Loader\LoaderInterface |
| 15 | { |
| 16 | public const LANGUAGE_ID = 'dev'; |
| 17 | private const MAP = ["a" => 'ȧ', "A" => 'Ȧ', "b" => 'ƀ', "B" => 'Ɓ', "c" => 'ƈ', "C" => 'Ƈ', "d" => 'ḓ', "D" => 'Ḓ', "e" => 'ḗ', "E" => 'Ḗ', "f" => 'ƒ', "F" => 'Ƒ', "g" => 'ɠ', "G" => 'Ɠ', "h" => 'ħ', "H" => 'Ħ', "i" => 'ī', "I" => 'Ī', "j" => 'ĵ', "J" => 'Ĵ', "k" => 'ķ', "K" => 'Ķ', "l" => 'ŀ', "L" => 'Ŀ', "m" => 'ḿ', "M" => 'Ḿ', "n" => 'ƞ', "N" => 'Ƞ', "o" => 'ǿ', "O" => 'Ǿ', "p" => 'ƥ', "P" => 'Ƥ', "q" => 'ɋ', "Q" => 'Ɋ', "r" => 'ř', "R" => 'Ř', "s" => 'ş', "S" => 'Ş', "t" => 'ŧ', "T" => 'Ŧ', "v" => 'ṽ', "V" => 'Ṽ', "u" => 'ŭ', "U" => 'Ŭ', "w" => 'ẇ', "W" => 'Ẇ', "x" => 'ẋ', "X" => 'Ẋ', "y" => 'ẏ', "Y" => 'Ẏ', "z" => 'ẑ', "Z" => 'Ẑ']; |
| 18 | /** |
| 19 | * @var LoaderInterface |
| 20 | */ |
| 21 | private $loader; |
| 22 | /** |
| 23 | * @var string |
| 24 | */ |
| 25 | private $fallbackLanguage = 'en'; |
| 26 | /** |
| 27 | * @param LoaderInterface $loader Decorate another loader to add the pseudo-language. |
| 28 | */ |
| 29 | public function __construct(\Piwik\Translation\Loader\LoaderInterface $loader) |
| 30 | { |
| 31 | $this->loader = $loader; |
| 32 | } |
| 33 | public function load($language, array $directories) |
| 34 | { |
| 35 | if ($language !== self::LANGUAGE_ID) { |
| 36 | return $this->loader->load($language, $directories); |
| 37 | } |
| 38 | return $this->getPseudoLocale($directories); |
| 39 | } |
| 40 | /** |
| 41 | * @param string[] $directories |
| 42 | * @return array<string, array<string, string>> |
| 43 | */ |
| 44 | private function getPseudoLocale(array $directories) : array |
| 45 | { |
| 46 | $fallbackTranslations = $this->loader->load($this->fallbackLanguage, $directories); |
| 47 | $translations = []; |
| 48 | foreach ($fallbackTranslations as $section => $sectionFallbackTranslations) { |
| 49 | if ($section === 'Intl') { |
| 50 | $translations[$section] = $sectionFallbackTranslations; |
| 51 | continue; |
| 52 | } |
| 53 | $sectionTranslations = []; |
| 54 | foreach ($sectionFallbackTranslations as $key => $translation) { |
| 55 | $sectionTranslations[$key] = $this->pseudoLocalize($translation); |
| 56 | } |
| 57 | $translations[$section] = $sectionTranslations; |
| 58 | } |
| 59 | return $translations; |
| 60 | } |
| 61 | private function pseudoLocalize(string $translation) : string |
| 62 | { |
| 63 | $protectedTokens = []; |
| 64 | $tokenized = preg_replace_callback("/<[^>]+>|&[A-Za-z0-9#]+;|%%|%(?:[0-9]+[\$])?[+\\-0'#]*[0-9]*(?:\\.[0-9]+)?[bcdeEfFgGosuxX]/", function ($matches) use(&$protectedTokens) { |
| 65 | $token = "\x1d" . count($protectedTokens) . "\x1e"; |
| 66 | $protectedTokens[$token] = $matches[0]; |
| 67 | return $token; |
| 68 | }, $translation); |
| 69 | if ($tokenized === null) { |
| 70 | $tokenized = $translation; |
| 71 | } |
| 72 | $accented = strtr($tokenized, self::MAP); |
| 73 | if (!empty($protectedTokens)) { |
| 74 | $accented = strtr($accented, $protectedTokens); |
| 75 | } |
| 76 | return "[" . $accented . "]"; |
| 77 | } |
| 78 | } |
| 79 |