html 语言国际化,前端通用国际化解决方案

文章首发于个人blog,欢迎大家关注。

DI18n

前端通用国际化解决方案

背景

前端技术日新月异,技术栈繁多。以前端框架来说有React, Vue, Angular等等,再配以webpack, gulp, Browserify, fis等等构建工具去满足日常的开发工作。同时在日常的工作当中,不同的项目使用的技术栈也会不一样。当需要对部分项目进行国际化改造时,由于技术栈的差异,这时你需要去寻找和当前项目使用的技术栈相匹配的国际化的插件工具。比如:

vue + vue-i18n

angular + angular-translate

react + react-intl

jquery + jquery.i18n.property

等等,同时可能有些页面没有使用框架,或者完全是没有进行工程化的静态前端页面。

为了减少由于不同技术栈所带来的学习相关国际化插件的成本及开发过程中可能遇到的国际化坑,在尝试着分析前端国际化所面临的主要问题及相关的解决方案后,我觉得是可以使用更加通用的技术方案去完成国际化的工作。

国际化所面临的问题

1.语言翻译

静态文案翻译(前端静态模板文案)

动态文案翻译(server端下发的动态数据)

2.样式

不同语言文案长度不一样造成的样式错乱

图片的替换

3.map表维护

4.第三方服务

SDK

5.本地化

货币单位

货币汇率

时间格式

6.打包方案

运行时

编译后

解决方案

在日常的开发过程当中,遇到的最多的需要国际化的场景是:语言翻译,样式,map表维护及打包方案。接下来针对这几块内容并结合日常的开发流程说明国际化的通用解决方案。

首先来看下当前开发环境可能用的技术栈:

1.使用了构建工具

webpack

gulp

fis

browserify

...

基于这些构建工具,使用:

Vue

Angular

React

Backbone

...

未使用任何framework

2.未使用构建工具

使用了jquery或zepto等类库

原生js

其中在第一种开发流程当中,可用的国际化的工具可选方案较多:

从框架层面来看,各大框架都会有相对应的国际化插件,例如:vue-i18n, angular-translate, react-intl等,这些插件可以无缝接入当前的开发环节当中。优点是这些框架层面的国际化插件使用灵活,可以进行静态文案的翻译,动态文案的翻译。缺点就是开发过程中使用不同的框架还需要去学习相对应的插件,存在一定的学习成本,同时在业务代码中可能存在不同语言包判断逻辑。

从构建工具层面来看, webpack有相对应的i18n-webpack-plugin, gulp有gulp-static-i18n等相应的插件。这些插件的套路一般都是在你自定义map语言映射表,同时根据插件定义好的需要被编译的代码格式,然后在代码的编译阶段,通过字符串匹配的形式去完成静态文案的替换工作。这些插件仅仅解决了静态文案的问题,比如一些样式,图片替换,class属性,以及动态文案的翻译等工作并没有做。

事实上,这些插件在编译过程中对于样式,图片替换, class属性等替换工作是非常容易完成的,而动态文案的翻译因为缺少context,所以不会选择使用这些编译插件去完成动态文案的翻译工作。相反,将动态文案的翻译放到运行时去完成应该是更加靠谱的。

但是换个角度,抛开基于这些构建工具进行开发的框架来说,构建工具层面的国际化插件可以很好的抹平使用不同框架的差异,通过将国际化的过程从运行时转到编译时,在编译的过程中就完成大部分的国际化任务,降低学习相对应国际化插件的成本,同时在构建打包环节可实现定制化。不过也存在一定的缺点,就是这些构建工具层面的国际化插件只能完成一些基本的静态文案的翻译,因为缺少context,并不能很好的去完成动态文案的翻译工作,它比较适用于一些纯静态,偏展示性的网页。

在第二种开发流程当中,可使用的国际化工具较少,大多都会搭配jquery这些类库及相对应的jquery.i18n或i18next等插件去完成国际化。

综合不同的构建工具,开发框架及类库,针对不同的开发环境似乎是可以找到一个比较通用的国际化的方案的。

