Страницы

Поиск по вопросам

Показаны сообщения с ярлыком локаль. Показать все сообщения
Показаны сообщения с ярлыком локаль. Показать все сообщения

вторник, 17 марта 2020 г.

Церковнославянская раскладка в Ubuntu

#ubuntu #кодировка #клавиатура #локаль


Необходимо набирать текст на церковнославянском языке. Как мне это сделать?    


Ответы

Ответ 1



Церковно-славянский в LinuxКак установить церковнославянские шрифтыМетоды реализации церковно-славянского письма в компьютерных системахДля разработчиковЦерковнославянский язык в Линуксе

суббота, 7 марта 2020 г.

Не отображается язык

#java #android #локализация #локаль


Проблема следующая. На одних устройствах язык (Телугу) отображается (планшет Prestigio,
samsung 6,  в том числе на эмуляторах Genymotion), на другом устройстве нет (Alcatel
One Touch, android 4.2.2). Причем в последнем устройстве длина невидимого текста определяется,
текст место занимает, в лог (Android Studio) выводится. 

Вывожу поддерживаемые устройством языки следующим образом - 

for (Locale locale : Locale.getAvailableLocales()) {
        Log.i("LOCALE", locale.getLanguage() + "_" + locale.getCountry() + " [" +
locale.getDisplayName() + "]");
    }


Отстуствие языка "te" (Telugu) в этом списке не мешает отображению на экране, кроме
Alcatel.

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

Интересно,можно ли программно определить, что шрифт не отображается, но длину/размер
строки в представлении имеет?
    


Ответы

Ответ 1



Вероятно, стандартный шрифт Алкателей не содержит нужных символов. Попробуйте включить в ваше приложение шрифт, который точно будет работать, и устанавливать его для отдельных представлений someTextView.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/myfont.ttf")); или для всего макета public class FontChangeCrawler { private Typeface typeface; public FontChangeCrawler(Typeface typeface) { this.typeface = typeface; } public FontChangeCrawler(AssetManager assets, String assetsFontFileName) { typeface = Typeface.createFromAsset(assets, assetsFontFileName); } public void replaceFonts(ViewGroup viewTree) { View child; for (int i = 0; i < viewTree.getChildCount(); ++i) { child = viewTree.getChildAt(i); if (child instanceof ViewGroup) { replaceFonts((ViewGroup)child); } else if (child instanceof TextView) { ((TextView) child).setTypeface(typeface); } } } } public class MainActivity extends AppCompatActivity { @Override public void setContentView(View view) { super.setContentView(view); FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "fonts/myfont.otf"); fontChanger.replaceFonts((ViewGroup)this.findViewById(android.R.id.content)); } }

воскресенье, 26 января 2020 г.

Запятые и точки в дробных числах в си при вводе чисел

#c #локаль


Интересно почему сразу заканчивается выполнение программы при попытке ввода дробных
чисел с  точкой, а не с запятой, хотя в самом коде используются точки? Не оставляю
кода потому что считаю это бессмысленно? Кто-то может мне разъяснить этот вопрос?    


Ответы

Ответ 1



На самом деле многие библиотечные функции используют текущую локаль. В частности, от текущей локали зависит, какой разделитель целой и дробной части ожидают увидеть функции. При запуске программа наследует системную локаль, похоже в вашем случае это русская локаль. В качестве демонстрации приведу программу: #include #include #include #include void test(const char* str) { printf("%s => ", str); char* endptr; double num = strtod(str, &endptr); // Checking if whole string parsed if (endptr != str + strlen(str)) { printf("ERROR"); } else { printf("%lf", num); } printf("\n"); } void locale_info() { printf("Current locale: %s\n", setlocale(LC_NUMERIC, NULL)); printf("Current delimiter: '%s'\n", localeconv()->decimal_point); } int main() { const char* dot = "10.5"; const char* comma = "10,5"; setlocale(LC_ALL, "en_US.utf8"); locale_info(); test(dot); test(comma); setlocale(LC_ALL, "ru_RU.utf8"); locale_info(); test(dot); test(comma); } У меня программа выводит: Current locale: en_US.utf8 Current delimiter: '.' 10.5 => 10.500000 10,5 => ERROR Current locale: ru_RU.utf8 Current delimiter: ',' 10.5 => ERROR 10,5 => 10,500000 Видно, что в зависимости от локали, программа по разному интерпретирует одни и те же данные. Чтобы избежать таких неожиданностей, можно при запуске программы устанавливать стандартную локаль для числовых данных: setlocale(LC_NUMERIC, "C");

