У меня есть приложение, написанное на wxPython, которое я хочу сделать многоязычным.
Наши варианты
- с использованием gettext http://docs.python.org/library/gettext.html
- разделение всего текста пользовательского интерфейса на
файл messages.py и использовать его для
перевести текст
Я очень склонен ко второму, и я не вижу никакой выгоды в том, чтобы идти путем gettext,
используя 2-й способ, я могу хранить все свои сообщения в одном месте, а не в коде, поэтому, если мне нужно изменить сообщение, код не нужно менять, в случае с gettext у меня могут быть запутанные константы msg, так как я буду просто оборачивать оригинал msg вместо преобразования в константу в messages.py
в основном вместо
wx.MessageBox(_("Hi stackoverflow!"))
Я думаю
wx.MessageBox(messages.GREET_SO)
лучше, так есть ли какое-то преимущество в способе gettext и недостаток во втором способе? и есть ли 3-й способ?
редактирование:
Кроме того, файлы языков gettext, похоже, слишком привязаны к коду, и что произойдет, если я захочу, чтобы два сообщения были одинаковыми на английском, но разными на французском, например? Предположим, что французский имеет более тонкий перевод для различных scnerarios для английского, все в порядке
Опыт работы:
Я уже пошел вторым путем, и я должен сказать, что каждое приложение должно пытаться извлечь текст пользовательского интерфейса из кода, это дает возможность рефакторинга, посмотреть, где пользовательский интерфейс проникает в модель и где текст пользовательского интерфейса может быть улучшен, сравнение gettext является механическим, не дает никакого ввода для кодировщика, и я думаю, что было бы более трудно поддерживать.
и при создании имени для текста, например PRINT_PROGRESS_MSG, дает возможность увидеть, что во многих местах один и тот же msg используется немного по-другому и может быть объединен в одно имя, что позже поможет, когда мне нужно изменить msg только один раз.
Вывод: я до сих пор не уверен в преимуществах использования gettext и использую свой собственный файл сообщений. но я выбрал ответ, который хотя бы объяснил несколько моментов, почему gettext может быть полезным.
Окончательное решение IMO - это лучшее из обоих способов, то есть мой собственный идентификатор сообщения, заключенный в gettext, например,
wx.MessageBox(_("GREET_SO"))