Zdieľať cez


Vytvorenie riešení podporujúcich viacero jazykov

Microsoft Dataverse podporuje viacero jazykov. Ak chcete, aby sa vaše riešenie nainštalovalo pre organizácie, ktoré zahŕňajú rôzne základné jazyky alebo ktoré majú nasadených viac jazykov, zohľadnite to pri plánovaní riešenia. V nasledujúcej tabuľke sú uvedené taktiky, ktoré sa majú použiť spolu so súčasťami riešenia na zahrnutie do riešenia, ktoré podporuje viac jazykov.

Taktika Typ súčasti riešenia
Webové zdroje reťazcov (RESX). Webové prostriedky
Vložené štítky Navigácia v aplikácii (mapa lokality)
Pásy
Export a import prekladov Atribúty
Grafy
Tabule
Entity
Vzťahy entít
Formuláre
Správy
Množiny možností
Zobrazenia
Lokalizácia v reťazcoch základného jazyka Šablóny zmlúv
Roly pripojenia
Procesy (pracovný postup)
Roly zabezpečenia
Profily zabezpečenia poľa
Lokalizácia sa nevyžaduje Kroky spracovania správ SDK
Koncové body služby
Samostatný komponent pre každý jazyk Šablóny článkov
Šablóny e-mailov
Šablóny hromadnej korešpondencie
Zostavy
Dialógové okná
Používajte webové zdroje XML ako jazykové zdroje Zostavy doplnkov

Nasledujúce oddiely poskytujú ďalšie podrobnosti pre každú taktiku.

Webové zdroje reťazcov (RESX)

Webové zdroje reťazcov (RESX) pridané vývojármi Dataverse majú robustnejšiu možnosť vytvárať webové zdroje, ktoré podporujú viac jazykov. Ďalšie informácie: Webové zdroje reťazcov (RESX).

Vložené štítky

Každá zo súčastí riešenia, ktoré používajú túto taktiku, vyžaduje, aby bol do účasti riešenia zahrnutý akýkoľvek lokalizovaný text.

Pásy

Po nainštalovaní jazykového balíka sa na páse aplikácie automaticky zobrazí lokalizovaný text pre všetok predvolený text v páse. Systémové štítky sú definované v hodnote atribútu ResourceId, ktorá je určená len na interné použitie. Keď pridávate svoj vlastný text, mali by ste použiť prvok <LocLabels> na poskytnutie lokalizovaného textu pre jazyky, ktoré podporujete. Viac informácií: Používanie lokalizovaných štítkov s pásmi

Mapa lokality

Po nainštalovaní jazykového balíka predvolený text v navigačnom paneli aplikácie automaticky zobrazí lokalizovaný text. Ak chcete prepísať predvolený text alebo poskytnúť svoj vlastný text, použite element <Titles>. Element Titles by mal obsahovať element <Title>, ktorý obsahuje lokalizovaný text pre všetky jazyky, ktoré vaše riešenie podporuje. Ak element Title nie je k dispozícii pre preferovaný jazyk používateľa, zobrazí sa názov, ktorý zodpovedá základnému jazyku organizácie.

Element <SubArea> umožňuje odovzdanie preferencie jazyka používateľa pomocou parametra userlcid tak, že obsah, ktorý je cieľom atribútu SubArea.Url, môže poznať preferencie jazyka používateľa a podľa toho sa upraviť. Ďalšie informácie: Odovzdanie parametrov do URL pomocou mapy lokality

Export a import prekladov

Lokalizovateľné štítky pre súčasti riešenia v nasledujúcej tabuľke je možné exportovať na lokalizáciu.

Entity Atribúty Vzťahy
Globálna množina možností Správy entity Formuláre entít
Zobrazenia entít (SavedQuery) Grafy Tabule

Preklad štítkov a zobrazenie reťazcov

