そーす

福岡在住のプログラマ。SwiftとかKotlinとかJavascriptとかSketchとか触ってます。

iOSのLocalizable.stringsをプロパティアクセスで使えるようにしたい

f:id:saburesan:20160427075732p:plain

iOSのテキストのローカライズって

Localizable.strings

"hello_world" = "Hello, world!"
var helloWorld = NSLocalizedString("hello_world", comment: "")

ってやると思うんですが、これkeyをタイポしても実行してView見てみないと気づかないし、ハードコーディングが増えると修正箇所の発見などが困難になる場合があるのでできるだけ避けたいですよね。これ、iOS歴長い人はどうやってるんでしょうか。教えていただきたい。

調べてみるとなんかいい感じな方法無いみたいなんですよね。

なので、Localizable.stringsからプロパティアクセスでローカライズテキストにアクセスできる構造体が欲しいと思いました。

こういう感じ。

var helloWorld = LocalizedString.hello_world

でとりあえず書きました。swiftです。

github.com

import Cocoa

let arguments = Array((Process.arguments[1..<Process.arguments.count]))

if arguments.count != 2 {
  print("error.")
  exit(0)
}

let filePath = arguments[0]
let saveDir = arguments[1]

let data = NSData(contentsOfFile: filePath)
if let fileData = data {
    let content = NSString(data: fileData, encoding:NSUTF8StringEncoding) as! String
    var isCommentLine = false
    var newContent = ""
    content.enumerateLines { line, bool in
      if line.hasPrefix("/*") {
        isCommentLine = true
      }

      if isCommentLine {
        if line.hasSuffix("*/"){
          isCommentLine = false
        }
        return
      }

      if line.hasPrefix("//") { return }

      var key = line.componentsSeparatedByString("\"").filter { !$0.isEmpty }.first
      if var key =  key {
        newContent.appendContentsOf(
          "static var \(key): String { return NSLocalizedString(\"\(key)\", comment: \"\(key)\") }\n"
        )
      }
    }
    newContent = "import Foundation\n\nstruct LocalizedString {\n\(newContent)\n}"
    do {
        try newContent.writeToFile(saveDir + "/LocalizedString.swift", atomically: false, encoding: NSUTF8StringEncoding)
      print("Completed.")
    } catch {
        print(error)
    }

使い方

ターミナルで

swift LocalizeScript.swift {Localizable.stringsのpath} {LocalizedStringの生成ディレクトリ}

とします。

Localizable.strings

"hello_world" = "Hello, world!"

上記からLocalizedStringを生成すると以下の様な構造体ができます。

import Foundation

struct LocalizedString {
static var hello_world: String { return NSLocalizedString("hello_world", comment: "hello_world")}
}

感想

Swiftの勉強になった??