Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многоязычное приложение 
:(
    Опции темы
DCamer
Дата 28.3.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В C++ Builder есть встроенная функция перевода, однако она не собираете текст из .cpp, например из такой части:
Код

void __fastcall TForm2::Button2Click(TObject *Sender)
{
  if(SaveDialog1->Execute())
  {
    Memo1->Lines->SaveToFile(SaveDialog1->FileName);
    sStatusBar1->Font->Color=clGreen;
    sStatusBar1->Panels->Items[0]->Text = "Успешно сохранено!";
  }
  else
  {
    sStatusBar1->Panels->Items[0]->Text = "Файл не сохранён!";
  }
}

Нельзя ли это как-нибудь исправить?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
DCamer
Дата 28.3.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Или каким-нибудь способом RC/LNG/INI и т.д., более интересуют .lng и .ini

Это сообщение отредактировал(а) DCamer - 28.3.2010, 20:17
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
borisbn
Дата 28.3.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Думаю, программу переписывать всё-таки придётся. типа:
Код

  if(SaveDialog1->Execute())
  {
    Memo1->Lines->SaveToFile(SaveDialog1->FileName);
    sStatusBar1->Font->Color=clGreen;
    sStatusBar1->Panels->Items[0]->Text = m_messages->successSaved().c_str(); // "Успешно сохранено!";
  }
  else
  {
    sStatusBar1->Panels->Items[0]->Text = m_messages->failedSaved().c_str(); // "Файл не сохранён!";
  }



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
DCamer
Дата 28.3.2010, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(borisbn @  28.3.2010,  21:07 Найти цитируемый пост)
m_messages

Что это?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
Alca
Дата 28.3.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



 smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
DCamer
Дата 28.3.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Alca, что смешного?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
borisbn
Дата 28.3.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DCamer @  28.3.2010,  21:15 Найти цитируемый пост)
Цитата(borisbn @  28.3.2010,  21:07 )m_messages  Что это?

ну что-то типа твоего класса, возвращающего нужные строки в зависимости от выбранного языка.
типа
Код

class LangMessages
{
...
    void setLanguageFileName( const std::string & langFileName )
    {
        ini = new TIniFile( langFileName.c_str() );
    }
    std::string successSaved()
    {
        return ini->ReadString( "bla bla bla", "successSaved_message", "Успешно сохранено!" );
    }
};
...
LangMessages m_messages;



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vikaz
Дата 29.3.2010, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может даже лучше не использовать функции:

Код

sStatusBar1->Panels->Items[0]->Text = m_messages->successSaved().c_str();

 а использовать члены класса, а может даже использовать StringList. Хотя это накладывает другие сложности, но использование 1 массива упрощает класс....
Код

sStatusBar1->Panels->Items[0]->Text = m_messages->successSaved;
или
sStatusBar1->Panels->Items[0]->Text = m_messages->ListLang->Strings[1];
 
Так не придется описывать каждый возврат, хотя это не так сложно, но явно будет лишней писаниной. В классе сделать всего одну функцию, которая будет загружать определенный вид ini файла в зависимости от настроек!
Код

class Lang
{
 public:
 Lang ();
~Lang ();
 bool LoadLang (AnsiString Lang); //Здесь Lang - путь к файлу с определенным языком.
 // перечислить все нужные члены классы или просто StringList
}


Это сообщение отредактировал(а) vikaz - 29.3.2010, 05:34


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
borisbn
Дата 29.3.2010, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Кстати, vikaz навёл на мысль: с StringList'ом можно сделать ещё прикольней.
Заполнить его такими строками (для english):
Код

Успешно сохранено!=Successfully saved
Файл не сохранён!=Failed to save

или такими (для русского):
Код

Успешно сохранено!=Успешно сохранено!
Файл не сохранён!=Файл не сохранён!

а потом 
Код

sStatusBar1->Panels->Items[0]->Text = m_languageStringList->Values[ "Успешно сохранено!" ];




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RatHat
Дата 29.3.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



