Bisher haben alle unsere Beispielprojekte davon ausgegangen, dass unsere Apps für Englischsprachige bestimmt waren. Viele Anwendungen können jedoch davon profitieren, dass sie für nicht englischsprachige Benutzer verfügbar sind. Der App Store sorgt dafür, dass unsere App der richtigen Zielgruppe präsentiert wird. Es ist jedoch unsere Aufgabe als Entwickler, sie so zu konfigurieren, dass Benutzern aus verschiedenen Regionen die entsprechenden Ressourcen angezeigt werden. Dieser Vorgang wird Lokalisierung genannt.
Glücklicherweise ist es mit iOS überraschend einfach, Ressourcen mithilfe von Bundles zu lokalisieren. Die NSBundle-Klasse wählt automatisch das entsprechende Asset aus, wobei die bevorzugte Sprache des Benutzers berücksichtigt wird. Wenn Sie beispielsweise verschiedene Versionen desselben Bildes für Englisch- und für Spanischsprachige bereitgestellt haben, gibt die Methode pathForResource: ofType:, die im vorherigen Kapitel beschrieben wurde, je nach den Benutzereinstellungen unterschiedliche Dateipfade zurück. Dies ist einer der Hauptgründe, warum Sie nicht direkt auf Bündelressourcen mit hartcodierten Pfaden zugreifen sollten.
Die drei Aspekte einer App, die normalerweise lokalisiert werden müssen, sind Bilder, Audio oder Videos mit einer bestimmten Sprache, fest codierte Zeichenfolgen und Storyboards. In diesem Kapitel werfen wir einen kurzen Blick auf die Lokalisierung von Medienressourcen und fest codierten Zeichenfolgen mit den integrierten Internationalisierungsfunktionen von NSBundle. Storyboard-Dateien können mit demselben Prozess lokalisiert werden.
Das Beispiel für dieses Kapitel ist eine einfache Anwendung, die verschiedene Bilder oder Zeichenfolgen basierend auf der bevorzugten Sprache des Benutzers anzeigt. Erstellen Sie eine neue Single View-Anwendung und nennen Sie sie "Internationalisierung". Wie immer, Verwenden Sie Storyboards, und Verwenden Sie die automatische Referenzzählung sollte ausgewählt werden.
Um eine Anwendung mehrsprachig zu machen, müssen Sie zunächst die unterstützten Sprachen zum Projekt hinzufügen. Wählen Sie im Projektnavigator das Projektsymbol.
Wählen Sie dann das Internationalisierungsprojekt in der linken Spalte aus (nicht mit dem Internationalisierungsziel zu verwechseln). Stellen Sie sicher, dass die Registerkarte Info ausgewählt ist. Sie sollten folgendes Fenster sehen:
Um Unterstützung für eine andere Sprache hinzuzufügen, wählen Sie das Pluszeichen unter Lokalisierungen Sektion. Sie können eine beliebige Sprache auswählen, aber dieses Buch verwendet Spanisch. Wenn Sie eine Sprache auswählen, wird ein Dialogfeld geöffnet, in dem Sie gefragt werden, welche Dateien lokalisiert werden sollen. Löschen Sie die Auswahl von MainStoryboard.storyboard, aber gehen lassen InfoPlist.strings ausgewählt.
Es ist jetzt möglich, dem Anwendungspaket eine spanische Version jeder Ressource hinzuzufügen.
Als Nächstes werden wir uns mit der Lokalisierung von Medienassets befassen. Im Ressourcenpaket für dieses Buch finden Sie eine Datei mit dem Namen syncfusion-icon-de.png. Fügen Sie diese Datei zum Anwendungspaket hinzu, indem Sie sie in den Project Navigator ziehen und umbenennen in syncfusion-icon.png. Zeigen Sie es dann in der Ansicht an, indem Sie das Symbol ändern viewDidLoad Methode in ViewController.m Zu dem Folgendem:
- (void) viewDidLoad [super viewDidLoad]; // Finde das Bild NSString * imagePath = [[NSBundle mainBundle] pathForResource: @ "syncfusion-icon" ofType: @ "png"]; NSLog (@ "% @", imagePath); // lade das Bild UIImage * imageData = [[UIImage zuordnen] initWithContentsOfFile: imagePath]; if (imageData! = null) // Das Bild anzeigen. UIImageView * imageView = [[UIImageView-Zuordnung] initWithImage: imageData]; CGRect screenBounds = [[UIScreen mainScreen] Grenzen]; imageView.contentMode = UIViewContentModeCenter; CGRect frame = imageView.frame; frame.size.width = screenBounds.size.width; frame.size.height = screenBounds.size.height; imageView.frame = Frame; [[self view] addSubview: imageView]; else NSLog (@ "Die Datei konnte nicht geladen werden");
Wenn Sie das Projekt kompilieren, sollte ein kleines Symbol in der Mitte des Bildschirms angezeigt werden:
Sie sollten auch den Pfad sehen Internationalization.app/syncfusion-icon.png im Ausgabebereich. Nichts Neues hier, nur ein Image auf der obersten Ebene des Anwendungspakets. Dies wird sich jedoch ändern, wenn wir die Image-Datei lokalisiert haben.
Wählen Sie dazu das Bild im Projektnavigator aus, öffnen Sie das Bedienfeld Dienstprogramme und klicken Sie auf Lokalisieren unter dem Lokalisierung Sektion.
Im nächsten Dialog werden Sie aufgefordert, eine Sprache auszuwählen. Wählen Englisch und klicken Sie auf Lokalisieren.
Dies sagt iOS, dass diese Version von syncfusion-icon.png ist für Englischsprechende. Wir werden gleich eine spanische Version hinzufügen, aber sehen wir uns zuerst an, was hinter den Kulissen passiert. Um Ihre Lokalisierungen in Aktion zu sehen, müssen Sie den iOS-Simulator zurücksetzen und einen sauberen Build durchführen. Um den Simulator zurückzusetzen, navigieren Sie zu iOS-Simulator> Inhalt und Einstellungen zurücksetzen in der Menüleiste und wählen Sie im daraufhin angezeigten Dialog Zurücksetzen.
Beenden Sie den Simulator und kehren Sie in Xcode zum Internationalisierungsprojekt zurück. Um einen Clean-Build durchzuführen, navigieren Sie in der Menüleiste zu Product> Clean und kompilieren das Projekt wie gewohnt. Sie sollten einen anderen Dateipfad im Ausgabebereich sehen:
Internationalization.app/de.lproj/syncfusion-icon.png.
Das neue de.lproj / Unterverzeichnis ist die interne Methode zum Organisieren sprachspezifischer Dateien in iOS. Alle auf Englisch lokalisierten Ressourcen werden in diesem Unterverzeichnis angezeigt, und alle spanischen Versionen werden im angezeigt es.lproj / Unterverzeichnis. Aber auch hier müssen wir nicht wirklich wissen, wo sich die Datei befindet. NSBundle's pathForResource: ofType: Methode ermittelt es automatisch.
So ist unsere englische Version des Bildes eingerichtet. Als nächstes müssen wir die spanische Version konfigurieren. Wählen Sie im Project Navigator die englische Version der Datei aus und aktivieren Sie im Bereich Lokalisierung des Bedienfelds Dienstprogramme das Kontrollkästchen neben Spanisch.
Dies kopiert die vorhandene englischsprachige Version von syncfusion-icon.png in die es.lproj / Unterverzeichnis. Zurück im Projektnavigator sollten Sie dies durch Erweitern von sehen können syncfusion-icon.png Datei.
Natürlich müssen wir die spanische Version durch eine völlig andere Datei ersetzen. Am einfachsten ist dies durch die Auswahl von syncfusion-icon.png (Spanische) Datei und klicken Sie auf das Pfeilsymbol neben dem Vollständigen Pfad String in der Dienstprogramme Panel.
Dies zeigt den Inhalt der es.lproj / Ordner im Finder, der uns die Möglichkeit gibt, die Datei manuell zu ersetzen. Löschen Sie das vorhandene syncfusion-icon.png Datei und kopieren Sie die syncfusion-icon-es.png Datei aus dem Ressourcenpaket in es.lproj /. Stellen Sie sicher, dass Sie es umbenennen syncfusion-icon.png. Es ist wichtig, dass lokalisierte Versionen derselben Datei identische Dateinamen haben, damit NSBundle sie finden kann. Nach dem Ersetzen der Datei sollten Sie andere Bilder sehen, wenn Sie die beiden Lokalisierungen in Xcode auswählen.
Das sollte es sein, um unsere Image-Datei zu lokalisieren. Um es auszuprobieren, können Sie die Gerätesprache auf die gleiche Weise ändern, wie Sie sie in einem realen Gerät über die App Einstellungen ändern würden. Klicken Sie im Simulator auf die Home-Schaltfläche des Geräts, klicken Sie auf den Bildschirm, ziehen Sie ihn nach rechts, und starten Sie die Anwendung "Einstellungen". Unter Allgemein> International> Sprache können Sie die Gerätesprache auswählen.
Wählen Sie "Español" und öffnen Sie Ihre Anwendung erneut. Sie sollten die spanische Version von sehen syncfusion-icon.png. Möglicherweise müssen Sie den Simulator schließen und das Programm erneut kompilieren. Beachten Sie, dass der Dateipfad von ausgegeben wird NSLog () liest jetzt:
Internationalization.app/es.lproj/syncfusion-icon.png.
Wie Sie sehen, ist es unglaublich einfach, Dateien mithilfe der integrierten Funktionen von NSBundle zu lokalisieren. Die Idee ist, NSBundle als Abstraktion zwischen Ihrem Anwendungscode und den Assets zu verwenden, auf die sie angewiesen sind. Dies isoliert den Lokalisierungsprozess vom Entwicklungsprozess und macht das Outsourcing von Übersetzungen sehr einfach.
Für die Lokalisierung von Video- und Audiodateien wird genau derselbe Prozess verwendet, der gerade erläutert wurde. Die Vorbereitung eines Textes für ein internationales Publikum erfordert jedoch etwas mehr Arbeit.
Wenn Sie mit einer mehrsprachigen App arbeiten, müssen hartcodierte Zeichenfolgen in ein Bündel-Asset abstrahiert werden, damit NSBundle zur Laufzeit die richtige Sprache laden kann. iOS verwendet eine sogenannte String-Datei, um Übersetzungen aller String-Literale in Ihrer Anwendung zu speichern. Nachdem Sie diese Zeichenfolge-Datei erstellt haben, können Sie sie mit der im vorherigen Abschnitt beschriebenen Methode lokalisieren.
Ändern Sie unsere viewDidLoad-Methode, um eine Schaltfläche anzuzeigen und eine Nachricht auszugeben, wenn der Benutzer auf sie tippt.
- (void) viewDidLoad [super viewDidLoad]; UIButton * aButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; [aButton setTitle: @ "Say Hello" forState: UIControlStateNormal]; aButton.frame = CGRectMake (100.0, 200.0, 120.0, 40.0); [[self view] addSubview: aButton]; [aButton addTarget: Eigenaktion: @selector (sayHello :) forControlEvents: UIControlEventTouchUpInside]; - (void) sayHello: (id) Sender NSLog (@ "Hallo, Welt!");
Diese Methoden haben zwei String-Literale, die wir in eine String-Datei verschieben müssen. Sie sind @"Sag Hallo" und @"Hallo Welt!".
Um die String-Datei zu erstellen, legen Sie eine neue Datei an und wählen Sie Ressource> Zeichenfolge-Datei. Benutzen Localizable.strings für den Dateinamen, der Standard-String-Datei, nach der iOS sucht.
Der Inhalt der Strings-Datei ist eine einfache Liste von Schlüssel- oder Wertepaaren, die wie folgt formatiert sind.
"Button Title" = "Sag Hallo"; "Greeting" = "Hallo, Welt!";
Die linke Seite ist der Schlüssel, mit dem Sie den übersetzten String in Ihrem Anwendungscode referenzieren. Bei den Schlüsseln handelt es sich um willkürliche Zeichenfolgen. In der Regel verwenden Entwickler jedoch entweder einen semantischen Namen, der die Verwendung der Zeichenfolge beschreibt, oder den Zielsatz in ihrer Muttersprache. In unserer String-Datei haben wir uns für die Erstere entschieden. Die Werte für jeden Schlüssel folgen einem Gleichheitszeichen. Stellen Sie sicher, dass Sie am Ende jeder Zeile ein Semikolon einfügen. Andernfalls können schreckliche Dinge passieren, wenn Sie versuchen, Ihre Anwendung auszuführen.
Wie bei Medienassets können Sie auf die Inhalte von zugreifen Localizable.strings über NSBundle. Das localizedStringForKey: Wert: Tabelle: Die Methode gibt den Wert eines Schlüssels aus einer bestimmten String-Datei zurück. Mit dem Argument value können Sie einen Standardrückgabewert angeben, wenn der Schlüssel nicht gefunden wird. Das Argument der Tabelle legt fest, welche Zeichenfolgendatei verwendet werden soll. Wenn Sie für die Tabelle nil angeben, wird der Standardwert verwendet Localizable.strings Datei wird verwendet.
Da der Zugriff auf übersetzte Zeichenfolgen eine solche häufige Aufgabe ist, bietet das Foundation Framework auch eine praktische Lösung NSLocalizedString () Makro, das Sie als einfache Verknüpfung verwenden können localizedStringForKey: Wert: Tabelle:. Es übergibt eine leere Zeichenfolge für das Argument value und nil für das Tabellenargument. Für die meisten Anwendungen, NSLocalizedString () genügt, um auf lokalisierten Text zuzugreifen.
Ändern wir also die Titelkonfiguration unserer Schaltfläche NSLocalizedString ():
[aButton setTitle: NSLocalizedString (@ "Schaltflächentitel", nil) fürState: UIControlStateNormal]; Wenn Sie das Projekt kompilieren, sollte die Schaltfläche weiterhin "Say Hello" lauten, aber jetzt wird es von Localizable.strings geladen. Machen wir dasselbe für die sayHello-Methode: - (void) sayHello: (id) sender NSLog (@ "% @", NSLocalizedString (@ "Greeting", nil));
Jetzt, da unsere Zeichenfolgen dynamisch geladen werden, anstatt hart zu codieren, ist es einfach, sie zu lokalisieren. Wir verwenden genau den gleichen Vorgang wie bei Bildern. Wählen Sie im Projektnavigator die Datei Localizable.strings aus, und klicken Sie im Bedienfeld Dienstprogramme auf Lokalisiert machen. Wählen Sie im daraufhin angezeigten Dialogfeld Englisch aus, um diese Version der Datei für englischsprachige Benutzer zu verwenden.
Um eine spanische Version hinzuzufügen, wählen Sie erneut Localizable.strings aus und aktivieren Sie das Kontrollkästchen neben Spanisch im Abschnitt Localizations.
So wie syncfusion-icon.png, Sie sollten das erweitern können Localizable.strings Datei im Projektnavigator.
Fügen Sie schließlich der spanischen Version der Datei einige Übersetzungen hinzu.
"Button Title" = "Dice Hola"; "Gruß" = "Hola, Mundo!";
Sie können es genauso testen, wie wir Bilder getestet haben. Navigiere zu Inhalt und Einstellungen zurücksetzen Schließen Sie im Simulator den Simulator und führen Sie einen sauberen Build von Xcode aus. Nachdem Sie die Sprache in Español geändert haben, sollte auf Ihrer Schaltfläche "Dice Hola" anstelle von "Say Hello" angezeigt werden. Wenn Sie darauf klicken, sollte "Hola, Mundo!"
So können Sie Strings in einer iOS-Anwendung lokalisieren. Wenn der gesamte übersetzte Text in einer einzigen Datei vollständig vom Anwendungscode abstrahiert ist, können Sie die Lokalisierung leicht auslagern. Dies ist eine sehr gute Sache, da die meisten Entwickler nicht fließend alle Sprachen beherrschen, in die sie ihre App gerne übersetzen würden.
Es gibt ein wichtiges Detail, das noch nicht angesprochen wurde, nämlich den Namen der App zu lokalisieren. Wenn Sie den Startbildschirm im iOS-Simulator betrachten, werden Sie feststellen, dass der Titel unter Ihrem App-Symbol nicht ins Spanische übersetzt wurde. Wenn Sie die Zeichenfolge in Ihrer App bereits lokalisiert haben, können Sie sich auch die Zeit nehmen, ein wenig Metadaten zu übersetzen.
Der Anzeigename einer App wird in der Info.plist unter dem Schlüssel CFBundleDisplayName definiert. Anstatt Sie zu zwingen, Werte im Main zu übersetzen Internationalisierungs-Info.plist Datei, iOS gibt Ihnen eine dedizierte String-Datei zum Überschreiben bestimmter Konfigurationsoptionen mit lokalisierten Werten. In dem Unterstützende Dateien Gruppe des Projektnavigators öffnen Sie die InfoPlist.strings Datei. Das ist genau wie das Localizable.strings Datei, die wir im vorherigen Abschnitt erstellt haben, außer sie sollte nur Werte enthalten Info.plist Schlüssel. Fügen Sie Folgendes zu Ihrem hinzu InfoPlist.strings Datei.
"CFBundleDisplayName" = "Hola, Mundo!";
Wenn Sie nun den Simulator zurücksetzen und einen sauberen Build durchführen, sollte unter Ihrem Anwendungssymbol ein spanischer Titel angezeigt werden.
In diesem Kapitel haben wir gelernt, Medienassets, -texte und -metadaten mit NSBundle zu lokalisieren. Indem Sie die Ressourcen, die lokalisiert werden müssen, in isolierte Dateien abstrahieren und sie indirekt über Methoden wie referenzieren pathForResource: ofType:, Es ist möglich, Ihre Anwendung in eine andere Sprache zu übersetzen, ohne eine einzelne Zeile des Anwendungscodes zu berühren. Dies ist eine sehr leistungsfähige Funktion von iOS, insbesondere angesichts der internationalen Verbreitung von iPhone- und iPad-Geräten.
Im letzten Kapitel von iOS wird kurz auf die integrierte Audio-Unterstützung für iOS-Anwendungen eingegangen. Wie wir in den vorherigen Kapiteln angesprochen haben, verwenden Audiodateien dieselbe Bündelstruktur wie Bilder- und Zeichenfolgendateien. Anstatt sich auf den Zugriff auf diese Ressourcen zu konzentrieren, werden die übergeordneten Tools zur Steuerung der Audiowiedergabe erläutert.
Diese Lektion repräsentiert ein Kapitel aus iOS Prägnant, ein kostenloses eBook aus dem Team von Syncfusion.