大家好,我是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. FLUTTER 中 Isolate 的一个例子.

    isolate 起因 最近看了一点isolate的东西, 自己写了一个例子. 普通的的 consummer-producer例子是只有前后两端的,实际上,会把前后两端再进行包装. 我这里这个例子,是把 ...

  2. AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望

    AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望 1. AI Agent(LLM Agent)介绍 1.1. 术语 Agent:"代理&qu ...

  3. React Context 的使用

    使用React开发应用程序时,如果多个组件需要共享数据,可以把数据放到父组件中,通过属性向下传递给子组件.但当组件嵌套较深时,两个最底层的组件要想共享数据,那就霜要把数据放到最顶层的组件中,然后再一层 ...

  4. css3 html5

    vscode的使用 什么是HTML5? HTML5新增语义化标签 多媒体标签 <audio>音频标签 谷歌浏览器 把autoplay属性给我们禁用. 两种音频格式的播放 视频标签<v ...

  5. Spring AOP里面的通知Advice类型

    @Before前置通知 在执行目标方法之前运行 @After后置通知 在目标方法运行结束之后 @AfterReturning返回通知 在目标方法正常返回值后运行 @AfterThrowing异常通知 ...

  6. 【游记】CSP 2023

    day 0 和 printfmingren 整理了一下不会的知识点,发现有点多,遂开摆 音游真的太好玩了 对着<算法竞赛进阶指南>复习了下对拍器的写法,把部分算法的模板又打了一遍 感觉前途 ...

  7. 学习笔记--Java中this关键字

    Java中this关键字 关于Java语言中的this关键字 this 是一个关键字,翻译为:这个 this 是一个引用,一个变量,this变量中保存的内存地址指向自身 每一个对象都有自己的this, ...

  8. windows下mysql服务局域网访问配置

    在局域网中访问本机(Windows)的MySQL服务器,需要确保MySQL服务器配置为允许远程访问,并且防火墙设置允许外部连接.以下是详细的步骤: 1. 修改MySQL配置文件允许远程访问 找到并编辑 ...

  9. Umov移动方块-scratch编程作品

    程序说明: <Umov移动方块>是一款基于Scratch平台制作的小游戏.在这个游戏中,玩家将面对一个3×3的圆圈棋盘,并通过鼠标控制蓝色方块在这些圆圈中灵活移动.游戏的挑战在于,舞台的四 ...

  10. 【WPF】Command 的一些使用方案

    Command,即命令,具体而言,指的是实现了 ICommand 接口的对象.此接口要求实现者包含这些成员: 1.CanExecute 方法:确定该命令是否可以执行,若可,返回 true:若不可,返回 ...