наличия локали в пути [locale] во все ссылки в приложении необходим префикс с локалью, хранящейся в сторе. С одной стороны ничего сложного, просто берём значение локали и создаём литеральную строку:
<a href={`/${$locale}${url}`}>
Link
</a>
Идея в том, имеет ли смысл создать экшн, чтобы автоматом добавлять префиксы с локалью?
<a {href} use:locale>
Link
</a>
Экшн можно объявить в отдельном файле, импортировать туда значение стора и добавлять префикс, обновлять его при смене локали.
Вопрос в том, не будет ли это оверинжинирингом и не будет ли это бить по перформансу с учетом большого количества подписок через экшн?
Так не сработает. Экшены же не перезапускаются, если передаваемые пропсы не меняются (а тут они и не будут). Придётся императивно href менять, а это уже не подойдёт никак. К сожалению, ничего лучше нет, чем просто завести файлик routes.ts, где завести переменные на каждый путь, и если он локале-специфичный, то делать это через derived-стор.
Можно пример, если таковой есть, пожалуйста
Вот пример из блога моего.
Спасибо, попробую разобраться!
Так или иначе я всем бы советовал заводить такой файлик, даже если нет планов по разным локалям, потому что иначе очень больно будет менять структуру URL — а это когда-нибудь всегда приходится делать.
Вопрос возможно глупый, но большое количество derived не будет бить по производительности? Или это та самая экономия на спичках?
Тебя же не смущает использование $_() для вставки ключей? :) Это ж всё тоже дерайвды.
Да, другого более практичного способа пока не нашёл...
Я там посмотрел на пакет i18n, понял как работает и написал свой велосипед на readable сторе для хранения словарей, через derived тащу нужное сообщение с текущей локалью😅
Не заморачивайся на этот счёт. Дерайвды очень дешевы в обращении. Не так дешевы как строка текста, конечно, но всё равно неплохо. При многократной подписке на один и тот же стор свелт держит только одну подписку, поэтому в случае с $_ у тебя по факту будет одна подписка, которая выдаёт функцию. В случае с путями будет еще несколько. Можно, наверное, вместо отдельных дерайвдов сделать одну мапку, чтоб подписка была одна, но это несущественно.
Интересное решение, хаха. А зачем?
Тот пакет было сложно настроить для саппера. Были примеры, да, но и были там функции лишние для меня. А так, хоть разобрался в чём-то и реализовал своё :) Ещё, мне нужна была возможность хранить массивы в словарях, автор не собирался внедрять это, хотя в том же i18n для реакта так можно😁
Мм, ты давно делал? Массивы хранить не проблема уже больше полугода, просто надо использовать вместо _ функцию json, она вернёт по ключу то, что попросишь. В остальном отлично, почему бы и нет :)
Да, где-то в ноябре. Я потом ради интереса покажу, как всё будет готово. Ничем не удивить, но было бы интересно услышать мнение со стороны😁
За идею спасибо, очень понравилась. Буду точно делать аналогично
Обсуждают сегодня