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. K manipulaci s daty a formátování dat použijte třídy pracující s jazykovou verzí poskytovanou oborem System.Globalization názvů.

    • 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. V odpovídajících situacích použijte nastavení vlastnosti jazykové verze poskytované System.Globalization.CultureInfo třídou. CultureInfo.CurrentCulture Vlastnost slouží k formátování úkolů, jako je datum a čas nebo číselné formátování. CultureInfo.CurrentUICulture Pomocí vlastnosti můžete načíst prostředky. Všimněte si, že CurrentCulture vlastnosti a CurrentUICulture vlastnosti lze nastavit pro každé vlákno.

  4. Povolte aplikaci čtení a zápisu dat 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. Zobrazí text pomocí tříd poskytovaných oborem System.Drawing názvů.

  8. Pro konzistenci napříč operačními systémy nepovolujte přepsání CultureInfouživatelských nastavení . 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ězců nebo změny velikosti písmen, použijte operaci řetězce bez rozlišování jazykové verze. 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 CultureInfonavíc explicitně formát zaokrouhlování (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 knihoven DLL jen pro prostředky. To zmást překladatele.

  4. Nepoužívejte složené řetězce vytvořené za běhu 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 konstruktorům, jako je například "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. Povolte spoustu místa pro délku řetězců, aby se rozšířilo 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. System.Resources.ResourceManager Pomocí třídy můžete načíst prostředky na základě jazykové verze.

  9. Pomocí sady Visual Studio můžete vytvářet model Windows Forms dialogová okna, aby bylo možné je lokalizovat pomocí editoru prostředků model Windows Forms (Winres.exe). Nezakódujte model Windows Forms dialogová okna 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

Tip

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 CurrentUICulture vlastnosti a CurrentCulture vlastnosti ve vaší aplikaci. Nespoléhejte na výchozí hodnoty.

  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ě jazykové verze.

  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 requestEncodingobjekty , , fileEncodingresponseEncoding, culturea uiCulture atributy na následujících třech místech v aplikaci ASP.NET:

    • V části globalizace souboru Web.config . Tento soubor je externí pro ASP.NET aplikaci. Další informace naleznete v tématu <globalizace> elementu.
    • V direktivě stránky. Všimněte si, že když je aplikace na stránce, soubor už byl přečtený. Proto je příliš pozdě zadat 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 v době, kdy je dosaženo kódu aplikace, je příliš pozdě zadat fileEncoding a requestEncoding. 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í povolte aktualizace s nulovými výpadky (například Azure Container Apps) nebo podobné situace, kdy může existovat více instancí aplikace s různými pravidly formátu nebo jinými daty jazykové verze, nejrelevantnějšími 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 testovatelné potenciálně jednodušší a paralelizovatelné, měli byste zvážit explicitní předávání nastavení relevantních pro jazykovou verzi, jako CultureInfo jsou parametry, metodám, které provádějí formátování, a TimeZoneInfo metodám, které pracují s daty a časy. Při načítání času byste také měli použít TimeProvider 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). Když se spoléháte na přesnou hodnotu, testy se zpřesní.

    • 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 analyzují na vstupní hodnotu (zaokrouhlování). Je potř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 zkrátí nebo zaokrouhlí hodnotu (například pro výstup s plovoucí desetinou čárkou).
    • Pokud máte explicitní požadavky na ověření veškerého lokalizovaného výstupu formátu, 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í. V případě složitějších případů podtřídy typu umožňují přepsání dalších vlastností. Existují možné další výhody, například povolení pseudolokalizace se soubory prostředků.
    • 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é