ikazuchi - コマンドラインでネット上の翻訳サイトを使う

これはすごい便利ですね。コマンドラインから翻訳できます。 これでいちいち翻訳サイトのページを開くことはありません。 制作者の方に感謝です。

インストール:

$ pip install ikazuchi

日本語->英語:

$ ikazuchi -f ja -t en -s "こんにちわ"

英語->日本語:

$ ikazuchi -f en -t ja -s "hello"

更に使いやすくするTIPS

コマンド名が長くオプションも設定しなければならないため、 頻繁に打つコマンドとしては面倒です。 そこで各コマンドに対する省略系を作ってしまうと翻訳効率が上がります。 私自身は以下のように使用できるようにカスタマイズしています。

en2ja

英語 -> 日本語

ja2en

日本語 -> 英語

それぞれ引数を半角空白で結合し ikazuchi.py-s に渡しています。

ikazuchi.py
-s SENTENCE

SENTENCEには翻訳する文字列を指定します。 文を指定するときはダブルクォートでくくります。

Windowsの場合

ja2en.bat
echo off
set SENTENCE=

:check
if "%1" == "" goto final
set SENTENCE=%SENTENCE% %1
shift
goto check

:final
echo on
ikazuchi -f ja -t en -s "%SENTENCE%"
en2ja.bat
echo off
set SENTENCE=

:check
if "%1" == "" goto final
set SENTENCE=%SENTENCE% %1
shift
goto check

:final
echo on
ikazuchi -f en -t ja -s "%SENTENCE%"

引数の結合の仕方は 全ての引数を空白で結合する をご覧ください。

Windowsで使用する場合の注意

今回は次のバージョンを使用しました。

D:\ng\opt\python27\Scripts>ikazuchi --version
ikazuchi-script.py normal 0.5.4

このバージョンはWindows上の動作に不具があります。 本来設定ファイルが作成されるところに、 設定ファイルと同じ名前のディレクトリが作成されてしまいます。

それは設定ファイルへのパスを取得する関数でバックスラッシュへの考慮がされていないため 設定ファイルを配置するディレクトリの取得ができていません。

ikazuchi/conf.py (抜粋):

def create_conf_file(conf_file):
    conf_dir = conf_file.rsplit("/", 1)[0]
    make_dirs(conf_dir)
    with open(conf_file, "wb") as f:
        pass  # menas touch command
    print _(u"created conf file: {0}".format(conf_file))

この関数の最初の行の conf_dir 変数への代入式では、 恐らく設定ファイルのディレクトリへのパスが入ります。

設定ファイルのディレクトリへのパスを取得するために:

conf_file.rsplit("/", 1)[0]

このように取得しています。 これでは / 文字しか rsplit されません。 もし os.sep\ だった場合、ディレクトリ名を正しく取得できなくなります。

conf_file に渡されているデータの取得元を見てみると

ikazuchi/conf.py (抜粋):

def get_conf_path():
    """
    >>> get_conf_path().rsplit("/", 2)[-2:]
    [u'.ikazuchi', u'ikazuchi.conf']
    """
    import platform
    _os = platform.system()
    if _os == "Darwin" or _os == "Linux":
        prefix = os.getenv(u"HOME")
    elif _os == "Windows":
        prefix = os.getenv(u"APPDATA")
    return pathjoin(prefix, CONF_PATH)

となっていました。 ここではパスは環境変数から取得しており、それをos.path.join()しています。 そのため \ が使用される可能性はあります。

従って create_conf_file()get_conf_path() のどちらかで \ に対する対処をする必要があります。

修正案 - ディレクトリパス取得をrsplit()からos.path.dirname()に変更する

現在のディレクトリパスの取得はrsplit()を使って自分で分割指しています。 これをos.path.dirname()に任せてしまうというものです。 修正は行だけです。

$ hg diff
diff -r 98e541e1ae5c src/ikazuchi/conf.py
--- a/src/ikazuchi/conf.py      Mon May 28 18:17:45 2012 +0900
+++ b/src/ikazuchi/conf.py      Wed Mar 27 05:40:25 2013 +0900
@@ -2,6 +2,8 @@

 import ConfigParser
 import os
+from os.path import abspath as pathabspath
+from os.path import dirname as pathdirname
 from os.path import join as pathjoin

 try:
@@ -62,7 +64,7 @@
             conf.set(section, option, "")

 def create_conf_file(conf_file):
-    conf_dir = conf_file.rsplit("/", 1)[0]
+    conf_dir = pathdirname(pathabspath(conf_file))
     make_dirs(conf_dir)
     with open(conf_file, "wb") as f:
         pass  # menas touch command
inserted by FC2 system