Prispôsobenia sa môžu vykonať v aplikácii len pomocou základného jazyka. Preto, ak chcete pre tieto prispôsobenia poskytnúť lokalizované štítky a zobrazovacie reťazce, musíte exportovať text štítkov, aby sa dali lokalizovať pre všetky ďalšie jazyky povolené pre organizáciu. Použite nasledujúci postup:

  1. Uistite sa, že organizácia, na ktorej pracujete, má nainštalované všetky balíky MUI a nasadené jazyky, pre ktoré chcete zabezpečiť preklady.

  2. Vytvorte si riešenie a upravte komponenty.

  3. Po dokončení vývoja riešenia použite funkciu „Exportovať preklady“. Tým sa vygeneruje tabuľka Office Excel (CrmTranslations.xml), ktorá obsahuje všetky označenia, ktoré je potrebné preložiť.

  4. V tabuľke uveďte príslušné preklady.

  5. Importujte preklady späť do tej istej organizácie Dataverse pomocou funkcie „Importovať preklady“ a zverejnite svoje zmeny.

  6. Pri ďalšom exportovaní bude riešenie obsahovať všetky preklady, ktoré ste vytvorili.

    Pri importovaní riešenia sa štítky pre jazyky, ktoré nie sú dostupné v cieľovom systéme, zahodia a zaznamená sa varovanie.

    Ak štítky pre základný jazyk cieľového systému nie sú uvedené v balíku riešení, namiesto toho sa použijú štítky základného jazyka zdroja. Napríklad, ak importujete riešenie, ktoré obsahuje štítky pre angličtinu a francúzštinu s angličtinou ako základným jazykom, ale cieľový systém má ako základný jazyk japončinu a francúzštinu s japončinou, namiesto japonských štítkov sa používajú anglické štítky. Štítky základných jazykov nemôžu byť nulové ani prázdne.

Export prekladov

Pred exportovaním prekladov musíte najprv nainštalovať jazykové balíky a poskytnúť všetky jazyky, ktoré chcete lokalizovať. Preklady môžete exportovať vo webovej aplikácii alebo pomocou správy ExportTranslationRequest. Ďalšie informácie nájdete v časti Export prispôsobenej entity a textového poľa na preklad.

Preklad textu

Po otvorení súboru CrmTranslations.xml v aplikácii Office Excel sa zobrazia tri pracovné hárky uvedené v nasledujúcej tabuľke.

Pracovný hárok Popis
Informácia Zobrazuje informácie o organizácii a riešení, z ktorého boli štítky a reťazce exportované.
Reťazce zobrazenia Zobrazuje reťazce, ktoré predstavujú text všetkých správ spojených s komponentom metaúdajov. Táto tabuľka obsahuje chybové hlásenia a reťazce používané pre prvky systémového pásu s nástrojmi.
Lokalizované označenia Zobrazuje všetok text pre všetky štítky komponentov metaúdajov.

Tento súbor môžete odoslať jazykovým odborníkom, prekladateľskej agentúre alebo lokalizačnej spoločnosti. Budú musieť zabezpečiť lokalizáciu reťazcov pre všetky prázdne bunky.

Poznámka

Pre vlastné entity existujú niektoré spoločné štítky, ktoré sú zdieľané so systémovými entitami, napríklad Vytvorené dňa alebo Vytvoril používateľ. Pretože ste už nainštalovali a zabezpečili jazyky, keď exportujete jazyky pre predvolené riešenie, možno budete môcť priradiť niektoré štítky vo svojich vlastných entitách k lokalizovanému textu pre rovnaké štítky používané inými entitami. To môže znížiť náklady na lokalizáciu a zlepšiť konzistentnosť.

Po lokalizácii textu v pracovných hárkoch pridajte súbory CrmTranslations.xml a [Content_Types].xml do jedného komprimovaného súboru .zip. Teraz môžete tento súbor importovať.

Ak chcete s exportovanými súbormi pracovať programovo ako s dokumentom XML, pozrite si časť Podpora štandardov Word, Excel a PowerPoint pre informácie o schémach, ktoré tieto súbory používajú.

Importovanie preloženého textu

Dôležité

