Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Localize HOC #2208

Merged
merged 4 commits into from
Apr 7, 2021

Conversation

parasharrajat
Copy link
Member

@parasharrajat parasharrajat commented Apr 1, 2021

Please review.

Details

  1. Created a HOC named WithLocalize which set the preferredLocale to a list of functions and passes curried methods down to WrappedComponent.
  2. Created one method numberFormat which uses default Browser Intl to convert the number.
  3. Added polyfills for Intl.numberFormat for mobile platforms.

Fixed Issues

Fixes #2176

Tests / QA Steps

Wrap any component with newly created HOC and use the method as props.translations.method(params). Switch the preferred locale for the user(I am not sure How to change the Locale in App) and see this method call should give you output based on the new Locale.

Tested On

I just tested it using console output and manually updating the locale on Onyx.

  • Web
  • Mobile Web
  • Desktop
  • iOS
  • Android

@parasharrajat parasharrajat marked this pull request as ready for review April 3, 2021 00:33
@parasharrajat parasharrajat requested a review from a team as a code owner April 3, 2021 00:33
@MelvinBot MelvinBot requested review from pecanoro and removed request for a team April 3, 2021 00:33
// Load en Locale data
import '@formatjs/intl-numberformat/locale-data/en';

function numberFormat(locale, number, options) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, is there a way to not have to define this twice? And if there is, do we think is worth it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We just need to import those files for mobile(native) platforms. I think it can be done via webpack. But for locale #2208 (review)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand but the numberFormat is defined duplicate in 2 places.
(also, that link is supposed to send me where exactly? It takes me here again)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah. So I am saying that we can load the imports via webpack and remove two files.

And for locale probably

A proper way would be when the user switches a locale, load the file remotely.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah. So I am saying that we can load the imports via webpack and remove two files.

I am not sure I know how this works, can you explain?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can import the src/libs/numberFormat/index.js which already defines the function and use it here, no?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

index.js will be replaced with index.native.js so we need a new file. then we import from that file. Or better would be to create a file called lib/polyfills/index.native.js and import the packages there. this will allow adding all the polyfills at a single location and we import this file in app.js.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

index.js will be replaced with index.native.js

Huh? Why?

What I am saying is:

  • The method is in index.js
  • index.native.js would import it and use it

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. let me test it first to be sure. My assumption is that we replace index.js files with index.native.js on mobile platforms.

Copy link
Member Author

@parasharrajat parasharrajat Apr 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iwiznia. I tested it. My assumptions are correct. index files are replaced with platform-specific index files(such as index.android.js on android). So I can make a common base.js file. or let's just leave it like this as this is just two lines of code. We had to create two files.

  1. Index.js
  2. index.android.js
    To keep it dry, we can create one more base.js, But I think that will be totally overuse of DRY for just two lines. Anyways each platform only gets one file in the bundle.

src/libs/numberFormat/index.native.js Outdated Show resolved Hide resolved
src/components/withLocalize.js Show resolved Hide resolved
@iwiznia
Copy link
Contributor

iwiznia commented Apr 6, 2021

. Switch the preferred locale for the user(I am not sure How to change the Locale in App) and see this method call should give you output based on the new Locale.

So you did not really test this? Right now there's no UI to change the locale, can you do some tests by changing it via code or something like that?

@parasharrajat
Copy link
Member Author

@iwiznia I tested it by loading one other locale file. tried these examples from MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat.

So for simple testing.

Load another locale file. and then call the method with that locale and see the output changes.

@parasharrajat
Copy link
Member Author

Updated. Please review.

Comment on lines +10 to +12
function numberFormat(locale, number, options) {
return new Intl.NumberFormat(locale, options).format(number);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you test if importing and using the function defined in index.js works properly please?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I missed this comment

@iwiznia iwiznia removed the request for review from pecanoro April 7, 2021 21:18
@iwiznia
Copy link
Contributor

iwiznia commented Apr 7, 2021

To clarify, did you manage to test on iOS? Seems like you did not?

@parasharrajat
Copy link
Member Author

parasharrajat commented Apr 7, 2021

@iwiznia I commented it above.

Ok, I tested it on IOS. You are right. IOS does have Intl support. Check the snap here

you can see the output on IOS via following the link.

@iwiznia iwiznia merged commit fbf0864 into Expensify:master Apr 7, 2021
@OSBotify
Copy link
Contributor

OSBotify commented Apr 7, 2021

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Expensify.cash - Implement Higher-Order Component that re-renders when the locale changes
3 participants