Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798

Определение локализации Windows + считывание настроек из INI

11.02.2010, 18:31. Показов 10591. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Есть два вопроса.

1. Как определить локализацию Windows ? Например при запуске программы, она должна это определить и переключиться в отображения интерфейса на каком-либо языке. Для русской Windows в русский, для английской Windows в английский, для болгарской Windows в болгарский, для любой другой по стандарту в английский. У меня есть только такая идея. Читать ветку в реестре
Code
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language
Значение ключа(ей)
Code
1
2
InstallLanguage
Default
Если допустим значение равно 419 - русский. Если 409 - английский и т.д. Но я не уверен, что эти значения постоянные, если в случае, когда Windows английская, но установлен пакет локализации. В общем, как\где\почём можно без проблем и "лёгким взмахом" определить язык системы?

2. В общем как уже стало понятно, программа мультиязычная(пока три языка). Изначально интерфейс программы на русском. Язык выбирается посредством ComboBox через обработчик OnSelect. В MyProgram.ini в результате выбора создаётся запись в зависимости от выбора. Всё хорошо, всё нормально, но! закавыка вот в чём. При повторном запуске, я не могу правильно сделать, чтобы значения инициализировались тем языком, значение которого было сохранено в .ini. Я могу поставить такую команду в OnCreate
Code
1
Form1->ComboBox1Select(Form1);
но тогда когда мне не нужно выбирать язык, .ini файл всё равно создаётся. В общем я же хочу:
1. Если мне не нужно выбирать язык, чтобы программа при запуске не создавала ini-файл, а только при выборе языка.
2. Чтобы если язык был выбран, при запуске программа была локализирована для той версии языка, который был выбран. Language=1 - болгарский и т.д.

Code
1
2
[Select Language]
Language=1
0 - английский, 1 - болгарский, 2 - русский

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Инициализация значений-----------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   // Если выбор языка был сохранён
   TIniFile *Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"MyProgram.ini");
   ComboBox1->ItemIndex = Ini->ReadInteger("Select Language", "Language", 2);
   Form1->ComboBox1Select(Form1); // С этим создаётся ini даже когда он мне не нужен
...
}
// Выбор языка---------------------------------------------------------------
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
   // Сохранение языка
   TIniFile *Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"MyProgram.ini");
 
   if(ComboBox1->ItemIndex == 0){
     // Сохраняем в MyProgram.ini инфу, что язык английский
     Ini->WriteInteger("Select Language", "Language", ComboBox1->ItemIndex);
     // Закладки и кнопки. Главная
     TabSheet1->Caption = L"General";
     TabSheet2->Caption = L"About";
              ....
    }
   else if (ComboBox1->ItemIndex == 1){
     // Сохраняем в MyProgram.ini инфу, что язык болгарский
     Ini->WriteInteger("Select Language", "Language", ComboBox1->ItemIndex);
     // Закладки и кнопки
     TabSheet1->Caption = L"Главна";
     TabSheet2->Caption = L"За программата";
              ....
    }
   else if (ComboBox1->ItemIndex == 2){
     // Сохраняем в MyProgram.ini инфу, что язык русский
     Ini->WriteInteger("Select Language", "Language", ComboBox1->ItemIndex);
     // Закладки и кнопки. Главная
     TabSheet1->Caption = L"Главная";
     TabSheet2->Caption = L"О программе";
              ....
    }
}
Если есть идеи, подскажите.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2010, 18:31
Ответы с готовыми решениями:

Сохранение настроек в .ini в папке Windows\System32
Доброго времени суток. Сделал свой ScreenSaver. Настройки должны сохраняться в ini-файле в папке вместе с программой. Проблема в том, что...

Применение настроек из ini
Сохраняю настройки шрифта подобным образом: ini.WriteString('Font', 'Name', FontDialog1.Font.Name); ini.WriteString('Font', 'Color',...

Сохранение настроек в INI
Здравствуйте ! Почитал эту тему https://www.cyberforum.ru/cpp-builder/thread757450.html . Все хорошо , но не понял, как мне сделать...

6
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
11.02.2010, 18:48
пункт 2
сори если я туплю...
после работы...
в общем а че если сделать
C++
1
2
[Select Language]
Language=0
0 - никакой
1- английский, 2 - болгарский, 3 - русский
ну и обрабатывать соответственно (ну ComboBox1->ItemIndex-1 == 0 {бла бла бла})
0
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
11.02.2010, 19:24  [ТС]
sh4d°_°ff, Ты немножно непонял. В твоём совете используется файл-ini. Нужно, чтобы если рядом с программой файла-ini нет, то программа запускается как обычно. Это есть. У меня при запуске программы, если ini уже рядом есть, с любым значением, пусть будет 1 - болгария или 0 - английский
Code
1
2
[Select Language]
Language=1
Интерфейс программы не инициализируется по болгарски. Для инициализации нужно приписывать в OnCreate эту строку
Code
1
Form1->ComboBox1Select(Form1);
Но в этом случае, при запуске с отсутствующим ini-файлом, он создаётся, даже если язык не был выбран.
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
11.02.2010, 19:52
решение пункта 2 есть:
дык ты вроде ведь сам сформулировал решение:

если рядом с программой файла-ini нет, то программа запускается как обычно
нууу... а если на onCreate проверку воткнуть? проверку наличия ini файла... типа

C++
1
2
3
4
5
6
if (FileExists(ExtractFilePath(Application->ExeName)+"MyProgram.ini"))
{
 TIniFile *Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"MyProgram.ini");
  ComboBox1->ItemIndex = Ini->ReadInteger("Select Language", "Language", 2);
  Form1->ComboBox1Select(Form1); // С этим создаётся ini даже когда он мне не нужен
}
1
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
11.02.2010, 20:07  [ТС]
sh4d°_°ff, Да, с этим уже порядок.


