大家好,我是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. 3568F-Linux-RT系统测试手册

  2. linux 清理 pyinstaller 打包程序运行留下的临时文件

    前言 pyinstaller 打包的 python 二进制可执行程序运行的时候,会在 /tmp 目录下生成 _MEI* (*指的是随机数字)文件夹, 如果程序没有正常退出或者终止了,_MEI* 文件夹 ...

  3. win10: pyinstaller在python2和python3环境下的适应性配置

    win10:pyinstaller在python2和python3环境下的适应性配置 前言 pyinstaller是一个非常优秀的python可执行程序打包工具,在windows下打包成.exe文件, ...

  4. 今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型

    一.写在开头 很久没更新喽,最近build哥一直在忙着工作,忙着写小说,都忘记学习自己的本职了,哈哈,不过现在正式回归! 我们继续学习Java的IO相关内容,之前我们了解到,所谓的IO(Input/O ...

  5. 强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay

    在软件开发和测试过程中,我们经常需要对应用程序的网络请求进行录制和回放,以便进行性能分析.压力测试或者模拟复杂的网络环境.今天,我要向大家推荐一款简单易用的 HTTP 请求流量录制回放工具:Gorep ...

  6. [rCore学习笔记 010]基于 SBI 服务完成输出和关机

    RustSBI的两个职责 它会在计算机启动时进行它所负责的环境初始化工作,并将计算机控制权移交给内核 在内核运行时响应内核的请求为内核提供服务 这里用不太确切的话表述一下,RustSBI作为介于内核和 ...

  7. 靶机练习: y0usef

    靶机: y0usef 准备工作 靶机地址: https://download.vulnhub.com/y0usef/y0usef.ova MD5 校验:28c5d869b003be94b2d8ab4b ...

  8. 顺序表_C

    // Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...

  9. Django--StreamingHttpResponse下载文件

    from django.shortcuts import render, HttpResponse from django.http import StreamingHttpResponse impo ...

  10. VUE系列---深度解析 Vue 优化策略

    在前端开发中,性能优化一直是一个重要的课题.Vue.js 提供了多种优化策略,帮助开发者构建高性能的应用.本文将深入解析以下几个优化策略: 使用 v-once.v-if 和 v-show 的区别和优化 ...