У меня есть файл language.js вроде этого:

if (localStorage.getItem('lang') === 'en') {
   const LANGCONVERT = {
       "accept": "Accept",
       "accept_invitation": "Accept Invitation"
   }
} else {
   const LANGCONVERT = {
       "accept": "Aceptar",
       "accept_invitation": "Aceptar la invitacion"
   }
}

И я вызываю этот сценарий из других сценариев. И используйте как:

console.log(LANGCONVERT.accept);

Он работает, но phpstorm показывает предупреждение:

Неразрешенная переменная или тип LANGCONVERT

Строка типа аргумента | строка не может быть присвоена типу параметра

Проверяет аргументы вызываемой функции JavaScript, возвращаемые значения, присвоенные выражения на предмет правильного типа. Проверка работает в файлах JavaScript, html или jsp.

0
Nevermore 29 Окт 2019 в 02:23
1
Переменные, объявленные с помощью let или const, имеют область действия блока, поэтому вы не можете получить доступ к переменной вне оператора if.
 – 
Barmar
29 Окт 2019 в 02:25
Что мне использовать?
 – 
Nevermore
29 Окт 2019 в 02:26

2 ответа

Переменные, объявленные с помощью let или const, имеют блочную область видимости. Вам нужно объявить переменную вне оператора if, а затем назначить ее в if.

let LANGCONVERT;
if (localStorage.getItem('lang') === 'en') {
   LANGCONVERT = {
       "accept": "Accept",
       "accept_invitation": "Accept Invitation"
   }
} else {
   LANGCONVERT = {
       "accept": "Aceptar",
       "accept_invitation": "Aceptar la invitacion"
   }
}

Или вы можете инициализировать его с помощью условного выражения:

const LANGCONVERT = localStorage.getItem('lang') === 'en' ? 
    {
       "accept": "Accept",
       "accept_invitation": "Accept Invitation"
    } : {
       "accept": "Aceptar",
       "accept_invitation": "Aceptar la invitacion"
    };
1
Barmar 29 Окт 2019 в 02:29

Я бы использовал несколько другой подход. То, как вы пытаетесь использовать константы, ограничено областью блока, используемой в условных выражениях.

Почему бы не поместить все связанные с языком строки в модуль или отдельные файлы. что-то вроде translation.en.js и translation.es.js Поместите в них константу. Загрузите только один файл в зависимости от вашей переменной localStorage.

Получить переменную lang

let lang = localStorage.getItem('lang') 

Если вы можете импортировать модули (используйте транспилятор для совместимости)

import {TRANSLATIONS} from `path/to/translation.${lang}.js` 

Если нет, тогда иди в старую школу

let languageFile=document.createElement('script')
     languageFile.setAttribute("type","text/javascript")
     languageFile.setAttribute("src", `path/to/translation.${lang}.js`)
     document.body.appendChild(languageFile)

А затем используйте это так:

    const LANGCONVERT = {
       accept: TRANSLATIONS['accept'],
       accept_invitation: TRANSLATIONS['accept_invitation']
   }

Или используйте деструктуризацию для более короткой записи (опять же, только если с транспилером)

   let {accept, accept_invitation} = TRANSLATIONS
   const LANGCONVERT = {accept, accept_invitation}

Пример языкового файла

// make sure to export the const for module usage
const TRANSLATIONS = {
    accept: 'Accept'
    accept_invitation: 'Accept Invitation'
}

Вы поняли. И имейте в виду, что все let, const, this привязаны к области родительского блока, вы не можете использовать их вне этого. Чтобы преодолеть это, используйте модули, если можете, а если нет, убедитесь, что вы объявляете их в глобальном контексте.

Надеюсь, я дал вам хотя бы несколько полезных советов.

0
Iulian Cravet 29 Окт 2019 в 02:57