2012-01-07 18 views
6

Prawdopodobnie jestem widokiem oczywiste rozwiązanie lub myśleć wspak ...Get tekst translacji z zewnętrznego źródła do katalogu

mam ograniczoną ilość tekstu, słów w bazie danych, że chcę, aby wyświetlić przetłumaczone użytkownikom w aplikacjach webowych typu flask/jinja/babel. na przykład. "running" jest możliwą wartością kolumny "activity" i powinno być "laufen" dla moich niemieckich użytkowników.

Słowa w szablonach i kodzie są wyodrębniane i umieszczane w katalogu, ale jak uzyskać dodatkowych słów do katalogu? Czy istnieje prosty ekstraktor plików tekstowych?

Jedyne, co mogę wymyślić, to po prostu utworzyć plik .py i umieścić w nim wiele linii _ ("..."), ale to jest po prostu złe ... czy to prawda?

+0

Czy te słowa w bazie danych są zdefiniowane jako wyliczenia? – plaes

+0

Tak, ale nie ograniczaj się do wyliczania lub baz danych w tej sprawie. Innym scenariuszem może być system zewnętrzny, może wysyłanie JSON do mojego systemu, z pewnymi słowami, które muszę przetłumaczyć, które * nigdy * pojawiają się w * moim * kodzie, ale tylko w przychodzących wiadomościach. Ja * znam * te słowa z, powiedzmy, specyfikacji API, ale chcę uniknąć umieszczania ich w moim kodzie jako '_ (" słowo ') ", tak aby odebrać je przez gettext. Myślę, że po prostu użyję pliku tekstowego bólu z wyrazem w wierszu i napisałem dla niego własną funkcję ekstrakcji. – Florian

Odpowiedz

3

stworzyłem messages.txt z moich "słowami" jak funkcja gettext wzywa:

_('cycling') 
_('running') 

i dodaje go do mojego babel.cfg jako źródła Pythona:

[python: messages.txt] 

zwykły, prosty, głupi, ale działa.

1

Najpierw zacznij od http://flask.pocoo.org/snippets/4/.

Po drugie, trzeba zachować te wartości „Limited” jako liczby całkowite lub teksty stałe w bazie danych, a następnie utworzyć tabelę przeglądową dla wszystkich tych teksty stałe w kodzie (tak Babel wie o nich):

i18n_val = {0: _('running'), ...} 
# Or multi-level dict with different categories: 
i18n_all = { 
    'activity': { 
    0: _('running'), ... 
    'foo': { 
    0: _('bar..'), ... 
    } 
} 

i dostępu do przetłumaczony łańcuch z szablonu jest teraz tak proste, jak:

{{ i18n_val[obj.activity] }} 
{{ i18n_all['activity'][obj.activity] }} 

W celu uczynienia i18n_vali18n_all zmienne i dostępny dla wszystkich szablonów, wystarczy zarejestrować je context processors.

+0

Ta druga część to ta, z którą mam problem. Nie chcę pobierać całego tekstu z bazy danych i kopiować go ręcznie w kodzie. Ten ostatni fragment, faktycznie rozwiązany przy użyciu filtru "| trans", który wyszukuje tłumaczenia. – Florian