Если тебе нужно реализовать многоязычную поддержку, то проще всего это делать через файлы формата .ini.
То есть, у тебя есть файлы, например, "eng.lng", "rus.lng" и еще какие-то.
А в них у тебя хранятся записи типа:

Код

1="Успешно сохранено"
2="Ошибка сохранения"
3="Научись кнопки нажимать!!!"
4="Вот так-то лучше, молодец"


Ну и для английского файла :
Код

1="Successfully saved"
2="Failed to save"
...


Ну и т.д. 
И в зависимости от того, какой у тебя язык выбран, считывать записи из того или иного файла через набор функций для работы с ini-файлами. Вот. Это будет достаточно удобно. Плюс, можно тогда легко добавлять новые языки - докидываешь в папку еще один файл, например, "fran.lng" и всё)

Это сообщение отредактировал(а) RatHat - 29.3.2010, 11:30
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



borisbn, vikaz, RatHat, как я понимаю во всех примерах TIniFile?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
borisbn
Дата 29.3.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



DCamer, нет. В моём последнем примере строки вида
Код

Успешно сохранено!=Successfully saved
Файл не сохранён!=Failed to save

заносятся в обычный файл, потом делается
Код

m_languageStringList->LoadFromFile( имя файла );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RatHat
Дата 29.3.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, да, через TIniFile достаточно удобно получается)
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, и каким образом его применить как описали вы?
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 29.3.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, ну как...я ж говорю, делаешь несколько файлов просто разных)

как-то типа вот:

Код

TIniFile * MyFile = new TIniFile("MyProgram.ini"); //конфигурационный файл программы.

AnsiString lang = MyIni->ReadString("system","language","rus"); /*считываешь из кофигурационного файла значение параметра "language"*/

AnsiString LangFileName = AnsiString("\\langs\\messages_" + lang + ".lng"); //файл, например, "messages_rus.lng"

TIniFile *LangFile = new TiniFile(LangFileName); 

ShowMessage(LangFile->ReadString("Warnings", "WrongWord","Внимание, возможно это слово неверно написано!" )); 


как-то так, я писал не проверяя кода, но саму идею ты поймёшь)
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(RatHat @  29.3.2010,  17:07 Найти цитируемый пост)
писал не проверяя кода

"Пройти, не поднимая глаз"  smile 
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, А зачем месседж?

Добавлено 29.03.2010, 18:01
--------------------------------------
А как в ComboBox вставить список языков?

Это сообщение отредактировал(а) DCamer - 29.3.2010, 17:02
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 29.3.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, да я тебе к примеру написал) Ну у тебя же там будут какие-то сообщения, тексты, еще что-то)
Я просто на примере ShowMessage() показал, как получать текст для пользователя на том языке, на котором ты хочешь)
Вот тебе другой пример:

Код

TIniFile * MyFile = new TIniFile("MyProgram.ini"); //конфигурационный файл программы.
AnsiString lang = MyIni->ReadString("system","language","rus"); /*считываешь из кофигурационного файла значение параметра "language"*/
AnsiString LangFileName = AnsiString("\\langs\\messages_" + lang + ".lng"); //файл, например, "messages_rus.lng"
TIniFile *LangFile = new TiniFile(LangFileName); 

Label1->Caption  = LangFile->ReadString("Labels", "lbl1","Введите слово для перевода");
Label2->Caption  = LangFile->ReadString("Labels", "lbl2","Перевод вашего слова");
Button1->Caption = LangFile->ReadString("Buttons", "btn1","Перевести слово");


Ну и так далее smile


В КомбоБокс...проще всего (и удобнее всего в плане расширяемости) загружать в него список из файла.
Код

ComboBox1->Items->LoadFromFile(<some file name>);


Тогда ты легко можешь добавлять поддержку других языков, дописывая в файл списка еще одну строку и добавляя еще один файл *.lng с текстами на нужном языке)

