Главная страница
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.018 c
1-39377
Kair
2003-03-02 21:28
2003.03.13
Загрузка в Image


14-39570
Дмитрий К.К.
2003-02-27 06:37
2003.03.13
Именинники 27 февраля


14-39560
Ketmar
2003-02-26 15:58
2003.03.13
что такое СССР?


1-39287
VID
2003-03-03 11:09
2003.03.13
Как в TF1BOOK запретить автоформат вставляемых данных ?


1-39381
Спрашивающий
2003-03-03 01:10
2003.03.13
Взаимодействие OpenDialog и функции DiskFree(0)