leopardgeckoのブログ

Macの関連事項など

Mac版Inkscapeの正しい日本語化

はじめに

MacInkscapeを起動するとメニューが英語で表示され、設定から日本語を選ぶとアプリが異常終了するようになってしまいます。これは何年も前から指摘されているバグなのですが、未だに修正されていません。

いくつかのサイトで対応策が紹介されていますが、どういうわけかそのほとんどが強制的に日本語を表示させているだけという不完全な対応(よく見かけるのは「export LANG="ja_JP.UTF-8"」に書き換えたり挿入したりする方法)であり、これはInkscapeの本来あるべき動作とは違うものです。Inkscapeはもともと多言語に対応しているので、日本語のシステムではメニューがデフォルトで日本語で表示され、さらに設定で他の言語に切り替えることもできるのが本来意図されている動作です。

どうして未だに間違った方法だけが広まっているのか不思議なのですが、ちょっと検索してみた限りでは正常に動作させるための修正方法を記載しているサイトは未だにないようです。この記事ではバグをごまかすのではなく、本来の動作ができるように完全に修正する方法を紹介します。といっても実際の作業は簡単で、以下の通りに設定ファイルを一行書き換えるだけです。

修正方法

アプリ本体のInkscape.appを右クリックして、「パッケージの内容を表示」を選びます。そこからContents→Resources→binとフォルダをたどっていき、「bin」フォルダの中にある「inkscape」というファイルをテキストを編集できるアプリ(個人的にはCotEditorがオススメ)で開きます。

inkscape」を開いたら、その143行目の

tail -n1 | sed 's/\./ /' | awk '{print $2}'`"

というところを

tail -n1 | awk '{print $2}' | awk -F. '{print $1}'`"

に書き換えます。

これでバグが修正されてデフォルトで日本語表示されるようになり、設定で他の言語を選ぶとその言語で表示することも可能になります。例えば海外サイトのチュートリアルを参考にしたい場合には英語メニューに切り替えた方がわかりやすい時もあるでしょう。そういう時に簡単に表示を変更することができます。

解説

これで一件落着ですが、どうしてこの書き換えが必要になるのかを説明しておきます。使えればそれで良いという人は以下は読まなくても大丈夫です。

Inkscapeは表示言語の設定の際に「/usr/share/locale/locale.aliase」というファイルから各国語の設定用の文字列を抜き出す動作をしています。

「/usr/share/locale/locale.aliase」の一部を抜粋するとこんな感じのファイルです。

icelandic       is_IS.ISO-8859-1
italian it_IT.ISO-8859-1
japanese ja_JP.eucJP
japanese.euc ja_JP.eucJP
ja_JP ja_JP.eucJP
ja_JP.ujis ja_JP.eucJP
japanese.sjis ja_JP.SJIS
korean ko_KR.eucKR
korean.euc ko_KR.eucKR
ko_KR ko_KR.eucKR
lithuanian lt_LT.ISO-8859-13

Inkscapeはこの中から、日本語であれば「ja_」という文字列を検索してマッチした中から最後の行を取り出し、sedでピリオドをスペースに置換し、awkで二番目のフィールドを取り出して、その語尾に「.UTF-8」をくっつけて環境変数LANGとしてexportするという作業を行なっています。

他の言語ではこの動作で正しい文字列を取り出すことができます。例えば日本語の上にあるアイスランド語(icelandic)とイタリア語(italian)ではそれぞれ「is_IS」と「it_IT」を取り出せます。しかし日本語の場合は、最後の行の一番目のフィールドが「japanese.sjis」とフィールドの中にピリオドが入っているので、sedでピリオドをスペースに変換すると「sjis」が二番目のフィールドとなってしまい、本来取り出したい「ja_JP」ではなく「sjis」を取り出してしまいます。これがエラーの原因となっています。

日本語でも他の言語でも同じように狙った文字列を取り出すためには、まず最初に最後の行から2番目のフィールドを取り出しておいて、そこからピリオドの前の文字列を抜き出すという動作に書き換える必要があります。

「tail -n1 | awk '{print $2}' | awk -F. '{print $1}'」という記述はそのためのものです。