angular-recaptcha:随着网站语言的改变而改变语言

angular-recaptcha: Change language with site language change

我的网站使用用户可切换的三种不同语言。语言切换由 JavaScript (AngularJS) 在客户端完成。

我在我的网站上使用 reCAPTCHA 2,当用户切换网站语言时需要更改 reCAPTCHA 的语言。

我已经知道我可以在 reCAPTCHA 初始化时通过这段代码强制使用语言:

<script src="https://www.google.com/recaptcha/api.js?hl=cs"></script>

但是,当您需要重新加载 reCAPTCHA 时,您可以使用此代码,它不接受任何自定义语言参数:

grecaptcha.reset();

是否可以不刷新页面并使用不同语言重新初始化 reCAPTCHA 小部件?

编辑

我正在使用 angular-recaptcha 来呈现小部件。这意味着:

这是呈现 reCAPTCHA 小部件的代码:

<div
    vc-recaptcha
    key="'---- YOUR PUBLIC KEY GOES HERE ----'"
></div>

这是将 reCAPTCHA API 包含到我的网站中的代码:

<script
  src="https://www.google.com/recaptcha/api.js?onload=vcRecaptchaApiLoaded&render=explicit&hl=cs"
  async defer
></script>

您可以简单地清空 div.g-recaptcha 并再次加载 script(以编程方式)。

下面的函数应该可以解决问题:

function changeRecaptchaLanguage(language) {
  document.querySelector('.g-recaptcha').innerHTML = '';

  var script = document.createElement('script');
  script.src = 'https://www.google.com/recaptcha/api.js?hl=' + language;
  script.async = true;
  script.defer = true;
  document.querySelector('head').appendChild(script);
}

看看下面代码段中的示例:

function changeRecaptchaLanguage(language) {
  document.querySelector('.g-recaptcha').innerHTML = '';
  
  var script = document.createElement('script');
  script.src = 'https://www.google.com/recaptcha/api.js?hl=' + language;
  script.async = true;
  script.defer = true;
  document.querySelector('head').appendChild(script);
}

var curr = 'en';

changeRecaptchaLanguage(curr);

document.querySelector('button').addEventListener('click', function() {
  curr = curr === 'en' ? 'pt-BR' : 'en';
  changeRecaptchaLanguage(curr);
});
<div>Other stuff</div>
<div class="g-recaptcha" data-sitekey="your_site_key"></div>
<button>Change language</button>

我认为这是一个重复的问题。请在此处查看一个建议的解决方案:

总结:

目前无法通过javascript直接设置验证码语言。正如您所说,但是可以在脚本加载期间使用参数 'hl'。

如果您需要在不重新加载页面的情况下动态更改应用程序的语言,您可以通过从 head 部分删除 recaptcha 脚本 link 并通过 javascript。当您的用户通过单击按钮更改语言时,您现在可以通过再次调用加载函数以新语言重新加载验证码。

您只需在 "lang" 指令中添加值即可。

<div vc-recaptcha key="publicKey" lang="en"></div>

我刚刚偶然发现了这个问题。我知道不久前有人问过这个问题,但我认为最好的方法是在变量 lang 的 $watch 内使用服务中的 useLang 方法。 所以在 html 中确定我们所在的语言:

<div id="g-recaptcha" class="g-recaptcha" vc-recaptcha key="domainkey" lang="$root.lang" on-success="setResponse(response)"></div>

并且,如果可以的话,在指令中将 $watch 放在该变量上:

scope.$watch('lang', function(){
        if(scope.widgetId!=null){
           vcRecaptcha.useLang(scope.widgetId,scope.lang);
        }
});

如何在初始化时设置 ng-recaptcha 语言:

 <re-captcha class="g-recaptcha"
             siteKey="asdfasdfasdfasdfasdasd"
             [(ngModel)]="myRecaptcha"
             name="captcha"
             #recaptcha></re-captcha>

app.module.ts

import {RecaptchaModule ,RECAPTCHA_LANGUAGE} from 'ng-recaptcha';

const getDomainBaseUrl = location.toString();
export const language = baseUrl.toLocaleLowerCase();

...


 providers: [
    ...

    {
      provide: RECAPTCHA_LANGUAGE,
      useValue: language,
    },

  ],