Erstellen von Lösungen, die mehrere Sprachen unterstützen
Veröffentlicht: November 2016
Gilt für: Dynamics CRM 2015
Microsoft Dynamics CRM 2015 und Microsoft Dynamics CRM Online 2015-Update unterstützt mehrere Sprachen. Wenn Sie die Lösung für Organisationen installieren möchten, die verschiedene Ausgangssprachen enthalten oder die mehrere Sprachen bereitstellen, berücksichtigen Sie diese Option, wenn Sie Ihre Lösung planen. Die folgende Tabelle enthält Taktiken für die Verwendung mit Lösungskomponenten, um sie in einer Lösung einzuschließen, die mehrere Sprachen unterstützt.
Taktik |
Lösungskomponententyp |
---|---|
Entwickleroption |
Webressourcen |
Eingebettete Beschriftungen |
Anwendungsnavigations (Siteübersicht) |
Importieren und Exportieren von Übersetzungen |
Attribute |
Lokalisierung in den Ausgangssprachenzeichenfolgen |
Vertragsvorlagen |
Lokalisierung nicht erforderlich |
SDK-Nachrichtenverarbeitungsschritte |
Separate Komponente für jede Sprache |
Artikelvorlagen |
Verwenden von XML-Webressourcen als Sprachenressourcen |
Plug-In-Assemblys |
Die folgenden Abschnitte stellen weitere Details für jede Taktik bereit.
Entwickleroption
Webressourcen haben ein LanguageCode-Attribut, das in der Benutzeroberfläche festgelegt werden kann, aber dieser Wert wird nicht von der Anwendung verwendet. Da Webressourcen URL adressierbar sind, greifen Sie in der Regel auf eine Webressource per Name zu, anstatt verfügbare Webressourcen mit LanguageCode als Kriterium abzufragen. Daher ist LanguageCode von eingeschränktem Wert. Das häufigere Szenario ist, dass Sie die entsprechende Sprache anhand Kontext erkennen müssen, in dem die Webressource angezeigt wird. Für Webressourcen bietet das Kontextobjekt Zugriff auf die Funktionen d7d0b052-abca-4f81-9b86-0b9dc5e62a66#BKMK_getOrgLcid und d7d0b052-abca-4f81-9b86-0b9dc5e62a66#BKMK_getUserLcid. Beide Funktionen geben einen ganzzahligen Wert zurück, der den Werten für die Gebietsschema-ID (LCID) entspricht.Gültige Gebietsschema-ID-Werte finden Sie unter Gebietsschema-ID-Diagramm (LCID).
Für Webressourcen, die Text in der Benutzeroberfläche anzeigen, können Sie alle Methoden verwenden, um zu verwalten, wie Text und Layout die Spracheinstellungen des Benutzers unterstützen. Die bestimmte Implementierung hängt vom Typ der Webressource ab.
HTML-Webressourcen
Eine Option ist das Erstellen von separaten lokalisierten Webressourcen, die je nach übernommenem Namen variieren. Beispielsweise verfügen Sie unter Umständen über eine Webressource namens new_/my_solution/1033/content.htm, die Englisch unterstützt, und eine namens new_/my_solution/1041/content.htm, die Japanisch unterstützt. Informationen zu Sprachen, die von rechts nach links laufen, finden Sie unter Anleitung: Anzeigen von Rechts-nach-links-Text mithilfe von HTML-Tags für Globalisierung.
Wenn Sie in der Lage sein möchten, den Benutzeroberflächentext auf Basis einer Benutzersprache dynamisch festzulegen, können Sie alle in einem Objekt lokalisierten Zeichenfolgenwerte, die über eine Skriptwebressourcendatei definiert werden, speichern. Durch die Spracheinstellung des Benutzers können Sie die Benutzeroberflächen-Textelemente mithilfe von Zeichenfolgen festlegen, die beim Laden der Seite im Objekt gespeichert werden. Das folgende JavaScript-Codebeispiel zeigt eine Methode zum Festlegen lokalisierter Zeichenfolgen.
var userLcid = 1033;
var localizedStrings = {
ErrorMessage: {
_1033: "There was an error completing this action. Please try again.",
_1041: "このアクションを完了、エラーが発生しました。もう一度実行してください。",
_1031: "Es ist ein Fehler aufgetreten, der Abschluss dieser Aktion. Bitte versuchen Sie es erneut.",
_1036: "Il y avait une erreur complétant cette action. Veuillez essayer à nouveau.",
_1034: "Hubo un error al completar esta acción. Vuelva a intentarlo.",
_1049: "Произошла ошибка, выполнение этого действия. Пожалуйста, попробуйте снова."
},
Welcome: {
_1033: "Welcome",
_1041: "ようこそ",
_1031: "Willkommen",
_1036: "Bienvenue",
_1034: "Bienvenido",
_1049: "Добро пожаловать"
}
};
var LocalizedErrorMessage = localizedStrings.ErrorMessage["_" + userLcid];
var LocalizedWelcomeMessage = localizedStrings.Welcome["_" + userLcid];
Silverlight-Webressourcen
Silverlight-Anwendungen können geschrieben werden, um lokalisierte Sprachenressourcen zu unterstützen.Weitere Informationen:Lokalisieren von Silverlight-basierten Anwendungen.
Die folgende Klasse bietet Zugriff auf die Spracheinstellung des Benutzers basierend auf dem Kontext, in dem die Silverlight-Webressource dargestellt wird. Diese Klasse unterstützt, Englisch (USA), Arabisch, Hebräisch, Deutsch und Japanisch. Sie muss für die einzelnen Sprachen geändert werden, die über die Webressource Silverlight unterstützt werden.
public static class Localization
{
// The locale ID.
public static int LCID { get; set; }
// Create a dictionary of right-to-left language codes (Hebrew and Arabic).
private static Dictionary<int, bool> _rightToLeftLanguages =
new Dictionary<int, bool>
{
{ 1025, true },
{ 1037, true },
};
private static Dictionary<int, String> _lcidToCultureNameMap =
new Dictionary<int, String>
{
{ 1025, "ar-SA" },
{ 1031, "de-DE" },
{ 1033, "en-US" },
{ 1037, "he-IL" },
{ 1041, "ja-JP" }
};
public static void InitializeCulture()
{
// Get the user's LCID from the page's context to determine what language to
// display.
dynamic window = HtmlPage.Window;
//Get the user's language code from the context.
try
{
//If the containing window is a CRM form
LCID = Convert.ToInt32(window.Xrm.Page.context.getUserLcid());
// For testing, comment the line above and uncomment one of the lines below
//representing a user language.
//LCID = 1033; //English
//LCID = 1041; //Japanese
//LCID = 1031; //German
//LCID = 1037; //Hebrew - a right-to-left language.
//LCID = 1025; //Arabic - a right-to-left language.
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)
{
try
{
//If the containing window is a CRM web resource with
//the WebResources/ClientGlobalContext.js.aspx page linked
LCID = Convert.ToInt32(window.GetGlobalContext().getUserLcid());
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException)
{
LCID = 1033; //Setting a default for design time when the context
//object is not present and one of the sample languages are not set.
}
}
// Sets the culture of the thread to the appropriate culture, based on what
// LCID was retrieved.
if (_lcidToCultureNameMap.ContainsKey(LCID))
{
var culture = new CultureInfo(_lcidToCultureNameMap[LCID]);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
}
public static FlowDirection GetFlowDirection()
{
if (_rightToLeftLanguages.ContainsKey(LCID))
{
return FlowDirection.RightToLeft;
}
return FlowDirection.LeftToRight;
}
}
Informationen zu Sprachen, die von rechts nach links gelesen werden müssen, finden Sie unter FrameworkElement.FlowDirections-Eigenschaft.
XML-Webressourcen
Während XML-Webressourcen gewöhnlich nicht für die Benutzer angezeigt werden, können sie nützlich sein, um lokalisierte Zeichenfolgen als Ressourcen für andere Lösungskomponenten zu speichern, wie in Verwenden von XML-Webressourcen als Sprachenressourcen beschrieben wird.
Eingebettete Beschriftungen
Jede der Lösungskomponenten, die diese Taktik verwenden, erfordert, dass jeder lokalisierte Text in der Lösungskomponente enthalten ist.
Menübänder
Wenn ein Language Pack installiert ist, zeigt das Menüband automatisch lokalisierten Text für den gesamten Standardtext im Menüband an. Systembeschriftungen werden in einem ResourceId-Attribut definiert, das nur für den internen Gebrauch ist. Wenn Sie einen eigenen Text hinzufügen, sollten Sie das <LocLabels> (RibbonDiffXml)-Element verwenden, um lokalisierten Text für Sprachen bereitzustellen, die Sie unterstützen.Weitere Informationen:Verwenden lokalisierten Bezeichnungen in Menübändern
SiteMap
Wenn ein Language Pack installiert ist, zeigt der Standardtext in der Anwendungsnavigationsleiste automatisch lokalisierten Text an. Wenn Sie den Standardtext überschreiben oder einen eigenen Text bereitstellen möchten, verwenden Sie das <Titles> (SiteMap)-Element. Das Titles-Element sollte ein <Title> (SiteMap)-Element mit lokalisiertem Text für alle Sprachen enthalten, die Ihre Lösung unterstützt. Wenn ein Title-Element für die bevorzugte Sprache des Benutzers nicht verfügbar ist, wird der Titel, der der Organisationsausgangssprache entspricht, angezeigt.
Das <SubArea> (SiteMap)-Element ermöglicht das Übergeben der Spracheinstellung des Benutzers mithilfe des userlcid-Parameters, sodass Inhalt, der das Ziel des SubArea.Url-Attributs ist, die Spracheinstellung des Benutzers berücksichtigen und entsprechend anpassen kann.Weitere Informationen:Übergeben von Parametern an eine URL mithilfe von SiteMap
Importieren und Exportieren von Übersetzungen
Lokalisierbare Beschriftungen für die Lösungskomponenten in der folgenden Tabelle können für die Lokalisierung exportiert werden.
Entitäten |
Attribute |
Beziehungen |
Globaler Optionssatz |
Entitätsmeldungen |
Entitätsformulare |
Entitätsansichten (SavedQuery) |
Diagramme |
Dashboards |
Übersetzen von Beschriftungen und Anzeigezeichenfolgen
Sie können Anpassungen nur in der Anwendung ausführen, indem Sie die Ausgangssprache verwenden. Wenn Sie für diese Anpassungen lokalisierte Bezeichnungen und Anzeigezeichenfolgen zur Verfügung stellen möchten, müssen Sie den Text der Bezeichnungen exportieren, damit sie für andere Sprachen lokalisiert werden können, die für die Organisation aktiviert sind. Verwenden Sie die folgenden Schritte:
Stellen Sie sicher, dass die Organisation, an der Sie arbeiten, alle MUI-Pakete installiert und Sprachen für die Sprachen bereitgestellt hat, für die Sie Übersetzungen bereitstellen möchten.
Erstellen Sie die Lösung und ändern Sie die Komponenten.
Wenn Sie das Entwickeln der Lösung abgeschlossen haben, verwenden Sie die Funktion "Übersetzungen exportieren". Dadurch wird eine Microsoft Office Excel-Tabelle (CrmTranslations.xml) erstellt, die alle zu übersetzenden Bezeichnungen enthält.
In der Tabelle können Sie die entsprechenden Übersetzungen bereitstellen.
Importieren Sie Übersetzungen zurück in dieselbe Microsoft Dynamics 365-Organisation mithilfe der Funktionen "Übersetzungen importieren" und veröffentlichen Sie die Änderungen.
Beim nächsten Exportieren der Lösung sind alle Übersetzungen enthalten, die Sie bereitgestellt haben.
Wenn eine Lösung importiert wird, werden Beschriftungen für die Sprachen, die nicht verfügbar sind im Zielsystem, verworfen, und eine Warnung wird protokolliert.
Wenn Bezeichnungen für die Ausgangssprache des Zielsystems nicht im Lösungspaket bereitgestellt werden, werden die Bezeichnungen der Ausgangssprache der Quelle verwendet. Beispielsweise wenn Sie eine Lösung importieren, die Bezeichnungen für Englisch und Französisch mit Englisch die Ausgangsprache enthält, aber das Zielsystem Japanisch und Französisch mit Japanisch als Ausgangssprache aufweist, werden anstelle der japanischen Beschriftungen englische verwendet. Die Ausgangssprachenbeschriftungen können nicht Null oder leer sein.
Exportieren von Übersetzungen
Bevor Sie Übersetzungen exportieren, müssen die Sprachpakete installieren und alle Sprachen bereitstellen, die Sie lokalisieren möchten. Sie können Übersetzungen in die Webanwendung exportieren oder die ExportTranslationRequest-Nachricht verwenden. Weitere Informationen hierzu finden Sie unter Hilfe und Schulung: Exportieren von benutzerdefiniertem Entitäts- und Feldtext zur Übersetzung.
Übersetzen von Text
Wenn Sie die Datei CrmTranslations.xml in Excel öffnen, sehen Sie die drei Tabellen, die in der folgenden Tabelle aufgeführt sind.
Arbeitsblatt |
Beschreibung |
---|---|
Informationen |
Zeigt Organisations- und Lösungsinformationen an, aus denen die Bezeichnungen und Zeichenfolgen exportiert wurden. |
Anzeigezeichenfolgen |
Zeigt Zeichenfolgen an, die den Text aller Nachrichten darstellen, die einer Metadatenkomponente zugeordnet sind. Diese Tabelle enthält Fehlermeldungen und Zeichenfolgen, die für Systemmenübandelemente verwendet werden. |
Lokalisierte Beschriftungen |
Zeigt alle Texte für alle Metadatenkomponentenbeschriftungen an. |
Sie können diese Datei an einen Sprachexperten, an eine Übersetzungsagentur oder an ein Lokalisierungsunternehmen senden. Sie müssen lokalisierte Zeichenfolgen für die leeren Zellen bereitstellen.
Hinweis
Bei benutzerdefinierten Entitäten gibt es mehrere mögliche Bezeichnungen, die gemeinsam mit Systementitäten, beispielsweise Erstellt am oder Erstellt von, verwendet werden. Da Sie die Sprachen bereits installiert und bereitgestellt haben, wenn Sie für die Standardlösung Sprachen exportieren, können Sie in der Lage sein, einige Beschriftungen in Ihren benutzerdefinierten Entitäten mit lokalisiertem Text für identische Etiketten abzugleichen, die von anderen Entitäten verwendet werden. Dadurch können die Lokalisierungskosten verringert und die Konsistenz verbessert werden.
Nachdem der Text in den Tabellen lokalisiert wurde, fügen Sie die Dateien [Content_Types].xml und CrmTranslations.xml einer einzelnen komprimierten Datei .zip hinzu. Diese Datei können Sie dann importieren.
Wenn Sie lieber mit den exportierten Dateien programmgesteuert als XML Dokument arbeiten möchten, finden Sie unter Office 2003 XML-Referenzschemas Informationen zu den Schemas, die diese Dateien verwenden.
Importieren von übersetztem Text
Wichtig
Sie können nur übersetzten Text in dieselbe Organisation importieren, aus der er exportiert wurde.
Wenn Sie den angepassten Text für Entitäten oder Attribute exportiert und anschließend übersetzt haben, können Sie die übersetzten Textzeichenfolgen mit der ImportTranslationRequest-Nachricht in die Webanwendung importieren. Die Datei, die Sie importieren, muss eine komprimierte Datei sein, in der CrmTranslations.xml und [Content_Types].xml im Stammverzeichnis enthalten sind. Weitere Informationen finden Sie unter Hilfe und Schulung: Importieren von übersetztem Entitäts- und Feldtext.
Nach dem Importieren der fertig gestellten Übersetzungen wird benutzerdefinierter Text für Benutzer angezeigt, die in den Sprachen arbeiten, in die der Text übersetzt wurde.
Hinweis
In Microsoft Dynamics 365 kann übersetzter Text mit mehr als 500 Zeichen nicht importiert werden. Wenn Elemente in Ihrer Übersetzung eine Länge von 500 Zeichen überschreiten, tritt beim Importvorgang ein Fehler auf. Überprüfen Sie bei Auftreten eines Importfehlers die Zeile in der Datei, durch die der Fehler verursacht wurde, verringern Sie die Zeichenanzahl, und führen Sie einen erneuten Importvorgang aus.
Da die Anpassung nur in der Ausgangssprache unterstützt wird, können Sie Microsoft Dynamics 365 so verwenden, dass die Ausgangssprache auf Ihre Spracheinstellung festgelegt ist. Wenn Sie überprüfen möchten, ob der übersetzte Text angezeigt wird, muss die Spracheinstellung für die Benutzeroberfläche von Microsoft Dynamics 365 geändert werden. Zum Ausführen weiterer Anpassungen muss die Spracheinstellung dann wieder auf die Ausgangssprache festgelegt werden.
Lokalisierung in den Ausgangssprachenzeichenfolgen
Einige Lösungskomponenten unterstützen nicht mehrere Sprachen. Diese Komponenten enthalten Namen oder Texte, die nur in einer bestimmten Sprache eine Bedeutung haben. Wenn Sie eine Lösung für eine bestimmte Sprache erstellen, definieren Sie diese Lösungskomponenten für die beabsichtigte Organisationsausgangssprache.
Falls Sie mehrere Sprachen unterstützen müssen, ist eine Taktik, Lokalisierung in die Ausgangssprachenzeichenfolgen einzuschließen. Wenn Sie z. B. eine Verbindungsrolle namens "Freund" haben und Sie Englisch, Spanisch und Deutsch unterstützen müssen, können Sie möglicherweise den Text "Freund (Amigo/Friend)" als Name der Verbindungsrolle verwenden. Angesichts der Probleme der Textlänge bestehen Einschränkungen hinsichtlich der Anzahl der Sprachen, die mit dieser Taktik unterstützt werden können.
Einige Lösungskomponenten in dieser Gruppe werden nur Administratoren angezeigt. Da die Anpassung des Systems nur in der Organisationsausgangssprache ausgeführt werden kann, ist es nicht erforderlich, mehrere Sprachversionen bereitzustellen. Die Komponenten Sicherheitsrollen und Feldsicherheitsprofil gehören dieser Gruppe an.
Vertragsvorlagen stellen eine Beschreibung eines Typs von Servicevertrag bereit. Diese erfordern Text für die Felder Name und Abkürzung. Sie sollten Abkürzungen und Namen verwenden, die für alle Benutzer der Organisation eindeutig und geeignet sind.
Verbindungsrollen basieren auf einer Person, die für eine Verbindungsrolle beschreibende Kategorien und Namen auswählt. Da diese möglicherweise verhältnismäßig kurz sind, wird empfohlen, dass Sie in den Ausgangssprachenzeichenfolgen Lokalisierung einschließen.
Prozesse (Workflows) die für Ereignisse initiiert werden, können gut funktionieren, wenn sie keine Datensätze mit Text aktualisieren müssen, der lokalisiert werden soll. Es ist möglich, eine Workflowassembly zu verwenden, damit Logik, die ggf. für lokalisierten Text gilt, die gleiche Strategie wie Plug-In-Assemblys (Verwenden von XML-Webressourcen als Sprachenressourcen) verwenden kann.
Bedarfsgesteuerte Workflows erfordern einen Namen, damit Benutzer sie auswählen können. Zusätzlich zum Einschließen der Lokalisierung innerhalb des Namens des bedarfsgesteuerten Workflows ist eine andere Taktik, mehrere Workflows mit lokalisierten Namen zu erstellen, die alle den gleichen untergeordneten Prozess aufrufen. Allerdings sehen alle Benutzer die vollständige Liste der bedarfsgesteuerten Workflows, nicht nur die in der bevorzugten Sprache der Benutzeroberfläche.
Lokalisierung nicht erforderlich
SDK-Nachrichtenverarbeitungsschritt- und Dienstendpunkt-Lösungskomponenten zeigen dem Benutzer keinen lokalisierbaren Text an. Wenn es wichtig ist, dass diese Komponenten Namen und Beschreibungen haben, die der Ausgangssprache der Organisation entsprechen, können Sie eine verwaltete Lösung mit Namen und Beschreibungen in dieser Sprache erstellen und exportieren.
Separate Komponente für jede Sprache
Die folgenden Lösungskomponenten enthalten unter Umständen viel lokalisierbaren Text:
Artikelvorlagen
E-Mail-Vorlagen
Seriendruckvorlagen
Berichte
Dialoge
Für diesen Typen von Lösungskomponenten ist die empfohlene Taktik, separate Komponenten für jede Sprache zu erstellen. Das bedeutet, dass Sie üblicherweise eine verwalteten Basislösung erstellen, die die Kernlösungskomponenten enthält, und anschließend eine separate verwaltete Lösung erstellen, die Lösungskomponenten für die Sprachen enthält. Nachdem Kunden die Gebietsschemalösung installiert haben, können sie die verwalteten Lösungen für die Sprachen installieren, die sie für die Organisation bereitgestellt haben.
Anders als Prozesse (Workflows) können Sie Dialoge erstellen, die die Spracheinstellungen des aktuellen Benutzers wiedergeben und die Dialoge nur Benutzern dieser Sprache anzeigen.
Erstellen eines lokalisierten Dialogfelds
Installieren Sie das entsprechende Sprachpaket und stellen Sie die Sprache bereit.
Weitere Informationen finden Sie unter TechNet: Language Pack-Installationsanweisungen.
Ändern Sie Ihre persönlichen Optionen, um die Sprache der Benutzeroberfläche für die Sprache für den Dialog anzugeben.
Navigieren Sie zu Einstellungen, und wählen Sie in der Gruppe Prozesscenter die Option Prozesse aus.
Klicken Sie auf Neu und erstellen Sie das Dialogfeld in der angegebenen Sprache.
Nachdem Sie das Dialogfeld erstellt haben, ändern Sie Ihre persönlichen Optionen, um die Organisationsausgangssprache anzugeben.
Bei Verwendung der Organisationsausgangssprache können Sie zum Bereich Lösungen unter Einstellungen navigieren und das lokalisierte Dialogfeld als Teil einer Lösung hinzufügen.
Das Dialogfeld, das in der anderen Sprache erstellt wurde, wird nur Benutzern angezeigt, die Microsoft Dynamics 365 mithilfe dieser Sprache anzeigen.
Verwenden von XML-Webressourcen als Sprachenressourcen
Plug-In-Assemblylösungskomponenten können Nachrichten an einen Endbenutzer senden, indem sie InvalidPluginExecutionException auslösen und Datensätze erstellen und aktualisieren. Im Gegensatz zu Silverlight-Webressourcen können Plug-Ins keine Ressourcendateien verwenden.
Falls ein Plug-In lokalisierten Text erfordert, können Sie eine XML-Webressource verwenden, um die lokalisierten Zeichenfolgen zu speichern, damit das Plug-In bei Bedarf darauf zugreifen kann. Die Struktur der XML-Datei können Sie auswählen, aber Sie sollten der Struktur folgen, die von ASP.NET-Ressourcendateien verwendet wird (resx), um separate XML-Webressourcen für die einzelnen Sprachen zu erstellen. Folgendes ist z. B. eine XML-Webressource namens localizedString.en_US, die dem Muster folgt, das verwendet wird von .resx-Dateien.
<root>
<data name="ErrorMessage">
<value>There was an error completing this action. Please try again.</value>
</data>
<data name="Welcome">
<value>Welcome</value>
</data>
</root>
Der folgende Code zeigt, wie eine lokalisierte Nachricht zurück an ein Plug-In gegeben werden kann, um dem Benutzer eine Nachricht anzuzeigen. Es eignet sich für die Vorüberprüfungsphase eines Delete-Ereignisses für die Account-Entität:
protected void ExecutePreValidateAccountDelete(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
int OrgLanguage = RetrieveOrganizationBaseLanguageCode(localContext.OrganizationService);
int UserLanguage = RetrieveUserUILanguageCode(localContext.OrganizationService,
localContext.PluginExecutionContext.InitiatingUserId);
String fallBackResourceFile = "";
switch (OrgLanguage)
{
case 1033:
fallBackResourceFile = "new_localizedStrings.en_US";
break;
case 1041:
fallBackResourceFile = "new_localizedStrings.ja_JP";
break;
case 1031:
fallBackResourceFile = "new_localizedStrings.de_DE";
break;
case 1036:
fallBackResourceFile = "new_localizedStrings.fr_FR";
break;
case 1034:
fallBackResourceFile = "new_localizedStrings.es_ES";
break;
case 1049:
fallBackResourceFile = "new_localizedStrings.ru_RU";
break;
default:
fallBackResourceFile = "new_localizedStrings.en_US";
break;
}
String ResourceFile = "";
switch (UserLanguage)
{
case 1033:
ResourceFile = "new_localizedStrings.en_US";
break;
case 1041:
ResourceFile = "new_localizedStrings.ja_JP";
break;
case 1031:
ResourceFile = "new_localizedStrings.de_DE";
break;
case 1036:
ResourceFile = "new_localizedStrings.fr_FR";
break;
case 1034:
ResourceFile = "new_localizedStrings.es_ES";
break;
case 1049:
ResourceFile = "new_localizedStrings.ru_RU";
break;
default:
ResourceFile = fallBackResourceFile;
break;
}
XmlDocument messages = RetrieveXmlWebResourceByName(localContext, ResourceFile);
String message = RetrieveLocalizedStringFromWebResource(localContext, messages, "ErrorMessage");
throw new InvalidPluginExecutionException(message);
}
protected static int RetrieveOrganizationBaseLanguageCode(IOrganizationService service)
{
QueryExpression organizationEntityQuery = new QueryExpression("organization");
organizationEntityQuery.ColumnSet.AddColumn("languagecode");
EntityCollection organizationEntities = service.RetrieveMultiple(organizationEntityQuery);
return (int)organizationEntities[0].Attributes["languagecode"];
}
protected static int RetrieveUserUILanguageCode(IOrganizationService service, Guid userId)
{
QueryExpression userSettingsQuery = new QueryExpression("usersettings");
userSettingsQuery.ColumnSet.AddColumns("uilanguageid", "systemuserid");
userSettingsQuery.Criteria.AddCondition("systemuserid", ConditionOperator.Equal, userId);
EntityCollection userSettings = service.RetrieveMultiple(userSettingsQuery);
if (userSettings.Entities.Count > 0)
{
return (int)userSettings.Entities[0]["uilanguageid"];
}
return 0;
}
protected static XmlDocument RetrieveXmlWebResourceByName(LocalPluginContext context, string webresourceSchemaName)
{
context.TracingService.Trace("Begin:RetrieveXmlWebResourceByName, webresourceSchemaName={0}", webresourceSchemaName);
QueryExpression webresourceQuery = new QueryExpression("webresource");
webresourceQuery.ColumnSet.AddColumn("content");
webresourceQuery.Criteria.AddCondition("name", ConditionOperator.Equal, webresourceSchemaName);
EntityCollection webresources = context.OrganizationService.RetrieveMultiple(webresourceQuery);
context.TracingService.Trace("Webresources Returned from server. Count={0}", webresources.Entities.Count);
if (webresources.Entities.Count > 0)
{
byte[] bytes = Convert.FromBase64String((string)webresources.Entities[0]["content"]);
// The bytes would contain the ByteOrderMask. Encoding.UTF8.GetString() does not remove the BOM.
// Stream Reader auto detects the BOM and removes it on the text
XmlDocument document = new XmlDocument();
document.XmlResolver = null;
using (MemoryStream ms = new MemoryStream(bytes))
{
using (StreamReader sr = new StreamReader(ms))
{
document.Load(sr);
}
}
context.TracingService.Trace("End:RetrieveXmlWebResourceByName , webresourceSchemaName={0}", webresourceSchemaName);
return document;
}
else
{
context.TracingService.Trace("{0} Webresource missing. Reinstall the solution", webresourceSchemaName);
throw new InvalidPluginExecutionException(String.Format("Unable to locate the web resource {0}.", webresourceSchemaName));
return null;
// This line never reached
}
}
protected static string RetrieveLocalizedStringFromWebResource(LocalPluginContext context, XmlDocument resource, string resourceId)
{
XmlNode valueNode = resource.SelectSingleNode(string.Format(CultureInfo.InvariantCulture, "./root/data[@name='{0}']/value", resourceId));
if (valueNode != null)
{
return valueNode.InnerText;
}
else
{
context.TracingService.Trace("No Node Found for {0} ", resourceId);
throw new InvalidPluginExecutionException(String.Format("ResourceID {0} was not found.", resourceId));
}
}
Siehe auch
Packen und Verteilen von Erweiterungen mithilfe von Lösungen
Einführung in Lösungen
Planen einer Lösungsentwicklung
Abhängigkeitsnachverfolgung für Lösungskomponenten
Erstellen, Exportieren oder Importieren einer nicht verwalteten Lösung
Eine verwaltete Lösung erstellen, installieren und aktualisieren
Deinstallieren oder Löschen einer Lösung
Lösungsentitäten
Produkteigenschaftswerte lokalisieren
© 2017 Microsoft. Alle Rechte vorbehalten. Copyright