Кроссплатформенная мультиязычность
От: Corvin Украина  
Дата: 17.02.06 17:45
Оценка:
Доброго времени суток!

В кроссплатформенном проекте (Win32/Linux) встала задача поддержки нескольких языков. Я с этим никогда не сталкивался, поэтому буду благодарен любым материалам на тему.

Задач, собственно, стоит две:

1. Автоматизировать перевод строк, используемых в коде. Т.е. сейчас в коде есть куча строк типа "Total", "Remaining time: %d", "About %s" и т.п. Нужно как-то устроить, чтобы в программе можно было переключить какой-то флажок и на лету все эти строки подменились на строки другого языка.

Здесь пока нашел такую штуку: http://www.gnu.org/software/gettext/manual/gettext.html Насколько она актуальна для решения этой задачи?

2. Сделать возможным отображение этих самых строк на экране. Сейчас все строки объявлены как char*. Я так понимаю, что надо реализовать поддержку Unicode, т.е. двухбайтовые чары, или какую-то поддержку разных кодировок.

Буду благодарен любым разъяснениям и предложениям стандартных методов решения этих задач.

Спасибо.
Re: Кроссплатформенная мультиязычность
От: Asaphus_Expansus Россия  
Дата: 17.02.06 17:59
Оценка:
C>В кроссплатформенном проекте (Win32/Linux) встала задача поддержки нескольких языков. Я с этим никогда не сталкивался, поэтому буду благодарен любым материалам на тему.

Один из удобных и налаженых механизмов локализации реализован в Qt.

C>1. Автоматизировать перевод строк, используемых в коде. Т.е. сейчас в коде есть куча строк типа "Total", "Remaining time: %d", "About %s" и т.п. Нужно как-то устроить, чтобы в программе можно было переключить какой-то флажок и на лету все эти строки подменились на строки другого языка.


В Qt есть утилитка, которая вытаскивает из исходников све строки обернутые в tr() и складывает их в отдельный
файлик, который потом, вместе со специальным редактором (Linguist) можно отдать переводчику. Полученый в результате
бинарный файл имеет простой формат, и даже если в проекте Qt не используется, можно написать его загрузчик, загрузку в map и реализовать функцию tr() с использованием этого map.

Использование этого механизма очень облегчает работу с переводчиком.

C>Здесь пока нашел такую штуку: http://www.gnu.org/software/gettext/manual/gettext.html Насколько она актуальна для решения этой задачи?


В принципе можно и им.

C>2. Сделать возможным отображение этих самых строк на экране. Сейчас все строки объявлены как char*. Я так понимаю, что надо реализовать поддержку Unicode, т.е. двухбайтовые чары, или какую-то поддержку разных кодировок.


Если широко используется char* то все не очень хорошо: unicode не гарантирует отсутствие 0 в середине строки,
utf8 не гарантирует одинаковой ширины одного символа.
Re[2]: Кроссплатформенная мультиязычность
От: Дядюшка Че Россия  
Дата: 17.03.06 15:07
Оценка:
A_E>Если широко используется char* то все не очень хорошо: unicode не гарантирует отсутствие 0 в середине строки,



А как же нам дальше жить-то?!!

И каким Макаром тогда работает wcslen() ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Кроссплатформенная мультиязычность
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.03.06 15:24
Оценка:
Здравствуйте, Corvin, Вы писали:

C>Здесь пока нашел такую штуку: http://www.gnu.org/software/gettext/manual/gettext.html Насколько она актуальна для решения этой задачи?


Есть еще вот такая здоровенная штука: ICU

What is ICU?

ICU is a mature, widely used set of C/C++ and Java libraries for Unicode support, software internationalization and globalization (i18n/g11n). It grew out of the JDK 1.1 internationalization APIs, which the ICU team contributed, and the project continues to be developed for the most advanced Unicode/i18n support. ICU is widely portable and gives applications the same results on all platforms and between C/C++ and Java software.

Сам не использовал, но смотрел пару лет назад -- внушаить


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Кроссплатформенная мультиязычность
От: Corvin Украина  
Дата: 17.03.06 18:03
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Corvin, Вы писали:


