Я хочу использовать vue-i18n для панели навигации vuetify с v-for (помощь)

Мой код похож на

<v-navigation-drawer v-model="drawer" clipped app>
        <v-list dense>
            <span v-for="navitem in navitems" :key="navitem.subtitle">
                <v-subheader v-if="navitem.subtitle">{{ navitem.subtitle }}</v-subheader>
                <span v-if="navitem.subitem">
                    <v-list-group :prepend-icon="navitem.icon" v-model="navitem.active">
                        <template v-slot:activator>
                            <v-list-item-title>{{ navitem.title }}</v-list-item-title>
                        </template>
                        <span v-for="subitem in navitem.subitems" :key="subitem">
                            <span v-if="subitem.miniitems">
                                <v-list-group sub-group>
                                    <template v-slot:activator>
                                        <v-list-item-content>
                                            <v-list-item-title style="margin-left:10px">{{ this.$i18n.$t('subitem.title') }}
                                            </v-list-item-title>
                                        </v-list-item-content>
                                    </template>


                                    <span v-if="subitem.mini">
                                        <span v-for="mini in subitem.miniitems" :key="mini">
                                            <v-list-item router link :to="mini.routes">
                                                <!-- don't remove this -->
                                                <v-list-item-icon>
                                                    <!-- <v-icon>{{ mini.name }}</v-icon> -->
                                                </v-list-item-icon>
                                                <v-list-item-title v-text="mini.title"></v-list-item-title>
                                            </v-list-item>
                                        </span>
                                    </span>
                                </v-list-group>
                            </span>
                            <span v-else>
                                <v-list-item sub-group router link :to="subitem.routes">
                                    <v-list-item-content>
                                        <v-list-item-title v-text="subitem.title" style="margin-left: 57px;">
                                        </v-list-item-title>
                                    </v-list-item-content>
                                </v-list-item>
                            </span>
                        </span>
                    </v-list-group>
                </span>
                <span v-else>
                    <v-list-item router link :to="navitem.routes">
                        <v-list-item-icon>
                            <v-icon>{{ navitem.icon }}</v-icon>
                        </v-list-item-icon>
                        <v-list-item-title>{{ navitem.title }}</v-list-item-title>
                    </v-list-item>
                </span>
            </span>
        </v-list>
        <v-divider></v-divider>
    </v-navigation-drawer>

со следующими данными ....

