LocalizeMe(1)

2012. 03. 12
諸事情により実機テストができない状態なので、(旧版における)以下の章の説明は割愛させていただきます。

・第14章 ここはどこ?Core Locationで行くべき道を探す(Core Locationによる現在位置の取得)
・第15章 やってしまった!(加速度センサの利用)
・第16章 iPhoneのカメラとフォトライブラリ(内蔵カメラの利用)

環境が整いましたら改めて説明したいと思います。

今回は本書では最後の章となる、アプリケーションのローカライズを行うLocalizeMeです。

ローカライズの処理に関してですが、ここで紹介する開発環境はXcode 3.2.6であり、Xcode 4.xとは異なる部分がありますので予めご了承ください。

LocalizeMeでは、以下のローカライズを行います。
・ユーザの設定している現在の言語環境を取得し、設定されている言語と書式をラベルで表示
・文字列ローカライズファイルによるラベルの文字列を差し替え
・nibファイルの差し替えによるラベルと画像の差し替え

初版およびiOS 3.x版のサンプルコードではアプリケーションアイコンの差し替えも行っていますが、iOS 4以降ではアイコンのローカライズができなくなったらしく、iOS 4.x版のサンプルコードでは省略されており、代わりにアプリケーションのタイトルのローカライズが追加されています。
(iOS 4におけるアイコンのローカライズ問題については『akalogue/iPhone SDKの教科書』や『Use Your Loaf/Blog/Localizing iPhone App Icon is not supported』を参照してください。)


●言語と書式

ローカライズは、ユーザの設定している言語環境に対しアプリケーションが対応していれば反映されるもので、対応の可否および対応する言語は開発者に依存します。

ユーザの言語環境はiOSのデフォルトアプリケーションである『Settings(設定)』から行います。

7903

『Settings(設定)』下にある『General(一般)』を選択します。

7904

『General(一般)』下にある『International(言語環境)』を選択します。

7905

アプリケーションのローカライズに最も関与するのが『Language(言語)』で、次に『Region Format(書式)』が重要になります。

7906

『Language(言語)』設定はローカライズの基本となる要素で、文字列や画像、nibファイルなどのリソースを振り分ける主条件となります。
(詳細は『言語環境の用語』や『言語環境の言語』を参照してください)

7907

『Region Format(書式)』は言語に地域情報を加えた要素で、同じ言語でも地域(国)による日付や数値の書式などの表記の差異を振り分けるための条件となります。
(詳細は『言語環境の書式』や『ロケールのリージョンコード』を参照してください)

7908

したがって今回のLocalizeMeのような、単純な文字列や画像の差し替えであれば『Language(言語)』毎のローカライズで済みますが、日付や数値の書式などが絡む場合は『Region Format(書式)』毎のローカライズが必要になります。

検索順序は『Region Format(書式)』→『Language(言語)』になります。


●プロジェクトの作成

View-based Applicationテンプレートで、プロジェクト名を『LocalizeMe』とします。

7815

7910


●LocalizeMeViewController.hヘッダファイルの編集

現在設定されている言語環境を表示するラベルlocaleLabelと、文字列ローカライズファイルによって差し替える文字列を表示するラベルlabel1~5のアウトレットの宣言を行います。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@interface LocalizeMeViewController : UIViewController {
    UILabel *localeLabel;
    UILabel *label1;
    UILabel *label2;
    UILabel *label3;
    UILabel *label4;
    UILabel *label5;

}

@property (nonatomic, retain) IBOutlet UILabel *localeLabel;
@property (nonatomic, retain) IBOutlet UILabel *label1;
@property (nonatomic, retain) IBOutlet UILabel *label2;
@property (nonatomic, retain) IBOutlet UILabel *label3;
@property (nonatomic, retain) IBOutlet UILabel *label4;
@property (nonatomic, retain) IBOutlet UILabel *label5;


@end

7911


●アイコンと画像ファイルのコピーとプロジェクトへの追加

アプリケーションのアイコンとなるicon.pngとデフォルト(英語)時の国旗flag.pngファイルを、サンプルコードから自身のLocalizeMeプロジェクトのフォルダにコピーしてプロジェクトに追加します。

iOS 3.x版のサンプルコードの場合は『17 LocalizeMe/Resources/Base Language』(または『17 LocalizeMe/English.lproj』)フォルダ下、iOS 4.x版のサンプルコードの場合はアイコンは『19 - LocalizeMe』フォルダ下、国旗は『19 - LocalizeMe/en.lproj』フォルダ下にあります。

両ファイルとも自身の『LocalizeMe』フォルダ直下に置いてください。
(ローカライズするとファイルは自動的に『~.lproj』フォルダに移動されます)

7912

そして両ファイルをResources下に追加します。

7920


●LocalizeMeViewController.xibの編集

LocalizeMeViewController.hヘッダファイルの変更が終わったら保存し、ビューコントローラのnibファイルLocalizeMeViewController.xibを開いてラベルの追加を行います。