Остался первый вопрос. Хочу чтобы при запуске прога сама определяла язык системы.

Как определить локализацию Windows ? Например при запуске программы, она должна это определить и переключиться в отображения интерфейса на каком-либо языке. Для русской Windows в русский, для английской Windows в английский, для болгарской Windows в болгарский, для любой другой по стандарту в английский. У меня есть только такая идея. Читать ветку в реестре

Code
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language
Значение ключа(ей)

Code
1
2
InstallLanguage
Default
Если допустим значение равно 419 - русский. Если 409 - английский и т.д. Но я не уверен, что эти значения постоянные, если в случае, когда Windows английская, но установлен пакет локализации. В общем, как\где\почём можно без проблем и "лёгким взмахом" определить язык системы?
0
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
11.02.2010, 20:24
Как узнать, какой язык используется по умолчанию в локали текущего пользователя?

Чтобы узнать, какой язык по умолчанию используется в локали текущего пользователя, воспользуйтесь макросом PRIMARYLANGID и функцией GetUserDefaultLangID следующим образом (данный код определяет, является ли русский язык языком по умолчанию):

C++
1
2
3
4
if (PRIMARYLANGID(GetUserDefaultLangID()) == LANG_RUSSIAN)
  // используется  русский язык
else
  // используется не русский язык
попробуй это.. хз для какого компилятора, но для с++))) нашел в сборнике статей

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Шаг 10 - Информация и языке системы GetLocaleInfo
 
// GetLocale.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
 
void main()
{
    char buffer[255];   
    LCID lc=GetSystemDefaultLCID();
    GetLocaleInfo(lc,LOCALE_SENGLANGUAGE,
        buffer,sizeof(buffer));
    cout << buffer << endl;
}
Для получения информации нам необходимо получить идентифкатор системы. Для этого мы используем GetSystemDefaultLCID. После этого мы можем имея этот идентификатор запросить параметры системы используя GetLocaleInfo: 
 
int GetLocaleInfo(  
    LCID Locale,    // идентификатор системы
    LCTYPE LCType,  //  тип информации
    LPTSTR lpLCData,    //  указатель на буфер
    int cchData //  размер буфера
); 
Типов информации много. Может быть когда-нибудь опишу в подробностях. А в данном случае я выбрал язык в английском написании - LOCALE_SENGLANGUAGE 
 
Запустите и посмотрите. Вот что у меня появляется: 
 
Russian
Press any key to continue
вот еще, но это скорее всего для визуалки
2
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
11.02.2010, 21:12  [ТС]
Цитата Сообщение от sh4d°_°ff Посмотреть сообщение
Чтобы узнать, какой язык по умолчанию используется в локали текущего пользователя, воспользуйтесь макросом PRIMARYLANGID и функцией GetUserDefaultLangID следующим образом (данный код определяет, является ли русский язык языком по умолчанию):
Это работает. Спасибо.

Вопрос можно считать решённым.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2010, 21:12
Помогаю со студенческими работами здесь

Изменение настроек php.ini
Доброго времени. Вопрос - Дают ли возможность менять настройки php.ini платные хостеры? и если да, то на каких видах услуг - VPS,...

Сохранение настроек в ini-файл
Пару дней обучаюсь Delphi , сегодня попробовал написать программу которая сохраняет настройки в конфиг.ини, при закрытии у меня все...

Чтение файла настроек .ini
Необходимо считать данные из файла настроек (например data.ini) и на основе полученного выполнить код. Допустим, в настройках есть два...

INI - Загрузка и сохранение настроек
Добрый день. Подскажите пожалуйста. Существует ли какой либо класс в C++ в Visual Studio для &quot;INI - Загрузка и сохранение...

Сохранение настроек в Ini из ComboBox.
Разобрался с ini файлом, вот только возник вопрос, как сохранить настройки из COmboBox void __fastcall TForm4::FormCreate(TObject...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru