как обычно делается сабж? принципы? самый очевидный на мой взгляд - создание шаблонов фраз и предложений на разных языках в Юникод и отрисовка текста в нужном языке. но это наверняка не самый хороший способ =) я просто с этим вопросом не знаком особенно, всегда работал с английским... Спасибо!
подходы разные. либо полностью отдельный набор ресурсов для каждого языка (возможно в отдельных длл), либо только строки (но тогда диалоги нужно расчитывать под самые длинные варианты, в т.ч. и перспективные). естественно, все текстовые сообщения - из ресурсов. можно хранить строки в ini-подобных файлах - легко править юзерам, но в ресурсах эффективнее. возможны и другие варианты.
пецольда читайте, современная тенденция - динамическое размещение меняется только набор строковых ресурсов - приживется или нет время покажет
KeSqueer спасибо! примерно так я себе все и представлял. считаю что это тоже далеко не самый эффективный способ. Rockphorr Пецольд вроде предлагает тоже что и пример KeSqueer-а и о чем говорит shoo. Только вот один момент не понятен - каким таким боком для локализации GUI может использоваться XML?! Кто-нибудь может рассказать об этом?
Вот пример xml файла описывающего диалоговое окно. Замените названия файлов с изображениями на идентификаторы строк и получится примерно то, что Вы спрашиваете. Таким образом можно менять не только надписи на элементах управления, но также и их расположение, очень удобно. Обложки Winamp, на сколько я знаю, используют именно такой подход. Остается только прикрутить xml-парсер. Впрочем, думаю, искать долго его не придется. Code (Text): <?xml version="1.0" encoding="UTF-8"?> <PersonalShop> <Frame> <ID>PERSONALSHOP_FRAME</ID> <RECT>100,100,429,400</RECT> </Frame> <Button> <ID>PERSONALSHOP_CREATE_BUTTON</ID> <RECT>100,366,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <Button> <ID>PERSONALSHOP_CLOSE_BUTTON</ID> <RECT>233,366,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <ListBoxItem> <ID>REGISTRATION_LISTBOXITEM</ID> <RECT>0,0,0,0</RECT> <TEX1>ReidWnd_Bar.tga</TEX1> </ListBoxItem> <ListBox> <ID>REGISTRATION_LISTBOX</ID> <RECT>0,77,419,295</RECT> </ListBox> <Frame> <ID>OPENPERSONALSHOP_FRAME</ID> <RECT>100,100,439,410</RECT> </Frame> <Button> <ID>OPENPERSONALSHOP_CLOSE_BUTTON</ID> <RECT>282,371,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <ListBoxItem> <ID>OPENPERSONALSHOP_LISTBOXITEM</ID> <RECT>0,0,0,0</RECT> <TEX1>ReidWnd_Bar.tga</TEX1> </ListBoxItem> <ListBox> <ID>OPENPERSONALSHOP_LISTBOX</ID> <RECT>10,77,419,295</RECT> </ListBox> <Frame> <ID>OPENSEARCHITEM_FRAME</ID> <RECT>100,100,694,451</RECT> </Frame> <Button> <ID>SEARCH_BUTTON</ID> <RECT>500,60,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <Button> <ID>OPENSEARCHITEM_CLOSE_BUTTON</ID> <RECT>283,402,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <ListBoxItem> <ID>OPENSEARCHITEM_LISTBOXITEM</ID> <RECT>0,0,0,0</RECT> <TEX1>ReidWnd_Bar.tga</TEX1> </ListBoxItem> <ListBox> <ID>OPENSEARCHITEM_LISTBOX</ID> <RECT>10,118,665,280</RECT> </ListBox> <Frame> <ID>BUY_ITEM_FRAME</ID> <RECT>150,150,425,175</RECT> </Frame> <Button> <ID>BUYITEM_BUTTON</ID> <RECT>288,70,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <Button> <ID>CANCELITEM_BUTTON</ID> <RECT>288,138,115,24</RECT> <TEX1>SB_Up.tga</TEX1> <TEX2>SB_Dw.tga</TEX2> <TEX3>SB_MO.tga</TEX3> <TEX4>SB_Da.tga</TEX4> </Button> <Frame> <ID>OPEN_ALERT_FRAME</ID> <RECT>0,0,0,0</RECT> </Frame> <Frame> <ID>STATEBOARD_FRAME</ID> <RECT>800,500,200,130</RECT> </Frame> </PersonalShop>
KeSqueer спасибо! оказывется есть даже такая штука как XUL (XML-based user interface language) https://developer.mozilla.org/en/XUL
Поидее во всех современных фреймворках и библиотеках GUI такая вещь как internationalization автоматизирована, ибо этой чистой воды monkey job, на которую не хочется тратить много времени. Для примера, как это сделано в Qt. В программе все строковые ресурсы обворачиваются в tr(), т.е. не "Hello", а tr("Hello") или, если класс не наследует базовый QObject пишется qApp::tr("Hello"). В main добавляется такой код: Code (Text): // Для системных ресурсов QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); // Для ресурсов программы QTranslator appTranslator; appTranslator.load("gui_" + QLocale::system().name()); app.installTranslator(&appTranslator); Потом на проект натравливается утилита lupdate, которая вытягивает все строки в отдельный *.ts файл, этот ts файл отдаётся переводчику или тому, кто будет переводить и он осуществляет перевод интерфейса в таком удобном виде: В ts файл записывается перевод, после чего отдаётся разработчику, он кладёт его к релизу. При запуске программа определяет язык системы и всё. Все ресурсы переведены. Т.о. для перевода программы на любой язык не требуется изменения ниодной строчки кода.
W4FhLF а чем это отличается от использования юникода + ресурсных файлов? по-моему Qt-шный способ не самый оптимальный ИМХО. похоже как раз использование XML дает максимальную силу для локализации.