HowTo: Lokalisierung einer Windows Phone 7 App
Wenn man sich die Bewertungen der User im Windows Marketplace einmal genau anschaut, findet man oft Kommentare wie “Sehr schöne App, nur leider auf English” oder “Hoffentlich kommt bald ein Update für deutsche Sprache”. Man bekommt fast den Anschein, eine App zu lokalisieren sein ein aufwändiges Feature. Ist es aber nicht! Dieses HowTo zeigt euch wie es geht…
1. Vorbereitungen
In dieser Anleitung verwende ich das Standard Windows Phone Application Template von Visual Studio 2010.
2. Definition der Standardsprache
In den Projekteigenschaften stellt man unter Application > Assembly Information… die Standardsprache ein. In meinem Fall wähle ich hier German (Germany) [entspricht de-DE].
3. Anlegen der Ressourcen Dateien
Als nächstes werden die Ressourcen für die Sprachen angelegt. Am besten legt man dazu einen neuen Ordner an und fügt über Add > New Item… > General > Resources File zwei Ressourcen hinzu. Bei der zweiten Ressource muss man als zusätzlich noch das Kürzel der Sprache anhängen.
Beachten muss man hier, dass nur zur ersten Ressource (Language.resx) eine Codebehind angelegt wird. Diese Ressource ist sozusagen die Standardressource und in meinem Fall das deutsche Sprachpaket. Die zweite Ressource (Language.en-US.resx) ist folglich das englische Sprachpaket. Es können nach belieben weitere Sprachpakete hinzugefügt werden.
Vom Windows Phone werden folgende Sprachen unterstützt:
- English (en, en-US, en-GB, en-AU, en-NZ, en-CA, en-IE, en-ZA, en-JM, en-BZ)
- Deutsch (de, de-CH, de-AT, de-LU, de-LI)
- Spanisch (es, es-MX, es-GT, es-CR, es-DO, es-PA, es-VE, es-AR,…)
- Italienisch (it, it-CH)
- Französisch (fr, fr-BE, fr-CA, fr-CH, fr-LU)
4. Hinzufügen einer Zugriffsklasse
Um auf die Ressource zugreifen zu können, fügt man dem Localization-Ordner folgende Klasse hinzu.
namespace WindowsPhoneLocalized.Localization
{
public class LocalizedStrings
{
public LocalizedStrings()
{ }
private static Language _localizedString = new Language();
public Language LocalizedString
{
get
{
return _localizedString;
}
}
}
}
5. Bearbeiten der Sprachpakete
Nun öffnet man die Ressourcen in Visual Studio und fügt Werte hinzu. Name ist sozusagen der Key und Value der Wert der Ressource. Die Angabe des Comment ist optional. Zu beachten gilt es hier zum einen, dass alle Sprachpakete die selben Name-Attribute besitzen und zum anderen, dass man den Access Modifier der Standardressource auf Public stellt.
6. Eine TextBox an eine Ressource binden
Als nächstes wechselt man zur MainPage.xaml und fügt folgende Tags hinzu…
<phone:PhoneApplicationPage
x:Class="WindowsPhoneLocalized.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:lang="clr-namespace:WindowsPhoneLocalized.Localization"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<phone:PhoneApplicationPage.Resources>
<lang:LocalizedStrings x:Key="LocalizedStrings"/>
</phone:PhoneApplicationPage.Resources>
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION"
Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock Text="{Binding Path=LocalizedString.HelloWorld, Source={StaticResource LocalizedStrings}}"
FontSize="40"/>
</Grid>
</Grid>
</phone:PhoneApplicationPage>
7. Definition der unterstützten Sprachen
Um neben der Standardsprache weitere Sprachen zu unterstützen, müssen diese erst bekannt gemacht werden. Leider gibt es dazu in Visual Studio 2010 keine direkte Unterstützung. Daher muss man die Projektdatei (*.csproj) in einem beliebigen Editor öffnen und den den SupportedCultures-Tag bearbeiten. Hier listet man einfach alle zusätzlichen Sprachen auf. Die Standardsprach, welche schon in der Assemby angegeben wurde, wird hier nicht aufgelistet.
<SupportedCultures>
en-US
</SupportedCultures>
8. Testen
Jetzt starten man den Emulator man sieht in meinem Fall den Text des englischen Sprachpakets, da der Emulator standardmäßig auf en-US eingestellt ist.
Wenn man nun jedoch die Anwendung beendet, in den Einstellungen die Sprache auf deutsch stellt, das Phone zwangsweise neustartet und die App wieder startet, wird der deutsche Text angezeigt. Wir sind Fertig!
Das funktioniert aber leider nicht mit Ressourcen Dateien im Textblock, wo z.B. LineBreak verwendet wird oder?
ReplyDeleteIch bin mir nicht ganz sicher, ob ich deine Frage sicher verstanden habe, aber das hier könnte dir weiterhelfen:
ReplyDeletehttp://social.msdn.microsoft.com/Forums/nb-NO/netfxbcl/thread/701c5440-7f95-4fb7-8e2a-b7cfec2669cc
Hallo! Wenn Sie wollen, um Software von Windows Apps zu übersetzen, können Sie sehr einfach diese benutzerfreundliche, webbasierte, kollaborative Lokalisierungstool benutzen: http://poeditor.com/
ReplyDelete