IT story

Swift에서 NSLocalizedString은 무엇입니까?

hot-time 2020. 4. 26. 21:05
반응형

Swift에서 NSLocalizedString은 무엇입니까?


스위프트에 해당하는 것이 NSLocalizedString(...)있습니까? 에서 Objective-C일반적으로 다음을 사용합니다.

NSString *string = NSLocalizedString(@"key", @"comment");

Swift에서 어떻게 동일한 결과를 얻을 수 있습니까? 함수를 찾았습니다.

func NSLocalizedString(
    key: String,
    tableName: String? = default,
    bundle: NSBundle = default,
    value: String = default,
    #comment: String) -> String

그러나 매우 길고 전혀 편리하지 않습니다.


다음 해결책을 사용합니다.

1) 확장 만들기 :

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

2) Localizable.strings 파일에서 :

"Hi" = "Привет";

3) 사용 예 :

myLabel.text = "Hi".localized

즐겨! ;)

--upd :-

의견이있는 경우이 솔루션을 사용할 수 있습니다.

1) 확장 :

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

2) .strings 파일에서 :

/* with !!! */
"Hi" = "Привет!!!";

3) 사용 :

myLabel.text = "Hi".localized(withComment: "with !!!")

NSLocalizedString스위프트의 세계도 존재한다.

func NSLocalizedString(
    key: String,
    tableName: String? = default,
    bundle: NSBundle = default,
    value: String = default,
    #comment: String) -> String

tableName, bundlevalue매개 변수가 표시되는 default기능을 호출하는 동안 우리는 이러한 매개 변수를 생략 할 수 있습니다 수단 키워드. 이 경우 기본값이 사용됩니다.

이는 메소드 호출이 다음과 같이 단순화 될 수 있다는 결론으로 ​​이어집니다.

NSLocalizedString("key", comment: "comment")

스위프트 5- 변화가 없지만 여전히 그렇게 작동합니다.


기존 답변의 변형 :

스위프트 5.1 :

extension String {

    func localized(withComment comment: String? = nil) -> String {
        return NSLocalizedString(self, comment: comment ?? "")
    }

}

그런 다음 주석 유무에 관계없이 간단히 사용할 수 있습니다.

"Goodbye".localized()
"Hello".localized(withComment: "Simple greeting")

참고 사항genstrings 이 솔루션 작동하지 않습니다를.


이 방법을 사용하면 다른 유형 (예 : Int 또는 CurrencyUnit과 같은 사용자 정의 클래스)에 대해 다른 구현을 만들 수 있습니다. genstrings 유틸리티를 사용하여이 메소드 호출을 스캔 할 수도 있습니다. 단순히 명령에 루틴 플래그를 추가하십시오

genstrings MyCoolApp/Views/SomeView.swift -s localize -o .

신장:

import UIKit

extension String {
    public static func localize(key: String, comment: String) -> String {
        return NSLocalizedString(key, comment: comment)
    }
}

용법:

String.localize("foo.bar", comment: "Foo Bar Comment :)")

"코멘트"가 항상 무시되는 경우를 위해 작은 도우미 메소드를 작성했습니다. 적은 코드는 읽기 쉽다 :

public func NSLocalizedString(key: String) -> String {
    return NSLocalizedString(key, comment: "")
}

클래스 외부의 아무 곳에 나 넣으면 Xcode 가이 전역 메서드를 찾습니다.


스위프트 3 버전 :) ...

import Foundation

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

아마도 가장 좋은 방법은이 방법 일 입니다.

fileprivate func NSLocalizedString(_ key: String) -> String {
    return NSLocalizedString(key, comment: "")
}

import Foundation
extension String {
    static let Hello = NSLocalizedString("Hello")
    static let ThisApplicationIsCreated = NSLocalizedString("This application is created by the swifting.io team")
    static let OpsNoFeature = NSLocalizedString("Ops! It looks like this feature haven't been implemented yet :(!")
}

그런 다음 이렇게 사용할 수 있습니다

let message: String = .ThisApplicationIsCreated
print(message)

나에게 이것은 최고이기 때문에

  • 하드 코드 된 문자열은 하나의 특정 파일에 있으므로 변경하려는 날은 정말 쉽습니다.
  • 매번 파일에 문자열을 수동으로 입력하는 것보다 사용하기 쉬움
  • genstrings는 여전히 작동합니다
  • 보기 컨트롤러 당 하나씩 확장 기능을 추가하여 깔끔하게 유지

실제로 두 단계를 사용하여 Swift 프로젝트에서 텍스트를 번역 할 수 있습니다.

1) 첫 번째 단계는 이전 방식을 사용하여 번역 가능한 모든 문자열을 생성하는 것입니다.

NSLocalisedString("Text to translate", comment: "Comment to comment")

1.1) 그런 다음 Genstring을 사용하여 Localizable.strings를 생성해야합니다.

$ genstrings *swift

2) 나중에이 답변을 사용해야합니다 .

2.1) 정규식에 따라 XCode "찾기 및 바꾸기"옵션을 사용하십시오. 주어진 예 (주석이없는 경우)의 정규 표현식은 다음과 같습니다.