navitems: [{
                    icon: 'dashboard',
                    title: 'Dashboard',
                    subtitle: 'Pages',
                    active: false,
                    subitem: true,
                    routes: '',
                    subitems: [{
                        title: 'Default',
                        active: true,
                        mini: true,
                        routes: '/',
                    }, {
                        title: 'Analytics',
                        active: true,
                        routes: '/dashboardanalytics',
                    }, {
                        title: 'Ecommerce',
                        active: true,
                        routes: '/dashboardecommerce',
                    }, {
                        title: 'Social',
                        active: true,
                        routes: '/dashboardsocial',
                    }, {
                        title: 'Crypto',
                        active: true,
                        routes: '/dashboardcrypto',
                    }]
                }, {
                    icon: 'library_books',
                    title: 'Pages',
                    active: false,
                    subitem: true,
                    subitems: [{
                        title: 'Profile',
                        routes: '/profile'
                    }, {
                        title: 'Settings',
                        routes: '/settings'
                    }, {
                        title: 'Clients',
                        routes: '/clients'
                    }, {
                        title: 'Projects',
                        active: true,
                        routes: '',
                        mini: true,
                        miniitems: [{
                            title: 'List',
                            routes: '/list'
                        }, {
                            title: 'Detail',
                            routes: '/detail'
                        }]

                    }, {
                        title: 'Invoice',
                        active: true,
                        routes: '/invoice'
                    }, {
                        title: 'Pricing',
                        active: true,
                        routes: '/pricing'
                    }, {
                        title: 'Tasks',
                        active: true,
                        routes: '/tasks'
                    }, {
                        title: 'Chat',
                        active: true,
                        routes: '/chat'
                    }, {
                        title: 'Blank Page',
                        active: true,
                        routes: '/blank-page'
                    }]
                }, {
                    icon: 'group',
                    title: 'Auth',
                    active: false,
                    subitem: true,
                    routes: '',
                    subitems: [{
                            title: 'Sign In',
                            routes: '/signin',
                            active: true
                        },
                        {
                            title: 'Sign Up',
                            routes: '/signup',
                            active: true
                        },
                        {
                            title: 'Reset Password',
                            routes: '/reset-password',
                            active: true
                        },
                        {
                            title: '404 Page',
                            routes: '/404',
                            active: true
                        },
                        {
                            title: '500 Page',
                            routes: '/500',
                            active: true
                        },
                    ],
                }, {
                    icon: 'import_contacts',
                    title: 'Documentation',
                    active: false,
                    subitem: true,
                    subitems: [{
                            title: 'Introduction',
                            routes: '/introduction',
                        },
                        {
                            title: 'Getting Started',
                            routes: '/getting-started',
                        }, {
                            title: 'Plugins',
                            routes: '/plugins'
                        }, {
                            title: 'Changelog',
                            routes: '/changelog'
                        }
                    ],
                }, {
                    icon: 'layers',
                    title: 'UI Elements',
                    subtitle: 'Tool & Components',
                    subitem: true,
                    active: false,
                    subitems: [{
                        title: 'Alerts',
                        routes: '/alerts'
                    }, {
                        title: 'Buttons',
                        routes: '/buttons'
                    }, {
                        title: 'Cards',
                        routes: '/cards'
                    }, {
                        title: 'Carousel',
                        routes: '/carousel'
                    }, {
                        title: 'Embed Video',
                        routes: '/embed-video'
                    }, {
                        title: 'General',
                        routes: '/general'
                    }, {
                        title: 'Grid',
                        routes: '/grid'
                    }, {
                        title: 'Modals',
                        routes: '/modals'
                    }, {
                        title: 'Tabs',
                        routes: '/tabs'
                    }, {
                        title: 'Typography',
                        routes: '/typography'
                    }]
                }, {
                    icon: 'favorite',
                    title: 'Icons',
                    subitem: true,
                    active: false,
                    subitems: [{
                        title: 'Matrial Design Icon',
                        routes: '/mtd'
                    }, {
                        title: 'Font Awesome 5',
                        routes: '/FA5'
                    }]
                }, {
                    icon: 'done',
                    title: 'Forms',
                    subitem: true,
                    active: false,
                    subitems: [{
                        title: 'Layouts',
                        routes: '/layouts'
                    }, {
                        title: 'Basic Inputs',
                        routes: '/basic-inputs'
                    }, {
                        title: 'Input Groups',
                        routes: '/input-groups'
                    }]
                }, {
                    icon: 'table_chart',
                    title: 'Tables',
                    routes: '/table'
                }, {
                    icon: 'check_box',
                    title: 'Form Plugins',
                    subtitle: 'Plugin & Addons',
                    subitem: true,
                    active: false,
                    subitems: [{
                        title: 'Advanced Inputs',
                        routes: '/advanced-inputs'
                    }, {
                        title: 'Editors',
                        routes: '/editors'
                    }, {
                        title: 'Validation',
                        routes: '/validation'
                    }, {
                        title: 'Wizard',
                        routes: '/wizard'
                    }]
                }]

Я хочу использовать i18n для отображения видимого текста (заголовок, текст) для интернационализации .... но в настоящее время я не могу помочь ... Я использую i18n.js

const messages = {
    'us': {
        dashboard: 'Dashboard',
        profile: 'Profile',
        analytics: 'Analytics',
        settings: 'Settings',
        help: 'Help',
        signout: 'Sign Out',
    },
    'np': {
        dashboard: 'ड्यासबोर्ड',
        profile: 'प्रोफाइल',
        analytics: 'विश्लेषण',
        settings: 'सेटिंग्स',
        help: 'मद्दत',
        signout: 'साइन आउट गर्नुहोस्',
    }
};

const i18n = new VueI18n({
    locale: 'us', // set locale
    fallbackLocale: 'np', // set fallback locale
    messages, // set locale messages
});

export default i18n;

Я знаю, что на данный момент это только информационная панель из данных, но я не понимаю, что я могу сделать, чтобы перевести заголовок и текст ... Я пробовал {{$ t ('navitem.subtitle')}}, но НЕ ДУМАЙ это сработает ... Я пробовал другие способы, но не работает ....


person Saroj poudel    schedule 26.04.2020    source источник


Ответы (1)


Я реализовал Vuetify <navigation-drawer>, который загружает маршруты из Vue Router и транслирует их с помощью Vue i18n в этом коде. Я не реализовал все ваши маршруты, но этого должно быть достаточно, чтобы вы начали.

Вот мои переводы i18n. (Пожалуйста, простите меня, если я неправильно понял некоторые из непальских! Я использовал Google Translate.) Главное, что следует отметить, это то, что я использовал 'en' вместо 'us' для языка. Хотя 'en-us' может быть допустимым языковым кодом, я не уверен, верен ли только 'us'.

const i18n = new VueI18n({
  locale: 'en',
  fallbackLocale: 'np',
  messages: {
    'en': {
      analytics: 'Analytics',
      dashboard: 'Dashboard',
      detail: 'Detail',
      ecommerce: 'E-Commerce',
      list: 'List',
      pages: 'Pages',
      profile: 'Profile',
      projects: 'Projects',
      'select-language': 'Select language',
      settings: 'Settings',
    },
    'np': {
      analytics: 'विश्लेषण',
      dashboard: 'ड्यासबोर्ड',
      detail: 'विवरण',
      ecommerce: 'e- वाणिज्य',
      list: 'सूची',
      pages: 'पृष्ठहरु',
      profile: 'प्रोफाइल',
      projects: 'प्रोजेक्टहरू',
      'select-language': 'भाषा छनोट गर्नुस',
      settings: 'सेटिंग्स',
    }
  }
})

