diff --git a/ENGLISH_LOCALIZATION.md b/ENGLISH_LOCALIZATION.md new file mode 100644 index 0000000..c80cb8c --- /dev/null +++ b/ENGLISH_LOCALIZATION.md @@ -0,0 +1,62 @@ +# 小程序英文静态文案交付记录 + +## 实现范围 + +- 固定英文,使用现有 `vue-i18n`;没有新增或升级依赖,没有增加语言切换入口或在线翻译请求。 +- `src/locales/en.json` 为英文词条,`zh-CN.json` 为中文校对基线,`source-keys.json` 为原文到文案键的索引。 +- 已整理 1,108 条词条,覆盖主包、会员/设备/金币/团队对战/训练分包,以及保留在源码中的历史页面和公共组件。 +- 页面文本、输入提示、弹窗默认文案、前端固定错误提示、静态说明、协议、状态显示、分享标题及 Canvas 绘制文字均纳入翻译;`manifest.json` 中的小程序定位权限用途说明使用对应英文常量。 +- 公共按钮支持英文换行,弹窗和教练点评支持长文案滚动;会员提示和分享 Canvas 的文字做了局部排版调整。 + +## 业务隔离 + +- API 地址、请求结构、路由、状态码、缓存键、WebSocket/Protobuf 字段、计分、射距及靶纸判断保持原样。 +- `audioManager.js` 完全未修改,中文音频键、语音结束事件与播放顺序继续使用原值。 +- 比赛提示继续以原值参与状态与语音判断,由 `formatBattleTip` 在明确的渲染位置显示英文。 +- 新手引导步骤标题保留原值;Header 只对四个已知的静态步骤值转换显示,不对任意动态标题做翻译。 +- Wi-Fi 样式判断继续使用原始状态;段位图片的 `picNames` 和名称保持中文,仅在文本节点展示英文。 +- 训练雷达的兜底数据增加仅用于显示的 `staticLabel`,原始 `name` 及其映射保持原样。服务端返回的维度名称直接显示原文。 +- `translateStatic` 只用于明确来自前端配置或前端计算结果的展示,不应用于接口响应、用户输入或 store 的整体数据。 + +## 保留内容及后续交接 + +| 内容 | 当前处理 | 后续负责人/事项 | +| --- | --- | --- | +| 底部导航图片 `tab-vip.png`、`tab-point-book.png`、`tab-mall.png` | 地址与资源不变 | UI 提供英文图 | +| 首页、引导、设备介绍、VIP/SVIP、训练标题及比赛结果等图片 | 地址与资源不变,图片内中文保留 | UI 按原尺寸与资源位交付英文图 | +| 分享卡片底图、二维码、徽章等 | 保留;只翻译代码绘制的文字 | UI 后续提供需要替换的英文底图 | +| 音频、视频 | 保留 | 如需英语语音,另行准备资源与实施方案 | +| 商品、门店、套餐、公告、固件说明、服务端规则与协议、接口错误消息 | 保留接口原文 | 后端/运营提供英文内容 | +| 接口段位名称及介绍 | 所有后端 HTTP 请求统一携带 `Accept-Language: en-US`,直接展示后端响应 | 后端部署并维护英文段位配置;图标仍按接口原地址展示 | +| 昵称、组织名、设备别名、Wi-Fi 名称、记分备注等用户内容 | 原样展示及提交 | 不机翻 | +| WebView 外部页面、微信授权和支付系统界面 | 保持原有行为 | 对应内容方/系统管理 | +| 调试日志、音频测试页中的原始音频标识、中文正则与判断字符串 | 保留技术原值 | 无需作为页面文案替换 | + +币种、金额、距离、时区与日期计算不作转换。品牌名暂译为 **Sheling Planet**;段位和射箭术语已统一机翻用词,正式品牌译名及协议可由业务方继续校对。 + +## 验证记录 + +- 比赛界面修复:独立及公共 `BattleFooter` 的空回合循环改用明确的变量名,避免编译后的文案字段与 `wx:for-item="i"` 同名,导致文本节点输出 `[object Object]`。不修改回合数据、得分求和或回合图片。 +- 独立比赛顶部进度组件接入 `formatBattleTip`,仅在渲染时转换英文,保留原始中文提示和语音队列;英文顶部文字与调试按钮做局部排版调整,调试按钮保留非正式环境才显示的原条件。 +- `npm run battle:display:check`:先在旧微信编译产物复现行对象输出,再在修复后的 JS + WXML 中验证 0–3 个正常回合、加赛回合、空成绩/零分、红蓝方英文提示和中文状态不变。调试按钮改为紧凑两列,最终真机视觉效果仍需预览验收。 +- 全局英文请求头:统一请求封装的所有 HTTP 请求均携带 `Accept-Language: en-US`,移除段位接口白名单;独立的 `aimRenewAPI` 同样携带英文头,保留不等待响应和忽略响应结果的行为。认证、请求参数、接口地址及响应处理不变。首页继续使用现有 `/user/myHome`,未按文档示例替换成 `/index/myHome`。 +- 固定英文版缓存兼容:恢复用户缓存时仅清空 `lvlName`、`rankName`、`nextRankName` 中的旧中文显示名,等待原有接口回填;保留英文缓存、昵称、身份、设备、段位编号、成绩与图标。配置和榜单维持现有不持久化方式,不新增语言切换或整体清缓存。 +- `npm run rank:i18n:check`:验证所有已覆盖 HTTP 请求的英文头(包括 GET、POST、PUT、DELETE 和独立调瞄续期),有/无登录凭证、分页/赛季参数及原始错误消息保持原行为,并通过真实 Pinia 持久化插件验证旧中文缓存恢复和英文缓存再次恢复。 +- 2026-11-05 只读联调 `/index/appConfig`:测试环境 `apitest.shelingxingqiu.com` 返回 74 条段位,中文请求为 `倔强青铜I / 倔强青铜`,英文请求为 `Bronze I / Bronze`;正式环境 `api.shelingxingqiu.com` 的英文请求仍返回中文,需要后端确认正式环境的多语言支持。两边的中英文请求中,段位编号、升级积分及图标地址均一致。未使用用户凭证调用首页或个人榜单,登录态接口仍需真机联调。 +- 同日只读联调积分榜、十环榜、MVP 榜(各取 1 条、携带 `en-US`):测试环境三榜均返回英文 `Bronze I`;正式环境三榜仍返回中文段位。这是后端响应差异,前端未额外机翻或覆盖这些动态字段。 +- 参数占位符修复:统一 `t` 入口直接读取固定英文词条并执行一次参数替换,兼容 uni-app 小程序运行库直接返回原文的情况。31 条参数文案对照完整版翻译库及当前 uni-app 消息编译器检查,包含数字 0、空字符串、布尔值及参数中含花括号的场景。页面调用和业务数据不作修改。 +- 上传限制修复:定位权限用途说明缩短为 `Find Wi-Fi for device updates`(29 个字符),并在 `i18n:check` 中检查权限说明为 1–30 个字符。上传校验与本地编译是不同步骤,本地构建通过不代表微信上传校验通过。 +- `npm run i18n:check`:通过。核查中英文键、占位符与插值、翻译函数遮蔽、163 个 Vue 文件的 SFC 编译,以及未翻译的模板直接文字与展示属性。 +- 专项用例通过:中文方向音效键、测距/无效射箭语音键、英文测距/无效射箭提示、499/500 cm 边界、次数上限消息、设备/新手试炼进入条件。 +- 使用本次修改前的 Git 基线完成附加对照:所有受影响源码中的资源 URL 一致,音频源码未改变;脚本语法树去除文案调用和明确的显示层调整后与基线一致。 +- `npm run build`:微信小程序构建通过;构建前的协议检查通过(12 个消息、164 个字段)。 +- 已清理四条不存在的旧主包路由:`pages/calibration`、`pages/my-device`、`pages/device-intro`、`pages/ota-wifi`。保留 `pages/device/` 下对应分包页面及现有跳转,剩余 58 条路由均有源文件。 +- 未执行真机视觉验收、实物智能弓/OTA 联调或真实支付。代码与构建检查不能替代这些验收。 + +建议在微信开发者工具及真机重点检查首页、首次引导、设备三态、训练规则、比赛提示、结果页、会员协议、订单、记分本与分享图的英文排版;验证登录、绑定/解绑、OTA、训练/比赛、支付/取消与分享仍按原流程工作。 + +## 日常维护 + +新增固定文案时同步维护三份词条文件,模板和脚本通过 `t(key, params)` 取值;整句使用参数,避免重新引入中文语序拼接。业务枚举、接口数据与媒体标识不要作为翻译目标。 + +运行 `npm run i18n:check` 做本地检查;构建后运行 `npm run i18n:check -- --built`,对真实微信产物模块执行参数插值回归。`npm run battle:display:check` 检查比赛组件真实 JS + WXML 的渲染作用域及英文提示。`node scripts/localization-inventory.cjs` 可只读输出保留中文候选。候选包含日志、语音及判断字符串,不能作为全文替换清单。 diff --git a/scripts/check-battle-display.cjs b/scripts/check-battle-display.cjs new file mode 100644 index 0000000..2edb092 --- /dev/null +++ b/scripts/check-battle-display.cjs @@ -0,0 +1,96 @@ +// 回归截图中的小程序循环作用域问题:执行真实 render,再按 WXML 作用域取文本。 +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const vm = require('node:vm'); +const {baseParse} = require('@vue/compiler-dom'); +const root = path.resolve(__dirname, '..'); +const read = file => fs.readFileSync(path.join(root, file), 'utf8'); +const en = JSON.parse(read('src/locales/en.json')); +const sourceKeys = JSON.parse(read('src/locales/source-keys.json')); +const localeCode = read('src/locales/index.js').replace(/^import .*;\r?\n/gm, '').replace(/export /g, ''); +const locale = new Function('createI18n','en','sourceKeys',localeCode+'\nreturn {t,formatBattleTip};')( + () => ({global: {t: key => key}}), en, sourceKeys); +const computed = getter => ({get value() {return getter();}}); +const vendor = { + computed, unref: value => value, + e: (...parts) => Object.assign({}, ...parts), + f: (items, render) => (typeof items === 'number' ? Array.from({length: items}, (_,i) => i+1) : items) + .map((item,index) => render(item,index,index)), + t: value => value == null ? '' : String(value), + _export_sfc: component => component, +}; +function loadComponent(file, dependencies) { + let component; + vm.runInNewContext(read(file), { + exports: {}, wx: {createComponent: value => {component = value;}}, + require: id => { + for (const [suffix,value] of Object.entries(dependencies)) if (id.endsWith(suffix)) return value; + throw Error('Unexpected component dependency: '+id); + }, + }, {filename: file}); + assert(component, 'No compiled component: '+file); + return component; +} +const prefix = 'dist/build/mp-weixin/pages/team-battle/components/'; +const footer = loadComponent(prefix+'BattleFooter.js', { + 'common/vendor.js': vendor, + 'locales/index.js': locale, + 'constants.js': {RoundImages: {round1:'round1',round2:'round2',round3:'round3',gold1:'gold1'}}, +}); +const wxml = baseParse(read(prefix+'BattleFooter.wxml')); +function evaluate(expression, scope) { + return new Function('scope', 'with(scope){return ('+expression+');}')(scope); +} +function renderedTexts(node,scope) { + const attr = name => (node.props || []).find(p => p.name === name)?.value?.content; + const forValue = attr('wx:for'); + if (forValue) { + const rows = evaluate(forValue.slice(2,-2),scope); + return rows.flatMap((item,index) => renderedTexts({...node,props:node.props.filter(p=>p.name!=='wx:for')}, + {...scope,[attr('wx:for-item') || 'item']:item,[attr('wx:for-index') || 'index']:index})); + } + const ifValue = attr('wx:if'); + if (ifValue && !evaluate(ifValue.slice(2,-2),scope)) return []; + if (node.tag === 'text') { + return [(node.children || []).map(child => { + const value = child.type === 5 ? evaluate(child.content.content,scope) : child.content || ''; + assert(value === null || typeof value !== 'object', 'WXML rendered a loop object in a text node'); + return value == null ? '' : String(value); + }).join('')]; + } + return (node.children || []).flatMap(child => renderedTexts(child,scope)); +} +for (const count of [0,1,2,3,4]) { + const roundResults = Array.from({length:count},(_,index)=>({ + ifGold:index===3, goldRound:index===3 ? 1 : 0, + shoots:{1:[{ring:index===0 ? 10 : 0}],2:[{ring:8}]}, + })); + const props = {roundResults,bluePoints:0,redPoints:0,goldenRound:count===4 ? 1 : 0}; + const data = footer.setup(props)(props,{}); + const texts = renderedTexts(wxml,data); + assert.equal(texts.filter(text=>text===en.pts).length, Math.max(3,count)*2); + assert(!texts.join('').includes('[object Object]')); + if (count) assert(texts.includes('10'), 'Completed round score lost'); + if (count>1) assert(texts.includes('0'), 'Zero score lost'); +} +// 顶部只转换显示值,监听器仍接收原始中文提示,语音控制不增加播放调用。 +for (const tip of ['请蓝队射箭','请红队射箭你重回']) { + const store = {game:{currentShot:1,totalShot:3,tips:tip}}; + const header = loadComponent(prefix+'HeaderProgress.js', { + 'common/vendor.js': {...vendor, + ref:value=>({value}), watch:(source,callback)=>callback(source()), + onMounted:()=>{},onBeforeUnmount:()=>{},o:handler=>handler, + }, + 'locales/index.js':locale, + 'store.js':{useStore:()=>store}, + 'audioManager.js':{audioManager:{setMuted:()=>{}}}, + }); + const data = header.setup({})({},{}); + assert.equal(data.a,locale.formatBattleTip(tip)); + assert(!/[\u3400-\u9fff]/.test(data.a)); + assert.equal(store.game.tips,tip); + assert.equal(data.c,'1'); + assert.equal(data.d,'3'); +} +console.log('Battle display checks passed: compiled JS + WXML, 0–3 rounds and golden round, blank/zero scores, English tips and original Chinese state preserved.'); diff --git a/scripts/check-localization.cjs b/scripts/check-localization.cjs new file mode 100644 index 0000000..75cf117 --- /dev/null +++ b/scripts/check-localization.cjs @@ -0,0 +1,220 @@ +// 英文文案与业务边界检查:不调用网络、设备或支付接口。 +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const vm = require('node:vm'); +const parser = require('@babel/parser'); +const traverse = require('@babel/traverse').default; +const { parse, compileScript } = require('@vue/compiler-sfc'); +const { baseParse } = require('@vue/compiler-dom'); +const { createI18n } = require('vue-i18n'); +const root = path.resolve(__dirname, '..'); +const read = file => fs.readFileSync(path.join(root, file), 'utf8'); +const en = JSON.parse(read('src/locales/en.json')); +const zh = JSON.parse(read('src/locales/zh-CN.json')); +const sourceKeys = JSON.parse(read('src/locales/source-keys.json')); +const han = /[\p{Script=Han}]/u; +const manifest=JSON.parse(read('src/manifest.json')); +assert.equal(manifest['mp-weixin'].permission['scope.userLocation'].desc,en.wifi_location_permission); +// 微信上传会校验权限用途说明,英文也最多允许 30 个字符。 +for (const [scope, permission] of Object.entries(manifest['mp-weixin'].permission || {})) { + assert.equal(typeof permission.desc, 'string', `${scope}: permission description must be a string`); + assert(permission.desc.length > 0 && permission.desc.length <= 30, + `${scope}: permission description must contain 1–30 characters (got ${permission.desc.length})`); +} +const params = value => [...value.matchAll(/\{(p\d+)\}/g)].map(m=>m[1]).sort(); +assert.deepEqual(Object.keys(en).sort(), Object.keys(zh).sort()); +const localeCode = read('src/locales/index.js').replace(/^import .*;\r?\n/gm, '').replace(/export /g, ''); +const api = new Function('createI18n','en','sourceKeys', localeCode+'\nreturn {t,translateStatic,formatBattleTip};')(createI18n,en,sourceKeys); +// 使用当前 uni-app 实际打包的消息编译器复现问题,避免只测 Node 完整版。 +const miniRuntimePath = path.join(path.dirname(require.resolve('@dcloudio/uni-cli-shared/package.json')), + 'lib/vue-i18n/dist/vue-i18n.runtime.esm-bundler.js'); +const miniRuntimeCode = fs.readFileSync(miniRuntimePath, 'utf8'); +let miniCompilerCode; +traverse(parser.parse(miniRuntimeCode, {sourceType: 'module'}), { + ObjectProperty(p) { + if (p.node.key.name === 'messageCompiler' && p.node.value.type === 'FunctionExpression') { + miniCompilerCode = miniRuntimeCode.slice(p.node.value.start, p.node.value.end); + } + }, +}); +assert(miniCompilerCode, 'Cannot locate uni-app message compiler; review runtime compatibility test'); +const miniCompiler = new Function('return (' + miniCompilerCode + ');')(); +const createMiniI18n = ({locale, messages}) => ({global: {t: (key, args = {}) => { + const message = messages[locale][key]; + return message === undefined ? key : miniCompiler(message)({ + normalize: values => values.join(''), + interpolate: value => String(value), + named: name => args[name], + }); +}}}); +const miniApi = new Function('createI18n','en','sourceKeys', localeCode+'\nreturn {t,translateStatic,formatBattleTip};')(createMiniI18n,en,sourceKeys); +const referenceI18n = createI18n({legacy: false, locale: 'en', fallbackLocale: 'en', messages: {en}}); +const parameterized = Object.entries(en).filter(([,value]) => params(value).length); +for (const [key,value] of parameterized) { + for (const example of [0, 7, -2, '', false, 'Bronze', '$& {p1}']) { + const args = Object.fromEntries(params(value).map(name => [name, example])); + const expected = referenceI18n.global.t(key, args); + assert.equal(api.t(key, args), expected, key + ': full runtime interpolation'); + assert.equal(miniApi.t(key, args), expected, key + ': mini runtime interpolation'); + } +} +assert.equal(miniApi.t('value_value_matches', {p0: 'Bronze', p1: 0}), 'Bronze, 0 matches'); +assert.equal(miniApi.t('value_value_matches', {p0: 'Bronze', p1: 12}), 'Bronze, 12 matches'); +assert.equal(miniApi.t('value_value_matches', {p0: '{p1}', p1: 12}), '{p1}, 12 matches'); +assert.equal(miniApi.t('value_value_matches', {p0: '', p1: 0}), ', 0 matches'); +assert.equal(miniApi.t('value_value_matches', {p0: null, p1: 0}), ', 0 matches'); +assert.equal(miniApi.t('value_value_matches', {p0: 'Bronze'}), 'Bronze, {p1} matches'); +assert.equal(miniApi.t('value_value_matches', Object.create({p0: 'Inherited', p1: 12})), en.value_value_matches); +assert.equal(miniApi.formatBattleTip('请开始射箭第三轮'), 'Start shooting round 3'); +console.log(`Interpolation compatibility passed: ${parameterized.length} messages, full and uni-app mini compilers, zero/empty/boolean/literal-brace values.`); +// 构建后检查真实产物模块;只替换平台启动依赖,沿用上方实际小程序编译器。 +if (process.argv.includes('--built')) { + const builtExports = {}; + vm.runInNewContext(read('dist/build/mp-weixin/locales/index.js'), { + exports: builtExports, + require: id => { + assert(/common\/vendor\.js$/.test(id), 'Unexpected built locale dependency: ' + id); + return {createI18n: createMiniI18n}; + }, + }, {filename: 'dist/build/mp-weixin/locales/index.js'}); + for (const [key,value] of parameterized) { + for (const example of [0, 12, '', false, 'Bronze', '$& {p1}']) { + const args = Object.fromEntries(params(value).map(name => [name, example])); + assert.equal(builtExports.t(key, args), referenceI18n.global.t(key, args), key + ': built module interpolation'); + } + } + console.log(`Built WeChat locale module passed: ${parameterized.length} parameterized messages.`); +} +for (const [key,value] of Object.entries(en)) { + assert(!han.test(value), 'English contains Chinese: '+key); + assert.deepEqual(params(value), params(zh[key]), 'Placeholder mismatch: '+key); + const args=Object.fromEntries(params(value).map(name=>[name, name.toUpperCase()])); + const output=api.t(key,args); + for (const name of params(value)) assert(output.includes(args[name]),'Interpolation failed: '+key); +} +for (const [source,key] of Object.entries(sourceKeys)) assert.equal(zh[key],source); +assert.equal(api.formatBattleTip('请红队射箭你重回'),'Red team, shoot'); +assert.equal(api.formatBattleTip('上半场:请先射6箭'),'First half: shoot 6 arrows first'); +assert.equal(api.formatBattleTip('请开始射箭第三轮'),'Start shooting round 3'); +assert.equal(api.translateStatic('An unknown server value'),'An unknown server value'); +let vueCount=0, references=0; +const files=[]; +function walk(dir) { + for (const item of fs.readdirSync(path.join(root,dir),{withFileTypes:true})) { + const file=dir+'/'+item.name; + if (item.isDirectory()) {if (!['static','locales'].includes(item.name)) walk(file);} + else if (/\.(vue|js)$/.test(file) && !/match\.min\.js/.test(file)) files.push(file); + } +} +walk('src'); +function checkJs(code,file,expression=false) { + let ast; + try {ast=parser.parse(expression?'('+code+')':code,{sourceType:'module'});} catch(error) {if (expression) return;throw error;} + traverse(ast,{CallExpression(p) { + const n=p.node; + if (!['t','translate'].includes(n.callee.name) || n.arguments[0]?.type!=='StringLiteral') return; + const binding=p.scope.getBinding(n.callee.name); + if (!expression) assert(binding && binding.path.node.type==='ImportSpecifier' && /locales/.test(binding.path.parent.source.value),file+': translation function shadowed'); + const key=n.arguments[0].value; + assert(Object.hasOwn(en,key),file+': missing key '+key);references++; + const supplied=n.arguments[1]?.properties?.map(prop=>prop.key.name)||[]; + assert.deepEqual(supplied.sort(),params(en[key]),file+': wrong parameters for '+key); + }}); +} +for (const file of files) { + const code=read(file); + if (!file.endsWith('.vue')) {checkJs(code,file);continue;} + const {descriptor,errors}=parse(code,{filename:file}); + assert.equal(errors.length,0,file+': SFC parse failed');vueCount++; + if (descriptor.script || descriptor.scriptSetup) { + compileScript(descriptor,{id:file}); + for (const b of [descriptor.script,descriptor.scriptSetup]) if (b) checkJs(b.content,file); + } + if (!descriptor.template) continue; + function visit(n) { + if (n.type===2) assert(!han.test(n.content),file+': untranslated template text '+n.content); + if (n.type===5) checkJs(n.content.content,file,true); + for (const prop of n.props||[]) { + if (prop.exp) checkJs(prop.exp.content,file,true); + if (prop.type===6 && prop.value && !/^(src|class|id|style|key|name|value|tips|end-audio-key|practice-end-audio-key)$/.test(prop.name)) assert(!han.test(prop.value.content),file+': untranslated attribute '+prop.name); + } + for (const c of n.children||[]) visit(c); + } + visit(baseParse(descriptor.template.content)); +} +// 固件与比赛继续使用中文语音键,英文仅用于展示。 +const utilCode=read('src/util.js').replace(/^import .*;\r?\n/gm,'').replace(/export /g,''); +const uni={getMenuButtonBoundingClientRect:()=>({top:20}),getAccountInfoSync:()=>({miniProgram:{envVersion:'release'}}),showToast:()=>{}}; +const util=new Function('t','translateStatic','uni',utilCode+'\nreturn {getDirectionText,getShootValidation,getDistanceCheckAudioKey,getDistanceCheckText,getInvalidShotAudioKey,getInvalidShotText,isLimitError,canEenter};')(api.t,api.translateStatic,uni); +for (const [angle,expected] of [[0,'下'],[45,'左下'],[90,'左'],[135,'左上'],[180,'上'],[225,'右上'],[270,'右'],[315,'右下']]) assert.equal(util.getDirectionText(angle),expected); +for (const shot of [null,{}, {distance:0}, {distance:-1}, {distance:499,targetOk:true}, {distance:500,targetOk:true}, {distance:600,targetOk:false}]) { + assert(han.test(util.getInvalidShotAudioKey(shot))); + assert(han.test(util.getDistanceCheckAudioKey(shot))); + assert(!han.test(util.getInvalidShotText(shot))); + assert(!han.test(util.getDistanceCheckText(shot))); +} +assert.equal(util.getShootValidation({distance:499,targetOk:true}).distanceOk,false); +assert.equal(util.getShootValidation({distance:500,targetOk:true}).distanceOk,true); +assert(util.isLimitError({message:'今日次数已达上限'})); +assert(!util.isLimitError({message:'other error'})); +assert.equal(util.canEenter({}, {}, true),false); +assert.equal(util.canEenter({trio:1},{deviceId:'test'},true),true); +assert.equal(util.canEenter({trio:1},{deviceId:'test'},false),false); +assert.equal(util.canEenter({trio:0},{deviceId:'test'},true),false); +// 对照 Git 基线检查协议资源未改动,只检查当前变更涉及的源码文件。 +const urls=code=>[...code.matchAll(/https?:\/\/[^\s"'`<>]+/g)].map(m=>m[0]).sort(); +function scriptShapes(code,file) { + const blocks=file.endsWith('.vue') ? ((d)=>[d.script,d.scriptSetup].filter(Boolean).map(b=>b.content))(parse(code).descriptor) : [code]; + return blocks.map(block=>{ + const ast=parser.parse(block,{sourceType:'module'}); + function clean(value) { + if (Array.isArray(value)) return value.map(clean).filter(v=>v!==undefined); + if (!value || typeof value!=='object') return value; + if (value.type==='ImportDeclaration' && /locales/.test(value.source.value)) return undefined; + if (file==='src/pages/training/index.vue' && value.type==='ObjectProperty' && value.key.name==='staticLabel') return undefined; + if (file==='src/canvas.js' && value.type==='CallExpression' && value.callee.name==='renderText') { + const key=value.arguments[1]?.arguments?.[0]?.value; + if (key==='today_s_check_in') { assert.equal(value.arguments[2].value,9); value.arguments[2].value=14; } + if (key==='total') { assert.equal(value.arguments[4].value,102); value.arguments[4].value=122; } + } + if (value.type==='ExpressionStatement' && value.expression.callee?.property?.name==='use' && value.expression.arguments?.[0]?.name==='i18n') return undefined; + if (value.type==='CallExpression') { + if (value.callee.name==='translateStatic') return clean(value.arguments[0]); + if (['t','translate'].includes(value.callee.name) && value.arguments[0]?.type==='StringLiteral') { + const source=zh[value.arguments[0].value]; + assert.notEqual(source,undefined,file+': unknown source'); + const matches=[...source.matchAll(/\{(p\d+)\}/g)]; + if (!matches.length) return {type:'StringLiteral',value:source}; + const argumentsMap=Object.fromEntries((value.arguments[1]?.properties||[]).map(p=>[p.key.name,p.value])); + let cursor=0; + const quasis=matches.map(m=>{const text=source.slice(cursor,m.index);cursor=m.index+m[0].length;return {type:'TemplateElement',value:{cooked:text},tail:false};}); + quasis.push({type:'TemplateElement',value:{cooked:source.slice(cursor)},tail:true}); + return clean({type:'TemplateLiteral',quasis,expressions:matches.map(m=>argumentsMap[m[1]])}); + } + } + if (value.type==='TemplateLiteral' && !value.expressions.length) return {type:'StringLiteral',value:value.quasis[0].value.cooked}; + const result={}; + for (const [key,item] of Object.entries(value)) { + if (['start','end','loc','extra','leadingComments','innerComments','trailingComments','comments','tokens','errors','raw'].includes(key)) continue; + const next=clean(item); + if (next!==undefined) result[key]=next; + } + // 唯一调整的脚本标点位于测距展示文本,不参与判断。 + if (result.type==='TemplateElement' && result.value.cooked===',') result.value.cooked='; '; + return result; + } + return clean(ast.program); + }); +} +const baselinePath=process.argv.slice(2).find(arg => arg !== '--built'); +if (baselinePath) { + const baseline=JSON.parse(fs.readFileSync(baselinePath,'utf8').replace(/^\uFEFF/,'')); + for (const [file,original] of Object.entries(baseline)) { + assert.deepEqual(urls(read(file)),urls(original),file+': URL changed'); + assert.deepEqual(scriptShapes(read(file),file),scriptShapes(original,file),file+': non-localization script change'); + if (file==='src/audioManager.js') assert.equal(read(file).replace(/\r\n/g,'\n'),original.replace(/\r\n/g,'\n'),'Audio resources or keys changed'); + } + console.log('Git baseline media URLs and audio resources verified.'); +} +console.log(`Localization checks passed: ${Object.keys(en).length} entries, ${references} references, ${vueCount} Vue files; placeholders, static templates, audio keys, shooting validation and entry conditions verified.`); diff --git a/scripts/check-rank-i18n.cjs b/scripts/check-rank-i18n.cjs new file mode 100644 index 0000000..0021936 --- /dev/null +++ b/scripts/check-rank-i18n.cjs @@ -0,0 +1,136 @@ +// 段位多语言集成回归:请求使用本地桩,缓存通过真实 Pinia 持久化插件恢复。 +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const { createPinia, defineStore } = require('pinia'); +const { createSSRApp } = require('vue'); +const persist = require('pinia-plugin-persistedstate').default; +const root = path.resolve(__dirname, '..'); +const read = file => fs.readFileSync(path.join(root, file), 'utf8'); +const requests = []; +let hasToken = true; +let nextFailure; +const rank = {rankLvl: 1, rankName: 'Bronze I', rankIcon: 'https://example.test/青铜1.png'}; +const apiUni = { + getAccountInfoSync: () => ({miniProgram: {envVersion: 'trial'}}), + getStorageSync: key => hasToken && key === 'trial_token' ? 'existing-token' : '', + request(options) { + requests.push(options); + if (options.url.endsWith('/user/device/aimRenew')) return {}; + if (nextFailure) { + const error = nextFailure; + nextFailure = undefined; + options.success({statusCode: 200, data: error}); + return; + } + const data = options.url.includes('/myHome') + ? {...rank, user: {id: 42, scores: 150, rankLvl: 1, nickName: '原昵称'}} + : {list: [{...rank}], randInfos: [{rank_id: 1, upgrade_scores: 100, name: 'Bronze I', icoin: rank.rankIcon}]}; + options.success({statusCode: 200, data: {code: 0, data}}); + }, +}; +const apiCode = read('src/apis.js').replace(/^import .*;\r?\n/gm, '').replace(/^export /gm, ''); +const api = new Function('uni', 't', 'normalizeBattleApiResult', apiCode + ` +return {request, getAppConfig, getHomeData, getScoreRankList, getTenRingRankList, getMvpRankList, +getMyScoreRank, getMyTenRingRank, getMyMvpRank, getSeasonStats, getProvinceData, getDailyCountAPI, aimRenewAPI}; +`)(apiUni, key => key, data => data); + +const storeCode = read('src/store.js').replace(/^import .*;\r?\n/gm, '').replace('export default defineStore', 'return defineStore'); +function restore(cached) { + const storage = new Map([ + ['store', JSON.stringify(cached)], + ['trial_token', 'existing-token'], + ['point-book', JSON.stringify({draft: true})], + ]); + const uni = {getStorageSync: key => storage.get(key), setStorageSync: (key, value) => storage.set(key, value)}; + const useStore = new Function('defineStore', 'uni', storeCode)(defineStore, uni); + const pinia = createPinia(); + pinia.use(persist); + createSSRApp({}).use(pinia); + return {store: useStore(pinia), storage}; +} + +async function main() { + const config = await api.getAppConfig(); + const home = await api.getHomeData(42); + await api.getScoreRankList(42, 2, 20); + await api.getTenRingRankList(42, 2, 20); + await api.getMvpRankList(42, 2, 20); + await api.getMyScoreRank(42); + await api.getMyTenRingRank(42); + await api.getMyMvpRank(42); + await api.getSeasonStats(0); + await api.request('GET', '/index/myHome?seasonId=42'); + for (const request of requests) { + assert.equal(request.header['Accept-Language'], 'en-US'); + assert.equal(request.header.Authorization, 'Bearer existing-token'); + assert.equal(request.method, 'GET'); + assert(request.url.startsWith('https://apitest.shelingxingqiu.com/api/shoot/')); + } + assert(requests[1].url.endsWith('/user/myHome?seasonId=42'), 'Existing home route must remain unchanged'); + assert.deepEqual(requests[2].data, {seasonId: 42, page: 2, perPage: 20}); + assert.deepEqual(requests[8].data, {seasonId: 0}); + assert.equal(home.user.rankName, rank.rankName); + assert.equal(home.user.rankIcon, rank.rankIcon); + assert.equal(home.user.nickName, '原昵称'); + await api.getProvinceData(); + await api.getDailyCountAPI(); + await api.request('GET', '/index/appConfig/other'); + await api.request('POST', '/index/appConfig'); + await api.request('PUT', '/test/update', {value: 0}); + await api.request('DELETE', '/test/delete', {id: 42}); + for (const request of requests.slice(10)) { + assert.equal(request.header['Accept-Language'], 'en-US', 'All HTTP requests must declare English'); + assert.equal(request.header.Authorization, 'Bearer existing-token'); + } + assert.deepEqual(requests.at(-2).data, {value: 0}); + assert.deepEqual(requests.at(-1).data, {id: 42}); + // 续期请求即使未收到响应,也必须保持同步返回且不弹失败提示。 + assert.equal(api.aimRenewAPI(), undefined); + assert.equal(requests.at(-1).header['Accept-Language'], 'en-US'); + assert.equal(requests.at(-1).header.Authorization, 'Bearer existing-token'); + assert.equal(requests.at(-1).method, 'POST'); + assert.deepEqual(requests.at(-1).data, {}); + assert.equal(requests.at(-1).timeout, 10000); + assert.equal(requests.at(-1).fail({errMsg: 'timeout'}), undefined); + hasToken = false; + await api.getAppConfig(); + assert.deepEqual(requests.at(-1).header, {'Accept-Language': 'en-US'}); + assert.equal(api.aimRenewAPI(), undefined); + assert.deepEqual(requests.at(-1).header, {'Accept-Language': 'en-US'}); + hasToken = true; + nextFailure = {code: 400, message: '设备未连接', data: {reason: 'offline'}}; + await assert.rejects(api.request('POST', '/test/error', {}, undefined, undefined, {showErrorToast: false}), + error => error.code === 400 && error.message === '设备未连接' && error.data.reason === 'offline'); + assert.equal(requests.at(-1).header['Accept-Language'], 'en-US'); + + const legacy = { + user: {id: 42, nickName: '原昵称', avatar: 'avatar.png', trio: 1, scores: 150, rankLvl: 1, + lvlName: '倔强青铜I', rankName: '倔强青铜I', nextRankName: '倔强青铜II', + rankIcon: rank.rankIcon, nextRankIcon: 'next.png', lvlImage: 'level.png', vip: true}, + device: {deviceId: 'unchanged-device', deviceName: '我的弓'}, + }; + const {store, storage} = restore(legacy); + for (const [field, value] of Object.entries(legacy.user)) { + assert.deepEqual(store.user[field], ['lvlName','rankName','nextRankName'].includes(field) ? '' : value); + } + assert.deepEqual({...store.device}, legacy.device); + assert.equal(storage.get('trial_token'), 'existing-token'); + assert.equal(storage.get('point-book'), JSON.stringify({draft: true})); + assert.deepEqual([...storage.keys()].sort(), ['store', 'trial_token', 'point-book'].sort()); + await store.updateConfig(config); + await store.updateUser(home.user); + assert.equal(store.user.rankName, 'Bronze I'); + assert.equal(store.user.lvlName, 'Bronze I'); + assert.equal(store.user.scores, 150); + assert.equal(store.user.rankLvl, 1); + store.$persist(); + const next = restore(JSON.parse(storage.get('store'))).store; + assert.equal(next.user.rankName, 'Bronze I', 'English cached labels must survive cold start'); + assert.equal(next.user.lvlName, 'Bronze I'); + assert.equal(next.user.nickName, '原昵称'); + assert.deepEqual({...next.device}, legacy.device); + assert.equal(restore({user: {id: 7, rankName: '', lvlName: null}, device: {}}).store.user.lvlName, null); + console.log('Rank i18n checks passed: global HTTP English headers (GET/POST/PUT/DELETE + aim renewal), auth/query/pagination and original errors preserved; non-blocking renewal and real Pinia cache hydration verified.'); +} +main().catch(error => {console.error(error); process.exitCode = 1;}); diff --git a/scripts/localization-inventory.cjs b/scripts/localization-inventory.cjs new file mode 100644 index 0000000..6368f7b --- /dev/null +++ b/scripts/localization-inventory.cjs @@ -0,0 +1,63 @@ +// 只读提取源码中的中文候选;不扫描图片、生成物或第三方依赖。 +const fs = require('node:fs'); +const path = require('node:path'); +const parser = require('@babel/parser'); +const traverse = require('@babel/traverse').default; +const sfc = require('@vue/compiler-sfc'); +const dom = require('@vue/compiler-dom'); +const han = /[\p{Script=Han}]/u; +const root = path.resolve(__dirname, '../src'); +const entries = []; +function scripts(code, file, offset = 0, context = 'script') { + if (context === 'expression') { code = '(' + code + ')'; offset -= 1; } + const ast = parser.parse(code, {sourceType: 'module', plugins: ['typescript'], errorRecovery: true}); + traverse(ast, { + StringLiteral(p) { add(p, p.node.value, 'string'); }, + TemplateLiteral(p) { + if (!p.node.quasis.some(q => han.test(q.value.cooked || q.value.raw))) return; + const text = p.node.quasis.map((q, i) => (q.value.cooked ?? q.value.raw) + (i < p.node.expressions.length ? `{p${i}}` : '')).join(''); + add(p, text, 'template'); + }, + }); + function add(p, text, kind) { + if (!han.test(text) || /^https?:/.test(text)) return; + const ancestors = []; + let q = p; + for (let i = 0; q && i < 5; i++, q = q.parentPath) { + const n = q.node; + ancestors.push(n.type + (n.key?.name ? ':' + n.key.name : '') + (n.type === 'CallExpression' ? ':' + code.slice(n.callee.start, n.callee.end) : '')); + } + entries.push({file, start: offset + p.node.start, end: offset + p.node.end, kind, text, context, ancestors: ancestors.join(' > '), snippet: code.slice(Math.max(0, p.node.start - 65), Math.min(code.length, p.node.end + 65))}); + } +} +function inspect(file) { + const code = fs.readFileSync(path.join(root, file), 'utf8'); + if (file.endsWith('.js')) return scripts(code, file); + const {descriptor} = sfc.parse(code); + for (const block of [descriptor.script, descriptor.scriptSetup]) if (block) scripts(block.content, file, block.loc.start.offset); + const block = descriptor.template; + if (!block) return; + const ast = dom.baseParse(block.content); + function walk(n) { + if (n.type === 2 && han.test(n.content)) entries.push({file, start: block.loc.start.offset + n.loc.start.offset, end: block.loc.start.offset + n.loc.end.offset, kind:'text', text:n.content, context:'template'}); + if (n.type === 5 && han.test(n.content.content)) scripts(n.content.content, file, block.loc.start.offset + n.content.loc.start.offset, 'expression'); + for (const prop of n.props || []) { + if (prop.type === 6 && prop.value && han.test(prop.value.content) && !/^(src|class|id|style|key|name|value)$/.test(prop.name)) entries.push({file, start:block.loc.start.offset + prop.loc.start.offset, end:block.loc.start.offset + prop.loc.end.offset, kind:'attribute', text:prop.value.content, attribute:prop.name, context:'template'}); + if (prop.type === 7 && prop.exp && han.test(prop.exp.content)) { + try { scripts(prop.exp.content, file, block.loc.start.offset + prop.exp.loc.start.offset, 'expression'); } catch (e) { /* v-for 等非独立表达式保留人工检查 */ } + } + } + for (const child of n.children || []) walk(child); + } + walk(ast); +} +function walk(dir) { + for (const item of fs.readdirSync(path.join(root, dir), {withFileTypes:true})) { + const file = path.posix.join(dir, item.name); + if (item.isDirectory()) { if (item.name !== 'static' && item.name !== 'locales') walk(file); } + else if (/\.(vue|js)$/.test(file) && !/match\.min\.js|audioManager\.js/.test(file)) inspect(file); + } +} +walk(''); +if (require.main === module) process.stdout.write(JSON.stringify(entries, null, 2)); +module.exports = entries; diff --git a/src/locales/en.json b/src/locales/en.json new file mode 100644 index 0000000..572e12a --- /dev/null +++ b/src/locales/en.json @@ -0,0 +1,1110 @@ +{ + "wifi_location_permission": "Find Wi-Fi for device updates", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "22": "22", + "request_timed_out_please_try_again": "Request timed out. Please try again.", + "network_disconnected_check_your_network_settings": "Network disconnected. Check your network settings.", + "cannot_connect_to_the_server_please_try_again": "Cannot connect to the server. Please try again.", + "network_error_check_your_connection": "Network error. Check your connection.", + "request_failed_please_try_again": "Request failed. Please try again.", + "network_error_please_try_again": "Network error. Please try again.", + "notice": "Notice", + "your_account_has_been_signed_in_on_another_device": "Your account has been signed in on another device", + "today_s_check_in": "Today’s Check-in", + "m": " m", + "shot_grouping": "Shot Grouping", + "gold_hit_rate": "Gold Hit Rate", + "10s": "10s", + "average_score": "Average Score", + "total_score": "Total Score", + "shot_distribution": "Shot Distribution", + "score": "Score", + "sheling_planet": "Sheling Planet", + "track_every_arrow_join_us": "Track every arrow. Join us!", + "scan_to_check_in": "Scan to Check In", + "arrows_this_week": "Arrows This Week", + "calories_this_week": "Calories This Week", + "my_rank": "My Rank", + "your_archery_journey_starts_here": "Your archery journey starts here", + "archery_check_in_value": "Archery check-in: {p0}", + "total": "Total ", + "pts": " pts", + "sheling": "Sheling", + "join_us_and_play": "Join us and play!", + "practice_makes_a_great_archer": "Practice makes a great archer", + "coming_soon": "Coming soon", + "return_to_your_current_match": "Return to your current match", + "back_to_room": "Back to Room", + "blue": "Blue (", + "red": "Red (", + "arrows_total": " arrows, total ", + "battery": "Battery --", + "battery_value": "Battery {p0}%", + "x": "X", + "value_pts": "{p0} pts", + "0_pts": "0 pts", + "miss": "Miss", + "halftime": "Halftime", + "xp_1": " XP +1 ", + "simulate": "Simulate", + "shoot": "Shoot", + "sight_on": "Sight On", + "sight_off": "Sight Off", + "finish_your_current_match_before_starting_a_new_one": "Finish your current match before starting a new one.", + "you_have_a_match_in_progress_join_it": "You have a match in progress. Join it?", + "stay_out": " Stay Out ", + "loading": "Loading...", + "join": "Join", + "leaving_may_result_in_a_loss": "Leaving may result in a loss.", + "are_you_sure_you_want_to_leave": "Are you sure you want to leave?", + "leave_match": "Leave Match", + "continue_match": " Continue Match ", + "done_playing_for_today": "Done playing for today?", + "cancel": " Cancel ", + "confirm": "Confirm", + "calibrate_your_smart_bow_to_unlock_all_features": "Calibrate your smart bow to unlock all features", + "calibrate": "Calibrate", + "please_complete_the_room_settings": "Please complete the room settings", + "versus_1v1": "Versus (1v1)", + "versus_2v2": "Versus (2v2)", + "versus_3v3": "Versus (3v3)", + "free_for_all_3_10_players": "Free-for-all (3–10 players)", + "select_target_face": "Select Target Face", + "20_cm_full_ring_target": "20 cm Full-ring Target", + "40_cm_full_ring_target": "40 cm Full-ring Target", + "create_room": "Create Room", + "your_smart_bow_is_charging_and_will_shut_down_automatically_to_p": "Your smart bow is charging and will shut down automatically to protect the battery.\nNote: Unplugging the charging cable now will restart the device.", + "got_it": "Got It", + "select_bow_type": "Select Bow Type", + "select_shooting_distance": "Select Shooting Distance", + "select_ends_arrows": "Select Ends / Arrows", + "value_ends_value_arrows": "{p0} ends / {p1} arrows", + "select_ends": "Select Ends", + "m_92": "m", + "custom": "Custom", + "ends": " ends", + "select_arrows_per_end": "Select Arrows per End", + "arrows": " arrows", + "welcome_new_archer": "Welcome, new archer!", + "get_ready": "Get Ready", + "find_your_distance": "Find Your Distance", + "first_challenge": "First Challenge", + "room": "Room: ", + "yuezheng_qingshan": "Yuezheng Qingshan", + "yuwen_yulan": "Yuwen Yulan", + "cen_siyu": "Cen Siyu", + "wu_ziyu": "Wu Ziyu", + "fan_zijin": "Fan Zijin", + "a_worthy_opponent": "A Worthy Opponent", + "le_zirui": "Le Zirui", + "shi_chunxiao": "Shi Chunxiao", + "bai_guhong": "Bai Guhong", + "donggong_jinse": "Donggong Jinse", + "duangan_liuyun": "Duangan Liuyun", + "cancel_matchmaking": "Cancel Matchmaking", + "cancel_133": "Cancel", + "confirm_134": "Confirm", + "please_turn_on_your_smart_bow_first": "Please turn on your smart bow first", + "preparing_firmware_update": "Preparing firmware update", + "downloading_firmware": "Downloading firmware", + "installing_firmware": "Installing firmware", + "updating_firmware": "Updating firmware", + "update_now": "Update Now", + "later": "Later", + "firmware_update_complete": "Firmware update complete", + "close": "Close", + "please_stay_on_this_page": "Please stay on this page!", + "please_make_sure": "Please make sure:", + "1_your_smart_bow_is_on": "1. Your smart bow is on", + "2_your_network_connection_is_stable": "2. Your network connection is stable", + "retry": "Retry", + "points": "Points", + "ready": "Ready", + "waiting_for_a_player": " Waiting for a Player ", + "host": "Host", + "days": " days", + "average": "Average", + "kcal": "kcal", + "gold_hit_rate_156": "Gold hit rate: ", + "10s_157": "10s: ", + "average_158": "Average: ", + "zoom": "Zoom", + "actual_size": "Actual Size", + "thank_you_for_your_support": "Thank you for your support!", + "payment_canceled": "Payment canceled", + "thank_you_for_supporting_our_community_project": "Thank you for supporting our community project!", + "i_have_a_suggestion_optional": "I have a suggestion (optional)", + "your_name": "Your name", + "phone_wechat_id": "Phone / WeChat ID", + "organization": "Organization", + "suggestion": "Suggestion", + "round": "Round ", + "shooting_complete": " shooting complete", + "blue_team_this_round": "Blue team this round: ", + "pts_red_team": " pts, red team: ", + "no_arrows_were_shot_by_either_team_for_3_consecutive_turns_match": " No arrows were shot by either team for 3 consecutive turns. Match canceled. ", + "red_and_blue_teams_each_earn": " Red and blue teams each earn ", + "pts_175": " pts ", + "blue_team_wins_and_earns": " Blue team wins and earns ", + "red_team_wins_and_earns": " Red team wins and earns ", + "blue_team": "Blue Team", + "pts_red_team_179": " pts, red team: ", + "pts_180": " pts", + "a_tie_one_final_arrow_decides_the_winner": "A tie! One final arrow decides the winner", + "s_until_both_teams_shoot": "s until both teams shoot", + "golden_arrow": "Golden Arrow", + "one_arrow_decides_it_all": "One arrow decides it all", + "final_score": "Final Score", + "completed": "Completed ", + "arrows_earned": " arrows, earned ", + "xp": " XP", + "score_this_match_total": "Score this match (total: ", + "pts_194": " pts):", + "view_target": "View Target", + "back": "Back", + "your_score_for_this_session_is": " Your score for this session is ", + "pts_the_average_distance_between_your_arrow_impacts_is": " pts. The average distance between your arrow impacts is ", + "keep_practicing": "Keep practicing!", + "excellent_performance": "Excellent performance.", + "for_this_session": "For this session, ", + "we_recommend_practicing_consistency_in_your_bow_arm_anchor_point": "we recommend practicing consistency in your bow arm, anchor point and release.", + "we_recommend_keeping_up_the_good_work": "we recommend keeping up the good work.", + "we_recommend_adjusting_your_sight_value": "We recommend adjusting your sight {p0}.", + "no_data_yet": "No data yet", + "no_more_results": "No more results", + "halftime_values": "Halftime ({p0}s)", + "time_s_up": "Time’s up!", + "remaining": "Remaining: ", + "s": "s", + "please_authorize_your_phone_number": "Please authorize your phone number", + "please_select_an_avatar": "Please select an avatar", + "please_enter_a_nickname": "Please enter a nickname", + "please_agree_to_the_agreements_first": "Please agree to the agreements first", + "phone": "Phone:", + "authorize": "Authorize", + "avatar": "Avatar:", + "nickname": "Nickname:", + "sign_in_with_phone_number": "Sign In with Phone Number", + "i_have_read_and_agree_to_the": "I have read and agree to the ", + "user_agreement": "User Agreement", + "and": " and ", + "privacy_policy": "Privacy Policy", + "terms": "Terms", + "select_target_type": "Select Target Type", + "red_team": "Red Team", + "stand_at_least_5_m_from_the_target": "Stand at least 5 m from the target", + "shots_from_under_5_m_do_not_count": "Shots from under 5 m do not count", + "simulate_shot": " Simulate Shot ", + "shoot_to_check_distance_and_target_face": "Shoot to check distance and target face", + "match_starts_in": "Match starts in ", + "joining": " Joining... ", + "match": "Match ", + "starts_in": "starts in ", + "earlier": " Earlier ", + "arrows_hidden_showing_the_latest": " arrows hidden. Showing the latest ", + "arrows_241": " arrows ", + "rank_points": "Rank Points", + "national_rank_this_season": "National rank this season: ", + "empty": "", + "this_season": "This Season", + "unranked": "Unranked", + "sign_in": "Sign In", + "congratulations_you_reached": "Congratulations! You reached ", + "sheling_level_value": "Sheling Level {p0}", + "firmware_update_complete_250": "Firmware update complete", + "firmware_update_failed": "Firmware update failed", + "update_failed_check_your_device_and_network_then_retry": "Update failed. Check your device and network, then retry.", + "firmware_update_timed_out_please_try_again": "Firmware update timed out. Please try again.", + "target_firmware_version_is_missing": "Target firmware version is missing", + "could_not_create_the_firmware_update_task_please_retry": "Could not create the firmware update task. Please retry.", + "firmware_update_request_failed_please_retry": "Firmware update request failed. Please retry.", + "awaiting_payment": "Awaiting Payment", + "paid": "Paid", + "shipped": "Shipped", + "completed_260": "Completed", + "closed": "Closed", + "refund_requested": "Refund Requested", + "refund_in_progress": "Refund in Progress", + "refunded": "Refunded", + "refund_declined": "Refund Declined", + "down_and_right": "down and right", + "down": "down", + "down_and_left": "down and left", + "left": "left", + "up_and_left": "up and left", + "up": "up", + "up_and_right": "up and right", + "right": "right", + "about_us": "About Us", + "sheling_planet_is_a_platform_for_professional_archers_and_archer": "Sheling Planet is a platform for professional archers and archery enthusiasts worldwide to connect and interact, powered by smart and Internet of Things technologies. It is developed and operated online by Guangzhou Guangdian Feiwu Network Co., Ltd.", + "we_explore_and_apply_smart_archery_technology_through_innovation": "We explore and apply smart archery technology. Through innovation in IoT, laser systems, artificial intelligence, embedded AI and online archery games, we offer professional smart sports equipment and engaging connected games to bring archery and other professional sports into more homes.", + "guangdong_icp_no_2025421150_2x": "Guangdong ICP No. 2025421150-2X", + "audio_test": "Audio Test", + "continuous_playback_1": "Continuous Playback 1", + "play": " Play ", + "continuous_playback_2": "Continuous Playback 2", + "loaded": "Loaded", + "not_loaded": "Not Loaded", + "play_301": "Play", + "load_and_play": "Load and Play", + "win": "Win", + "scored": "Scored ", + "me": "Me", + "pts_308": " pts", + "your_xp": " Your XP ", + "your_points": " Your Points ", + "view_results": "View Results", + "friend_challenge": "Friend Challenge", + "free_for_all": "Free-for-all", + "valuevvalue_versus": "{p0}v{p1} Versus", + "could_not_check_match_status_please_retry": "Could not check match status. Please retry.", + "could_not_join_the_match_please_retry": "Could not join the match. Please retry.", + "creating_match_please_wait": "Creating match. Please wait.", + "you_have_been_removed_from_the_room": "You have been removed from the room", + "this_room_has_been_closed": "This room has been closed", + "ready_for_a_thrilling_free_for_all": "Ready for a thrilling free-for-all?", + "join_my_team_for_a_2v2_match": "Join my team for a 2v2 match!", + "join_our_3v3_match_we_re_ready_to_go": "Join our 3v3 match. We’re ready to go!", + "ready_to_see_who_is_the_better_archer": "Ready to see who is the better archer?", + "please_use_a": "Please use a ", + "full_ring_target": " full-ring target", + "shots_will_not_count_if_the_target_face_differs_from_your_select": "Shots will not count if the target face differs from your selection", + "ready_329": " Ready ", + "join_330": "Join", + "joining_match": "Joining match...", + "start_match": "Start Match", + "i_m_ready": "I’m Ready", + "once_everyone_is_ready_the_host_can_start_the_match": "Once everyone is ready, the host can start the match", + "you_have_used_all_your_challenges_for_today_activate_membership_": "You have used all your challenges for today.\nActivate membership for more.", + "got_it_335": "Got It", + "activate": "Activate", + "remove": " Remove “", + "from_the_room": "” from the room? ", + "total_coins": "Total Coins: ", + "redeemable_coins": "Redeemable Coins: ", + "no_coin_earnings_yet": "No coin earnings yet.", + "redeemed_item": "Redeemed Item", + "redemption_type": "Redemption Type", + "time": "Time", + "coins_used": "Coins Used", + "type": "Type", + "coins_earned": "Coins Earned", + "allow_location_access_to_find_nearby_stores": "Allow location access to find nearby stores.", + "allow_access": "Allow Access", + "online_redemption_is_not_available_please_redeem_at_a_store": "Online redemption is not available. Please redeem at a store.", + "coins": "Coins", + "empty_352": "", + "times": " times", + "address": "Address: ", + "phone_355": "Phone: ", + "hours": "Hours: ", + "valid_until_value": "Valid until {p0}", + "not_activated": "Not Activated", + "learn_more_about_experience_center_vip": "Learn more about Experience Center VIP >", + "special_offer_cny_9_9_90_days": "Special offer: CNY 9.9 / 90 days", + "your_vip_is_active": "Your VIP is active", + "to_activate_please_contact_staff_at_a_store": "To activate, please contact staff at a store", + "coin_rules": "Coin Rules", + "earnings": "Earnings", + "redemptions": "Redemptions", + "nearby_stores": "Nearby Stores", + "experience_center_vip": "Experience Center VIP", + "my_coins": "My Coins", + "free_trial": "Free Trial", + "enjoy_one_free_30_minute_smart_archery_session_join_the_official": "Enjoy one free 30-minute smart archery session. Join the official community for one additional session.", + "special_offer": "Special Offer", + "buy_one_30_minute_experience_session_at_the_special_price_of_cny": "Buy one 30-minute experience session at the special price of CNY 19.9.", + "complimentary_drink": "Complimentary Drink", + "receive_one_complimentary_designated_drink_each_time_you_visit": "Receive one complimentary designated drink each time you visit.", + "coin_earnings": "Coin Earnings", + "coin_redemptions": "Coin Redemptions", + "no_redemptions_yet": "No redemptions yet.", + "could_not_load_membership_details_retry_or_select_another_store": "Could not load membership details. Retry or select another store.", + "coming_soon_385": "Coming soon", + "experience_center": "Experience Center", + "select_store": "Select Store", + "loading_membership": "Loading membership...", + "experience_center_vip_is_designed_for_archery_enthusiasts_activa": "Experience Center VIP is designed for archery enthusiasts. Activate it to enjoy these three exclusive benefits:", + "could_not_load_tap_to_retry": "Could not load. Tap to retry.", + "no_more_products": "No more products", + "no_items_available_for_redemption": "No items available for redemption", + "please_visit_an_experience_center_and_contact_staff_to_activate_": "Please visit an Experience Center and contact staff to activate VIP.", + "got_it_394": "Got It", + "invalid_store_information": "Invalid store information", + "no_nearby_stores": " No nearby stores ", + "no_more_stores": "No more stores", + "invalid_product_parameters": "Invalid product parameters", + "product_details": "Product Details", + "coins_403": "Coins: ", + "empty_404": " (", + "remaining_405": " remaining)", + "no_coin_rules_yet": "No coin rules yet.", + "about_experience_center_vip": "About Experience Center VIP", + "no_information_available": "No information available", + "point_the_arrow_at_the_target": "Point the arrow at the target", + "take_your_shooting_stance": "Take your shooting stance", + "adjust_the_sight": "Adjust the sight", + "calibrate_smart_bow": "Calibrate Smart Bow", + "complete_the_steps_above_to_calibrate_your_smart_bow": "Complete the steps above to calibrate your smart bow", + "i_ve_calibrated_it": " I’ve Calibrated It ", + "invalid_qr_code_please_scan_again": "Invalid QR code. Please scan again.", + "this_device_is_bound_to_another_account_unbind_it_first": "This device is bound to another account. Unbind it first.", + "bound_successfully_go_back_to_view_your_device": "Bound successfully. Go back to view your device.", + "disconnected": "Disconnected", + "connected_charging": "Connected (Charging)", + "connected": "Connected", + "valueh_valuemin": "{p0}h {p1}min", + "valuemin": "{p0}min", + "online": "Online", + "no_device_number": "No device number", + "model": "Model", + "sheling_smart_bow": "Sheling Smart Bow", + "battery_434": "Battery", + "connection": "Connection", + "device_number": "Device Number", + "device_unbound": "Device unbound", + "this_device_is_already_bound_to_another_account": "This device is already bound to another account.", + "unbind_it_first_to_bind_it_to_this_account": "Unbind it first to bind it to this account.", + "scan_again": "Scan Again", + "invalid_qr_code": "Invalid QR code.", + "only_sheling_smart_bow_device_qr_codes_are_supported": "Only Sheling smart bow device QR codes are supported.", + "first_time_device_binding_gift": " First-time Device Binding Gift: ", + "6_months_of_sheling_membership": "6 months of Sheling membership", + "added_to_this_account_automatically": " Added to this account automatically", + "valid_until": ", valid until ", + "view_beginner_tutorial": "View Beginner Tutorial", + "saved_to_photos": "Saved to Photos", + "press_and_hold_the_qr_code_to_save_it": "Press and hold the QR code to save it", + "loading_qr_code": "Loading QR code...", + "device_id": "Device ID: ", + "save_to_photos": "Save to Photos", + "this_is_the_qr_code_for_your_bound_bow_save_a_screenshot_to_phot": "This is the QR code for your bound bow. Save a screenshot to Photos so you can bind the device when the original QR code is lost or unavailable.", + "note_this_qr_code_will_no_longer_be_available_after_unbinding": "Note: This QR code will no longer be available after unbinding.", + "no_device_qr_code_available": "No device QR code available", + "not_set": "Not Set", + "current_firmware_value_new_firmware_value_update_now": "Current firmware: {p0}. New firmware: {p1}. Update now?", + "new_firmware_value_is_available_update_now": "New firmware {p0} is available. Update now?", + "update_firmware_now": "Update firmware now?", + "battery_468": "Battery", + "device_offline": "Device Offline", + "total_usage": "Total Usage", + "bound_on": "Bound On", + "my_smart_bow": "My Smart Bow", + "please_enter_a_device_name": "Please enter a device name", + "device_names_can_contain_up_to_10_characters": "Device names can contain up to 10 characters", + "only_chinese_and_english_letters_numbers_underscores_and_hyphens": "Only Chinese and English letters, numbers, underscores and hyphens are allowed", + "no_device_bound": "No device bound", + "device_name_updated": "Device name updated", + "could_not_load_device_details_please_retry": "Could not load device details. Please retry.", + "target_firmware_version_is_missing_please_retry": "Target firmware version is missing. Please retry.", + "device_disconnected_sight_adjustment_is_unavailable": "Device disconnected. Sight adjustment is unavailable.", + "email_address_copied": "Email address copied", + "my_device": "My Device", + "scan_the": "Scan the ", + "sheling_smart_bow_484": "Sheling Smart Bow", + "qr_code_on_your_device": "QR code on your device", + "can_t_find_the_qr_code_or_need_help": "Can’t find the QR code or need help? >", + "don_t_have_a_sheling_smart_bow_yet_get_one": "Don’t have a Sheling Smart Bow yet? Get one >", + "archery_fan": "Archery Fan", + "about_the_device": "About the Device", + "sight_adjustment": "Sight Adjustment", + "firmware_update": "Firmware Update", + "wi_fi_settings": "Wi-Fi Settings", + "device_qr_code": "Device QR Code", + "unbind": "Unbind", + "recalibrate_when_your_location_or_distance_changes_to_keep_your_": "Recalibrate when your location or distance changes to keep your smart bow accurate", + "recalibrate": "Recalibrate", + "scan_to_bind_your_sheling_bow": "Scan to Bind Your Sheling Bow", + "sample_device_tag": "Sample Device Tag", + "note_a_bow_that_is_already_bound_cannot_be_bound_again": "Note: A bow that is already bound cannot be bound again.", + "if_you_have_any_questions_please_contact": "If you have any questions, please contact:", + "each_smart_bow_must_be_paired_with_one_account_bind_this_bow_to_": "Each smart bow must be paired with one account. Bind this bow to your current account? You cannot freely switch accounts after binding.", + "binding": "Binding...", + "confirm_binding": "Confirm Binding", + "unbind_device": "Unbind Device", + "after_unbinding_you_cannot_use_this_smart_bow_in_matches_continu": "After unbinding, you cannot use this smart bow in matches. Continue?", + "already_up_to_date": "Already up to date", + "please_update_over_wi_fi": "Please update over Wi-Fi", + "connect_to_wi_fi": "Connect to Wi-Fi", + "only_chinese_and_english_letters_numbers_underscores_and_hyphens_509": "Only Chinese and English letters, numbers, underscores and hyphens are allowed", + "connection_failed_check_the_wi_fi_password_and_network_status": "Connection failed. Check the Wi-Fi password and network status.", + "starts_in_values": "Starts in {p0}s", + "please_enable_location_services_on_your_phone_first": "Please enable location services on your phone first", + "network_names_support_only_english_characters_and_numbers_use_or": "Network names support only English characters and numbers. Use or rename a network accordingly.", + "device_response_timed_out_please_retry": "Device response timed out. Please retry.", + "network_error_check_your_connection_and_retry": "Network error. Check your connection and retry.", + "connecting_to_wi_fi": "Connecting to Wi-Fi...", + "connecting_to_wi_fi_518": "Connecting to Wi-Fi", + "already_up_to_date_520": "Already up to date", + "target_firmware_version_is_missing_go_back_and_retry": "Target firmware version is missing. Go back and retry.", + "could_not_load_device_details_go_back_and_retry": "Could not load device details. Go back and retry.", + "please_enable_wi_fi_then_refresh_and_retry": "Please enable Wi-Fi, then refresh and retry", + "connect_your_smart_bow_to_wi_fi": "Connect Your Smart Bow to Wi-Fi", + "this_connects_your_smart_bow_to_wi_fi_it_will_not_change_the_wi_": "This connects your smart bow to Wi-Fi. It will not change the Wi-Fi network used by your phone.", + "select_network": "Select Network", + "your_phone_s_current_network": "Your Phone’s Current Network", + "connect_to_another_network_manually": "Connect to Another Network Manually", + "permissions_prevent_nearby_networks_from_being_listed_to_connect": "Permissions prevent nearby networks from being listed. To connect to another network, enter its name and password manually.", + "your_smart_bow_can_save_only_one_network_connecting_to_a_new_net": "Your smart bow can save only one network. Connecting to a new network will replace the previous one.", + "allow_location_access_and_enable_location_services_to_find_nearb": "Allow location access and enable location services to find nearby Wi-Fi networks.", + "allow_location_access": "Allow Location Access", + "join_533": "Join \"", + "password": "Password", + "enter_network_password": "Enter network password", + "this_is_an_open_network_tap_to_join": "This is an open network. Tap ✓ to join.", + "join_wi_fi_network": "Join Wi-Fi Network", + "name": "Name", + "enter_network_name": "Enter network name", + "wi_fi_connected": "Wi-Fi Connected", + "wi_fi_connected_541": "Wi-Fi connected", + "the_update_will_start_automatically_in_3_seconds": "The update will start automatically in 3 seconds", + "please_enter_a_valid_device_number": "Please enter a valid device number", + "this_feature_is_for_the_test_environment_only": "This feature is for the test environment only", + "unbind_device_547": "Unbind Device", + "enter_device_number": "Enter device number", + "unbind_549": "Unbind", + "unbind_this_device_test_environment_only": "Unbind this device? (Test environment only)", + "start": "Start", + "next_task": "Next Task", + "i_ve_calibrated_it_553": "I’ve Calibrated It", + "i_m_ready_start": "I’m Ready. Start", + "exit_beginner_challenge": "Exit Beginner Challenge", + "beginner_challenge": "Beginner Challenge", + "calibrate_smart_bow_557": "Calibrate Smart Bow", + "invalid_practice_connection_please_retry": "Invalid practice connection. Please retry.", + "practice_has_not_been_created_please_retry": "Practice has not been created. Please retry.", + "could_not_generate_the_poster_please_retry": "Could not generate the poster. Please retry.", + "get_ready_99": "- Get Ready", + "find_your_distance_101": "- Find Your Distance", + "first_challenge_103": "- First Challenge", + "this_beginner_challenge_helps_you_learn_archery_techniques_and_g": "This beginner challenge helps you learn archery techniques and game rules, even if you have never used a bow before!", + "meet_coach_gao_follow_his_instructions_to_prepare_for_shooting": "Meet Coach Gao! Follow his instructions to prepare for shooting.", + "follow_the_steps_below_to_calibrate_your_smart_bow_and_align_the": "Follow the steps below to calibrate your smart bow and align the sight with the target.", + "do_you_know_how_far_5_meters_is": "Do you know how far 5 meters is?", + "shots_from_under_5_m_do_not_count_in_ranked_matches_we_recommend": "Shots from under 5 m do not count in ranked matches! We recommend practicing from at least 5 m. Shoot and adjust your position to find the right distance.", + "you_re_all_set": "You’re all set", + "try_a_real_archer_s_challenge": "Try a real archer’s challenge!", + "beginner_challenge_complete_well_done": "Beginner challenge complete. Well done!", + "you_ve_learned_the_basics_of_recurve_archery_and_the_sheling_gam": "You’ve learned the basics of recurve archery and the Sheling game rules. That was easy, right?", + "got_it_my_stance_is_even_better_than_the_coach_s": "Got it! My stance is even better than the coach’s", + "i_ve_found_the_right_position": "I’ve Found the Right Position", + "play_again": "Play Again", + "you_are_no_longer_in_this_room": "You are no longer in this room", + "you_have_left_the_room": "You have left the room", + "blue_score": "Blue Score", + "red_score": "Red Score", + "scored_579": " Scored ", + "pts_580": " pts ", + "view_full_results": "View Full Results", + "xp_582": "XP", + "challenge": "Challenge", + "please_enter_a_room_number": "Please enter a room number", + "this_match_has_already_started_you_cannot_join": "This match has already started. You cannot join.", + "room_not_found": "Room not found", + "room_is_full": "Room is full", + "invite_friends_for_a_few_matches_and_have_fun_together": "Invite friends for a few matches and have fun together", + "practice_together_level_up_faster_and_join_national_ranked_match": "Practice together, level up faster and join national ranked matches!", + "my_results": "My Results", + "matches": " matches", + "challenges": "Challenges", + "arrows_shot": "Arrows Shot", + "challenge_difficulty": "Challenge Difficulty", + "enter_room_number": "Enter room number", + "join_room": "Join Room", + "create_challenge_room": " Create Challenge Room ", + "about_levels": "About Levels", + "in_the_sheling_world_your_level_is_an_important_measure_of_your_": "In the Sheling world, your level is an important measure of your archery skills. XP is the key to leveling up. The requirements are as follows:", + "1_earning_xp": "1. Earning XP", + "every_arrow_you_shoot_earns_1_xp_regardless_of_whether_it_hits_t": "Every arrow you shoot earns 1 XP, regardless of whether it hits the target or its score. This is the basic way to increase your Sheling level. Every shot brings you closer to your next goal.", + "2_unlocking_features_and_game_modes": "2. Unlocking Features and Game Modes", + "reach_level_9_to_unlock_challenge_mode_invite_friends_for_exciti": "Reach Level 9 to unlock Challenge Mode. Invite friends for exciting archery matches, share the fun and learn new skills and techniques from one another.", + "reach_level_16_to_unlock_battle_mode_every_match_is_a_valuable_l": "Reach Level 16 to unlock Battle Mode. Every match is a valuable learning opportunity to improve your skills and share advice with friends. Challenge Mode also gives you a stage to show your skills and enjoy the fun and achievement of archery together.", + "bean_stakes_mode_is_coming_soon_at_level_22_you_will_be_able_to_": "Bean Stakes Mode is coming soon! At Level 22, you will be able to compete against players of the same rank, with the winner taking all the Spirit Beans. This adds fun and challenge, gives you opportunities to win more beans and helps you improve through more matches.", + "syncing_device_status_please_try_again_shortly": "Syncing device status. Please try again shortly.", + "real_smart_archery_live_tracking_and_millisecond_sync_compete_wi": "Real smart archery: live tracking and millisecond sync. Compete with archers worldwide!", + "bind_smart_bow": "Bind Smart Bow", + "a_must_for_beginners": "A must for beginners!", + "come_say_hello": "Come say hello!", + "rank": "Rank", + "none": "None", + "season_average_score": "Avg. Score", + "season_win_rate": "Win Rate", + "could_not_load_match_details": "Could not load match details", + "match_information_is_missing": "Match information is missing", + "details": "Details", + "loading_match_details": "Loading match details...", + "tap_to_reload": "Tap to Reload", + "free_for_all_627": "Free-for-all", + "round_value": "Round {p0}", + "score_628": "Score ", + "match_found_joining": "Match found. Joining...", + "matchmaking_timed_out_please_retry": "Matchmaking timed out. Please retry.", + "finding_an_opponent": "Finding an opponent...", + "you_have_used_all_your_ranked_matches_for_today_activate_members": "You have used all your ranked matches for today.\nActivate membership for more.", + "friend_challenge_free_for_all": "Friend Challenge – Free-for-all", + "ranked_match_free_for_all": "Ranked Match – Free-for-all", + "match_ended": "Match ended", + "first_half_complete_take_a_break": "First half complete. Take a break!", + "s_until_the_second_half": "s until the second half", + "device_is_offline": "Device is offline", + "your_device_has_disconnected_check_it_before_continuing_the_matc": "Your device has disconnected. Check it before continuing the match.", + "target_face": "Target Face", + "membership_auto_renewal_agreement": "Membership Auto-renewal Agreement", + "sheling_planet_mini_program_membership_auto_renewal_agreement": "Sheling Planet Mini Program Membership Auto-renewal Agreement", + "welcome_to_the_sheling_planet_mini_program_paid_membership_servi": "Welcome to the Sheling Planet Mini Program paid membership service (the “Service”)!", + "the_service_is_provided_by_guangzhou_guangdian_feiwu_network_co_": "The Service is provided by Guangzhou Guangdian Feiwu Network Co., Ltd. (the “Company”, “we” or “us”) and requires payment. To protect your interests, please carefully read and comply with this Sheling Planet Mini Program Membership Service Agreement (including Auto-renewal Rules) (the “Agreement”) and all service agreements and rules that the Company has published or may publish. Before activating the Service and proceeding to purchase, carefully read and fully understand these agreements and rules, particularly the provisions limiting or excluding liability, governing law and dispute resolution.", + "by_reading_and_agreeing_to_this_agreement_as_instructed_on_the_a": "By reading and agreeing to this Agreement as instructed on the activation page and completing the activation process (including clicking “Agree”, “Next” or “Confirm Payment”, or starting to use the Service), you confirm that you have fully read, understood and accepted all terms. You reach an agreement with the Service provider and become a paid member of the Sheling Planet Mini Program. This Agreement then takes legal effect between you and the Company and binds both parties.", + "1_definitions_and_scope": "1. Definitions and Scope", + "1_1_paid_member_of_the_sheling_planet_mini_program_a_user_who_ha": "1.1 Paid member of the Sheling Planet Mini Program: a user who has signed in under the applicable service agreements and rules, signed this Agreement and paid the fees shown on the activation page to obtain special membership status (a “Member” or “you”). The Company may add or adjust membership types or names as its business develops. The activation page prevails, without affecting your actual benefits.", + "1_2_paid_membership_benefits_special_benefits_available_to_users": "1.2 Paid membership benefits: special benefits available to users through paid membership. The purchase page and related benefit descriptions determine the specific benefits. You understand and agree that the Company may develop different versions for different device models, operating system versions or clients. The benefits and services available may vary by version, as shown on the purchase page.", + "1_3_this_agreement_also_includes_related_agreements_and_rules_fo": "1.3 This Agreement also includes related agreements and rules for the Service that the Company has published or may publish. Once officially published and delivered to you appropriately, such as on the purchase page, website or through system notices, they form an integral part of this Agreement and must also be followed.", + "1_4_to_offer_more_choices_the_company_may_work_with_third_partie": "1.4 To offer more choices, the Company may work with third parties to offer joint memberships or give third-party memberships to purchasers. By purchasing or accepting these services, you acknowledge that we provide only Sheling Planet Mini Program paid membership and are not responsible for third-party membership services. The third party administers and explains its benefits, usage and fees.", + "2_activation_benefits_term_and_fees": "2. Activation, Benefits, Term and Fees", + "2_1_only_signed_in_sheling_planet_mini_program_users_may_activat": "2.1 Only signed-in Sheling Planet Mini Program users may activate the Service. Carefully check your signed-in account, membership type, payment type and term before activation. Fees will not be refunded if you purchase for the wrong account, service type or term for personal reasons.", + "2_2_you_may_purchase_the_service_through_existing_or_future_paym": "2.2 You may purchase the Service through existing or future payment channels or payment methods designated by the Company. Once you confirm as instructed, successfully pay the membership fee and/or complete all required steps, you become a paid member of the Sheling Planet Mini Program.", + "2_3_the_term_of_the_service_the_service_term_is_the_term_you_sel": "2.3 The term of the Service (the “Service Term”) is the term you select and successfully activate. Membership billing and duration use calendar time (calendar months/years), ending at the corresponding time on the applicable expiry date. The Company will stop providing the Service when the term expires. If you activate multiple memberships, their usage and overlap are governed by the official rules on the activation page.", + "2_4_fees_and_specific_benefits_are_those_shown_on_the_activation": "2.4 Fees and specific benefits are those shown on the activation page. The Company may adjust fees and/or benefits as markets, business and service benefits develop. Adjustments take effect when announced. Services activated before the adjustment are unaffected, but renewals or automatic renewal payments after their expiry follow the adjusted standards.", + "2_5_paid_membership_is_a_purchase_of_virtual_content_once_paid_f": "2.5 Paid membership is a purchase of virtual content. Once paid for and purchased, it cannot be refunded or transferred, except where a serious Service defect entirely prevents use or another Company breach occurs, a refund is required by law, or the Company agrees to a refund. If you cancel or terminate membership before expiry, fees already paid are not refundable.", + "2_6_to_protect_your_account_and_prevent_theft_we_may_reasonably_": "2.6 To protect your account and prevent theft, we may reasonably restrict the devices and scope of use for membership accounts. You must not let multiple third parties use your account simultaneously. Otherwise, the Company may adjust or restrict sign-in and usage permissions at any time based on its security and risk controls.", + "3_recurring_purchases_and_auto_renewal": "3. Recurring Purchases and Auto-renewal", + "3_1_auto_renewal_types_and_billing_cycles": "3.1 Auto-renewal Types and Billing Cycles", + "auto_renewal_includes_recurring_monthly_and_annual_plans_billing": "Auto-renewal includes recurring monthly and annual plans. Billing cycles follow the corresponding calendar date in each calendar month/year. For example, a monthly plan activated on the 18th renews on the 18th of the next month. If no corresponding date exists, such as February following January 31, renewal occurs on the last day of that calendar month. The Company may add or adjust plan types to meet member needs. The activation page determines the available types.", + "3_2_how_auto_renewal_works": "3.2 How Auto-renewal Works", + "1_auto_renewal_is_offered_to_existing_members_to_prevent_service": "(1) Auto-renewal is offered to existing members to prevent service interruptions caused by missed renewals. You authorize the Company to automatically deduct the fee for the next billing cycle before your membership expires from the Apple ID balance or third-party payment account linked when you activate auto-renewal, including WeChat Pay or Alipay, thereby extending the corresponding Service Term.", + "2_the_payment_channel_determines_the_actual_debit_date_for_apple": "(2) The payment channel determines the actual debit date. For Apple iOS subscriptions, payment is usually collected within 24 hours before the corresponding billing date in each cycle. For Android or direct Mini Program payments such as WeChat Pay, it is usually collected 1–2 days before expiry. If a payment channel adjusts its timing under its rules or actual circumstances, the actual debit time prevails.", + "3_monitor_your_linked_accounts_and_available_balance_to_ensure_s": "(3) Monitor your linked accounts and available balance to ensure successful payment and uninterrupted renewal. If insufficient funds cause renewal to fail, the Company may suspend or terminate the corresponding benefits and services. You bear any resulting risks or losses.", + "4_the_company_will_remind_you_of_the_upcoming_renewal_payment_5_": "(4) The Company will remind you of the upcoming renewal payment 5 days before the debit date through in-app messages, Mini Program system notifications or SMS. Third-party payment channels may also send payment reminders.", + "5_the_system_automatically_charges_the_linked_payment_account_on": "(5) The system automatically charges the linked payment account on each debit date. If renewal fails due to account issues or insufficient funds and you have not expressly canceled the Service, you are deemed to agree to further debit attempts after that date. Once payment succeeds, the Company will continue providing the corresponding membership benefits.", + "6_if_you_do_not_cancel_auto_renewal_before_each_debit_date_the_c": "(6) If you do not cancel auto-renewal before each debit date, the Company will continue issuing renewal debit instructions under your prior authorization. Once payment succeeds, service for the next billing cycle is activated automatically. Successfully paid renewal fees are generally non-refundable.", + "7_during_auto_renewal_you_may_purchase_additional_membership_tim": "(7) During auto-renewal, you may purchase additional membership time or obtain it through promotions, extending your existing term. Unless you cancel auto-renewal, the system will continue charging and renewing under your active auto-renewal plan.", + "3_3_canceling_auto_renewal": "3.3 Canceling Auto-renewal", + "1_you_may_choose_whether_to_cancel_auto_renewal_to_cancel_you_mu": "(1) You may choose whether to cancel auto-renewal. To cancel, you must do so before each debit date, at least 24 hours in advance. Otherwise, you are deemed to authorize continued auto-renewal.", + "2_after_purchasing_auto_renewal_you_may_turn_it_off_on_the_mini_": "(2) After purchasing auto-renewal, you may turn it off on the Mini Program membership management page or cancel through the applicable third-party payment channel:", + "ios_users_apple_id_subscriptions_open_settings_your_apple_id_nam": "iOS users (Apple ID subscriptions): Open Settings → your Apple ID/name → Subscriptions → Sheling Planet → Cancel Subscription; or open the App Store → your profile picture → Account → Subscriptions to manage it.", + "wechat_pay_users_open_wechat_me_services_wallet_payment_settings": "WeChat Pay users: Open WeChat → Me → Services → Wallet → Payment Settings → Auto-renewal → Sheling Planet Mini Program Membership → Close Service.", + "alipay_users_open_alipay_me_settings_payment_settings_password_f": "Alipay users: Open Alipay → Me → Settings → Payment Settings → Password-free Payments / Automatic Payments → Sheling Planet Mini Program Membership → Close Service.", + "3_4_the_company_may_unilaterally_discontinue_auto_renewal_due_to": "3.4 The Company may unilaterally discontinue auto-renewal due to market conditions, business planning or operating strategy changes, with notice through announcements or in-app messages. Your paid membership ends when the current Service Term expires.", + "4_usage_rules_and_restrictions": "4. Usage Rules and Restrictions", + "4_1_the_service_and_membership_benefits_are_for_your_personal_us": "4.1 The Service and membership benefits are for your personal use only. Without written Company consent, you must not give, lend, rent, transfer, sell or otherwise permit others to use your account or its membership services and benefits. You bear losses from disclosure, loss or theft not caused by the Company.", + "4_2_if_you_use_the_service_unlawfully_or_improperly_in_any_of_th": "4.2 If you use the Service unlawfully or improperly in any of the following ways, the Company may cancel your membership and benefits without refunding fees and may recover its losses from you:", + "obtaining_the_service_through_theft_system_vulnerabilities_or_an": "Obtaining the Service through theft, system vulnerabilities or any channel not officially provided or authorized by the Company;", + "using_the_service_for_profit_or_unlawful_gain_or_transferring_or": "Using the Service for profit or unlawful gain, or transferring or lending membership benefits in any form;", + "illegally_modifying_or_tampering_with_a_membership_account_s_ser": "Illegally modifying or tampering with a membership account’s Service Term or transaction status;", + "cracking_modifying_reverse_operating_or_damaging_security_measur": "Cracking, modifying, reverse-operating or damaging security measures used by the Company to protect membership benefits;", + "other_conduct_that_violates_laws_good_faith_service_agreements_o": "Other conduct that violates laws, good faith, service agreements or Mini Program operating rules.", + "5_suspension_termination_and_changes": "5. Suspension, Termination and Changes", + "5_1_the_company_may_suspend_or_terminate_services_when_required_": "5.1 The Company may suspend or terminate services when required by government or regulators, in the event of force majeure, or if a user breaches this Agreement.", + "5_2_you_acknowledge_that_if_you_voluntarily_cancel_the_service_g": "5.2 You acknowledge that if you voluntarily cancel the Service, give up benefits or terminate membership after activation, you cannot obtain a partial or full refund. After this Agreement ends, you cannot require the Company to continue providing services. Rights and obligations arising before termination remain unaffected.", + "5_3_the_company_may_amend_this_agreement_as_laws_business_needs_": "5.3 The Company may amend this Agreement as laws, business needs or the protection of user interests require, and announce amendments in the manner and under the procedures required by law. If you disagree, you may stop using the Service. Continued use after an amendment takes effect constitutes acceptance.", + "6_limitation_of_liability_and_disclaimers": "6. Limitation of Liability and Disclaimers", + "6_1_you_understand_and_agree_that_the_service_is_provided_as_ava": "6.1 You understand and agree that the Service is provided as available under current technology and conditions. The Company will use its best efforts to ensure continuity and security, but cannot always foresee or prevent technical or other risks, including interruptions, data loss and other losses caused by force majeure, networks or third-party service defects.", + "6_2_under_the_principles_of_proportionality_and_fairness_if_the_": "6.2 Under the principles of proportionality and fairness, if the Company causes an abnormal interruption or unavailability, the maximum compensation available to you will not exceed the total relevant service fees actually collected by the Company for that billing cycle under this Agreement.", + "7_governing_law_and_dispute_resolution": "7. Governing Law and Dispute Resolution", + "7_1_the_formation_effectiveness_performance_interpretation_and_d": "7.1 The formation, effectiveness, performance, interpretation and dispute resolution of this Agreement are governed by the laws of the People’s Republic of China.", + "7_2_this_agreement_is_entered_into_in_nansha_district_guangzhou_": "7.2 This Agreement is entered into in Nansha District, Guangzhou, Guangdong. Any dispute should first be resolved through friendly negotiation. If negotiation fails, either party agrees to submit it to a competent people’s court at the place where this Agreement was entered into.", + "7_3_if_any_provision_is_held_repealed_invalid_or_unenforceable_i": "7.3 If any provision is held repealed, invalid or unenforceable, it is severable and does not affect the validity or enforceability of the remaining provisions.", + "guangzhou_guangdian_feiwu_network_co_ltd": "Guangzhou Guangdian Feiwu Network Co., Ltd.", + "payment_authorization_agreement": "Payment Authorization Agreement", + "payment_authorization_agreement_702": "Payment Authorization Agreement", + "version_v1_0_effective_date_june_22_2026": "Version: V1.0 Effective Date: June 22, 2026", + "1_authorization_statement": "1. Authorization Statement", + "as_a_registered_user_of_the_sheling_planet_mini_program_i_the_au": "As a registered user of the Sheling Planet Mini Program, I (the authorizing party, “Party B”) voluntarily, on an equal basis and with full knowledge of this authorization, authorize Guangzhou Guangdian Feiwu Network Co., Ltd. (“Party A”) and its appointed third-party payment providers, including WeChat Pay, Alipay and Apple Pay (the “Payment Providers”), to make deductions. The parties agree as follows.", + "2_parties_to_the_authorization": "2. Parties to the Authorization", + "authorizing_party_party_b_a_registered_sheling_planet_mini_progr": "Authorizing party (Party B): A registered Sheling Planet Mini Program user, identified by the user ID recorded in the platform system.", + "authorized_party_party_a_guangzhou_guangdian_feiwu_network_co_lt": "Authorized party (Party A): Guangzhou Guangdian Feiwu Network Co., Ltd., the membership service provider and initiator of payment instructions.", + "payment_processor_the_third_party_payment_provider_linked_by_par": "Payment processor: The third-party Payment Provider linked by Party B, entrusted by Party A to execute payments.", + "3_scope_of_authorization": "3. Scope of Authorization", + "authorized_purpose_after_party_b_activates_sheling_planet_member": "Authorized purpose: After Party B activates Sheling Planet membership auto-renewal, Party B authorizes Party A to issue payment instructions before each membership cycle ends to pay for the next cycle.", + "authorized_amount_the_amount_is_the_price_of_the_auto_renewal_pl": "Authorized amount: The amount is the price of the auto-renewal plan selected at activation, as displayed on the membership purchase page. Party A will announce or notify Party B of price changes in advance. Continued use constitutes acceptance of the adjusted amount.", + "authorized_account_the_third_party_payment_account_such_as_wecha": "Authorized account: The third-party payment account, such as WeChat Pay or Alipay, linked by Party B when activating auto-renewal. The Payment Provider’s records determine the account information.", + "authorized_frequency_this_is_a_recurring_authorization_during_it": "Authorized frequency: This is a recurring authorization. During its validity, Party A may issue payment instructions each membership cycle until Party B lawfully revokes it.", + "4_authorization_period": "4. Authorization Period", + "1_this_authorization_takes_effect_when_party_b_confirms_activati": "1. This authorization takes effect when Party B confirms activation of auto-renewal and ends when Party B successfully cancels auto-renewal.", + "2_if_party_b_closes_their_sheling_planet_mini_program_account_th": "2. If Party B closes their Sheling Planet Mini Program account, this authorization ends automatically upon completion of account closure.", + "3_this_authorization_ends_automatically_if_changes_in_national_p": "3. This authorization ends automatically if changes in national policy, Payment Provider rules, closure/freezing of Party B’s payment account or other circumstances beyond Party A’s control prevent its performance.", + "5_payments_and_reminders": "5. Payments and Reminders", + "1_reminder_party_a_will_prominently_notify_party_b_of_upcoming_r": "1. Reminder: Party A will prominently notify Party B of upcoming renewal payments 5 days before each auto-renewal debit date through WeChat service notifications, Mini Program system messages or SMS to protect Party B’s right to know and choose.", + "2_timing_party_a_will_issue_instructions_for_the_next_cycle_with": "2. Timing: Party A will issue instructions for the next cycle within 24 hours before the current membership expires. The Payment Provider deducts the corresponding amount from Party B’s authorized account.", + "3_failed_payments_if_the_first_attempt_fails_due_to_insufficient": "3. Failed payments: If the first attempt fails due to insufficient funds or other reasons, Party A and the Payment Provider may lawfully retry within applicable requirements. If retries fail or the account is abnormal, auto-renewal for that cycle is suspended and membership expires at the end of its term.", + "4_proof_the_payment_provider_s_debit_record_is_valid_proof_of_su": "4. Proof: The Payment Provider’s debit record is valid proof of successful payment. Party B may view details in the payment account statement. Party A also provides electronic payment records in the membership center.", + "6_changes_and_revocation": "6. Changes and Revocation", + "1_changes_to_change_this_authorization_such_as_the_payment_accou": "1. Changes: To change this authorization, such as the payment account or renewal plan, Party B must cancel the existing auto-renewal service and activate a new plan. The new authorization takes effect on successful activation, when the previous authorization ends.", + "2_revocation_party_b_may_cancel_auto_renewal_at_any_time_without": "2. Revocation: Party B may cancel auto-renewal at any time without affecting membership for an already active cycle. The cancellation method depends on the payment processor selected at activation:", + "wechat_pay_revoke_authorization_in_wechat_me_services_wallet_pay": "WeChat Pay: Revoke authorization in WeChat → Me → Services → Wallet → Payment Settings → Auto-renewal, or in the Mini Program membership center.", + "alipay_revoke_authorization_in_alipay_me_settings_payment_settin": "Alipay: Revoke authorization in Alipay → Me → Settings → Payment Settings → Password-free Payments / Automatic Payments, or in the Mini Program membership center.", + "apple_payments_ios_app_store_subscriptions_cancellation_must_be_": "Apple payments (iOS / App Store subscriptions): Cancellation must be made using Apple’s system features: iOS Settings → your Apple ID → Subscriptions → Sheling Planet → Cancel Subscription.", + "3_when_cancellation_takes_effect": "3. When Cancellation Takes Effect:", + "wechat_pay_and_alipay_authorization_ends_immediately_after_succe": "WeChat Pay and Alipay: Authorization ends immediately after successful revocation, and Party A must not issue new payment instructions. If payment was completed automatically before cancellation took effect due to settlement delays or other objective factors, benefits for that cycle are provided as usual and the payment is generally non-refundable.", + "apple_payments_under_apple_s_policies_party_b_must_manually_canc": "Apple payments: Under Apple’s policies, Party B must manually cancel at least 24 hours before the current billing cycle ends, or Apple may renew and charge automatically. Apple independently handles charges and refunds through its channel, which Party A cannot control. If Party B fails to cancel in time, Party B bears the charge or must appeal to Apple.", + "7_disclaimers": "7. Disclaimers", + "1_party_a_is_not_liable_for_failed_payments_caused_by_insufficie": "1. Party A is not liable for failed payments caused by insufficient funds, account freezing, loss reports, closure, limits or other reasons not attributable to Party A. Party B bears resulting consequences, including interruption of membership benefits.", + "2_for_delayed_failed_or_incorrect_payments_caused_by_payment_pro": "2. For delayed, failed or incorrect payments caused by Payment Provider system failures, network interruptions, policy changes, force majeure or other external causes, Party A will assist Party B in resolving the matter but is not liable for compensation.", + "3_party_a_is_not_liable_for_abnormal_payments_caused_by_party_b_": "3. Party A is not liable for abnormal payments caused by Party B’s disclosure of passwords, account theft or other failures to safeguard the account. Party B must seek remedies from the Payment Provider or public security authorities.", + "8_confidentiality": "8. Confidentiality", + "1_party_a_and_the_payment_providers_must_keep_party_b_s_authoriz": "1. Party A and the Payment Providers must keep Party B’s authorization, payment and personal identity information strictly confidential and must not use it for purposes outside this authorization.", + "2_except_as_required_by_law_or_lawfully_requested_by_judicial_or": "2. Except as required by law or lawfully requested by judicial or regulatory authorities, Party A must not disclose Party B’s authorization or payment information to third parties.", + "9_dispute_resolution": "9. Dispute Resolution", + "1_the_formation_validity_performance_and_dispute_resolution_of_t": "1. The formation, validity, performance and dispute resolution of this authorization agreement are governed by the laws of the People’s Republic of China.", + "2_disputes_should_first_be_resolved_through_friendly_negotiation": "2. Disputes should first be resolved through friendly negotiation. If negotiation fails, either party may bring proceedings before a competent people’s court where Party A is located (Tianhe District, Guangzhou, Guangdong).", + "10_other_provisions": "10. Other Provisions", + "1_this_agreement_supplements_the_sheling_planet_mini_program_mem": "1. This Agreement supplements the Sheling Planet Mini Program Membership Service Agreement and has equal legal effect. Matters not covered here are governed by that main agreement.", + "2_party_a_may_adjust_this_agreement_to_meet_business_and_regulat": "2. Party A may adjust this Agreement to meet business and regulatory needs. The revised Agreement will be published on the platform. Continued use of auto-renewal constitutes acceptance.", + "3_customer_support_contact_online_support_in_the_sheling_planet_": "3. Customer support: Contact Online Support in the Sheling Planet Mini Program or email the official customer support address.", + "vip_membership": "VIP Membership", + "join_sheling_planet": "Join Sheling Planet ", + "enjoy_extra_challenges_ranked_matches_and_an_exclusive_member_ba": "Enjoy extra challenges, ranked matches and an exclusive member badge", + "exclusive_vip_benefits": "Exclusive VIP Benefits", + "gold_nickname": "Gold Nickname", + "coach_feedback": "Coach Feedback", + "vip_customer_support": "VIP Customer Support", + "ranked_matches_20_per_day": "Ranked Matches\n+20 per day", + "challenges_20_per_day": "Challenges\n+20 per day", + "svip_membership": "SVIP Membership", + "enjoy_exclusive_effects_unlimited_challenges_and_ranked_matches_": "Enjoy exclusive effects, unlimited challenges and ranked matches, and an exclusive member badge", + "exclusive_svip_benefits": "Exclusive SVIP Benefits", + "exclusive_impact_markers": "Exclusive Impact Markers", + "exclusive_hit_effects": "Exclusive Hit Effects", + "exclusive_shot_effects": "Exclusive Shot Effects", + "colorful_nickname": "Colorful Nickname", + "unlimited_challenges": "Unlimited Challenges", + "unlimited_ranked_matches": "Unlimited Ranked Matches", + "svip_customer_support": "SVIP Customer Support", + "loading_plans": "Loading plans", + "this_plan_is_currently_unavailable": "This plan is currently unavailable", + "wechat_virtual_payments_are_unavailable_in_this_environment": "WeChat virtual payments are unavailable in this environment", + "could_not_generate_payment_parameters": "Could not generate payment parameters", + "payment_successful": "Payment successful", + "payment_canceled_771": "Payment canceled", + "payment_failed_please_try_again": "Payment failed. Please try again.", + "could_not_create_order": "Could not create order", + "valid_until_774": " Valid until: ", + "manage_orders": "Manage Orders", + "select_plan": "Select Plan", + "plan_details": "Plan Details", + "loading_plans_778": "Loading plans", + "creating_order": "Creating order", + "refreshing_membership_status": "Refreshing membership status", + "activate_781": " Activate ", + "by_paying_you_agree_to_the": "By paying, you agree to the ", + "copied": "Copied", + "order_details": "Order Details", + "order_no": "Order No.: ", + "copy": "Copy", + "created": "Created: ", + "paid_788": "Paid: ", + "amount": "Amount: ", + "cny": " CNY", + "payment_method_wechat_pay": "Payment Method: WeChat Pay", + "pay_now": "Pay Now", + "cancel_order": "Cancel Order", + "coming_soon_794": "Coming soon", + "turn_off_auto_renewal_you_will_lose_7_benefits_when_your_members": "Turn off auto-renewal?\nYou will lose 7 benefits when your membership expires.", + "cancel_anyway": "Cancel Anyway", + "keep_benefits": "Keep Benefits", + "membership_benefits": "Membership Benefits", + "sheling_planet_membership_benefits": "Sheling Planet Membership Benefits", + "core_features": "Core Features:", + "unlock_four_core_features_challenges_rank_ratings_live_ranked_ma": "Unlock four core features: challenges, rank ratings, live ranked matches and AI coach feedback.", + "exclusive_support": "Exclusive Support:", + "get_vip_customer_support_at_different_stages_throughout_the_year": "Get VIP customer support at different stages throughout the year for technical issues, rule questions and more.", + "new_user_gift": "New User Gift:", + "all_users_binding_a_device_for_the_first_time_receive_6_months_o": "All users binding a device for the first time receive 6 months of VIP membership for free.", + "join_sheling_planet_to_enjoy_online_competition_through_real_arc": "Join Sheling Planet to enjoy online competition through real archery, meet like-minded archers worldwide, discover new features and system updates, and keep challenging yourself to achieve your personal best!", + "6_months_free_with_first_device_binding": "6 months free with first device binding", + "benefit": "Benefit", + "basic_user": "Basic User", + "none_809": "None", + "spiral": "Spiral", + "glass_cracks": "Glass Cracks", + "arrow_flight_effects": "Arrow Flight Effects", + "light_arrow": "Light Arrow", + "daily_challenges": "Daily Challenges", + "unlimited": "Unlimited", + "daily_ranked_matches": "Daily Ranked Matches", + "exclusive": "Exclusive", + "nickname_style": "Nickname Style", + "gold": "Gold", + "colorful": "Colorful", + "exclusive_support_823": "Exclusive Support", + "membership_stacking_and_activation_rules": "Membership Stacking and Activation Rules", + "membership_priority": "Membership Priority:", + "if_you_have_both_svip_and_vip_svip_benefits_take_priority_your_v": "If you have both SVIP and VIP, SVIP benefits take priority. Your VIP time is deferred and resumes automatically after SVIP expires.", + "stacking_recurring_plans": "Stacking Recurring Plans:", + "if_you_buy_a_recurring_monthly_or_annual_plan_while_holding_a_mo": "If you buy a recurring monthly or annual plan while holding a monthly, half-year or annual pass, the total validity is added together. The recurring plan starts from the order date and is charged automatically in the next cycle.", + "example_buy_a_half_year_pass_on_january_1_expires_july_1_then_a_": "Example: Buy a half-year pass on January 1 (expires July 1), then a recurring monthly plan on January 10. Total validity extends to August 1, when the first automatic payment is initiated.", + "upgrading_to_svip": "Upgrading to SVIP:", + "an_svip_upgrade_takes_effect_immediately_the_purchase_page_shows": "An SVIP upgrade takes effect immediately. The purchase page shows the available upgrade duration. Any remaining VIP time not upgraded resumes after SVIP expires.", + "value_cm_target": "{p0} cm Target", + "5_player_free_for_all": "5-player", + "10_player_free_for_all": "10-player", + "value_player_free_for_all": "{p0}-player Free-for-all", + "my_progress": "My Progress", + "friends_who_liked_me": "Friends Who Liked Me", + "authorization_failed_please_try_again": "Authorization failed. Please try again.", + "your_session_has_expired_sign_in_again_to_complete_binding": "Your session has expired. Sign in again to complete binding.", + "network_error_please_try_again_842": "Network error. Please try again.", + "sign_in_to_the_store_tablet": "Sign In to the Store Tablet", + "authorizing_sign_in": "Authorizing Sign-in", + "signing_in_to_the_store_tablet_please_wait": "Signing in to the store tablet. Please wait...", + "please_sign_in_to_the_mini_program_first": "Please sign in to the Mini Program first", + "sign_in_with_wechat": "Sign In with WeChat", + "you_have_authorized_sign_in_to_the_sheling_planet_store_tablet": "You have authorized sign-in to the Sheling Planet store tablet.", + "account": "Account: ", + "phone_850": "Phone: ", + "store": "Store: ", + "remember_to_sign_out_of_the_tablet_before_leaving_the_store": " Remember to sign out of the tablet before leaving the store! ", + "back_to_home": "Back to Home", + "sign_in_authorization_failed": "Sign-in Authorization Failed", + "sign_in_again": "Sign In Again", + "invalid_qr_code_856": "Invalid QR Code", + "please_scan_the_mini_program_code_on_the_store_tablet_again": "Please scan the Mini Program code on the store tablet again.", + "please_complete_the_information": "Please complete the information", + "select_settings": "Select Settings", + "next": "Next", + "start_my_archery_log": "Start My Archery Log", + "about_shot_grouping": "About Shot Grouping", + "shot_grouping_measures_consistency_by_calculating_the_average_di": "Shot grouping measures consistency by calculating the average distance from each arrow to all other arrows. A smaller value means tighter grouping. This data is available only when you mark impact positions.", + "about_shot_distribution": "About Shot Distribution", + "shows_the_impact_positions_from_a_practice_session": "Shows the impact positions from a practice session", + "archery_check_in_a_little_better_every_day": "Archery check-in: a little better every day!", + "my_notes": "My Notes", + "add_note": "Add Note", + "share": " Share ", + "notes": "Notes", + "add_details_and_reflections_about_this_session": "Add details and reflections about this session", + "save_note": " Save Note ", + "end": "End ", + "empty_874": "", + "delete": "Delete", + "mark_your_shots_on_the_target_face_to_get_grouping_analysis": "Mark your shots on the target face to get grouping analysis", + "leaving_now_will_cause": "Leaving now will cause ", + "unsaved_data_to_be_lost_continue": "unsaved data to be lost. Continue?", + "exit": "Exit", + "continue_recording": " Continue Recording ", + "save_and_view_analysis": "Save and View Analysis", + "next_end": "Next End", + "deleted": "Deleted", + "could_not_delete_please_retry": "Could not delete. Please retry.", + "score_records": "Score Records", + "please_select": "Please select", + "local_draft": "Local Draft", + "scoring_incomplete": "Scoring Incomplete", + "delete_this_record": "Delete this record?", + "topped_the_cover": "topped the cover", + "burned_a_total_of": "Burned a total of ", + "kcal_892": " kcal!", + "rank_893": "Rank", + "user": "User", + "calories": "Calories", + "high": "High", + "moderate": "Moderate", + "low": "Low", + "track_every_shot_improve_with_detailed_analysis": "Track every shot. Improve with detailed analysis!", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun", + "arrows_today": "Arrows Today", + "kcal_910": "kcal", + "calories_today": "Calories Today", + "activity_intensity": "Activity Intensity", + "training_days": "Training Days", + "total_arrows": "Total Arrows", + "generating": "Generating...", + "view_full_rankings": "View Full Rankings", + "you_have_an_unfinished_score_record_continue_editing": "You have an unfinished score record. Continue editing?", + "start_over": " Start Over ", + "continue_editing": " Continue Editing ", + "could_not_reconnect_to_training_please_retry": "Could not reconnect to training. Please retry.", + "training_has_ended_please_enter_again": "Training has ended. Please enter again.", + "single_end_practice": "Single-end Practice", + "start_shooting_round_value": "Start shooting round {p0}", + "two_more_to_go_keep_going": "Two more to go. Keep going—", + "you_ve_got_this": "you’ve got this! 💪", + "i_m_ready_start_927": "I’m Ready. Start", + "daily_endurance_challenge": "Daily Endurance Challenge", + "shoot_value_arrows_in_a_row": "Shoot {p0} arrows in a row", + "more_than_halfway_victory": "More than halfway. Victory ", + "is_in_sight": "is in sight! 💪", + "solo_practice": "Solo Practice", + "your_coach_shows_the_way_progress_comes_from_practice_start_now": "Your coach shows the way. Progress comes from practice. Start now!", + "keep_practicing_to_level_up_faster_and_join_national_ranked_matc": "Keep practicing to level up faster and join national ranked matches!", + "practice_check_ins": "Practice Check-ins", + "solo_practice_arrows": "Solo Practice Arrows", + "sheling_937": "Sheling ", + "empty_938": "", + "current_level": "Current Level", + "determined_bronze_1": "Determined Bronze 1", + "determined_bronze_2": "Determined Bronze 2", + "determined_bronze_3": "Determined Bronze 3", + "earn_3_stars_in_each_division_to_advance_for_a_total_of_9_stars": "Earn 3 stars in each division to advance, for a total of 9 stars.", + "orderly_silver_1": "Orderly Silver 1", + "orderly_silver_2": "Orderly Silver 2", + "orderly_silver_3": "Orderly Silver 3", + "glorious_gold_1": "Glorious Gold 1", + "glorious_gold_2": "Glorious Gold 2", + "glorious_gold_3": "Glorious Gold 3", + "glorious_gold_4": "Glorious Gold 4", + "earn_4_stars_in_each_division_to_advance_for_a_total_of_16_stars": "Earn 4 stars in each division to advance, for a total of 16 stars.", + "eternal_diamond_1": "Eternal Diamond 1", + "eternal_diamond_2": "Eternal Diamond 2", + "eternal_diamond_3": "Eternal Diamond 3", + "eternal_diamond_4": "Eternal Diamond 4", + "eternal_diamond_5": "Eternal Diamond 5", + "earn_5_stars_in_each_division_to_advance_for_a_total_of_25_stars": "Earn 5 stars in each division to advance, for a total of 25 stars.", + "about_ranks": "About Ranks", + "in_the_sheling_battle_system_rank_is_an_important_measure_of_com": "In the Sheling battle system, rank is an important measure of competitive skill. It reflects both your ranked standing and overall performance. Keep competing and earning points to advance. Details are provided below.", + "1_rank_system_overview": "1. Rank System Overview", + "ranks_from_lowest_to_highest_are_determined_bronze_orderly_silve": "Ranks from lowest to highest are: Determined Bronze, Orderly Silver, Glorious Gold, Eternal Diamond, Supreme Champion, Extraordinary Champion, Peerless Champion, Matchless Champion, Exalted Champion, Glorious Champion and Legendary Champion. Each tier contains divisions. Earn points to advance.", + "2_earning_points": "2. Earning Points", + "1_basic_rules": "(1) Basic Rules", + "1v1_2v2_and_3v3_versus": "1v1, 2v2 and 3v3 Versus:", + "each_player_on_the_winning_team_gains_100_points_each_player_on_": "Each player on the winning team gains 100 points; each player on the losing team loses 100 points.", + "2v2_the_player_with_the_highest_total_score_on_the_winning_team_": "2v2: The player with the highest total score on the winning team and an average score of at least 7 is MVP and earns 40 bonus points.", + "3v3_the_player_with_the_highest_total_score_on_the_winning_team_": "3v3: The player with the highest total score on the winning team and an average score of at least 7 is MVP and earns 60 bonus points.", + "a_streak_of_five_wins_across_1v1_2v2_and_3v3_awards_15_extra_poi": "A streak of five wins across 1v1, 2v2 and 3v3 awards 15 extra points per win from the fifth win until the streak ends. This applies only to Versus, not Free-for-all.", + "5_player_and_10_player_free_for_all": "5-player and 10-player Free-for-all:", + "players_in_5_player_and_10_player_free_for_all_are_ranked_by_tot": "Players in 5-player and 10-player Free-for-all are ranked by total score. Default points are awarded or deducted according to position, as shown below:", + "position": "Position", + "2_rank_tier_rules": "(2) Rank Tier Rules", + "points_required_to_advance_through_tiers_vary_according_to_the_f": "Points required to advance through tiers vary according to the following rules:", + "3_rank_table": "3. Rank Table", + "tier": "Tier", + "division": "Division", + "points_100_points_1_star": "Points (100 points = 1 star)", + "points_rankings": "Points", + "ranked_points": "Ranked Points", + "mvp_rankings": "MVP", + "mvp_awards": "MVP Awards", + "10s_rankings": "10s", + "10s_scored": "10s Scored", + "unranked_1010": "Unranked", + "value_value_matches": "{p0}, {p1} matches", + "could_not_load_rankings": "Could not load rankings", + "season_rankings": "Season Rankings", + "user_id": "User ID", + "rank_1015": "Rank", + "win_rate": "Win Rate", + "value_matches_value_value": "{p0} matches {p1} {p2}%", + "mvp_awards_value": ", MVP awards: {p0}", + "could_not_load_season_data": "Could not load season data", + "could_not_load_page_data": "Could not load page data", + "ranked_matches": "Ranked Matches", + "points_1021": "Points: ", + "scoring_rate": "Scoring Rate", + "view_my_match_history": " View My Match History ", + "tap_for_more": "Tap for More", + "restoring_match": "Restoring match...", + "valuemin_values": "{p0}min {p1}s", + "values": "{p0}s", + "grouping": "Grouping", + "best_streak": "Best Streak", + "hits": " hits", + "total_score_1037": "Total Score", + "peak_energy": "Peak Energy", + "qualifying_arrows": "Qualifying Arrows", + "qualification_rate": "Qualification Rate", + "arrows_completed": "Arrows Completed", + "arrows_1042": " arrows", + "score_1043": "Score", + "targets_hit": "Targets Hit", + "arrows_shot_1045": "Arrows Shot", + "hit_rate": "Hit Rate", + "next_difficulty": "Next Difficulty", + "try_again": "Try Again", + "vs_last_session": "vs. Last Session", + "share_results": "Share Results", + "pts_the_average_distance_between_your_arrow_impacts_is_1051": " pts. The average distance between your arrow impacts is ", + "for_this_session_1052": " For this session, ", + "rhythm_training": "Rhythm Training", + "shoot_in_the_last_values": "Shoot in the last {p0}s", + "shoot_in_the_last_values_and_hit_within_value_rings": "Shoot in the last {p0}s and hit within {p1} rings", + "lose": " Lose ", + "energy_per_second": "% energy per second ", + "stability_training_energy_progress": "Stability training energy progress", + "current_target": "Current target: ", + "basic_training": "Basic Training", + "endurance_training": "Endurance Training", + "precision_training": "Precision Training", + "stability_training": "Stability Training", + "s_1064": "s, ", + "no_time_limit": "No time limit, ", + "hit": "hit ", + "pts_each": " pts each", + "shoot_1068": "shoot ", + "arrows_with_a_total_of": " arrows with a total of ", + "arrows_in_the_highlighted_area": " arrows in the highlighted area", + "beats_follow_the_rhythm_and_land": " beats: follow the rhythm and land ", + "arrows_scoring": " arrows scoring ", + "pts_within_the_beat_window": " pts within the beat window", + "each_arrow_scoring": "Each arrow scoring ", + "pts_charges_energy_fill_the_bar_to_pass": " pts charges energy. Fill the bar to pass.", + "value_difficulty": "{p0} Difficulty", + "20_cm_full_ring_target_325": "20 cm Full-ring Target", + "could_not_load_training_difficulties": "Could not load training difficulties", + "this_difficulty_is_locked": "This difficulty is locked", + "could_not_create_training_please_retry": "Could not create training. Please retry.", + "could_not_enter_training_please_retry": "Could not enter training. Please retry.", + "creating_training": "Creating training...", + "current_progress_lvvalue": "Current Progress LV{p0} >", + "coming_soon_1088": "Coming soon...", + "training": "Training: ", + "on_target_rate": "On-target Rate", + "ahead_of": " Ahead of ", + "of_opponents": "of opponents ", + "my_training_records": "My Training Records", + "no_level_requirement": "No Level Requirement", + "recommended": " Recommended ", + "hit_1096": "Hit ", + "arrows_at": " arrows at ", + "shoot_1098": "Shoot ≥ ", + "arrows_with_a_total_score": " arrows with a total score ≥ ", + "hit_the_highlighted_area_with": "Hit the highlighted area with ", + "arrows_1101": " arrows", + "beats_follow_the_rhythm_and_land_1102": " beats: follow the rhythm and land ", + "pts_charges_energy_fill_the_bar_to_pass_1103": " pts charges energy. Fill the bar to pass.", + "could_not_load_practice_details_please_retry": "Could not load practice details. Please retry.", + "invalid_training_parameters_select_a_difficulty_again": "Invalid training parameters. Select a difficulty again.", + "i_m_ready_start_practice": "I’m Ready. Start Practice", + "loading_1111": "Loading", + "vip_active": "VIP Active", + "vip_inactive": "VIP Inactive", + "could_not_load_retry": "Could not load. Retry.", + "user_profile": "User Profile", + "username": "Username", + "avatar_1119": "Avatar", + "orders": "Orders", + "incomplete": "Incomplete", + "version_info_test_only": "Version Info (Test Only)", + "unbind_device_test_only": "Unbind Device (Test Only)", + "sign_out_test_only": "Sign Out (Test Only)", + "today_s_value_value_value": "Today’s {p0}: {p1}/{p2}", + "no_target_detected_aim_at_the_target_and_shoot": "No target detected. Aim at the target and shoot.", + "incorrect_target_face": "Incorrect target face", + "distance_ok": "Distance OK", + "too_close": "Too close", + "target_face_ok": "Target face OK", + "please_bind_a_device_first": "Please bind a device first", + "smart_bow_disconnected": "Smart bow disconnected", + "please_complete_the_beginner_challenge_first": "Please complete the beginner challenge first", + "invalid_match_connection": "Invalid match connection", + "your_device_binding_has_expired_please_bind_it_again": "Your device binding has expired. Please bind it again.", + "you_have_an_unpaid_order": "You have an unpaid order", + "this_room_has_expired": "This room has expired", + "get_ready_find_your_distance_first_challenge": "- Get Ready - Find Your Distance - First Challenge", + "return": "Return", + "2_109": "2", + "you": "You", + "your_turn": "Your turn", + "red_team_shoot": "Red team, shoot", + "blue_team_shoot": "Blue team, shoot", + "match_started": "Match started", + "match_ended_119": "Match ended", + "adjust_value": "Adjust {p0}", + "round_1": "Round 1", + "round_2": "Round 2", + "round_3": "Round 3", + "round_4": "Round 4", + "round_5": "Round 5", + "second_half_started": "Second half started", + "distance_and_target_face_ok": "Distance and target face OK", + "shoot_to_check_distance_and_target_face_230": "Shoot to check distance and target face", + "great_score_the_national_ranked_matches_await": "Great score! The national ranked matches await!", + "keep_practicing_for_more_moments_to_shine": "Keep practicing for more moments to shine!", + "practice_daily_and_stand_out_next_time": "Practice daily and stand out next time!", + "the_top_rank_is_within_your_reach": "The top rank is within your reach!", + "a_moment_to_shine_keep_it_up": "A moment to shine! Keep it up!", + "one_of_the_best_in_the_sheling_world": "One of the best in the Sheling world!", + "try_again_and_make_your_mark": "Try again and make your mark!", + "practice_more_and_come_back_stronger": "Practice more and come back stronger", + "every_step_you_take_counts": "Every step you take counts", + "golden_arrow_round": "Golden Arrow Round", + "practice_ended": "Practice ended", + "victory": "Victory", + "defeat": "Defeat", + "40_cm_full_ring_target_324": "40 cm Full-ring Target", + "could_not_load_coin_earnings": "Could not load coin earnings", + "could_not_load_redemptions": "Could not load redemptions", + "could_not_load_store_membership": "Could not load store membership", + "could_not_load_coin_statistics": "Could not load coin statistics", + "could_not_load_gifts": "Could not load gifts", + "could_not_load_nearby_stores": "Could not load nearby stores", + "could_not_get_your_location": "Could not get your location", + "could_not_load_gift_details": "Could not load gift details", + "could_not_load_coin_rules": "Could not load coin rules", + "could_not_load_device_details": "Could not load device details", + "could_not_load_the_device_qr_code": "Could not load the device QR code", + "could_not_download_the_qr_code": "Could not download the QR code", + "timeout": "Timeout", + "device_details_have_expired": "Device details have expired", + "start_shooting": "Start shooting", + "start_shooting_continuously": "Start shooting continuously", + "starting_soon": "Starting soon...", + "first": "First", + "second": "Second", + "half_shoot_6_arrows_first": " half: shoot 6 arrows first", + "get_ready_for_the_second_half": "Get Ready for the Second Half", + "current_round_values_elapsed": "Current round: {p0}s elapsed", + "solo_training": " Solo Training", + "practice_started": "Practice started", + "determined_bronze": "Determined Bronze", + "bronze_1": "Bronze 1", + "bronze_2": "Bronze 2", + "bronze_3": "Bronze 3", + "orderly_silver": "Orderly Silver", + "silver_1": "Silver 1", + "silver_2": "Silver 2", + "silver_3": "Silver 3", + "glorious_gold": "Glorious Gold", + "gold_1": "Gold 1", + "gold_2": "Gold 2", + "gold_3": "Gold 3", + "gold_4": "Gold 4", + "eternal_diamond": "Eternal Diamond", + "diamond_1": "Diamond 1", + "diamond_2": "Diamond 2", + "diamond_3": "Diamond 3", + "diamond_4": "Diamond 4", + "diamond_5": "Diamond 5", + "supreme_champion": "Supreme Champion", + "extraordinary_champion": "Extraordinary Champion", + "peerless_champion": "Peerless Champion", + "matchless_champion": "Matchless Champion", + "exalted_champion": "Exalted Champion", + "glorious_champion": "Glorious Champion", + "legendary_champion": "Legendary Champion", + "red_team_shoot_1025": "Red team, shoot", + "blue_team_shoot_1026": "Blue team, shoot", + "remaining_1027": "Remaining: ", + "basics": "Basics", + "precision": "Precision", + "stability": "Stability", + "rhythm": "Rhythm", + "endurance": "Endurance", + "challenge_complete": "Challenge Complete", + "challenge_failed": "Challenge Failed", + "bingo_target_hit": "Bingo! Target Hit", + "miss_1109": "Miss", + "down_and_left_1127": "down and left", + "left_1128": "left", + "up_and_left_1129": "up and left", + "up_and_right_1130": "up and right", + "right_1131": "right", + "down_and_right_1132": "down and right", + "too_close_incorrect_target_face": "Too close; incorrect target face", + "too_close_target_face_ok": "Too close; target face OK", + "distance_ok_incorrect_target_face": "Distance OK; incorrect target face", + "invalid_shot_no_target_detected": "Invalid shot: no target detected", + "invalid_shot_too_close_and_incorrect_target_face": "Invalid shot: too close and incorrect target face", + "invalid_shot_incorrect_target_face": "Invalid shot: incorrect target face", + "invalid_shot_too_close": "Invalid shot: too close", + "invalid_shot": "Invalid shot", + "sign_in_failed": "Sign-in failed" +} diff --git a/src/locales/index.js b/src/locales/index.js new file mode 100644 index 0000000..b438eb8 --- /dev/null +++ b/src/locales/index.js @@ -0,0 +1,40 @@ +import { createI18n } from "vue-i18n"; +import en from "./en.json"; +import sourceKeys from "./source-keys.json"; + +// 英文构建固定使用英文,不读取或写入用户语言与业务缓存。 +export const i18n = createI18n({ + legacy: false, + locale: "en", + fallbackLocale: "en", + messages: { en }, +}); + +// uni-app 的小程序运行库可能直接返回原始文案,参数在此统一替换一次。 +// 从固定英文词条读取,避免完整版运行库先插值后再次处理参数值里的花括号。 +export const t = (key, params = {}) => { + const message = Object.prototype.hasOwnProperty.call(en, key) + ? en[key] + : i18n.global.t(key); + return message.replace(/\{(p\d+)\}/g, (placeholder, name) => + params != null && Object.prototype.hasOwnProperty.call(params, name) + ? String(params[name] ?? "") + : placeholder + ); +}; + +// 仅用于明确来自前端静态配置的双用途原值;禁止用于接口响应或用户输入。 +export const translateStatic = (value) => { + const key = Object.prototype.hasOwnProperty.call(sourceKeys, value) ? sourceKeys[value] : null; + return key ? t(key) : value; +}; + +// 比赛提示保留中文原值供语音与状态判断使用,只在渲染时转换。 +export const formatBattleTip = (value) => { + const text = String(value || "").replace(/你/g, "").replace(/重回/g, ""); + const half = text.match(/^(上|下)半场:请先射6箭$/); + if (half) return `${half[1] === "上" ? "First" : "Second"} half: shoot 6 arrows first`; + const round = text.match(/^请开始射箭第(.+)轮$/); + if (round) return t(sourceKeys["请开始射箭第{p0}轮"], { p0: translateStatic(round[1]) }); + return translateStatic(text); +}; diff --git a/src/locales/source-keys.json b/src/locales/source-keys.json new file mode 100644 index 0000000..e2b599c --- /dev/null +++ b/src/locales/source-keys.json @@ -0,0 +1,1110 @@ +{ + "用于扫描附近 WiFi,完成设备 OTA 升级网络连接": "wifi_location_permission", + "请求超时,请稍后重试": "request_timed_out_please_try_again", + "网络连接已断开,请检查网络设置": "network_disconnected_check_your_network_settings", + "服务器连接失败,请稍后重试": "cannot_connect_to_the_server_please_try_again", + "网络异常,请检查网络连接": "network_error_check_your_connection", + "请求失败,请稍后重试": "request_failed_please_try_again", + "网络异常,请稍后重试": "network_error_please_try_again", + "提示": "notice", + "账号已在其他设备登录": "your_account_has_been_signed_in_on_another_device", + "今日打卡": "today_s_check_in", + " 米": "m", + "落点稳定性": "shot_grouping", + "黄心率": "gold_hit_rate", + "10环数": "10s", + "平均环数": "average_score", + "总环数": "total_score", + "落点分布": "shot_distribution", + "环值": "score", + "射灵星球": "sheling_planet", + "高效记录每一箭,快来一起打卡吧!": "track_every_arrow_join_us", + "扫码打卡": "scan_to_check_in", + "本周箭数": "arrows_this_week", + "本周消耗": "calories_this_week", + "我的名次": "my_rank", + "正式开启弓箭手之路": "your_archery_journey_starts_here", + "今日弓箭练习打卡 {p0}": "archery_check_in_value", + "共": "total", + "环": "pts", + "射灵平台": "sheling", + "快加入我们一起玩吧~": "join_us_and_play", + "后羿就是这样练成的": "practice_makes_a_great_archer", + "功能尚未开启": "coming_soon", + "返回进行中的对局": "return_to_your_current_match", + "返回房间": "back_to_room", + "蓝队(": "blue", + "红队(": "red", + "支箭,共": "arrows_total", + "电量--": "battery", + "电量{p0}%": "battery_value", + "X环": "x", + "{p0}环": "value_pts", + "0环": "0_pts", + "未上靶": "miss", + "中场休息": "halftime", + " 经验 +1 ": "xp_1", + "模拟": "simulate", + "射箭": "shoot", + "开瞄": "sight_on", + "关瞄": "sight_off", + "完成进行中的对局才能开启新的。": "finish_your_current_match_before_starting_a_new_one", + "您有正在进行中的对局,是否进入?": "you_have_a_match_in_progress_join_it", + " 不进入 ": "stay_out", + "加载中...": "loading", + "进入": "join", + "离开比赛可能会导致比赛失败,": "leaving_may_result_in_a_loss", + "确认离开吗?": "are_you_sure_you_want_to_leave", + "离开比赛": "leave_match", + " 继续比赛 ": "continue_match", + "今天不玩了吗?": "done_playing_for_today", + " 取消 ": "cancel", + "确认": "confirm", + "完成智能弓校准,即可解锁全部功能": "calibrate_your_smart_bow_to_unlock_all_features", + "去校准": "calibrate", + "请完善创建信息": "please_complete_the_room_settings", + "对抗模式(1V1)": "versus_1v1", + "对抗模式(2V2)": "versus_2v2", + "对抗模式(3V3)": "versus_3v3", + "乱斗模式(3-10人)": "free_for_all_3_10_players", + "选择靶纸": "select_target_face", + "20厘米全环靶": "20_cm_full_ring_target", + "40厘米全环靶": "40_cm_full_ring_target", + "创建房间": "create_room", + "检测到智能弓箭已开始充电,为保护电池,设备即将自动关机。\n(注意:此时拔出充电线将会重启设备。)": "your_smart_bow_is_charging_and_will_shut_down_automatically_to_p", + "我知道了": "got_it", + "选择弓种": "select_bow_type", + "选择练习距离": "select_shooting_distance", + "选择组/箭数": "select_ends_arrows", + "{p0}组/{p1}箭": "value_ends_value_arrows", + "选择组": "select_ends", + "米": "m_92", + "自定义": "custom", + "组": "ends", + "选择每组的箭数": "select_arrows_per_end", + "箭": "arrows", + "新来的弓箭手你好呀~": "welcome_new_archer", + "箭前准备": "get_ready", + "感知距离": "find_your_distance", + "小试牛刀": "first_challenge", + "房号: ": "room", + "乐正青山": "yuezheng_qingshan", + "宇文玉兰": "yuwen_yulan", + "岑思宇": "cen_siyu", + "邬梓瑜": "wu_ziyu", + "范子衿": "fan_zijin", + "旗鼓相当的对手": "a_worthy_opponent", + "乐子睿": "le_zirui", + "时春晓": "shi_chunxiao", + "柏孤鸿": "bai_guhong", + "东宫锦瑟": "donggong_jinse", + "段干流云": "duangan_liuyun", + "取消匹配": "cancel_matchmaking", + "取消": "cancel_133", + "确定": "confirm_134", + "请先开启智能弓": "please_turn_on_your_smart_bow_first", + "正在准备固件更新": "preparing_firmware_update", + "正在下载固件": "downloading_firmware", + "正在安装固件": "installing_firmware", + "正在进行固件更新": "updating_firmware", + "立即更新": "update_now", + "暂不更新": "later", + "固件更新已完成": "firmware_update_complete", + "关闭": "close", + "请勿离开当前页面!": "please_stay_on_this_page", + "请确保:": "please_make_sure", + "1、智能弓已开启": "1_your_smart_bow_is_on", + "2、网路连接稳定": "2_your_network_connection_is_stable", + "重试": "retry", + "积分": "points", + "已准备": "ready", + " 虚位以待 ": "waiting_for_a_player", + "管理员": "host", + "天": "days", + "平均": "average", + "千卡": "kcal", + "黄心率:": "gold_hit_rate_156", + "10环数:": "10s_157", + "平均:": "average_158", + "放大": "zoom", + "真实": "actual_size", + "感谢您的支持!": "thank_you_for_your_support", + "取消支付": "payment_canceled", + "感谢您对我们公益项目的支持!": "thank_you_for_supporting_our_community_project", + "我想给建议(选填)": "i_have_a_suggestion_optional", + "您的姓名": "your_name", + "手机/微信号": "phone_wechat_id", + "所在机构": "organization", + "建议": "suggestion", + "第": "round", + "轮射箭结束": "shooting_complete", + "本轮蓝队": "blue_team_this_round", + "环,红队": "pts_red_team", + " 连续3个来回双方均无人射箭,比赛取消。 ": "no_arrows_were_shot_by_either_team_for_3_consecutive_turns_match", + " 红队、蓝队各得": "red_and_blue_teams_each_earn", + "分 ": "pts_175", + " 蓝队获胜,得": "blue_team_wins_and_earns", + " 红队获胜,得": "red_team_wins_and_earns", + "蓝队": "blue_team", + "分,红队": "pts_red_team_179", + "分": "pts_180", + "同分僵局!最后一箭定江山": "a_tie_one_final_arrow_decides_the_winner", + "秒后蓝红双方": "s_until_both_teams_shoot", + "决金箭": "golden_arrow", + "一箭决胜负": "one_arrow_decides_it_all", + "总成绩": "final_score", + "完成": "completed", + "箭,获得": "arrows_earned", + "点经验": "xp", + "本局成绩(共": "score_this_match_total", + "环):": "pts_194", + "查看靶纸": "view_target", + "返回": "back", + " 您本次练习取得了": "your_score_for_this_session_is", + "环的成绩,所有箭支上靶后的平均点间距为": "pts_the_average_distance_between_your_arrow_impacts_is", + "还需要持续改进哦~": "keep_practicing", + "成绩优秀。": "excellent_performance", + "针对您本次的练习,": "for_this_session", + "我们建议您充分练习推弓、靠位以及撒放动作一致性。": "we_recommend_practicing_consistency_in_your_bow_arm_anchor_point", + "我们建议您继续保持即可。": "we_recommend_keeping_up_the_good_work", + "我们建议您将设备的瞄准器{p0}调整。": "we_recommend_adjusting_your_sight_value", + "暂无数据": "no_data_yet", + "没有更多了": "no_more_results", + "中场休息({p0}秒)": "halftime_values", + "时间到!": "time_s_up", + "剩余": "remaining", + "秒": "s", + "请获取手机号": "please_authorize_your_phone_number", + "请选择头像": "please_select_an_avatar", + "请输入昵称": "please_enter_a_nickname", + "请先同意协议": "please_agree_to_the_agreements_first", + "手机:": "phone", + "点击获取": "authorize", + "头像:": "avatar", + "昵称:": "nickname", + "手机号快捷登录": "sign_in_with_phone_number", + "已同意并阅读": "i_have_read_and_agree_to_the", + "《用户协议》": "user_agreement", + "及": "and", + "《隐私协议》": "privacy_policy", + "内容": "terms", + "选择靶型": "select_target_type", + "红队": "red_team", + "请确保站距达到5米": "stand_at_least_5_m_from_the_target", + "低于5米的射箭无效": "shots_from_under_5_m_do_not_count", + " 模拟射箭 ": "simulate_shot", + "请射箭,测试站距与靶纸": "shoot_to_check_distance_and_target_face", + "距离正式比赛还有": "match_starts_in", + " 进入中... ": "joining", + "距离正式比赛": "match", + "开始还有": "starts_in", + " 已省略前 ": "earlier", + " 支,仅显示最近 ": "arrows_hidden_showing_the_latest", + " 支 ": "arrows_241", + "段位积分": "rank_points", + "本赛季全国": "national_rank_this_season", + "名": "empty", + "本赛季": "this_season", + "暂未上榜": "unranked", + "登录": "sign_in", + "恭喜你升级到": "congratulations_you_reached", + "射灵{p0}级": "sheling_level_value", + "固件更新完成": "firmware_update_complete_250", + "固件更新失败": "firmware_update_failed", + "更新失败,请检查设备及网络后重试": "update_failed_check_your_device_and_network_then_retry", + "固件更新超时,请稍后重试": "firmware_update_timed_out_please_try_again", + "缺少固件目标版本": "target_firmware_version_is_missing", + "固件更新任务创建失败,请稍后重试": "could_not_create_the_firmware_update_task_please_retry", + "固件更新请求失败,请稍后重试": "firmware_update_request_failed_please_retry", + "待付款": "awaiting_payment", + "已付款": "paid", + "已发货": "shipped", + "已完成": "completed_260", + "已关闭": "closed", + "申请退款": "refund_requested", + "退款中": "refund_in_progress", + "已退款": "refunded", + "拒绝退款": "refund_declined", + "向右下方调瞄": "down_and_right", + "向下方调瞄": "down", + "向左下方调瞄": "down_and_left", + "向左侧调瞄": "left", + "向左上侧调瞄": "up_and_left", + "向上方调瞄": "up", + "向右上方调瞄": "up_and_right", + "向右侧调瞄": "right", + "关于我们": "about_us", + " 《射灵星球》是以智能和物联网技术驱动的全球射箭专业选手及射箭爱好者互动交流平台,由广州光点飞舞网络有限公司研发并提供线上服务。 ": "sheling_planet_is_a_platform_for_professional_archers_and_archer", + " 我们专注于智能射箭技术的探索和应用,通过物联网技术、激光系统、人工智能、嵌入式AI及射箭在线互娱模式的创新与研发,提供专业的智能体育设备和有趣的在线物联游戏,以此推动射箭运动及更多专业体育运动走入大众家庭。 ": "we_explore_and_apply_smart_archery_technology_through_innovation", + "粤ICP备2025421150号-2X": "guangdong_icp_no_2025421150_2x", + "音频测试": "audio_test", + "连续播放1": "continuous_playback_1", + " 播放 ": "play", + "连续播放2": "continuous_playback_2", + "已加载": "loaded", + "未加载": "not_loaded", + "播放": "play_301", + "加载并播放": "load_and_play", + "获胜": "win", + "斩获": "scored", + "自己": "me", + " 环": "pts_308", + " 你的经验 ": "your_xp", + " 你的积分 ": "your_points", + "查看成绩": "view_results", + "好友约战": "friend_challenge", + "多人乱斗": "free_for_all", + "{p0}v{p1}对抗赛": "valuevvalue_versus", + "比赛状态查询失败,请重试": "could_not_check_match_status_please_retry", + "进入比赛失败,请重试": "could_not_join_the_match_please_retry", + "比赛正在创建,请稍候": "creating_match_please_wait", + "你被踢出房间": "you_have_been_removed_from_the_room", + "房间已解散": "this_room_has_been_closed", + "热血乱斗赛,敢来争锋?": "ready_for_a_thrilling_free_for_all", + "2v2对抗赛,是兄弟来助我一把!": "join_my_team_for_a_2v2_match", + "3v3对抗赛,来了马上发车!": "join_our_3v3_match_we_re_ready_to_go", + "星球论箭,来一决高下敢否?": "ready_to_see_who_is_the_better_archer", + "请使用": "please_use_a", + "全环靶": "full_ring_target", + "如果实际靶纸与选择靶纸不同,将导致射箭无效": "shots_will_not_count_if_the_target_face_differs_from_your_select", + " 已准备 ": "ready_329", + "我要加入": "join_330", + "即将进入对局...": "joining_match", + "开始对局": "start_match", + "我准备好了": "i_m_ready", + "所有人准备好后由房主点击开始": "once_everyone_is_ready_the_host_can_start_the_match", + "今日约战次数已经用完\n开通会员可增加次数": "you_have_used_all_your_challenges_for_today_activate_membership_", + "知道了": "got_it_335", + "去开通": "activate", + " 是否把「": "remove", + "」移出房间? ": "from_the_room", + "累计金币:": "total_coins", + "可兑换金币:": "redeemable_coins", + "暂无金币获取记录。": "no_coin_earnings_yet", + "兑换内容": "redeemed_item", + "兑换类型": "redemption_type", + "时间": "time", + "金币使用": "coins_used", + "类型": "type", + "金币获取": "coins_earned", + "授权获取你的定位,以便推荐附近门店。": "allow_location_access_to_find_nearby_stores", + "立即授权": "allow_access", + "暂不支持线上兑换,请前往线下门店进行兑换。": "online_redemption_is_not_available_please_redeem_at_a_store", + "金币": "coins", + "个": "empty_352", + "次": "times", + "地址:": "address", + "电话:": "phone_355", + "营业时间:": "hours", + "有效期至{p0}": "valid_until_value", + "未开通": "not_activated", + "查看更多关于体验中心VIP的介绍 >": "learn_more_about_experience_center_vip", + "特惠价格:9.9元/90天": "special_offer_cny_9_9_90_days", + "您已开通VIP": "your_vip_is_active", + "开通方式:请前往线下门店联系工作人员开通": "to_activate_please_contact_staff_at_a_store", + "金币规则": "coin_rules", + "获取明细": "earnings", + "兑换记录": "redemptions", + "附近门店": "nearby_stores", + "体验中心VIP": "experience_center_vip", + "我的金币": "my_coins", + "免费体验权益": "free_trial", + "使用该权益可免费体验智能弓箭30分钟1次,加入官方社群还可以额外获赠1次。": "enjoy_one_free_30_minute_smart_archery_session_join_the_official", + "特惠购买权益": "special_offer", + "使用该权益可以19.9元的特惠价格购买30分钟体验服务1次。": "buy_one_30_minute_experience_session_at_the_special_price_of_cny", + "到店赠饮权益": "complimentary_drink", + "使用该权益每次到店后可获得免费赠送的指定饮品一支。": "receive_one_complimentary_designated_drink_each_time_you_visit", + "金币获取明细": "coin_earnings", + "金币兑换记录": "coin_redemptions", + "暂无金币兑换记录。": "no_redemptions_yet", + "会员信息加载失败,请点击重试或切换门店": "could_not_load_membership_details_retry_or_select_another_store", + "功能开发中": "coming_soon_385", + "线下体验中心": "experience_center", + "选择门店": "select_store", + "会员信息加载中...": "loading_membership", + " 门店体验中心VIP是为热爱射箭运动的用户专属打造的VIP服务,开通后即可享受以下三大专属权益: ": "experience_center_vip_is_designed_for_archery_enthusiasts_activa", + "加载失败,点击重试": "could_not_load_tap_to_retry", + "没有更多商品了~": "no_more_products", + "暂无兑换商品~": "no_items_available_for_redemption", + "请前往线下门店体验中心,联系工作人员开通VIP。": "please_visit_an_experience_center_and_contact_staff_to_activate_", + "我已知晓": "got_it_394", + "门店信息无效": "invalid_store_information", + " 附近暂无门店~ ": "no_nearby_stores", + "没有更多门店了~": "no_more_stores", + "商品参数无效": "invalid_product_parameters", + "商品详情": "product_details", + "金币:": "coins_403", + "(剩余": "empty_404", + "个)": "remaining_405", + "暂无金币规则。": "no_coin_rules_yet", + "体验中心VIP介绍": "about_experience_center_vip", + "暂无介绍内容": "no_information_available", + "箭头面向靶子": "point_the_arrow_at_the_target", + "摆出拉弓姿势": "take_your_shooting_stance", + "调整瞄准器": "adjust_the_sight", + "校准智能弓": "calibrate_smart_bow", + "请完成以上步骤校准智能弓": "complete_the_steps_above_to_calibrate_your_smart_bow", + " 我已校准 ": "i_ve_calibrated_it", + "二维码不正确,请重新扫码": "invalid_qr_code_please_scan_again", + "设备已绑定其他账号,请解绑后再绑定": "this_device_is_bound_to_another_account_unbind_it_first", + "绑定成功,请返回查看设备": "bound_successfully_go_back_to_view_your_device", + "未连接": "disconnected", + "已连接(充电中)": "connected_charging", + "已连接": "connected", + "{p0}小时{p1}分钟": "valueh_valuemin", + "{p0}分钟": "valuemin", + "在线": "online", + "暂无设备编号": "no_device_number", + "设备型号": "model", + "射灵智能弓": "sheling_smart_bow", + "当前电量": "battery_434", + "连接方式": "connection", + "设备编号": "device_number", + "解绑成功": "device_unbound", + "该设备已经绑定了其他账号,": "this_device_is_already_bound_to_another_account", + "如需绑定本账号,请先解除绑定。": "unbind_it_first_to_bind_it_to_this_account", + "重新扫码": "scan_again", + "二维码不正确,": "invalid_qr_code", + "仅支持扫描射灵智能弓箭的设备二维码。": "only_sheling_smart_bow_device_qr_codes_are_supported", + " 新设备首次绑定礼包: ": "first_time_device_binding_gift", + "6个月射灵会员": "6_months_of_sheling_membership", + " 已自动发放至本账号": "added_to_this_account_automatically", + ",有效期": "valid_until", + "立即查看新手教程": "view_beginner_tutorial", + "已保存至相册": "saved_to_photos", + "请长按二维码保存": "press_and_hold_the_qr_code_to_save_it", + "二维码加载中...": "loading_qr_code", + "设备ID:": "device_id", + "保存至相册": "save_to_photos", + " 该二维码为当前绑定弓箭的二维码,你可以截图保存到相册,以便当二维码丢失或不在身边时,可以扫描二维码进行设备绑定。 ": "this_is_the_qr_code_for_your_bound_bow_save_a_screenshot_to_phot", + "注:解除绑定后将无法查看该二维码。": "note_this_qr_code_will_no_longer_be_available_after_unbinding", + "暂无设备二维码": "no_device_qr_code_available", + "未设置": "not_set", + "当前固件版本为 {p0},发现新固件版本 {p1},是否立即更新固件?": "current_firmware_value_new_firmware_value_update_now", + "发现新固件版本 {p0},是否立即更新固件?": "new_firmware_value_is_available_update_now", + "是否立即更新固件?": "update_firmware_now", + "剩余电量": "battery_468", + "设备离线": "device_offline", + "累计使用": "total_usage", + "绑定时间": "bound_on", + "我的智能弓": "my_smart_bow", + "请输入设备名": "please_enter_a_device_name", + "设备名最多支持10个字符": "device_names_can_contain_up_to_10_characters", + "仅支持中文、英文、数字、下划线和减号": "only_chinese_and_english_letters_numbers_underscores_and_hyphens", + "暂无绑定设备": "no_device_bound", + "设备名已更新": "device_name_updated", + "获取设备详情失败,请重试": "could_not_load_device_details_please_retry", + "缺少固件目标版本,请重试": "target_firmware_version_is_missing_please_retry", + "设备未连接,暂时无法调瞄": "device_disconnected_sight_adjustment_is_unavailable", + "邮箱已复制": "email_address_copied", + "我的设备": "my_device", + "请扫描": "scan_the", + "射灵智能弓箭": "sheling_smart_bow_484", + "设备上的二维码": "qr_code_on_your_device", + "没找到二维码或遇到问题>": "can_t_find_the_qr_code_or_need_help", + "还没有射灵智能弓箭?点我获取>": "don_t_have_a_sheling_smart_bow_yet_get_one", + "打弓佬": "archery_fan", + "设备介绍": "about_the_device", + "弓箭调瞄": "sight_adjustment", + "固件更新": "firmware_update", + "WIFI设置": "wi_fi_settings", + "设备二维码": "device_qr_code", + "解除绑定": "unbind", + "如有场地或距离变化,请重新校准以保证智能弓射箭精准度": "recalibrate_when_your_location_or_distance_changes_to_keep_your_", + "重新校准": "recalibrate", + "扫码绑定射灵弓箭": "scan_to_bind_your_sheling_bow", + "配套令牌样例": "sample_device_tag", + "【注】已被绑定的弓箭无法再次绑定。": "note_a_bow_that_is_already_bound_cannot_be_bound_again", + "如有任何疑问,请随时联系:": "if_you_have_any_questions_please_contact", + "智能弓箭和系统账号需一一对应,你确定要将当前登录用户账号绑定这把弓箭吗?绑定后不可随意更换。": "each_smart_bow_must_be_paired_with_one_account_bind_this_bow_to_", + "绑定中...": "binding", + "确认绑定": "confirm_binding", + "解除设备绑定": "unbind_device", + "解除绑定后,将无法使用智能弓箭进行对战,确定继续吗?": "after_unbinding_you_cannot_use_this_smart_bow_in_matches_continu", + "已经是最新版本": "already_up_to_date", + "请在WiFi网络下更新": "please_update_over_wi_fi", + "连接WiFi": "connect_to_wi_fi", + "仅支持中文、英文、数字、下划线、减号": "only_chinese_and_english_letters_numbers_underscores_and_hyphens_509", + "连接失败,请检查WiFi密码或WiFi状态": "connection_failed_check_the_wi_fi_password_and_network_status", + "{p0}秒后开始": "starts_in_values", + "请先开启手机定位服务": "please_enable_location_services_on_your_phone_first", + "网络名称仅支持英文字符及数字,请连接英文名网络或把网络改为英文": "network_names_support_only_english_characters_and_numbers_use_or", + "等待设备响应超时,请重试": "device_response_timed_out_please_retry", + "网络异常,请检查网络后重试": "network_error_check_your_connection_and_retry", + "WiFi连接中...": "connecting_to_wi_fi", + "WiFi连接中": "connecting_to_wi_fi_518", + "当前已是最新版本": "already_up_to_date_520", + "缺少固件目标版本,请返回后重试": "target_firmware_version_is_missing_go_back_and_retry", + "获取设备详情失败,请返回后重试": "could_not_load_device_details_go_back_and_retry", + "请先开启 WiFi 后刷新重试": "please_enable_wi_fi_then_refresh_and_retry", + "智能弓箭连接无线网络": "connect_your_smart_bow_to_wi_fi", + "提醒:本操作将为智能弓箭连接WIFI网络,不会影响手机自身连接的WIFI网络。": "this_connects_your_smart_bow_to_wi_fi_it_will_not_change_the_wi_", + "选择网络": "select_network", + "手机当前连接的网络": "your_phone_s_current_network", + "手动连接其他网络": "connect_to_another_network_manually", + "由于权限限制,无法获取附近网络列表,如需连接其他网络请手动输入网络名称与密码进行连接。": "permissions_prevent_nearby_networks_from_being_listed_to_connect", + "智能弓箭目前仅支持保存一条网络信息,若连接新的网络将删除上一条网络信息。": "your_smart_bow_can_save_only_one_network_connecting_to_a_new_net", + "请授权允许获取定位信息,并开启定位功能,以查找附近可用无线网络。": "allow_location_access_and_enable_location_services_to_find_nearb", + "授权获取定位信息": "allow_location_access", + "加入\"": "join_533", + "密码": "password", + "输入网络密码": "enter_network_password", + "该网络为开放网络,点击 ✓ 加入": "this_is_an_open_network_tap_to_join", + "加入无线网络": "join_wi_fi_network", + "名称": "name", + "输入网络名称": "enter_network_name", + "WIFI连接成功": "wi_fi_connected", + "WiFi连接成功": "wi_fi_connected_541", + "3秒后将自动开始更新": "the_update_will_start_automatically_in_3_seconds", + "请输入正确的设备编号": "please_enter_a_valid_device_number", + "该功能仅用于测试环境": "this_feature_is_for_the_test_environment_only", + "解绑设备": "unbind_device_547", + "请输入设备编号": "enter_device_number", + "解绑": "unbind_549", + "是否解绑该设备(仅用于测试环境)": "unbind_this_device_test_environment_only", + "开始": "start", + "进入下一个任务": "next_task", + "我已校准": "i_ve_calibrated_it_553", + "我准备好了,开始": "i_m_ready_start", + "退出新手试炼": "exit_beginner_challenge", + "新手试炼场": "beginner_challenge", + "去校准智能弓": "calibrate_smart_bow_557", + "练习连接信息异常,请重试": "invalid_practice_connection_please_retry", + "练习未创建,请重试": "practice_has_not_been_created_please_retry", + "海报生成失败,请稍后重试": "could_not_generate_the_poster_please_retry", + "-箭前准备": "get_ready_99", + "-感知距离": "find_your_distance_101", + "-小试牛刀": "first_challenge_103", + " ,这是新人必刷小任务,0基础小白也能快速掌握弓箭技巧和游戏规则哦~:) ": "this_beginner_challenge_helps_you_learn_archery_techniques_and_g", + "这位就是人帅技高的高教练!接下来请跟随教练指引,做好射箭前期准备。": "meet_coach_gao_follow_his_instructions_to_prepare_for_shooting", + "请按下方步骤完成智能弓校准,让瞄准器和靶子保持对齐。": "follow_the_steps_below_to_calibrate_your_smart_bow_and_align_the", + "你知道5米射程有多远吗?": "do_you_know_how_far_5_meters_is", + " 在我们的排位赛中,射程小于5米的成绩无效、哦!建议平时练习距离至少5米。现在,来边射箭边调整你的站位点吧! ": "shots_from_under_5_m_do_not_count_in_ranked_matches_we_recommend", + "一切准备就绪": "you_re_all_set", + "试着完成一个真正的弓箭手任务吧!": "try_a_real_archer_s_challenge", + "新手试炼场通关啦,优秀!": "beginner_challenge_complete_well_done", + "反曲弓运动基本知识和射灵世界系统规则你已Get,是不是挺容易呀:)": "you_ve_learned_the_basics_of_recurve_archery_and_the_sheling_gam", + "学会了,我摆得比教练还帅": "got_it_my_stance_is_even_better_than_the_coach_s", + "我找到合适的点位了": "i_ve_found_the_right_position", + "再来一局": "play_again", + "您已经不在当前房间": "you_are_no_longer_in_this_room", + "您已经离开了房间": "you_have_left_the_room", + "蓝方得分": "blue_score", + "红方得分": "red_score", + " 斩获": "scored_579", + "环 ": "pts_580", + "查看完整成绩": "view_full_results", + "经验": "xp_582", + "约战": "challenge", + "请输入房间号": "please_enter_a_room_number", + "该房间对战已开始,无法加入": "this_match_has_already_started_you_cannot_join", + "查无此房": "room_not_found", + "房间已满员": "room_is_full", + "约上朋友开几局,欢乐多,不寂寞": "invite_friends_for_a_few_matches_and_have_fun_together", + "一起练升级更快,早日加入全国排位赛!": "practice_together_level_up_faster_and_join_national_ranked_match", + "我的战绩": "my_results", + "局": "matches", + "约战数量": "challenges", + "射箭量": "arrows_shot", + "挑战难度": "challenge_difficulty", + "输入房间号": "enter_room_number", + "进入房间": "join_room", + " 创建约战房 ": "create_challenge_room", + "等级介绍": "about_levels", + " 在射灵世界中,等级是衡量您射箭技能的重要指标,而经验则是您提升等级的关键。具体的要求如下: ": "in_the_sheling_world_your_level_is_an_important_measure_of_your_", + "一、经验的获取规则": "1_earning_xp", + " 每射出一支箭,无论是否中靶、环数高低,您将获得1点经验。这是您提升射灵等级的基本方式,每一次射箭都是您向更高目标迈进的一步。 ": "every_arrow_you_shoot_earns_1_xp_regardless_of_whether_it_hits_t", + "二、解锁特权与玩法": "2_unlocking_features_and_game_modes", + " 当您等级达到9级时,将解锁“约战模式”。在这个模式中,您可以邀请您的好友进行切磋,与他们展开一场精彩的射箭对决。通过与好友的对抗,您不仅可以收获友谊和欢乐,还能在交流中学习到更多的技巧和经验。 ": "reach_level_9_to_unlock_challenge_mode_invite_friends_for_exciti", + " 当您等级达到16级时,将解锁“对战模式”,每次对战都是一次难得的学习机会。您可以借此机会提升自己的水平,同时也为您的好友提供帮助和建议。此外,约战模式还为您提供了展示自己技艺的平台,让您在与好友的互动中感受到射箭的乐趣和成就感。 ": "reach_level_16_to_unlock_battle_mode_every_match_is_a_valuable_l", + " 未来我们将推出“押豆模式”,敬请期待!当您等级达到22级时,您可以与相同段位的玩家进行对抗,赢家将收获所有的灵豆。这不仅增加了游戏的趣味性和挑战性,还为您提供了赢取更多灵豆的机会。通过与更多玩家的对战,您可以不断提升自己的技术水平。 ": "bean_stakes_mode_is_coming_soon_at_level_22_you_will_be_able_to_", + "设备状态同步中,请稍后重试": "syncing_device_status_please_try_again_shortly", + "智能真弓:实时捕捉+毫秒级同步,弓箭选手全球竞技!": "real_smart_archery_live_tracking_and_millisecond_sync_compete_wi", + "绑定智能弓箭": "bind_smart_bow", + "新人必刷!": "a_must_for_beginners", + "快来报到吧~": "come_say_hello", + "段位": "rank", + "暂无": "none", + "赛季平均环数": "season_average_score", + "赛季胜率": "season_win_rate", + "赛况加载失败": "could_not_load_match_details", + "缺少比赛信息": "match_information_is_missing", + "详情": "details", + "赛况加载中...": "loading_match_details", + "点击重新加载": "tap_to_reload", + "大乱斗": "free_for_all_627", + "第{p0}轮": "round_value", + "得分 ": "score_628", + "匹配成功,正在进入...": "match_found_joining", + "匹配超时,请重试": "matchmaking_timed_out_please_retry", + "搜索对手...": "finding_an_opponent", + "今日排位赛次数已经用完\n开通会员可增加次数": "you_have_used_all_your_ranked_matches_for_today_activate_members", + "好友约战 - 大乱斗": "friend_challenge_free_for_all", + "排位赛 - 大乱斗": "ranked_match_free_for_all", + "比赛已结束": "match_ended", + "上半场结束,休息一下吧:)": "first_half_complete_take_a_break", + "秒后开始下半场": "s_until_the_second_half", + "设备已离线": "device_is_offline", + "检测到设备已断开连接,请检查设备后继续比赛": "your_device_has_disconnected_check_it_before_continuing_the_matc", + "靶纸": "target_face", + "会员自动续费服务协议": "membership_auto_renewal_agreement", + "射灵星球小程序会员自动续费服务协议": "sheling_planet_mini_program_membership_auto_renewal_agreement", + "欢迎您使用射灵星球小程序付费会员服务(以下简称“本服务”)!": "welcome_to_the_sheling_planet_mini_program_paid_membership_servi", + "本服务是由广州光点飞舞网络有限公司(以下简称“公司”或“我们”)为您提供。本服务为付费服务。为了保障您的权益,请在使用本服务前详细阅读并遵守本《射灵星球小程序会员服务协议(含自动续费服务规则)》(以下简称“本协议”)以及公司已发布或将来可能发布的各项服务协议与规则。您在申请开通本服务并进入购买程序前,请务必审慎阅读、充分理解各服务协议及规则,特别是免除或限制责任条款、法律适用和争议解决条款。": "the_service_is_provided_by_guangzhou_guangdian_feiwu_network_co_", + "当您依照本服务开通页面提示进行阅读并同意本协议,完成全部服务开通程序后(包括但不限于点击“同意”、“下一步”或“确认支付”等确认按钮,或您开始使用本服务),即表示您已充分阅读、理解并接受本协议的全部内容,您已与本服务提供方达成一致,成为“射灵星球小程序”付费会员。本协议即在您与公司之间产生法律效力,成为对双方均具有约束力的法律文件。": "by_reading_and_agreeing_to_this_agreement_as_instructed_on_the_a", + "一、定义及适用范围": "1_definitions_and_scope", + "1.1 射灵星球小程序付费会员:指已按照服务协议及规则完成射灵星球小程序登录的用户,在签署本协议并根据本服务开通页面所展示的收费标准支付相应费用后获取的特殊资格,在本协议中简称为“会员”或“您”。公司根据业务发展可能会新增、调整会员类型或名称,实际以开通页面展示为准,这不影响您的实际权益。": "1_1_paid_member_of_the_sheling_planet_mini_program_a_user_who_ha", + "1.2 付费会员权益:指用户基于其付费会员资格所享有的特殊权益,具体权益内容应以本服务购买页面展示内容及相关权益说明为准。您理解并同意,公司可能会根据设备型号、系统版本、客户端等因素开发不同的版本,不同版本实际可使用的具体权益或服务内容可能有所差别,具体以购买页面展示为准。": "1_2_paid_membership_benefits_special_benefits_available_to_users", + "1.3 本协议内容同时包括公司已经发布及后续可能不断发布的关于本服务的相关协议、规则等内容。前述内容一经正式发布,并以适当的方式送达您(服务购买页面、网站公布、系统通知等),即为本协议不可分割的组成部分,您应同样遵守。": "1_3_this_agreement_also_includes_related_agreements_and_rules_fo", + "1.4 为了给会员用户提供更多选择,公司可能会与第三方合作推出联合会员服务,或为购买会员服务的用户赠送第三方会员服务。如果您选择购买或接受以上服务,则表示您理解并认可,我们仅提供射灵星球小程序付费会员服务,不对第三方的会员服务负责。第三方会员服务的权益、使用、收费规则等,将由第三方执行和向您解释。": "1_4_to_offer_more_choices_the_company_may_work_with_third_partie", + "二、服务开通、权益内容、服务期限及收费标准": "2_activation_benefits_term_and_fees", + "2.1 本服务仅支持射灵星球小程序登录用户开通。您在开通本服务时,应仔细核对已登录的账号名称、会员类型、付费类型、服务期限等具体信息。因您个人原因充错账号、开通错服务类型或服务时长的,公司不予退还已收取的费用。": "2_1_only_signed_in_sheling_planet_mini_program_users_may_activat", + "2.2 您可通过已有和未来新增的支付渠道或公司指定支付方式完成本服务的购买。当您根据本服务页面提示进行确认、并成功支付了会员服务费和/或完成了成为付费会员的所有程序,您将成为射灵星球小程序付费会员。": "2_2_you_may_purchase_the_service_through_existing_or_future_paym", + "2.3 本服务的期限(以下简称“服务期限”)以您选择并成功开通的期限为准。会员计费与服务时长采用自然时间(自然月/自然年)方式计算。具体截止时间为相应续费到期自然日的对应时间点。服务期限届满后,公司将停止继续向您提供本服务。如您同时开通了多种会员服务,其消耗及重叠规则以开通页面的官方具体规则为准。": "2_3_the_term_of_the_service_the_service_term_is_the_term_you_sel", + "2.4 本服务的收费标准及具体权益内容以本服务开通页面所展示的为准。基于市场与业务的发展及服务权益调整,公司可能会随时调整本服务开通所需费用及/或具体权益内容。费用或权益内容调整自公布之日起生效,您在调整生效前已开通的服务将不受影响,但该服务到期后的续费开通或自动续费扣款,则需按照调整后的标准执行。": "2_4_fees_and_specific_benefits_are_those_shown_on_the_activation", + "2.5 射灵星球小程序付费会员服务为虚拟内容消费,除因本服务存在重大瑕疵导致您完全无法使用等公司的违约情形、法律法规要求必须退款或公司同意退款等情形外,完成支付和购买后,不可进行退款或转让。您在会员到期前主动取消或终止会员资格的,已支付费用不予退还。": "2_5_paid_membership_is_a_purchase_of_virtual_content_once_paid_f", + "2.6 为了保护您的账号安全、防止账号被盗风险,我们会对您开通会员服务的账号登录设备及使用范围作出合理限制。您不得将账号提供给多名第三方同时使用,否则公司有权根据安全风控能力随时调整或限制您的登录及使用权限。": "2_6_to_protect_your_account_and_prevent_theft_we_may_reasonably_", + "三、连续购买和自动续费服务": "3_recurring_purchases_and_auto_renewal", + "3.1 自动续费服务类型/计费周期": "3_1_auto_renewal_types_and_billing_cycles", + "射灵星球小程序付费会员自动续费服务包含「连续包月」、「连续包年」等服务。本服务的自动续费及对应计费周期采用按自然时间(自然月/自然年)对日顺延的方式计算。即:若您在某月18日开通连续包月服务,则下一次自动扣费续费日期为次月18日;若开通当月无对应日期的(例如1月31日开通,2月无31日),则自动调整为该自然月最后一日进行扣费续费。公司可能会根据会员需求增加或调整自动续费服务类型,具体服务类型以服务开通页面展示为准。": "auto_renewal_includes_recurring_monthly_and_annual_plans_billing", + "3.2 自动续费服务说明": "3_2_how_auto_renewal_works", + "(1)本自动续费服务基于您对于自动续费的需求,在您已开通会员服务的前提下,为避免您因疏忽或其他原因导致未能及时续费而中断服务,您授权公司可在您的会员服务期限到期前,从您开通本自动续费服务时所绑定的Apple ID账户余额、或绑定的第三方支付账户(包括但不限于微信支付、支付宝支付等)余额中自动代扣下一个计费周期的费用,从而延长对应的会员服务期限。": "1_auto_renewal_is_offered_to_existing_members_to_prevent_service", + "(2)自动续费扣费日期以您开通本自动续费服务的支付渠道实际扣款时间为准:如您是通过苹果公司iOS渠道开通本服务,扣费日期通常为开通服务之日起每个计费周期的对应日期前24小时内;如您是通过安卓Android渠道或直接在小程序内通过微信支付等渠道开通本服务,扣费日期通常为每个计费周期到期前1至2日。如支付渠道根据实际情况或相关平台规则自行调整扣费时间的,以实际扣款时间为准。": "2_the_payment_channel_determines_the_actual_debit_date_for_apple", + "(3)请您关注上述账户及可扣款余额情况,保证上述账户扣款成功以确保会员服务顺利续期。如因上述账户中可扣款余额不足导致续费失败,公司有权中断或终止相应的会员权益及服务,由此导致的风险或损失将由您自行承担。": "3_monitor_your_linked_accounts_and_available_balance_to_ensure_s", + "(4)为了方便您知悉自动续费情况,公司将在扣费日期前5日以站内信、小程序系统消息推送或短信等方式提示您即将发生续期扣费的信息,第三方支付渠道也可能向您发送通知提醒即将扣费。": "4_the_company_will_remind_you_of_the_upcoming_renewal_payment_5_", + "(5)系统会在每个扣费日期自动从您开通服务时所绑定的支付账户扣费。如扣费日期因账户问题或余额不足导致续费失败,若您未主动明确取消本服务,将视为您同意公司在扣费日期后继续发出扣款尝试,一旦您的账户扣款成功,公司将继续为您提供相应会员服务权益。": "5_the_system_automatically_charges_the_linked_payment_account_on", + "(6)如您未在每个扣费日期前操作取消自动续费服务,则公司将根据此前与您达成的委托在扣费日期继续发出续费代扣指令,一旦扣款成功,公司将自动为您开通下一个计费周期的连续服务。对于已成功完成会员服务续费的费用,原则上不予退还。": "6_if_you_do_not_cancel_auto_renewal_before_each_debit_date_the_c", + "(7)您在自动续费服务期间可以额外购买或通过参与活动等方式获取付费会员服务,会员服务期限将在原服务期限基础上相应延长,但如您未主动取消自动续费服务,系统仍会按照您所开通的自动续费服务进行扣费及续期。": "7_during_auto_renewal_you_may_purchase_additional_membership_tim", + "3.3 自动续费服务的退订": "3_3_canceling_auto_renewal", + "(1)您有权决定是否取消自动续费服务,如果您希望取消自动续费服务,需在每个扣费日期前(至少提前24小时)操作取消,否则将视为您同意继续授权自动续费。": "1_you_may_choose_whether_to_cancel_auto_renewal_to_cancel_you_mu", + "(2)购买自动续费服务后,您可在小程序的会员管理页中关闭自动续费,或通过如下第三方支付渠道方式取消自动续费服务:": "2_after_purchasing_auto_renewal_you_may_turn_it_off_on_the_mini_", + "iOS用户(Apple ID订阅):打开苹果手机“设置” -> 点击顶部的“Apple ID/机主姓名” -> 进入“订阅” -> 选择“射灵星球” -> 点击“取消订阅”;或打开“App Store” -> 点击右上角头像进入“账户” -> 点击“订阅”进行管理。": "ios_users_apple_id_subscriptions_open_settings_your_apple_id_nam", + "微信支付自动续费用户:打开微信APP -> 点击“我” -> “服务” -> “钱包” -> “支付设置” -> “自动续费” -> 选择“射灵星球小程序会员” -> 点击“关闭服务”。": "wechat_pay_users_open_wechat_me_services_wallet_payment_settings", + "支付宝自动续费用户:打开支付宝APP -> 点击“我的” -> “设置” -> “支付设置” -> “免密支付/自动扣款” -> 选择“射灵星球小程序会员” -> 点击“关闭服务”。": "alipay_users_open_alipay_me_settings_payment_settings_password_f", + "3.4 公司有权根据市场情况、业务规划、运营策略变化等原因单方面决定停止向您提供自动续费服务,并通过公告或站内信等方式通知您,您的付费会员服务期限自当前服务期限届满之日起终止。": "3_4_the_company_may_unilaterally_discontinue_auto_renewal_due_to", + "四、服务使用规范与限制": "4_usage_rules_and_restrictions", + "4.1 本服务及会员权益仅限您本人使用。未经公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他方式许可他人使用该账号及账号项下的会员服务与权益。如发生泄漏、遗失、被盗等行为,而该等行为并非公司过错导致,损失将由您自行承担。": "4_1_the_service_and_membership_benefits_are_for_your_personal_us", + "4.2 如您存在如下违法或不当使用本服务的情形,公司有权取消您的会员资格、作废会员权益且不予退还您所支付的会员服务费用,并有权向您追偿给公司造成的损失:": "4_2_if_you_use_the_service_unlawfully_or_improperly_in_any_of_th", + "以盗窃、利用系统漏洞、通过任何非公司官方或授权渠道获得本服务的行为;": "obtaining_the_service_through_theft_system_vulnerabilities_or_an", + "利用本服务进行盈利或非法获利,或以各种形式转让、借用您的会员权益;": "using_the_service_for_profit_or_unlawful_gain_or_transferring_or", + "通过非法手段对本服务会员账户的服务期限、交易状态进行修改或篡改;": "illegally_modifying_or_tampering_with_a_membership_account_s_ser", + "主动对公司用于保护本服务会员权益的任何安全措施技术进行破解、更改、反操作或破坏;": "cracking_modifying_reverse_operating_or_damaging_security_measur", + "其他违反法律法规、诚实信用原则、服务协议及相关小程序运营规则的行为。": "other_conduct_that_violates_laws_good_faith_service_agreements_o", + "五、服务中止、终止及变更": "5_suspension_termination_and_changes", + "5.1 因国家或相关政府监管部门要求、发生不可抗力事件、或由于用户违反本协议约定,公司有权中止或终止向用户提供服务。": "5_1_the_company_may_suspend_or_terminate_services_when_required_", + "5.2 您知悉并确认,您开通本服务后,如您中途主动取消本服务、放弃会员权益或终止资格,您将无法退还部分或全部会员服务费用。本协议终止后,用户无权要求公司继续向其提供任何服务,且不影响终止前基于本协议已产生的权利义务。": "5_2_you_acknowledge_that_if_you_voluntarily_cancel_the_service_g", + "5.3 公司可根据国家法律法规变化、业务实际变更需求、保护用户权益的需要等,不时修改本协议,并按照法律法规规定的程序及方式进行公告。如用户不同意变更后的内容,则用户有权主动停止使用本服务;如用户在变更内容生效后仍继续使用本服务,即视为用户同意该等内容的变更。": "5_3_the_company_may_amend_this_agreement_as_laws_business_needs_", + "六、责任限制与免责条款": "6_limitation_of_liability_and_disclaimers", + "6.1 您理解并同意,本服务是按照现有技术和条件所能达到的现状提供的。公司将尽最大努力确保服务的连贯性和安全性,但不能随时预见和防范技术以及其他风险,包括但不限于不可抗力、网络原因、第三方服务瑕疵等原因可能导致的服务中断、数据丢失以及其他的损失和风险。": "6_1_you_understand_and_agree_that_the_service_is_provided_as_ava", + "6.2 基于收益与赔偿相一致及公平合理的原则,如因公司原因造成本服务不正常中断或服务不可用,您所可能获得的最高赔偿额不超过本协议项下公司就该计费周期已实际收取您的相关服务费用总额。": "6_2_under_the_principles_of_proportionality_and_fairness_if_the_", + "七、法律适用与争议解决": "7_governing_law_and_dispute_resolution", + "7.1 本协议的成立、生效、履行、解释及争议的解决均应适用中华人民共和国法律。": "7_1_the_formation_effectiveness_performance_interpretation_and_d", + "7.2 本协议的签订地为广东省广州市南沙区。若您因本协议与公司发生任何争议,双方应尽量友好协商解决;如协商不成的,任何一方均同意应将相关争议提交至本协议签订地有管辖权的人民法院诉讼解决。": "7_2_this_agreement_is_entered_into_in_nansha_district_guangzhou_", + "7.3 本协议任一条款被视为废止、无效或不可执行,该条应视为可分的且并不影响本协议其余条款的有效性及可执行性。": "7_3_if_any_provision_is_held_repealed_invalid_or_unenforceable_i", + "广州光点飞舞网络有限公司": "guangzhou_guangdian_feiwu_network_co_ltd", + "扣款授权服务协议": "payment_authorization_agreement", + "扣费授权服务协议": "payment_authorization_agreement_702", + "版本号:V1.0 生效日期:2026年6月22日": "version_v1_0_effective_date_june_22_2026", + "一、授权声明": "1_authorization_statement", + "本人(即授权人,以下简称“乙方”)作为射灵星球小程序的注册用户,在自愿、平等、知悉全部授权内容的基础上,同意向广州光点飞舞网络有限公司(以下简称“甲方”)及甲方委托的第三方支付机构(包含微信支付、支付宝、苹果支付等,以下简称“支付机构”)作出本扣费授权,双方就授权扣费相关事宜达成如下协议。": "as_a_registered_user_of_the_sheling_planet_mini_program_i_the_au", + "二、授权主体": "2_parties_to_the_authorization", + "授权人(乙方):射灵星球小程序注册用户,用户ID以平台系统记录为准。": "authorizing_party_party_b_a_registered_sheling_planet_mini_progr", + "被授权人(甲方):广州光点飞舞网络有限公司,作为会员服务提供方及扣费指令发起方。": "authorized_party_party_a_guangzhou_guangdian_feiwu_network_co_lt", + "支付执行方:乙方绑定的第三方支付机构,受甲方委托执行扣费操作。": "payment_processor_the_third_party_payment_provider_linked_by_par", + "三、授权内容": "3_scope_of_authorization", + "授权场景:乙方开通射灵星球会员自动续费服务后,授权甲方在每个会员周期届满前,向支付机构发起扣费指令,用于支付下一周期的会员服务费用。": "authorized_purpose_after_party_b_activates_sheling_planet_member", + "授权金额:扣费金额以乙方开通时选择的自动续费套餐对应价格为准,具体以会员购买页面公示价格为准;若价格调整,甲方将提前通过公示或通知形式告知乙方,乙方继续使用服务视为认可并接受调整后的金额。": "authorized_amount_the_amount_is_the_price_of_the_auto_renewal_pl", + "授权支付账户:乙方开通自动续费时绑定的微信支付、支付宝等第三方支付账户,账户信息以支付机构记录为准。": "authorized_account_the_third_party_payment_account_such_as_wecha", + "授权扣费次数:本授权为周期性授权。在授权有效期内,甲方可按会员周期重复发起扣费指令,直至乙方依法撤销授权为止。": "authorized_frequency_this_is_a_recurring_authorization_during_it", + "四、授权有效期": "4_authorization_period", + "1. 本授权自乙方点击确认开通自动续费服务之日起生效,至乙方成功取消自动续费服务之日终止。": "1_this_authorization_takes_effect_when_party_b_confirms_activati", + "2. 若乙方注销射灵星球小程序账号,本授权自账号注销完成之日自动终止。": "2_if_party_b_closes_their_sheling_planet_mini_program_account_th", + "3. 若因国家政策调整、支付机构规则变更、乙方支付账户注销/冻结等非甲方主观原因导致授权无法履行的,本授权自动终止。": "3_this_authorization_ends_automatically_if_changes_in_national_p", + "五、扣费与提醒规则": "5_payments_and_reminders", + "1. 扣费提醒:甲方将在每个自动续费扣费日期前5日,通过微信服务通知、小程序系统消息或短信等显著方式提示乙方即将发生续期扣费的信息,以保障乙方的知情权与选择权。": "1_reminder_party_a_will_prominently_notify_party_b_of_upcoming_r", + "2. 扣费时机:甲方将在乙方当前会员有效期届满前24小时内发起下一周期的扣费指令,支付机构根据指令从乙方授权账户中划扣对应费用。": "2_timing_party_a_will_issue_instructions_for_the_next_cycle_with", + "3. 扣费失败处理:若因账户余额不足等原因导致首次扣费失败的,甲方及支付机构可在合规范围内依法尝试补扣;若补扣仍失败或账户处于异常状态的,本期自动续费暂停,乙方会员到期后自动失效。": "3_failed_payments_if_the_first_attempt_fails_due_to_insufficient", + "4. 扣费凭证:支付机构的扣费记录作为扣费成功的有效凭证,乙方可在支付账户账单中查询明细;甲方同步为乙方提供电子扣费记录,可在会员中心查看。": "4_proof_the_payment_provider_s_debit_record_is_valid_proof_of_su", + "六、授权的变更与撤销": "6_changes_and_revocation", + "1. 授权变更:本授权内容如需变更(如更换支付账户、调整续费套餐),乙方需先取消原自动续费服务,再重新开通新套餐。新授权自重新开通成功之日起生效,原授权同步终止。": "1_changes_to_change_this_authorization_such_as_the_payment_accou", + "2. 授权撤销:乙方可随时退订本自动续费服务,解约后不影响乙方已生效周期的会员服务。根据乙方开通时选择的支付执行方,具体撤销路径如下:": "2_revocation_party_b_may_cancel_auto_renewal_at_any_time_without", + "微信支付用户:可通过微信APP内(路径:我 -> 服务 -> 钱包 -> 支付设置 -> 自动续费)或在小程序会员中心页面撤销本授权。": "wechat_pay_revoke_authorization_in_wechat_me_services_wallet_pay", + "支付宝用户:可通过支付宝APP内(路径:我的 -> 设置 -> 支付设置 -> 免密支付/自动扣款)或在小程序会员中心页面撤销本授权。": "alipay_revoke_authorization_in_alipay_me_settings_payment_settin", + "苹果支付(iOS/App Store订阅)用户:必须通过苹果系统自带的功能进行取消(路径:iOS设备“设置” -> 点击顶部的Apple ID -> 订阅 -> 选择“射灵星球” -> 取消订阅)。": "apple_payments_ios_app_store_subscriptions_cancellation_must_be_", + "3. 退订生效时效:": "3_when_cancellation_takes_effect", + "针对微信支付和支付宝:撤销操作成功后,本授权即时终止,甲方不得再发起新的扣费指令。因第三方支付平台系统结算延迟等客观原因,导致退订生效前系统已自动扣款成功的,该期会员权益将正常发放,已扣费用原则上不予退还。": "wechat_pay_and_alipay_authorization_ends_immediately_after_succe", + "针对苹果支付:根据苹果公司政策,乙方需在当前计费周期届满前至少24小时手动取消订阅,否则苹果系统可能会自动续订并扣款。苹果渠道的扣费与退款均由苹果公司独立处理,甲方无权干涉,因乙方未及时取消导致扣费的,由乙方自行承担或向苹果公司申诉。": "apple_payments_under_apple_s_policies_party_b_must_manually_canc", + "七、免责条款": "7_disclaimers", + "1. 因乙方支付账户余额不足、账户冻结、挂失、注销、限额等非甲方原因导致扣费失败的,甲方不承担任何责任,由此造成的会员权益中断等后果由乙方自行承担。": "1_party_a_is_not_liable_for_failed_payments_caused_by_insufficie", + "2. 因支付机构系统故障、网络中断、政策调整等第三方不可抗力或外部原因导致扣费延迟、失败或错误的,甲方将协助乙方协调解决,但不承担相应的赔偿责任。": "2_for_delayed_failed_or_incorrect_payments_caused_by_payment_pro", + "3. 因乙方泄露支付账户密码、账号被盗用等自身保管不当原因导致的异常扣费,甲方不承担责任,乙方应自行向支付机构或公安机关主张权利。": "3_party_a_is_not_liable_for_abnormal_payments_caused_by_party_b_", + "八、信息保密": "8_confidentiality", + "1. 甲方及支付机构应对乙方的授权信息、支付信息、个人身份信息严格保密,不得用于本授权以外的任何用途。": "1_party_a_and_the_payment_providers_must_keep_party_b_s_authoriz", + "2. 除法律法规规定、司法机关或监管部门依法要求外,甲方不得向任何第三方泄露乙方的授权及支付相关信息。": "2_except_as_required_by_law_or_lawfully_requested_by_judicial_or", + "九、争议解决": "9_dispute_resolution", + "1. 本授权协议的订立、效力、履行及争议解决均适用中华人民共和国法律。": "1_the_formation_validity_performance_and_dispute_resolution_of_t", + "2. 因本协议产生的任何争议,双方应尽量友好协商解决;协商不成的,任何一方均可向甲方住所地(广东省广州市天河区)有管辖权的人民法院提起诉讼。": "2_disputes_should_first_be_resolved_through_friendly_negotiation", + "十、其他": "10_other_provisions", + "1. 本协议为《射灵星球小程序会员服务协议》的配套协议,与该协议具有同等法律效力;本协议未约定事项,参照主协议执行。": "1_this_agreement_supplements_the_sheling_planet_mini_program_mem", + "2. 甲方有权根据业务及监管要求调整本协议内容,调整后的协议将在平台公示,乙方继续使用自动续费服务视为接受调整后的内容。": "2_party_a_may_adjust_this_agreement_to_meet_business_and_regulat", + "3. 甲方客服联系方式:请通过射灵星球小程序内【在线客服】或发送邮件至官方客服邮箱进行反馈。": "3_customer_support_contact_online_support_in_the_sheling_planet_", + "普通会员": "vip_membership", + "成为射灵星球": "join_sheling_planet", + "特享约战竞技次数包、专属会员标识": "enjoy_extra_challenges_ranked_matches_and_an_exclusive_member_ba", + "普通会员专属权益": "exclusive_vip_benefits", + "黄金昵称": "gold_nickname", + "教练点评": "coach_feedback", + "专享VIP客服": "vip_customer_support", + "排位赛\n每日+20次": "ranked_matches_20_per_day", + "约战\n每日+20次": "challenges_20_per_day", + "超级会员": "svip_membership", + "尊享专属特效、无限制约战竞技、专属会员标识": "enjoy_exclusive_effects_unlimited_challenges_and_ranked_matches_", + "超级会员专属权益": "exclusive_svip_benefits", + "专属落点标识": "exclusive_impact_markers", + "专属命中效果": "exclusive_hit_effects", + "专属射箭效果": "exclusive_shot_effects", + "炫彩昵称": "colorful_nickname", + "约战无限制": "unlimited_challenges", + "排位赛无限制": "unlimited_ranked_matches", + "专享SVIP客服": "svip_customer_support", + "套餐配置加载中": "loading_plans", + "套餐暂不可购买": "this_plan_is_currently_unavailable", + "当前环境不支持微信虚拟支付": "wechat_virtual_payments_are_unavailable_in_this_environment", + "支付参数生成失败": "could_not_generate_payment_parameters", + "支付成功": "payment_successful", + "支付已取消": "payment_canceled_771", + "支付失败,请稍后重试": "payment_failed_please_try_again", + "下单失败": "could_not_create_order", + " 有效期至:": "valid_until_774", + "订单管理": "manage_orders", + "选择套餐": "select_plan", + "套餐说明": "plan_details", + "加载套餐中": "loading_plans_778", + "创建订单中": "creating_order", + "刷新会员状态中": "refreshing_membership_status", + " 一键激活": "activate_781", + "支付即同意": "by_paying_you_agree_to_the", + "复制成功": "copied", + "订单详情": "order_details", + "订单号:": "order_no", + "复制": "copy", + "创建时间:": "created", + "支付时间:": "paid_788", + "金额:": "amount", + " 元": "cny", + "支付方式:微信": "payment_method_wechat_pay", + "去支付": "pay_now", + "取消订单": "cancel_order", + "功能实现中": "coming_soon_794", + "确定关闭自动续费吗?\n会员到期后你将失去7项特权哦!": "turn_off_auto_renewal_you_will_lose_7_benefits_when_your_members", + "一意孤行": "cancel_anyway", + "继续享受": "keep_benefits", + "会员权益说明": "membership_benefits", + "射灵星球会员权益": "sheling_planet_membership_benefits", + "核心特权:": "core_features", + "解锁约战、段位评级、实时排位赛、AI智能教练点评四大核心功能。": "unlock_four_core_features_challenges_rank_ratings_live_ranked_ma", + "专属服务:": "exclusive_support", + "享全年不同阶段VIP专属客服,快速解决技术故障、规则疑问等所有问题。": "get_vip_customer_support_at_different_stages_throughout_the_year", + "新用户福利:": "new_user_gift", + "所有初次绑定设备的用户,免费赠送6个月普通会员。": "all_users_binding_a_device_for_the_first_time_receive_6_months_o", + " 加入射灵星球,在真实射箭运动中体验在线竞技的乐趣,结识全球志同道合的弓友,持续享受新功能与系统升级,不断挑战自我,创造属于你的辉煌战绩! ": "join_sheling_planet_to_enjoy_online_competition_through_real_arc", + "初次绑定设备赠送6个月": "6_months_free_with_first_device_binding", + "特权": "benefit", + "基础用户": "basic_user", + "无": "none_809", + "螺旋": "spiral", + "玻璃裂纹": "glass_cracks", + "箭矢飞行特效": "arrow_flight_effects", + "光箭": "light_arrow", + "每日约战次数": "daily_challenges", + "2次": "2", + "22次": "22", + "无限": "unlimited", + "每日排位赛次数": "daily_ranked_matches", + "专享": "exclusive", + "昵称美化": "nickname_style", + "黄金": "gold", + "炫彩": "colorful", + "专属客服": "exclusive_support_823", + "会员时长叠加与生效规则": "membership_stacking_and_activation_rules", + "等级优先级:": "membership_priority", + " 同时拥有 超级会员 和 普通会员 时,优先使用超级会员权益,普通会员时长自动顺延,待 超级会员 到期后自动生效。 ": "if_you_have_both_svip_and_vip_svip_benefits_take_priority_your_v", + "连续套餐叠加:": "stacking_recurring_plans", + " 已有月 / 半年 / 年卡时再购买连续包月 / 包年,总有效期直接累加;连续套餐从下单日起算,下个周期正常自动扣费。 ": "if_you_buy_a_recurring_monthly_or_annual_plan_while_holding_a_mo", + " 示例:1 月 1 日买半年卡(7 月 1 日到期),1 月 10 日买连续包月,总有效期延至 8 月 1 日,8 月 1 日会发起首次自动扣款。 ": "example_buy_a_half_year_pass_on_january_1_expires_july_1_then_a_", + "升级超级会员规则:": "upgrading_to_svip", + " 购买升级 超级会员 后立即生效,可升级时长以购买页面提示为准;未升级的剩余 普通会员 时长,将在 超级会员 到期后继续使用。 ": "an_svip_upgrade_takes_effect_immediately_the_purchase_page_shows", + "{p0}CM靶": "value_cm_target", + "5人大乱斗": "5_player_free_for_all", + "10人大乱斗": "10_player_free_for_all", + "{p0}人大乱斗": "value_player_free_for_all", + "我的成长脚印": "my_progress", + "赞我的朋友": "friends_who_liked_me", + "授权登录失败,请稍后重试。": "authorization_failed_please_try_again", + "登录已失效,请重新登录后完成绑定。": "your_session_has_expired_sign_in_again_to_complete_binding", + "网络异常,请稍后重试。": "network_error_please_try_again_842", + "登录门店Pad端": "sign_in_to_the_store_tablet", + "正在授权登录": "authorizing_sign_in", + "正在登录门店Pad端,请稍候……": "signing_in_to_the_store_tablet_please_wait", + "请先登录小程序": "please_sign_in_to_the_mini_program_first", + "微信授权登录": "sign_in_with_wechat", + "已成功授权登录射灵星球门店Pad端。": "you_have_authorized_sign_in_to_the_sheling_planet_store_tablet", + "登录账号:": "account", + "手机号:": "phone_850", + "登录门店:": "store", + " 温馨提示:离开门店时候记得在Pad退出登录哦! ": "remember_to_sign_out_of_the_tablet_before_leaving_the_store", + "回到首页": "back_to_home", + "授权登录失败": "sign_in_authorization_failed", + "重新登录": "sign_in_again", + "二维码无效": "invalid_qr_code_856", + "请重新扫描门店Pad端上的小程序码。": "please_scan_the_mini_program_code_on_the_store_tablet_again", + "请完善信息": "please_complete_the_information", + "选择参数": "select_settings", + "下一步": "next", + "开启我的弓箭记录": "start_my_archery_log", + "落点稳定性说明": "about_shot_grouping", + "通过计算每支箭与其他箭的平均距离衡量射箭的稳定性,数字越小则说明射箭越稳定。该数据只能在用户标记落点的情况下生成。": "shot_grouping_measures_consistency_by_calculating_the_average_di", + "落点分布说明": "about_shot_distribution", + "展示用户某次练习中射箭的点位": "shows_the_impact_positions_from_a_practice_session", + "射箭打卡,今日又精进了一些~": "archery_check_in_a_little_better_every_day", + "我的备注": "my_notes", + "添加备注": "add_note", + " 分享 ": "share", + "备注": "notes", + "写下本次射箭的补充信息与心得": "add_details_and_reflections_about_this_session", + " 保存备注 ": "save_note", + "第 ": "end", + " 组": "empty_874", + "删除": "delete", + "推荐在靶纸上落点计分,这样可获得稳定性分析": "mark_your_shots_on_the_target_face_to_get_grouping_analysis", + "现在离开会导致": "leaving_now_will_cause", + "未提交的数据丢失,是否继续?": "unsaved_data_to_be_lost_continue", + "退出": "exit", + " 继续记录 ": "continue_recording", + "保存并查看分析": "save_and_view_analysis", + "下一组": "next_end", + "已删除": "deleted", + "删除失败,请重试": "could_not_delete_please_retry", + "计分记录": "score_records", + "请选择": "please_select", + "本地草稿": "local_draft", + "计分待完成": "scoring_incomplete", + "确认删除该记录吗?": "delete_this_record", + "占领了封面": "topped_the_cover", + "整整消耗了": "burned_a_total_of", + "大卡!": "kcal_892", + "排行": "rank_893", + "用户": "user", + "消耗": "calories", + "重度": "high", + "中度": "moderate", + "轻度": "low", + "高效记录每一次射箭,深度分析助你提升!": "track_every_shot_improve_with_detailed_analysis", + "周一": "mon", + "周二": "tue", + "周三": "wed", + "周四": "thu", + "周五": "fri", + "周六": "sat", + "周日": "sun", + "今日射箭": "arrows_today", + "卡": "kcal_910", + "今日消耗": "calories_today", + "运动强度": "activity_intensity", + "训练天数": "training_days", + "累计射箭": "total_arrows", + "生成中...": "generating", + "查看完整榜单": "view_full_rankings", + "发现未完成的记分,是否继续编辑?": "you_have_an_unfinished_score_record_continue_editing", + " 重新计分 ": "start_over", + " 继续编辑 ": "continue_editing", + "训练重连失败,请重试": "could_not_reconnect_to_training_please_retry", + "训练已结束,请重新进入": "training_has_ended_please_enter_again", + "个人单组练习": "single_end_practice", + "请开始射箭第{p0}轮": "start_shooting_round_value", + "还有两场,坚持": "two_more_to_go_keep_going", + "就是胜利!💪": "you_ve_got_this", + "准备好了,直接开始": "i_m_ready_start_927", + "日常耐力挑战": "daily_endurance_challenge", + "请连续射{p0}支箭": "shoot_value_arrows_in_a_row", + "完成过半,胜利": "more_than_halfway_victory", + "在望!💪": "is_in_sight", + "个人练习": "solo_practice", + "师傅领进门,修行靠自身,赶紧练起来吧。": "your_coach_shows_the_way_progress_comes_from_practice_start_now", + "坚持练习就能你快速升级,早日加入全国排位赛!": "keep_practicing_to_level_up_faster_and_join_national_ranked_matc", + "已练习打卡": "practice_check_ins", + "个人练习量": "solo_practice_arrows", + "射灵": "sheling_937", + "级": "empty_938", + "当前等级": "current_level", + "倔强青铜1": "determined_bronze_1", + "倔强青铜2": "determined_bronze_2", + "倔强青铜3": "determined_bronze_3", + "每个小段位需要满3颗星才能晋升到下一个段位,共9颗星。": "earn_3_stars_in_each_division_to_advance_for_a_total_of_9_stars", + "秩序白银1": "orderly_silver_1", + "秩序白银2": "orderly_silver_2", + "秩序白银3": "orderly_silver_3", + "荣耀黄金1": "glorious_gold_1", + "荣耀黄金2": "glorious_gold_2", + "荣耀黄金3": "glorious_gold_3", + "荣耀黄金4": "glorious_gold_4", + "每个小段位需要满4颗星才能晋升到下一个段位,共16颗星。": "earn_4_stars_in_each_division_to_advance_for_a_total_of_16_stars", + "永恒钻石1": "eternal_diamond_1", + "永恒钻石2": "eternal_diamond_2", + "永恒钻石3": "eternal_diamond_3", + "永恒钻石4": "eternal_diamond_4", + "永恒钻石5": "eternal_diamond_5", + "每个小段位需要满5颗星才能晋升到下一个段位,共25颗星。": "earn_5_stars_in_each_division_to_advance_for_a_total_of_25_stars", + "段位介绍": "about_ranks", + " 在射灵世界的对战体系内,段位是衡量您竞赛技术水平的重要指标,它不仅代表了玩家的排位段位,还体现了玩家在对战中的综合表现。通过不断对抗和积累积分,玩家可以逐步提升自己的段位,以下是关于段位的详细说明。 ": "in_the_sheling_battle_system_rank_is_an_important_measure_of_com", + "一、段位体系概述": "1_rank_system_overview", + " 我们的段位体系分为多个等级,从低到高依次为:倔强青铜、秩序白银、荣耀黄金、永恒钻石、最强王者、非凡王者、无双王者、绝世王者、至圣王者、荣耀王者和传奇王者。每个大段位下又分为若干小段位,玩家需要通过积累积分来提升段位。 ": "ranks_from_lowest_to_highest_are_determined_bronze_orderly_silve", + "二、积分获取规则": "2_earning_points", + "(一)基本规则": "1_basic_rules", + "1V1、2V2、3V3对抗模式:": "1v1_2v2_and_3v3_versus", + "每胜一局,胜方每人+100积分;每负一局,负方每人-100积分": "each_player_on_the_winning_team_gains_100_points_each_player_on_", + "2V2模式:胜方队伍中,总成绩最高且箭均成绩≥7环者,为本局MVP,额外获得40积分。": "2v2_the_player_with_the_highest_total_score_on_the_winning_team_", + "3V3模式:胜方队伍中,总成绩最高且箭均成绩≥7环者,为本局MVP,额外获得60积分。": "3v3_the_player_with_the_highest_total_score_on_the_winning_team_", + "在1V1/2V2/3V3三种模式中,连续获得五连胜(三类模式一起算),则从第五场开始,每场胜利可额外再加15分,直至结束连胜。(仅限对抗模式,不含大乱斗模式。)": "a_streak_of_five_wins_across_1v1_2v2_and_3v3_awards_15_extra_poi", + "5人、10人大乱斗模式:": "5_player_and_10_player_free_for_all", + " 5人大乱斗和10人大乱斗按个人总环数成绩排序,排名从高到低依次设置系统默认奖励/扣除积分,默认初始排名和积分规则具体如下: ": "players_in_5_player_and_10_player_free_for_all_are_ranked_by_tot", + "排名": "position", + "(二)大段位规则": "2_rank_tier_rules", + "大段位升级中,每个玩家将根据不同的规则得到相应不同的积分,具体的规则如下": "points_required_to_advance_through_tiers_vary_according_to_the_f", + "三、(表格)": "3_rank_table", + "大段位": "tier", + "小段位": "division", + "积分(100积分=1星)": "points_100_points_1_star", + "积分榜": "points_rankings", + "排位赛积分": "ranked_points", + "MVP榜": "mvp_rankings", + "MVP次数": "mvp_awards", + "十环榜": "10s_rankings", + "十环次数": "10s_scored", + "暂无段位": "unranked_1010", + "{p0},{p1}场": "value_value_matches", + "排行榜加载失败": "could_not_load_rankings", + "本赛季排行榜": "season_rankings", + "用户ID": "user_id", + "排位": "rank_1015", + "胜率": "win_rate", + "{p0}场 {p1} {p2}%": "value_matches_value_value", + ",MVP次数 {p0}": "mvp_awards_value", + "赛季数据加载失败": "could_not_load_season_data", + "页面数据加载失败": "could_not_load_page_data", + "排位赛": "ranked_matches", + "积分:": "points_1021", + "得分率": "scoring_rate", + " 查看我的比赛记录 ": "view_my_match_history", + "点击查看更多": "tap_for_more", + "正在恢复比赛...": "restoring_match", + "{p0}分{p1}秒": "valuemin_values", + "{p0}秒": "values", + "稳定性": "grouping", + "最高连击次数": "best_streak", + "连": "hits", + "共命中环数": "total_score_1037", + "能量最高值": "peak_energy", + "达标箭数": "qualifying_arrows", + "达标率": "qualification_rate", + "完成箭数": "arrows_completed", + "支": "arrows_1042", + "命中环数": "score_1043", + "命中目标数": "targets_hit", + "射箭数": "arrows_shot_1045", + "命中率": "hit_rate", + "下一难度": "next_difficulty", + "再来一次": "try_again", + "对比上次": "vs_last_session", + "分享成绩": "share_results", + "环的成绩,所有箭支上靶后的平均点间距离为": "pts_the_average_distance_between_your_arrow_impacts_is_1051", + " 针对您本次的练习,": "for_this_session_1052", + "节奏训练": "rhythm_training", + "在最后的{p0}秒内射箭": "shoot_in_the_last_values", + "在最后的{p0}秒射箭并命中{p1}环内": "shoot_in_the_last_values_and_hit_within_value_rings", + " 每秒失去": "lose", + "%能量 ": "energy_per_second", + "稳定训练能量进度": "stability_training_energy_progress", + "当前靶纸为": "current_target", + "基础训练": "basic_training", + "耐力训练": "endurance_training", + "精准训练": "precision_training", + "稳定训练": "stability_training", + "秒内,": "s_1064", + "不限时,": "no_time_limit", + "命中": "hit", + "环的箭": "pts_each", + "共射出": "shoot_1068", + "支箭,且总环数": "arrows_with_a_total_of", + "箭高亮区域": "arrows_in_the_highlighted_area", + "个节奏内,随节奏射箭,命中": "beats_follow_the_rhythm_and_land", + "箭成绩": "arrows_scoring", + "环且踩中节拍区间": "pts_within_the_beat_window", + "每射一箭": "each_arrow_scoring", + "环可为能量槽充能,能量充满即过关": "pts_charges_energy_fill_the_bar_to_pass", + "{p0}难度": "value_difficulty", + "20CM全环靶": "20_cm_full_ring_target_325", + "训练难度加载失败": "could_not_load_training_difficulties", + "难度尚未解锁": "this_difficulty_is_locked", + "训练创建失败,请重试": "could_not_create_training_please_retry", + "进入训练失败,请重试": "could_not_enter_training_please_retry", + "训练创建中...": "creating_training", + "当前进度 LV{p0} >": "current_progress_lvvalue", + "功能开发中...": "coming_soon_1088", + "共训练": "training", + "上靶率": "on_target_rate", + " 已超越": "ahead_of", + "对手 ": "of_opponents", + "我的训练记录": "my_training_records", + "无级别限制": "no_level_requirement", + " 推荐 ": "recommended", + "命中 ": "hit_1096", + " 支": "arrows_at", + "射出≥ ": "shoot_1098", + " 支箭,总环数达到≥ ": "arrows_with_a_total_score", + "命中高亮区域 ": "hit_the_highlighted_area_with", + " 箭": "arrows_1101", + " 个节奏内,跟随节奏射箭,命中 ": "beats_follow_the_rhythm_and_land_1102", + "环可为能量槽充能,充满即过关": "pts_charges_energy_fill_the_bar_to_pass_1103", + "练习信息获取失败,请重试": "could_not_load_practice_details_please_retry", + "训练参数异常,请重新选择难度": "invalid_training_parameters_select_a_difficulty_again", + "准备好了,开始练习": "i_m_ready_start_practice", + "加载中": "loading_1111", + "VIP已开通": "vip_active", + "VIP未开通": "vip_inactive", + "加载失败,重试": "could_not_load_retry", + "用户信息": "user_profile", + "用户名": "username", + "头像": "avatar_1119", + "订单": "orders", + "未完成": "incomplete", + "版本信息(仅用于测试)": "version_info_test_only", + "解绑设备(仅用于测试)": "unbind_device_test_only", + "退出登录(仅用于测试)": "sign_out_test_only", + "今日{p0}次数:{p1}/{p2}": "today_s_value_value_value", + "未识别到靶纸,请瞄准靶纸射箭": "no_target_detected_aim_at_the_target_and_shoot", + "靶纸错误": "incorrect_target_face", + "站距合格": "distance_ok", + "站距过近": "too_close", + "靶纸正确": "target_face_ok", + "请先绑定设备": "please_bind_a_device_first", + "智能弓未连接": "smart_bow_disconnected", + "请先完成新手试炼": "please_complete_the_beginner_challenge_first", + "比赛连接信息异常": "invalid_match_connection", + "设备绑定状态已失效,请重新绑定": "your_device_binding_has_expired_please_bind_it_again", + "当前有未支付订单": "you_have_an_unpaid_order", + "房间已过期": "this_room_has_expired", + "-箭前准备-感知距离-小试牛刀": "get_ready_find_your_distance_first_challenge", + "重回": "return", + "一": "1", + "二": "2_109", + "三": "3", + "四": "4", + "五": "5", + "你": "you", + "轮到你了": "your_turn", + "请红方射箭": "red_team_shoot", + "请蓝方射箭": "blue_team_shoot", + "比赛开始": "match_started", + "比赛结束": "match_ended_119", + "向{p0}调整": "adjust_value", + "第一轮": "round_1", + "第二轮": "round_2", + "第三轮": "round_3", + "第四轮": "round_4", + "第五轮": "round_5", + "下半场开始": "second_half_started", + "站距合格,靶纸正确": "distance_and_target_face_ok", + "请射箭!测试站距与靶纸": "shoot_to_check_distance_and_target_face_230", + "好成绩!全国排位赛等着你!": "great_score_the_national_ranked_matches_await", + "持续练习,就会迎来更多高光时刻!": "keep_practicing_for_more_moments_to_shine", + "每日练习打卡,争取下次脱颖而出!": "practice_daily_and_stand_out_next_time", + "王者一定属于你!": "the_top_rank_is_within_your_reach", + "高光时刻!继续保持!": "a_moment_to_shine_keep_it_up", + "射灵世界的佼佼者!": "one_of_the_best_in_the_sheling_world", + "再来一次,定能脱颖而出!": "try_again_and_make_your_mark", + "加强练习,争取越战越勇": "practice_more_and_come_back_stronger", + "人生走过的每一步都算数": "every_step_you_take_counts", + "决金箭轮": "golden_arrow_round", + "练习结束": "practice_ended", + "胜利": "victory", + "失败": "defeat", + "40CM全环靶": "40_cm_full_ring_target_324", + "加载金币获取明细失败": "could_not_load_coin_earnings", + "加载金币兑换记录失败": "could_not_load_redemptions", + "加载门店会员失败": "could_not_load_store_membership", + "加载金币统计失败": "could_not_load_coin_statistics", + "加载礼品列表失败": "could_not_load_gifts", + "加载附近门店失败": "could_not_load_nearby_stores", + "获取定位失败": "could_not_get_your_location", + "加载礼品详情失败": "could_not_load_gift_details", + "加载金币规则失败": "could_not_load_coin_rules", + "获取设备详情失败": "could_not_load_device_details", + "获取设备二维码失败": "could_not_load_the_device_qr_code", + "二维码下载失败": "could_not_download_the_qr_code", + "超时": "timeout", + "设备详情已失效": "device_details_have_expired", + "请开始射击": "start_shooting", + "请开始连续射箭": "start_shooting_continuously", + "即将开始...": "starting_soon", + "上": "first", + "下": "second", + "半场:请先射6箭": "half_shoot_6_arrows_first", + "准备下半场": "get_ready_for_the_second_half", + "当前轮已进行{p0}秒": "current_round_values_elapsed", + "个人训练": "solo_training", + "练习开始": "practice_started", + "倔强青铜": "determined_bronze", + "青铜1": "bronze_1", + "青铜2": "bronze_2", + "青铜3": "bronze_3", + "秩序白银": "orderly_silver", + "白银1": "silver_1", + "白银2": "silver_2", + "白银3": "silver_3", + "荣耀黄金": "glorious_gold", + "黄金1": "gold_1", + "黄金2": "gold_2", + "黄金3": "gold_3", + "黄金4": "gold_4", + "永恒钻石": "eternal_diamond", + "钻石1": "diamond_1", + "钻石2": "diamond_2", + "钻石3": "diamond_3", + "钻石4": "diamond_4", + "钻石5": "diamond_5", + "最强王者": "supreme_champion", + "非凡王者": "extraordinary_champion", + "无双王者": "peerless_champion", + "绝世王者": "matchless_champion", + "至圣王者": "exalted_champion", + "荣耀王者": "glorious_champion", + "传奇王者": "legendary_champion", + "请红队射箭": "red_team_shoot_1025", + "请蓝队射箭": "blue_team_shoot_1026", + "剩余:": "remaining_1027", + "基础": "basics", + "精准": "precision", + "稳定": "stability", + "节奏": "rhythm", + "耐力": "endurance", + "通关成功": "challenge_complete", + "通关失败": "challenge_failed", + "Bingo命中目标": "bingo_target_hit", + "未命中": "miss_1109", + "左下": "down_and_left_1127", + "左": "left_1128", + "左上": "up_and_left_1129", + "右上": "up_and_right_1130", + "右": "right_1131", + "右下": "down_and_right_1132", + "站距过近,靶纸错误": "too_close_incorrect_target_face", + "站距过近,靶纸正确": "too_close_target_face_ok", + "站距合格,靶纸错误": "distance_ok_incorrect_target_face", + "射箭无效,未识别到靶纸": "invalid_shot_no_target_detected", + "射箭无效,距离不足且靶纸错误": "invalid_shot_too_close_and_incorrect_target_face", + "射箭无效,靶纸错误": "invalid_shot_incorrect_target_face", + "射箭无效,距离不足": "invalid_shot_too_close", + "射击无效": "invalid_shot", + "登录失败": "sign_in_failed" +} diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json new file mode 100644 index 0000000..c046b81 --- /dev/null +++ b/src/locales/zh-CN.json @@ -0,0 +1,1110 @@ +{ + "wifi_location_permission": "用于扫描附近 WiFi,完成设备 OTA 升级网络连接", + "1": "一", + "2": "2次", + "3": "三", + "4": "四", + "5": "五", + "22": "22次", + "request_timed_out_please_try_again": "请求超时,请稍后重试", + "network_disconnected_check_your_network_settings": "网络连接已断开,请检查网络设置", + "cannot_connect_to_the_server_please_try_again": "服务器连接失败,请稍后重试", + "network_error_check_your_connection": "网络异常,请检查网络连接", + "request_failed_please_try_again": "请求失败,请稍后重试", + "network_error_please_try_again": "网络异常,请稍后重试", + "notice": "提示", + "your_account_has_been_signed_in_on_another_device": "账号已在其他设备登录", + "today_s_check_in": "今日打卡", + "m": " 米", + "shot_grouping": "落点稳定性", + "gold_hit_rate": "黄心率", + "10s": "10环数", + "average_score": "平均环数", + "total_score": "总环数", + "shot_distribution": "落点分布", + "score": "环值", + "sheling_planet": "射灵星球", + "track_every_arrow_join_us": "高效记录每一箭,快来一起打卡吧!", + "scan_to_check_in": "扫码打卡", + "arrows_this_week": "本周箭数", + "calories_this_week": "本周消耗", + "my_rank": "我的名次", + "your_archery_journey_starts_here": "正式开启弓箭手之路", + "archery_check_in_value": "今日弓箭练习打卡 {p0}", + "total": "共", + "pts": "环", + "sheling": "射灵平台", + "join_us_and_play": "快加入我们一起玩吧~", + "practice_makes_a_great_archer": "后羿就是这样练成的", + "coming_soon": "功能尚未开启", + "return_to_your_current_match": "返回进行中的对局", + "back_to_room": "返回房间", + "blue": "蓝队(", + "red": "红队(", + "arrows_total": "支箭,共", + "battery": "电量--", + "battery_value": "电量{p0}%", + "x": "X环", + "value_pts": "{p0}环", + "0_pts": "0环", + "miss": "未上靶", + "halftime": "中场休息", + "xp_1": " 经验 +1 ", + "simulate": "模拟", + "shoot": "射箭", + "sight_on": "开瞄", + "sight_off": "关瞄", + "finish_your_current_match_before_starting_a_new_one": "完成进行中的对局才能开启新的。", + "you_have_a_match_in_progress_join_it": "您有正在进行中的对局,是否进入?", + "stay_out": " 不进入 ", + "loading": "加载中...", + "join": "进入", + "leaving_may_result_in_a_loss": "离开比赛可能会导致比赛失败,", + "are_you_sure_you_want_to_leave": "确认离开吗?", + "leave_match": "离开比赛", + "continue_match": " 继续比赛 ", + "done_playing_for_today": "今天不玩了吗?", + "cancel": " 取消 ", + "confirm": "确认", + "calibrate_your_smart_bow_to_unlock_all_features": "完成智能弓校准,即可解锁全部功能", + "calibrate": "去校准", + "please_complete_the_room_settings": "请完善创建信息", + "versus_1v1": "对抗模式(1V1)", + "versus_2v2": "对抗模式(2V2)", + "versus_3v3": "对抗模式(3V3)", + "free_for_all_3_10_players": "乱斗模式(3-10人)", + "select_target_face": "选择靶纸", + "20_cm_full_ring_target": "20厘米全环靶", + "40_cm_full_ring_target": "40厘米全环靶", + "create_room": "创建房间", + "your_smart_bow_is_charging_and_will_shut_down_automatically_to_p": "检测到智能弓箭已开始充电,为保护电池,设备即将自动关机。\n(注意:此时拔出充电线将会重启设备。)", + "got_it": "我知道了", + "select_bow_type": "选择弓种", + "select_shooting_distance": "选择练习距离", + "select_ends_arrows": "选择组/箭数", + "value_ends_value_arrows": "{p0}组/{p1}箭", + "select_ends": "选择组", + "m_92": "米", + "custom": "自定义", + "ends": "组", + "select_arrows_per_end": "选择每组的箭数", + "arrows": "箭", + "welcome_new_archer": "新来的弓箭手你好呀~", + "get_ready": "箭前准备", + "find_your_distance": "感知距离", + "first_challenge": "小试牛刀", + "room": "房号: ", + "yuezheng_qingshan": "乐正青山", + "yuwen_yulan": "宇文玉兰", + "cen_siyu": "岑思宇", + "wu_ziyu": "邬梓瑜", + "fan_zijin": "范子衿", + "a_worthy_opponent": "旗鼓相当的对手", + "le_zirui": "乐子睿", + "shi_chunxiao": "时春晓", + "bai_guhong": "柏孤鸿", + "donggong_jinse": "东宫锦瑟", + "duangan_liuyun": "段干流云", + "cancel_matchmaking": "取消匹配", + "cancel_133": "取消", + "confirm_134": "确定", + "please_turn_on_your_smart_bow_first": "请先开启智能弓", + "preparing_firmware_update": "正在准备固件更新", + "downloading_firmware": "正在下载固件", + "installing_firmware": "正在安装固件", + "updating_firmware": "正在进行固件更新", + "update_now": "立即更新", + "later": "暂不更新", + "firmware_update_complete": "固件更新已完成", + "close": "关闭", + "please_stay_on_this_page": "请勿离开当前页面!", + "please_make_sure": "请确保:", + "1_your_smart_bow_is_on": "1、智能弓已开启", + "2_your_network_connection_is_stable": "2、网路连接稳定", + "retry": "重试", + "points": "积分", + "ready": "已准备", + "waiting_for_a_player": " 虚位以待 ", + "host": "管理员", + "days": "天", + "average": "平均", + "kcal": "千卡", + "gold_hit_rate_156": "黄心率:", + "10s_157": "10环数:", + "average_158": "平均:", + "zoom": "放大", + "actual_size": "真实", + "thank_you_for_your_support": "感谢您的支持!", + "payment_canceled": "取消支付", + "thank_you_for_supporting_our_community_project": "感谢您对我们公益项目的支持!", + "i_have_a_suggestion_optional": "我想给建议(选填)", + "your_name": "您的姓名", + "phone_wechat_id": "手机/微信号", + "organization": "所在机构", + "suggestion": "建议", + "round": "第", + "shooting_complete": "轮射箭结束", + "blue_team_this_round": "本轮蓝队", + "pts_red_team": "环,红队", + "no_arrows_were_shot_by_either_team_for_3_consecutive_turns_match": " 连续3个来回双方均无人射箭,比赛取消。 ", + "red_and_blue_teams_each_earn": " 红队、蓝队各得", + "pts_175": "分 ", + "blue_team_wins_and_earns": " 蓝队获胜,得", + "red_team_wins_and_earns": " 红队获胜,得", + "blue_team": "蓝队", + "pts_red_team_179": "分,红队", + "pts_180": "分", + "a_tie_one_final_arrow_decides_the_winner": "同分僵局!最后一箭定江山", + "s_until_both_teams_shoot": "秒后蓝红双方", + "golden_arrow": "决金箭", + "one_arrow_decides_it_all": "一箭决胜负", + "final_score": "总成绩", + "completed": "完成", + "arrows_earned": "箭,获得", + "xp": "点经验", + "score_this_match_total": "本局成绩(共", + "pts_194": "环):", + "view_target": "查看靶纸", + "back": "返回", + "your_score_for_this_session_is": " 您本次练习取得了", + "pts_the_average_distance_between_your_arrow_impacts_is": "环的成绩,所有箭支上靶后的平均点间距为", + "keep_practicing": "还需要持续改进哦~", + "excellent_performance": "成绩优秀。", + "for_this_session": "针对您本次的练习,", + "we_recommend_practicing_consistency_in_your_bow_arm_anchor_point": "我们建议您充分练习推弓、靠位以及撒放动作一致性。", + "we_recommend_keeping_up_the_good_work": "我们建议您继续保持即可。", + "we_recommend_adjusting_your_sight_value": "我们建议您将设备的瞄准器{p0}调整。", + "no_data_yet": "暂无数据", + "no_more_results": "没有更多了", + "halftime_values": "中场休息({p0}秒)", + "time_s_up": "时间到!", + "remaining": "剩余", + "s": "秒", + "please_authorize_your_phone_number": "请获取手机号", + "please_select_an_avatar": "请选择头像", + "please_enter_a_nickname": "请输入昵称", + "please_agree_to_the_agreements_first": "请先同意协议", + "phone": "手机:", + "authorize": "点击获取", + "avatar": "头像:", + "nickname": "昵称:", + "sign_in_with_phone_number": "手机号快捷登录", + "i_have_read_and_agree_to_the": "已同意并阅读", + "user_agreement": "《用户协议》", + "and": "及", + "privacy_policy": "《隐私协议》", + "terms": "内容", + "select_target_type": "选择靶型", + "red_team": "红队", + "stand_at_least_5_m_from_the_target": "请确保站距达到5米", + "shots_from_under_5_m_do_not_count": "低于5米的射箭无效", + "simulate_shot": " 模拟射箭 ", + "shoot_to_check_distance_and_target_face": "请射箭,测试站距与靶纸", + "match_starts_in": "距离正式比赛还有", + "joining": " 进入中... ", + "match": "距离正式比赛", + "starts_in": "开始还有", + "earlier": " 已省略前 ", + "arrows_hidden_showing_the_latest": " 支,仅显示最近 ", + "arrows_241": " 支 ", + "rank_points": "段位积分", + "national_rank_this_season": "本赛季全国", + "empty": "名", + "this_season": "本赛季", + "unranked": "暂未上榜", + "sign_in": "登录", + "congratulations_you_reached": "恭喜你升级到", + "sheling_level_value": "射灵{p0}级", + "firmware_update_complete_250": "固件更新完成", + "firmware_update_failed": "固件更新失败", + "update_failed_check_your_device_and_network_then_retry": "更新失败,请检查设备及网络后重试", + "firmware_update_timed_out_please_try_again": "固件更新超时,请稍后重试", + "target_firmware_version_is_missing": "缺少固件目标版本", + "could_not_create_the_firmware_update_task_please_retry": "固件更新任务创建失败,请稍后重试", + "firmware_update_request_failed_please_retry": "固件更新请求失败,请稍后重试", + "awaiting_payment": "待付款", + "paid": "已付款", + "shipped": "已发货", + "completed_260": "已完成", + "closed": "已关闭", + "refund_requested": "申请退款", + "refund_in_progress": "退款中", + "refunded": "已退款", + "refund_declined": "拒绝退款", + "down_and_right": "向右下方调瞄", + "down": "向下方调瞄", + "down_and_left": "向左下方调瞄", + "left": "向左侧调瞄", + "up_and_left": "向左上侧调瞄", + "up": "向上方调瞄", + "up_and_right": "向右上方调瞄", + "right": "向右侧调瞄", + "about_us": "关于我们", + "sheling_planet_is_a_platform_for_professional_archers_and_archer": " 《射灵星球》是以智能和物联网技术驱动的全球射箭专业选手及射箭爱好者互动交流平台,由广州光点飞舞网络有限公司研发并提供线上服务。 ", + "we_explore_and_apply_smart_archery_technology_through_innovation": " 我们专注于智能射箭技术的探索和应用,通过物联网技术、激光系统、人工智能、嵌入式AI及射箭在线互娱模式的创新与研发,提供专业的智能体育设备和有趣的在线物联游戏,以此推动射箭运动及更多专业体育运动走入大众家庭。 ", + "guangdong_icp_no_2025421150_2x": "粤ICP备2025421150号-2X", + "audio_test": "音频测试", + "continuous_playback_1": "连续播放1", + "play": " 播放 ", + "continuous_playback_2": "连续播放2", + "loaded": "已加载", + "not_loaded": "未加载", + "play_301": "播放", + "load_and_play": "加载并播放", + "win": "获胜", + "scored": "斩获", + "me": "自己", + "pts_308": " 环", + "your_xp": " 你的经验 ", + "your_points": " 你的积分 ", + "view_results": "查看成绩", + "friend_challenge": "好友约战", + "free_for_all": "多人乱斗", + "valuevvalue_versus": "{p0}v{p1}对抗赛", + "could_not_check_match_status_please_retry": "比赛状态查询失败,请重试", + "could_not_join_the_match_please_retry": "进入比赛失败,请重试", + "creating_match_please_wait": "比赛正在创建,请稍候", + "you_have_been_removed_from_the_room": "你被踢出房间", + "this_room_has_been_closed": "房间已解散", + "ready_for_a_thrilling_free_for_all": "热血乱斗赛,敢来争锋?", + "join_my_team_for_a_2v2_match": "2v2对抗赛,是兄弟来助我一把!", + "join_our_3v3_match_we_re_ready_to_go": "3v3对抗赛,来了马上发车!", + "ready_to_see_who_is_the_better_archer": "星球论箭,来一决高下敢否?", + "please_use_a": "请使用", + "full_ring_target": "全环靶", + "shots_will_not_count_if_the_target_face_differs_from_your_select": "如果实际靶纸与选择靶纸不同,将导致射箭无效", + "ready_329": " 已准备 ", + "join_330": "我要加入", + "joining_match": "即将进入对局...", + "start_match": "开始对局", + "i_m_ready": "我准备好了", + "once_everyone_is_ready_the_host_can_start_the_match": "所有人准备好后由房主点击开始", + "you_have_used_all_your_challenges_for_today_activate_membership_": "今日约战次数已经用完\n开通会员可增加次数", + "got_it_335": "知道了", + "activate": "去开通", + "remove": " 是否把「", + "from_the_room": "」移出房间? ", + "total_coins": "累计金币:", + "redeemable_coins": "可兑换金币:", + "no_coin_earnings_yet": "暂无金币获取记录。", + "redeemed_item": "兑换内容", + "redemption_type": "兑换类型", + "time": "时间", + "coins_used": "金币使用", + "type": "类型", + "coins_earned": "金币获取", + "allow_location_access_to_find_nearby_stores": "授权获取你的定位,以便推荐附近门店。", + "allow_access": "立即授权", + "online_redemption_is_not_available_please_redeem_at_a_store": "暂不支持线上兑换,请前往线下门店进行兑换。", + "coins": "金币", + "empty_352": "个", + "times": "次", + "address": "地址:", + "phone_355": "电话:", + "hours": "营业时间:", + "valid_until_value": "有效期至{p0}", + "not_activated": "未开通", + "learn_more_about_experience_center_vip": "查看更多关于体验中心VIP的介绍 >", + "special_offer_cny_9_9_90_days": "特惠价格:9.9元/90天", + "your_vip_is_active": "您已开通VIP", + "to_activate_please_contact_staff_at_a_store": "开通方式:请前往线下门店联系工作人员开通", + "coin_rules": "金币规则", + "earnings": "获取明细", + "redemptions": "兑换记录", + "nearby_stores": "附近门店", + "experience_center_vip": "体验中心VIP", + "my_coins": "我的金币", + "free_trial": "免费体验权益", + "enjoy_one_free_30_minute_smart_archery_session_join_the_official": "使用该权益可免费体验智能弓箭30分钟1次,加入官方社群还可以额外获赠1次。", + "special_offer": "特惠购买权益", + "buy_one_30_minute_experience_session_at_the_special_price_of_cny": "使用该权益可以19.9元的特惠价格购买30分钟体验服务1次。", + "complimentary_drink": "到店赠饮权益", + "receive_one_complimentary_designated_drink_each_time_you_visit": "使用该权益每次到店后可获得免费赠送的指定饮品一支。", + "coin_earnings": "金币获取明细", + "coin_redemptions": "金币兑换记录", + "no_redemptions_yet": "暂无金币兑换记录。", + "could_not_load_membership_details_retry_or_select_another_store": "会员信息加载失败,请点击重试或切换门店", + "coming_soon_385": "功能开发中", + "experience_center": "线下体验中心", + "select_store": "选择门店", + "loading_membership": "会员信息加载中...", + "experience_center_vip_is_designed_for_archery_enthusiasts_activa": " 门店体验中心VIP是为热爱射箭运动的用户专属打造的VIP服务,开通后即可享受以下三大专属权益: ", + "could_not_load_tap_to_retry": "加载失败,点击重试", + "no_more_products": "没有更多商品了~", + "no_items_available_for_redemption": "暂无兑换商品~", + "please_visit_an_experience_center_and_contact_staff_to_activate_": "请前往线下门店体验中心,联系工作人员开通VIP。", + "got_it_394": "我已知晓", + "invalid_store_information": "门店信息无效", + "no_nearby_stores": " 附近暂无门店~ ", + "no_more_stores": "没有更多门店了~", + "invalid_product_parameters": "商品参数无效", + "product_details": "商品详情", + "coins_403": "金币:", + "empty_404": "(剩余", + "remaining_405": "个)", + "no_coin_rules_yet": "暂无金币规则。", + "about_experience_center_vip": "体验中心VIP介绍", + "no_information_available": "暂无介绍内容", + "point_the_arrow_at_the_target": "箭头面向靶子", + "take_your_shooting_stance": "摆出拉弓姿势", + "adjust_the_sight": "调整瞄准器", + "calibrate_smart_bow": "校准智能弓", + "complete_the_steps_above_to_calibrate_your_smart_bow": "请完成以上步骤校准智能弓", + "i_ve_calibrated_it": " 我已校准 ", + "invalid_qr_code_please_scan_again": "二维码不正确,请重新扫码", + "this_device_is_bound_to_another_account_unbind_it_first": "设备已绑定其他账号,请解绑后再绑定", + "bound_successfully_go_back_to_view_your_device": "绑定成功,请返回查看设备", + "disconnected": "未连接", + "connected_charging": "已连接(充电中)", + "connected": "已连接", + "valueh_valuemin": "{p0}小时{p1}分钟", + "valuemin": "{p0}分钟", + "online": "在线", + "no_device_number": "暂无设备编号", + "model": "设备型号", + "sheling_smart_bow": "射灵智能弓", + "battery_434": "当前电量", + "connection": "连接方式", + "device_number": "设备编号", + "device_unbound": "解绑成功", + "this_device_is_already_bound_to_another_account": "该设备已经绑定了其他账号,", + "unbind_it_first_to_bind_it_to_this_account": "如需绑定本账号,请先解除绑定。", + "scan_again": "重新扫码", + "invalid_qr_code": "二维码不正确,", + "only_sheling_smart_bow_device_qr_codes_are_supported": "仅支持扫描射灵智能弓箭的设备二维码。", + "first_time_device_binding_gift": " 新设备首次绑定礼包: ", + "6_months_of_sheling_membership": "6个月射灵会员", + "added_to_this_account_automatically": " 已自动发放至本账号", + "valid_until": ",有效期", + "view_beginner_tutorial": "立即查看新手教程", + "saved_to_photos": "已保存至相册", + "press_and_hold_the_qr_code_to_save_it": "请长按二维码保存", + "loading_qr_code": "二维码加载中...", + "device_id": "设备ID:", + "save_to_photos": "保存至相册", + "this_is_the_qr_code_for_your_bound_bow_save_a_screenshot_to_phot": " 该二维码为当前绑定弓箭的二维码,你可以截图保存到相册,以便当二维码丢失或不在身边时,可以扫描二维码进行设备绑定。 ", + "note_this_qr_code_will_no_longer_be_available_after_unbinding": "注:解除绑定后将无法查看该二维码。", + "no_device_qr_code_available": "暂无设备二维码", + "not_set": "未设置", + "current_firmware_value_new_firmware_value_update_now": "当前固件版本为 {p0},发现新固件版本 {p1},是否立即更新固件?", + "new_firmware_value_is_available_update_now": "发现新固件版本 {p0},是否立即更新固件?", + "update_firmware_now": "是否立即更新固件?", + "battery_468": "剩余电量", + "device_offline": "设备离线", + "total_usage": "累计使用", + "bound_on": "绑定时间", + "my_smart_bow": "我的智能弓", + "please_enter_a_device_name": "请输入设备名", + "device_names_can_contain_up_to_10_characters": "设备名最多支持10个字符", + "only_chinese_and_english_letters_numbers_underscores_and_hyphens": "仅支持中文、英文、数字、下划线和减号", + "no_device_bound": "暂无绑定设备", + "device_name_updated": "设备名已更新", + "could_not_load_device_details_please_retry": "获取设备详情失败,请重试", + "target_firmware_version_is_missing_please_retry": "缺少固件目标版本,请重试", + "device_disconnected_sight_adjustment_is_unavailable": "设备未连接,暂时无法调瞄", + "email_address_copied": "邮箱已复制", + "my_device": "我的设备", + "scan_the": "请扫描", + "sheling_smart_bow_484": "射灵智能弓箭", + "qr_code_on_your_device": "设备上的二维码", + "can_t_find_the_qr_code_or_need_help": "没找到二维码或遇到问题>", + "don_t_have_a_sheling_smart_bow_yet_get_one": "还没有射灵智能弓箭?点我获取>", + "archery_fan": "打弓佬", + "about_the_device": "设备介绍", + "sight_adjustment": "弓箭调瞄", + "firmware_update": "固件更新", + "wi_fi_settings": "WIFI设置", + "device_qr_code": "设备二维码", + "unbind": "解除绑定", + "recalibrate_when_your_location_or_distance_changes_to_keep_your_": "如有场地或距离变化,请重新校准以保证智能弓射箭精准度", + "recalibrate": "重新校准", + "scan_to_bind_your_sheling_bow": "扫码绑定射灵弓箭", + "sample_device_tag": "配套令牌样例", + "note_a_bow_that_is_already_bound_cannot_be_bound_again": "【注】已被绑定的弓箭无法再次绑定。", + "if_you_have_any_questions_please_contact": "如有任何疑问,请随时联系:", + "each_smart_bow_must_be_paired_with_one_account_bind_this_bow_to_": "智能弓箭和系统账号需一一对应,你确定要将当前登录用户账号绑定这把弓箭吗?绑定后不可随意更换。", + "binding": "绑定中...", + "confirm_binding": "确认绑定", + "unbind_device": "解除设备绑定", + "after_unbinding_you_cannot_use_this_smart_bow_in_matches_continu": "解除绑定后,将无法使用智能弓箭进行对战,确定继续吗?", + "already_up_to_date": "已经是最新版本", + "please_update_over_wi_fi": "请在WiFi网络下更新", + "connect_to_wi_fi": "连接WiFi", + "only_chinese_and_english_letters_numbers_underscores_and_hyphens_509": "仅支持中文、英文、数字、下划线、减号", + "connection_failed_check_the_wi_fi_password_and_network_status": "连接失败,请检查WiFi密码或WiFi状态", + "starts_in_values": "{p0}秒后开始", + "please_enable_location_services_on_your_phone_first": "请先开启手机定位服务", + "network_names_support_only_english_characters_and_numbers_use_or": "网络名称仅支持英文字符及数字,请连接英文名网络或把网络改为英文", + "device_response_timed_out_please_retry": "等待设备响应超时,请重试", + "network_error_check_your_connection_and_retry": "网络异常,请检查网络后重试", + "connecting_to_wi_fi": "WiFi连接中...", + "connecting_to_wi_fi_518": "WiFi连接中", + "already_up_to_date_520": "当前已是最新版本", + "target_firmware_version_is_missing_go_back_and_retry": "缺少固件目标版本,请返回后重试", + "could_not_load_device_details_go_back_and_retry": "获取设备详情失败,请返回后重试", + "please_enable_wi_fi_then_refresh_and_retry": "请先开启 WiFi 后刷新重试", + "connect_your_smart_bow_to_wi_fi": "智能弓箭连接无线网络", + "this_connects_your_smart_bow_to_wi_fi_it_will_not_change_the_wi_": "提醒:本操作将为智能弓箭连接WIFI网络,不会影响手机自身连接的WIFI网络。", + "select_network": "选择网络", + "your_phone_s_current_network": "手机当前连接的网络", + "connect_to_another_network_manually": "手动连接其他网络", + "permissions_prevent_nearby_networks_from_being_listed_to_connect": "由于权限限制,无法获取附近网络列表,如需连接其他网络请手动输入网络名称与密码进行连接。", + "your_smart_bow_can_save_only_one_network_connecting_to_a_new_net": "智能弓箭目前仅支持保存一条网络信息,若连接新的网络将删除上一条网络信息。", + "allow_location_access_and_enable_location_services_to_find_nearb": "请授权允许获取定位信息,并开启定位功能,以查找附近可用无线网络。", + "allow_location_access": "授权获取定位信息", + "join_533": "加入\"", + "password": "密码", + "enter_network_password": "输入网络密码", + "this_is_an_open_network_tap_to_join": "该网络为开放网络,点击 ✓ 加入", + "join_wi_fi_network": "加入无线网络", + "name": "名称", + "enter_network_name": "输入网络名称", + "wi_fi_connected": "WIFI连接成功", + "wi_fi_connected_541": "WiFi连接成功", + "the_update_will_start_automatically_in_3_seconds": "3秒后将自动开始更新", + "please_enter_a_valid_device_number": "请输入正确的设备编号", + "this_feature_is_for_the_test_environment_only": "该功能仅用于测试环境", + "unbind_device_547": "解绑设备", + "enter_device_number": "请输入设备编号", + "unbind_549": "解绑", + "unbind_this_device_test_environment_only": "是否解绑该设备(仅用于测试环境)", + "start": "开始", + "next_task": "进入下一个任务", + "i_ve_calibrated_it_553": "我已校准", + "i_m_ready_start": "我准备好了,开始", + "exit_beginner_challenge": "退出新手试炼", + "beginner_challenge": "新手试炼场", + "calibrate_smart_bow_557": "去校准智能弓", + "invalid_practice_connection_please_retry": "练习连接信息异常,请重试", + "practice_has_not_been_created_please_retry": "练习未创建,请重试", + "could_not_generate_the_poster_please_retry": "海报生成失败,请稍后重试", + "get_ready_99": "-箭前准备", + "find_your_distance_101": "-感知距离", + "first_challenge_103": "-小试牛刀", + "this_beginner_challenge_helps_you_learn_archery_techniques_and_g": " ,这是新人必刷小任务,0基础小白也能快速掌握弓箭技巧和游戏规则哦~:) ", + "meet_coach_gao_follow_his_instructions_to_prepare_for_shooting": "这位就是人帅技高的高教练!接下来请跟随教练指引,做好射箭前期准备。", + "follow_the_steps_below_to_calibrate_your_smart_bow_and_align_the": "请按下方步骤完成智能弓校准,让瞄准器和靶子保持对齐。", + "do_you_know_how_far_5_meters_is": "你知道5米射程有多远吗?", + "shots_from_under_5_m_do_not_count_in_ranked_matches_we_recommend": " 在我们的排位赛中,射程小于5米的成绩无效、哦!建议平时练习距离至少5米。现在,来边射箭边调整你的站位点吧! ", + "you_re_all_set": "一切准备就绪", + "try_a_real_archer_s_challenge": "试着完成一个真正的弓箭手任务吧!", + "beginner_challenge_complete_well_done": "新手试炼场通关啦,优秀!", + "you_ve_learned_the_basics_of_recurve_archery_and_the_sheling_gam": "反曲弓运动基本知识和射灵世界系统规则你已Get,是不是挺容易呀:)", + "got_it_my_stance_is_even_better_than_the_coach_s": "学会了,我摆得比教练还帅", + "i_ve_found_the_right_position": "我找到合适的点位了", + "play_again": "再来一局", + "you_are_no_longer_in_this_room": "您已经不在当前房间", + "you_have_left_the_room": "您已经离开了房间", + "blue_score": "蓝方得分", + "red_score": "红方得分", + "scored_579": " 斩获", + "pts_580": "环 ", + "view_full_results": "查看完整成绩", + "xp_582": "经验", + "challenge": "约战", + "please_enter_a_room_number": "请输入房间号", + "this_match_has_already_started_you_cannot_join": "该房间对战已开始,无法加入", + "room_not_found": "查无此房", + "room_is_full": "房间已满员", + "invite_friends_for_a_few_matches_and_have_fun_together": "约上朋友开几局,欢乐多,不寂寞", + "practice_together_level_up_faster_and_join_national_ranked_match": "一起练升级更快,早日加入全国排位赛!", + "my_results": "我的战绩", + "matches": "局", + "challenges": "约战数量", + "arrows_shot": "射箭量", + "challenge_difficulty": "挑战难度", + "enter_room_number": "输入房间号", + "join_room": "进入房间", + "create_challenge_room": " 创建约战房 ", + "about_levels": "等级介绍", + "in_the_sheling_world_your_level_is_an_important_measure_of_your_": " 在射灵世界中,等级是衡量您射箭技能的重要指标,而经验则是您提升等级的关键。具体的要求如下: ", + "1_earning_xp": "一、经验的获取规则", + "every_arrow_you_shoot_earns_1_xp_regardless_of_whether_it_hits_t": " 每射出一支箭,无论是否中靶、环数高低,您将获得1点经验。这是您提升射灵等级的基本方式,每一次射箭都是您向更高目标迈进的一步。 ", + "2_unlocking_features_and_game_modes": "二、解锁特权与玩法", + "reach_level_9_to_unlock_challenge_mode_invite_friends_for_exciti": " 当您等级达到9级时,将解锁“约战模式”。在这个模式中,您可以邀请您的好友进行切磋,与他们展开一场精彩的射箭对决。通过与好友的对抗,您不仅可以收获友谊和欢乐,还能在交流中学习到更多的技巧和经验。 ", + "reach_level_16_to_unlock_battle_mode_every_match_is_a_valuable_l": " 当您等级达到16级时,将解锁“对战模式”,每次对战都是一次难得的学习机会。您可以借此机会提升自己的水平,同时也为您的好友提供帮助和建议。此外,约战模式还为您提供了展示自己技艺的平台,让您在与好友的互动中感受到射箭的乐趣和成就感。 ", + "bean_stakes_mode_is_coming_soon_at_level_22_you_will_be_able_to_": " 未来我们将推出“押豆模式”,敬请期待!当您等级达到22级时,您可以与相同段位的玩家进行对抗,赢家将收获所有的灵豆。这不仅增加了游戏的趣味性和挑战性,还为您提供了赢取更多灵豆的机会。通过与更多玩家的对战,您可以不断提升自己的技术水平。 ", + "syncing_device_status_please_try_again_shortly": "设备状态同步中,请稍后重试", + "real_smart_archery_live_tracking_and_millisecond_sync_compete_wi": "智能真弓:实时捕捉+毫秒级同步,弓箭选手全球竞技!", + "bind_smart_bow": "绑定智能弓箭", + "a_must_for_beginners": "新人必刷!", + "come_say_hello": "快来报到吧~", + "rank": "段位", + "none": "暂无", + "season_average_score": "赛季平均环数", + "season_win_rate": "赛季胜率", + "could_not_load_match_details": "赛况加载失败", + "match_information_is_missing": "缺少比赛信息", + "details": "详情", + "loading_match_details": "赛况加载中...", + "tap_to_reload": "点击重新加载", + "free_for_all_627": "大乱斗", + "round_value": "第{p0}轮", + "score_628": "得分 ", + "match_found_joining": "匹配成功,正在进入...", + "matchmaking_timed_out_please_retry": "匹配超时,请重试", + "finding_an_opponent": "搜索对手...", + "you_have_used_all_your_ranked_matches_for_today_activate_members": "今日排位赛次数已经用完\n开通会员可增加次数", + "friend_challenge_free_for_all": "好友约战 - 大乱斗", + "ranked_match_free_for_all": "排位赛 - 大乱斗", + "match_ended": "比赛已结束", + "first_half_complete_take_a_break": "上半场结束,休息一下吧:)", + "s_until_the_second_half": "秒后开始下半场", + "device_is_offline": "设备已离线", + "your_device_has_disconnected_check_it_before_continuing_the_matc": "检测到设备已断开连接,请检查设备后继续比赛", + "target_face": "靶纸", + "membership_auto_renewal_agreement": "会员自动续费服务协议", + "sheling_planet_mini_program_membership_auto_renewal_agreement": "射灵星球小程序会员自动续费服务协议", + "welcome_to_the_sheling_planet_mini_program_paid_membership_servi": "欢迎您使用射灵星球小程序付费会员服务(以下简称“本服务”)!", + "the_service_is_provided_by_guangzhou_guangdian_feiwu_network_co_": "本服务是由广州光点飞舞网络有限公司(以下简称“公司”或“我们”)为您提供。本服务为付费服务。为了保障您的权益,请在使用本服务前详细阅读并遵守本《射灵星球小程序会员服务协议(含自动续费服务规则)》(以下简称“本协议”)以及公司已发布或将来可能发布的各项服务协议与规则。您在申请开通本服务并进入购买程序前,请务必审慎阅读、充分理解各服务协议及规则,特别是免除或限制责任条款、法律适用和争议解决条款。", + "by_reading_and_agreeing_to_this_agreement_as_instructed_on_the_a": "当您依照本服务开通页面提示进行阅读并同意本协议,完成全部服务开通程序后(包括但不限于点击“同意”、“下一步”或“确认支付”等确认按钮,或您开始使用本服务),即表示您已充分阅读、理解并接受本协议的全部内容,您已与本服务提供方达成一致,成为“射灵星球小程序”付费会员。本协议即在您与公司之间产生法律效力,成为对双方均具有约束力的法律文件。", + "1_definitions_and_scope": "一、定义及适用范围", + "1_1_paid_member_of_the_sheling_planet_mini_program_a_user_who_ha": "1.1 射灵星球小程序付费会员:指已按照服务协议及规则完成射灵星球小程序登录的用户,在签署本协议并根据本服务开通页面所展示的收费标准支付相应费用后获取的特殊资格,在本协议中简称为“会员”或“您”。公司根据业务发展可能会新增、调整会员类型或名称,实际以开通页面展示为准,这不影响您的实际权益。", + "1_2_paid_membership_benefits_special_benefits_available_to_users": "1.2 付费会员权益:指用户基于其付费会员资格所享有的特殊权益,具体权益内容应以本服务购买页面展示内容及相关权益说明为准。您理解并同意,公司可能会根据设备型号、系统版本、客户端等因素开发不同的版本,不同版本实际可使用的具体权益或服务内容可能有所差别,具体以购买页面展示为准。", + "1_3_this_agreement_also_includes_related_agreements_and_rules_fo": "1.3 本协议内容同时包括公司已经发布及后续可能不断发布的关于本服务的相关协议、规则等内容。前述内容一经正式发布,并以适当的方式送达您(服务购买页面、网站公布、系统通知等),即为本协议不可分割的组成部分,您应同样遵守。", + "1_4_to_offer_more_choices_the_company_may_work_with_third_partie": "1.4 为了给会员用户提供更多选择,公司可能会与第三方合作推出联合会员服务,或为购买会员服务的用户赠送第三方会员服务。如果您选择购买或接受以上服务,则表示您理解并认可,我们仅提供射灵星球小程序付费会员服务,不对第三方的会员服务负责。第三方会员服务的权益、使用、收费规则等,将由第三方执行和向您解释。", + "2_activation_benefits_term_and_fees": "二、服务开通、权益内容、服务期限及收费标准", + "2_1_only_signed_in_sheling_planet_mini_program_users_may_activat": "2.1 本服务仅支持射灵星球小程序登录用户开通。您在开通本服务时,应仔细核对已登录的账号名称、会员类型、付费类型、服务期限等具体信息。因您个人原因充错账号、开通错服务类型或服务时长的,公司不予退还已收取的费用。", + "2_2_you_may_purchase_the_service_through_existing_or_future_paym": "2.2 您可通过已有和未来新增的支付渠道或公司指定支付方式完成本服务的购买。当您根据本服务页面提示进行确认、并成功支付了会员服务费和/或完成了成为付费会员的所有程序,您将成为射灵星球小程序付费会员。", + "2_3_the_term_of_the_service_the_service_term_is_the_term_you_sel": "2.3 本服务的期限(以下简称“服务期限”)以您选择并成功开通的期限为准。会员计费与服务时长采用自然时间(自然月/自然年)方式计算。具体截止时间为相应续费到期自然日的对应时间点。服务期限届满后,公司将停止继续向您提供本服务。如您同时开通了多种会员服务,其消耗及重叠规则以开通页面的官方具体规则为准。", + "2_4_fees_and_specific_benefits_are_those_shown_on_the_activation": "2.4 本服务的收费标准及具体权益内容以本服务开通页面所展示的为准。基于市场与业务的发展及服务权益调整,公司可能会随时调整本服务开通所需费用及/或具体权益内容。费用或权益内容调整自公布之日起生效,您在调整生效前已开通的服务将不受影响,但该服务到期后的续费开通或自动续费扣款,则需按照调整后的标准执行。", + "2_5_paid_membership_is_a_purchase_of_virtual_content_once_paid_f": "2.5 射灵星球小程序付费会员服务为虚拟内容消费,除因本服务存在重大瑕疵导致您完全无法使用等公司的违约情形、法律法规要求必须退款或公司同意退款等情形外,完成支付和购买后,不可进行退款或转让。您在会员到期前主动取消或终止会员资格的,已支付费用不予退还。", + "2_6_to_protect_your_account_and_prevent_theft_we_may_reasonably_": "2.6 为了保护您的账号安全、防止账号被盗风险,我们会对您开通会员服务的账号登录设备及使用范围作出合理限制。您不得将账号提供给多名第三方同时使用,否则公司有权根据安全风控能力随时调整或限制您的登录及使用权限。", + "3_recurring_purchases_and_auto_renewal": "三、连续购买和自动续费服务", + "3_1_auto_renewal_types_and_billing_cycles": "3.1 自动续费服务类型/计费周期", + "auto_renewal_includes_recurring_monthly_and_annual_plans_billing": "射灵星球小程序付费会员自动续费服务包含「连续包月」、「连续包年」等服务。本服务的自动续费及对应计费周期采用按自然时间(自然月/自然年)对日顺延的方式计算。即:若您在某月18日开通连续包月服务,则下一次自动扣费续费日期为次月18日;若开通当月无对应日期的(例如1月31日开通,2月无31日),则自动调整为该自然月最后一日进行扣费续费。公司可能会根据会员需求增加或调整自动续费服务类型,具体服务类型以服务开通页面展示为准。", + "3_2_how_auto_renewal_works": "3.2 自动续费服务说明", + "1_auto_renewal_is_offered_to_existing_members_to_prevent_service": "(1)本自动续费服务基于您对于自动续费的需求,在您已开通会员服务的前提下,为避免您因疏忽或其他原因导致未能及时续费而中断服务,您授权公司可在您的会员服务期限到期前,从您开通本自动续费服务时所绑定的Apple ID账户余额、或绑定的第三方支付账户(包括但不限于微信支付、支付宝支付等)余额中自动代扣下一个计费周期的费用,从而延长对应的会员服务期限。", + "2_the_payment_channel_determines_the_actual_debit_date_for_apple": "(2)自动续费扣费日期以您开通本自动续费服务的支付渠道实际扣款时间为准:如您是通过苹果公司iOS渠道开通本服务,扣费日期通常为开通服务之日起每个计费周期的对应日期前24小时内;如您是通过安卓Android渠道或直接在小程序内通过微信支付等渠道开通本服务,扣费日期通常为每个计费周期到期前1至2日。如支付渠道根据实际情况或相关平台规则自行调整扣费时间的,以实际扣款时间为准。", + "3_monitor_your_linked_accounts_and_available_balance_to_ensure_s": "(3)请您关注上述账户及可扣款余额情况,保证上述账户扣款成功以确保会员服务顺利续期。如因上述账户中可扣款余额不足导致续费失败,公司有权中断或终止相应的会员权益及服务,由此导致的风险或损失将由您自行承担。", + "4_the_company_will_remind_you_of_the_upcoming_renewal_payment_5_": "(4)为了方便您知悉自动续费情况,公司将在扣费日期前5日以站内信、小程序系统消息推送或短信等方式提示您即将发生续期扣费的信息,第三方支付渠道也可能向您发送通知提醒即将扣费。", + "5_the_system_automatically_charges_the_linked_payment_account_on": "(5)系统会在每个扣费日期自动从您开通服务时所绑定的支付账户扣费。如扣费日期因账户问题或余额不足导致续费失败,若您未主动明确取消本服务,将视为您同意公司在扣费日期后继续发出扣款尝试,一旦您的账户扣款成功,公司将继续为您提供相应会员服务权益。", + "6_if_you_do_not_cancel_auto_renewal_before_each_debit_date_the_c": "(6)如您未在每个扣费日期前操作取消自动续费服务,则公司将根据此前与您达成的委托在扣费日期继续发出续费代扣指令,一旦扣款成功,公司将自动为您开通下一个计费周期的连续服务。对于已成功完成会员服务续费的费用,原则上不予退还。", + "7_during_auto_renewal_you_may_purchase_additional_membership_tim": "(7)您在自动续费服务期间可以额外购买或通过参与活动等方式获取付费会员服务,会员服务期限将在原服务期限基础上相应延长,但如您未主动取消自动续费服务,系统仍会按照您所开通的自动续费服务进行扣费及续期。", + "3_3_canceling_auto_renewal": "3.3 自动续费服务的退订", + "1_you_may_choose_whether_to_cancel_auto_renewal_to_cancel_you_mu": "(1)您有权决定是否取消自动续费服务,如果您希望取消自动续费服务,需在每个扣费日期前(至少提前24小时)操作取消,否则将视为您同意继续授权自动续费。", + "2_after_purchasing_auto_renewal_you_may_turn_it_off_on_the_mini_": "(2)购买自动续费服务后,您可在小程序的会员管理页中关闭自动续费,或通过如下第三方支付渠道方式取消自动续费服务:", + "ios_users_apple_id_subscriptions_open_settings_your_apple_id_nam": "iOS用户(Apple ID订阅):打开苹果手机“设置” -> 点击顶部的“Apple ID/机主姓名” -> 进入“订阅” -> 选择“射灵星球” -> 点击“取消订阅”;或打开“App Store” -> 点击右上角头像进入“账户” -> 点击“订阅”进行管理。", + "wechat_pay_users_open_wechat_me_services_wallet_payment_settings": "微信支付自动续费用户:打开微信APP -> 点击“我” -> “服务” -> “钱包” -> “支付设置” -> “自动续费” -> 选择“射灵星球小程序会员” -> 点击“关闭服务”。", + "alipay_users_open_alipay_me_settings_payment_settings_password_f": "支付宝自动续费用户:打开支付宝APP -> 点击“我的” -> “设置” -> “支付设置” -> “免密支付/自动扣款” -> 选择“射灵星球小程序会员” -> 点击“关闭服务”。", + "3_4_the_company_may_unilaterally_discontinue_auto_renewal_due_to": "3.4 公司有权根据市场情况、业务规划、运营策略变化等原因单方面决定停止向您提供自动续费服务,并通过公告或站内信等方式通知您,您的付费会员服务期限自当前服务期限届满之日起终止。", + "4_usage_rules_and_restrictions": "四、服务使用规范与限制", + "4_1_the_service_and_membership_benefits_are_for_your_personal_us": "4.1 本服务及会员权益仅限您本人使用。未经公司书面同意,禁止以任何形式赠与、借用、出租、转让、售卖或以其他方式许可他人使用该账号及账号项下的会员服务与权益。如发生泄漏、遗失、被盗等行为,而该等行为并非公司过错导致,损失将由您自行承担。", + "4_2_if_you_use_the_service_unlawfully_or_improperly_in_any_of_th": "4.2 如您存在如下违法或不当使用本服务的情形,公司有权取消您的会员资格、作废会员权益且不予退还您所支付的会员服务费用,并有权向您追偿给公司造成的损失:", + "obtaining_the_service_through_theft_system_vulnerabilities_or_an": "以盗窃、利用系统漏洞、通过任何非公司官方或授权渠道获得本服务的行为;", + "using_the_service_for_profit_or_unlawful_gain_or_transferring_or": "利用本服务进行盈利或非法获利,或以各种形式转让、借用您的会员权益;", + "illegally_modifying_or_tampering_with_a_membership_account_s_ser": "通过非法手段对本服务会员账户的服务期限、交易状态进行修改或篡改;", + "cracking_modifying_reverse_operating_or_damaging_security_measur": "主动对公司用于保护本服务会员权益的任何安全措施技术进行破解、更改、反操作或破坏;", + "other_conduct_that_violates_laws_good_faith_service_agreements_o": "其他违反法律法规、诚实信用原则、服务协议及相关小程序运营规则的行为。", + "5_suspension_termination_and_changes": "五、服务中止、终止及变更", + "5_1_the_company_may_suspend_or_terminate_services_when_required_": "5.1 因国家或相关政府监管部门要求、发生不可抗力事件、或由于用户违反本协议约定,公司有权中止或终止向用户提供服务。", + "5_2_you_acknowledge_that_if_you_voluntarily_cancel_the_service_g": "5.2 您知悉并确认,您开通本服务后,如您中途主动取消本服务、放弃会员权益或终止资格,您将无法退还部分或全部会员服务费用。本协议终止后,用户无权要求公司继续向其提供任何服务,且不影响终止前基于本协议已产生的权利义务。", + "5_3_the_company_may_amend_this_agreement_as_laws_business_needs_": "5.3 公司可根据国家法律法规变化、业务实际变更需求、保护用户权益的需要等,不时修改本协议,并按照法律法规规定的程序及方式进行公告。如用户不同意变更后的内容,则用户有权主动停止使用本服务;如用户在变更内容生效后仍继续使用本服务,即视为用户同意该等内容的变更。", + "6_limitation_of_liability_and_disclaimers": "六、责任限制与免责条款", + "6_1_you_understand_and_agree_that_the_service_is_provided_as_ava": "6.1 您理解并同意,本服务是按照现有技术和条件所能达到的现状提供的。公司将尽最大努力确保服务的连贯性和安全性,但不能随时预见和防范技术以及其他风险,包括但不限于不可抗力、网络原因、第三方服务瑕疵等原因可能导致的服务中断、数据丢失以及其他的损失和风险。", + "6_2_under_the_principles_of_proportionality_and_fairness_if_the_": "6.2 基于收益与赔偿相一致及公平合理的原则,如因公司原因造成本服务不正常中断或服务不可用,您所可能获得的最高赔偿额不超过本协议项下公司就该计费周期已实际收取您的相关服务费用总额。", + "7_governing_law_and_dispute_resolution": "七、法律适用与争议解决", + "7_1_the_formation_effectiveness_performance_interpretation_and_d": "7.1 本协议的成立、生效、履行、解释及争议的解决均应适用中华人民共和国法律。", + "7_2_this_agreement_is_entered_into_in_nansha_district_guangzhou_": "7.2 本协议的签订地为广东省广州市南沙区。若您因本协议与公司发生任何争议,双方应尽量友好协商解决;如协商不成的,任何一方均同意应将相关争议提交至本协议签订地有管辖权的人民法院诉讼解决。", + "7_3_if_any_provision_is_held_repealed_invalid_or_unenforceable_i": "7.3 本协议任一条款被视为废止、无效或不可执行,该条应视为可分的且并不影响本协议其余条款的有效性及可执行性。", + "guangzhou_guangdian_feiwu_network_co_ltd": "广州光点飞舞网络有限公司", + "payment_authorization_agreement": "扣款授权服务协议", + "payment_authorization_agreement_702": "扣费授权服务协议", + "version_v1_0_effective_date_june_22_2026": "版本号:V1.0 生效日期:2026年6月22日", + "1_authorization_statement": "一、授权声明", + "as_a_registered_user_of_the_sheling_planet_mini_program_i_the_au": "本人(即授权人,以下简称“乙方”)作为射灵星球小程序的注册用户,在自愿、平等、知悉全部授权内容的基础上,同意向广州光点飞舞网络有限公司(以下简称“甲方”)及甲方委托的第三方支付机构(包含微信支付、支付宝、苹果支付等,以下简称“支付机构”)作出本扣费授权,双方就授权扣费相关事宜达成如下协议。", + "2_parties_to_the_authorization": "二、授权主体", + "authorizing_party_party_b_a_registered_sheling_planet_mini_progr": "授权人(乙方):射灵星球小程序注册用户,用户ID以平台系统记录为准。", + "authorized_party_party_a_guangzhou_guangdian_feiwu_network_co_lt": "被授权人(甲方):广州光点飞舞网络有限公司,作为会员服务提供方及扣费指令发起方。", + "payment_processor_the_third_party_payment_provider_linked_by_par": "支付执行方:乙方绑定的第三方支付机构,受甲方委托执行扣费操作。", + "3_scope_of_authorization": "三、授权内容", + "authorized_purpose_after_party_b_activates_sheling_planet_member": "授权场景:乙方开通射灵星球会员自动续费服务后,授权甲方在每个会员周期届满前,向支付机构发起扣费指令,用于支付下一周期的会员服务费用。", + "authorized_amount_the_amount_is_the_price_of_the_auto_renewal_pl": "授权金额:扣费金额以乙方开通时选择的自动续费套餐对应价格为准,具体以会员购买页面公示价格为准;若价格调整,甲方将提前通过公示或通知形式告知乙方,乙方继续使用服务视为认可并接受调整后的金额。", + "authorized_account_the_third_party_payment_account_such_as_wecha": "授权支付账户:乙方开通自动续费时绑定的微信支付、支付宝等第三方支付账户,账户信息以支付机构记录为准。", + "authorized_frequency_this_is_a_recurring_authorization_during_it": "授权扣费次数:本授权为周期性授权。在授权有效期内,甲方可按会员周期重复发起扣费指令,直至乙方依法撤销授权为止。", + "4_authorization_period": "四、授权有效期", + "1_this_authorization_takes_effect_when_party_b_confirms_activati": "1. 本授权自乙方点击确认开通自动续费服务之日起生效,至乙方成功取消自动续费服务之日终止。", + "2_if_party_b_closes_their_sheling_planet_mini_program_account_th": "2. 若乙方注销射灵星球小程序账号,本授权自账号注销完成之日自动终止。", + "3_this_authorization_ends_automatically_if_changes_in_national_p": "3. 若因国家政策调整、支付机构规则变更、乙方支付账户注销/冻结等非甲方主观原因导致授权无法履行的,本授权自动终止。", + "5_payments_and_reminders": "五、扣费与提醒规则", + "1_reminder_party_a_will_prominently_notify_party_b_of_upcoming_r": "1. 扣费提醒:甲方将在每个自动续费扣费日期前5日,通过微信服务通知、小程序系统消息或短信等显著方式提示乙方即将发生续期扣费的信息,以保障乙方的知情权与选择权。", + "2_timing_party_a_will_issue_instructions_for_the_next_cycle_with": "2. 扣费时机:甲方将在乙方当前会员有效期届满前24小时内发起下一周期的扣费指令,支付机构根据指令从乙方授权账户中划扣对应费用。", + "3_failed_payments_if_the_first_attempt_fails_due_to_insufficient": "3. 扣费失败处理:若因账户余额不足等原因导致首次扣费失败的,甲方及支付机构可在合规范围内依法尝试补扣;若补扣仍失败或账户处于异常状态的,本期自动续费暂停,乙方会员到期后自动失效。", + "4_proof_the_payment_provider_s_debit_record_is_valid_proof_of_su": "4. 扣费凭证:支付机构的扣费记录作为扣费成功的有效凭证,乙方可在支付账户账单中查询明细;甲方同步为乙方提供电子扣费记录,可在会员中心查看。", + "6_changes_and_revocation": "六、授权的变更与撤销", + "1_changes_to_change_this_authorization_such_as_the_payment_accou": "1. 授权变更:本授权内容如需变更(如更换支付账户、调整续费套餐),乙方需先取消原自动续费服务,再重新开通新套餐。新授权自重新开通成功之日起生效,原授权同步终止。", + "2_revocation_party_b_may_cancel_auto_renewal_at_any_time_without": "2. 授权撤销:乙方可随时退订本自动续费服务,解约后不影响乙方已生效周期的会员服务。根据乙方开通时选择的支付执行方,具体撤销路径如下:", + "wechat_pay_revoke_authorization_in_wechat_me_services_wallet_pay": "微信支付用户:可通过微信APP内(路径:我 -> 服务 -> 钱包 -> 支付设置 -> 自动续费)或在小程序会员中心页面撤销本授权。", + "alipay_revoke_authorization_in_alipay_me_settings_payment_settin": "支付宝用户:可通过支付宝APP内(路径:我的 -> 设置 -> 支付设置 -> 免密支付/自动扣款)或在小程序会员中心页面撤销本授权。", + "apple_payments_ios_app_store_subscriptions_cancellation_must_be_": "苹果支付(iOS/App Store订阅)用户:必须通过苹果系统自带的功能进行取消(路径:iOS设备“设置” -> 点击顶部的Apple ID -> 订阅 -> 选择“射灵星球” -> 取消订阅)。", + "3_when_cancellation_takes_effect": "3. 退订生效时效:", + "wechat_pay_and_alipay_authorization_ends_immediately_after_succe": "针对微信支付和支付宝:撤销操作成功后,本授权即时终止,甲方不得再发起新的扣费指令。因第三方支付平台系统结算延迟等客观原因,导致退订生效前系统已自动扣款成功的,该期会员权益将正常发放,已扣费用原则上不予退还。", + "apple_payments_under_apple_s_policies_party_b_must_manually_canc": "针对苹果支付:根据苹果公司政策,乙方需在当前计费周期届满前至少24小时手动取消订阅,否则苹果系统可能会自动续订并扣款。苹果渠道的扣费与退款均由苹果公司独立处理,甲方无权干涉,因乙方未及时取消导致扣费的,由乙方自行承担或向苹果公司申诉。", + "7_disclaimers": "七、免责条款", + "1_party_a_is_not_liable_for_failed_payments_caused_by_insufficie": "1. 因乙方支付账户余额不足、账户冻结、挂失、注销、限额等非甲方原因导致扣费失败的,甲方不承担任何责任,由此造成的会员权益中断等后果由乙方自行承担。", + "2_for_delayed_failed_or_incorrect_payments_caused_by_payment_pro": "2. 因支付机构系统故障、网络中断、政策调整等第三方不可抗力或外部原因导致扣费延迟、失败或错误的,甲方将协助乙方协调解决,但不承担相应的赔偿责任。", + "3_party_a_is_not_liable_for_abnormal_payments_caused_by_party_b_": "3. 因乙方泄露支付账户密码、账号被盗用等自身保管不当原因导致的异常扣费,甲方不承担责任,乙方应自行向支付机构或公安机关主张权利。", + "8_confidentiality": "八、信息保密", + "1_party_a_and_the_payment_providers_must_keep_party_b_s_authoriz": "1. 甲方及支付机构应对乙方的授权信息、支付信息、个人身份信息严格保密,不得用于本授权以外的任何用途。", + "2_except_as_required_by_law_or_lawfully_requested_by_judicial_or": "2. 除法律法规规定、司法机关或监管部门依法要求外,甲方不得向任何第三方泄露乙方的授权及支付相关信息。", + "9_dispute_resolution": "九、争议解决", + "1_the_formation_validity_performance_and_dispute_resolution_of_t": "1. 本授权协议的订立、效力、履行及争议解决均适用中华人民共和国法律。", + "2_disputes_should_first_be_resolved_through_friendly_negotiation": "2. 因本协议产生的任何争议,双方应尽量友好协商解决;协商不成的,任何一方均可向甲方住所地(广东省广州市天河区)有管辖权的人民法院提起诉讼。", + "10_other_provisions": "十、其他", + "1_this_agreement_supplements_the_sheling_planet_mini_program_mem": "1. 本协议为《射灵星球小程序会员服务协议》的配套协议,与该协议具有同等法律效力;本协议未约定事项,参照主协议执行。", + "2_party_a_may_adjust_this_agreement_to_meet_business_and_regulat": "2. 甲方有权根据业务及监管要求调整本协议内容,调整后的协议将在平台公示,乙方继续使用自动续费服务视为接受调整后的内容。", + "3_customer_support_contact_online_support_in_the_sheling_planet_": "3. 甲方客服联系方式:请通过射灵星球小程序内【在线客服】或发送邮件至官方客服邮箱进行反馈。", + "vip_membership": "普通会员", + "join_sheling_planet": "成为射灵星球", + "enjoy_extra_challenges_ranked_matches_and_an_exclusive_member_ba": "特享约战竞技次数包、专属会员标识", + "exclusive_vip_benefits": "普通会员专属权益", + "gold_nickname": "黄金昵称", + "coach_feedback": "教练点评", + "vip_customer_support": "专享VIP客服", + "ranked_matches_20_per_day": "排位赛\n每日+20次", + "challenges_20_per_day": "约战\n每日+20次", + "svip_membership": "超级会员", + "enjoy_exclusive_effects_unlimited_challenges_and_ranked_matches_": "尊享专属特效、无限制约战竞技、专属会员标识", + "exclusive_svip_benefits": "超级会员专属权益", + "exclusive_impact_markers": "专属落点标识", + "exclusive_hit_effects": "专属命中效果", + "exclusive_shot_effects": "专属射箭效果", + "colorful_nickname": "炫彩昵称", + "unlimited_challenges": "约战无限制", + "unlimited_ranked_matches": "排位赛无限制", + "svip_customer_support": "专享SVIP客服", + "loading_plans": "套餐配置加载中", + "this_plan_is_currently_unavailable": "套餐暂不可购买", + "wechat_virtual_payments_are_unavailable_in_this_environment": "当前环境不支持微信虚拟支付", + "could_not_generate_payment_parameters": "支付参数生成失败", + "payment_successful": "支付成功", + "payment_canceled_771": "支付已取消", + "payment_failed_please_try_again": "支付失败,请稍后重试", + "could_not_create_order": "下单失败", + "valid_until_774": " 有效期至:", + "manage_orders": "订单管理", + "select_plan": "选择套餐", + "plan_details": "套餐说明", + "loading_plans_778": "加载套餐中", + "creating_order": "创建订单中", + "refreshing_membership_status": "刷新会员状态中", + "activate_781": " 一键激活", + "by_paying_you_agree_to_the": "支付即同意", + "copied": "复制成功", + "order_details": "订单详情", + "order_no": "订单号:", + "copy": "复制", + "created": "创建时间:", + "paid_788": "支付时间:", + "amount": "金额:", + "cny": " 元", + "payment_method_wechat_pay": "支付方式:微信", + "pay_now": "去支付", + "cancel_order": "取消订单", + "coming_soon_794": "功能实现中", + "turn_off_auto_renewal_you_will_lose_7_benefits_when_your_members": "确定关闭自动续费吗?\n会员到期后你将失去7项特权哦!", + "cancel_anyway": "一意孤行", + "keep_benefits": "继续享受", + "membership_benefits": "会员权益说明", + "sheling_planet_membership_benefits": "射灵星球会员权益", + "core_features": "核心特权:", + "unlock_four_core_features_challenges_rank_ratings_live_ranked_ma": "解锁约战、段位评级、实时排位赛、AI智能教练点评四大核心功能。", + "exclusive_support": "专属服务:", + "get_vip_customer_support_at_different_stages_throughout_the_year": "享全年不同阶段VIP专属客服,快速解决技术故障、规则疑问等所有问题。", + "new_user_gift": "新用户福利:", + "all_users_binding_a_device_for_the_first_time_receive_6_months_o": "所有初次绑定设备的用户,免费赠送6个月普通会员。", + "join_sheling_planet_to_enjoy_online_competition_through_real_arc": " 加入射灵星球,在真实射箭运动中体验在线竞技的乐趣,结识全球志同道合的弓友,持续享受新功能与系统升级,不断挑战自我,创造属于你的辉煌战绩! ", + "6_months_free_with_first_device_binding": "初次绑定设备赠送6个月", + "benefit": "特权", + "basic_user": "基础用户", + "none_809": "无", + "spiral": "螺旋", + "glass_cracks": "玻璃裂纹", + "arrow_flight_effects": "箭矢飞行特效", + "light_arrow": "光箭", + "daily_challenges": "每日约战次数", + "unlimited": "无限", + "daily_ranked_matches": "每日排位赛次数", + "exclusive": "专享", + "nickname_style": "昵称美化", + "gold": "黄金", + "colorful": "炫彩", + "exclusive_support_823": "专属客服", + "membership_stacking_and_activation_rules": "会员时长叠加与生效规则", + "membership_priority": "等级优先级:", + "if_you_have_both_svip_and_vip_svip_benefits_take_priority_your_v": " 同时拥有 超级会员 和 普通会员 时,优先使用超级会员权益,普通会员时长自动顺延,待 超级会员 到期后自动生效。 ", + "stacking_recurring_plans": "连续套餐叠加:", + "if_you_buy_a_recurring_monthly_or_annual_plan_while_holding_a_mo": " 已有月 / 半年 / 年卡时再购买连续包月 / 包年,总有效期直接累加;连续套餐从下单日起算,下个周期正常自动扣费。 ", + "example_buy_a_half_year_pass_on_january_1_expires_july_1_then_a_": " 示例:1 月 1 日买半年卡(7 月 1 日到期),1 月 10 日买连续包月,总有效期延至 8 月 1 日,8 月 1 日会发起首次自动扣款。 ", + "upgrading_to_svip": "升级超级会员规则:", + "an_svip_upgrade_takes_effect_immediately_the_purchase_page_shows": " 购买升级 超级会员 后立即生效,可升级时长以购买页面提示为准;未升级的剩余 普通会员 时长,将在 超级会员 到期后继续使用。 ", + "value_cm_target": "{p0}CM靶", + "5_player_free_for_all": "5人大乱斗", + "10_player_free_for_all": "10人大乱斗", + "value_player_free_for_all": "{p0}人大乱斗", + "my_progress": "我的成长脚印", + "friends_who_liked_me": "赞我的朋友", + "authorization_failed_please_try_again": "授权登录失败,请稍后重试。", + "your_session_has_expired_sign_in_again_to_complete_binding": "登录已失效,请重新登录后完成绑定。", + "network_error_please_try_again_842": "网络异常,请稍后重试。", + "sign_in_to_the_store_tablet": "登录门店Pad端", + "authorizing_sign_in": "正在授权登录", + "signing_in_to_the_store_tablet_please_wait": "正在登录门店Pad端,请稍候……", + "please_sign_in_to_the_mini_program_first": "请先登录小程序", + "sign_in_with_wechat": "微信授权登录", + "you_have_authorized_sign_in_to_the_sheling_planet_store_tablet": "已成功授权登录射灵星球门店Pad端。", + "account": "登录账号:", + "phone_850": "手机号:", + "store": "登录门店:", + "remember_to_sign_out_of_the_tablet_before_leaving_the_store": " 温馨提示:离开门店时候记得在Pad退出登录哦! ", + "back_to_home": "回到首页", + "sign_in_authorization_failed": "授权登录失败", + "sign_in_again": "重新登录", + "invalid_qr_code_856": "二维码无效", + "please_scan_the_mini_program_code_on_the_store_tablet_again": "请重新扫描门店Pad端上的小程序码。", + "please_complete_the_information": "请完善信息", + "select_settings": "选择参数", + "next": "下一步", + "start_my_archery_log": "开启我的弓箭记录", + "about_shot_grouping": "落点稳定性说明", + "shot_grouping_measures_consistency_by_calculating_the_average_di": "通过计算每支箭与其他箭的平均距离衡量射箭的稳定性,数字越小则说明射箭越稳定。该数据只能在用户标记落点的情况下生成。", + "about_shot_distribution": "落点分布说明", + "shows_the_impact_positions_from_a_practice_session": "展示用户某次练习中射箭的点位", + "archery_check_in_a_little_better_every_day": "射箭打卡,今日又精进了一些~", + "my_notes": "我的备注", + "add_note": "添加备注", + "share": " 分享 ", + "notes": "备注", + "add_details_and_reflections_about_this_session": "写下本次射箭的补充信息与心得", + "save_note": " 保存备注 ", + "end": "第 ", + "empty_874": " 组", + "delete": "删除", + "mark_your_shots_on_the_target_face_to_get_grouping_analysis": "推荐在靶纸上落点计分,这样可获得稳定性分析", + "leaving_now_will_cause": "现在离开会导致", + "unsaved_data_to_be_lost_continue": "未提交的数据丢失,是否继续?", + "exit": "退出", + "continue_recording": " 继续记录 ", + "save_and_view_analysis": "保存并查看分析", + "next_end": "下一组", + "deleted": "已删除", + "could_not_delete_please_retry": "删除失败,请重试", + "score_records": "计分记录", + "please_select": "请选择", + "local_draft": "本地草稿", + "scoring_incomplete": "计分待完成", + "delete_this_record": "确认删除该记录吗?", + "topped_the_cover": "占领了封面", + "burned_a_total_of": "整整消耗了", + "kcal_892": "大卡!", + "rank_893": "排行", + "user": "用户", + "calories": "消耗", + "high": "重度", + "moderate": "中度", + "low": "轻度", + "track_every_shot_improve_with_detailed_analysis": "高效记录每一次射箭,深度分析助你提升!", + "mon": "周一", + "tue": "周二", + "wed": "周三", + "thu": "周四", + "fri": "周五", + "sat": "周六", + "sun": "周日", + "arrows_today": "今日射箭", + "kcal_910": "卡", + "calories_today": "今日消耗", + "activity_intensity": "运动强度", + "training_days": "训练天数", + "total_arrows": "累计射箭", + "generating": "生成中...", + "view_full_rankings": "查看完整榜单", + "you_have_an_unfinished_score_record_continue_editing": "发现未完成的记分,是否继续编辑?", + "start_over": " 重新计分 ", + "continue_editing": " 继续编辑 ", + "could_not_reconnect_to_training_please_retry": "训练重连失败,请重试", + "training_has_ended_please_enter_again": "训练已结束,请重新进入", + "single_end_practice": "个人单组练习", + "start_shooting_round_value": "请开始射箭第{p0}轮", + "two_more_to_go_keep_going": "还有两场,坚持", + "you_ve_got_this": "就是胜利!💪", + "i_m_ready_start_927": "准备好了,直接开始", + "daily_endurance_challenge": "日常耐力挑战", + "shoot_value_arrows_in_a_row": "请连续射{p0}支箭", + "more_than_halfway_victory": "完成过半,胜利", + "is_in_sight": "在望!💪", + "solo_practice": "个人练习", + "your_coach_shows_the_way_progress_comes_from_practice_start_now": "师傅领进门,修行靠自身,赶紧练起来吧。", + "keep_practicing_to_level_up_faster_and_join_national_ranked_matc": "坚持练习就能你快速升级,早日加入全国排位赛!", + "practice_check_ins": "已练习打卡", + "solo_practice_arrows": "个人练习量", + "sheling_937": "射灵", + "empty_938": "级", + "current_level": "当前等级", + "determined_bronze_1": "倔强青铜1", + "determined_bronze_2": "倔强青铜2", + "determined_bronze_3": "倔强青铜3", + "earn_3_stars_in_each_division_to_advance_for_a_total_of_9_stars": "每个小段位需要满3颗星才能晋升到下一个段位,共9颗星。", + "orderly_silver_1": "秩序白银1", + "orderly_silver_2": "秩序白银2", + "orderly_silver_3": "秩序白银3", + "glorious_gold_1": "荣耀黄金1", + "glorious_gold_2": "荣耀黄金2", + "glorious_gold_3": "荣耀黄金3", + "glorious_gold_4": "荣耀黄金4", + "earn_4_stars_in_each_division_to_advance_for_a_total_of_16_stars": "每个小段位需要满4颗星才能晋升到下一个段位,共16颗星。", + "eternal_diamond_1": "永恒钻石1", + "eternal_diamond_2": "永恒钻石2", + "eternal_diamond_3": "永恒钻石3", + "eternal_diamond_4": "永恒钻石4", + "eternal_diamond_5": "永恒钻石5", + "earn_5_stars_in_each_division_to_advance_for_a_total_of_25_stars": "每个小段位需要满5颗星才能晋升到下一个段位,共25颗星。", + "about_ranks": "段位介绍", + "in_the_sheling_battle_system_rank_is_an_important_measure_of_com": " 在射灵世界的对战体系内,段位是衡量您竞赛技术水平的重要指标,它不仅代表了玩家的排位段位,还体现了玩家在对战中的综合表现。通过不断对抗和积累积分,玩家可以逐步提升自己的段位,以下是关于段位的详细说明。 ", + "1_rank_system_overview": "一、段位体系概述", + "ranks_from_lowest_to_highest_are_determined_bronze_orderly_silve": " 我们的段位体系分为多个等级,从低到高依次为:倔强青铜、秩序白银、荣耀黄金、永恒钻石、最强王者、非凡王者、无双王者、绝世王者、至圣王者、荣耀王者和传奇王者。每个大段位下又分为若干小段位,玩家需要通过积累积分来提升段位。 ", + "2_earning_points": "二、积分获取规则", + "1_basic_rules": "(一)基本规则", + "1v1_2v2_and_3v3_versus": "1V1、2V2、3V3对抗模式:", + "each_player_on_the_winning_team_gains_100_points_each_player_on_": "每胜一局,胜方每人+100积分;每负一局,负方每人-100积分", + "2v2_the_player_with_the_highest_total_score_on_the_winning_team_": "2V2模式:胜方队伍中,总成绩最高且箭均成绩≥7环者,为本局MVP,额外获得40积分。", + "3v3_the_player_with_the_highest_total_score_on_the_winning_team_": "3V3模式:胜方队伍中,总成绩最高且箭均成绩≥7环者,为本局MVP,额外获得60积分。", + "a_streak_of_five_wins_across_1v1_2v2_and_3v3_awards_15_extra_poi": "在1V1/2V2/3V3三种模式中,连续获得五连胜(三类模式一起算),则从第五场开始,每场胜利可额外再加15分,直至结束连胜。(仅限对抗模式,不含大乱斗模式。)", + "5_player_and_10_player_free_for_all": "5人、10人大乱斗模式:", + "players_in_5_player_and_10_player_free_for_all_are_ranked_by_tot": " 5人大乱斗和10人大乱斗按个人总环数成绩排序,排名从高到低依次设置系统默认奖励/扣除积分,默认初始排名和积分规则具体如下: ", + "position": "排名", + "2_rank_tier_rules": "(二)大段位规则", + "points_required_to_advance_through_tiers_vary_according_to_the_f": "大段位升级中,每个玩家将根据不同的规则得到相应不同的积分,具体的规则如下", + "3_rank_table": "三、(表格)", + "tier": "大段位", + "division": "小段位", + "points_100_points_1_star": "积分(100积分=1星)", + "points_rankings": "积分榜", + "ranked_points": "排位赛积分", + "mvp_rankings": "MVP榜", + "mvp_awards": "MVP次数", + "10s_rankings": "十环榜", + "10s_scored": "十环次数", + "unranked_1010": "暂无段位", + "value_value_matches": "{p0},{p1}场", + "could_not_load_rankings": "排行榜加载失败", + "season_rankings": "本赛季排行榜", + "user_id": "用户ID", + "rank_1015": "排位", + "win_rate": "胜率", + "value_matches_value_value": "{p0}场 {p1} {p2}%", + "mvp_awards_value": ",MVP次数 {p0}", + "could_not_load_season_data": "赛季数据加载失败", + "could_not_load_page_data": "页面数据加载失败", + "ranked_matches": "排位赛", + "points_1021": "积分:", + "scoring_rate": "得分率", + "view_my_match_history": " 查看我的比赛记录 ", + "tap_for_more": "点击查看更多", + "restoring_match": "正在恢复比赛...", + "valuemin_values": "{p0}分{p1}秒", + "values": "{p0}秒", + "grouping": "稳定性", + "best_streak": "最高连击次数", + "hits": "连", + "total_score_1037": "共命中环数", + "peak_energy": "能量最高值", + "qualifying_arrows": "达标箭数", + "qualification_rate": "达标率", + "arrows_completed": "完成箭数", + "arrows_1042": "支", + "score_1043": "命中环数", + "targets_hit": "命中目标数", + "arrows_shot_1045": "射箭数", + "hit_rate": "命中率", + "next_difficulty": "下一难度", + "try_again": "再来一次", + "vs_last_session": "对比上次", + "share_results": "分享成绩", + "pts_the_average_distance_between_your_arrow_impacts_is_1051": "环的成绩,所有箭支上靶后的平均点间距离为", + "for_this_session_1052": " 针对您本次的练习,", + "rhythm_training": "节奏训练", + "shoot_in_the_last_values": "在最后的{p0}秒内射箭", + "shoot_in_the_last_values_and_hit_within_value_rings": "在最后的{p0}秒射箭并命中{p1}环内", + "lose": " 每秒失去", + "energy_per_second": "%能量 ", + "stability_training_energy_progress": "稳定训练能量进度", + "current_target": "当前靶纸为", + "basic_training": "基础训练", + "endurance_training": "耐力训练", + "precision_training": "精准训练", + "stability_training": "稳定训练", + "s_1064": "秒内,", + "no_time_limit": "不限时,", + "hit": "命中", + "pts_each": "环的箭", + "shoot_1068": "共射出", + "arrows_with_a_total_of": "支箭,且总环数", + "arrows_in_the_highlighted_area": "箭高亮区域", + "beats_follow_the_rhythm_and_land": "个节奏内,随节奏射箭,命中", + "arrows_scoring": "箭成绩", + "pts_within_the_beat_window": "环且踩中节拍区间", + "each_arrow_scoring": "每射一箭", + "pts_charges_energy_fill_the_bar_to_pass": "环可为能量槽充能,能量充满即过关", + "value_difficulty": "{p0}难度", + "20_cm_full_ring_target_325": "20CM全环靶", + "could_not_load_training_difficulties": "训练难度加载失败", + "this_difficulty_is_locked": "难度尚未解锁", + "could_not_create_training_please_retry": "训练创建失败,请重试", + "could_not_enter_training_please_retry": "进入训练失败,请重试", + "creating_training": "训练创建中...", + "current_progress_lvvalue": "当前进度 LV{p0} >", + "coming_soon_1088": "功能开发中...", + "training": "共训练", + "on_target_rate": "上靶率", + "ahead_of": " 已超越", + "of_opponents": "对手 ", + "my_training_records": "我的训练记录", + "no_level_requirement": "无级别限制", + "recommended": " 推荐 ", + "hit_1096": "命中 ", + "arrows_at": " 支", + "shoot_1098": "射出≥ ", + "arrows_with_a_total_score": " 支箭,总环数达到≥ ", + "hit_the_highlighted_area_with": "命中高亮区域 ", + "arrows_1101": " 箭", + "beats_follow_the_rhythm_and_land_1102": " 个节奏内,跟随节奏射箭,命中 ", + "pts_charges_energy_fill_the_bar_to_pass_1103": "环可为能量槽充能,充满即过关", + "could_not_load_practice_details_please_retry": "练习信息获取失败,请重试", + "invalid_training_parameters_select_a_difficulty_again": "训练参数异常,请重新选择难度", + "i_m_ready_start_practice": "准备好了,开始练习", + "loading_1111": "加载中", + "vip_active": "VIP已开通", + "vip_inactive": "VIP未开通", + "could_not_load_retry": "加载失败,重试", + "user_profile": "用户信息", + "username": "用户名", + "avatar_1119": "头像", + "orders": "订单", + "incomplete": "未完成", + "version_info_test_only": "版本信息(仅用于测试)", + "unbind_device_test_only": "解绑设备(仅用于测试)", + "sign_out_test_only": "退出登录(仅用于测试)", + "today_s_value_value_value": "今日{p0}次数:{p1}/{p2}", + "no_target_detected_aim_at_the_target_and_shoot": "未识别到靶纸,请瞄准靶纸射箭", + "incorrect_target_face": "靶纸错误", + "distance_ok": "站距合格", + "too_close": "站距过近", + "target_face_ok": "靶纸正确", + "please_bind_a_device_first": "请先绑定设备", + "smart_bow_disconnected": "智能弓未连接", + "please_complete_the_beginner_challenge_first": "请先完成新手试炼", + "invalid_match_connection": "比赛连接信息异常", + "your_device_binding_has_expired_please_bind_it_again": "设备绑定状态已失效,请重新绑定", + "you_have_an_unpaid_order": "当前有未支付订单", + "this_room_has_expired": "房间已过期", + "get_ready_find_your_distance_first_challenge": "-箭前准备-感知距离-小试牛刀", + "return": "重回", + "2_109": "二", + "you": "你", + "your_turn": "轮到你了", + "red_team_shoot": "请红方射箭", + "blue_team_shoot": "请蓝方射箭", + "match_started": "比赛开始", + "match_ended_119": "比赛结束", + "adjust_value": "向{p0}调整", + "round_1": "第一轮", + "round_2": "第二轮", + "round_3": "第三轮", + "round_4": "第四轮", + "round_5": "第五轮", + "second_half_started": "下半场开始", + "distance_and_target_face_ok": "站距合格,靶纸正确", + "shoot_to_check_distance_and_target_face_230": "请射箭!测试站距与靶纸", + "great_score_the_national_ranked_matches_await": "好成绩!全国排位赛等着你!", + "keep_practicing_for_more_moments_to_shine": "持续练习,就会迎来更多高光时刻!", + "practice_daily_and_stand_out_next_time": "每日练习打卡,争取下次脱颖而出!", + "the_top_rank_is_within_your_reach": "王者一定属于你!", + "a_moment_to_shine_keep_it_up": "高光时刻!继续保持!", + "one_of_the_best_in_the_sheling_world": "射灵世界的佼佼者!", + "try_again_and_make_your_mark": "再来一次,定能脱颖而出!", + "practice_more_and_come_back_stronger": "加强练习,争取越战越勇", + "every_step_you_take_counts": "人生走过的每一步都算数", + "golden_arrow_round": "决金箭轮", + "practice_ended": "练习结束", + "victory": "胜利", + "defeat": "失败", + "40_cm_full_ring_target_324": "40CM全环靶", + "could_not_load_coin_earnings": "加载金币获取明细失败", + "could_not_load_redemptions": "加载金币兑换记录失败", + "could_not_load_store_membership": "加载门店会员失败", + "could_not_load_coin_statistics": "加载金币统计失败", + "could_not_load_gifts": "加载礼品列表失败", + "could_not_load_nearby_stores": "加载附近门店失败", + "could_not_get_your_location": "获取定位失败", + "could_not_load_gift_details": "加载礼品详情失败", + "could_not_load_coin_rules": "加载金币规则失败", + "could_not_load_device_details": "获取设备详情失败", + "could_not_load_the_device_qr_code": "获取设备二维码失败", + "could_not_download_the_qr_code": "二维码下载失败", + "timeout": "超时", + "device_details_have_expired": "设备详情已失效", + "start_shooting": "请开始射击", + "start_shooting_continuously": "请开始连续射箭", + "starting_soon": "即将开始...", + "first": "上", + "second": "下", + "half_shoot_6_arrows_first": "半场:请先射6箭", + "get_ready_for_the_second_half": "准备下半场", + "current_round_values_elapsed": "当前轮已进行{p0}秒", + "solo_training": "个人训练", + "practice_started": "练习开始", + "determined_bronze": "倔强青铜", + "bronze_1": "青铜1", + "bronze_2": "青铜2", + "bronze_3": "青铜3", + "orderly_silver": "秩序白银", + "silver_1": "白银1", + "silver_2": "白银2", + "silver_3": "白银3", + "glorious_gold": "荣耀黄金", + "gold_1": "黄金1", + "gold_2": "黄金2", + "gold_3": "黄金3", + "gold_4": "黄金4", + "eternal_diamond": "永恒钻石", + "diamond_1": "钻石1", + "diamond_2": "钻石2", + "diamond_3": "钻石3", + "diamond_4": "钻石4", + "diamond_5": "钻石5", + "supreme_champion": "最强王者", + "extraordinary_champion": "非凡王者", + "peerless_champion": "无双王者", + "matchless_champion": "绝世王者", + "exalted_champion": "至圣王者", + "glorious_champion": "荣耀王者", + "legendary_champion": "传奇王者", + "red_team_shoot_1025": "请红队射箭", + "blue_team_shoot_1026": "请蓝队射箭", + "remaining_1027": "剩余:", + "basics": "基础", + "precision": "精准", + "stability": "稳定", + "rhythm": "节奏", + "endurance": "耐力", + "challenge_complete": "通关成功", + "challenge_failed": "通关失败", + "bingo_target_hit": "Bingo命中目标", + "miss_1109": "未命中", + "down_and_left_1127": "左下", + "left_1128": "左", + "up_and_left_1129": "左上", + "up_and_right_1130": "右上", + "right_1131": "右", + "down_and_right_1132": "右下", + "too_close_incorrect_target_face": "站距过近,靶纸错误", + "too_close_target_face_ok": "站距过近,靶纸正确", + "distance_ok_incorrect_target_face": "站距合格,靶纸错误", + "invalid_shot_no_target_detected": "射箭无效,未识别到靶纸", + "invalid_shot_too_close_and_incorrect_target_face": "射箭无效,距离不足且靶纸错误", + "invalid_shot_incorrect_target_face": "射箭无效,靶纸错误", + "invalid_shot_too_close": "射箭无效,距离不足", + "invalid_shot": "射击无效", + "sign_in_failed": "登录失败" +}