Oplossingen maken die meerdere talen ondersteunen

Microsoft Dataverse 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
String (RESX) webbronnen Webresources
Ingebedde labels Navigatie toepassing (SiteMap)
Linten
Vertalingen exporteren en importeren Kenmerken
Grafieken
Dashboards
Entity
Entiteitsrelaties
Formulieren
Berichten
Optiesets
Weergaven
Lokalisatie in basistaalstrings Contractsjablonen
Verbindingsrollen
Processen (werkstroom)
Beveiligingsrollen
Veldbeveiligingsprofielen
Lokalisatie niet vereist Verwerkingsstappen van SDK-bericht
Service-eindpunten
Aparte component voor elke taal Artikelsjablonen
E-mailsjablonen
Sjablonen voor Afdruk samenvoegen
Rapporten
Dialoogvensters
XML-webbronnen gebruiken als taalbronnen Invoegtoepassingassembly's

De volgende secties bevatten aanvullende gegevens voor elke tactiek.

Webresources voor tekenreeks (RESX)

Als er webresources voor tekenreeks (RESX) zijn toegevoegd met Dataverse, hebben ontwikkelaars een krachtigere optie om webresources te maken die meerdere talen ondersteunen. Meer informatie Webresources voor tekenreeks (RESX).

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> gebruiken om gelokaliseerde tekst te bieden voor de talen die u ondersteunt. Meer informatie: Gelokaliseerde labels met linten gebruiken

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>. Het Titles-element moet een <Title>-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> 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 doorgeven aan een URL met 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 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 Dataverse-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 Aangepaste entiteit- en veldtekst exporteren voor vertaling.

Tekst vertalen

Wanneer u het bestand CrmTranslations.xml opent in Office 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 is gelokaliseerd is, voegt u de bestanden CrmTranslations.xml en [Content_Types].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 Ondersteuning voor Word-, Excel- en PowerPoint-standaarden 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 het [Content_Types].xml-bestand in de hoofdmap bevat. Raadpleeg voor meer informatie 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

Dataverse 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 Dataverse 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 Dataverse. 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 componenten behoren tot deze groep.

Contractsjablonen een beschrijving geven van een type dienstverleningsovereenkomst. 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 erop dat een persoon 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 (workflows) die voor gebeurtenissen worden geïnitieerd, kunnen goed werken zolang ze de records niet hoeven bij te werken met tekst die gelokaliseerd moet worden. 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).

On-Demand-workflows hebben een naam nodig, zodat mensen ze 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.

SDK-berichtverwerkingsstap En Service-eindpunt Oplossingscomponenten maken geen te lokaliseren tekst zichtbaar voor 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 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 Dataverse 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 door . resx-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

Lokaliseer producteigenschapswaarden