Opprette løsninger som støtter flere språk

Microsoft Dataverse støtter flere språk. Hvis du vil at løsningen skal installeres for organisasjoner som har forskjellige originalspråk, eller som har flere språk klargjort, tar du dette med i betraktningen når du skal planlegger løsningen. Tabellen nedenfor viser fremgangsmåten som kan brukes sammen med løsningskomponenter for å inkludere en løsning som støtter flere språk.

Fremgangsmåte Type løsningskomponent
Webressurser for streng (RESX) Webressurser
Innebygde etiketter Programnavigasjon (SiteMap)
Bånd
Eksportere og importere oversettelser Attributter
Diagrammer
Instrumentbord
Entity
Enhetsrelasjoner
Skjemaer
Meldinger
Alternativsett
Visninger
Lokalisering i originalspråkstrenger Kontraktmaler
Tilkoblingsroller
Prosesser (arbeidsflyt)
Sikkerhetsroller
Profiler for feltsikkerhet
Lokalisering ikke nødvendig Behandlingstrinn for SDK-melding
Tjenesteendepunkter
Separat komponent for hvert språk Artikkelmaler
E-postmaler
Maler for utskriftsfletting
Rapporter
Dialoger
Bruke XML-webressurser som språkressurser Plugin-modulsamlinger

Avsnittene nedenfor inneholder flere detaljer for hver fremgangsmåte.

Webressurser for streng (RESX)

Med webressurser for streng (RESX) som legges til med Dataverse, har utviklere et kraftigere alternativ for å opprette webressurser som støtter flere språk. Mer informasjon webressurser for streng (RESX).

Innebygde etiketter

Hver av løsningskomponentene som bruker denne fremgangsmåten, krever at eventuell lokalisert tekst tas med i løsningskomponenten.

Bånd

Når en språkpakke er installert, viser programbåndet automatisk lokalisert tekst for all standardtekst på båndet. Systemetiketter defineres i en ResourceId-attributtverdi som bare er for intern bruk. Når du legger til din egen tekst, må du bruke <LocLabels>-elementet til å gi lokalisert tekst for språkene du støtter. Mer informasjon: Bruke lokaliserte etiketter med båndene

Områdekart

Når en språkpakke er installert, viser standardteksten på navigasjonsfeltet til programmet automatisk den lokaliserte teksten. Hvis du vil overstyre standardteksten eller angi egen tekst, bruker du <Titles>-elementet. Titles-elementet må inneholde et <Title>-element som inneholder lokalisert tekst for alle språk som løsningen støtter. Hvis et Title-element ikke er tilgjengelig for brukerens foretrukne språk, vises tittelen som samsvarer med originalspråket for organisasjonen.

Elementet <SubArea> tillater at brukerens språkpreferanse sendes ved hjelp av userlcid-parameteren, slik at innhold som er målet for SubArea.Url-attributtet, kan være klar over brukerens språkinnstillinger og justeres i henhold til dette. Mer informasjon: Sende parametere til en URL som bruker områdekart

Eksport og import av oversettelser

Lokaliserte etiketter for løsningskomponentene i tabellen nedenfor kan eksporteres for lokalisering.

Enheter Attributter Relasjoner
Globalt alternativsett Enhetsmeldinger Enhetsskjemaer
Enhetsvisninger (SavedQuery) Diagrammer Instrumentbord

Oversette etiketter og vise strenger

Du kan bare utføre tilpassinger i programmet på originalspråket. Hvis du vil gi lokaliserte etiketter og visningsstrenger for disse tilpassingene, må du derfor eksportere teksten i etikettene, slik at de kan oversettes for alle andre språk som er aktivert for organisasjonen. Bruk følgende fremgangsmåte:

  1. Kontroller at organisasjonen du arbeider med, har alle MUI-pakkene som er installert, og språkene du vil gi oversettelser for.

  2. Opprett løsningen, og endre komponentene.

  3. Når du er ferdig med å utvikle løsningen, kan du bruke funksjonen "Eksporter oversettelser". Dette genererer et Office Excel-regneark (CrmTranslations.xml) som inneholder alle etikettene som trenger oversettelse.

  4. I regnearket angir du de tilsvarende oversettelsene.

  5. Importer oversettelser tilbake til samme Dataverse-organisasjon ved hjelp av funksjonen "Importer oversettelser", og publiser endringene.

  6. Neste gang løsningen eksporteres, utføres alle oversettelsene du oppgav.

    Når en løsning importeres, blir etiketter for språk som ikke er tilgjengelige i målsystemet, forkastet, og en advarsel blir logget.

    Hvis etiketter for originalspråket til målsystemet ikke er angitt i løsningspakken, brukes etikettene for originalspråket til kilden i stedet. Hvis du for eksempel importerer en løsning som inneholder etiketter for engelsk og fransk med engelsk som originalspråk, men målsystemet har japansk og fransk med japansk som originalspråk, brukes engelske etiketter i stedet for japanske etiketter. Originalspråketiketter kan ikke være null eller tomme.