这个方案的大致思路就是:通过构建工具去完成样式, 图片替换, class属性等的替换工作,在业务代码中不会出现过多的因国际化而多出的变量名,同时使用一个通用的翻译函数去完成静态文案及动态文案的翻译工作,而不用使用不同框架提供的相应的国际化插件。简单点来说就是:

依据你使用的构建工具 + 一个通用的翻译函数去完成前端国际化

首先,这个通用的语言翻译函数: di18n-translate。它所提供的功能就是静态和动态文案的翻译, 不依赖开发框架及构建工具。

npm install di18n-translate

// 模块化写法

const LOCALE = 'en'

const DI18n = require('di18n-translate')

const di18n = new DI18n({

locale: LOCALE, // 语言环境

isReplace: false, // 是否开始运行时(适用于没有使用任何构建工具开发流程)

messages: { // 语言映射表

en: {

你好: 'Hello, {person}'

},

zh: {

你好: '你好, {person}'

}

}

})

di18n继承于一个翻译类,提供了2个方法`$t`, `$html`:

di18n.$t('你好', {person: 'xl'}) // 输出: Hello, xl

di18n.$html(htmlTemp) // 传入字符串拼接的dom, 返回匹配后的字符串,具体示例可见下文

// 外链形式

const LOCALE = 'en'

const di18n = new DI18n({

locale: LOCALE,

isReplace: false,

messages: {

// 语言包

}

})

这个时候你只需要将这个通用的翻译函数以适当的方式集成到你的开发框架当中去。

接下来会结合具体的不同场景去说明下相应的解决方案:

使用MVVM类的framework

使用了MVVM类的framework时,可以借助framework帮你完成view层的渲染工作, 那么你可以在代码当中轻松的通过代码去控制class的内容, 以及不同语言环境下的图片替换工作.

例如vue, 示例(1):

main.js文件:

window.LOCALE = 'en'

app.vue文件:

:class="locale" // locale这个变量去控制class的内容

:style="{backgroundImage: 'url(' + bgImg + ')'}" // bgImg去控制背景图片的路径

>

// imgSrc去控制图片路径

export default {

name: 'page',

data () {

return {

locale: LOCALE,

imgSrc: require(`./${LOCALE}/img/demo.png`),

bgImg: require(`./${LOCALE}/img/demo.png`)

}

}

}

这个时候你再加入翻译函数,就可以满足大部分的国际化的场景了,现在在main.js中添加对翻译函数di18n-translate的引用:

main.js文件:

import Vue from 'vue'

window.LOCALE = 'en'

const DI18n = require('di18n-translate')

const di18n = new DI18n({

locale: LOCALE, // 语言环境

isReplace: false, // 是否进行替换(适用于没有使用任何构建工具开发流程)

messages: { // 语言映射表

en: {

你好: 'Hello, {person}'

},

zh: {

你好: '你好, {person}'

}

}

})

Vue.prototype.d18n = di18n

翻译函数的基本使用, 当然你还可以使用其他的方式集成到你的开发环境当中去:

app.vue文件:

:class="locale" // locale这个变量去控制class的内容

:style="{backgroundImage: 'url(' + bgImg + ')'}" // bgImg去控制背景图片的路径

>

// imgSrc去控制图片路径

{{title}}

export default {

name: 'page',

data () {

return {

locale: LOCALE,

imgSrc: require(`./${LOCALE}/img/demo.png`),

bgImg: require(`./${LOCALE}/img/demo.png`),

title: this.di18n.$t('你好')

}

}

}

使用mvvm framework进行国际化,上述方式应该是较为合适的,主要是借助了framework帮你完成view层的渲染工作, 然后再引入一个翻译函数去完成一些动态文案的翻译工作

这种国际化的方式算是运行时处理,不管是开发还是最终上线都只需要一份代码。

当然在使用mvvm framework的情况下也是可以不借助framework帮我们完成的view层的这部分的功能,而通过构建工具去完成, 这部分的套路可以参见下午的示例3