NSLocalizedString\((.*)\, comment:\ \"\"\) 

그것을

$1.localized

또는 (의견이있는 경우)

NSLocalizedString\((.*)\, comment:\ (.*)\)

그것을

$1.localizedWithComment(comment: $2)

원하는대로 정규식과 다른 확장 조합을 자유롭게 사용할 수 있습니다. 일반적인 방법은 전체 프로세스를 두 단계로 나누는 것입니다. 희망이 도움이됩니다.


SDK를 개발할 때 추가 작업이 필요합니다.

1) YourLocalizeDemoSDK에서 평소와 같이 Localizable.string만듭니다 .

2) YourLocalizeDemo 에서 동일한 Localizable.string만듭니다 .

3) YourLocalizeDemoSDK 번들 경로찾으십시오 .

스위프트 4 :

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self))YourLocalizeDemoSDK에서 번들을 찾는 데 도움이됩니다. Bundle.main대신 사용 하면 잘못된 값을 얻습니다 (사실 키와 동일한 문자열이됩니다).

그러나 당신이 언급 문자열 확장 사용하려면 박사의 OX를 . 좀 더해야 해요 원점 확장은 다음과 같습니다.

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

아시다시피, 우리는 SDK를 개발하고 있으며 Bundle.mainYourLocalizeDemo 번들을 얻을 것입니다. 그것은 우리가 원하는 것이 아닙니다. YourLocalizeDemoSDK에 번들이 필요합니다. 이것은 빨리 찾는 요령입니다.

YourLocalizeDemoSDK의 NSObject 인스턴스에서 아래 코드를 실행하십시오. 그리고 YourLocalizeDemoSDK의 URL을 얻게됩니다.

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

두 URL을 모두 인쇄하면 mainBundleURL을 기반으로 bundleURL ofSDK 기반을 빌드 할 수 있습니다. 이 경우 다음과 같습니다.

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

그리고 문자열 확장은 다음과 같습니다.

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

도움이 되길 바랍니다.


사용자 정의 번역 함수를 사용하여 문자열을 추출하는 고유 한 genstrings 도구를 만들었습니다.

extension String {

    func localizedWith(comment:String) -> String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: comment)
    }

}

https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c

모든 신속한 파일을 구문 분석하고 코드의 문자열과 주석을 .strings 파일로 내 보냅니다.

아마도 가장 쉬운 방법은 아니지만 가능합니다.


이것이 단축 문제에 대한 답변은 아니지만 메시지를 구성하는 데 도움이되었지만 아래처럼 오류 메시지의 구조를 만들었습니다.

struct Constants {
    // Error Messages
    struct ErrorMessages {
        static let unKnownError = NSLocalizedString("Unknown Error", comment: "Unknown Error Occured")
        static let downloadError = NSLocalizedString("Error in Download", comment: "Error in Download")
    }
}

let error = Constants.ErrorMessages.unKnownError

이 방법으로 메시지를 구성하고 젠 스트링을 작동시킬 수 있습니다.

그리고 이것은 사용 된 genstrings 명령입니다

find ./ -name \*.swift -print0 | xargs -0 genstrings -o .en.lproj

단위 테스트에 유용한 정보 :

이것은 다른 사용 사례로 확장 될 수있는 간단한 버전입니다 (예 : tableNames 사용).

public func NSLocalizedString(key: String, referenceClass: AnyClass, comment: String = "") -> String 
{
    let bundle = NSBundle(forClass: referenceClass)
    return NSLocalizedString(key, tableName:nil, bundle: bundle, comment: comment)
}

다음과 같이 사용하십시오.

NSLocalizedString("YOUR-KEY", referenceClass: self)

또는 다음과 같이 주석을 추가하십시오.

NSLocalizedString("YOUR-KEY", referenceClass: self, comment: "usage description")

기본 언어로 현지화 :

extension String {
func localized() -> String {
       let defaultLanguage = "en"
       let path = Bundle.main.path(forResource: defaultLanguage, ofType: "lproj")
       let bundle = Bundle(path: path!)

       return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
    }
}

구문이 같은 영어에서 다른 언어 (성, 동사 활용 또는 기울기 때문에)가 다른 언어로 번역 할 때 Swift에서 가장 간단한 NSString 형식은 모든 경우에 작동하는 세 가지 인수입니다. . 예를 들어, "previous was"라는 영어 문구는 "weight"( " предыдущ ий был")와 "waist"( " предыдущ ая был а ") 의 경우 러시아어로 다르게 번역 됩니다.

이 경우 하나의 소스에 대해 두 개의 다른 번역이 필요합니다 (WWDC 2018에서 권장되는 XLIFF 도구 측면에서). 두 개의 인수 NSLocalizedString을 사용하여이를 달성 할 수 없습니다. 여기서 "이전"은 "키"와 영어 번역 (예 : 값) 모두에서 동일합니다. 유일한 방법은 세 가지 인수 형식을 사용하는 것입니다

NSLocalizedString("previousWasFeminine", value: "previous was", comment: "previousWasFeminine")

NSLocalizedString("previousWasMasculine", value: "previous was", comment: "previousWasMasculine")

여기서 키 ( "previousWasFeminine"및 "previousWasMasculine")가 다릅니다.

나는 일반적인 조언이 문구를 전체적으로 번역하는 것이지만 때로는 너무 시간이 걸리고 불편하다는 것을 알고 있습니다.

참고 URL : https://stackoverflow.com/questions/25081757/whats-nslocalizedstring-equivalent-in-swift

반응형