我的Google Chrome扩展程序的HTML页面国际化

c00*_*0fd 9 html javascript google-chrome internationalization google-chrome-extension

我发现了一个非常简单的方法实现的翻译我的谷歌Chrome扩展的(或定位),但似乎只适用于.json,cssjs文件.

但是如何html在弹出窗口或选项窗口中本地化我的内容?

ahm*_*md0 23

你要做的就是这个.

首先,在HTML中使用与Chrome在其他任何位置所需的语法相同的语法.所以你的基本popup.html将是:

<!DOCTYPE html>
<html>
<head>
<title>__MSG_app_title__</title>
</head>
<body>

<a href="http://example.com/" title="__MSG_prompt001__">__MSG_link001__</a>

<!-- Need to call our JS to do the localization -->
<script src="popup.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后提供通常的翻译_locales\en\messages.json:

{
    "app_title": {
        "message": "MyApp",
        "description": "Name of the extension"
    },
    "link001": {
        "message": "My link",
        "description": "Link name for the page"
    },
    "prompt001": {
        "message": "Click this link",
        "description": "User prompt for the link"
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您popup.js将执行实际的本地化:

function localizeHtmlPage()
{
    //Localize by replacing __MSG_***__ meta tags
    var objects = document.getElementsByTagName('html');
    for (var j = 0; j < objects.length; j++)
    {
        var obj = objects[j];

        var valStrH = obj.innerHTML.toString();
        var valNewH = valStrH.replace(/__MSG_(\w+)__/g, function(match, v1)
        {
            return v1 ? chrome.i18n.getMessage(v1) : "";
        });

        if(valNewH != valStrH)
        {
            obj.innerHTML = valNewH;
        }
    }
}

localizeHtmlPage();
Run Code Online (Sandbox Code Playgroud)

  • +1 对于这个简单的解决方案,对我有用,但对其他人警告,此函数可能会替换整个 html,然后所有 js 数据(如存储在变量中的处理程序和节点)都将被重置,因此最好在开始之前调用此函数脚本 (3认同)

pyk*_*iss 10

简单明了:


{
  "exmaple_key": {
    "message": "example_translation"
  }
}

Run Code Online (Sandbox Code Playgroud)

{
  "exmaple_key": {
    "message": "example_translation"
  }
}

Run Code Online (Sandbox Code Playgroud)

document.querySelectorAll('[data-locale]').forEach(elem => {
  elem.innerText = chrome.i18n.getMessage(elem.dataset.locale)
})

Run Code Online (Sandbox Code Playgroud)

  • 这是可行的,而且似乎是最容易实现的。我的+1。 (2认同)

Dan*_*nes 6

建立自ahmd0的答案.使用数据属性允许硬编码回退.

<!DOCTYPE html>
<html>
    <head>
        <title data-localize="__MSG_app_title__">My Default Title</title>
    </head>
    <body>
        <a href="http://example.com/" title="__MSG_prompt001__" data-localize="__MSG_link001__">Default link text</a>

        <script src="localize.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后提供通常的翻译_locales\en\messages.json:

{
    "app_title": {
        "message": "MyApp",
        "description": "Name of the extension"
    },
    "link001": {
        "message": "My link",
        "description": "Link name for the page"
    },
    "prompt001": {
        "message": "Click this link",
        "description": "User prompt for the link"
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您localize.js将执行实际的本地化:

function replace_i18n(obj, tag) {
    var msg = tag.replace(/__MSG_(\w+)__/g, function(match, v1) {
        return v1 ? chrome.i18n.getMessage(v1) : '';
    });

    if(msg != tag) obj.innerHTML = msg;
}

function localizeHtmlPage() {
    // Localize using __MSG_***__ data tags
    var data = document.querySelectorAll('[data-localize]');

    for (var i in data) if (data.hasOwnProperty(i)) {
        var obj = data[i];
        var tag = obj.getAttribute('data-localize').toString();

        replace_i18n(obj, tag);
    }

    // Localize everything else by replacing all __MSG_***__ tags
    var page = document.getElementsByTagName('html');

    for (var j = 0; j < page.length; j++) {
        var obj = page[j];
        var tag = obj.innerHTML.toString();

        replace_i18n(obj, tag);
    }
}

localizeHtmlPage();
Run Code Online (Sandbox Code Playgroud)

硬编码的回退可以避免在JavaScript执行替换时i18n标记可见.硬编码似乎否定了国际化的想法,但在Chrome支持i18n直接在HTML中使用之前,我们需要使用JavaScript.


Xan*_*Xan 5

正如RobW在评论中指出的那样,创建了使用相同机制在HTML中添加i18n支持的功能请求,但此后由于性能和安全问题而被拒绝。因此,您不能使用相同的方法。

该问题提到了一种可能的解决方法:在每种语言中使用单独的HTML页面并在清单中进行切换:

  "browser_action": {
    "default_popup": "__MSG_browser_action_page__"
  }
Run Code Online (Sandbox Code Playgroud)

但这是不合适的方法,唯一的方法是通过JavaScript动态翻译页面。您提到了一种最简单的方法,即仅标记要转换为id的元素并在页面加载时替换它们。

您还可以与Chrome的方法同时使用更复杂的工具,例如webL10n。请注意,您可能仍应该最少实施Chrome的方法,以便Web Store知道该产品支持多种语言。

  • 任何人都可以确认这不再起作用了吗?我试过了,但得到了“找不到文件”错误页面 (2认同)