![見出し画像](https://assets.st-note.com/production/uploads/images/70318301/rectangle_large_type_2_21b4be0e49ae889c51b7d77645d14d58.png?width=1200)
ドラッグ&ドロップでMemsourceのファイルから対訳情報を一瞬でぶっこ抜き!
2023年5月23日、スクリプトが正しく動作していない可能性があります。何かご存じの方はご連絡ください。
翻訳ジャーニーです。Memsourceのmxliffファイルから対訳情報をテキストとして抽出するスクリプトを書きました。
何ができるの?
Memsourceのファイル形式、mxliffファイルをドラッグアンドドロップすると、そのファイルに含まれている原文と訳文が抜き出されてテキストファイルになるという仕掛けです。
何が便利なの?
対訳情報が手早く手に入ります。ツールチェックにかけたり、差分をとったり、いろいろな用途があります。プレーンテキストなので取り扱いが簡単です。
翻訳のレビューをよく担当していますが、なるべく差分をとって翻訳者さんにフィードバックを送るようにしています。ただ、差分抽出作業が手間で後回しにしているとそのまま忘れてしまいます。継続的によい翻訳を出し続けてもらうために、なるべくその場で手早く差分を作ってお渡ししたいのです。
複数のファイルを同時にドラッグアンドドロップしても1ファイルにまとまって出てきます。べんりー!
使い方
記事の最後にあるコードをテキストエディタに貼り付けて、Shift-JISコードで保存してください(なぜSJISにしたかは覚えていません)。
好きな名前をつけて保存します。「Memsource_extractPairs.vbs 」などとします。拡張子は必ず .vbs としてくださいね。
Memsourceファイルをその vbs ファイルにドラッグアンドドロップします。複数のファイルでもOK。
mxliffファイルと同じフォルダに、Pairs.tsv というテキストファイルができあがります。あとは煮るなり焼くなり、エクセルに貼り付けるなり、好きにしてください。
動作について、使い方について、質問がある方は note、Twitter、Instagramで声をかけてください。似たようなスクリプトがいろいろあるので、反響があるようでした今後もシェアしていきたいと思います。訳文だけ、原文だけ、セグメント番号入りで、などのカスタマイズも承っちゃいます。
注意:生成される Pairs.tsv ですが、2回目以上の実行時には確認メッセージなしで自動で上書きされます。
アディオース!
'2014年11月30日作成
'2014年12月4日変更:複数ファイルのドラッグアンドドロップに対応
'2015年1月22日変更:セグメントIDが取得できない場合(Null)は、ParentNodeに上がる式を挿入
'出力ファイルを1つにし、Pairs.tsvとする
'2021年4月8日、Memsource用に変更
'2022年1月20日、Memsourceの対訳出力に対応
'ファイルの準備
Dim i, numFiles
numFiles = WScript.Arguments.Length 'ドラッグされたファイル数
Dim numSegments
Dim orgFile, targetFile, objFileSys, csvFile, objWriteStream
Dim objXML, result, nodeRoot
Dim id, trans_unit, target, source, insert
Set objFileSys = CreateObject("Scripting.FileSystemObject")
csvFile = objFileSys.GetParentFolderName(WScript.Arguments(0)) & "\Pairs.tsv"
'csvFile はドラッグされたファイルと同じディレクトリに Pairs.tsv という名前
If objFileSys.FileExists(csvFile) Then '既に存在する場合は
objFileSys.DeleteFile(csvFile) 'ファイルを削除
End If
Set objWriteStream = CreateObject("ADODB.Stream")
objWriteStream.type = 2
objWriteStream.charset = "Shift-JIS"
objWriteStream.open
'ファイルの数だけループ
For i = 0 to numFiles - 1
Set objXML = CreateObject("MSXML2.DOMDocument") '読み取り用のXMLオブジェクト
orgFile = WScript.Arguments(i) 'ドロップされたファイル
targetFile = orgFile & ".xml" '読み取り用XMLファイルのパス
objFileSys.CopyFile orgFile, targetFile, True '読み取り用にXMLファイルとしてコピー
'ファイルの読み込み
result = objXML.Load(targetFile)
Set nodeRoot = objXML.documentElement
Set trans_unit = nodeRoot.getElementsByTagName("trans-unit")
For j = 0 to trans_unit.length - 1
Set target = trans_unit(j).getElementsByTagName("target")
Set source = trans_unit(j).getElementsByTagName("source")
insert = """" & source(0).Text & """" & vbTab & """" & target(0).Text & """" & vbCrLf'書き込む内容:
objWriteStream.WriteText insert '書き込み
Next 'セグメントの数だけループ
objFileSys.DeleteFile(targetFile) '読み取り用XMLファイルの削除
Set objXML = Nothing 'XMLオブジェクト解放
Next '次のファイルへ
objWriteStream.SaveToFile csvFile, 1 'ファイルクローズ
'すべてのファイルを書き込んだあと、objFileSysを解放
Set objWriteStream = Nothing '書き込みストリーム解放
Set objFileSys = Nothing