среда, 22 января 2020 г.

Как узнать язык операционной системы Windows?

#windows #delphi #winapi #локаль


Как программно узнать язык операционной системы Windows (начиная с Windows XP)?

Интересует именно язык системы - то есть язык, на котором Windows общается с пользователем
программы, а не выбранная страна или раскладка клавиатуры и т.п. Условно говоря, надо
узнать на каком языке написано название "My Computer" или "Мой Компьютер" или "Mój
Komputer". Формат полученного обозначения не так важен (ISO или англ.текст или локализованый
текст).

Мысли вслух:
Попробовал несколько вариантов, включая GetLocaleInfo(LOCALE_USER_DEFAULT.., GetSystemDefaultLangID,
GetUserDefaultLangID, но ни один из них не вернул мне локаль моей ОС (англ.), а вернул
Russian. пока что единственная правдоподобная зацепка - hklm\system\controlset001\control\nls\language\Installlanguage,
но тогда непонятно, почему Install Language один (англ.), а Default другой (рус.),
при том что ОС со мной общается на английском.
    


Ответы

Ответ 1



Для относительно новых версий Delphi можно воспользоваться вызовом GetUserDefaultUILanguage из модуля WinAPI.Windows (возвращает значение языка интерфейса, выбранное текущим пользователем): var i: integer <...> i := Lo(GetUserDefaultUILanguage); // нижнего байта достаточно для определения языка, вида надписей на кнопках и т.п. // Это может быть не так для экзотических языков, но с ними я не сталкивался case i of $19: // русский end; Вот список ряда языков, возвращаемых в нижнем байте или же оф. список от Майкрософт Для старых версий Delphi придётся самостоятельно определить GetUserDefaultUILanguage из kernel32.dll, например, так: function GetSystemDefaultUILanguage: integer; stdcall; external 'kernel32.dll'; Поскольку @teran первым указал на функцию, ответ можно оформить, как общий.

четверг, 2 января 2020 г.

Почему нужно переопределять локаль для вывода локализованнах строк (например strftime())?

#python #локализация #datetime #локаль


В соответствии с документацией, strftime() должен возвращать локализованные значения
даты и времени (название месяцев и дней недели и т.д.), однако делает это лишь после
явной установки локали:

>>> locale.getlocale() # Проверим текущую локаль
('ru_RU', 'UTF-8')
>>> d1.strftime('%A')
'Sunday'
>>> locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
'ru_RU.UTF-8'
>>> locale.getlocale()
('ru_RU', 'UTF-8')
>>> d1.strftime('%A')
'Воскресенье'


Почему на русском начинает выводить только после переопределения локали, хотя до
этого она и так была ('ru_RU', 'UTF-8')? Более того, достаточно просто сделать resetlocale:

>>> import locale
>>> locale.getdefaultlocale()
('ru_RU', 'UTF-8')
>>> locale.getlocale()
('ru_RU', 'UTF-8')
>>> d1.strftime('%A')
'Sunday'
>>> locale.resetlocale()
>>> d1.strftime('%A')
'Воскресенье'

    


Ответы

Ответ 1



Все программы на *nix системах (не только python) стартуют, используя C (POSIX) locale до тех пор пока они не вызовут setlocale(LC_ALL, ''), чтобы активировать пользовательскую locale. Если не хотите locale активировать для процесса, то можно использовать библиотеки, которые явно позволяют язык выбрать, такие как PyICU (пример использования)—есть полегче библиотеки, которые могут работать для конкретной задачи, например humanize: >>> import datetime >>> import humanize # $ pip install humanize >>> _ = humanize.i18n.activate('ru_RU') >>> humanize.naturaltime(datetime.datetime.now()) 'сейчас' В: но почему же locale.getlocale() выдаёт ru_RU? Я бы также ожидал, что-нибудь вроде (None, None) вместо ('ru_RU', 'UTF-8') до того как setlocale(LC_ALL, '') вызвано в программе. Из документации: "Returns the current setting for the given locale category" не очевидно, что пользовательские настройки из переменных окружения (LC_*, LANG) читаются, а не текущая локаль по умолчанию ("The POSIX locale is the default global locale at entry to main()") возвращается до вызова setlocale(LC_ALL, ''). locale модуль это тонкая обёртка вокруг соответствующей C функциональности, в частности, поведение может зависеть от платформы. Текущая реализация locale.getlocale() эквивалентна C setlocale(category, NULL), которая запрашивает текущую настройку для локали ("query the current global locale setting"). Почему "the current global locale setting" не равна "the default global locale" до вызова setlocale(LC_ALL, '') я не понимаю. Может дело в слове setting vs. locale, то есть текущая настройка до вызова setlocale(LC_ALL, '') берётся из переменных окружения (LC_*, etc), а текущая локаль до вызова setlocale(LC_ALL, ''), используемая strftime(), является C (как и положено). Но это чистая спекуляция с моей стороны.

пятница, 27 декабря 2019 г.

Как узнать, с какого дня начинается неделя для текущей локали системы?

#c #дата #кроссплатформенность #локаль


Требуется вывести в консоль календарь на месяц, для чего необходимо знать день, с
которого начинается неделя. В С в структуре времени по умолчанию день недели хранится
в формате 0-6, где 0 = воскресенье. Интересует независимость от платформы для данного
приложения. Как корректно получить системную локаль и узнать первый день недели для нее?
Возможно есть сторонняя кроссплатформенная библиотека или же придется делать под
API разных систем?
Сделать нужно на чистом С.    


Ответы

Ответ 1



Узнать название текущей локали - setlocale(LC_ALL,NULL);. Вместо LC_ALL Вам может быть лучше взять LC_TIME. Environment's default locale - setlocale(LC_ALL,""); Параметры текущкй локали - struct lconv *curloc = localeconv();. Подробности в locale.h По идее Вам надо вызвать setlocale(LC_TIME,""); и использовать localtime(), но в реальной жизни проблема в том, что локаль часто новрмально не настроена.

Ответ 2



Вот дурь, честное слово. Я тут провел маленькое исследование и выяснил, что нужно тогда поддерживать возможность указать ЛЮБОЕ начало недели. Например, в некоторых странах неделю начинают с субботы (!). Так сделано у арабов. Но они и пишут своей вязью справа налево, да? А завтра в какой-нибудь Камбодже примут стандарт, что будут считать недели со среды и что тогда делать!? по вопросу - в Си (голом) я не нашел возможности узнать с какого дня начинается неделя, да и нужно ли это действительно? Может проще сделать по-другому? Например, просто занести в конфигурационный файл программы возможность изменения этой опции или автодетект по типу локали (US -> начинаем с ВС, RU -> начинаем с ПН). Я даже табличку соответствий по странам нашел: И самое главное - проверить в какой стране (локали) мы находимся можно через переменную окружения LANG. А ее можно вычитать через extern char * *__environ; Либо использовать ф-цию getenv()

Ответ 3



Очень интересный вопрос, на который, признаться, с ходу ответа не имел. Поиск дал решение для POSIX-систем, основанное на применении фукнции nl_langinfo: пост форума источника, man. Сейчас на работе, вечером попробую проверить на работоспособность.

вторник, 17 декабря 2019 г.

Дата по-русски через setlocale

#php #локаль


setlocale(LC_TIME, "ru_RU.CP1251");
$date = strftime("%d %B, %H:%M",strtotime($row['date']));


Почему-то, если использовать код выше, то вроде все ок, дату выводит, но месяц по-прежнему
выводится по-английски: 26 May, 21:24. Если использовать:

setlocale(LC_TIME, "ru_RU");
$date = strftime("%d %B, %H:%M",strtotime($row['date']));


То дата выводится коряво: 26 јРЩ, 21:24

Как исправить? 
    


Ответы

Ответ 1



Используйте лучше готовую библиотеку или свой класс для этого, который не будет зависеть от локали и настроек сервера. Например вот мое решение, которое использую на всех проектах TimeHelper.php

четверг, 6 июня 2019 г.

Церковнославянская раскладка в Ubuntu

Необходимо набирать текст на церковнославянском языке. Как мне это сделать?


Ответ

Церковно-славянский в LinuxКак установить церковнославянские шрифтыМетоды реализации церковно-славянского письма в компьютерных системахДля разработчиковЦерковнославянский язык в Линуксе

четверг, 23 мая 2019 г.

Не отображается язык

Проблема следующая. На одних устройствах язык (Телугу) отображается (планшет Prestigio, samsung 6, в том числе на эмуляторах Genymotion), на другом устройстве нет (Alcatel One Touch, android 4.2.2). Причем в последнем устройстве длина невидимого текста определяется, текст место занимает, в лог (Android Studio) выводится.
Вывожу поддерживаемые устройством языки следующим образом -
for (Locale locale : Locale.getAvailableLocales()) { Log.i("LOCALE", locale.getLanguage() + "_" + locale.getCountry() + " [" + locale.getDisplayName() + "]"); }
Отстуствие языка "te" (Telugu) в этом списке не мешает отображению на экране, кроме Alcatel.
Как я понимаю проблема может всплыть не только в Alcatel-моделях, хотелось бы разобраться в причинах. В какую сторону глядеть, на что обратить внимание, что еще добавить к вопросу для ясности?
Интересно,можно ли программно определить, что шрифт не отображается, но длину/размер строки в представлении имеет?


Ответ

Вероятно, стандартный шрифт Алкателей не содержит нужных символов. Попробуйте включить в ваше приложение шрифт, который точно будет работать, и устанавливать его для отдельных представлений
someTextView.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/myfont.ttf"));
или для всего макета
public class FontChangeCrawler { private Typeface typeface;
public FontChangeCrawler(Typeface typeface) { this.typeface = typeface; }
public FontChangeCrawler(AssetManager assets, String assetsFontFileName) { typeface = Typeface.createFromAsset(assets, assetsFontFileName); }
public void replaceFonts(ViewGroup viewTree) { View child; for (int i = 0; i < viewTree.getChildCount(); ++i) { child = viewTree.getChildAt(i); if (child instanceof ViewGroup) { replaceFonts((ViewGroup)child); } else if (child instanceof TextView) { ((TextView) child).setTypeface(typeface); } } } }
public class MainActivity extends AppCompatActivity { @Override public void setContentView(View view) { super.setContentView(view);
FontChangeCrawler fontChanger = new FontChangeCrawler(getAssets(), "fonts/myfont.otf"); fontChanger.replaceFonts((ViewGroup)this.findViewById(android.R.id.content)); } }

суббота, 23 марта 2019 г.

Запятые и точки в дробных числах в си при вводе чисел

Интересно почему сразу заканчивается выполнение программы при попытке ввода дробных чисел с точкой, а не с запятой, хотя в самом коде используются точки? Не оставляю кода потому что считаю это бессмысленно? Кто-то может мне разъяснить этот вопрос?


Ответ

На самом деле многие библиотечные функции используют текущую локаль. В частности, от текущей локали зависит, какой разделитель целой и дробной части ожидают увидеть функции. При запуске программа наследует системную локаль, похоже в вашем случае это русская локаль. В качестве демонстрации приведу программу: #include #include #include #include
void test(const char* str) { printf("%s => ", str); char* endptr; double num = strtod(str, &endptr); // Checking if whole string parsed if (endptr != str + strlen(str)) { printf("ERROR"); } else { printf("%lf", num); } printf("
"); }
void locale_info() { printf("Current locale: %s
", setlocale(LC_NUMERIC, NULL)); printf("Current delimiter: '%s'
", localeconv()->decimal_point); }
int main() { const char* dot = "10.5"; const char* comma = "10,5"; setlocale(LC_ALL, "en_US.utf8"); locale_info(); test(dot); test(comma); setlocale(LC_ALL, "ru_RU.utf8"); locale_info(); test(dot); test(comma); } У меня программа выводит: Current locale: en_US.utf8 Current delimiter: '.' 10.5 => 10.500000 10,5 => ERROR Current locale: ru_RU.utf8 Current delimiter: ',' 10.5 => ERROR 10,5 => 10,500000 Видно, что в зависимости от локали, программа по разному интерпретирует одни и те же данные. Чтобы избежать таких неожиданностей, можно при запуске программы устанавливать стандартную локаль для числовых данных: setlocale(LC_NUMERIC, "C");

понедельник, 11 марта 2019 г.

Как узнать язык операционной системы Windows?

Как программно узнать язык операционной системы Windows (начиная с Windows XP)?
Интересует именно язык системы - то есть язык, на котором Windows общается с пользователем программы, а не выбранная страна или раскладка клавиатуры и т.п. Условно говоря, надо узнать на каком языке написано название "My Computer" или "Мой Компьютер" или "Mój Komputer". Формат полученного обозначения не так важен (ISO или англ.текст или локализованый текст).
Мысли вслух: Попробовал несколько вариантов, включая GetLocaleInfo(LOCALE_USER_DEFAULT.., GetSystemDefaultLangID, GetUserDefaultLangID, но ни один из них не вернул мне локаль моей ОС (англ.), а вернул Russian. пока что единственная правдоподобная зацепка - hklm\system\controlset001\control
ls\language\Installlanguage, но тогда непонятно, почему Install Language один (англ.), а Default другой (рус.), при том что ОС со мной общается на английском.


Ответ

Для относительно новых версий Delphi можно воспользоваться вызовом GetUserDefaultUILanguage из модуля WinAPI.Windows (возвращает значение языка интерфейса, выбранное текущим пользователем):
var i: integer <...> i := Lo(GetUserDefaultUILanguage); // нижнего байта достаточно для определения языка, вида надписей на кнопках и т.п. // Это может быть не так для экзотических языков, но с ними я не сталкивался
case i of $19: // русский end;
Вот список ряда языков, возвращаемых в нижнем байте или же оф. список от Майкрософт
Для старых версий Delphi придётся самостоятельно определить GetUserDefaultUILanguage из kernel32.dll, например, так:
function GetSystemDefaultUILanguage: integer; stdcall; external 'kernel32.dll';
Поскольку @teran первым указал на функцию, ответ можно оформить, как общий.

среда, 17 октября 2018 г.

Сортировка в sqlite и буква “Ё”

Имею БД с русскими словами, они должны выводиться по порядку. В БД есть слова которые начинаются на буквы "ё" и "е". Проблема в том, что видимо sqlite считает, что это одна и та же буква и сортировка работает некорректно, например:
дамба дистанция егерь еда ёжик ездок енот жабры
Для запроса слов использую такой код:
Cursor cursor = mDatabase.rawQuery("SELECT word FROM words ORDER BY word COLLATE LOCALIZED", null);
В DBHelper-е указываю локаль:
@Override public void onConfigure(SQLiteDatabase db) { super.onConfigure(db); db.setLocale(new Locale("ru", "RU")); }
Мне нужно, чтобы сортировка происходила согласно русскому алфавиту, т.е, слова начинающиеся с буквы "ё" должны быть после слов на букву "е", а не вперемешку. Как можно исправить сортировку?


Ответ

существует два варианта:
тащить за собой sqlite: http://habrahabr.ru/post/122408/ делать еще колонку с одинаковым регистром и искать/сортировать по ней.
ответ взят из комментария пользователя itvdonsk