2013-09-10 2 views
3

Когда дело доходит до интернационализации - с помощью python2 и PyQt4 - в «предложенный способ» форматировать переведенной строки использующей QString.arg() метод:правильная замена QString() метод агд в Python3

from PyQt4.QtGui import QDialog 
#somewhere in a QDialog: 
    self.tr("string %1 %2").arg(arg1).arg(arg2) 

Но QString() не существует в python3-PyQt4.

Так что мой вопрос в том, как лучше всего форматировать любые переведенные строки в python3? Должен ли я использовать стандартный метод python str.format() или, может быть, есть что-то более подходящее?

+1

Во-первых, в PyQt4 явно использование QString явно не рекомендуется вещи; они просто не закончили интеграцию родных строк и QStrings. Обратите внимание, что PyQt5 почти полностью скрывает QString, как в 2.x, так и 3.x. (Хотя мы и находимся в этом, вы почти наверняка захотите получить литерал в Юникоде, потому что иначе вы скрестите пальцы и надеетесь, что ваш литерал будет интерпретироваться как латинский-1, не говоря уже о том, чтобы сделать неявный латинский-1-to- Unicode преобразование каждый раз через эту функцию без уважительной причины.) – abarnert

+0

@abarnert Да, я могу ошибаться, используя термин «предлагаемый способ» здесь. Я просто видел, как Марк Саммерфилд использовал его таким образом в своей книге pyqt и думал, что это будет правильная техника. Спасибо, что упомянули об этом. – Ilias95

+0

Книги имеют тенденцию быстро устаревать. Вероятно, это была хорошая идея 2 или 3 года назад, когда вы поддерживали совместимость с pre-2.6 Python и pre-4.6 Qt, было очень важно, но моя память не вернулась так далеко. :) – abarnert

ответ

3

Метод QString::arg действительно существует в качестве обходного для ограниченной строки форматирования поддержки С ++, чтобы убедиться, что вы не используете sprintf со всеми проблемы, которые влекут за собой (не обрабатывать заполнители, которые находятся в разных порядках на разных языках, переполнение буфера и т. д.). Поскольку у Python нет таких проблем, нет веских оснований для его использования.

Фактически, есть очень мало оснований для использования QString явно. В PyQt4 он не был полностью отключен, но PyQt5, это было. (Технически, PyQt4 поддерживает «string API v2» как в Python 2.x, так и 3.x, но только по умолчанию включает его в 3.x; PyQt4 включает v2 по умолчанию в обоих и скрывает возможность переключения на v1.) См. Python Strings, Qt Strings and Unicode в документации для некоторых добавленных данных.


Существует одна редкость, но главным, если это влияет на вас, исключение: Если вы пишете приложение, которое частично в Qt/C++ и частично в PyQt, вы будете иметь проблемы обмена I18N данные, когда некоторые из них находятся в формате "string %1 %2", а другие - в формате "string {1} {2}". (В первый раз, когда вы отправляете один из своих файлов в аутсорсинговую компанию по переводу, они будут ошибочно, гарантировано.)

2

Да, просто используйте стандартное форматирование строки python.

QString ушел, потому что это в значительной степени взаимозаменяемы с юникод строк в Python (которые str в Python3 и unicode в python2), так PyQt заботится о преобразовании друг в друга по мере необходимости.

QString, являющийся отключенным, не ограничен python3, это просто по умолчанию. Вы можете получить то же самое на python2, делая это Befor импортировать ничего из PyQt4:

import sip 
sip.setapi('QString', 2) 
+0

Значительное улучшение охвата (или, по крайней мере, существенного дополнения) строки API v2; показывая, как делать вещи, путь v2 в 2.x очень удобен. – abarnert

+0

Спасибо.Я принял ответ abarnert, потому что это более подробно, но ваш ответ также конструктивен. – Ilias95

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