ng-recaptcha icon indicating copy to clipboard operation
ng-recaptcha copied to clipboard

Question: dynamic translation of recaptcha text

Open xtoff opened this issue 7 years ago • 12 comments

Is it possible to dynamically change the language of the recaptcha when it is already loaded on the screen?

xtoff avatar Apr 05 '17 10:04 xtoff

Hello! For now this is not possible. But it is something that's been on my radar for some time. ~Now that someone else needs it, I'll consider bringing next release to life quicker :)~ See below as to why this has been put on hold

The problem behind this is that it will require unloading the current reCAPTCHA files, loading new ones, and resetting reCAPTCHA in between. This, of course, will affect the page load speed, which could have been avoided by using reCAPTCHA language detection feature.

Could you elaborate on why do you need such capability, please?

DethAriel avatar Apr 05 '17 15:04 DethAriel

We have a form for registering a user with the captcha. The first field is a dropdown for selecting the language and the business people want the whole page translated when I switch that language..

xtoff avatar Apr 05 '17 15:04 xtoff

~Alright, so before this lands in the lib, here's a plunker that shows how you could leverage a custom RecaptchaLoader for this purpose~ See below as to why this has been put on hold

DethAriel avatar Apr 05 '17 16:04 DethAriel

I'm trying to implement this plunker using angular-cli but running into an issue.

Property 'ng2recaptchaloaded' does not exist on type 'Window'. in the provider.

The code works just fine in Plunkr, but when trying to run using angular-cli and webpack this occurs. Any ideas?

mattfirtion avatar May 09 '17 20:05 mattfirtion

This is typescript warning you that such a property does not exist on type window. That's why the sources have this file. What's the environment you're running this in? How did you install ng-recaptcha?

DethAriel avatar May 09 '17 20:05 DethAriel

Installed using npm i ng-recaptcha --save. Not sure I understand what you mean by environment. I'm running this locally using ng serve.

mattfirtion avatar May 09 '17 20:05 mattfirtion

what I cold suggest to you is copying the three-line file that I referenced and putting it near your custom provider file. This should fix the error

DethAriel avatar May 09 '17 20:05 DethAriel

That was it! Thanks for your help.

mattfirtion avatar May 09 '17 20:05 mattfirtion

At least for me on [email protected] and [email protected], the window-issue is back (despite the interface).

What helped me was ngx-window-token, which uses an InjectionToken-based approach.

Other than it's plunker suggests, I had to tweak the use of it a bit:

  1. Imported WindowTokenModule in AppModule,
  2. imported WINDOW in (the loader) service (for a language-aware reCAPTCHA based on your plunker),
  3. put @Inject(WINDOW) private _window: any into constructor.

See also https://github.com/maxisam/ngx-window-token/issues/2.

csentis avatar Sep 27 '17 19:09 csentis

@DethAriel Thanks for this library!

Could you help me with your plunker mentioned above?

In the constructor of the component in which I have the reCAPTCHA embedded, I also happen to have a subscription to events that indicate whether the language has changed. That subscription should also call updateLanguage(). It does, however, once the subscription is initialized, it calls updateLanguage and rightly complains that the script area is not empty.

This might possibly also be a use case for the next version of your lib? Can you already guestimate when this could be due?

Christian

csentis avatar Oct 04 '17 21:10 csentis

@csentis , btw there is an updated plunker for dynamic language change.

Unfortunately after careful consideration I've decided to not pursue this feature for now. That is because of the bugs that are outside of my control (i.e. recaptcha cleanup/scheduled tasks). Code samples that are referenced through plunker can be used at your own risk, consider them being a jump start rather than a part of the lib :)

To conclude, this use-case was apparently not included in the initial reCAPTCHA design, but you can still rely pretty safely on its automatic language recognition. Indeed, if the user chooses to see your web app in language X, but has their browser configured to use language Y - well, they should be prepared to be seeing both languages from time to time.

DethAriel avatar Oct 04 '17 22:10 DethAriel

Thanks, mate, will look into it and fully understand especially the cleanup part :)

csentis avatar Oct 04 '17 23:10 csentis