ChatGPT学习之旅 (10) 系统全球化小助手
大家好,我是Edison。
上一篇我们写了一个运维小助手的prompt,它帮我们写一些我们开发者不太愿意做的一些运维小任务。这一篇,给大家分享下我在日常的系统开发中遇到的多语言/全球化的任务中是如何通过GPT来帮忙完成的。
背景:基于Blazor的Web应用支持多语言
在Web应用开发中,我们可能会有一些需要多语言+本地化的场景,特别在一些国际化的外资企业当中特别常见。例如,Edison所在的IT开发团队,就需要英语,中文和德语三种语言的支持,用户可以通过“切换页面语言”这个功能来切换到适合他的语言来浏览页面的内容。因此,为Web应用提供多语言,页面内容可以本地化,会扩展我们的IT系统受众范围,提升一点用户体验。我们使用的是Blazor来开发WebUI类应用,通过创建不同的资源文件(.resx或.json)来填充页面的本地化内容,换句话说就是翻译。然后,在代码中使用IStringLocalizer来实现本地化资源的读取。
我们一般的做法是先完成一种语言的资源文件,再通过翻译到其他类型的资源文件。但是,这个过程在之前比较繁琐,需要一个个的替换,纯纯的体力活重复劳动。
这里我们基于之前的提示词模板,稍作修改,形成我们的系统全球化翻译助手的提示词,如下所示,经过一些测试在GPT4-o模型下效果真的不错,建议收藏!
你是一位专业的系统多语言翻译助手 @System Globalization Assistant,我会输入相关的请求,你将根据`preferences`、`instruction`和`rules`来协助我高效完成系统语言的全球化工作。 初始回复:“**Hi I'm System Globalization Assistant,Created by Edison Zhou,V1.0,20230823**
### ⚙️ Preferences:
- src_lang: <> else English
- dest_lang: <> else German
- output: <> else .resx
### Menu:
请使用表格输出支持的`instructions`和对应名称,不需要解释具体含义,也不需要显示这句话:
---
请设置翻译的源语言、目标语言和输出文件格式,E.g.:/src_lang English。
回复1保持默认。” `preferences`
- /src_lang:<源语言偏好,默认为英语>
- /dest_lang:<目标语言偏好,默认为德语>
- /headers:<源文件headers偏好,默认为key value comment>
- /output:<输出文件格式偏好,默认为.resx格式> `instructions`
- /translate:请根据用户输入的数据直接转换成用户指定的文件格式的输出翻译数据
- /fix: 用户补充的额外需求和完善需求,非必要步骤请根据用户补充的需求完善之前输出的翻译数据
- /help:输出支持的指令指引
- /reset : 重新开始一轮新的对话,用户会再次输入翻译的相关信息比如translate指令,请牢记我们的rules进行输出哈 `rules`
- 请使用用户设置的偏好的源语言和目标语言进行翻译
- 每个翻译后的文本请保持原文格式
- 翻译文本时,提示用户翻译已完成即可,不需要输出翻译结果
- 若文本已翻译,当用户切换dest_lang时,请直接输出结果,无须再次输入需要翻译的数据
- 请一步一步思考,不需要解释过程,如果有错误,用户会纠正你
- 若将结果转换成 .resx 文件时,格式如下:
<?xml version="1.0" encoding="utf-8"?>
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<!-- Translated data here -->
<data name="Key1" xml:space="preserve">
<value>Value1</value>
</data>
<data name="Key2" xml:space="preserve">
<value>Value2</value>
</data>
<data name="Key3" xml:space="preserve">
<value>Value3</value>
</data>
</root>
- 若将结果转换成 .json 文件时,格式如下:
{
"Key1": "Value1",
"Key2": "Value2",
"Key3": "Value3"
}
对话示例
假设我们有一个基于.NET 6开发的Blazor项目,其使用了.resx做为资源文件(其实它本质上是一个xml文件),并首先完成了英文的资源,我们希望能迅速地把德语资源文件填充。这时,基于上面的模板,这是一个默认配置,因此直接给到GPT需要翻译的资源,这里我直接从.resx文件中拷贝出来即可:
/translate
ActionTextLabel Action
AppTokenModule_CreateAppTokenDialog_Title Create Token
AppTokenModule_EmailReceiversHelperText eg. aaa@siemens.com;bbb@siemens.com;
AppTokenModule_EmailReceiversLabel Email Receivers
AppTokenModule_ExpireTimeLabel Expire Time
AppTokenModule_NamespaceLabel Namespace
AppTokenModule_ReceiverEmailInvalidError Mail Receivers is invalid
AppTokenModule_ReceiverListRequiredError Mail Receivers is required
AppTokenModule_ReceiverListTooLongError Mail Receivers is too long
AppTokenModule_TableLabel App Token Management
AppTokenModule_TokenExpireOptionLabel Expire Option
AppTokenModule_TokenNameLabel Name
AppTokenModule_TokenRemarkLabel Remark
AppTokenModule_TokenTypeLabel Type
AppTokenModule_UpdateAppTokenDialog_Title Update Token
AuthenticationModule_AuthFailedTip Sorry, you don't have enough permission or not log in.
GPT的一个输出示例:
<?xml version="1.0" encoding="utf-8"?>
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<!-- Translated data here -->
<data name="ActionTextLabel" xml:space="preserve">
<value>Aktion</value>
</data>
<data name="AppTokenModule_CreateAppTokenDialog_Title" xml:space="preserve">
<value>Token erstellen</value>
</data>
<data name="AppTokenModule_EmailReceiversHelperText" xml:space="preserve">
<value>z.B. aaa@siemens.com;bbb@siemens.com;</value>
</data>
<data name="AppTokenModule_EmailReceiversLabel" xml:space="preserve">
<value>Email-Empfänger</value>
</data>
<data name="AppTokenModule_ExpireTimeLabel" xml:space="preserve">
<value>Ablaufzeit</value>
</data>
<data name="AppTokenModule_NamespaceLabel" xml:space="preserve">
<value>Namespace</value>
</data>
<data name="AppTokenModule_ReceiverEmailInvalidError" xml:space="preserve">
<value>Mail-Empfänger ist ungültig</value>
</data>
<data name="AppTokenModule_ReceiverListRequiredError" xml:space="preserve">
<value>Mail-Empfänger ist erforderlich</value>
</data>
<data name="AppTokenModule_ReceiverListTooLongError" xml:space="preserve">
<value>Mail-Empfänger ist zu lang</value>
</data>
<data name="AppTokenModule_TableLabel" xml:space="preserve">
<value>App-Token-Verwaltung</value>
</data>
<data name="AppTokenModule_TokenExpireOptionLabel" xml:space="preserve">
<value>Ablaufoption</value>
</data>
<data name="AppTokenModule_TokenNameLabel" xml:space="preserve">
<value>Name</value>
</data>
<data name="AppTokenModule_TokenRemarkLabel" xml:space="preserve">
<value>Bemerkung</value>
</data>
<data name="AppTokenModule_TokenTypeLabel" xml:space="preserve">
<value>Typ</value>
</data>
<data name="AppTokenModule_UpdateAppTokenDialog_Title" xml:space="preserve">
<value>Token aktualisieren</value>
</data>
<data name="AuthenticationModule_AuthFailedTip" xml:space="preserve">
<value>Entschuldigung, Sie haben nicht genügend Berechtigungen oder sind nicht eingeloggt.</value>
</data>
</root>
这时,我们可以直接将其贴到.resx文件中(比如用VS Code打开)进行覆盖,当你在Visual Studio再次打开时就能看到所有的资源项(翻译)了。
完成德语的翻译后,我们还想再填充一下中文的资源,并且让它改为输出json格式的资源文件,我们只需要执行以下指令:
/dest_lang Chinese
/output .json
GPT会直接基于上一次的需要翻译的资源,给到新的输出:
{
"ActionTextLabel": "操作",
"AppTokenModule_CreateAppTokenDialog_Title": "创建令牌",
"AppTokenModule_EmailReceiversHelperText": "例如 aaa@sdc.com;bbb@sdc.com;",
"AppTokenModule_EmailReceiversLabel": "邮件接收者",
"AppTokenModule_ExpireTimeLabel": "过期时间",
"AppTokenModule_NamespaceLabel": "命名空间",
"AppTokenModule_ReceiverEmailInvalidError": "邮件接收者无效",
"AppTokenModule_ReceiverListRequiredError": "邮件接收者是必需的",
"AppTokenModule_ReceiverListTooLongError": "邮件接收者太长",
"AppTokenModule_TableLabel": "应用令牌管理",
"AppTokenModule_TokenExpireOptionLabel": "过期选项",
"AppTokenModule_TokenNameLabel": "名称",
"AppTokenModule_TokenRemarkLabel": "备注",
"AppTokenModule_TokenTypeLabel": "类型",
"AppTokenModule_UpdateAppTokenDialog_Title": "更新令牌",
"AuthenticationModule_AuthFailedTip": "对不起,您没有足够的权限或未登录。"
}
如果你用的json格式资源文件,那么直接用这个json内容替换你原有的,就能整体添加了,是不是很快?
小结
本篇,我们了解了如何基于ChatGPT中来帮助我们解决一些系统开发中的多语言/全球化/本地化的任务,通过给到清晰的提示词,让这些任务的解决时间缩短一半以上。
近期,我们也在使用GitHub Copilot作为代码的副驾驶来给我们的Dev开发过程中探索提效体验,后续有机会也希望和大家分享一下GitHub Copilot的使用体会。
本文工具
本文使用的工作:Azure OpenAI Studio
本文示例大模型版本:gpt-4o
ChatGPT学习之旅 (10) 系统全球化小助手的更多相关文章
- 笔记-JavaWeb学习之旅10
Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- Hadoop学习之旅三:MapReduce
MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- 六星经典CSAPP-笔记(10)系统IO
六星经典CSAPP-笔记(10)系统I/O 1.Unix I/O 所有语言的运行时系统都提供了高抽象层次的I/O操作函数.例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Hasen的linux设备驱动开发学习之旅--时钟
/** * Author:hasen * 參考 :<linux设备驱动开发具体解释> * 简单介绍:android小菜鸟的linux * 设备驱动开发学习之旅 * 主题:时钟 * Date ...
- 滴滴Booster移动APP质量优化框架 学习之旅
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 一.Booster简介 Booster是滴滴最近开源一个的移动应 ...
- hadoop学习之旅1
大数据介绍 大数据本质也是数据,但是又有了新的特征,包括数据来源广.数据格式多样化(结构化数据.非结构化数据.Excel文件.文本文件等).数据量大(最少也是TB级别的.甚至可能是PB级别).数据增长 ...
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
随机推荐
- 【ClickHouse】0:clickhouse学习3之时间日期函数
官方文档: https://clickhouse.tech/docs/zh/sql-reference/functions/date-time-functions/ 常用的clickhouse时间函数 ...
- 写给rust初学者的教程(二):所有权、生存期
这系列RUST教程一共三篇.这是第二篇,介绍RUST语言的关键概念,主要是所有权和生存期等. 第一篇:写给rust初学者的教程(一):枚举.特征.实现.模式匹配 在写第一篇中的练习代码时,不知道你有没 ...
- Java基本数学运算之Math类
什么是Math类 Java操作数学运算相关的类 构造函数被私有化,所以不允许创建对象 都是静态方法,使用是直接类名.方法名 常用API //计算平⽅根 System.out.println(Math. ...
- SpringMVC springmvc.xml配置路径前缀和后缀
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...
- 大一新生的作业(洛谷P1150,1035,1075)
本帖背景:此帖讲解大一新生团队作业 截止日期10-31 17:09 P1150(Peter的烟) 算法简介 本题主要考察的是模拟算法 模拟算法一般考察一些比较基础的题目,它将生活中的实例融合到了编程题 ...
- git http(s) 保存用户密码
git 常用配置 git记住密码 1.设置记住密码(默认15分钟): git config --global credential.helper cache 2.如果想自己设置时间,可以这样做: gi ...
- Day 4 - 搜索进阶与模拟
启发式搜索 下面将简要介绍启发式搜索及其用法. 定义 启发式搜索(英文:\(\text{heuristic search}\))是一种在普通搜索算法的基础上引入了启发式函数的搜索算法. 启发式函数的作 ...
- C#:只支持GET和POST方法的浏览器,如何发送PUT/DELETE请求?RESTful WebAPI如何响应?
理想的RESTful WebAPI采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环境 ...
- 【JavaScript高级01】JavaScript基础深入
1,数据类型 JavaScript将数据分为六大类型,分别为数值类型(number).字符串类型(string).布尔类型(boolean).undefined(定义未赋值).null(赋值为空值). ...
- Golang 高性能 Websocket 库 gws 使用与设计(一)
前言 大家好这里是,白泽,这期分析一下 golang 开源高性能 websocket 库 gws. 视频讲解请关注B站:白泽talk 介绍 gws:https://github.com/lxzan/g ...