Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@pppain111

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
5
Help us understand the problem. What are the problem?