2010-01-07 6 views
8

У меня есть пара приложений, написанных в PyQt4, где я использовал стандартную библиотеку gettext для Python для интернационализации и локализации графического интерфейса. Это работает хорошо для меня. Но я выбрал gettext только потому, что у меня уже были знания и опыт использования gettext и нулевой опыт с использованием подхода Qt4 tr().Плюсы и минусы использования gettext вместо QObject.tr() для локализации приложения PyQt4?

Теперь я хотел бы лучше сравнить оба подхода и понять, что мне не хватает, используя gettext вместо QObject.tr, и есть ли какая-то серьезная причина, почему я не должен использовать gettext для приложений Qt4/PyQt4?

В моем понимании преимуществ использования Gettext являются:

  • GNU Gettext является зрелым и это, кажется, стандартом де-факто в GNU/Linux мире.
  • Существует достаточно специальных редакторов для файлов PO, чтобы упростить работу переводчиков, хотя текстовая природа шаблонов PO делает это не обязательно.
  • Доступны даже веб-сервисы, которые могут использоваться для совместных переводов.
  • gettext - стандартная библиотека Python, поэтому мне не нужно устанавливать что-либо специальное, чтобы использовать его во время выполнения.
  • Он имеет очень хорошую поддержку для выбора форм единственного числа/множественного числа через ngettext().

То, что я вижу, как преимущества QObject.tr():

  • Это родной технологии для Qt4/PyQt4 поэтому, возможно, он будет работать лучше/быстрее (хотя у меня нет данных, чтобы доказать).
  • Сообщения для перевода могут содержать дополнительную контекстную информацию, которая поможет переводчикам выбрать наилучшие варианты для слов омонимии, например. английское слово «Письмо» может быть переведено как «Персонаж», «Почта» или даже «Формат бумаги» в зависимости от фактического контекста.

То, что я вижу, как недостатки QObject.tr() против Gettext:

  • Я не нашел в документации Qt, как это поддерживается сингулярным/множественный выбор там.
  • Qt4 TS-шаблон перевода в формате XML и поэтому более сложный для редактирования без специального редактора (QT Linguist), и, похоже, нет других сторонних решений или веб-сервисов. Поэтому для переводчиков потребуется изучить новый инструмент (если они уже знакомы с инструментами ПО).

Но все вышеперечисленные элементы недостаточно критичны, чтобы четко сказать, что любой инструмент лучше другого. И я не хочу начинать пламенную войну о том, что лучше, потому что это очень субъективно. Я просто хочу знать, чего я пропустил, как плюсы и минусы QObject.tr() и gettext.

ответ

-1

Вы можете добавить, что args управляются по-разному ...

С Gettext, мы можем сделать

_("Hello %(name)s from %(city)s") % {person.__dict__}

, тогда как в PyQt, мы делаем

self.tr("Hello %1 from %2").arg(person.name).arg(person.city)

2

Один простой причине использования QObject.tr() является:

Это спасает Вас необходимо установить gettext в Windows, что упростит кросс-платформенную работу. Я стараюсь иметь как можно меньше бинарных зависимостей в Windows.

2

Все имеют свои плюсы и минусы, но для более четкого определения их необходимо определить сначала, если вы ориентируетесь на мобильную среду или среду рабочего стола.

В нашей компании мы используем разные методы просто потому, что идеального решения пока не существует. Для разработки рабочего стола мы используем файлы PO просто потому, что кнопки не масштабируются, и поэтому текст будет соответствовать. Для мобильной разработки перевод строки зависит от размера кнопки, которая может отличаться от ландшафтных и портретных устройств. Так что это немного усложняет его, потому что файл PO может иметь только один перевод определенного слова. Итак, для этого мы выбрали XLIFF, чтобы мы могли присвоить уникальный идентификатор строке. Это тоже непростая задача, потому что нет хороших решений для конвертирования файлов .RC в файлы XLIFF. (Поскольку текущие инструменты конвертируют ВСЕ строки между «", что, конечно же, нежелательное поведение). Итак, я написал конвертер для этой задачи.

Однако, когда мы думаем о локализации, то множественные формы очень важны, поэтому это не является хорошим решением для локализации. Поэтому я бы сказал, чтобы перейти к PO gettext.

Поздравления, Флорис.

2

В текущий момент времени, Qt не обрабатывает формы множественного числа, когда вы делаете использование QT_TRANSLATE_NOOP

+1

Я бы добавить, что 'Tr («Вы выбрали% п товар (ов)»,, item.count()) 'выглядит так, как будто это может работать, но оно очень плохо документировано в системе Qt и действительно не объясняет, как поместить вещи, если вы действительно хотите две (или более) разные строки, а не только суффикс:' tr (" % n item {is | s are} теперь в выборе. ",, item.count())' – SlySven

 Смежные вопросы

  • Нет связанных вопросов^_^