LoginSignup
8

PlayOnLinuxの「インストールメニュー」で止まるバグの根本的な解決法

Last updated at Posted at 2018-11-28

#はじめに
このバグの対処についてはいくつかの解決法が既に示されています.

  1. エラーが起きる行をコメントアウト-http://singletonton.blogspot.com/2017/10/playonlinux.html
  2. 旧バージョンの使用-http://ginnoza.wpblog.jp/avoid-stop-of-playonlinux
  3. localeの変更-https://qiita.com/shun819/items/d6fa19747d31e125bc61
    しかし,2,3の解決法ではアプリの快適な利用の妨げになる可能性がある(英弱)し,1の解決法は一部の機能を変更して無理やり解決している感じがしたので,できるだけ根本的な解決方法を模索した次第です.

#環境
PlayOnLinux 4.2.12
Ubuntu 18.04

#発生していた問題
PlayOnLinuxでインストールボタンを押しても読み込み中のまま進まない
端末から開くと

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "mainwindow.py", line 111, in run
    self.real_check()
  File "mainwindow.py", line 78, in real_check
    self.sendToStatusBar(_('Refreshing {0}').format(os.environ["APPLICATION_TITLE"]), True)
KeyError: '0 '

というメッセージが出力されていました.

#原因特定までの過程
アンダースコアが関数のように扱われていたので,print(_)を挟んでみたところ,
<bound method GNUTranslations.gettext of <gettext.GNUTranslations instance at 0x7f91475fc200>>
という出力が得られました.gettextモジュールは翻訳関係のモジュールであるようなので,言語関係の設定を行っていそうな /usr/share/playonlinux/python/lib/lng.py を調べると

lng.py
class iLang(object):
    def __init__(self):
        if(os.environ["DEBIAN_PACKAGE"] == "TRUE"):
            languages = os.listdir('/usr/share/locale')
        else:
            languages = os.listdir(Variables.playonlinux_env+'/lang/locale')

        langid = wx.LANGUAGE_DEFAULT
        if(os.environ["DEBIAN_PACKAGE"] == "TRUE"):
            localedir = "/usr/share/locale"
        else:
            localedir = os.path.join(Variables.playonlinux_env, "lang/locale")

        domain = "pol"
        mylocale = wx.Locale(langid)
        mylocale.AddCatalogLookupPathPrefix(localedir)
        mylocale.AddCatalog(domain)

        mytranslation = gettext.translation(domain, localedir, [mylocale.GetCanonicalName()], fallback = True)
        mytranslation.install()

この記述から, /usr/share/locale/ja/pol.mo (2023/5/2更新 :/usr/share/locale/ja/LC_MESSAGES/pol.moにパスが変わっていました)を使って翻訳を行っていることが特定できました.
moファイルは言語の翻訳情報が書かれているバイナリファイルで,英語の原文と日本語の翻訳後の文がkeyとvalueのセットになっているようです(この辺とても曖昧です).
moファイルはバイナリなので,これを編集可能なpoファイルというものに戻し(.mo ファイルを .po ファイルに戻す方法-Qiitaを参照),ファイル中のmsgstr "{0 }をリフレッシュ中"の不要な空白を削除しmsgstr "{0}をリフレッシュ中"と書き直して元のmoファイルに上書きすれば無事にバグが治りました.
以下簡単に結論を書きます.

#原因
polの日本語向けlocaleファイルpol.moの記述ミス

#対処
記述ミスの箇所の修正( {0 } -> {0} )

#最後に
根本的なとは言っても応急措置(アップデートが来たら上書きされる)なので,本当はwrapperのような形で書きたかったです.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8