Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Как программно, на C, узнать текущую локализацию ОС?  (Прочитано 2222 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
Доброго времени суток.

Как программно, на C, узнать текущую локализацию ОС?

Спасибо.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
В С++ типа так
[SerializableAttribute]
[ComVisibleAttribute(true)]
public ref class Version sealed : ICloneable,
IComparable, IComparable<Version^>, IEquatable<Version^>

В Си был вызов System, но уже не помню как им пользоваться.

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
В С++ типа так
[SerializableAttribute]
[ComVisibleAttribute(true)]
public ref class Version sealed : ICloneable,
IComparable, IComparable<Version^>, IEquatable<Version^>

В Си был вызов System, но уже не помню как им пользоваться.
Спасибо за ответ, однако мне это ничего не даёт, т.к. я спрашиваю о C, а не о C++. :)

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
функция system определена в stdlib.h

Попробуйте код:

#include <stdlib.h>
 
int main(void)
{
  return system("uname -a");
}

Для эксперимента:
system("clear");
system("ls -la");

В документации system описана.

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
Попробую, спасибо... До этого я пробовал такой вариант:
/* C90
http://pubs.opengroup.org/onlinepubs/009604599/functions/setlocale.html
*/
#include<stdio.h>
#include <locale.h>

int main (int argc, char *argv[]) {

char *c = setlocale(LC_CTYPE, NULL);

if (NULL == c)
printf("Can't get localization.");
else
printf("Current Localization: %s\n", c);

return 0;
}

Результат работы кода:
Цитировать
Current Localization: C

А мне нужно что-то вроде ru-RU, en-US, en-GB и т.п.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
man 7 locale
Извините, я все еще учусь

Оффлайн Ленивый кот

  • Автор темы
  • Участник
  • *
  • Сообщений: 165
    • Просмотр профиля
man 7 locale
Спасибо, но как это использовать в коде C? Я знаю как вызывать функции, подключив нужные заголовки, а в этом случае как? C - это не bash...

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Ленивый кот,
Посмотри код программы locale
Извините, я все еще учусь

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
#include <stdio.h>
#include <locale.h>


int main()
{
    setlocale(LC_ALL, "");
    printf("Your locale is: %s\n", setlocale(LC_CTYPE, NULL));
 
    return 0;
}
Этот код на Маке у меня тоже выдает локаль C, но пробовал на Убунте, там выдает en_US.UTF-8
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн zhevak

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
    • http://zhevak.wordpress.com/
У меня в Ubuntu 10.04.4 выдает:
Your locale is: ru_RU.UTF-8
Всё нормуль, работает!

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Доброго времени суток.

Как программно, на C, узнать текущую локализацию ОС?

Спасибо.
Если брать стандартную библиотеку C, то подойдут функции из <locale.h>.
/* Set and/or return the current locale.  */
extern char *setlocale (int __category, const char *__locale) __THROW;

/* Return the numeric/monetary information for the current locale.  */
extern struct lconv *localeconv (void) __THROW;
В C++ - <locale>, лучше всего справиться на cppreference.com.

С учётом библиотечного дизайна семейства C, у библиотек могут быть свои способы получения локали и самого правильного среди них нет, но в целом все библиотеки слушаются функции setlocale().

"C" - это дефолтная локаль, например можно вызвать setlocale("C") и программа будет переключена на системную локализацию (это будет какая-нибудь ru в русской версии WinXP, а в Linux и семёрочке максимальной/энтерпрайзной можно поменять системную локаль).

Использовать system стоит только в крайних ситуациях, когда нужного нет в стандартной или сторонних библиотеках, да и то в таких случаях лучше уж QProcess каким-нибудь воспользоваться.

 

Страница сгенерирована за 0.045 секунд. Запросов: 25.