LINUX.ORG.RU

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

 ,


1

2

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

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

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

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

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

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

★★

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

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

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

ICU хранит всё в отдельных файлах.

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 ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.