Tworzenie wersji językowych aplikacji (iOS)
- by Karol
- dodano o 12:04
- 2011-08-23
Publikując swoje programy w AppStore musimy mieć świadomość jak wielki zasięg dostępności one otrzymują! Sklep AppStore dostępny jest bowiem w kilkudziesięciu krajach i w kilkunastu językach. Tworzenie aplikacji tylko w po polsku to zwyczajne zamknięcie sobie drogi do większej popularności. Dlatego by wykorzystać potencjał AppStore warto jest tworzyć aplikacje wielojęzyczne. Szczególnie, że nie jest to zadanie wcale trudne.
Środowisko XCode wyposażone zostało w wiele mechanizmów ułatwiających tworzenie wersji językowych aplikacji. W tym wpisie postaram się omówić w jaki sposób możemy tego dokonać w kilku prostych krokach.
Zacznijmy zatem od stworzenia prostego projektu składającego się z jednej etykiety i jednego rysunku. Będzie to wersja angielska naszej aplikacji. Później dodamy obsługę wersji polskiej.
- Tworzymy nowy projekt View-based Application o nazwie LangProject.
- Edytujemy plik LangProjectViewController.xib i umieszczamy w widoku obiekt Label. Nadajemy mu treść "Hello, World!".
- Dodajemy do projektu jakiś plik graficzny, np. Rysunek.png, a następnie umieszczamy w widoku obiekt Image View i wyświetlamy w nim dołączony rysunek.
- Przechodzimy do pliku LangProjectViewController.h i dodajemy w nim właściwość label.
#import <UIKit/UIKit.h>
@interface LangProjectViewController : UIViewController
{
IBOutlet UILabel *label;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@end
- W pliku LangProjektViewController.m również dodajemy obsługę tej właściwości.
#import "LangProjectViewController.h"
@implementation LangProjectViewController
@synthesize label;
-(void)dealloc {
[label release];
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
- Wracamy do pliku LangProjektViewController.xib i tworzymy połączenie obiektu Label z właściwością label.
- Po uruchomieniu programu powinien on wyglądać tak:

Możemy teraz rozpocząć przygotowanie polskiej wersji językowej aplikacji. W tym celu:
- Klikamy prawy klawisz myszy w oknie z listą plików i z menu podręcznego wybieramy New File. Pokaże się okno wyboru szablonu. Wybieramy szablon Strings File z sekcji Resources. Plik nazywamy Localizable.strings.
- Stworzony zostanie nowy plik w naszym projekcie. Przechodzimy do jego edycji i wpisujemy:
/* Localizable.strings LangProject Created by _Autor_ on 23.08.2011. Copyright 2011 __MyCompanyName__. All rights reserved. */ "LabelPowitanie"="Hello, World!";
- Jest to plik, w którym nadajemy dowolnym etykietom pewne wartości. Zarówno etykiety jak i wartości umieszczamy w cudzysłowach i rozdzielamy znakiem "=". Z poziomu kodu źródłowego możemy odwoływać się do tych etykiet korzystając z funkcji NSLocalizedString. Dopiszmy więc dodatkową linię w pliku LangProjektViewController.m.
- (void)viewDidLoad
{
[super viewDidLoad];
label.text=NSLocalizedString(@"LabelPowitanie", @"Witaj Świecie");
}
Jako pierwszy parametr funkcji NSLocalizedString podajemy etykietę, którą użyliśmy w pliku Localizable.strings. W naszym przykładzie użyliśmy etykiety LabelPowitanie, także funkcja ta zwróci tekst "Hello, World!" - tekst przypisany do tej etykiety. Drugi z parametrów to komentarz. Informuje on nas tylko o tym, co znajduje się pod tą etykietą (czasami etykiety nazywa się np. P001, P002, P003 i wówczas w kodzie trudno byłoby się domyśleć, co pod etykietą się znajduje).
Zaznaczamy plik Localizable.strings w oknie plików i przełączamy się na zakładkę File Inspector (prawy panel). Odszukujemy sekcję Localization i wciskamy w niej ikonkę +. Nasz plik zostanie odznaczony, zaznaczamy więc go ponownie. W okienku Localization widoczny będzie wpis English. Klikamy ponownie w ikonę + i z menu, które się pojawi wybieramy Polish (PL).
W ten sposób stworzyliśmy nasz plik w dwóch wersjach językowych - polskiej i angielskiej. Kiedy nasz program uruchomiony będzie na iPhone z ustawionym językiem polskim - załaduje się polska wersja tego pliku. Kiedy będzie to iPhone z angielską wersją językową - wczyta się także angielska wersja językowa tego pliku. W oknie z listą plików obok Localizable.strings pojawiła się mała strzałeczka. Klikając ją rozwiniemy drzewo zapewniające dostęp do obu wersji językowych pliku. Zaznaczmy zatem Localizable.strings (Polish) i w edytorze wpisujemy:
/* Localizable.strings LangProject Created by _Autor_ on 23.08.2011. Copyright 2011 __MyCompanyName__. All rights reserved. */ "LabelPowitanie"="Witaj Świecie!";
Uwaga! Jeśli po uruchomieniu programu, pomimo ustawienia polskiej wersji językowej w symulatorze, nadal nie widzimy komunikatu "Witaj Świecie", powinniśmy usunąć program z symulatora, wybrać z menu Product opcję Clean, później Build i uruchomić go ponownie, aby zainstalowała się nowa wersja dwujęzyczna.
W powyższy sposób powinniśmy odwoływać się do wszystkich komunikatów w naszym programie. Również wszelkie napisy wyświetlane w różnych obiektach powinny być pobierane z pliku Localizable.strings. Dzięki temu rozwiązaniu, tłumacząc tylko ten jeden plik na dowolny język, stworzymy nową lokalizację naszej aplikacji.
Czasami może zajść jeszcze potrzeba dodania odpowiedniej wersji językowej rysunku umieszczonego w programie. Robimy to tak samo jak tłumaczyliśmy plik Localizable.strings, a więc - odszukujemy plik Rysunek.png i dodajemy do niego dwie lokalizacje: English i Polish. Następnie rozwijamy drzewko obok Rysunek.png i zaznaczamy Rysunek.png (Polish). Klikamy na nim prawy klawisz myszy i z menu, które się pojawi wybieramy Show in Finder. Pokaże się okno Findera a w nim zaznaczony będzie plik Rysunek.png. Ma to być wersja polska tego pliku, dlatego skopiujmy w to miejsce nową jego wersję, zastępując dotychczasową.
Dokładnie w ten sam sposób możemy dodać do projektu różne wersje ikony i splasha.
- Teraz, po uruchomieniu programu ujrzymy okno:

Korzystając z powyższej metody możemy również dodawać nowe wersje językowe wszystkich plików XIB. Wystarczy zaznaczyć taki plik, stworzyć lokalizacje np. Polish i English, a następnie przetłumaczyć taki plik. Rozwiązanie to ma jednak pewne wady. Po pierwsze, mamy problem z wysłaniem takiego pliku do tłumacza i po drugie - zmieniając coś w interfejsie zmieniać będziemy tylko wersję danego języka. Dlatego odradzam tę metodę na rzecz przedstawionej wcześniej.
Ostatnia rzecz, jaka jeszcze może się przydać - to tłumaczenie tytułu aplikacji. Jeśli chcemy przygotować różne wersje tytułu (wyświetlanego na springboardzie) musimy odszukać pliku _InfoPlist.strings__ i stworzyć jego lokalizacje Polish i English. Następnie należy edytować te pliki i dodać do nich wpis (w przykładzie otworzony jest plik InfoPlist.strings Polish).
/* Localized versions of Info.plist keys */ "CFBundleDisplayName" = "Tytuł Polski";
