- 
                Notifications
    You must be signed in to change notification settings 
- Fork 163
fix: Replace custom language names list with standard Intl DisplayNames API #2332 #2371
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
base: master
Are you sure you want to change the base?
Conversation
fd2e479    to
    752cb2d      
    Compare
  
    | Codecov Report❌ Patch coverage is  
 Additional details and impacted files@@            Coverage Diff             @@
##           master    #2371      +/-   ##
==========================================
+ Coverage   94.44%   94.60%   +0.15%     
==========================================
  Files        1169     1174       +5     
  Lines       25102    25428     +326     
  Branches     5473     5571      +98     
==========================================
+ Hits        23708    24056     +348     
+ Misses       1328     1305      -23     
- Partials       66       67       +1     ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
 | 
dd4af33    to
    9f4da76      
    Compare
  
    There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for this! Could you please finish updating the PR description? I was hoping you could explain some of your decisions a bit, like why you added the new iso-639-1 dependency.
        
          
                package.json
              
                Outdated
          
        
      | "start:with-theme": "paragon install-theme && npm start && npm install", | ||
| "dev": "PUBLIC_PATH=/authoring/ MFE_CONFIG_API_URL='http://localhost:8000/api/mfe_config/v1' fedx-scripts webpack-dev-server --progress --host apps.local.openedx.io", | ||
| "test": "TZ=UTC fedx-scripts jest --coverage --passWithNoTests", | ||
| "test": "TZ=UTC fedx-scripts jest --passWithNoTests", | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| "test": "TZ=UTC fedx-scripts jest --passWithNoTests", | |
| "test": "TZ=UTC fedx-scripts jest --coverage --passWithNoTests", | 
I think you committed this accidentally? I find the --coverage check here to be annoying as well, but we can't just change it without a dedicated PR and a bit more discussion.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes it was done accidentally
| import { thunkActions, selectors } from '../../../../../../data/redux'; | ||
| import { videoTranscriptLanguages } from '../../../../../../data/constants/video'; | ||
| import { FileInput, fileInput } from '../../../../../../sharedComponents/FileInput'; | ||
| import { getLanguageName } from '../../../../../../data/constants/video'; | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| import { getLanguageName } from '../../../../../../data/constants/video'; | |
| import { getLanguageName } from '@src/editors/data/constants/video'; | 
This is simpler - see the best practices checklist in the PR description.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks I have updated it
| }; | ||
|  | ||
| const LanguageSelector = ({ | ||
| index, // For a unique id for the form control | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please leave this comment in place; I think it's helpful.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok
| language, | ||
| // Redux | ||
| openLanguages, // Only allow those languages not already associated with a transcript to be selected | ||
| openLanguages, | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add back a comment to explain this parameter.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok
| expect(screen.getByText('Select Language')).toBeInTheDocument(); | ||
| }); | ||
|  | ||
| test('transcripts no Open Languages, all dropdown items should be disabled', () => { | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this test no longer needed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is reason we dont have disable option in our current implementation that is reason I have removed it
| za: 'Zhuang', | ||
| zu: 'Zulu', | ||
| }); | ||
| export const getLanguageName = (langCode, locales = ['en']) => { | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you can't convert this file to TypeScript yet, please move this function to a separate language-utils.ts file that is using TypeScript so that you can document the types properly. Any significant new code like this should have types defined. (And if you can't move it to a .ts file or convert this file to .ts you can always add JSDoc type comments.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let me add JSDoc type comment because for now I am unable to move it to separate ts file but I will keep in mind to move it to different file later on.
| return acc; | ||
| }, {}); | ||
|  | ||
| export const in8lTranscriptLanguages = (intl) => { | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't need this in8lTranscriptLanguages code anymore. You can already use getLanguageName (the Intl.DisplayNames API) to get the name of a language in any other language.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is being used in transcriptLanguages function that is why I did not remove it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you change transcriptLanguages to use getLanguageName instead, and then delete this?
| const messageLookup = {}; | ||
| // for tests and non-internationlized setups, return en | ||
|  | ||
| // For tests and non-internationalized setups, return raw dataset | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Node.js supports Intl.DisplayNames so it should work in tests too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry I did not get this point can you please expalin?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It doesn't matter if we can delete this whole function. But I was saying we don't need to have special behavior "for tests" because Intl.DisplayNames works in tests too so we can use the same code in tests as in the rest of the app.
| }); | ||
|  | ||
| it('returns language name from Intl.DisplayNames for given locale', () => { | ||
| displayNamesSpy = jest.spyOn(global.Intl, 'DisplayNames').mockImplementation(() => ({ | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think you need to mock it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it is needed otherwise the code does not return the value I have explored by not mocking them but it was not working properly so I had to mock it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you give an example?
| // Fallback to ISO6391 if Intl.DisplayNames fails | ||
| } | ||
| } | ||
| const isoName = ISO6391.getName(code); | 
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we include ISO6391 as a dependency, it undoes the bundle size savings of removing the language names from our code. Did you find a case where the Intl.DisplayNames API was not working, and this fallback is necesesary?
I think we should just fall back to (A) Intl.DisplayNames response but for English instead of the user's locale, and (B) if that doesn't work, just return the language code as the language name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have used iso-639-1, the reason of using this package is that the Intl.DisplayNames returns country code as it is for many countries like ab: Abkhazian so I have to use fallback.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The missing languages are as follows> I think most of these are very rare and not supported by our platform anyways, so we could leave them out, but if you want to include support I think it's better to just include the following list rather than adding iso-639-1 which is a 35kB dependency.
/** Languages that may be missing from the Intl.DisplayNames API */
const obscureLanguages = {
  aa: 'Afar',
  ab: 'Abkhazian',
  av: 'Avaric',
  ae: 'Avestan',
  ba: 'Bashkir',
  bi: 'Bislama',
  ch: 'Chamorro',
  ce: 'Chechen',
  cu: 'Church Slavic',
  cv: 'Chuvash',
  kw: 'Cornish',
  cr: 'Cree',
  dz: 'Dzongkha',
  fj: 'Fijian',
  ff: 'Fulah',
  gv: 'Manx',
  hz: 'Herero',
  ho: 'Hiri Motu',
  io: 'Ido',
  ii: 'Sichuan Yi',
  iu: 'Inuktitut',
  ie: 'Interlingue',
  ik: 'Inupiaq',
  kl: 'Kalaallisut',
  ks: 'Kashmiri',
  kr: 'Kanuri',
  ki: 'Kikuyu',
  kv: 'Komi',
  kg: 'Kongo',
  kj: 'Kuanyama',
  li: 'Limburgan',
  lu: 'Luba-Katanga',
  mh: 'Marshallese',
  na: 'Nauru',
  nv: 'Navajo',
  nr: 'Ndebele: South',
  nd: 'Ndebele: North',
  ng: 'Ndonga',
  oj: 'Ojibwa',
  os: 'Ossetian',
  pi: 'Pali',
  rn: 'Rundi',
  sg: 'Sango',
  se: 'Northern Sami',
  sc: 'Sardinian',
  ss: 'Swati',
  ty: 'Tahitian',
  bo: 'Tibetan',
  ve: 'Venda',
  vo: 'Volapük',
  za: 'Zhuang',
};9f4da76    to
    e235984      
    Compare
  
    | @bradenmacdonald I tried to reply on your comments can you please look into those and let me know in any case. | 
Description
Replace custom language names list with standard Intl DisplayNames API #2332
Supporting information
I have used
iso-639-1, the reason of using this package is that the Intl.DisplayNames returns country code for many countries likeab: Abkhazianso I have to use fallback.Testing instructions
Please provide detailed step-by-step instructions for manually testing this change.
Other information
Include anything else that will help reviewers and consumers understand the change.
Best Practices Checklist
We're trying to move away from some deprecated patterns in this codebase. Please
check if your PR meets these recommendations before asking for a review:
.ts,.tsx).propTypes,defaultProps, andinjectIntlpatterns are not used in any new or modified code.src/testUtils.tsx(specificallyinitializeMocks)apiHooks.tsin this repo for examples.messages.tsfiles have adescriptionfor translators to use.../. To import from parent folders, use@src, e.g.import { initializeMocks } from '@src/testUtils';instead offrom '../../../../testUtils'