Lokalisointi - Luento 19
Käydään läpi miten WPF-sovelluksesta saadaan "helposti" monikielinen. Aiheeseen liittyen kannattaa lukea: WPF Localization Guidance.
- Luentovideo (Youtube)
- tjlahton2010-11-17_1015.mp4 27.1 Mt
- tjlahton2010-11-17_1015.wmv 34.0 Mt
- tjlahton2010-11-17_1015.mp3 13.4 Mt
Lokalisointi resx-tiedostoilla
- Luo normaali WPF-ohjelma
- Lisää Properties-kansion alta löytyvään resources.resx-tiedostoon haluamasi käännettävät tiedot.
- Muista valita Access Modifieriin arvo public
- Lisää XAML-tiedostoon nimiavaruusmääritys:
xmlns:properties="clr-namespace:oman_projektin_nimi.Properties"
- Viittaa XAMLissa käännettävään resurssiin:
<Button Name="button1" Content="{x:Static properties:Resources.buttonin_teksti}"></Button>
buttonin_teksti on tässä resurssitiedostossa olevan resurssin nimi.
Huomaa, että viittaus ei välttämättä toimi (designer herjailee) ennen kuin olet kertaalleen kääntänyt ohjelmasi.
Jos saat omituisen virheen liittyen metadataan niin siirrä projektisi verkkolevyltä lokaalille c:-asemalle MyTemp-kansioon ja yritä sieltä uudelleen.
- Voit viitata myös koodissa
button1.Content = Properties.Resources.buttonin_teksti;
- Kopioi resurssitiedosto Propertiesin alle uudelle nimelle. Tee kopiointi suoraan Solution Explorerissa (ctrl-c / ctrl-v). Jos haluat kääntää esim. suomeksi niin anna uuden tiedoston nimeksi Resources.fi-FI.resx. Jos englanniksi niin uusi nimi on Resources.en-US.resx jne. kts. List of Culture Codes. Älä nimeä uudelleen alkuperäistä Resources.resx-tiedostoa.
- Käännä uudessa resurssitiedostossa olevat tekstit
- Lisää App.xaml.cs-tiedostoon konstruktori, joka määrää käytettävän kielen:
public App() { localization_resx.Properties.Resources.Culture = new CultureInfo("en-US"); } // myös seuraavia voi tarvita: System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");; System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");;
localization_resx on projektisi nimi!
Joudut lisäämään myös using System.Globalization;
- Kokeile ohjelmaasi. Vaihda kieltä vaihtamalla konstruktorissa CultureInfon parameteriksi fi-FI tai jokin muu kieli.
Lokalisointi LocBaml-työkalulla
Seuraava ohje pohjautuu suoraan Microsoftin How to: Localize an Application -ohjeeseen. Vaihda ohjeessa käytetyn localisation.csproj tilalle oman projektisi nimi.
- Ohjelma tehdään normaalisti valmiiksi kuitenkin muistaen seuraavat seikat:
- Kaikki käännettävä teksti on syytä pitää XAML-tiedostossa
- Tee käyttöliittymästä skaalautuva koska eri kielet vievät eri määrän tilaa
- Määritä oletuskieleksi englanti (tai jokin muu) lisäämällä/muuttamalla projektisi .csproj-tiedostoon rivi:
<UICulture>en-US</UICulture>
Rivi lisätään ensimmäisen <PropertyGroup>-elementin sisään. - Generoi XAML-tiedostoihisi Uidt ajamalla komentoriviltä:
C:\MyTemp\visualstudio\Projects\localization\localization>c:\winnt\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /t:updateuid localization.csproj
Tarkista oikea polku msbuild-ohjelmaan, koska polku riippuu koneellesi asennetun .NET-kirjaston versiosta.
Tarkista, että Uidt ovat kunnossa ajamalla vielä:
C:\MyTemp\visualstudio\Projects\localization\localization>c:\winnt\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /t:checkuid localization.csproj
msbuildin ajamisen pitäisi tulostaa jotain seuraavanlaista:
C:\MyTemp\visualstudio\Projects\localization\localization>c:\winnt\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /t:updateuid localization.csproj Microsoft (R) Build Engine Version 4.0.30319.1 [Microsoft .NET Framework, Version 4.0.30319.1] Copyright (C) Microsoft Corporation 2007. All rights reserved. Build started 15.11.2010 12:05:57. Project "C:\MyTemp\visualstudio\Projects\localization\localization\localization.csproj" on node 1 (updateuid target(s)). UpdateUid: Checking Uids in file 'MainWindow.xaml' ... Checking Uids in file 'App.xaml' ... Uids updated in 2 files. Done Building Project "C:\MyTemp\visualstudio\Projects\localization\localization\localization.csproj" (updateuid target(s)). Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:00.09 C:\MyTemp\visualstudio\Projects\localization\localization>c:\winnt\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /t:checkuid localization.csproj Microsoft (R) Build Engine Version 4.0.30319.1 [Microsoft .NET Framework, Version 4.0.30319.1] Copyright (C) Microsoft Corporation 2007. All rights reserved. Build started 15.11.2010 12:06:06. Project "C:\MyTemp\visualstudio\Projects\localization\localization\localization.csproj" on node 1 (checkuid target(s)). CheckUid: Checking Uids in file 'MainWindow.xaml' ... Checking Uids in file 'App.xaml' ... Uids valid in 2 files. Done Building Project "C:\MyTemp\visualstudio\Projects\localization\localization\localization.csproj" (checkuid target(s)). Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:00.09
- Nyt pitäisi kaikista XAML-tiedostojen elementeistä löytyä x:Uid-attribuutti:
<Window x:Uid="Window_1" x:Class="localization.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid x:Uid="Grid_1"> <Button x:Uid="button1" Content="Painike" Height="23" HorizontalAlignment="Left" Margin="148,160,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> <TextBlock x:Uid="textBlock1" Height="118" HorizontalAlignment="Left" Margin="109,19,0,0" Name="textBlock1" Text="lorem ipsumia suomeksi" VerticalAlignment="Top" Width="172" /> </Grid> </Window>
- Käännä ohjelmasi. Debug-kansioon pitäisi nyt ilmestyä oletuskielen mukaan nimetty en-US-kansio (tai minkä sitten merkitsitkin oletuskieleksi).
- Seuraavaksi tarvitset LocBaml-työkalun. Hae LocBamlin lähdekoodi ja käännä LocBaml joko visual studiolla tai komentoriviltä msbuild-komennolla:
C:\MyTemp\visualstudio\Projects\LocBaml\CSharp>c:\WINNT\Microsoft.NET\Framework\v4.0.30319\MSBuild LocBaml_SDK.csproj
- Kopioi LocBaml.exe oman sovelluksesi debug-kansioon
C:\MyTemp\visualstudio\Projects\LocBaml\CSharp\bin\Debug>copy LocBaml.exe c:\MyTemp\visualstudio\Projects\localization\localization\bin\Debug\
LocBaml.exen täytyy olla samassa kansiossa missä käännetty ohjelmasi sijaitsee.
- Seuraavaksi tehdään LocBaml-työkalulla CSV-tiedosto jota muokkaamalla voidaan kääntää ohjelmasi eri kielillä:
C:\MyTemp\visualstudio\Projects\localization\localization\bin\Debug>LocBaml.exe /parse en-US\localization.resources.dll /out:localization.csv
Jos saat virheilmoituksen:
File or assembly bin\Debug\WpfApp.resource.dll or one of its depencies not found. The assembly was created by a runtime more actual than the currently loaded one.
Tai:
Could not load file or assembly 'file:///C:\Users\me\Desktop\translate\Project.resources.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format."
Ongelman voi ratkaista hakemalla eri version LocBaml-työkalusta täältä: LocBaml for .NET 4.0
- CSV-tiedosto sisältää seitsemän kenttää:
- BAML-resurssin nimi
- Resurssin tunniste
- Tyyppi
- Readability eli onko resurssi kääntäjän luettavissa vai ei
- Modifiability eli voidaanko resurssia muuttaa
- Kommentit
- Käännettävä tieto
CSV-tiedosto voi näyttää esim. seuraavalta:
localization.g.fi-FI.resources:mainwindow.baml,Window_1:System.Windows.Window.Title,Title,True,True,,Oma Ohjelma localization.g.fi-FI.resources:mainwindow.baml,button1:System.Windows.Controls.ContentControl.Content,Button,True,True,,Painike localization.g.fi-FI.resources:mainwindow.baml,textBlock1:System.Windows.Controls.TextBlock.Text,Text,True,True,,lorem ipsumia suomeksi
- Käännä CSV-tiedostosta haluamasi kohdat suomenkielelle.
- Luo debug-kansioon uusi kansio suomea varten eli fi-FI-niminen kansio
- Muunna CSV-tiedosto DLL-tiedostoksi:
LocBaml.exe /generate en-US/localization.resources.dll /trans:localization.csv /out:.\ /cul:fi-FI
Komennossa viittaat alkuperäiseen dll-tiedostoon (en-US/localization.resources.dll), kääntämääsi csv-tiedostoon (localization.csv) ja kerrot mihin kansioon uusi dll-tiedosto sijoitetaan (.\ eli oletuskansio) ja kerrot mitä kieltä varten (fi-FI) uusi DLL on.
- siirrä uusi localization.resources.dll fi-FI-kansioon
- Nyt voit kokeilla toimiiko uusi kieli. Lisää sovelluksesi app.xaml.cs-tiedostoon App-luokan konstruktoriksi seuraava:
public App() { CultureInfo ci = new CultureInfo("fi-FI"); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; }
Kieli on pakko määritellä jo näin aikaisessa vaiheessa ohjelman suoritusta
- Nyt voit kääntää ohjelmasi ja kokeilla ovatko tekstit suomeksi. Muuta edelliseen konstruktoriin kieleksi takaisin en-US ja käännä ja käynnistä ohjelmasi uudelleen. Nyt pitäisi tekstien olla taas englanniksi.
Localization comments
Localization attributes
Avustus
Älä käytä vanhanaikaisia avustuksia vaan kirjoita ohjelman avustus WWW-sivuksi ja avaa se ohjelmastasi tähän tapaan:
System.Diagnostics.Process.Start("http://appro.mit.jyu.fi/gko/");
Käyttäjien kommentit