动态更改Recaptcha V2语言

Rtr*_*ier 8 recaptcha angularjs angular-translate

我试图在角度站点上实现Recaptcha V2.

我正在使用角度翻译,我不知道如何使用正确的语言重新生成reCaptcha对象 $scope

有什么办法吗?或使用正确的lang重新加载对象的过程?

谢谢

ble*_*her 1

基于API的限制,您可以动态加载脚本:

加载脚本的函数

来源

function loadScript(url, callback)
{
    // Adding the script tag to the head as suggested before
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;

    // Then bind the event to the callback function.
    // There are several events for cross browser compatibility.
    script.onreadystatechange = callback;
    script.onload = callback;

    // Fire the loading
    head.appendChild(script);

   //modification so we can remove this after
   return script;
}
Run Code Online (Sandbox Code Playgroud)

注意:这是一个常规的 JS 函数

动态加载脚本

在你的 Angular 控制器中

 $scope.loadGoogleRecaptcha = function (id, lang) {
            /// using timeout not to use $apply
            $timeout(function () {
                //set default value
                var elemntID = id || false;
                var language = lang || 'en';

                if (!elemntID) {
                    console.warn('NO Id selected for re-captcha loading!')
                    return false;
                }

                var element = document.getElementById(elemntID)
                if (angular.element(element).length == 0) {
                    console.warn('provided id doesn\'t exist ', elemntID);
                    return false;
                }

                //Delete oldscript
                if ($rootScope.addedScript)
                    angular.element($rootScope.addedScript).remove();

                //clear current recaptcha container
                angular.element(element).empty();

                var url = "https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit&hl=" + lang;

                return $window.loadScript(url, function () {
                    console.log('Scipt loaded:', url);
                })

            });

        }
Run Code Online (Sandbox Code Playgroud)

使用 Angular-translate-localStorage 使用当前语言初始化验证码

$rootScope.addedScript = $scope.loadGoogleRecaptcha('g-recaptcha-register' ,$window.localStorage.getItem( 'NG_TRANSLATE_LANG_KEY'));
Run Code Online (Sandbox Code Playgroud)

切换语言的函数示例

$rootScope.changeLanguage = function (langKey) {

        $translate.use(langKey);
        $rootScope.selectedLanguage = langKey;
        $scope.loadGoogleRecaptcha('g-recaptcha-register' , langKey);
    };
Run Code Online (Sandbox Code Playgroud)

或者你可以使用观察者

 $scope.$watch(
            'selectedLanguage', function (n, o) {
              //putting if to prevent double fetch the first time
              if (!!n && n != o){
                $rootScope.addedScript = $scope.loadGoogleRecaptcha('g-recaptcha-register', n);
              }
            }
        );
Run Code Online (Sandbox Code Playgroud)