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

Многоязыковое приложение


walexw

Вопрос

Хочу сделать приложение многоязычным: русский, английский. французский.
Заметил, что многие приложения из PlayMarket сами понимают какой язык на устройстве.
Как я могу опросить устройство (смартфон, планшет) перед запуском приложения, какой язык выбран в системе.
Есть ли такая возможность в RAD studio?
Спасибо!

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

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

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

1) можно использовать DeviceInfo

2) все зависимости есть в модуле выше

  if TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, IInterface(LocaleService)) then
    DeviceInfo.diLang := LocaleService.GetCurrentLangID;

 

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
  • Модераторы
28 минут назад, walexw сказал:

Хочу сделать приложение многоязычным: русский, английский. французский.
Заметил, что многие приложения из PlayMarket сами понимают какой язык на устройстве.
Как я могу опросить устройство (смартфон, планшет) перед запуском приложения, какой язык выбран в системе.
Есть ли такая возможность в RAD studio?
Спасибо!

Можно использовать возможности Android API, а можно сделать всё самостоятельно, через какой-нибудь ini файл например :)

Пример использования АПИ: Автоматическая смена названия приложения в зависимости от языка системы

Пример нужно немного расширить: добавляем переводы меню и всего, что хотим в strings.xml, после этого, при запуске приложения получаем ресурсы из автоматически выбранного strings-**.xml.

Вот так выглядит функция получения ресурса:

class function TLoadR.LoadRString(const value: String): String;
var
  resourceId: integer;
begin
  resourceId := TAndroidHelper.Activity.getResources.getIdentifier
    (StringToJString(value), StringToJString('string'),
    TAndroidHelper.Activity.getPackageName);
  Result := JStringToString(TAndroidHelper.Activity.getResources.getString(resourceId));
end;

 

Внимание! Не пытайтесь использовать функцию TAndroidHelper.GetResourceID, в ней я обнаружил багу. В след. релизе поправят. Предложенный выше код, полностью рабочий.

 

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

чем плох стандартный TLang? свойство

AutoSelect=True - автоматическое определение языка и StoreInForm=True - хранить в ресурсах

использую TLang для статичных строк и вот такой код для статусов и сообщений:

