如何在 pyqt 中解決國際化 tr() 函式不起作用的問題

之一Yo發表於2022-02-04

前言

有些時候我們在父類中使用了 self.tr('XXX'),使用 Qt Linguist 完成翻譯並匯出 qm 檔案後,發現子類中仍然是英文原文。比如下面這段程式碼:

class AlbumCardBase(QWidget):
    """ 專輯卡基類 """

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.playButton = BlurButton(
            self,
            (30, 65),
            ":/images/album_tab_interface/Play.png",
            self.coverPath,
            self.tr('Play')
        )
        self.addToButton = BlurButton(
            self,
            (100, 65),
            ":/images/album_tab_interface/Add.png",
            self.coverPath,
            self.tr('Add to')
        )

父類 AlbumCardBase 中有兩處使用了 tr 函式,分別翻譯為 播放新增到,但是在子類中這些文字仍然會顯示為 PlayAdd to,下面來看看如何解決這個問題。

解決過程

生成的 ts 檔案中,有這樣一段程式碼:

<context>
    <name>AlbumCardBase</name>
    <message>
        <location filename="../../components/album_card/album_card_base.py" line="50"/>
        <source>Add to</source>
        <translation>新增到</translation>
    </message>
    <message>
        <location filename="../../components/album_card/album_card_base.py" line="43"/>
        <source>Play</source>
        <translation>播放</translation>
    </message>
</context>

可以看到上述程式碼描述了源文的位置和內容以及譯文,但是隻對父類 AlbumCardBase 起作用。要想對子類應用上述規則,只需複製貼上再修改 <name> 標籤中的類名即可,比如 AlbumCard 為子類,那麼只需新增下述程式碼:

<context>
    <name>AlbumCard</name>
    <message>
        <location filename="../../components/album_card/album_card_base.py" line="50"/>
        <source>Add to</source>
        <translation>新增到</translation>
    </message>
    <message>
        <location filename="../../components/album_card/album_card_base.py" line="43"/>
        <source>Play</source>
        <translation>播放</translation>
    </message>
</context>

完成上述步驟後匯出 qm 檔案即可。

相關文章