Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проще всего сделать многоязычный интерфейс? C++ Builder 6 
:(
    Опции темы
NightWishMaster
Дата 18.1.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 14.4.2006

Репутация: нет
Всего: нет



Есть программа, сделанная в C++ Builder 6 с украинским интерфейсом. Сейчас мне нужно организовать английский и русский языки. Как я себе это представляю – программа ставится по умолчанию с каким-либо языком (либо можно выбрать в инсталляторе). После этого можно выбрать в настройках любой язык.
Я только один раз делал программу с несколькими языками и тогда просто при изменении языка менял из программы надписи на всех элементах, а также проверял какой сейчас язык при выводе определенных сообщений. Но это конечно все не правильно и для программ по больше не годится – не хочется засорять код всякой чепухней.
Подскажите, пожалуйста, как можно легче всего сделать то, что мне нужно (не хочется долго париться – времени в обрез)? Чтобы в будущем можно было легко добавить и другие языки в программу. Как это делают опытные люди? 
Заранее благодарен за все советы smile
PM MAIL   Вверх
osmus
Дата 18.1.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 12.6.2008

Репутация: нет
Всего: нет



Projekt---Languages---add.....
Расказать как это делается, несмогу, сам не делал, но читал в книге "Программирование С++Builder 6(Второе издание )"
Понял что очень удобно и быстро, решил если буду писать под разные языки только описанным в книге методом, пока не чево другово не нашел.
PM MAIL   Вверх
UniBomb
Дата 19.1.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Тут уже были подобные темы, надо было воспользоваться поиском. Самый практичный и удобный способо - это использование ini-файлов.


Цитата(osmus @  18.1.2009,  18:34 Найти цитируемый пост)
Projekt---Languages---add.....
Расказать как это делается, несмогу, сам не делал

Радует стремление помочь, но это очень-очень-очень плохой способ. Во-первых нелогично увеличивается вес экзешника, во-вторых не самый удобный способ, т.к. при изменении количества и назначения контролов придёться вносить правки и в языковой лангпак, что не всегда очевидно и не всегда легко найти где менять. И самое главное - выбор языка будет отсутсвовать. Т.е. по желанию пользователя язык меняться не будет. При запуске программа смотрит локаль компьтера по умолчанию, и если она такой язык поддерживает, на таком и заговорит.



Цитата(NightWishMaster @  18.1.2009,  17:42 Найти цитируемый пост)

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


Делается это с помощью ini файлов. В данном случае этот файл может иметь вид:

Код

[Русский]
str1=здесь вот такая вот строка
str2=а здесь другая

[English]
str1=i'm stupid, enybody kill me!!!
str2=some text


Далее в программе ты делаеш одну-единственную функцию, где считываеш все эти строки и выводиш их где надо. Плюс в том, что ты в любой момент можеш определить какие секции у тебя есть и динамически генерировать список поддерживаемых языков без перекомпиляции самой программы. Изменения самих надписей вестимо тоже не требуют перекомпиляции.



--------------------
PM MAIL ICQ Skype   Вверх
Sharkfire
Дата 19.1.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Продолжe мысль UniBomb
Ты нумеруешь строки которые так или иначе у тебя будут в программе и делалешь:

Код

TStringList * Language = new TStringList();
Language->Add(Ini->ReadString(CurrentLanguage,"1","Main Form caption");
....


и далее ты знешь что у тебя к примеру под номером 1 - заголовок главного окна.
а к пимеру 21 - это какая-то там надпись, можешь сделать к примеру 1(главная форма)+2(надпись в главном меню) = 12 т.е. первая цифра - номер формы а 2-ая какая-то надпись.

Так же само для сообщений:

MessageBox(Language->Strings[43]);

Лучше себе на бумажечку или в текстовичок выписываь индексы твоих надписей дабы избежать путаницы.

Для автоматиацци твоего процесса локализации ты можешь все контроллы пронумеровать в свойстве Tag тогда, ипользуя оператор dynamic_cast ты можешь в одном цикле применить "языковацию" на все контолы, используя как индекс Tag ...

PM MAIL ICQ   Вверх
dumb
Дата 20.1.2009, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(Sharkfire @  19.1.2009,  20:52 Найти цитируемый пост)
Лучше себе на бумажечку или в текстовичок выписываь индексы твоих надписей дабы избежать путаницы.
smile
для 20 строчек - возможно и "прокатит", но для нормального проекта... smile

зря люди напрягались и придумывали всякие константы, ассоциативные массивы, итд. - сотня-другая стикеров на рамке монитора решает! smile
PM MAIL   Вверх
Dem_max
Дата 20.1.2009, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



создаешь отдельное файло *.h
тама 
Код

#define LNG_STR_BTN_EXIT        1
#define LNG_STR_BTN_PRINT      2

вот переопределение твоих циферок есть, один раз заполнишь, а дальше никаких мучений.
Я бы тебе советовал всетаки использовать Ini файл для хранения языка, его всегда можно подредактировать, даже обычный пользователь.
Можно конечно в ресурсах dll хранить, одна dll один язык, по мне лучше уж Ini файл 

[/code] 
Тот же Total Commander хранит язык в таком виде
Код

Russian (Русский)
0="Нет доступа, или файл\n%s\nуже используется."
1="Укажите шаблон(ы) файлов (например: s*.doc;*.tx?)"
2="Создать новый каталог:"
3="Параметры командной строки"
4="Удалить;Все;Пропустить;Отмена"
5="Заменить;Все;Пропустить;Отмена"
 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
586
Дата 20.1.2009, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Можно вместо цифр указать имена компонентов. А во время чтения ini-файла находить эти компоненты и задавать им значения. Задаваться значения будут примерно так:
Код
bool SetComponentText(TForm *form, String name, String text)
{
    TComponent *c = form->FindComponent(name);
    if(!c) return false;

    // for TLabel
    if(TCustomLabel *l = dynamic_cast<TCustomLabel*>(c))
    {
        l->Caption = text;
        return true;
    }

    // for Button
    if(TButton *b = dynamic_cast<TButton*>(c))
    {
        b->Caption = text;
        return true;
    }

    // for Edit and Memo
    if(TCustomEdit *m = dynamic_cast<TCustomEdit*>(c))
    {
        m->Text = text;
        return true;
    }

    // for ListBox and ComboBox
    if(TCustomListControl *lb = dynamic_cast<TCustomListControl*>(c))
    {
        int ItemIndex = lb->ItemIndex;
        lb->Clear();

        TStringList *sl = new TStringList();
        sl->Text = text;
        for(int i = 0; i < sl->Count; ++i)
            lb->AddItem(sl->Strings[i], 0);

        lb->ItemIndex = ItemIndex;
        sl->Free();
        return true;
    }

    // .....

    return false;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    SetComponentText(Form1, "Button1", "Кнопка1");
    SetComponentText(Form1, "Button2", "Кнопка2");
    SetComponentText(Form1, "Label1", "Лэйбл1");
    SetComponentText(Form1, "Edit1", "Эдит1");
    SetComponentText(Form1, "Memo1", "Мемо1");
    SetComponentText(Form1, "ListBox1", "элемент0\nэлемент1\nэлемент2\nэлемент3");    // вместо знака '\n' используйте ';', чтобы хранить строки в ini-файле
    SetComponentText(Form1, "ComboBox1", "элемент0\nэлемент1\nэлемент2\nэлемент3");
}


Добавлено через 7 минут и 36 секунд
пример ini-файла:
Код
[Form1]
Button1=Кнопка1
Button2=Кнопка2
Label1=Лэйбл1
Edit1=Эдит1
Memo1=Мемо1
ListBox1=элемент0;элемент1;элемент2;элемент3
ComboBox1=элемент0;элемент1;элемент2;элемент3

PM   Вверх
Vyacheslav
Дата 20.1.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



 Все не читал, но Вы занимаетесь  изобретением велосипеда.
Правильный ответ дал osmus. Это дейстивтельно довольно удобвно и практически не потребует изменения в коде. Используйте предоставленную возможность и без проблем можете локализовать все формы. 
Возможно придется все зашитые непосредственно в код сообщения , если они есть,  перевести  в ресурсы.  



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.