У меня есть файл 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.
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"
};
Я бы использовал несколько другой подход. То, как вы пытаетесь использовать константы, ограничено областью блока, используемой в условных выражениях.
Почему бы не поместить все связанные с языком строки в модуль или отдельные файлы. что-то вроде 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
привязаны к области родительского блока, вы не можете использовать их вне этого. Чтобы преодолеть это, используйте модули, если можете, а если нет, убедитесь, что вы объявляете их в глобальном контексте.
Надеюсь, я дал вам хотя бы несколько полезных советов.
Похожие вопросы
Новые вопросы
jquery
jQuery — это библиотека JavaScript. Также рассмотрите возможность добавления тега JavaScript. jQuery — это популярная кросс-браузерная библиотека JavaScript, которая упрощает обход объектной модели документа (DOM), обработку событий, анимацию и взаимодействие AJAX, сводя к минимуму расхождения между браузерами. Вопрос с тегом jQuery должен быть связан с jQuery, поэтому jQuery должен использоваться рассматриваемым кодом, и в вопросе должны быть как минимум элементы, связанные с использованием jQuery.
let
илиconst
, имеют область действия блока, поэтому вы не можете получить доступ к переменной вне оператораif
.