Далее, вот элементы навигации, реализованные как экземпляр Vue Router. Обратите внимание, что я НЕ включал свойство component для каждого маршрута, но вам нужно будет сделать это в собственном приложении. Также обратите внимание, что для свойства icon я использовал значки материального дизайна, которые встроены в Vuetify.

const router = new VueRouter({
  routes: [
    {
      name: 'dashboard',
      path: '/dashboard',
      meta: {
        icon: 'mdi-view-dashboard',
      },
      children: [
        {
          name: 'analytics',
          path: '/analytics',
          meta: {
            icon: 'mdi-finance',
          },
        },
        {
          name: 'ecommerce',
          path: '/ecommerce',
          meta: {
            icon: 'mdi-store',
          },
        },
      ],
    },
    {
      name: 'pages',
      path: '/pages',
      meta: {
        icon: 'mdi-book-open-variant',
      },
      children: [
        {
          name: 'settings',
          path: '/settings',
          meta: {
            icon: 'mdi-cogs',
          },
        },
        {
          name: 'projects',
          path: '/projects',
          meta: {
            icon: 'mdi-briefcase',
          },
          children: [
            {
              name: 'list',
              path: '/list',
              meta: {
                icon: 'mdi-format-list-bulleted',
              }
            },
            {
              name: 'detail',
              path: '/detail/:id',
              meta: {
                icon: 'mdi-file-document',
              }
            },
          ],
        },
      ],
    },
    {
      name: 'profile',
      path: '/profile',
      meta: {
        icon: 'mdi-account-circle',
      },
    },
  ],
})

Чтобы включить их в свое приложение, ваш основной экземпляр Vue должен быть создан примерно так:

new Vue({
  vuetify: new Vuetify(),
  i18n,
  router,
  render: h => h(App),
}).$mount('#app')

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

<v-navigation-drawer permanent>
  <v-toolbar color="primary" dark prominent>
    <v-toolbar-title>
    <p class="overline">{{ $t('select-language') }}:</p>
      <v-radio-group
        v-model="$i18n.locale"
        :mandatory="true"
      >
        <v-radio label="नेपाल" value="np"></v-radio>
        <v-radio label="English" value="en"></v-radio>
      </v-radio-group>
    </v-toolbar-title>
  </v-toolbar>
  <v-list dense expand nav>
    <template v-for="route in $router.options.routes">
      <v-list-item
        v-if="!route.children"
        color="primary"
        :key="route.name"
        :to="route.path"
      >
        <v-list-item-icon>
          <v-icon>{{ route.meta.icon }}</v-icon>
        </v-list-item-icon>
        <v-list-item-title>{{ $t(route.name) }}</v-list-item-title>
      </v-list-item>
      <v-list-group
        v-else
        :group="route.path"
        color="primary"
      >
        <template #activator>
          <v-list-item-icon>
            <v-icon>{{ route.meta.icon }}</v-icon>
          </v-list-item-icon>
          <v-list-item-title>
            {{ $t(route.name) }}
          </v-list-item-title>
        </template>
        <template v-for="child in route.children">
          <v-list-item
            v-if="!child.children"
            :key="child.name"
            :to="route.path + child.path"
          >
            <v-list-item-icon>
              <v-icon v-text="child.meta.icon" />
            </v-list-item-icon>
            <v-list-item-title>
              {{ $t(child.name) }}
            </v-list-item-title>
          </v-list-item>
          <v-list-group
            v-else
            color="primary"
            :group="child.path"
            sub-group
          >
            <template #activator>
              <v-list-item-content>
                <v-list-item-title>
                  <v-icon>{{ child.meta.icon }}</v-icon>
                  {{ $t(child.name) }}
                </v-list-item-title>
              </v-list-item-content>
            </template>
            <template v-for="grandchild in child.children">
              <v-list-item
                :key="grandchild.name"
                color="primary"
                :to="route.path + child.path + grandchild.path"
              >
                <v-list-item-title>{{ $t(grandchild.name) }}</v-list-item-title>
                <v-list-item-icon>
                  <v-icon>{{ grandchild.meta.icon }}</v-icon>
                </v-list-item-icon>
              </v-list-item>
            </template>
          </v-list-group>
        </template>
      </v-list-group>
    </template>
  </v-list>
</v-navigation-drawer>

Надеюсь это поможет!

person morphatic    schedule 26.04.2020
comment
Спасибо за ответ .. буду работать над этим .. приятно прикоснуться, используя непальский язык ... :) - person Saroj poudel; 27.04.2020