Improve Simplified Chinese Translation (#5550)

* Create VMDisplayMetalViewInputAccessory.strings

* Update InfoPlist.strings

* Update VMDisplayMetalViewInputAccessory.strings

* Update InfoPlist.strings

* Update InfoPlist.strings

* Update Localizable.strings

* Delete Platform/iOS/Display/zh-cn.lproj directory

* Create VMDisplayMetalViewInputAccessory.strings

* Create VMDisplayWindow.strings

* Update VMDisplayWindow.strings

* Update Root.strings

* Update InfoPlist.strings

* Update Root.strings

* Update VMDisplayWindow.strings

* Update InfoPlist.strings

* Update InfoPlist.strings

* Update Localizable.strings

* Update Localizable.strings

* Add files via upload

* Update Localizable.strings

* Update VMDisplayQemuDisplayController.swift

Change ellipse "..." to "…" in accordance with other strings

* Rollback the last change to VMDisplayQemuDisplayController.swift

* Update README.zh-Hans.md

* Update README.zh-Hans.md

* Delete Localizable.stringsdict
This commit is contained in:
Tiffany Fung 2023-08-21 02:51:38 +08:00 committed by GitHub
parent 5abb987065
commit c5ca7ccdaf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 1912 additions and 571 deletions

View file

@ -0,0 +1,161 @@
/* Class = "UIButton"; normalTitle = "F7"; ObjectID = "3yi-Pr-1ih"; */
"3yi-Pr-1ih.normalTitle" = "F7";
/* Class = "UIButton"; accessibilityLabel = "Tab"; ObjectID = "7pj-Jz-7JR"; */
"7pj-Jz-7JR.accessibilityLabel" = "Tab";
/* Class = "UIButton"; normalTitle = "⇥"; ObjectID = "7pj-Jz-7JR"; */
"7pj-Jz-7JR.normalTitle" = "⇥";
/* Class = "UIButton"; accessibilityLabel = "Right"; ObjectID = "8Lh-4D-Fz6"; */
"8Lh-4D-Fz6.accessibilityLabel" = "右";
/* Class = "UIButton"; normalTitle = "→"; ObjectID = "8Lh-4D-Fz6"; */
"8Lh-4D-Fz6.normalTitle" = "→";
/* Class = "UIButton"; accessibilityLabel = "Paste"; ObjectID = "740-aI-39P"; */
"740-aI-39P.accessibilityLabel" = "粘贴";
/* Class = "UIButton"; normalTitle = "F10"; ObjectID = "AhH-ij-IF8"; */
"AhH-ij-IF8.normalTitle" = "F10";
/* Class = "UIButton"; accessibilityLabel = "Right"; ObjectID = "AY8-eJ-bAP"; */
"AY8-eJ-bAP.accessibilityLabel" = "右";
/* Class = "UIButton"; normalTitle = "Del"; ObjectID = "AY8-eJ-bAP"; */
"AY8-eJ-bAP.normalTitle" = "Del";
/* Class = "UIButton"; accessibilityLabel = "Control"; ObjectID = "bCv-uH-SSy"; */
"bCv-uH-SSy.accessibilityLabel" = "Control";
/* Class = "UIButton"; normalTitle = "⌃"; ObjectID = "bCv-uH-SSy"; */
"bCv-uH-SSy.normalTitle" = "⌃";
/* Class = "UIButton"; accessibilityLabel = "Num Lock"; ObjectID = "BUk-Vf-yE5"; */
"BUk-Vf-yE5.accessibilityLabel" = "数字锁定";
/* Class = "UIButton"; normalTitle = "Num"; ObjectID = "BUk-Vf-yE5"; */
"BUk-Vf-yE5.normalTitle" = "Num";
/* Class = "UIButton"; accessibilityLabel = "Up"; ObjectID = "BUL-js-yMh"; */
"BUL-js-yMh.accessibilityLabel" = "上";
/* Class = "UIButton"; normalTitle = "↑"; ObjectID = "BUL-js-yMh"; */
"BUL-js-yMh.normalTitle" = "↑";
/* Class = "UIButton"; normalTitle = "F4"; ObjectID = "c7C-CG-EBg"; */
"c7C-CG-EBg.normalTitle" = "F4";
/* Class = "UIButton"; normalTitle = "F5"; ObjectID = "DxX-zu-urb"; */
"DxX-zu-urb.normalTitle" = "F5";
/* Class = "UIButton"; normalTitle = "F12"; ObjectID = "EDi-KP-KwO"; */
"EDi-KP-KwO.normalTitle" = "F12";
/* Class = "UIButton"; accessibilityLabel = "Left"; ObjectID = "EVa-2J-CRA"; */
"EVa-2J-CRA.accessibilityLabel" = "左";
/* Class = "UIButton"; normalTitle = "←"; ObjectID = "EVa-2J-CRA"; */
"EVa-2J-CRA.normalTitle" = "←";
/* Class = "UIButton"; accessibilityLabel = "Caps Lock"; ObjectID = "FDV-W6-qlO"; */
"FDV-W6-qlO.accessibilityLabel" = "大写锁定";
/* Class = "UIButton"; normalTitle = "Caps"; ObjectID = "FDV-W6-qlO"; */
"FDV-W6-qlO.normalTitle" = "Caps";
/* Class = "UIButton"; normalTitle = "F3"; ObjectID = "gUX-ez-mbt"; */
"gUX-ez-mbt.normalTitle" = "F3";
/* Class = "UIButton"; accessibilityLabel = "Page Down"; ObjectID = "h4q-XF-UMn"; */
"h4q-XF-UMn.accessibilityLabel" = "下一页";
/* Class = "UIButton"; normalTitle = "Pg Dn"; ObjectID = "h4q-XF-UMn"; */
"h4q-XF-UMn.normalTitle" = "Pg Dn";
/* Class = "UIButton"; accessibilityLabel = "Option"; ObjectID = "jxu-AQ-u8c"; */
"jxu-AQ-u8c.accessibilityLabel" = "Option";
/* Class = "UIButton"; normalTitle = "⌥"; ObjectID = "jxu-AQ-u8c"; */
"jxu-AQ-u8c.normalTitle" = "⌥";
/* Class = "UIButton"; normalTitle = "F2"; ObjectID = "kd1-fj-kXM"; */
"kd1-fj-kXM.normalTitle" = "F2";
/* Class = "UIButton"; accessibilityLabel = "Insert"; ObjectID = "kO0-HZ-5w2"; */
"kO0-HZ-5w2.accessibilityLabel" = "插入";
/* Class = "UIButton"; normalTitle = "Ins"; ObjectID = "kO0-HZ-5w2"; */
"kO0-HZ-5w2.normalTitle" = "Ins";
/* Class = "UIButton"; normalTitle = "F8"; ObjectID = "LlV-Ae-CrL"; */
"LlV-Ae-CrL.normalTitle" = "F8";
/* Class = "UIButton"; accessibilityLabel = "Home"; ObjectID = "LU6-kH-vN3"; */
"LU6-kH-vN3.accessibilityLabel" = "主页";
/* Class = "UIButton"; normalTitle = "Home"; ObjectID = "LU6-kH-vN3"; */
"LU6-kH-vN3.normalTitle" = "主页";
/* Class = "UIButton"; accessibilityLabel = "Escape"; ObjectID = "n12-9R-99C"; */
"n12-9R-99C.accessibilityLabel" = "Esc";
/* Class = "UIButton"; normalTitle = "⎋"; ObjectID = "n12-9R-99C"; */
"n12-9R-99C.normalTitle" = "⎋";
/* Class = "UIButton"; accessibilityLabel = "Print Screen"; ObjectID = "Pes-KN-KzU"; */
"Pes-KN-KzU.accessibilityLabel" = "截图";
/* Class = "UIButton"; normalTitle = "Pr Scr"; ObjectID = "Pes-KN-KzU"; */
"Pes-KN-KzU.normalTitle" = "Pr Scr";
/* Class = "UIButton"; accessibilityLabel = "Command"; ObjectID = "Pjh-3m-tFX"; */
"Pjh-3m-tFX.accessibilityLabel" = "Command";
/* Class = "UIButton"; normalTitle = "⌘"; ObjectID = "Pjh-3m-tFX"; */
"Pjh-3m-tFX.normalTitle" = "⌘";
/* Class = "UIButton"; normalTitle = "F1"; ObjectID = "PWe-Va-Qi1"; */
"PWe-Va-Qi1.normalTitle" = "F1";
/* Class = "UIButton"; accessibilityLabel = "Page Up"; ObjectID = "pX1-7o-dbU"; */
"pX1-7o-dbU.accessibilityLabel" = "上一页";
/* Class = "UIButton"; normalTitle = "Pg Up"; ObjectID = "pX1-7o-dbU"; */
"pX1-7o-dbU.normalTitle" = "Pg Up";
/* Class = "UIButton"; accessibilityLabel = "Shift"; ObjectID = "QPo-cD-UlK"; */
"QPo-cD-UlK.accessibilityLabel" = "Shift";
/* Class = "UIButton"; normalTitle = "⇧"; ObjectID = "QPo-cD-UlK"; */
"QPo-cD-UlK.normalTitle" = "⇧";
/* Class = "UIButton"; normalTitle = "F6"; ObjectID = "Rb5-vO-sIx"; */
"Rb5-vO-sIx.normalTitle" = "F6";
/* Class = "UIButton"; accessibilityLabel = "Down"; ObjectID = "RCo-l7-gvf"; */
"RCo-l7-gvf.accessibilityLabel" = "下";
/* Class = "UIButton"; normalTitle = "↓"; ObjectID = "RCo-l7-gvf"; */
"RCo-l7-gvf.normalTitle" = "↓";
/* Class = "UIButton"; normalTitle = "F11"; ObjectID = "rfk-su-cFq"; */
"rfk-su-cFq.normalTitle" = "F11";
/* Class = "UIButton"; accessibilityLabel = "Hide Keyboard"; ObjectID = "rtU-Yt-FhT"; */
"rtU-Yt-FhT.accessibilityLabel" = "隐藏键盘";
/* Class = "UIButton"; accessibilityLabel = "Scroll Lock"; ObjectID = "sF1-tj-hUG"; */
"sF1-tj-hUG.accessibilityLabel" = "滚动锁定";
/* Class = "UIButton"; normalTitle = "Scroll"; ObjectID = "sF1-tj-hUG"; */
"sF1-tj-hUG.normalTitle" = "Scroll";
/* Class = "UIButton"; accessibilityLabel = "End"; ObjectID = "TOV-fV-TTa"; */
"TOV-fV-TTa.accessibilityLabel" = "结束";
/* Class = "UIButton"; normalTitle = "End"; ObjectID = "TOV-fV-TTa"; */
"TOV-fV-TTa.normalTitle" = "End";
/* Class = "UIButton"; normalTitle = "F9"; ObjectID = "UNT-ei-lIn"; */
"UNT-ei-lIn.normalTitle" = "F9";

View file

@ -1,11 +1,11 @@
/* (No Comment) */
"Apple Pencil Input" = "Apple Pencil输入";
"Apple Pencil Input" = "Apple Pencil 输入";
/* (No Comment) */
"Auto save on background" = "后台运行时自动保存";
"Auto save on background" = "后台运行时自动保存";
/* (No Comment) */
"Auto save on low memory" = "内存不足时自动保存";
"Auto save on low memory" = "在内存低时自动保存";
/* (No Comment) */
"Background" = "后台";
@ -20,7 +20,7 @@
"Click & Hold" = "单击并按住";
/* (No Comment) */
"Continue running VM in the background" = "后台运行时保持虚拟机运行";
"Continue running VM in the background" = "后台继续运行虚拟机";
/* (No Comment) */
"Cursor" = "光标";
@ -41,7 +41,7 @@
"Disabled" = "禁用";
/* (No Comment) */
"Down" = "方向键下";
"Down" = "下";
/* (No Comment) */
"Drag cursor" = "拖动光标";
@ -68,7 +68,7 @@
"Group" = "组";
/* (No Comment) */
"Left" = "左方向键";
"Left" = "左";
/* (No Comment) */
"Long Press" = "长按";
@ -110,22 +110,22 @@
"Space" = "空格";
/* (No Comment) */
"Tablet mode (always show cursor)" = "平板模式(显示光标)";
"Tablet mode (always show cursor)" = "平板模式 (显示光标)";
/* (No Comment) */
"Tablet mode (try hiding cursor)" = "平板模式(隐藏光标)";
"Tablet mode (try hiding cursor)" = "平板模式 (隐藏光标)";
/* (No Comment) */
"Three Finger Pan" = "三指拖动";
/* (No Comment) */
"Touch Input" = "触输入";
"Touch Input" = "触输入";
/* (No Comment) */
"Touch mode (always show cursor)" = "触屏模式(显示光标)";
"Touch mode (always show cursor)" = "触摸模式 (显示光标)";
/* (No Comment) */
"Touch mode (try hiding cursor)" = "触屏模式(隐藏光标)";
"Touch mode (try hiding cursor)" = "触摸模式 (隐藏光标)";
/* (No Comment) */
"Touchpad/Mouse Input" = "触控板/鼠标输入";
@ -143,14 +143,14 @@
"Two Finger Tap" = "双指轻点";
/* (No Comment) */
"Up" = "上方向键";
"Up" = "上";
"Disable screen dimming when idle" = "闲置时不自动锁定屏幕";
"Disable screen dimming when idle" = "闲置时禁用屏幕变暗";
"Do not show prompt when USB device is plugged in" = "USB 设备插入时不弹出提示";
"Do not show prompt when USB device is plugged in" = "插入 USB 设备时不弹出提示";
"Idle" = "闲置";
"Idle" = "闲置";
"Devices" = "设备";
"Cursor - Drag Speed" = "拖动光标时的速度";
"Cursor - Drag Speed" = "光标 - 拖动速度";

View file

@ -1,15 +1,17 @@
/* Privacy - Local Network Usage Description */
"NSLocalNetworkUsageDescription" = "虚拟机可以访问本地网络。UTM 还使用本地网络与 AltServer 通信。";
/* Privacy - Location Always and When In Use Usage Description */
"NSLocationAlwaysAndWhenInUseUsageDescription" = "虚拟机后台运行需要使用定位服务。 位置数据永远不会离开设备。";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "UTM 定期请求位置数据,以确保系统保持后台进程处于活动状态。位置数据永远不会离开设备。";
/* Privacy - Location Always Usage Description */
"NSLocationAlwaysUsageDescription" = "虚拟机后台运行需要使用定位服务。 位置数据永远不会离开设备。";
"NSLocationAlwaysUsageDescription" = "UTM 定期请求位置数据,以确保系统保持后台进程处于活动状态。位置数据永远不会离开设备。";
/* Privacy - Location When In Use Usage Description */
"NSLocationWhenInUseUsageDescription" = "虚拟机后台运行需要使用定位服务。 位置数据永远不会离开设备。";
"NSLocationWhenInUseUsageDescription" = "UTM 定期请求位置数据,以确保系统保持后台进程处于活动状态。位置数据永远不会离开设备。";
/* Privacy - Microphone Usage Description */
"NSMicrophoneUsageDescription" = "虚拟机需要访问麦克风。";
"NSMicrophoneUsageDescription" = "任何虚拟机都需要获得许可才能从麦克风进行录音。";
/* (No Comment) */
"UTM virtual machine" = "UTM虚拟机";
"UTM virtual machine" = "UTM 虚拟机";

View file

@ -0,0 +1,92 @@
/* Class = "NSToolbarItem"; label = "Shared Folder"; ObjectID = "7EC-GE-fIl"; */
"7EC-GE-fIl.label" = "共享文件夹";
/* Class = "NSToolbarItem"; paletteLabel = "Shared Folder"; ObjectID = "7EC-GE-fIl"; */
"7EC-GE-fIl.paletteLabel" = "共享文件夹";
/* Class = "NSToolbarItem"; toolTip = "Shared folder"; ObjectID = "7EC-GE-fIl"; */
"7EC-GE-fIl.toolTip" = "共享文件夹";
/* Class = "NSToolbarItem"; label = "Drives"; ObjectID = "bKL-Th-FFw"; */
"bKL-Th-FFw.label" = "驱动器";
/* Class = "NSToolbarItem"; paletteLabel = "Drives"; ObjectID = "bKL-Th-FFw"; */
"bKL-Th-FFw.paletteLabel" = "驱动器";
/* Class = "NSToolbarItem"; toolTip = "Drive image options"; ObjectID = "bKL-Th-FFw"; */
"bKL-Th-FFw.toolTip" = "驱动器映像选项";
/* Class = "NSToolbarItem"; label = "Stop"; ObjectID = "Bkx-Ph-j0D"; */
"Bkx-Ph-j0D.label" = "停止";
/* Class = "NSToolbarItem"; paletteLabel = "Stop"; ObjectID = "Bkx-Ph-j0D"; */
"Bkx-Ph-j0D.paletteLabel" = "停止";
/* Class = "NSToolbarItem"; toolTip = "Shuts down and stops the VM"; ObjectID = "Bkx-Ph-j0D"; */
"Bkx-Ph-j0D.toolTip" = "关闭并停止虚拟机";
/* Class = "NSToolbarItem"; label = "Toolbar Item"; ObjectID = "C8Y-BQ-Y6m"; */
"C8Y-BQ-Y6m.label" = "工具栏项目";
/* Class = "NSToolbarItem"; paletteLabel = "Toolbar Item"; ObjectID = "C8Y-BQ-Y6m"; */
"C8Y-BQ-Y6m.paletteLabel" = "工具栏项目";
/* Class = "NSToolbarItem"; label = "Capture Mouse"; ObjectID = "FN7-zs-mWC"; */
"FN7-zs-mWC.label" = "捕获鼠标";
/* Class = "NSToolbarItem"; paletteLabel = "Capture Mouse"; ObjectID = "FN7-zs-mWC"; */
"FN7-zs-mWC.paletteLabel" = "捕获鼠标";
/* Class = "NSToolbarItem"; toolTip = "Capture mouse cursor"; ObjectID = "FN7-zs-mWC"; */
"FN7-zs-mWC.toolTip" = "捕获鼠标光标";
/* Class = "NSToolbarItem"; label = "Restart"; ObjectID = "G7P-HJ-bcy"; */
"G7P-HJ-bcy.label" = "重新启动";
/* Class = "NSToolbarItem"; paletteLabel = "Restart"; ObjectID = "G7P-HJ-bcy"; */
"G7P-HJ-bcy.paletteLabel" = "重新启动";
/* Class = "NSToolbarItem"; toolTip = "Restarts the VM"; ObjectID = "G7P-HJ-bcy"; */
"G7P-HJ-bcy.toolTip" = "重新启动虚拟机";
/* Class = "NSToolbarItem"; label = "Start/Pause"; ObjectID = "kT2-2U-cYm"; */
"kT2-2U-cYm.label" = "启动/暂停";
/* Class = "NSToolbarItem"; paletteLabel = "Start/Pause"; ObjectID = "kT2-2U-cYm"; */
"kT2-2U-cYm.paletteLabel" = "启动/暂停";
/* Class = "NSToolbarItem"; toolTip = "Start/pause the VM"; ObjectID = "kT2-2U-cYm"; */
"kT2-2U-cYm.toolTip" = "启动/暂停虚拟机";
/* Class = "NSToolbarItem"; label = "Windows"; ObjectID = "MQ2-L1-yl7"; */
"MQ2-L1-yl7.label" = "窗口";
/* Class = "NSToolbarItem"; paletteLabel = "Windows"; ObjectID = "MQ2-L1-yl7"; */
"MQ2-L1-yl7.paletteLabel" = "窗口";
/* Class = "NSToolbarItem"; toolTip = "Windows"; ObjectID = "MQ2-L1-yl7"; */
"MQ2-L1-yl7.toolTip" = "窗口";
/* Class = "NSWindow"; title = "UTM"; ObjectID = "QvC-M9-y7g"; */
"QvC-M9-y7g.title" = "UTM";
/* Class = "NSToolbarItem"; label = "USB"; ObjectID = "tlw-Fb-ne3"; */
"tlw-Fb-ne3.label" = "USB";
/* Class = "NSToolbarItem"; paletteLabel = "USB"; ObjectID = "tlw-Fb-ne3"; */
"tlw-Fb-ne3.paletteLabel" = "USB";
/* Class = "NSToolbarItem"; toolTip = "USB devices"; ObjectID = "tlw-Fb-ne3"; */
"tlw-Fb-ne3.toolTip" = "USB 设备";
/* Class = "NSToolbarItem"; label = "Resize Console"; ObjectID = "Ulf-oT-4cP"; */
"Ulf-oT-4cP.label" = "重新调整控制台";
/* Class = "NSToolbarItem"; paletteLabel = "Resize Console"; ObjectID = "Ulf-oT-4cP"; */
"Ulf-oT-4cP.paletteLabel" = "重新调整控制台";
/* Class = "NSToolbarItem"; toolTip = "Send console resize command"; ObjectID = "Ulf-oT-4cP"; */
"Ulf-oT-4cP.toolTip" = "发送控制台重新调整命令";
/* Class = "NSButton"; ibShadowedToolTip = "Starts/resumes the VM"; ObjectID = "ZTi-Hs-ge6"; */
"ZTi-Hs-ge6.ibShadowedToolTip" = "启动/恢复虚拟机";

View file

@ -2,8 +2,8 @@
"CFBundleName" = "UTM";
/* (No Comment) */
"UTM virtual machine" = "UTM虚拟机";
"UTM virtual machine" = "UTM 虚拟机";
/* Privacy - Microphone Usage Description */
"NSMicrophoneUsageDescription" = "UTM需要您的同意才能使用麦克风。";
"NSMicrophoneUsageDescription" = "任何虚拟机都需要获得许可才能从麦克风进行录音。";

File diff suppressed because it is too large Load diff

View file

@ -5,5 +5,5 @@
"CFBundleName" = "QEMUHelper";
/* Copyright (human-readable) */
"NSHumanReadableCopyright" = "版权所有 © 2020 osy。 保留所有权利。";
"NSHumanReadableCopyright" = "版权所有 © 2020 osy。保留所有权利。";

View file

@ -1,9 +1,9 @@
/* QEMUHelper */
"Cannot find QEMU support libraries." = "找不到 QEMU 支持库";
"Cannot find QEMU support libraries." = "找不到 QEMU 支持库";
/* QEMUHelper */
"Error starting QEMU." = "启动 QEMU 时出错";
"Error starting QEMU." = "启动 QEMU 时出错";
/* QEMUHelper */
"QEMU exited unexpectedly." = "QEMU 意外退出";
"QEMU exited unexpectedly." = "QEMU 意外退出";

View file

@ -1,109 +1,77 @@
# UTM
# UTM
[![Build](https://github.com/utmapp/UTM/workflows/Build/badge.svg?branch=master&event=push)][1]
> 发明一台可以用来计算任何可计算序列的机器是完全有可能的。
-- <cite>图灵Alan Turing, 1936年</cite>
> 发明一台可用于计算任何可计算序列的机器是可行的。
-- <cite>艾伦·图灵Alan Turing, 1936 </cite>
UTM是一个功能齐全的iOS虚拟机。简而言之它允许你在iPhone和iPad上运行Windows、Android、Ubuntu等操作系统。更多信息请访问[https://getutm.app/](https://getutm.app/)和[https://mac.getutm.app/](https://mac.getutm.app/)
UTM 是一个功能齐全的系统模拟器和虚拟机主机,适用于 iOS 和 macOS。它基于 QEMU。简而言之它允许您在 Mac、iPhone 和 iPad 上运行 Windows、Linux 等。更多信息请访问 https://getutm.app/ 和 https://mac.getutm.app/。
<p align="center">
<img width="450px" alt="在iPhone上运行UTM" src="screen.png">
<img width="450px" alt=“在 iPhone 上运行 UTM" src="screen.png">
<br>
<img width="450px" alt="在MacBook上运行UTM" src="screenmac.png">
<img width="450px" alt=“在 MacBook 上运行 UTM" src="screenmac.png">
</p>
## 特
## 特
* 支持30+处理器包括x86_64、ARM64和RISC-V这要归功于后端qemu
* 得益于SPICE通过准虚拟化实现了快速的本地图形
* 使用qemu TCG实现基于JIT的加速
* 前端使用最新最好的应用程序接口(API)为iOS11+从零开始设计
* 直接从设备上创建、管理和运行虚拟机
* iOS11.0~14.3不需要越狱!iOS 14.4+需要)
* 使用 QEMU 进行全系统模拟MMU、设备等
* 支持三十余类处理器,包括 x86_64、ARM64 和 RISC-V
* 使用 SPICE 和 QXL 的 VGA 图形模式
* 文本终端模式
* USB 设备
* 使用 QEMU TCG 进行基于 JIT 的加速
* 采用了最新和最好的 API从零开始设计前端支持 macOS 11+ 和 iOS 11+
* 直接从你的设备上创建、管理和运行虚拟机
## macOS 的附加功能
* 使用 Hypervisor.framework 和 QEMU 实现硬件加速虚拟化
* 在 macOS 12+ 上使用 Virtualization.framework 来启动 macOS 客户机
## UTM SE
UTM/QEMU 需要动态代码生成JIT以获得最大性能。iOS 设备上的 JIT 需要已经越狱的设备iOS 11.0~14.3 不需要越狱iOS 14.4+ 需要),或者为特定版本的 iOS 找到的其他变通办法之一(有关更多详细信息,请参阅“安装”)。
UTM SE“较慢版”使用了“[线程解释器][3]”,其性能优于传统解释器,但仍然比 JIT 要慢。这种技术类似于 [iSH][4] 的动态执行。因此UTM SE 不需要越狱或任何 JIT 的变通方法,可以作为常规应用程序侧载。
为了优化大小和构建时间UTM SE 中只包含以下架构ARM、PPC、RISC-V 和 x86均包含 32 位和 64 位)。
## 安装
如果您只是想使用UTM请访问https://getutm.app/install/ 来获取引导.
iOS 版 UTMSEhttps://getutm.app/install/
## 编译(iOS)
UTM 也支持 macOShttps://mac.getutm.app/
要在iOS14上运行UTM而不越狱以及在任何iOS版本上开发UTM必须附加Xcode调试器。
## 开发
### 简单的
### [macOS 端开发](Documentation/MacDevelopment.md)
获取依赖项的推荐方法是使用[GitHub操作生成的构件][4].查找最新的版本构建并从arm64构建(用于iOS)或x86_64构建(用于Mac上的iOS模拟器)下载Sysroot工件。然后将Sysroot解压到UTM的根目录.然后就可以打开`UTM.xcodeproj`,选择您的签名证书然后从Xcode运行并编译安装UTM。
### [iOS 端开发](Documentation/iOSDevelopment.md)
### 高级的
## 相关开源项目
如果您想自己构建依赖项强烈建议您从一个全新的macOS VM开始。这是因为一些依赖项尽管架构并不匹配仍试图使用`/usr/local/lib`。某些已安装的库如`libusb`和`gawk`将破坏构建。
1. 使用`brew`安装Xcode命令行和以下构建条件
`brew install bison pkg-config gettext glib libgpg-error nasm make meson`
并且请确保将“bison”添加到您的“$PATH”环境中!
2. 如果你还没有clone子模块运行以下命令
`git submodule update --init --recursive`
3. 运行 `./scripts/build_dependencies.sh`以开始编译。如果为Mac的iOS设备模拟器构建请运行 `./scripts/ build_dependences .sh -a x86_64 `
4. 打开`UTM.xcodeproj`并选择您的签名证书。
5. 从Xcode构建和部署。
## 编译(MacOS)
基本上与iOS相同但有以下更改
* 要在Intel平台上建立依赖关系请运行 `./scripts/build_dependencies.sh -p macos -a x86_64`
* 要建立对苹果arm平台的依赖请运行 `./scripts/build_dependencies.sh -p macos -a arm64`
您也可以从GitHub下载预构建的依赖项。
## 签名(iOS)
如果使用Xcode进行构建则应该自动完成签名。由于iOS签名的错误导致不支持iOS 13.3.1。您可以使用低于或高于13.3.1的任何版本。
在GitHub [Release][3]页面的`ipa`是伪签名。如果您越狱了您不需要签名它您可以直接使用越狱软件Filza进行安装。
如果您想要为备用设备签名正式版,有多种方法。推荐使用[iOS App Signer][2]。注意,许多“在线”签名服务(如AppCake)都存在一些已知的问题而且它们与UTM不兼容。如果在试图启动VM虚拟机时发生崩溃如闪退那么您的签名证书是无效的。
>译者注:据反馈,使用` i4Tools(即爱思助手) `生成的开发者证书签名的ipa也大概率无法正常使用
在技术细节上,有两种签名证书:“开发证书”和“分发证书”。UTM需要“开发证书”而“开发证书”具有`get-task-allow `的权利。
>译者注:开发证书即苹果开发者证书,分发证书即企业证书
### 签名开发版
如果你想要给一个` xcarchive `签名,例如从[GitHub Actions][1]中编译Build你可以使用以下命令:
```
./scripts/package.sh signedipa UTM.xcarchive outputPath PROFILE_NAME TEAM_ID
```
其中`PROFILE_NAME`是配置文件的名称,而`TEAM_ID`是配置文件中结构名称旁边的标识符。确保签名密钥已被导入到您的密钥链中并且配置文件已安装在您的iOS设备上。
如果你有一个越狱的设备,你也可以伪造签名(安装了“ldid”插件):
```
./scripts/package.sh ipa UTM.xcarchive outputPath
```
## UTM使用注意事项
1. ISO镜像要开启CD/DVD选项
2. 虚拟硬盘文件不要开CD/DVD选项
3. 启动app时白屏需要重启您的iOS设备
## 为什么UTM不在App Store中?
苹果不允许大部分解释或生成代码的应用程序在App Store中上架因此UTM不太可能被允许上架。然而人们在互联网上有各种各样的方式来获得不需要越狱就能下载的应用程序。我们支持这些方法中的任何一种。
* [iSH][4]:模拟用户模式 Linux 终端接口,用于在 iOS 上运行 x86 Linux 应用程序
* [a-shell][5]:为 iOS 原生构建的常用 Unix 命令和实用程序包,可通过终端界面访问
## 许可
UTM是在Apache 2.0许可下发布的。但是,它使用了几个(L)GPL组件。大多数插件是动态链接的但gstreamer插件是静态链接的部分代码来自qemu。如果您打算重新分发此应用程序注意这一点。
UTM 是在 Apache 2.0 的许可证下发布的,但它使用了若干个 GPL 与 LGPL 组件。这其中的大多数组件是动态链接的,但 gstreamer 组件是静态链接的,部分代码取自 QEMU。如果你打算重新分发此应用程序请务必注意这一点。
一些图标使用 [Freepik](https://www.freepik.com) 从 [www.flaticon.com](https://www.flaticon.com/) 制作.
某些图标由 [Freepik](https://www.freepik.com) 从 [www.flaticon.com](https://www.flaticon.com/) 制作。
另外, UTM还使用了以下MIT/BSD许可的组件:
此外UTM 前端依赖于以下 MIT/BSD 许可证的组件:
* [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager)
* [SwiftTerm](https://github.com/migueldeicaza/SwiftTerm)
* [ZIP Foundation](https://github.com/weichsel/ZIPFoundation)
* [InAppSettingsKit](https://github.com/futuretap/InAppSettingsKit)
* [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager)
* [SwiftTerm](https://github.com/migueldeicaza/SwiftTerm)
* [ZIP Foundation](https://github.com/weichsel/ZIPFoundation)
* [InAppSettingsKit](https://github.com/futuretap/InAppSettingsKit)
[1]: https://github.com/utmapp/UTM/actions?query=event%3Arelease+workflow%3ABuild
[2]: https://dantheman827.github.io/ios-app-signer/
[3]: https://github.com/utmapp/UTM/releases
[4]: https://github.com/utmapp/UTM/actions?query=workflow%3ABuild+event%3Arelease+is%3Asuccess
持续集成托管由 [MacStadium](https://www.macstadium.com/opensource) 提供。
[<img src="https://uploads-ssl.webflow.com/5ac3c046c82724970fc60918/5c019d917bba312af7553b49_MacStadium-developerlogo.png" alt="MacStadium logo" width="250">](https://www.macstadium.com)
[1]: https://github.com/utmapp/UTM/actions?query=event%3Arelease+workflow%3ABuild
[2]: screen.png
[3]: https://github.com/ktemkin/qemu/blob/with_tcti/tcg/aarch64-tcti/README.md
[4]: https://github.com/ish-app/ish
[5]: https://github.com/holzschu/a-shell