1

動的に作成されたWebページがあります。ほとんどのテキストは、翻訳メカニズムを使用して挿入されます。しかしもちろん、テキストを最初に翻訳する必要があります。そのため、別のツールでの一括翻訳に加えて、翻訳が表示されるページでそれを実行できるようにしたいと思います。

だから私がする必要があるのは、どういうわけかテキストにマークを付け、それを翻訳し、javascriptを使用して、翻訳ウィジェットを表示し、メタ情報を入力するボタンを作成することです。ここまでは順調ですね。問題は、テキストがhtmlノード内のtextnodeだけでなく、属性にも表示される可能性があることです。そのため、私のアイデア(htmlタグのようなもの<translate metadata=.../>を使用したり、htmlコメントを使用したりする)が機能しません。また、翻訳ルーチンがコード全体で使用されているため、「このデータを現在のhtmlタグの外に置く」と言うことはできません。

メタ情報をHTMLコード内に透過的に配置する別の方法はありますか?多分見えないUnicode文字?(私はutf-8を使用しています)

4

3 に答える 3

1

HTML5には、グローバルtranslate属性があります。

属性はtranslate列挙型属性であり、ページがローカライズされたときに要素の属性値とそのテキストノードの子の値を変換するかどうか、または変更しないままにするかどうかを指定するために使用されます。

変換されるべきではないtranslate="no"すべての要素に追加する必要があります(子要素は値を継承することに注意してください)。

属性値を変換する必要があるが要素コンテンツは変換しないというコーナーケースでは、コンテンツの周囲に要素を追加できますspan。例:

<b title="translate this, please" translate="yes"><span translate="no">Don't translate this</span></b> 

より複雑なケースについては、W3C勧告国際化タグセット(ITS)をご覧ください。

于 2013-03-03T12:31:25.043 に答える
0

長さゼロのユニコード文字を使用して、問題を自分で解決することができました。

3 つの文字\u200B(ゼロ幅スペース、ZWSP)、\u200C(ゼロ幅非ジョイナー、ZWNJ)、および\u200D(ゼロ幅ジョイナー、ZWJ) は、非表示にする必要がある制御文字です。曖昧さを解消するための境界指標として ZWSP を選択し、バイナリとして ZWNJ0およびバイナリとして ZWJ を選択しまし1た。PHP では、これはアノテーション ID のエンコードが次の$nrように行われることを意味します。

$binnr = decbin($nr);
$annotation = "&#x200B;";
for($i=0; $i<strlen($binnr); $i++)
    $annotation .= '&#x200'.($binnr{$i}=="0"?"c":"d").';';
$annotation .= '&#x200b;';

おそらく、html エンティティの代わりに実際の文字を使用する方がよいでしょう。だから私たちは必要です

return html_entity_decode($annotation, ENT_NOQUOTES, 'UTF-8');

これらの ID に属するメタデータを別の配列に収集し、ページ ヘッドに配置します。次に、ストーリーの JavaScript 側で、DOM ツリーでエンコードされた注釈が検索されます。

function parse_numbers(text)
{
    read = false;
    nrs = []; nr = 0;
    for(var i=0; i<text.length; i++)
    {
        if(text[i] == "\u200B") {
            read = !read;
            if(!read) {
                nrs.push(nr);
                nr = 0;
            }
        } else if(text[i] == "\u200C") {
            nr <<= 1;
        } else if(text[i] == "\u200D") {
            nr <<= 1; nr++;
        }
    }
    return nrs;
}

function buttons_recursive(node, insert)
{
    nrs = [];
    switch(node.nodeType)
    {
        case 1: //ELEMENT_NODE:
            for(var i=0; i<node.attributes.length; i++) {
                nrs.concat(buttons_recursive(node.attributes[i], false));
            }
            var new_insert = insert;
            if(node.nodeName == "BUTTON" || node.nodeName == "A") {
                new_insert = false;
            }
            for(var i=0; i<node.childNodes.length; i++) {
                nrs.concat(buttons_recursive(node.childNodes[i], new_insert));
            }
            break;
        case 2: //ATTRIBUTE_NODE:
            nrs = parse_numbers(node.value);
            break;
        case 3: //TEXT_NODE:
            nrs = parse_numbers(node.nodeValue);
            break;
        default:
            return [];
    }
    if(insert) {
        for(var i=nrs.length-1; i>=0; i--) {
            node.parentNode.insertBefore(create_inline_button(nrs[i]), node.nextSibling);
        }
        return [];
    } else {
        return nrs;
    }
}

実行することによって

buttons_recursive(document.body, true);

この関数create_inline_buttonは、指定された識別子でテキストの翻訳を開始するコントロール要素を作成する必要があります。

于 2013-03-03T14:09:40.137 に答える
0

あなたは車輪を再発明しようとしていると思います。Google には素晴らしい翻訳 API があり、ぜひ使用してください。

https://developers.google.com/translate/

于 2013-03-02T19:16:41.273 に答える