vue.js前端开发基础与项目实战,前端开发语言vue

  vue.js前端开发基础与项目实战,前端开发语言vue

  前端国际化是一个常见的需求,但是互联网上直接可用的解决方案并不多。本文主要介绍Vue.js项目前端多语言解决方案的思路和做法,有需要的可以参考。

  :

目录

   1.需要处理哪些内容?2.基本思路?3.具体实践中的一些细节?1.getLang模块的实现获取目前应该使用哪种语言?2.Vux组件的多语言包配置?3.vux-loader的配置?复制内部和外部自定义组件的多语言性?5.vuex-i18n的实现?6.图片多语言化?7.通过按钮在当前页面上切换当前语言后。8.Yaml中特殊字符的转义和汇总。前端国际化是普遍要求。然而,这方面的在线程序并不多。最近做了一个基于Vue.js的多语言实现,下面简单总结一下。

  

一、通常有哪些内容需要处理

  一般来说,在Web应用中,需要进行语言间切换的内容通常包括以下几个方面:

  1.模板中的内容,比如Vue.js的模板标签中的文本内容

  2.JS代码中的文本内容

  3.图片中的文案内容

  4.页面标题

  5.第三方组件中的文案(例如,我在我的项目中使用了Vux组件)

  6.要在后端界面中显示到前端的数据内容。

  7.后端接口返回错误提示

  

二、基本思路

  1、首先,需要确定以什么样的方式来获取到当前应该展示何种语言

  我用的是URL投递?Lang=en还是?Lang=zh-CN作为传递参数。这样做的好处是您可以通过链接指定使用哪种语言。但是,仅仅依靠地址栏参数是不方便的。比如页面跳转时,这个地址栏参数可能会丢失。这将导致您不知道在页面跳转后显示哪种语言。最理想的方式应该是用这个参数进入一个页面(这个时候你就知道用哪种语言了),跳转到其他页面的时候不需要带这个lang参数,因为你已经知道用哪种语言了。因此,您应该在进入第一页后立即保存该参数,例如,在localstorage和vuex状态下。

  这里介绍一个语言判断的优先级问题。

  因为地址栏里可能有lang参数,localstorage里也可能有相关的存储字段(因为我上次访问过这个应用),你可能也想设置默认的降级语言,等等。应该如何处理它的优先级?

  的正确优先级应该是:

  先看看地址栏有没有参数;

  看看localstorage里有没有;

  然后通过navigator.language获取浏览器默认语言,看看是不是你的应用支持的语言,如果是,就采用;

  最后,使用备用语言(例如,通用英语)。

  当然,你可以根据需要做一些简化。

  2、其次,采用什么工具来解决语言转换和打包的问题?

  (1)选择1)i18n相关工具3354谁来提供多语言转换功能(一般是$t)?

  目前国际上大多数方法都是基于i18n的,我们不用再造轮子了。然而,对于i18n的特定用途,有许多不同的NPM模块。如vuex-i18n、vue-i18n、simplest-i18n等。因为大部分复杂的项目都会去vuex,所以复杂的项目选择vuex-i18n比vue-i18n更方便。

  而最简单的——i18n,一个很小的模块,其实也有它的优势。它支持以下写法:

  在模板中:

  Span$t(真实姓名,真实姓名)/span

  或者在JS中:

  这个。$t(实名,实名)

  语言会写在一起,$t函数的每个参数都是一种语言,一目了然。这是小型项目的一个选择。

  其基本用途如下:

  T.js文件:

  从“simplest-i18n”导入i18n;

  从导入getLang././get lang ;

  const t=i18n({

  区域设置:getLang.lang,//当前语言

  Locales: getLang.langs //支持的语言列表

  });

  导出默认t;

  然后在应用程序的入口文件中展开Vue.js:

  从导入t。/t ;

  Vue。$ t=Vue.prototype. $ t=t

  通过这种方式,方法$t被挂载到整个Vue.js世界中,Vue实例也可以通过它被访问。$t,用起来很简单。

  然而,对于大型项目,在代码中编写所有语言包对维护并不友好。而且也解决不了我用的Vux组件的多语言问题。

  所以,最终我选择了vuex-i18n作为基础。

  (2)组织和处理语言包的工具3354如何组织和打包语言包?

  对于这个问题,我首先需要解决Vux的第三方组件的多语言问题。

  首先,在语言包的组织中,编写JSON配置文件是很常见的。不过最后还是采用了Yaml的格式,支持多语种字段一起写。例如:

  config.yml

  确认:

  Zh-CN:确认

  请确认

  而不是像下面这样将一个领域的多种语言拆分成几个地方,例如:

  确认:确认

  确认:确认

  这样做的好处是,您可以轻松地比较一个字段的不同语言版本,当您想要修改或删除一个字段时,您可以在一个地方完成,无需切换。除此之外,Yaml文件的语法更加简单明了,省去了JSON文件必须写双引号、没有注释等诸多麻烦。

  其次,我在语言包的包装里发现了vux-loader。可以与现有的webpack配置结合,不仅可以封装Vux组件的多语言配置,还可以允许在自定义Vue组件中使用i18n标签。例如,在自定义组件中,我可以这样写:

  i18n

  确认:

  Zh-CN:确认

  请确认

  i18n

  打包时,vux-loader会将i18n标签中的多语言配置信息导出到我们配置的Yaml文件中,并从我们的定制组件中删除i18n标签。

  那么,Yaml文件呢?可以使用json-loader和yaml-loader。他们可以把Yaml文件转换成我们需要的json格式,方便在JS函数中使用,就像这样:

  const components locales=require( JSON-loader!yaml-loader!/./locales/components . yml );//这将获取语言包的json格式

  3、如何通知后端接口返回何种语言的数据?

  因为很多接口都要通知后端使用哪种语言,所以我选择了使用header。在axios的拦截器中,header: Accept-Language被统一添加到请求中,该值的内容被设置为语言(例如zh-CN或en等。)应该是前端用的。这样,问题就在一个地方处理了。

  