Eksportere oversettelser

Før du eksporterer oversettelser, må du først installere språkpakkene og klargjøre alle språkene du vil ha lokalisert. Du kan eksportere oversettelsene i webprogrammet eller ved å bruke ExportTranslationRequest-meldingen. Hvis du vil ha mer informasjon, se Eksportere egendefinert enhets- og felttekst for oversetting.

Oversette tekst

Når du åpner CrmTranslations.xml-filen i Office Excel, vises de tre regnearkene som er oppført i tabellen nedenfor.

Regneark Beskrivelse
Informasjon Viser informasjon om organisasjonen og løsningen som etikettene og strengene ble eksportert fra.
Visningsstrenger Visningsstrenger som representerer teksten i meldinger som er knyttet til en metadatakomponent. Denne tabellen inneholder feilmeldinger og strenger som brukes for båndelementer i systemet.
Lokaliserte etiketter Viser all tekst for alle etiketter for metadatakomponent.

Du kan sende denne filen til en språkekspert, et oversettingsbyrå eller et lokaliseringsselskap. De må levere lokaliserte strenger for alle de tomme cellene.

Merk

For egendefinerte enheter finnes det noen felles etiketter som deles med systemenhetene, for eksempel Opprettet eller Opprettet av. Siden du allerede har installert og klargjort disse språkene, og hvis du eksporterer språk for standardløsningen, kan det hende at du får treff på noen av etikettene i de egendefinerte enhetene med lokalisert tekst for identiske etiketter som brukes av andre enheter. Dette kan redusere lokaliseringskostnadene og forbedre konsekvens.

Når teksten i regnearkene er lokalisert, legger du til både CrmTranslations.xml og [Content_Types].xml-filer i en enkelt komprimert zip-fil. Du kan nå importere denne filen.

Hvis du foretrekker å arbeide med de eksporterte filene programmatisk som et XML-dokument, kan du se brukerstøtte for Word, Excel og PowerPoint-standarder for informasjon om skjemaene som disse filene bruker.

Importere oversatt tekst

Viktig

Du kan bare importere oversatt tekst tilbake til samme organisasjon som den ble eksportert fra.

Etter at du har eksportert den tilpassede enhets- eller attributteksten og har fått den oversatt, kan du importere de oversatte tekststrengene i webprogrammet ved hjelp av ImportTranslationRequest-meldingen. Filen du importerer, må være en komprimert fil som inneholder CrmTranslations.xml og [Content_Types]-XML-filen i roten. Hvis du vil ha mer informasjon, se Importere oversatt enhets- og attributtekst.

Etter at du har importert de fullførte oversettelsene, vises tilpasset tekst for brukere som arbeider på de språkene som du fikk oversatt teksten til.

Merk

Du kan ikke importere oversatt tekst med mer enn 500 tegn til Dataverse. Hvis noen av elementene i oversettingsfilen har mer enn 500 tegn, mislykkes importen. Hvis importen mislykkes, ser du gjennom linjen i filen som forårsaket feilen, reduserer antall tegn og prøver å importere på nytt.

Siden tilpassing bare støttes på originalspråket, kan du arbeide i Dataverse med originalspråket angitt som språkpreferanse. Kontroller at den oversatte teksten vises ved å endre språkinnstillingen for Dataverse-brukergrensesnittet. Hvis du vil utføre ytterligere tilpassingsarbeid, må du skifte tilbake til originalspråket.

Lokalisering i originalspråkstrenger

Noen løsningskomponenter støtter ikke flere språk. Disse komponentene inneholder navn eller tekst som bare kan ha mening på et bestemt språk. Hvis du oppretter en løsning for et bestemt språk, definerer du løsningskomponentene for det tiltenkte originalspråket for organisasjonen.

Hvis du har behov for å støtte flere språk, er én fremgangsmåte å inkludere lokalisering i originalspråkstrengene. Hvis du for eksempel har en tilkoblingsrolle kalt "Friend", og du må støtte engelsk, spansk og tysk, kan du bruke teksten "Friend (Amigo/Freund)" som navn på tilkoblingsrollen. På grunn av problemer med tekstlengden kan det være begrensninger på hvor mange språk som kan støttes ved hjelp av denne fremgangsmåten.

Noen løsningskomponenter i denne gruppen er bare synlige for administratorer. Siden tilpassing av systemet bare kan utføres på organisasjonens basisspråk, er det ikke er nødvendig å gi flere språkversjoner. Sikkerhetsroller og feltsikkerhetsprofilkomponenter tilhører denne gruppen.