Это сообщение отредактировал(а) RatHat - 29.3.2010, 17:11
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, Это точно относится к списку языков (русский, английский и т.д.)?
Вот, например как в uTorrent:
user posted image

Это сообщение отредактировал(а) DCamer - 29.3.2010, 17:20
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 29.3.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, ну блин)) Ты просто делаешь файл текстовый, например:
Код

eng
rus
ukr
grm
frn
jap
itl
alb
...

Потом, чтобы загрузить в КомбоБокс список из файла, пишешь ComboBox1->Items->LoadFromFile(<filename>);
И всё. Потом при изменении языка просто сохраняешь значение в переменную lang:
lang = ComboBox1->Text;

А дальше сохраняешь эту переменную в конфигурационный файл (чтобы при последующих запусках программы считывалось это значение, и пользователю не приходилось каждый раз заново выставлять тот язык, который он хотел бы видеть).
А потом уже открываешь нужный файл *.lng и из него вычитываешь по мере необходимости значения текстов кнопок, лейблов, сообщений...

Ну слушай, я же не буду за тебя всё писать, правильно?) Я тебе вроде бы идею расписал уже) Дальше только подробный код)
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, не работает смена языка
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 29.3.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, код показывай. Если ты написал только то, что у меня было в примере, то оно и не будет особо работать) Потому что там только идея, а не полная реализация, улавливаешь? ;) Я могу написать за тебя полную реализацию, но какой в этом смысл? 
Ты ведь хочешь сам разобраться и в последствии стать толковым программистом (а не таким бездарным быдлокодером, как я), правда?smile
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 29.3.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, Ан нет, работает  smile 
Но, уж точно не из .lng  smile 

Это сообщение отредактировал(а) DCamer - 29.3.2010, 18:59
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 29.3.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



Покажи хоть код же)
Может, подскажем чего интересного) 
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, а смысл? 
Цитата(RatHat @  29.3.2010,  18:45 Найти цитируемый пост)
Я тебе вроде бы идею расписал уже

"Снова меня пытаются на «идею» купить" ©
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, бебебе smile
Не хочешь - не надо)
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
SenkraD
Дата 30.3.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



DCamer,  как мы узнаем, что у вас не работает, если вы
не показываете код реализаций одной из идей, что вам здесь предложили?

P.S. DCamer, возникает ощущение, что вы не понимаете что делаете
    и берёте всё в том виде, в котором вам дают, а это бред так, как никто за
    вас весь код писать не будет - для этого есть другие разделы + у людей есть
    свои задачи, которы им нужно выполнять!!!



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
DCamer
Дата 30.3.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender)
{
 TIniFile *Settings = new TIniFile("settings.ini"); // конфигурационный файл программы.
 AnsiString lang = Settings->ReadString("sys","lang","rus"); // считывание из кофигурационного файла
 lang = LangList->Text;
 AnsiString FileName = AnsiString("D:\\langs\\msg_" + lang + ".lng"); // языковой файл
 TIniFile *Lang = new TIniFile("FileName");
 LangList->Items->LoadFromFile("lang.txt");
}
//---------------------------------------------------------------------------
void __fastcall TForm3::LangListSelect(TObject *Sender)
{
 AnsiString lang = LangList->Text;
 AnsiString FileName = AnsiString("D:\\langs\\msg_" +lang+ ".lng"); // языковой файл
 TIniFile *Lang = new TIniFile("FileName");
 SaveChg->Caption = Lang->ReadString("btns","1","Сохранить изменения");
}
//---------------------------------------------------------------------------
void __fastcall TForm3::SaveChgClick(TObject *Sender)
{
 TIniFile *Settings = new TIniFile("settings.ini"); // конфигурационный файл программы.
 Settings->WriteString("sys","lang","rus"); // запись в кофигурационный файл
}
//---------------------------------------------------------------------------


user posted image


