diff --git a/lang/zh_CN/winghex_zh_CN.ts b/lang/zh_CN/winghex_zh_CN.ts index 55c1425..86054c6 100644 --- a/lang/zh_CN/winghex_zh_CN.ts +++ b/lang/zh_CN/winghex_zh_CN.ts @@ -63,14 +63,6 @@ 译者 - - AngelObjString - - - (len= - (长度= - - AppManager @@ -89,10 +81,10 @@ 打开文件 - - - - + + + + AlreadyOpened 文件已被打开 @@ -871,7 +863,7 @@ - + View 视图 @@ -908,8 +900,8 @@ - - + + Plugin 插件 @@ -919,298 +911,299 @@ 设置 - - + + Log 日志 - + ExportFindResult 导出搜索结果 - + ClearFindResult 清空记录 - - + + FindResult 搜索结果 - - - - - + + + + + + Copy 复制 - - - - - + + + + + CopyToClipBoard 数据已拷贝到粘贴板 - + LittleEndian 小端 - + BigEndian 大端 - + Number 数值 - - + + CheckSum 校验和 - - + + DeleteBookMark 删除书签 - - + + ClearBookMark 清空书签 - - - - + + + + BookMark 书签 - - + + DecodeText 解码字符串 - + ScriptConsole 脚本控制台 - - + + Basic 基础 - + New 新建 - + OpenF 打开文件 - + OpenWorkSpace 打开工作区 - + RecentFiles 最近打开 - - - + + + Reload 重新加载 - - + + Save 保存 - + SaveAs 另存为 - + ConvertWS 转为工作区 - + Export 导出 - + SaveSel 保存选区字节 - - - - + + + + General 基本 - + Undo 撤销 - + Redo 恢复 - + Cut 剪切 - + Paste 粘贴 - + Delete 删除 - + Clone 克隆 - + Lookup 查询 - + Find 查找 - + Goto 跳转 - - + + Encoding 编码 - + FileInfo 文件信息 - - + + Hex 十六进制 - + CutHex 剪切(十六进制) - + CopyHex 复制(十六进制) - + PasteHex 粘贴(十六进制) - - + + Fill 填充 - + FillZero 填充零 - - - - + + + + MetaData 标注 - + DeleteMetadata 删除标注 - + ClearMetadata 清空标注 - + MetaDataEdit 编辑标注 - + DeleteMetaData 删除标注 - + ClearMetaData 清空标注 - + Display 显示 - + ViewText 文本预览 - + Scale 缩放 @@ -1295,82 +1288,82 @@ 无扩展 - - + + ExportResult 导出结果 - + NothingToSave 没有保存的数据 - + OpenExt 打开 - 拓展 - + ResetScale 重置缩放 - + ShowMetafg 标注前景色 - + ShowMetabg 标注背景色 - + ShowMetaComment 批注 - + MetaShowAll 显示所有标注 - + MetaHideAll 隐藏所有标注 - + FileStatus 文件状态 - + InfoSave 是否保存 - + ReadOnly 可读写 - + SetLocked 启用/禁用锁定编辑 - + ErrUnLock 锁定编辑失败 - + SetOver 启用/禁用改变大小 @@ -1385,684 +1378,687 @@ 脚本引擎启动失败,将自动禁用该功能。 - + UnsignedHex 无符号 Hex - + BgScriptOutputHere 后台脚本执行将会在这里输出 - + SelectAll 全选 - + + Clear 清空 - + AbortScript 终止脚本 - + BgScriptOutput 后台脚本输出 - + ErrUnOver 锁定文件大小失败 - + Window 窗体 - + Editor 编辑器 - + Tools 工具 - + HexEditorLayout 编辑器布局 - + SetBaseAddr 设置基址 - + addressBase 基址 - + inputAddressBase 请输入基址 - + WarnBigBaseAddress 基址过大,你得到的地址将会不正确! - + ErrBaseAddress 非法基址输入 - + SetColInfo 显示/隐藏地址栏 - + SetHeaderInfo 显示/隐藏表头 - + SetAsciiString 显示/隐藏解码字符串 - + Layout 布局 - + Fullscreen 全屏 - + Default 默认 - - - + + + LayoutRestoring... 恢复布局中... - + RestoreLayout 恢复布局 - - + + SaveLayout 保存布局 - + + ExportLog 导出日志 - + + ClearLog 清空日志 - + InsepctQt 监视 Qt - + ScriptEditor 脚本编辑器 - + Scripts 脚本仓库 - + PluginFunctions 插件功能 - + ScriptSetting 脚本设置 - + PluginSettings 插件设置 - + Info 信息 - + Software 软件 - + Sponsor 赞助 - + CheckUpdate 检查更新 - + Wiki 网页 Wiki - + AboutQT 关于 QT - + SetPageIDEmptyTryUseName 设置页 ID 为空,尝试使用名称作为 ID - + SetPageDupNameIgnored 设置页重复的 ID 名称,已忽略加载 - + Plugin %1 contains a duplicate ID (%2) that is already registered by plugin %3 插件 %1 包含重复 ID (%2),该 ID 已被插件 %3 注册 - - + + ChooseFile 选择文件 - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + Error 错误 - - + + FileNotExist 文件不存在! - - - - - + + + + + FilePermission 因文件权限无法继续! - + ProjectFile (*.wingpro) 项目文件 (*.wingpro) - + ReloadSuccessfully 文件重新加载成功! - + ReloadUnSuccessfully 文件重新加载失败! - - - - + + + + ChooseSaveFile 请选择保存文件路径: - + NoMoreClone 克隆已到上限,无法继续操作! - + FindFininishBusy 查找任务繁忙,请勿重复查找! - + MayTooMuchFindResult 搜索数量已到达上限,结果可能不全,建议请按区段搜索。 - + SaveLayoutSuccess 保存布局成功 - + SaveLayoutError 保存布局失败 - + HasClonedView 该编辑页已被克隆编辑,如果关闭,相关联的页也会被关闭,你确认继续吗? - + FileCloseBigFile 大文件读取模式下目标文件被关闭,该标签将会被关闭。 - - + + ReloadNeededYesOrNo 目标文件被修改,是否重新加载? - + SaveWorkSpace 保存工作区 - + WingHexWorkSpace (*.wingpro) 羽云十六进制工作区 (*.wingpro) - + ConfirmSave 正在关闭未保存的文件或工作区,你确定保存吗? - + [Info] 【信息】 - + [Warn] 【警告】 - + [Error] 【错误】 - + ConfirmAPPSave 你尝试关闭程序,但仍存在未保存的文件或工作区,你确定保存这些更改吗? - - - + + + SaveSuccessfully 保存成功! - - + + SaveWSError 保存工作区错误! - - + + Warn 警告 - + Opening... 打开文件中... - + WorkSpaceOpening... 打开工作区中... - + Reloading... 重载文件中... - + Saving... 保存中... - + SaveNewFirst 请首先保存新建的文件 - + AlreadyWorkSpace 已经是工作区,无需转化 - + ConvWorkSpaceFailed 转化为工作区失败 - + ConvWorkSpaceSuccess 转化为工作区成功 - + SavingAs... 另存为中... - + SaveUnSuccessfully 保存失败! - + Exporting... 导出中... - + ChooseExportFile 请选择导出文件路径: - + ExportSuccessfully 导出成功! - + ExportUnSuccessfully 导出失败! - + SavingSel... 保存选中字节中... - + SaveSelSuccess 保存选区字节成功! - + SaveSelError 保存选区字节失败,因文件不具有可写权限! - - + + CutToClipBoard 数据已剪切到粘贴板! - - + + UnCutToClipBoard 由于保持大小限制,数据剪切到粘贴板失败! - - + + UnCopyToClipBoard 由于保持大小限制,数据剪切到复制板失败! - - + + Finding... 查找中... - + DeleteSuccess 删除成功 - + DeleteFailed 删除失败 - + FindFininish 查找结果完毕! - + PleaseInputFill 请输入填充字节值 - + FillInputTruncWarn 填充输入数值过大,将会被截断填充 - + FillInputError 填充字节输入错误 - - + + InputComment 请输入批注: - - + + BookmarkDelSuccess 删除书签成功 - + BookmarkDelNoItem 无书签可删除 - + BookmarkClearSuccess 书签清空完毕 - - - + + + NoSelection 没有选区,无法继续的操作! - + NoMetaData 无可编辑标记 - + PleaseClearSel 请清空选择 - + MetaDelSuccess 元数据删除成功 - + MetaDelNoItem 无元数据可删除 - + MetaClearSuccess 元数据清空完毕 - + FindResultExporting... 查找结果导出中... - - + + EmptyFindResult 没有可导出的搜索结果! - + SaveFindResult 导出搜索结果成功! - + SaveFindResultError 导出结果失败! - + TooManyBytesDecode 超出解码字节限制…… - + NoTextFileMayInvalid 该文件不是文本文件,以文本方式预览并不是一个好的方式,你确认继续吗? - + LayoutSaving... 布局保存中... - + PleaseInput 请输入 - + LogExporting... 日志导出中... - + ExportLogError 导出日志失败! - + ExportLogSuccess 导出日志成功,路径: - + ClearLogSuccess 清空日志成功! - + BadNetwork 无法与远程服务器的更新检查建立连接,请检查网络。 - + NewestVersion 当前软件为最新版本 - + OlderVersion 你使用的软件为老版本,建议到 Github 和 Gitee 的仓库发行版下载更新。 - + CheckingUpdate 检查更新中…… - + Too much opened files 打开的文件过多,无法继续操作! - + FilePermissionSure2Quit 因文件权限无法保存,你确认要退出吗? - + UnknownErrorSure2Quit 因未知错误无法保存,你确认要退出吗? - + WorkSpaceUnSavedSure2Quit 工作区文件无法保存,你确认要退出吗? - + CopyLimit 拷贝字节超出限制 - + ErrOpenFileBelow 打开文件出现错误(由于权限不足),如下为打开错误的文件: @@ -2682,23 +2678,23 @@ 关闭标签 - + Failed to open script file 打开脚本文件失败 - - + + Invalid file name for #include; it contains a line-break: #include 的文件名无效;它包含换行符: - + Invalid file name for #include; it contains a line-break or unpaired symbol #include 的文件名无效;它包含换行符或不成对的符号 - + Invalid #pragma directive #pragma 指令无效 @@ -2782,1581 +2778,1581 @@ ScriptMachine - + AngelScript callstack: AngelScript 调用堆栈: - + - Exception '%1' in '%2' — 在 ‘%2’ 中发生异常 ‘%1’ - + ExecNotAllowedInRoot 在管理员权限执行第三方命令为非法操作 - - - + + + Script failed to build 脚本编译失败 - + Cannot find 'int main()' or 'void main()' 无法找到程序入口点: "int main()" 或者 "void main()" - + Debugging, waiting for commands. 调试中,等待调试命令。 - + Failed while initializing global variables 初始化全局变量失败 - - + + The script failed with an exception 异常被抛出,脚本执行失败 - - + + The script was aborted 脚本被终止 - - + + The script terminated unexpectedly 脚本异常退出 - + The script exited with 脚本退出返回值: - + '%1' is already declared "%1" 已被声明 - + Abstract class '%1' cannot be instantiated 无法实例化抽象类 "%1" - + Accessing private property '%1' of parent class 非法访问父类的私有属性 "%1" - + Attribute '%1' informed multiple times 属性 "%1" 已被多次通知 - + Can't form arrays of subtype '%1' 无法创建子类型 "%1" 的数组 - + Can't inherit from class '%1' marked as final 无法从标记为 final 的类 "%1" 继承 - + Cannot access non-static member '%1' like this 无法和像使用 this 一样访问非静态成员 "%1" - + Can't construct handle '%1'. Use ref cast instead 无法构造句柄 "%1" 。请改用引用强制转换 - + Can't implicitly convert from '%1' to '%2'. 无法从 "%1' 隐式转换为 "%2"。 - + Compiling %1 正在编译 %1 - + Compiling auto generated %1 编译自动生成的 %1 - + Implemented property accessor '%1' does not expect index argument 已实现的属性访问器 "%1" 不需要索引参数 - + Implemented property accessor '%1' expects index argument 已实现的属性访问器 "%1" 需要索引参数 - + Data type can't be '%1' 数据类型不能为 "%1" - + All subsequent parameters after the first default value must have default values in function '%1' 在函数 "%1" 中,第一个默认值之后的所有后续参数都必须具有默认值 - + The method in the derived class must have the same return type as in the base class: '%1' 派生类中的方法必须具有与基类相同的返回类型:"%1" - + The name of the destructor '%1::~%2' must be the same as the class 析构函数 "%1::~%2" 的名称必须与类相同 - + Expected '%1' 应为 "%1" - + Expected '%1' or '%2' 应为 ”%1“ 或 ”%2“ - + Expression must be of boolean type, instead found '%1' 表达式必须是布尔类型,但实际使用的是 "%1" - + Expression '%1' is a data type 表达式 "%1" 是一种数据类型 - + External shared entity '%1' not found 未找到外部共享实体 "%1" - + External shared entity '%1' cannot redefine the original entity 外部共享实体 "%1" 无法重新定义原始实体 - + Failed while compiling default arg for parameter %1 in function '%2' 为函数 "%2" 中的参数 %1 编译默认参数时失败 - + Function '%1' not found 未找到函数 "%1" - + The property '%1' has mismatching types for the get and set accessors 属性 "%1" 的 get 和 set 访问器类型不匹配 - + Variable '%1' hides another variable of same name in outer scope 变量 "%1" 隐藏了外部作用域中另一个同名变量 - + Identifier '%1' is not a data type 标识符 "%1" 不是数据类型 - + Identifier '%1' is not a data type in global namespace 标识符 "%1" 不是全局命名空间中的数据类型 - + Identifier '%1' is not a data type in namespace '%2' or parent 标识符 "%1" 不是命名空间 "%2" 或其父级中的数据类型 - + Illegal operation on '%1' 对 "%1" 的非法操作 - + Illegal variable name '%1'. 非法变量名 "%1"。 - + Illegal access to inherited private property '%1' 非法访问继承的私有属性 "%1" - + Initialization lists cannot be used with '%1' 初始化列表不能与 "%1" 一起使用 - + Attempting to instantiate invalid template type '%1<%2>' 尝试实例化无效的模板类型 "%1<%2>" - + Instead found '%1' 而是找到了 "%1" - + Instead found identifier '%1' 而是找到标识符 "%1" - + Instead found reserved keyword '%1' 而是找到了保留关键字 "%1" - + Interface '%1' cannot be instantiated 无法实例化接口 "%1" - + Invalid unicode escape sequence, expected %1 hex digits 无效的 Unicode 转义序列,预期为 %1 个十六进制数字 - + Method '%1' declared as final and cannot be overridden 方法 "%1" 已声明为 final,因此无法被覆盖 - + Method '%1' marked as override but does not replace any base class or interface method 方法 "%1" 标记为覆盖,但并未替换任何基类或接口方法 - + Method '%1::%2' is missing the return type, nor is it the same name as object to be a constructor 方法 "%1::%2" 缺少返回类型,并且其名称与构造函数对象不同 - + Method '%1' is not part of object '%2' 方法 "%1" 不是对象 "%2" 的一部分 - + Missing implementation of '%1' 缺少 "%1" 的实现 - + Missing definition of '%1' 缺少 "%1" 的定义 - + Mixin class cannot be declared as '%1' Mixin 类不能声明为 "%1" - + Multiple matching signatures to '%1' "%1" 有多个匹配的签名 - + Found multiple get accessors for property '%1' 发现属性 "%1" 的多个 get 访问器 - + Found multiple set accessors for property '%1' 发现属性 "%1" 的多个集合访问器 - + Namespace '%1' doesn't exist. 命名空间 "%1" 不存在。 - - - - - - - - - - - - + + + + + + + + + + + + Name conflict. 名称冲突。 - + '%1' is an extended data type. "%1" 是扩展数据类型。 - + '%1' is a global property. "%1" 是全局属性。 - + '%1' is a named type. "%1" 是被命名的类型。 - + '%1' is a funcdef. "%1" 是一个函数签名定义。 - + '%1' is a global function. "%1" 是一个全局函数。 - + '%1' is a mixin class. "%1" 是一个 Mixin 类。 - + '%1' is a virtual property. "%1" 是虚拟属性。 - + '%1' is a class. "%1" 是一个类。 - + '%1' is an interface. "%1" 是一个接口。 - + '%1' is an object property. "%1" 是一个对象属性。 - + '%1' is a class method. "%1" 是一个类方法。 - + '%1' is already used. ”%1“ 已被使用。 - + No appropriate opHndlAssign method found in '%1' for handle assignment 在 "%1" 中未找到适当的 opHndlAssign 方法用于句柄分配 - + No conversion from '%1' to '%2' available. 无法进行从 "%1" 到 "%2" 的转换。 - + No conversion from '%1' to math type available. 无法将 "%1" 转换为数学类型。 - + No default constructor for object of type '%1'. "%1" 类型对象没有默认构造函数。 - + No appropriate opAssign method found in '%1' for value assignment 在 "%1" 中未找到适合赋值的 opAssign 方法 - + No copy constructor for object of type '%1'. 没有 "%1" 类型对象的复制构造函数。 - + No matching signatures to '%1' 没有与 "%1" 匹配的签名 - + No matching operator that takes the type '%1' found 未找到采用类型 "%1" 的匹配运算符 - + No matching operator that takes the types '%1' and '%2' found 未找到采用类型 "%1" 和 "%2" 的匹配运算符 - + No matching symbol '%1' 没有匹配的符号 "%1" - + Expression doesn't form a function call. '%1' evaluates to the non-function type '%2' 表达式不构成函数调用。"%1" 计算结果为非函数类型 "%2" - + '%1' is not declared "%1" 未被声明 - + '%1' is not initialized. ”%1“ 未初始化。 - + '%1' is not a member of '%2' ”%1“ 不是 ”%2“ 的成员 - + Type '%1' doesn't support the indexing operator 类型 "%1" 不支持索引运算符 - + Parameter type can't be '%1', because the type cannot be instantiated. 参数类型不能是 "%1",因为该类型无法实例化。 - + Previous error occurred while attempting to compile initialization list for type '%1' 尝试编译类型 "%1" 的初始化列表时发生先前的错误 - + Illegal call to private method '%1' 非法调用私有方法 "%1" - + Illegal access to private property '%1' 非法访问私有属性 "%1" - + Illegal call to protected method '%1' 非法调用受保护的方法 "%1" - + Illegal access to protected property '%1' 非法访问受保护的属性 "%1" - + Return type can't be '%1' 返回类型不能是 "%1" - + Shared code cannot access non-shared global variable '%1' 共享代码无法访问非共享全局变量 "%1" - + Shared code cannot call non-shared function '%1' 共享代码无法调用非共享函数 "%1" - + Shared type cannot implement non-shared interface '%1' 共享类型无法实现非共享接口 "%1" - + Shared class cannot inherit from non-shared class '%1' 共享类不能从非共享类 "%1" 继承 - + Shared code cannot use non-shared type '%1' 共享代码不能使用非共享类型 "%1" - + Shared type '%1' doesn't match the original declaration in other module 共享类型 "%1" 与其他模块中的原始声明不匹配 - + Template '%1' expects %2 sub type(s) 模板 "%1" 需要 %2 个子类型 - + Type '%1' cannot be a reference 类型 "%1" 不能是引用 - + Type '%1' is not available for this module 类型 "%1" 不适用于此模块 - + Type '%1' is not a template type 类型 "%1" 不是模板类型 - + Unexpected token '%1' 意外标记 "%1" - + Use of uninitialized global variable '%1'. 使用未初始化的全局变量 "%1"。 - + Unknown scope '%1' 未知作用域 "%1" - + Where '%1' is '%2' 其中 "%1" 是 "%2" - + Failed to initialize global variable '%1' 无法初始化全局变量 "%1" - + Exception '%1' in '%2' "%2" 中的异常 "%1" - + Type '%1' is missing behaviours 类型 "%1" 缺少的行为 - + Can't pass type '%1' by value unless the application type is informed in the registration 除非在注册时告知应用程序类型,否则无法按值传递类型 "%1" - + Can't return type '%1' by value unless the application type is informed in the registration 除非在注册时告知应用程序类型,否则无法按值返回类型 "%1" - + Don't support passing type '%1' by value to application in native calling convention on this platform 不支持在此平台上按照本机调用约定将类型 "%1" 按值传递给应用程序 - + Don't support returning type '%1' by value from application in native calling convention on this platform 不支持在此平台上按照本机调用约定从应用程序返回类型 "%1" 的值 - + Object {%1}. GC cannot destroy an object of type '%2' as it doesn't know how many references to there are. 对象 {%1}。GC 无法销毁类型为 "%2" 的对象,因为它不知道有多少个引用。 - + Object {%1}. GC cannot destroy an object of type '%2' as it can't see all references. Current ref count is %3. 对象 {%1}。GC 无法销毁类型为 "%2" 的对象,因为它无法看到所有引用。当前引用计数为 %3。 - + Object type '%1' doesn't exist 对象类型 "%1" 不存在 - + Cannot register. The template type instance '%1' has already been generated. 无法注册。模板类型实例 "%1" 已生成。 - + Template type '%1' doesn't exist 模板类型 "%1" 不存在 - + Template subtype '%1' doesn't exist 模板子类型 "%1" 不存在 - + Failed to read subtype of template type '%1' 无法读取模板类型 "%1" 的子类型 - + Failed in call to function '%1' (Code: %2, %3) 调用函数 "%1" 失败(代码:%2,%3) - + Failed in call to function '%1' with '%2' (Code: %3, %4) 使用 "%2" 调用函数 "%1" 失败(代码:%3,%4) - + Failed in call to function '%1' with '%2' and '%3' (Code: %4, %5) 使用 "%2" 和 "%3" 调用函数 "%1" 失败(代码:%4,%5) - + Type '%1' is still used by function '%2' 类型 "%1" 仍被函数 "%2" 使用 - + The builtin type in previous message is named '%1' 上一条消息中的内置类型名为 "%1" - + The function in previous message is named '%1'. The func type is %2 上一条消息中的函数名为 "%1"。函数类型为 %2 - + The script object of type '%1' is being resurrected illegally during destruction 类型为 "%1" 的脚本对象在销毁过程中被非法复活 - + LoadByteCode failed. The bytecode is invalid. Number of bytes read from stream: %1 LoadByteCode 失败。字节码无效。从流中读取的字节数:%1 - + Function '%1' appears to have been compiled without JIT entry points 函数 "%1" 似乎已在无 JIT 入口点的情况下进行编译 - + There is an external reference to an object in module '%1', preventing it from being deleted 存在对模块 "%1" 中对象的外部引用,导致无法删除该对象 - + Output argument expression is not assignable 输出参数表达式不可分配 - + Auto is not allowed here 这里禁止使用 auto 关键字 - + Can't find unambiguous implicit conversion to make both expressions have the same type 无法找到明确的隐式转换来使两个表达式具有相同的类型 - + Both conditions must call constructor 两个条件都必须调用构造函数 - + Base class doesn't have default constructor. Make explicit call to base constructor 基类没有默认构造函数。明确调用基类构造函数 - + Base class doesn't have copy constructor or default constructor and assign operator. Make explicit call to base constructor 基类没有复制构造函数或默认构造函数和赋值运算符。明确调用基类构造函数 - + Candidates are: 候选包括: - + Can't call a constructor in loops 无法在循环中调用构造函数 - + Can't call a constructor in switch 无法在 switch 中调用构造函数 - + Can't call a constructor multiple times 无法多次调用构造函数 - + Can't create delegate 无法创建委托 - + Can't create delegate for types that do not support handles 无法为不支持句柄的类型创建委托 - + Cannot flag function that will not be auto generated as deleted 无法将不会自动生成的函数标记为已删除 - + Conflict with explicit declaration of function and deleted function 与函数的显式声明和已删除函数冲突 - + Can't implement itself, or another interface that implements this interface 无法实现自身,也无法实现此接口的其他接口 - + Can't inherit from multiple classes 不能从多个类继承 - + Can't inherit from itself, or another class that inherits from this class 不能从其自身或从该类继承的其他类继承 - + Can't pass class method as arg directly. Use a delegate object instead 无法直接将类方法作为参数传递。请改用委托对象 - + Unable to resolve auto type 无法解析自动类型 - + Can't return reference to local value. 无法返回对本地值的引用。 - + Can't return value when return type is 'void' 返回类型为 "void" 时无法返回值 - + Implicit conversion changed sign of value 隐式转换改变了值的符号 - + A class cannot be both abstract and final 一个类不能同时是 abstract 和 final - + Compound assignments with property accessors on value types are not supported 不支持对值类型使用属性访问器的复合赋值 - + Compound assignments with indexed property accessors are not supported 不支持使用索引属性访问器的复合赋值 - + Compound assignments with property accessors require both get and set accessors 具有属性访问器的复合赋值需要 get 和 set 访问器 - + Variables cannot be declared in switch cases, except inside statement blocks 变量不能在 switch 语句中声明,除非在语句块内 - + The default case must be the last one default 情况必须是最后一个 - + The type of the default argument expression doesn't match the function parameter type 默认参数表达式的类型与函数参数类型不匹配 - + Deleted functions cannot have implementation 已删除的函数不能有实现 - + The destructor must not have any parameters 析构函数不能有任何参数 - + Value assignment on reference types is not allowed. Did you mean to do a handle assignment? 不允许对引用类型进行值分配。是要进行句柄分配吗? - + Compound assignment on reference types is not allowed 不允许对引用类型进行复合赋值 - + Duplicate named argument 重复命名参数 - + Duplicate switch case 重复的 switch case - + Else with empty statement else 中使用空语句 - + Empty list element is not allowed 不允许空列表元素 - + Empty switch statement 空的 switch 语句 - + Expected constant 应为常量 - + Expected data type 应为数据类型 - + Expected expression value 应为表达值 - + Expected identifier 应为标识符 - + Expected a list enclosed by { } to match pattern 应为用 { } 括起来的列表与模式匹配 - + Expected method or property 应为方法或属性 - + Expected one of: 应为为以下之一: - + Expected operator 应为操作符 - + Expected post operator 应为右操作符 - + Expected pre operator 应为左操作符 - + Expected string 应为字符串 - + Expression doesn't evaluate to a function 表达式无法计算函数值 - + Previous error occurred while attempting to create a temporary copy of object 尝试创建对象的临时副本时发生上一个错误 - + Float value truncated in implicit conversion to integer 浮点值在隐式转换为整数时被截断 - + Found multiple matching enum values 找到多个匹配的枚举值 - + A function with the same name and parameters already exists 具有相同名称和参数的函数已存在 - + Global variables have been disabled by the application 全局变量已被应用程序禁用 - + It is not allowed to perform a handle assignment on a non-handle property 不允许对非句柄属性执行句柄分配 - + The operand is implicitly converted to handle in order to compare them 操作数被隐式转换为句柄,以便进行比较 - + Handle to handle is not allowed 不允许使用句柄 - + If with empty statement 如果带有空语句 - + Illegal member type 非法成员类型 - + Illegal operation on this datatype 对该数据类型的非法操作 - + Illegal target type for reference cast 非法引用转换的目标类型 - + Interfaces can only implement other interfaces 接口只能实现其他接口 - + Invalid 'break' 无效的 break 关键字 - + Invalid character literal 无效的字符 - + Invalid 'continue' 无效的 continue 关键字 - + Invalid escape sequence 无效的转义序列 - + Invalid expression: ambiguous name 无效表达式:二义性名称 - + Invalid expression: stand-alone anonymous function 无效表达式:独立匿名函数 - + Invalid operation on method 方法操作无效 - + Invalid reference. Property accessors cannot be used in combined read/write operations 引用无效。属性访问器不能用于组合读/写操作。 - + Invalid scope resolution 范围解析无效 - + Invalid signature for virtual property 虚拟属性签名无效 - + Invalid type 类型无效 - + Invalid unicode code point 无效的 Unicode 代码点 - + Invalid unicode sequence in source 源代码中的 Unicode 序列无效 - + Invalid use of named arguments 命名参数的使用无效 - + The method cannot be named with the class name 该方法不能以类名命名 - + Mixin classes cannot have constructors or destructors Mixin 类不能有构造函数或析构函数 - + Mixin class cannot inherit from classes Mixin 类不能从类继承 - + Mixin classes cannot have child types Mixin 类不能有子类型 - + Found more than one matching operator 找到多个匹配的运算符 - + Multiline strings are not allowed in this application 此应用程序不允许使用多行字符串 - + Only objects have constructors 只有对象才有构造函数 - + Must return a value 必须返回一个值 - + Detected named argument with old syntax 检测到具有旧语法的命名参数 - + No appropriate indexing operator found 未找到合适的索引运算符 - + No appropriate opEquals method found 未找到合适的 opEquals 方法 - + The application doesn't support the default array type. 该应用程序不支持默认数组类型。 - + Non-const method call on read-only object reference 只读对象引用上的非常量方法调用 - + Non-terminated string literal 未终止的字符串 - + Not all paths return a value 并非所有路径都会返回值 - + Not enough values to match pattern 没有足够的值来模式匹配 - + Implicit conversion of value is not exact 值的隐式转换并不准确 - + Expression is not an l-value 表达式不是左值 - + Not a valid reference 无效引用 - + Not a valid lvalue 不是有效的左值 - + Nothing was built in the module 模块中没有构建任何内容 - + Object handle is not supported for this type 此类型不支持对象句柄 - + Only object types that support object handles can use &inout. Use &in or &out instead 只有支持对象句柄的对象类型才能使用 &inout。请改用 &in 或 &out - + A cast operator has one argument 强制类型转换运算符有一个参数 - + The code must contain one and only one function 代码必须包含一个且只能包含一个函数 - + The code must contain one and only one global variable 代码必须包含一个且只能有一个全局变量 - + Both operands must be handles when comparing identity 比较时,两个操作数都必须是句柄 - + The overloaded functions are identical on initial parameters without default arguments 重载函数在初始参数上相同,没有默认参数 - + Parameter already declared 参数已声明 - + Positional arguments cannot be passed after named arguments 位置参数不能在命名参数之后传递 - + Potentially matching non-const method is hidden on read-only object reference 可能匹配的非 const 方法隐藏在只读对象引用中 - + Property accessor with index must have 1 and only 1 index argument 带索引的属性访问器必须有 1 个且只能有 1 个索引参数 - + Property accessors have been disabled by the application 应用程序已禁用属性访问器 - + Property accessor must be implemented 必须实现属性访问器 - + Class properties cannot be declared as const 类属性不能声明为 const - + The property has no get accessor 该属性没有 get 访问器 - + The property has no set accessor 该属性没有设置访问器 - + Virtual property must have at least one get or set accessor 虚拟属性必须至少有一个 get 或 set 访问器 - + Resulting reference cannot be returned. Returned references must not refer to local variables. 无法返回结果引用。返回的引用不得引用局部变量。 - + Resulting reference cannot be returned. There are deferred arguments that may invalidate it. 无法返回结果引用。存在可能使其无效的延迟参数。 - + Resulting reference cannot be returned. The expression uses objects that during cleanup may invalidate it. 无法返回结果引用。表达式使用的对象在清理过程中可能会使其失效。 - + Reference is read-only 引用是只读的 - + Reference is temporary 参考是临时的 - + Reference types cannot be passed by value in function parameters 引用类型不能在函数参数中按值传递 - + Reference types cannot be returned by value from functions 引用类型不能通过函数返回值 - + The script section is empty 脚本节区为空 - + Signed/Unsigned mismatch 有符号/无符号不匹配 - + Strings are not recognized by the application 应用程序无法识别字符串 - + Case expressions must be literal constants case 表达式必须是文字常量 - + Switch expressions must be integral numbers switch 表达式必须是整数 - + The function has too many jump labels to handle. Split the function into smaller ones. 该函数的跳转标签过多,无法处理。请将函数拆分为较小的函数。 - + Too many values to match pattern 与模式匹配的值过多 - + Unexpected end of file 意外的文件结束 - + Unexpected variable declaration 意外的变量声明 - + Unreachable code 无法访问的代码 - + Virtual property contains unrecognized aspect 虚拟属性包含未被认可的部分 - + Unused script node 未使用的脚本节点 - + Value is too large for data type 对于数据类型来说,值太大 - + Void cannot be an operand in expressions void 不能作为表达式中的操作数 - + Warnings are treated as errors by the application 应用程序将警告视为错误 - + While parsing argument list 解析参数列表时 - + While parsing expression 解析表达式时 - + While parsing initialization list 解析初始化列表时 - + While parsing namespace 解析命名空间时 - + While parsing statement block 解析语句块时 - + Previous error occurred while including mixin 包含 mixin 时发生先前错误 - + Autohandles cannot be used with types that have been registered with NOCOUNT 自动句柄不能与已使用 NOCOUNT 注册的类型一起使用 - + First parameter to template factory must be a reference. This will be used to pass the object type of the template 模板工厂的第一个参数必须是引用。这将用于传递模板的对象类型 - + Invalid configuration. Verify the registered application interface. 配置无效。请验证已注册的应用程序接口。 - + A value type must be registered with a non-zero size 值类型必须注册为非零大小 - + The behaviour is not compatible with the type 行为与类型不兼容 - + A garbage collected ref type must have the addref, release, and all gc behaviours 垃圾收集引用类型必须具有 addref、release 和所有 gc 行为 - + A garbage collected value type must have the gc enum references behaviour 垃圾收集值类型必须具有 gc 枚举引用行为 - + A scoped reference type must have the release behaviour 作用域引用类型必须具有释放行为 - + A reference type must have the addref and release behaviours 引用类型必须具有 addref 和 release 行为 - + A non-pod value type must have at least one constructor and the destructor behaviours 非 pod 值类型必须至少有一个构造函数和析构函数行为 - + Template list factory expects two reference parameters. The last is the pointer to the initialization buffer 模板列表工厂需要两个引用参数。最后一个是指向初始化缓冲区的指针 - + List factory expects only one reference parameter. The pointer to the initialization buffer will be passed in this parameter 列表工厂仅需要一个引用参数。指向初始化缓冲区的指针将在此参数中传递 - + AddScriptObjectToGC called with null pointer 使用空指针调用 AddScriptObjectToGC - + An exception occurred in a nested call 嵌套调用中发生异常 - + Uh oh! The engine's reference count is increasing while it is being destroyed. Make sure references needed for clean-up are immediately released 哎呀!引擎的引用计数在被销毁时不断增加。确保立即释放清理所需的引用 - + The module is still in use and cannot be rebuilt. Discard it and request another module 该模块仍在使用中,无法重建。丢弃它并请求另一个模块 - + Property 属性 - + System function 系统函数 - + Variable declaration 变量声明 - + Stack overflow 栈溢出 - + Null pointer access 空指针访问 - + Divide by zero 除以零 - + Overflow in integer division 整数除法溢出 - + Overflow in exponent operation 指数运算溢出 - + Unrecognized byte code 无法识别的字节码 - + Invalid calling convention 无效调用约定 - + Unbound function called 未绑定的函数被调用 - + Out of range 越界 - + Caught an exception from the application 捕获应用程序异常 - + Mismatching types in value assignment 值分配中的类型不匹配 - + Too many nested calls 嵌套调用过多 - - + + Assert failed 断言失败 - + BadDecl: 错误的声明: - + GlobalBadDecl 错误的全局声明 @@ -4485,27 +4481,27 @@ 多行代码粘贴后将不能修改 - + Copy 复制 - + Cut 剪切 - + Paste 粘贴 - + Clear 清空 - + AbortScript 终止脚本 @@ -4513,12 +4509,12 @@ ScriptingConsoleBase - + Scripting console for WingHexExplorer 羽云十六进制编辑器脚本控制台 - + >>>> Powered by AngelScript <<<< >>>> 由 AngelScript 引擎提供支持 <<<< @@ -4743,118 +4739,118 @@ 变量 - + ConsoleOutput 输出 - + StackTrace 栈跟踪 - + Symbol 符号 - - - - - - + + + + + + Error 错误 - + Too much opened files 打开的文件过多,无法继续操作! - + ConfirmSave 正在关闭未保存的脚本文件,你确定保存吗? - + ScriptSaveFailedClose 脚本保存失败,你仍确认关闭吗? - + Debuging... 调试中... - + Running... 运行中... - + Line %1, Col %2 行 %1, 列 %2 - + (Selected: %1) (选中: %1) - - + + ChooseFile 选择文件 - - - + + + FilePermission 因文件权限无法继续! - + ReloadSuccessfully 文件重新加载成功! - + ReloadUnSuccessfully 文件重新加载失败! - + ChooseSaveFile 请选择保存文件路径: - - + + SaveSuccessfully 保存成功! - + SaveUnSuccessfully 保存失败! - + FormatCodeFailed 代码格式化失败 - - + + CannotSave2RunScript 无法保存,故无法继续运行脚本。 - - + + ScriptStillRunning 脚本仍在运行,你确定要退出吗? @@ -5419,7 +5415,12 @@ asDebugger - + + ScriptTimedOut + 脚本代码运行超时 + + + {no engine} {无引擎} diff --git a/lang/zh_TW/winghex_zh_TW.ts b/lang/zh_TW/winghex_zh_TW.ts index f564ac6..ca60a3d 100644 --- a/lang/zh_TW/winghex_zh_TW.ts +++ b/lang/zh_TW/winghex_zh_TW.ts @@ -63,14 +63,6 @@ 譯者 - - AngelObjString - - - (len= - (長度= - - AppManager @@ -89,10 +81,10 @@ 打開檔 - - - - + + + + AlreadyOpened 檔已被打開 @@ -871,7 +863,7 @@ - + View 視圖 @@ -908,8 +900,8 @@ - - + + Plugin 插件 @@ -919,298 +911,299 @@ 設置 - - + + Log 日誌 - + ExportFindResult 導出搜索結果 - + ClearFindResult 清空記錄 - - + + FindResult 搜索結果 - - - - - + + + + + + Copy 複製 - - - - - + + + + + CopyToClipBoard 數據已拷貝到粘貼板 - + LittleEndian 小端 - + BigEndian 大端 - + Number 數值 - - + + CheckSum 校驗和 - - + + DeleteBookMark 刪除書簽 - - + + ClearBookMark 清空書簽 - - - - + + + + BookMark 書簽 - - + + DecodeText 解碼字串 - + ScriptConsole 腳本控制臺 - - + + Basic 基礎 - + New 新建 - + OpenF 打開檔 - + OpenWorkSpace 打開工作區 - + RecentFiles 最近打開 - - - + + + Reload 重新加載 - - + + Save 保存 - + SaveAs 另存為 - + ConvertWS 轉為工作區 - + Export 導出 - + SaveSel 保存選區位元組 - - - - + + + + General 基本 - + Undo 撤銷 - + Redo 恢復 - + Cut 剪切 - + Paste 粘貼 - + Delete 刪除 - + Clone 克隆 - + Lookup 查詢 - + Find 查找 - + Goto 跳轉 - - + + Encoding 編碼 - + FileInfo 檔資訊 - - + + Hex 十六進制 - + CutHex 剪切(十六進制) - + CopyHex 複製(十六進制) - + PasteHex 粘貼(十六進制) - - + + Fill 填充 - + FillZero 填充零 - - - - + + + + MetaData 標注 - + DeleteMetadata 刪除標注 - + ClearMetadata 清空標注 - + MetaDataEdit 編輯標注 - + DeleteMetaData 刪除標注 - + ClearMetaData 清空標注 - + Display 顯示 - + ViewText 文本預覽 - + Scale 縮放 @@ -1295,82 +1288,82 @@ 無擴展 - - + + ExportResult 導出結果 - + NothingToSave 沒有保存的數據 - + OpenExt 打開 - 拓展 - + ResetScale 重置縮放 - + ShowMetafg 標注前景色 - + ShowMetabg 標注背景色 - + ShowMetaComment 批註 - + MetaShowAll 顯示所有標注 - + MetaHideAll 隱藏所有標注 - + FileStatus 檔狀態 - + InfoSave 是否保存 - + ReadOnly 可讀寫 - + SetLocked 啟用/禁用鎖定編輯 - + ErrUnLock 鎖定編輯失敗 - + SetOver 啟用/禁用改變大小 @@ -1385,684 +1378,687 @@ 腳本引擎啟動失敗,將自動禁用該功能。 - + UnsignedHex 無符號 Hex - + BgScriptOutputHere 後臺腳本執行將會在這裏輸出 - + SelectAll 全選 - + + Clear 清空 - + AbortScript 終止腳本 - + BgScriptOutput 後臺腳本輸出 - + ErrUnOver 鎖定檔大小失敗 - + Window 窗體 - + Editor 編輯器 - + Tools 工具 - + HexEditorLayout 編輯器佈局 - + SetBaseAddr 設置基址 - + addressBase 基址 - + inputAddressBase 請輸入基址 - + WarnBigBaseAddress 基址過大,你得到的地址將會不正確! - + ErrBaseAddress 非法基址輸入 - + SetColInfo 顯示/隱藏地址欄 - + SetHeaderInfo 顯示/隱藏表頭 - + SetAsciiString 顯示/隱藏解碼字串 - + Layout 佈局 - + Fullscreen 全屏 - + Default 默認 - - - + + + LayoutRestoring... 恢復佈局中... - + RestoreLayout 恢復佈局 - - + + SaveLayout 保存佈局 - + + ExportLog 導出日誌 - + + ClearLog 清空日誌 - + InsepctQt 監視 Qt - + ScriptEditor 腳本編輯器 - + Scripts 腳本倉庫 - + PluginFunctions 插件功能 - + ScriptSetting 腳本設置 - + PluginSettings 插件設置 - + Info 資訊 - + Software 軟體 - + Sponsor 贊助 - + CheckUpdate 檢查更新 - + Wiki 網頁 Wiki - + AboutQT 關於 QT - + SetPageIDEmptyTryUseName 設置頁 ID 為空,嘗試使用名稱作為 ID - + SetPageDupNameIgnored 設置頁重複的 ID 名稱,已忽略加載 - + Plugin %1 contains a duplicate ID (%2) that is already registered by plugin %3 插件 %1 包含重複 ID (%2),該 ID 已被插件 %3 註冊 - - + + ChooseFile 選擇檔 - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + Error 錯誤 - - + + FileNotExist 檔不存在! - - - - - + + + + + FilePermission 因檔許可權無法繼續! - + ProjectFile (*.wingpro) 專案檔 (*.wingpro) - + ReloadSuccessfully 檔重新加載成功! - + ReloadUnSuccessfully 檔重新加載失敗! - - - - + + + + ChooseSaveFile 請選擇保存檔路徑: - + NoMoreClone 克隆已到上限,無法繼續操作! - + FindFininishBusy 查找任務繁忙,請勿重複查找! - + MayTooMuchFindResult 搜索數量已到達上限,結果可能不全,建議請按區段搜索。 - + SaveLayoutSuccess 保存佈局成功 - + SaveLayoutError 保存佈局失敗 - + HasClonedView 該編輯頁已被克隆編輯,如果關閉,相關聯的頁也會被關閉,你確認繼續嗎? - + FileCloseBigFile 大檔讀取模式下目的檔案被關閉,該標籤將會被關閉。 - - + + ReloadNeededYesOrNo 目的檔案被修改,是否重新載入? - + SaveWorkSpace 保存工作區 - + WingHexWorkSpace (*.wingpro) 羽雲十六進制工作區 (*.wingpro) - + ConfirmSave 正在關閉未保存的檔或工作區,你確定保存嗎? - + [Info] 【資訊】 - + [Warn] 【警告】 - + [Error] 【錯誤】 - + ConfirmAPPSave 你嘗試關閉程式,但仍存在未保存的檔或工作區,你確定保存這些更改嗎? - - - + + + SaveSuccessfully 保存成功! - - + + SaveWSError 保存工作區錯誤! - - + + Warn 警告 - + Opening... 打開檔中... - + WorkSpaceOpening... 打開工作區中... - + Reloading... 重載檔中... - + Saving... 保存中... - + SaveNewFirst 請首先保存新建的檔 - + AlreadyWorkSpace 已經是工作區,無需轉化 - + ConvWorkSpaceFailed 轉化為工作區失敗 - + ConvWorkSpaceSuccess 轉化為工作區成功 - + SavingAs... 另存為中... - + SaveUnSuccessfully 保存失敗! - + Exporting... 導出中... - + ChooseExportFile 請選擇導出檔路徑: - + ExportSuccessfully 導出成功! - + ExportUnSuccessfully 導出失敗! - + SavingSel... 保存選中位元組中... - + SaveSelSuccess 保存選區位元組成功! - + SaveSelError 保存選區位元組失敗,因檔不具有可寫許可權! - - + + CutToClipBoard 數據已剪切到粘貼板! - - + + UnCutToClipBoard 由於保持大小限制,數據剪切到粘貼板失敗! - - + + UnCopyToClipBoard 由於保持大小限制,數據剪切到複製板失敗! - - + + Finding... 查找中... - + DeleteSuccess 刪除成功 - + DeleteFailed 刪除失敗 - + FindFininish 查找結果完畢! - + PleaseInputFill 請輸入填充位元組值 - + FillInputTruncWarn 填充輸入數值過大,將會被截斷填充 - + FillInputError 填充位元組輸入錯誤 - - + + InputComment 請輸入批註: - - + + BookmarkDelSuccess 刪除書簽成功 - + BookmarkDelNoItem 無書簽可刪除 - + BookmarkClearSuccess 書簽清空完畢 - - - + + + NoSelection 沒有選區,無法繼續的操作! - + NoMetaData 無可編輯標記 - + PleaseClearSel 請清空選擇 - + MetaDelSuccess 元數據刪除成功 - + MetaDelNoItem 無元數據可刪除 - + MetaClearSuccess 元數據清空完畢 - + FindResultExporting... 查找結果導出中... - - + + EmptyFindResult 沒有可導出的搜索結果! - + SaveFindResult 導出搜索結果成功! - + SaveFindResultError 導出結果失敗! - + TooManyBytesDecode 超出解碼位元組限制…… - + NoTextFileMayInvalid 該檔不是文本檔,以文本方式預覽並不是一個好的方式,你確認繼續嗎? - + LayoutSaving... 佈局保存中... - + PleaseInput 請輸入 - + LogExporting... 日誌導出中... - + ExportLogError 導出日誌失敗! - + ExportLogSuccess 導出日誌成功,路徑: - + ClearLogSuccess 清空日誌成功! - + BadNetwork 無法與遠程伺服器的更新檢查建立連接,請檢查網路。 - + NewestVersion 當前軟體為最新版本 - + OlderVersion 你使用的軟體為老版本,建議到 Github 和 Gitee 的倉庫發行版下載更新。 - + CheckingUpdate 檢查更新中…… - + Too much opened files 打開的檔過多,無法繼續操作! - + FilePermissionSure2Quit 因檔許可權無法保存,你確認要退出嗎? - + UnknownErrorSure2Quit 因未知錯誤無法保存,你確認要退出嗎? - + WorkSpaceUnSavedSure2Quit 工作區檔無法保存,你確認要退出嗎? - + CopyLimit 拷貝位元組超出限制 - + ErrOpenFileBelow 打開檔出現錯誤(由於許可權不足),如下為打開錯誤的檔: @@ -2682,23 +2678,23 @@ 關閉標籤 - + Failed to open script file 打開腳本檔失敗 - - + + Invalid file name for #include; it contains a line-break: #include 的檔案名無效;它包含換行符: - + Invalid file name for #include; it contains a line-break or unpaired symbol #include 的檔案名無效;它包含換行符或不成對的符號 - + Invalid #pragma directive #pragma 指令無效 @@ -2782,1581 +2778,1581 @@ ScriptMachine - + AngelScript callstack: AngelScript 調用堆疊: - + - Exception '%1' in '%2' — 在 ‘%2’ 中發生異常 ‘%1’ - + ExecNotAllowedInRoot 在管理員許可權執行第三方命令為非法操作 - - - + + + Script failed to build 腳本編譯失敗 - + Cannot find 'int main()' or 'void main()' 無法找到程式入口點: "int main()" 或者 "void main()" - + Debugging, waiting for commands. 調試中,等待調試命令。 - + Failed while initializing global variables 初始化全局變數失敗 - - + + The script failed with an exception 異常被拋出,腳本執行失敗 - - + + The script was aborted 腳本被終止 - - + + The script terminated unexpectedly 腳本異常退出 - + The script exited with 腳本退出返回值: - + '%1' is already declared "%1" 已被聲明 - + Abstract class '%1' cannot be instantiated 無法實例化抽象類 "%1" - + Accessing private property '%1' of parent class 非法訪問父類的私有屬性 "%1" - + Attribute '%1' informed multiple times 屬性 "%1" 已被多次通知 - + Can't form arrays of subtype '%1' 無法創建子類型 "%1" 的數組 - + Can't inherit from class '%1' marked as final 無法從標記為 final 的類 "%1" 繼承 - + Cannot access non-static member '%1' like this 無法和像使用 this 一樣訪問非靜態成員 "%1" - + Can't construct handle '%1'. Use ref cast instead 無法構造句柄 "%1" 。請改用引用強制轉換 - + Can't implicitly convert from '%1' to '%2'. 無法從 "%1' 隱式轉換為 "%2"。 - + Compiling %1 正在編譯 %1 - + Compiling auto generated %1 編譯自動生成的 %1 - + Implemented property accessor '%1' does not expect index argument 已實現的屬性訪問器 "%1" 不需要索引參數 - + Implemented property accessor '%1' expects index argument 已實現的屬性訪問器 "%1" 需要索引參數 - + Data type can't be '%1' 數據類型不能為 "%1" - + All subsequent parameters after the first default value must have default values in function '%1' 在函數 "%1" 中,第一個默認值之後的所有後續參數都必須具有默認值 - + The method in the derived class must have the same return type as in the base class: '%1' 派生類中的方法必須具有與基類相同的返回類型:"%1" - + The name of the destructor '%1::~%2' must be the same as the class 析構函數 "%1::~%2" 的名稱必須與類相同 - + Expected '%1' 應為 "%1" - + Expected '%1' or '%2' 應為 ”%1“ 或 ”%2“ - + Expression must be of boolean type, instead found '%1' 運算式必須是布爾類型,但實際使用的是 "%1" - + Expression '%1' is a data type 運算式 "%1" 是一種數據類型 - + External shared entity '%1' not found 未找到外部共用實體 "%1" - + External shared entity '%1' cannot redefine the original entity 外部共用實體 "%1" 無法重新定義原始實體 - + Failed while compiling default arg for parameter %1 in function '%2' 為函數 "%2" 中的參數 %1 編譯默認參數時失敗 - + Function '%1' not found 未找到函數 "%1" - + The property '%1' has mismatching types for the get and set accessors 屬性 "%1" 的 get 和 set 訪問器類型不匹配 - + Variable '%1' hides another variable of same name in outer scope 變數 "%1" 隱藏了外部作用域中另一個同名變數 - + Identifier '%1' is not a data type 識別字 "%1" 不是數據類型 - + Identifier '%1' is not a data type in global namespace 識別字 "%1" 不是全局命名空間中的數據類型 - + Identifier '%1' is not a data type in namespace '%2' or parent 識別字 "%1" 不是命名空間 "%2" 或其父級中的數據類型 - + Illegal operation on '%1' 對 "%1" 的非法操作 - + Illegal variable name '%1'. 非法變數名 "%1"。 - + Illegal access to inherited private property '%1' 非法訪問繼承的私有屬性 "%1" - + Initialization lists cannot be used with '%1' 初始化列表不能與 "%1" 一起使用 - + Attempting to instantiate invalid template type '%1<%2>' 嘗試實例化無效的範本類型 "%1<%2>" - + Instead found '%1' 而是找到了 "%1" - + Instead found identifier '%1' 而是找到識別字 "%1" - + Instead found reserved keyword '%1' 而是找到了保留關鍵字 "%1" - + Interface '%1' cannot be instantiated 無法實例化介面 "%1" - + Invalid unicode escape sequence, expected %1 hex digits 無效的 Unicode 轉義序列,預期為 %1 個十六進制數字 - + Method '%1' declared as final and cannot be overridden 方法 "%1" 已聲明為 final,因此無法被覆蓋 - + Method '%1' marked as override but does not replace any base class or interface method 方法 "%1" 標記為覆蓋,但並未替換任何基類或介面方法 - + Method '%1::%2' is missing the return type, nor is it the same name as object to be a constructor 方法 "%1::%2" 缺少返回類型,並且其名稱與構造函數對象不同 - + Method '%1' is not part of object '%2' 方法 "%1" 不是對象 "%2" 的一部分 - + Missing implementation of '%1' 缺少 "%1" 的實現 - + Missing definition of '%1' 缺少 "%1" 的定義 - + Mixin class cannot be declared as '%1' Mixin 類不能聲明為 "%1" - + Multiple matching signatures to '%1' "%1" 有多個匹配的簽名 - + Found multiple get accessors for property '%1' 發現屬性 "%1" 的多個 get 訪問器 - + Found multiple set accessors for property '%1' 發現屬性 "%1" 的多個集合訪問器 - + Namespace '%1' doesn't exist. 命名空間 "%1" 不存在。 - - - - - - - - - - - - + + + + + + + + + + + + Name conflict. 名稱衝突。 - + '%1' is an extended data type. "%1" 是擴展數據類型。 - + '%1' is a global property. "%1" 是全局屬性。 - + '%1' is a named type. "%1" 是被命名的類型。 - + '%1' is a funcdef. "%1" 是一個函數簽名定義。 - + '%1' is a global function. "%1" 是一個全局函數。 - + '%1' is a mixin class. "%1" 是一個 Mixin 類。 - + '%1' is a virtual property. "%1" 是虛擬屬性。 - + '%1' is a class. "%1" 是一個類。 - + '%1' is an interface. "%1" 是一個介面。 - + '%1' is an object property. "%1" 是一個對象屬性。 - + '%1' is a class method. "%1" 是一個類方法。 - + '%1' is already used. ”%1“ 已被使用。 - + No appropriate opHndlAssign method found in '%1' for handle assignment 在 "%1" 中未找到適當的 opHndlAssign 方法用於句柄分配 - + No conversion from '%1' to '%2' available. 無法進行從 "%1" 到 "%2" 的轉換。 - + No conversion from '%1' to math type available. 無法將 "%1" 轉換為數學類型。 - + No default constructor for object of type '%1'. "%1" 類型對象沒有默認構造函數。 - + No appropriate opAssign method found in '%1' for value assignment 在 "%1" 中未找到適合賦值的 opAssign 方法 - + No copy constructor for object of type '%1'. 沒有 "%1" 類型對象的複製構造函數。 - + No matching signatures to '%1' 沒有與 "%1" 匹配的簽名 - + No matching operator that takes the type '%1' found 未找到採用類型 "%1" 的匹配運算符 - + No matching operator that takes the types '%1' and '%2' found 未找到採用類型 "%1" 和 "%2" 的匹配運算符 - + No matching symbol '%1' 沒有匹配的符號 "%1" - + Expression doesn't form a function call. '%1' evaluates to the non-function type '%2' 運算式不構成函數調用。"%1" 計算結果為非函數類型 "%2" - + '%1' is not declared "%1" 未被聲明 - + '%1' is not initialized. ”%1“ 未初始化。 - + '%1' is not a member of '%2' ”%1“ 不是 ”%2“ 的成員 - + Type '%1' doesn't support the indexing operator 類型 "%1" 不支持索引運算符 - + Parameter type can't be '%1', because the type cannot be instantiated. 參數類型不能是 "%1",因為該類型無法實例化。 - + Previous error occurred while attempting to compile initialization list for type '%1' 嘗試編譯類型 "%1" 的初始化列表時發生先前的錯誤 - + Illegal call to private method '%1' 非法調用私有方法 "%1" - + Illegal access to private property '%1' 非法訪問私有屬性 "%1" - + Illegal call to protected method '%1' 非法調用受保護的方法 "%1" - + Illegal access to protected property '%1' 非法訪問受保護的屬性 "%1" - + Return type can't be '%1' 返回類型不能是 "%1" - + Shared code cannot access non-shared global variable '%1' 共用代碼無法訪問非共用全局變數 "%1" - + Shared code cannot call non-shared function '%1' 共用代碼無法調用非共用函數 "%1" - + Shared type cannot implement non-shared interface '%1' 共用類型無法實現非共用介面 "%1" - + Shared class cannot inherit from non-shared class '%1' 共用類不能從非共用類 "%1" 繼承 - + Shared code cannot use non-shared type '%1' 共用代碼不能使用非共用類型 "%1" - + Shared type '%1' doesn't match the original declaration in other module 共用類型 "%1" 與其他模組中的原始聲明不匹配 - + Template '%1' expects %2 sub type(s) 範本 "%1" 需要 %2 個子類型 - + Type '%1' cannot be a reference 類型 "%1" 不能是引用 - + Type '%1' is not available for this module 類型 "%1" 不適用於此模組 - + Type '%1' is not a template type 類型 "%1" 不是範本類型 - + Unexpected token '%1' 意外標記 "%1" - + Use of uninitialized global variable '%1'. 使用未初始化的全局變數 "%1"。 - + Unknown scope '%1' 未知作用域 "%1" - + Where '%1' is '%2' 其中 "%1" 是 "%2" - + Failed to initialize global variable '%1' 無法初始化全局變數 "%1" - + Exception '%1' in '%2' "%2" 中的異常 "%1" - + Type '%1' is missing behaviours 類型 "%1" 缺少的行為 - + Can't pass type '%1' by value unless the application type is informed in the registration 除非在註冊時告知應用程式類型,否則無法按值傳遞類型 "%1" - + Can't return type '%1' by value unless the application type is informed in the registration 除非在註冊時告知應用程式類型,否則無法按值返回類型 "%1" - + Don't support passing type '%1' by value to application in native calling convention on this platform 不支持在此平臺上按照本機調用約定將類型 "%1" 按值傳遞給應用程式 - + Don't support returning type '%1' by value from application in native calling convention on this platform 不支持在此平臺上按照本機調用約定從應用程式返回類型 "%1" 的值 - + Object {%1}. GC cannot destroy an object of type '%2' as it doesn't know how many references to there are. 對象 {%1}。GC 無法銷毀類型為 "%2" 的對象,因為它不知道有多少個引用。 - + Object {%1}. GC cannot destroy an object of type '%2' as it can't see all references. Current ref count is %3. 對象 {%1}。GC 無法銷毀類型為 "%2" 的對象,因為它無法看到所有引用。當前引用計數為 %3。 - + Object type '%1' doesn't exist 對象類型 "%1" 不存在 - + Cannot register. The template type instance '%1' has already been generated. 無法註冊。範本類型實例 "%1" 已生成。 - + Template type '%1' doesn't exist 範本類型 "%1" 不存在 - + Template subtype '%1' doesn't exist 範本子類型 "%1" 不存在 - + Failed to read subtype of template type '%1' 無法讀取範本類型 "%1" 的子類型 - + Failed in call to function '%1' (Code: %2, %3) 調用函數 "%1" 失敗(代碼:%2,%3) - + Failed in call to function '%1' with '%2' (Code: %3, %4) 使用 "%2" 調用函數 "%1" 失敗(代碼:%3,%4) - + Failed in call to function '%1' with '%2' and '%3' (Code: %4, %5) 使用 "%2" 和 "%3" 調用函數 "%1" 失敗(代碼:%4,%5) - + Type '%1' is still used by function '%2' 類型 "%1" 仍被函數 "%2" 使用 - + The builtin type in previous message is named '%1' 上一條消息中的內置類型名為 "%1" - + The function in previous message is named '%1'. The func type is %2 上一條消息中的函數名為 "%1"。函數類型為 %2 - + The script object of type '%1' is being resurrected illegally during destruction 類型為 "%1" 的腳本對象在銷毀過程中被非法復活 - + LoadByteCode failed. The bytecode is invalid. Number of bytes read from stream: %1 LoadByteCode 失敗。位元組碼無效。從流中讀取的位元組數:%1 - + Function '%1' appears to have been compiled without JIT entry points 函數 "%1" 似乎已在無 JIT 入口點的情況下進行編譯 - + There is an external reference to an object in module '%1', preventing it from being deleted 存在對模組 "%1" 中對象的外部引用,導致無法刪除該對象 - + Output argument expression is not assignable 輸出參數運算式不可分配 - + Auto is not allowed here 這裏禁止使用 auto 關鍵字 - + Can't find unambiguous implicit conversion to make both expressions have the same type 無法找到明確的隱式轉換來使兩個運算式具有相同的類型 - + Both conditions must call constructor 兩個條件都必須調用構造函數 - + Base class doesn't have default constructor. Make explicit call to base constructor 基類沒有默認構造函數。明確調用基類構造函數 - + Base class doesn't have copy constructor or default constructor and assign operator. Make explicit call to base constructor 基類沒有複製構造函數或默認構造函數和賦值運算符。明確調用基類構造函數 - + Candidates are: 候選包括: - + Can't call a constructor in loops 無法在迴圈中調用構造函數 - + Can't call a constructor in switch 無法在 switch 中調用構造函數 - + Can't call a constructor multiple times 無法多次調用構造函數 - + Can't create delegate 無法創建委託 - + Can't create delegate for types that do not support handles 無法為不支持句柄的類型創建委託 - + Cannot flag function that will not be auto generated as deleted 無法將不會自動生成的函數標記為已刪除 - + Conflict with explicit declaration of function and deleted function 與函數的顯式聲明和已刪除函數衝突 - + Can't implement itself, or another interface that implements this interface 無法實現自身,也無法實現此介面的其他介面 - + Can't inherit from multiple classes 不能從多個類繼承 - + Can't inherit from itself, or another class that inherits from this class 不能從其自身或從該類繼承的其他類繼承 - + Can't pass class method as arg directly. Use a delegate object instead 無法直接將類方法作為參數傳遞。請改用委託對象 - + Unable to resolve auto type 無法解析自動類型 - + Can't return reference to local value. 無法返回對本地值的引用。 - + Can't return value when return type is 'void' 返回類型為 "void" 時無法返回值 - + Implicit conversion changed sign of value 隱式轉換改變了值的符號 - + A class cannot be both abstract and final 一個類不能同時是 abstract 和 final - + Compound assignments with property accessors on value types are not supported 不支持對值類型使用屬性訪問器的複合賦值 - + Compound assignments with indexed property accessors are not supported 不支持使用索引屬性訪問器的複合賦值 - + Compound assignments with property accessors require both get and set accessors 具有屬性訪問器的複合賦值需要 get 和 set 訪問器 - + Variables cannot be declared in switch cases, except inside statement blocks 變數不能在 switch 語句中聲明,除非在語句塊內 - + The default case must be the last one default 情況必須是最後一個 - + The type of the default argument expression doesn't match the function parameter type 默認參數運算式的類型與函數參數類型不匹配 - + Deleted functions cannot have implementation 已刪除的函數不能有實現 - + The destructor must not have any parameters 析構函數不能有任何參數 - + Value assignment on reference types is not allowed. Did you mean to do a handle assignment? 不允許對引用類型進行值分配。是要進行句柄分配嗎? - + Compound assignment on reference types is not allowed 不允許對引用類型進行複合賦值 - + Duplicate named argument 重複命名參數 - + Duplicate switch case 重複的 switch case - + Else with empty statement else 中使用空語句 - + Empty list element is not allowed 不允許空列表元素 - + Empty switch statement 空的 switch 語句 - + Expected constant 應為常量 - + Expected data type 應為數據類型 - + Expected expression value 應為表達值 - + Expected identifier 應為識別字 - + Expected a list enclosed by { } to match pattern 應為用 { } 括起來的列表與模式匹配 - + Expected method or property 應為方法或屬性 - + Expected one of: 應為為以下之一: - + Expected operator 應為操作符 - + Expected post operator 應為右操作符 - + Expected pre operator 應為左操作符 - + Expected string 應為字串 - + Expression doesn't evaluate to a function 運算式無法計算函數值 - + Previous error occurred while attempting to create a temporary copy of object 嘗試創建對象的臨時副本時發生上一個錯誤 - + Float value truncated in implicit conversion to integer 浮點值在隱式轉換為整數時被截斷 - + Found multiple matching enum values 找到多個匹配的枚舉值 - + A function with the same name and parameters already exists 具有相同名稱和參數的函數已存在 - + Global variables have been disabled by the application 全局變數已被應用程式禁用 - + It is not allowed to perform a handle assignment on a non-handle property 不允許對非句柄屬性執行句柄分配 - + The operand is implicitly converted to handle in order to compare them 運算元被隱式轉換為句柄,以便進行比較 - + Handle to handle is not allowed 不允許使用句柄 - + If with empty statement 如果帶有空語句 - + Illegal member type 非法成員類型 - + Illegal operation on this datatype 對該數據類型的非法操作 - + Illegal target type for reference cast 非法引用轉換的目標類型 - + Interfaces can only implement other interfaces 介面只能實現其他介面 - + Invalid 'break' 無效的 break 關鍵字 - + Invalid character literal 無效的字元 - + Invalid 'continue' 無效的 continue 關鍵字 - + Invalid escape sequence 無效的轉義序列 - + Invalid expression: ambiguous name 無效運算式:二義性名稱 - + Invalid expression: stand-alone anonymous function 無效運算式:獨立匿名函數 - + Invalid operation on method 方法操作無效 - + Invalid reference. Property accessors cannot be used in combined read/write operations 引用無效。屬性訪問器不能用於組合讀/寫操作。 - + Invalid scope resolution 範圍解析無效 - + Invalid signature for virtual property 虛擬屬性簽名無效 - + Invalid type 類型無效 - + Invalid unicode code point 無效的 Unicode 代碼點 - + Invalid unicode sequence in source 源代碼中的 Unicode 序列無效 - + Invalid use of named arguments 命名參數的使用無效 - + The method cannot be named with the class name 該方法不能以類名命名 - + Mixin classes cannot have constructors or destructors Mixin 類不能有構造函數或析構函數 - + Mixin class cannot inherit from classes Mixin 類不能從類繼承 - + Mixin classes cannot have child types Mixin 類不能有子類型 - + Found more than one matching operator 找到多個匹配的運算符 - + Multiline strings are not allowed in this application 此應用程式不允許使用多行字串 - + Only objects have constructors 只有對象才有構造函數 - + Must return a value 必須返回一個值 - + Detected named argument with old syntax 檢測到具有舊語法的命名參數 - + No appropriate indexing operator found 未找到合適的索引運算符 - + No appropriate opEquals method found 未找到合適的 opEquals 方法 - + The application doesn't support the default array type. 該應用程式不支持默認數組類型。 - + Non-const method call on read-only object reference 只讀對象引用上的非常量方法調用 - + Non-terminated string literal 未終止的字串 - + Not all paths return a value 並非所有路徑都會返回值 - + Not enough values to match pattern 沒有足夠的值來模式匹配 - + Implicit conversion of value is not exact 值的隱式轉換並不準確 - + Expression is not an l-value 運算式不是左值 - + Not a valid reference 無效引用 - + Not a valid lvalue 不是有效的左值 - + Nothing was built in the module 模組中沒有構建任何內容 - + Object handle is not supported for this type 此類型不支持對象句柄 - + Only object types that support object handles can use &inout. Use &in or &out instead 只有支持對象句柄的對象類型才能使用 &inout。請改用 &in 或 &out - + A cast operator has one argument 強制類型轉換運算符有一個參數 - + The code must contain one and only one function 代碼必須包含一個且只能包含一個函數 - + The code must contain one and only one global variable 代碼必須包含一個且只能有一個全局變數 - + Both operands must be handles when comparing identity 比較時,兩個運算元都必須是句柄 - + The overloaded functions are identical on initial parameters without default arguments 重載函數在初始參數上相同,沒有默認參數 - + Parameter already declared 參數已聲明 - + Positional arguments cannot be passed after named arguments 位置參數不能在命名參數之後傳遞 - + Potentially matching non-const method is hidden on read-only object reference 可能匹配的非 const 方法隱藏在只讀對象引用中 - + Property accessor with index must have 1 and only 1 index argument 帶索引的屬性訪問器必須有 1 個且只能有 1 個索引參數 - + Property accessors have been disabled by the application 應用程式已禁用屬性訪問器 - + Property accessor must be implemented 必須實現屬性訪問器 - + Class properties cannot be declared as const 類屬性不能聲明為 const - + The property has no get accessor 該屬性沒有 get 訪問器 - + The property has no set accessor 該屬性沒有設置訪問器 - + Virtual property must have at least one get or set accessor 虛擬屬性必須至少有一個 get 或 set 訪問器 - + Resulting reference cannot be returned. Returned references must not refer to local variables. 無法返回結果引用。返回的引用不得引用局部變數。 - + Resulting reference cannot be returned. There are deferred arguments that may invalidate it. 無法返回結果引用。存在可能使其無效的延遲參數。 - + Resulting reference cannot be returned. The expression uses objects that during cleanup may invalidate it. 無法返回結果引用。運算式使用的對象在清理過程中可能會使其失效。 - + Reference is read-only 引用是只讀的 - + Reference is temporary 參考是臨時的 - + Reference types cannot be passed by value in function parameters 引用類型不能在函數參數中按值傳遞 - + Reference types cannot be returned by value from functions 引用類型不能通過函數返回值 - + The script section is empty 腳本節區為空 - + Signed/Unsigned mismatch 有符號/無符號不匹配 - + Strings are not recognized by the application 應用程式無法識別字串 - + Case expressions must be literal constants case 運算式必須是文字常量 - + Switch expressions must be integral numbers switch 運算式必須是整數 - + The function has too many jump labels to handle. Split the function into smaller ones. 該函數的跳轉標籤過多,無法處理。請將函數拆分為較小的函數。 - + Too many values to match pattern 與模式匹配的值過多 - + Unexpected end of file 意外的檔結束 - + Unexpected variable declaration 意外的變數聲明 - + Unreachable code 無法訪問的代碼 - + Virtual property contains unrecognized aspect 虛擬屬性包含未被認可的部分 - + Unused script node 未使用的腳本節點 - + Value is too large for data type 對於數據類型來說,值太大 - + Void cannot be an operand in expressions void 不能作為運算式中的運算元 - + Warnings are treated as errors by the application 應用程式將警告視為錯誤 - + While parsing argument list 解析參數列表時 - + While parsing expression 解析運算式時 - + While parsing initialization list 解析初始化列表時 - + While parsing namespace 解析命名空間時 - + While parsing statement block 解析語句塊時 - + Previous error occurred while including mixin 包含 mixin 時發生先前錯誤 - + Autohandles cannot be used with types that have been registered with NOCOUNT 自動句柄不能與已使用 NOCOUNT 註冊的類型一起使用 - + First parameter to template factory must be a reference. This will be used to pass the object type of the template 範本工廠的第一個參數必須是引用。這將用於傳遞範本的對象類型 - + Invalid configuration. Verify the registered application interface. 配置無效。請驗證已註冊的應用程式介面。 - + A value type must be registered with a non-zero size 值類型必須註冊為非零大小 - + The behaviour is not compatible with the type 行為與類型不相容 - + A garbage collected ref type must have the addref, release, and all gc behaviours 垃圾收集引用類型必須具有 addref、release 和所有 gc 行為 - + A garbage collected value type must have the gc enum references behaviour 垃圾收集值類型必須具有 gc 枚舉引用行為 - + A scoped reference type must have the release behaviour 作用域引用類型必須具有釋放行為 - + A reference type must have the addref and release behaviours 引用類型必須具有 addref 和 release 行為 - + A non-pod value type must have at least one constructor and the destructor behaviours 非 pod 值類型必須至少有一個構造函數和析構函數行為 - + Template list factory expects two reference parameters. The last is the pointer to the initialization buffer 範本列表工廠需要兩個引用參數。最後一個是指向初始化緩衝區的指針 - + List factory expects only one reference parameter. The pointer to the initialization buffer will be passed in this parameter 列表工廠僅需要一個引用參數。指向初始化緩衝區的指針將在此參數中傳遞 - + AddScriptObjectToGC called with null pointer 使用空指針調用 AddScriptObjectToGC - + An exception occurred in a nested call 嵌套調用中發生異常 - + Uh oh! The engine's reference count is increasing while it is being destroyed. Make sure references needed for clean-up are immediately released 哎呀!引擎的引用計數在被銷毀時不斷增加。確保立即釋放清理所需的引用 - + The module is still in use and cannot be rebuilt. Discard it and request another module 該模組仍在使用中,無法重建。丟棄它並請求另一個模組 - + Property 屬性 - + System function 系統函數 - + Variable declaration 變數聲明 - + Stack overflow 棧溢出 - + Null pointer access 空指針訪問 - + Divide by zero 除以零 - + Overflow in integer division 整數除法溢出 - + Overflow in exponent operation 指數運算溢出 - + Unrecognized byte code 無法識別的位元組碼 - + Invalid calling convention 無效調用約定 - + Unbound function called 未綁定的函數被調用 - + Out of range 越界 - + Caught an exception from the application 捕獲應用程式異常 - + Mismatching types in value assignment 值分配中的類型不匹配 - + Too many nested calls 嵌套調用過多 - - + + Assert failed 斷言失敗 - + BadDecl: 錯誤的聲明: - + GlobalBadDecl 錯誤的全局聲明 @@ -4485,27 +4481,27 @@ 多行代碼粘貼後將不能修改 - + Copy 複製 - + Cut 剪切 - + Paste 粘貼 - + Clear 清空 - + AbortScript 終止腳本 @@ -4513,12 +4509,12 @@ ScriptingConsoleBase - + Scripting console for WingHexExplorer 羽雲十六進制編輯器腳本控制臺 - + >>>> Powered by AngelScript <<<< >>>> 由 AngelScript 引擎提供支持 <<<< @@ -4743,118 +4739,118 @@ 變數 - + ConsoleOutput 輸出 - + StackTrace 棧跟蹤 - + Symbol 符號 - - - - - - + + + + + + Error 錯誤 - + Too much opened files 打開的檔過多,無法繼續操作! - + ConfirmSave 正在關閉未保存的腳本檔,你確定保存嗎? - + ScriptSaveFailedClose 腳本保存失敗,你仍確認關閉嗎? - + Debuging... 調試中... - + Running... 運行中... - + Line %1, Col %2 行 %1, 列 %2 - + (Selected: %1) (選中: %1) - - + + ChooseFile 選擇檔 - - - + + + FilePermission 因檔許可權無法繼續! - + ReloadSuccessfully 檔重新加載成功! - + ReloadUnSuccessfully 檔重新加載失敗! - + ChooseSaveFile 請選擇保存檔路徑: - - + + SaveSuccessfully 保存成功! - + SaveUnSuccessfully 保存失敗! - + FormatCodeFailed 代碼格式化失敗 - - + + CannotSave2RunScript 無法保存,故無法繼續運行腳本。 - - + + ScriptStillRunning 腳本仍在運行,你確定要退出嗎? @@ -5419,7 +5415,12 @@ asDebugger - + + ScriptTimedOut + 腳本代碼運行超時 + + + {no engine} {無引擎} diff --git a/src/class/angelobjstring.cpp b/src/class/angelobjstring.cpp index 758c2dc..e95ccbb 100644 --- a/src/class/angelobjstring.cpp +++ b/src/class/angelobjstring.cpp @@ -25,43 +25,49 @@ AngelObjString::AngelObjString() {} -QString AngelObjString::stringToString(void *obj, asDebugger *dbg) { +QString AngelObjString::stringToString(void *obj, asDebugger *dbg, asUINT tag) { Q_UNUSED(dbg); // We know the received object is a string QString val = *reinterpret_cast(obj); + if (tag == 1) { + val.prepend('"').append('"'); + } return val; } -QString AngelObjString::arrayToString(void *obj, asDebugger *dbg) { +QString AngelObjString::arrayToString(void *obj, asDebugger *dbg, asUINT tag) { CScriptArray *arr = reinterpret_cast(obj); QString str; QTextStream s(&str); - s << tr("(len=") << arr->GetSize() << QStringLiteral(")"); - - s << QStringLiteral(" ["); + s << QStringLiteral("{"); for (asUINT n = 0; n < arr->GetSize(); n++) { s << dbg->toString(arr->At(n), arr->GetElementTypeId(), - arr->GetArrayObjectType()->GetEngine()); + arr->GetArrayObjectType()->GetEngine(), 1); if (n < arr->GetSize() - 1) s << ", "; } - s << QStringLiteral("]"); + s << QStringLiteral("}"); return str; } -QString AngelObjString::charToString(void *obj, asDebugger *dbg) { +QString AngelObjString::charToString(void *obj, asDebugger *dbg, asUINT tag) { Q_UNUSED(dbg); // We know the received object is a char QChar *val = reinterpret_cast(obj); - return QString(*val); + auto ret = QString(*val); + if (tag == 1) { + ret.prepend('\'').append('\''); + } + return ret; } -QString AngelObjString::dictionaryToString(void *obj, asDebugger *dbg) { +QString AngelObjString::dictionaryToString(void *obj, asDebugger *dbg, + asUINT tag) { CScriptDictionary *dic = reinterpret_cast(obj); QString str; @@ -69,11 +75,11 @@ QString AngelObjString::dictionaryToString(void *obj, asDebugger *dbg) { auto engine = dic->GetEngine(); - s << " {"; + s << QStringLiteral("{"); asUINT n = 0; for (CScriptDictionary::CIterator it = dic->begin(); it != dic->end(); it++, n++) { - s << "[" << it.GetKey() << "] = "; + s << QStringLiteral("[") << it.GetKey() << QStringLiteral("] = "); // Get the type and address of the value const void *val = it.GetAddressOfValue(); @@ -83,17 +89,17 @@ QString AngelObjString::dictionaryToString(void *obj, asDebugger *dbg) { // active, the debugger will use the engine held inside it by // default, but in an environment where there multiple engines this // might not be the correct instance). - s << dbg->toString(const_cast(val), typeId, engine); + s << dbg->toString(const_cast(val), typeId, engine, 1); if (n < dic->GetSize() - 1) - s << ", "; + s << QStringLiteral(", "); } - s << "}"; + s << QStringLiteral("}"); return str; } -QString AngelObjString::colorToString(void *obj, asDebugger *dbg) { +QString AngelObjString::colorToString(void *obj, asDebugger *dbg, asUINT tag) { Q_UNUSED(dbg); auto color = reinterpret_cast(obj); diff --git a/src/class/angelobjstring.h b/src/class/angelobjstring.h index c811150..f604483 100644 --- a/src/class/angelobjstring.h +++ b/src/class/angelobjstring.h @@ -28,16 +28,15 @@ class AngelObjString : public QObject { Q_OBJECT public: - // for debugger use - static QString stringToString(void *obj, asDebugger *dbg); + static QString stringToString(void *obj, asDebugger *dbg, asUINT tag); - static QString arrayToString(void *obj, asDebugger *dbg); + static QString arrayToString(void *obj, asDebugger *dbg, asUINT tag); - static QString charToString(void *obj, asDebugger *dbg); + static QString charToString(void *obj, asDebugger *dbg, asUINT tag); - static QString dictionaryToString(void *obj, asDebugger *dbg); + static QString dictionaryToString(void *obj, asDebugger *dbg, asUINT tag); - static QString colorToString(void *obj, asDebugger *dbg); + static QString colorToString(void *obj, asDebugger *dbg, asUINT tag); public: // ================================================== diff --git a/src/class/appmanager.cpp b/src/class/appmanager.cpp index 38c53dd..db3bc92 100644 --- a/src/class/appmanager.cpp +++ b/src/class/appmanager.cpp @@ -143,8 +143,9 @@ AppManager::AppManager(int &argc, char *argv[]) } AppManager::~AppManager() { - InspectQtLogHelper::instance().destory(); ClangFormatManager::instance().save(); + ScriptMachine::instance().deleteLater(); + InspectQtLogHelper::instance().destory(); CommandHistoryManager::save(QConsoleWidget::history().strings_); delete _w; @@ -155,7 +156,7 @@ AppManager *AppManager::instance() { return _instance; } MainWindow *AppManager::mainWindow() const { return _w; } -uint AppManager::currentMSecsSinceEpoch() { return _timer.elapsed(); } +quint64 AppManager::currentMSecsSinceEpoch() { return _timer.elapsed(); } void AppManager::openFile(const QString &file, bool autoDetect) { EditorView *editor = nullptr; diff --git a/src/class/appmanager.h b/src/class/appmanager.h index d1a9532..97a9e37 100644 --- a/src/class/appmanager.h +++ b/src/class/appmanager.h @@ -38,7 +38,7 @@ public: QApplication::tr("WingCloudStudio"); } - uint currentMSecsSinceEpoch(); + quint64 currentMSecsSinceEpoch(); public slots: void openFile(const QString &file, bool autoDetect = true); diff --git a/src/class/ascompletion.cpp b/src/class/ascompletion.cpp index 82a50b7..1c8da1f 100644 --- a/src/class/ascompletion.cpp +++ b/src/class/ascompletion.cpp @@ -414,6 +414,10 @@ QList AsCompletion::parseDocument() { // first preprocess the code AsPreprocesser prepc(engine); prepc.setIncludeCallback(&AsCompletion::includeCallBack, this); + prepc.setPragmaCallback([](const QByteArray &, AsPreprocesser *, + const QString &, + void *) -> int { return asSUCCESS; }, + nullptr); auto r = prepc.loadSectionFromMemory(QStringLiteral("ASCOMPLETION"), code.toUtf8()); diff --git a/src/class/asdebugger.cpp b/src/class/asdebugger.cpp index 5631ffb..cf0a775 100644 --- a/src/class/asdebugger.cpp +++ b/src/class/asdebugger.cpp @@ -16,6 +16,7 @@ */ #include "asdebugger.h" +#include "class/appmanager.h" #include "define.h" #include @@ -78,6 +79,40 @@ void asDebugger::lineCallback(asIScriptContext *ctx) { if (ctx == nullptr) return; + // By default we ignore callbacks when the context is not active. + // An application might override this to for example disconnect the + // debugger as the execution finished. + if (ctx->GetState() != asEXECUTION_ACTIVE) + return; + + auto now = AppManager::instance()->currentMSecsSinceEpoch(); + auto timer = reinterpret_cast( + ctx->GetUserData(AsUserDataType::UserData_Timer)); + auto mode = ScriptMachine::ConsoleMode(reinterpret_cast( + ctx->GetUserData(AsUserDataType::UserData_ContextMode))); + + bool timeOut = false; + if (timer < 0) { + timeOut = true; + } else { + if (mode == ScriptMachine::DefineEvaluator) { + timeOut = (now - timer) > 3000; // 3 s + } else { + timeOut = (now - timer) > 600000; // 10 min + } + } + + if (timeOut) { + auto timeOut = tr("ScriptTimedOut"); + ScriptMachine::MessageInfo info; + info.message = timeOut; + info.mode = mode; + info.type = ScriptMachine::MessageType::Error; + ScriptMachine::instance().outputMessage(info); + ctx->Abort(); + return; + } + auto isDbg = reinterpret_cast( ctx->GetUserData(AsUserDataType::UserData_isDbg)); if (!isDbg) { @@ -107,12 +142,6 @@ void asDebugger::lineCallback(asIScriptContext *ctx) { } } - // By default we ignore callbacks when the context is not active. - // An application might override this to for example disconnect the - // debugger as the execution finished. - if (ctx->GetState() != asEXECUTION_ACTIVE) - return; - auto dbgContext = reinterpret_cast(ctx->GetUserData()); Q_ASSERT(dbgContext); @@ -368,7 +397,7 @@ bool asDebugger::checkBreakPoint(asIScriptContext *ctx) { } QString asDebugger::toString(void *value, asUINT typeId, - asIScriptEngine *engine) { + asIScriptEngine *engine, asUINT tag) { if (value == nullptr) return QStringLiteral(""); @@ -445,7 +474,8 @@ QString asDebugger::toString(void *value, asUINT typeId, s << name /*type->GetPropertyDeclaration(n)*/ << QStringLiteral(" = ") << toString(obj->GetAddressOfProperty(n), - obj->GetPropertyTypeId(n), type->GetEngine()); + obj->GetPropertyTypeId(n), type->GetEngine(), + 1); } } } @@ -482,7 +512,7 @@ QString asDebugger::toString(void *value, asUINT typeId, // Invoke the callback to get the string representation of // this type - s << it.value()(value, this); + s << it.value()(value, this, tag); } else { // Unknown type: type + address s << type->GetName() << '(' << value << ')'; diff --git a/src/class/asdebugger.h b/src/class/asdebugger.h index f43dff6..b66aaf1 100644 --- a/src/class/asdebugger.h +++ b/src/class/asdebugger.h @@ -84,7 +84,7 @@ public: virtual ~asDebugger(); // Register callbacks to handle to-string conversions of application types - typedef QString (*ToStringCallback)(void *obj, asDebugger *dbg); + typedef QString (*ToStringCallback)(void *obj, asDebugger *dbg, asUINT tag); void registerToStringCallback(const asITypeInfo *ti, ToStringCallback callback); @@ -108,8 +108,9 @@ public: // Line callback invoked by context void lineCallback(asIScriptContext *ctx); + // tag = 1 : string should be printed with quotes QString toString(void *value, asUINT typeId, - asIScriptEngine *engine = nullptr); + asIScriptEngine *engine = nullptr, asUINT tag = 0); GCStatistic gcStatistics(); diff --git a/src/class/aspreprocesser.cpp b/src/class/aspreprocesser.cpp index 62f49cc..a2dbb12 100644 --- a/src/class/aspreprocesser.cpp +++ b/src/class/aspreprocesser.cpp @@ -16,9 +16,11 @@ */ #include "aspreprocesser.h" +#include "class/scriptmachine.h" #include #include +#include Q_GLOBAL_STATIC_WITH_ARGS( QStringList, DEFAULT_MARCO, @@ -36,7 +38,9 @@ AsPreprocesser::AsPreprocesser(asIScriptEngine *engine) : engine(engine) { pragmaCallback = nullptr; pragmaParam = nullptr; - definedWords = *DEFAULT_MARCO; + for (auto &m : *DEFAULT_MARCO) { + definedWords.insert(m, {}); + } } AsPreprocesser::~AsPreprocesser() { void ClearAll(); } @@ -85,9 +89,10 @@ void AsPreprocesser::setPragmaCallback(PRAGMACALLBACK_t callback, pragmaParam = userParam; } -void AsPreprocesser::defineWord(const QString &word) { +void AsPreprocesser::defineWord(const QString &word, + const DefineValueType &value) { if (!definedWords.contains(word)) { - definedWords.append(word); + definedWords.insert(word, value); } } @@ -114,7 +119,8 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, // shouldn't be compiled QByteArray::size_type pos = 0; - int nested = 0; + QStack> m_condtionStack; + while (pos < modifiedScript.size()) { asUINT len = 0; asETokenClass t = engine->ParseToken(modifiedScript.data() + pos, @@ -128,10 +134,14 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, modifiedScript.size() - pos, &len); Q_UNUSED(t); - QByteArray token = modifiedScript.mid(pos, len); + QByteArray token = modifiedScript.sliced(pos, len); pos += len; - if (token == "if") { + bool isIf = token == QStringLiteral("if"); + bool isIfDef = token == QStringLiteral("ifdef"); + bool isIfnDef = token == QStringLiteral("ifndef"); + + if (isIf || isIfDef || isIfnDef) { t = engine->ParseToken(modifiedScript.data() + pos, modifiedScript.size() - pos, &len); if (t == asTC_WHITESPACE) { @@ -140,34 +150,87 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, modifiedScript.size() - pos, &len); } - if (t == asTC_IDENTIFIER) { - QByteArray word = modifiedScript.mid(pos, len); + if (isIfDef || isIfnDef) { + if (t == asTC_IDENTIFIER) { + QByteArray word = modifiedScript.sliced(pos, len); - // Overwrite the #if directive with space characters to - // avoid compiler error - pos += len; - overwriteCode(modifiedScript, start, pos - start); + // Overwrite the directive with space characters to + // avoid compiler error + pos += len; + overwriteCode(modifiedScript, start, pos - start); - // Has this identifier been defined by the application or - // not? - if (!definedWords.contains(word)) { - // Exclude all the code until and including the #endif - pos = excludeCode(modifiedScript, pos); + // Has this identifier been defined by the application + // or not? + if ((isIfDef && !definedWords.contains(word)) || + (isIfnDef && definedWords.contains(word))) { + // Exclude all the code until and including the + // #endif + pos = excludeCode(modifiedScript, pos); + m_condtionStack.push(false); + } else { + m_condtionStack.push(true); + } + qDebug().noquote() << modifiedScript; + } + } else { + // evalutate the string + auto npos = modifiedScript.indexOf('\n', pos); + auto codes = modifiedScript.sliced(pos, npos - pos); + overwriteCode(modifiedScript, start, npos - start); + + auto &sm = ScriptMachine::instance(); + bool ok = false; + auto ret = sm.evaluateDefine(codes, ok); + + if (ret < 0) { + return asERROR; } else { - nested++; + if (ok) { + m_condtionStack.push(true); + } else { + pos = excludeCode(modifiedScript, npos); + m_condtionStack.push(false); + } + } + + qDebug().noquote() << modifiedScript; + } + } else if (token == "else") { + if (m_condtionStack.isEmpty()) { + // TODO + return asERROR; + } else { + overwriteCode(modifiedScript, start, pos - start); + auto opBool = m_condtionStack.top(); + if (opBool) { + if (opBool.value()) { + pos = excludeCode(modifiedScript, pos); + m_condtionStack.top().reset(); + } + } else { + // TODO + return asERROR; } } + qDebug().noquote() << modifiedScript; } else if (token == "endif") { // Only remove the #endif if there was a matching #if - if (nested > 0) { + if (m_condtionStack.isEmpty()) { + // TODO + return asERROR; + } else { overwriteCode(modifiedScript, start, pos - start); - nested--; + m_condtionStack.pop(); } + qDebug().noquote() << modifiedScript; } - } else + } else { pos += len; + } } + qDebug().noquote() << modifiedScript; + // Then check for pre-processor directives pos = 0; while (pos >= 0 && pos < modifiedScript.size()) { @@ -178,7 +241,7 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, pos += len; continue; } - QString token = modifiedScript.mid(pos, len); + QString token = modifiedScript.sliced(pos, len); // Skip possible decorators before class and interface declarations if (token == "shared" || token == "abstract" || token == "mixin" || @@ -194,7 +257,7 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, t = engine->ParseToken(modifiedScript.data() + pos, modifiedScript.size() - pos, &len); if (t == asTC_IDENTIFIER) { - token = modifiedScript.mid(pos, len); + token = modifiedScript.sliced(pos, len); if (token == "include") { pos += len; t = engine->ParseToken(modifiedScript.data() + pos, @@ -211,7 +274,7 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, modifiedScript[pos] == '\'')) { // Get the include file QString includefile = - modifiedScript.mid(pos + 1, len - 2); + modifiedScript.sliced(pos + 1, len - 2); pos += len; // Make sure the includeFile doesn't contain any @@ -255,7 +318,8 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, if (found) { QString includefile = - modifiedScript.mid(pos, rpos - pos).trimmed(); + modifiedScript.sliced(pos, rpos - pos) + .trimmed(); pos = rpos + 1; @@ -303,7 +367,7 @@ int AsPreprocesser::processScriptSection(const QByteArray &script, // Call the pragma callback auto pragmaText = - modifiedScript.mid(start + 7, pos - start - 7); + modifiedScript.sliced(start + 7, pos - start - 7); // Overwrite the pragma directive with space characters // to avoid compiler error @@ -449,27 +513,32 @@ int AsPreprocesser::skipStatement(const QByteArray &modifiedScript, int pos) { int AsPreprocesser::excludeCode(QByteArray &modifiedScript, int pos) { asUINT len = 0; - int nested = 0; + int nested = 1; while (pos < (int)modifiedScript.size()) { engine->ParseToken(modifiedScript.data() + pos, modifiedScript.size() - pos, &len); if (modifiedScript[pos] == '#') { - modifiedScript[pos] = ' '; + auto sharpPos = pos; pos++; - // Is it an #if or #endif directive? engine->ParseToken(modifiedScript.data() + pos, modifiedScript.size() - pos, &len); - QString token = modifiedScript.mid(pos, len); - overwriteCode(modifiedScript, pos, len); + QString token = modifiedScript.sliced(pos, len); - if (token == "if") { + if (token == "if" || token == "ifdef" || token == "ifndef") { + modifiedScript[sharpPos] = ' '; + overwriteCode(modifiedScript, pos, len); nested++; - } else if (token == "endif") { + } else if (token == "endif" || token == "else") { if (nested-- == 0) { - pos += len; + pos = sharpPos - 1; break; } + modifiedScript[sharpPos] = ' '; + overwriteCode(modifiedScript, pos, len); + } else { + modifiedScript[sharpPos] = ' '; + overwriteCode(modifiedScript, pos, len); } } else if (modifiedScript[pos] != '\n') { overwriteCode(modifiedScript, pos, len); diff --git a/src/class/aspreprocesser.h b/src/class/aspreprocesser.h index d5e856d..cca0e0a 100644 --- a/src/class/aspreprocesser.h +++ b/src/class/aspreprocesser.h @@ -35,6 +35,7 @@ #pragma warning(disable : 4786) #endif +#include #include #include #include @@ -62,6 +63,16 @@ typedef int (*PRAGMACALLBACK_t)(const QByteArray &pragmaText, // Helper class for loading and pre-processing script files to // support include directives declarations +/** for macros, we support: + * * #if + * * #else + * * #endif + * * #define + * * #define + * * #undef + * * #ifdef + * * #ifundef + */ class AsPreprocesser { public: explicit AsPreprocesser(asIScriptEngine *engine); @@ -73,6 +84,9 @@ public: QByteArray script; }; + using DefineValueType = + std::variant; + public: // Load a script section from a file on disk // Returns 1 if the file was included @@ -93,7 +107,7 @@ public: void setPragmaCallback(PRAGMACALLBACK_t callback, void *userParam); // Add a pre-processor define for conditional compilation - void defineWord(const QString &word); + void defineWord(const QString &word, const DefineValueType &value = {}); // Enumerate included script sections unsigned int sectionCount() const; @@ -124,7 +138,8 @@ protected: QStringList includedScripts; - QStringList definedWords; + QEventLoop waitLoop; + QHash definedWords; }; #endif // ASPREPROCESSER_H diff --git a/src/class/scriptmachine.cpp b/src/class/scriptmachine.cpp index ae4e82e..2d31783 100644 --- a/src/class/scriptmachine.cpp +++ b/src/class/scriptmachine.cpp @@ -43,7 +43,75 @@ #include #include -ScriptMachine::~ScriptMachine() { destoryMachine(); } +class StringFormatter { +public: + static QString format(const QString &input, uint indentSize = 4) { + QString output; + int level = 0; + bool inString = false; + QChar stringDelim; + bool escape = false; + + for (int i = 0; i < input.size(); ++i) { + QChar c = input[i]; + + if (inString) { + output += c; + if (escape) { + escape = false; + } else if (c == '\\') { + escape = true; + } else if (c == stringDelim) { + inString = false; + } + continue; + } + + if (isQuote(c)) { + inString = true; + stringDelim = c; + output += c; + continue; + } + + switch (c.unicode()) { + case '{': + output += QStringLiteral("{\n"); + ++level; + output += QString(level * indentSize, ' '); + break; + + case '}': + output += QStringLiteral("\n"); + --level; + output += + QString(level * indentSize, ' ') + QStringLiteral("}"); + break; + + case ',': + output += + QStringLiteral(",\n") + QString(level * indentSize, ' '); + break; + + default: + if (c.isSpace()) { + // collapse multiple spaces outside strings + if (!output.isEmpty() && !output.endsWith(' ')) { + output += ' '; + } + } else { + output += c; + } + break; + } + } + + return output; + } + +private: + static bool isQuote(QChar c) { return c == '"' || c == '\''; } +}; bool ScriptMachine::init() { if (isInited()) { @@ -77,6 +145,8 @@ bool ScriptMachine::configureEngine() { return false; } + _engine->SetDefaultAccessMask(0x1); + // we need utf8, the default is what we want _engine->SetEngineProperty(asEP_EXPAND_DEF_ARRAY_TO_TMPL, true); _engine->SetEngineProperty(asEP_DISALLOW_EMPTY_LIST_ELEMENTS, true); @@ -155,6 +225,22 @@ bool ScriptMachine::configureEngine() { return false; } + r = _engine->RegisterGlobalFunction("string stringify(? &in obj)", + asMETHOD(ScriptMachine, stringify), + asCALL_THISCALL_ASGLOBAL, this); + Q_ASSERT(r >= 0); + if (r < 0) { + return false; + } + + r = _engine->RegisterGlobalFunction( + "string beautify(const string &in str, uint indent = 4)", + asFUNCTION(beautify), asCALL_CDECL); + Q_ASSERT(r >= 0); + if (r < 0) { + return false; + } + r = _engine->RegisterGlobalFunction( "int exec(string &out output, const string &in exe, " "const string &in params = \"\", int timeout = 3000)", @@ -198,7 +284,8 @@ bool ScriptMachine::configureEngine() { PluginSystem::instance().angelApi()->installAPI(this); // create module for Console - _engine->GetModule("WINGCONSOLE", asGM_ALWAYS_CREATE); + auto mod = _engine->GetModule("WINGCONSOLE", asGM_ALWAYS_CREATE); + mod->SetAccessMask(0x1); return true; } @@ -317,8 +404,21 @@ int ScriptMachine::execSystemCmd(QString &out, const QString &exe, } } +QString ScriptMachine::beautify(const QString &str, uint indent) { + return StringFormatter::format(str, indent); +} + +QString ScriptMachine::stringify(void *ref, int typeId) { + return _debugger->toString(ref, typeId, _engine); +} + bool ScriptMachine::executeScript(ConsoleMode mode, const QString &script, - bool isInDebug) { + bool isInDebug, int *retCode) { + Q_ASSERT(mode != Interactive && mode != DefineEvaluator); + if (script.isEmpty()) { + return true; + } + // Compile the script auto mod = createModule(mode); // script-running is not allowed in interactive mode @@ -326,13 +426,11 @@ bool ScriptMachine::executeScript(ConsoleMode mode, const QString &script, return false; } - QScopeGuard guard([mod, mode]() { - if (mode != ConsoleMode::Interactive) { - // Before leaving, allow the engine to clean up remaining objects by - // discarding the module and doing a full garbage collection so that - // this can also be debugged if desired - mod->Discard(); - } + QScopeGuard guard([mod]() { + // Before leaving, allow the engine to clean up remaining objects by + // discarding the module and doing a full garbage collection so that + // this can also be debugged if desired + mod->Discard(); }); asPWORD isDbg = 0; @@ -353,12 +451,13 @@ bool ScriptMachine::executeScript(ConsoleMode mode, const QString &script, builder.setPragmaCallback(&ScriptMachine::pragmaCallback, this); builder.setIncludeCallback(&ScriptMachine::includeCallback, this); + _curMode = mode; auto r = builder.loadSectionFromFile(script.toUtf8()); if (r < 0) { + // TODO return false; } - _curMode = mode; r = builder.build(mod); if (r < 0) { MessageInfo info; @@ -414,6 +513,9 @@ bool ScriptMachine::executeScript(ConsoleMode mode, const QString &script, asIScriptContext *ctx = _ctxMgr->AddContext(_engine, func, true); _ctx[mode] = ctx; + ctx->SetUserData(reinterpret_cast( + AppManager::instance()->currentMSecsSinceEpoch()), + AsUserDataType::UserData_Timer); ctx->SetUserData(reinterpret_cast(isDbg), AsUserDataType::UserData_isDbg); @@ -492,9 +594,79 @@ bool ScriptMachine::executeScript(ConsoleMode mode, const QString &script, _debugger->clearBreakPoint(); emit onDebugFinished(); } + + if (retCode) { + *retCode = r; + } + return r >= 0; } +int ScriptMachine::evaluateDefine(const QString &code, bool &result) { + auto mod = createModuleIfNotExist(DefineEvaluator); + if (mod) { + asIScriptFunction *func = nullptr; + + auto ccode = code; + ccode.prepend("bool f(){ return (").append(");}"); + // start to compile + _curMode = DefineEvaluator; + auto cr = mod->CompileFunction(nullptr, ccode.toUtf8(), 0, 0, &func); + if (cr < 0) { + return cr; + } + + // Set up a context to execute the script + // The context manager will request the context from the + // pool, which will automatically attach the debugger + asIScriptContext *ctx = _ctxMgr->AddContext(_engine, func, true); + _ctx[DefineEvaluator] = ctx; + + ctx->SetUserData(reinterpret_cast(asPWORD( + AppManager::instance()->currentMSecsSinceEpoch())), + AsUserDataType::UserData_Timer); + + asPWORD isDbg = 0; + ctx->SetUserData(reinterpret_cast(isDbg), + AsUserDataType::UserData_isDbg); + mod->SetUserData(reinterpret_cast(isDbg), + AsUserDataType::UserData_isDbg); + + asPWORD umode = asPWORD(DefineEvaluator); + ctx->SetUserData(reinterpret_cast(umode), + AsUserDataType::UserData_ContextMode); + + ctx->SetExceptionCallback(asMETHOD(ScriptMachine, exceptionCallback), + this, asCALL_THISCALL); + + // Execute the script until completion + // The script may create co-routines. These will automatically + // be managed by the context manager + while (_ctxMgr->ExecuteScripts()) { + qApp->processEvents(); + } + + _ctx[DefineEvaluator] = nullptr; + + // Check if the main script finished normally + int r = ctx->GetState(); + if (r != asEXECUTION_FINISHED) { + r = -1; + } else { + result = bool(ctx->GetReturnByte()); + r = 0; + } + + func->Release(); + + // Return the context after retrieving the return value + _ctxMgr->DoneWithContext(ctx); + _engine->GarbageCollect(); + return r; + } + return asERROR; +} + void ScriptMachine::abortDbgScript() { if (_debugger->getEngine()) { _debugger->runDebugAction(asDebugger::ABORT); @@ -573,29 +745,51 @@ asIScriptModule *ScriptMachine::createModule(ConsoleMode mode) { if (isModuleExists(mode)) { return nullptr; } + + asIScriptModule *mod = nullptr; + switch (mode) { case Interactive: - return nullptr; + mod = nullptr; case Scripting: - return _engine->GetModule("WINGSCRIPT", asGM_ALWAYS_CREATE); + mod = _engine->GetModule("WINGSCRIPT", asGM_ALWAYS_CREATE); + mod->SetAccessMask(0x1); + break; case Background: - return _engine->GetModule("WINGSRV", asGM_ALWAYS_CREATE); + mod = _engine->GetModule("WINGSRV", asGM_ALWAYS_CREATE); + mod->SetAccessMask(0x1); + break; + case DefineEvaluator: + mod = _engine->GetModule("WINGDEF", asGM_ALWAYS_CREATE); + mod->SetAccessMask(0x2); + break; } - // should not go there - return nullptr; + + return mod; } asIScriptModule *ScriptMachine::createModuleIfNotExist(ConsoleMode mode) { + asIScriptModule *mod = nullptr; switch (mode) { case Interactive: - return _engine->GetModule("WINGCONSOLE", asGM_ONLY_IF_EXISTS); + mod = _engine->GetModule("WINGCONSOLE", asGM_ONLY_IF_EXISTS); + mod->SetAccessMask(0x1); + break; case Scripting: - return _engine->GetModule("WINGSCRIPT", asGM_CREATE_IF_NOT_EXISTS); + mod = _engine->GetModule("WINGSCRIPT", asGM_CREATE_IF_NOT_EXISTS); + mod->SetAccessMask(0x1); + break; case Background: - return _engine->GetModule("WINGSRV", asGM_CREATE_IF_NOT_EXISTS); + mod = _engine->GetModule("WINGSRV", asGM_CREATE_IF_NOT_EXISTS); + mod->SetAccessMask(0x1); + break; + case DefineEvaluator: + mod = _engine->GetModule("WINGDEF", asGM_ALWAYS_CREATE); + mod->SetAccessMask(0x2); + break; } - // should not go there - return nullptr; + + return mod; } asIScriptModule *ScriptMachine::module(ConsoleMode mode) { @@ -606,6 +800,8 @@ asIScriptModule *ScriptMachine::module(ConsoleMode mode) { return _engine->GetModule("WINGSCRIPT", asGM_ONLY_IF_EXISTS); case Background: return _engine->GetModule("WINGSRV", asGM_ONLY_IF_EXISTS); + case DefineEvaluator: + return _engine->GetModule("WINGDEF", asGM_ONLY_IF_EXISTS); } return nullptr; } @@ -1832,6 +2028,10 @@ asIScriptEngine *ScriptMachine::engine() const { return _engine; } asDebugger *ScriptMachine::debugger() const { return _debugger; } bool ScriptMachine::executeCode(ConsoleMode mode, const QString &code) { + if (code.isEmpty()) { + return true; + } + asIScriptModule *mod = createModuleIfNotExist(mode); _engine->SetEngineProperty(asEP_BUILD_WITHOUT_LINE_CUES, false); @@ -1841,26 +2041,30 @@ bool ScriptMachine::executeCode(ConsoleMode mode, const QString &code) { asIScriptFunction *func = nullptr; - auto ret = parser.parse(ccode); + QList ret; + if (mode != DefineEvaluator) { + ret = parser.parse(ccode); + } // check whether there is any enum/class - if (std::find_if(ret.begin(), ret.end(), - [](const QAsCodeParser::CodeSegment &seg) { - switch (seg.type) { - case QAsCodeParser::SymbolType::Enum: - case QAsCodeParser::SymbolType::Class: - case QAsCodeParser::SymbolType::Function: - case QAsCodeParser::SymbolType::Interface: - case QAsCodeParser::SymbolType::Import: - case QAsCodeParser::SymbolType::Variable: - return false; - case QAsCodeParser::SymbolType::Invalid: - case QAsCodeParser::SymbolType::TypeDef: - case QAsCodeParser::SymbolType::FnDef: - return true; - } - return true; - }) != ret.end()) { + if (ret.isEmpty() || + std::any_of(ret.begin(), ret.end(), + [](const QAsCodeParser::CodeSegment &seg) { + switch (seg.type) { + case QAsCodeParser::SymbolType::Enum: + case QAsCodeParser::SymbolType::Class: + case QAsCodeParser::SymbolType::Function: + case QAsCodeParser::SymbolType::Interface: + case QAsCodeParser::SymbolType::Import: + case QAsCodeParser::SymbolType::Variable: + return false; + case QAsCodeParser::SymbolType::Invalid: + case QAsCodeParser::SymbolType::TypeDef: + case QAsCodeParser::SymbolType::FnDef: + return true; + } + return true; + })) { // ok, wrap the codes ccode.prepend("void f(){").append("}"); // start to compile @@ -1881,6 +2085,10 @@ bool ScriptMachine::executeCode(ConsoleMode mode, const QString &code) { asIScriptContext *ctx = _ctxMgr->AddContext(_engine, func, true); _ctx[mode] = ctx; + ctx->SetUserData(reinterpret_cast(asPWORD( + AppManager::instance()->currentMSecsSinceEpoch())), + AsUserDataType::UserData_Timer); + asPWORD isDbg = 0; ctx->SetUserData(reinterpret_cast(isDbg), AsUserDataType::UserData_isDbg); diff --git a/src/class/scriptmachine.h b/src/class/scriptmachine.h index 1c37ffc..1ff3cde 100644 --- a/src/class/scriptmachine.h +++ b/src/class/scriptmachine.h @@ -36,9 +36,10 @@ private: public: // we have three console modes enum ConsoleMode { - Interactive, // in a shell - Scripting, // in scripting dialog - Background // run codes from other way + Interactive, // in a shell + Scripting, // in scripting dialog + Background, // run codes from other way + DefineEvaluator // define result calculator }; public: @@ -108,8 +109,7 @@ public: asIScriptModule *module(ConsoleMode mode); static ScriptMachine &instance(); - - virtual ~ScriptMachine(); + void destoryMachine(); public: bool init(); @@ -126,6 +126,8 @@ public: asIScriptEngine *engine() const; + void outputMessage(const MessageInfo &info); + public: static void scriptAssert(bool b); static void scriptAssert_X(bool b, const QString &msg); @@ -144,7 +146,9 @@ public slots: bool executeCode(ConsoleMode mode, const QString &code); // only scripting mode can be debugged bool executeScript(ConsoleMode mode, const QString &script, - bool isInDebug = false); + bool isInDebug = false, int *retCode = nullptr); + + int evaluateDefine(const QString &code, bool &result); void abortDbgScript(); void abortScript(ConsoleMode mode); @@ -155,19 +159,19 @@ protected: QString getCallStack(asIScriptContext *context); - void destoryMachine(); - private: void print(void *ref, int typeId); QString getInput(); - void outputMessage(const MessageInfo &info); - bool isType(asITypeInfo *tinfo, RegisteredType type); static int execSystemCmd(QString &out, const QString &exe, const QString ¶ms, int timeout); + static QString beautify(const QString &str, uint indent); + + QString stringify(void *ref, int typeId); + private: static void messageCallback(const asSMessageInfo *msg, void *param); diff --git a/src/control/gotowidget.cpp b/src/control/gotowidget.cpp index 25a455c..cc29f23 100644 --- a/src/control/gotowidget.cpp +++ b/src/control/gotowidget.cpp @@ -57,7 +57,7 @@ void GotoWidget::handleLineChanged() { ui->lineEdit->setStyleSheet(QString()); emit jumpToLine(p, isline); } else { - ui->lineEdit->setStyleSheet(QStringLiteral("color: red;")); + ui->lineEdit->setStyleSheet(QStringLiteral("QLineEdit{color: red}")); } } diff --git a/src/control/scriptingconsole.cpp b/src/control/scriptingconsole.cpp index 3d199e1..bab7296 100644 --- a/src/control/scriptingconsole.cpp +++ b/src/control/scriptingconsole.cpp @@ -439,6 +439,12 @@ void ScriptingConsole::paste() { } } +bool ScriptingConsole::isTerminal() const { return _isTerminal; } + +void ScriptingConsole::setIsTerminal(bool newIsTerminal) { + _isTerminal = newIsTerminal; +} + QString ScriptingConsole::currentCodes() const { QTextCursor textCursor = this->textCursor(); textCursor.setPosition(inpos_, QTextCursor::KeepAnchor); @@ -457,15 +463,18 @@ void ScriptingConsole::contextMenuEvent(QContextMenuEvent *event) { menu.addAction(QIcon(QStringLiteral(":/qeditor/paste.png")), tr("Paste"), QKeySequence(QKeySequence::Paste), this, &ScriptingConsole::paste); - menu.addAction(ICONRES(QStringLiteral("del")), tr("Clear"), - QKeySequence(Qt::ControlModifier | Qt::Key_L), this, - &ScriptingConsole::clearConsole); - menu.addSeparator(); - menu.addAction(ICONRES(QStringLiteral("dbgstop")), tr("AbortScript"), - QKeySequence(Qt::ControlModifier | Qt::Key_Q), []() { - ScriptMachine::instance().abortScript( - ScriptMachine::Background); - }); + + if (_isTerminal) { + menu.addAction(ICONRES(QStringLiteral("del")), tr("Clear"), + QKeySequence(Qt::ControlModifier | Qt::Key_L), this, + &ScriptingConsole::clearConsole); + menu.addSeparator(); + menu.addAction(ICONRES(QStringLiteral("dbgstop")), tr("AbortScript"), + QKeySequence(Qt::ControlModifier | Qt::Key_Q), []() { + ScriptMachine::instance().abortScript( + ScriptMachine::Background); + }); + } menu.exec(event->globalPos()); } diff --git a/src/control/scriptingconsole.h b/src/control/scriptingconsole.h index ab22d58..359b97b 100644 --- a/src/control/scriptingconsole.h +++ b/src/control/scriptingconsole.h @@ -40,6 +40,10 @@ signals: public: QString getInput(); + bool isTerminal() const; + + void setIsTerminal(bool newIsTerminal); + public slots: void init(); @@ -71,6 +75,7 @@ protected slots: private: QString _codes; + bool _isTerminal = true; bool _isWaitingRead = false; std::function _getInputFn; }; diff --git a/src/control/scriptingconsolebase.cpp b/src/control/scriptingconsolebase.cpp index d537785..dd9fc6a 100644 --- a/src/control/scriptingconsolebase.cpp +++ b/src/control/scriptingconsolebase.cpp @@ -19,18 +19,47 @@ ScriptingConsoleBase::ScriptingConsoleBase(QWidget *parent) } void ScriptingConsoleBase::stdOut(const QString &str) { - writeStdOut(str); - dontHighlightLastLine(true); + auto lines = str.split('\n'); + if (lines.isEmpty()) { + return; + } + writeStdOut(lines.takeFirst()); + dontHighlightLastLine(false); + for (auto &l : lines) { + newLine(); + writeStdOut(l); + dontHighlightLastLine(true); + } } void ScriptingConsoleBase::stdErr(const QString &str) { - writeStdErr(str); + auto lines = str.split('\n'); + if (lines.isEmpty()) { + return; + } + + writeStdErr(lines.takeFirst()); dontHighlightLastLine(false); + for (auto &l : lines) { + newLine(); + writeStdErr(l); + dontHighlightLastLine(false); + } } void ScriptingConsoleBase::stdWarn(const QString &str) { - write(str, _warnCharFmt); + auto lines = str.split('\n'); + if (lines.isEmpty()) { + return; + } + + write(lines.takeFirst(), _warnCharFmt); dontHighlightLastLine(false); + for (auto &l : lines) { + newLine(); + write(l, _warnCharFmt); + dontHighlightLastLine(false); + } } void ScriptingConsoleBase::newLine() { _s << Qt::endl; } diff --git a/src/define.h b/src/define.h index 17e5f61..40cfa77 100644 --- a/src/define.h +++ b/src/define.h @@ -16,6 +16,8 @@ enum AsUserDataType { UserData_PluginFn, UserData_isDbg, UserData_ContextMode, + UserData_Timer, + UserData_TimeOut }; } diff --git a/src/dialog/mainwindow.cpp b/src/dialog/mainwindow.cpp index 75a23c1..c126652 100644 --- a/src/dialog/mainwindow.cpp +++ b/src/dialog/mainwindow.cpp @@ -607,6 +607,22 @@ ads::CDockAreaWidget *MainWindow::buildUpLogDock(ads::CDockManager *dock, m_logbrowser->setOpenExternalLinks(true); m_logbrowser->setUndoRedoEnabled(false); + m_logbrowser->addAction(newAction( + ICONRES("copy"), tr("Copy"), [=]() { m_logbrowser->copy(); }, + QKeySequence::Copy)); + + auto a = new QAction(this); + a->setSeparator(true); + m_logbrowser->addAction(a); + + m_logbrowser->addAction(newAction(ICONRES(QStringLiteral("log")), + tr("ExportLog"), + &MainWindow::on_exportlog)); + m_logbrowser->addAction(newAction(ICONRES(QStringLiteral("clearhis")), + tr("ClearLog"), &MainWindow::on_clslog)); + + m_logbrowser->setContextMenuPolicy(Qt::ActionsContextMenu); + auto dw = buildDockWidget(dock, QStringLiteral("Log"), tr("Log"), m_logbrowser); return dock->addDockWidget(area, dw, areaw); @@ -803,9 +819,7 @@ MainWindow::buildUpHashResultDock(ads::CDockManager *dock, m_hashtable->setContextMenuPolicy( Qt::ContextMenuPolicy::ActionsContextMenu); - auto a = new QAction(m_hashtable); - a->setText(tr("Copy")); - connect(a, &QAction::triggered, this, [=] { + auto a = newAction(ICONRES(QStringLiteral("copy")), tr("Copy"), [=] { auto r = m_hashtable->currentIndex(); qApp->clipboard()->setText( _hashModel->checkSumData(QCryptographicHash::Algorithm(r.row()))); @@ -813,6 +827,9 @@ MainWindow::buildUpHashResultDock(ads::CDockManager *dock, tr("CopyToClipBoard")); }); m_hashtable->addAction(a); + a = newAction(QStringLiteral("del"), tr("Clear"), + [=]() { _hashModel->clearData(); }); + m_hashtable->addAction(a); connect(m_hashtable->selectionModel(), &QItemSelectionModel::currentRowChanged, a, [=](const QModelIndex ¤t, const QModelIndex &) { diff --git a/src/dialog/mainwindow.h b/src/dialog/mainwindow.h index a900c2e..7b3a7a0 100644 --- a/src/dialog/mainwindow.h +++ b/src/dialog/mainwindow.h @@ -360,7 +360,7 @@ private: template inline QAction *newAction(const QString &title, Func &&slot, const QKeySequence &shortcut = QKeySequence()) { - auto a = new QAction; + auto a = new QAction(this); a->setText(title); a->setShortcutVisibleInContextMenu(true); a->setShortcut(shortcut); diff --git a/src/dialog/scriptingdialog.cpp b/src/dialog/scriptingdialog.cpp index f67bfd6..3eca9c8 100644 --- a/src/dialog/scriptingdialog.cpp +++ b/src/dialog/scriptingdialog.cpp @@ -583,6 +583,7 @@ ScriptingDialog::buildUpOutputShowDock(ads::CDockManager *dock, ads::CDockAreaWidget *areaw) { m_consoleout = new ScriptingConsole(this); m_consoleout->setMode(ScriptingConsole::Output); + m_consoleout->setIsTerminal(false); auto dw = buildDockWidget(dock, QStringLiteral("ConsoleOutput"), tr("ConsoleOutput"), m_consoleout); return dock->addDockWidget(area, dw, areaw); diff --git a/src/dialog/scriptingdialog.h b/src/dialog/scriptingdialog.h index 5dc194a..b0f19b9 100644 --- a/src/dialog/scriptingdialog.h +++ b/src/dialog/scriptingdialog.h @@ -170,7 +170,7 @@ private: template inline QAction *newAction(const QString &title, Func &&slot, const QKeySequence &shortcut = QKeySequence()) { - auto a = new QAction; + auto a = new QAction(this); a->setText(title); a->setShortcutVisibleInContextMenu(true); a->setShortcut(shortcut);