Sdílet prostřednictvím


Osvědčené postupy pro vývoj aplikací připravených pro svět

Tato část popisuje osvědčené postupy, které je potřeba dodržovat při vývoji aplikací připravených pro svět.

Osvědčené postupy globalizace

  1. Interně nastavte kódování Unicode vaší aplikace.

  2. Pro manipulaci a formátování dat použijte třídy zadané oborem názvů System.Globalization, které jsou přizpůsobené kulturním kontextům.

    • K řazení použijte SortKey třídu a CompareInfo třídu.
    • Pro porovnání řetězců použijte CompareInfo třídu.
    • Pro formátování data a času použijte DateTimeFormatInfo třídu.
    • Pro číselné formátování použijte NumberFormatInfo třídu.
    • Pro gregoriánské a negregoriánské kalendáře použijte Calendar třídu nebo jednu z konkrétních implementací kalendáře.
  3. Použijte nastavení vlastnosti jazykové verze poskytované System.Globalization.CultureInfo třídou v situacích, kdy je to vhodné. CultureInfo.CurrentCulture Vlastnost slouží k formátování úkolů, jako je datum a čas nebo číselné formátování. Pomocí vlastnosti CultureInfo.CurrentUICulture můžete načíst prostředky. Všimněte si, že CurrentCulture vlastnosti a CurrentUICulture vlastnosti lze nastavit pro každé vlákno.

  4. Umožněte vaší aplikaci číst a zapisovat data do a z různých kódování pomocí tříd kódování v System.Text oboru názvů. Nepředpokládejte data ASCII. Předpokládejme, že mezinárodní znaky budou zadány všude, kde uživatel může zadat text. Aplikace by například měla přijímat mezinárodní znaky v názvech serverů, adresářích, názvech souborů, uživatelských jménech a adresách URL.

  5. Při použití UTF8Encoding třídy z bezpečnostních důvodů použijte funkci detekce chyb, kterou tato třída nabízí. Chcete-li zapnout funkci detekce chyb, vytvořte instanci třídy pomocí konstruktoru, který přebírá throwOnInvalidBytes parametr a nastaví hodnotu tohoto parametru na true.

  6. Kdykoli je to možné, zpracujte řetězce jako celé řetězce místo jako řady jednotlivých znaků. To je zvlášť důležité při řazení nebo hledání podřetěžců. Tím zabráníte problémům spojeným s parsováním kombinovaných znaků. Pomocí třídy můžete také pracovat s jednotkami textu, nikoli s jedními znaky System.Globalization.StringInfo .

  7. Zobrazte text prostřednictvím tříd poskytovaných oborem názvů System.Drawing.

  8. Pro konzistenci napříč operačními systémy nepovolujte uživatelským nastavením přepsat CultureInfo. CultureInfo Použijte konstruktor, který přijímá useUserOverride parametr a nastaví ho na false.

  9. Otestujte funkčnost aplikace na mezinárodních verzích operačního systému pomocí mezinárodních dat.

  10. Pokud je rozhodnutí o zabezpečení založeno na výsledku operace porovnání řetězce nebo změně velikosti písmen, použijte operaci řetězce nezávislou na kulturních specifikách. Tento postup zajistí, že výsledek nebude ovlivněn hodnotou CultureInfo.CurrentCulture. Podívejte se na část Porovnání řetězců, která používají aktuální jazykovou verzi , v části Osvědčené postupy pro použití řetězců pro příklad, který ukazuje, jak porovnání řetězců citlivých na jazykovou verzi může vést k nekonzistentním výsledkům.

  11. Pro každý prvek, který se používá pro výměnu (například pole v dokumentu JSON ve volání rozhraní API) nebo úložiště, použijte CultureInfo, a navíc explicitně určete formát pro obousměrnou kompatibilitu (například "O""o" specifikátor formátu data a času). I když jsou formátovací řetězce pro neutrální jazykovou verzi stabilní a pravděpodobně se nezmění, zadání řetězce explicitního formátu pomáhá objasnit záměr vašeho kódu.

  12. Data globalizace nejsou stabilní a měli byste napsat aplikaci a její testy s ohledem na to. Aktualizuje se několikrát ročně prostřednictvím hostitelských kanálů operačního systému na všech podporovaných platformách. Tato data se obvykle nedistribuují s modulem runtime.

Osvědčené postupy lokalizace

  1. Přesuňte všechny lokalizovatelné prostředky do samostatných knihoven DLL jen pro prostředky. Lokalizovatelné prostředky zahrnují prvky uživatelského rozhraní, jako jsou řetězce, chybové zprávy, dialogová okna, nabídky a vložené prostředky objektů.

  2. Nezakódujte řetězce ani prostředky uživatelského rozhraní.

  3. Neukládejte nelokalizovatelné prostředky do DLL knihoven, které obsahují pouze prostředky. To zmást překladatele.

  4. Nepoužívejte složené řetězce vytvořené za běhu ze zřetězených frází. Složené řetězce jsou obtížné lokalizovat, protože často předpokládají gramatické pořadí v angličtině, které neplatí pro všechny jazyky.

  5. Vyhněte se nejednoznačným konstrukcím, jako je "Prázdná složka", kde lze řetězce přeložit odlišně v závislosti na gramatických rolích součástí řetězce. Například "prázdné" může být buď sloveso, nebo adjektivní jméno, což může vést k různým překladům v jazycích, jako je italština nebo francouzština.

  6. Nepoužívejte obrázky a ikony, které obsahují text v aplikaci. Jsou nákladné na lokalizaci.

  7. Zajistěte dostatek místa pro rozšíření délky řetězců v uživatelském rozhraní. V některých jazycích můžou fráze vyžadovat 50–75 % větší prostor, než potřebují v jiných jazycích.

  8. Použijte System.Resources.ResourceManager třídu k získání prostředků na základě kultury.

  9. Pomocí sady Visual Studio můžete vytvořit dialogová okna Windows Forms, aby bylo možné je lokalizovat pomocí Editoru prostředků Windows Forms (Winres.exe). Neokódujte dialogová okna Windows Forms ručně.

  10. Zařiďte si profesionální lokalizaci (překlad).

  11. Úplný popis vytváření a lokalizace prostředků najdete v tématu Prostředky v aplikacích .NET.

