Перейти к содержанию
Fire Monkey от А до Я
  • 0

Кодировки языков в Android


Alex7wrt

Вопрос

Всем здравствуйте.

Есть вопрос касательно кодировки языков интерфейса в среде Android

Посредством следующего кода определяю язык интерфейса:

if TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, IInterface(ls)) 
then lang:=ls.GetCurrentLangID;

Для большинства языков возвращает стандартное ISO значение. Однако для испанского и португальского вместо es и pt возвращает соответственно sp и po. Версия Android 4.0.3.  Собственно вопрос: так и есть для всех версий Android или это отклонения конкретной версии?

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Вы уверены, что вам возвращаются коды именно языков?

SP и PO - это коды стран, по стандарту FIPS 10-4, полный список вы найдёте тут List of FIPS country codes

Сводная таблица с кодами языков по различным стандартам Коды языков

 

АП.1 Справка FMX.Platform.IFMXLocaleService.GetCurrentLangID. Я не уверен до конца, но похоже этот метод возвращает значение именно по стандарту FIPS 10-4.

 

АП.2 (23:28) Смотрю исходники...

 

АП.3 (23:30) В исходниках используется метод getISO3Language, а значит значение должно быть по стандарту ISO 639-2/T, в этом стандарте все значения трёх символьные, так что получение "sp и po" как минимум странно... Надо дальше копать...

 

АП.4 Единственный совет, пока попробуйте использовать другие методы класса Locale

Изменено пользователем Andrey Yefimov
ап.4
Ссылка на комментарий
  • 0

Спасибо за ответ. 
Может быть действительно коды стран.

Просто на устройстве всего один вариант испанского, а вот португальских два - Португалии и Бразилии.

И спасибо за ссылку!

Ссылка на комментарий
  • 0

АП.4 Единственный совет, пока попробуйте использовать другие методы класса Locale

Пытаюсь воспользоваться методом getDefault из класса Locale, но не могу найти соответствующий TJActivity.JavaClass для этого.

function GetLang: string;
var Langs: JObject;
    Lang: JLocale;
begin
    Langs:=SharedActivity.getSystemService(TJActivity.JavaClass.????????????);
    Lang:=TJLocale.Wrap((Langs as ILocalObject).GetObjectID);
    Result:=Jstringtostring(Lang.getDisplayLanguage(TJlocale.JavaClass.getDefault));
end;

Кто-нибудь знает, какой сервис нужно использовать для языковых настроек? Пытался использовать Location_Service, но он для определения координат.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0
  • Модераторы

Вы хоть справку читайте...

Если требуется использование сервиса, то об этом явно указывается в справке, в противном случае вы можете обращаться к классу напрямую.

 

Вот что я упустил вчера в исходниках:

Полученное значение специально обрезается до 2-х симоволов.

 

Исходный код:

function TPlatformAndroid.GetCurrentLangID: string;
var
  Locale: JLocale;
begin
  Locale := TJLocale.JavaClass.getDefault;
  Result := JStringToString(Locale.getISO3Language);
  if Length(Result) > 2 then
    Delete(Result, 3, MaxInt);
end;

По аналогии используйте другие методы, а также можете удалить строчки, которые удаляют всё после второго символа.

Ссылка на комментарий
  • 0

Еще под андроид вот это можно использовать:

 

System.SysUtils.SysLocale.DefaultLCID  // для Рус=ru_RU

Спасибо! Отличный и компактный метод.

 

 

Вы хоть справку читайте...

Если требуется использование сервиса, то об этом явно указывается в справке, в противном случае вы можете обращаться к классу напрямую.

 

Вот что я упустил вчера в исходниках:

Полученное значение специально обрезается до 2-х симоволов.

 

Исходный код:

function TPlatformAndroid.GetCurrentLangID: string;
var
  Locale: JLocale;
begin
  Locale := TJLocale.JavaClass.getDefault;
  Result := JStringToString(Locale.getISO3Language);
  if Length(Result) > 2 then
    Delete(Result, 3, MaxInt);
end;

По аналогии используйте другие методы, а также можете удалить строчки, которые удаляют всё после второго символа.

 

Спасибо! 

Изменено пользователем Alex7wrt
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...