Server 接入2
接入说明
接入准备
- 登录DUI控制台
- 创建基础技术产品
- 配置授权
- 发布产品
连接上需要携带的公共参数
参数名 |
含义 |
是否必须 |
取值示例 |
---|---|---|---|
productId | 产品标识 | 是 | 278578090 |
userId | 用户标识,字符串uuid | 否 | 1234567 |
云端对接云端的授权参数
参数名 |
含义 |
是否必须 |
取值示例 |
---|---|---|---|
apikey | DUI控制台生成的绑定过ip的访问标识 |
是 |
0ddddeeeeeeeeeeee88888888260c8ab |
一条完整的云端对接云端的连接示例:
http://translation.duiopen.com/runtime/v1/translation/translate?from=zh&to=en&q=%e4%bd%a0%e5%a5%bd?&productId=278578090&apikey=0ddddeeeeeeeeeeee88888888260c8ab
接口说明
文本翻译接口
请求方式
GET/POST
注意:
GET方式需要将参数q进行url encode;
POST方式只接受Content-Type为application/json格式;参数q无需url encode;
请求uri
/runtime/v1/translation/translate?公共参数&授权参数
请求参数
字段名 | 类型 | 是否必须 | 描述 | 取值示例 |
from | string | 是 | 源语言 | - |
to | string | 是 | 目标语言 | - |
q | string | 是 | 翻译文本,UTF-8编码,POST请求无需urlencode,GET请求需要urlencode | - |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 | - |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 | - |
返回值
JSON格式
字段名 | 类型 | 描述 |
---|---|---|
errId | string |
业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
data | object | - |
data.from | string | 源语言 |
data.to | string | 目标语言 |
data.src | string | 请求的翻译文本 |
data.transResults | list<object> | - |
data.transResults[0] | object | - |
data.transResults[0].dst | string | 翻译结果 |
请求示例
GET请求
curl 'http://translation.duiopen.com/runtime/v1/translation/translate?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab&from=zh&to=en&q=%e4%bd%a0%e5%a5%bd'
{
"errId":"0", //业务状态码
"errMsg":"success", //状态码描述信息
"recordId" : "RECORD-ID",
"data": {
"from": "zh", //源语言
"to": "en", //目标语言
"src": "你好", //翻译文本
"transResults": [
{
"dst": "Hello" //翻译结果
}
]
}
}
POST请求
curl 'http://translation.duiopen.com/runtime/v1/translation/translate?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' \
-d '{"from" : "zh", "to" : "en", "q" : "你好"}' -H 'Content-Type: application/json' -XPOST
{
"errId":"110023", //业务状态码
"errMsg":"request translation engine timeout", //状态码描述信息
"recordId" : "RECORD-ID",
}
创建定制库
请求方式
POST
请求uri
/runtime/v1/translation/sub-account/create?公共参数&授权参数
请求参数
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/sub-account/create?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID"
}
添加术语词典
请求方式
POST
请求uri
/runtime/v1/translation/customize/dict/add?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
取值示例
|
---|---|---|---|---|
srcText | string | 是 | 源文本,长度不超过255,需要url encode | |
dstText | string | 是 | 目的文本,长度不超过255,需要url encode | |
from | string | 是 | 源语言 | |
to | string | 是 | 目的语言 | |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 | |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
注意事项
- 所有字段必须为UTF-8编码
2. 为保证服务质量,srcText/dstText长度不能超过255字符
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/customize/dict/add?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' -d \
'{ "srcText" : "你是个好人", "dstText" : "good man", "from" : "zh", "to" : "en" }'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID",
"data" : {"dictId" : ""}
}
更新术语词典
请求方式
PUT
请求uri
/runtime/v1/translation/customize/dict/update?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
取值示例
|
---|---|---|---|---|
dictId | int | 是 | 术语词典id | |
dstText | string | 是 | 目的文本,长度不超过255,需要url encode | |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 | |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
注意事项
- 所有字段必须为UTF-8编码
2. 为保证服务质量,srcText/dstText长度不能超过255字符
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPUT 'http://translation.duiopen.com/runtime/v1/translation/customize/dict/update?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' -d \
'{ "dictId" : 1, "dstText" : "good man"}'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID",
"data" : {"dictId" : ""}
}
删除术语词典
请求方式
POST
请求uri
/runtime/v1/translation/customize/dict/delete?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
取值示例
|
---|---|---|---|---|
dictId | int | 是 | 术语词典记录ID | |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 | |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/customize/dict/delete?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' -d \
'{ "dictId" : 1}'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID"
}
查询术语词典
请求方式
POST
请求uri
/runtime/v1/translation/customize/dict/list?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
---|---|---|---|
srcText | string | 否 | 源文本,需要url encode |
from | string | 否 | 源语言 |
to | string | 否 | 目的语言 |
beginTime | string | 否 | 起始时间 |
endTime | string | 否 | 结束时间 |
page | int | 否 | 页码 |
pageSize | int | 否 | 每页大小 |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
注意事项
- 所有字段必须为UTF-8编码
2. 为保证服务质量,srcText/dstText长度不能超过255字符
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
data | object | - |
data.totalPage | int | 总页数 |
data.totalCount | int | 总个数 |
data.page | int | 当前页码 |
data.pageSize | int | 每页数据个数 |
data.dictList | list<object> | - |
data.dictList[0] | object | - |
data.dictList[0].dictId | int | 术语词典记录ID |
data.dictList[0].srcText | string | 源文本 |
data.dictList[0].from | string | 源语言 |
data.dictList[0].createTime | string | 创建时间 |
data.dictList[0].to | string | 目的语言 |
data.dictList[0].dstText | string | 目的文本 |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/customize/dict/list?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab'
{
"errMsg": "success",
"errId": "0",
"data": {
"totalPage": 1,
"totalCount": 1,
"page": 1,
"pageSize": 12,
"dictList": [
{
"dictId": 1,
"srcText": "你是个好人",
"from": "zh",
"createTime": "2019-12-03 11:04:42",
"to": "en",
"dstText": "good man"
}
]
},
"recordId": "0c31f876-4eb2-4b62-ab8f-73958c5c5a62"
}
添加翻译记忆
请求方式
POST
请求uri
/runtime/v1/translation/customize/memory/add?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
---|---|---|---|
srcText | string | 是 | 源文本,长度不超过255,需要url encode |
dstText | string | 是 | 目的文本,长度不超过255,需要url encode |
from | string | 是 | 源语言 |
to | string | 是 | 目的语言 |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
注意事项
- 所有字段必须为UTF-8编码
2. 为保证服务质量,srcText/dstText长度不能超过255字符
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/customize/memory/add?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' -d \
'{ "srcText" : "你是个好人", "dstText" : "good man", "from" : "zh", "to" : "en" }'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID",
"data" : {"memoryId" : ""}
}
更新翻译记忆
请求方式
PUT
请求uri
/runtime/v1/translation/customize/memory/update?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
---|---|---|---|
memoryId | int | 是 | 翻译记忆id |
dstText | string | 是 | 目的文本,长度不超过255,需要url encode |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
注意事项
- 所有字段必须为UTF-8编码
2. 为保证服务质量,srcText/dstText长度不能超过255字符
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPUT 'http://translation.duiopen.com/runtime/v1/translation/customize/memory/update?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' -d \
'{ "memoryId" : 1, "dstText" : "good man"}'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID",
"data" : {"memoryId" : ""}
}
删除翻译记忆
请求方式
POST
请求uri
/runtime/v1/translation/customize/memory/delete?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
---|---|---|---|
memoryId | int | 是 | 翻译记忆记录ID |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/customize/memory/delete?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab' -d \
'{ "memoryId" : 1}'
{
"errId":"0",
"errMsg":"success",
"recordId" : "RECORD-ID"
}
查询翻译记忆
请求方式
POST
请求uri
/runtime/v1/translation/customize/memory/list?公共参数&授权参数
请求参数
字段名
|
类型
|
是否必须
|
描述
|
---|---|---|---|
srcText | string | 否 | 源文本,需要url encode |
from | string | 否 | 源语言 |
to | string | 否 | 目的语言 |
beginTime | string | 否 | 起始时间 |
endTime | string | 否 | 结束时间 |
page | int | 否 | 页码 |
pageSize | int | 否 | 每页大小 |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 |
注意事项
- 所有字段必须为UTF-8编码
2. 为保证服务质量,srcText/dstText长度不能超过255字符
返回值
JSON格式
字段名
|
类型
|
描述
|
---|---|---|
errId | string | 业务状态码 |
errMsg | string | 业务状态码描述信息 |
recordId | string | 当前请求的recordId |
data | object | |
data.totalPage | int | 总页数 |
data.totalCount | int | 总个数 |
data.page | int | 当前页码 |
data.pageSize | int | 每页数据个数 |
data.memoryList | list<object> | |
data.memoryList[0] | object | |
data.memoryList[0].memoryId | int | 翻译记忆记录ID |
data.memoryList[0].srcText | string | 源文本 |
data.memoryList[0].from | string | 源语言 |
data.memoryList[0].createTime | string | 创建时间 |
data.memoryList[0].to | string | 目的语言 |
data.memoryList[0].dstText | string | 目的文本 |
请求示例
curl -XPOST 'http://translation.duiopen.com/runtime/v1/translation/customize/memory/list?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab'
{
"errMsg": "success",
"errId": "0",
"data": {
"totalPage": 1,
"totalCount": 1,
"page": 1,
"pageSize": 12,
"memoryList": [
{
"memoryId": 1,
"srcText": "你是个好人",
"from": "zh",
"createTime": "2019-12-03 11:04:42",
"to": "en",
"dstText": "good man"
}
]
},
"recordId": "0c31f876-4eb2-4b62-ab8f-73958c5c5a62"
}
语言支持列表接口
请求方式
GET
请求uri
/runtime/v1/translation/language?公共参数&授权参数
请求参数
字段名 | 类型 | 是否必须 | 描述 | 取值示例 |
---|---|---|---|---|
optType | string | 否 |
操作类型,值为(TRANSLATE|DICTIONARY|MEMORY_STORE),默认TRANSLATE |
DICTIONARY |
公共参数 | 公共参数详情 | 是 | 公共参数,应放置在url参数中 | - |
授权参数 | 云端对接云端授权 | 是 | 授权参数,应放置在url参数中 | - |
返回值
JSON格式
字段名 | 类型 | 描述 | 取值示例 |
---|---|---|---|
errId | string |
业务状态码 |
- |
errMsg | string | 业务状态码描述信息 | - |
data | object | - | |
data.languages | map<string, list<object> > | key是语言中文首字母,value是对应的语言描述信息 | a |
data.languages["z"] | list<object> | 中文首字母为z的语言列表 | - |
data.languages["z"][0] | object | - | - |
data.languages["z"][0]["chinesePrefix"] | string | 语言中文首字母 | z |
data.languages["z"][0]["code"] | string | 语言参数代码 | zh |
data.languages["z"][0]["description"] | string | 语言描述信息 | 中文 |
请求示例
curl 'http://translation.duiopen.com/runtime/v1/translation/language?productId=1000001&userId=9527&apikey=0ddddeeeeeeeeeeee88888888260c8ab'
{
"errId":"0", //业务状态码
"errMsg":"success", //状态码描述信息
"data" : {
"n" : [ //语言中文的首字母
{
"chinesePrefix" : "n",
"code" : "af",
"description" : "南非荷兰语"
},
...
],
"j" : [ //语言中文的首字母
{
"chinesePrefix" : "j",
"code" : "ca",
"description" : "加泰罗尼亚语"
},
...
],
...
}
}
自定义翻译内容
概念说明
在翻译功能使用过程中,如果觉得系统对某个术语(单词/词组)或句子翻译结果不准确,可以通过“术语词典”和“翻译记忆”功能自定义术语译文。重新定义后,系统的翻译结果均会采用您自定义的结果。其中:术语词典是专门用于定制词汇;翻译记忆则用于定制句子。
自定义翻译内容中涉及两个概念:
【源语】:您需要翻译的词;以中译英为例,“你好”;
【目标语】:您需要得到的翻译结果;以中译英为例,您可以自定义“你好”的翻译结果为“hello world”。
术语词典
1. 在您的基础技术产品详情页,点击【机器翻译】,进入机器翻译产品详情页。
2. 在详情页,点击【术语词典】TAB,可以通过【添加术语】完成自定义翻译结果的添加。如下图:
翻译记忆
1. 在您的基础技术产品详情页,点击【机器翻译】,进入机器翻译产品详情页。
2. 在详情页,点击【翻译记忆】TAB,可以通过【添加记忆】完成自定义翻译结果的添加。如下图:
错误码信息
errId | errMsg | 描述 |
0 | success | 成功 |
110001 | translated text is empty | 翻译文本为空 |
110002 | length of translated text is too long | 翻译文本太长 |
110003 | translated text is not UTF-8 | 翻译文本不是utf-8编码 |
110004 | language not support | 语种不支持 |
110005 | bad request parameters | 参数错误 |
110006 | length of custom dict src_text is too long | 术语词典源语长度太长 |
110007 | length of custom dict dst_text is too long | 术语词典目标语长度太长 |
110008 | length of custom memory src_text is too long | 翻译记忆源语长度太长 |
110009 | length of custom memory dst_text is too long | 翻译记忆目标语长度太长 |
110010 | add dict failed | 新增术语词典失败 |
110011 | delete dict failed | 删除术语词典失败 |
110012 | query dict failed | 查询术语词典失败 |
110013 | add memory failed | 新增翻译记忆失败 |
110014 | delete memory failed | 删除翻译记忆失败 |
110015 | query memory failed | 查询翻译记忆失败 |
110016 | missing product id | 缺失productId参数 |
110017 | not support engine | 不支持的翻译引擎 |
110018 | source text existed | 定制的源语存在 |
110019 | dict id not found | dictId不存在 |
110020 | memory id not found | memoryId不存在 |
110021 | update dict failed | 更新术语词典失败 |
110022 | update memory failed | 更新翻译记忆失败 |
110023 | dict record not found | 找不到对应的术语词典记录 |
110024 | memory record not found | 找不到对应的翻译记忆记录 |
110101 | translate failed | 翻译引擎失败 |
110102 | translation engine is abnormal | 翻译引擎异常 |
110103 | request translation engine timeout | 翻译引擎超时 |
110104 | create sub account failed | 翻译引擎创建子账户失败 |
110105 | dict add failed | 翻译引擎新增术语词典失败 |
110106 | dict delete failed | 翻译引擎删除术语词典失败 |
110107 | dict bulk action failed | 翻译引擎批量添加术语词典失败 |
110108 | dict query failed | 翻译引擎查询术语词典失败 |
110109 | memory add failed | 翻译引擎新增翻译记忆失败 |
110110 | memory delete failed | 翻译引擎删除翻译记忆失败 |
110111 | memory bulk action failed | 翻译引擎批量添加翻译记忆失败 |
110112 | memory query failed | 翻译引擎查询翻译记忆失败 |
110201 | dosage server is abnormal | 用量管理服务异常 |
110202 | product usage is overflow | 产品无剩余用量 |
110203 | request dosage server failed | 请求用量管理服务失败 |
110204 | request dosage server timeout | 请求用量管理服务超时 |
支持术语词典和翻译记忆的语言列表
语言
|
参数代码
|
---|---|
中文 | zh |
英语 | en |
日语 | ja |
韩语 | ko |
法语 | fr |
西班牙语 | es |
俄语 | ru |
藏语 | ti |
阿拉伯语 | ar |
保加利亚语 | bg |
葡萄牙语 | pt |
泰语 | th |
蒙古语(西里尔) | mn |
德语 | de |
老挝语 | lo |
支持文本翻译的语言列表
语言 | 参数代码 |
---|---|
南非荷兰语 | af |
阿姆哈拉语 | am |
阿拉伯语 | ar |
阿塞拜疆语 | az |
巴什基尔语 | ba |
白俄罗斯语 | be |
保加利亚语 | bg |
孟加拉语 | bn |
波斯尼亚语 | bs |
加泰罗尼亚语 | ca |
宿务语 | ceb |
中文(繁体) | cht |
科西嘉语 | co |
捷克语 | cs |
威尔士语 | cy |
丹麦语 | da |
德语 | de |
希腊语 | el |
英语 | en |
世界语 | eo |
西班牙语 | es |
爱沙尼亚语 | et |
巴斯克语 | eu |
波斯语 | fa |
芬兰语 | fi |
菲律宾语 | fil |
斐济语 | fj |
法语 | fr |
弗里西语 | fy |
爱尔兰语 | ga |
苏格兰盖尔语 | gd |
加利西亚 | gl |
古吉拉特语 | gu |
豪萨语 | ha |
夏威夷语 | haw |
希伯来语 | he |
印地语 | hi |
克罗地亚语 | hr |
海地克里奥尔语 | ht |
匈牙利语 | hu |
亚美尼亚语 | hy |
印尼语 | id |
伊博语 | ig |
冰岛语 | is |
意大利语 | it |
日语 | ja |
印尼爪哇语 | jv |
格鲁吉亚语 | jy |
哈萨克语 | ka |
哈萨克语(西里尔) | kk |
高棉语 | km |
卡纳达语 | kn |
韩语 | ko |
库尔德语 | ku |
吉尔吉斯语 | ky |
拉丁语 | la |
卢森堡语 | lb |
老挝语 | lo |
立陶宛语 | lt |
拉脱维亚语 | lv |
马尔加什语 | mg |
马里语 | mhr |
毛利语 | mi |
马其顿语 | mk |
马拉雅拉姆语 | ml |
蒙古语(西里尔) | mn |
马拉地语 | mr |
山地马里语 | mrj |
马来语 | ms |
马耳他语 | mt |
白苗文 | mww |
缅甸语 | my |
尼泊尔语 | ne |
荷兰语 | nl |
挪威语 | no |
齐切瓦语 | ny |
克雷塔罗奥托米语 | otq |
旁遮普语 | pa |
帕皮阿门托语 | pap |
波兰语 | pl |
普什图语 | ps |
葡萄牙语 | pt |
罗马尼亚语 | ro |
俄语 | ru |
信德语 | sd |
僧伽罗语 | si |
斯洛伐克语 | sk |
斯洛文尼亚语 | sl |
萨摩亚语 | sm |
修纳语 | sn |
索马里语 | so |
阿尔巴尼亚语 | sq |
塞尔维亚语 | sr |
塞索托语 | st |
印尼巽他语 | su |
瑞典语 | sv |
斯瓦希里语 | sw |
泰米尔语 | ta |
泰卢固语 | te |
塔吉克语 | tg |
泰语 | th |
藏语 | ti |
汤加语 | to |
土耳其语 | tr |
鞑靼语 | tt |
塔希提语 | ty |
乌德穆尔特语 | udm |
乌克兰语 | uk |
乌尔都语 | ur |
维吾尔语 | uy |
乌兹别克语 | uz |
越南语 | vi |
南非科萨语 | xh |
意第绪语 | yi |
约鲁巴语 | yo |
尤卡坦玛雅语 | yua |
粤语 | yue |
中文 | zh |
南非祖鲁语 | zu |