未使用mvvm框架,使用了构建工具(如webpack/gulp/browserify/fis)

使用了前端模板

国际化的方式和上面说的使用mvvm框架的方式一致,因为有模板引擎帮你完成了view层的渲染.所以对于样式,图片,class属性的处理可以和上述方式一致, 动态文案的翻译需引入翻译函数。

这种国际化的方式也算是运行时处理,开发和最终上线都只需要一份代码。

没有使用前端模板

因为没用使用前端模板,便少了对于view层的处理。这个时候你的DOM结构可能是在html文件中一开始就定义好的了,也可能是借助于webpack这样能允许你使用模块化进行开发,通过js动态插入DOM的方式。

接下来我们先说说没有借助webpack这样允许你进行模块化开发的构建工具,DOM结构直接是在html文件中写死的项目。这种情况下你失去了对view层渲染能力。那么这种情况下有2种方式去处理这种情况。

第一种方式就是可以在你自己的代码中添加运行时的代码。大致的思路就是在DOM层面添加属性,这些属性及你需要翻译的map表所对应的key值:

示例(2):

html文件:

运行时:

const LOCALE = 'en'

const di18n = new DI18n({

locale: LOCALE,

isReplace: true, // 开启运行时

messages: {

en: {

你好: 'Hello'

},

zh: {

你好: '你好'

}

}

})

最后html会转化为:

test.png

Hello

第二种方式就是借助于构建工具在代码编译的环节就完成国际化的工作,以webpack为例:

示例(3):

html文件:

test.png

$t('你好')

这个时候使用了一个webpack的preloader: locale-path-loader,它的作用就是在编译编译前,就通过webpack完成语言环境的配置工作,在你的业务代码中不会出现过多的关于语言环境变量以及很好的解决了运行时作为css的background的图片替换工作, 具体的locale-path-loader的文档请戳我

使用方法:

npm install locale-path-loader

webpack 1.x 配置:

module.exports = {

....

preLoaders: [

{

test: /\.*$/,

exclude: /node_modules/,

loaders: [

'eslint',

'locale-path?outputDir=./src/common&locale=en&inline=true'

]

}

]

....

}

webpack 2 配置:

module.exports = {

....

module: {

rules: [{

test: /\.*$/,

enforce: 'pre',

exclude: /node_modules/,

use: [{

loader: 'locale-path-loader',

options: {

locale: 'en',

outputDir: './src/common',

inline: true

}

}]

}]

}

....

}

经过webpack的preloader处理后,被插入到页面中的DOM最后成为:

test.png

Hello

但是使用这种方案需要在最后的打包环节做下处理,因为通过preloader的处理,页面已经被翻译成相对应的语言版本了,所以需要通过构建工具以及改变preloader的参数去输出不同的语言版本文件。当然构建工具不止webpack这一种,不过这种方式处理的思路是一致的。

这种方式属于编译时处理,开发时只需要维护一份代码,但是最后输出的时候会输出不同语言包的代码。当然这个方案还需要服务端的支持,根据不同语言环境请求,返回相对应的入口文件。关于这里使用webpack搭配locale-path-loader进行分包的内容可参见vue-demo:

|--deploy

| |

| |---en

| | |--app.js

| | |--vendor.js

| | |--index.html

| |---zh

| | |--app.js

| | |--vendor.js

| | |--index.html

| |---jp

| | |--app.js

| | |--vendor.js

| | |--index.html

| |----lang.json

接下来继续说下借助构建工具进行模块化开发的项目, 这些项目可能最后页面上的DOM都是通过js去动态插入到页面当中的。那么,很显然,可以在DOM被插入到页面前即可以完成静态文案翻译,样式, 图片替换, class属性等替换的工作。

示例(4):

html文件:

test.png

$t('你好')

js文件:

let tpl = require('html!./index.html')

let wrapper = document.querySelector('.box-wrapper')

// di18n.$html方法即对你所加载的html字符串进行replace,最后相对应的语言版本

wrapper.innerHTML = di18n.$html(tpl)