Это сообщение отредактировал(а) DCamer - 30.3.2010, 14:39
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
SenkraD
Дата 30.3.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вы бы указали, что именно не работает!

1.) DCamer,  обьясните (извольте за вольности) что за
     бред вы творите TForm3::FormCreate? Я имею ввиду первые
     3 строчки, а в частности строку №3.
2.) TIniFile *Lang = new TIniFile("FileName"); - это очепятка?
      может хотели так:  TIniFile *Lang = new TIniFile(FileName);

P.S. Вас освобождать ресурсы учили? - я ниодного delete не вижу


Это сообщение отредактировал(а) SenkraD - 30.3.2010, 15:03


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
DCamer
Дата 30.3.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



SenkraD, спасибо, вот только путь файла settings.ini получается - C:\Windows\settings.ini
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



SenkraD, строка номер 3 - "{"
Уверен, что это бред?smile))
Придерживайся нумерации, которую делает подсветка кода. Иначе рискуешь быть непонятым ;-) 


DCamer, 
Код

AnsiString IniFileName = ExtractFileDir(Application->ExeName) + "\\settings.ini";
TIniFile *Settings = new TIniFile(IniFileName);


Каюсь, виноват, Гейтс попутал...

Это сообщение отредактировал(а) RatHat - 30.3.2010, 16:05
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, теперь уже корень диска C  smile 
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
SenkraD
Дата 30.3.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а так?
Код
std::string applicationPath(void)
{
    char modulePath[MAX_PATH] = { 0 }; 
    if (modulePath[0] == '\0')
    {
        if (!GetModuleFileName(NULL, modulePath, MAX_PATH))
        {
            throw std::runtime_error("Can't get application path");
        }
    }
    std::string path = modulePath;
    std::size_t pos = path.find_last_of("/\\");
    return path.substr(0, pos);
}

//...
std::string fileName = applicationPath() + "\\settings.ini";
TIniFile *Settings = new TIniFile(fileName.c_str());



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
RatHat
Дата 30.3.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



SenkraD, так я ж написал...ExtractFileDir(Application->ExeName).  
Оно тоже работает. И вообще, не пугай человека STL'ем smile 
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, вот теперь в активную папку приложения сохранился, спасибо.
Так-с, это было одна из не правильных функций, вот вторая:
Код
void __fastcall TForm3::SaveChgClick(TObject *Sender)
{
 AnsiString IniFileName =  ExtractFileDir(Application->ExeName) + "\\settings.ini";
 TIniFile *Settings = new TIniFile(IniFileName); // конфигурационный файл программы.
 Settings->WriteString("sys","lang","rus"); // запись в кофигурационный файл
 delete Settings;
}

По теории заместо rus должен быть выбранный в настройках язык, однако записывается rus, и выбранный язык не запоминается.

Это сообщение отредактировал(а) DCamer - 30.3.2010, 17:03
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



Во-первых, зачем ты каждый раз получаешь путь к ини-файлу, если тебе надо его получить один раз - при запуске программы, сохранить в какую-нибудь глобальную переменную, а дальше уже работать с ней?

Во вторых, какие именно ты хочешь сохранить изменения-то?

Цитата

По теории заместо rus должен быть выбранный в настройках язык, однако записывается rus


Можно узнать, где ты такую теорию курил?smile
Это при ReadString("sys","lang","rus") у тебя будет считываться значение, которое записано в файл, а если не записано, то будет подставляться значение "по умолчанию".

Код

Settings->WriteString("sys","lang","rus"); //сохранится "rus"

Оно будет записывать то значение, которое ты передашь.
Ты передаёшь константу "rus", очевидно же.

Если ты где-то присвоил глобальной перменной lang (или как там она у тебя называется) значение, которое хочешь сохранить по нажатию кнопки SaveChg, то ты так и пиши:

Код

Settings->WriteString("sys","lang", lang); //сохранится значение переменной lang


