Help us understand the problem. What is going on with this article?

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

はじめに

このバグの対処についてはいくつかの解決法が既に示されています.
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を使って翻訳を行っていることが特定できました.
moファイルは言語の翻訳情報が書かれているバイナリファイルで,英語の原文と日本語の翻訳後の文がkeyとvalueのセットになっているようです(この辺とても曖昧です).
moファイルはバイナリなので,これを編集可能なpoファイルというものに戻し(.mo ファイルを .po ファイルに戻す方法-Qiitaを参照),ファイル中のmsgstr "{0 }をリフレッシュ中"の不要な空白を削除しmsgstr "{0}をリフレッシュ中"と書き直して元のmoファイルに上書きすれば無事にバグが治りました.
以下簡単に結論を書きます.

原因

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

対処

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

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした