Oplossingen maken die meerdere talen ondersteunen
Gepubliceerd: januari 2017
Is van toepassing op: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Microsoft Dynamics 365 (online en on-premises) ondersteunt meerdere talen. Als u wilt dat de oplossing wordt geïnstalleerd voor organisaties met meerdere standaardtalen of die meerdere talen hebben ingericht, houdt u hier bij de planning van uw oplossing rekening mee. De onderstaande tabel toont tactieken die u met oplossingsonderdelen kunt opnemen in een oplossing die meerdere talen ondersteunt.
Tactiek |
Type oplossingsonderdeel |
---|---|
Ontwikkelaaroptie |
Webresources |
Ingesloten labels |
Toepassingsnavigatie (Siteoverzicht) |
Vertalingen exporteren en importeren |
Kenmerken |
Lokalisatie in standaardtaalreeksen |
Contractsjablonen |
Lokalisatie is niet verplicht. |
Stappen van SDK-berichtverwerking |
Afzonderlijk onderdeel voor elke taal |
Artikelsjablonen |
XML-webresources gebruiken als taalresources |
Invoegtoepassingassembly's |
De volgende secties bevatten aanvullende gegevens voor elke tactiek.
Ontwikkelaaroptie
Webresources hebben een LanguageCode-kenmerk dat in de gebruikersinterface kan worden ingesteld, maar deze waarde wordt niet gebruikt in de toepassing. Omdat webresources met een URL adresseerbaar zijn, krijgt u meestal toegang tot een webresource via de naam in plaats van door beschikbare webresources op te vragen met LanguageCode als criterium. Daarom is de LanguageCode van beperkte waarde. Het gangbare scenario is dat u de juiste taal moet detecteren op basis van de context waarin de webresource wordt weergegeven. Voor webresources geeft de contextobject toegang tot de functies getOrgLcid en getUserLcid. Beide functies retourneren een geheel getal dat correspondeert met de waarden voor de landinstelling (LCID).U vindt de geldige lokale id-waarden in het Diagram van LCID (id van landinstelling).
Voor webresources die tekst beschikbaar maken in de gebruikersinterface kunt u elke gewenste methode gebruiken om te beheren hoe de tekst en de lay-out de taalvoorkeuren van de gebruiker ondersteunen. De specifieke implementatie is afhankelijk van het type webresource.
HTML-webresources
Eén optie is afzonderlijke gelokaliseerde webresources te maken die variëren afhankelijk van de toegepaste naam. U kunt bijvoorbeeld een webresource met de naam new_/my_solution/1033/content.htm hebben die Engels ondersteunt, en een webresource met de naam new_/my_solution/1041/content.htm die Japans ondersteunt. Voor talen die van rechts naar links worden gelezen raadpleegt u Procedures: Tekst van rechts naar links weergeven met HTML-codes voor globalisering.
Als u dynamisch U-tekst wilt kunnen instellen op basis van de taal van een gebruiker, kunt u alle gelokaliseerde tekenreekswaarden opslaan in een object dat is gedefinieerd n een scriptwebresourcebestand. Op basis van de taalvoorkeur van de gebruiker kunt u de UI-tekstelementen instellen met behulp van tekenreeksen die in het object worden opgeslagen wanneer de pagina wordt geladen. De volgende JavaScript-code toont een methode om gelokaliseerde tekenreeksen in te stellen.
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-webresources
Silverlight-toepassingen kunnen worden geschreven ter ondersteuning van gelokaliseerde taalresources.Meer informatie:Op Silverlight gebaseerde toepassingen lokaliseren.
De volgende klasse geeft toegang tot de taalvoorkeur van de gebruiker op basis van de context waarin de Silverlight-webresource wordt gepresenteerd. Deze klasse ondersteunt Amerikaans Engels, Arabisch, Duits, Hebreeuws en Japans. Het moet worden aangepast voor de specifieke talen die worden ondersteund door de Silverlight-webresource.
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;
}
}
Voor talen die van rechts naar links worden gelezen, raadpleegt u Eigenschap FrameworkElement.FlowDirection.
XML-webresources
XML-webresources worden meestal niet aan gebruikers weergegeven, maar ze kunnen nuttig zijn om gelokaliseerde tekenreeksen in op te slaan als resources voor andere oplossingsonderdelen, zoals beschreven in XML-webresources gebruiken als taalresources.
Ingesloten labels
Alle oplossingsonderdelen die deze tactiek gebruiken, vereisen dat gelokaliseerde tekst wordt opgenomen in het oplossingsonderdeel.
Linten
Wanneer een taalpakket is geïnstalleerd, geeft het toepassingslint automatisch gelokaliseerde tekst weer voor alle standaardtekst op het lint. Systeemlabels worden gedefinieerd in een ResourceId-kenmerkwaarde die alleen voor intern gebruik bedoeld is. Als u uw eigen tekst toevoegt, moet u het element <LocLabels> (RibbonDiffXml) gebruiken om gelokaliseerde tekst te bieden voor de talen die u ondersteunt.Meer informatie:Gebruik gelokaliseerde labels met linten
Siteoverzicht
Wanneer een taalpakket is geïnstalleerd, geeft de toepassingslintbalk automatisch gelokaliseerde tekst weer voor de standaardtekst. Om de standaardtekst te negeren of uw eigen tekst te bieden gebruikt u het element <Titles> (SiteMap). Het Titles-element moet een <Title> (SiteMap)-element bevatten dat gelokaliseerde tekst bevat voor alle talen die uw oplossing ondersteunt. Als een Title-element niet beschikbaar is voor de voorkeurstaal van de gebruiker, wordt de titel weergegeven die correspondeert met de standaardtaal van de organisatie.
Met het element <SubArea> (SiteMap) kan de taalvoorkeur van de gebruiker worden doorgegeven met de parameter userlcid, zodat inhoud die het doel is van het kenmerk SubArea.Url rekening kan houden met de taalvoorkeur van de gebruiker.Meer informatie:Parameters passeren naar een URL met de SiteMap
Vertalingen exporteren en importeren
Lokaliseerbare labels voor de oplossingsonderdelen in de volgende tabel kunnen worden geëxporteerd voor lokalisatie.
Entiteiten |
Kenmerken |
Relaties |
Algemene optiesets |
Berichten voor entiteit |
Entiteitsformulieren |
Entiteitsweergaven (SavedQuery) |
Grafieken |
Dashboards |
Labels en weergavetekenreeksen vertalen
U kunt alleen aanpassingen in de toepassing uitvoeren met de standaardtaal. Als u gelokaliseerde labels en weergavetekenreeksen wilt bieden voor deze aanpassingen, moet u de tekst van de labels dus exporteren, zodat deze kan worden gelokaliseerd voor andere die talen die in de organisatie zijn ingeschakeld. Gebruik de volgende stappen:
Zorg ervoor dat de organisatie waaraan u werkt, alle MUI-pakketten heeft geïnstalleerd en talen heeft ingericht voor de talen waarvoor u vertalingen wilt bieden.
Maak uw oplossing en wijzig de onderdelen.
Zodra u gereed bent met het ontwikkelen van uw oplossing, gebruikt u de functionaliteit "Vertalingen exporteren". Hiermee genereert u een Microsoft Office Excel-werkblad (CrmTranslations.xml) dat alle labels bevat die moeten worden vertaald.
Voeg in het werkblad de juiste vertalingen toe.
Importeer vertalingen weer in dezelfde Microsoft Dynamics 365-organisatie met de functionaliteit "Vertalingen importeren" en publiceer uw wijzigingen.
De volgende keer dat de oplossing wordt geëxporteerd, bevat deze alle vertalingen die u hebt opgegeven.
Als een oplossing wordt geïmporteerd, worden labels voor talen die niet beschikbaar zijn in het doelsysteem, verwijderd en wordt een waarschuwing geregistreerd.
Als labels voor de standaardtaal van het doelsysteem niet worden verschaft in het oplossingspakket, worden de labels van de standaardtaal van de bron in plaats daarvan gebruikt. Als u bijvoorbeeld een oplossing importeert die labels voor Engels en Frans bevat met Engels als de standaardtaal, maar het doelsysteem Japans en Frans heeft met Japans als de standaardtaal, worden Engelse labels gebruikt in plaats van Japanse. De labels in de standaardtaal mogen niet null of leeg zijn.
Vertalingen exporteren
Voordat u vertalingen exporteert, moet u eerst de taalpakketten installeren en alle talen inrichten die u wilt laten lokaliseren. U kunt de vertalingen in de webtoepassing exporteren of met het bericht ExportTranslationRequest. Raadpleeg voor meer informatie Help en training: Aangepaste entiteit- en veldtekst exporteren voor vertaling voor meer informatie.
Tekst vertalen
Wanneer u het bestand CrmTranslations.xml opent in Excel, ziet u de drie werkbladen die in de volgende tabel worden vermeld.
Werkblad |
Beschrijving |
---|---|
Informatie |
Geeft informatie over de organisatie en de oplossing waaruit de labels en de tekenreeksen zijn geëxporteerd. |
Weergavetekenreeksen |
Tekenreeksen weergeven die de tekst vertegenwoordigen van berichten die zijn gekoppeld aan een metagegevensonderdeel. Deze tabel bevat foutberichten en tekenreeksen die worden gebruikt voor systeemlintelementen. |
Gelokaliseerde labels |
Geeft alle tekst weer voor labels van metagegevensonderdelen. |
U kunt dit bestand verzenden naar een taalkundig expert, vertaalbureau of lokalisatiebedrijf. Zij moeten gelokaliseerde tekenreeksen leveren voor de lege cellen.
Notitie
Voor aangepaste entiteiten is er een aantal gebruikelijke labels die met systeementiteiten worden gedeeld, zoals Gemaakt op of Gemaakt door. Omdat u al de talen hebt geïnstalleerd en ingericht, kunt u als u talen exporteert voor de standaardoplossing, mogelijk enkele labels in uw aangepaste entiteiten afstemmen met gelokaliseerde tekst voor identieke labels die door andere entiteiten worden gebruikt. Dit kan de lokalisatiekosten drukken en de consistentie verbeteren.
Als de tekst in de werkbladen gelokaliseerd is, voegt u de bestanden [Content_Types].xml en CrmTranslations.xml toe aan één gecomprimeerd .zip-bestand. Nu kunt u dit bestand importeren.
Als u liever vanuit programmering met de geëxporteerde bestanden werkt als een XML-document, raadpleegt u Naslagschema's voor Office 2003 XML voor informatie over welke schema's deze bestanden gebruiken.
Vertaalde tekst importeren
Belangrijk
U kunt vertaalde tekst alleen terug importeren in de organisatie waaruit de tekst is geëxporteerd.
Nadat u de aangepaste entiteit- of kenmerktekst hebt geëxporteerd en hebt laten vertalen, kunt u de vertaalde tekenreeksen weer in de webtoepassing importeren met het bericht ImportTranslationRequest. Het bestand dat u wilt importeren, moet een gecomprimeerd bestand zijn dat CrmTranslations.xml en de [Content_Types].xml in de hoofdmap bevat. Raadpleeg voor meer informatie Help en training: Vertaalde entiteit- en veldtekst importeren.
Nadat u de voltooide vertalingen hebt geïmporteerd, wordt de aangepaste tekst weergegeven voor gebruikers die werken in de talen waarin u de tekst hebt laten vertalen.
Notitie
Microsoft Dynamics 365 kan geen vertaalde tekst van meer dan 500 tekens importeren. Als uw vertaalbestand items bevat die langer zijn dan 500 tekens, mislukt het importproces. Als het importproces mislukt, controleert u de regel in het bestand die de fout heeft veroorzaakt, verkleint u het aantal tekens en probeert u het bestand opnieuw te importeren.
Omdat aanpassing alleen wordt ondersteund in de standaardtaal, kunt u in Microsoft Dynamics 365 werken met de standaardtaal ingesteld als uw taalvoorkeur. Om te controleren of de vertaalde tekst wordt weergegeven, moet u de taalvoorkeur wijzigen voor de gebruikersinterface van Microsoft Dynamics 365. U moet teruggaan naar de basistaal als u meer aanpassingen wilt verrichten.
Lokalisatie in standaardtaalreeksen
Sommige oplossingsonderdelen ondersteunen niet meerdere talen. Deze onderdelen omvatten namen of tekst die alleen betekenis hebben in een specifieke taal. Als u een oplossing voor een specifieke taal maakt, definieert u deze oplossingsonderdelen voor de bedoelde standaardtaal van de organisatie.
Als u meerdere talen moet ondersteunen, is één tactiek lokalisatie op te nemen in de standaardtaalreeksen. Als u bijvoorbeeld een verbindingsrol met de naam"Vriend" hebt en u Engels, Spaans en Duits moet ondersteunen, kunt u de tekst “Vriend (Amigo / Freund)” gebruiken als de naam van de verbindingsrol. Wegens problemen met de lengte van de tekst gelden er beperkingen op hoeveel talen kunnen worden ondersteund met deze tactiek.
Sommige oplossingsonderdelen in deze groep zijn alleen zichtbaar voor beheerders. Omdat aanpassing van het systeem slechts in de standaardtaal van de organisatie kan worden uitgevoerd, is het niet noodzakelijk om meerdere taalversies te bieden.Beveiligingsrollen- en Veldbeveiligingsprofiel-onderdelen behoren tot deze groep.
Contractsjablonen geven een beschrijving van een servicecontract. Deze vereisen tekst voor de velden Naam en Afkorting. U moet overwegen namen en afkortingen te gebruiken die uniek zijn en geschikt zijn voor alle gebruikers van de organisatie.
Verbindingsrollen vertrouwen op een persoon die beschrijvende categorieën en namen voor verbindingsrollen selecteert. Omdat deze relatief kort kunnen zijn, wordt aanbevolen dat u lokalisatie opneemt in tekenreeksen in de standaardtaal.
Processen (werkstromen) die worden gestart voor gebeurtenissen, kunnen goed werken zo lang ze geen records hoeven bij te werken met tekst die is gelokaliseerd. Het is mogelijk een werkstroomassembly te gebruiken, zodat logica die van toepassing kan zijn op gelokaliseerde tekst, dezelfde strategie kan gebruiken als invoegassembly's (XML-webresources gebruiken als taalresources).
Werkstromen op aanvraag vereisen een naam zodat mensen deze kunnen selecteren. Naast het opnemen van lokalisatie in de naam van de werkstroom op aanvraag, is een andere tactiek meerdere werkstromen te maken met gelokaliseerde namen die elk hetzelfde onderliggend proces aanroepen. Alle gebruikers zien echter de volledige lijst met werkstromen op aanvraag, niet alleen de werkstromen in de gebruikersinterfacetaal van hun voorkeur.
Lokalisatie is niet verplicht.
De oplossingsonderdelen SDK-berichtverwerkingsstap en Service-eindpunt geven geen lokaliseerbare tekst weer aan gebruikers. Als het belangrijk is dat deze onderdelen namen en beschrijvingen hebben die corresponderen met de standaardtaal van de organisatie, kunt u een beheerde oplossing met namen en beschrijvingen maken en exporteren in die taal.
Afzonderlijk onderdeel voor elke taal
De volgende oplossingsonderdelen kunnen elk een aanzienlijke hoeveelheid te lokaliseren tekst bevatten:
Artikelsjablonen
E-mailsjablonen
Sjablonen voor Afdruk samenvoegen
Rapporten
Dialoogvensters
Voor deze typen oplossingsonderdelen is de aanbevolen tactiek afzonderlijke onderdelen voor elke taal te maken. Dit betekent dat u doorgaans een beheerde basisoplossing maakt die uw kernoplossingsonderdelen bevat en vervolgens een aparte beheerde oplossing die deze oplossingsonderdelen voor elke taal bevat. Als de klant de basisoplossing heeft geïnstalleerd, kunnen ze de beheerde oplossingen installeren voor de talen die ze hebben ingericht voor de organisatie.
In tegenstelling tot Processen (werkstromen) kunt u Dialoogvensters maken die de huidige instellingen voor de standaardtaal van de gebruiker reflecteren en de dialoogvensters alleen weergeven aan gebruikers van die taal.
Een gelokaliseerd dialoogvenster maken
Installeer het juiste taalpakket en richt de taal in.
Zie voor meer informatie TechNet: Installatie-instructies voor talenpakket.
Wijzig uw persoonlijke opties om de Taal gebruikersinterface op te geven voor de taal die u voor het dialoogvenster wilt.
Navigeer naar Instellingen en selecteer in de groep VerwerkingscentrumProcessen.
Klik op Nieuw en maak het dialoogvenster in de taal die u hebt opgegeven.
Nadat u het dialoogvenster hebt gemaakt, wijzigt u uw persoonlijke opties om de standaardtaal van de organisatie op te geven.
Tijdens het gebruik van de standaardtaal van de organisatie kunt u naar het gebied Oplossingen navigeren onder Instellingen en het gelokaliseerde dialoogvenster toevoegen als onderdeel van een oplossing.
Het dialoogvenster dat in de andere taal is gemaakt, wordt alleen weergegeven aan gebruikers die Microsoft Dynamics 365 in die taal weergeven.
XML-webresources gebruiken als taalresources
Oplossingsonderdelen van invoegassembly's kunnen berichten verzenden naar een eindgebruiker door een InvalidPluginExecutionException te genereren, en records te maken en bij te werken. In tegenstelling tot Silverlight-webresources kunnen invoegtoepassingen geen resourcebestanden gebruiken.
Als een invoegtoepassing gelokaliseerde tekst vereist, kunt u een XML-webresource gebruiken om de gelokaliseerde tekenreeksen op te slaan, zodat de invoegtoepassing er indien nodig toegang toe heeft. De structuur van de XML is uw keuze, maar u wilt wellicht de structuur volgen die door ASP.NET-resourcebestanden (.resx) wordt gebruikt om aparte XML-webresources voor elke taal te maken. Het volgende is bijvoorbeeld een XML-webresource met de naam localizedString.en_US, die het patroon volgt dat wordt gebruikt doorresx-bestanden.
<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>
De volgende code toont hoe een gelokaliseerd bericht in een invoegtoepassing kan worden teruggestuurd om een bericht aan een gebruiker weer te geven. De code is bedoeld voor de pre-validatiefase van een Delete-gebeurtenis voor de Account-entiteit:
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));
}
}
Zie ook
Uitbreidingen inpakken en verdelen met oplossingen
Inleiding tot oplossingen
Plan voor oplossingontwikkeling
Afhankelijkheden van oplossingsonderdelen bijhouden
Maak, exporteer of importeer een onbeheerde oplossing
Een beheerde oplossing maken, installeren en bijwerken
Een oplossing de-installeren of verwijderen
Oplossingsentiteiten
Producteigenschapswaarden lokaliseren
Microsoft Dynamics 365
© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht