另类方式实现.Net下的多语言
前言
关于.Net下的多语言方案已经有很多成熟的方案,例如:# Avalonia 国际化之路:Resx 资源文件的深度应用与探索,或者# Avalonia使用XML文件实现国际化,基本都围绕官方的Satellite Assembly方案来实现。实际上,我们可以使用非常原始的方式来实现多语言。
步骤
1. resources资源文件生成
创建如下文本文件(假设为rex.txt)
Greeting=Hello
将ResGen.exe从framework的工具目录(使用everything找下就可以看到)拷贝到当前目录,执行如下命令
PS D:\workSpace\Code\测试\resx> .\ResGen.exe .\rex.txt
Read in 1 resources from ".\rex.txt"
Writing resource file... Done.
就可以得到我们第一步的rex.resources。
说明:
ResGen.exe工具同样支持resx文件,具体使用与文件格式参考https://learn.microsoft.com/en-us/dotnet/framework/tools/resgen-exe-resource-file-generator 官方文档,事实上,这也是我们使用的IDE编辑时msbuild背后调用的工具。
2. Dll文件生成
有了resources资源文件,我们就可以通过链接器(al.exe,同样在framework的工具目录中)将resources资源文件链接成动态链接库。
PS D:\workSpace\Code\测试\resx> .\al.exe -target:lib -embed:.\rex.resources -out:Res.dll
Microsoft(R) Assembly Linker 版本 14.7.2053.0
Copyright (C) Microsoft Corporation. All rights reserved.
说明:
-target:lib代表产物为类库-embed:.\rex.resources代表嵌入刚刚第一步的生成资源文件-out:Res.dll代表生成物名称- 使用ilspy打开就可以看到嵌入的资源文件。
- 注意我们这里并没有指定
-culture:zh-Hans参数,而官方文档说这个参数必须传(https://learn.microsoft.com/en-us/dotnet/core/extensions/create-satellite-assemblies) 是因为我们完全没使用.net的语言资源机制,也完全不用遵从其hub-and-spoke模型(指的是轮子的中心和车轮的辐条的关系模型,也就是主dll和卫星资源dll的位置关系模型) - 这里要对.Net下dll的结构有一定认识,大家可以参考前面链接中的图片。
- 也可以使用
-template:Example.dll来指定生成dll的元数据模版,不然生成的dll在ilspy中元数据表的TypeDef会显示<Module>这样未命名的记录。 - 我们这里用的是链接器,其实也能用编译器(.net core下就是这样),参考前面的链接。
3. 使用
创建控制台应用,代码如下:
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
// 手动加载刚刚链接器生成的程序集
Assembly ass = Assembly.LoadFile(@"D:\workSpace\Code\测试\resx\Res.dll");
// 第一个参数"rex"即为我们嵌入的rex.resources的文件名,第二个参数为应用程序集
ResourceManager rm = new ResourceManager("rex", ass);
var s = rm.GetString("Greeting");
Console.WriteLine(s);
}
}
}
输出为:
Hello
D:\workSpace\Code\测试\resx\ConsoleApp1\bin\Debug\ConsoleApp1.exe (进程 5184)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
就能拿到我们定义的语言资源啦。
说明:
- 由于我们这里是纯手工加载,
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");这样是完全没影响的,同样, 链接器的cultrue参数也不影响,大家可以自行测试。
How to:
看完这个和文章中的参考资料,应该对大家理解.Net的多语言有很大帮助。接下来就是我的方案(也许是胡说)
如果想统一在一个文件中管理整个sln的语言资源(举例一下特殊需求),可以通过msbuild自定义Task的方式(大家可以类比下编辑的Grpc的proto文件自动生成代码的过程,实际上谷歌也是这么干的),(或者结合下T4模版?)直接生成所有语言的ResourceManager字典。封装方法返回对应语言的资源,有特殊需求的可以自行尝试,如果不行就当我是胡说。
另类方式实现.Net下的多语言的更多相关文章
- 【Python基础学习一】在OSX系统下搭建Python语言集成开发环境 附激活码
Python是一门简单易学,功能强大的编程语言.它具有高效的高级数据结构和简单而有效的面向对象编程方法.Python优雅的语法和动态类型以及其解释性的性质,使它在许多领域和大多数平台成为编写脚本和快速 ...
- linux命令行下使用R语言绘图
系统:centos 6.4 64bit 环境安装参考:http://hi.baidu.com/solohac/item/4a18e78f1bef9b5825ebd99c 在R语言中可以使用png()等 ...
- Centos文本方式安装情况下lvm分区的创建
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- 在VS下用C语言连接SQLServer2008
原文:在VS下用C语言连接SQLServer2008 step1:启动SQLSERVER服务 step2:打建立数据库test,在test库中建立test表(a varchar(200),b varc ...
- Eclipse平台下配置Go语言开发环境(Win7)
<Go语言编程>中写到:“从功能和易用性等方面考虑, Eclipse+GoEclipse.LiteIDE这两个环境在所有IDE里面是表现最好的”,所以笔者打算采用Eclipse+GoEcl ...
- linux下的C语言开发 进程创建 延伸的几个例子
在Linux下面,创建进程是一件十分有意思的事情.我们都知道,进程是操作系统下面享有资源的基本单位.那么,在linux下面应该怎么创建进程呢?其实非常简单,一个fork函数就可以搞定了.但是,我们需要 ...
- 在Linux下运行C语言程序
市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Deepin(深度Linux).本教 ...
- windows下的go语言的环境搭建和初探
闲话不说,直入主题. 1.准备工具 a.windows下的Go语言开发安装包 官方下载地址:https://code.google.com/p/go/downloads/list b.Go语言中文官网 ...
- Linux 下 expect 脚本语言中交互处理常用命令
Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...
- 在Linux下开始C语言的学习
为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...
随机推荐
- m4 mac mini本地部署ComfyUI,测试Flux-dev-GGUF的workflow模型10步出图,测试AI绘图性能,基于MPS(fp16),优点是能耗小和静音
m4 mac mini已经发布了一段时间,针对这个产品,更多的是关于性价比的讨论,如果抛开各种补贴不论,价位上和以前发布的mini其实差别不大,真要论性价比,各种windows系统的mini主机的价格 ...
- Sealos Devbox 云开发框架使用教程
用过 Sealos 云开发的同学,想必都很熟悉函数式编程,喜欢 Sealos 云开发的那种完全不用关心路由,开发快,上线快,调试快,越用越简单越简单越用的感觉.它就像一个温柔的保姆,帮你打理好了所有的 ...
- oracle查询某个sql语句客户端ip地址
1. 背景 业务出现异常后,或者某个sql导致系统卡顿.需要问题后需要溯源,需要获取这个sql是在哪个客户端的IP发起的. 2. cs架构 客户端直接连接数据库,可以很方便查询,采用通过sql_id找 ...
- 一款可以完整保留排版的PDF翻译,GitHub增长第一
最近看论文较多,顺手给大家推荐一个用下来觉得不错的开源PDF翻译工具:PDFMathTranslate 目前这款开源项目在GitHub上已经收获了7.6K Star,而且由于一直处于增长趋势榜第一的位 ...
- Docker安装开源版obs对象存储服务minio,并后台运行
>Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据. 例如 ...
- Gitlab:Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm
Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm ERRO ...
- 小程序canvas白屏解决(
造成canvas白屏的原因(两个原因) 1. 使用网络图片经绘制,没有配置downloadfile域名 ctx.drawImage('https://img1.imgtn.bdimg.com/it/u ...
- 使用 Autofac, MediatR 和 FluentValidator 构建松耦合 ASP.NET Core API 应用
使用 MediatR 和 FluentValidator 1. 创建示例文件夹 Sample 首先,创建示例文件夹 Sample. 2. 创建表示层项目 Web 在示例文件夹 Sample 中,使用标 ...
- .net core 文本比对的一个诡异设计
9-11 发现的,过久了都忘了,记一下 string s = Encoding.ASCII.GetString(new byte[] { 0x57, 00, 0x49, 00, 0x4e, 00, 0 ...
- Ubuntu 22.04 LTS 代号已经公布:那就是 Jammy Jellyfish
Ubuntu 22.04 LTS 代号已在 Ubuntu 开发之家 Launchpad 上公布. 在字母系列中的字母"I"之后,是"J". 因此,Canonic ...