最后插入到的页面当中的DOM为:

test.png

Hello

这个时候动态翻译再借助引入的di18n上的$t方法

di18n.$t('你好')

这种开发方式也属于运行时处理,开发和上线后只需要维护一份代码。

没有使用任何framework及构建工具的纯静态,偏展示性的网页

这类网页的国际化,可以用上面提到的通过在代码中注入运行时来完成基本的国际化的工作, 具体内容可以参见示例(2)以及仓库中的html-demo文件夹。

语言包map表的维护

建议将语言包单独新建文件维护,通过异步加载的方式去获取语言包.

项目地址(如果觉得文章不错,请不要吝啬你的star~~)

最后需要感谢 @kenberkeley 同学,之前和他有过几次关于国际化的探讨,同时关于编译时这块的内容,他的有篇文章(请戳我)也给了我一些比较好的思路。

基于JavaScript纯前端的国际化解决方案 前言 本文讨论了基于纯前端的国际化多语言的解决方案,不依赖于任何后台技术。即只用HTML + JavaScript来实现国际化的方案。该方案参考了FCKEditor的实现机制,其实很多富文本编辑器都采用了类似的思路。 实现方式 1. 将各国语言翻译好之后放在一个js文件里以JSON格式保存,或者每个语言一个js文件也可以,比如zh-CN.js,en-US.js等。2. 将所有需要翻译的文 阅读详情

相关推荐

【高频考点精讲】前端国际化(i18n)解决方案,从语言包到日期格式处理

大家好,我是全栈老李。今天咱们聊聊前端国际化(i18n)这个事儿。你可能觉得国际化不就是翻译文字吗?其实远不止如此。从语言包管理到日期、货币、数字的本地化处理,再到RTL(从右到左)语言的支持,这里头的门道可不少。

全栈老李的博客 1462

HTML——国际化实现

代码】HTML——国际化实现。

qq812457115的博客 3903

HTML 和 CSS3 的国际化支持

通过使用 lang 属性和 CSS 的伪类和属性选择器,开发人员可以根据不同的语言和文化需求定制页面的样式和内容。除了伪类 :lang,CSS3 还提供了其他一些伪类和属性选择器,例如 :first-letter、:first-line 和 [lang=“en”],它们可以根据元素的内容和属性选择器来应用样式。在这个示例中,根据 h1 元素的 lang 属性的不同,应用了不同的颜色样式。当 lang 属性为 “en” 时,标题的颜色为蓝色,当 lang 属性为 “zh” 时,标题的颜色为红色。

JcSass的博客 711

基于jQuery.i18n.properties 实现前端页面的资源国际化

jQuery.i18n.properties是一款轻量级的jQuery国际化插件,能实现Web前端的国际化。 国际化英文单词为:Internationalization,又称i18n,“i”为单词的第一个字母,“18”为“i”和“n”之间单词的个数,而“n”代表这个单词的最后一个字母。jQuery.i18n.properties采用.properties文件对JavaScript进行国际化。jQuery.i18n.p

哎_小羊的博客 6万+

前端国际化:全面实现多语言Web应用

i18next是一个功能强大的国际化库,支持浏览器和服务器端的多语言应用。它通过插件系统提供了丰富的扩展能力,支持多种资源文件格式,如JSON、YAML等,并且社区活跃,拥有大量的翻译适配器和后端服务。i18next的核心特点包括:灵活性高:可以高度自定义翻译的加载和使用方式。可扩展性:通过插件可以增强库的功能,例如添加缓存、调试等。语言资源可分离:资源文件可以独立于代码,便于翻译人员处理。支持SSR。

weixin_33582089的博客 1642

html多语言切换demo 多语言翻译 js多语言插件

html多语言切换demo,直接双击,保证可用,翻译反应迅速,不像别的插件,如i18n国际化插件,翻译卡半天,文件里写了三种语言demo,哪怕是小白一看都明白。

html国际化插件,前端通用国际化解决方案

