web-dev-qa-db-ja.com

NSLocalizedStringで変数やパラメーターを使用できますか?

NSLocalizedStringへの入力パラメーターとして変数を使用しようとしましたが、戻ってきたのは入力パラメーターだけです。私は何を間違えていますか? NSLocalized文字列のインデックスとして可変文字列値を使用することは可能ですか?

たとえば、ローカライズされたバージョンを表示したい文字列があります。ただし、定数文字列ではなく、NSLocalizedStringのパラメーターとして変数を使用したいと思います。同様に、NSLocalizedStringのパラメーターにフォーマット要素を含めたいので、同じフォーマットパラメーターで文字列のローカライズバージョンを取得できます。次のことができますか?

ケース1:変数NSLocalizedstring:

NSString *varStr = @"Index1";
NSString *string1 = NSLocalizedString(varStr,@"");

ケース2:フォーマットされたNSLocalizedString:

NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];

(変数には、文字列の固定セットだけでなく、何でも含めることができることに注意してください。)

ありがとう!

59
futureelite7

不足しているターゲットエントリが原因であることが判明しました。現在のビルドターゲットにLocalizable.stringファイルが含まれていることを確認するだけで問題が解決しました。

4
futureelite7

「これは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 %@";
_
120
Wevah

多くのプロジェクトで使用している非常に役立つ定義を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);
21
Alexander

Swift:

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)
7
Xero

ローカライズされた文字列に複数の変数がある場合、次のソリューションを使用できます。

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);
4
zeiteisen
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
1
mientus

あなたのアイデアはうまくいくはずです。ただし、入力パラメーターを取得している場合、それは入力パラメーターがLocalizable.stringsファイルでキーとして検出されなかったことを意味します。そのファイルの構文と場所を確認してください。

0
JWWalker