diff --git a/src/components/LangSelector/LangSelector.tsx b/src/components/LangSelector/LangSelector.tsx index 248fc5ce..592f734f 100644 --- a/src/components/LangSelector/LangSelector.tsx +++ b/src/components/LangSelector/LangSelector.tsx @@ -1,6 +1,8 @@ import classNames from 'classnames' import { useDispatch } from 'react-redux' +import { EN, ISV } from 'consts' + import { t } from 'translations' import { langAction } from 'actions' @@ -23,7 +25,7 @@ const LangPart = ({ lang, dir, onSelect }: ILangPart) => { const langs = useDictionaryLanguages() - if (lang === 'isv') { + if (lang === ISV) { return (
{t('isvLang')} @@ -31,7 +33,7 @@ const LangPart = ) } - const options = ['en', ...langs].map((value) => ({ + const options = [EN, ...langs].map((value) => ({ name: t(`${value}Lang`), value, })) @@ -75,7 +77,7 @@ export const LangSelector = data-testid="change-direction" type="button" aria-label="Change translation direction" - className={classNames('lang-selector__change-dir-button', { rotate: from === 'isv' })} + className={classNames('lang-selector__change-dir-button', { rotate: from === ISV })} onClick={() => dispatch(langAction({ from: to, to: from, diff --git a/src/components/Modals/TranslationsModal/TranslationsModal.tsx b/src/components/Modals/TranslationsModal/TranslationsModal.tsx index 6fde49b3..96e4e444 100644 --- a/src/components/Modals/TranslationsModal/TranslationsModal.tsx +++ b/src/components/Modals/TranslationsModal/TranslationsModal.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react' import { useDispatch } from 'react-redux' -import { addLangs, langs } from 'consts' +import { ADD_LANGS, EN, ISV, LANGS } from 'consts' import { t } from 'translations' @@ -52,12 +52,12 @@ export const TranslationsModal = return null } - const addLangsFiltered = addLangs.filter((lang) => dictionaryLanguages.includes(lang)) + const addLangsFiltered = ADD_LANGS.filter((lang) => dictionaryLanguages.includes(lang)) const allLangs = [ - 'isv', - 'en', - ...langs, + ISV, + EN, + ...LANGS, ...addLangsFiltered, ] diff --git a/src/components/Pages/Settings/Settings.tsx b/src/components/Pages/Settings/Settings.tsx index ab3e3636..0ee4fdd0 100644 --- a/src/components/Pages/Settings/Settings.tsx +++ b/src/components/Pages/Settings/Settings.tsx @@ -2,7 +2,7 @@ import classNames from 'classnames' import { useState } from 'react' import { useDispatch } from 'react-redux' -import { addLangs, interfaceLanguageList } from 'consts' +import { ADD_LANGS, EN, interfaceLanguageList } from 'consts' import { t } from 'translations' @@ -211,7 +211,7 @@ export const Settings = )}
- {addLangs.map((lang, i) => { + {ADD_LANGS.map((lang, i) => { const checked = dictionaryLanguages.includes(lang) return ( @@ -225,7 +225,7 @@ export const Settings = if (checked && from === lang) { dispatch(langAction({ - from: 'en', + from: EN, to, })) } @@ -233,7 +233,7 @@ export const Settings = if (checked && to === lang) { dispatch(langAction({ from, - to: 'en', + to: EN, })) } diff --git a/src/components/Pages/Viewer/Viewer.tsx b/src/components/Pages/Viewer/Viewer.tsx index 806ca5e1..961d9ee7 100644 --- a/src/components/Pages/Viewer/Viewer.tsx +++ b/src/components/Pages/Viewer/Viewer.tsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { ClientSideRowModelModule } from '@ag-grid-community/client-side-row-model' import { Grid, GridOptions,ModuleRegistry } from '@ag-grid-community/core' -import { addLangs, initialFields, langs,validFields } from 'consts' +import { ADD_LANGS, EN, initialFields, ISV, LANGS, validFields } from 'consts' import { t } from 'translations' @@ -48,9 +48,9 @@ const getFieldWidth = (field: string): number => { const customSort = (field: string) => { if (field === 'id') { return (a: number, b: number) => a - b - } else if (field === 'isv') { + } else if (field === ISV) { return (a: string, b: string) => removeExclamationMark(a).localeCompare(removeExclamationMark(b), 'sk') - } else if (field === 'en' || langs.includes(field) || addLangs.includes(field)) { + } else if (field === EN || LANGS.includes(field) || ADD_LANGS.includes(field)) { return (a: string, b: string) => removeExclamationMark(a).localeCompare(removeExclamationMark(b), `${field}`) } else { return undefined @@ -58,7 +58,7 @@ const customSort = (field: string) => { } const customFilterParams = (field: string) => { - if (field === 'isv' || field === 'en' || langs.includes(field) || addLangs.includes(field)) { + if (field === ISV || field === EN || LANGS.includes(field) || ADD_LANGS.includes(field)) { return { filterOptions: [ 'equals', 'notEqual', 'contains', 'notContains', 'startsWith', 'endsWith', @@ -164,7 +164,7 @@ const prepareColumnDefs = (displayFields) => { pinned: initialFields.includes(field) ? 'left' : false, lockPinned: initialFields.includes(field), cellClass: initialFields.includes(field) ? 'lock-pinned' : '', - headerTooltip: ['isv', ...langs, ...addLangs].includes(field) ? t(`${field}Lang`) : field, + headerTooltip: ['isv', ...LANGS, ...ADD_LANGS].includes(field) ? t(`${field}Lang`) : field, tooltipField: field, width: getFieldWidth(field), cellStyle: getCellStyle, diff --git a/src/consts.ts b/src/consts.ts index 7b1b739e..289c756d 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -13,7 +13,11 @@ export const alphabetTypes = [ }, ] -export const langs = [ +export const ISV_SRC = 'isv-src' +export const ISV = 'isv' +export const EN = 'en' + +export const LANGS = [ 'ru', 'be', 'uk', @@ -27,7 +31,7 @@ export const langs = [ 'bg', ] -export const addLangs = [ +export const ADD_LANGS = [ 'de', 'nl', 'eo', @@ -64,12 +68,12 @@ export const initialAddFields = [ export const basicFields = [ ...initialFields, - ...langs, + ...LANGS, ] export const validFields = [ ...basicFields, - ...addLangs, + ...ADD_LANGS, ] export interface ITableData { @@ -87,7 +91,7 @@ export const tablesData: ITableData[] = [ { spreadsheetId: '1N79e_yVHDo-d026HljueuKJlAAdeELAiPzdFzdBuKbY', sheetId: '2005431854', - fields: addLangs, + fields: ADD_LANGS, }, ] diff --git a/src/serviceWorker/cashUrls.ts b/src/serviceWorker/cashUrls.ts index 449ea854..92bba334 100644 --- a/src/serviceWorker/cashUrls.ts +++ b/src/serviceWorker/cashUrls.ts @@ -1,10 +1,10 @@ -import { addLangs } from 'consts' +import { ADD_LANGS } from 'consts' export const CASH_URLS = [ '/', '/data/basic.json', '/data/translateStatistic.json', - ...addLangs.map((lang) => `/data/${lang}.json`), + ...ADD_LANGS.map((lang) => `/data/${lang}.json`), '/grammarComponent.js', '/index.js', '/sw.js', diff --git a/src/services/dictionary.ts b/src/services/dictionary.ts index a937f41e..62e139e3 100644 --- a/src/services/dictionary.ts +++ b/src/services/dictionary.ts @@ -1,4 +1,4 @@ -import { addLangs,langs } from 'consts' +import { ADD_LANGS, EN,ISV, ISV_SRC, LANGS } from 'consts' import { IAlphabets } from 'reducers' @@ -155,9 +155,6 @@ export interface ITranslateResult { remove?: boolean; } -export const ISV_SRC = 'isv-src' -export const ISV = 'isv' - export type WordList = string[][] export type SearchIndex = Record> @@ -205,9 +202,9 @@ class DictionaryClass { this.langsList = [ ISV, - 'en', - ...langs, - ...addLangs, + EN, + ...LANGS, + ...ADD_LANGS, ].filter((lang) => this.header.includes(lang)) this.headerIndexes = new Map(this.header.map((item, i: number) => [this.header[i], i])) diff --git a/src/services/fetchDictionary.ts b/src/services/fetchDictionary.ts index 25758efd..987e5fae 100644 --- a/src/services/fetchDictionary.ts +++ b/src/services/fetchDictionary.ts @@ -1,4 +1,4 @@ -import { addLangs } from 'consts' +import { ADD_LANGS } from 'consts' import { isLoadingAction, runSearch } from 'actions' @@ -38,7 +38,7 @@ export async function fetchDictionary(dispatch, langList: string[]) { const stat = await fetchStat() const basicData = await fetchBasic() - const langsData = await fetchLangs(langList.filter((lang) => addLangs.includes(lang))) + const langsData = await fetchLangs(langList.filter((lang) => ADD_LANGS.includes(lang))) langsData.forEach((langData) => { basicData.searchIndex = { diff --git a/src/services/generateDictionary.ts b/src/services/generateDictionary.ts index 8ede0f84..2b906691 100644 --- a/src/services/generateDictionary.ts +++ b/src/services/generateDictionary.ts @@ -1,8 +1,8 @@ import * as fs from 'fs' -import { addLangs, initialAddFields, initialFields,langs } from 'consts' +import { ADD_LANGS, EN, initialAddFields, initialFields, ISV, ISV_SRC, LANGS } from 'consts' -import { Dictionary, ISV, ISV_SRC, loadTablesData } from 'services' +import { Dictionary, loadTablesData } from 'services' import { getColumnName, transposeMatrix } from 'utils' @@ -21,23 +21,25 @@ loadTablesData.then(({ data, columns }) => { columns.forEach((column: string[]) => { const fieldName = getColumnName(column) - if (initialFilteredFields.includes(fieldName) || langs.includes(fieldName)) { + if (initialFilteredFields.includes(fieldName) || LANGS.includes(fieldName)) { basicDataTransposed.push(column) } }) let basicData = transposeMatrix(basicDataTransposed) + const sortIndex = basicData[0].indexOf(EN) + basicData = [ basicData[0], - ...basicData.slice(1).sort((a, b) => a[1].localeCompare(b[1])), + ...basicData.slice(1).sort((a, b) => a[sortIndex].localeCompare(b[sortIndex])), ] const searchIndexBasic = [ ISV_SRC, ISV, - 'en', - ...langs, + EN, + ...LANGS, ].reduce((searchIndexObj, lang) => { searchIndexObj[lang] = searchIndex[lang] @@ -60,7 +62,7 @@ loadTablesData.then(({ data, columns }) => { // eslint-disable-next-line no-console console.info(`basic.json g-zip size: ${sizeMB.toFixed(2)} MB`) - addLangs.forEach((lang) => { + ADD_LANGS.forEach((lang) => { const langDataTransposed = [ columns.find(([fieldName]) => fieldName === lang), ] diff --git a/src/store.ts b/src/store.ts index 479889aa..d19b9a32 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,4 +1,4 @@ -import { langs } from './consts' +import { EN, ISV,LANGS } from './consts' import { localStorageMiddleware } from './middlewares/localStorageMiddleware' import { urlParamsMiddleware } from './middlewares/urlParamsMiddleware' import { IMainState, mainReducer } from './reducers' @@ -11,8 +11,8 @@ import md5 from 'md5' export const defaultState: IMainState = { lang: { - from: 'en', - to: 'isv', + from: EN, + to: ISV, }, interfaceLang: getPreferredLanguage(), colorTheme: getPreferredTheme(), @@ -26,7 +26,7 @@ export const defaultState: IMainState = { fromText: '', searchType: 'begin', posFilter: '', - dictionaryLanguages: langs, + dictionaryLanguages: LANGS, flavorisationType: '3', alphabetType: 'latin', page: 'dictionary', @@ -54,10 +54,10 @@ function getInitialState(): IMainState { try { const savedState = JSON.parse(localStorage.getItem('reduxState')) || {} - if (savedState.lang.from !== 'isv' && savedState.lang.to !== 'isv') { + if (savedState.lang.from !== ISV && savedState.lang.to !== ISV) { savedState.lang = { - from: 'en', - to: 'isv', + from: EN, + to: ISV, } } @@ -68,7 +68,7 @@ function getInitialState(): IMainState { if (validateLang(lang)) { const [from, to] = lang.split('-') - const loadedLangs = ['en', ...savedState.dictionaryLanguages] + const loadedLangs = [EN, ...savedState.dictionaryLanguages] if (loadedLangs.includes(from) || loadedLangs.includes(to)) { savedState.lang = { diff --git a/src/translations/translations.ts b/src/translations/translations.ts index 700a5728..8accba3e 100644 --- a/src/translations/translations.ts +++ b/src/translations/translations.ts @@ -8,6 +8,8 @@ import { parseI18nString, } from 'utils' +import { ISV } from '../consts' + let currentLang const toLatin = createTaggedTemplate((s) => getLatin(String(s), '3'), 'strings') @@ -29,7 +31,7 @@ function tRaw(key) { if (!translations[key]) { return key } else if (translations[key][lang]) { - if (lang === 'isv') { + if (lang === ISV) { const parsed = parseI18nString(translations[key].isv) // transliteration & flavorisation of isv word switch (alphabet) { diff --git a/src/utils/getPreferredLanguage/getPreferredLanguage.ts b/src/utils/getPreferredLanguage/getPreferredLanguage.ts index b947b9d2..3f9966a2 100644 --- a/src/utils/getPreferredLanguage/getPreferredLanguage.ts +++ b/src/utils/getPreferredLanguage/getPreferredLanguage.ts @@ -1,4 +1,4 @@ -import { interfaceLanguageList } from 'consts' +import { EN,interfaceLanguageList } from 'consts' import { intersection } from 'utils' @@ -6,13 +6,13 @@ const supportedLanguages = interfaceLanguageList.map(item => item.value) export function getPreferredLanguage(): string { if (typeof navigator === 'undefined' || !navigator.languages) { - return 'en' + return EN } const languages = navigator.languages.map(getPrimaryTag) const relevantLanguages = intersection(languages, supportedLanguages) - return relevantLanguages.length > 0 ? relevantLanguages[0] : 'en' + return relevantLanguages.length > 0 ? relevantLanguages[0] : EN } function getPrimaryTag(languageCode: string): string { diff --git a/src/utils/validateLang/validateLang.ts b/src/utils/validateLang/validateLang.ts index af31d245..406d3df0 100644 --- a/src/utils/validateLang/validateLang.ts +++ b/src/utils/validateLang/validateLang.ts @@ -1,10 +1,10 @@ -import { addLangs, langs } from 'consts' +import { ADD_LANGS, EN,LANGS } from 'consts' export function validateLang(lang: string): boolean { const validLangs: string[] = [ - 'en', - ...langs, - ...addLangs, + EN, + ...LANGS, + ...ADD_LANGS, ].reduce((acc, lang) => [...acc, `isv-${lang}`, `${lang}-isv`], []) return Boolean(lang && validLangs.includes(lang))