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

У меня есть несколько приложений, написанных на PyQt4, где я использовал стандартную библиотеку Python gettext для интернационализации и локализации графического интерфейса. У меня это работает хорошо. Но я выбрал 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 () vs gettext:

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

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


person bialix    schedule 07.01.2010    source источник


Ответы (4)


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

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

person Christian Tismer    schedule 15.12.2012

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

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

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

Привет, Флорис.

person user1813575    schedule 15.05.2013

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

person Floris van den Hoeven    schedule 01.10.2015
comment
Я бы добавил, что tr( "You have selected %n item(s)", , item.count() ) выглядит так, как будто это могло бы работать, но это очень плохо документировано в системе Qt и действительно не объясняет, как поставить вещи, если скажете, что вам действительно нужны две (или более) разные строки, а не просто суффикс: tr( "%n item{ is|s are} now in selection.", , item.count() ) - person SlySven; 19.01.2016

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

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

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

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

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

person leplatrem    schedule 22.03.2010