Jednorázové hromadné nahrazení volání metod ve zdrojácích rubrika: Programování: PHP

Anonym
položil/-a 16.3.2015

Ahoj,

řeším následující problém. Provozujeme celkem rozsáhlý projekt, který je lokalizovaný do X jazyků. Bohužel jsme používali nevhodné řešení, jak v PHP posílat na výstup lokalizované řetězce. Nyní migrujeme na gettext, což ale znamená nahradit všude ve zdrojácích hromadně volání jedné metody a zaměnit za jinou. To by nebyl problém, ale potřebuji to nahradit chytřejším způsobem. Potřebuji pracovat i s parametry té volané metody. Tzn. místo jednoho parametru použít jeho ekvivalent v jiné podobě (místo ID jazykového řetězce použít přímo daný řetězec).

Moje otázka zní - znáte někdo nějaký nástroj, který by toto dokázal, tak nějak bezpečně, aby se nerozbil k´od?

Díky za odpovědi.

EDIT: Nyní funguje výstup textu např. takto: echo class::get('skupina', 123) -> 123 je ID textu (v databázi, a načítá se z vygenerovaného souboru). Nahradit to chceme například za class::translate('skupina', 'Přímo zdrojový text').

Komentáře

  • diverman : sed, awk, python, perl, vim 16.3.2015
  • Anonym : Dík za odpověˇd. Nicméně, hledám spíše nějaké hotové řešení. Nebo něco, co si můžu upravit pro tyto účely. 16.3.2015
  • diverman : Neposkytl jsi zadne blizsi informace, treba co se ma prepsat na co, tak tezko nabizet hotove reseni... 16.3.2015
  • Občan : Plny souhlas s @diverman. Neznam sofistikovanejsi nastroje na reseni takovych veci, nez je sed, awk, perl. Tento kokretni pripad si dovedu predstavit jako kombinaci prikazu perl + grep na jeden radek v shellu. 16.3.2015
  • Kit : @Obcan: Když máš Perl, nepotřebuješ grep... 16.3.2015
  • Občan : @Kit. Perl jako tool na chytré zpracování textů(zdrojáku) nemá parametr v příkazový řádce na rekurzivní prohledávání, ani na tohle není určený. Proto zaciluji soubory, který se mají hromadně upravit nástrojem na to určeným, grepem (případně findem). V tomto případě, ne všechny zdrojáky mají i18n a grep krásně vyfiltruje soubory, který jsou potřeba a trubkou je pošle Perlu. 16.3.2015
  • Anonym : Pardon :-) Nyní funguje výstup textu např. takto: echo class::get('skupina', 123) -> 123 je ID textu (v databázi, a načítá se z vygenerovaného souboru). Nahradit to chceme například za class::translate('skupina', 'Přímo zdrojový text'). Kdybych použil nástroje jako sed, awk, apod. tak nebudu moct nahradit ID textu za konkrétní text, který musím vytáhnout z DB. 16.3.2015
  • Kit : @jakubd: Byl by problém, kdyby to vypadalo takto? <?php echo _('Přímo zdrojový text'); ?> Gettext je tak postavený. 16.3.2015
  • Anonym : @Kit: To volání class::translate('skupina', 'Text') je prakticky jen obal nad gettextem. V té metodě ::translate se volá funkce dgettext() s určením "domény". Ty domény jsou nabindované zvlᚡt pro frameworkové věci a zvlᚡt pro aplikace nad ním. 16.3.2015
  • Kit : @jakubd: To je pak trochu problém generovat ze zdrojáků ty slovníky. Když je schováš do třídy, tak je tam ten generátor nenajde. 16.3.2015
  • Anonym : My to máme udělané tak, že texty jsou v databázi a slovníky se z databáze generují. Je to tak proto, abychom mohli snadno překládat přes náš systém + to umožní do budoucna automatizovat překlady přes nějakou externí službu, například Transifex. 17.3.2015
odkaz Vyřešeno
12 Kit
odpověděl/-a 16.3.2015

Můžeš použít http://php.net/manual/en/book.tokenizer.php a jednoduchým automatem nahradit vše potřebné. Výhodou je, že se ti nerozhodí formátování.

Zkus doplnit vzorový kód vstupu a vzor požadovaného výstupu. K tomu nějaké mapování na stávající zdroj textů. Zkusím navrhnout ten automat.

Komentáře

  • rmaslo : Taky bych na šel přes tokenizer. Každodenně ho používám ho pro prohledávání zdrojáků bez komentářů a jednou i na něco podobnýho co popisuje žadatel a naprosto ok. Akorát nějaká hodně stará verze PHP vynachávala enter za heredoc. 16.3.2015
  • Kit : @rmaslo: Díky za info o Heredoc, ověřím si u své verze, zda to opravili. Zatím jsem totiž na žádný problém nenarazil. 16.3.2015
  • Anonym : Dík za tip. Tokenizer používám pro parsování textů ze zdrojáků a funguje skvěle. Napadlo mě ho použít, ale k tomu musím vymyslet, jak chytře nahradit konkrétní řádek ve zdrojáku, abych si tím nic nerozbil. 16.3.2015
  • Kit : Stavovým automatem. Pokud verzuješ, tak přece rozbití nehrozí. 16.3.2015
  • Anonym : Asi jsem trochu mimo, co myslíš tím stavovým automatem? :-) Máš nějaký konkrétní příklad? 16.3.2015
  • Kit : Jsem ve stavu 0. Ve chvíli, kdy přijde očekávaný element (identifikátor hledané funkce), přepnu se do stavu 1. Přijde levá závorka, přepnu se do stavu 2. Přijde další identifikátor a protože jsem ve stavu 2, tak vím, že je to první parametr ke zpracování. Přepnu do stavu 3, přijde čárka. Přepnu do 4 a očekávám druhý parametr. Nyní nahradím funkci novou funkcí a dva parametry hodnotou z databáze. Přepnu se do stavu 0. Když jsem ve stavu 0, jenom opisuji vstup na výstup. To je vše. 16.3.2015
  • Anonym : @Kit: Aha, díky :) přesně takhle nám funguje parser textů. Nenapadlo mě ale opisovat vstup na výstup a tím provést rovnou nahrazení. Dík za rady, s největší pravděpodobností použiji toto řešení přes tokenizer, jelikož nic lepšího asi nenajdu. 17.3.2015

Pro zobrazení všech 8 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.