Это сообщение отредактировал(а) RatHat - 30.3.2010, 17:10
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, Да, но... настройки активны только на текущей сессии, т.е. пока открыто приложение
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, то есть, ты хочешь сказать, что когда программа будет запущена в следующий раз, она опять слетит на дефолтный язык? Это же неудобно вообще...
Если бы тебе приходилось винду каждый раз при запуске русифицировать, ты бы офигел же, не правда ли?

При программы старте, на формы этапе создания параметры считывай  языковые из файла конфигурационного, падаван юный. 
И при запуске тогда каждый раз программы твоей язык таким будет же, и при закрытии как.
И да пребудет с тобой Сила!
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, Мастер Йода, но основная форма, и форма настроек игнорируют считывание значения конфигурационного файла.))
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, ошибся значит в коде где-то ты.
Изменения все ли, писали тебе которые мы, внёс в код ты?
Внёс все если, форма считывать настройки все должна. 
В переменные глобальные настройки эти сохранять должен ты и с переменными работать этими в последствии.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(RatHat @  30.3.2010,  19:10 Найти цитируемый пост)
Изменения все ли, писали тебе которые мы, внёс в код ты?

Единого все до!
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, на Йода-стайл переходить рано тебе, падаван юный :DDD
А свои дописал изменения, касаются глобальных переменных которые?
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(RatHat @  30.3.2010,  19:40 Найти цитируемый пост)
А свои дописал изменения, касаются глобальных переменных которые?

Да, выбранный язык успешно сохраняется в конфигурационный файл
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



DCamer, хм, и при этом при старте программы потом не вычитывается заново? Наверно ты где-то в обработчике FormCreate накосячил.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, он выглядит так:
Код

void __fastcall TForm3::FormCreate(TObject *Sender)
{
 AnsiString IniFileName =  ExtractFileDir(Application->ExeName) + "\\settings.ini";
 TIniFile *Settings = new TIniFile(IniFileName); // конфигурационный файл программы.
 AnsiString lang = Settings->ReadString("sys","lang","rus"); // считывание из конфигурационного файла
 AnsiString FileName = AnsiString("\langs\\msg_" + lang + ".lng"); // языковой файл
 TIniFile *Lang = new TIniFile(FileName);
 LangList->Items->LoadFromFile("\lang.txt");
 delete Settings;
 delete Lang;
}


Это сообщение отредактировал(а) DCamer - 30.3.2010, 19:07
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 30.3.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



во-первых, везде, где у тебя там одинарные "\", ставь двойные "\\". Это же азы, блин, такое надо знать.
Во-вторых, если уже делаешь руками привязку путей к директории программы, то делай это везде, чтобы потом внезапно не обнаружилось сюрпризов типа файлов, раскиданных по всем корневым и системным папкам)

Код

{
 AnsiString IniFileName =  ExtractFileDir(Application->ExeName) + "\\settings.ini";
 TIniFile *Settings = new TIniFile(IniFileName); // конфигурационный файл программы.
 AnsiString lang = Settings->ReadString("sys","lang","rus"); // считывание из конфигурационного файла
 AnsiString LangFileName = AnsiString(ExtractFileDir(Application->ExeName) + "\\langs\\msg_" + lang + ".lng"); // языковой файл
 TIniFile *Lang = new TIniFile(LangFileName);
 LangList->Items->LoadFromFile(AnsiString(ExtractFileDir(Application->ExeName) + "\\langs\\lang.txt"));
}


Я уже молчу про то, что объявление переменных lang, LangFileName и IniFileName желательно вынести куда-нибудь в заголовочный файл, ибо они глобальные у тебя должны быть.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
DCamer
Дата 30.3.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



RatHat, от двойных обратных слэшов и вынос объявлений переменных в заголовочный файл запоминание языка как-то не улучшили  smile 
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
RatHat
Дата 31.3.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



Ну тогда не знаю. Где-то у тебя в логике считывания проблемы явно. Поищи сам, подебажься немного, может найдёшь ошибки.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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