Плюсы и минусы использования gettext вместо QObject.tr () для локализации приложения PyQt4? - PullRequest
8 голосов
/ 07 января 2010

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

Теперь я хотел бы лучше сравнить оба подхода и понять, чего мне не хватает, используя 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.

Ответы [ 4 ]

2 голосов
/ 01 октября 2015

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

2 голосов
/ 15 декабря 2012

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

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

2 голосов
/ 15 мая 2013

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

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

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

Привет, Floris.

0 голосов
/ 22 марта 2010

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

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

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

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

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

...