三、具体实践中的一些细节

  

1、获取当前应该采用何种语言的getLang模块的实现

  从导入{ getQueryObj }./utils/URL ;

  从导入{ setItem,getItem }./utils/storage ;

  const langs=[zh-CN , en ];//支持哪些语言?

  const defaultLang= en//默认语言,暂时没有抛出。

  函数getLang() {

  let query=getQueryObj();

  let store lang=getItem( lang );

  让罗郎;

  设flag=false

  if(查询查询[lang]) {

  rawLang=queries[ lang ];

  setItem(lang ,rawLang);

  }否则{

  raw lang=store lang navigator . language;

  }

  langs.map(item={

  if (item===rawLang) {

  flag=true

  }

  });

  返回标志?罗朗:defaultLang

  }

  const lang=getLang(langs,default lang);

  导出默认值{

  Lang,//获取当前语言

  Langs //支持的语言列表

  }

  

2、Vux组件的多语言包的配置

  你可以从Vux的官方github找到src/locales/all.yml并复制(同一目录下的src/locales/zh-CN.yml和src/locales/en.yml分别是其中文和英文部分)。根据自己的需求稍微修改一下就可以了。

  然后在应用程序的门户文件中引入:

  const vuxLocales=require( JSON-loader!yaml-loader!/./locales/all . yml );

  

3、vux-loader的配置

  在webpack.dev.conf.js中:

  resolve(vuxloader . merge(devWebpackConfig,{

  插件_目录:[

  vux-ui ,

  {

  名称: i18n ,

  vuxStaticReplace: false,

  staticReplace: false,

  extractToFiles: src/locales/components . yml ,

  localeList: [en , zh-CN]

  }

  ]

  }))

  在webpack.prod.conf.js中:

  resolve(vuxloader . merge(buildWebpackConfig,{

  插件_目录:[

  vux-ui ,

  {

  名称: i18n ,

  vuxStaticReplace: false,

  staticReplace: false,

  extractToFiles: src/locales/components . yml ,

  localeList: [en , zh-CN]

  }

  ]

  }))

  localeList: [en , zh-CN]指定您的应用程序支持哪些语言。

  并提取到文件:“src/locales/components.yml”是指定在定制组件中使用的那些i18n标记中的语言包信息,应该将Yaml文件导出到该文件。也就是说,您在每个定制组件中使用的i18n标签中的语言包信息将被vux-loader集中提取到这个文件中。

  然后将这个语言包文件引入应用程序的入口文件:

  const components locales=require( JSON-loader!yaml-loader!/./locales/components . yml );

  

