Delen via


Oplossingen maken die meerdere talen ondersteunen

 

Gepubliceerd: november 2016

Is van toepassing op: Dynamics CRM 2015

Microsoft Dynamics CRM 2015 en Microsoft Dynamics CRM Online 2015 Update 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)
Linten

Vertalingen exporteren en importeren

Kenmerken
Grafieken
Dashboards
Entiteit
Entiteitrelaties
Formulieren
Berichten
Optiesets
Weergaven

Lokalisatie in standaardtaalreeksen

Contractsjablonen
Verbindingsrollen
Processen (werkstromen)
Beveiligingsrollen
Veldbeveiligingsprofielen

Lokalisatie is niet verplicht.

Stappen van SDK-berichtverwerking
Service-eindpunten

Afzonderlijk onderdeel voor elke taal

Artikelsjablonen
E-mailsjablonen
Sjablonen voor afdruk samenvoegen
Rapporten
Dialoogvensters

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 d7d0b052-abca-4f81-9b86-0b9dc5e62a66#BKMK_getOrgLcid en d7d0b052-abca-4f81-9b86-0b9dc5e62a66#BKMK_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:

  1. 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.

  2. Maak uw oplossing en wijzig de onderdelen.

  3. 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.

  4. Voeg in het werkblad de juiste vertalingen toe.

  5. Importeer vertalingen weer in dezelfde Microsoft Dynamics 365-organisatie met de functionaliteit "Vertalingen importeren" en publiceer uw wijzigingen.

  6. 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 kiezen. 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

  1. Installeer het juiste taalpakket en richt de taal in.

    Zie voor meer informatie TechNet: Installatie-instructies voor talenpakket.

  2. Wijzig uw persoonlijke opties om de Taal gebruikersinterface op te geven voor de taal die u voor het dialoogvenster wilt.

  3. Navigeer naar Instellingen en selecteer in de groep VerwerkingscentrumProcessen.

  4. Klik op Nieuw en maak het dialoogvenster in de taal die u hebt opgegeven.

  5. Nadat u het dialoogvenster hebt gemaakt, wijzigt u uw persoonlijke opties om de standaardtaal van de organisatie op te geven.

  6. 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

© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht