facebook / fbt

A JavaScript Internationalization Framework
https://facebook.github.io/fbt
MIT License
3.88k stars 178 forks source link

Enable `locale` override at callsite #204

Open jrwats opened 3 years ago

jrwats commented 3 years ago

A potentially nice feature to add to the runtime and Babel parser would be to enable a locale override at the callsite.

  prompts = [
    ...
    <fbt desc="..." locale="es_ES">Switch to Spanish</fbt>,
    <fbt desc="..." locale="de_DE">Switch to German</fbt>,
    ...
  ];

is a lot easier to reason about than updating genTranslatedInput to do what you want.

Originally posted by @jrwats in https://github.com/facebook/fbt/discussions/190#discussioncomment-514257

jrwats commented 3 years ago

Use case (locale selector): https://github.com/facebook/fbt/discussions/190#discussion-1640104

hkaur008 commented 3 years ago

Hey , can i work over this issue ?

jrwats commented 3 years ago

Of course! We're not actively working on it internally.

hkaur008 commented 3 years ago

Hey, Can you direct me to the file I need to contribute ?

jrwats commented 3 years ago

NOTE: our babel-plugin-fbt plugin is currently undergoing a massive refactor to finally address https://github.com/facebook/fbt/issues/35. So what's checked into Github differs greatly from v0.20.0. There's a lot of undocumented changes currently checked into the repo, so if you want to tackle this soon, you may want to check in with @kayhadrin and @pkqinys if you have any questions or whether there's risk for merge conflicts.

Here's where we currently process options. That locale attribute will appear similar to author or project. https://github.com/facebook/fbt/blob/743e2e55ee6103b781938f1b72925a0f2304394a/packages/babel-plugin-fbt/src/babel-processors/FbtFunctionCallProcessor.js#L433-L456

You'll need to add it to the "allowed" list of options https://github.com/facebook/fbt/blob/743e2e55ee6103b781938f1b72925a0f2304394a/packages/babel-plugin-fbt/src/FbtConstants.js#L23-L33

After that we need to decide on how we want this manifested at runtime. It can be a "reserved key" in the payload itself similar to the __vcg https://github.com/facebook/fbt/blob/743e2e55ee6103b781938f1b72925a0f2304394a/runtime/shared/fbt.js#L136

but, I think cleanest would be to add it to the options runtime parameter https://github.com/facebook/fbt/blob/743e2e55ee6103b781938f1b72925a0f2304394a/runtime/shared/fbt.js#L96

Following that, you'll want to process that option to change the lookup of the translations. This should be pretty straightforward. Update the signature here to take an optional locale parameter and only read from the IntlViewerContext if it's nullish. https://github.com/facebook/fbt/blob/76debd6aa2c7076a2018ba7ab20a8caa5e9e5ebb/runtime/nonfb/FbtTranslations.js#L29