2016-06-17 5 views

Antwort

0

es dauerte eine Weile, um die Grenzen von VSTO zu akzeptieren, aber ich codiert eine akzeptable Lösung. Aber zuerst die Begrenzung stieß ich auf

  1. Office-Anwendungen können nicht Kultur im laufenden Betrieb wechseln. Dies wird angezeigt, wenn das Microsoft Office-Sprachtool verwendet, um die Benutzerschnittstelle Sprache zu ändern.
    Sie erhalten immer eine Nachricht, dass die Änderung nicht stattfinden kann, bis die Office-Anwendungen geschlossen und neu gestartet werden. (Source)

    Ton vernünftig, zumindest habe ich gefunden, nicht Eintrag, was nicht einverstanden ist und alle MSDN Einträge fand ich erwähnen lokale vor der Inbetriebnahme der AddIn Einstellung nur

  2. Es scheint, es isn‘ t irgendeine Sammlung von Ribbon-Objekten. Das bedeutet, dass Sie nicht alle Bänder durchlaufen können, wenn Sie mehrere haben (je nach Betriebssystem oder Situation). Da Sie mehrere Bänder nicht verwenden können simultaneously sowieso (aber man kann chose which to display at run time) Es könnte von etwas für Outlook Add-Ins nach this MSDN entry es geschlossen.

  3. Sie können nicht die Sprache eines einzelnen Register ändern sie alle enthalten Kontrollen machen aktualisieren. Sie müssen es nacheinander auf jeder Ebene tun Tab-> Group-> Items

Endlich mein Code. Ich habe zwei getrennte Klassen, eine für das Relocalisieren aller offenen Formulare und eine für das AddIn. Beide durchlaufen im Grunde alle Objekte in den Formularen und allen Registerkarten eines bestimmten Menübands und ändern die Sprachressource für jeden von ihnen. Es funktioniert überraschend gut nach all den Zwängen, die ich gefunden habe. Das einzige, was ich nicht verstehe, ist, warum muss ich den Verweis auf das Farbband an die Klasse cs_RuntimeLocalizer4OfficeUI als Microsoft.Office.Tools.Ribbon.RibbonBase Typ weitergeben?

BAND

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); 
        } 
       } 
      } 

     } 
    } 
} 

CLASS 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); 
      } 
     } 
    } 
} 

Im Fall, dass Sie die l anguage according the OS or Office language setzen, wie hier beschrieben Sie in den Local IDs table

Einen anderen Ansatz könnte die Arbeit mit mehrer addins interessiert kann. Einer von diesen tut nur load/unload addins, die ihre Sprache ändern müssen.

Verwandte Themen