LINUX.ORG.RU

Правильная организация текстовых полей с возможностью их перевода

 ,


1

2

Здравствуйте все, кто читает сие.

Сабж : имеется прилога, к полям есть подписи(когда мышом наводишь на QLabel, то снизу появляется окно поясняющее). Подписи довольно большие как по мне, и поэтому разумно их хранить в каком-то файле, а при загрузке просто подгружать в нужные переменные и всё, а не хранить всё это разбросанным по исходнику.

Что я придумал : сделаем файл, который всё это будет хранить, потом парсер будет подгружать всё это в нужные места программы и всё будет вроде как работать. Файл будем хранить прямо в самом бинарнике, благо qt позволяет это легко сделать.

Но у меня возникло несколько вопросов: 1) А какие есть другие способы реализации того, что я описал выше? А то чую, что велосипед это дикий.

2) Как при таком хранении строк реализовать перевод посредством tr() из qt? tr() работает с файлами-ресурсами проекта?

Жду дельных предложений. Заранее спасибо.

★★

Последнее исправление: zamazan4ik (всего исправлений: 1)

1) А какие есть другие способы реализации того, что я описал выше? А то чую, что велосипед это дикий.

gettext позволяет их хранить прямо в исходнике, а переводы — в отдельных файлах.

ICU (icu-project.org) хранит всё в отдельных файлах.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

А встроенными средствами Qt такое можно сделать?

zamazan4ik ★★
() автор топика

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

CrossFire ★★★★★
()

В Qt есть собственная хорошая система интернационализации. Почитай главу Qt Linguist из документации Qt.

Там ничего не надо выдумывать, все уже встроено. Оно для арабов даже справа налево отображать все будет.

grondek ★
()
Ответ на: комментарий от CrossFire

может я не совсем понимаю, но я хочу сделать вот что : есть куча длинных надписей на англицком. Я не хочу их писать прямо в исходнике(так как исходник раздуется, и разбросано всё будет, что не есть хорошо).

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

zamazan4ik ★★
() автор топика

QCoreApplication::translate. Вариантов - много.

1) Отдельный файл с дефайнами.

2) Еще вариант в одном *h файле эти переменные объявить, а в *cpp инициализировать.

3) Или класс запилить, который по идентификатору будет возвращать строку на выбранном языке языке (более продвинутый вариант №2); примерно эту же симантику предлагает сам qt, но тем не менее.

Потом, соответственно, подключать файл перевода

tekilla
()
Ответ на: комментарий от false

прошу прощения, а qt linguist предоставляет средства для отображения строк по их идентификаторам и хранение самих строк в левых файлах?

zamazan4ik ★★
() автор топика
Ответ на: комментарий от zamazan4ik

А зачем? Не, ну то есть я знаю, есть такой вариант организации переводов, но в Qt есть свой стандарт.

Пиши базовый язык прямо в коде, переводи в лингвисте, пркладывай сгенерированные файлы в дистрибутив и все будет ок.

grondek ★
()
Ответ на: комментарий от zamazan4ik

В коде можешь писать любые строки (назовем их идентификаторами), типа


new QLabel( tr( "TRANSLATE_THIS_TEXT_ID", parent );

QString t2( tr( "TR_THIS_TEXT_ID" ) );

grondek ★
()
Ответ на: комментарий от grondek

Хорошо, я чуть поясню свою ситуацию : у меня есть 80 объектов моего кастомного класса, в кажжом есть поле-описание QString. Причём для каждого объекта оно своё. Но они должны быть закардкожены?

Как это сделать по-хорошему?

zamazan4ik ★★
() автор топика
Ответ на: комментарий от zamazan4ik

В твоём Widget.cpp:

MyLongTexts::tr("long-text-9322")

В твоём MyApplication.en_US.ts:

<context>
    <name>MyLongTexts</name>
    <!-- ... -->
    <message>
        <source>long-text-9322</source>
        <translation>Lorem ipsum dolor sit amet...</translation>
    </message>
    <!-- ... -->
</context>

В твоём QApplication:

QTranslator *fallbackTranslator = new QTranslator(this);
fallbackTranslator->load("MyApplication.en_US", "/usr/share/applications/my-application");
QCoreApplication::installTranslator(fallbackTranslator);

QTranslator *localizedTranslator = new QTranslator(this);
localizedTranslator->load(QLocale(), "MyApplication", ".", "/usr/share/applications/my-application");
QCoreApplication::installTranslator(localizedTranslator);

В твоём MyApplication.pro:

TRANSLATIONS += \
    i18n/MyApplication.en_US.ts

В твоём пакете:

  • при сборке сделать lrelease MyApplication.pro
  • при установке положить MyApplication.en_US.qm в /usr/share/applications/my-application
ilammy ★★★
()
Ответ на: комментарий от zamazan4ik

Нет с этим никаких проблем, пишу пустую строку туда, никто не запрещает. А для англ — отдельный файл перевода.

BruteForce ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.