2013-07-31 3 views
1

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

Я использовал старый, но хороший стиль локализации, который является .resx-файлами. У меня есть пример кода ниже.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     if (comboBox1.SelectedItem.ToString().Equals("en-GB")) 
     { 
      Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-GB"); 
      label1.Text= FormLabels.test1; 
      label2.Text = FormLabels.test2; 
     } 
     else if (comboBox1.SelectedItem.ToString().Equals("de-DE")) 
     { 
      Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE"); 
      label1.Text = FormLabels.test1; 
      label2.Text = FormLabels.test2; 
     } 
    } 

Если я позволяю пользователю изменять текст кнопки в файле «FormLabels.en-GB.resx». проект должен быть перекомпилирован для просмотра изменений.

Мне нужно найти решение, в котором пользователь может изменить текст кнопки с помощью перекомпиляции. Как мне это сделать?

+0

https://www.google.com/search?q=satellite+assemblies – Dennis

+0

Может быть, это будет полезно http://www.codeproject.com/Articles/5447/NET-Localization-using-Resource-file – Frank59

+0

Не могли бы вы объяснить, что означает «FormLabels.test1»? Я думаю, что эта часть связана с вашим кодом. Я хочу реализовать это приложение в своем коде. Если вы объясните, я буду рад. – selentoptas

ответ

2

Единственное, что я могу думать об этом, чтобы иметь локализацию во внешних файлах. Создайте XML-файл, как:

Ex: languagesSupported.xml

<Languages> 
     <language name="English" file="en.dat" /> 
     <language name="French" file="fr.dat" /> 
     <language name="Japanese" file="jp.dat" /> 
    </Languages> 

, как это вы можете добавить больше языков позже.

Теперь в каждом файле вы должны сделать что-то вроде:

(например: en.dat)

<Language name="English"> 
     <Localized name="hello" value="Hello"> 
     <Localized name="goodbye" value="Goodbye"> 
    </Language> 

(например: fr.dat)

<Language name="French"> 
     <Localized name="hello" value="Bonjour"> 
     <Localized name="goodbye" value="Au revoir"> 
    </Language> 

в вашем код, вы сделали бы что-то подобное:

private Dictionary<string, Dictionary<string, string>> _localizations = new Dictionary<string, Dictionary<string, string>>(); 

    private string _currentLocalization = "English"; 

    private bool LoadLocalizations() 
    { 
     try 
     { 
      if (File.Exists("languagesSupported.xml") == false) 
      { 
       return false; 
      } 

      XmlDocument xmldoc = new XmlDocument(); 
      xmldoc.Load("languagesSupported.xml"); 
      XmlNodeList nodeList = xmldoc.SelectNodes("languages/language"); 

      if (nodeList.Count > 0) 
      { 
       foreach (XmlNode node in nodeList) 
       { 
        LoadLocalization(node.Attributes["name"].Value, node.Attributes["file"].Value); 
       } 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 

    private bool LoadLocalization(string pLang, string pFile) 
    { 
     try 
     { 
      if (File.Exists(pFile) == false) 
      { 
       return false; 
      } 

      XmlDocument xmldoc = new XmlDocument(); 
      xmldoc.Load(pFile); 
      XmlNodeList nodeList = xmldoc.SelectNodes("language/localized"); 

      _localizations.Add(pLang, new Dictionary<string,string>()); 

      if (nodeList.Count > 0) 
      { 
       foreach (XmlNode node in nodeList) 
       { 
        _localizations[pLang].Add(node.Attributes["name"].Value, node.Attributes["value"].Value); 
       } 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 

    private void SetLocalization() 
    { 
     labelHello.text = _localizations[_currentLocalization]["hello"]; 
     labelGoodbye.text = _localizations[_currentLocalization]["goodbye"]; 
    } 

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

Вы даже можете заполнить свой раскрывающийся список языков, используя ключи от _localizations.

Таким образом, вы сделаете локализацию полностью динамичной.

Если вы действительно хотите использовать CultureInfo, просто сопоставьте культуру с именем языка.

0

ResourceManager работает только со встроенными ресурсами. Вам нужно будет написать ResourceManager самостоятельно.

Вы можете использовать ResXResouceSet (http://msdn.microsoft.com/en-us/library/system.resources.resxresourceset.aspx), а затем создать собственный ResourceManager. Это не так уж сложно. Затем вы можете прочитать файлы resx и добавить культуру перед расширением resx самостоятельно.

Успехов

Смежные вопросы