Preložený text môžete importovať späť iba do tej istej organizácie, z ktorej bol exportovaný.

Potom, ako ste exportovali prispôsobenú entitu alebo text atribútu a nechali ho preložiť, môžete importovať preložené textové reťazce vo webovej aplikácii pomocou správy ImportTranslationRequest. Importovaný súbor musí byť komprimovaný a musí obsahovať v koreňovom adresári súbory CrmTranslations.xml a [Content_Types].xml. Ďalšie informácie nájdete v časti Import preloženého textu entity a poľa.

Po importovaní dokončených prekladov sa prispôsobený text zobrazí pre používateľov, ktorí pracujú v jazykoch, pre ktoré ste nechali text preložiť.

Poznámka

Dataverse nedokáže importovať preložený text s dĺžkou presahujúcou 500 znakov. Ak dĺžka niektorej z položiek v preklade presahuje 500 znakov, proces importu zlyhá. Ak proces importu zlyhá, skontrolujte riadok v súbore, ktorý spôsobil zlyhanie, znížte počet znakov a pokúste sa import zopakovať.

Keďže je prispôsobovanie podporované len v základnom jazyku, môžete pracovať v Dataverse so základným jazykom nastaveným ako vašou jazykovou preferenciou. Ak chcete overiť, či sa preložený text zobrazuje, musíte zmeniť jazykovú preferenciu pre používateľské rozhranie Dataverse. Ak chcete vykonať ďalšie práce prispôsobenia, musíte jazyk zmeniť späť na základný jazyk.

Lokalizácia v reťazcoch základného jazyka

Niektoré súčasti riešenia nepodporujú viac jazykov. Tieto komponenty zahŕňajú názvy alebo texty, ktoré môžu mať význam iba v konkrétnom jazyku. Ak vytvoríte riešenie pre konkrétny jazyk, zadefinujte tieto súčasti riešenia pre zamýšľaný základný jazyk organizácie.

Ak potrebujete podporovať viac jazykov, jedinou taktikou je zahrnúť lokalizáciu do reťazcov základného jazyka. Napríklad, ak máte rolu pripojenia s názvom „Priateľ“ a potrebujete podporovať slovenčinu, španielčinu a nemčinu, môžete ako názov roly pripojenia použiť text „Priateľ (Amigo/Freund)“. Kvôli problémom s dĺžkou textu existujú obmedzenia, koľko jazykov môže byť pomocou tejto taktiky podporovaných.

Niektoré súčasti riešenia v tejto skupine sú viditeľné iba pre správcov. Pretože prispôsobenie systému možno vykonať iba v základnom jazyku organizácie, nie je potrebné poskytovať viac jazykových verzií. Roly zabezpečenia a Profil zabezpečenia poľa komponenty patria do tejto skupiny.

Vzory zmlúv poskytnúť popis typu zmluvy o poskytovaní služieb. Tieto vyžadujú text pre polia Názov a Skratka. Mali by ste zvážiť použitie názvov a skratiek, ktoré sú jedinečné a vhodné pre všetkých používateľov organizácie.

Úlohy spojenia spoľahnite sa na osobu, ktorá vyberie popisné kategórie a názvy rolí pripojenia. Pretože môžu byť relatívne krátke, odporúčame vám zahrnúť lokalizáciu do reťazcov základného jazyka.

Procesy (pracovné postupy) ktoré sú iniciované pre udalosti, môžu fungovať dobre, pokiaľ nepotrebujú aktualizovať záznamy textom, ktorý sa má lokalizovať. Je možné použiť zostavu pracovného toku, aby logika, ktorá by sa mohla vzťahovať na lokalizovaný text, mohla používať rovnakú stratégiu ako zostavy doplnkových modulov (Ako jazykové zdroje použite webové zdroje XML).

