「翻訳しないをする」GAS LanguageApp.translate

 機械翻訳を行なっていると、部分的に翻訳したく無い箇所がある事に気がつく。
 私の場合、翻訳精度を上げるために固有名詞リストを作り、翻訳にかける前に固有名詞をシリアルコードに全置換して、LanguageApp.translateで翻訳後にシリアルコードを該当言語の固有名詞に全置換するスクリプトを組んでいたのだが、翻訳後にシリアルコード部分にスペースが混入したり、さらには数字が欠落することがあった。
 コードがおかしくなると当然ながら置換に失敗してしまう。
 数十回に一回の割合であったが、翻訳後にシリアルコードが残ってしまうのでは大問題であった。

ABCD0011 このようなコードがあったとする
 以下の三行のような形で余分なスペースの混入や数字の欠落が見られた。
ABCD 0011
ABCD001
ABC D0011
 このような変わってはいけない文字列は翻訳対象から除外するべきであろう。
 しかし、翻訳対象から外す方法はLanguageApp.translateの説明を読んでもどこにも書いていない。
https://developers.google.com/apps-script/reference/language/language-app
 翻訳対象から除外する方法としてトリプルブラケットで囲むという方法があると以前そちらの方面の人から聞いていたが、少なくともLanguageApp.translateでは効果がなかった。
 様々な記号で囲んでテストしてみたが、翻訳対象から除外することは出来なかった。
もうほとんど諦め気分で検索を繰り返していた時、そんな時にhtmlのページ翻訳から翻訳対象を外す方法を目にした。
<span translate="no"> text... </span>
 こうして翻訳対象から外したい文字列を囲むことでWeb上に公開したページに関して閲覧者がページ翻訳を行ったとしても指定箇所だけは翻訳されずに残るという事だ。
 公開したWebページの話しなので、LanguageApp.translateには関係無い。そう思った。
 しかし、何か解決策がないかとリファレンスを何度も見返していた。
 よくよく見返すと使用方法は2種類記載がある。
 1つめはこれ
translate(text, sourceLanguage, targetLanguage)
翻訳テキスト、ソース言語、翻訳言語
 この方法で利用していたが、下の方に2つ目の使用法があり、4つ目の項目があった。
translate(text, sourceLanguage, targetLanguage, advancedArgs)
advancedArgsとは?
 説明にはoptional JavaScript object fieldsとしか書いていない。
 これでは何が出来るのかわからない。
 だが、更に下にAdvanced parametersという項目があり、the content type of the text; supported values are 'text' (default) and 'html'
 と、コンテンツタイプがtextかhtmlかを指定できるようだった。
 使用例にはhtmlを指定した場合の例が記載されていた。
LanguageApp.translate('This is a &lt;strong&gt;test&lt;/strong&gt;', 'en', 'es', {contentType: 'html'});
 あ、なんかこれ役に立つんじゃない?
 と、その時気がついた。
<span translate="no">で囲んで、html指定でLanguageApp.translate使ってみれば良いのでは?
 早速試した。
 おお!うまくいっている気がする。
 偶然かもしれないので何度も試した。
 問題ない。本当に翻訳から除外された。
 わかりやすい例としてappstranslatehtml関数を作成した。

 ドラえもん要約をWikipediaから取得したテキストに日本語表記『ドラえもん』の文字を追加し、その部分をspanで囲んで翻訳対象から除外。
このように、spanで囲んだ『ドラえもん』の 部分だけが翻訳されずJapanese Inscription 『ドラえもん』と表示されている。

 この関数で翻訳を試すスプレッドシートは以下
『翻訳しないをする』サンプルスプレッドシート

注意点
 翻訳後のテキストに残っているspanタグはテキストファイルとしては不要なので、置換で自動削除するようスクリプトを組むのが良いだろう。
 htmlを指定して翻訳するとクォーテーション等の記号が実体参照に変換されてしまうので、これらもテキストとしてみるのであれば置換処理を入れて戻す必要がある。
 htmlとして参照するのであれば実体参照はそのままでも問題ないし、spanタグも見えないので消す必要はない。
 また、htmlとしてLanguageApp.translateを使用すると改行が除去されてしまうので改行を含むテキストを翻訳する際は改行をなんらかの記号に置換して退避させ、翻訳後に改行に戻す処理を行う必要がある。htmlとして表示するなら、改行は<br>に置換しておけば改行される。テキストとして表示するなら<br>を改行に戻しても良い。
 私の場合は全く何の意味もないmetaタグに置換する処理を行っていた。(このテスト用関数ではこうした処理は一切入れていない)

コメント

このブログの人気の投稿

Googleスプレッドシートの正規表現置換で改行文字

Googleスプレッドシートのimportxml関数をhtmlに使う

名作と定評のあるスーパーファミコンの『ザ・モノポリーゲーム2』を今更ながら遊んでみた