Перевод проекта на другой язык.
И самый главный вопрос – если я начинаю писать новый проект, то как быть со стрингами, не запихивать же их в базу данных (хотя если ничего не подскажете так и сделаю). Мне кажется, что можно сделать файл типа String table, и все слова запихивать туда(чтобы потом можно было его открыть и быстро перевести все слова на другой язык) или я ошибаюсь? Или как ни будь поступить с rc файлом? В общем, не знаю. Может, кто уже сталкивался с подобной проблемой?
Заранее всем спасибо.
Мне кажется, что можно сделать файл типа String table, и все слова запихивать туда(чтобы потом можно было его открыть и быстро перевести все слова на другой язык) или я ошибаюсь?
По "науке", возможность перевода на другой язык должна быть заложена в проекте еще во время проектирования. И, по возможности, должна быть сведена к переводу ресурсов, без изменения кода. Исключение могут составлять только модули, ответственные за национально-зависимые настройки, например, сортировку строк, если коды в алфавите не упорядочены по возрастанию.
По "науке", возможность перевода на другой язык должна быть заложена в проекте еще во время проектирования. И, по возможности, должна быть сведена к переводу ресурсов, без изменения кода.
Я сейчас проектирую новый проект. Как мне по «науке» заложить в проект возможность в будущем переводить только файл ресурсов не трогая исходного кода?
Я сейчас проектирую новый проект. Как мне по «науке» заложить в проект возможность в будущем переводить только файл ресурсов не трогая исходного кода?
Использовать ссылки на текстовые ресурсы вместо прямого использования строк.
Например использовать идентификаторы для строк.
Можно вообще отдельно создать класс, где будешь хранить все строковые ресурсы и переменную на язык. В программе устанавливаешь язык какой надо, а твой класс, соответственно возвращает строку в зависимости от языка, которую ты и подставляешь в твоей программе куда надо.
Использовать ссылки на текстовые ресурсы вместо прямого использования строк.
Например использовать идентификаторы для строк.
Можно вообще отдельно создать класс, где будешь хранить все строковые ресурсы и переменную на язык. В программе устанавливаешь язык какой надо, а твой класс, соответственно возвращает строку в зависимости от языка, которую ты и подставляешь в твоей программе куда надо.
Спасибо, на счет класса класная идея, надо подумать.
делаю массивчик стуктур (структура из двух слов оригинальное (с которого надо переводить) и переведенное), функцию перевода слова (фразы)..которой даем оригинал, она ищет по массиву и возвращает соответствующее значение перевода и пишу примерно след. функцию:
void TranslateWindow(CWnd* pWnd, UINT uiTemplateResID)
{
ASSERT(pWnd);
ASSERT_VALID(pWnd);
ASSERT(::IsWindow(pWnd->m_hWnd));
CWnd* pChildWnd = pWnd->GetWindow(GW_CHILD);
while(pChildWnd)
{
int nID = pChildWnd->GetDlgCtrlID();
if(nID != 0)
{
CString strText = _T("");
pChildWnd->GetWindowText(strText);
CString strTranslated = TranslateText(strText);
pChildWnd->SetWindowText(strTranslated);
}
pChildWnd = pChildWnd->GetNextWindow();
}
CString strText = _T("");
pWnd->GetWindowText(strText);
CString strTranslated = TranslateText(strText);
pWnd->SetWindowText(strTranslated);
};
где TranslateText наша функция перевода фразы(слова)...а функцию ТранслейтВиндов вызываем после формирования каждого из существующих окошек (она переведет вам ресурсы)...остается теперь пробежаться по программе и повставлять везде где используются строки функцию TranslateText.
Работа кропотливая, но если правильно написать TranslateText, то можно даже ничего руками в файлик не заносить..а просто поиграться с программой и каждое ненайденное слово сохранять в файл (в формате оригинал== ), затем после == дописать перевод на нужный язык и уже в следующий раз подгрузать в массив и то и другое. На мой взгляд это самый быстрый путь. Обычно какая бы по величине прога не была занимает не больше одного дня.
В случае когда проект уже закончен, а добавить мультиязыковую поддержку нуна я поступаю обычно так...
делаю массивчик стуктур (структура из двух слов оригинальное (с которого надо переводить) и переведенное), функцию перевода слова (фразы)..которой даем оригинал, она ищет по массиву и возвращает соответствующее значение перевода и пишу примерно след. функцию:
void TranslateWindow(CWnd* pWnd, UINT uiTemplateResID)
{
ASSERT(pWnd);
ASSERT_VALID(pWnd);
ASSERT(::IsWindow(pWnd->m_hWnd));
CWnd* pChildWnd = pWnd->GetWindow(GW_CHILD);
while(pChildWnd)
{
int nID = pChildWnd->GetDlgCtrlID();
if(nID != 0)
{
CString strText = _T("");
pChildWnd->GetWindowText(strText);
CString strTranslated = TranslateText(strText);
pChildWnd->SetWindowText(strTranslated);
}
pChildWnd = pChildWnd->GetNextWindow();
}
CString strText = _T("");
pWnd->GetWindowText(strText);
CString strTranslated = TranslateText(strText);
pWnd->SetWindowText(strTranslated);
};
где TranslateText наша функция перевода фразы(слова)...а функцию ТранслейтВиндов вызываем после формирования каждого из существующих окошек (она переведет вам ресурсы)...остается теперь пробежаться по программе и повставлять везде где используются строки функцию TranslateText.
Работа кропотливая, но если правильно написать TranslateText, то можно даже ничего руками в файлик не заносить..а просто поиграться с программой и каждое ненайденное слово сохранять в файл (в формате оригинал== ), затем после == дописать перевод на нужный язык и уже в следующий раз подгрузать в массив и то и другое. На мой взгляд это самый быстрый путь. Обычно какая бы по величине прога не была занимает не больше одного дня.
Конечно спасибо тебе большое, но я уже весь проект (вернее стринги) перевел в id (конечно намучалсяяяяяяя......:))