From 533045445a7fb2b4dce834bc1f7e825fc3c306d6 Mon Sep 17 00:00:00 2001 From: Jeremy Letto Date: Sun, 6 Mar 2022 20:12:27 -0600 Subject: [PATCH] Webatrice: improve language dropdown (#4589) * useLocaleSort hook, translate language dropdown * add pt-BR translation * fix pt-BR flag Co-authored-by: Jeremy Letto --- .../public/locales/pt-BR/translation.json | 1 + webclient/src/common.i18n.json | 6 + .../CountryDropdown/CountryDropdown.tsx | 29 +- .../LanguageDropdown/LanguageDropdown.tsx | 14 +- webclient/src/hooks/index.ts | 1 + webclient/src/hooks/useLocaleSort.ts | 18 + webclient/src/i18n-default.json | 2 +- webclient/src/i18n.ts | 4 +- webclient/src/types/countries.ts | 504 +++++++++--------- webclient/src/types/languages.ts | 13 +- 10 files changed, 314 insertions(+), 278 deletions(-) create mode 100644 webclient/public/locales/pt-BR/translation.json create mode 100644 webclient/src/hooks/useLocaleSort.ts diff --git a/webclient/public/locales/pt-BR/translation.json b/webclient/public/locales/pt-BR/translation.json new file mode 100644 index 00000000..e6424397 --- /dev/null +++ b/webclient/public/locales/pt-BR/translation.json @@ -0,0 +1 @@ +{"Common":{"language":"Traduzir para inglês.","disconnect":"Desconectar","label":{"confirmPassword":"Confirmar senha","confirmSure":"Você tem certeza?","country":"País","delete":"Excluir","email":"Email","hostName":"Host Name","hostAddress":"Endereço do host","password":"Senha","passwordAgain":"Password Again","port":"Porta","realName":"Real Name","saveChanges":"Save Changes","token":"Ficha","username":"Nome de usuário"},"validation":{"minChars":"Minimum of {count} {count, plural, one {character} other {characters}} required","passwordsMustMatch":"As senhas não correspondem","required":"Campo obrigatório"},"countries":{"AF":"Afeganistão","AX":"Åland Islands","AL":"Albânia","DZ":"Argélia","AS":"Samoa Americana","AD":"Andorra","AO":"Angola","AI":"Anguila","AQ":"Antártica","AG":"Antígua e Barbuda","AR":"Argentina","AM":"Armênia","AW":"Aruba","AU":"Austrália","AT":"Áustria","AZ":"Azerbaijão","BH":"Bahrein","BS":"Bahamas","BD":"Bangladesh","BB":"Barbados","BY":"Bielorrússia","BE":"Bélgica","BZ":"Belize","BJ":"Benim","BM":"Bermudas","BT":"Butão","BO":"Plurinational State of Bolivia","BQ":"Sint Eustatius and Saba Bonaire","BA":"Bósnia e Herzegovina","BW":"Botsuana","BV":"Ilha Bouvet","BR":"Brasil","IO":"Território Britânico do Oceano Índico","BN":"Brunei Darussalam","BG":"Bulgária","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodia","CM":"Camarões","CA":"Canadá","CV":"Cabo Verde","KY":"Ilhas Cayman","CF":"República Centro-Africana","TD":"Chad","CL":"Chile","CN":"China","CX":"Christmas Island","CC":"Cocos (Keeling) Islands","CO":"Colômbia","KM":"Comoros","CG":"Congo","CD":"The Democratic Republic of the Congo","CK":"Cook Islands","CR":"Costa Rica","CI":"Costa do Marfim","HR":"Croácia","CU":"Cuba","CW":"Curaçao","CY":"Chipre","CZ":"República Checa","DK":"Dinamarca","DJ":"Djibuti","DM":"Dominica","DO":"República Dominicana","EC":"Equador","EG":"Egito","SV":"El Salvador","GQ":"Equatorial Guinea","ER":"Eritrea","EE":"Estônia","ET":"Etiópia","EU":"União Européia","FK":"Ilhas Malvinas","FO":"Faroe Islands","FJ":"Fiji","FI":"Finlândia","FR":"França","GF":"Guiana Francesa","PF":"French Polynesia","TF":"French Southern Territories","GA":"Gabão","GM":"Gambia","GE":"Georgia","DE":"Alemanha","GH":"Gana","GI":"Gibraltar","GR":"Grécia","GL":"Groenlândia","GD":"Granada","GP":"Guadalupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guiné","GW":"Guinea-Bissau","GY":"Guiana","HT":"Haiti","HM":"Heard Island and McDonald Islands","VA":"Holy See (Vatican City State)","HN":"Honduras","HK":"Hong Kong","HU":"Hungria","IS":"Islândia","IN":"Índia","ID":"Indonésia","IR":"Islamic Republic of Iran","IQ":"Iraque","IE":"Irlanda","IM":"Isle of Man","IL":"Israel","IT":"Itália","JM":"Jamaica","JP":"Japão","JE":"Jersey","JO":"Jordânia","KZ":"Cazaquistão","KE":"Quênia","KI":"Kiribati","KP":"Democratic People's Republic of Korea","KR":"Republic of Korea","KW":"Kuwait","KG":"Quirguistão","LA":"Lao People's Democratic Republic","LV":"Letônia","LB":"Líbano","LS":"Lesotho","LR":"Liberia","LY":"Líbia","LI":"Liechtenstein","LT":"Lituânia","LU":"Luxemburgo","MO":"Macau","MK":"The Former Yugoslav Republic of Macedonia","MG":"Madagáscar","MW":"Malawi","MY":"Malásia","MV":"Maldives","ML":"Mali","MT":"Malta","MH":"Marshall Islands","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Federated States of Micronesia","MD":"Republic of Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MA":"Morocco","MZ":"Mozambique","MM":"Myanmar","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Netherlands","NC":"New Caledonia","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NF":"Norfolk Island","MP":"Northern Mariana Islands","NO":"Norway","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"State of Palestine","PA":"Panama","PG":"Papua New Guinea","PY":"Paraguay","PE":"Peru","PH":"Philippines","PN":"Pitcairn","PL":"Poland","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"Réunion","RO":"Romania","RU":"Russian Federation","RW":"Rwanda","BL":"Saint Barthélemy","SH":"Ascension and Tristan da Cunha Saint Helena","KN":"Saint Kitts and Nevis","LC":"Saint Lucia","MF":"Saint Martin (French part)","PM":"Saint Pierre and Miquelon","VC":"Saint Vincent and the Grenadines","WS":"Samoa","SM":"San Marino","ST":"Sao Tome and Principe","SA":"Saudi Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten (Dutch part)","SK":"Slovakia","SI":"Slovenia","SB":"Solomon Islands","SO":"Somalia","ZA":"South Africa","GS":"South Georgia and the South Sandwich Islands","SS":"South Sudan","ES":"Spain","LK":"Sri Lanka","SD":"Sudan","SR":"Suriname","SJ":"Svalbard and Jan Mayen","SZ":"Swaziland","SE":"Sweden","CH":"Switzerland","SY":"Syrian Arab Republic","TW":"Taiwan","TJ":"Tajikistan","TZ":"United Republic of Tanzania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad and Tobago","TN":"Tunisia","TR":"Turkey","TM":"Turkmenistan","TC":"Turks and Caicos Islands","TV":"Tuvalu","UG":"Uganda","UA":"Ukraine","AE":"United Arab Emirates","GB":"United Kingdom","US":"United States","UM":"United States Minor Outlying Islands","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VE":"Bolivarian Republic of Venezuela","VN":"Viet Nam","VG":"British Virgin Islands","VI":"U.S. Virgin Islands","WF":"Wallis and Futuna","EH":"Western Sahara","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe"}},"KnownHosts":{"label":"Host","add":"Add new host","toast":"Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."},"InitializeContainer":{"title":"VOCÊ SABIA?","subtitle":"<1>Cockatrice is run by volunteers<1>that love card games!"},"LoginContainer":{"header":{"title":"Login","subtitle":"A cross-platform virtual tabletop for multiplayer card games."},"footer":{"registerPrompt":"Not registered yet?","registerAction":"Create an account","credit":"Cockatrice é um projeto de código aberto","version":"Versão"},"content":{"subtitle1":"Play multiplayer card games online.","subtitle2":"Cross-platform virtual tabletop for multiplayer card games. Forever free."},"toasts":{"passwordResetSuccessToast":"Senha redefinida com sucesso","accountActivationSuccess":"Conta ativada com sucesso"}},"UnsupportedContainer":{"title":"Unsupported Browser","subtitle1":"Por favor atualize seu navegador de internet e/ou check as permissões","subtitle2":"Observação: a navegação privada faz com que alguns navegadores desativem determinadas permissões ou recursos."},"AccountActivationDialog":{"title":"Ativação da conta","subtitle1":"Sua conta ainda não foi ativada.","subtitle2":"Você precisa fornecer o código de ativação recebido por email."},"KnownHostDialog":{"title":"{mode, select, edit {Edit} other {Add}} Known Host","subtitle":"Adding a new host allows you to connect to different servers. Enter the details below to your host list."},"RegistrationDialog":{"title":"Criar Nova Conta"},"RequestPasswordResetDialog":{"title":"Solicitar redefinição de senha"},"ResetPasswordDialog":{"title":"Redefinir Senha"},"AccountActivationForm":{"error":{"failed":"Falha na activação de conta"},"label":{"activate":"Ativar Conta"}},"KnownHostForm":{"help":"Need help adding a new host?","label":{"add":"Add Host","find":"Find Host"}},"LoginForm":{"label":{"autoConnect":"Conectar Automaticamente","forgot":"Esqueci minha senha","login":"Login","savePassword":"Salvar Senha","savedPassword":"Salvar Senha"}},"RegisterForm":{"label":{"register":"Registrar"},"toast":{"registerSuccess":"Registro bem-sucedido"}},"RequestPasswordResetForm":{"error":"Falha na solicitação de redefinição de senha","mfaEnabled":"O servidor tem autenticação de multi-fator ativada","request":"Request Reset Token","skipRequest":"I already have a reset token"},"ResetPasswordForm":{"error":"Falha na redefinição de senha","label":{"reset":"Redefinir Senha"}}} \ No newline at end of file diff --git a/webclient/src/common.i18n.json b/webclient/src/common.i18n.json index 749f48c9..2294660c 100644 --- a/webclient/src/common.i18n.json +++ b/webclient/src/common.i18n.json @@ -274,6 +274,12 @@ "YE": "Yemen", "ZM": "Zambia", "ZW": "Zimbabwe" + }, + "languages": { + "en-US": "English - US", + "fr": "French", + "nl": "Dutch", + "pt-BR": "Portuguese - Brazil" } } } diff --git a/webclient/src/components/CountryDropdown/CountryDropdown.tsx b/webclient/src/components/CountryDropdown/CountryDropdown.tsx index e47d640e..9ac6c37f 100644 --- a/webclient/src/components/CountryDropdown/CountryDropdown.tsx +++ b/webclient/src/components/CountryDropdown/CountryDropdown.tsx @@ -1,29 +1,24 @@ -// eslint-disable-next-line -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { Select, MenuItem } from '@material-ui/core'; import FormControl from '@material-ui/core/FormControl'; import InputLabel from '@material-ui/core/InputLabel'; import { useTranslation } from 'react-i18next'; +import { useLocaleSort } from 'hooks'; import { Images } from 'images/Images'; -import { CountryCode } from 'types'; +import { countryCodes } from 'types'; + import './CountryDropdown.css'; const CountryDropdown = ({ input: { onChange } }) => { - const [state, setState] = useState(''); - const [sortedCountries, setSortedCountries] = useState([]); - const { t, i18n } = useTranslation(); + const [value, setValue] = useState(''); + const { t } = useTranslation(); - useEffect(() => onChange(state), [state]); + useEffect(() => onChange(value), [value]); - useEffect(() => { - const collator = new Intl.Collator(i18n.language); - - setSortedCountries(Object.keys(CountryCode).sort((a, b) => - collator.compare(t(`Common.countries.${a}`), t(`Common.countries.${b}`)) - )); - }, [i18n.language]); + const translateCountry = country => t(`Common.countries.${country}`); + const sortedCountries = useLocaleSort(countryCodes, translateCountry); return ( @@ -33,9 +28,9 @@ const CountryDropdown = ({ input: { onChange } }) => { labelId='CountryDropdown-label' label='Country' margin='dense' - value={state} + value={value} fullWidth={true} - onChange={e => setState(e.target.value as string)} + onChange={e => setValue(e.target.value as string)} >
@@ -48,7 +43,7 @@ const CountryDropdown = ({ input: { onChange } }) => {
- {t(`Common.countries.${country}`)} + {translateCountry(country)}
)) diff --git a/webclient/src/components/LanguageDropdown/LanguageDropdown.tsx b/webclient/src/components/LanguageDropdown/LanguageDropdown.tsx index 56b64292..1aa6e206 100644 --- a/webclient/src/components/LanguageDropdown/LanguageDropdown.tsx +++ b/webclient/src/components/LanguageDropdown/LanguageDropdown.tsx @@ -6,12 +6,12 @@ import FormControl from '@material-ui/core/FormControl'; import InputLabel from '@material-ui/core/InputLabel'; import { Images } from 'images/Images'; -import { Language, LanguageCountry } from 'types'; +import { Language, LanguageCountry, LanguageNative } from 'types'; import './LanguageDropdown.css'; const LanguageDropdown = () => { - const { i18n } = useTranslation(); + const { t, i18n } = useTranslation(); const [language, setLanguage] = useState(i18n.resolvedLanguage); useEffect(() => { @@ -30,14 +30,20 @@ const LanguageDropdown = () => { onChange={e => setLanguage(e.target.value as Language)} > { - Object.keys(LanguageCountry).map((lang) => { + Object.keys(Language).map((lang) => { const country = LanguageCountry[lang]; return (
- {lang} + + {LanguageNative[lang]} { + LanguageNative[lang] !== t(`Common.languages.${lang}`) && ( + <>({ t(`Common.languages.${lang}`) }) + ) + } +
); diff --git a/webclient/src/hooks/index.ts b/webclient/src/hooks/index.ts index b75b8973..b5e9cca5 100644 --- a/webclient/src/hooks/index.ts +++ b/webclient/src/hooks/index.ts @@ -1,4 +1,5 @@ export * from './useAutoConnect'; export * from './useFireOnce'; export * from './useDebounce'; +export * from './useLocaleSort'; export * from './useReduxEffect'; diff --git a/webclient/src/hooks/useLocaleSort.ts b/webclient/src/hooks/useLocaleSort.ts new file mode 100644 index 00000000..219292ed --- /dev/null +++ b/webclient/src/hooks/useLocaleSort.ts @@ -0,0 +1,18 @@ +import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +export function useLocaleSort(arr: string[], valueGetter: (value: string) => string) { + const [state] = useState(arr); + const [sorted, setSorted] = useState([]); + + const { i18n } = useTranslation(); + + useEffect(() => { + const collator = new Intl.Collator(i18n.language); + const sorter = (a, b) => collator.compare(valueGetter(a), valueGetter(b)); + + setSorted(state.sort(sorter)); + }, [state, i18n.language]); + + return sorted; +} diff --git a/webclient/src/i18n-default.json b/webclient/src/i18n-default.json index 097308aa..c8bda222 100644 --- a/webclient/src/i18n-default.json +++ b/webclient/src/i18n-default.json @@ -1 +1 @@ -{"Common":{"language":"Translate into English.","disconnect":"Disconnect","label":{"confirmPassword":"Confirm Password","confirmSure":"Are you sure?","country":"Country","delete":"Delete","email":"Email","hostName":"Host Name","hostAddress":"Host Address","password":"Password","passwordAgain":"Password Again","port":"Port","realName":"Real Name","saveChanges":"Save Changes","token":"Token","username":"Username"},"validation":{"minChars":"Minimum of {count} {count, plural, one {character} other {characters}} required","passwordsMustMatch":"Passwords don't match","required":"Required"},"countries":{"AF":"Afghanistan","AX":"Åland Islands","AL":"Albania","DZ":"Algeria","AS":"American Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua and Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaijan","BH":"Bahrain","BS":"Bahamas","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgium","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Plurinational State of Bolivia","BQ":"Sint Eustatius and Saba Bonaire","BA":"Bosnia and Herzegovina","BW":"Botswana","BV":"Bouvet Island","BR":"Brazil","IO":"British Indian Ocean Territory","BN":"Brunei Darussalam","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodia","CM":"Cameroon","CA":"Canada","CV":"Cape Verde","KY":"Cayman Islands","CF":"Central African Republic","TD":"Chad","CL":"Chile","CN":"China","CX":"Christmas Island","CC":"Cocos (Keeling) Islands","CO":"Colombia","KM":"Comoros","CG":"Congo","CD":"The Democratic Republic of the Congo","CK":"Cook Islands","CR":"Costa Rica","CI":"Ivory Coast","HR":"Croatia","CU":"Cuba","CW":"Curaçao","CY":"Cyprus","CZ":"Czech Republic","DK":"Denmark","DJ":"Djibouti","DM":"Dominica","DO":"Dominican Republic","EC":"Ecuador","EG":"Egypt","SV":"El Salvador","GQ":"Equatorial Guinea","ER":"Eritrea","EE":"Estonia","ET":"Ethiopia","EU":"European Union","FK":"Falkland Islands (Malvinas)","FO":"Faroe Islands","FJ":"Fiji","FI":"Finland","FR":"France","GF":"French Guiana","PF":"French Polynesia","TF":"French Southern Territories","GA":"Gabon","GM":"Gambia","GE":"Georgia","DE":"Germany","GH":"Ghana","GI":"Gibraltar","GR":"Greece","GL":"Greenland","GD":"Grenada","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard Island and McDonald Islands","VA":"Holy See (Vatican City State)","HN":"Honduras","HK":"Hong Kong","HU":"Hungary","IS":"Iceland","IN":"India","ID":"Indonesia","IR":"Islamic Republic of Iran","IQ":"Iraq","IE":"Ireland","IM":"Isle of Man","IL":"Israel","IT":"Italy","JM":"Jamaica","JP":"Japan","JE":"Jersey","JO":"Jordan","KZ":"Kazakhstan","KE":"Kenya","KI":"Kiribati","KP":"Democratic People's Republic of Korea","KR":"Republic of Korea","KW":"Kuwait","KG":"Kyrgyzstan","LA":"Lao People's Democratic Republic","LV":"Latvia","LB":"Lebanon","LS":"Lesotho","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Lithuania","LU":"Luxembourg","MO":"Macao","MK":"The Former Yugoslav Republic of Macedonia","MG":"Madagascar","MW":"Malawi","MY":"Malaysia","MV":"Maldives","ML":"Mali","MT":"Malta","MH":"Marshall Islands","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Federated States of Micronesia","MD":"Republic of Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MA":"Morocco","MZ":"Mozambique","MM":"Myanmar","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Netherlands","NC":"New Caledonia","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NF":"Norfolk Island","MP":"Northern Mariana Islands","NO":"Norway","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"State of Palestine","PA":"Panama","PG":"Papua New Guinea","PY":"Paraguay","PE":"Peru","PH":"Philippines","PN":"Pitcairn","PL":"Poland","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"Réunion","RO":"Romania","RU":"Russian Federation","RW":"Rwanda","BL":"Saint Barthélemy","SH":"Ascension and Tristan da Cunha Saint Helena","KN":"Saint Kitts and Nevis","LC":"Saint Lucia","MF":"Saint Martin (French part)","PM":"Saint Pierre and Miquelon","VC":"Saint Vincent and the Grenadines","WS":"Samoa","SM":"San Marino","ST":"Sao Tome and Principe","SA":"Saudi Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten (Dutch part)","SK":"Slovakia","SI":"Slovenia","SB":"Solomon Islands","SO":"Somalia","ZA":"South Africa","GS":"South Georgia and the South Sandwich Islands","SS":"South Sudan","ES":"Spain","LK":"Sri Lanka","SD":"Sudan","SR":"Suriname","SJ":"Svalbard and Jan Mayen","SZ":"Swaziland","SE":"Sweden","CH":"Switzerland","SY":"Syrian Arab Republic","TW":"Taiwan","TJ":"Tajikistan","TZ":"United Republic of Tanzania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad and Tobago","TN":"Tunisia","TR":"Turkey","TM":"Turkmenistan","TC":"Turks and Caicos Islands","TV":"Tuvalu","UG":"Uganda","UA":"Ukraine","AE":"United Arab Emirates","GB":"United Kingdom","US":"United States","UM":"United States Minor Outlying Islands","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VE":"Bolivarian Republic of Venezuela","VN":"Viet Nam","VG":"British Virgin Islands","VI":"U.S. Virgin Islands","WF":"Wallis and Futuna","EH":"Western Sahara","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe"}},"KnownHosts":{"label":"Host","add":"Add new host","toast":"Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."},"InitializeContainer":{"title":"DID YOU KNOW","subtitle":"<1>Cockatrice is run by volunteers<1>that love card games!"},"LoginContainer":{"header":{"title":"Login","subtitle":"A cross-platform virtual tabletop for multiplayer card games."},"footer":{"registerPrompt":"Not registered yet?","registerAction":"Create an account","credit":"Cockatrice is an open source project","version":"Version"},"content":{"subtitle1":"Play multiplayer card games online.","subtitle2":"Cross-platform virtual tabletop for multiplayer card games. Forever free."},"toasts":{"passwordResetSuccessToast":"Password Reset Successfully","accountActivationSuccess":"Account Activated Successfully"}},"UnsupportedContainer":{"title":"Unsupported Browser","subtitle1":"Please update your browser and/or check your permissions.","subtitle2":"Note: Private browsing causes some browsers to disable certain permissions or features."},"AccountActivationDialog":{"title":"Account Activation","subtitle1":"Your account has not been activated yet.","subtitle2":"You need to provide the activation token received in the activation email."},"KnownHostDialog":{"title":"{mode, select, edit {Edit} other {Add}} Known Host","subtitle":"Adding a new host allows you to connect to different servers. Enter the details below to your host list."},"RegistrationDialog":{"title":"Create New Account"},"RequestPasswordResetDialog":{"title":"Request Password Reset"},"ResetPasswordDialog":{"title":"Reset Password"},"AccountActivationForm":{"error":{"failed":"Account activation failed"},"label":{"activate":"Activate Account"}},"KnownHostForm":{"help":"Need help adding a new host?","label":{"add":"Add Host","find":"Find Host"}},"LoginForm":{"label":{"autoConnect":"Auto Connect","forgot":"Forgot Password","login":"Login","savePassword":"Save Password","savedPassword":"Saved Password"}},"RegisterForm":{"label":{"register":"Register"},"toast":{"registerSuccess":"Registration Successful!"}},"RequestPasswordResetForm":{"error":"Request password reset failed","mfaEnabled":"Server has multi-factor authentication enabled","request":"Request Reset Token","skipRequest":"I already have a reset token"},"ResetPasswordForm":{"error":"Password reset failed","label":{"reset":"Reset Password"}}} \ No newline at end of file +{"Common":{"language":"Translate into English.","disconnect":"Disconnect","label":{"confirmPassword":"Confirm Password","confirmSure":"Are you sure?","country":"Country","delete":"Delete","email":"Email","hostName":"Host Name","hostAddress":"Host Address","password":"Password","passwordAgain":"Password Again","port":"Port","realName":"Real Name","saveChanges":"Save Changes","token":"Token","username":"Username"},"validation":{"minChars":"Minimum of {count} {count, plural, one {character} other {characters}} required","passwordsMustMatch":"Passwords don't match","required":"Required"},"countries":{"AF":"Afghanistan","AX":"Åland Islands","AL":"Albania","DZ":"Algeria","AS":"American Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua and Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaijan","BH":"Bahrain","BS":"Bahamas","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgium","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Plurinational State of Bolivia","BQ":"Sint Eustatius and Saba Bonaire","BA":"Bosnia and Herzegovina","BW":"Botswana","BV":"Bouvet Island","BR":"Brazil","IO":"British Indian Ocean Territory","BN":"Brunei Darussalam","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodia","CM":"Cameroon","CA":"Canada","CV":"Cape Verde","KY":"Cayman Islands","CF":"Central African Republic","TD":"Chad","CL":"Chile","CN":"China","CX":"Christmas Island","CC":"Cocos (Keeling) Islands","CO":"Colombia","KM":"Comoros","CG":"Congo","CD":"The Democratic Republic of the Congo","CK":"Cook Islands","CR":"Costa Rica","CI":"Ivory Coast","HR":"Croatia","CU":"Cuba","CW":"Curaçao","CY":"Cyprus","CZ":"Czech Republic","DK":"Denmark","DJ":"Djibouti","DM":"Dominica","DO":"Dominican Republic","EC":"Ecuador","EG":"Egypt","SV":"El Salvador","GQ":"Equatorial Guinea","ER":"Eritrea","EE":"Estonia","ET":"Ethiopia","EU":"European Union","FK":"Falkland Islands (Malvinas)","FO":"Faroe Islands","FJ":"Fiji","FI":"Finland","FR":"France","GF":"French Guiana","PF":"French Polynesia","TF":"French Southern Territories","GA":"Gabon","GM":"Gambia","GE":"Georgia","DE":"Germany","GH":"Ghana","GI":"Gibraltar","GR":"Greece","GL":"Greenland","GD":"Grenada","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard Island and McDonald Islands","VA":"Holy See (Vatican City State)","HN":"Honduras","HK":"Hong Kong","HU":"Hungary","IS":"Iceland","IN":"India","ID":"Indonesia","IR":"Islamic Republic of Iran","IQ":"Iraq","IE":"Ireland","IM":"Isle of Man","IL":"Israel","IT":"Italy","JM":"Jamaica","JP":"Japan","JE":"Jersey","JO":"Jordan","KZ":"Kazakhstan","KE":"Kenya","KI":"Kiribati","KP":"Democratic People's Republic of Korea","KR":"Republic of Korea","KW":"Kuwait","KG":"Kyrgyzstan","LA":"Lao People's Democratic Republic","LV":"Latvia","LB":"Lebanon","LS":"Lesotho","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Lithuania","LU":"Luxembourg","MO":"Macao","MK":"The Former Yugoslav Republic of Macedonia","MG":"Madagascar","MW":"Malawi","MY":"Malaysia","MV":"Maldives","ML":"Mali","MT":"Malta","MH":"Marshall Islands","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Federated States of Micronesia","MD":"Republic of Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MA":"Morocco","MZ":"Mozambique","MM":"Myanmar","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Netherlands","NC":"New Caledonia","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NF":"Norfolk Island","MP":"Northern Mariana Islands","NO":"Norway","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"State of Palestine","PA":"Panama","PG":"Papua New Guinea","PY":"Paraguay","PE":"Peru","PH":"Philippines","PN":"Pitcairn","PL":"Poland","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"Réunion","RO":"Romania","RU":"Russian Federation","RW":"Rwanda","BL":"Saint Barthélemy","SH":"Ascension and Tristan da Cunha Saint Helena","KN":"Saint Kitts and Nevis","LC":"Saint Lucia","MF":"Saint Martin (French part)","PM":"Saint Pierre and Miquelon","VC":"Saint Vincent and the Grenadines","WS":"Samoa","SM":"San Marino","ST":"Sao Tome and Principe","SA":"Saudi Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten (Dutch part)","SK":"Slovakia","SI":"Slovenia","SB":"Solomon Islands","SO":"Somalia","ZA":"South Africa","GS":"South Georgia and the South Sandwich Islands","SS":"South Sudan","ES":"Spain","LK":"Sri Lanka","SD":"Sudan","SR":"Suriname","SJ":"Svalbard and Jan Mayen","SZ":"Swaziland","SE":"Sweden","CH":"Switzerland","SY":"Syrian Arab Republic","TW":"Taiwan","TJ":"Tajikistan","TZ":"United Republic of Tanzania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad and Tobago","TN":"Tunisia","TR":"Turkey","TM":"Turkmenistan","TC":"Turks and Caicos Islands","TV":"Tuvalu","UG":"Uganda","UA":"Ukraine","AE":"United Arab Emirates","GB":"United Kingdom","US":"United States","UM":"United States Minor Outlying Islands","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VE":"Bolivarian Republic of Venezuela","VN":"Viet Nam","VG":"British Virgin Islands","VI":"U.S. Virgin Islands","WF":"Wallis and Futuna","EH":"Western Sahara","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe"},"languages":{"en-US":"English - US","fr":"French","nl":"Dutch","pt-BR":"Portuguese - Brazil"}},"KnownHosts":{"label":"Host","add":"Add new host","toast":"Host successfully {mode, select, created {created} deleted {deleted} other {edited}}."},"InitializeContainer":{"title":"DID YOU KNOW","subtitle":"<1>Cockatrice is run by volunteers<1>that love card games!"},"LoginContainer":{"header":{"title":"Login","subtitle":"A cross-platform virtual tabletop for multiplayer card games."},"footer":{"registerPrompt":"Not registered yet?","registerAction":"Create an account","credit":"Cockatrice is an open source project","version":"Version"},"content":{"subtitle1":"Play multiplayer card games online.","subtitle2":"Cross-platform virtual tabletop for multiplayer card games. Forever free."},"toasts":{"passwordResetSuccessToast":"Password Reset Successfully","accountActivationSuccess":"Account Activated Successfully"}},"UnsupportedContainer":{"title":"Unsupported Browser","subtitle1":"Please update your browser and/or check your permissions.","subtitle2":"Note: Private browsing causes some browsers to disable certain permissions or features."},"AccountActivationDialog":{"title":"Account Activation","subtitle1":"Your account has not been activated yet.","subtitle2":"You need to provide the activation token received in the activation email."},"KnownHostDialog":{"title":"{mode, select, edit {Edit} other {Add}} Known Host","subtitle":"Adding a new host allows you to connect to different servers. Enter the details below to your host list."},"RegistrationDialog":{"title":"Create New Account"},"RequestPasswordResetDialog":{"title":"Request Password Reset"},"ResetPasswordDialog":{"title":"Reset Password"},"AccountActivationForm":{"error":{"failed":"Account activation failed"},"label":{"activate":"Activate Account"}},"KnownHostForm":{"help":"Need help adding a new host?","label":{"add":"Add Host","find":"Find Host"}},"LoginForm":{"label":{"autoConnect":"Auto Connect","forgot":"Forgot Password","login":"Login","savePassword":"Save Password","savedPassword":"Saved Password"}},"RegisterForm":{"label":{"register":"Register"},"toast":{"registerSuccess":"Registration Successful!"}},"RequestPasswordResetForm":{"error":"Request password reset failed","mfaEnabled":"Server has multi-factor authentication enabled","request":"Request Reset Token","skipRequest":"I already have a reset token"},"ResetPasswordForm":{"error":"Password reset failed","label":{"reset":"Reset Password"}}} \ No newline at end of file diff --git a/webclient/src/i18n.ts b/webclient/src/i18n.ts index e1870fd3..ef188596 100644 --- a/webclient/src/i18n.ts +++ b/webclient/src/i18n.ts @@ -17,9 +17,9 @@ i18n .use(initReactI18next) // for all options read: https://www.i18next.com/overview/configuration-options .init({ - fallbackLng: Language['en'], + fallbackLng: Language['en-US'], resources: { - [Language['en']]: { translation }, + [Language['en-US']]: { translation }, }, partialBundledLanguages: true, diff --git a/webclient/src/types/countries.ts b/webclient/src/types/countries.ts index d679e21b..7a4d1c96 100644 --- a/webclient/src/types/countries.ts +++ b/webclient/src/types/countries.ts @@ -1,252 +1,252 @@ -export enum CountryCode { - 'AF' = 'AF', - 'AX' = 'AX', - 'AL' = 'AL', - 'DZ' = 'DZ', - 'AS' = 'AS', - 'AD' = 'AD', - 'AO' = 'AO', - 'AI' = 'AI', - 'AQ' = 'AQ', - 'AG' = 'AG', - 'AR' = 'AR', - 'AM' = 'AM', - 'AW' = 'AW', - 'AU' = 'AU', - 'AT' = 'AT', - 'AZ' = 'AZ', - 'BH' = 'BH', - 'BS' = 'BS', - 'BD' = 'BD', - 'BB' = 'BB', - 'BY' = 'BY', - 'BE' = 'BE', - 'BZ' = 'BZ', - 'BJ' = 'BJ', - 'BM' = 'BM', - 'BT' = 'BT', - 'BO' = 'BO', - 'BQ' = 'BQ', - 'BA' = 'BA', - 'BW' = 'BW', - 'BV' = 'BV', - 'BR' = 'BR', - 'IO' = 'IO', - 'BN' = 'BN', - 'BG' = 'BG', - 'BF' = 'BF', - 'BI' = 'BI', - 'KH' = 'KH', - 'CM' = 'CM', - 'CA' = 'CA', - 'CV' = 'CV', - 'KY' = 'KY', - 'CF' = 'CF', - 'TD' = 'TD', - 'CL' = 'CL', - 'CN' = 'CN', - 'CX' = 'CX', - 'CC' = 'CC', - 'CO' = 'CO', - 'KM' = 'KM', - 'CG' = 'CG', - 'CD' = 'CD', - 'CK' = 'CK', - 'CR' = 'CR', - 'CI' = 'CI', - 'HR' = 'HR', - 'CU' = 'CU', - 'CW' = 'CW', - 'CY' = 'CY', - 'CZ' = 'CZ', - 'DK' = 'DK', - 'DJ' = 'DJ', - 'DM' = 'DM', - 'DO' = 'DO', - 'EC' = 'EC', - 'EG' = 'EG', - 'SV' = 'SV', - 'GQ' = 'GQ', - 'ER' = 'ER', - 'EE' = 'EE', - 'ET' = 'ET', - 'EU' = 'EU', - 'FK' = 'FK', - 'FO' = 'FO', - 'FJ' = 'FJ', - 'FI' = 'FI', - 'FR' = 'FR', - 'GF' = 'GF', - 'PF' = 'PF', - 'TF' = 'TF', - 'GA' = 'GA', - 'GM' = 'GM', - 'GE' = 'GE', - 'DE' = 'DE', - 'GH' = 'GH', - 'GI' = 'GI', - 'GR' = 'GR', - 'GL' = 'GL', - 'GD' = 'GD', - 'GP' = 'GP', - 'GU' = 'GU', - 'GT' = 'GT', - 'GG' = 'GG', - 'GN' = 'GN', - 'GW' = 'GW', - 'GY' = 'GY', - 'HT' = 'HT', - 'HM' = 'HM', - 'VA' = 'VA', - 'HN' = 'HN', - 'HK' = 'HK', - 'HU' = 'HU', - 'IS' = 'IS', - 'IN' = 'IN', - 'ID' = 'ID', - 'IR' = 'IR', - 'IQ' = 'IQ', - 'IE' = 'IE', - 'IM' = 'IM', - 'IL' = 'IL', - 'IT' = 'IT', - 'JM' = 'JM', - 'JP' = 'JP', - 'JE' = 'JE', - 'JO' = 'JO', - 'KZ' = 'KZ', - 'KE' = 'KE', - 'KI' = 'KI', - 'KP' = 'KP', - 'KR' = 'KR', - 'KW' = 'KW', - 'KG' = 'KG', - 'LA' = 'LA', - 'LV' = 'LV', - 'LB' = 'LB', - 'LS' = 'LS', - 'LR' = 'LR', - 'LY' = 'LY', - 'LI' = 'LI', - 'LT' = 'LT', - 'LU' = 'LU', - 'MO' = 'MO', - 'MK' = 'MK', - 'MG' = 'MG', - 'MW' = 'MW', - 'MY' = 'MY', - 'MV' = 'MV', - 'ML' = 'ML', - 'MT' = 'MT', - 'MH' = 'MH', - 'MQ' = 'MQ', - 'MR' = 'MR', - 'MU' = 'MU', - 'YT' = 'YT', - 'MX' = 'MX', - 'FM' = 'FM', - 'MD' = 'MD', - 'MC' = 'MC', - 'MN' = 'MN', - 'ME' = 'ME', - 'MS' = 'MS', - 'MA' = 'MA', - 'MZ' = 'MZ', - 'MM' = 'MM', - 'NA' = 'NA', - 'NR' = 'NR', - 'NP' = 'NP', - 'NL' = 'NL', - 'NC' = 'NC', - 'NZ' = 'NZ', - 'NI' = 'NI', - 'NE' = 'NE', - 'NG' = 'NG', - 'NU' = 'NU', - 'NF' = 'NF', - 'MP' = 'MP', - 'NO' = 'NO', - 'OM' = 'OM', - 'PK' = 'PK', - 'PW' = 'PW', - 'PS' = 'PS', - 'PA' = 'PA', - 'PG' = 'PG', - 'PY' = 'PY', - 'PE' = 'PE', - 'PH' = 'PH', - 'PN' = 'PN', - 'PL' = 'PL', - 'PT' = 'PT', - 'PR' = 'PR', - 'QA' = 'QA', - 'RE' = 'RE', - 'RO' = 'RO', - 'RU' = 'RU', - 'RW' = 'RW', - 'BL' = 'BL', - 'SH' = 'SH', - 'KN' = 'KN', - 'LC' = 'LC', - 'MF' = 'MF', - 'PM' = 'PM', - 'VC' = 'VC', - 'WS' = 'WS', - 'SM' = 'SM', - 'ST' = 'ST', - 'SA' = 'SA', - 'SN' = 'SN', - 'RS' = 'RS', - 'SC' = 'SC', - 'SL' = 'SL', - 'SG' = 'SG', - 'SX' = 'SX', - 'SK' = 'SK', - 'SI' = 'SI', - 'SB' = 'SB', - 'SO' = 'SO', - 'ZA' = 'ZA', - 'GS' = 'GS', - 'SS' = 'SS', - 'ES' = 'ES', - 'LK' = 'LK', - 'SD' = 'SD', - 'SR' = 'SR', - 'SJ' = 'SJ', - 'SZ' = 'SZ', - 'SE' = 'SE', - 'CH' = 'CH', - 'SY' = 'SY', - 'TW' = 'TW', - 'TJ' = 'TJ', - 'TZ' = 'TZ', - 'TH' = 'TH', - 'TL' = 'TL', - 'TG' = 'TG', - 'TK' = 'TK', - 'TO' = 'TO', - 'TT' = 'TT', - 'TN' = 'TN', - 'TR' = 'TR', - 'TM' = 'TM', - 'TC' = 'TC', - 'TV' = 'TV', - 'UG' = 'UG', - 'UA' = 'UA', - 'AE' = 'AE', - 'GB' = 'GB', - 'US' = 'US', - 'UM' = 'UM', - 'UY' = 'UY', - 'UZ' = 'UZ', - 'VU' = 'VU', - 'VE' = 'VE', - 'VN' = 'VN', - 'VG' = 'VG', - 'VI' = 'VI', - 'WF' = 'WF', - 'EH' = 'EH', - 'YE' = 'YE', - 'ZM' = 'ZM', - 'ZW' = 'ZW', - }; +export const countryCodes = [ + 'AF', + 'AX', + 'AL', + 'DZ', + 'AS', + 'AD', + 'AO', + 'AI', + 'AQ', + 'AG', + 'AR', + 'AM', + 'AW', + 'AU', + 'AT', + 'AZ', + 'BH', + 'BS', + 'BD', + 'BB', + 'BY', + 'BE', + 'BZ', + 'BJ', + 'BM', + 'BT', + 'BO', + 'BQ', + 'BA', + 'BW', + 'BV', + 'BR', + 'IO', + 'BN', + 'BG', + 'BF', + 'BI', + 'KH', + 'CM', + 'CA', + 'CV', + 'KY', + 'CF', + 'TD', + 'CL', + 'CN', + 'CX', + 'CC', + 'CO', + 'KM', + 'CG', + 'CD', + 'CK', + 'CR', + 'CI', + 'HR', + 'CU', + 'CW', + 'CY', + 'CZ', + 'DK', + 'DJ', + 'DM', + 'DO', + 'EC', + 'EG', + 'SV', + 'GQ', + 'ER', + 'EE', + 'ET', + 'EU', + 'FK', + 'FO', + 'FJ', + 'FI', + 'FR', + 'GF', + 'PF', + 'TF', + 'GA', + 'GM', + 'GE', + 'DE', + 'GH', + 'GI', + 'GR', + 'GL', + 'GD', + 'GP', + 'GU', + 'GT', + 'GG', + 'GN', + 'GW', + 'GY', + 'HT', + 'HM', + 'VA', + 'HN', + 'HK', + 'HU', + 'IS', + 'IN', + 'ID', + 'IR', + 'IQ', + 'IE', + 'IM', + 'IL', + 'IT', + 'JM', + 'JP', + 'JE', + 'JO', + 'KZ', + 'KE', + 'KI', + 'KP', + 'KR', + 'KW', + 'KG', + 'LA', + 'LV', + 'LB', + 'LS', + 'LR', + 'LY', + 'LI', + 'LT', + 'LU', + 'MO', + 'MK', + 'MG', + 'MW', + 'MY', + 'MV', + 'ML', + 'MT', + 'MH', + 'MQ', + 'MR', + 'MU', + 'YT', + 'MX', + 'FM', + 'MD', + 'MC', + 'MN', + 'ME', + 'MS', + 'MA', + 'MZ', + 'MM', + 'NA', + 'NR', + 'NP', + 'NL', + 'NC', + 'NZ', + 'NI', + 'NE', + 'NG', + 'NU', + 'NF', + 'MP', + 'NO', + 'OM', + 'PK', + 'PW', + 'PS', + 'PA', + 'PG', + 'PY', + 'PE', + 'PH', + 'PN', + 'PL', + 'PT', + 'PR', + 'QA', + 'RE', + 'RO', + 'RU', + 'RW', + 'BL', + 'SH', + 'KN', + 'LC', + 'MF', + 'PM', + 'VC', + 'WS', + 'SM', + 'ST', + 'SA', + 'SN', + 'RS', + 'SC', + 'SL', + 'SG', + 'SX', + 'SK', + 'SI', + 'SB', + 'SO', + 'ZA', + 'GS', + 'SS', + 'ES', + 'LK', + 'SD', + 'SR', + 'SJ', + 'SZ', + 'SE', + 'CH', + 'SY', + 'TW', + 'TJ', + 'TZ', + 'TH', + 'TL', + 'TG', + 'TK', + 'TO', + 'TT', + 'TN', + 'TR', + 'TM', + 'TC', + 'TV', + 'UG', + 'UA', + 'AE', + 'GB', + 'US', + 'UM', + 'UY', + 'UZ', + 'VU', + 'VE', + 'VN', + 'VG', + 'VI', + 'WF', + 'EH', + 'YE', + 'ZM', + 'ZW', +]; diff --git a/webclient/src/types/languages.ts b/webclient/src/types/languages.ts index ad0b8403..6d384aa4 100644 --- a/webclient/src/types/languages.ts +++ b/webclient/src/types/languages.ts @@ -1,11 +1,20 @@ export enum Language { - 'en' = 'en', + 'en-US' = 'en-US', 'fr' = 'fr', 'nl' = 'nl', + 'pt-BR' = 'pt-BR', } export enum LanguageCountry { - 'en' = 'us', + 'en-US' = 'us', 'fr' = 'fr', 'nl' = 'nl', + 'pt-BR' = 'br' +} + +export enum LanguageNative { + 'en-US' = 'English - US', + 'fr' = 'Français', + 'nl' = 'Nederlands', + 'pt-BR' = 'Portugues do Brasil', }