OSGeo-jp / OSGeoLive-doc-omegat

OSGeoLive-docの日本語翻訳を、OmegaTという翻訳支援ソフトを利用して進めるプロジェクトです。
MIT License
1 stars 2 forks source link

[改善要望] format_target.py の出力フォーマット改善 (Transifex出力に合わせる) #38

Closed sanak closed 3 years ago

sanak commented 3 years ago

改善要望は何らかの問題に関連していますか? 説明をお願いします。 現状、 format_target.py が出力するPOファイルの msgidmsgstr 区切り位置が微妙に異なり、また、POファイル末尾の空行数が異なっていて、チェック・マージ作業がかなりストレスフルになっている。

望ましい解決策についての説明 翻訳内容に変更がない限り、format_target.py の出力結果が、TransifexのPull結果と完全一致するようにする。

検討した代替案についての説明 POファイルのRead/Writeに利用しているBabelの pofilecatalog クラスをオーバーライド?もしくは、polibでのRead/Writeへの切り替えを検討する。

sanak commented 3 years ago

ローカル環境で下記の個人(@sanak)ブランチで色々と試しましたが、 https://github.com/sanak/OSGeoLive-doc-omegat/commit/80f95052011d15b5b20253db32ba353bdd0a0602#diff-85875241781b485c498e271dae2c7a97594e849c73eadb5ed67586ba3322fa69

Transifexの tx pull がどのようにPOファイルの msgstr 部分の文節区切りを行うかの法則性が掴めず、ブラックボックスとなって解決の目処が立たなかったため、Transifexの出力に合わせる形でなく、TransifexとOmegaTの取得/出力POファイルを、同じフォーマッタにかけることで、実際の差分の抽出を容易に行える形に変更します。

(念のため、下記は下調べ中に確認したOmegaTでのPOファイル出力箇所ソースと参考リンク。)

フォーマット処理については、下記のPythonスクリプトでローカル環境での動作確認済みですが、TransifexとOmegaTの双方で処理を流す必要があることから、 format_target.py ファイルについては、 omegat 側でなく、 doc 側に名前を変えて(format_pofiles.py など)持たせる形に変更します。

TransifexとOmegaT双方用のフォーマッタスクリプト:

#!/usr/bin/env python3

import argparse
import os
import io

from babel.messages import pofile

PO_EXT = ".po"

def load_catalogs(top_dir):
    catalogs = {}
    for root, dirs, files in os.walk(top_dir, topdown=False):
        for file in files:
            if file.endswith(PO_EXT):
                path = os.path.join(root, file)
                rel_path = os.path.relpath(path, top_dir)
                with io.open(path, 'rb') as f:
                    catalogs[rel_path] = pofile.read_po(f)
            else:
                continue
    return catalogs

def main(args):
    # Load po files
    catalogs = load_catalogs(args.directory)

    # Format catalogs
    for rel_path in catalogs:
        catalog = catalogs[rel_path]
        path = os.path.join(args.directory, rel_path)
        catalog.fuzzy = True
        # Write po file
        with io.open(path, 'wb') as f:
            pofile.write_po(f, catalog, width=79)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Format po files')
    parser.add_argument('directory', nargs='?', default='./target',
                        help="A directory to format po files (default is './target')")
    args = parser.parse_args()
    main(args)

上記より、omegat 側からは、最終的に tools/format_target.py ファイルを削除するのみの形となりますが、 doc 側で https://github.com/OSGeo-jp/OSGeoLive-doc/issues/11 の対応後に作業を進めることを想定していますので、おそらく明日(1/11(月))中目処の作業になると思います。

sanak commented 3 years ago

POファイルのフォーマットについて、 doc 側で大体の動作を確認できたので、 omegat 側からは tools/format_target.py を削除します。

sanak commented 3 years ago

45 のPRで完了。