普通のアプリの場合は、NSLocalizedString
にキーを渡すだけで大丈夫なのですが、frameworkを公開する場合、デフォルトだとアプリ側のBundle
を参照してしまうので、そちらも正しく指定しなくてはいけません。
情報が少なかったので、その方法を記載しておきます。
やること
普通のアプリと同じように、Localizable.strings
を用意します。
Base.lproj
を上手く作ってくれない場合があるかもしれませんが、手動で作ればプロジェクトが読み込んでくれます。
そのままBundle
を指定せずに、NSLocalizedString
を呼んでしまうと、Bundle.main
の方を呼んでしまうので、Bundle Identifier
から参照するようにします。
上の部分を参照して、
Bundle(identifier: "com.flyingalpaca.Uppsala")
のように取得します。
自分はローカライズの部分までまとめて、extension
にしました。好みでcomputed property
にしてもいいと思います。
extension String { func localized() -> String { guard let bundle = Bundle(identifier: "com.flyingalpaca.Uppsala") else { return self } return NSLocalizedString(self, tableName: nil, bundle: bundle, comment: self) } }
すると、このような感じで呼べます。
"update_notification_title".localized()
サンプル
実際に使うときは、このようにenum
のメソッドでさらにラップして使っています。
public class Dialog { /** いろいろ */ public init() { title = LocalizedStringKeys.notificationTitle.localized() } } fileprivate extension Dialog { enum LocalizedStringKeys: String { case notificationTitle = "update_notification_title" case notificationMessage = "update_notification_message" func localized() -> String { return self.rawValue.localized() } } }