共创翻译 / 文本质量反馈(Community Translation)
功能概述
SDK 1.4.0+ 提供了玩家共创翻译入口,1.5.0 起进一步扩展为「文本质量反馈」:玩家在游戏内即可对当前译文打分,并/或提交自己的翻译建议,与 AI Agent 审查(开发者侧)相互独立。
SDK 提供两种接入模式,走同一个服务端流程(仅评分立即采纳计入平均分,包含翻译建议的条目进入 AI 评分 → 人工审核):
- 内置 UI — 调用
suggestTranslation(stringIds[, imageBytes]),SDK 直接弹出评分卡片,集成成本最低 - 无 UI(Headless,1.6.0+) — 调用
submitTranslationSuggestions(...),集成方在自己的界面收集玩家评分/翻译建议后提交,SDK 不弹任何页面
下方先介绍内置 UI(方式一/二),无 UI 提交在「方式三」一节。
suggestTranslation() 弹窗内每条文本下方有 1-5 星评分组件 + 可选输入框,可按需选择三种反馈模式:
| 反馈模式 | 含义 | 平台侧行为 |
|---|---|---|
| 仅评分 | 玩家只对当前译文打 1-5 星 | 自动采纳,立即计入字符串平均分 + 玩家积分(项目侧可配单条评分积分) |
| 仅建议 | 玩家只填写新的翻译建议 | 进入 AI 评分 → 人工审核队列 |
| 评分 + 建议 | 同时给出评分与翻译建议 | 评分立即计入;建议照常走 AI + 人工审核 |
前提条件
使用共创翻译功能前,必须满足以下条件:
- SDK 已完成初始化
- 已通过
updateUserInfo()设置userId(用于标识提交反馈的玩家) - 项目在 Loxily 平台已开启「共创翻译」开关
java
UserConfig userConfig = new UserConfig.Builder()
.setUserId("player_001")
.setUserTags("beta,community")
.build();
LoxilyLocalize.updateUserInfo(userConfig);方式一:自动截图
SDK 自动截取当前屏幕,随建议一起提交(仅评分时不会附带截图,节省流量):
java
String[] stringIds = {"dialog.npc_greeting", "dialog.player_choice_1"};
LoxilyLocalize.suggestTranslation(stringIds);方式二:外部传入截图(游戏引擎推荐)
适用于 Unity、Cocos2dx 等游戏引擎,由游戏方自行截图:
java
byte[] screenshotBytes = ...; // 从 RenderTexture 获取
String[] stringIds = {"dialog.npc_greeting", "dialog.player_choice_1"};
LoxilyLocalize.suggestTranslation(stringIds, screenshotBytes);注意: 传入
imageBytes为null时,SDK 会自动截取当前屏幕;玩家仅评分(无建议)时不上传截图。
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| stringIds | String[] | 是 | 当前页面使用的 string_id 数组,不可为空 |
| imageBytes | byte[] | 否 | PNG/JPEG 格式的截图数据,传 null 则 SDK 自动截屏 |
方式三:无 UI 提交(Headless,1.6.0+)
如果你希望沿用自己的 UI 风格(例如已有的评分对话框 / 反馈中心),可以使用 submitTranslationSuggestions(...) 直接提交,SDK 完全不渲染任何页面。
java
// 1) 玩家在你的自绘界面对若干词条评分 / 写建议后,构造提交项
List<TranslationSuggestion> items = new ArrayList<>();
items.add(TranslationSuggestion.builder("HOME_TITLE")
.rating(4)
.build());
items.add(TranslationSuggestion.builder("BTN_OK")
.rating(2)
.suggestedTranslation("确定")
.build());
// 2) 截图(可选;不传则不附带——SDK 不会自动截屏)
byte[] screenshot = captureGameScreenBeforeOpeningDialog();
// 3) 提交,回调在主线程触发
LoxilyLocalize.submitTranslationSuggestions(items, screenshot,
new SuggestSubmitCallback() {
@Override
public void onSuccess(int ratingCount, int suggestionCount) {
showToast("感谢反馈:" + (ratingCount + suggestionCount) + " 条已提交");
dismissDialog();
}
@Override
public void onFailure(String errorMsg) {
showToast("提交失败:" + errorMsg);
}
});单条便捷重载:
java
LoxilyLocalize.submitTranslationSuggestions(
TranslationSuggestion.builder("BTN_OK").rating(5).build(),
/* imageBytes */ null,
callback);TranslationSuggestion
Builder 模式构造,字段如下:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
stringId | String | 是 | 词条 ID(建议从 getPageString 调用链路中拿到) |
rating | int | 否 | 1-5;0 或不传表示未评分 |
suggestedTranslation | String | 否 | 玩家撰写的翻译建议;空或 null 表示不提交建议 |
currentTranslation | String | 否 | 当前展示的译文。不传时 SDK 会自动用 stringId 查询补全,通常省略即可 |
每个 TranslationSuggestion 至少要满足「评分 > 0」或「非空建议」之一,否则会被静默过滤。
SuggestSubmitCallback
java
public interface SuggestSubmitCallback {
void onSuccess(int ratingCount, int suggestionCount);
void onFailure(String errorMsg);
}ratingCount:服务端计入的纯评分条数suggestionCount:服务端计入的翻译建议条数(含同时含评分的)onFailure:SDK 校验失败、网络异常、HTTP 非 2xx 均走此回调
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| suggestions | List<TranslationSuggestion> / TranslationSuggestion | 是 | 反馈条目,至少 1 条 |
| imageBytes | byte[] | 否 | PNG/JPEG 截图。传 null 时 SDK 不会自动截屏(与方式一/二不同) |
| callback | SuggestSubmitCallback | 否 | 提交结果回调,主线程触发 |
注意事项
submitTranslationSuggestions不会自动截屏;如需附带截图,请在打开自绘对话框之前自行抓取,否则截到的是对话框本身- 服务端契约与
suggestTranslation完全一致,仅是入口不同;同一stringId在同一玩家维度的去重 / 风控由服务端处理 - 调用前需满足同样的前提条件(SDK 已初始化 +
userId已设置)
老接口迁移
| 老接口 | 新接口 | 说明 |
|---|---|---|
evaluateString(code, content) | suggestTranslation(new String[]{code}) 或 submitTranslationSuggestions(...) | 老接口签名保留但已 @Deprecated,内部直接转发到 suggestTranslation,content 参数被忽略(新平台始终查询实时译文) |
evaluateAllStrings() | — | 已 @Deprecated 且 no-op(新平台无"整版本评分"维度) |
enableEvaluateFunction(boolean) | — | 已 @Deprecated 且 no-op |
老集成代码无需立即修改即可继续编译运行,但建议尽快迁移到本页面描述的新接口。
内置 UI 的弹窗交互
调用 suggestTranslation() 后 SDK 打开「Text Quality Feedback」卡片:
- 每条 string_id 一行,下方有 5 颗星评分 + 翻译建议输入框
- 底部按钮:
- 仅一条 string_id → 「Submit」
- 多条 string_id → 「Submit All」
- 没评分也没填建议的行会被自动跳过,不会上传空数据
- 提交成功 → Toast 提示 + 自动关闭页面,玩家直接回到游戏
内置 UI 的工作流程
- 调用方法 → 传入当前页面的 string_id 数组
- 展示卡片 → SDK 打开共创界面,展示每条 string_id 当前译文 + 评分 + 建议输入框
- 玩家反馈 → 玩家给出评分、建议或两者
- 提交 → 评分立即入库计入平均分;建议进入审核队列;积分按项目配置发放
- 关闭 → 提交成功 Toast 后自动关闭页面
与 reviewCurrentScreen 的区别
| 对比项 | reviewCurrentScreen | suggestTranslation | submitTranslationSuggestions |
|---|---|---|---|
| 目标用户 | 开发/翻译团队 | 终端玩家 | 终端玩家 |
| 交互方式 | AI Agent 对话 | SDK 弹窗卡片 | 集成方自绘 UI |
| 功能 | AI 分析翻译质量 + 一键优化 + 版本发布 | 玩家反馈译文质量并提建议 | 同左,但 UI 由集成方控制 |
| userId | 不要求 | 必须设置 | 必须设置 |
| 截图 | 始终携带 | 仅在有翻译建议时携带(不传则自动截屏) | 不会自动截屏,由集成方决定是否传 |
| 适用 SDK 版本 | 1.2.8+ | 1.4.0+ | 1.6.0+ |