신속한 변수가있는 NSLocalizedString


85

NSLocalizedString을 사용하여 내 앱을 지역화하려고합니다. XLIFF 파일을 가져올 때 대부분은 매력처럼 작동하지만 무언가는 그렇지 않으며 일부 문자열은 현지화되지 않았습니다. 나는 문제가 다음과 같은 변수를 포함하는 NSLocalizedString에서 오는 것으로 나타났습니다.

NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")

또는

NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")

아마도 이것은 이러한 종류의 항목에 대한 올바른 구문이 아닐 수 있습니다. 누군가가 신속하게 수행하는 방법을 설명 할 수 있습니까? 대단히 감사합니다.


이것은 강력한 아키텍처를위한 Swift의 현지화에 대한 아주 좋은 기사입니다
Mendy

답변:


133

에서 sprintf형식 매개 변수를 사용할 수 NSLocalizedString있으므로 예제는 다음과 같습니다.

let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)

6
Localizable.string에서 어떻게 생겼습니까?
Van Du Tran 2015

를 Obj-C와 동일 :" - %d Notifica"=" - %d Notifica";
재 감지

3
문자열을 어떻게 대체합니까? %s작동하지 않는 수정자를 사용하려고했습니다 = \
igrek

12
@igrek %@문자열을 대체하는 데 사용 합니다.
Yeehaw

2
이러한 형식 지정 매개 변수에 대한 참조는 developer.apple.com/library/content/documentation/Cocoa/…입니다.
Shaun Dychko 2017-08-29

94

WWDC2014 "Localizing with Xcode 6"세션 # 412에서 Swift에서이를 수행하는 올바른 방법은 다음과 같습니다.

String.localizedStringWithFormat(
    NSLocalizedString(" - %d Notifica",
    comment: "sottotitolo prescrizione per le notifiche al singolare"),
    count)

NSLocalizedString (...)을 사용해야하는 이유는 무엇입니까? String.localizedStringWithFormat (...)의 구현에서 발생하지 않습니까?
Yitzchak


1
고마워요 제가 물어 본 후에 이미 봤어요. 이 덕분에 이렇게 다른 사람을 위해 아주 도움이 될 것입니다
Yitzchak

25

현지화 할 문자열이 많기 때문에 String 확장을 만드는 방법을 따랐습니다.

extension String {
    var localized: String {
        return NSLocalizedString(self, comment:"")
    }
}

코드의 지역화에 사용하려면 다음을 수행하십시오.

self.descriptionView.text = "Description".localized

동적 변수가있는 문자열의 경우 다음을 따르십시오.

self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"

다른 언어에 대한 문자열 파일의 문자열 선언 (예 : 아랍어 및 영어)

여기에 이미지 설명 입력 여기에 이미지 설명 입력

희망이 도움이 될 것입니다!


2
하지만 나에게 당신은 단지 시간을 줄에 붙이는 것 같습니다. 현지화 된 문자열이 The doors open at %@ o'clock. 솔루션이 여전히 작동합니까?
Houman

예, 내가 뒤에서 String으로 시간을 얻고 있기 때문에 완벽하게 작동합니다.
JaspreetKour

1
에 대한 참조를 포함 해 주셔서 감사합니다 Localizable.strings. 그러나 @Houman에는 유효한 우려가 있다고 생각합니다.
Matt

사람들이 "코멘트"값을 버리고 싶어하는 이유를 모르겠습니다. 텍스트에 대한 설명과 그 목적을 현지화 엔지니어에게 제공합니다. 그렇지 않으면 해당 텍스트를 버튼이나 레이블 등으로 사용하려는 의도를 알 수 없습니다.
Satyam

7

위의 솔루션을 시도했지만 아래 코드가 저에게 효과적이었습니다.

SWIFT 4

extension String {

    /// Fetches a localized String
    ///
    /// - Returns: return value(String) for key
    public func localized() -> String {
        let path = Bundle.main.path(forResource: "en", ofType: "lproj")
        let bundle = Bundle(path: path!)
        return (bundle?.localizedString(forKey: self, value: nil, table: nil))!
    }


    /// Fetches a localised String Arguments
    ///
    /// - Parameter arguments: parameters to be added in a string
    /// - Returns: localized string
    public func localized(with arguments: [CVarArg]) -> String {
        return String(format: self.localized(), locale: nil, arguments: arguments)
    }

}

// variable in a class
 let tcAndPPMessage = "By_signing_up_or_logging_in,_you_agree_to_our"
                                     .localized(with: [tAndc, pp, signin])

// Localization File String
"By_signing_up_or_logging_in,_you_agree_to_our" = "By signing up or logging in, you agree to our \"%@\" and \"%@\" \nAlready have an Account? \"%@\"";

6

다음은 String에서 사용하는 확장이며 가변 인수가있는 localizeWithFormat 함수를 추가합니다.

extension String:{

     func localizeWithFormat(arguments: CVarArg...) -> String{
        return String(format: self.localized, arguments: arguments)        
     }

     var localized: String{
         return Bundle.main.localizedString(forKey: self, value: nil, table: "StandardLocalizations")
     }
}

용법:

let siriCalendarText = "AnyCalendar"
let localizedText = "LTo use Siri with my app, please set %@ as the default list on your device reminders settings".localizeWithFormat(arguments: siriCalendarTitle)

String과 동일한 함수 및 속성 이름을 사용하지 않도록주의하십시오. 저는 일반적으로 모든 프레임 워크 기능에 3 자 접두사를 사용합니다.


-5

해야 할 일 이 많았 기 때문에 extensionto를 만들었습니다 .Stringstringslocalized

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

예를 들면 :

let myValue = 10
let anotherValue = "another value"

let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized
print(localizedStr)

6
이 접근 방식의 큰 단점은 문자열을 Editor > Export for Localization...선택하지 않기 때문에 번역자에게 보낼 문자열을 수동으로 추출해야한다는 것입니다.
Jason Moore

@JasonMoore가 제안한 것을 감안할 때 이것이 올바른 접근 방식이라고 생각하지 않습니다.
Yuchen Zhong

@JasonMoore는 당신과 완전히 동의합니다. 여러분 중 누구라도 이것에 대한 해결책을 찾았습니까?
gasparuff 2017-04-12

나는이 솔루션은 :( downrated 이유를 알고하지 않습니다 거의 솔루션 아래 아래 둥지은 동일하지만 uprate 있습니다.
아 므르 화가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.