Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
ВнизКак восстановить текст компонент? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c