4、自定义组件内外文案的多语言化

  (1)对于自定义组件内部副本的多语言信息,只需写在组件的i18n标签中即可。同时,为了避免不同自定义组件中多语言字段的命名冲突,在每个字段的名称前加上组件名称-类型。

  (2)对于页面标题、一些错误提示等文案,它们出现在组件之外,所以不适合写在组件的i18n标签中。因此,我们单独创建一个新的global.yml来存储这些全球多语言信息。这些内容可以直接写在global.yml中,为了不与其他语言包字段冲突,我们在每个字段前加了global-。

  然后将这个语言包文件引入应用程序的入口文件:

  const components locales=require( JSON-loader!yaml-loader!/./locales/global . yml );

  

5、vuex-i18n的实现

  在src/store/index.js文件中:

  从“vuex-i18n”导入VuexI18n

  在导出默认新Vuex中添加。商店:

  i18n: VuexI18n.store

  在应用程序的门户文件中:

  从“vuex-i18n”导入VuexI18n

  从导入getLang././get lang ;

  Vue.use(VuexI18n.plugin,store);

  const vuxLocales=require( JSON-loader!yaml-loader!/./locales/all . yml );

  const components locales=require( JSON-loader!yaml-loader!/./locales/components . yml );

  常量最终位置={

   en :object . assign(vuxLocales[ en ],componentsLocales[en]),

   zh-CN :object . assign(vuxLocales[ zh-CN ],componentsLocales[zh-CN])

  }

  for (let i in finalLocales) {

  Vue.i18n.add(i,finalLocales[i])

  }

  vue . i18n . set(global vars . lang);

  

6、图片的多语言化

  图片中的文案信息多语言化主要有两种方式:一种是根据不同的语言显示不同的图片;二是尽可能将文字与图片背景分离,采用文字层和背景图片层的方式,使文字层可以作为普通文字使用,实现多语种。都比较简单,这里就不赘述了。

  

7、在当前页面通过按钮切换当前语言后,如何更新当前页面的内容?

  如果你的应用不需要在页面内切换语言版本,直接通过URL输入不同的lang参数就可以了,不涉及这个问题。

  第一种方法:刷新页面。

  按钮@ click= changelang (zh-cn )中文/按钮

  Button @click=changeLang(en )英语/button

  changeLang(lang){

  location.href=this。$utils.url.replaceParam(this。$router.history.current.path, lang ,lang);

  },

  第二种方式:观察当前页面数据中lang字段的变化,通过v-if在本地刷新一些相关组件:

  data(){

  返回{

  郎:这个。$i18n.locale()

  }

  }

  changeLang(lang){

  这个。$ i18n . set(lang);

  this.lang=this。$ i18n . locale();

  },

  观察:{

  lang(新瓦尔,旧瓦尔){

  if(newVal===oldVal) {

  返回;

  }

  //在这里,通过结合v-if改变标志位来触发本地组件的重新呈现。

  }

  }

  第三种方式:结合vuex分发全局语言状态,收到状态变化时更新,或者干脆自己重写vuex-i18n的实现。这种方式比较复杂。

  根据自己的业务需求选择。

  

8、Yaml中特殊字符的转义

  一些yaml键值包含特殊字符,如[,]等。需要逃。转的方法是给键值加单引号。

  如果您的语言包信息中有单引号,则必须使用两个单引号进行转义。例如:

  str:“劳动节”

  

总结

  关于Vue.js项目前端多语言解决方案的思路和实践这篇文章到此为止。更多Vue.js相关前端多语言内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: