program tip

NSLocalizedString에서 변수 및 / 또는 매개 변수를 사용할 수 있습니까?

radiobox 2020. 12. 3. 07:44
반응형

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"];

(변수는 고정 된 문자열 세트뿐만 아니라 모든 것을 포함 할 수 있습니다.)

감사!


"This is an Apple / Orange / whatever"의 현지화 된 버전을 반환하려는 경우 다음을 원할 것입니다.

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

(즉, NSLocalizedString()의 중첩 [NSString stringWithFormat:]이 반전됩니다.)

원하는 것이 현지화 형식 이지만 대체 값이 아닌 경우 다음을 수행하십시오.

NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"];

그리고 당신의 Localizable.strings:

SomeFormat = "This is an %@";

많은 프로젝트에서 사용하는 매우 유용한 정의를 추가하고 싶습니다.

안드로이드 가능성에 영감을 받아이 기능을 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);

신속한 :

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

누락 된 대상 항목이 비난받는 것으로 밝혀졌습니다. 현재 빌드 대상에 Localizable.string 파일이 포함되어 있는지 확인하기 만하면 문제가 해결되었습니다!


지역화 된 문자열에 둘 이상의 변수가있는 경우이 솔루션을 사용할 수 있습니다.

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 파일에서 키로 발견되지 않았 음을 의미합니다. 해당 파일의 구문과 위치를 확인하십시오.

참고 URL : https://stackoverflow.com/questions/3445917/possible-to-use-variables-and-or-parameters-with-nslocalizedstring

반응형