Формат локали в разных системах - C (СИ)
Формулировка задачи:
Англоязычный линукс возвращает "en_US", русскоязычный windows возвращает "Russia_Russian". Как определять локаль в независимости от системы? Перебирать все возможные(ru_RU || Russia_Russian || ...) или есть какой-то ещё выход?
char *currentLocale = setlocale(LC_ALL,"");
Решение задачи: «Формат локали в разных системах»
textual
Листинг программы
#include <stdio.h>
#include <locale.h>
#include <string.h>
#define RU_LINUX_LOCALE "ru_UA"
#define EN_LINUX_LOCALE "en_US"
#define RU_WINDOWS_LOCALE "Russian_Russia"
#define EN_WINDOWS_LOCALE "English_England"
int main() {
char *p = setlocale( LC_ALL, "" );
#ifdef __linux
if ( strstr( p, RU_LINUX_LOCALE ) )
puts( RU_LINUX_LOCALE );
if ( strstr( p, EN_LINUX_LOCALE ) )
puts( EN_LINUX_LOCALE );
#elif defined _WIN32 || defined _WIN64
if ( strstr( p, RU_WINDOWS_LOCALE ) )
puts( RU_WINDOWS_LOCALE );
if ( strstr( p, EN_WINDOWS_LOCALE ) )
puts( EN_WINDOWS_LOCALE );
#endif
puts( p );
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, locale.h, string.h
- Определяются значения переменных RU_LINUX_LOCALE, EN_LINUX_LOCALE, RU_WINDOWS_LOCALE, EN_WINDOWS_LOCALE.
- В функции main() создается указатель p на строку, которая возвращается функцией setlocale( LC_ALL, `` ), где LC_ALL - это константа, определяющая все локальные настройки.
- С помощью условного оператора if проверяется, какая локальная настройка используется в системе.
- Если используется Linux, то с помощью функции strstr() проверяется, содержит ли локальная настройка значение RU_LINUX_LOCALE или EN_LINUX_LOCALE, и выводится соответствующее значение.
- Если используется Windows, то с помощью функции strstr() проверяется, содержит ли локальная настройка значение RU_WINDOWS_LOCALE или EN_WINDOWS_LOCALE, и выводится соответствующее значение.
- Выводится значение переменной p.
- Функция main() возвращает 0, что означает успешное завершение работы программы.