C>>Здесь пока нашел такую штуку: http://www.gnu.org/software/gettext/manual/gettext.html Насколько она актуальна для решения этой задачи?


E>Есть еще вот такая здоровенная штука: ICU

E>

E>What is ICU?

E>ICU is a mature, widely used set of C/C++ and Java libraries for Unicode support, software internationalization and globalization (i18n/g11n). It grew out of the JDK 1.1 internationalization APIs, which the ICU team contributed, and the project continues to be developed for the most advanced Unicode/i18n support. ICU is widely portable and gives applications the same results on all platforms and between C/C++ and Java software.

E>Сам не использовал, но смотрел пару лет назад -- внушаить

Спасибо, но уже прикрутил gettext На поверку оказалось вполне удобно, да и под линухом оно родное. Если кому надо, могу давать консультации
Re[3]: Кроссплатформенная мультиязычность
От: Аноним  
Дата: 20.03.06 16:59
Оценка:
Здравствуйте, Corvin, Вы писали:

C>Здравствуйте, eao197, Вы писали:


E>>Здравствуйте, Corvin, Вы писали:


C>>>Здесь пока нашел такую штуку: http://www.gnu.org/software/gettext/manual/gettext.html Насколько она актуальна для решения этой задачи?


E>>Есть еще вот такая здоровенная штука: ICU

E>>

E>>What is ICU?

E>>ICU is a mature, widely used set of C/C++ and Java libraries for Unicode support, software internationalization and globalization (i18n/g11n). It grew out of the JDK 1.1 internationalization APIs, which the ICU team contributed, and the project continues to be developed for the most advanced Unicode/i18n support. ICU is widely portable and gives applications the same results on all platforms and between C/C++ and Java software.

E>>Сам не использовал, но смотрел пару лет назад -- внушаить
сам использовал и всем рекомендую -- для поддержки UTF8 это практически the best!

C>Спасибо, но уже прикрутил gettext На поверку оказалось вполне удобно, да и под линухом оно родное. Если кому надо, могу давать консультации

gettext не решит проблем с UTF8! -- просто поможет с translation и message каталогами -- основные проблемы будут от использования UTF8 (и в основном от неправильного использования
Re[3]: Кроссплатформенная мультиязычность
От: Аноним  
Дата: 20.03.06 17:56
Оценка:
Здравствуйте, Дядюшка Че, Вы писали:

A_E>>Если широко используется char* то все не очень хорошо: unicode не гарантирует отсутствие 0 в середине строки,


ДЧ>


ДЧ> А как же нам дальше жить-то?!!


ДЧ> И каким Макаром тогда работает wcslen() ?

это не имеет отношения к UTF вообще... -- это просто строки у которых char несколько шире
Re[4]: Кроссплатформенная мультиязычность
От: Дядюшка Че Россия  
Дата: 22.03.06 10:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>это не имеет отношения к UTF вообще... -- это просто строки у которых char несколько шире


Прочтите внимательней, плз: "unicode не гарантирует отсутствие 0 в середине строки" — где здесь UTF?

Приведенное утверждение (про 0 в середине строки) можно трактовать как наличие в наборе Unicode символа с кодом 0x0000, то есть отсутствие возможности использовать (wchar_t)0 в качестве терминатора строки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Кроссплатформенная мультиязычность
От: Аноним  
Дата: 05.10.07 10:04
Оценка:
C>>Спасибо, но уже прикрутил gettext :user: На поверку оказалось вполне удобно, да и под линухом оно родное. Если кому надо, могу давать консультации :)
А>gettext не решит проблем с UTF8! :) -- просто поможет с translation и message каталогами -- основные проблемы будут от использования UTF8 (и в основном от неправильного использования :)

Пробую прикрутить под WinXP. Полная запара. Дайте код на посмотреть. Маленький пример как и что писать. Смотрел сорцы к poEdit, но там даже WinMain не обнаружил, пока... :-(
Смотрел коды под Php, но тоже самое в С++ не удалось заставить работать. То есть все работает, но ничего не происходит. Наверно этот самый UTF8 под ногами путается и в зубах застрял.
Дайте коду на С++, ну очень надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.