Локализация для мобильной кросс-платформы с использованием xamarin и проблема с iOS
У меня есть проект в Xamarin, который нацелен на Android, iOS и Windows Phone. Я использовал core (библиотека PCL) для обмена общим кодом между различными платформами. Я добавил файлы ресурсов (ресурс .net).Resx в моей основной библиотеке и прочитал специфическую для культуры строку, которую я использовал в следующем фрагменте кода в одном из моих ViewModel:
public string GetString()
{
// CommonResources is the name of my resource file
ResourceManager resManager = new ResourceManager(typeof(CommonResources));
return resManager.GetString("LoginLabel",CultureInfo.CurrentCulture);
}
"LoginLabel" - это мой ключ ресурса, и его значение - "Вход" (на английском языке) и "inloggen" на голландском языке.
Я создал два файла ресурсов CommonResources для английского и голландского в моем проекте PCL.
CommonResources.resx
CommonResources.nl-NL.resx
в Android-телефоне, iOS и Windows-телефоне я устанавливаю культуру следующим образом:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("nl-NL");
Это отлично подходит для Android и телефона с Windows.
Но для iOS он не работает. Он всегда возвращает строку ресурса из английского файла. Культура правильно настроена и отображается в режиме отладки. но каким-то образом он не может загрузить строку ресурса из ресурса голландского языка.
Итак, вопрос в том, можно ли локализовать строку (.Net) с помощью PCL для всей платформы?
у кого есть идея?
Спасибо заранее.
Ответы
Ответ 1
Для локализации на наших проектах Xamarin я использовал многоязычный набор инструментов для приложений (подробнее здесь) из шаблонов Microsoft и T4, чтобы преобразовать вывод из инструментарий для использования в форматах для Android и iOS.
Этот учебник имеет фантастический обзор процесса и основан на этот проект.
Ответ 2
Или:
- Фактически вы не устанавливаете CurrentCulture на iOS.
- Вы устанавливаете CurrentCulture на поток A и извлекаете его в поток B.
Попробуйте следующее:
public string GetString()
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("nl-NL");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("nl-NL");
// CommonResources is the name of my resource file
ResourceManager resManager = new ResourceManager(typeof(CommonResources));
return resManager.GetString("LoginLabel",CultureInfo.CurrentCulture);
}
Ответ 3
Проверяете ли вы его на реальном устройстве? В симуляторе невозможно изменить культуру. У меня была аналогичная проблема с моими языковыми файлами.