// ==UserScript== // @name Rive汉化 // @namespace Rive_CN // @version 1.2 // @description Rive 编辑器汉化 + 中文字体替换 // @author 一身惆怅 // @match https://editor.rive.app/* // @run-at document-start // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @connect editor.rive.app // @connect cdn.jsdelivr.net // @license MIT // ==/UserScript== (() => { 'use strict'; const CONFIG = { DB_NAME: 'RiveCN_Cache', DB_VERSION: 2, STORE_NAME: 'data', FONT_KEY: 'font', FONT_URL: 'https://cdn.jsdelivr.net/npm/@fontpkg/harmony-os-sans-sc@1.0.3/HarmonyOS_Sans_SC_Regular.ttf', DEBUG: false, CACHE_PATCHED_JS: true, JS_CACHE_PREFIX: 'js:', CACHE_TTL_DAYS: 21, REQUEST_TIMEOUT_MS: 60_000, UI_MIN_SHOW_MS: 300 }; const FONT_TARGETS = ['notosanssc.ttf', 'notosanssc', /fonts\.gstatic\.com\/s\/notosanssc\/.*\.woff2/i]; // 翻译字典 // 1) [核心映射表] 针对数组内 "key","value" 结构的替换 const DICT = { "loading_rive": "Rive 加载中", "loading_file": "文件加载中...", "file_name": "文件名", "revision_history": "修订历史", "current_version": "当前版本", "create_revision": "创建修订版本...", "create_revision_title": "创建新修订版本", "rename_revision_title": "重命名修订版本", "revision_name_prompt": "命名您的修订版本", "revision_name_placeholder": "修订版本名称", "open_revision_history": "打开修订历史", "show_autosaves": "显示自动保存修订", "restoring": "正在恢复", "restored": "已恢复", "revision": "修订版本", "preview_revision": "预览修订版本", "restore_revision": "恢复修订版本", "name_revision": "命名修订版本...", "rename_revision": "重命名修订版本...", "fetching_revision_history": "正在获取修订历史...", "collapse_all": "全部折叠", "expand_all": "全部展开", "save_revision": "保存", "help_center": "文档", "view_changelog": "查看更新日志", "rive_community": "Rive 社区", "download_desktop": "获取桌面应用", "data_binds_relative": "相对数据绑定", "all_viewports": "所有视口", "options": "选项", "audio": "音频", "help": "帮助", "select": "选择", "position": "位置", "radius": "圆角", "corner_radius": "圆角半径", "scale": "缩放", "rotate": "旋转", "translate": "位移", "opacity": "不透明度", "follow": "跟随", "follow_path": "沿路径", "text_follow_path": "文本沿路径", "text_follow_path_radial": "径向", "text_follow_path_trim": "修剪", "text_follow_path_trim_start": "修剪起点", "text_follow_path_trim_end": "修剪终点", "jump_to_text": "选择文本", "x": "X", "y": "Y", "w": "宽", "h": "高", "l": "L", "position.x": "X", "position.y": "Y", "end.endX": "X", "end.endY": "Y", "r": "旋转", "end": "渐变终点", "start": "渐变起点", "start.startX": "X", "start.startY": "Y", "scale.sx": "X", "scale.sy": "Y", "bezier_in": "入", "bezier_in.inrotation": "角度", "bezier_in.indistance": "长度", "bezier_out.outrotation": "角度", "bezier_out.outdistance": "长度", "bezier_out": "出", "inDistance": "入", "outDistance": "出", "colorValue": "颜色", "selection_colors": "选中颜色", "trimStart": "修剪起点", "trimEnd": "修剪终点", "trimOffset": "修剪偏移", "drawtargetid": "绘制规则", "cornerRadiusTL": "左上圆角", "cornerRadiusTR": "", "cornerRadiusBL": "", "cornerRadiusBR": "", "cornerRadius": "圆角半径", "clip": "裁剪", "main_artboard": "主画板", "new": "新建", "freeze": "冻结", "freeze_active": "冻结活动", "in_world_space": "世界空间绘制", "x_axis": "X 轴", "y_axis": "Y 轴", "handle_source": "手柄源", "reconnecting_in": "连接丢失。正在重新连接", "reconnect_now": "立即重新连接", "design_background": "设计背景", "animate_background": "动画背景", "copy_fill": "复制填充", "copy_stroke": "复制描边", "copy_styles": "复制样式", "paste_styles": "粘贴样式", "paste_with_timelines": "粘贴时间轴...", "paste_timelines": "粘贴时间轴", "paste_timelines_artboard": "粘贴时间轴到画板", "paste_timelines_selection": "粘贴时间轴到选中对象", "paste_timelines_menu": "粘贴时间轴...", "paste_to_children": "到子对象", "paste_to_selection": "到选中对象", "default": "默认", "multiple": "多个", "values": "值", "move": "移动", "bring_forward": "上移一层", "send_backward": "下移一层", "bring_to_front": "置于顶层", "send_to_back": "置于底层", "auto_tool": "选择", "translate_tool": "位移工具", "rotate_tool": "旋转工具", "scale_tool": "缩放工具", "artboard_tool": "画板工具", "nested_component_tool": "嵌套组件", "nested_artboard_tool": "嵌套画板", "layout_frame_tool": "布局", "layout_row_tool": "行", "layout_column_tool": "列", "node_tool": "群组", "list_path_tool": "列表路径", "solo_tool": "独奏", "group_effect_tool": "效果组", "vector_pen_tool": "钢笔", "rectangle_tool": "矩形", "ellipse_tool": "椭圆", "triangle_tool": "三角形", "polygon_tool": "多边形", "star_tool": "星形", "point_list_tool": "列表路径", "bone_tool": "骨骼", "weight_tool": "权重", "joystick_tool": "摇杆", "event_tool": "事件", "property_tool": "属性组", "pen": "钢笔", "weight": "权重", "arrangement_tools": "排列工具", "bone_tools": "骨骼工具", "create_tools": "创建工具", "text_tool": "文本工具", "text_multiline_tool": "文本输入 - 多行", "text_tools": "文本工具", "layout_tool": "布局工具", "component_tool": "组件工具", "components": "组件", "component": "组件", "stage_control_tools": "舞台控制工具", "script_tools": "脚本工具", "blank_script": "空白脚本", "custom_property_tool": "自定义属性工具", "no_active_artboard": "没有活动画板。", "no_weighted_vertices": "没有加权顶点。", "play_default": "播放默认状态机", "select_default": "设置默认状态机", "default_state_machine": "默认状态机", "create_state_machine": "创建状态机", "snapping": "对齐", "bones": "骨骼", "targets": "目标", "motion_paths": "运动路径", "joysticks": "摇杆", "events": "事件", "show_collapsed_elements": "非活动独奏", "layouts": "布局", "show_final_playback": "显示最终播放", "rulers": "标尺", "guide": "参考线", "guides": "参考线", "lock_guides": "锁定参考线", "locked_guides": "参考线已锁定", "unlocked_guides": "参考线已解锁", "clear_guides": "清除参考线", "guide_layer": "参考线图层", "transform_tools": "变换工具", "follow_orient": "朝向", "follow_distance": "距离", "follow_distance_start": "起点", "follow_distance_end": "终点", "follow_distance_offset": "偏移", "snap_to_pixel": "对齐像素", "gizmo": "控制器", "user_cursors": "用户光标", "pause_components": "暂停组件更新", "view_only_title": "仅查看模式。", "view_only_caption": " 您无法编辑此文件", "close_revision_history": "关闭修订历史", "failed_to_save": "保存修订版本失败", "saved": "已保存", "distance": "长度", "in": "入", "out": "出", "sx": "X", "sy": "Y", "vertices": "顶点", "thickness": "厚度", "strokes": "描边", "fills_and_strokes": "填充和描边", "fills_and_strokes_bg": "背景", "fills_and_strokes_fg": "前景", "hold": "保持", "linear": "线性", "drawOrder": "绘制顺序", "cubic": "三次", "cubicValue": "三次值", "elastic": "弹性", "rotation": "旋转", "translation": "位移", "origin": "原点", "text_origin": "原点对齐基线", "baseline": "基线", "top": "顶部", "origin_x": "原点 X", "origin_y": "原点 Y", "threshold": "阈值", "align_top": "顶部对齐", "align_middle": "垂直居中", "align_bottom": "底部对齐", "align_left": "左对齐", "align_center": "水平居中", "align_right": "右对齐", "text_box_auto_width": "自动宽度", "text_box_auto_height": "自动高度", "text_box_fixed": "固定尺寸", "text_wrap_wrap": "换行", "text_wrap_no_wrap": "不换行", "vertex-straight": "直线", "vertex-mirrored": "镜像", "vertex-detached": "分离", "vertex-asymmetric": "非对称", "select_key": "选择关键帧", "normal": "团队", "premium": "组织", "blend": "混合", "srcOver": "正常", "darken": "变暗", "multiply": "正片叠底", "colorBurn": "颜色加深", "lighten": "变亮", "screen": "滤色", "colorDodge": "颜色减淡", "overlay": "叠加", "softLight": "柔光", "hardLight": "强光", "difference": "差值", "exclusion": "排除", "hue": "色相", "saturation": "饱和度", "color": "颜色", "luminosity": "明度", "scripting": "脚本", "optimization_level": "优化", "debug_level": "调试", "script_level_none": "无", "script_level_medium": "中等", "script_level_max": "完整", "trim_path": "修剪路径", "none": "无", "sequential": "顺序", "synchronized": "同步", "trim_start": "起点", "trim_end": "终点", "offset": "偏移", "transform_affects": "应用变换", "export_options": "导出选项", "export_behavior": "行为", "export_file_behavior": "资源", "export_type": "类型", "include": "包含", "clip_options": "裁剪选项", "fill_options": "填充选项", "feather_options": "羽化选项", "fill_rule": "填充规则", "even_odd": "奇偶", "non_zero": "非零", "clockwise": "顺时针", "draw_order_rule": "绘制顺序规则", "stroke_options": "描边选项", "path_effects": "路径效果", "path_effect": "路径效果", "dash_effect": "虚线效果", "trim_effect": "修剪效果", "target_effect": "效果组", "pathEffect_script": "脚本效果", "disable_add_effect": "选择单个对象以添加其他效果", "disable_effect_tab": "无法跨选区编辑效果", "ik_options": "IK 约束", "modifier_range": "", "distance_options": "距离约束", "transform_constraint_options": "变换约束", "follow_path_constraint_options": "沿路径约束", "rotation_constraint_options": "旋转约束", "translation_constraint_options": "位移约束", "scale_constraint_options": "缩放约束", "strength": "强度", "mix": "混合", "ik_constraint": "IK", "follow_path_constraint": "沿路径", "distance_constraint": "距离", "distance_constraint_value": "距离", "distance_constraint_mode": "模式", "distance_mode_closer": "更近", "distance_mode_exact": "精确", "distance_mode_further": "更远", "transform_constraint": "变换", "translation_constraint": "位移", "rotation_constraint": "旋转", "scale_constraint": "缩放", "source_space": "源空间", "dest_space": "目标空间", "space": "空间", "min_max_space": "最小/最大空间", "world": "世界", "local": "本地", "constraint_copy_rotation": "复制", "constraint_copy_scale_x": "复制 X", "constraint_copy_scale_y": "复制 Y", "constraint_copy_translation_x": "复制 X", "constraint_copy_translation_y": "复制 Y", "constraint_min": "最小", "constraint_max": "最大", "constraint_offset": "偏移", "fill": "填充", "stroke": "描边", "feather": "羽化", "opaque": "不透明目标", "add_feather": "添加羽化", "remove_feather": "移除羽化", "feather_amount": "数量", "feather_direction": "方向", "feather_fill_title": "填充规则已设置为顺时针", "feather_fill_caption": "矢量羽化需要 Rive 的顺时针填充规则。此填充规则在自相交路径上的表现可能有所不同,显示效果可能与您的原始设计不同。", "revert": "恢复", "feather_fill_rule_tip": "移除羽化以编辑填充规则", "feather_x": "羽化 X", "feather_y": "羽化 Y", "feather_amount_ext": "羽化数量", "feather_inner": "内部羽化", "opaque_tooltip": "阻止指针事件穿透目标", "opaque_disabled_tooltip": "当前目标无法设置为不透明", "normal_draw_rule": "正常", "normal_draw_rule_desc": "这是基于层级结构的默认绘制顺序位置。", "above_target": "目标上方", "below_target": "目标下方", "draw_order": "绘制顺序", "cyclic_dependency_tip": "循环依赖", "draw_order_no_target": "未选择目标", "cyclic_dependency": "创建循环。了解更多。", "cyclic_dependency_learn_link": "https://rive.app/community/doc/animating-draw-order/docFeifDob4o", "target": "目标", "set_target": "设置目标", "target_square": "目标 - 方形", "target_triangle": "目标 - 三角形", "target_small": "小目标", "target_square_small": "目标 - 小方形", "target_triangle_small": "目标 - 小三角形", "group": "群组", "ungroup": "取消群组", "solo": "独奏", "solo_active_component": "活动", "component_instances": "组件实例", "nested_artboard_cycle": "嵌套画板循环", "go_to_artboard": "转到画板", "go_to_component": "转到组件", "no_artboard_tip": "无画板", "artboard": "画板", "style": "样式", "select_drawable_target": "在舞台或层级结构中选择一个可绘制目标(非群组)。", "inner_radius": "内半径", "constraints": "约束", "select_constraint_target": "选择一个目标", "connect_states_to": "连接到...", "connect_states_from": "连接自...", "connect_states_bidirectional": "双向连接...", "cannot_constrain_self": "约束对象不能以自身为目标。", "cannot_offset_bone": "骨骼不支持偏移", "bone": "骨骼", "bone_count": "骨骼数量", "invert_direction": "反转方向", "invert": "反转", "add_state": "添加状态", "add_state_1d": "添加混合状态 (1D)", "add_state_direct": "添加混合状态 (叠加)", "delete_layer": "删除图层", "duplicate_layer": "复制图层", "disable_layer": "禁用图层", "enable_layer": "启用图层", "inputs": "输入", "level_up_state_machine": "提升您的状态机", "explore_data_binding": "探索数据绑定", "state_machine": "状态机", "inputs_separator": "输入", "artboard_separator": "画板", "scripts_separator": "脚本", "script_label": "脚本", "from_label": "来自", "layers": "图层", "trigger": "触发器", "boolean": "布尔值", "number": "数值", "listeners": "监听器", "blank_listener": "空白", "input_change": "输入变化", "viewModel_change": "视图模型变化", "align_target": "对齐目标", "scripted_action": "脚本动作", "entry_state": "入口", "any_state": "任意状态", "exit_state": "出口", "blend_state": "混合", "animation_state": "动画状态", "speed": "速度", "time": "时间", "seconds_input_label": "秒", "milliseconds_input_label": "毫秒", "percentage_input_label": "%", "duration_supports_units": "支持毫秒、秒和百分比", "console": "控制台", "problems": "问题", "changes": "更改", "testing": "测试中", "compiling": "编译中...", "compiled_in": "编译完成,耗时 ", "console_message": "开始播放以查看事件日志", "blend_no": "单时间轴", "blend_1d": "混合 1D", "capture_base_state": "捕获基础状态", "blend_direct": "混合叠加", "animation": "动画", "timeline": "时间轴", "folder": "文件夹", "timelines": "时间轴", "blend_viewModel": "按视图模型混合", "blend_value": "按值混合", "blend_input": "按输入混合", "entry": "入口", "animations": "动画", "animation_options": "动画选项", "is_playing": "播放中", "is_paused": "暂停组件", "quantize_fps": "量化帧率", "play": "播放", "stop": "停止", "play_at": "播放于", "stop_at": "停止于", "input": "输入", "exit_animation": "退出源", "allow_exit_transition": "过渡期间允许退出", "pause_source_on_exit": "退出时暂停源", "empty_state_machine_layers": "添加图层到状态机以创建状态。", "randomization": "随机化", "enable_randomization": "随机退出", "random_weight": "随机化因子", "factor": "因子:", "operation": "运算", "cap": "端点", "join": "连接", "interpolation": "插值", "open_graph_editor": "打开曲线编辑器", "apply_auto_bezier": "应用自动贝塞尔", "auto_bezier_coefficient": "自动贝塞尔系数", "default_interpolation": "默认插值", "set_default_interpolation": "设为默认插值", "default_interpolation_changed": "默认插值已更改", "falloff_interpolation": "衰减插值", "graph_editor": "曲线编辑器", "show_selected": "显示选中", "timeline_start": "起点", "timeline_end": "终点", "forward_1": "前进 1", "backward_1": "后退 1", "forward_10": "前进 10", "backward_10": "后退 10", "next_key": "移动播放头到下一关键帧", "prev_key": "移动播放头到上一关键帧", "move_keys": "移动关键帧", "move_playhead": "移动播放头", "no_keys_selected": "未选择关键帧", "nav_timeline": "导航时间轴", "animating": "动画中", "activeComponentId": "活动", "public": "暴露给父画板", "easeIn": "缓入", "easeOut": "缓出", "easeInOut": "缓入缓出", "amplitude": "振幅", "period": "周期", "create_condition": "创建条件", "zero": "零", "infer_from_name": "从名称推断", "left_to_right": "从左到右", "top_to_bottom": "从上到下", "incremental_from_one": "从 1 递增", "incremental_from_zero": "从 0 递增", "merge_timelines": "合并时间轴...", "create_new": "新建", "merge_into": "合并到", "copy_selection": "复制选中到...", "move_selection": "移动选中到...", "set_work_area": "设置工作区", "work_area_to": "到关键帧", "work_area_from": "从关键帧", "work_area_range": "设置工作区", "new_timeline": "新建时间轴", "paste_with_animations": "", "paste_animations_title": "", "paste_animations_list_title": "选择要粘贴的动画:", "paste_animations_merge_by_name": "按名称与现有动画合并", "subtract_path": "减去路径", "read_more": "了解更多", "convert_path_title": "转换为自定义路径?", "convert_path_desc": "允许您修改每个顶点的位置,但将移除程序化属性(如宽度、高度、点数)。应用于这些属性的任何关键帧也将被移除。", "convert_path_link": "", "remove": "移除", "remove_joystick_keyframes_title": "移除摇杆关键帧?", "remove_joystick_keyframes_desc": "选中的动画包含此摇杆的关键帧。需要移除这些关键帧以避免递归循环。", "remove_joystick_keyframes_link": "", "convert": "转换", "cancel": "取消", "edit_vertices": "编辑顶点", "dont_show_again": "不再显示", "mesh": "网格", "create_mesh": "应用网格", "edit_mesh": "编辑网格", "remove_mesh": "移除网格", "editing_mesh": "正在编辑网格", "bind_bones": "选择要绑定的骨骼", "bind_bones_inspector": "绑定骨骼", "bind_bones_read_more": "了解更多关于骨骼绑定的信息", "bind_bones_link": "https://rive.app/community/doc/bones/docYyQwxrgI5#connecting-bones-to-artwork", "done": "完成", "done_editing": "完成编辑", "reset_mesh": "重置", "new_contour": "新建轮廓", "close_path": "闭合路径", "open_path": "开放路径", "is_hole": "孔洞", "reverse_direction": "反转方向", "outline_corner_radius": "转换圆角", "key_all_vertices": "关键帧所有顶点", "key_selected_vertices": "关键帧选中顶点", "clip_active": "选择一个形状作为裁剪源", "no_connection": "无连接。正在重试...", "no_connection_detail": "Rive 需要活动的网络连接", "download-update-title": "需要更新", "download-update-caption": "Rive 的最新更改需要更新桌面应用", "too-small-title": "Rive 需要更多空间", "too-small-caption": "增大窗口尺寸以显示 Rive 编辑器", "download-update-action": "更新 Rive", "packages": "包", "rive_license": "许可证", "terms_of_service": "服务条款", "privacy_policy": "隐私政策", "rive_version": "版本", "rive_copyright": "Rive, Inc. 保留所有权利。", "delete_folder": "删除文件夹及其内容?", "delete_folder_desc": "包含动画。确定要删除吗?", "delete_inputs_folder_desc": "包含输入。确定要删除吗?", "delete_listeners_folder_desc": "包含监听器。确定要删除吗?", "delete_multi": "确定吗?", "delete_multi_caption": "您将删除多个动画", "delete_multi_inputs_caption": "您将删除多个输入", "delete_multi_listeners_caption": "您将删除多个监听器", "delete_multi_converters_caption": "您将删除多个转换器", "delete_multi_enums_caption": "您将删除多个枚举", "delete_stage_items_title": "确定吗?", "delete_asset_folders": "", "delete_stage_items_caption": "您将在动画模式下删除舞台项目", "delete_asset_folders_caption": "文件夹内的资源也将被删除。", "delete_data_folder_contents_title": "", "delete_data_folder_contents_caption": "文件夹内的视图模型、枚举和转换器也将被删除。", "delete_stage_items_confirm_label": "是", "delete_asset_folders_confirm_label": "是", "listener_no_target": "选择目标以显示事件。", "listener_target_no_events": "此画板没有事件。选择其他目标或创建事件。", "confirm": "确认", "create_animation_hint": "创建时间轴或状态机以开始动画", "create_animation_action": "创建动画", "select_animation_hint": "选择时间轴或状态机", "flatten_text_title": "将文本转为形状", "flatten_text_desc": "将文本组件转换为带路径的形状。与文本组件关联的所有关键帧将被移除", "flatten_confirm": "转换", "tab": "TAB", "create_data_bind_title": "创建所有相对数据绑定?", "create_data_bind_desc": "任何数据绑定属性都将创建为相对数据绑定", "create_data_bind_relative": "", "create_data_bind_confirm": "是", "create_data_bind_cancel": "否", "create_artboard_get_started": "创建画板以开始使用", "select_preset": "选择预设", "create_artboard": "创建画板", "about_artboards": "画板定义场景的尺寸和背景颜色。想创建多少都可以!", "create_action": "创建画板", "get_started_action": "入门视频", "feature_created_by": "创建者", "feature_tip": "发布到社区有机会获得推荐", "delete_nested_state_machine_title": "删除状态机", "delete_nested_state_machine_desc": "确定要删除此状态机吗?", "delete_nested_state_machine_confirm": "是", "delete_nested_state_machine_cancel": "否", "empty_queue": "您的云端渲染队列为空", "not_started": "未开始", "rendering": "渲染中", "completed": "已完成", "start_all": "全部开始", "duration": "时长", "name": "名称", "format": "格式", "size": "大小", "height": "高度", "width": "宽度", "frame_rate": "帧率", "bit_rate": "比特率", "matte": "遮罩", "wizard_selection": "动画", "made_with_rive": "由 Rive 制作", "delete_render": "删除", "start_render": "开始", "download_render": "下载", "stop_render": "停止", "kbps": "kbps", "render_presets": "渲染预设", "render_upsell_button": "升级!", "render_upsell_unlock": "解锁所有渲染选项。", "render_upsell_learn": "了解更多。", "scene_selection": "渲染模式", "scene_selection_checkbox": "仅设计", "render_mode_design": "设计", "render_mode_animation": "动画", "render_mode_state_machine": "状态机", "open_render_queue": "转到渲染队列", "render_queue": "渲染队列", "render_queue_add": "添加到渲染队列", "render_queue_open": "打开渲染队列", "render_now": "排队并开始渲染", "render_mode": "模式", "queue_all": "全部排队", "none_scheduled": "无计划任务", "none_completed": "无已完成任务", "star": "星形", "rectangle": "矩形", "ellipse": "椭圆", "polygon": "多边形", "triangle": "三角形", "length": "长度", "points": "点数", "polygon_radius": "半径", "top_left": "左上", "top_right": "右上", "bot_left": "左下", "bot_right": "右下", "text": "文本", "font_options": "字体选项", "text_features": "特性", "text_variable_axes": "变量", "text_modifiers": "文本修改器", "text_modifier_range": "范围", "text_modifier_follow_path": "沿路径", "auto_orient_glyphs": "自动调整字形方向", "auto_orient_lines": "自动调整行方向", "text_run": "文本段", "text_input": "文本输入", "text_styles": "文本样式", "group_text_styles": "群组文本样式", "ungroup_text_styles": "取消群组文本样式", "text_value": "值", "fontsize": "字体大小", "bind_text_run": "绑定文本", "combine_text_runs": "合并文本段", "new_text_run": "从选中创建段", "new_run_tip": "选择字符以创建文本段", "new_run_design_mode": "只能在设计模式下创建文本段", "flatten": "转换为形状", "merge_text_run_next": "与下一段合并", "merge_text_run_prev": "与上一段合并", "delete_text_run": "删除文本段", "edit_text_run": "编辑文本段", "last_run_tip": "无法移除最后一个文本段", "highlight_text_runs": "高亮文本段", "fit_respecting_baseline": "保持基线", "variable": "变量", "exclude_spaces": "排除空格", "last_range": "修改器组至少需要一个范围", "range_view_mode": "范围视图模式", "modulo": "取模", "show_range": "", "show_range_values": "文本修改器范围值", "show_unit_toggle": "", "input_field_horizontal_drag": "使用水平字段拖动", "ot_aalt": "所有替代字形", "ot_abvf": "基上形式", "ot_abvm": "基上标记定位", "ot_abvs": "基上替换", "ot_afrc": "替代分数", "ot_akhn": "连字", "ot_blwf": "基下形式", "ot_blwm": "基下标记定位", "ot_blws": "基下替换", "ot_calt": "上下文替代", "ot_case": "大小写敏感形式", "ot_ccmp": "字形组合", "ot_cfar": "Ro 后连字形形式", "ot_chws": "上下文半宽间距", "ot_cjct": "连字形形式", "ot_clig": "上下文连字", "ot_cpct": "居中 CJK 标点", "ot_cpsp": "大写字母间距", "ot_cswh": "上下文花饰", "ot_curs": "草书定位", "ot_c2pc": "大写到小型大写", "ot_c2sc": "大写到小型大写", "ot_dist": "距离", "ot_dlig": "自由连字", "ot_dnom": "分母", "ot_dtls": "无点形式", "ot_expt": "专家形式", "ot_falt": "行尾替代字形", "ot_fin2": "词尾形式 #2", "ot_fin3": "词尾形式 #3", "ot_fina": "词尾形式", "ot_flac": "扁平重音形式", "ot_frac": "分数", "ot_fwid": "全宽", "ot_half": "半形", "ot_haln": "Halant 形式", "ot_halt": "替代半宽", "ot_hist": "历史形式", "ot_hkna": "水平假名替代", "ot_hlig": "历史连字", "ot_hngl": "韩文", "ot_hojo": "Hojo 汉字形式", "ot_hwid": "半宽", "ot_init": "词首形式", "ot_isol": "独立形式", "ot_ital": "斜体", "ot_jalt": "两端对齐替代", "ot_jp78": "JIS78 形式", "ot_jp83": "JIS83 形式", "ot_jp90": "JIS90 形式", "ot_jp04": "JIS2004 形式", "ot_kern": "字距调整", "ot_lfbd": "左边界", "ot_liga": "标准连字", "ot_ljmo": "前导 Jamo 形式", "ot_lnum": "等高数字", "ot_locl": "本地化形式", "ot_ltra": "从左到右替代", "ot_ltrm": "从左到右镜像形式", "ot_mark": "标记定位", "ot_med2": "中间形式 #2", "ot_medi": "中间形式", "ot_mgrk": "数学希腊字母", "ot_mkmk": "标记到标记定位", "ot_mset": "通过替换进行标记定位", "ot_nalt": "替代注释形式", "ot_nlck": "NLC 汉字形式", "ot_nukt": "Nukta 形式", "ot_numr": "分子", "ot_onum": "古风数字", "ot_opbd": "光学边界", "ot_ordn": "序数", "ot_ornm": "装饰", "ot_palt": "比例替代宽度", "ot_pcap": "小型大写", "ot_pkna": "比例假名", "ot_pnum": "比例数字", "ot_pref": "前置形式", "ot_pres": "前置替换", "ot_pstf": "后置形式", "ot_psts": "后置替换", "ot_pwid": "比例宽度", "ot_qwid": "四分之一宽", "ot_rand": "随机化", "ot_rclt": "必需上下文替代", "ot_rkrf": "Rakar 形式", "ot_rlig": "必需连字", "ot_rphf": "Reph 形式", "ot_rtbd": "右边界", "ot_rtla": "从右到左替代", "ot_rtlm": "从右到左镜像形式", "ot_ruby": "注音标记形式", "ot_rvrn": "必需变体替代", "ot_salt": "风格替代", "ot_sinf": "科学下标", "ot_size": "光学尺寸", "ot_smcp": "小型大写", "ot_smpl": "简体形式", "ot_ss01": "风格集 1", "ot_ss02": "风格集 2", "ot_ss03": "风格集 3", "ot_ss04": "风格集 4", "ot_ss05": "风格集 5", "ot_ss06": "风格集 6", "ot_ss07": "风格集 7", "ot_ss08": "风格集 8", "ot_ss09": "风格集 9", "ot_ss10": "风格集 10", "ot_ss11": "风格集 11", "ot_ss12": "风格集 12", "ot_ss13": "风格集 13", "ot_ss14": "风格集 14", "ot_ss15": "风格集 15", "ot_ss16": "风格集 16", "ot_ss17": "风格集 17", "ot_ss18": "风格集 18", "ot_ss19": "风格集 19", "ot_ss20": "风格集 20", "ot_ssty": "数学脚本风格替代", "ot_stch": "拉伸字形分解", "ot_subs": "下标", "ot_sups": "上标", "ot_swsh": "花饰", "ot_titl": "标题", "ot_tjmo": "尾随 Jamo 形式", "ot_tnam": "传统名称形式", "ot_tnum": "等宽数字", "ot_trad": "繁体形式", "ot_twid": "三分之一宽", "ot_unic": "单高", "ot_valt": "替代垂直度量", "ot_vatu": "Vattu 变体", "ot_vchw": "垂直上下文半宽间距", "ot_vert": "垂直书写", "ot_vhal": "替代垂直半宽度量", "ot_vjmo": "元音 Jamo 形式", "ot_vkna": "垂直假名替代", "ot_vkrn": "垂直字距", "ot_vpal": "比例替代垂直度量", "ot_vrt2": "垂直替代和旋转", "ot_vrtr": "旋转垂直替代", "ot_zero": "斜线零", "currently_unavailable": "当前不可用", "custom_font_publish_warning": "目前无法将自定义字体发布到社区", "ok": "确定", "joystick": "摇杆", "handle": "手柄", "set_joystick_source": "可选设置控制源", "visible": "可见", "hidden": "隐藏", "clipped": "已裁剪", "ellipsis": "省略号", "wrap": "换行", "noWrap": "不换行", "wght": "字重", "wdth": "字宽", "slnt": "倾斜", "opsz": "光学尺寸", "modifyfrom": "范围起点", "modifyto": "范围终点", "fallofffrom": "衰减起点", "falloffto": "衰减终点", "origin.x": "X", "origin.y": "Y", "scale.x": "X", "scale.y": "Y", "axisvalue": "值", "value": "值", "styleid": "样式", "zoom": "缩放", "resolution": "分辨率", "zoom_in": "放大", "zoom_out": "缩小", "zoom_fit": "适应缩放", "zoom_100": "缩放到 100%", "duplicate": "复制", "delete": "删除", "sort": "排序", "sort_a_z": "A-Z", "sort_z_a": "Z-A", "make_default": "设为默认", "search": "搜索", "goto_line": "跳转到行", "loading": "加载中...", "replace_with_onward": "替换为...", "loading-no-ellipsis": "加载中", "this_file": "此文件", "all_files": "所有文件", "artboards": "画板", "objects": "对象", "publish": "发布", "description_section_name": "帖子", "title_hint": "输入标题...", "description_hint": "输入描述,别忘了使用 #标签 帮助其他艺术家发现您的作品…", "verify_first_short": "用户需要验证", "verify_first": "验证您的邮箱以开始发布到社区", "publish_revision": "发布此文件的新修订版本\n到社区", "publish_update": "发布更新", "publish_needs_title": "添加标题以发布", "publish_needs_desc": "添加描述以发布", "publish_needs_title_desc": "添加标题和描述以发布", "has_been_published": "已发布", "create_component": "创建组件", "revert_to_artboard": "还原为画板", "no_export": "从导出中排除", "revert_to_artboard_q": "还原为画板?", "delete_components_q": "删除组件?", "delete_library_components_q": "删除库组件?", "revert_referenced_caption": "此组件正在被其他画板引用。确定要移除吗?", "revert_referenced_caption_alt": "某个组件正在被其他画板引用。确定要移除吗?", "revert_published_caption": "此组件之前已发布。确定要移除吗?", "revert_published_caption_alt": "某个组件之前已发布。确定要移除吗?", "confirm_delete_components_caption": "从资源中删除组件也会从舞台中删除它们。确定吗?", "library": "库", "latest_version": "最新版本", "open_library_file": "打开库文件", "open_library_browser": "在库浏览器中查看", "replace_library_debug": "替换库 (调试)", "create_library": "发布库", "create_library_onward": "发布库...", "publish_library_update": "发布更新", "publish_library_update_onward": "发布库更新...", "library_created_alert": "此文件现在是库", "cannot_update_non_library": "此文件不是库", "republish_library": "重新发布库", "unpublish_library": "取消发布库", "publish_library_without_components_alert": "无法更新没有组件的库。", "library_update_published_alert": "库的新版本已发布。", "api_error_library_status_update_failed": "API 错误 库的新版本已发布。", "create_library_without_components_alert": "无法创建没有组件的库。将画板标记为组件。", "publish_desc": "更改描述(可选)", "publishing": "发布中...", "no_libraries": "未找到库", "no_components": "暂无组件", "no_components_desc": "将画板设置为组件以发布库", "no_artboard_components": "暂无画板组件", "no_data_components": "暂无数据组件", "no_script_components": "暂无共享脚本", "go_to_library": "转到库", "updating": "更新中...", "update_selected": "更新选中", "update_latest_version": "最新版本:", "update_to_version": "版本:", "update_library_name": "库:", "component_information": "组件信息", "dependency_status": "依赖项", "missing_dependencies": "缺失依赖项", "resolve_dependencies": "添加缺失依赖项", "update_component": "更新组件", "update_components": "更新组件", "adding_selected": "正在添加选中的库组件", "lib_err_no_asset": "无法导入选中的组件:找不到库资源", "lib_err_no_atts": "无法导入选中的组件:无法获取库属性", "lib_import_success": "成功添加组件", "lib_status_unpublish": "此文件不再是库", "lib_status_republish": "此文件已重新发布为库", "lib_err_not_found": "无法找到此库", "asset": "资源", "upload": "上传", "information": "信息", "source_information": "来源信息", "dimensions": "尺寸", "file_size": "文件大小", "used": "已使用", "created": "创建时间", "replace": "替换", "more_info": "更多信息", "assets": "资源", "generate_artboard": "生成画板", "assets_selected": "已选资源", "upload_unavailable_preview": "预览文件时无法上传资源。", "items": "项", "sample_rate": "采样率", "channels": "声道", "mono": "单声道", "stereo": "立体声", "audio_format": "格式", "audio_format_unknown": "未知", "audio_format_wav": "Wav", "audio_format_mp3": "Mp3", "audio_format_flac": "Flac", "audio_format_vorbis": "Vorbis", "volume": "音量", "waveform": "波形", "clipped_waveform": "裁剪波形", "buffering": "缓冲中...", "audio_clip": "音频片段", "audio_clips": "片段", "audio_clip_start": "起点", "audio_clip_end": "终点", "created_audio_clip": "已创建音频片段", "new_audio_clip": "创建片段", "select_audio_clip": "选择音频资源以裁剪", "libraries": "库", "include_in_export": "包含在导出中", "export_component_to_riv": "导出组件为 .riv", "export_asset_to_riv": "导出资源为 .riv", "export_as_component": "作为组件导出", "export_reason_main": "主画板必须导出", "export_reason_dependency": "嵌套组件必须导出", "log_in": "登录", "sign_up": "注册", "verifying": "验证中", "google": "Google", "facebook": "Facebook", "or": "或", "username_email": "用户名或邮箱", "password": "密码", "forgot_password": "忘记密码?", "signup_caption_pre_link": "在下方登录或 ", "signup_caption_post_link": " 创建 Rive 账户", "sso_login": "使用 SSO 登录", "sso_back_caption": "使用密码登录", "sso_caption": "使用 SSO 登录", "email": "邮箱", "copy": "复制", "copied": "已复制", "creating": "创建中...", "share_file": "分享文件", "share_link": "分享链接", "generate_share_link": "生成分享链接...", "share_link_anyone_can": "任何有链接的人都可以查看您的文件。", "thumbnail": "缩略图", "create": "创建", "share": "分享", "share_link_manage": "管理您的链接", "title": "标题", "share_link_description": "生成链接与他人分享您的 Rive 作品。分享生成的链接,或使用嵌入代码将动画添加到网页。", "generate_link": "生成链接", "generating_link": "正在生成链接...", "result_share_link": "分享链接", "result_embed_link": "嵌入链接", "result_embed_code": "嵌入代码", "result_framer_code": "Framer 代码", "create_link": "创建新链接", "manage_links": "管理链接", "enable": "启用", "enable_caption": "禁用链接以阻止他人查看。", "runtime": "Rive 渲染器", "multitouch": "多点触控", "multitouch_caption": "启用多点触控", "runtime_caption": "使用 Rive 渲染器,更多信息请访问 ", "runtime_caption_info_link": "rive.app/docs", "listener_down": "指针按下", "listener_up": "指针抬起", "listener_enter": "指针进入", "listener_move": "指针移动", "listener_exit": "指针离开", "listener_click": "点击", "listener_drag": "指针拖拽", "listener_viewModel": "视图模型", "select_input": "选择输入", "select_event": "选择事件", "align": "对齐", "preserve_offset": "保持偏移", "set": "设置", "fire": "触发", "true": "真", "false": "假", "toggle": "切换", "report": "报告", "play_audio": "播放音频", "report_event": "报告事件", "custom_property": "属性", "custom_properties": "属性", "CustomPropertyString": "字符串", "CustomPropertyBoolean": "布尔值", "CustomPropertyNumber": "数值", "CustomPropertyColor": "颜色", "CustomPropertyTrigger": "触发器", "CustomPropertyEnum": "枚举", "event": "事件", "type": "类型", "reload_scripted_inputs": "重置输入值", "reload_scripted_input": "重置值", "layout": "布局", "layout_cell": "布局单元", "layout_style": "布局样式", "layout_animation": "启用布局动画", "layout_children": "布局子项", "layout_flex": "弹性布局", "layout_constraints": "布局约束", "layout_selection": "布局选区", "layout_direction": "方向", "convert_to_layout": "转换为布局", "add_cell": "添加子布局", "add_list": "添加画板列表", "add_component": "添加组件", "child_layout": "子布局", "unit_toggle": "", "min_width": "最小宽度", "min_height": "最小高度", "max_width": "最大宽度", "max_height": "最大高度", "clear_constraints": "清除约束", "display": "显示", "display_none": "隐藏", "display_flex": "显示", "constrain_size": "约束尺寸", "position_relative": "相对", "position_absolute": "绝对", "position_static": "静态", "uses_absolute_position": "位置:绝对", "uses_relative_position": "位置:受父级约束", "uses_mixed_position": "位置:混合", "flex_direction": "弹性方向", "flex_direction_row": "行", "flex_direction_column": "列", "flex_direction_row_reverse": "行反转", "flex_direction_column_reverse": "列反转", "flex_wrap": "弹性换行", "flex_wrap_no_wrap": "不换行", "flex_wrap_wrap": "换行", "flex_wrap_wrap_reverse": "换行反转", "direction_inherit": "继承", "direction_left_to_right": "从左到右", "direction_right_to_left": "从右到左", "align_content": "对齐内容", "align_items": "对齐项目", "align_self": "自身对齐", "justify_content": "两端对齐", "justify_items": "项目对齐", "justify_self": "自身两端对齐", "align_items_auto": "自动", "align_items_start": "起点", "align_items_end": "终点", "align_items_flex_start": "弹性起点", "align_items_flex_end": "弹性终点", "align_items_center": "居中", "align_items_baseline": "基线", "align_items_stretch": "拉伸", "align_items_space_between": "两端分布", "align_items_space_around": "环绕分布", "align_content_none": "无", "align_content_start": "起点", "align_content_end": "终点", "align_content_flex_start": "弹性起点", "align_content_flex_end": "弹性终点", "align_content_center": "居中", "align_content_stretch": "拉伸", "align_content_space_between": "两端分布", "align_content_space_evenly": "均匀分布", "align_content_space_around": "环绕分布", "add_child_layout_component": "添加子布局", "add_child_layout_component_tip": "在此布局内嵌套一个布局节点。", "layout_error_general": "布局状态异常", "percent": "百分比", "auto": "自动", "gap": "间距", "h_gap": "水平间距", "v_gap": "垂直间距", "dash": "虚线", "add_gap": "添加间距", "add_dash": "添加虚线", "min_size": "最小", "max_size": "最大", "flex_grow": "增长", "flex_shrink": "收缩", "flex_basis": "基础尺寸", "aspect_ratio": "宽高比", "left_abbr": "左", "right_abbr": "右", "top_abbr": "上", "bottom_abbr": "下", "border": "边框", "margin": "外边距", "padding": "内边距", "inset": "内缩", "intrinsically_sized": "", "sized_by_children": "尺寸由子项决定", "grid_auto_flow": "网格自动流向", "row": "行", "column": "列", "row_dense": "行密集", "column_dense": "列密集", "s": "S", "e": "E", "mn": "最小", "mx": "最大", "line": "行", "span": "跨距", "fixed": "固定", "min_content": "最小内容", "max_content": "最大内容", "fit_content": "适应内容", "fraction": "分数", "grid_row": "网格行", "grid_column": "网格列", "grid_template_rows": "网格模板行", "grid_template_columns": "网格模板列", "grid_auto_rows": "网格自动行", "grid_auto_columns": "网格自动列", "fit": "适应", "cover": "覆盖", "contain": "包含", "fitWidth": "适应宽度", "fitHeight": "适应高度", "scaleDown": "缩小", "resizeArtboard": "调整画板大小", "alignment": "对齐", "center": "居中", "topLeft": "左上", "topCenter": "顶部居中", "topRight": "右上", "centerLeft": "左侧居中", "centerRight": "右侧居中", "bottomLeft": "左下", "bottomCenter": "底部居中", "bottomRight": "右下", "start_space_between": "起点展开", "center_space_between": "居中展开", "end_space_between": "终点展开", "layoutposition": "位置", "layoutposition.positionleft": "左", "layoutposition.positionright": "右", "layoutposition.positiontop": "上", "layoutposition.positionbottom": "下", "layoutposition.positionleftunitsvalue": "左单位", "layoutposition.positionrightunitsvalue": "右单位", "layoutposition.positiontopunitsvalue": "上单位", "layoutposition.positionbottomunitsvalue": "下单位", "widthunitsvalue": "宽单位", "heightunitsvalue": "高单位", "layoutmin": "最小", "layoutmin.minwidth": "宽", "layoutmax.maxwidth": "宽", "layoutmin.minwidthunitsvalue": "宽单位", "layoutmax.maxwidthunitsvalue": "宽单位", "layoutmax": "最大", "layoutmin.minheight": "高", "layoutmax.maxheight": "高", "layoutmin.minheightunitsvalue": "高单位", "layoutmax.maxheightunitsvalue": "高单位", "layoutgap": "间距", "layoutgap.gaphorizontal": "水平", "layoutgap.gapvertical": "垂直", "layoutgap.gaphorizontalunitsvalue": "水平单位", "layoutgap.gapverticalunitsvalue": "垂直单位", "layoutmargin": "外边距", "layoutmargin.marginleft": "左", "layoutmargin.marginright": "右", "layoutmargin.margintop": "上", "layoutmargin.marginbottom": "下", "layoutmargin.marginleftunitsvalue": "左单位", "layoutmargin.marginrightunitsvalue": "右单位", "layoutmargin.margintopunitsvalue": "上单位", "layoutmargin.marginbottomunitsvalue": "下单位", "layoutpadding": "内边距", "layoutpadding.paddingleft": "左", "layoutpadding.paddingright": "右", "layoutpadding.paddingtop": "上", "layoutpadding.paddingbottom": "下", "layoutpadding.paddingleftunitsvalue": "左单位", "layoutpadding.paddingrightunitsvalue": "右单位", "layoutpadding.paddingtopunitsvalue": "上单位", "layoutpadding.paddingbottomunitsvalue": "下单位", "layoutborder": "边框", "layoutborder.borderleft": "左", "layoutborder.borderright": "右", "layoutborder.bordertop": "上", "layoutborder.borderbottom": "下", "layoutborder.borderleftunitsvalue": "左单位", "layoutborder.borderrightunitsvalue": "右单位", "layoutborder.bordertopunitsvalue": "上单位", "layoutborder.borderbottomunitsvalue": "下单位", "cornerradiustl": "左上圆角", "cornerradiustr": "", "cornerradiusbl": "", "cornerradiusbr": "", "displayvalue": "显示", "positiontypevalue": "位置类型", "flexdirectionvalue": "弹性方向", "directionvalue": "方向", "aligncontentvalue": "对齐内容", "alignitemsvalue": "对齐项目", "alignselfvalue": "自身对齐", "justifycontentvalue": "两端对齐", "flexwrapvalue": "弹性换行", "overflowvalue": "溢出", "wrapvalue": "文本换行", "intrinsicallysizedvalue": "", "flexgrow": "增长", "flexshrink": "收缩", "aspectratio": "宽高比", "animation_type": "动画类型", "custom": "自定义", "inherit": "继承", "layoutalignmenttype": "对齐", "interpolationtime": "动画时长", "no_group_layouts": "布局无法群组", "no_group_nested_artboard_layouts": "布局模式下的嵌套画板无法群组", "hug": "贴合", "layoutwidthscaletype": "宽度缩放类型", "layoutheightscaletype": "高度缩放类型", "artboard_hug_alert": "画板必须包含相对布局或嵌套画板布局才能贴合", "remove_from_parent_layout": "隐藏", "nine_slice": "九宫格", "skip_runtime_modal_option": "跳过运行时弹窗", "learn_rive_runtimes_description": "了解如何在这些平台上加载和控制 Rive 文件。", "supported_platforms_title": "支持的平台", "export_runtime_modal_title": "在任何地方运行 Rive", "export_runtime_modal_caption1": ".riv 格式可通过我们的开源运行时在任何地方运行。", "export_runtime_modal_caption2": " 导出您的 Rive 文件,并在应用、游戏、车辆、网站和产品中运行它。", "upgrading_to_editor_seat": "升级到编辑席位", "upgrading_to_paid_workspace": "升级到付费工作区", "export_runtime_modal_caption_thank_you": ".riv 格式可通过我们的开源运行时在任何地方运行。感谢您购买 Rive,我们感谢您的支持。", "runtime_export_button": "导出您的 Rive 文件", "runtime_upgrade_button": "升级以导出", "community_join_button": "加入社区获取帮助", "demo_files_button": "使用演示文件测试", "runtime_modal_skip_checkbox_label": "下次跳过此弹窗", "upgrade_modal_free_title": "免费版", "upgrade_modal_pro_team_title": "专业团队版", "upgrade_modal_free_button": "继续使用免费版", "upgrade_modal_free_description": "在 Rive 编辑器中设计、动画和编程。", "upgrade_modal_cadet_description": "将作品发布到应用、产品、游戏和车辆,最多 3 个席位。", "upgrade_modal_voyager_description": "使用库构建并扩展协作,最多 25 个席位。", "upgrade_modal_free_perk1": "3 个文件", "upgrade_modal_free_perk2": "Google 字体", "upgrade_modal_free_perk3": "10 MB 资源大小限制", "upgrade_modal_free_team_perk1": "无限个人文件", "upgrade_modal_free_team_perk2": "3 个协作文件", "upgrade_modal_pro_price_trailing": " / 月,按年计费", "upgrade_modal_pro_price_description": " / 月,按月计费", "upgrade_modal_pro_perk1": "无限文件", "upgrade_modal_pro_perk2": "文件夹和标签", "upgrade_modal_pro_perk3": "分享链接", "upgrade_modal_pro_perk4": "自定义字体上传", "upgrade_modal_pro_perk5": "备份文件格式", "upgrade_modal_pro_perk6": "无限修订历史", "upgrade_modal_team_price_trailing": "/席位/月", "upgrade_modal_team_price_description": " / 用户 / 月,按月计费", "upgrade_modal_team_perk1": "所有专业版功能", "upgrade_modal_team_perk2": "邀请团队成员", "upgrade_modal_team_perk3": "实时协作", "upgrade_modal_team_perk4": "批量导出", "upgrade_modal_cadet_perk1": "导出", "upgrade_modal_cadet_perk2": "无限协作文件和项目", "upgrade_modal_cadet_perk3": "$5/席位 每月代理积分", "upgrade_modal_free_pro_team_perk1": "Cadet 版所有功能", "upgrade_modal_free_pro_team_perk2": "库", "upgrade_modal_free_pro_team_perk3": "Rive CDN 资源托管", "upgrade_modal_free_pro_team_perk4": "嵌入链接托管", "upgrade_modal_free_pro_team_perk5": "Rive 支持", "upgrade_modal_free_pro_team_perk6": "$16/席位 每月代理积分", "upgrade_modal_enterprise_label": "联系我们", "upgrade_modal_enterprise_description": "为大型组织打造的规模化、支持和安全功能。", "upgrade_modal_enterprise_perk1": "为子团队提供多个工作区", "upgrade_modal_enterprise_perk2": "自带 S3 存储桶", "upgrade_modal_enterprise_perk3": "管理公司共享权限", "upgrade_modal_enterprise_perk4": "Rive 专属支持", "upgrade_modal_enterprise_perk5": "专属入职和培训", "upgrade_modal_enterprise_perk6": "自定义运行时", "upgrade_modal_enterprise_perk7": "集中计费", "upgrade_modal_enterprise_perk8": "SSO", "upgrade_modal_enterprise_perk9": "SOC2 类型 1", "upgrade_modal_enterprise_perk10": "$40/席位 每月代理积分", "upgrade_modal_non_admin_banner": "联系团队管理员以升级您的计划", "upgrade_modal_non_admin_banner_alt": "联系管理员以升级您的计划", "upgrade": "升级", "select_plan": "选择计划", "continue": "继续", "team_suspended_modal_header": "此团队已不再活动", "team_suspended_modal_description": "联系团队管理员以继续创建和编辑文件。右键单击项目以下载。", "team_suspended_admin_modal_header": "", "team_suspended_admin_modal_description": "重新激活您的计划以继续创建和编辑文件。右键单击项目以下载。", "team_suspended_admin_alert": "您的计划已被暂停。您可以随时重新激活以继续编辑文件。", "team_suspended_member_alert": "此团队已不再活动。联系您的团队管理员以重新激活。", "team_suspended_admin_alert_button": "管理计划", "team_pending_modal_header": "此计划等待账户操作", "team_pending_modal_description": "联系团队管理员以开始创建和编辑文件。", "team_pending_admin_modal_header": "您的计划等待账户操作", "team_pending_admin_modal_description": "管理您的计划以解决任何待处理的账户操作,继续创建和编辑文件。", "team_pending_admin_alert": "您的计划尚未启动。查看管理计划以完成设置。", "team_pending_member_alert": "此团队尚未激活。联系您的团队管理员以完成设置。", "team_pending_admin_alert_button": "管理计划", "team_failed_payment_alert": "我们无法处理您的付款。更新账单以保持计划活动。", "team_failed_payment_alert_button": "更新账单", "team_cancelled_alert": "您的计划已被取消。您可以继续编辑和创建文件,直到", "team_cancelled_alert_button": "管理计划", "team_cancelled_alert_unknown_expiry": "", "free_plan_welcome_alert_header": "欢迎来到 Rive。", "free_plan_welcome_alert_description": "使用免费计划最多可创建 3 个文件。", "free_plan_welcome_alert_link": "了解更多。", "free_plan_welcome_alert_button": "关闭", "at_limit_alert": "您已达到文件限制。升级以解锁无限文件。", "at_limit_alert_link": "了解更多。", "at_limit_alert_button": "升级", "over_limit_alert": "您已超过文件限制。删除一些文件或升级以重新开始编辑。", "over_limit_alert_link": "了解更多。", "over_limit_alert_button": "升级", "editor_block_over_file_limit_title": "您已超过文件限制", "editor_block_over_file_limit_description": "删除一些文件或升级以重新开始编辑", "editor_block_over_file_limit_button": "升级", "file_exported": "文件已导出。", "export_canceled": "导出已取消。", "cannot_copy": "", "cannot_cut": "", "previous": "上一个", "for_runtime": "用于运行时", "download": "下载", "export": "导出", "export_for_runtime": "导出用于运行时", "export_options_lc": "导出选项", "remove_name_exports": "移除名称导出", "export_all_names": "导出所有名称", "convert_data_binds": "转换数据绑定...", "convert_data_binds_to_relative": "为相对", "convert_data_binds_to_absolute": "为绝对", "exporting_file": "正在导出文件,这可能需要一分钟。", "for_backup": "用于备份", "scripts_zip": "脚本", "no_scripts_to_export": "没有可导出的脚本。", "animations_required_to_share": "需要动画才能分享。", "publish_marketplace": "发布到市场...", "add_to_cloud_render": "添加到云端渲染器...", "cloud_render_in_animate_mode": "渲染视频仅在动画模式下可用。", "nothing_to_render": "没有可渲染的内容。", "only_animations_can_render": "只能渲染动画", "view_cloud_render": "查看云端渲染器...", "renderer_starting": "启动中...", "renderer_starting_long": "启动中...(可能需要一分钟)", "render_init": "初始化中", "quality": "质量", "apply_changes": "应用更改", "uploading": "上传中", "analyzing": "分析中", "processing": "处理中", "ready": "就绪", "replacing": "替换中", "lossy": "有损", "lossless": "无损", "not_found": "未找到", "hint_reupload": "尝试重新上传此资源", "hint_replace_reupload": "尝试替换或重新上传此资源", "font_family": "字体族", "version": "版本", "designer": "设计师", "manufacturer": "制造商", "license": "许可证", "copyright": "版权", "custom_fonts": "自定义字体", "google_fonts": "Google 字体", "view_license": "查看许可证", "languages": "语言", "scripts": "脚本", "glyph": "字形", "view_glyphs": "查看字形", "view_scripts": "查看脚本", "no_script": "无脚本", "custom_audio_files": "自定义音频文件", "soundly_audio_files": "Soundly 音频文件", "all_sound_category": "浏览", "hosted_assets_header": "托管资源", "hosted_assets_caption": "您的资源将托管在 Rive 的 CDN 上供运行时下载。任何有资源链接的人都可以访问它。", "hosted_assets_learn_more": "了解更多关于托管资源的信息。", "hierarchy": "层级结构", "general_events": "常规", "link_events": "打开 URL", "assets_images": "图片", "assets_lottie": "Lottie", "assets_fonts": "字体", "assets_audio": "音频", "assets_scripts": "脚本", "failed_to_create_script": "创建脚本失败", "failed_to_compile_some_tests": "部分测试编译失败", "failed_to_compile_tests": "测试编译失败", "open_script": "在脚本编辑器中打开", "run_tests": "运行测试", "viewports": "视口", "create_viewport": "创建视口", "create_script": "创建脚本", "existing_script": "现有脚本", "new_stage_vp": "新建舞台视口", "script": "脚本", "link_events_inspector": "URL 属性", "audio_events_inspector": "音频属性", "url": "URL", "urlTarget": "目标", "url_target.blank": "空白", "url_target.parent": "父级", "url_target.self": "自身", "url_target.top": "顶层", "open": "打开", "open_url": "打开 URL", "show_file_browser": "在文件浏览器中显示", "download_backup": "下载备份", "rename": "重命名", "copy_link": "复制链接", "cut": "剪切", "paste": "粘贴", "put_back": "放回", "new_folder": "新建文件夹", "new_file": "新建文件", "remix_file": "混音文件到", "wrap_in": "包裹于", "reverse": "反转", "reverse_all": "全部反转", "convert_to_solo": "转换为独奏", "convert_to_solo_error": "将群组转换为独奏失败", "wrap_with_layout": "包裹在布局中", "wrap_with_9_slice": "包裹九宫格", "export_name": "导出名称", "my_files": "我的文件", "nav_recents": "最近", "members": "成员", "nav_marketplace": "市场", "nav_community": "社区", "view_in_community": "在社区中查看", "delete_file": "删除文件?", "no_delete_trash": "回收站无法删除", "sso_login_required": "访问此工作区需要 SSO 登录。\n请使用 SSO 登录或与您的工作区管理员确认您已链接到工作区的身份提供商。", "home": "首页", "sign_out": "退出登录", "manage_account": "管理账户", "manage_team": "管理团队", "upgrade_team": "升级团队", "invite": "邀请", "leave_team": "离开团队", "pending": "待处理", "remove_member": "移除团队成员", "view_all": "查看全部", "upgrade_to_pro": "升级到专业版", "no_files_caption": "创建或导入文件以开始使用", "no_files_viewer_caption": "暂无可查看的文件", "no_files_trash_caption": "删除的文件可以在这里找到", "last_modified": "最后修改", "viewer_no_files": "查看者无法创建文件", "viewer_no_folders": "查看者无法创建文件夹", "free": "免费", "owner": "所有者", "create_team": "创建团队", "create_a_team": "创建团队", "create_new_team": "创建新团队", "team_step_1": "1. 选择团队名称", "team_step_1_hint": "团队名称", "team_step_2": "2. 邀请团队成员", "team_step_2_hint": "邮箱地址,用逗号分隔", "empty_name_error": "选择团队名称", "invalid_name_error": "名称必须包含字母数字字符", "invalid_email_error": "无效的邮箱地址", "invite_form_error": "请检查邮箱地址是否有效", "team_overview": "团队概览", "verify_email": "验证您的邮箱以创建团队。", "resend_verification": "重新发送验证邮件。", "verification_sent": "验证邮件已发送", "verification_error": "出现问题。请联系我们。", "skip": "暂时跳过", "ws_create_team": "创建", "ws_create_a_team": "创建工作区", "ws_create_new_team": "新建工作区", "switch_workspace": "切换工作区", "ws_team_step_1": "1. 选择名称", "ws_team_step_1_hint": "工作区名称", "ws_team_step_2": "2. 邀请成员", "ws_empty_name_error": "选择名称", "ws_team_overview": "工作区概览", "ws_verify_email": "验证您的邮箱以创建工作区。", "leave_workspace": "离开工作区", "create_project": "创建项目", "create_project_hint": "项目名称", "project_step_1": "选择名称", "legacy": "旧版", "overview": "概览", "project_overview": "项目概览", "project_members": "项目成员", "remaining_members": "其他团队成员", "remaining_groups": "其他群组", "admin": "管理员", "leave_project": "离开项目", "rename_project": "重命名项目", "library_sharing": "库共享", "share_libraries": "共享", "share_libraries_explained": "使此项目中的库在工作区中可用", "allow_share_libraries": "允许", "update_project_settings": "更新", "archive_project": "归档项目", "manage_access": "管理访问权限", "editors": "编辑者", "viewers": "查看者", "confirm_project_archive": "确定要归档 ", "archive_action": "归档", "groups": "群组", "invalid_name": "无效名称", "confirm_changes": "确认更改", "payment_confirmation": "付款确认", "credit_confirmation": "积分确认", "make_payment": "付款", "go_back": "返回", "credit_caption": "这些更改将减少您的月费。任何按比例计算的金额将记入您的账户。", "payment_caption_pre_cost": "这些更改将产生费用", "payment_caption_post_cost": "与您账户关联的付款方式将被扣款。", "active_projects": "活动", "active_artboard_title": "活动", "archived_projects": "已归档", "view": "查看", "no_projects": "暂无项目", "payment_failed": "付款失败", "manage_billing": "管理账单", "failed_payment_caption": "", "payment_action": "付款需要操作", "payment_action_caption": "", "projects_require_admin_title": "项目需要管理员", "projects_require_admin_caption": "项目至少需要一名管理员或工作区访问权限", "reset_changes": "重置更改", "create_project_permission_title": "需要编辑者权限", "create_project_permission_caption": "工作区查看者无法创建项目。向管理员请求编辑者权限。", "invite_members": "邀请成员", "manage_workspace": "管理工作区", "upgrade_workspace": "升级工作区", "plan": "计划", "status": "状态", "your_role": "最适合描述您角色的身份是?", "select_role": "选择角色", "product_designer": "产品设计师", "game_designer": "游戏设计师", "animator": "动画师", "developer": "开发者", "other": "其他", "not_say": "我宁愿不说", "get_started": "开始使用", "err_no_role": "选择角色以继续。", "err_empty_other": "输入您的角色以继续。", "got_it": "知道了", "onboard_title_1": "欢迎来到 Rive", "onboard_caption_1": "在首页部分找到最近的文件、教程和社区灵感。", "onboard_title_2": "在工作区之间切换", "onboard_caption_2": "工作区非常适合团队和个人使用。创建任意数量,并在此处切换。", "onboard_title_3": "创建项目", "onboard_caption_3": "将文件组织到项目中,控制谁可以查看和编辑。", "onboard_title_4": "您的个人文件", "onboard_caption_4": "在您的个人空间中创建无限免费文件。每个工作区都有一个个人空间。", "onboard_title_5": "创建文件", "onboard_caption_5": "通过创建 Rive 文件开始使用。导出您的 .riv 以在应用、游戏或网站中使用。", "toolbar_help_tip_1": "提示:", "toolbar_help_tip_2": "悬停并按住 ", "toolbar_help_tip_3": " 获取帮助", "catastrophe_title": "哎呀,\n出了点问题!", "catastrophe_caption": "如果问题持续存在,请联系我们。", "something_went_wrong": "出了点问题", "unknown_error": "", "shortcuts": "快捷键", "open_shortcuts_panel": "显示快捷键", "close_shortcuts_panel": "隐藏快捷键", "shortcut_group_tool": "工具", "shortcut_group_timeline": "时间轴", "shortcut_group_selection": "选择", "shortcut_group_stage": "舞台", "shortcut_group_general": "常规", "shortcut_group_bone": "骨骼权重", "hold_shortcut": "按住", "shortcut_action_crash": "强制崩溃应用程序", "shortcut_action_tool-artboard": "画板工具", "shortcut_action_tool-nest-artboard": "嵌套画板工具", "shortcut_action_tool-auto": "自动工具", "shortcut_action_tool-bone": "骨骼工具", "shortcut_action_tool-joystick": "摇杆工具", "shortcut_action_tool-event": "事件工具", "shortcut_action_tool-zoom": "缩放工具", "shortcut_action_tool-layout": "布局工具", "shortcut_action_tool-layout-row": "行工具", "shortcut_action_tool-layout-column": "列工具", "shortcut_action_wrap-layout": "包裹在布局中", "shortcut_action_dependency-graph": "依赖关系图", "shortcut_action_tool-color-loupe": "颜色选择器", "shortcut_action_cancel": "取消", "shortcut_action_copy": "复制", "shortcut_action_cut": "剪切", "shortcut_action_cycle-hover": "循环悬停的舞台项目", "shortcut_action_copy-styles": "复制样式", "shortcut_action_delete": "删除", "shortcut_action_deselect": "取消选择", "shortcut_action_tool-mesh": "网格工具", "shortcut_action_duplicate": "复制", "shortcut_action_find": "查找", "shortcut_action_revision-force": "强制创建修订版本", "shortcut_action_group": "群组", "shortcut_action_ungroup": "取消群组", "shortcut_action_group-solo": "独奏群组", "shortcut_action_tool-ik": "IK", "shortcut_action_frame-move-prev": "将关键帧后退 1 帧", "shortcut_action_frame-move-next": "将关键帧前进 1 帧", "shortcut_action_frame-move-prev-10": "将关键帧后退 10 帧", "shortcut_action_frame-move-next-10": "将关键帧前进 10 帧", "shortcut_action_multi-select": "多选", "shortcut_action_frame-next-10": "向前跳过 10 帧", "shortcut_action_frame-next": "下一帧", "shortcut_action_frame-next-key": "下一关键帧", "shortcut_action_tool-node": "节点/群组工具", "shortcut_action_pan": "平移", "shortcut_action_paste": "粘贴", "shortcut_action_tool-pose": "姿势", "shortcut_action_frame-prev-10": "向后跳过 10 帧", "shortcut_action_frame-prev": "上一帧", "shortcut_action_frame-prev-key": "上一关键帧", "shortcut_action_redo": "重做", "shortcut_action_tool-rotate": "旋转工具", "shortcut_action_tool-scale": "缩放工具", "shortcut_action_select-all": "全选", "shortcut_action_tool-select-children": "选择子项", "shortcut_action_show-shortcuts": "显示快捷键", "shortcut_action_tool-solo": "独奏工具", "shortcut_action_tool-group-effect": "效果组工具", "shortcut_action_tool-pen": "钢笔工具", "shortcut_action_tool-rectangle": "矩形工具", "shortcut_action_tool-text": "文本工具", "shortcut_action_tool-ellipse": "椭圆工具", "shortcut_action_timeline-end": "将时间轴移到末尾", "shortcut_action_timeline-start": "将时间轴移到开头", "shortcut_action_play": "播放", "shortcut_action_play-default": "播放默认动画", "shortcut_action_tool-translate": "位移工具", "shortcut_action_undo": "撤销", "shortcut_action_tool-weight": "权重工具", "shortcut_action_zoom-100": "缩放到 100%", "shortcut_action_zoom-fit": "缩放到选区", "shortcut_action_zoom-in": "放大", "shortcut_action_zoom-out": "缩小", "shortcut_action_item-1": "选择项目 1", "shortcut_action_item-10": "选择项目 10", "shortcut_action_item-2": "选择项目 2", "shortcut_action_item-3": "选择项目 3", "shortcut_action_item-4": "选择项目 4", "shortcut_action_item-5": "选择项目 5", "shortcut_action_item-6": "选择项目 6", "shortcut_action_item-7": "选择项目 7", "shortcut_action_item-8": "选择项目 8", "shortcut_action_item-9": "选择项目 9", "shortcut_action_key-selected": "关键帧选中项", "shortcut_action_key-bone-length": "关键帧骨骼长度", "shortcut_action_key-rotation": "关键帧旋转", "shortcut_action_key-scale": "关键帧缩放", "shortcut_action_key-translation": "关键帧位移", "shortcut_action_next": "下一个", "shortcut_action_prev": "上一个", "shortcut_action_bump-down": "下移 5px", "shortcut_action_bump-left": "左移 5px", "shortcut_action_bump-right": "右移 5px", "shortcut_action_bump-up": "上移 1px", "shortcut_action_nudge-down": "下移 1px", "shortcut_action_nudge-left": "左移 1px", "shortcut_action_nudge-right": "右移 1px", "shortcut_action_nudge-up": "上移 1px", "shortcut_action_mega-nudge-down": "下移 10px", "shortcut_action_mega-nudge-left": "左移 10px", "shortcut_action_mega-nudge-right": "右移 10px", "shortcut_action_mega-nudge-up": "上移 10px", "shortcut_action_reset-rulers": "重置标尺", "shortcut_action_rulers": "标尺", "shortcut_action_selection-filter-all": "选择过滤器-全部", "shortcut_action_selection-filter-bone": "选择过滤器-骨骼", "shortcut_action_selection-filter-next": "选择过滤器-下一个", "shortcut_action_selection-filter-prev": "选择过滤器-上一个", "shortcut_action_selection-filter-vertex": "选择过滤器-顶点", "shortcut_action_reveal-in-hierarchy": "在层级中显示", "shortcut_action_switch-mode": "切换模式", "shortcut_action_bring-forward": "上移一层", "shortcut_action_send-backward": "下移一层", "shortcut_action_send-to-back": "置于底层", "shortcut_action_send-to-front": "置于顶层", "shortcut_action_pick-parent": "选择父级", "shortcut_action_edit-mode": "选择子项/编辑顶点", "shortcut_action_freeze": "冻结工具", "shortcut_action_disable-snapping": "禁用对齐", "shortcut_action_mouse-wheel-zoom": "鼠标滚轮缩放", "shortcut_action_deep-click": "选择悬停项的子项", "shortcut_action_alternate": "备用", "shortcut_action_symmetric-draw": "对称绘制形状", "shortcut_action_create-from-center": "从中心绘制形状", "shortcut_action_resize-lock-pivot": "从原点约束缩放", "shortcut_action_resize-animation-keys": "调整关键帧选区", "shortcut_action_action": "确认", "shortcut_action_nav-tree-up": "导航树上移", "shortcut_action_nav-tree-down": "导航树下移", "shortcut_action_nav-tree-left": "导航树向外", "shortcut_action_nav-tree-right": "导航树向内", "shortcut_action_action-left": "左移", "shortcut_action_action-right": "右移", "shortcut_action_action-up": "上移", "shortcut_action_action-down": "下移", "shortcut_action_close-tab": "关闭标签页", "shortcut_action_show-actions": "显示操作", "shortcut_action_search": "搜索", "shortcut_action_rename": "重命名", "shortcut_action_align-top": "顶部对齐", "shortcut_action_align-left": "左对齐", "shortcut_action_align-right": "右对齐", "shortcut_action_align-bottom": "底部对齐", "shortcut_action_align-center": "居中对齐", "shortcut_action_align-middle": "垂直居中对齐", "shortcut_action_origin-top": "原点顶部", "shortcut_action_origin-left": "原点左侧", "shortcut_action_origin-right": "原点右侧", "shortcut_action_origin-bottom": "原点底部", "shortcut_action_origin-center": "原点中心", "shortcut_action_origin-middle": "原点中间", "shortcut_action_quit": "退出 Rive", "shortcut_action_guide-lock": "锁定参考线", "shortcut_action_show-hierarchy": "层级选项卡", "shortcut_action_show-assets": "资源面板选项卡", "shortcut_action_show-data": "数据选项卡", "shortcut_action_paste-styles": "粘贴样式", "shortcut_action_duplicate-on-drag": "拖动时复制", "shortcut_action_toggle-expansion": "展开关键帧属性", "shortcut_action_max-timeline": "最大化时间轴", "shortcut_action_animation-up": "上一个动画", "shortcut_action_animation-down": "下一个动画", "shortcut_action_playhead-start": "移动播放头到开头", "shortcut_action_playhead-end": "移动播放头到末尾", "shortcut_action_toggle-shortcuts-panel": "切换快捷键面板", "shortcut_action_key-all-vertices": "关键帧所有顶点", "shortcut_action_make-component": "制作组件", "shortcut_action_remove-component": "移除组件", "shortcut_action_display-bound-values": "预览绑定值", "shortcut_action_help": "帮助工具", "shortcut_action_timeline-transform": "过滤变换属性", "shortcut_action_timeline-position": "过滤位置属性", "shortcut_action_timeline-scale": "过滤缩放属性", "shortcut_action_timeline-rotation": "过滤旋转属性", "shortcut_action_timeline-opacity": "过滤不透明度属性", "shortcut_action_disable-layer": "禁用状态机图层", "about_dialog": "关于 Rive", "licenses_page": "显示许可证", "check_for_updates": "检查更新...", "falloff": "衰减", "from": "起点", "to": "终点", "range": "范围", "clamp": "钳制", "text_range_units": "单位", "text_range_mode": "模式", "text_range_type": "范围类型", "characters": "字符", "charactersExcludingSpaces": "字符(不含空格)", "words": "单词", "lines": "行", "percentage": "百分比", "unitIndex": "索引", "add": "加", "subtract": "减", "min": "最小", "max": "最大", "paragraph_spacing": "段落间距", "line_height": "行高", "letter_spacing": "字母间距", "spacing": "间距", "character_variant": "字符变体", "quantize": "量化", "learn_more": "了解更多。", "learn_more_alt": "了解更多", "confirm_scripts": "确认脚本选择", "export_scripts": "导出脚本", "run": "运行", "all": "全部", "previewing_revision": "正在预览修订版本:", "restore": "恢复", "fetching": "获取中...", "download_revision": "下载修订版本", "tags": "标签", "add_tag": "添加标签", "add_group_effect": "添加效果组", "remove_group_effect": "移除效果组", "create_tag": "创建标签", "remove_tag": "移除标签", "new_tag": "新建标签", "edit_tags": "编辑标签", "collapse_tags": "折叠标签", "reveal_tags": "展开标签", "locked": "已锁定", "lock": "锁定", "unlock": "解锁", "hide": "隐藏", "show": "显示", "filtered": "已过滤", "remove_filters": "移除过滤器", "conditions": "条件", "selected_conditions": "已选条件", "no_conditions": "无条件", "group_transitions": "群组过渡", "ungroup_transitions": "取消群组过渡", "change_transitions_source": "更改源", "change_transitions_target": "更改目标", "transition": "过渡", "transitions_lc": "过渡", "listeners_lc": "监听器", "no_inputs": "在输入面板中创建输入以用作条件", "new_input": "新建输入", "new_scripted_condition": "新建脚本条件", "event_occurrence": "于", "atEnter": "进入", "atExit": "退出", "minimize_condition_fields": "最小化字段", "expand_condition_fields": "展开字段", "resizable_panel": "可调整大小的面板", "pin_panel": "固定面板", "no_transition_selection": "选择过渡或监听器以查看条件和操作", "pro": "Voyager", "team": "团队", "cadet": "Cadet", "voyager": "Voyager", "enterprise": "企业版", "student": "学生", "free_subtitle": "", "cadet_subtitle": "最多 3 席位", "voyager_subtitle": "最多 25 席位", "enterprise_subtitle": "年收入 $10M+", "upload_rev_title": "从文件浏览器上传 .rev 文件", "upload_rev_caption": "选择 Rive 标签页打开文件浏览器以上传 .rev 备份文件", "upload_riv_title": "从文件浏览器上传 .riv 文件", "upload_riv_caption": "选择 Rive 标签页打开文件浏览器以上传 .riv 文件", "team-joined-caption-unknown-team": "您已加入团队。", "team-joined-caption": "您已加入 ", "team-joined-title": "已加入团队", "sounds": "声音", "soundly": "Soundly", "browse_sounds": "浏览声音", "data": "数据", "bind": "绑定", "model": "模型", "view_model": "视图模型", "view_model_abbreviated": "视图模型", "view_model_type": "视图模型", "view_model_instance": "实例", "instances": "实例", "path": "路径", "default_instance": "默认实例", "selected_properties": "已选属性", "create_view_model": "创建视图模型", "bind_view_model": "绑定视图模型", "select_view_model": "选择视图模型", "bind_instance": "绑定实例", "add_list_item": "添加列表项", "list_item": "列表项", "mixed": "混合", "preview_bound_values": "预览绑定值", "data_context": "数据上下文", "data_context_select": "选择数据上下文", "view_models": "视图模型", "enum": "枚举", "enums": "枚举", "create_enum": "创建枚举", "select_enum": "选择枚举", "enum_split_key_values": "分别编辑键和值", "view_models_string": "字符串", "view_models_boolean": "布尔值", "view_models_number": "数值", "view_models_enum": "枚举", "view_models_list": "列表", "view_models_color": "颜色", "view_models_trigger": "触发器", "view_models_list_attr": "列表属性", "view_models_list_attr_index": "索引", "view_models_list_attr_vertexX": "顶点 X", "view_models_list_attr_vertexY": "顶点 Y", "view_models_list_attr_cubic_inX": "三次入 X", "view_models_list_attr_cubic_inY": "三次入 Y", "view_models_list_attr_cubic_outX": "三次出 X", "view_models_list_attr_cubic_outY": "三次出 Y", "view_models_list_attr_cubic_distance": "距离", "view_models_list_attr_cubic_in_distance": "入距离", "view_models_list_attr_cubic_out_distance": "出距离", "view_models_list_attr_cubic_rotation": "旋转", "view_models_list_attr_cubic_in_rotation": "入旋转", "view_models_list_attr_cubic_out_rotation": "出旋转", "view_models_list_attr_text_content": "文本内容", "view_models_list_attr_text_style": "文本样式", "view_models_list_attr_index_no_edit": "列表索引值无法编辑", "view_models_symbols": "符号", "view_models_symbol_list_index": "列表索引", "view_models_image": "图片", "view_models_artboard": "画板", "view_models_edit_list_instance": "编辑实例", "view_models_enum_value": "枚举值", "view_models_list_item_linked_artboard": "使用链接到视图模型的画板", "view_model_instances_of": "实例", "view_model_instance_of": "实例", "validation_empty_name": "名称不能为空", "validation_starts_with_number": "标识符不能以数字开头", "validation_invalid_characters": "标识符只能包含字母、数字和下划线", "validation_reserved_keyword": "'{0}", "validation_viewmodel_not_pascalcase": "视图模型应使用 PascalCase(例如 MyViewModel)", "validation_property_not_camelcase": "属性应使用 camelCase(例如 myProperty)", "validation_enum_not_pascalcase": "枚举应使用 PascalCase(例如 MyEnum)", "validation_duplicate_name": "'重复名称:另一个视图模型或枚举已使用 {0}", "validation_duplicate_property_name": "'重复属性名称:{0}", "data_bind": "数据绑定", "data_bind_empty": "数据绑定", "data_bind_auto": "自动绑定", "data_bind_update": "更新绑定", "data_bind_unbind": "解除绑定", "db_err_no_find_artboard": "找不到适用的画板", "db_err_no_resove_params": "无法解析绑定参数", "db_err_no_data_type": "无法解析数据类型", "db_err_too_many_viewmodels": "无法为多个视图模型创建属性", "db_err_invalid_property": "无效属性", "converter": "转换器", "data_converters": "转换器", "converter_group": "转换器组", "converter_blank": "空白", "converter_existing": "现有", "missing_converter": "未分配转换器", "invalid_converter": "转换器包含错误", "round_number": "舍入数值", "data_converter_round_decimals": "小数位数", "data_converter_pad_length": "填充长度", "data_converter_pad_text": "填充文本", "data_converter_to_string_round_decimals": "舍入小数", "data_converter_to_string_trailing_zeros": "移除尾随零", "data_converter_to_string_color_format": "格式", "to_string_from_number": "从数值", "to_string_from_color": "从颜色", "color_format_red": "红", "color_format_green": "绿", "color_format_blue": "蓝", "color_format_alpha": "透明度", "color_format_hue": "色相", "color_format_saturation": "饱和度", "color_format_luminance": "亮度", "color_format_hex": "十六进制", "color_format_255": "0-255", "trim": "修剪", "image": "图片", "pad_direction": "方向", "data_converter_operation_number": "值", "data_converter_range_mapper_min_input": "输入下限", "data_converter_range_mapper_max_input": "输入上限", "data_converter_range_mapper_min_output": "输出下限", "data_converter_range_mapper_max_output": "输出上限", "data_converter_range_mapper_clamp_lower": "钳制下限", "data_converter_range_mapper_clamp_upper": "钳制上限", "data_converter_range_mapper_modulo": "取模", "data_converter_range_mapper_reverse": "反转", "data_converter_operation_operation": "运算", "data_converter_formula_valueMispreceded": "", "data_converter_formula_groupUnclosed": "缺少右括号", "data_converter_formula_groupUnopened": "缺少左括号", "data_converter_formula_groupMispreceded": "", "data_converter_formula_operationAtEnd": "公式不能以运算符结尾", "data_converter_formula_groupEmpty": "缺少参数", "data_converter_formula_formulaEmpty": "公式为空", "random_mode": "随机模式", "random_mode.once": "一次", "random_mode.always": "始终", "random_mode.sourceChange": "源变化", "formula_token_parantheses": "括号", "formula_token_argument_separator": "逗号", "formula_token_general": "常规", "formula_token_function": "函数", "close_paren": "右括号", "open_paren": "左括号", "reset_formula_title": "重置公式?", "reset_formula_caption": "确定要清除所有公式参数吗?", "formula_reset": "重置", "one_way": "单向", "one_way_to_source": "单向到源", "two_way": "双向", "bidirectional": "双向", "bidirectional-tts": "双向(优先目标值)", "bidirectional-stt": "双向(优先源值)", "bind_once": "绑定一次", "bind_relative": "相对绑定", "target_to_source": "目标到源", "done_data_bind": "完成", "cancel_data_bind": "取消", "bind_color": "绑定颜色", "update_bind_color": "更新绑定颜色", "unbind_color": "解除绑定颜色", "bind_stroke": "绑定描边", "update_bind_stroke": "更新绑定描边", "unbind_stroke": "解除绑定描边", "remove_binding": "移除绑定", "source": "源", "property": "属性", "add_converter": "添加转换器", "select_property": "选择属性", "property_group": "属性组", "property_groups": "属性组", "match_source_view_model": "匹配源视图模型", "computed_transform": "计算变换", "artboard_pos": "画板", "world_pos": "世界", "local_pos": "本地", "dependencies": "依赖项", "show_dependencies": "显示依赖项", "hide_dependencies": "隐藏依赖项", "show_parent_child": "显示父/子关系", "show_draw_order": "显示绘制顺序", "show_constraints": "显示约束", "show_bones": "显示骨骼", "show_clips": "显示裁剪", "show_binds": "显示数据绑定", "replace_with": "替换", "paste_with_timelines_title": "粘贴时间轴", "select_all": "全选", "merge_by": "合并方式", "dont_merge": "不合并", "paste_without_animations": "不带时间轴粘贴", "nested_artboard_mode": "模式", "nested_artboard_mode.node": "节点", "nested_artboard_mode.leaf": "叶节点", "nested_artboard_mode.layout": "布局", "nested_artboard_change_title": "确定吗?", "nested_artboard_change_caption": "您将丢失添加到此嵌套画板的所有动画和状态机", "nested_artboard_change_confirm_label": "是", "nested_artboard_align_position": "对齐位置", "clear_file_state_title": "清除缓存的文件状态", "clear_file_state_desc": "这将移除文件的所有本地缓存状态,如选中的画板和动画。确定要清除此状态吗?", "clear_file_state_button": "清除文件状态", "n_slice": "N宫格", "wrap_in_n_slice": "N宫格选中项", "convert_to_n_slice": "转换为 N宫格", "remove_n_slice": "移除 N宫格", "create_n_slice": "应用 N宫格", "edit_n_slice": "编辑 N宫格", "initial_size": "初始尺寸", "convert_to_nsliced_node_error": "添加 N宫格失败", "x_axes": "X 轴", "y_axes": "Y 轴", "slice_tiles": "切片", "slice_tile": "切片", "axis": "轴", "deform": "变形", "will_delete_mesh_title": "移除网格?", "will_delete_mesh_caption": "应用 N宫格将替换当前网格。要继续吗?", "will_delete_nslice_title": "移除 N宫格?", "will_delete_nslice_caption": "应用网格将替换当前 N宫格。要继续吗?", "editing_nslice": "正在编辑 N宫格", "scroll_options": "滚动约束", "scroll_bar_options": "滚动条约束", "scroll_direction": "方向", "scroll_direction_horizontal": "水平", "scroll_direction_vertical": "垂直", "scroll_direction_all": "全部", "scroll_constraint": "滚动", "scroll_thumb_constraint": "滚动条滑块", "scroll_content": "滚动内容", "scroll_content_short": "内容", "scroll_physics": "物理", "scroll_index": "滚动索引", "scrollindex": "滚动索引", "scroll_percent_x": "", "scrollpercentx": "", "scroll_percent_y": "", "scrollpercenty": "", "scroll_physics_elastic": "弹性", "scroll_physics_clamped": "钳制", "friction": "摩擦力", "speed_multiplier": "速度倍数", "elastic_factor": "弹性因子", "snap": "吸附", "auto_size": "自动尺寸", "invalid_scroll_target": "目标需要内容滚动约束", "invalid_target": "无效目标", "disclaimer_title": "风险自负 \\ud83d\\udea7", "disclaimer_caption": "抢先体验是魔法(以及偶尔的混乱)发生的地方。功能仍在演进中,可能会出现问题、更改或意外行为。如果您正在尝试,那很好!但可能不要将这些用于关键任务图形。", "disclaimer_cta": "我喜欢冒险", "no_access_title": "解锁抢先体验", "no_access_caption": "想在全世界之前尝试 Rive 的最新实验吗?抢先体验包含在 Cadet、Voyager 和企业版计划中。\n立即升级并开始破坏东西(以好的方式)。", "no_access_workspace_title": "升级此工作区以获取抢先体验", "no_access_workspace_caption": "抢先体验包含在 Cadet、Voyager 和企业版计划中。选择其他工作区或升级此工作区以开始破坏东西(以好的方式)。", "no_access_cta": "升级并体验", "early_access_banner": "您正在使用抢先体验版。期待令人兴奋的新功能、一些惊喜,以及文件在生产环境中的不同表现。", "signup_for_updates": "注册获取更新", "sign_in_with_another_account": "使用其他账户登录", "export_warning_title": "注意,您正在使用抢先体验版 \\ud83d\\udea7", "export_warning_caption": "您正在从抢先体验版导出。未发布的功能仍在演进中,您的导出可能会出现问题、更改或意外行为。", "artboard_list": "画板列表", "artboard_list_map_rules": "视图模型映射", "list_source": "源", "virtualize": "虚拟化", "infinite_scroll": "轮播", "virtualize_required_for_carousel": "轮播需要虚拟化", "list_required_for_virtualize": "添加列表以启用虚拟化", "list_required_for_carousel": "添加列表以启用轮播", "update_library_components_wizard_header": "更新库组件:", "library_wizard_update": "更新", "library_wizard_component_type": "组件", "library_wizard_component_name": "名称", "library_wizard_current_version": "当前", "library_wizard_latest_version": "最新", "library_wizard_update_button_label": "更新选中", "detach_from_library": "分离", "library_sync_instances": "同步实例", "library_options": "库选项", "update_library": "更新库", "refresh": "刷新", "add_to_file": "添加到文件", "add_to_artboard": "", "library_panel_publish_update": "发布更新", "library_publish_panel_title": "发布库", "library_panel_title": "发布这些组件:", "api_error_library_load_failed": "加载可用库失败", "api_error_library_create_failed": "创建库失败 - 请稍后重试。", "api_error_library_publish_failed": "发布库更新失败 - 请稍后重试。", "node_script": "节点", "layout_script": "布局", "no_rive_renderer": "此设备不支持 Rive 渲染器。", "split_left": "左侧分割", "split_right": "右侧分割", "split_up": "上方分割", "split_down": "下方分割", "close": "关闭", "stage": "舞台", "search_files": "搜索文件", "search_in_file": "搜索画板、组件、对象...", "search_in_artboard": "搜索动画", "find_in_files": "在文件中查找", "create_script_named": "创建脚本:", "search_scripts": "搜索脚本...", "agent": "智能体", "agent_panel": "智能体面板", "agent_panel_close": "关闭智能体板", "open_in_viewport": "在视口中打开", "debug_panel": "调试面板", "debug_panel_close": "关闭调试面板", "toggle_display_mode": "切换演示模式", "collapse_code_editor": "折叠代码编辑器", "new_split": "新建标签页", "new_chat": "新对话", "split_editor_right": "右侧分割编辑器", "split_editor_down": "下方分割编辑器", "panel_options": "面板选项", "copy_console": "复制控制台", "clear_console": "清除控制台", "clear_console_on_play": "播放时清除控制台", "close_chat": "关闭对话", "clear_all_chats": "清除所有对话", "close_other_chats": "关闭其他对话", "loading_chats": "加载对话中...", "tool_status_failed": "失败", "tool_status_success": "成功", "tool_status_running": "运行中...", "tool_status_interrupted": "已中断", "tool_operation_unknown": "未知操作", "tool_operation_viewing_file": "查看文件", "tool_operation_creating_file": "创建文件", "tool_operation_replacing_text": "替换文本", "tool_operation_inserting_text": "插入文本", "tool_operation_editing_file": "编辑文件", "add_to_active_artboard": "", "generate_converter_from_script": "从脚本生成转换器", "generate_path_effect_from_script": "从脚本生成路径效果", "run_test": "运行测试", "run_test_group": "运行测试组", "run_all_tests": "运行所有测试", "close_tab": "关闭活动标签页", "close_other_tabs": "关闭其他标签页", "close_all_tabs": "关闭所有标签页", "close_pane": "关闭窗格", "delete_scripts_q": "删除脚本?", "revert_script_caption": "此脚本正被画板上的对象使用。确定要移除吗?", "revert_script_caption_alt": "某个脚本正被画板上的对象使用。确定要移除吗?", "script_name": "名称", "namespace": "命名空间", "agent_demo_prompt_1": "制作一个包含 10 个项目的游戏菜单", "agent_demo_prompt_2": "绘制一个可配置的 3D 正多面体", "agent_demo_prompt_3": "使用布局创建音乐播放器 UI", "agent_demo_prompt_4": "使用布局制作无限滚动菜单", "agent_demo_prompt_5": "使用组件创建粒子系统", "agent_demo_prompt_6": "使用布局和文本制作血条", "agent_demo_prompt_7": "给我的角色添加物理属性", "agent_demo_prompt_8": "将组件排列成可配置的网格", "agent_demo_headline": "使用 AI 编写代码、设计和动画", "agent_demo_headline2": "使用 AI 编写代码、\n设计和动画", "agent_demo_description": "Rive 的 AI 智能体帮助您编写代码、设计和动画。生成脚本、响应式布局、数据模型,甚至动画关键帧。", "agent_demo_secondary_button": "了解更多", "agent_demo_primary_button": "升级", "agent_empty_headline": "您想构建什么?", "diff_accept_all": "接受所有更改", "diff_reject_all": "拒绝所有更改" }; // 2. [赋值字典] const ASSIGN_DICT = { "Blank": "空白", "Test": "测试", "Path Effect": "路径效果", "Listener Action": "监听动作", "Transition Condition": "过渡条件", "stage": "画板", }; // 3. [属性/数组字典] 针对数组内变量翻译 q,"文本" const VALUE_DICT = { "cornerRadiusBL": "左下圆角", "cornerRadiusBR": "右下圆角", "cornerRadius": "圆角半径", "distance_options": "距离选项", "paste_animations_title": "粘贴动画", "paste_animations_list_title": "粘贴动画列表", "remove": "移除", "convert": "转换", "delete_stage_items_caption": "删除舞台项目", "delete_data_folder_contents_caption": "删除数据文件夹内容", "create_data_bind_confirm": "创建数据绑定", "show_range_values": "显示范围值", "input_field_horizontal_drag": "输入框水平拖拽", "min_width": "最小宽度", "sized_by_children": "子元素自适应", "cornerradiusbl": "左下圆角", "cornerradiusbr": "右下圆角", "displayvalue": "显示值", "flexgrow": "弹性增长", "team_suspended_admin_modal_description": "团队已暂停,请联系管理员", "free_plan_welcome_alert_header": "欢迎使用免费计划", "cannot_cut": "无法剪切", "previous": "上一个", "payment_action": "付款", "projects_require_admin_title": "项目需要管理员权限", "shortcuts": "快捷键", "Format With Commas": "逗号格式化", "Ungrouped argument separators": "未分组参数分隔符", "Too many arguments": "参数过多", "Missing values": "缺少数值", "Arguments cannot be empty": "参数不能为空", "Missing preceding value": "缺少前置值", "Invalid arguments": "无效参数", "data_converter_formula_operationAtEnd": "公式操作在末尾", "scrollpercentx": "水平滚动百分比", "scroll_percent_y": "垂直滚动百分比", "scrollpercenty": "垂直滚动百分比", "scroll_physics_elastic": "弹性滚动", "library_panel_publish_update": "发布更新", "generate_converter_from_script": "从脚本生成转换器", }; // 4. [函数参数字典] 针对 k.m("文本") const FUNC_PARAM_DICT = { "Convert Inputs to ViewModels": "将输入转换为视图模型", "Recents": "最近文件", "Upgrade": "升级", "UPGRADE": "升级", "Personal Files": "个人文件", "design": "设计", "animate": "动画", "Artboard": "画板", "Create Component": "创建组件", "No properties yet": "无属性", "Property Group": "属性组", }; // 5. [网络请求字典](只改 JSON 里的 title/name/caption 值) const API_TEXT_DICT = { "Shared Project": "共享项目", "Untitled": "未命名", "Marketplace Examples": "市场范例", "Learn Rive": "学习 Rive", "Quickstart Tutorial": "快速入门教程", "Get started with a range of features throughout Rive as we create an interactive menu": "通过创建交互式菜单,系统掌握 Rive 的核心功能特性", "Scripting": "脚本编程", "Scripting lets you iterate on code, design, and animation in one collaborative editor.": "在统一的协作式编辑器中,高效迭代代码、设计与动画内容。", "Responsive Layouts": "响应式布局", "Create responsive designs with fine-tuned control over what participates in the layouts system.": "精细控制参与布局系统的元素,实现精准的响应式设计。", "Data Binding": "数据绑定", "A powerful way to create reactive connections between editor elements, data, and code.": "在编辑器元素、数据源与代码之间建立响应式关联的强大机制。", "Vector Feathering": "矢量羽化", "Soften the edge of vector paths without the typical performance impact.": "在无损性能的前提下,柔化矢量路径的边缘效果。", "Design Mode vs. Animate Mode": "设计模式与动画模式", "Get to know the Rive features not typically found in other design tools.": "深入了解 Rive 独有的、区别于传统设计工具的核心工作流。", "State Machine": "状态机", "Build interactive animations that are ready to run with Rive's State Machine.": "借助 Rive 状态机,构建可直接部署的交互式动画逻辑。", "Animation mixing": "动画混合", "Build layered interactions that look complex, but are simple under the hood.": "通过分层混合技术,实现视觉复杂但结构简洁的交互动效。", "Events": "事件系统", "Explore a game-changing feature that enhances communication between designers and developers.": "探索这一变革性功能,显著提升设计师与开发者之间的协作效率。", "Run anywhere": "全平台运行", "Load and control your animations in apps, games, and websites with the open-source libraries of Rive's runtimes.": "依托 Rive 运行时的开源库,轻松将动画集成至应用程序、游戏及网站中,并实现精准控制。", }; const log = (...a) => CONFIG.DEBUG && console.log('[Rive汉化]', ...a); const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const escapeJSString = (s) => String(s) .replaceAll('\\', '\\\\') .replaceAll('"', '\\"') .replaceAll('\n', '\\n') .replaceAll('\r', '\\r') .replaceAll('\t', '\\t'); const fnv1a = (s) => { let h = 0x811c9dc5; for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 0x01000193); } return (h >>> 0).toString(36); }; const stableStringify = (value) => { const seen = new WeakSet(); const walk = (v) => { if (v && typeof v === 'object') { if (seen.has(v)) return '"[Circular]"'; seen.add(v); if (Array.isArray(v)) return `[${v.map(walk).join(',')}]`; const keys = Object.keys(v).toSorted(); return `{${keys.map((k) => `${JSON.stringify(k)}:${walk(v[k])}`).join(',')}}`; } return JSON.stringify(v); }; return walk(value); }; const PATCH_SIG = fnv1a( stableStringify({ DICT, ASSIGN_DICT, VALUE_DICT, FUNC_PARAM_DICT, API_TEXT_DICT }) ); const nowMs = () => Date.now(); const ttlMs = CONFIG.CACHE_TTL_DAYS * 24 * 60 * 60 * 1000; const wrapCache = (v) => ({ t: nowMs(), v }); const unwrapCache = (x) => (x && typeof x === 'object' && 'v' in x ? x.v : x); const cacheTime = (x) => (x && typeof x === 'object' && 't' in x ? x.t : 0); const isFresh = (x) => { if (!ttlMs) return true; const t = cacheTime(x); if (!t) return true; return nowMs() - t <= ttlMs; }; // IndexedDB const DB = (() => { let dbp; const open = () => { if (dbp) return dbp; dbp = new Promise((resolve, reject) => { const req = indexedDB.open(CONFIG.DB_NAME, CONFIG.DB_VERSION); req.onupgradeneeded = (e) => { const db = e.target.result; if (!db.objectStoreNames.contains(CONFIG.STORE_NAME)) db.createObjectStore(CONFIG.STORE_NAME); }; req.onsuccess = (e) => { const db = e.target.result; db.onversionchange = () => { try { db.close(); } catch { } }; resolve(db); }; req.onerror = () => reject(req.error); }); return dbp; }; const get = async (key) => { try { const db = await open(); return await new Promise((resolve) => { const tx = db.transaction(CONFIG.STORE_NAME, 'readonly'); const req = tx.objectStore(CONFIG.STORE_NAME).get(key); req.onsuccess = () => resolve(req.result ?? null); req.onerror = () => resolve(null); }); } catch { return null; } }; const set = async (key, value) => { const db = await open(); return await new Promise((resolve, reject) => { const tx = db.transaction(CONFIG.STORE_NAME, 'readwrite'); tx.objectStore(CONFIG.STORE_NAME).put(value, key); tx.oncomplete = () => resolve(true); tx.onerror = () => reject(tx.error); }); }; const del = async (key) => { try { const db = await open(); return await new Promise((resolve) => { const tx = db.transaction(CONFIG.STORE_NAME, 'readwrite'); tx.objectStore(CONFIG.STORE_NAME).delete(key); tx.oncomplete = () => resolve(true); tx.onerror = () => resolve(false); }); } catch { return false; } }; const clear = async () => { try { const db = await open(); return await new Promise((resolve) => { const tx = db.transaction(CONFIG.STORE_NAME, 'readwrite'); tx.objectStore(CONFIG.STORE_NAME).clear(); tx.oncomplete = () => resolve(true); tx.onerror = () => resolve(false); }); } catch { return false; } }; return { open, get, set, delete: del, clear }; })(); // LoaderUI const LoaderUI = (() => { let host, shadow, overlayEl, progressFill, statusEl, detailEl, stepsEl, actionsEl, tShown = 0; let statusColorMode = 'normal'; const steps = new Map(); const css = ` :host{all:initial} .ov{ position:fixed; inset:0; z-index:2147483647; display:flex; align-items:center; justify-content:center; background: radial-gradient(1200px 700px at 15% 15%, rgba(59,130,246,.18), transparent 62%), radial-gradient(900px 600px at 85% 25%, rgba(139,92,246,.18), transparent 66%), linear-gradient(180deg, #0a0d14, #07080d); color:#fff; font-family:ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji"; transition:opacity .22s ease; } .card{ width:min(580px, calc(100vw - 48px)); border-radius:22px; padding:22px 22px 18px; background:linear-gradient(180deg, rgba(255,255,255,.09), rgba(255,255,255,.04)); border:1px solid rgba(255,255,255,.10); box-shadow:0 32px 90px rgba(0,0,0,.58), 0 0 0 1px rgba(255,255,255,.06) inset; backdrop-filter: blur(18px); } .top{display:flex; align-items:center; gap:12px; margin-bottom:14px} .badge{ width:42px; height:42px; border-radius:14px; background:linear-gradient(135deg, rgba(59,130,246,.95), rgba(139,92,246,.95)); box-shadow:0 16px 46px rgba(59,130,246,.18); position:relative; overflow:hidden; } .badge:before{ content:""; position:absolute; inset:1px; border-radius:13px; background: radial-gradient(circle at 30% 20%, rgba(255,255,255,.38), transparent 56%), rgba(0,0,0,.08); } .title{font-weight:800; letter-spacing:.2px; font-size:18px; line-height:1.1} .sub{margin-top:3px; font-size:12px; color:rgba(255,255,255,.56)} .bar{ margin-top:8px; width:100%; height:9px; border-radius:999px; background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.08); overflow:hidden; } .fill{ height:100%; width:0%; border-radius:999px; background:linear-gradient(90deg, rgba(59,130,246,.95), rgba(139,92,246,.95)); box-shadow:0 0 0 1px rgba(255,255,255,.07) inset, 0 12px 28px rgba(59,130,246,.14); transition:width .18s ease; } .status{margin-top:14px; font-size:14px; color:rgba(255,255,255,.92); min-height:20px} .detail{margin-top:6px; font-size:12px; color:rgba(255,255,255,.56); min-height:16px} .steps{margin-top:12px; min-height:36px} .chips{display:flex; flex-wrap:wrap; gap:8px; margin-top:6px} .chip{ display:inline-flex; align-items:center; gap:8px; padding:6px 10px; border-radius:999px; font-size:12px; letter-spacing:.2px; border:1px solid rgba(255,255,255,.10); } .dot{width:8px; height:8px; border-radius:50%} .actions{margin-top:16px; display:flex; gap:10px; justify-content:flex-end; min-height:44px} button{ appearance:none; border:1px solid rgba(255,255,255,.10); border-radius:12px; padding:10px 14px; font-size:14px; cursor:pointer; user-select:none; transition:transform .08s ease, filter .15s ease, background .15s ease; } button:active{transform:scale(.98)} button:hover{filter:brightness(1.06)} .p{ background:linear-gradient(135deg, rgba(59,130,246,.95), rgba(139,92,246,.95)); color:#fff; box-shadow:0 12px 34px rgba(0,0,0,.35), 0 0 0 1px rgba(255,255,255,.06) inset; } .s{ background:rgba(255,255,255,.06); color:rgba(255,255,255,.92); backdrop-filter: blur(10px); box-shadow:0 12px 34px rgba(0,0,0,.24); } .err{color:rgba(239,68,68,.96)} `; const fmtBytes = (n) => { if (!Number.isFinite(n) || n <= 0) return ''; const u = ['B', 'KB', 'MB', 'GB']; let i = 0; let v = n; while (v >= 1024 && i < u.length - 1) { v /= 1024; i++; } const d = i === 0 ? 0 : i === 1 ? 0 : 1; return `${v.toFixed(d)}${u[i]}`; }; const ensure = () => { if (host) return; host = document.createElement('div'); shadow = host.attachShadow({ mode: 'closed' }); const style = document.createElement('style'); style.textContent = css; overlayEl = document.createElement('div'); overlayEl.className = 'ov'; overlayEl.setAttribute('role', 'status'); overlayEl.setAttribute('aria-live', 'polite'); const card = document.createElement('div'); card.className = 'card'; const top = document.createElement('div'); top.className = 'top'; const badge = document.createElement('div'); badge.className = 'badge'; const titleWrap = document.createElement('div'); const title = document.createElement('div'); title.className = 'title'; title.textContent = 'Rive 汉化 · 一身惆怅'; const sub = document.createElement('div'); sub.className = 'sub'; sub.textContent = '读得懂的温度,看得见的美感'; titleWrap.append(title, sub); top.append(badge, titleWrap); const bar = document.createElement('div'); bar.className = 'bar'; progressFill = document.createElement('div'); progressFill.className = 'fill'; bar.append(progressFill); statusEl = document.createElement('div'); statusEl.className = 'status'; detailEl = document.createElement('div'); detailEl.className = 'detail'; stepsEl = document.createElement('div'); stepsEl.className = 'steps'; actionsEl = document.createElement('div'); actionsEl.className = 'actions'; card.append(top, bar, statusEl, detailEl, stepsEl, actionsEl); overlayEl.append(card); shadow.append(style, overlayEl); document.documentElement.append(host); renderSteps(); setProgress(0); setStatus('准备中…', ''); }; const renderSteps = () => { if (!stepsEl) return; stepsEl.innerHTML = ''; const wrap = document.createElement('div'); wrap.className = 'chips'; for (const [name, state] of steps.entries()) { const chip = document.createElement('div'); chip.className = 'chip'; const dot = document.createElement('div'); dot.className = 'dot'; const isDone = state === 'done'; const isActive = state === 'active'; chip.style.background = isActive ? 'rgba(59,130,246,.16)' : isDone ? 'rgba(255,255,255,.06)' : 'rgba(255,255,255,.04)'; chip.style.color = isDone ? 'rgba(255,255,255,.70)' : 'rgba(255,255,255,.88)'; dot.style.background = isDone ? 'rgba(34,197,94,.92)' : isActive ? 'rgba(59,130,246,.95)' : 'rgba(255,255,255,.25)'; const txt = document.createElement('div'); txt.textContent = isDone ? `✓ ${name}` : name; chip.append(dot, txt); wrap.append(chip); } stepsEl.append(wrap); }; const show = () => { ensure(); overlayEl.style.opacity = '1'; statusEl.classList.toggle('err', false); statusColorMode = 'normal'; tShown = nowMs(); }; const hide = async () => { if (!overlayEl) return; const dt = nowMs() - tShown; if (dt < CONFIG.UI_MIN_SHOW_MS) await new Promise((r) => setTimeout(r, CONFIG.UI_MIN_SHOW_MS - dt)); overlayEl.style.opacity = '0'; await new Promise((r) => setTimeout(r, 240)); try { host?.remove(); } catch { } host = shadow = overlayEl = progressFill = statusEl = detailEl = stepsEl = actionsEl = null; steps.clear(); }; const setProgress = (pct) => { if (!progressFill) return; const v = Math.min(100, Math.max(0, pct)); progressFill.style.width = `${v}%`; }; const setStatus = (msg, detail = '') => { if (statusEl) statusEl.textContent = msg || ''; if (detailEl) detailEl.textContent = detail || ''; }; const setStep = (name, done = false) => { for (const [k, v] of steps.entries()) { if (v === 'active' && k !== name) steps.set(k, 'pending'); } steps.set(name, done ? 'done' : 'active'); renderSteps(); }; const setActions = (arr) => { if (!actionsEl) return; actionsEl.innerHTML = ''; if (!arr?.length) return; for (const it of arr) { const btn = document.createElement('button'); btn.type = 'button'; btn.className = it.kind === 'secondary' ? 's' : 'p'; btn.textContent = it.text; btn.onclick = it.onClick; actionsEl.append(btn); } }; const error = (msg) => { if (statusEl) statusEl.classList.add('err'); statusColorMode = 'error'; setStatus(`❌ ${msg}`, '你可以切换到原版,或清除缓存后重试'); setActions([ { text: '加载原版', kind: 'primary', onClick: () => { sessionStorage.setItem('rcn_fallback', '1'); location.reload(); } }, { text: '清缓存并重试', kind: 'secondary', onClick: async () => { try { await DB.clear(); } catch { } location.reload(); } } ]); }; const progressFromNetwork = (loaded, total, fromPct, toPct) => { if (!Number.isFinite(loaded) || loaded <= 0) return; if (!Number.isFinite(total) || total <= 0) return; const r = Math.min(1, Math.max(0, loaded / total)); setProgress(fromPct + (toPct - fromPct) * r); setStatus('下载中…', `${fmtBytes(loaded)} / ${fmtBytes(total)}`); }; return { show, hide, setProgress, setStatus, setStep, setActions, error, progressFromNetwork }; })(); const gmRequest = ({ url, method = 'GET', responseType = 'text', timeout = CONFIG.REQUEST_TIMEOUT_MS, headers, onProgress }) => new Promise((resolve, reject) => { GM_xmlhttpRequest({ method, url, responseType, timeout, headers, onload: (res) => { if (res.status >= 200 && res.status < 300) resolve(res); else reject(new Error(`HTTP ${res.status}`)); }, onerror: () => reject(new Error('网络错误')), ontimeout: () => reject(new Error('请求超时')), onprogress: (e) => { if (onProgress && e) onProgress(e.loaded ?? 0, e.total ?? 0); } }); }); const API_URL_HITS = ['/api/me?withTeamsV2=true', '/api/browser/home?itemCount', '/api/files/recents']; const API_FIELDS = new Set(['title', 'name', 'caption']); const translateApiText = (s) => (typeof s === 'string' && API_TEXT_DICT[s] ? API_TEXT_DICT[s] : s); const patchApiResponseJson = (data) => { if (!data || typeof data !== 'object') return data; const stack = [data]; while (stack.length) { const cur = stack.pop(); if (!cur) continue; if (Array.isArray(cur)) { for (const v of cur) if (v && typeof v === 'object') stack.push(v); continue; } for (const k of Object.keys(cur)) { const v = cur[k]; if (API_FIELDS.has(k) && typeof v === 'string') { const t = translateApiText(v); if (t !== v) cur[k] = t; } if (v && typeof v === 'object') stack.push(v); } } return data; }; const buildEscMap = (obj) => { const out = Object.create(null); for (const [k, v] of Object.entries(obj ?? {})) out[k] = escapeJSString(v); return out; }; const buildAlt = (obj) => { const keys = Object.keys(obj); if (!keys.length) return ''; return keys.toSorted((a, b) => b.length - a.length).map(escapeRegExp).join('|'); }; const DICT_ESC = buildEscMap(DICT); const DICT_ALT = buildAlt(DICT_ESC); const DICT_TABLE_RE = DICT_ALT ? new RegExp(`"(${DICT_ALT})","([^"]*)"`, 'g') : null; const ASSIGN_ESC = buildEscMap(ASSIGN_DICT); const ASSIGN_ALT = buildAlt(ASSIGN_ESC); const ASSIGN_QUOTED_TEST_RE = ASSIGN_ALT ? new RegExp(`"(${ASSIGN_ALT})"`) : null; const GLOBAL_ENTRIES = { ...(VALUE_DICT ?? {}), ...(FUNC_PARAM_DICT ?? {}) }; const GLOBAL_ESC = buildEscMap(GLOBAL_ENTRIES); const GLOBAL_ALT = buildAlt(GLOBAL_ESC); const GLOBAL_TEST_RE = GLOBAL_ALT ? new RegExp(`"(${GLOBAL_ALT})"`) : null; const HAS_ASSIGN = !!ASSIGN_ALT; const HAS_GLOBAL = !!GLOBAL_ALT; const MASTER_RE = HAS_ASSIGN || HAS_GLOBAL ? new RegExp( [ HAS_ASSIGN ? `((?:\\b(?:var|let|const)\\s+[\\w$]+\\s*=\\s*)|(?:^|[^=!<>])\\s*=\\s*|(?:===|!==|==|!=)\\s*)"(${ASSIGN_ALT})"` : null, HAS_ASSIGN ? `"(${ASSIGN_ALT})"(\\s*(?:===|!==|==|!=))` : null, HAS_GLOBAL ? `"(${GLOBAL_ALT})"` : null ] .filter(Boolean) .join('|'), 'g' ) : null; // Patch 核心 const Marker = '"loading_rive","LOADING RIVE"'; const applyDictPairs = (str) => { if (!DICT_TABLE_RE) return str; return str.replace(DICT_TABLE_RE, (m, key) => `"${key}","${DICT_ESC[key]}"`); }; const applyMasterLiterals = (code) => { if (!MASTER_RE) return code; const assignHit = ASSIGN_QUOTED_TEST_RE ? ASSIGN_QUOTED_TEST_RE.test(code) : false; const globalHit = GLOBAL_TEST_RE ? GLOBAL_TEST_RE.test(code) : false; if (!assignHit && !globalHit) return code; const t0 = performance.now(); const out = code.replace(MASTER_RE, (m, rPrefix, rKey, lKey, lOp, gKey) => { if (rKey) return `${rPrefix}"${ASSIGN_ESC[rKey]}"`; if (lKey) return `"${ASSIGN_ESC[lKey]}"${lOp}`; if (gKey) return `"${GLOBAL_ESC[gKey]}"`; return m; }); log(`主字面量替换 ${(performance.now() - t0).toFixed(0)}ms`); return out; }; const patchMainJs = async (code) => { await new Promise((r) => requestAnimationFrame(r)); const t0 = performance.now(); let modified = code; if (DICT_TABLE_RE) { const idx = modified.indexOf(Marker); if (idx !== -1) { let s = -1; for (let j = idx; j >= Math.max(0, idx - 260); j--) { const ch = modified[j]; const prev = modified[j - 1]; if (ch === '[' && (prev === '(' || prev === ',')) { s = j; break; } } if (s !== -1) { let depth = 1; let e = -1; for (let j = s + 1; j < modified.length && depth > 0; j++) { const ch = modified[j]; if (ch === '[') depth++; else if (ch === ']') { depth--; if (!depth) e = j; } } if (e !== -1) { const mid = modified.slice(s + 1, e); const patchedMid = applyDictPairs(mid); modified = modified.slice(0, s + 1) + patchedMid + modified.slice(e); } else { modified = applyDictPairs(modified); } } else { modified = applyDictPairs(modified); } } else { modified = applyDictPairs(modified); } } modified = applyMasterLiterals(modified); const cost = (performance.now() - t0).toFixed(0); LoaderUI.setStatus(`汉化处理完成`, `总耗时 ${cost}ms`); return modified; }; const getJSCacheKey = (url) => `${CONFIG.JS_CACHE_PREFIX}${PATCH_SIG}:${url}`; const inject = (code) => { const nonce = document.querySelector('script[nonce]')?.nonce; const s = document.createElement('script'); if (nonce) s.setAttribute('nonce', nonce); s.textContent = code; (document.head || document.documentElement).appendChild(s); }; // 字体拦截 & 缓存 let fontMemoryCache = null; let fontPromise = null; const fetchFont = async ({ silent = false } = {}) => { if (fontMemoryCache) return fontMemoryCache; if (fontPromise) return fontPromise; fontPromise = (async () => { if (!silent) { LoaderUI.setStep('字体'); LoaderUI.setStatus('检查字体缓存…', 'IndexedDB / 内存'); } const cachedRaw = await DB.get(CONFIG.FONT_KEY); if (cachedRaw && isFresh(cachedRaw)) { const cached = unwrapCache(cachedRaw); if (cached?.byteLength > 10_000) { fontMemoryCache = cached; if (!silent) { LoaderUI.setStatus('字体缓存命中', `${(cached.byteLength / 1024).toFixed(0)}KB`); LoaderUI.setStep('字体', true); } return cached; } } else if (cachedRaw && !isFresh(cachedRaw)) { DB.delete(CONFIG.FONT_KEY).catch(() => { }); } if (!silent) { LoaderUI.setStatus('下载字体…', '用于替换 NotoSansSC'); LoaderUI.setProgress(12); } const res = await gmRequest({ url: CONFIG.FONT_URL, responseType: 'arraybuffer', timeout: CONFIG.REQUEST_TIMEOUT_MS, onProgress: silent ? null : (l, t) => LoaderUI.progressFromNetwork(l, t, 12, 28) }); const buf = res.response; if (!buf?.byteLength || buf.byteLength <= 10_000) throw new Error('字体下载失败'); fontMemoryCache = buf; DB.set(CONFIG.FONT_KEY, wrapCache(buf)).catch(() => { }); if (!silent) { LoaderUI.setStatus('字体下载完成', `${(buf.byteLength / 1024).toFixed(0)}KB`); LoaderUI.setProgress(30); LoaderUI.setStep('字体', true); } return buf; })(); try { return await fontPromise; } finally { fontPromise = null; } }; const fetchMainJs = async (url) => { LoaderUI.setStep('脚本'); LoaderUI.setStatus('下载脚本…', 'main.dart.js'); LoaderUI.setProgress(32); const u = url.startsWith('http') ? url : location.origin + url; const t0 = nowMs(); const res = await gmRequest({ url: u, responseType: 'text', timeout: 120_000, onProgress: (l, t) => { LoaderUI.progressFromNetwork(l, t, 32, 62); if (l > 0 && t0) { const dt = (nowMs() - t0) / 1000; if (dt > 0.2) LoaderUI.setStatus('下载脚本…', `${(l / 1024 / 1024).toFixed(1)}MB / ${(dt).toFixed(1)}s`); } } }); const text = res.responseText ?? res.response ?? ''; if (typeof text !== 'string' || text.length < 10_000) throw new Error('脚本内容异常'); LoaderUI.setStatus('脚本下载完成', `${(text.length / 1024 / 1024).toFixed(1)}MB`); LoaderUI.setProgress(64); LoaderUI.setStep('脚本', true); return text; }; const processEntrypoint = async (entryUrl) => { LoaderUI.show(); fetchFont({ silent: true }).catch(() => { }); try { LoaderUI.setStep('初始化'); LoaderUI.setStatus('准备环境…', '字体/缓存/入口'); LoaderUI.setProgress(6); LoaderUI.setStep('初始化', true); const cacheKey = CONFIG.CACHE_PATCHED_JS ? getJSCacheKey(entryUrl) : null; if (cacheKey) { LoaderUI.setStep('缓存'); LoaderUI.setStatus('检查脚本缓存…', 'IndexedDB'); const cachedRaw = await DB.get(cacheKey); if (cachedRaw && isFresh(cachedRaw)) { const cached = unwrapCache(cachedRaw); if (typeof cached === 'string' && cached.length > 10_000) { LoaderUI.setStatus('脚本缓存命中', `${(cached.length / 1024 / 1024).toFixed(1)}MB`); LoaderUI.setProgress(82); LoaderUI.setStep('缓存', true); LoaderUI.setStep('注入'); LoaderUI.setStatus('启动引擎…', '使用缓存版本'); LoaderUI.setProgress(92); inject(cached); LoaderUI.setStep('注入', true); LoaderUI.setStatus('等待引擎初始化…', ''); LoaderUI.setProgress(100); return; } } else if (cachedRaw && !isFresh(cachedRaw)) { DB.delete(cacheKey).catch(() => { }); } LoaderUI.setStep('缓存', true); } const code = await fetchMainJs(entryUrl); LoaderUI.setStep('汉化'); LoaderUI.setStatus('处理翻译…', '应用字典替换'); LoaderUI.setProgress(66); const patched = await patchMainJs(code); if (cacheKey) DB.set(cacheKey, wrapCache(patched)).catch(() => { }); LoaderUI.setProgress(86); LoaderUI.setStep('汉化', true); LoaderUI.setStep('注入'); LoaderUI.setStatus('启动引擎…', '注入修补'); LoaderUI.setProgress(92); inject(patched); LoaderUI.setStep('注入', true); LoaderUI.setStatus('等待引擎初始化…', ''); LoaderUI.setProgress(100); } catch (e) { LoaderUI.error(e?.message || '未知错误'); } }; // fetch hook const originalFetch = unsafeWindow.fetch?.bind(unsafeWindow); if (originalFetch) { unsafeWindow.fetch = new Proxy(originalFetch, { apply(target, thisArg, args) { try { const input = args?.[0]; const urlStr = input instanceof Request ? input.url : input instanceof URL ? input.toString() : typeof input === 'string' ? input : String(input); const isFontTarget = typeof urlStr === 'string' && FONT_TARGETS.some((t) => (typeof t === 'string' ? urlStr.includes(t) : t.test(urlStr))); if (isFontTarget) { return (async () => { try { const buf = await fetchFont(); const resp = new Response(buf, { status: 200, statusText: 'OK', headers: { 'Content-Type': 'font/ttf' } }); try { Object.defineProperty(resp, 'url', { value: urlStr, writable: false }); } catch { } return resp; } catch { return Reflect.apply(target, thisArg, args); } })(); } const isApiTarget = typeof urlStr === 'string' && API_URL_HITS.some((hit) => urlStr.includes(hit)); if (!isApiTarget) return Reflect.apply(target, thisArg, args); return Reflect.apply(target, thisArg, args).then(async (resp) => { try { if (!resp) return resp; const ct = resp.headers?.get?.('content-type') ?? ''; if (!ct.includes('application/json')) return resp; if (resp.type === 'opaque') return resp; const clone = resp.clone(); const json = await clone.json(); const patched = patchApiResponseJson(json); const headers = new Headers(resp.headers); headers.set('content-type', 'application/json; charset=utf-8'); headers.delete('content-length'); const body = JSON.stringify(patched); const newResp = new Response(body, { status: resp.status, statusText: resp.statusText, headers }); try { Object.defineProperty(newResp, 'url', { value: urlStr, writable: false }); } catch { } return newResp; } catch { return resp; } }); } catch { return Reflect.apply(target, thisArg, args); } } }); } // Flutter loader hook if (sessionStorage.getItem('rcn_fallback')) { sessionStorage.removeItem('rcn_fallback'); } else { unsafeWindow._flutter ??= {}; unsafeWindow._flutter.loader = { loadEntrypoint: async (cfg) => { LoaderUI.show(); unsafeWindow._rcn = cfg; await processEntrypoint(cfg.entrypointUrl); }, didCreateEngineInitializer: async (init) => { const cb = unsafeWindow._rcn?.onEntrypointLoaded; if (cb) { try { await cb(init); LoaderUI.setProgress(100); await LoaderUI.hide(); } catch { await LoaderUI.hide(); } } else { await LoaderUI.hide(); } } }; } // 脚本菜单 if (typeof GM_registerMenuCommand === 'function') { GM_registerMenuCommand('🌐 加载原版', () => { sessionStorage.setItem('rcn_fallback', '1'); location.reload(); }); GM_registerMenuCommand('🗑️ 清除字体缓存', async () => { fontMemoryCache = null; const ok = await DB.delete(CONFIG.FONT_KEY); alert(ok ? '字体缓存已清除,刷新页面生效' : '清除失败'); }); GM_registerMenuCommand('🗑️ 清除全部缓存', async () => { fontMemoryCache = null; const ok = await DB.clear(); alert(ok ? '全部缓存已清除,刷新页面生效' : '清除失败'); }); } })();