ObjecTips

Swift & Objective-C で iOS とか macOS とか

Localizable.strings ファイルを plutil で読み込んで変換する

plutil -- property list utility コマンドで Localizable.strings (strings file format) を読み込む事が出来るらしいので試してみる。

元ファイルは以下

/*
 Localizable.strings
 Test
 */

"Yes" = "はい";
"No" = "いいえ";
"Cancel" = "キャンセル";
"Title" = "タイトル";

変換オプションは plutil -convert <fmt> <filepath>
で fmt は xml1, binary1, json の3つ

XML

コマンド plutil -convert xml1 <filepath>

結果

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Cancel</key>
    <string>キャンセル</string>
    <key>No</key>
    <string>いいえ</string>
    <key>Title</key>
    <string>タイトル</string>
    <key>Yes</key>
    <string>はい</string>
</dict>
</plist>
JSON

コマンド plutil -convert json <filepath>

結果

{"Yes":"はい","Cancel":"キャンセル","No":"いいえ","Title":"タイトル"}
Binary Plist

コマンド plutil -convert binary1 <filepath>

結果
中身のテキストはXMLと同じで、フォーマットが binary plist 形式になっている。

JSONフォーマットオプション

JSON変換用のオプションで空白と改行を入れて human-readable にする
plutil -convert json -r <filepath>

結果

{
  "Yes" : "はい",
  "Cancel" : "キャンセル",
  "No" : "いいえ",
  "Title" : "タイトル"
}
拡張子オプション

ファイルを上書きせず元ファイルと同じディレクトリへ指定した拡張子でファイルを書き出す。

plutil -convert json -e json <filepath>
plutil -convert xml1 -e xml <filepath>
plutil -convert binary1 -e plist <filepath>
書き出し先オプション

書き出し先のファイルパスを指定
plutil -convert json -o <output_filepath> <filepath>

lint

ファイルフォーマットが正しいかどうかを調べ、セミコロンが抜けている箇所などを教えてくれる
plutil -lint <filepath>

結果

<filepath>: OK
CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 8. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug.
<filepath>: Unexpected character / at line 1

という事で plutil の中身は CFPropertyListCreateFromXMLData で動いているらしい。


plutil を使った時の難点

  • JSONは仕方ないとして、XMLの時にも書き出し後のファイルのキーの順序がソートされて元の並びと異なってしまう
  • コメント情報が消えてしまう

そもそも strings file format での書き出しが出来ないので読み込みにしか使えないのがイマイチ。

関連