Строки в QObject переводятся во время выполнения. Если переводчик меняется, все эти строки обновляются. Однако строки, объявленные на уровне модуля, или даже статические атрибуты класса переводятся во время импорта.
Я вижу три способа разрешить перевод строк модуля, ни один из которых не кажется мне полностью удовлетворительным:
Импортируйте модуль после установки переводчика (см. здесь (параграф Установить переводчик раньше)). Это может быть неудобно, но осуществимо, если не нужно менять язык во время выполнения.
Создайте атрибуты экземпляра класса strings. Ну... да, очевидно. Но это нарушает дизайн.
Сохраняйте строки на уровне модуля. Используйте QtCore.QCoreApplication.translate(), чтобы позволить pylupdate подобрать их. Затем переведите их (снова) во время выполнения, вызвав для них self.tr() или QtCore.QCoreApplication.translate(). Пример:
translate = QtCore.QCoreApplication.translate
strings = [translate('foo'), translate('bar')]
class my_class(QObject):
def __init__(self):
for s in strings:
print(self.tr(s))
При этом необходимо убедиться, что перед импортом модуля не будет установлен транслятор, в противном случае строки модуля будут переведены во время импорта (translate() в объявлении) и повторно переведены во время выполнения (self.tr() в экземпляре класса). В общем случае этого не будет видно: self.tr() попытается перевести уже переведенную строку, которая вряд ли существует в исходном языковом наборе строк, и автоматически вернет саму строку.
Но если, например, английская строка переводится во французскую строку, которая равна другой английской строке, встречающейся в том же классе, то вместо этого будет отображаться французский перевод этой строки.
Строки в QObject переводятся во время выполнения. Если переводчик меняется, все эти строки обновляются. Однако строки, объявленные на уровне модуля, или даже статические атрибуты класса переводятся во время импорта.
Я вижу три способа разрешить перевод строк модуля, ни один из которых не кажется мне полностью удовлетворительным:
[list] [*]Импортируйте модуль после установки переводчика (см. здесь (параграф Установить переводчик раньше)). Это может быть неудобно, но осуществимо, если не нужно менять язык во время выполнения. [*]Создайте атрибуты экземпляра класса strings. Ну... да, очевидно. Но это нарушает дизайн. [*]Сохраняйте строки на уровне модуля. Используйте QtCore.QCoreApplication.translate(), чтобы позволить pylupdate подобрать их. Затем переведите их (снова) во время выполнения, вызвав для них self.tr() или QtCore.QCoreApplication.translate(). Пример:
def __init__(self): for s in strings: print(self.tr(s)) [/code]
При этом необходимо убедиться, что перед импортом модуля не будет установлен транслятор, в противном случае строки модуля будут переведены во время импорта (translate() в объявлении) и повторно переведены во время выполнения (self.tr() в экземпляре класса). В общем случае этого не будет видно: self.tr() попытается перевести уже переведенную строку, которая вряд ли существует в исходном языковом наборе строк, и автоматически вернет саму строку.
Но если, например, английская строка переводится во французскую строку, которая равна другой английской строке, встречающейся в том же классе, то вместо этого будет отображаться французский перевод этой строки. [/list]