Локализация приложений iPhone

| Нет комментариев | Нет трекбэков
Итак, сейчас я расскажу о локализации. Если мы хотим обеспечить наше приложение поддержкой нескольких языков, нам необходимо:
  1. Обеспечить эту поддержку в коде.
  2. Создать файлы локализаций для каждого языка, который вы хотите обеспечить.

Для того, чтобы организовать поддержку в коде, необходимо сделать так.
NSString *myLangString = NSLocalizedString(@"hello", @"Hello label");


В коде обеспечили. Теперь нужно создать файл локализации. Предположим, что в программе будет два языка: русский и английский. Для этого в директории приложения (MyApp.app) нужно создать две директории: English.lproj и Russian.lproj.
В каждой из этих директорий должен находиться файл Localizable.strings. Итак:

English.lproj/Localizable.strings

"hello" = "Hello!";


Russian.lproj/Localizable.strings
"hello" = "Привет!";
Первые кавычки - это ключ, которые мы указали в коде (@"hello"), вторые - локализованная строка. Далее необходимо перекодировать эти файлы в UTF-16 (именно в этой кодировке и делается локализация для iPhone).

iconv -f utf8 -t utf16 Localizable.strings.utf8 > Localizable.strings

Далее можем загрузить все готовые файлы в телефон и наслаждаться. Включаем в настройках русский язык - видим всё на русском. Включаем английский - видим на английском.


main.m
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "HelloApp.h"

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int ret = UIApplicationMain(argc, argv, [HelloApp class]);
    [pool release];
    return ret;
}
HelloApp.h
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#import <CoreGraphics/CGEventTypes.h>
#import <GraphicsServices/GraphicsServices.h>
#import <UIKit/CDStructures.h>
#import <UIKit/UIKit.h>
#import "MainView.h"

@interface HelloApp : UIApplication
{
	UIWindow *mainWindow;
	MainView *mainView;
}
@end
HelloApp.m
#import "HelloApp.h"

@implementation HelloApp

- (void)applicationDidFinishLaunching:(GSEventRef)event;
{
	struct CGRect frame = [UIHardware fullScreenApplicationContentRect];
	frame.origin.x = frame.origin.y = 0.0;
    
	mainWindow = [[UIWindow alloc] initWithContentRect:frame];
	mainView = [[MainView alloc] initWithFrame:frame];
    
	[mainWindow setContentView:mainView];
	[mainWindow orderFront:self];
	[mainWindow makeKey:self];
}

- (void)applicationWillTerminate;
{
	[mainView release];
	[mainWindow release];
}

@end
MainView.h
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#import <CoreGraphics/CGEventTypes.h>
#import <GraphicsServices/GraphicsServices.h>
#import <UIKit/CDStructures.h>
#import <UIKit/UIKit.h>

@interface MainView : UIView
{

}

- (id)initWithFrame:(struct CGRect)frame;

@end
MainView.m
#import "MainView.h"

@implementation MainView

- (id)initWithFrame:(struct CGRect)frame
{
	if ((self == [super initWithFrame:frame]) != nil)
	{
		frame.origin.x = frame.origin.y = 0.0f;

		UITextLabel *text = [[UITextLabel alloc] initWithFrame:frame];

		NSString *l10nHello = NSLocalizedString(@"hello", @"Hello label");
		
		[text setText:l10nHello];
		float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
		float black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
		[text setBackgroundColor:CGColorCreate(CGColorSpaceCreateDeviceRGB(),white)];
		[text setColor:CGColorCreate(CGColorSpaceCreateDeviceRGB(),black)];
		[text setCentersHorizontally:YES];
		[self addSubview:text];
	}
	return self;
}

@end
Info.plist
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>Russian</string>
	<key>CFBundleExecutable</key>
	<string>Hello</string>
	<key>CFBundleIdentifier</key>
	<string>com.wndev.hello</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>0.1</string>
</dict>
</plist>
Makefile
PRODUCT_NAME = Hello
BUNDLE_NAME    = $(PRODUCT_NAME).app
SOURCES    = $(wildcard *.m)
INFOPLIST_FILE = Info.plist
PNGS = $(wildcard *.png)

CC = arm-apple-darwin-gcc
CXX = arm-apple-darwin-g++

CFLAGS = -Wall -pipe -O3

LD = ${CC}
LDFLAGS = -Wl,-syslibroot,/usr/local/share/iphone-filesystem \
          -I/usr/local/arm-apple-darwin/include \
          -lobjc \
          -larmfp \
          -framework CoreFoundation \
          -framework Foundation \
          -framework CoreGraphics \
          -framework GraphicsServices \
          -framework UIKit

EXECUTABLE_NAME = $(PRODUCT_NAME)

OBJECTS = \
    $(patsubst %.c,%.o,$(filter %.c,$(SOURCES))) \
    $(patsubst %.cc,%.o,$(filter %.cc,$(SOURCES))) \
    $(patsubst %.cpp,%.o,$(filter %.cpp,$(SOURCES))) \
    $(patsubst %.m,%.o,$(filter %.m,$(SOURCES))) \
    $(patsubst %.mm,%.o,$(filter %.mm,$(SOURCES)))

all: $(PRODUCT_NAME) bundle

$(PRODUCT_NAME): $(OBJECTS)
	$(LD) $(LDFLAGS) -o $(PRODUCT_NAME) $(OBJECTS)

%.o: %.m
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@

clean:
	rm -f *.o $(EXECUTABLE_NAME)
	rm -rf $(BUNDLE_NAME)
	rm -f *~

bundle:
	mkdir -p $(BUNDLE_NAME)
	cp $(INFOPLIST_FILE) $(BUNDLE_NAME)/
	cp $(PNGS) $(BUNDLE_NAME)/
	cp $(EXECUTABLE_NAME) $(BUNDLE_NAME)/
	cp PkgInfo $(BUNDLE_NAME)/


Все эти файлы, плюс файлы локализаций, плюс всё остальное для пакета качаем тут: helloworld_l10n.zip

Нет трекбэков

URL для трекбэков: http://weho.ru/cgi-bin/mt/mt-tb.cgi/66

Комментировать

Об этой записи

Сообщение опубликовано 17.04.2008 22:35. Автор — Narmo.

Предыдущая запись — "Hello, world!" - говорит iPhone

Следующая запись — Пример простого видеоплеера

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.

Работает на Movable Type 5.01
Хороший хостинг