Open sunafajro opened 7 years ago
Есть несколько пакетов для локализации в экосистеме VueJs:
отлично, похоже на то как это сделано в yii, отделный файл с переведенными строками. осталось разобраться как метяь язык туда обратно, похоже послдений модуль надо будет поставить и тестировать.
последний модуль требует vuex. Может быть попробовать первый, дефолтный чувашский, а изменения сохранять в куки. this.$lang.setLang('eo')
да, можно начать с простого
сделал бранч i18n и закинул туда первоначальный вариант. Работает неплохо, но два ньюанса.
Да я тоже обнаружил это. Поискал по интернету. Может быть это как раз из-за того что это дочерний компонент.
проблема остается. я пробовал ставить watch: '$lang' в компоненте Home.vue и по нему вызывать функцию обновления языка, но он никак не реагирует на изменение $lang. хотя сам $lang меняется. пробовал делать в App.vue при обновлении языка $router.push на текущий адрес, но опять же никакого результата, видимо роутер игнорит переход если адрес совпадает с текущим.
на то что рендерится внутри
я создал issue в vuejs-localization:
не совсем так. я не очень понимаю структуру. у нас есть основной инстанс в main.js, у него есть дочерний компонент App. Есть еще Router у него дочерние компоненты Home, About, Search и т.д. И вот тут вопрос как одно с другим связано? получается что на App изменение языка действует сразу, а вот на дочерние к роутеру компоненты нет.
вероятно все таки стоит задействовать роутер для передачи языка. http://router.vuejs.org/ru/essentials/nested-routes.html здесь правда тоже есть вопросы как это сделать.
Чего-то я запутался. Все что внутри <router-view></router-view>
не переводится. Если по роутеру переходить, то работает. Попробуй так: поменяй язык, "последние статьи" не переводятся. Потом перейди на "О сайте" и обратно на первую страницу, "последние статьи" перевелись.
да именно так и происходит. потому что хоть мы и меняем язык глобально, но то что внутри router-view - уже отрендерилось и на него изменения никак не влияют без перезагрузки.
а отловить изменение $lang изнутри router-view почему то не получается. вот такая штука внутри Home.vue не работает (может быть я watch неправильно оформляю)
watch: { '$lang': 'someAction' },
methods: { someAction () { console.log(this.$lang); } }
все проблемы от непонимания архитектуры и методов приложения.
Да, я попробовал это добавить в toggleLang(lang)
this.$router.go({path: this.$router.currentRoute.path})
Язык меняется, но только из-за перезагрузки страницы. Но это некрасиво.
Чтобы "заставить компонент" обновиться я нашел workaround - $forceUpdate
Я попробовал в отдельной ветке - i18n-force : Home.vue
watch: {
...
'$lang.current_lang': 'updateLang'
},
...
updateLang(lang) {
this.$forceUpdate()
}
ок, работает. я в i18n бранче дописал, только короче '$lang.current_lang': function () { this.$forceUpdate() }
если решение нормальное , можем мерджить в master
товарищ который это подсказал пишет что такой подход костыльный, надо использовать computed properties вместо него https://vuejs.org/v2/guide/computed.html
Да, это костыльный подход. :) workaround...
@mirontoli попробовал computed свойства, но не заработало. сделал по другому. создал объект в который складываются все надписи интерфейса, и при изменении $lang.current_lang этот объект обновляется. хотя не особо гибко получается.
@mirontoli слил содержимое бранча в master, ветку оставим пока, вдруг вернемся еще к этому вопросу. твою ветку i18n-force удалил, дабы не плодить повторов.
Подумать над возжными путями добавления локализации интерфейса на три языка - русский, чувашский, эсперанто. Возможно при помощи роутинга?