Osvědčené postupy globalizace pro ASP.NET a další serverové aplikace

Návod

Následující osvědčené postupy jsou určené pro aplikace ASP.NET Framework. Informace o aplikacích ASP.NET Core najdete v tématu Globalizace a lokalizace v ASP.NET Core.

  1. Explicitně nastavte vlastnosti CurrentUICulture a CurrentCulture ve vaší aplikaci. Nespoléhejte na výchozí nastavení.

  2. Všimněte si, že ASP.NET aplikace jsou spravované aplikace a proto mohou používat stejné třídy jako jiné spravované aplikace pro načítání, zobrazování a manipulaci s informacemi na základě kultury.

  3. Mějte na paměti, že v ASP.NET můžete zadat následující tři typy kódování:

    • requestEncoding určuje kódování přijaté z prohlížeče klienta.
    • responseEncoding určuje kódování, které se má odeslat do klientského prohlížeče. Ve většině situací by toto kódování mělo být stejné jako zadané pro requestEncoding.
    • FileEncoding určuje výchozí kódování pro analýzu souborů .aspx, .asmx a .asax .
  4. Zadejte hodnoty pro atributy requestEncoding, responseEncoding, fileEncoding, culture a uiCulture na následujících třech místech v aplikaci ASP.NET.

    • V souboru Web.config v části globalizace. Tento soubor je externí pro ASP.NET aplikaci. Další informace naleznete v <globalization> elementu.
    • V direktivě stránky. Všimněte si, že když je aplikace na stránce, soubor už byl přečtený. Proto je již pozdě pro zadání fileEncoding a requestEncoding. Pouze uiCulture, culturea responseEncoding lze zadat v direktivě stránky.
    • Programově v kódu aplikace. Toto nastavení se může u jednotlivých požadavků lišit. Stejně jako u direktivy stránky je příliš pozdě zadat fileEncoding a requestEncoding ve chvíli, kdy je dosaženo kódu aplikace. Pouze uiCulture, culturea responseEncoding lze zadat v kódu aplikace.
  5. Všimněte si, že hodnotu uiCulture lze nastavit na jazyk, který prohlížeč přijímá.

  6. U distribuovaných aplikací, které umožňují aktualizace bez výpadku (například Azure Container Apps) nebo podobné funkce, je nutné plánovat situace, kdy může existovat více instancí aplikace s různými formátovými pravidly nebo jinými kulturními daty, zejména pravidly časového pásma.

    • Pokud vaše nasazení aplikace obsahuje databázi, mějte na paměti, že databáze bude mít vlastní pravidla globalizace. Ve většině případů byste se měli vyhnout provádění jakýchkoli funkcí souvisejících s globalizací v databázi.
    • Pokud vaše nasazení aplikace zahrnuje klientskou aplikaci nebo webový front-end pomocí prostředků globalizace klienta, předpokládejme, že se klientské prostředky liší od prostředků dostupných pro váš server. Zvažte výhradní provádění funkcí globalizace na klientovi.

Doporučení pro robustní testování

  1. Pokud chcete, aby závislosti byly explicitnější a testování potenciálně jednodušší a paralelizovatelné, měli byste zvážit explicitní předávání nastavení relevantních pro kulturu, například CultureInfo parametry, metodám provádějícím datové formátování, a TimeZoneInfo metodám pracujícím s daty a časy. Při načítání času byste měli použít nebo podobný typ.

  2. U většiny testů byste neměli explicitně ověřovat přesný výstup dané operace formátování ani přesný posun časového pásma. Formátování a data časového pásma se můžou kdykoli změnit a mohou se lišit mezi dvěma jinak identickými instancemi operačního systému (a potenciálně různými procesy na stejném počítači). Spoléhat se na přesnou hodnotu způsobuje, že testy jsou křehké.

    • Obecně platí, že ověření, že byl přijat nějaký výstup, bude stačit (například neprázdné řetězce při formátování).
    • U některých datových prvků a formátů se místo toho může použít ověření, že se data zpracovávají zpět na původní vstupní hodnotu (roundtripping). Je třeba věnovat pozornost případům, kdy se pole vyřadí (například rok u některých polí souvisejících s datem) nebo se hodnota zkrátí, nebo zaokrouhlí (například pro výstup s pohyblivou desetinnou čárkou).
    • Pokud máte explicitní požadavky na ověření veškerého výstupu formátů lokalizovaných na míru, měli byste při nastavování testu zvážit vytvoření a použití vlastní jazykové verze. Ve většině jednoduchých případů to lze provést vytvořením instance objektu CultureInfo s jeho konstruktorem new CultureInfo(..) a nastavením DateTimeFormat a NumberFormat vlastností. U složitějších případů podtřídění typu umožňuje přepsat další vlastnosti. Existují možné další výhody, například povolení pseudolokalizace se zdrojovými soubory.
    • Pokud máte explicitní požadavky na ověření výsledků všech operací s datem a časem, měli byste zvážit vytvoření a použití vlastní TimeZoneInfo instance během instalace testu. Existují možné další výhody, například povolení stabilního testování určitých hraničních případů (například změny pravidel DST).

Viz také