文章首发于个人blog,欢迎大家关注。DI18n前端通用国际化解决方案背景前端技术日新月异,技术栈繁多。以前端框架来说有React, Vue, Angular等等,再配以webpack, gulp, Browserify, fis等等构建工具去满足日常的开发工作。同时在日常的工作当中,不同的项目使用的技术栈也会不一样。当需要对部分项目进行国际化改造时,由于技术栈的差异,这时你需要去寻找和当前项目使...

weixin_35835508的博客 928

从STM32转战华大HC32F4A0:我的踩坑实录与10个USART的灵活配置心得

本文分享了从STM32迁移至华大HC32F4A0的实战经验,重点解析了10个USART的灵活配置技巧及常见问题解决方案。通过对比STM32F407,详细介绍了HC32F4A0在外设灵活性、IO功能组设计及多串口应用中的优势,帮助开发者快速掌握国产芯片的开发要点。

weixin_30514745的博客 524

html标签实现国际化,前端国际化

前言从10年接触编程就开始接触国际化这个概念,然而这些年全面用到国际化的项目并不是很多,且都是些螺丝钉式的工作。15年末,部门项目需要推国际化,前端这块由我来主导。虽然难度不高,但还是拿出来分享下。选择方式:目前了解到的前端国际化有以下两种方式:1、按语言种类分别开发前端界面:这种方式貌似给人一种很low的感觉且觉着文件会无限多。然而在一般项目中语言种类并不会特别多,实现中英文两种即可满足大部分需...

weixin_39677419的博客 1071

FDTD材料nk值拟合优化指南:利用材料资源管理器提升光学模型精度

本文详细介绍了如何利用FDTD仿真软件中的材料资源管理器,对材料nk值进行精确拟合与优化,从而提升光学模型的仿真精度。文章通过实战案例,解析了拟合参数调整、报告解读以及针对varFDTD求解器的特殊注意事项,帮助用户从根本上解决仿真结果不准的常见问题。

weixin_29196891的博客 353

告别Quartus II的漫长等待:用VSCode+iverilog+GTKWave搭建你的轻量级Verilog仿真环境(2024保姆级教程)

本文详细介绍了如何利用VSCode、iverilog和GTKWave构建高效的Verilog/SystemVerilog开发环境,替代传统的Quartus II和ModelSim工具。通过2024年最新的保姆级教程,帮助开发者实现秒级启动、低资源消耗的轻量级仿真环境,显著提升数字电路设计的开发效率和调试体验。

weixin_33690963的博客 561

i18next html 国际化资源文件:实现前端多语言切换的利器

i18next html 国际化资源文件:实现前端多语言切换的利器 【下载地址】i18nexthtml国际化资源文件 这个开源项目展示了如何利用i18next和jquery-i18next实现HTML页面的国际化功能。它支持多语言切换,默认配置了中文和英文,并可通过简单扩展支持更多语言。项目使用`data-i18n`属性...

gitblog_06715的博客 400

NVIDIA GPU任务调度全景:从Block分配到Warp发射

GPU并行计算的核心是任务调度,而CUDA kernel在GPU上的执行并非简单的一次性操作,而是经过从CPU命令队列到硬件前端,再到GigaThread引擎和Warp Scheduler的多层协同。理解这一过程,是性能优化的基础。Warp作为硬件调度的基本单位,其状态切换与延迟隐藏能力直接决定计算单元的利用率;而Occupancy作为衡量SM上活跃Warp池大小的指标,也并非越高越好,需要结合访存模式与资源占用综合判断。对于多任务并发场景,Stream优先级、计算抢占、MIG硬件隔离与MPS软件共享等机制

weixin_32612263的博客 270

前端国际化(i18n)完整实现指南:从基础到自动语言切换

前端国际化(i18n)完整实现指南:从基础到自动语言切换

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 3295

MIPI CSI-2

来源:公众号瓜大三哥版权归三哥所有1 MIPI简介2 MIPI CSI-2简介2.1 MIPI CSI-2 的层次结构2.2 CSI-2协议层2.3 打包/解包层2.4 ...

