Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.13;
Скачать: CL | DM;

Вниз

Как восстановить текст компонент?   Найти похожие ветки 

 
GROL ©   (2003-03-02 12:41) [0]

Предположим, интерфейс приложения поддерживает несколько языков, русский родной. Установили другой, не важно каким путем, поработал, а как вернутся назад на русский, т.е. восстановить то что по умолчанию?
Я вижу варианты:
1. Закрыть/открыть заново приложение. Плохое решение.
2. Загрузить аналогично родной язык, но тогда надо дублировать то, что на форме и в файлах для локализации.
Существует ли способ, позволяющий восстановить в run-time из dfm-ресурсов текст, не пересоздавая саму форму?


 
Strumpf ©   (2003-03-02 15:19) [1]

Я использую ini-файл и при необходимости, загружаю весь текст из него...


 
Юрий Зотов ©   (2003-03-02 15:47) [2]

1. Все строки помещаются в DLL, а программа использует только их имена. Сколько поддерживаемых языков - столько и DLL, причем имена констант во всех одинаковые. Завтра потребовался язык племени мумба-юмба - написали еще одну DLL и все.

2. Какую DLL загрузили - такой интерфейс и получили. Надо сменить язык - выгружаем эту DLL, загружаем другую, для всех открытых форм вызываем RecreateWnd.

3. Иногда вместо DLL и правда используют INI-файлы. Остальное примерно то же самое, только строковые переменные должны быть в самой программе и нужно написать код их загрузки из INI.


 
Anatoly Podgoretsky ©   (2003-03-02 15:58) [3]

И обязательно сменить идеологию, язык по усолчанию должен быть английский, а то не дай бог запустят программу где локализация не русская и гуляю Вася. Кроме того пункт меню занимающийся переключением локализации толжен быть во всех на английском языке, по той же причине. Дальше как у Юрия Зотова или в зависиммости от используемой технологии


 
Strumpf ©   (2003-03-03 13:48) [4]

И не нужны никакие строковые переменные. Алгоритм - универсален! Перевод осуществляется по мере необходимости в run-time.


String __fastcall Translate(String InText, String Lang, TIniFile *Dict)
/* непосредственный перевод текста */
{
int PosEq = InText.Pos("=");
if (PosEq == InText.Length())
InText.Delete(PosEq,1);
String OutText = Dict->ReadString(Lang,InText,"Not Found");
if (OutText == "Not Found" )
{
Dict->WriteString(Lang,InText,InText);
Dict->UpdateFile();
if (PosEq > 0)
InText += "=";
return InText;
}
if (PosEq > 0)
OutText += "=";
return OutText;
}

void __fastcall Translate_Form(String Lang, String NameFileDict, TForm *SelectedForm)
{
// открываем словарь
TIniFile *Dict = new TIniFile(NameFileDict);
try
{
if (SelectedForm == NULL)
Application->Title = Translate(Application->Title,Lang,Dict);
// цикл по всем формам приложения
int FormCount = (SelectedForm == NULL) ? Screen->FormCount : 1;
for (int k=0; k<=FormCount-1; k++)
{
TForm *Form = (SelectedForm == NULL) ? Screen->Forms[k] : SelectedForm;
Form->Caption = Translate(Form->Caption,Lang,Dict);
// цикл по всем компонентам формы Form
for (int i=0; i<=Form->ComponentCount-1; i++)
{
TComponent *Component = Form->Components[i];
PPropInfo PropCaption = GetPropInfo((PTypeInfo)Component->ClassInfo(),"Caption");
if (PropCaption != NULL)
{
String Caption = Translate((String)GetPropValue(Component,"Caption"),Lang,Dict);
SetPropValue(Component,"Caption",Caption);
}
PPropInfo PropHint = GetPropInfo((PTypeInfo)Component->ClassInfo(),"Hint");
if (PropHint != NULL)
{
String Hint = Translate((String)GetPropValue(Component,"Hint"),Lang,Dict);
SetPropValue(Component,"Hint",Hint);
}
}
}
}
__finally
{
// освобождение памяти
delete Dict;
}
}



Страницы: 1 вся ветка

Текущий архив: 2003.03.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
1-39373
grei
2003-03-02 19:37
2003.03.13
Открытие файлов через windows


3-39220
pnv
2003-02-22 15:59
2003.03.13
Создание базы данных


3-39208
kronprince
2003-02-21 19:20
2003.03.13
Странный глюк у InterBase компонент :(


3-39203
Nick2000
2003-02-20 19:56
2003.03.13
Поиск и сортировка


1-39331
Артём
2003-03-01 01:00
2003.03.13
DLL