String LangString( unsigned int code, AnsiString lang )
{
if ( lang == "RU" )
switch( code )
	{
		case 0: return (AnsiString)"Ожидание";
		case 60: return (AnsiString)" не выполнено";
		case 61: return (AnsiString)" выполнено успешно";
	}
else if ( lang == "EN" )
switch( code )
	{
		case 0: return "Waiting";
		case 60: return " not completed";
		case 61: return " completed successfully";
	}
return "";

 

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

попробовал этот пример но столкнулся с проблемой кодировки в Андроид. подставляю в ShowMessage(LangString(0, Lang)); 

Вариант -  

В 9/20/2016 в 09:19, Камышев Александр сказал:

case 0: return (AnsiString)"Ожидание";

выдаёт на экране строку вопросительных знаков.

Вариант -     case 0: return AnsiToUtf8("Ожидание"); выдаёт ромбики. 

как я вижу   ShowMessage(const System::UnicodeString AMessage);  работает с UnicodeString  а Андроид хочет Utf8.

попробовал ShowMessage( AnsiToUtf8(LangString(0, Lang))); 

не помогает...

 

 

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

нету на андроиде Ansi, на Билдере вроде ставится L

case 0: return L"Ожидание";

могу ошибаться конечно

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

конечно нет. поэтому я и вставил AnsiToUtf8 а "L" из другой оперы. меня тут просветили.

кстати это лишнее т.к. "This conversion is automatically done for you when you set _TCHAR mapping to wchar_t". а это уже стоит в настройках студии.

Ссылка на комментарий
  • 0
18 часов назад, chaplin.u@gmail.com сказал:

попробовал этот пример но столкнулся с проблемой кодировки в Андроид. подставляю в ShowMessage(LangString(0, Lang)); 

Вариант -  

выдаёт на экране строку вопросительных знаков.

Вариант -     case 0: return AnsiToUtf8("Ожидание"); выдаёт ромбики. 

как я вижу   ShowMessage(const System::UnicodeString AMessage);  работает с UnicodeString  а Андроид хочет Utf8.

попробовал ShowMessage( AnsiToUtf8(LangString(0, Lang))); 

не помогает...

 

 

На Seattle это работает, не знаю уж как там преобразование в Android API, в Berlin уже нет. Приложение под Андроид оставил в Seattle и больше не заморачивался пока.

Сейчас пишу демон TCP сервера на с++ под CentOs в среде NetBeans, там строки языка Ansi С и стандартные строки std::string из C++. Отображение строк только в логах либо в браузере и проблем с кириллицей нет.

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
1 час назад, ENRGY сказал:

Имхо лучше свой вариант написать на файлах и RTTI. Потом вам захочется iOS и все равно придется делать. 

Если строки в языковых файлах - зачем RTTI, что к чему безопасно runtime приводить?

Почему бы Embarcadero не работать сразу с unicode, стандартно UTF-8(16)? 

RAD Studio работает с исходниками на Ansi, а компилятор не распознает кириллицу в этих исходных файлах, приведение:

case 0: return (AnsiString)"Ожидание";

сделано как попытка объяснить компилятору, что это кириллица.

Правильный подход (имхо опять же) - среде нужно сразу работать с unicode, и не извращаться потом с приведением типов.

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
24 минуты назад, Камышев Александр сказал:

Правильный подход - среде нужно сразу работать с unicode, и не извращаться потом с приведением типов.

Согласен абсолютно. ведь когда я пишу юникод там уже есть код языка.

1 час назад, ENRGY сказал:

 

Имхо лучше свой вариант написать на файлах и RTTI.

 

Захочется. С какого перепугу я взял неRAD Studio ? Они же обещают  мультиплатформу легко и просто..

А что это за RTTI ? Ресурсы как написано в доках iOS не поддерживаются так что делать ?

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

 

Цитата

 

Если строки в языковых файлах - зачем RTTI?

Почему бы Embarcadero не работать сразу с unicode, стандартно UTF-8(16)? 

 

Причем здесь юникод к RTTI? RTTI это низкоуровневый доступ к полям класса. К любым типам.

Сохраняйте строки в отдельном текстовом файле в Utf-8 и забрасывайте их в компоненты при помощи RTTI. http://delphi.chertenok.ru/text/stat21.shtml

Цитата

RAD Studio работает с исходниками на Ansi, а компилятор не распознает кириллицу в этих исходных файлах, приведение:

Полная  ерунда. Хоть на китайском можно писать. Сохраняйте .pas в utf-8 - правая кнопка мыши по редактору > File Format > Utf-8.

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
11 минут назад, chaplin.u@gmail.com сказал:

Ресурсы как написано в доках iOS не поддерживаются так что делать ?

Где это такое написано?

https://community.embarcadero.com/article/articles-tutorials/151-ui/927-deploying-and-accessing-local-files-on-ios-and-android

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0
20 часов назад, Равиль Зарипов (ZuBy) сказал:

на Билдере вроде ставится L


case 0: return L"Ожидание";

как оказалось не все знали что установка   _TCHAR mapping to wchar_t"  должна заменять L. 

Таки подстановка L решила проблему. вот и верь им после этого.

Ссылка на комментарий
  • 0
53 минуты назад, ENRGY сказал:

Причем здесь юникод к RTTI? RTTI это низкоуровневый доступ к полям класса. К любым типам.

Сохраняйте строки в отдельном текстовом файле в Utf-8 и забрасывайте их в компоненты при помощи RTTI. http://delphi.chertenok.ru/text/stat21.shtml

Это все делает TLang стандартный, зачем переписывать доступные стандартные компоненты?

 

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
1 час назад, ENRGY сказал:

Полная  ерунда. Хоть на китайском можно писать. Сохраняйте .pas в utf-8 - правая кнопка мыши по редактору > File Format > Utf-8.

Полная ерунда - весомый довод... Сохранить то utf-8 можно, компилер среды BCCAARM.EXE, the C++ Compiler for Android все равно будет с ними работать как с asci, и также не поймет кириллицу, если ему, как писали выше, если не указать принудительно.

А вот BCC32, the C++ Command-Line Compiler все считает корректно.

Изменено пользователем Камышев Александр
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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