├── crates └── installer │ ├── assets │ └── .gitkeep │ ├── .gitignore │ ├── Cargo.toml │ └── src │ ├── utils.rs │ ├── vcc.rs │ └── main.rs ├── .github ├── FUNDING.yml └── workflows │ └── release.yml ├── .prettierrc ├── images ├── screenshot_1.png └── screenshot_2.png ├── types ├── injector.d.ts └── patch │ ├── translate.d.ts │ ├── index.d.ts │ └── algolia.d.ts ├── .env_example ├── .vscode └── extensions.json ├── src ├── components │ ├── setting │ │ └── index.tsx │ └── loading │ │ ├── styles.module.css.d.ts │ │ ├── styles.module.d.css.ts │ │ ├── styles.module.css │ │ └── index.tsx ├── patch │ ├── console_log.ts │ ├── algolia.ts │ └── translate.ts ├── helpers.ts ├── injector.ts └── patch-loader.ts ├── .gitignore ├── Cargo.toml ├── scripts ├── version.ts ├── localization_hashs.ts └── build-patch-loader.ts ├── crowdin.yml ├── tsconfig.json ├── package.json ├── LICENSE ├── localization ├── algolia.zh_CN.json ├── algolia.zh_TW.json ├── algolia.en.json ├── zh_CN.json ├── zh_TW.json └── en.json ├── Makefile ├── CONTRIBUTING.md ├── README.md ├── Cargo.lock ├── CODE_OF_CONDUCT.md └── pnpm-lock.yaml /crates/installer/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://afdian.com/a/gizmo"] 2 | -------------------------------------------------------------------------------- /crates/installer/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | 3 | assets/*.js 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "printWidth": 100 5 | } 6 | -------------------------------------------------------------------------------- /images/screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gizmo-ds/vcc-auto-translate/main/images/screenshot_1.png -------------------------------------------------------------------------------- /images/screenshot_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gizmo-ds/vcc-auto-translate/main/images/screenshot_2.png -------------------------------------------------------------------------------- /types/injector.d.ts: -------------------------------------------------------------------------------- 1 | export interface InjectFunction { 2 | name: string 3 | type: 'jsx' | 'createElement' 4 | } 5 | -------------------------------------------------------------------------------- /.env_example: -------------------------------------------------------------------------------- 1 | DEBUG_MODE=false 2 | EMBED_LANGUAGES=true 3 | 4 | ALGOLIA_APIKEY= 5 | ALGOLIA_APPID= 6 | ALGOLIA_INDEXNAME= 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "rust-lang.rust-analyzer", 4 | "esbenp.prettier-vscode" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /src/components/setting/index.tsx: -------------------------------------------------------------------------------- 1 | export function SettingsComponent() { 2 | return { 3 | component:

Settings

