Deutsche Version meines Talks auf der Developer Week 2014 in Nürnberg. über Internationalisierung und Lokalisierung mobiler Apps am Beispiel von iOS. Beleuchtet u. a. Text, Zahlen, Datum und Zeit, Bilder und andere Ressourcen. Im Bereich Text werden verschiedene Schriftsysteme und korrekte Pluralbildung beschrieben.
6. Internationalization
[…] ein Programm so zu gestalten, dass es leicht (ohne
den Quellcode ändern zu müssen) an andere Sprachen
und Kulturen angepasst werden kann. *
* Wikipedia
7. Localization
Anpassung von […] Software an die in einem […]
geographisch oder ethnisch umschriebenen
Nutzungsgebiet […] vorherrschenden lokalen
sprachlichen und kulturellen Gegebenheiten. *
* Wikipedia
10. Sprachen und Regionen
Sprache ≠ Region
12h-Zeit für Amerikaner in Deutschland
„Jänner“ – „Januar“
Localization ≠ Locale
Deutscher bevorzugt englische Anwendungstexte
Aber: 24h-Zeitformat
20. Text ≠ Text
Sprache für Meldungen, Labels etc.
Schreibrichtung & Alignment
Schriftsysteme
Zahlen in Text
Namen & Adressen
Phrasen, Floskeln und Begriffe
Pluralbildung
Sortierung
…
21. Text ≠ Text
Sprache für Meldungen, Labels etc.
Schreibrichtung & Alignment
Schriftsysteme
Zahlen in Text
Namen & Adressen
Phrasen, Floskeln und Begriffe
Pluralbildung
Sortierung
…
28. .strings Files
Updates?
Use ibtool every time you update your labels and text.
In the Base.lproj folder:
ibtool ChangedNib.xib --generate-strings-
file NewStrings.strings
Open the generated output file and copy all new string
entries to ChangedNib.strings in each lproj.
#fail
30. Texte nicht normalisieren
Kontext und Grammatik gehen verloren
Satzbau
Wortformen (Deklination & Konjugation) …
Eigene Strings für jeden Zweck
“reset.counter.button” = “Auf 0 stellen”
Kontext für Übersetzer
Sprechende Keys
Hinreichende Kommentare (Button vs. Label, ungefähre Länge etc.)
32. Variablen
Parameterposition dokumentieren!
“Zeige 4 von 12 gesamt”
“Total 12 — Showing 4”
/* … Param 1: current page; Param 2: total count */
"current.page.label" = “Zeige %1d von %2d gesamt”;
/* … Param 1: current page; Param 2: total count */
"current.page.label" = “Total %2d — Showing %1d”;
33. Sonderfälle 0 und 1
Plural
Englisch Deutsch
0 No books Keine Bücher
1 One book Ein Buch
sonstiges 100 books 100 Bücher
Localizable.strings
“books.0” = “No Books”
“books.1” = “One Book”
“books.n” = “%1d books”
“books.0” = “Keine Bücher”
“books.1” = “Ein Buch”
“books.n” = “%1d Bücher”
Abfrage im Code, Problem gelöst.
34. Englisch Deutsch
0 No books Keine Bücher
1 1 book 1 Buch
2 2 books 2 Bücher
wenige 3 books 3 Bücher
viele 11 books 11 Bücher
sonstiges 100 books 100 Bücher
Vielleicht nicht ganz…
Plural
35. Englisch Deutsch Arabisch
0 No books Keine Bücher كتاب ٠
1 1 book 1 Buch كتاب
2 2 books 2 Bücher كتابان
wenige 3 books 3 Bücher كتب ٣
viele 11 books 11 Bücher اًبكتا ١١
sonstiges 100 books 100 Bücher كتاب ١٠٠
Vielleicht nicht ganz…
Plural
36. .strings + .stringsdict
Seit iOS7
Implementiert (Unicode*) Lokalisierungsregeln für
Plural
Geschlecht [rdar://16670931]
Plist Format
Name identisch mit .strings
.strings muss existieren, kann aber leer sein
* http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html#ar
39. String Tables
Localizable.strings
Default für NSLocalizedString()
Große Projekte — große Datei
Optional zerlegbar
NSLocalizedStringFromTable(“MyController”,“Key”,“Comment”)
MyController.strings
Projektgliederung — Kontext für Übersetzer
3rd Party Code
Analog für .stringsdict
41. Datum und Zeit
Konvertierung zwischen NSDate und NSString
+[NSDateFormatter localizedStringFromDate:dateStyle:timeStyle:]
-[NSDateFormatter setLocale:]
NSDateFormatterStyle
Deutsch / Deutschland Englisch / USA
Short 08.07.14 22:32 7/8/14,10:32 PM
Medium 08.07.2014 22:32:36 Jul 8, 2014, 10:32:36 PM
Long 8. Juli 2014 22:32:36 MESZ Jul 8, 2014, 10:32:36 PM GMT+2
Full Dienstag, 8. Juli 2014 12:32:36
Mitteleuropäische Sommerzeit
Tuesday, July 8, 2014 at 12:39:16 PM
Central European Summer Time
No - -
NSDateFormatter
42. Datum und Zeit
NSDateFormatter.h
typedef enum {
NSDateFormatterNoStyle = …,
NSDateFormatterShortStyle = …,
NSDateFormatterMediumStyle = …,
NSDateFormatterLongStyle = …,
NSDateFormatterFullStyle = …
} NSDateFormatterStyle
Kombinierbar für Datum und Zeit
NSDateFormatterNoStyle — nur Datum / Zeit
Aktualisierung durch OS Updates
NSDateFormatter
43. Datum und Zeit
Und wenn die Defaults nicht reichen?
Keine konkreten Format-Strings verwenden!
Unicode Locale Data Markup Language*
[f setDateFormat:[NSDateFormatter
dateFormatFromTemplate:@"u QQ"
options:0
locale:LOCALE_EN_US]];
NSLog(@“%@", [f stringFromDate:july8th);
Q3 2014
NSDateFormatter
* http://www.unicode.org/reports/tr35/tr35-dates.html#Contents
49. Zahlen NSNumberFormatter
Deutsch / Deutschland Englisch / USA
No 1234,56 1234.56
Decimal 1.234,56 1,234.56
Currency 1.234,56 € $1,234.56
Percent 123.456% 123,456%
Scientific 1,23456E+03 1.23456E3
SpellOut eintausendzweihundertvier-
unddreißig Komma fünf sechs
one thousand two hundred thirty-
four point five six
54. Coming up next: iOS8
NSEnergyFormatter
Energie in Joule, Kalorien etc.
NSLengthFormatter
Distanzen, in Meilen, Kilometer etc.
NSMassFormatter
Masse und Gewicht in Pfund, kg etc.
62. Cover the Basics
Locale basierte Formatierung
NSDateFormatter
NSNumberFormatter
NSByteCountFormatter
Sorgfältige Übersetzung
Ressourcen außerhalb des Codes nicht vergessen
63. Weitere Schritte
Bildressourcen
Launch Images (sofern relevant)
Adressen, Namen
Right-to-Left Support
Automatische Auswahl von Einheiten (Meilen, km etc.)
Vorbelegung für Auswahllisten etc.
Farbschemata
…