Локализация Silverlight

Какие есть варианты перевода приложения silverlight 5 (Prism + MEF)? Если возможно, я бы хотел:

  • нет файлов resx (мне не нравится, как они управляются)
  • скорее, извлекать, а затем переводить строку xaml (я думаю, что был инструмент от Microsoft, который пометил все узлы XAML пользовательским атрибутом и извлек строки)
  • иметь переводы во внешних сборках (в Prism они могут быть модулями) и загружать их при необходимости
  • изменить язык во время выполнения

Я открыт для предложений и лучших практик по этой теме.

edit: LocBaml - это то, о чем я говорил выше, но похоже, что он недоступен для Silverlight

2 ответа

Я знаю, что это получит ряд традиционных ответов, но я также хотел бы выдвинуть что-то совершенно оригинальное, что мы пытались (и преуспели) делать сами для более эффективной локализации Silverlight:

Локализация проектов Silverlight после завершения

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

Строки локализации приходят из базы данных сервера с помощью простого вызова служб RIA. Возвращенные записи являются простыми парами ключ / значение для выбранного языка.

Этот метод также не имеет (довольно больших) накладных расходов по сравнению с традиционными методами привязки, которые вы увидите много. Мы загружаем только выбранные языковые строки при запуске приложения. Это также потенциально позволяет отправлять правки / исправления обратно на сервер (если вы можете нести накладные расходы на редактор в приложении... мы сделали это, но это была большая работа).

PS Мы использовали PRISM, но он работает также в любом приложении Silverlight, так как нет никаких зависимостей (например, от Unity и т. Д.).

PPS. Когда я вернусь домой сегодня вечером, я выложу несколько фрагментов кода для этой системы.

(Resx такой "прошлый век")

Мое текущее решение использует DataBinding для свойств, которые вы хотите локализовать (т.е. TextBox"s Text, Button"s Content, Всплывающие подсказки и т. Д.) В глобально доступную коллекцию строк, другими словами, Singleton. В моем случае, так как я использую MVVM Light, у меня есть LocalizedStringCollection выставлено ViewModelLocator,

Эта коллекция загружается из файла XLIFF (см. https://en.wikipedia.org/wiki/Xliff) в Dictionary<string, string> это член моей коллекции.

Вот ключевые части коллекции, чтобы выставить строки.

/// <summary>
/// A Singleton bindeable collection of localized strings.
/// </summary>
public class LocalizedStringCollection : ObservableObject, INotifyCollectionChanged
{
    private Dictionary<string, string> _items;
    /// <summary>
    /// The content of the collection.
    /// </summary>
    public Dictionary<string, string> Items
    {
        get { return _items; }
        private set
        {
            _items = value;
            RaisePropertyChanged();
            if (CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }

    /// <summary>
    /// Convenience accessor, most likely entry point.
    /// </summary>
    /// <param name="key">A localized string name</param>
    /// <returns>The localized version if found, an error string else (ErrorValue in DEBUG mode, the key in RELEASE)</returns>
    public string this[string key]
    {
        get
        {
            Contract.Requires(key != null);
            Contract.Ensures(Contract.Result<string>() != null);

            string value;
            if (Items.TryGetValue(key, out value))
                return value ?? String.Empty;

#if DEBUG
            return ErrorValue;
#else
            return key;
#endif
        }
    }
}

Разбор XLIFF тривиален с использованием встроенной поддержки XML.

А вот примеры использования XAML (могут быть более или менее подробными в зависимости от используемого синтаксиса):

<TextBlock Text="{Binding LocalizedStrings[login_label], Source={StaticResource Locator}}" />

<Button ToolTipService.ToolTip="{Binding LocalizedStrings[delete_content_button_tip], Source={StaticResource Locator}}" />

Надеюсь это поможет:)

Я мог бы сделать статью об этом (с полным источником), если люди заинтересованы.

Другие вопросы по тегам