, 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /types/patch/translate.d.ts: -------------------------------------------------------------------------------- 1 | export interface Language { 2 | name: string 3 | language: string 4 | hash: string 5 | content: any 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | build 4 | test-data 5 | .env 6 | .env.local 7 | .vscode/* 8 | !.vscode/extensions.json 9 | target 10 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = ["crates/installer"] 4 | 5 | [profile.release] 6 | lto = true 7 | opt-level = 'z' 8 | panic = 'abort' 9 | strip = true 10 | -------------------------------------------------------------------------------- /src/components/loading/styles.module.css.d.ts: -------------------------------------------------------------------------------- 1 | declare const ClassNames: { 2 | "dark": string; 3 | "light": string; 4 | "patchLoadingCover": string; 5 | "patchLoadingProgress": string; 6 | "patchLoadingText": string; 7 | }; 8 | export default ClassNames; -------------------------------------------------------------------------------- /src/components/loading/styles.module.d.css.ts: -------------------------------------------------------------------------------- 1 | declare const ClassNames: { 2 | "dark": string; 3 | "light": string; 4 | "patchLoadingCover": string; 5 | "patchLoadingProgress": string; 6 | "patchLoadingText": string; 7 | }; 8 | export default ClassNames; -------------------------------------------------------------------------------- /scripts/version.ts: -------------------------------------------------------------------------------- 1 | import { exec } from 'node:child_process' 2 | import { promisify } from 'node:util' 3 | 4 | export const getPatchVersion = promisify(exec)('git describe --tags --always') 5 | .then(({ stdout }) => JSON.stringify(stdout.trimEnd())) 6 | .catch(() => '""') 7 | -------------------------------------------------------------------------------- /types/patch/index.d.ts: -------------------------------------------------------------------------------- 1 | export interface Config { 2 | patch_jsx?: FunctionPatch 3 | patch_createElement?: FunctionPatch 4 | patch_useMemo?: FunctionPatch 5 | before?: () => Promise 6 | after?: () => Promise 7 | } 8 | 9 | export interface FunctionPatch { 10 | fname: string 11 | before?: () => Promise 12 | after?: () => Promise 13 | } 14 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | pull_request_title: 'chore: sync translations from crowdin' 2 | pull_request_labels: 3 | - translations 4 | commit_message: 'chore: synced translations from crowdin [skip ci]' 5 | append_commit_message: false 6 | 7 | files: 8 | - source: /localization/en.json 9 | translation: /localization/%locale_with_underscore%.json 10 | - source: /localization/algolia.en.json 11 | translation: /localization/algolia.%locale_with_underscore%.json 12 | -------------------------------------------------------------------------------- /src/patch/console_log.ts: -------------------------------------------------------------------------------- 1 | import { Config } from '@/types/patch' 2 | 3 | const trash_logs = [(args: any[]) => args && args.length > 0 && args[0] === 'got backend message'] 4 | 5 | const config: Config = { 6 | async after() { 7 | const originalLog = console.log 8 | console.log = (...args: any[]) => { 9 | for (const fn of trash_logs) if (fn(args)) return 10 | originalLog.apply(console, args) 11 | } 12 | }, 13 | } 14 | 15 | export default config 16 | -------------------------------------------------------------------------------- /crates/installer/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "installer" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | anyhow = { version = "1.0.81" } 8 | regex-automata = { version = "0.4.6", default-features = false, features = ["std", "meta"] } 9 | scopeguard = { version = "1.2.0", default-features = false } 10 | 11 | [target.'cfg(windows)'.dependencies] 12 | winreg = { version = "0.52.0" } 13 | 14 | [[bin]] 15 | name = "vcc-auto-translate-installer" 16 | path = "src/main.rs" 17 | -------------------------------------------------------------------------------- /crates/installer/src/utils.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | 3 | #[cfg(target_os = "windows")] 4 | pub fn verbatim_path_display(path: &PathBuf) -> String { 5 | let display = path.display().to_string(); 6 | if display.starts_with(r#"\\?\UNC"#) { 7 | return display; 8 | } 9 | display.replace(r#"\\?\"#, "").replace("\\", "/") 10 | } 11 | 12 | #[cfg(not(target_os = "windows"))] 13 | pub fn verbatim_path_display(path: &PathBuf) -> String { 14 | path.display().to_string() 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "moduleResolution": "Node", 5 | "target": "ES2022", 6 | "strictNullChecks": true, 7 | "strictFunctionTypes": true, 8 | "sourceMap": true, 9 | "resolveJsonModule": true, 10 | "allowSyntheticDefaultImports": true, 11 | "allowArbitraryExtensions": true, 12 | "jsx": "react-jsx", 13 | "jsxImportSource": "jsx-dom", 14 | "paths": { 15 | "@/*": ["./*"] 16 | } 17 | }, 18 | "exclude": ["node_modules", "**/node_modules/*", "test-data", "build"] 19 | } 20 | -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | import { get as kv_get, set as kv_set, createStore as create_store } from 'idb-keyval' 2 | 3 | export const store = create_store('vcc_auto_translate', 'store') 4 | export const DebugMode = process.env.DEBUG_MODE === 'true' 5 | 6 | // 本地化文件的哈希值 7 | export const localization_hashs: Record = 8 | //@ts-ignore 9 | vcc_auto_translate.localization_hashs ?? {} 10 | 11 | // 打印调试信息 12 | export function debug_log(...args: any[]) { 13 | if (!DebugMode) return 14 | console.debug('[vcc-auto-translate]', ...args) 15 | } 16 | 17 | export async function user_language(): Promise { 18 | return (await kv_get('user_language', store)) ?? navigator.language 19 | } 20 | export async function set_user_language(lang: string) { 21 | return kv_set('user_language', lang, store) 22 | } 23 | -------------------------------------------------------------------------------- /scripts/localization_hashs.ts: -------------------------------------------------------------------------------- 1 | import { readdirSync, readFileSync } from 'node:fs' 2 | import { resolve, join as path_join } from 'node:path' 3 | 4 | export async function localization_hashs() { 5 | const dir = resolve('./localization') 6 | const files = readdirSync(dir) 7 | const hashs: Record = {} 8 | for (const filename of files) 9 | hashs[filename] = await text_hash( 10 | JSON.stringify(JSON.parse(readFileSync(path_join(dir, filename), 'utf-8'))) 11 | ) 12 | return JSON.stringify(hashs) 13 | } 14 | 15 | async function text_hash(content: any) { 16 | const hash = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(content as string)) 17 | return hex(hash) 18 | } 19 | function hex(hash: ArrayBuffer): string { 20 | return Array.from(new Uint8Array(hash)) 21 | .map((b) => b.toString(16).padStart(2, '0')) 22 | .join('') 23 | } 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vcc-auto-translate", 3 | "version": "1.0.0", 4 | "description": "", 5 | "private": true, 6 | "main": "index.js", 7 | "packageManager": "pnpm@10.6.1", 8 | "scripts": { 9 | "build:patch-loader": "esno scripts/build-patch-loader.ts" 10 | }, 11 | "keywords": [], 12 | "author": { 13 | "name": "Gizmo", 14 | "email": "me@aika.dev" 15 | }, 16 | "license": "MIT", 17 | "dependencies": { 18 | "@babel/types": "^7.24.0", 19 | "@fluentui/web-components": "^2.5.17", 20 | "ast-walker-scope": "^0.6.1", 21 | "idb-keyval": "^6.2.1", 22 | "jsx-dom": "^8.1.3", 23 | "magic-string-ast": "^0.3.0" 24 | }, 25 | "devDependencies": { 26 | "@types/node": "^20.11.28", 27 | "dotenv": "^16.4.5", 28 | "esbuild": "^0.20.2", 29 | "esbuild-css-modules-plugin": "^3.1.0", 30 | "esno": "^4.7.0" 31 | }, 32 | "pnpm": { 33 | "ignoredBuiltDependencies": [ 34 | "esbuild" 35 | ], 36 | "onlyBuiltDependencies": [ 37 | "esbuild" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Gizmo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /localization/algolia.zh_CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "placeholder": "搜索 VRChat 文档", 3 | "translations": { 4 | "buttonText": "搜索", 5 | "buttonAriaLabel": "搜索", 6 | "resetButtonTitle": "清除关键词", 7 | "resetButtonAriaLabel": "清除关键词", 8 | "cancelButtonText": "取消", 9 | "cancelButtonAriaLabel": "取消", 10 | "searchInputLabel": "搜索", 11 | "recentSearchesTitle": "最近搜索", 12 | "noRecentSearchesText": "最近没有搜索任何关键词", 13 | "saveRecentSearchButtonTitle": "保存搜索关键词", 14 | "removeRecentSearchButtonTitle": "从搜索历史记录移除该关键词", 15 | "favoriteSearchesTitle": "收藏", 16 | "removeFavoriteSearchButtonTitle": "从收藏中移除该关键词", 17 | "titleText": "无法加载搜索结果", 18 | "helpText": "您可能需要检查一下您的网络连接。", 19 | "selectText": "选择搜索结果", 20 | "selectKeyAriaLabel": "回车键", 21 | "navigateText": "切换搜索结果", 22 | "navigateUpKeyAriaLabel": "上箭头", 23 | "navigateDownKeyAriaLabel": "下箭头", 24 | "closeText": "关闭搜索", 25 | "closeKeyAriaLabel": "Esc 键", 26 | "searchByText": "搜索服务提供商", 27 | "noResultsText": "该关键词没有搜索结果", 28 | "suggestedQueryText": "尝试搜索", 29 | "reportMissingResultsText": "你认为该查询应该有结果?", 30 | "reportMissingResultsLinkText": "告诉我们。" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: [v*] 6 | branches: [main] 7 | pull_request: 8 | 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | release: 14 | name: Build and release 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | 19 | - name: Install pnpm 20 | uses: pnpm/action-setup@v4.1.0 21 | 22 | - name: Setup Node.js 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: lts/* 26 | cache: pnpm 27 | 28 | - name: Install dependencies 29 | run: pnpm install 30 | 31 | - name: Install linker 32 | shell: bash 33 | run: sudo apt-get install -y mingw-w64 34 | 35 | - name: Install Rust 36 | uses: dtolnay/rust-toolchain@stable 37 | with: 38 | toolchain: stable 39 | target: x86_64-pc-windows-gnu 40 | 41 | - name: Build release 42 | run: cp .env_example .env && make 43 | 44 | - name: Create release 45 | uses: softprops/action-gh-release@v1 46 | if: startsWith(github.ref, 'refs/tags/') 47 | with: 48 | files: build/* 49 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | pm = $(if $(shell command -v bun 2> /dev/null), bun, pnpm) 2 | 3 | all: build-installer compress 4 | 5 | build-script-loader: 6 | make build-patch-loader 7 | 8 | build-patch-loader: 9 | @${pm} esno scripts/build-patch-loader.ts 10 | @rm -rf build/*.css 11 | 12 | build-installer: build-patch-loader 13 | @cp build/patch-loader.js crates/installer/assets/patch-loader.js 14 | @cargo build --release --locked --target x86_64-pc-windows-gnu 15 | @cp target/x86_64-pc-windows-gnu/release/vcc-auto-translate-installer.exe build/ 16 | 17 | sha256sum: 18 | @rm -f build/*.sha256; for file in build/*; do sha256sum $$file > $$file.sha256; done 19 | 20 | compress: 21 | @if [ -n "$(shell command -v upx 2> /dev/null)" ]; then for file in build/*.exe; do upx $$file; done; fi 22 | 23 | clean: 24 | @rm -f cmd/installer/vcc-auto-translate.js 25 | @rm -f cmd/installer/localization/*.json 26 | @rm -rf build 27 | @cargo clean 28 | 29 | dev: clean build-patch-loader 30 | @rm -f crates/installer/assets/patch-loader.js 31 | @cp build/patch-loader.js crates/installer/assets/patch-loader.js 32 | @cargo build -p installer --locked --target x86_64-pc-windows-gnu 33 | target/x86_64-pc-windows-gnu/debug/vcc-auto-translate-installer.exe --no-pause 34 | -------------------------------------------------------------------------------- /localization/algolia.zh_TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "placeholder": "搜尋 VRChat 文檔", 3 | "translations": { 4 | "buttonText": "搜尋", 5 | "buttonAriaLabel": "搜尋", 6 | "resetButtonTitle": "清除查詢", 7 | "resetButtonAriaLabel": "清除查詢", 8 | "cancelButtonText": "取消", 9 | "cancelButtonAriaLabel": "取消", 10 | "searchInputLabel": "搜尋", 11 | "recentSearchesTitle": "Recent", 12 | "noRecentSearchesText": "尚無最近的搜尋紀錄", 13 | "saveRecentSearchButtonTitle": "儲存這個搜尋", 14 | "removeRecentSearchButtonTitle": "從歷史記錄中刪除這個搜尋", 15 | "favoriteSearchesTitle": "收藏", 16 | "removeFavoriteSearchButtonTitle": "從我的最愛移除此搜尋", 17 | "titleText": "無法抓取結果", 18 | "helpText": "你可能需要檢查網絡連接。", 19 | "selectText": "to select", 20 | "selectKeyAriaLabel": "Enter key", 21 | "navigateText": "to navigate", 22 | "navigateUpKeyAriaLabel": "Arrow up", 23 | "navigateDownKeyAriaLabel": "Arrow down", 24 | "closeText": "to close", 25 | "closeKeyAriaLabel": "Escape key", 26 | "searchByText": "Search by", 27 | "noResultsText": "No results for", 28 | "suggestedQueryText": "Try searching for", 29 | "reportMissingResultsText": "Believe this query should return results?", 30 | "reportMissingResultsLinkText": "Let us know." 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /localization/algolia.en.json: -------------------------------------------------------------------------------- 1 | { 2 | "placeholder": "Search the VRChat docs", 3 | "translations": { 4 | "buttonText": "Search", 5 | "buttonAriaLabel": "Search", 6 | "resetButtonTitle": "Clear the query", 7 | "resetButtonAriaLabel": "Clear the query", 8 | "cancelButtonText": "Cancel", 9 | "cancelButtonAriaLabel": "Cancel", 10 | "searchInputLabel": "Search", 11 | "recentSearchesTitle": "Recent", 12 | "noRecentSearchesText": "No recent searches", 13 | "saveRecentSearchButtonTitle": "Save this search", 14 | "removeRecentSearchButtonTitle": "Remove this search from history", 15 | "favoriteSearchesTitle": "Favorite", 16 | "removeFavoriteSearchButtonTitle": "Remove this search from favorites", 17 | "titleText": "Unable to fetch results", 18 | "helpText": "You might want to check your network connection.", 19 | "selectText": "to select", 20 | "selectKeyAriaLabel": "Enter key", 21 | "navigateText": "to navigate", 22 | "navigateUpKeyAriaLabel": "Arrow up", 23 | "navigateDownKeyAriaLabel": "Arrow down", 24 | "closeText": "to close", 25 | "closeKeyAriaLabel": "Escape key", 26 | "searchByText": "Search by", 27 | "noResultsText": "No results for", 28 | "suggestedQueryText": "Try searching for", 29 | "reportMissingResultsText": "Believe this query should return results?", 30 | "reportMissingResultsLinkText": "Let us know." 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /scripts/build-patch-loader.ts: -------------------------------------------------------------------------------- 1 | import { config as dotenv_config } from 'dotenv' 2 | import { build as esbuild } from 'esbuild' 3 | //@ts-ignore 4 | import cssModulesPlugin from 'esbuild-css-modules-plugin' 5 | import { localization_hashs } from './localization_hashs' 6 | import { rmSync } from 'node:fs' 7 | import { getPatchVersion } from './version' 8 | 9 | const env_config = dotenv_config({ path: ['.env.local', '.env'] }) 10 | 11 | async function build() { 12 | const define = env_config.parsed 13 | ? Object.keys(env_config.parsed).reduce((acc, key) => { 14 | acc[`process.env.${key}`] = JSON.stringify(env_config.parsed![key]) 15 | return acc 16 | }, {}) 17 | : {} 18 | define['vcc_auto_translate.localization_hashs'] = 19 | env_config.parsed?.EMBED_LANGUAGES === 'true' ? await localization_hashs() : '{}' 20 | define['process.env.PATCH_VERSION'] = await getPatchVersion 21 | 22 | await esbuild({ 23 | entryPoints: ['src/patch-loader.ts'], 24 | bundle: true, 25 | format: 'esm', 26 | platform: 'browser', 27 | target: 'es2022', 28 | minify: true, 29 | outfile: 'build/patch-loader.js', 30 | metafile: true, 31 | jsx: 'automatic', 32 | define, 33 | plugins: [ 34 | cssModulesPlugin({ 35 | emitDeclarationFile: true, 36 | inject: true, 37 | }), 38 | ], 39 | }) 40 | rmSync('build/patch-loader.css') 41 | } 42 | 43 | build() 44 | -------------------------------------------------------------------------------- /src/components/loading/styles.module.css: -------------------------------------------------------------------------------- 1 | .patch-loading-cover { 2 | --patch-loading-cover-dark-background: #1f1f1f; 3 | --patch-loading-cover-dark-color: #ffffff; 4 | 5 | --patch-loading-cover-light-background: #fafafa; 6 | --patch-loading-cover-light-color: #242424; 7 | } 8 | 9 | .patch-loading-cover { 10 | background: var(--patch-loading-cover-light-background); 11 | color: var(--patch-loading-cover-light-color) !important; 12 | } 13 | 14 | @media (prefers-color-scheme: dark) { 15 | .patch-loading-cover { 16 | background: var(--patch-loading-cover-dark-background); 17 | color: var(--patch-loading-cover-dark-color) !important; 18 | } 19 | } 20 | 21 | .patch-loading-cover.dark { 22 | background: var(--patch-loading-cover-dark-background) !important; 23 | color: var(--patch-loading-cover-dark-color) !important; 24 | } 25 | 26 | .patch-loading-cover.light { 27 | background: var(--patch-loading-cover-light-background); 28 | color: var(--patch-loading-cover-light-color) !important; 29 | } 30 | 31 | .patch-loading-cover { 32 | position: absolute; 33 | top: 0; 34 | left: 0; 35 | 36 | display: flex; 37 | align-items: center; 38 | justify-content: center; 39 | flex-direction: column; 40 | 41 | height: 100vh; 42 | width: 100vw; 43 | 44 | z-index: 1000; 45 | } 46 | 47 | .patch-loading-text { 48 | font-size: xx-large; 49 | } 50 | 51 | .patch-loading-progress { 52 | margin-top: 1rem; 53 | width: 400px; 54 | } 55 | -------------------------------------------------------------------------------- /src/components/loading/index.tsx: -------------------------------------------------------------------------------- 1 | import { fluentProgress, provideFluentDesignSystem } from '@fluentui/web-components' 2 | import styles from './styles.module.css' 3 | 4 | export function LoadingComponent(props: { text: string }) { 5 | provideFluentDesignSystem().register(fluentProgress()) 6 | 7 | const app_theme = localStorage.getItem('app_theme') 8 | let color_scheme = window.matchMedia('(prefers-color-scheme: dark)').matches 9 | ? styles.dark 10 | : styles.light 11 | switch (app_theme) { 12 | case 'Dark': 13 | color_scheme = styles.dark 14 | break 15 | case 'Light': 16 | color_scheme = styles.light 17 | break 18 | default: 19 | break 20 | } 21 | return { 22 | component: ( 23 |
24 |

25 | {props.text} 26 |

27 | {/* @ts-ignore */} 28 | 29 |
30 | ), 31 | set_text(text: string) { 32 | const text_elements = document.getElementsByClassName(styles.patchLoadingText) 33 | if (text_elements) for (const e of text_elements) e.innerHTML = text 34 | }, 35 | hide_progress() { 36 | const progress_elements = document.getElementsByClassName(styles.patchLoadingProgress) 37 | if (progress_elements) for (const e of progress_elements) e.remove() 38 | }, 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to [vcc-auto-translate](https://github.com/gizmo-ds/vcc-auto-translate) 2 | 3 | We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: 4 | 5 | - Reporting [an issue](https://github.com/gizmo-ds/vcc-auto-translate/issues/new?assignees=&labels=bug). 6 | - [Discussing](https://github.com/gizmo-ds/vcc-auto-translate/discussions) the current state of the code. 7 | - Submitting [a fix](https://github.com/gizmo-ds/vcc-auto-translate/compare). 8 | - Proposing [new features](https://github.com/gizmo-ds/vcc-auto-translate/issues/new?assignees=&labels=enhancement). 9 | - Becoming a maintainer. 10 | 11 | ## All Changes Happen Through Pull Requests 12 | 13 | Pull requests are the best way to propose changes. We actively welcome your pull requests: 14 | 15 | 1. Fork the repo and create your branch from `main`. 16 | 2. If you've added code that should be tested, add some tests' examples. 17 | 3. If you've changed APIs, update the documentation. 18 | 4. Issue that pull request! 19 | 20 | ## Any contributions you make will be under the MIT Software License 21 | 22 | In short, when you submit changes, your submissions are understood to be under the same [MIT License](https://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. 23 | 24 | ## Report issues/bugs using GitHub's [issues](https://github.com/gizmo-ds/vcc-auto-translate/issues) 25 | 26 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/gizmo-ds/vcc-auto-translate/issues/new/choose); it's that easy! 27 | -------------------------------------------------------------------------------- /types/patch/algolia.d.ts: -------------------------------------------------------------------------------- 1 | export interface Localization { 2 | translations: DocSearchTranslations 3 | placeholder: string 4 | } 5 | 6 | interface DocSearchTranslations 7 | extends ButtonTranslations, 8 | SearchBoxTranslations, 9 | FooterTranslations, 10 | ErrorScreenTranslations, 11 | StartScreenTranslations, 12 | NoResultsScreenTranslations { 13 | placeholder?: string 14 | } 15 | 16 | // https://github.com/algolia/docsearch/blob/2df2e1392fa80e5cc9cafac3437685331b9f07ec/packages/docsearch-react/src/DocSearchButton.tsx#L6-L9 17 | type ButtonTranslations = Partial<{ 18 | buttonText: string 19 | buttonAriaLabel: string 20 | }> 21 | 22 | // https://github.com/algolia/docsearch/blob/2df2e1392fa80e5cc9cafac3437685331b9f07ec/packages/docsearch-react/src/SearchBox.tsx#L14-L20 23 | type SearchBoxTranslations = Partial<{ 24 | resetButtonTitle: string 25 | resetButtonAriaLabel: string 26 | cancelButtonText: string 27 | cancelButtonAriaLabel: string 28 | searchInputLabel: string 29 | }> 30 | 31 | // https://github.com/algolia/docsearch/blob/2df2e1392fa80e5cc9cafac3437685331b9f07ec/packages/docsearch-react/src/Footer.tsx#L5-L14 32 | type FooterTranslations = Partial<{ 33 | selectText: string 34 | selectKeyAriaLabel: string 35 | navigateText: string 36 | navigateUpKeyAriaLabel: string 37 | navigateDownKeyAriaLabel: string 38 | closeText: string 39 | closeKeyAriaLabel: string 40 | searchByText: string 41 | }> 42 | 43 | // https://github.com/algolia/docsearch/blob/2df2e1392fa80e5cc9cafac3437685331b9f07ec/packages/docsearch-react/src/ErrorScreen.tsx#L5-L8 44 | type ErrorScreenTranslations = Partial<{ 45 | titleText: string 46 | helpText: string 47 | }> 48 | 49 | // https://github.com/algolia/docsearch/blob/2df2e1392fa80e5cc9cafac3437685331b9f07ec/packages/docsearch-react/src/StartScreen.tsx#L8-L15 50 | type StartScreenTranslations = Partial<{ 51 | recentSearchesTitle: string 52 | noRecentSearchesText: string 53 | saveRecentSearchButtonTitle: string 54 | removeRecentSearchButtonTitle: string 55 | favoriteSearchesTitle: string 56 | removeFavoriteSearchButtonTitle: string 57 | }> 58 | 59 | // https://github.com/algolia/docsearch/blob/2df2e1392fa80e5cc9cafac3437685331b9f07ec/packages/docsearch-react/src/NoResultsScreen.tsx#L7-L12 60 | type NoResultsScreenTranslations = Partial<{ 61 | noResultsText: string 62 | suggestedQueryText: string 63 | reportMissingResultsText: string 64 | reportMissingResultsLinkText: string 65 | }> 66 | -------------------------------------------------------------------------------- /src/injector.ts: -------------------------------------------------------------------------------- 1 | import { InjectFunction } from '@/types/injector' 2 | import { AssignmentExpression, MemberExpression } from '@babel/types' 3 | import { walkAST, babelParse } from 'ast-walker-scope' 4 | import { MagicString } from 'magic-string-ast' 5 | 6 | const propertys = ['jsx', 'createElement'] 7 | 8 | export async function injector(code: string, funcs: InjectFunction[]): Promise { 9 | return new Promise(async (resolve, reject) => { 10 | const filters: string[] = [...new Set(funcs.map((f) => f.type))].filter((n) => 11 | propertys.includes(n) 12 | ) 13 | if (filters.length === 0) return resolve(code) 14 | const nodes: Record = filters.reduce((acc, key) => { 15 | acc[key] = undefined 16 | return acc 17 | }, {}) 18 | 19 | const ms = new MagicString(code) 20 | const ast = babelParse(code) 21 | 22 | let skip = false 23 | walkAST(ast, { 24 | enter(node) { 25 | if (skip) return this.skip() 26 | 27 | if (filters.length > 0) { 28 | if ( 29 | node.type === 'ExpressionStatement' && 30 | node.expression.type === 'AssignmentExpression' && 31 | node.expression.operator === '=' && 32 | node.expression.left.type === 'MemberExpression' && 33 | node.expression.left.property.type === 'Identifier' && 34 | node.expression.right.type === 'Identifier' 35 | ) { 36 | const name = node.expression.left.property.name 37 | if (!filters.includes(name)) return this.skip() 38 | nodes[name] = node.expression 39 | if (Object.keys(nodes).every((n) => nodes[n] !== undefined)) skip = true 40 | if (propertys.every((n) => nodes[n] !== undefined)) skip = true 41 | return this.skip() 42 | } 43 | } 44 | }, 45 | }) 46 | 47 | for (const name of filters) { 48 | funcs 49 | .filter((f) => f.type === name) 50 | .forEach((f) => { 51 | const node = nodes[name]! 52 | const obj = (node.left as MemberExpression).object 53 | //@ts-ignore 54 | const n = `${obj.name}.${node.left.property.name}` 55 | ms.appendRight(node.right.end!, `;${n}=__vcc_function_proxy__(${n},${f.name})`) 56 | }) 57 | } 58 | 59 | resolve(ms.toString()) 60 | }) 61 | } 62 | 63 | export function function_proxy(ofn: Function, fn1: Function, fn2: Function) { 64 | return new Proxy(ofn, { 65 | apply: function (target, thisArg, argumentsList) { 66 | fn1 && fn1.apply(thisArg, argumentsList) 67 | const result = target.apply(thisArg, argumentsList) 68 | if (fn2) return fn2(result) 69 | return result 70 | }, 71 | }) 72 | } 73 | -------------------------------------------------------------------------------- /crates/installer/src/vcc.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{Context, Result}; 2 | use regex_automata::meta; 3 | 4 | #[cfg(target_os = "windows")] 5 | pub fn install_path() -> Result { 6 | use winreg::RegKey; 7 | let install_path: String = RegKey::predef(winreg::enums::HKEY_CURRENT_USER) 8 | .open_subkey("Software\\VCC")? 9 | .get_value("InstallPath") 10 | .with_context(|| "Failed to get VCC install path")?; 11 | Ok(install_path) 12 | } 13 | 14 | #[cfg(not(target_os = "windows"))] 15 | pub fn install_path() -> Result { 16 | Ok("./".to_string()) 17 | } 18 | 19 | pub fn patch_loader() -> Result { 20 | let script_content = include_bytes!("../assets/patch-loader.js"); 21 | let script_content = std::str::from_utf8(script_content.as_ref()) 22 | .with_context(|| "Failed to convert patch loader asset to string")?; 23 | let loader_content = format!( 24 | r#""#, 29 | script_content 30 | ); 31 | Ok(loader_content) 32 | } 33 | 34 | pub fn installer_csp(index_content: String) -> Result { 35 | let mut index_content = index_content.replace( 36 | "", 37 | ""); 38 | 39 | let loader_content = patch_loader()?; 40 | let loader_content = format!("\n{}", loader_content); 41 | 42 | index_content = index_content.replace("", loader_content.as_str()); 43 | Ok(index_content) 44 | } 45 | 46 | pub fn installer_meta(index_content: String) -> Result { 47 | let re = meta::Regex::new(r#"\/script]+>"#)?; 48 | 49 | let mut caps = re.create_captures(); 50 | re.captures(&index_content, &mut caps); 51 | if !caps.is_match() { 52 | return Err(anyhow::anyhow!("Failed to find index.js script tag")); 53 | } 54 | if caps.group_len() < 2 { 55 | return Err(anyhow::anyhow!("Failed to find index.js script tag")); 56 | } 57 | 58 | let index_tag = match caps.get_group(0) { 59 | Some(span) => &index_content[span.start..span.end], 60 | None => return Err(anyhow::anyhow!("Failed to find index.js script tag")), 61 | }; 62 | let index_file = match caps.get_group(1) { 63 | Some(span) => &index_content[span.start..span.end], 64 | None => return Err(anyhow::anyhow!("Failed to find index.js script tag")), 65 | }; 66 | 67 | let index_content = index_content.replace( 68 | index_tag, 69 | &format!("", index_file), 70 | ); 71 | 72 | let loader_content = patch_loader()?; 73 | let index_content = 74 | index_content.replace("", format!("{}\n", loader_content).as_str()); 75 | Ok(index_content.to_string()) 76 | } 77 | -------------------------------------------------------------------------------- /src/patch-loader.ts: -------------------------------------------------------------------------------- 1 | import { get as kv_get, set as kv_set } from 'idb-keyval' 2 | import { InjectFunction } from '@/types/injector' 3 | import { LoadingComponent } from './components/loading' 4 | import { injector, function_proxy } from './injector' 5 | import algolia_patch from './patch/algolia' 6 | import translate_patch from './patch/translate' 7 | import console_log_patch from './patch/console_log' 8 | import { store, DebugMode } from './helpers' 9 | 10 | const patchs = [algolia_patch, translate_patch, console_log_patch] 11 | 12 | async function main() { 13 | const index_script_file = 14 | document.getElementsByTagName('meta')['index-module']?.content ?? 15 | document.querySelector('script[type="module"][src^="/assets/index-"]')?.getAttribute('src') 16 | const patched_filename = index_script_file.replace(/\.js$/, '.patched.js') 17 | const local_patched_filename = await kv_get('patched-filename', store) 18 | let patched_code: string | undefined 19 | const patch_version = process.env.PATCH_VERSION 20 | const local_patch_version = await kv_get('patch-version', store) 21 | 22 | globalThis['__vcc_function_proxy__'] = function_proxy 23 | 24 | if ( 25 | DebugMode || 26 | !local_patched_filename || 27 | local_patched_filename !== patched_filename || 28 | !local_patch_version || 29 | local_patch_version !== patch_version 30 | ) { 31 | for (const p of patchs) { 32 | for (const key of Object.keys(p)) p[key].before && (await p[key].before()) 33 | p.before && (await p.before()) 34 | } 35 | 36 | const loading = LoadingComponent({ text: '正在应用翻译补丁...' }) 37 | document.querySelector('#root')?.before(loading.component) 38 | 39 | const u = new URL(location.origin) 40 | u.pathname = index_script_file 41 | const code = await fetch(u.href).then((res) => res.text()) 42 | 43 | const inject_functions: InjectFunction[] = [] 44 | patchs.forEach((p) => { 45 | if (p.patch_jsx) inject_functions.push({ name: p.patch_jsx.fname, type: 'jsx' }) 46 | if (p.patch_createElement) 47 | inject_functions.push({ name: p.patch_createElement.fname, type: 'createElement' }) 48 | }) 49 | patched_code = await injector(code, inject_functions) 50 | 51 | await kv_set('patch-version', patch_version, store) 52 | kv_set('patched-filename', patched_filename, store) 53 | await kv_set('patched-content', patched_code, store) 54 | 55 | loading.hide_progress() 56 | loading.set_text('翻译补丁已应用 🎉') 57 | setTimeout(() => loading.component.remove(), 2000) 58 | } 59 | 60 | for (const p of patchs) { 61 | for (const key of Object.keys(p)) p[key].after && (await p[key].after()) 62 | p.after && (await p.after()) 63 | } 64 | 65 | load_patched_code(patched_code) 66 | } 67 | 68 | async function load_patched_code(patched_code?: string) { 69 | if (!patched_code) patched_code = await kv_get('patched-content', store)! 70 | const e = document.createElement('script') 71 | e.setAttribute('type', 'module') 72 | e.innerHTML = patched_code! 73 | document.body.appendChild(e) 74 | } 75 | 76 | main() 77 | -------------------------------------------------------------------------------- /src/patch/algolia.ts: -------------------------------------------------------------------------------- 1 | import { del as kv_del, set as kv_set, get as kv_get } from 'idb-keyval' 2 | import { Config } from '@/types/patch' 3 | import { Localization } from '@/types/patch/algolia' 4 | import { Language } from '@/types/patch/translate' 5 | import { localization_hashs, store, user_language } from '../helpers' 6 | 7 | const embedded_languages: Language[] = 8 | process.env.EMBED_LANGUAGES === 'true' 9 | ? [ 10 | { 11 | name: '简体中文', 12 | language: 'zh-CN', 13 | content: import('@/localization/algolia.zh_CN.json'), 14 | hash: localization_hashs['algolia.zh_CN.json'], 15 | }, 16 | { 17 | name: '正體中文', 18 | language: 'zh-TW', 19 | content: import('@/localization/algolia.zh_TW.json'), 20 | hash: localization_hashs['algolia.zh_TW.json'], 21 | }, 22 | { 23 | name: 'English', 24 | language: 'en', 25 | content: import('@/localization/algolia.en.json'), 26 | hash: localization_hashs['algolia.en.json'], 27 | }, 28 | ] 29 | : [] 30 | 31 | const config: Config = { 32 | patch_jsx: { 33 | fname: '__algolia_jsx_patch__', 34 | async before() { 35 | await kv_del('algolia_languages', store) 36 | }, 37 | async after() { 38 | const algolia_info = { 39 | apiKey: process.env.ALGOLIA_APIKEY, 40 | appId: process.env.ALGOLIA_APPID, 41 | indexName: process.env.ALGOLIA_INDEXNAME, 42 | } 43 | const is_str_set = (v: string | undefined) => v && v != '' 44 | const replace = 45 | is_str_set(algolia_info.apiKey) && 46 | is_str_set(algolia_info.appId) && 47 | is_str_set(algolia_info.indexName) 48 | 49 | await load_languages() 50 | const localization: Localization = (await algolia_localization())?.content 51 | globalThis['__algolia_jsx_patch__'] = (e: any, t: any) => { 52 | if (!e) return t 53 | if (!(t.apiKey && t.appId && t.appId && t.placeholder)) return t 54 | 55 | t.placeholder = localization!.placeholder 56 | if (replace) { 57 | t.apiKey = algolia_info.apiKey 58 | t.appId = algolia_info.appId 59 | t.indexName = algolia_info.indexName 60 | } 61 | return t 62 | } 63 | }, 64 | }, 65 | patch_createElement: { 66 | fname: '__algolia_createElement_patch__', 67 | async after() { 68 | await load_languages() 69 | const localization: Localization = (await algolia_localization())?.content 70 | globalThis['__algolia_createElement_patch__'] = (e: any, t: any, r: any) => { 71 | if (t && Object.prototype.hasOwnProperty.call(t, 'translations')) 72 | t.translations = localization?.translations ?? {} 73 | } 74 | }, 75 | }, 76 | } 77 | 78 | export default config 79 | 80 | let algolia_languages: Language[] | undefined 81 | async function load_languages() { 82 | if (algolia_languages) return 83 | algolia_languages = await kv_get('algolia_languages', store).then((langs) => langs as Language[]) 84 | if (algolia_languages) return 85 | for (const lang of embedded_languages) lang.content = (await lang.content).default 86 | await kv_set('algolia_languages', embedded_languages, store) 87 | algolia_languages = embedded_languages 88 | } 89 | export async function algolia_localization(): Promise { 90 | const _user_language = await user_language() 91 | return algolia_languages?.find((v) => v.language === _user_language) 92 | } 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VCC Auto Translate 2 | 3 | [![Release](https://img.shields.io/github/v/release/gizmo-ds/vcc-auto-translate.svg?include_prereleases&style=flat-square)](https://github.com/gizmo-ds/vcc-auto-translate/releases/latest) 4 | [![GitHub Downloads](https://img.shields.io/github/downloads/gizmo-ds/vcc-auto-translate/total?style=flat-square)](https://github.com/gizmo-ds/vcc-auto-translate/releases/latest) 5 | [![License](https://img.shields.io/github/license/gizmo-ds/vcc-auto-translate?style=flat-square)](./LICENSE) 6 | [![简体中文](https://img.shields.io/badge/dynamic/json?color=blue&label=%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87&style=flat-square&logo=crowdin&query=%24.progress%5B0%5D.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-15293064-658026.json)](https://zh.crowdin.com/project/vcc-auto-translate) 7 | [![正體中文](https://img.shields.io/badge/dynamic/json?color=blue&label=%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87&style=flat-square&logo=crowdin&query=%24.progress%5B1%5D.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-15293064-658026.json)](https://zh.crowdin.com/project/vcc-auto-translate) 8 | 9 | VCC(VRChat Creator Companion) 的翻译脚本, 用于自动翻译 VCC 的界面. 10 | 11 | ## 项目状态说明 12 | 13 | 本项目仍然处于正常维护状态,尽管最近没有新的提交,但这并不影响其可用性。 14 | 15 | - **稳定性保证**:本项目使用 AST 技术实现翻译,只要 VCC 的 React 代码结构没有大规模变更,翻译功能就不会失效。 16 | - **自动适配更新**:VCC 更新后,只需重新执行补丁安装程序,翻译即可自动应用,无需额外修改代码。 17 | - **翻译进度**:目前 VCC 的大部分文本已完成翻译。由于缺少优秀的翻译人员,未来翻译内容的更新可能不会很频繁,但项目仍然可以正常使用。 18 | 19 | 如果您遇到任何问题,欢迎提交 Issue,我们会尽力提供支持。 20 | 21 | ## 效果图 22 | 23 | ![Screenshot 1](images/screenshot_1.png) 24 | 25 | ![Screenshot 2](images/screenshot_2.png) 26 | 27 | ## 自动安装 28 | 29 | 你可以通过 [Release](https://github.com/gizmo-ds/vcc-auto-translate/releases/latest) 下载预编译的安装工具并运行, 30 | 该工具会自动安装翻译脚本. 31 | 如果出现错误, 请尝试将安装工具移动到 VCC 安装目录下运行. (与`CreatorCompanion.exe`同目录) 32 | 33 | > [!IMPORTANT] 34 | > VCC Beta 版本必须将安装工具移动到 VCC Beta 目录下运行. (与`CreatorCompanionBeta.exe`同目录) 35 | 36 | ## 如何移除翻译脚本? 37 | 38 | 1. 删除 `[VCC安装目录]/WebApp/Dist` 目录下的 `index.html` 文件 39 | 2. 将 `[VCC安装目录]/WebApp/Dist` 目录下的 `index.html.backup` 重命名为 `index.html` 40 | 41 | ## 手动编译并安装 42 | 43 | 环境要求: 44 | 45 | - [Rust](https://www.rust-lang.org/) 46 | - [Node.js + package manager](https://nodejs.org/) / [bun](https://bun.sh/) 47 | - [make](https://duckduckgo.com/?q=make+install) (可选) 48 | - [upx](https://github.com/upx/upx/releases/latest) (可选) 49 | 50 | 使用`make`工具可以更方便地进行编译, 你只需要执行`make`命令即可完成所有编译步骤. 你可以在`build`目录找到自动安装工具. 51 | 52 | [Makefile](./Makefile) 仅在 Linux 下测试过, 如果你使用 Windows, 你可以使用 WSL 或这参考以下步骤进行手动编译. 53 | 54 | 以 PowerShell + [pnpm](https://pnpm.io/installation) 为例: 55 | 56 | ```shell 57 | pnpm install 58 | pnpm run build:patch-loader 59 | Copy-Item build/patch-loader.js crates/installer/assets/patch-loader.js 60 | cargo build --release --locked 61 | ``` 62 | 63 | 编译完成后, 你可以在`target/release`目录找到编译好的自动安装工具. 64 | 65 | ## Related 66 | 67 | - [VRChat-Creator-Companion-zh-CN](https://github.com/Sonic853/VRChat-Creator-Companion-zh-CN) - This project was 68 | inspired by this project. 69 | - [CreatorCompanionPatcher](https://github.com/Misaka-L/CreatorCompanionPatcher) - A patcher that can be used in 70 | conjunction with this project to fix certain issues or behaviors in VRChat Creator Companion. 71 | 72 | ## Contributors 73 | 74 | ![Contributors](https://contributors.aika.dev/gizmo-ds/vcc-auto-translate/contributors.svg?align=left) 75 | 76 | ## Sponsors 77 | 78 | [![Sponsors](https://afdian-connect.deno.dev/sponsor.svg)](https://afdian.com/a/gizmo) 79 | 80 | ## Thanks 81 | 82 | Thanks to [JetBrains](https://jb.gg/OpenSourceSupport) for the open source license(s). 83 | 84 | ![JetBrains Logo (Main) logo](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg) 85 | 86 | ## License 87 | 88 | Code is distributed under [MIT](./LICENSE) license, feel free to use it in your proprietary projects as well. 89 | -------------------------------------------------------------------------------- /crates/installer/src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use(defer)] 2 | extern crate scopeguard; 3 | 4 | use std::fs::{copy, File}; 5 | use std::io::{self, BufRead, Read, Write}; 6 | use std::path::Path; 7 | 8 | use anyhow::Context; 9 | 10 | mod utils; 11 | mod vcc; 12 | 13 | fn main() { 14 | let args: Vec = std::env::args().skip(1).collect(); 15 | let mut pause = true; 16 | let mut installer_type = "meta".to_string(); 17 | 18 | // Parse arguments 19 | for arg in args { 20 | match arg.split('=').collect::>().as_slice() { 21 | ["--no-pause"] => { 22 | pause = false; 23 | } 24 | ["--type", value] => { 25 | installer_type = value.to_string(); 26 | } 27 | _ => return println!("Invalid argument: {}", arg), 28 | } 29 | } 30 | let installer = match installer_type.as_str() { 31 | "csp" => vcc::installer_csp, 32 | "meta" => vcc::installer_meta, 33 | t => return println!("Invalid installer type: {}", t), 34 | }; 35 | 36 | // Pause before exit 37 | defer! { 38 | if !pause {return;} 39 | println!("\nPress Enter to exit..."); 40 | let _ = io::stdin().lock().lines().next(); 41 | } 42 | 43 | println!( 44 | r#"VCC Auto Translate installer 45 | 46 | This installer will add the VCC Auto Translate script to your VCC installation. 47 | Source code: https://github.com/gizmo-ds/vcc-auto-translate 48 | "# 49 | ); 50 | 51 | let mut vcc_path = match Path::new("./").canonicalize() { 52 | Ok(path) => path, 53 | Err(e) => return println!("Error: {:?}", e), 54 | }; 55 | if !vcc_path.join("CreatorCompanion.exe").exists() 56 | && !vcc_path.join("CreatorCompanionBeta.exe").exists() 57 | { 58 | let install_path_str = match vcc::install_path() { 59 | Ok(path) => path, 60 | Err(e) => return println!("Error: {:?}", e), 61 | }; 62 | vcc_path = Path::new(&install_path_str).to_path_buf(); 63 | } 64 | println!( 65 | "VCC Install Path: {}\n", 66 | utils::verbatim_path_display(&vcc_path) 67 | ); 68 | 69 | let dist_path = vcc_path.join("WebApp").join("Dist"); 70 | if !dist_path.exists() { 71 | return println!("Error: Dist path does not exist"); 72 | } 73 | 74 | let index_file = dist_path.join("index.html"); 75 | if !index_file.exists() { 76 | return println!("Error: index.html does not exist"); 77 | } 78 | 79 | let backup_file = dist_path.join("index.html.backup"); 80 | if !backup_file.exists() { 81 | match copy(&index_file, &backup_file) { 82 | Ok(_) => println!("Backup created: {}", backup_file.display()), 83 | Err(e) => return println!("Error: {:?}", e), 84 | }; 85 | } 86 | 87 | let mut index_content = String::new(); 88 | let mut file = match File::open(match backup_file.exists() { 89 | true => &backup_file, 90 | false => &index_file, 91 | }) 92 | .with_context(|| "Failed to open index file") 93 | { 94 | Ok(f) => f, 95 | Err(e) => return println!("Error: {:?}", e), 96 | }; 97 | file.flush().unwrap(); 98 | 99 | match file 100 | .read_to_string(&mut index_content) 101 | .with_context(|| format!("Failed to read index file: {}", index_file.display())) 102 | { 103 | Ok(_) => (), 104 | Err(e) => return println!("Error: {:?}", e), 105 | } 106 | 107 | index_content = match installer(index_content) { 108 | Ok(content) => content, 109 | Err(e) => return println!("Error: {:?}", e), 110 | }; 111 | 112 | let mut file = match File::create(&index_file) { 113 | Ok(f) => f, 114 | Err(e) => return println!("Failed to create index file: {:?}", e), 115 | }; 116 | match file 117 | .write_all(index_content.as_bytes()) 118 | .with_context(|| format!("Failed to write index file: {}", index_file.display())) 119 | { 120 | Ok(_) => println!("VCC Auto Translate installed successfully"), 121 | Err(e) => return println!("Error: {:?}", e), 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anyhow" 16 | version = "1.0.82" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" 19 | 20 | [[package]] 21 | name = "cfg-if" 22 | version = "1.0.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 25 | 26 | [[package]] 27 | name = "installer" 28 | version = "0.1.0" 29 | dependencies = [ 30 | "anyhow", 31 | "regex-automata", 32 | "scopeguard", 33 | "winreg", 34 | ] 35 | 36 | [[package]] 37 | name = "memchr" 38 | version = "2.7.2" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 41 | 42 | [[package]] 43 | name = "regex-automata" 44 | version = "0.4.6" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 47 | dependencies = [ 48 | "aho-corasick", 49 | "memchr", 50 | "regex-syntax", 51 | ] 52 | 53 | [[package]] 54 | name = "regex-syntax" 55 | version = "0.8.3" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 58 | 59 | [[package]] 60 | name = "scopeguard" 61 | version = "1.2.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 64 | 65 | [[package]] 66 | name = "windows-sys" 67 | version = "0.48.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 70 | dependencies = [ 71 | "windows-targets", 72 | ] 73 | 74 | [[package]] 75 | name = "windows-targets" 76 | version = "0.48.5" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 79 | dependencies = [ 80 | "windows_aarch64_gnullvm", 81 | "windows_aarch64_msvc", 82 | "windows_i686_gnu", 83 | "windows_i686_msvc", 84 | "windows_x86_64_gnu", 85 | "windows_x86_64_gnullvm", 86 | "windows_x86_64_msvc", 87 | ] 88 | 89 | [[package]] 90 | name = "windows_aarch64_gnullvm" 91 | version = "0.48.5" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 94 | 95 | [[package]] 96 | name = "windows_aarch64_msvc" 97 | version = "0.48.5" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 100 | 101 | [[package]] 102 | name = "windows_i686_gnu" 103 | version = "0.48.5" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 106 | 107 | [[package]] 108 | name = "windows_i686_msvc" 109 | version = "0.48.5" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 112 | 113 | [[package]] 114 | name = "windows_x86_64_gnu" 115 | version = "0.48.5" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 118 | 119 | [[package]] 120 | name = "windows_x86_64_gnullvm" 121 | version = "0.48.5" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 124 | 125 | [[package]] 126 | name = "windows_x86_64_msvc" 127 | version = "0.48.5" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 130 | 131 | [[package]] 132 | name = "winreg" 133 | version = "0.52.0" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 136 | dependencies = [ 137 | "cfg-if", 138 | "windows-sys", 139 | ] 140 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | [me@aika.dev](mailto:me@aika.dev). 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html). 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are available at 128 | [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). 129 | -------------------------------------------------------------------------------- /src/patch/translate.ts: -------------------------------------------------------------------------------- 1 | import { delMany as kv_del, set as kv_set, get as kv_get } from 'idb-keyval' 2 | import { Config } from '@/types/patch' 3 | import { Language } from '@/types/patch/translate' 4 | import { DebugMode, localization_hashs, user_language, debug_log, store } from '../helpers' 5 | 6 | const embedded_languages: Language[] = 7 | process.env.EMBED_LANGUAGES === 'true' 8 | ? [ 9 | { 10 | name: '简体中文', 11 | language: 'zh-CN', 12 | content: import('@/localization/zh_CN.json'), 13 | hash: localization_hashs['zh_CN.json'], 14 | }, 15 | { 16 | name: '正體中文', 17 | language: 'zh-TW', 18 | content: import('@/localization/zh_TW.json'), 19 | hash: localization_hashs['zh_TW.json'], 20 | }, 21 | ] 22 | : [] 23 | 24 | const fname = '__vcc_auto_translate__' 25 | const config: Config = { 26 | patch_jsx: { 27 | fname, 28 | async before() { 29 | await kv_del(['vcc_languages'], store) 30 | }, 31 | async after() { 32 | await load_languages() 33 | const localization = (await vcc_localization())?.content ?? {} 34 | 35 | const translater = new Translater(localization) 36 | globalThis[fname] = translater.translate.bind(translater) 37 | globalThis[fname]['restore'] = () => kv_del(['patched-content', 'patched-filename'], store) 38 | }, 39 | }, 40 | async after() { 41 | if (DebugMode) { 42 | var originHistory = history.pushState 43 | history.pushState = function () { 44 | var rv = originHistory.apply(this, arguments) 45 | var e = new Event('pushState') 46 | //@ts-ignore 47 | e.arguments = arguments 48 | window.dispatchEvent(e) 49 | return rv 50 | } 51 | window.addEventListener('pushState', function (e: Event) { 52 | if ('arguments' in e) { 53 | const args = e.arguments as IArguments 54 | if (args.length === 3) debug_log(args[2]) 55 | } 56 | }) 57 | } 58 | }, 59 | } 60 | 61 | export default config 62 | 63 | export class Translater { 64 | private localization: Record 65 | private all_matcher: Record = {} 66 | 67 | // 保存翻译完成后的字符串, 防止重复翻译. 初始值为需要跳过翻译的字符串 68 | private translated: Set = new Set( 69 | // prettier-ignore 70 | [ 71 | // FIXME: https://github.com/gizmo-ds/vcc-auto-translate/issues/13 72 | 'Official', 'Curated', 'Local User Packages', 73 | // 一些不需要翻译的字符串 74 | ' · ', '2022.3.6f1', '2019.4.31f1', 'v', '.', '2022', 'settings.json', 75 | 'VRChat', 'Udon', 'Discord', 'URL', 'assets.vrchat.com', 76 | 'https://assets.vrchat.com/sdk/vrc-official.json', 'https://assets.vrchat.com/sdk/vrc-curated.json', 77 | // 由 algolia patch 翻译的字符串 78 | 'Search the VRChat docs' 79 | ] 80 | ) 81 | 82 | constructor(localization: Record) { 83 | this.localization = localization 84 | if (localization) 85 | this.all_matcher = Object.keys(localization) 86 | .filter((k) => k.indexOf('[matcher]') === 0) 87 | .reduce>((acc, key) => { 88 | const k = key.replace('[matcher]', '') 89 | acc[k] = [new RegExp(k), localization[key]] 90 | return acc 91 | }, {}) 92 | } 93 | 94 | private t(item: any) { 95 | if (!item || typeof item !== 'string') return item 96 | if (this.translated.has(item)) return item 97 | 98 | const tr = this.localization[item] 99 | if (tr) return this.translated.add(tr) && tr 100 | 101 | for (const k of Object.keys(this.all_matcher)) { 102 | const matcher = this.all_matcher[k][0] 103 | const m = item.match(matcher) 104 | if (!m) continue 105 | let rt = this.all_matcher[k][1] 106 | for (let i = 0; i < m.length; i++) rt = rt.replaceAll(`$${i}`, m[i]) 107 | return this.translated.add(rt) && rt 108 | } 109 | return this._translation_missing(item) 110 | } 111 | 112 | // 将翻译结果中的格式化字符串还原为数组 113 | private _rebuild_array(t_str: string, arr: any[]) { 114 | const regex = /\{\{(\d+):([^\}]+)\}\}/g 115 | let match: RegExpExecArray | null 116 | const rebuilt_arr: any[] = [] 117 | let last_index = 0 118 | 119 | while ((match = regex.exec(t_str)) !== null) { 120 | const [_, index, content] = match 121 | const start = match.index 122 | const end = regex.lastIndex 123 | 124 | if (start > last_index) rebuilt_arr.push(t_str.substring(last_index, start)) 125 | 126 | const original_object = arr[parseInt(index)] 127 | rebuilt_arr.push({ 128 | ...original_object, 129 | props: { ...original_object.props, children: content }, 130 | }) 131 | 132 | last_index = end 133 | } 134 | 135 | if (last_index < t_str.length) rebuilt_arr.push(t_str.substring(last_index)) 136 | return rebuilt_arr 137 | } 138 | 139 | // NOTE: 为大段文字但中间有不同格式的数据做处理 140 | private rebuild_array(t: any[]) { 141 | const allowed_types = ['b'] 142 | const array_checker = (item: any) => { 143 | if (typeof item === 'string') return true 144 | if (!item?.type) return false 145 | return allowed_types.includes(item?.type) && typeof item?.props?.children === 'string' 146 | } 147 | if (!t.every(array_checker)) return t.map((i) => this._translate(i)) 148 | 149 | const translated_regex = /\{\{\d+:[^\}]+\}\}/g 150 | const special = this._convert2special(t) 151 | 152 | // 如果已经翻译过,直接返回 153 | if (this.translated.has(special.replace(translated_regex, '{{-}}'))) return t 154 | 155 | const t_str = this.localization[special] 156 | // 如果翻译结果不存在,返回翻译缺失 157 | if (!t_str) return this._translation_missing(t, special) 158 | // 如果翻译结果为非格式化字符串,直接返回 159 | if (!t_str.includes('{{1:')) return t.map((i) => this._translate(i)) 160 | 161 | this.translated.add(t_str.replace(translated_regex, '{{-}}')) 162 | return this._rebuild_array(t_str, t) 163 | } 164 | 165 | private _translation_missing(t: any, str?: string): any { 166 | if (DebugMode) debug_log(`Translation missing for: [${str ?? t}]`) 167 | return t 168 | } 169 | 170 | private _convert2special(arr: any[]) { 171 | let special_str = '' 172 | arr.forEach((item, index) => { 173 | if (typeof item === 'object') special_str += `{{${index}:${item.props.children}}}` 174 | else special_str += item 175 | }) 176 | return special_str 177 | } 178 | 179 | private _translate(t: any, element_name?: string): any { 180 | if (!t) return t 181 | 182 | // 处理 Array 183 | if (Array.isArray(t)) return this.rebuild_array(t) 184 | // 处理 String 185 | if (typeof t === 'string') return this.t(t) 186 | // 处理 Object 187 | if (typeof t === 'object') { 188 | for (const tk of Object.keys(t)) { 189 | if (['content', 'title', 'placeholder', 'label', 'props'].includes(tk)) 190 | t[tk] = this._translate(t[tk], t.type) 191 | } 192 | } 193 | 194 | // 单独处理 children 195 | if (t.children) { 196 | // NOTE: 忽略不需要翻译的 New Project 标题 197 | if (t.children === 'New Project' && (t.className || element_name === 'b')) return t 198 | 199 | t.children = this._translate(t.children) 200 | } 201 | return t 202 | } 203 | 204 | translate(e: any, t: any, r: any) { 205 | if (!this.localization) return t 206 | if (!e) return t 207 | 208 | const element_name: string = typeof e === 'string' ? e : e.displayName 209 | 210 | /* 样式优化 */ 211 | // NOTE: 修复 Projects 标题的换行问题 212 | if (element_name == 'Title1' && t.children === 'Projects') 213 | t.style = t.style 214 | ? Object.assign(t.style, { whiteSpace: 'nowrap' }) 215 | : { whiteSpace: 'nowrap' } 216 | 217 | return this._translate(t, element_name) 218 | } 219 | } 220 | 221 | let vcc_languages: Language[] | undefined 222 | async function load_languages() { 223 | if (vcc_languages) return 224 | vcc_languages = await kv_get('vcc_languages', store).then((langs) => langs as Language[]) 225 | if (vcc_languages) return 226 | for (const lang of embedded_languages) lang.content = (await lang.content).default 227 | await kv_set('vcc_languages', embedded_languages, store) 228 | vcc_languages = embedded_languages 229 | } 230 | export async function vcc_localization(): Promise { 231 | const _user_language = await user_language() 232 | return vcc_languages?.find((v) => v.language === _user_language) 233 | } 234 | -------------------------------------------------------------------------------- /localization/zh_CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "Projects": "项目", 3 | "Learn": "教学", 4 | "Tools": "工具", 5 | "Logs": "日志", 6 | "Settings": "设置", 7 | "List View": "列表视图", 8 | "Grid View": "网格视图", 9 | "Create New Project": "创建新项目", 10 | "Open Project": "打开项目", 11 | "Opening...": "正在打开...", 12 | "Manage Project": "管理项目", 13 | "[matcher]Learn[ ]{1,2}More": "了解更多", 14 | "Launch": "启动", 15 | "Check for Updates": "检查更新", 16 | "Checking...": "检查中...", 17 | "Pick New Folder": "选择新文件夹", 18 | "Templates": "模板", 19 | "Files and Folders": "文件和文件夹", 20 | "Backups": "备份", 21 | "Unity Editors": "Unity 编辑器", 22 | "Error Reporting Settings": "错误报告设置", 23 | "Pre-Release Packages": "预发布包", 24 | "User Packages": "用户包", 25 | "UI Theme": "UI 主题", 26 | "Updates": "更新", 27 | "Manage Packages": "管理包", 28 | "Open Project Folder": "打开项目文件夹", 29 | "Make Backup": "创建备份", 30 | "Remove Project": "移除项目", 31 | "Add Existing Project": "添加已有项目", 32 | "Official": "官方", 33 | "Curated": "精选", 34 | "Community": "社区", 35 | "Local": "本地", 36 | "Local User Packages": "用户添加的包", 37 | "Built-In Repositories": "内置仓库", 38 | "User Repositories": "用户添加的仓库", 39 | "Include my IP and Computer Username when sending automated reports": "发送的分析报告包含我的 IP 和电脑用户名", 40 | "Show Pre-Release Packages": "显示预发布包", 41 | "This dropdown lists all the Unity Editors found on your system which can make new VRChat projects.": "此下拉列表显示了您的系统上可以用于创建新项目的所有 Unity 编辑器。", 42 | "These files and folders are in fixed locations for now. Click the buttons below to open them": "这些文件和文件夹目前位于固定位置。单击下面的按钮打开它们", 43 | "Project backups are saved to this folder.": "项目备份将保存到此文件夹。", 44 | "This application sends error reports to help us track, diagnose and fix the issues.": "此应用程序发送错误报告以帮助我们跟踪、诊断和修复问题。", 45 | "Choose the one you prefer to use from the dropdown, or browse to the location of the unity application using the folder button.": "从下拉列表中选择您喜欢的版本,或者使用文件夹按钮浏览 Unity 应用程序的位置。", 46 | "You can send additional information to make it easier to find your specific issue.": "您可以发送其他信息,以便让我们更容易找到您的问题。", 47 | "VRChat sometimes provides pre-release packages for testing new features. These often go alongside an open beta.": "VRChat 有时会提供预发布软件包以测试新功能。这些包通常与公开测试版 (Open Beta) 一起使用。", 48 | "By default these packages are hidden in the versions list. But you can enable them here.": "默认情况下,这些软件包在版本列表中隐藏。但是您可以在此处启用它们。", 49 | "Add your own packages to this list to easily include them in your projects": "将您自己的软件包添加到此列表中,以便轻松地将它们包含在您的项目中", 50 | "System": "系统", 51 | "Will follow your system theme setting": "将遵循您的系统主题设置", 52 | "Light": "浅色", 53 | "Dark": "深色", 54 | "Selected Repos": "已选择的仓库", 55 | "Loading...": "加载中...", 56 | "Click on the cards below to learn more about a particular topic": "单击下面的卡片以了解有关特定主题的更多信息", 57 | "These are external applications that can be help you create and test your VRChat content": "这些是外部应用,可以帮助创建和测试您的内容", 58 | "Located At:": "位置:", 59 | "General": "常规", 60 | "Packages": "包", 61 | "Appearance": "外观", 62 | "Refresh Projects": "刷新项目", 63 | "Project Name": "项目名称", 64 | "Project Type": "项目类型", 65 | "Avatar": "虚拟形象", 66 | "World": "世界", 67 | "Unknown": "未知", 68 | "Name": "名称", 69 | "Installed Version": "已安装的版本", 70 | "Latest Version": "最新版本", 71 | "Update to Latest": "更新到最新版本", 72 | "Refresh Packages": "刷新包", 73 | "Remove Package": "移除包", 74 | "Add Package": "添加包", 75 | "This package is required and cannot be removed": "此软件包是必需的,不能被移除", 76 | "You are running the latest version of the Creator Companion": "您正在运行 Creator Companion 的最新版本", 77 | "Installed Repositories": "已添加的仓库", 78 | "Community Repositories": "社区仓库", 79 | "The Creator Companion includes VRChat's official and curated repositories by default. You can add your own community repositories by clicking 'Add Repository'.": "创作者助手默认包括 VRChat 的官方和精选仓库。您可以通过单击 “添加仓库” 来添加您自己的社区仓库。", 80 | "Author": "作者", 81 | "Add Repository": "添加仓库", 82 | "Remove repository": "移除仓库", 83 | "Add": "添加", 84 | "Cancel": "取消", 85 | "Request Headers": "请求标头 (Header)", 86 | "Link to the repository JSON file. E.g. https://vrchat.github.io/myRepo/index.json": "仓库 JSON 文件的 URL。例如 https://vrchat.github.io/myRepo/index.json", 87 | "Search Projects...": "搜索项目...", 88 | "Search Packages...": "搜索包...", 89 | "Repository Listing URL": "仓库 URL", 90 | "The VRChat Creator Companion, or VCC for short, is your gateway to VRChat World & Avatar Creation.": "VRChat 创作者助手(VRChat Creator Companion),简称 VCC,是您 VRChat 世界和 虚拟形象创作之旅的入口。", 91 | "Show Me Around": "向我展示", 92 | "Help VRChat improve the Creator Companion by including your IP address with crash reports": "通过在崩溃报告中记录您的 IP 地址来帮助 VRChat 改进创作者助手", 93 | "Learn how to create VRChat worlds and avatars with the Creator Companion.": "使用创作者助手了解如何创建 VRChat 世界和虚拟形象。", 94 | "This is the Main Sidebar": "这是侧边栏", 95 | "You can access all of the Creator Companion's features through it": "您可以通过它访问创作者助手的所有功能", 96 | "Learn more about the Creator Companion in our Documentation": "在我们的文档中了解有关创作者助手的更多信息", 97 | "Back": "返回", 98 | "Continue": "继续", 99 | "Skip Unity Install": "跳过 Unity 安装", 100 | "Unity Editor Check": "Unity 编辑器检查", 101 | "Unity Editor not found": "未找到 Unity 编辑器", 102 | "Unity Editor found. Ready!": "找到了 Unity 编辑器,现在可以开始了!", 103 | "Unity Installation": "安装 Unity", 104 | "To create content for VRChat, you will need the Unity Editor": "要为 VRChat 创建内容,您将需要 Unity 编辑器", 105 | "I already have Unity": "我已经安装 Unity 了", 106 | "Open the file picker to select the Unity.exe for the Creator Companion to use": "打开文件选择器以选择创作者助手要使用的 Unity.exe", 107 | "Install Later": "稍后安裝", 108 | "Install Unity": "安装 Unity", 109 | "Unity Hub Installation": "安装 Unity Hub", 110 | "First, you'll need to install the Unity Hub": "首先,您需要安装 Unity Hub", 111 | "Download the Unity Hub from Unity's website": "从 Unity 的网站下载 Unity Hub", 112 | "Install the Unity Hub": "安装 Unity Hub", 113 | "Open the Unity Hub": "打开 Unity Hub", 114 | "Activate your Unity license": "激活您的 Unity 许可证", 115 | "Check out this help article if you have any trouble": "如果您遇到任何问题,请查看此帮助文章", 116 | "Click the button below when you're done": "完成后单击下面的按钮", 117 | "I have installed the Unity Hub": "我已经安装了 Unity Hub", 118 | "Having Trouble? Try Manual Install": "遇到问题?尝试手动安装", 119 | "Everything is Ready": "一切准备就绪", 120 | "You can now start using the Creator Companion!": "您现在可以开始使用创作者助手了!", 121 | "If you want to add or create a project right away, use the buttons below:": "如果您想立即添加或创建项目,请使用下面的按钮:", 122 | "Open the Creator Companion": "打开创作者助手", 123 | "New Project": "新建项目", 124 | "Select template": "选择模板", 125 | "Configure Project": "配置项目", 126 | "Project Location": "项目位置", 127 | "Final project location:": "最终项目位置:", 128 | "Create Project": "创建项目", 129 | "Please do not close the VCC Application": "请不要关闭 VCC", 130 | "Path to a Unity Editor is not set, you will be unable to open projects.": "未设置 Unity 编辑器的路径,您将无法打开项目。", 131 | "Fix Now": "立即修复", 132 | "No Unity Editors found, you need a Unity Editor to be able to launch projects via the VCC": "未找到 Unity 编辑器,您需要 Unity 编辑器才能通过 VCC 启动项目", 133 | "Install Now": "立即安装", 134 | "Community Repo Analytics": "社区仓库分析", 135 | "When you add a Community Repo, this app will send the url of that repo to our analytics service to help us understand how people are using community repos, which are the most popular, etc. It also sends a true/false value for whether a custom header is provided, but it does not send any of the information from the header.": "当您添加一个社区仓库时,此应用程序将向我们的分析服务发送该仓库的 URL,以帮助我们了解人们如何使用社区仓库,哪些是最受欢迎的等等。它还会发送一个布尔值,用于指示是否提供了自定义标题,但不会发送任何标题中的信息。", 136 | "You can turn this off if you don't want to share the information.": "如果您不想分享这些信息,您可以关闭此功能。", 137 | "Send Community Repo Analytics": "发送社区仓库分析数据", 138 | "Bring To Front": "前置", 139 | "Creator Companion is ready to Update!": "创作者助手已经准备好更新了!", 140 | "Update Now": "现在更新", 141 | "See Whats New": "看看更新了什么", 142 | "Multiple Repositories": "多个仓库", 143 | "Create Backup": "创建备份", 144 | "Update": "更新", 145 | "Confirm Project Changes": "确认项目变更", 146 | "Detailed View": "详细视图", 147 | "You are upgrading": "您正在升级", 148 | " to version ": " 到版本 ", 149 | "This will also change the following packages:": "这还将更改以下软件包:", 150 | "Confirm": "确认", 151 | "You are about to make the following changes to your project": "您即将对项目进行以下更改:", 152 | "Package Name": "包名", 153 | "Old Version": "旧版本", 154 | "New Version": "新版本", 155 | "will be added": "将被添加", 156 | "Final project location: ": "最终项目位置: ", 157 | "World Project": "世界项目", 158 | "[matcher]Unity ([0-9]*) World Project": "Unity $1 世界项目", 159 | "Avatar Project": "虚拟形象项目", 160 | "[matcher]Unity ([0-9]*) Avatar Project": "Unity $1 虚拟形象项目", 161 | "VRChat World Project with UdonSharp": "使用 UdonSharp 的 VRChat 世界项目", 162 | "Add a new Package": "添加一个新的包", 163 | "Open Logs": "打开日志", 164 | "Toggle auto scroll": "开关自动滚动", 165 | "Toggle text wrapping": "开关文本换行", 166 | "Copy Logs": "复制日志", 167 | "Updates available! Use the button on the sidebar to update": "有可用的更新!使用侧边栏上的按钮进行更新", 168 | "Not Installed": "未安装", 169 | "Sort Ascending": "升序", 170 | "Sort Descending": "降序", 171 | "Project name cannot be empty": "项目名称不能为空", 172 | "E.g. MyNewProject": "例如:MyNewProject", 173 | "E.g. C:/Users/myUser/UnityProjects": "例如:C:/Users/myUser/UnityProjects", 174 | "Unity Version Upgrade Available": "可升级 Unity 版本", 175 | "Change Unity Version": "更改 Unity 版本", 176 | "Supported versions": "支持的版本", 177 | "Recommended": "推荐的", 178 | "Needs Download": "需要下载", 179 | "Close": "关闭", 180 | "Show all installed Unity Versions": "显示所有已安装的 Unity 版本", 181 | "[matcher]Migrate to (.*)": "迁移到 $1", 182 | "Major Version": "主要版本", 183 | "Selected Editor": "选择的编辑器", 184 | "Loading Editors...": "加载编辑器列表中...", 185 | "No Editors Selected": "未选择编辑器", 186 | "Refresh Editor List": "刷新编辑器列表", 187 | "Add new Editor": "添加新的编辑器", 188 | "View all installed Versions": "查看所有已安装的版本", 189 | "No Recommended Version Set": "没有设置为推荐的版本", 190 | "VRChat recommends using Unity ": "VRChat 推荐使用的 Unity 版本 ", 191 | "Migrate a Copy": "迁移到一个新副本", 192 | "Migrate in-place (you have a backup)": "迁移到当前项目 (建议先进行备份)", 193 | "I understand the risks, migrate": "我了解风险,进行迁移", 194 | "This process will do the following:": "此过程将执行以下操作:", 195 | "[matcher]Upgrade the VRChat SDK to version ([0-9|\\.]+) or newer": "将 VRChat SDK 升级到 $1 或更高版本", 196 | "Remove outdated Unity XR Packages": "删除过时的 Unity XR 包", 197 | "We highly recommend migrating a Copy of your project, unless you're using backups or some sort of Version Control": "我们强烈建议迁移项目到一个新副本,除非您使用备份或某种版本控制", 198 | "Abort Migration": "中止迁移", 199 | "We detected Unity 2022 SDK Packages in a Unity 2019 Project. You should try to migrate this project": "我们在 Unity 2019 项目中检测到 Unity 2022 SDK 包。您应该尝试迁移此项目", 200 | "Migrate project": "迁移项目", 201 | "Migration not finalized": "迁移尚未完成", 202 | "Project migrated but failed to finalize": "项目已迁移,但在执行最后工作时遇到了些问题", 203 | "Try again": "重试", 204 | "Dismiss": "忽略", 205 | "Last Modified": "最后修改时间", 206 | "Add Unity Editor": "添加 Unity 编辑器", 207 | "Editor Version": "编辑器版本", 208 | "Location": "位置", 209 | "Pick Unity Editor": "选择 Unity 编辑器", 210 | "Path to Unity Editor executable": "Unity 编辑器可执行文件的路径", 211 | "All installed Unity Versions": "所有已安装的 Unity 版本", 212 | "Versions marked with ": "VRChat 支持标有 ", 213 | " are supported by VRChat": " 的版本", 214 | "Sort By": "排序方式", 215 | "Last Opened": "最后打开", 216 | "Favorite": "收藏", 217 | "Unity Version": "Unity 版本", 218 | "Unity version": "Unity 版本", 219 | "Supported": "受支持的", 220 | "Choose the one you prefer for every major Unity release to use from the dropdown, or browse to the location of the unity application using the folder button.": "从下拉列表中选择您喜欢用于每个主要 Unity 版本的版本,或使用文件夹按钮浏览到 Unity 应用程序的位置。", 221 | "No valid path selected": "未选择有效的路径", 222 | "Upgrading ": "升级", 223 | " to ": " 到 ", 224 | "You are about to migrate a Project using ": "你的项目迁移将会从 ", 225 | "Migrating ": "迁移中 ", 226 | "Backing up ": "正在备份 ", 227 | "Backing up the project...": "正在备份项目...", 228 | "Zipping up project...": "正在压缩项目...", 229 | "Project backup completed": "项目备份完成", 230 | "Other versions": "其他版本", 231 | "No other versions installed": "没有安装其他版本", 232 | "Add Unity Version": "添加 Unity 版本", 233 | "Project Upgrade Required": "项目更新请求", 234 | "You are trying to add a package that requires ": "你尝试添加的软件包需要 ", 235 | ", but your project is using ": ",但你的项目使用的是 ", 236 | "This will require you to upgrade your project to ": "这需要你将项目升级到 ", 237 | " before you can add this package.": " 才可以添加这个软件包。", 238 | "The Creator Companion can automatically migrate your project to ": "Creator Companion 可以自动将您的项目迁移到", 239 | ". Click the button below to proceed.": "。点击下面的按钮以继续。", 240 | "Open Project Upgrade Window": "打开项目升级窗口", 241 | "VRChat has upgraded to Unity 2022. Upgrade your project to use all the latest features": "VRChat 已升级到 Unity 2022。升级你的项目以使用所有最新功能", 242 | "Upgrade to 2022": "升级到 2022", 243 | "You will have a chance to review the changes before applying them": "在应用更改之前,你可以查看进行的更改", 244 | "Welcome to the Creator Companion": "欢迎来到 Creator Companion", 245 | "Create, add, or manage your VRChat worlds and avatar projects.": "创建,添加或管理您的 VRChat 项目(世界/虚拟形象)。", 246 | "See other official tools made by VRChat.": "查看 VRChat 制作的其他官方工具。", 247 | "View errors and other information logged by the Creator Companion.": "查看错误和其他信息日志。", 248 | "Change your settings, visual theme, selected Unity editor, and more.": "更改您的设置,主题,Unity 编辑器等", 249 | "Not recommended for new users.": "不推荐新用户使用。", 250 | " Skip the Unity installation for now. You can add Unity later in the Settings": " 暂时跳过 Unity 安装。您可以稍后在 “设置” 中添加 Unity", 251 | "Current Version ": "当前版本", 252 | "New Version ": "新版本", 253 | "Updating Creator Companion": "正在更新 Creator Companion", 254 | "No Unity Editors Found": "未找到 Unity 编辑器", 255 | "You need a Unity Editor to be able to launch projects via the VCC": "您需要一个 Unity 编辑器才能通过 VCC 启动项目", 256 | "Are you sure?": "你确定吗?", 257 | "Skipping Unity install is not recommended.": "不推荐跳过 Unity 安装。", 258 | "This will prevent the VCC from opening your projects. You will need to install Unity to enable that functionality.": "这将会导致无法使用 VCC 打开你的项目。你需要安装 Unity 才能启用完整功能。", 259 | "Back to Unity Install": "返回到 Unity 安装", 260 | "If you have any questions about the Creator Companion or creating VRChat content, check out the ": "如果您对 Creator Companion 或创建 VRChat 内容有任何疑问,请查看", 261 | " page.": " 页面。", 262 | "You are adding": "您正在添加", 263 | "You are downgrading": "您正在下载", 264 | "You are removing": "您正在移除", 265 | "[matcher]VCC is now ready to install Unity(.*)": "VCC 已经准备安装 Unity$1", 266 | "Install Unity ": "安装 Unity", 267 | "Install Error:": "安装错误:", 268 | "Unknown error": "未知错误", 269 | "VCC failed to install the Unity Editor": "VCC 安装 Unity 编辑器失败", 270 | "Try Again": "再试一次", 271 | "Install Manually": "手动安装", 272 | "Manually install the Unity Editor": "手动安装 Unity 编辑器", 273 | "I have installed the Unity Editor": "已安装 Unity 编辑器", 274 | "Click this link to start installation in Unity Hub": "点击此链接开始安装在 Unity Hub", 275 | "Select 'Android Build Support' under 'Platforms'": "选择 “平台” 下的 “Android Build Support”", 276 | "Click 'Install'": "点击 “安装”", 277 | "Check out the help article if you have any trouble": "如果遇到问题请查看帮助文章", 278 | "Unity Version used by this project is not installed": "该项目使用的 Unity 版本未安装", 279 | "[matcher]Open [W|w]ith ([0-9|a-z|\\.]+)": "使用 $1 打开", 280 | "[matcher]Change to ([0-9|a-z|\\.]+)": "更改为 $1", 281 | "This version change is not officially supported by VRChat": "该版本更改操作并不受 VRChat 官方支持", 282 | "Back To Projects": "返回到项目页面", 283 | "Header Name": "请求标头 (Header) 名称", 284 | "Header Value": "请求标头 (Header) 内容", 285 | "Community Repositories Disclaimer": "社区仓库免责声明", 286 | "WARNING: Download at your own risk! Community Packages made available through third-party sites may contain malware. VRChat makes no representation, warranty, or guarantee with respect to Community Packages and disclaims any liability arising out of or related to Community Packages.": "警告:风险自负!通过第三方网站提供的社区软件包可能含有恶意软件。VRChat 对社区软件包不作任何陈述、担保或保证,并拒绝承担由社区软件包引起或与之相关的任何责任。", 287 | "Included Packages": "包括的包", 288 | "[matcher]Show All Packages ([0-9]+)": "显示所有包 ($1)", 289 | "I Understand, Add Repository": "我已知悉,继续添加仓库", 290 | "a few seconds ago": "几秒钟前", 291 | "an hour ago": "一小时前", 292 | "[matcher]([0-9]+) hours ago": "$1 小时前", 293 | "[matcher]([0-9]+) minutes ago": "$1 分钟前", 294 | "[matcher]([0-9]+) days ago": "$1 天前", 295 | "[matcher]([0-9]+) months ago": "$1 月前", 296 | "[matcher]([0-9]+) years ago": "$1 年前", 297 | "a minute ago": "一分钟前", 298 | "a day ago": "昨天", 299 | "a month ago": "上个月", 300 | "a year ago": "去年", 301 | "The Creator Companion": "创作者助手", 302 | "(This application)": "(该应用)", 303 | "This tool helps you set up everything you need to create things in VRChat!": "该工具可帮助您设置在 VRChat 中创建内容所需的一切!", 304 | "Udon is a language custom-built to power logic and interactivity in VRChat Worlds.": "Udon 是一种定制语言,用于增强 VRChat 世界中的程序逻辑和交互性。", 305 | "Worlds": "世界", 306 | "Create your first World for VRChat using Unity and the SDK.": "使用 Unity 和 SDK 创建您的第一个 VRChat 世界。", 307 | "Avatars": "虚拟形象", 308 | "Create your first Avatar for VRChat using Unity and the SDK.": "使用 Unity 和 SDK 创建您的第一个 VRChat 虚拟形象。", 309 | "Forums": "论坛", 310 | "Our forums are a place to search for info, ask questions, and find out about cool things other people are making.": "在我们的论坛上,您可以搜索信息、提出问题并了解其他人正在制作的炫酷玩意。", 311 | "Talk to fellow VRChat creators on our official Discord server.": "在我们的官方 Discord 服务器上与其他 VRChat 创作者交流。", 312 | "Engine Upgrade": "升级引擎", 313 | "Learn how to upgrade projects from Unity 2019 to Unity 2022.": "了解如何将项目从 Unity 2019 升级到 Unity 2022。", 314 | "VRC Quick Launcher": "VRC 快速启动器", 315 | "This tool helps you launch multiple profiles in the same VRChat instance, while also providing an interface to modify the debug options.": "该工具可帮助您在同一个 VRChat 实例中启动多个配置文件,同时还提供了一个修改调试选项的界面。", 316 | "Copy Live Settings and Data": "复制正式版的设置和数据", 317 | "Delete Beta Settings and Data": "删除 Beta 版的设置和数据", 318 | "Beta Builds use their own settings, but you can copy them from the main Creator Companion installation using the button below": "Beta 版本使用独立的设置文件,但是你可以使用以下按钮复制正式版创作者助手的设置。", 319 | "This will overwrite your Beta settings with your Main settings and data": "这会用正式版的设置和数据覆盖 Beta 版的设置", 320 | "This will delete all your Beta settings and data, starting from scratch": "这后删除所有 Beta 版的设置和数据,用于完全重置 Beta 版创作者助手", 321 | "Search Logs": "搜索日志", 322 | "Verbose": "详细", 323 | "Info": "信息", 324 | "Warning": "警告", 325 | "Error": "错误", 326 | "Invalid Date": "无效日期", 327 | "Reinstall All Packages": "重新安装所有包", 328 | "Project Resolve Needed": "项目需要解决依赖关系", 329 | "The project has unresolved dependencies. That means that packages that are meant to be installed are not present in the Packages folder.": "项目有未解决的依赖关系。这意味着 \"Packages\" 文件夹中没有本应安装的软件包。", 330 | "To resolve the project, press the \"Resolve\" button below. You can also choose to ignore this warning for this session.": "要解决该项目问题,请点击下面的 \"解决\" 按钮。你也可以选择忽略此警告。", 331 | "Ignore for this session": "本次忽略", 332 | "Resolve": "解决", 333 | "Some of the dependencies are not installed. Click to resolve packages": "某些依赖包未安装。点击解决软件包问题", 334 | "More Actions": "更多操作", 335 | "Cool Mode 😎": "炫酷模式 😎", 336 | "Log Spam": "垃圾日志", 337 | "Spam logs every 500ms": "每 500ms 输出一条垃圾日志", 338 | "Useful Buttons": "非常有用的按钮", 339 | "Disable Cool Mode": "关闭炫酷模式", 340 | "Clear All Caches": "清除所有缓存", 341 | "Open VCC Folder": "打开 VCC 文件夹", 342 | "Onboarding": "首次启动设置", 343 | "Open Onboarding": "打开首次启动设置", 344 | "Onboarding Completed": "已完成首次启动设置", 345 | "Always PASS Unity existence checks": "强制通过 Unity 扩展检查", 346 | "Always FAIL Unity existence checks": "强制不通过 Unity 扩展检查", 347 | "Always PASS Hub existence check": "强制通过 Hub 扩展检查", 348 | "Always FAIL Hub existence check": "强制不通过 Hub 扩展检查", 349 | "Force-Pass Unity Install": "强制通过 Unity 安装检查", 350 | "Force-Fail Unity Install": "强制不通过 Unity 安装检查", 351 | "Danger zone": "危险区域", 352 | "Ignore Unity 2022 Compatibility Check": "忽略 Unity 2022 兼容性检查", 353 | "Clear Settings File": "清空设置文件", 354 | "Note, this will completely remove your settings.json file and replace it with a new one. You will need to re-add all the projects, local packages and custom repos again": "注意,这将完全删除 settings.json 文件,并创建新文件。您需要重新添加所有项目、本地软件包和自定义包仓库", 355 | "Build Info": "构建信息", 356 | "Hey you, you're cool": "嘿!你个酷盖!", 357 | "Checking Package Availability": "检查包可用性", 358 | "Packages are being added to the project": "正在向项目添加包", 359 | "Starting project creation...": "正在开始项目创建...", 360 | "A folder with the same name already exists": "已存在同名文件夹", 361 | "A good starting point for a new VRChat World": "一个新的 VRChat 世界的良好出发点", 362 | "A good starting point for a new VRChat Avatar": "一个新的 VRChat 虚拟形象的良好起始点", 363 | "This will {{1:delete}} all your {{3:Beta}} settings and data, starting from scratch": "这会{{1:删除}}所有 {{3:Beta}} 版的设置和数据,用于完全重置 {{3:Beta}} 版创作者助手", 364 | "You are using a {{1:Beta}} build of the Creator Companion, it is intended for testing purposes and can be unstable.": "你正在使用创作者助手的 {{1:Beta}} 版本,此版本是以测试为用途构建的,可能存在会不稳定。", 365 | "This will {{1:overwrite}} your {{3:Beta}} settings with your {{5:Main}} settings and data": "这会用{{5:正式版}}的设置和数据{{1:覆盖}} {{3:Beta}} 版的设置", 366 | "Add New Header": "添加新标头 (Header)", 367 | "Remove Header": "移除标头 (Header)", 368 | "Remove": "移除", 369 | "Advanced Options": "高级选项" 370 | } 371 | -------------------------------------------------------------------------------- /localization/zh_TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "Projects": "項目", 3 | "Learn": "學習", 4 | "Tools": "工具", 5 | "Logs": "日誌", 6 | "Settings": "設置", 7 | "List View": "列表視圖", 8 | "Grid View": "網格視圖", 9 | "Create New Project": "建立新專案", 10 | "Open Project": "開啟專案", 11 | "Opening...": "正在開啟...", 12 | "Manage Project": "管理專案", 13 | "[matcher]Learn[ ]{1,2}More": "了解更多", 14 | "Launch": "啟動", 15 | "Check for Updates": "檢查更新", 16 | "Checking...": "Checking...", 17 | "Pick New Folder": "選擇新資料夾", 18 | "Templates": "範本", 19 | "Files and Folders": "檔案和資料夾", 20 | "Backups": "備份", 21 | "Unity Editors": "Unity編輯器", 22 | "Error Reporting Settings": "錯誤報告設定", 23 | "Pre-Release Packages": "預發行軟體包", 24 | "User Packages": "用戶軟體包", 25 | "UI Theme": "UI主題", 26 | "Updates": "更新", 27 | "Manage Packages": "管理軟體包", 28 | "Open Project Folder": "打開專案資料夾", 29 | "Make Backup": "建立備份", 30 | "Remove Project": "移除專案", 31 | "Add Existing Project": "新增已有專案", 32 | "Official": "官方", 33 | "Curated": "精選", 34 | "Community": "社區", 35 | "Local": "本地", 36 | "Local User Packages": "本地用戶軟體包", 37 | "Built-In Repositories": "內置儲存庫", 38 | "User Repositories": "用戶儲存庫", 39 | "Include my IP and Computer Username when sending automated reports": "自動發送報告時包含我的IP和計算機用戶名", 40 | "Show Pre-Release Packages": "顯示預發行軟體包", 41 | "This dropdown lists all the Unity Editors found on your system which can make new VRChat projects.": "此下拉列表顯示了您的系統上可以建立新VRChat專案的所有Unity編輯器。", 42 | "These files and folders are in fixed locations for now. Click the buttons below to open them": "這些文件和資料夾目前位於固定位置。點擊下面的按鈕開啟它們", 43 | "Project backups are saved to this folder.": "專案備份保存到此資料夾。", 44 | "This application sends error reports to help us track, diagnose and fix the issues.": "此應用程式發送錯誤報告以協助我們跟踪、診斷和修復問題。", 45 | "Choose the one you prefer to use from the dropdown, or browse to the location of the unity application using the folder button.": "從下拉列表中選擇您喜歡的,或者使用文件夾按鈕瀏覽Unity應用程式的位置。", 46 | "You can send additional information to make it easier to find your specific issue.": "您可以發送其他資訊,以便更容易地找到您的特定問題。", 47 | "VRChat sometimes provides pre-release packages for testing new features. These often go alongside an open beta.": "VRChat有時會提供預發布軟件包以測試新功能。這些通常與公開測試版一起使用。", 48 | "By default these packages are hidden in the versions list. But you can enable them here.": "默認情況下,這些軟件包在版本列表中隱藏。但是您可以在此處啟用它們。", 49 | "Add your own packages to this list to easily include them in your projects": "將您自己的軟件包添加到此列表中,以便輕鬆地將它們包含在您的項目中", 50 | "System": "系統", 51 | "Will follow your system theme setting": "將遵循您的系統主題設置", 52 | "Light": "淺色", 53 | "Dark": "深色", 54 | "Selected Repos": "已選擇的資料庫", 55 | "Loading...": "載入中...", 56 | "Click on the cards below to learn more about a particular topic": "點擊下面的卡片以了解有關特定主題的更多信息", 57 | "These are external applications that can be help you create and test your VRChat content": "這些是外部應用程序,可以幫助您創建和測試您的VRChat內容", 58 | "Located At:": "位置:", 59 | "General": "一般", 60 | "Packages": "軟件包", 61 | "Appearance": "外觀", 62 | "Refresh Projects": "Refresh Projects", 63 | "Project Name": "項目名稱", 64 | "Project Type": "項目類型", 65 | "Avatar": "角色", 66 | "World": "世界", 67 | "Unknown": "Unknown", 68 | "Name": "名稱", 69 | "Installed Version": "已安裝的版本", 70 | "Latest Version": "最新版本", 71 | "Update to Latest": "Update to Latest", 72 | "Refresh Packages": "Refresh Packages", 73 | "Remove Package": "Remove Package", 74 | "Add Package": "Add Package", 75 | "This package is required and cannot be removed": "This package is required and cannot be removed", 76 | "You are running the latest version of the Creator Companion": "您正在運行 Creator Companion 的最新版本", 77 | "Installed Repositories": "已安裝的資料庫", 78 | "Community Repositories": "社區資料庫", 79 | "The Creator Companion includes VRChat's official and curated repositories by default. You can add your own community repositories by clicking 'Add Repository'.": "Creator Companion預設包括VRChat的官方和精選資料庫。您可以點擊“添加資料庫”來添加您自己的社區資料庫。", 80 | "Author": "作者", 81 | "Add Repository": "添加資料庫", 82 | "Remove repository": "Remove repository", 83 | "Add": "添加", 84 | "Cancel": "取消", 85 | "Request Headers": "請求標頭", 86 | "Link to the repository JSON file. E.g. https://vrchat.github.io/myRepo/index.json": "連接到資料庫JSON文件。例如https://vrchat.github.io/myRepo/index.json", 87 | "Search Projects...": "搜索項目...", 88 | "Search Packages...": "搜索軟件包...", 89 | "Repository Listing URL": "資料庫列表URL", 90 | "The VRChat Creator Companion, or VCC for short, is your gateway to VRChat World & Avatar Creation.": "VRChat Creator Companion,簡稱VCC,是您進入VRChat世界和頭像創作的入口。", 91 | "Show Me Around": "帶我四處看看", 92 | "Help VRChat improve the Creator Companion by including your IP address with crash reports": "通過在崩潰報告中包含您的IP地址,幫助VRChat改進Creator Companion", 93 | "Learn how to create VRChat worlds and avatars with the Creator Companion.": "使用Creator Companion學習如何創建VRChat世界和頭像。", 94 | "This is the Main Sidebar": "這是側邊欄", 95 | "You can access all of the Creator Companion's features through it": "您可以通過它訪問Creator Companion的所有功能", 96 | "Learn more about the Creator Companion in our Documentation": "在我們的文檔中了解有關Creator Companion的更多信息", 97 | "Back": "返回", 98 | "Continue": "繼續", 99 | "Skip Unity Install": "跳過Unity安裝", 100 | "Unity Editor Check": "Unity編輯器檢查", 101 | "Unity Editor not found": "找不到Unity編輯器", 102 | "Unity Editor found. Ready!": "找到Unity編輯器。準備好了!", 103 | "Unity Installation": "安裝 Unity", 104 | "To create content for VRChat, you will need the Unity Editor": "要為VRChat創建內容,您需要Unity編輯器", 105 | "I already have Unity": "我已經有Unity了", 106 | "Open the file picker to select the Unity.exe for the Creator Companion to use": "打開文件選取器以選擇Creator Companion要使用的Unity.exe", 107 | "Install Later": "稍後安裝", 108 | "Install Unity": "安裝 Unity", 109 | "Unity Hub Installation": "安装 Unity Hub", 110 | "First, you'll need to install the Unity Hub": "首先,您需要安裝Unity Hub", 111 | "Download the Unity Hub from Unity's website": "從Unity的網站下載Unity Hub", 112 | "Install the Unity Hub": "安裝 Unity Hub", 113 | "Open the Unity Hub": "打開 Unity Hub", 114 | "Activate your Unity license": "激活您的Unity許可證", 115 | "Check out this help article if you have any trouble": "如果您遇到任何問題,請查看此幫助文章", 116 | "Click the button below when you're done": "完成後點擊下面的按鈕", 117 | "I have installed the Unity Hub": "我已經安裝了Unity Hub", 118 | "Having Trouble? Try Manual Install": "遇到問題?請嘗試手動安裝", 119 | "Everything is Ready": "一切就緒", 120 | "You can now start using the Creator Companion!": "您現在可以開始使用Creator Companion了!", 121 | "If you want to add or create a project right away, use the buttons below:": "如果您想立即添加或創建項目,請使用下面的按鈕:", 122 | "Open the Creator Companion": "打開 Creator Companion", 123 | "New Project": "新項目", 124 | "Select template": "選擇模板", 125 | "Configure Project": "配置項目", 126 | "Project Location": "項目位置", 127 | "Final project location:": "最終項目位置:", 128 | "Create Project": "創建項目", 129 | "Please do not close the VCC Application": "請不要關閉VCC應用程序", 130 | "Path to a Unity Editor is not set, you will be unable to open projects.": "未設置Unity編輯器的路徑,您將無法打開項目。", 131 | "Fix Now": "立即修復", 132 | "No Unity Editors found, you need a Unity Editor to be able to launch projects via the VCC": "找不到Unity編輯器,您需要Unity編輯器才能通過VCC啟動項目", 133 | "Install Now": "立即安裝", 134 | "Community Repo Analytics": "社區儲存庫分析", 135 | "When you add a Community Repo, this app will send the url of that repo to our analytics service to help us understand how people are using community repos, which are the most popular, etc. It also sends a true/false value for whether a custom header is provided, but it does not send any of the information from the header.": "當您添加一個社區儲存庫時,此應用程式將會將該儲存庫的 URL 發送到我們的分析服務,以幫助我們了解人們如何使用社區儲存庫、哪些是最受歡迎的等等。它還會發送一個真/假值,以表示是否提供了自訂標頭,但不會發送任何來自標頭的資訊。", 136 | "You can turn this off if you don't want to share the information.": "如果您不想分享這些資訊,您可以關閉此功能。", 137 | "Send Community Repo Analytics": "發送社區儲存庫分析", 138 | "Bring To Front": "前置", 139 | "Creator Companion is ready to Update!": "Creator Companion 準備好了更新!", 140 | "Update Now": "現在更新", 141 | "See Whats New": "看看更新了什麽", 142 | "Multiple Repositories": "多個倉庫", 143 | "Create Backup": "建立備份", 144 | "Update": "更新", 145 | "Confirm Project Changes": "確認專案變更", 146 | "Detailed View": "詳細視圖", 147 | "You are upgrading": "您正在升級", 148 | " to version ": "到版本", 149 | "This will also change the following packages:": "這還將更改以下軟體包:", 150 | "Confirm": "確認", 151 | "You are about to make the following changes to your project": "您即將對專案進行以下變更:", 152 | "Package Name": "軟體包名", 153 | "Old Version": "舊版本", 154 | "New Version": "新版本", 155 | "will be added": "將被添加", 156 | "Final project location: ": "最終專案位置:", 157 | "World Project": "世界(地圖)專案", 158 | "[matcher]Unity ([0-9]*) World Project": "Unity $1 World Project", 159 | "Avatar Project": "頭像(模型)專案", 160 | "[matcher]Unity ([0-9]*) Avatar Project": "Unity $1 Avatar Project", 161 | "VRChat World Project with UdonSharp": "使用UdonSharp的世界(地圖)專案", 162 | "Add a new Package": "添加一個新的軟體包", 163 | "Open Logs": "打開日誌", 164 | "Toggle auto scroll": "切換自動滾動", 165 | "Toggle text wrapping": "切換文字換行", 166 | "Copy Logs": "複製日誌", 167 | "Updates available! Use the button on the sidebar to update": "有可用的更新!使用側邊欄上的按鈕進行更新", 168 | "Not Installed": "未安裝", 169 | "Sort Ascending": "Sort Ascending", 170 | "Sort Descending": "Sort Descending", 171 | "Project name cannot be empty": "Project name cannot be empty", 172 | "E.g. MyNewProject": "E.g. MyNewProject", 173 | "E.g. C:/Users/myUser/UnityProjects": "E.g. C:/Users/myUser/UnityProjects", 174 | "Unity Version Upgrade Available": "Unity Version Upgrade Available", 175 | "Change Unity Version": "Change Unity Version", 176 | "Supported versions": "Supported versions", 177 | "Recommended": "Recommended", 178 | "Needs Download": "Needs Download", 179 | "Close": "Close", 180 | "Show all installed Unity Versions": "Show all installed Unity Versions", 181 | "[matcher]Migrate to (.*)": "Migrate to $1", 182 | "Major Version": "Major Version", 183 | "Selected Editor": "Selected Editor", 184 | "Loading Editors...": "Loading Editors...", 185 | "No Editors Selected": "No Editors Selected", 186 | "Refresh Editor List": "Refresh Editor List", 187 | "Add new Editor": "Add new Editor", 188 | "View all installed Versions": "View all installed Versions", 189 | "No Recommended Version Set": "No Recommended Version Set", 190 | "VRChat recommends using Unity ": "VRChat recommends using Unity ", 191 | "Migrate a Copy": "Migrate a Copy", 192 | "Migrate in-place (you have a backup)": "Migrate in-place (you have a backup)", 193 | "I understand the risks, migrate": "I understand the risks, migrate", 194 | "This process will do the following:": "This process will do the following:", 195 | "[matcher]Upgrade the VRChat SDK to version ([0-9|\\.]+) or newer": "Upgrade the VRChat SDK to version $1 or newer", 196 | "Remove outdated Unity XR Packages": "Remove outdated Unity XR Packages", 197 | "We highly recommend migrating a Copy of your project, unless you're using backups or some sort of Version Control": "We highly recommend migrating a Copy of your project, unless you're using backups or some sort of Version Control", 198 | "Abort Migration": "Abort Migration", 199 | "We detected Unity 2022 SDK Packages in a Unity 2019 Project. You should try to migrate this project": "We detected Unity 2022 SDK Packages in a Unity 2019 Project. You should try to migrate this project", 200 | "Migrate project": "Migrate project", 201 | "Migration not finalized": "Migration not finalized", 202 | "Project migrated but failed to finalize": "Project migrated but failed to finalize", 203 | "Try again": "Try again", 204 | "Dismiss": "Dismiss", 205 | "Last Modified": "Last Modified", 206 | "Add Unity Editor": "Add Unity Editor", 207 | "Editor Version": "Editor Version", 208 | "Location": "Location", 209 | "Pick Unity Editor": "Pick Unity Editor", 210 | "Path to Unity Editor executable": "Path to Unity Editor executable", 211 | "All installed Unity Versions": "All installed Unity Versions", 212 | "Versions marked with ": "Versions marked with ", 213 | " are supported by VRChat": " are supported by VRChat", 214 | "Sort By": "Sort By", 215 | "Last Opened": "Last Opened", 216 | "Favorite": "Favorite", 217 | "Unity Version": "Unity Version", 218 | "Unity version": "Unity version", 219 | "Supported": "Supported", 220 | "Choose the one you prefer for every major Unity release to use from the dropdown, or browse to the location of the unity application using the folder button.": "Choose the one you prefer for every major Unity release to use from the dropdown, or browse to the location of the unity application using the folder button.", 221 | "No valid path selected": "No valid path selected", 222 | "Upgrading ": "Upgrading ", 223 | " to ": " to ", 224 | "You are about to migrate a Project using ": "You are about to migrate a Project using ", 225 | "Migrating ": "Migrating ", 226 | "Backing up ": "Backing up ", 227 | "Backing up the project...": "Backing up the project...", 228 | "Zipping up project...": "Zipping up project...", 229 | "Project backup completed": "Project backup completed", 230 | "Other versions": "Other versions", 231 | "No other versions installed": "No other versions installed", 232 | "Add Unity Version": "Add Unity Version", 233 | "Project Upgrade Required": "Project Upgrade Required", 234 | "You are trying to add a package that requires ": "You are trying to add a package that requires ", 235 | ", but your project is using ": ", but your project is using ", 236 | "This will require you to upgrade your project to ": "This will require you to upgrade your project to ", 237 | " before you can add this package.": " before you can add this package.", 238 | "The Creator Companion can automatically migrate your project to ": "The Creator Companion can automatically migrate your project to ", 239 | ". Click the button below to proceed.": ". Click the button below to proceed.", 240 | "Open Project Upgrade Window": "Open Project Upgrade Window", 241 | "VRChat has upgraded to Unity 2022. Upgrade your project to use all the latest features": "VRChat has upgraded to Unity 2022. Upgrade your project to use all the latest features", 242 | "Upgrade to 2022": "Upgrade to 2022", 243 | "You will have a chance to review the changes before applying them": "You will have a chance to review the changes before applying them", 244 | "Welcome to the Creator Companion": "Welcome to the Creator Companion", 245 | "Create, add, or manage your VRChat worlds and avatar projects.": "Create, add, or manage your VRChat worlds and avatar projects.", 246 | "See other official tools made by VRChat.": "See other official tools made by VRChat.", 247 | "View errors and other information logged by the Creator Companion.": "View errors and other information logged by the Creator Companion.", 248 | "Change your settings, visual theme, selected Unity editor, and more.": "Change your settings, visual theme, selected Unity editor, and more.", 249 | "Not recommended for new users.": "Not recommended for new users.", 250 | " Skip the Unity installation for now. You can add Unity later in the Settings": " Skip the Unity installation for now. You can add Unity later in the Settings", 251 | "Current Version ": "Current Version ", 252 | "New Version ": "New Version ", 253 | "Updating Creator Companion": "Updating Creator Companion", 254 | "No Unity Editors Found": "No Unity Editors Found", 255 | "You need a Unity Editor to be able to launch projects via the VCC": "You need a Unity Editor to be able to launch projects via the VCC", 256 | "Are you sure?": "Are you sure?", 257 | "Skipping Unity install is not recommended.": "Skipping Unity install is not recommended.", 258 | "This will prevent the VCC from opening your projects. You will need to install Unity to enable that functionality.": "This will prevent the VCC from opening your projects. You will need to install Unity to enable that functionality.", 259 | "Back to Unity Install": "Back to Unity Install", 260 | "If you have any questions about the Creator Companion or creating VRChat content, check out the ": "If you have any questions about the Creator Companion or creating VRChat content, check out the ", 261 | " page.": " page.", 262 | "You are adding": "You are adding", 263 | "You are downgrading": "You are downgrading", 264 | "You are removing": "You are removing", 265 | "[matcher]VCC is now ready to install Unity(.*)": "VCC is now ready to install Unity$1", 266 | "Install Unity ": "Install Unity ", 267 | "Install Error:": "Install Error:", 268 | "Unknown error": "Unknown error", 269 | "VCC failed to install the Unity Editor": "VCC failed to install the Unity Editor", 270 | "Try Again": "Try Again", 271 | "Install Manually": "Install Manually", 272 | "Manually install the Unity Editor": "Manually install the Unity Editor", 273 | "I have installed the Unity Editor": "I have installed the Unity Editor", 274 | "Click this link to start installation in Unity Hub": "Click this link to start installation in Unity Hub", 275 | "Select 'Android Build Support' under 'Platforms'": "Select 'Android Build Support' under 'Platforms'", 276 | "Click 'Install'": "Click 'Install'", 277 | "Check out the help article if you have any trouble": "Check out the help article if you have any trouble", 278 | "Unity Version used by this project is not installed": "Unity Version used by this project is not installed", 279 | "[matcher]Open [W|w]ith ([0-9|a-z|\\.]+)": "Open With $1", 280 | "[matcher]Change to ([0-9|a-z|\\.]+)": "Change to $1", 281 | "This version change is not officially supported by VRChat": "This version change is not officially supported by VRChat", 282 | "Back To Projects": "Back To Projects", 283 | "Header Name": "Header Name", 284 | "Header Value": "Header Value", 285 | "Community Repositories Disclaimer": "Community Repositories Disclaimer", 286 | "WARNING: Download at your own risk! Community Packages made available through third-party sites may contain malware. VRChat makes no representation, warranty, or guarantee with respect to Community Packages and disclaims any liability arising out of or related to Community Packages.": "WARNING: Download at your own risk! Community Packages made available through third-party sites may contain malware. VRChat makes no representation, warranty, or guarantee with respect to Community Packages and disclaims any liability arising out of or related to Community Packages.", 287 | "Included Packages": "Included Packages", 288 | "[matcher]Show All Packages ([0-9]+)": "Show All Packages $1", 289 | "I Understand, Add Repository": "I Understand, Add Repository", 290 | "a few seconds ago": "a few seconds ago", 291 | "an hour ago": "an hour ago", 292 | "[matcher]([0-9]+) hours ago": "1 hours ago", 293 | "[matcher]([0-9]+) minutes ago": "1 minutes ago", 294 | "[matcher]([0-9]+) days ago": "1 days ago", 295 | "[matcher]([0-9]+) months ago": "1 months ago", 296 | "[matcher]([0-9]+) years ago": "1 years ago", 297 | "a minute ago": "a minute ago", 298 | "a day ago": "a day ago", 299 | "a month ago": "a month ago", 300 | "a year ago": "a year ago", 301 | "The Creator Companion": "The Creator Companion", 302 | "(This application)": "(This application)", 303 | "This tool helps you set up everything you need to create things in VRChat!": "This tool helps you set up everything you need to create things in VRChat!", 304 | "Udon is a language custom-built to power logic and interactivity in VRChat Worlds.": "Udon is a language custom-built to power logic and interactivity in VRChat Worlds.", 305 | "Worlds": "Worlds", 306 | "Create your first World for VRChat using Unity and the SDK.": "Create your first World for VRChat using Unity and the SDK.", 307 | "Avatars": "角色", 308 | "Create your first Avatar for VRChat using Unity and the SDK.": "Create your first Avatar for VRChat using Unity and the SDK.", 309 | "Forums": "Forums", 310 | "Our forums are a place to search for info, ask questions, and find out about cool things other people are making.": "Our forums are a place to search for info, ask questions, and find out about cool things other people are making.", 311 | "Talk to fellow VRChat creators on our official Discord server.": "Talk to fellow VRChat creators on our official Discord server.", 312 | "Engine Upgrade": "Engine Upgrade", 313 | "Learn how to upgrade projects from Unity 2019 to Unity 2022.": "Learn how to upgrade projects from Unity 2019 to Unity 2022.", 314 | "VRC Quick Launcher": "VRC Quick Launcher", 315 | "This tool helps you launch multiple profiles in the same VRChat instance, while also providing an interface to modify the debug options.": "This tool helps you launch multiple profiles in the same VRChat instance, while also providing an interface to modify the debug options.", 316 | "Copy Live Settings and Data": "Copy Live Settings and Data", 317 | "Delete Beta Settings and Data": "Delete Beta Settings and Data", 318 | "Beta Builds use their own settings, but you can copy them from the main Creator Companion installation using the button below": "Beta Builds use their own settings, but you can copy them from the main Creator Companion installation using the button below", 319 | "This will overwrite your Beta settings with your Main settings and data": "This will overwrite your Beta settings with your Main settings and data", 320 | "This will delete all your Beta settings and data, starting from scratch": "This will delete all your Beta settings and data, starting from scratch", 321 | "Search Logs": "Search Logs", 322 | "Verbose": "Verbose", 323 | "Info": "Info", 324 | "Warning": "Warning", 325 | "Error": "Error", 326 | "Invalid Date": "Invalid Date", 327 | "Reinstall All Packages": "Reinstall All Packages", 328 | "Project Resolve Needed": "Project Resolve Needed", 329 | "The project has unresolved dependencies. That means that packages that are meant to be installed are not present in the Packages folder.": "The project has unresolved dependencies. That means that packages that are meant to be installed are not present in the Packages folder.", 330 | "To resolve the project, press the \"Resolve\" button below. You can also choose to ignore this warning for this session.": "To resolve the project, press the \"Resolve\" button below. You can also choose to ignore this warning for this session.", 331 | "Ignore for this session": "Ignore for this session", 332 | "Resolve": "Resolve", 333 | "Some of the dependencies are not installed. Click to resolve packages": "Some of the dependencies are not installed. Click to resolve packages", 334 | "More Actions": "More Actions", 335 | "Cool Mode 😎": "Cool Mode 😎", 336 | "Log Spam": "Log Spam", 337 | "Spam logs every 500ms": "Spam logs every 500ms", 338 | "Useful Buttons": "Useful Buttons", 339 | "Disable Cool Mode": "Disable Cool Mode", 340 | "Clear All Caches": "Clear All Caches", 341 | "Open VCC Folder": "Open VCC Folder", 342 | "Onboarding": "Onboarding", 343 | "Open Onboarding": "Open Onboarding", 344 | "Onboarding Completed": "Onboarding Completed", 345 | "Always PASS Unity existence checks": "Always PASS Unity existence checks", 346 | "Always FAIL Unity existence checks": "Always FAIL Unity existence checks", 347 | "Always PASS Hub existence check": "Always PASS Hub existence check", 348 | "Always FAIL Hub existence check": "Always FAIL Hub existence check", 349 | "Force-Pass Unity Install": "Force-Pass Unity Install", 350 | "Force-Fail Unity Install": "Force-Fail Unity Install", 351 | "Danger zone": "Danger zone", 352 | "Ignore Unity 2022 Compatibility Check": "Ignore Unity 2022 Compatibility Check", 353 | "Clear Settings File": "Clear Settings File", 354 | "Note, this will completely remove your settings.json file and replace it with a new one. You will need to re-add all the projects, local packages and custom repos again": "Note, this will completely remove your settings.json file and replace it with a new one. You will need to re-add all the projects, local packages and custom repos again", 355 | "Build Info": "Build Info", 356 | "Hey you, you're cool": "Hey you, you're cool", 357 | "Checking Package Availability": "Checking Package Availability", 358 | "Packages are being added to the project": "Packages are being added to the project", 359 | "Starting project creation...": "Starting project creation...", 360 | "A folder with the same name already exists": "A folder with the same name already exists", 361 | "A good starting point for a new VRChat World": "A good starting point for a new VRChat World", 362 | "A good starting point for a new VRChat Avatar": "A good starting point for a new VRChat Avatar", 363 | "This will {{1:delete}} all your {{3:Beta}} settings and data, starting from scratch": "This will delete all your Beta settings and data, starting from scratch", 364 | "You are using a {{1:Beta}} build of the Creator Companion, it is intended for testing purposes and can be unstable.": "You are using a Beta build of the Creator Companion, it is intended for testing purposes and can be unstable.", 365 | "This will {{1:overwrite}} your {{3:Beta}} settings with your {{5:Main}} settings and data": "This will overwrite your Beta settings with your Main settings and data", 366 | "Add New Header": "Add New Header", 367 | "Remove Header": "Remove Header", 368 | "Remove": "Remove", 369 | "Advanced Options": "Advanced Options" 370 | } 371 | -------------------------------------------------------------------------------- /localization/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "Projects": "Projects", 3 | "Learn": "Learn", 4 | "Tools": "Tools", 5 | "Logs": "Logs", 6 | "Settings": "Settings", 7 | "List View": "List View", 8 | "Grid View": "Grid View", 9 | "Create New Project": "Create New Project", 10 | "Open Project": "Open Project", 11 | "Opening...": "Opening...", 12 | "Manage Project": "Manage Project", 13 | "[matcher]Learn[ ]{1,2}More": "Learn More", 14 | "Launch": "Launch", 15 | "Check for Updates": "Check for Updates", 16 | "Checking...": "Checking...", 17 | "Pick New Folder": "Pick New Folder", 18 | "Templates": "Templates", 19 | "Files and Folders": "Files and Folders", 20 | "Backups": "Backups", 21 | "Unity Editors": "Unity Editors", 22 | "Error Reporting Settings": "Error Reporting Settings", 23 | "Pre-Release Packages": "Pre-Release Packages", 24 | "User Packages": "User Packages", 25 | "UI Theme": "UI Theme", 26 | "Updates": "Updates", 27 | "Manage Packages": "Manage Packages", 28 | "Open Project Folder": "Open Project Folder", 29 | "Make Backup": "Make Backup", 30 | "Remove Project": "Remove Project", 31 | "Add Existing Project": "Add Existing Project", 32 | "Official": "Official", 33 | "Curated": "Curated", 34 | "Community": "Community", 35 | "Local": "Local", 36 | "Local User Packages": "Local User Packages", 37 | "Built-In Repositories": "Built-In Repositories", 38 | "User Repositories": "User Repositories", 39 | "Include my IP and Computer Username when sending automated reports": "Include my IP and Computer Username when sending automated reports", 40 | "Show Pre-Release Packages": "Show Pre-Release Packages", 41 | "This dropdown lists all the Unity Editors found on your system which can make new VRChat projects.": "This dropdown lists all the Unity Editors found on your system which can make new VRChat projects.", 42 | "These files and folders are in fixed locations for now. Click the buttons below to open them": "These files and folders are in fixed locations for now. Click the buttons below to open them", 43 | "Project backups are saved to this folder.": "Project backups are saved to this folder.", 44 | "This application sends error reports to help us track, diagnose and fix the issues.": "This application sends error reports to help us track, diagnose and fix the issues.", 45 | "Choose the one you prefer to use from the dropdown, or browse to the location of the unity application using the folder button.": "Choose the one you prefer to use from the dropdown, or browse to the location of the unity application using the folder button.", 46 | "You can send additional information to make it easier to find your specific issue.": "You can send additional information to make it easier to find your specific issue.", 47 | "VRChat sometimes provides pre-release packages for testing new features. These often go alongside an open beta.": "VRChat sometimes provides pre-release packages for testing new features. These often go alongside an open beta.", 48 | "By default these packages are hidden in the versions list. But you can enable them here.": "By default these packages are hidden in the versions list. But you can enable them here.", 49 | "Add your own packages to this list to easily include them in your projects": "Add your own packages to this list to easily include them in your projects", 50 | "System": "System", 51 | "Will follow your system theme setting": "Will follow your system theme setting", 52 | "Light": "Light", 53 | "Dark": "Dark", 54 | "Selected Repos": "Selected Repos", 55 | "Loading...": "Loading...", 56 | "Click on the cards below to learn more about a particular topic": "Click on the cards below to learn more about a particular topic", 57 | "These are external applications that can be help you create and test your VRChat content": "These are external applications that can be help you create and test your VRChat content", 58 | "Located At:": "Located At:", 59 | "General": "General", 60 | "Packages": "Packages", 61 | "Appearance": "Appearance", 62 | "Refresh Projects": "Refresh Projects", 63 | "Project Name": "Project Name", 64 | "Project Type": "Project Type", 65 | "Avatar": "Avatar", 66 | "World": "World", 67 | "Unknown": "Unknown", 68 | "Name": "Name", 69 | "Installed Version": "Installed Version", 70 | "Latest Version": "Latest Version", 71 | "Update to Latest": "Update to Latest", 72 | "Refresh Packages": "Refresh Packages", 73 | "Remove Package": "Remove Package", 74 | "Add Package": "Add Package", 75 | "This package is required and cannot be removed": "This package is required and cannot be removed", 76 | "You are running the latest version of the Creator Companion": "You are running the latest version of the Creator Companion", 77 | "Installed Repositories": "Installed Repositories", 78 | "Community Repositories": "Community Repositories", 79 | "The Creator Companion includes VRChat's official and curated repositories by default. You can add your own community repositories by clicking 'Add Repository'.": "The Creator Companion includes VRChat's official and curated repositories by default. You can add your own community repositories by clicking 'Add Repository'.", 80 | "Author": "Author", 81 | "Add Repository": "Add Repository", 82 | "Remove repository": "Remove repository", 83 | "Add": "Add", 84 | "Cancel": "Cancel", 85 | "Request Headers": "Request Headers", 86 | "Link to the repository JSON file. E.g. https://vrchat.github.io/myRepo/index.json": "Link to the repository JSON file. E.g. https://vrchat.github.io/myRepo/index.json", 87 | "Search Projects...": "Search Projects...", 88 | "Search Packages...": "Search Packages...", 89 | "Repository Listing URL": "Repository Listing URL", 90 | "The VRChat Creator Companion, or VCC for short, is your gateway to VRChat World & Avatar Creation.": "The VRChat Creator Companion, or VCC for short, is your gateway to VRChat World & Avatar Creation.", 91 | "Show Me Around": "Show Me Around", 92 | "Help VRChat improve the Creator Companion by including your IP address with crash reports": "Help VRChat improve the Creator Companion by including your IP address with crash reports", 93 | "Learn how to create VRChat worlds and avatars with the Creator Companion.": "Learn how to create VRChat worlds and avatars with the Creator Companion.", 94 | "This is the Main Sidebar": "This is the Main Sidebar", 95 | "You can access all of the Creator Companion's features through it": "You can access all of the Creator Companion's features through it", 96 | "Learn more about the Creator Companion in our Documentation": "Learn more about the Creator Companion in our Documentation", 97 | "Back": "Back", 98 | "Continue": "Continue", 99 | "Skip Unity Install": "Skip Unity Install", 100 | "Unity Editor Check": "Unity Editor Check", 101 | "Unity Editor not found": "Unity Editor not found", 102 | "Unity Editor found. Ready!": "Unity Editor found. Ready!", 103 | "Unity Installation": "Unity Installation", 104 | "To create content for VRChat, you will need the Unity Editor": "To create content for VRChat, you will need the Unity Editor", 105 | "I already have Unity": "I already have Unity", 106 | "Open the file picker to select the Unity.exe for the Creator Companion to use": "Open the file picker to select the Unity.exe for the Creator Companion to use", 107 | "Install Later": "Install Later", 108 | "Install Unity": "Install Unity", 109 | "Unity Hub Installation": "Unity Hub Installation", 110 | "First, you'll need to install the Unity Hub": "First, you'll need to install the Unity Hub", 111 | "Download the Unity Hub from Unity's website": "Download the Unity Hub from Unity's website", 112 | "Install the Unity Hub": "Install the Unity Hub", 113 | "Open the Unity Hub": "Open the Unity Hub", 114 | "Activate your Unity license": "Activate your Unity license", 115 | "Check out this help article if you have any trouble": "Check out this help article if you have any trouble", 116 | "Click the button below when you're done": "Click the button below when you're done", 117 | "I have installed the Unity Hub": "I have installed the Unity Hub", 118 | "Having Trouble? Try Manual Install": "Having Trouble? Try Manual Install", 119 | "Everything is Ready": "Everything is Ready", 120 | "You can now start using the Creator Companion!": "You can now start using the Creator Companion!", 121 | "If you want to add or create a project right away, use the buttons below:": "If you want to add or create a project right away, use the buttons below:", 122 | "Open the Creator Companion": "Open the Creator Companion", 123 | "New Project": "New Project", 124 | "Select template": "Select template", 125 | "Configure Project": "Configure Project", 126 | "Project Location": "Project Location", 127 | "Final project location:": "Final project location:", 128 | "Create Project": "Create Project", 129 | "Please do not close the VCC Application": "Please do not close the VCC Application", 130 | "Path to a Unity Editor is not set, you will be unable to open projects.": "Path to a Unity Editor is not set, you will be unable to open projects.", 131 | "Fix Now": "Fix Now", 132 | "No Unity Editors found, you need a Unity Editor to be able to launch projects via the VCC": "No Unity Editors found, you need a Unity Editor to be able to launch projects via the VCC", 133 | "Install Now": "Install Now", 134 | "Community Repo Analytics": "Community Repo Analytics", 135 | "When you add a Community Repo, this app will send the url of that repo to our analytics service to help us understand how people are using community repos, which are the most popular, etc. It also sends a true/false value for whether a custom header is provided, but it does not send any of the information from the header.": "When you add a Community Repo, this app will send the url of that repo to our analytics service to help us understand how people are using community repos, which are the most popular, etc. It also sends a true/false value for whether a custom header is provided, but it does not send any of the information from the header.", 136 | "You can turn this off if you don't want to share the information.": "You can turn this off if you don't want to share the information.", 137 | "Send Community Repo Analytics": "Send Community Repo Analytics", 138 | "Bring To Front": "Bring To Front", 139 | "Creator Companion is ready to Update!": "Creator Companion is ready to Update!", 140 | "Update Now": "Update Now", 141 | "See Whats New": "See Whats New", 142 | "Multiple Repositories": "Multiple Repositories", 143 | "Create Backup": "Create Backup", 144 | "Update": "Update", 145 | "Confirm Project Changes": "Confirm Project Changes", 146 | "Detailed View": "Detailed View", 147 | "You are upgrading": "You are upgrading", 148 | " to version ": " to version ", 149 | "This will also change the following packages:": "This will also change the following packages:", 150 | "Confirm": "Confirm", 151 | "You are about to make the following changes to your project": "You are about to make the following changes to your project", 152 | "Package Name": "Package Name", 153 | "Old Version": "Old Version", 154 | "New Version": "New Version", 155 | "will be added": "will be added", 156 | "Final project location: ": "Final project location: ", 157 | "World Project": "World Project", 158 | "[matcher]Unity ([0-9]*) World Project": "Unity $1 World Project", 159 | "Avatar Project": "Avatar Project", 160 | "[matcher]Unity ([0-9]*) Avatar Project": "Unity $1 Avatar Project", 161 | "VRChat World Project with UdonSharp": "VRChat World Project with UdonSharp", 162 | "Add a new Package": "Add a new Package", 163 | "Open Logs": "Open Logs", 164 | "Toggle auto scroll": "Toggle auto scroll", 165 | "Toggle text wrapping": "Toggle text wrapping", 166 | "Copy Logs": "Copy Logs", 167 | "Updates available! Use the button on the sidebar to update": "Updates available! Use the button on the sidebar to update", 168 | "Not Installed": "Not Installed", 169 | "Sort Ascending": "Sort Ascending", 170 | "Sort Descending": "Sort Descending", 171 | "Project name cannot be empty": "Project name cannot be empty", 172 | "E.g. MyNewProject": "E.g. MyNewProject", 173 | "E.g. C:/Users/myUser/UnityProjects": "E.g. C:/Users/myUser/UnityProjects", 174 | "Unity Version Upgrade Available": "Unity Version Upgrade Available", 175 | "Change Unity Version": "Change Unity Version", 176 | "Supported versions": "Supported versions", 177 | "Recommended": "Recommended", 178 | "Needs Download": "Needs Download", 179 | "Close": "Close", 180 | "Show all installed Unity Versions": "Show all installed Unity Versions", 181 | "[matcher]Migrate to (.*)": "Migrate to $1", 182 | "Major Version": "Major Version", 183 | "Selected Editor": "Selected Editor", 184 | "Loading Editors...": "Loading Editors...", 185 | "No Editors Selected": "No Editors Selected", 186 | "Refresh Editor List": "Refresh Editor List", 187 | "Add new Editor": "Add new Editor", 188 | "View all installed Versions": "View all installed Versions", 189 | "No Recommended Version Set": "No Recommended Version Set", 190 | "VRChat recommends using Unity ": "VRChat recommends using Unity ", 191 | "Migrate a Copy": "Migrate a Copy", 192 | "Migrate in-place (you have a backup)": "Migrate in-place (you have a backup)", 193 | "I understand the risks, migrate": "I understand the risks, migrate", 194 | "This process will do the following:": "This process will do the following:", 195 | "[matcher]Upgrade the VRChat SDK to version ([0-9|\\.]+) or newer": "Upgrade the VRChat SDK to version $1 or newer", 196 | "Remove outdated Unity XR Packages": "Remove outdated Unity XR Packages", 197 | "We highly recommend migrating a Copy of your project, unless you're using backups or some sort of Version Control": "We highly recommend migrating a Copy of your project, unless you're using backups or some sort of Version Control", 198 | "Abort Migration": "Abort Migration", 199 | "We detected Unity 2022 SDK Packages in a Unity 2019 Project. You should try to migrate this project": "We detected Unity 2022 SDK Packages in a Unity 2019 Project. You should try to migrate this project", 200 | "Migrate project": "Migrate project", 201 | "Migration not finalized": "Migration not finalized", 202 | "Project migrated but failed to finalize": "Project migrated but failed to finalize", 203 | "Try again": "Try again", 204 | "Dismiss": "Dismiss", 205 | "Last Modified": "Last Modified", 206 | "Add Unity Editor": "Add Unity Editor", 207 | "Editor Version": "Editor Version", 208 | "Location": "Location", 209 | "Pick Unity Editor": "Pick Unity Editor", 210 | "Path to Unity Editor executable": "Path to Unity Editor executable", 211 | "All installed Unity Versions": "All installed Unity Versions", 212 | "Versions marked with ": "Versions marked with ", 213 | " are supported by VRChat": " are supported by VRChat", 214 | "Sort By": "Sort By", 215 | "Last Opened": "Last Opened", 216 | "Favorite": "Favorite", 217 | "Unity Version": "Unity Version", 218 | "Unity version": "Unity version", 219 | "Supported": "Supported", 220 | "Choose the one you prefer for every major Unity release to use from the dropdown, or browse to the location of the unity application using the folder button.": "Choose the one you prefer for every major Unity release to use from the dropdown, or browse to the location of the unity application using the folder button.", 221 | "No valid path selected": "No valid path selected", 222 | "Upgrading ": "Upgrading ", 223 | " to ": " to ", 224 | "You are about to migrate a Project using ": "You are about to migrate a Project using ", 225 | "Migrating ": "Migrating ", 226 | "Backing up ": "Backing up ", 227 | "Backing up the project...": "Backing up the project...", 228 | "Zipping up project...": "Zipping up project...", 229 | "Project backup completed": "Project backup completed", 230 | "Other versions": "Other versions", 231 | "No other versions installed": "No other versions installed", 232 | "Add Unity Version": "Add Unity Version", 233 | "Project Upgrade Required": "Project Upgrade Required", 234 | "You are trying to add a package that requires ": "You are trying to add a package that requires ", 235 | ", but your project is using ": ", but your project is using ", 236 | "This will require you to upgrade your project to ": "This will require you to upgrade your project to ", 237 | " before you can add this package.": " before you can add this package.", 238 | "The Creator Companion can automatically migrate your project to ": "The Creator Companion can automatically migrate your project to ", 239 | ". Click the button below to proceed.": ". Click the button below to proceed.", 240 | "Open Project Upgrade Window": "Open Project Upgrade Window", 241 | "VRChat has upgraded to Unity 2022. Upgrade your project to use all the latest features": "VRChat has upgraded to Unity 2022. Upgrade your project to use all the latest features", 242 | "Upgrade to 2022": "Upgrade to 2022", 243 | "You will have a chance to review the changes before applying them": "You will have a chance to review the changes before applying them", 244 | "Welcome to the Creator Companion": "Welcome to the Creator Companion", 245 | "Create, add, or manage your VRChat worlds and avatar projects.": "Create, add, or manage your VRChat worlds and avatar projects.", 246 | "See other official tools made by VRChat.": "See other official tools made by VRChat.", 247 | "View errors and other information logged by the Creator Companion.": "View errors and other information logged by the Creator Companion.", 248 | "Change your settings, visual theme, selected Unity editor, and more.": "Change your settings, visual theme, selected Unity editor, and more.", 249 | "Not recommended for new users.": "Not recommended for new users.", 250 | " Skip the Unity installation for now. You can add Unity later in the Settings": " Skip the Unity installation for now. You can add Unity later in the Settings", 251 | "Current Version ": "Current Version ", 252 | "New Version ": "New Version ", 253 | "Updating Creator Companion": "Updating Creator Companion", 254 | "No Unity Editors Found": "No Unity Editors Found", 255 | "You need a Unity Editor to be able to launch projects via the VCC": "You need a Unity Editor to be able to launch projects via the VCC", 256 | "Are you sure?": "Are you sure?", 257 | "Skipping Unity install is not recommended.": "Skipping Unity install is not recommended.", 258 | "This will prevent the VCC from opening your projects. You will need to install Unity to enable that functionality.": "This will prevent the VCC from opening your projects. You will need to install Unity to enable that functionality.", 259 | "Back to Unity Install": "Back to Unity Install", 260 | "If you have any questions about the Creator Companion or creating VRChat content, check out the ": "If you have any questions about the Creator Companion or creating VRChat content, check out the ", 261 | " page.": " page.", 262 | "You are adding": "You are adding", 263 | "You are downgrading": "You are downgrading", 264 | "You are removing": "You are removing", 265 | "[matcher]VCC is now ready to install Unity(.*)": "VCC is now ready to install Unity$1", 266 | "Install Unity ": "Install Unity ", 267 | "Install Error:": "Install Error:", 268 | "Unknown error": "Unknown error", 269 | "VCC failed to install the Unity Editor": "VCC failed to install the Unity Editor", 270 | "Try Again": "Try Again", 271 | "Install Manually": "Install Manually", 272 | "Manually install the Unity Editor": "Manually install the Unity Editor", 273 | "I have installed the Unity Editor": "I have installed the Unity Editor", 274 | "Click this link to start installation in Unity Hub": "Click this link to start installation in Unity Hub", 275 | "Select 'Android Build Support' under 'Platforms'": "Select 'Android Build Support' under 'Platforms'", 276 | "Click 'Install'": "Click 'Install'", 277 | "Check out the help article if you have any trouble": "Check out the help article if you have any trouble", 278 | "Unity Version used by this project is not installed": "Unity Version used by this project is not installed", 279 | "[matcher]Open [W|w]ith ([0-9|a-z|\\.]+)": "Open With $1", 280 | "[matcher]Change to ([0-9|a-z|\\.]+)": "Change to $1", 281 | "This version change is not officially supported by VRChat": "This version change is not officially supported by VRChat", 282 | "Back To Projects": "Back To Projects", 283 | "Header Name": "Header Name", 284 | "Header Value": "Header Value", 285 | "Community Repositories Disclaimer": "Community Repositories Disclaimer", 286 | "WARNING: Download at your own risk! Community Packages made available through third-party sites may contain malware. VRChat makes no representation, warranty, or guarantee with respect to Community Packages and disclaims any liability arising out of or related to Community Packages.": "WARNING: Download at your own risk! Community Packages made available through third-party sites may contain malware. VRChat makes no representation, warranty, or guarantee with respect to Community Packages and disclaims any liability arising out of or related to Community Packages.", 287 | "Included Packages": "Included Packages", 288 | "[matcher]Show All Packages ([0-9]+)": "Show All Packages $1", 289 | "I Understand, Add Repository": "I Understand, Add Repository", 290 | "a few seconds ago": "a few seconds ago", 291 | "an hour ago": "an hour ago", 292 | "[matcher]([0-9]+) hours ago": "1 hours ago", 293 | "[matcher]([0-9]+) minutes ago": "1 minutes ago", 294 | "[matcher]([0-9]+) days ago": "1 days ago", 295 | "[matcher]([0-9]+) months ago": "1 months ago", 296 | "[matcher]([0-9]+) years ago": "1 years ago", 297 | "a minute ago": "a minute ago", 298 | "a day ago": "a day ago", 299 | "a month ago": "a month ago", 300 | "a year ago": "a year ago", 301 | "The Creator Companion": "The Creator Companion", 302 | "(This application)": "(This application)", 303 | "This tool helps you set up everything you need to create things in VRChat!": "This tool helps you set up everything you need to create things in VRChat!", 304 | "Udon is a language custom-built to power logic and interactivity in VRChat Worlds.": "Udon is a language custom-built to power logic and interactivity in VRChat Worlds.", 305 | "Worlds": "Worlds", 306 | "Create your first World for VRChat using Unity and the SDK.": "Create your first World for VRChat using Unity and the SDK.", 307 | "Avatars": "Avatars", 308 | "Create your first Avatar for VRChat using Unity and the SDK.": "Create your first Avatar for VRChat using Unity and the SDK.", 309 | "Forums": "Forums", 310 | "Our forums are a place to search for info, ask questions, and find out about cool things other people are making.": "Our forums are a place to search for info, ask questions, and find out about cool things other people are making.", 311 | "Talk to fellow VRChat creators on our official Discord server.": "Talk to fellow VRChat creators on our official Discord server.", 312 | "Engine Upgrade": "Engine Upgrade", 313 | "Learn how to upgrade projects from Unity 2019 to Unity 2022.": "Learn how to upgrade projects from Unity 2019 to Unity 2022.", 314 | "VRC Quick Launcher": "VRC Quick Launcher", 315 | "This tool helps you launch multiple profiles in the same VRChat instance, while also providing an interface to modify the debug options.": "This tool helps you launch multiple profiles in the same VRChat instance, while also providing an interface to modify the debug options.", 316 | "Copy Live Settings and Data": "Copy Live Settings and Data", 317 | "Delete Beta Settings and Data": "Delete Beta Settings and Data", 318 | "Beta Builds use their own settings, but you can copy them from the main Creator Companion installation using the button below": "Beta Builds use their own settings, but you can copy them from the main Creator Companion installation using the button below", 319 | "This will overwrite your Beta settings with your Main settings and data": "This will overwrite your Beta settings with your Main settings and data", 320 | "This will delete all your Beta settings and data, starting from scratch": "This will delete all your Beta settings and data, starting from scratch", 321 | "Search Logs": "Search Logs", 322 | "Verbose": "Verbose", 323 | "Info": "Info", 324 | "Warning": "Warning", 325 | "Error": "Error", 326 | "Invalid Date": "Invalid Date", 327 | "Reinstall All Packages": "Reinstall All Packages", 328 | "Project Resolve Needed": "Project Resolve Needed", 329 | "The project has unresolved dependencies. That means that packages that are meant to be installed are not present in the Packages folder.": "The project has unresolved dependencies. That means that packages that are meant to be installed are not present in the Packages folder.", 330 | "To resolve the project, press the \"Resolve\" button below. You can also choose to ignore this warning for this session.": "To resolve the project, press the \"Resolve\" button below. You can also choose to ignore this warning for this session.", 331 | "Ignore for this session": "Ignore for this session", 332 | "Resolve": "Resolve", 333 | "Some of the dependencies are not installed. Click to resolve packages": "Some of the dependencies are not installed. Click to resolve packages", 334 | "More Actions": "More Actions", 335 | "Cool Mode 😎": "Cool Mode 😎", 336 | "Log Spam": "Log Spam", 337 | "Spam logs every 500ms": "Spam logs every 500ms", 338 | "Useful Buttons": "Useful Buttons", 339 | "Disable Cool Mode": "Disable Cool Mode", 340 | "Clear All Caches": "Clear All Caches", 341 | "Open VCC Folder": "Open VCC Folder", 342 | "Onboarding": "Onboarding", 343 | "Open Onboarding": "Open Onboarding", 344 | "Onboarding Completed": "Onboarding Completed", 345 | "Always PASS Unity existence checks": "Always PASS Unity existence checks", 346 | "Always FAIL Unity existence checks": "Always FAIL Unity existence checks", 347 | "Always PASS Hub existence check": "Always PASS Hub existence check", 348 | "Always FAIL Hub existence check": "Always FAIL Hub existence check", 349 | "Force-Pass Unity Install": "Force-Pass Unity Install", 350 | "Force-Fail Unity Install": "Force-Fail Unity Install", 351 | "Danger zone": "Danger zone", 352 | "Ignore Unity 2022 Compatibility Check": "Ignore Unity 2022 Compatibility Check", 353 | "Clear Settings File": "Clear Settings File", 354 | "Note, this will completely remove your settings.json file and replace it with a new one. You will need to re-add all the projects, local packages and custom repos again": "Note, this will completely remove your settings.json file and replace it with a new one. You will need to re-add all the projects, local packages and custom repos again", 355 | "Build Info": "Build Info", 356 | "Hey you, you're cool": "Hey you, you're cool", 357 | "Checking Package Availability": "Checking Package Availability", 358 | "Packages are being added to the project": "Packages are being added to the project", 359 | "Starting project creation...": "Starting project creation...", 360 | "A folder with the same name already exists": "A folder with the same name already exists", 361 | "A good starting point for a new VRChat World": "A good starting point for a new VRChat World", 362 | "A good starting point for a new VRChat Avatar": "A good starting point for a new VRChat Avatar", 363 | "This will {{1:delete}} all your {{3:Beta}} settings and data, starting from scratch": "This will delete all your Beta settings and data, starting from scratch", 364 | "You are using a {{1:Beta}} build of the Creator Companion, it is intended for testing purposes and can be unstable.": "You are using a Beta build of the Creator Companion, it is intended for testing purposes and can be unstable.", 365 | "This will {{1:overwrite}} your {{3:Beta}} settings with your {{5:Main}} settings and data": "This will overwrite your Beta settings with your Main settings and data", 366 | "Add New Header": "Add New Header", 367 | "Remove Header": "Remove Header", 368 | "Remove": "Remove", 369 | "Advanced Options": "Advanced Options" 370 | } 371 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@babel/types': 12 | specifier: ^7.24.0 13 | version: 7.24.0 14 | '@fluentui/web-components': 15 | specifier: ^2.5.17 16 | version: 2.5.17 17 | ast-walker-scope: 18 | specifier: ^0.6.1 19 | version: 0.6.1 20 | idb-keyval: 21 | specifier: ^6.2.1 22 | version: 6.2.1 23 | jsx-dom: 24 | specifier: ^8.1.3 25 | version: 8.1.3 26 | magic-string-ast: 27 | specifier: ^0.3.0 28 | version: 0.3.0 29 | devDependencies: 30 | '@types/node': 31 | specifier: ^20.11.28 32 | version: 20.11.28 33 | dotenv: 34 | specifier: ^16.4.5 35 | version: 16.4.5 36 | esbuild: 37 | specifier: ^0.20.2 38 | version: 0.20.2 39 | esbuild-css-modules-plugin: 40 | specifier: ^3.1.0 41 | version: 3.1.0(esbuild@0.20.2) 42 | esno: 43 | specifier: ^4.7.0 44 | version: 4.7.0 45 | 46 | packages: 47 | 48 | '@babel/helper-string-parser@7.23.4': 49 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 50 | engines: {node: '>=6.9.0'} 51 | 52 | '@babel/helper-validator-identifier@7.22.20': 53 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 54 | engines: {node: '>=6.9.0'} 55 | 56 | '@babel/parser@7.24.0': 57 | resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} 58 | engines: {node: '>=6.0.0'} 59 | hasBin: true 60 | 61 | '@babel/types@7.24.0': 62 | resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} 63 | engines: {node: '>=6.9.0'} 64 | 65 | '@esbuild/aix-ppc64@0.19.12': 66 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 67 | engines: {node: '>=12'} 68 | cpu: [ppc64] 69 | os: [aix] 70 | 71 | '@esbuild/aix-ppc64@0.20.2': 72 | resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} 73 | engines: {node: '>=12'} 74 | cpu: [ppc64] 75 | os: [aix] 76 | 77 | '@esbuild/android-arm64@0.19.12': 78 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 79 | engines: {node: '>=12'} 80 | cpu: [arm64] 81 | os: [android] 82 | 83 | '@esbuild/android-arm64@0.20.2': 84 | resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} 85 | engines: {node: '>=12'} 86 | cpu: [arm64] 87 | os: [android] 88 | 89 | '@esbuild/android-arm@0.19.12': 90 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 91 | engines: {node: '>=12'} 92 | cpu: [arm] 93 | os: [android] 94 | 95 | '@esbuild/android-arm@0.20.2': 96 | resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} 97 | engines: {node: '>=12'} 98 | cpu: [arm] 99 | os: [android] 100 | 101 | '@esbuild/android-x64@0.19.12': 102 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 103 | engines: {node: '>=12'} 104 | cpu: [x64] 105 | os: [android] 106 | 107 | '@esbuild/android-x64@0.20.2': 108 | resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} 109 | engines: {node: '>=12'} 110 | cpu: [x64] 111 | os: [android] 112 | 113 | '@esbuild/darwin-arm64@0.19.12': 114 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 115 | engines: {node: '>=12'} 116 | cpu: [arm64] 117 | os: [darwin] 118 | 119 | '@esbuild/darwin-arm64@0.20.2': 120 | resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} 121 | engines: {node: '>=12'} 122 | cpu: [arm64] 123 | os: [darwin] 124 | 125 | '@esbuild/darwin-x64@0.19.12': 126 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 127 | engines: {node: '>=12'} 128 | cpu: [x64] 129 | os: [darwin] 130 | 131 | '@esbuild/darwin-x64@0.20.2': 132 | resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} 133 | engines: {node: '>=12'} 134 | cpu: [x64] 135 | os: [darwin] 136 | 137 | '@esbuild/freebsd-arm64@0.19.12': 138 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 139 | engines: {node: '>=12'} 140 | cpu: [arm64] 141 | os: [freebsd] 142 | 143 | '@esbuild/freebsd-arm64@0.20.2': 144 | resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} 145 | engines: {node: '>=12'} 146 | cpu: [arm64] 147 | os: [freebsd] 148 | 149 | '@esbuild/freebsd-x64@0.19.12': 150 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 151 | engines: {node: '>=12'} 152 | cpu: [x64] 153 | os: [freebsd] 154 | 155 | '@esbuild/freebsd-x64@0.20.2': 156 | resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} 157 | engines: {node: '>=12'} 158 | cpu: [x64] 159 | os: [freebsd] 160 | 161 | '@esbuild/linux-arm64@0.19.12': 162 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 163 | engines: {node: '>=12'} 164 | cpu: [arm64] 165 | os: [linux] 166 | 167 | '@esbuild/linux-arm64@0.20.2': 168 | resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} 169 | engines: {node: '>=12'} 170 | cpu: [arm64] 171 | os: [linux] 172 | 173 | '@esbuild/linux-arm@0.19.12': 174 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 175 | engines: {node: '>=12'} 176 | cpu: [arm] 177 | os: [linux] 178 | 179 | '@esbuild/linux-arm@0.20.2': 180 | resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} 181 | engines: {node: '>=12'} 182 | cpu: [arm] 183 | os: [linux] 184 | 185 | '@esbuild/linux-ia32@0.19.12': 186 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 187 | engines: {node: '>=12'} 188 | cpu: [ia32] 189 | os: [linux] 190 | 191 | '@esbuild/linux-ia32@0.20.2': 192 | resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} 193 | engines: {node: '>=12'} 194 | cpu: [ia32] 195 | os: [linux] 196 | 197 | '@esbuild/linux-loong64@0.19.12': 198 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 199 | engines: {node: '>=12'} 200 | cpu: [loong64] 201 | os: [linux] 202 | 203 | '@esbuild/linux-loong64@0.20.2': 204 | resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} 205 | engines: {node: '>=12'} 206 | cpu: [loong64] 207 | os: [linux] 208 | 209 | '@esbuild/linux-mips64el@0.19.12': 210 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 211 | engines: {node: '>=12'} 212 | cpu: [mips64el] 213 | os: [linux] 214 | 215 | '@esbuild/linux-mips64el@0.20.2': 216 | resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} 217 | engines: {node: '>=12'} 218 | cpu: [mips64el] 219 | os: [linux] 220 | 221 | '@esbuild/linux-ppc64@0.19.12': 222 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 223 | engines: {node: '>=12'} 224 | cpu: [ppc64] 225 | os: [linux] 226 | 227 | '@esbuild/linux-ppc64@0.20.2': 228 | resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} 229 | engines: {node: '>=12'} 230 | cpu: [ppc64] 231 | os: [linux] 232 | 233 | '@esbuild/linux-riscv64@0.19.12': 234 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 235 | engines: {node: '>=12'} 236 | cpu: [riscv64] 237 | os: [linux] 238 | 239 | '@esbuild/linux-riscv64@0.20.2': 240 | resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} 241 | engines: {node: '>=12'} 242 | cpu: [riscv64] 243 | os: [linux] 244 | 245 | '@esbuild/linux-s390x@0.19.12': 246 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 247 | engines: {node: '>=12'} 248 | cpu: [s390x] 249 | os: [linux] 250 | 251 | '@esbuild/linux-s390x@0.20.2': 252 | resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} 253 | engines: {node: '>=12'} 254 | cpu: [s390x] 255 | os: [linux] 256 | 257 | '@esbuild/linux-x64@0.19.12': 258 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 259 | engines: {node: '>=12'} 260 | cpu: [x64] 261 | os: [linux] 262 | 263 | '@esbuild/linux-x64@0.20.2': 264 | resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} 265 | engines: {node: '>=12'} 266 | cpu: [x64] 267 | os: [linux] 268 | 269 | '@esbuild/netbsd-x64@0.19.12': 270 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 271 | engines: {node: '>=12'} 272 | cpu: [x64] 273 | os: [netbsd] 274 | 275 | '@esbuild/netbsd-x64@0.20.2': 276 | resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} 277 | engines: {node: '>=12'} 278 | cpu: [x64] 279 | os: [netbsd] 280 | 281 | '@esbuild/openbsd-x64@0.19.12': 282 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 283 | engines: {node: '>=12'} 284 | cpu: [x64] 285 | os: [openbsd] 286 | 287 | '@esbuild/openbsd-x64@0.20.2': 288 | resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} 289 | engines: {node: '>=12'} 290 | cpu: [x64] 291 | os: [openbsd] 292 | 293 | '@esbuild/sunos-x64@0.19.12': 294 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 295 | engines: {node: '>=12'} 296 | cpu: [x64] 297 | os: [sunos] 298 | 299 | '@esbuild/sunos-x64@0.20.2': 300 | resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} 301 | engines: {node: '>=12'} 302 | cpu: [x64] 303 | os: [sunos] 304 | 305 | '@esbuild/win32-arm64@0.19.12': 306 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 307 | engines: {node: '>=12'} 308 | cpu: [arm64] 309 | os: [win32] 310 | 311 | '@esbuild/win32-arm64@0.20.2': 312 | resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} 313 | engines: {node: '>=12'} 314 | cpu: [arm64] 315 | os: [win32] 316 | 317 | '@esbuild/win32-ia32@0.19.12': 318 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 319 | engines: {node: '>=12'} 320 | cpu: [ia32] 321 | os: [win32] 322 | 323 | '@esbuild/win32-ia32@0.20.2': 324 | resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} 325 | engines: {node: '>=12'} 326 | cpu: [ia32] 327 | os: [win32] 328 | 329 | '@esbuild/win32-x64@0.19.12': 330 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 331 | engines: {node: '>=12'} 332 | cpu: [x64] 333 | os: [win32] 334 | 335 | '@esbuild/win32-x64@0.20.2': 336 | resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} 337 | engines: {node: '>=12'} 338 | cpu: [x64] 339 | os: [win32] 340 | 341 | '@fluentui/web-components@2.5.17': 342 | resolution: {integrity: sha512-EUIgePoUK02eGft898wI4C7rJp4dQG4vzRG+cZc+a+FZeL1fjne6qb9F9RjUf7PxBt5B/w0MWoXA7tzcKo1gKw==} 343 | 344 | '@jridgewell/sourcemap-codec@1.4.15': 345 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 346 | 347 | '@microsoft/fast-colors@5.3.1': 348 | resolution: {integrity: sha512-72RZXVfCbwQzvo5sXXkuLXLT7rMeYaSf5r/6ewQiv/trBtqpWRm4DEH2EilHw/iWTBKOXs1qZNQndgUMa5n4LA==} 349 | 350 | '@microsoft/fast-element@1.12.0': 351 | resolution: {integrity: sha512-gQutuDHPKNxUEcQ4pypZT4Wmrbapus+P9s3bR/SEOLsMbNqNoXigGImITygI5zhb+aA5rzflM6O8YWkmRbGkPA==} 352 | 353 | '@microsoft/fast-foundation@2.49.5': 354 | resolution: {integrity: sha512-3PpG1BNmZ5kUM1goYU3SsxjsM2H7Rk0ZmpDJ7mnRhWDgKiM5SzJ02KvALRUqDrJQoeDnkW0Q2Q+r9SkEd68Gpg==} 355 | 356 | '@microsoft/fast-web-utilities@5.4.1': 357 | resolution: {integrity: sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==} 358 | 359 | '@types/node@20.11.28': 360 | resolution: {integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==} 361 | 362 | ast-kit@0.12.1: 363 | resolution: {integrity: sha512-O+33g7x6irsESUcd47KdfWUrS2F6aGp9KeVJFGj0YjIznfXpBxVGjA0w+y/1OKqX4mFOfmZ9Xpf1ixPT4n9xxw==} 364 | engines: {node: '>=16.14.0'} 365 | 366 | ast-walker-scope@0.6.1: 367 | resolution: {integrity: sha512-0ZdQEsSfH3mX4BFbRCc3xOBjx5bDbm73+aAdQOHerPQNf8K0XFMAv79ucd2BpnSc4UMyvBDixiroT8yjm2Y6bw==} 368 | engines: {node: '>=16.14.0'} 369 | 370 | csstype@3.1.3: 371 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 372 | 373 | detect-libc@1.0.3: 374 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 375 | engines: {node: '>=0.10'} 376 | hasBin: true 377 | 378 | dotenv@16.4.5: 379 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 380 | engines: {node: '>=12'} 381 | 382 | esbuild-css-modules-plugin@3.1.0: 383 | resolution: {integrity: sha512-3+BYIKHlGqhL1/9FbWFUD3bGyxR9+H0wGHH2QpzqJZ5UIYBwr6oyWspio3YGgZeJvzstiOgX+UdY7MBaXt+aAg==} 384 | engines: {node: '>= 16.20.0'} 385 | peerDependencies: 386 | esbuild: '*' 387 | 388 | esbuild@0.19.12: 389 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 390 | engines: {node: '>=12'} 391 | hasBin: true 392 | 393 | esbuild@0.20.2: 394 | resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} 395 | engines: {node: '>=12'} 396 | hasBin: true 397 | 398 | esno@4.7.0: 399 | resolution: {integrity: sha512-81owrjxIxOwqcABt20U09Wn8lpBo9K6ttqbGvQcB3VYNLJyaV1fvKkDtpZd3Rj5BX3WXiGiJCjUevKQGNICzJg==} 400 | hasBin: true 401 | 402 | exenv-es6@1.1.1: 403 | resolution: {integrity: sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==} 404 | 405 | fsevents@2.3.3: 406 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 407 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 408 | os: [darwin] 409 | 410 | get-tsconfig@4.7.3: 411 | resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} 412 | 413 | idb-keyval@6.2.1: 414 | resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} 415 | 416 | jsx-dom@8.1.3: 417 | resolution: {integrity: sha512-TQNVHkUui+6rTPL8nqaM5izAcfqzM1lCLnLj2KU/xnecDuMX0MtaBN3evoF89Nz1d984Pi6wXcqoCOltWVzm9Q==} 418 | 419 | lightningcss-darwin-arm64@1.24.1: 420 | resolution: {integrity: sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w==} 421 | engines: {node: '>= 12.0.0'} 422 | cpu: [arm64] 423 | os: [darwin] 424 | 425 | lightningcss-darwin-x64@1.24.1: 426 | resolution: {integrity: sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ==} 427 | engines: {node: '>= 12.0.0'} 428 | cpu: [x64] 429 | os: [darwin] 430 | 431 | lightningcss-freebsd-x64@1.24.1: 432 | resolution: {integrity: sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g==} 433 | engines: {node: '>= 12.0.0'} 434 | cpu: [x64] 435 | os: [freebsd] 436 | 437 | lightningcss-linux-arm-gnueabihf@1.24.1: 438 | resolution: {integrity: sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw==} 439 | engines: {node: '>= 12.0.0'} 440 | cpu: [arm] 441 | os: [linux] 442 | 443 | lightningcss-linux-arm64-gnu@1.24.1: 444 | resolution: {integrity: sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg==} 445 | engines: {node: '>= 12.0.0'} 446 | cpu: [arm64] 447 | os: [linux] 448 | 449 | lightningcss-linux-arm64-musl@1.24.1: 450 | resolution: {integrity: sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA==} 451 | engines: {node: '>= 12.0.0'} 452 | cpu: [arm64] 453 | os: [linux] 454 | 455 | lightningcss-linux-x64-gnu@1.24.1: 456 | resolution: {integrity: sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw==} 457 | engines: {node: '>= 12.0.0'} 458 | cpu: [x64] 459 | os: [linux] 460 | 461 | lightningcss-linux-x64-musl@1.24.1: 462 | resolution: {integrity: sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw==} 463 | engines: {node: '>= 12.0.0'} 464 | cpu: [x64] 465 | os: [linux] 466 | 467 | lightningcss-win32-x64-msvc@1.24.1: 468 | resolution: {integrity: sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow==} 469 | engines: {node: '>= 12.0.0'} 470 | cpu: [x64] 471 | os: [win32] 472 | 473 | lightningcss@1.24.1: 474 | resolution: {integrity: sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg==} 475 | engines: {node: '>= 12.0.0'} 476 | 477 | lodash-es@4.17.21: 478 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 479 | 480 | magic-string-ast@0.3.0: 481 | resolution: {integrity: sha512-0shqecEPgdFpnI3AP90epXyxZy9g6CRZ+SZ7BcqFwYmtFEnZ1jpevcV5HoyVnlDS9gCnc1UIg3Rsvp3Ci7r8OA==} 482 | engines: {node: '>=16.14.0'} 483 | 484 | magic-string@0.30.8: 485 | resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} 486 | engines: {node: '>=12'} 487 | 488 | pathe@1.1.2: 489 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 490 | 491 | resolve-pkg-maps@1.0.0: 492 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 493 | 494 | tabbable@5.3.3: 495 | resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} 496 | 497 | to-fast-properties@2.0.0: 498 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 499 | engines: {node: '>=4'} 500 | 501 | tslib@1.14.1: 502 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 503 | 504 | tslib@2.6.2: 505 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 506 | 507 | tsx@4.7.1: 508 | resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} 509 | engines: {node: '>=18.0.0'} 510 | hasBin: true 511 | 512 | undici-types@5.26.5: 513 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 514 | 515 | snapshots: 516 | 517 | '@babel/helper-string-parser@7.23.4': {} 518 | 519 | '@babel/helper-validator-identifier@7.22.20': {} 520 | 521 | '@babel/parser@7.24.0': 522 | dependencies: 523 | '@babel/types': 7.24.0 524 | 525 | '@babel/types@7.24.0': 526 | dependencies: 527 | '@babel/helper-string-parser': 7.23.4 528 | '@babel/helper-validator-identifier': 7.22.20 529 | to-fast-properties: 2.0.0 530 | 531 | '@esbuild/aix-ppc64@0.19.12': 532 | optional: true 533 | 534 | '@esbuild/aix-ppc64@0.20.2': 535 | optional: true 536 | 537 | '@esbuild/android-arm64@0.19.12': 538 | optional: true 539 | 540 | '@esbuild/android-arm64@0.20.2': 541 | optional: true 542 | 543 | '@esbuild/android-arm@0.19.12': 544 | optional: true 545 | 546 | '@esbuild/android-arm@0.20.2': 547 | optional: true 548 | 549 | '@esbuild/android-x64@0.19.12': 550 | optional: true 551 | 552 | '@esbuild/android-x64@0.20.2': 553 | optional: true 554 | 555 | '@esbuild/darwin-arm64@0.19.12': 556 | optional: true 557 | 558 | '@esbuild/darwin-arm64@0.20.2': 559 | optional: true 560 | 561 | '@esbuild/darwin-x64@0.19.12': 562 | optional: true 563 | 564 | '@esbuild/darwin-x64@0.20.2': 565 | optional: true 566 | 567 | '@esbuild/freebsd-arm64@0.19.12': 568 | optional: true 569 | 570 | '@esbuild/freebsd-arm64@0.20.2': 571 | optional: true 572 | 573 | '@esbuild/freebsd-x64@0.19.12': 574 | optional: true 575 | 576 | '@esbuild/freebsd-x64@0.20.2': 577 | optional: true 578 | 579 | '@esbuild/linux-arm64@0.19.12': 580 | optional: true 581 | 582 | '@esbuild/linux-arm64@0.20.2': 583 | optional: true 584 | 585 | '@esbuild/linux-arm@0.19.12': 586 | optional: true 587 | 588 | '@esbuild/linux-arm@0.20.2': 589 | optional: true 590 | 591 | '@esbuild/linux-ia32@0.19.12': 592 | optional: true 593 | 594 | '@esbuild/linux-ia32@0.20.2': 595 | optional: true 596 | 597 | '@esbuild/linux-loong64@0.19.12': 598 | optional: true 599 | 600 | '@esbuild/linux-loong64@0.20.2': 601 | optional: true 602 | 603 | '@esbuild/linux-mips64el@0.19.12': 604 | optional: true 605 | 606 | '@esbuild/linux-mips64el@0.20.2': 607 | optional: true 608 | 609 | '@esbuild/linux-ppc64@0.19.12': 610 | optional: true 611 | 612 | '@esbuild/linux-ppc64@0.20.2': 613 | optional: true 614 | 615 | '@esbuild/linux-riscv64@0.19.12': 616 | optional: true 617 | 618 | '@esbuild/linux-riscv64@0.20.2': 619 | optional: true 620 | 621 | '@esbuild/linux-s390x@0.19.12': 622 | optional: true 623 | 624 | '@esbuild/linux-s390x@0.20.2': 625 | optional: true 626 | 627 | '@esbuild/linux-x64@0.19.12': 628 | optional: true 629 | 630 | '@esbuild/linux-x64@0.20.2': 631 | optional: true 632 | 633 | '@esbuild/netbsd-x64@0.19.12': 634 | optional: true 635 | 636 | '@esbuild/netbsd-x64@0.20.2': 637 | optional: true 638 | 639 | '@esbuild/openbsd-x64@0.19.12': 640 | optional: true 641 | 642 | '@esbuild/openbsd-x64@0.20.2': 643 | optional: true 644 | 645 | '@esbuild/sunos-x64@0.19.12': 646 | optional: true 647 | 648 | '@esbuild/sunos-x64@0.20.2': 649 | optional: true 650 | 651 | '@esbuild/win32-arm64@0.19.12': 652 | optional: true 653 | 654 | '@esbuild/win32-arm64@0.20.2': 655 | optional: true 656 | 657 | '@esbuild/win32-ia32@0.19.12': 658 | optional: true 659 | 660 | '@esbuild/win32-ia32@0.20.2': 661 | optional: true 662 | 663 | '@esbuild/win32-x64@0.19.12': 664 | optional: true 665 | 666 | '@esbuild/win32-x64@0.20.2': 667 | optional: true 668 | 669 | '@fluentui/web-components@2.5.17': 670 | dependencies: 671 | '@microsoft/fast-colors': 5.3.1 672 | '@microsoft/fast-element': 1.12.0 673 | '@microsoft/fast-foundation': 2.49.5 674 | '@microsoft/fast-web-utilities': 5.4.1 675 | tslib: 2.6.2 676 | 677 | '@jridgewell/sourcemap-codec@1.4.15': {} 678 | 679 | '@microsoft/fast-colors@5.3.1': {} 680 | 681 | '@microsoft/fast-element@1.12.0': {} 682 | 683 | '@microsoft/fast-foundation@2.49.5': 684 | dependencies: 685 | '@microsoft/fast-element': 1.12.0 686 | '@microsoft/fast-web-utilities': 5.4.1 687 | tabbable: 5.3.3 688 | tslib: 1.14.1 689 | 690 | '@microsoft/fast-web-utilities@5.4.1': 691 | dependencies: 692 | exenv-es6: 1.1.1 693 | 694 | '@types/node@20.11.28': 695 | dependencies: 696 | undici-types: 5.26.5 697 | 698 | ast-kit@0.12.1: 699 | dependencies: 700 | '@babel/parser': 7.24.0 701 | pathe: 1.1.2 702 | 703 | ast-walker-scope@0.6.1: 704 | dependencies: 705 | '@babel/parser': 7.24.0 706 | ast-kit: 0.12.1 707 | 708 | csstype@3.1.3: {} 709 | 710 | detect-libc@1.0.3: {} 711 | 712 | dotenv@16.4.5: {} 713 | 714 | esbuild-css-modules-plugin@3.1.0(esbuild@0.20.2): 715 | dependencies: 716 | esbuild: 0.20.2 717 | lightningcss: 1.24.1 718 | lodash-es: 4.17.21 719 | 720 | esbuild@0.19.12: 721 | optionalDependencies: 722 | '@esbuild/aix-ppc64': 0.19.12 723 | '@esbuild/android-arm': 0.19.12 724 | '@esbuild/android-arm64': 0.19.12 725 | '@esbuild/android-x64': 0.19.12 726 | '@esbuild/darwin-arm64': 0.19.12 727 | '@esbuild/darwin-x64': 0.19.12 728 | '@esbuild/freebsd-arm64': 0.19.12 729 | '@esbuild/freebsd-x64': 0.19.12 730 | '@esbuild/linux-arm': 0.19.12 731 | '@esbuild/linux-arm64': 0.19.12 732 | '@esbuild/linux-ia32': 0.19.12 733 | '@esbuild/linux-loong64': 0.19.12 734 | '@esbuild/linux-mips64el': 0.19.12 735 | '@esbuild/linux-ppc64': 0.19.12 736 | '@esbuild/linux-riscv64': 0.19.12 737 | '@esbuild/linux-s390x': 0.19.12 738 | '@esbuild/linux-x64': 0.19.12 739 | '@esbuild/netbsd-x64': 0.19.12 740 | '@esbuild/openbsd-x64': 0.19.12 741 | '@esbuild/sunos-x64': 0.19.12 742 | '@esbuild/win32-arm64': 0.19.12 743 | '@esbuild/win32-ia32': 0.19.12 744 | '@esbuild/win32-x64': 0.19.12 745 | 746 | esbuild@0.20.2: 747 | optionalDependencies: 748 | '@esbuild/aix-ppc64': 0.20.2 749 | '@esbuild/android-arm': 0.20.2 750 | '@esbuild/android-arm64': 0.20.2 751 | '@esbuild/android-x64': 0.20.2 752 | '@esbuild/darwin-arm64': 0.20.2 753 | '@esbuild/darwin-x64': 0.20.2 754 | '@esbuild/freebsd-arm64': 0.20.2 755 | '@esbuild/freebsd-x64': 0.20.2 756 | '@esbuild/linux-arm': 0.20.2 757 | '@esbuild/linux-arm64': 0.20.2 758 | '@esbuild/linux-ia32': 0.20.2 759 | '@esbuild/linux-loong64': 0.20.2 760 | '@esbuild/linux-mips64el': 0.20.2 761 | '@esbuild/linux-ppc64': 0.20.2 762 | '@esbuild/linux-riscv64': 0.20.2 763 | '@esbuild/linux-s390x': 0.20.2 764 | '@esbuild/linux-x64': 0.20.2 765 | '@esbuild/netbsd-x64': 0.20.2 766 | '@esbuild/openbsd-x64': 0.20.2 767 | '@esbuild/sunos-x64': 0.20.2 768 | '@esbuild/win32-arm64': 0.20.2 769 | '@esbuild/win32-ia32': 0.20.2 770 | '@esbuild/win32-x64': 0.20.2 771 | 772 | esno@4.7.0: 773 | dependencies: 774 | tsx: 4.7.1 775 | 776 | exenv-es6@1.1.1: {} 777 | 778 | fsevents@2.3.3: 779 | optional: true 780 | 781 | get-tsconfig@4.7.3: 782 | dependencies: 783 | resolve-pkg-maps: 1.0.0 784 | 785 | idb-keyval@6.2.1: {} 786 | 787 | jsx-dom@8.1.3: 788 | dependencies: 789 | csstype: 3.1.3 790 | 791 | lightningcss-darwin-arm64@1.24.1: 792 | optional: true 793 | 794 | lightningcss-darwin-x64@1.24.1: 795 | optional: true 796 | 797 | lightningcss-freebsd-x64@1.24.1: 798 | optional: true 799 | 800 | lightningcss-linux-arm-gnueabihf@1.24.1: 801 | optional: true 802 | 803 | lightningcss-linux-arm64-gnu@1.24.1: 804 | optional: true 805 | 806 | lightningcss-linux-arm64-musl@1.24.1: 807 | optional: true 808 | 809 | lightningcss-linux-x64-gnu@1.24.1: 810 | optional: true 811 | 812 | lightningcss-linux-x64-musl@1.24.1: 813 | optional: true 814 | 815 | lightningcss-win32-x64-msvc@1.24.1: 816 | optional: true 817 | 818 | lightningcss@1.24.1: 819 | dependencies: 820 | detect-libc: 1.0.3 821 | optionalDependencies: 822 | lightningcss-darwin-arm64: 1.24.1 823 | lightningcss-darwin-x64: 1.24.1 824 | lightningcss-freebsd-x64: 1.24.1 825 | lightningcss-linux-arm-gnueabihf: 1.24.1 826 | lightningcss-linux-arm64-gnu: 1.24.1 827 | lightningcss-linux-arm64-musl: 1.24.1 828 | lightningcss-linux-x64-gnu: 1.24.1 829 | lightningcss-linux-x64-musl: 1.24.1 830 | lightningcss-win32-x64-msvc: 1.24.1 831 | 832 | lodash-es@4.17.21: {} 833 | 834 | magic-string-ast@0.3.0: 835 | dependencies: 836 | magic-string: 0.30.8 837 | 838 | magic-string@0.30.8: 839 | dependencies: 840 | '@jridgewell/sourcemap-codec': 1.4.15 841 | 842 | pathe@1.1.2: {} 843 | 844 | resolve-pkg-maps@1.0.0: {} 845 | 846 | tabbable@5.3.3: {} 847 | 848 | to-fast-properties@2.0.0: {} 849 | 850 | tslib@1.14.1: {} 851 | 852 | tslib@2.6.2: {} 853 | 854 | tsx@4.7.1: 855 | dependencies: 856 | esbuild: 0.19.12 857 | get-tsconfig: 4.7.3 858 | optionalDependencies: 859 | fsevents: 2.3.3 860 | 861 | undici-types@5.26.5: {} 862 | --------------------------------------------------------------------------------