2010-09-08 2 views
2

У меня есть multilanguage application, а клиент хочет отредактировать файлы Resources.resx, как он этого хочет. Я создал SilverLight проект и добавить файлы:Load Resources ".resx" from folder in Silverlight

  1. Resources.resx
  2. Resources.en-US.resx1.
  3. Resources.uk-UA.resx2.

Все они имеют строить действие «Embedded Resource»

Все работает, но эти файлы в XAP поместить его файл. И клиент не может их редактировать.

Мой менеджер ресурсов я получаю так:

private static ResourceManager manager; 
     public static ResourceManager Manager 
     { 
      get 
      { 
       if (manager == null) 
        manager = new ResourceManager("Project.Resources", Assembly.GetExecutingAssembly()); 
       return manager; 
      } 
     } 

Как я могу получить эти ресурсы из некоторой папки, а не строить их XAP-файл ???

+2

Возможно, измените тип ресурса на ресурс вместо встроенного ресурса? –

+1

Тогда у меня есть ошибка: Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что «Infopulse.MSEA.BPSurvey.TypesEditor.Resources.TypesEditorResources.resources» был правильно встроен или подключен к сборке «TypesEditor» во время компиляции или что все необходимые сборочные сборки загружаются и полностью подписаны. – Evgeny

+2

Являются ли эти ресурсы только для локализованных строки, или у них есть другие типы ресурсов в них? –

ответ

3

Поскольку это проблема локализации строки, и вы просто хотите гибкость выбора всего набора локализованного контента, существует несколько способов привязки строк к диспетчеру ресурсов. Большинство из них слишком сложны для желаемого результата:

Учитывая следующее:

  • Большинство решений, которые я видел, требуют обязательного заявления о 80 символов долго для каждой записи. Это не означает, что использование умного конвертера не требует конца.
  • Большинство решений, которые я видел, реализуют каждую строку как свойство уведомления (это кажется огромным накладным капиталом для строк, которые почти никогда не изменяются).
  • Локализация обычно не требует мгновенного обновления (вы всегда можете обновить текущую страницу).

Гораздо более простой подход, чтобы просто разместить свои строки, как пары имя-значение, в глобальном словаре App и ссылаться на них через короткий/простой StaticResource связывания, например,

Text={StaticResource L_MenuHome} 

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

  • Положите ваши языки по умолчанию строки непосредственно в App.xaml (это помогает в разработке, поскольку отсутствующие ключи приводят к исключению).
  • Выдвиньте любой новый язык с вашего сервера с помощью любых удобных средств (XML-файл, XAML-файл, CSV или из базы данных через webservice)
  • Замените словарный запас новыми загруженными данными. Единственное, что вы должны сделать, это убедиться, что ключ уже присутствует, или вы должны добавить запись или установить ее.
  • Обновить текущую страницу (взять их обратно на главную страницу после изменения языка?)

Я не знаю, почему все, кажется, любят очень сложные решения, когда StaticResources сделать работу очень хорошо и с намного меньше усилий. Мы также используем веб-сервис для извлечения набора языковых строк из базы данных, поскольку он обычно меньше 200 КБ, а базы данных гораздо более гибкие для обновлений.

В любом случае, просто пытайтесь вернуть часть здравого смысла в локализацию. Это работает для нас. Не стесняйтесь использовать, игнорировать, предлагать улучшения и т. Д.

Надеюсь, это поможет.

+1

@Hi Tech: Спасибо за идею. В настоящее время я храню все наши строки в локальной изолированной БД (загружаемой с сервера). Единственное, что хочет мой босс, - это записать все языковые строки, которые не переведены, поэтому, когда я работаю с пользовательским интерфейсом как обычно, и когда он делает вызов, чтобы перевести его, если он не найден, это делает не из того, что ему нужна локализация. Я делаю это в настоящее время с конвертером - на каждую строку он вызывает метод, и если он его не маркирует. Можете ли вы придумать какой способ использования статического ресурса и отметить строки, которые не были переведены? Спасибо – Rodney

+1

На самом деле - не могли бы вы рассказать о том, как вы загружаете свои языковые строки в App.xaml? В настоящее время я использую конвертер, который вызывает метод, который ищет строку в моем объекте словаря - проблема заключается в том, что я не могу сказать, был ли он уже преобразован. – Rodney

+1

@Rodney: Мы загружаем локализацию только при запуске (в словарь глобальных приложений). Чтобы настроить нашу базу данных, мы работаем по-другому: для определения того, какие строки существуют для локализации, мы отдельно просматриваем все файлы XAML в нашем проекте и добавляем любые отсутствующие записи в нашу таблицу языков «Dev English». То, что мы называем «Dev English», является нашей отправной точкой (что кодеры добавили в XAML). Мы предполагаем, что настоящий английский будет переведен с «Dev English» бизнес-людьми ... не может доверять кодеру, чтобы знать маркетинговые требования :) –

2

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

Поскольку у вас есть только строки в вашем resx, я бы предложил вам скопировать элементы вашего ресурса в простой текст с некоторым предопределенным форматом и прочитать его оттуда. Дайте мне знать, если вам нужна помощь по каким-либо конкретным деталям реализации.