Как перевести javascript-файлы в пилоны - PullRequest
1 голос
/ 20 июля 2010

Мы подаем заявку, используя Pylons и JQuery. Мы использовали стандартный способ сделать перевод, но он не совсем работает с JavaScript.

Неловкость методов js-translation заключается в том, что мы должны создавать дублирующие процессы для выбора языков и т. Д.

Есть ли надлежащая поддержка в пилонах для javascript-переводов?

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Альтернативный метод состоит в использовании gettext пилонов для генерации ваших собственных идентификаторов строки javascript, таких как:

HTML-шаблон:

<script type="text/javascript">
   var i18n_strings = {
      hello_world = '${ugettext('Hello World!')}',
      goodbye_world = '${ugettext('Goodbye World!')}',
      enter_name = '${ugettext('Enter Name:')}'
   };
</script>

теперь в вашем javascript:

$('#some-elem').html( i18n_strings.hello_world );
0 голосов
/ 29 июля 2010

Я использую это решение с Pylons и ExtJS, но я думаю, что вы можете легко изменить функцию JS для ваших нужд.

В контроллере Pylons у меня есть метод, который экспортирует все переводы (вам нужен polibэто - http://code.google.com/p/polib/):

import polib
from pylons.i18n import get_lang

...

## method in conttroller class
@jsonify
def get_trans(self):
    def get_trans():
        items = polib.mofile(os.path.join(config['pylons.paths']['root'], 'i18n/%s/LC_MESSAGES/app.mo' % get_lang()[0]))
        return [{'name': item.msgid, 'value': item.msgstr} for item in items]
    return {'translations' : get_trans()}

Часть JavaScript:

lang_store = new Ext.data.JsonStore({
    url: '/lang/get',
    root: 'translations',
    id: 'name',
    autoLoad: true,
    fields: ['name', 'value'],
});

gettext = _ = function(_key) {
    try {
        return lang_store.getById(_key).data.value
    } catch(e) {
        return _key + "**"
    }
}

Теперь вы можете использовать функцию «gettext (STRING)» или «_ (STRING)» в JS, и выполучить переведенную строку, если перевода не будет, вы получите что-то вроде UNTRANSLATED_STRING ** (со звездочками в конце).

...