Kontraktmaler gir en beskrivelse av en type servicekontrakt. Disse krever tekst for feltene Navn og Forkortelse. Du bør vurdere å bruke navn og forkortelser som er unike og relevante for alle brukere av organisasjonen.

Tilkoblingsroller er avhengige av at en person velger beskrivende kategorier og navn på tilkoblingsroller. Ettersom disse kan være relativt korte, anbefales det at du tar med lokalisering i originalspråkstrenger.

Prosesser (arbeidsflyter) som startes for hendelser, kan fungere bra så lenge de ikke trenger å oppdatere poster med tekst som skal lokaliseres. Det er mulig å bruke en arbeidsflytsamling, slik at logikk som kan gjelde for lokalisert tekst, kan bruke samme strategi som plugin-modulsamlinger (Bruke XML-webressurser som språkressurser).

Behovsbetingede arbeidsflyter krever et navn slik at brukere kan velge dem. I tillegg til å inkludere lokalisering i navnet på den behovsbetingede arbeidsflyten, er en annen fremgangsmåte å opprette flere arbeidsflyter med lokaliserte navn som hver kaller den samme underordnede prosessen. Alle brukere kan imidlertid se den fullstendige listen over behovsbetingede arbeidsflyter, ikke bare de som er på det foretrukne brukergrensesnittspråket.

Oversetting kreves ikke

Løsningskomponenter for SDK-meldingsbehandlingstrinn og tjenesteendepunkt eksponerer ikke oversettbar tekst for brukere. Hvis det er viktig at disse komponentene har navn og beskrivelser som samsvarer med organisasjonens originalspråk, kan du opprette og eksportere en administrert løsning med navn og beskrivelser på dette språket.

Separat komponent for hvert språk

Løsningskomponentene nedenfor kan hver inneholde en betydelig mengde tekst som må oversettes:

  • Artikkelmaler

  • E-postmaler

  • Maler for utskriftsfletting

  • Rapporter

  • Dialoger

    For disse løsningskomponentene er anbefalt fremgangsmåte å opprette separate komponenter for hvert språk. Dette betyr at du vanligvis oppretter en grunnleggende administrert løsning som inneholder komponentene for kjerneløsningen og deretter en separat administrert løsning som inneholder disse løsningskomponentene for hvert språk. Når kunder installerer basisløsningen, kan de installere de administrerte løsningene for språkene de har klargjort for organisasjonen.

    Til forskjell fra Prosesser (arbeidsflyter) kan du opprette Dialoger som gjenspeiler brukerens gjeldende språkinnstillinger, og vise dialogboksene bare for brukere av det språket.

Opprette en lokalisert dialogboks

  1. Installer riktig språkpakke, og klargjør språket.

    Hvis du vil ha mer informasjon, kan du se Installasjonsinstruksjoner for språkpakke.

  2. Endre de personlige alternativene for å angi Brukergrensesnittspråk for språket du vil ha for dialogboksen.

  3. Gå til Innstillinger og, i Prosessenter-gruppen, velg Prosesser.

  4. Klikk Ny, og opprett dialogboksen på språket du har angitt.

  5. Etter at du har opprettet dialogboksen, endrer du de personlige alternativene for å angi originalspråket for organisasjonen.

  6. Når du bruker originalspråket for organisasjonen, kan du navigere til Løsninger-området i Innstillinger og legge til den lokaliserte dialogboksen som en del av en løsning.

    Dialogboksen som opprettes på det andre språket, vises bare for brukere som viser Dataverse på det språket.

Bruke XML-webressurser som språkressurser

Løsningskomponenter for plugin-modulsamling kan sende meldinger til en sluttbruker ved å utløse en InvalidPluginExecutionException og opprette og oppdatere oppføringer. I motsetning til Silverlight-webressurser kan ikke plugin-moduler bruke ressursfiler.

Når en plugin-modul krever oversatt tekst, kan du bruke en XML-webressurs til å lagre de lokaliserte strengene, slik at plugin-modulen kan få tilgang til dem når det er nødvendig. Strukturen i XML-filen er ditt valg, men du vil kanskje følge strukturen som brukes av ASP.NET-ressursfilene (RESX) til å opprette separate XML-webressurser for hvert språk. Følgende er for eksempel en XML-webressurs med navnet localizedString.en_US som følger mønsteret som brukes av . resx-filer.

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

Følgende kode viser hvordan en lokalisert melding kan sendes tilbake i en plugin-modul for å vise en melding til en bruker. Det gjelder forhåndsvalideringsfasen for en Delete-hendelse for Account-enheten:

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

Se også

Lokalisere produktegenskapsverdier