Při překládání statických textů je občas potřeba se nějak vypořádat i s formátováním. Jak se postavit např. k překladu věty <em>The newest</em> articles are available at the <a href="/">home page</a>
?
První řešení, které by nás mohlo napadnout, je nechat přeložit jen prostý text: <em><?php echo lang('The newest'); ?></em> <?php echo lang('articles are available at the'); ?> <a href="/"><?php echo lang('home page'); ?></a>
. Toto řešení je samozřejmě nevhodné z několika důvodů – slova jsou vytržena z kontextu, takže pro ně nelze zvolit správný tvar (např. home page
by se přeložilo jako domácí stránka
, i když v kontextu věty by mělo být použité domácí stránce
). Kromě toho různé jazyky používají různý slovosled.
Proto bude vhodnější nechat přeložit celou větu včetně formátovacích značek: <?php echo lang('<em>The newest</em> articles are available at the <a href="/">home page</a>'); ?>
. Překlad ovšem bude vhodné nějak zkontrolovat – jednak jestli vůbec tvoří validní kód a jednak jestli obsahuje stejné značky jako originál (kvůli jinému slovosledu nicméně mohou být v jiném pořadí). Nejsnáze se o to může postarat rozšíření SimpleXML:
<?php /** Porovnání názvů a počtu XML značek libovolného zanoření * @param string řetězec k porovnání * @param string řetězec k porovnání * @return bool true, false při neshodě značek nebo v případě chyby * @copyright Jakub Vrána, https://php.vrana.cz/ */ function compare_tags($s1, $s2) { $xml1 = @simplexml_load_string("<s>$s1</s>"); $xml2 = @simplexml_load_string("<s>$s2</s>"); if ($xml1 === false || $xml2 === false) { return false; } $tags1 = array(); foreach ($xml1->xpath("//*") as $tag) { $tags1[$tag->getName()]++; } $tags2 = array(); foreach ($xml2->xpath("//*") as $tag) { $tags2[$tag->getName()]++; } return ($tags1 == $tags2); } ?>
Funkce na vstupu očekává dva XML řetězce a porovná, zda obsahují stejné značky libovolného zanoření v libovolném pořadí (atributy se nekontrolují). Zároveň zjistí, jestli jsou řetězce v pořádku. Pokud bychom značky očekávali ve stejném pořadí, byla by funkce paradoxně jednodušší – stačilo by na základě prvního řetězce sestavit regulární výraz a ten se pokusit napasovat na druhý řetězec.
Stejný princip mimochodem využívá i nástroj pro překlad rozhraní Google. Na tento nástroj jsem ovšem zanevřel poté, co jsem přeložil celý Google Toolbar do češtiny, ale můj překlad se do žádné verze tohoto nástroje nedostal (přestože jsem na dokončení překladu upozorňoval i e-mailem) a několik hodin mé práce tak vyšlo vniveč.
Šalamounským řešením by bylo použít nějaký nástroj pro formátování textu, např. Texy!. Potřeba zkontrolovat, zda výstup používá stejné značky, by ovšem zůstala.
Diskuse je zrušena z důvodu spamu.