2016-06-17 11 views
0

私は、Windowsフォームのローカライズを変更することに関していくつかのスレッドを見つけましたが、Excelのリボンやその他のUI要素に対して同じことをすることについては何もしていません。 My.Application.SetCultureは私のVS 2013で使用できません(理由はわかりません)。vsto:c#Excel UIオブジェクトのローカライズを変更します。リボン、実行時に

  1. Windwos Form: Localization at runtime
  2. Setting CurrentCulture in VSTO Addin
  3. Windwos Form: Proper way to change language at runtime

答えて

0

それはVSTOの境界を受け入れるように私にしばらく時間がかかったが、私は許容可能な回避策をコード化されました。 は、しかし、最初の制限は、私は、実行中の文化を変更することはできません

  1. Officeアプリケーションに出くわしました。これは、 がMicrosoft Office言語ツールを使用してユーザーインターフェイス 言語を変更した場合に表示されます。
    Officeアプリケーションが閉じられて再開されるまで、変更が行われないことが常に通知されます。 (Source

    合理的なサウンド、そこにISN思えるだけ

  2. 少なくとも私は何が同意しない任意のエントリと私はアドインの起動前ローカルを設定言及したすべてのMSDNエントリを発見していませんリボンオブジェクトのコレクション。つまり、複数のリボンがある場合(OSや状況に応じて)、すべてのリボンを繰り返すことはできません。とにかく複数のリボンを使用することはできませんので(chose which to display at run timethis MSDN entryによると、Outlook AddInsには何か問題がある可能性があります。

  3. 単一のタブの言語を変更して、すべてのコントロールを更新することはできません。各レイヤーで1つずつ行う必要があります。タブ - >グループ - >アイテム

最後に私のコードです。私は2つの別々のクラスを持っています.1つは開いているフォームを再ローカライズし、もう1つはAddInのクラスです。両方とも基本的にフォーム内のすべてのオブジェクトと特定のリボンのすべてのタブをループし、それぞれの言語リソースを変更します。 私が遭遇したすべての制約の後に、それは驚くほどうまく機能します。私が理解できない唯一のことは、cs_RuntimeLocalizer4OfficeUIとしてMicrosoft.Office.Tools.Ribbon.RibbonBaseタイプのリボンへの参照を渡さなければならない理由は何ですか?

RIBBON

private void Bt_LocalDE_Click(object sender, ToolsRibbon.RibbonControlEventArgs e) 
     { 
      changeUICulture("de-DE"); 
     } 

     private void Bt_LocalEN_Click(object sender, ToolsRibbon.RibbonControlEventArgs e) 
     { 
      changeUICulture("en-GB"); 
     } 

     private void changeUICulture(string cultureCode)// (Control parent, CultureInfo culture)  //https://stackoverflow.com/questions/11711426/proper-way-to-change-language-at-runtime 
     { 
      cs_RuntimeLocalizer4OfficeUI.ChangeCulture(this, cultureCode); 
      foreach (WinForms.Form OpenForm in WinForms.Application.OpenForms) //based on https://hashfactor.wordpress.com/2009/01/28/c-check-if-a-form-is-already-opened/ 
      { 
       cs_RuntimeLocalizer4Forms.ChangeCulture(OpenForm, cultureCode); 
      } 
     } 

    } 

CLASS cs_RuntimeLocalizer4OfficeUI

using OToolsRibbon = Microsoft.Office.Tools.Ribbon; 
using System.Globalization; 
using System.Threading; 
using System.ComponentModel; 

using SysDiag = System.Diagnostics; 

namespace Pro_Wunderkiste4Excel 
{ 
    static class cs_RuntimeLocalizer4OfficeUI //based on https://stackoverflow.com/questions/6980888/localization-at-runtime since relocalization after startup is not possible according to https://www.gittprogram.com/question/1159277_cultureinfo-currentculture.html 
    { 
     public static void ChangeCulture(OToolsRibbon.RibbonBase ri_Ribbon, string cultureCode) 
     { 
      CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode); //http://www.csharp-examples.net/culture-names/ 
      Thread.CurrentThread.CurrentUICulture = culture; 
      ComponentResourceManager resources = new ComponentResourceManager(ri_Ribbon.GetType()); 

      foreach (OToolsRibbon.RibbonTab ri_Tab in ri_Ribbon.Tabs) //based on http://www.devcomponents.com/kb2/?p=696 
      { 
       resources.ApplyResources(ri_Tab, ri_Tab.Name, culture); 
       foreach (OToolsRibbon.RibbonGroup ri_TabGroups in ri_Tab.Groups) //based on https://stackoverflow.com/questions/7824125/better-way-to-programmatically-lock-disable-multiple-ui-controls-on-ribbon-bar 
       { 
        resources.ApplyResources(ri_TabGroups, ri_TabGroups.Name, culture); 
        foreach (OToolsRibbon.RibbonControl ri_TabGroupsCtrl in ri_TabGroups.Items) 
        { 
         SysDiag.Debug.Print(ri_TabGroupsCtrl.Name); 
         resources.ApplyResources(ri_TabGroupsCtrl, ri_TabGroupsCtrl.Name, culture); 
        } 
       } 
      } 

     } 
    } 
} 

クラスcs_RuntimeLocalizer4Forms

using System.Windows.Forms; 
using System.Globalization; 
using System.Threading; 
using System.ComponentModel; 

namespace Pro_Wunderkiste4Excel 
{ 
    static class cs_RuntimeLocalizer4Forms //based on https://stackoverflow.com/questions/6980888/localization-at-runtime and https://stackoverflow.com/questions/3558406/how-to-change-language-at-runtime-without-layout-troubles 
    { 

     public static void ChangeCulture(Form frm, string cultureCode) 
     { 
      CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode); //http://www.csharp-examples.net/culture-names/ 

      Thread.CurrentThread.CurrentUICulture = culture; 

      ComponentResourceManager resources = new ComponentResourceManager(frm.GetType()); 

      ApplyResourceToControl(resources, frm, culture); 
      resources.ApplyResources(frm, "$this", culture); 
     } 

     private static void ApplyResourceToControl(ComponentResourceManager res, Control control, CultureInfo lang) 
     { 
      if (control.GetType() == typeof(MenuStrip)) // See if this is a menuStrip 
      { 
       MenuStrip strip = (MenuStrip)control; 

       ApplyResourceToToolStripItemCollection(strip.Items, res, lang); 
      } 

      foreach (Control c in control.Controls) // Apply to all sub-controls 
      { 
       ApplyResourceToControl(res, c, lang); 
       res.ApplyResources(c, c.Name, lang); 
      } 

      // Apply to self 
      res.ApplyResources(control, control.Name, lang); 
     } 

     private static void ApplyResourceToToolStripItemCollection(ToolStripItemCollection col, ComponentResourceManager res, CultureInfo lang) 
     { 
      for (int i = 0; i < col.Count; i++)  // Apply to all sub items 
      { 
       ToolStripItem item = (ToolStripMenuItem)col[i]; 

       if (item.GetType() == typeof(ToolStripMenuItem)) 
       { 
        ToolStripMenuItem menuitem = (ToolStripMenuItem)item; 
        ApplyResourceToToolStripItemCollection(menuitem.DropDownItems, res, lang); 
       } 

       res.ApplyResources(item, item.Name, lang); 
      } 
     } 
    } 
} 

は、ケースであなたがLocal IDs table

で複数のアドインで作業する別のアプローチのかもしれないが興味があり、ここで説明したようリットルanguage according the OS or Office languageを設定したいです。これらのうちの1つは、言語を変更する必要があるload/unload addinsです。

関連する問題