Локализация Xamarin iOS с использованием .NET.

Я пытаюсь использовать локализацию .NET в переносимой библиотеке классов для проекта Xamarin iOS / Android. Я выполнил следующие шаги:

Как использовать локализацию в C #

И иметь код, который выглядит следующим образом:

string sText = strings.enter_movie_name; Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr"); sText = strings.enter_movie_name; lblEnterMovieName.Text = sText; 

Я также пробовал:

 ResourceManager resman = new ResourceManager(typeof(MyApplication.strings)); string sText = resman.GetString("enter_movie_name", new CultureInfo("fr")); 

Я создал strings.resx с enter_movie_name, равным «Enter movie name:» и strings.fr.resx, равным «Entre la movie name:»

Однако sText всегда заканчивается как «Enter movie name:». Кажется, я не могу получить версию «Entre la movie name:».

Я также видел сообщение в кросс-платформенной локализации, но не смог его обработать. Я также не хочу использовать конкретную версию iOS в Localization на Xamarin.iOS, так как я бы хотел получить мои строки из независимой от платформы библиотеки.

Может ли кто-нибудь указать, где я ошибаюсь?

2 Solutions collect form web for “Локализация Xamarin iOS с использованием .NET.”

Я создал немного уродливого решения, но он работает. В моей переносимой библиотеке классов (PCL) я создал папку под названием «строки» и внутри которой создаются файлы:

  • strings.resx
  • strings_fr.resx
  • strings_ja_JP.resx

Я установил все это как Embedded Resource с помощью специального инструмента как ResXFileCodeGenerator. Это означает, что у меня есть отдельная DLL ресурсов для каждого языка.

В iOS я могу получить локаль, позвонив:

 string sLocale = NSLocale.CurrentLocale.LocaleIdentifier; 

Я бы предположил, что есть эквивалент Android, использующий Locale, но я не знаю, что это такое.

Это дает мне строку типа «ja_JP» или «fr_FR» или «en_GB» (обратите внимание, что они подчеркивают, а не тире). Затем я использую это со следующим статическим классом, который я создал, чтобы получить соответствующий менеджер ресурсов и получить из него строку.

Если задана локаль aa_BB, она сначала ищет strings_aa_BB, затем для strings_aa, затем для строк.

 public static class Localise { private const string STRINGS_ROOT = "MyPCL.strings.strings"; public static string GetString(string sID, string sLocale) { string sResource = STRINGS_ROOT + "_" + sLocale; Type type = Type.GetType(sResource); if (type == null) { if (sLocale.Length > 2) { sResource = STRINGS_ROOT + "_" + sLocale.Substring(0, 2); // Use first two letters of region code type = Type.GetType(sResource); } } if (type == null) { sResource = STRINGS_ROOT; type = Type.GetType(sResource); if (type == null) { System.Diagnostics.Debug.WriteLine("No strings resource file when looking for " + sID + " in " + sLocale); return null; // This shouldn't ever happen in theory } } ResourceManager resman = new ResourceManager(type); return resman.GetString(sID); } } 

Пример того, как это будет использоваться (со ссылкой на приведенный выше код), будет:

 string sText = Localise.GetString("enter_movie_name", sLocale); lblEnterMovieName.Text = sText; 

Существенным недостатком этого является то, что все представления должны будут иметь свой набор текста программно, но у него есть тот потенциал, что переводы могут выполняться один раз, а затем повторно использоваться на многих платформах. Они также остаются отдельно от основного кода в своих собственных DLL и поэтому могут быть перекомпилированы индивидуально, если это необходимо.

Я создал аналогичное решение для принятого ответа, но с использованием txt-файлов вместо Resx и nuget готов к работе: https://github.com/xleon/I18N-Portable . Сообщение в блоге.

Другие улучшения:

  • "anyKey".Translate(); // from anywhere
  • Автоматическое определение текущей культуры
  • Получить список поддерживаемых переводов: List<PortableLanguage> languages = I18N.Current.Languages;
  • Поддержка привязки данных в рамках Mvvm / Xamarin.Forms
  • и т.д
  • Как переключаться между Play / Pause в MPRemoteCommandCenter
  • UICollectionView UseLayoutToLayoutNavigationTransitions с различными источниками данных
  • iOS 7: сохранение отображаемых элементов в области просмотра после вращения UICollectionView
  • iOS 7 - Долгосрочная фоновая задача
  • IOS: AOT раньше времени, что это?
  • Приложение Xamarin падает при запуске на устройстве, отлично работает в симуляторе
  • Xamarin Forms ListView CachingStrategy
  • Форсировать перерисовку Xamarin.Forms View с помощью настраиваемого средства визуализации
  • Как выбрать правильное устройство iPhoneSimulator из Visual Studio? (iPhoneSimulator всегда запускает 3,5-дюймовое устройство)
  • Воспроизведение видео с Xamarin для iOS после последнего обновления
  • Меню контекстного действия Элемент, не работающий в iOS PCL Project
  • Interesting Posts

    Хранение UUID в основных данных

    Остановить jQuery Mobile swipe event double bubbling

    Отменить NKAssetDownload работает, перезагрузка не работает. Любое решение?

    MessengerExtensions: как отправить сообщение посыльным пользователям?

    Как включить lpsolve, c-based библиотеку линейного программирования в моем приложении ios

    Спраймы SKSpriteNode размыты только на реальной машине iPhone 7 Plus

    Получил сообщение «ПРЕДУПРЕЖДЕНИЕ: при нормальных условиях, _fillInQueueWithExtraSpace: ..» и вращение MPMoviePlayer не работают в iPad IOS 5.1

    Инициализация пользовательского объекта iOS Ошибка

    UIBarButtonSystemItemPageCurl в бета-версии iOS 5

    Добавление UILabel в UIToolbar

    Как найти и отобразить символ Юникода в iOS

    в Objective-c, если структура не инициализирована, какое значение возвращает ее член?

    Ошибка UINavigationController на Xcode 9

    xcode 5: Как добавить UUID в профиль обеспечения, управляемый xcode?

    Bordered iOS 8 Buttons Swift

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.