Haladó programozás (C#) 2007–2008, I. félév BMF NIK
Nemzetközi és többnyelvű alkalmazások fejlesztése Nemzetközi alkalmazások készítésének szempontjai Globalizáció és lokalizáció Nyelvi és kulturális jellemzők kezelése
Nyelvi erőforrások készítése és felhasználása Erőforrások kezelése Erőforrások használata .NET alkalmazásokban
Többnyelvű Windows Forms alkalmazások fejlesztése Nyelvfüggő elemek elkészítése Nyelvváltás fejlesztés közben és futási időben
© Miklós Árpád, BMF NIK, 2007
[email protected]
Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelező irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges.
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007
[email protected]
2
Globalizáció és lokalizáció • Az alkalmazások egyre nagyobb hányada készül a globális piacra A különböző országokban és kultúrákban sokféle írásmódot és naptárat használnak, eltérően kezelik a számokat és a dátumokat, sőt, akár a sorbarendezés szabályai is mások lehetnek. A nemzetközi piacra szánt alkalmazásoknak mindezt tekintetbe kell venniük.
• Globalizáció: alkalmazások felkészítése arra, hogy más kultúrájú szoftverkörnyezetben is helyesen működjenek Ennek eredményeként a programok képesek lesznek más írásmódok (pl. jobbról balra), naptárak, szám- és dátumformátumok használatára is.
• Lokalizáció: alkalmazások lefordítása más nyelvekre, kultúrákra A lokalizált alkalmazások felhasználói felülete és összes üzenete a célnyelven jelenik meg. Egy .NET alkalmazás akár több nyelven is képes lehet működni (nincs szükség külön nyelvi verziókra).
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007
[email protected]
3
1
Nyelvi és kulturális jellemzők kezelése • A .NET keretrendszerben a System.Globalization névtér osztályai teszik lehetővé a nemzetközi alkalmazások nyelvi és kulturális jellemzőinek kezelését – – – –
V1.0
Ezek az osztályok a következő lehetőségeket biztosítják: Egyszerű és kombinált Unicode karakterek helyes kezelése Kultúrák és régiók azonosítása több szinten Számok, dátum és idő, pénznemek, mértékegységek kultúrafüggő kezelése Kultúrafüggő sorbarendezési lehetőségek
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007
[email protected]
4
Unicode • A .NET keretrendszer UTF-16 formátumban tárolja a karaktereket Ez a 16 bites Unicode szabvány nem teszi lehetővé a világ összes írásjelének közvetlen kódolását (csupán a kínai nyelvhez 80 000 karakterre van szükség), ám ésszerű kompromisszumot képvisel a tárolás helyigénye és a feldolgozás sebessége, valamint a karakterek kezelésének kényelme és egyszerűsége között.
• Egyes karakterek több Unicode karakter kombinációjából állnak Az összetett karakterek egy alapkarakterből és egy vagy több kombináló karakterből épülnek fel. Az európai és amerikai nyelveknél általában külön karakterként is rendelkezésre áll minden összetett (pl. ékezetes) karakter is, a távol-keleti nyelveknél azonban szinte csak összetett karakterek léteznek. Egy európai példa: = ǻ a + ̊ + ́ 0x01FB 0x0061 0x030A 0x0301 Ahhoz, hogy egy alkalmazás nemzetközi lehessen, tudnia kell arról, hogy egy megjelenített írásjel fizikailag több karakterből is állhat, tehát nem használhatja a char típust (ehelyett a string típus ajánlott). V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007
[email protected]
5
Kultúrák és régiók • A .NET keretrendszer a világot kultúrákra és régiókra osztja – A „kultúra” fogalom egy adott nyelv és a hozzá tartozó valamely nyelvterület nyelvhasználati konvencióinak összességét jelenti. A .NET keretrendszer az egyes kultúrákat az ISO-639-2 szabványt követve a nyelv és a nyelvterület alapján különbözteti meg egymástól az alábbi jelölésmóddal:
Például az „en-US” kód az Egyesült Államokban használt angol nyelvi kultúrát jelöli, a „pt-BR” kód pedig a Brazíliában használt portugál nyelvi kultúrát. – A „régió” egy adott földrajzi terület (általában egy ország) kulturális jellemzőit határozza meg az ISO 3166 szabvány szerint. Egy régióban több nyelvet is beszélhetnek (pl. Spanyolországban a spanyol, baszk, katalán és galíciai nyelveket), de több régiónak is lehet közös nyelve (pl. Mexikó, Spanyolország, Guatemala és Argentína egyaránt spanyol nyelvterület). – A kultúrák egyedi jellemzőit (naptár, számok és dátumok formázása, sorbarendezés szabályai) a System.Globalization.CultureInfo osztály kezeli. – A régiók egyedi jellemzőit (pénznem, mértékegység típusa) a System.Globalization.RegionInfo osztály kezeli. V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
6
2
Kultúrák típusai • A kultúrák közös jellemzőinek egyszerűbb kezelése érdekében a .NET keretrendszer több kultúratípust határoz meg – Konkrét kultúra („specific culture”) – egy adott régió saját kultúrája – Semleges kultúra („neutral culture”) – régiófüggetlen kultúra – Független kultúra („invariant culture”) – mesterséges „kultúra” (adatok egyértelmű, kultúrafüggetlen tárolásához és megosztásához) A kultúratípusok egymással hierarchikus viszonyban állnak: Egyetlen független kultúra létezik
Független Konkrét kultúrák
de de-AT de-CH
Semleges kultúrák
de-DE en
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
7
Kultúrák kezelése alkalmazásokban • A kultúra- és régióbeállítások a .NET keretrendszerben szál szintűek Alapértelmezett értéküket a Windows Vezérlőpult „Területi és nyelvi beállítások” programjával beállított értékek határozzák meg. A Windows egynyelvű (angol vagy lokalizált) változatainál csak a formázási és sorbarendezési beállítások módosíthatók itt, többnyelvű (MUI) verziók esetén viszont a felhasználói felület alapértelmezett nyelve is beállítható.
• System.Thread.CurrentCulture tulajdonság Az adott szál nyelvfüggő formázási és sorbarendezési tulajdonságait meghatározó kultúra lekérdezésére és beállítására szolgál.
• System.Thread.CurrentUICulture tulajdonság Az adott szálhoz tartozó felhasználói felület nyelvének lekérdezésére és beállítására szolgál.
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
8
Példa az aktuális kultúra adatainak kiírására 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
V1.0
using System; using System.Threading; class Program { static void Main() { Console.WriteLine("Aktuális kultúra:"); Console.WriteLine("Teljes angol név: " + Thread.CurrentThread.CurrentCulture.EnglishName); Console.WriteLine("Teljes saját név: " + Thread.CurrentThread.CurrentCulture.NativeName); Console.WriteLine("Kultúra neve: " + Thread.CurrentThread.CurrentCulture.Name); Console.WriteLine("Kultúra kódja: " + Thread.CurrentThread.CurrentCulture.LCID); Console.WriteLine("Naptár: " + Thread.CurrentThread.CurrentCulture.Calendar); } }
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
9
3
Számok és dátumok kultúrafüggő formázása • A számokat és a dátumokat kezelő osztályok kínálnak olyan ToString() metódusváltozatokat is, amelyekkel kultúrafüggő formázások végezhetők automatikusan Általában olyan metódusváltozatok is rendelkezésre állnak, amelyekkel tetszőleges formázás végezhető (akár egyéni formázókarakterek alapján is) az IFormatProvider interfész megvalósításával. A keretrendszer ehhez is kínál előre elkészített osztályokat (NumberFormatInfo, DateTimeFormatInfo), amelyekkel egy kultúrafüggő alapformátumból kiindulva minden egyes megjelenített elem módosítható.
• Számok kultúrafüggő formázása (példa) int szám = 1234567890; Console.WriteLine(szám.ToString("N")); Console.WriteLine(szám.ToString("N", new CultureInfo("de-DE")));
• Dátumok kultúrafüggő formázása (példa) DateTime dátum = new DateTime(2007, 08, 01); Console.WriteLine(dátum.ToString("D")); Console.WriteLine(dátum.ToString("D", new CultureInfo("es-AR"))); V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
10
Feladat (1) Készítsünk alkalmazást, amely felsorolja a rendszeren telepített összes kultúrát és megjeleníti alapadataikat! A program minden kultúrához jelenítse meg a hozzá tartozó régióadatokat, valamint példaként egy-egy számot, dátumot és időt az adott kultúra beállításaival! Ötletek: – A kultúrák listáját a CultureInfo osztály statikus GetCultures() metódusával kérhetjük le – A CultureInfo osztály IsNeutralCulture tulajdonsága elárulja, hogy egy kultúra semleges vagy konkrét – A független kultúra hárombetűs ISO nyelvi azonosítója „IVL” – A régióadatokat a RegionInfo osztály egy példányán keresztül kérhetjük le, amelyet egy kultúra vagy annak kétjegyű (régiófüggetlen) kódja megadásával hozhatunk létre V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
11
Megoldás (1)
CultureDemo\Program.cs V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
12
4
Kultúrafüggő sorbarendezés • A karakterek ABC sorrendje minden kultúrában más lehet A magyar nyelvben például az ékezetes betűk beékelődnek az ékezet nélküliek közé, valamint vannak kettősbetűk is (cs, cz, gy, ny, ty, sz, zs), vagy például a finn nyelvben a V és a W betű rendezés szempontjából azonos
• Az aktuális szál kultúrájának módosítása a sorbarendezési beállításokra is hatással van Nem szabad figyelmen kívül hagyni, hogy a névsorba történő rendezést befolyásolják az operációs rendszer éppen érvényes nyelvi beállításai.
Ha arra van szükség, hogy egy tömb vagy gyűjtemény sorbarendezése független legyen az aktuális kultúrától (például kommunikáció, illetve fájlban vagy szerveren történő tárolás céljából), akkor a rendezést a független kultúra beállítása mellett kell végrehajtani.
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
13
Példa kultúrafüggő sorbarendezésre 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 V1.0
using System; using System.Globalization; using System.Threading; class Program { static void Main() { string[] alphabet = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "á", "é", "í", "ó", "ú", "ö", "ő", "ü", "ű", "cs", "gy", "ly", "ny", "sz", "ty", "zs", "cz", "zu", "zv" }; Thread.CurrentThread.CurrentCulture = new CultureInfo("hu-HU"); Array.Sort(alphabet, StringComparer.Ordinal); DisplayAlphabet("Kultúra figyelembe vétele nélküli sorrend:", alphabet); Array.Sort(alphabet, StringComparer.InvariantCulture); DisplayAlphabet("Független kultúra szerinti sorrend:", alphabet); Array.Sort(alphabet); DisplayAlphabet("Magyar ábécé szerinti sorrend:", alphabet); } static void DisplayAlphabet(string title, string[] letters) { Console.WriteLine(title); foreach (string s in letters) Console.Write(s + " "); Console.WriteLine(); } } 2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
14
Erőforrások • A szerelvények az IL kód mellett tartalmazhatnak egyéb, a programok számára szükséges adatokat is (szövegek, ikonok, képek, hangok, fájlok, egyéni adatok), amelyeket összefoglaló néven erőforrásoknak nevezünk Erőforrások előállíthatók egyszerű szöveges fájlként, a Microsoft ResX sémáját követő XML fájl formájában, illetve megfelelő formátumú bináris fájlként. Szerelvényben történő elhelyezésük a parancssoros fordító megfelelő paraméterezésével lehetséges (ehhez először a resgen.exe segédeszközzel bináris formátumba kell őket alakítani).
• Az erőforrások közvetlen (manuális) kezelését a System.Resources.ResourceReader és a System.Resources.ResourceWriter osztályok támogatják A Visual Studio segítségével az erőforrások előállítása, programhoz rendelése, szerelvénybe illesztése és használata kényelmesebben is megvalósítható. V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
15
5
Erőforrások kezelése (Visual Studio) • A Visual Studio minden új Windows alkalmazáshoz előkészít egy alapértelmezett ResX formátumú erőforrásfájlt Ezt a fájlt Resources.resx néven a projekt Properties mappájában találjuk (vagy a projekt tulajdonságlapján hozhatjuk létre). Emellett tetszőleges számú saját erőforrásfájlt is létrehozhatunk bármely mappában.
• Az erőforrások szerkesztése során a megfelelő névtérben létrejön egy osztály, amely statikus tulajdonságok segítségével szigorúan típusos hozzáférést biztosít az elkészített erőforrásokhoz
Különböző típusú erőforrások
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
16
Példa erőforrások kezelésére 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 V1.0
using System; using System.Windows.Forms; //using System.Reflection; using System.Resources; partial class MainForm: Form { // .NET 1.1 esetén a megjegyzésekben szereplő kódra van szükség //private ResourceManager rm; public MainForm() { InitializeComponent(); //Assembly assembly = Assembly.GetExecutingAssembly(); //rm = new ResourceManager("ResourceDemo.Demo", assembly); //pictureLogo.Image = (Image) rm.GetObject("Logo"); //textName.Text = rm.GetString("ProductName"); //textAuthor.Text = rm.GetString("Author"); //textDescription.Text = rm.GetString("Description"); //comboLanguage.Text = rm.GetString("Language"); pictureLogo.Image = Demo.Logo; textName.Text = Demo.ProductName; textAuthor.Text = Demo.Author; textDescription.Text = Demo.Description; comboLanguage.Text = Demo.Language; } } 2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
17
Többnyelvű Windows Forms alkalmazások • A többnyelvű alkalmazások fejlesztésénél minden, a képernyőn megjelenített elemet erőforrásokban kell elhelyezni Elsősorban az üzenetek szövegénél fontos, hogy ezek nem szerepelhetnek közvetlenül a kódban (ez esetben ugyanis minden egyes támogatni kívánt nyelvhez külön programverzióra lenne szükség). A szöveges és egyéb erőforrások kezelését a Visual Studio nagyban megkönnyíti.
• Ablakok esetében a System.Windows.Forms.Form osztály Localizable tulajdonsága segítségével kapcsolható be a többnyelvűség automatikus támogatása Ha ezt a tulajdonságot beállítjuk, akkor a Visual Studio automatikus kódgenerátora erőforrásalapú üzemmódba kapcsol, és minden grafikai elemet erőforrásként tart nyilván. A System.Windows.Forms.Form osztály Language tulajdonságának ismételt módosításával egyazon ablak több nyelvi változatát hozhatjuk létre, amelyek között az aktuális kultúra módosításával futási időben is lehet váltani. Az egyes nyelvi változatok létrehozásakor a nem ablak jellegű erőforrásokból nem jön létre automatikusan új példány, ezt másolással, beillesztéssel és átnevezéssel oldhatjuk meg. V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
18
6
Kultúra- és nyelvváltás futási időben • A .NET keretrendszer futás közben automatikusan megkeresi és betölti az aktuálisan beállított kultúrához tartozó erőforrásokat Amennyiben egy konkrét kultúrához nincsenek erőforrások, a keresés a hozzá tartozó semleges kultúrával folytatódik. Ha ehhez sem találhatók erőforrások, akkor a programba közvetlenül beépített erőforrásokat használja majd a futó alkalmazás. Ez azt is jelenti, hogy nem feltétlenül szükséges minden konkrét kultúrához külön fordítást készíteni, elég a hozzá tartozó semleges kultúrához – azaz például egyetlen semleges német fordítással („de”) lefedhető az osztrák („de-AT”), a svájci („de-CH”) és a németországi („de-DE”) nyelvterület is.
• Az erőforrások betöltése és alkalmazása az egyes konstruktorok lefutása közben történik Ha futás közben a program újraindítása nélkül szeretnénk nyelvet váltani, az ablakok konstruktorában szereplő InitializeComponent() metódushívás megismétlésével erre van lehetőség (ilyenkor azonban elvesznek az ablakban addig beállított vagy begépelt értékek). V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
19
Példa többnyelvű .NET alkalmazásra
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
20
Irodalomjegyzék (alapismeretek) • C. Nagel, B. Evjen, J. Glynn, M. Skinner, K. Watson, A. Jones: Professional C# 2005 Kiadó: Wiley Publishing, Inc., 2006 ISBN: 978-0-7645-7534-1 Web: http://www.wiley.com/, http://www.wrox.com/ Nyelv: angol Terjedelem: 1540 oldal
Globalizáció: 513–526. o. Erőforrások használata: 526–534. o. Lokalizáció: 534–550. o.
• Microsoft Corp., Visual Studio Developer Center Globalizáció és lokalizáció: http://msdn2.microsoft.com/en-us/library/1021kkz0(VS.80).aspx
V1.0
2007. szeptember 7.
© Miklós Árpád, BMF NIK, 2007 [email protected]
21
7