OpenFPGA的博客 2113

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1154

前端国际化

前言 从10年接触编程就开始接触国际化这个概念,然而这些年全面用到国际化的项目并不是很多,且都是些螺丝钉式的工作。15年末,部门项目需要推国际化,前端这块由我来主导。虽然难度不高,但还是拿出来分享下。 选择方式: 目前了解到的前端国际化有以下两种方式: 1、按语言种类分别开发前端界面: 这种方式貌似给人一种很low的感觉且觉着文件会无限多。然而在一般项目中语言种类并不会特别多,实现中英文两...

永恒的避风港 2015

下拉式菜单设计——Power BI

Power BI导航设计:多级下拉菜单

weixin_41542593的博客 5434

前端利用 i18n 实现多语言切换

前端实现多语言切换 : 实现前端页面的资源国际化 一、vue 中引用 vue-i18n 实现国际化 安装 vue-i18n npm install vue-i18n 新建语言文件包: cn.js / en.js … cn.js export default { lang: 'cn', hello: '你好', } en.js export default { lang: 'en', hello: 'hello', } 新建一个 i18n.js 中引入 vue-i18n (前提是要.

在这个数字革命的时代,我们将引领您穿越去中心化、智能合约、加密货币以及分布式应用程序的世界。无论您是初学者还是经验丰富的区块链开发者,我们都致力于为您提供有价值的信息和见解。 5506

《备考系统分析师》 - 专栏介绍和目录

本专栏提供软考高级系统分析师全套备考资料,包含四大核心内容:1.详细考点梳理(覆盖基础知识、关键技术、案例实践三大模块16个章节);2.历年真题及解析(2009-2022年所有真题含综合知识、案例分析和论文);3.100+篇高质量论文范文;4.预测模拟题。早鸟价仅需9.9元,可节约80%资料搜集时间,帮助考生高效备考、顺利通过考试。专栏持续更新,有问题可随时联系作者。

数据知道的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

html国际化不显示,前端国际化解决方案“填坑日记”

原标题:前端国际化解决方案“填坑日记”来源:懒得安分http://www.cnblogs.com/landeanfen/p/7581609.html如果好文章投稿,点击 → 了解详情前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化。如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都有成熟的方案,比如...

weixin_42345868的博客 916

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

如何处理前端国际化和本地化?

如何处理前端国际化和本地化?

商务合作欢迎私信我 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jQuery国际化解决方案,jq多语言切换,jq国际化

jq项目国际化处理,无需刷新页面、修改链接后缀即可实现多种语言切换,切换效果拼图: JS所需JQ库(任意版本jquery、jquery.i18n.properties) // i18n翻译核心调用方法,完整见文章底部Github链接 var i18nLanguage = 'zh_CN'; jQuery.i18n.properties({ name : 'messages', //资源文...

zzppff的博客 3554

前端系列——jquery前端国际化解决方案“填坑日记”

正文  前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化。如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都有成熟的方案,比如: vue + vue-i18n angular + angular-translate react + react-intl 但现在的

词语大杂烩 1145

什么是前端国际化(internationalization)和本地化(localization)?

什么是前端国际化(internationalization)和本地化(localization)?

商务合作欢迎私信我 1万+

HTML、JSP前端页面国际化(i18n)

现在很多的Web工程需要支持国际化多种语言,最近项目中遇到这个需求,根据不同的业务有几种写法,不多说直接上干货 第一种:根据浏览器的语言来进行 //需要引用i18n.properties.js 末尾奉上 !function loadProperties(){ var lang = navigator.language||navigator.userLanguage;//常规浏览器语言...

weixin_43829477的博客 2474
上一篇: signature=fc79cb4922b1fa908bf014b7e8449dc6,pmdk/PMDK.sln at 714a13675a3e608cc9f099b106c51d6638df4863...
下一篇: android meta-inf目录,错误:使用操作系统独立路径“ META-INF / DEPENDENCIES”找到了多个文件...
杨紫她爹
博客等级 码龄9年 39粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值