大家好,我是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

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

ChatGPT学习之旅 (10) 系统全球化小助手的更多相关文章

  1. 笔记-JavaWeb学习之旅10

    Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...

  2. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  3. Hadoop学习之旅三:MapReduce

    MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...

  4. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  5. 六星经典CSAPP-笔记(10)系统IO

    六星经典CSAPP-笔记(10)系统I/O 1.Unix I/O 所有语言的运行时系统都提供了高抽象层次的I/O操作函数.例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓 ...

  6. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  7. Hasen的linux设备驱动开发学习之旅--时钟

    /** * Author:hasen * 參考 :<linux设备驱动开发具体解释> * 简单介绍:android小菜鸟的linux * 设备驱动开发学习之旅 * 主题:时钟 * Date ...

  8. 滴滴Booster移动APP质量优化框架 学习之旅

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 一.Booster简介 Booster是滴滴最近开源一个的移动应 ...

  9. hadoop学习之旅1

    大数据介绍 大数据本质也是数据,但是又有了新的特征,包括数据来源广.数据格式多样化(结构化数据.非结构化数据.Excel文件.文本文件等).数据量大(最少也是TB级别的.甚至可能是PB级别).数据增长 ...

  10. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

随机推荐

  1. VS2017 error CS0234: 命名空间“Microsoft”中不存在类型或命名空间名“Office”问题的一种解决方案

    最近需要使用VS2017编辑C#,但在编译时软件报错:error CS0234: 命名空间"Microsoft"中不存在类型或命名空间名"Office" 在网上 ...

  2. axios和AJAX的区别

    axios和ajax的区别 Axios和Ajax都是用于处理网络请求和与服务器进行通信的技术,但它们之间存在一些关键的区别:12 一.技术基础:Ajax(Asynchronous JavaScript ...

  3. [oeasy]python0019_ 打包和解包_struct_pack_unpack

    ​ 打包和解包 回忆上次内容 ASCII 由这样几类字符构成 英文大写字符 英文小写字符 数字 符号 电报时代对于英文.数字的编码 使用的是摩斯电码 ​ 编辑 这摩斯电码是3进制的编码方式 长短空 怎 ...

  4. Python elasticsearch-py类库基础用法

    实践环境 https://pypi.org/project/elasticsearch/ pip install elasticsearch==7.6.0 离线安装包及依赖包下载地址: https:/ ...

  5. .NET 轻量级 命令行工具 CSharpRepl

    前言 当我们需要快速测试代码片段时,常见的做法是启动Visual Studio或使用在线代码编辑器.然而,Visual Studio的启动可能较为缓慢且占用较多系统资源,而在线编辑器则可能遇到语法支持 ...

  6. Git的存储原理

    目录 Git 设计原理 Git vs SVN Git 存储模型 .git 目录结构 Git 基本数据对象 Git 包文件 Git 引用 Git 设计原理 概括的讲,Git 就是一个基于快照的内容寻址文 ...

  7. 使用git(ee的一个小总结

    我先把后端项目推进了gitee,后面为了方便又想把前端也放在同一个项目里,结果出问题了: 一开始是因为前端项目内包含了.git的文件(这个玩意还是隐藏文件,就是你在idea里其实是看不到他的),导致只 ...

  8. 轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置

    注:这是对我以前博客进行优化后再次发布的,博客中的截图为以前的.原博客已删除. 如何安装nginx nginx是一款开源.高性能的Web和反向代理服务器,支持HTTP.HTTPS.SMTP.POP3和 ...

  9. 【Windows】固定Win系统的IP地址

    是我迟钝了,突然想到这个事情就记一下 先开终端查看IP信息 : IPCONFIG 找到当前连接: IPv4协议设置: 家庭网络设置就这样,公司内网有自己的一个DNS服务地址,这个网管知道 在Win11 ...

  10. 【JavaWeb】HttpClient

    需要的依赖: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <de ...