Pracovné postupy na požiadanie vyžadujú meno, aby si ich ľudia mohli vybrať. Okrem zahrnutia lokalizácie do názvu pracovného postupu na požiadanie je ďalšou taktikou vytvorenie viacerých pracovných postupov s lokalizovanými názvami, z ktorých každý volá rovnaký podradený proces. Všetci používatelia však uvidia úplný zoznam pracovných postupov na požiadanie, nielen tých, ktoré sa nachádzajú v ich preferovanom jazyku používateľského rozhrania.

Nevyžaduje sa lokalizácia

Spracovanie správ SDK krok a Koncový bod služby komponenty riešenia nevystavujú používateľom lokalizovateľný text. Ak je dôležité, aby tieto komponenty mali názvy a popisy, ktoré zodpovedajú základnému jazyku organizácie, môžete vytvoriť a exportovať spravované riešenie s názvami a popismi v tomto jazyku.

Samostatná súčasť pre každý jazyk

Každá z nasledujúcich súčastí riešenia môže obsahovať značné množstvo textu, ktorý sa má lokalizovať:

  • Šablóny článkov

  • Šablóny e-mailov

  • Šablóny hromadnej korešpondencie

  • Zostavy

  • Dialógové okná

    Pre tieto typy súčastí riešenia sa odporúča vytvoriť samostatné súčasti pre každý jazyk. To znamená, že zvyčajne vytvoríte spravované riešenie, ktoré obsahuje vaše hlavné súčasti riešenia, a potom samostatné spravované riešenie, ktoré obsahuje tieto súčasti riešenia pre každý jazyk. Keď zákazníci nainštalujú základné riešenie, môžu nainštalovať spravované riešenia pre jazyky, ktoré pre organizáciu zabezpečili.

    Na rozdiel od Procesy (pracovné postupy) môžete vytvoriť Dialógy, ktoré odzrkadľujú aktuálne nastavenie preferencií jazyka používateľa a zobrazia dialógové okná iba používateľom tohto jazyka.

Vytvorenie lokalizovaného dialógového okna

  1. Nainštalujte príslušný jazykový balík a nasaďte jazyk.

    Viac informácií nájdete v časti Pokyny na inštaláciu jazykových balíkov.

  2. Zmeňte svoje osobné možnosti a zadajte Jazyk používateľského rozhrania pre jazyk, ktorý chcete pre dialógové okno.

  3. Prejdite na Nastavenia a v skupine Centrum spracovania vyberte Procesy.

  4. Kliknite na Nový a vytvorte dialógové okno v jazyku, ktorý ste zadali.

  5. Po vytvorení dialógového okna zmeňte svoje osobné možnosti a určte základný jazyk organizácie.

  6. Pri používaní základného jazyka organizácie môžete prejsť do oblasti Riešenia v časti Nastavenia a pridať lokalizovaný dialóg ako súčasť riešenia.

    Dialóg vytvorený v inom jazyku sa zobrazí iba používateľom, ktorí si prezerajú Dataverse pomocou tohto jazyka.

Ako jazykové zdroje použite webové zdroje XML

Komponenty riešenia zostavenia doplnkov môžu odosielať správy koncovému užívateľovi vyvolaním InvalidPluginExecutionException ako aj vytváraním a aktualizovaním záznamov. Na rozdiel od webových zdrojov Silverlight nemôžu doplnky používať súbory zdrojov.

Ak doplnok vyžaduje lokalizovaný text, môžete na uloženie lokalizovaných reťazcov použiť webový zdroj XML, aby k nim mohol doplnok v prípade potreby získať prístup. Štruktúra XML je vaša voľba, ale možno budete chcieť sledovať štruktúru používanú súbormi zdrojov ASP.NET (.resx) na vytvorenie samostatných webových zdrojov XML pre každý jazyk. Nasleduje napríklad webový zdroj XML s názvom localizedString.en_US, ktorý používa vzor používaný súbormi . resx.

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

Nasledujúci kód ukazuje, ako môže byť lokalizovaná správa odovzdaná späť v doplnku na zobrazenie správy používateľovi. Je to pre fázu pred validáciou a udalosť Delete pre entitu Account:

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

Pozrite si tiež

Lokalizovať hodnoty vlastností produktu