Создание многоязычного приложения wxPython - PullRequest
2 голосов
/ 25 июня 2009

У меня есть приложение, написанное на wxPython, которое я хочу сделать многоязычным. Наши варианты

  1. с использованием gettext http://docs.python.org/library/gettext.html
  2. разделение всего текста пользовательского интерфейса на файл 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"))

Ответы [ 3 ]

1 голос
/ 25 июня 2009

Есть несколько преимуществ gettext:

  1. Одним из самых больших преимуществ является то, что при использовании poedit для переводов вы можете воспользоваться базой данных переводов. В основном poedit может сканировать ваш жесткий диск и находить уже переведенные файлы и будет предлагать вам при переводе файла.
  2. Когда вы даете код другим людям для перевода, они могут уже знать способ перевода gettext, в то время как вы должны объяснить им свой способ перевода.
  3. У вас есть текст в контексте кода, поэтому его легче перевести, когда вы видите код вокруг перевода
  4. Рассмотрим текст вроде: print _('%d files of %d files selected') % (num, numTotal) и даже более сложные ситуации. Вот это действительно помогает иметь код вокруг ...
1 голос
/ 01 июля 2009

Gettext - это путь, в вашем примере вы также можете использовать gettext, чтобы «не сохранять переводы в коде»:

wx.MessageBox(messages.GREET_SO)

может быть таким же с gettext как:

wx.MessageBox(_("GREET_SO")) or wx.MessageBox(_("messages.GREET_SO"))

Gettext в значительной степени является стандартом для многоязычных приложений, и я уверен, что вы выиграете от его использования в будущем. Например, вы можете использовать Poedit (или другое подобное приложение), чтобы назначать переводы вашим соавторам или участникам, а затем помечать одно или несколько сообщений как неправильно переведенные. Также, если пропущены / лишние записи, poedit предупредит вас. Не обманывайте себя, gettext - единственный проверенный надежный способ поддерживать переводы.

0 голосов
/ 25 июня 2009

Для Интернета (это PHP, но идея та же самая), я всегда создаю несколько языковых файлов в определенном каталоге. en.php, fr.php, и так далее. Эти файлы содержат определения всего выходного текста на данном языке. Предпочтение пользователя для языка определяет, какие из этих файлов будут включены, таким образом, на каком языке выводится вывод. Например ...

в en.php: TEXT_I_AM = "Я есть"

в фр.php: TEXT_I_AM = "Je suis"

...