1)ラベルの追加

LibraryウィンドウのLabelを選択し、Viewウィンドウの上方に言語環境を表示するラベルを1つ、左側にnibファイルによるローカライズ用のラベル5つ、右側に文字列ファイルによるローカライズ用のラベル5つを設置します。

7913


2)ラベルへのアウトレットの接続

DocumentウィンドウでFile's Ownerを選択し、InspectorウィンドウでConnectionsタブを開き、OutletsのラベルlabelをViewウィンドウのラベルに接続します。

label1~5は右側の文字列ファイルによるローカライズ用のラベルに上から順に、localeLabelは上方の言語環境を表示するラベルに接続します。

7914


3)ラベルのサイズ変更

Documentウィンドウで各ラベルを選択し、InspectorウィンドウでSizeタブを開き、各ラベルのサイズを下表のように変更します。
(レイアウトはiOS 4.x版のサンプルコードに倣っています)

LabelXYWH
 localeLabel 202028057
 label1(左)2010613721
 label2(左)2013513721
 label3(左)2016413721
 label4(左)2019313721
 label5(左)2022213721
 label1(右)16310613721
 label2(右)16313513721
 label3(右)16316413721
 label4(右)16319313721
 label5(右)16322213721

7915


4)ラベルの属性変更

InspectorウィンドウのAttributesタブを開き、属性の変更を行います。

localeLabel)

LabelのLayoutのAlignmentを左揃えから中央揃えに、Fontを『Helvetica, 17.0』から『Helvetica Bold, 29.0』に、Textを『Default』からColor Palettesで『0000CC』に変更します。

7916

label1~5(左))

左側の5つのラベルはnibファイルによるローカライズですので、LabelのTextを上から順にOne、Two、Three、Four、Fiveに変更します。

7917

label1~5(右))

右側の5つのラベルは文字列ファイルによるローカライズですので、LabelのTextを変更する必要はありませんが、LayoutのAlignmentを左揃えから右揃えに変更します。

7918


5)Image Viewの追加

LibraryウィンドウのImage Viewを選択し、Viewウィンドウの下方に国旗を表示するイメージビューを設置し、InspectorウィンドウでSizeタブを開き、サイズをX:0、Y:251、W:320、H:218に変更します。
(レイアウトはiOS 4.x版のサンプルコードに倣っています)

7919


6)イメージビューの属性変更

ImageViewのImageでflag.pngを選択し、デフォルト(英語)時の国旗を設定します。

ViewのModeは『Scale To Fill』(UIViewContentModeScaleToFill:画像の縦横比を無視し、ビュー境界に合わせて拡大縮小)から『Aspect Fit』(UIViewContentModeScaleAspectFit:画像の縦横比を維持し、ビュー境界に合わせて拡大縮小)に変更します。

これは国旗画像の縦横比が統一されていないことへの対処ですが、画像とビュー境界の隙間が透明となるため、デフォルトでチェックされているDrawingの『Opaque』(opaque:ビューが不透明)と『Clear Context Before Drawing』(clearsContextBeforeDrawing:描画前に透明な黒でクリア)のチェックが外されています。

7921

全ての変更が済んだらnibファイルを保存します。

7922


●LocalizeMeViewController.mソースファイルの編集

6つのラベルのプロパティの実装と、viewDidLoadメソッドへのコード追加を行います。
(太字が追加した部分)

#import "LocalizeMeViewController.h"

@implementation LocalizeMeViewController

@synthesize localeLabel;
@synthesize label1;
@synthesize label2;
@synthesize label3;
@synthesize label4;
@synthesize label5;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLocale *locale = [NSLocale currentLocale];
    NSString *displayNameString = [locale displayNameForKey:NSLocaleIdentifier value:[locale localeIdentifier]];
    localeLabel.text = displayNameString;

    label1.text = NSLocalizedString(@"One", @"The number 1");
    label2.text = NSLocalizedString(@"Two", @"The number 2");
    label3.text = NSLocalizedString(@"Three", @"The number 3");
    label4.text = NSLocalizedString(@"Four", @"The number 4");
    label5.text = NSLocalizedString(@"Five", @"The number 5");

}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

    self.localeLabel = nil;
    self.label1;
    self.label2;
    self.label3;
    self.label4;
    self.label5;
    [super viewDidUnload];

}

- (void)dealloc {
    [localeLabel release];
    [label1 release];
    [label2 release];
    [label3 release];
    [label4 release];
    [label5 release];

    [super dealloc];
}

@end

7923


1)プロパティの実装

ヘッダファイルで宣言した6つのラベルのプロパティを@synthesizeで実装します。


2)不要なメソッドの削除

テンプレートで自動生成されるメソッドの内、initWithNibName:bundle:loadViewは今回使用しないので削除します。



参考文献

akalogue/iPhone SDKの教科書

Use Your Loaf/Blog/Localizing iPhone App Icon is not supported

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






bose_soundlink_revolve
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

bose_soundlink_revolve
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR