NSLocalizedStringへの入力パラメーターとして変数を使用しようとしましたが、戻ってきたのは入力パラメーターだけです。私は何を間違えていますか? NSLocalized文字列のインデックスとして可変文字列値を使用することは可能ですか?
たとえば、ローカライズされたバージョンを表示したい文字列があります。ただし、定数文字列ではなく、NSLocalizedStringのパラメーターとして変数を使用したいと思います。同様に、NSLocalizedStringのパラメーターにフォーマット要素を含めたいので、同じフォーマットパラメーターで文字列のローカライズバージョンを取得できます。次のことができますか?
ケース1:変数NSLocalizedstring:
NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");
ケース2:フォーマットされたNSLocalizedString:
NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];
(変数には、文字列の固定セットだけでなく、何でも含めることができることに注意してください。)
ありがとう!
不足しているターゲットエントリが原因であることが判明しました。現在のビルドターゲットにLocalizable.stringファイルが含まれていることを確認するだけで問題が解決しました。
「これはApple/Orange/whatever」のローカライズバージョンを返したい場合は、次のようにします。
_NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil);
_
(つまり、NSLocalizedString()
と_[NSString stringWithFormat:]
_のネストは逆になります。)
formatをローカライズしたいが、置換された値ではない場合は、次のようにします。
_NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"];
_
そして、あなたの_Localizable.strings
_で:
_SomeFormat = "This is an %@";
_
多くのプロジェクトで使用している非常に役立つ定義を1つ追加したいだけです。
Androidの可能性に触発されて、この関数をheader prefix
ファイルに追加しました。
#define NSLocalizedFormatString(fmt, ...) [NSString stringWithFormat:NSLocalizedString(fmt, nil), __VA_ARGS__]
これにより、次のようなローカライズされた文字列を定義できます。
"ExampleScreenAuthorizationDescriptionLbl"= "I authorize the payment of %@ to %@.";
また、次の方法で使用できます。
self.labelAuthorizationText.text = NSLocalizedFormatString(@"ExampleScreenAuthorizationDescriptionLbl", self.formattedAmount, self.companyQualifier);
Swift:
let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)
ローカライズされた文字列に複数の変数がある場合、次のソリューションを使用できます。
Localizable.stringsで
"winpopup" = "#name# wins a #type# and get #points# points(s)";
StringByReplacingOccurrencesOfStringを使用して値を挿入します
NSString *string = NSLocalizedString(@"winpopup", nil); //"#name# wins a #type# and get #points# points(s)"
NSString *foo = [string stringByReplacingOccurrencesOfString:@"#name#" withString:gameLayer.turn];
NSString *fooo = [foo stringByReplacingOccurrencesOfString:@"#type#" withString:winMode];
NSString *msg = [fooo stringByReplacingOccurrencesOfString:@"#points#" withString:[NSString stringWithFormat:@"%i", pkt]];
NSLog(@"%@", msg);
extension String {
public var localizedString: String {
return NSLocalizedString(self, comment: "")
}
public func localizedString(with arguments: [CVarArg]) -> String {
return String(format: localizedString, arguments: arguments)
}
}
Localizable.string:
"Alarm:Popup:DismissOperation:DeviceMessage" = "\"%@\" will send position updates on a regular basis again.";
"Global:Text:Ok" = "OK";
使用法:
let message = "Alarm:Popup:DismissOperation:DeviceMessage".localizedString(with: [name])
そして
let title = "Global:Text:Ok".localizedString
あなたのアイデアはうまくいくはずです。ただし、入力パラメーターを取得している場合、それは入力パラメーターがLocalizable.stringsファイルでキーとして検出されなかったことを意味します。そのファイルの構文と場所を確認してください。