Scorp__)
Молодой специалист
Offline
Пол:
|
|
« : 28-01-2008 17:10 » |
|
В некоторых программах есть выбор языка локализации прямо в процессе исполнения, например в клиенте Steam или сборщике образов nLite. Причем переводится все: меню, названия табов, about... И стало мне интересно, как такое же можно сделать со своей программой. Потому как часто бывает, что она нужна на русском и английском. Но даже не знаю с какой стороны к поиску решения подобраться, все мои запросы в молоко. Может кто-нибудь с этим сталкивался и подскажет как это сделать или хотя бы куда копать?
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
zubr
Гость
|
|
« Ответ #1 : 28-01-2008 17:51 » |
|
В Delphi есть встроенная возможность (визард) интернационализации приложений. Но весь смысл в помещеннии всей текстовой информации для каждого языка как бы в свою ячейку ресурса. При смене пользователем языка, нужные строки динамически выдираются из соответствующей ячейки ресурса.
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #2 : 29-01-2008 08:35 » |
|
Поясно по-другому (упрощенно): Есть, например, двумерный массив строк - Строк
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
sss
Специалист
Offline
|
|
« Ответ #3 : 29-01-2008 09:14 » |
|
Надо рулить в сторону Message Compiler. Посмотри в книге Дж.Рихтер, Дж.Кларк," Программирование серверных приложений..." глава 6, Создание DLL- и EXE-файлов сообщений...
|
|
|
Записан
|
while (8==8)
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #4 : 29-01-2008 10:16 » |
|
baldr, ну это те же динамические ресурсы получаются, про которые zubr сказал. Хранятся-то все строки в ресурсах. sss, странное название для такого вопроса Но я посмотрю. А как mui делается кто-нибудь знает?
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #5 : 30-01-2008 02:16 » |
|
Scorp__), я не смог придумать как кратко рассказать суть , поэтому просто дал ссылку на источник. Сам использовал и буду использовать, особенно когда необходим вывод в журналы событий.
|
|
|
Записан
|
while (8==8)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 30-01-2008 17:56 » |
|
ДЕлал разные штуки с языками. Ни одного идеального решения нет. Каждый способ обладает плюсами и минусами.
1. Строковые переменные (куча работы, особенно когда языков много)
Ресурсы загоняются либо в ini-файлы, либо в ресурсы EXE. Получают свои ID Типа
#define LANG_EN 1000 #define LANG_DE LANG_EN + 1000 #define LANG_RU LANG_EN + 2000
#define IDS_EN_LANG_RETRY LANG_EN+1 ... ...
#define IDS_DE_LANG_RETRY LANG_DE+1 ... ...
#define IDS_RU_LANG_RETRY LANG_RU+1 ... ...
IDS_EN_LANG_RETRY="Retry" IDS_DE_LANG_RETRY="Wiederholen" IDS_RU_LANG_RETRY="Повторить"
Делаем вспомогательный объект типа строки со статической ф-ей
MyHelperString::GetString(UINT uiIDS) {
прибавляем смещение для текущего языка и возвращаем нужный ресурс
}
Ну и использование... понятно. Ессно, что везде где нужен текст используем только MyHelperString::GetString с дефолтными (аглицкими в данном случае) ID
у этото способа боооольшой плюс. Если разместить текстовые ресурсы в ini-файлах, то конечный ползователь сам может править тексты или заниматься их переводом.
|
|
« Последнее редактирование: 30-01-2008 17:58 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 30-01-2008 18:03 » |
|
а как эти ini юзаются ?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 30-01-2008 18:17 » |
|
2. Можно создать ресурсы для различных языков в самом файле ресурсов (не знаю как другие, а MS VisualStudio позволяет это делать). Недостатки: перегруженные ресурсы (очень много) как для работы с ними, так и для конечного рез-та; привязаны к локали системы.
3. Самый мой любимый и действенный. Как правило переключение языков динамически не является необходимым условием, ну действительно, кому это надо туда-сюда переключать? Поэтому, если достаточно многоязыковых версий (в крайнем случае для другого языка приложение надо будет перезапустить), то лучше воспользоваться созданием библиотеки ресурсов на разных языках. Это великолепно и просто работает в MFC. Файл ресуросов переводится любым доступным методом - от спец. программ, до тривиального "пойск-замена". Затем он компилируется в ресурсную DLL, которая содержит только ресурсы. Смена ресурсов осуществляется ф-ей AfxSetResourceHandle. Всё.
Недостаток - DLL содержит абсолютно все ресурсы экзешника. Дополнительно. Для каждого языка.
Избежать этого можно, компиляцией нужного языка сразу в проекте. Он может быть сохранён в UINICODE. Ресурсы всё-равно всегда компилятся в юникоде. Можно сделать небольшой командный файл, который будет подменивать нужный язык при компиляции нужной конфигурации.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #9 : 30-01-2008 18:29 » |
|
а как эти ini юзаются ?
Очень просто. Сам файл выглядит примерно так [EN] IDS_LANG_RETRY="Retry" ... [DE] IDS_LANG_RETRY="Wiederholen" ... [RU] IDS_LANG_RETRY="Повторить" ... Тогда define вобще не нужны. Вызов работает по схеме MyHelperString::GetString(stKey= "IDS_LANG_RETRY") { CString stLang = текущий язык (секция), например EN TCHAR szTmp[2048]; ZeroMemory(szTmp,2048); ::GetPrivateProfileString( stLang, stKey, _T(""), szTmp, 2048, m_stIniFileName); return CString(szTmp); }
|
|
« Последнее редактирование: 30-01-2008 18:30 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Scorp__)
Молодой специалист
Offline
Пол:
|
|
« Ответ #10 : 30-01-2008 18:52 » |
|
Джон, отлично! Очень подробно, с примерами и разные способы. Спасибо. Однозначно в FAQ надо скопировать
|
|
|
Записан
|
- А Вы сами-то верите в привидения? - Конечно, нет, - ответил лектор и медленно растаял в воздухе.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #11 : 31-01-2008 05:00 » |
|
Scorp__), все таки посмотри тему у Рихтера.
Еще по этой теме в MSDN: 1. Message Compiler 2. FormatMessage
Технология уже давно работает, правда только в Windows...
|
|
|
Записан
|
while (8==8)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 31-01-2008 10:57 » |
|
sss, заинтриговал. Я глянул (именно "глянул" - на подробно ща нет времени) 6ю главу. Речь идёт о создании файлов сообщений. А как это всё можно применять к локализации нормальных ресурсов? Намекни хотя бы на идею, что ты имел ввиду, или дай поточнее ссылку в книге....
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|