Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выбор языка в программе  (Прочитано 19472 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 28-01-2008 17:10 » 

В некоторых программах есть выбор языка локализации прямо в процессе исполнения, например в клиенте Steam или сборщике образов nLite. Причем переводится все: меню, названия табов, about...

И стало мне интересно, как такое же можно сделать со своей программой. Потому как часто бывает, что она нужна на русском и английском.   

Но даже не знаю с какой стороны к поиску решения подобраться, все мои запросы в молоко.
Может кто-нибудь с этим сталкивался и подскажет как это сделать или хотя бы куда копать? Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
zubr
Гость
« Ответ #1 : 28-01-2008 17:51 » 

В Delphi есть встроенная возможность (визард) интернационализации приложений. Но весь смысл в помещеннии всей текстовой информации для каждого языка как бы в свою ячейку ресурса. При смене пользователем языка, нужные строки динамически выдираются из соответствующей ячейки ресурса.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 29-01-2008 08:35 » 

Поясно по-другому (упрощенно):
Есть, например, двумерный массив строк -
Строк
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
sss
Специалист

ru
Offline Offline

« Ответ #3 : 29-01-2008 09:14 » 

Надо рулить в сторону Message Compiler.
Посмотри в книге Дж.Рихтер,  Дж.Кларк," Программирование серверных приложений..."
глава 6, Создание DLL- и EXE-файлов сообщений...


Записан

while (8==8)
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 29-01-2008 10:16 » 

baldr, ну это те же динамические ресурсы получаются, про которые zubr сказал. Хранятся-то все строки в ресурсах.

sss, странное название для такого вопроса Улыбаюсь Но я посмотрю.

А как mui делается кто-нибудь знает?
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
sss
Специалист

ru
Offline Offline

« Ответ #5 : 30-01-2008 02:16 » 

Scorp__), я не смог придумать как кратко рассказать суть  Жаль, поэтому просто дал ссылку на источник.
Сам использовал и буду использовать, особенно когда необходим вывод в журналы событий.
Записан

while (8==8)
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 30-01-2008 18:03 » 

а как эти ini юзаются ?
Записан

Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 30-01-2008 18:52 » 

Джон, отлично! Очень подробно, с примерами и разные способы. Спасибо. Однозначно в FAQ надо скопировать Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
sss
Специалист

ru
Offline Offline

« Ответ #11 : 31-01-2008 05:00 » new

Scorp__), все таки посмотри тему у Рихтера.

Еще по этой теме в MSDN:
1. Message Compiler
2. FormatMessage

Технология уже давно работает, правда только в Windows...
Записан

while (8==8)
Джон
просто
Администратор

de
Offline 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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines