@double_seven/swpm 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ja.md +81 -0
- package/README.ko.md +81 -0
- package/README.md +81 -0
- package/README.zh-CN.md +81 -0
- package/README.zh-TW.md +81 -0
- package/dist/commands/export.d.ts +1 -0
- package/dist/commands/export.js +59 -0
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +20 -0
- package/dist/commands/lang.d.ts +2 -0
- package/dist/commands/lang.js +82 -0
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +26 -0
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.js +26 -0
- package/dist/commands/sync.d.ts +1 -0
- package/dist/commands/sync.js +70 -0
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +70 -0
- package/dist/commands/upgrade.d.ts +1 -0
- package/dist/commands/upgrade.js +106 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +37 -0
- package/dist/i18n/en.json +81 -0
- package/dist/i18n/index.d.ts +14 -0
- package/dist/i18n/index.js +57 -0
- package/dist/i18n/ja.json +81 -0
- package/dist/i18n/ko.json +81 -0
- package/dist/i18n/zh-CN.json +81 -0
- package/dist/i18n/zh-TW.json +81 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +88 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.js +2 -0
- package/dist/ui/selector.d.ts +4 -0
- package/dist/ui/selector.js +86 -0
- package/dist/ui/spinner.d.ts +8 -0
- package/dist/ui/spinner.js +26 -0
- package/dist/ui/table.d.ts +2 -0
- package/dist/ui/table.js +31 -0
- package/dist/winget/client.d.ts +13 -0
- package/dist/winget/client.js +94 -0
- package/dist/winget/parser.d.ts +4 -0
- package/dist/winget/parser.js +303 -0
- package/package.json +61 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.syncCommand = syncCommand;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
11
|
+
const client_1 = require("../winget/client");
|
|
12
|
+
const spinner_1 = require("../ui/spinner");
|
|
13
|
+
const i18n_1 = require("../i18n");
|
|
14
|
+
async function syncCommand(configPath) {
|
|
15
|
+
const filePath = path_1.default.resolve(configPath);
|
|
16
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
17
|
+
console.error(chalk_1.default.red(`✗ ${(0, i18n_1.t)("sync.configNotFound", filePath)}`));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
let config;
|
|
21
|
+
try {
|
|
22
|
+
const raw = fs_1.default.readFileSync(filePath, "utf-8");
|
|
23
|
+
config = js_yaml_1.default.load(raw);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.error(chalk_1.default.red(`✗ ${(0, i18n_1.t)("sync.configParseFail", err.message)}`));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
if (!config.packages || !Array.isArray(config.packages) || config.packages.length === 0) {
|
|
30
|
+
console.error(chalk_1.default.red(`✗ ${(0, i18n_1.t)("sync.noPackages")}`));
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
const wanted = new Set(config.packages.map((s) => s.trim()));
|
|
34
|
+
spinner_1.spinner.start((0, i18n_1.t)("sync.getting"));
|
|
35
|
+
let installed;
|
|
36
|
+
try {
|
|
37
|
+
installed = new Set((0, client_1.listInstalled)().map((p) => p.id).filter(Boolean));
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
spinner_1.spinner.stop();
|
|
41
|
+
console.error(chalk_1.default.red(`✗ ${(0, i18n_1.t)("sync.fail")}: ${err.message}`));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
spinner_1.spinner.stop();
|
|
45
|
+
const missing = [...wanted].filter((id) => !installed.has(id));
|
|
46
|
+
if (missing.length === 0) {
|
|
47
|
+
console.log(chalk_1.default.green(`\n✓ ${(0, i18n_1.t)("sync.allInstalled")}\n`));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk_1.default.cyan(`\n${(0, i18n_1.t)("sync.starting", wanted.size, missing.length)}\n`));
|
|
51
|
+
let ok = 0;
|
|
52
|
+
for (let i = 0; i < missing.length; i++) {
|
|
53
|
+
const id = missing[i];
|
|
54
|
+
console.log(chalk_1.default.cyan(`[${i + 1}/${missing.length}] ${id}`));
|
|
55
|
+
try {
|
|
56
|
+
await (0, client_1.install)(id);
|
|
57
|
+
console.log(chalk_1.default.green(` ✓ ${(0, i18n_1.t)("install.success")}\n`));
|
|
58
|
+
ok++;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(chalk_1.default.red(` ✗ ${err.message}\n`));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log(chalk_1.default.bold(`── ${(0, i18n_1.t)("sync.summary")} ──`));
|
|
65
|
+
console.log(chalk_1.default.green(` ✓ ${(0, i18n_1.t)("sync.successCount")}: ${ok}`));
|
|
66
|
+
if (ok < missing.length) {
|
|
67
|
+
console.log(chalk_1.default.red(` ✗ ${(0, i18n_1.t)("sync.failCount")}: ${missing.length - ok}`));
|
|
68
|
+
}
|
|
69
|
+
console.log("");
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function uninstallCommand(id: string | undefined): Promise<void>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.uninstallCommand = uninstallCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const client_1 = require("../winget/client");
|
|
9
|
+
const spinner_1 = require("../ui/spinner");
|
|
10
|
+
const selector_1 = require("../ui/selector");
|
|
11
|
+
const i18n_1 = require("../i18n");
|
|
12
|
+
async function uninstallCommand(id) {
|
|
13
|
+
// Single package mode
|
|
14
|
+
if (id) {
|
|
15
|
+
console.log(chalk_1.default.cyan(`${(0, i18n_1.t)("uninstall.uninstalling")} ${id}...\n`));
|
|
16
|
+
try {
|
|
17
|
+
await (0, client_1.uninstall)(id);
|
|
18
|
+
console.log(chalk_1.default.green(`\n✓ ${id} ${(0, i18n_1.t)("uninstall.success")}\n`));
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error(chalk_1.default.red(`\n✗ ${(0, i18n_1.t)("uninstall.fail")}: ${err.message}`));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Interactive mode
|
|
27
|
+
spinner_1.spinner.start((0, i18n_1.t)("uninstall.getting"));
|
|
28
|
+
let packages;
|
|
29
|
+
try {
|
|
30
|
+
packages = (0, client_1.listInstalled)();
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
spinner_1.spinner.stop();
|
|
34
|
+
console.error(chalk_1.default.red(`✗ ${(0, i18n_1.t)("uninstall.fail")}: ${err.message}`));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
spinner_1.spinner.stop();
|
|
38
|
+
let selected;
|
|
39
|
+
try {
|
|
40
|
+
selected = await (0, selector_1.selectUninstallPackages)(packages);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
console.log(chalk_1.default.gray(`\n${(0, i18n_1.t)("upgrade.cancelled")}\n`));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (selected.length === 0) {
|
|
47
|
+
console.log(chalk_1.default.gray(`${(0, i18n_1.t)("upgrade.noSelection")}\n`));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk_1.default.bold(`\n${(0, i18n_1.t)("uninstall.starting", selected.length)}\n`));
|
|
51
|
+
let ok = 0;
|
|
52
|
+
for (let i = 0; i < selected.length; i++) {
|
|
53
|
+
const pkg = selected[i];
|
|
54
|
+
console.log(chalk_1.default.cyan(`[${i + 1}/${selected.length}] ${pkg.name} (${pkg.id})`));
|
|
55
|
+
try {
|
|
56
|
+
await (0, client_1.uninstall)(pkg.id);
|
|
57
|
+
console.log(chalk_1.default.green(` ✓ ${(0, i18n_1.t)("uninstall.success")}\n`));
|
|
58
|
+
ok++;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(chalk_1.default.red(` ✗ ${err.message}\n`));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log(chalk_1.default.bold(`── ${(0, i18n_1.t)("uninstall.summary")} ──`));
|
|
65
|
+
console.log(chalk_1.default.green(` ✓ ${(0, i18n_1.t)("upgrade.successCount")}: ${ok}`));
|
|
66
|
+
if (ok < selected.length) {
|
|
67
|
+
console.log(chalk_1.default.red(` ✗ ${(0, i18n_1.t)("upgrade.failCount")}: ${selected.length - ok}`));
|
|
68
|
+
}
|
|
69
|
+
console.log("");
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function upgradeCommand(target: string | undefined, all: boolean): Promise<void>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.upgradeCommand = upgradeCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const client_1 = require("../winget/client");
|
|
9
|
+
const spinner_1 = require("../ui/spinner");
|
|
10
|
+
const selector_1 = require("../ui/selector");
|
|
11
|
+
const i18n_1 = require("../i18n");
|
|
12
|
+
async function upgradeCommand(target, all) {
|
|
13
|
+
if (target) {
|
|
14
|
+
console.log(chalk_1.default.cyan(`${(0, i18n_1.t)("upgrade.upgrading")} ${target}...\n`));
|
|
15
|
+
try {
|
|
16
|
+
const resolvedId = await (0, client_1.upgradePackage)({ id: target, name: "", version: "" });
|
|
17
|
+
console.log(chalk_1.default.green(`\n✓ ${resolvedId} ${(0, i18n_1.t)("upgrade.success")}\n`));
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
console.error(chalk_1.default.red(`\n✗ ${(0, i18n_1.t)("upgrade.fail")}: ${err.message}`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (all) {
|
|
26
|
+
console.log(chalk_1.default.cyan(`${(0, i18n_1.t)("upgrade.all")}...\n`));
|
|
27
|
+
try {
|
|
28
|
+
await (0, client_1.upgradeAll)();
|
|
29
|
+
console.log(chalk_1.default.green(`\n✓ ${(0, i18n_1.t)("upgrade.success")}\n`));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.error(chalk_1.default.red(`\n✗ ${(0, i18n_1.t)("upgrade.fail")}: ${err.message}`));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// interactive mode
|
|
38
|
+
spinner_1.spinner.start((0, i18n_1.t)("upgrade.checking"));
|
|
39
|
+
let upgrades;
|
|
40
|
+
try {
|
|
41
|
+
upgrades = (0, client_1.getUpgrades)();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
spinner_1.spinner.stop();
|
|
45
|
+
console.error(chalk_1.default.red(`✗ ${(0, i18n_1.t)("upgrade.fail")}: ${err.message}`));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
spinner_1.spinner.stop();
|
|
49
|
+
if (upgrades.length === 0) {
|
|
50
|
+
console.log(chalk_1.default.green((0, i18n_1.t)("upgrade.allUpToDate")) + "\n");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let selected;
|
|
54
|
+
try {
|
|
55
|
+
selected = await (0, selector_1.selectPackages)(upgrades);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
console.log(chalk_1.default.gray(`\n${(0, i18n_1.t)("upgrade.cancelled")}\n`));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (selected.length === 0) {
|
|
62
|
+
console.log(chalk_1.default.gray(`${(0, i18n_1.t)("upgrade.noSelection")}\n`));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
console.log(chalk_1.default.bold(`\n${(0, i18n_1.t)("upgrade.starting", selected.length)}\n`));
|
|
66
|
+
const results = [];
|
|
67
|
+
for (let i = 0; i < selected.length; i++) {
|
|
68
|
+
const pkg = selected[i];
|
|
69
|
+
console.log(chalk_1.default.cyan(`[${i + 1}/${selected.length}] ${pkg.name} (${pkg.id})`));
|
|
70
|
+
try {
|
|
71
|
+
const resolvedId = await (0, client_1.upgradePackage)(pkg);
|
|
72
|
+
console.log(chalk_1.default.green(` ✓ ${(0, i18n_1.t)("upgrade.success")}\n`));
|
|
73
|
+
results.push({
|
|
74
|
+
id: resolvedId,
|
|
75
|
+
name: pkg.name,
|
|
76
|
+
oldVersion: pkg.version,
|
|
77
|
+
newVersion: pkg.available || "?",
|
|
78
|
+
success: true,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(chalk_1.default.red(` ✗ ${err.message}\n`));
|
|
83
|
+
results.push({
|
|
84
|
+
id: pkg.id,
|
|
85
|
+
name: pkg.name,
|
|
86
|
+
oldVersion: pkg.version,
|
|
87
|
+
newVersion: pkg.available || "?",
|
|
88
|
+
success: false,
|
|
89
|
+
error: err.message,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const successCount = results.filter((r) => r.success).length;
|
|
94
|
+
const failCount = results.filter((r) => !r.success).length;
|
|
95
|
+
console.log(chalk_1.default.bold(`── ${(0, i18n_1.t)("upgrade.summary")} ──`));
|
|
96
|
+
console.log(chalk_1.default.green(` ✓ ${(0, i18n_1.t)("upgrade.successCount")}: ${successCount}`));
|
|
97
|
+
if (failCount > 0) {
|
|
98
|
+
console.log(chalk_1.default.red(` ✗ ${(0, i18n_1.t)("upgrade.failCount")}: ${failCount}`));
|
|
99
|
+
for (const r of results) {
|
|
100
|
+
if (!r.success) {
|
|
101
|
+
console.log(chalk_1.default.red(` - ${r.name}: ${r.error}`));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
console.log("");
|
|
106
|
+
}
|
package/dist/config.d.ts
ADDED
package/dist/config.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readConfig = readConfig;
|
|
7
|
+
exports.writeConfig = writeConfig;
|
|
8
|
+
exports.getConfigDir = getConfigDir;
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const os_1 = __importDefault(require("os"));
|
|
12
|
+
const configDir = path_1.default.join(os_1.default.homedir(), ".swpm");
|
|
13
|
+
const configFile = path_1.default.join(configDir, "config.json");
|
|
14
|
+
function ensureConfigDir() {
|
|
15
|
+
if (!fs_1.default.existsSync(configDir)) {
|
|
16
|
+
fs_1.default.mkdirSync(configDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function readConfig() {
|
|
20
|
+
try {
|
|
21
|
+
ensureConfigDir();
|
|
22
|
+
if (fs_1.default.existsSync(configFile)) {
|
|
23
|
+
return JSON.parse(fs_1.default.readFileSync(configFile, "utf-8"));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// ignore
|
|
28
|
+
}
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
function writeConfig(config) {
|
|
32
|
+
ensureConfigDir();
|
|
33
|
+
fs_1.default.writeFileSync(configFile, JSON.stringify(config, null, 2), "utf-8");
|
|
34
|
+
}
|
|
35
|
+
function getConfigDir() {
|
|
36
|
+
return configDir;
|
|
37
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "English",
|
|
3
|
+
"nativeName": "English",
|
|
4
|
+
"list.description": "List installed software",
|
|
5
|
+
"search.description": "Search for packages",
|
|
6
|
+
"install.description": "Install a package (use package ID)",
|
|
7
|
+
"uninstall.description": "Uninstall software. Interactive multi-select when no ID given",
|
|
8
|
+
"upgrade.description": "Upgrade package. Interactive mode when no ID given",
|
|
9
|
+
"export.description": "Export installed packages to a YAML file (default ./swpm-packages.yaml)",
|
|
10
|
+
"sync.description": "Sync packages from a YAML config file (install missing ones)",
|
|
11
|
+
"lang.description": "Change display language",
|
|
12
|
+
"upgrade.all": "Upgrade all upgradable packages",
|
|
13
|
+
"examples": "Examples",
|
|
14
|
+
"examples.list": "List installed software",
|
|
15
|
+
"examples.search": "Search for packages",
|
|
16
|
+
"examples.install": "Install a package",
|
|
17
|
+
"examples.uninstall": "Uninstall a package",
|
|
18
|
+
"examples.upgrade": "Interactive upgrade",
|
|
19
|
+
"examples.upgradeAll": "Upgrade all packages",
|
|
20
|
+
"examples.upgradeOne": "Upgrade a single package",
|
|
21
|
+
"examples.export": "Export installed packages",
|
|
22
|
+
"examples.exportPath": "Export to custom path",
|
|
23
|
+
"examples.sync": "Sync missing packages",
|
|
24
|
+
"examples.lang": "Change language",
|
|
25
|
+
"winget.tip": "Tip: If winget is broken, run this in PowerShell to fix it",
|
|
26
|
+
"install.installing": "Installing",
|
|
27
|
+
"install.success": "Install complete",
|
|
28
|
+
"install.fail": "Install failed",
|
|
29
|
+
"uninstall.uninstalling": "Uninstalling",
|
|
30
|
+
"uninstall.success": "Uninstall complete",
|
|
31
|
+
"uninstall.fail": "Uninstall failed",
|
|
32
|
+
"upgrade.upgrading": "Upgrading",
|
|
33
|
+
"upgrade.success": "Upgrade complete",
|
|
34
|
+
"upgrade.fail": "Upgrade failed",
|
|
35
|
+
"upgrade.checking": "Checking for updates...",
|
|
36
|
+
"upgrade.allUpToDate": "All packages are up to date!",
|
|
37
|
+
"upgrade.select": "Select packages to upgrade (space to toggle, enter to confirm)",
|
|
38
|
+
"upgrade.starting": "Starting upgrade of {0} package(s)...",
|
|
39
|
+
"upgrade.summary": "Upgrade Summary",
|
|
40
|
+
"upgrade.successCount": "Succeeded",
|
|
41
|
+
"upgrade.failCount": "Failed",
|
|
42
|
+
"upgrade.cancelled": "Cancelled.",
|
|
43
|
+
"upgrade.noSelection": "No packages selected, cancelled.",
|
|
44
|
+
"export.getting": "Fetching installed software...",
|
|
45
|
+
"export.fail": "Failed to fetch software list",
|
|
46
|
+
"export.resolving": "Resolving {0} truncated ID(s)...",
|
|
47
|
+
"export.exported": "Exported {0} package(s) to {1}",
|
|
48
|
+
"export.cancelled": "Cancelled.",
|
|
49
|
+
"export.noSelection": "No packages selected, cancelled.",
|
|
50
|
+
"export.noPackages": "No packages to export.",
|
|
51
|
+
"export.select": "Select packages to export (space to toggle, enter to confirm)",
|
|
52
|
+
"sync.reading": "Reading config file...",
|
|
53
|
+
"sync.configNotFound": "Config file not found: {0}",
|
|
54
|
+
"sync.configParseFail": "Failed to read config file: {0}",
|
|
55
|
+
"sync.noPackages": "No packages list found in config file",
|
|
56
|
+
"sync.getting": "Fetching installed software...",
|
|
57
|
+
"sync.fail": "Failed to fetch software list",
|
|
58
|
+
"sync.allInstalled": "All packages already installed!",
|
|
59
|
+
"sync.starting": "{0} target(s), {1} missing, installing...",
|
|
60
|
+
"sync.summary": "Sync Summary",
|
|
61
|
+
"sync.successCount": "Succeeded",
|
|
62
|
+
"sync.failCount": "Failed",
|
|
63
|
+
"search.searching": "Searching for \"{0}\"...",
|
|
64
|
+
"search.results": "Search results for \"{0}\" ({1} found)",
|
|
65
|
+
"search.fail": "Search failed",
|
|
66
|
+
"list.getting": "Fetching installed software...",
|
|
67
|
+
"list.fail": "Failed to fetch software list",
|
|
68
|
+
"lang.prompt": "Select language",
|
|
69
|
+
"lang.current": "Current language",
|
|
70
|
+
"lang.switched": "Language changed: {0} ({1})",
|
|
71
|
+
"lang.firstRun": "Welcome to swpm! Please select a language:",
|
|
72
|
+
"executing": "Running",
|
|
73
|
+
"exitCode": "exit code",
|
|
74
|
+
"signal": "signal",
|
|
75
|
+
"launchFail": "Failed to launch winget",
|
|
76
|
+
"uninstall.getting": "Fetching installed software...",
|
|
77
|
+
"uninstall.starting": "Starting uninstall of {0} package(s)...",
|
|
78
|
+
"uninstall.summary": "Uninstall Summary",
|
|
79
|
+
"uninstall.noPackages": "No packages to uninstall.",
|
|
80
|
+
"uninstall.select": "Select packages to uninstall (space to toggle, enter to confirm)"
|
|
81
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Translations {
|
|
2
|
+
[key: string]: string;
|
|
3
|
+
}
|
|
4
|
+
export interface LangInfo {
|
|
5
|
+
code: string;
|
|
6
|
+
name: string;
|
|
7
|
+
nativeName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const LANGS: Record<string, LangInfo>;
|
|
10
|
+
export declare function setLang(code: string): void;
|
|
11
|
+
export declare function getLang(): string;
|
|
12
|
+
export declare function getLangInfo(code: string): LangInfo | undefined;
|
|
13
|
+
export declare function getSupportedLangs(): LangInfo[];
|
|
14
|
+
export declare function t(key: string, ...args: (string | number)[]): string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LANGS = void 0;
|
|
7
|
+
exports.setLang = setLang;
|
|
8
|
+
exports.getLang = getLang;
|
|
9
|
+
exports.getLangInfo = getLangInfo;
|
|
10
|
+
exports.getSupportedLangs = getSupportedLangs;
|
|
11
|
+
exports.t = t;
|
|
12
|
+
const en_json_1 = __importDefault(require("./en.json"));
|
|
13
|
+
const zh_CN_json_1 = __importDefault(require("./zh-CN.json"));
|
|
14
|
+
const zh_TW_json_1 = __importDefault(require("./zh-TW.json"));
|
|
15
|
+
const ja_json_1 = __importDefault(require("./ja.json"));
|
|
16
|
+
const ko_json_1 = __importDefault(require("./ko.json"));
|
|
17
|
+
exports.LANGS = {
|
|
18
|
+
en: { code: "en", name: "English", nativeName: "English" },
|
|
19
|
+
"zh-CN": { code: "zh-CN", name: "简体中文", nativeName: "简体中文" },
|
|
20
|
+
"zh-TW": { code: "zh-TW", name: "繁體中文", nativeName: "繁體中文" },
|
|
21
|
+
ja: { code: "ja", name: "日本語", nativeName: "日本語" },
|
|
22
|
+
ko: { code: "ko", name: "한국어", nativeName: "한국어" },
|
|
23
|
+
};
|
|
24
|
+
const TRANSLATIONS = {
|
|
25
|
+
en: en_json_1.default,
|
|
26
|
+
"zh-CN": zh_CN_json_1.default,
|
|
27
|
+
"zh-TW": zh_TW_json_1.default,
|
|
28
|
+
ja: ja_json_1.default,
|
|
29
|
+
ko: ko_json_1.default,
|
|
30
|
+
};
|
|
31
|
+
let currentLang = "en";
|
|
32
|
+
function setLang(code) {
|
|
33
|
+
if (TRANSLATIONS[code]) {
|
|
34
|
+
currentLang = code;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function getLang() {
|
|
38
|
+
return currentLang;
|
|
39
|
+
}
|
|
40
|
+
function getLangInfo(code) {
|
|
41
|
+
return exports.LANGS[code];
|
|
42
|
+
}
|
|
43
|
+
function getSupportedLangs() {
|
|
44
|
+
return Object.values(exports.LANGS);
|
|
45
|
+
}
|
|
46
|
+
// Format a translation key with positional arguments {0}, {1}, etc.
|
|
47
|
+
function t(key, ...args) {
|
|
48
|
+
const translations = TRANSLATIONS[currentLang];
|
|
49
|
+
let template;
|
|
50
|
+
if (translations && translations[key]) {
|
|
51
|
+
template = translations[key];
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
template = TRANSLATIONS["en"]?.[key] || key;
|
|
55
|
+
}
|
|
56
|
+
return template.replace(/\{(\d+)\}/g, (_, i) => String(args[parseInt(i, 10)] ?? ""));
|
|
57
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "日本語",
|
|
3
|
+
"nativeName": "日本語",
|
|
4
|
+
"list.description": "インストール済みソフトウェアを一覧表示",
|
|
5
|
+
"search.description": "パッケージを検索",
|
|
6
|
+
"install.description": "パッケージをインストール(パッケージIDを使用)",
|
|
7
|
+
"uninstall.description": "パッケージをアンインストール。ID未指定時はインタラクティブモード",
|
|
8
|
+
"upgrade.description": "パッケージをアップグレード。ID未指定時はインタラクティブモード",
|
|
9
|
+
"export.description": "インストール済みパッケージをYAMLファイルにエクスポート(デフォルト ./swpm-packages.yaml)",
|
|
10
|
+
"sync.description": "YAML設定ファイルからパッケージを同期(不足分をインストール)",
|
|
11
|
+
"lang.description": "表示言語を変更",
|
|
12
|
+
"upgrade.all": "アップグレード可能な全パッケージを更新",
|
|
13
|
+
"examples": "例",
|
|
14
|
+
"examples.list": "インストール済みソフトウェアを表示",
|
|
15
|
+
"examples.search": "パッケージを検索",
|
|
16
|
+
"examples.install": "パッケージをインストール",
|
|
17
|
+
"examples.uninstall": "パッケージをアンインストール",
|
|
18
|
+
"examples.upgrade": "インタラクティブアップグレード",
|
|
19
|
+
"examples.upgradeAll": "全パッケージを一括更新",
|
|
20
|
+
"examples.upgradeOne": "単一パッケージを更新",
|
|
21
|
+
"examples.export": "インストール済みパッケージをエクスポート",
|
|
22
|
+
"examples.exportPath": "指定パスにエクスポート",
|
|
23
|
+
"examples.sync": "不足パッケージを同期",
|
|
24
|
+
"examples.lang": "言語を変更",
|
|
25
|
+
"winget.tip": "ヒント:wingetに問題がある場合、PowerShellで以下を実行すると修復できます",
|
|
26
|
+
"install.installing": "インストール中",
|
|
27
|
+
"install.success": "インストール完了",
|
|
28
|
+
"install.fail": "インストール失敗",
|
|
29
|
+
"uninstall.uninstalling": "アンインストール中",
|
|
30
|
+
"uninstall.success": "アンインストール完了",
|
|
31
|
+
"uninstall.fail": "アンインストール失敗",
|
|
32
|
+
"upgrade.upgrading": "アップグレード中",
|
|
33
|
+
"upgrade.success": "アップグレード完了",
|
|
34
|
+
"upgrade.fail": "アップグレード失敗",
|
|
35
|
+
"upgrade.checking": "更新を確認中...",
|
|
36
|
+
"upgrade.allUpToDate": "全てのパッケージが最新です!",
|
|
37
|
+
"upgrade.select": "アップグレードするパッケージを選択(スペースで切替、Enterで確定)",
|
|
38
|
+
"upgrade.starting": "{0}個のパッケージのアップグレードを開始...",
|
|
39
|
+
"upgrade.summary": "アップグレード集計",
|
|
40
|
+
"upgrade.successCount": "成功",
|
|
41
|
+
"upgrade.failCount": "失敗",
|
|
42
|
+
"upgrade.cancelled": "キャンセルされました。",
|
|
43
|
+
"upgrade.noSelection": "パッケージが選択されていません。キャンセルされました。",
|
|
44
|
+
"export.getting": "インストール済みソフトウェアを取得中...",
|
|
45
|
+
"export.fail": "ソフトウェアリストの取得に失敗",
|
|
46
|
+
"export.resolving": "{0}個の切り詰められたIDを解決中...",
|
|
47
|
+
"export.exported": "{0}個のパッケージを{1}にエクスポートしました",
|
|
48
|
+
"export.cancelled": "キャンセルされました。",
|
|
49
|
+
"export.noSelection": "パッケージが選択されていません。キャンセルされました。",
|
|
50
|
+
"export.noPackages": "エクスポート可能なパッケージがありません。",
|
|
51
|
+
"export.select": "エクスポートするパッケージを選択(スペースで切替、Enterで確定)",
|
|
52
|
+
"sync.reading": "設定ファイルを読み込み中...",
|
|
53
|
+
"sync.configNotFound": "設定ファイルが見つかりません:{0}",
|
|
54
|
+
"sync.configParseFail": "設定ファイルの読み込みに失敗:{0}",
|
|
55
|
+
"sync.noPackages": "設定ファイルにpackagesリストが見つかりません",
|
|
56
|
+
"sync.getting": "インストール済みソフトウェアを取得中...",
|
|
57
|
+
"sync.fail": "ソフトウェアリストの取得に失敗",
|
|
58
|
+
"sync.allInstalled": "全てのパッケージが既にインストールされています!",
|
|
59
|
+
"sync.starting": "全{0}対象中、{1}個不足、インストールを開始...",
|
|
60
|
+
"sync.summary": "同期集計",
|
|
61
|
+
"sync.successCount": "成功",
|
|
62
|
+
"sync.failCount": "失敗",
|
|
63
|
+
"search.searching": "\"{0}\"を検索中...",
|
|
64
|
+
"search.results": "\"{0}\"の検索結果({1}件)",
|
|
65
|
+
"search.fail": "検索失敗",
|
|
66
|
+
"list.getting": "インストール済みソフトウェアを取得中...",
|
|
67
|
+
"list.fail": "ソフトウェアリストの取得に失敗",
|
|
68
|
+
"lang.prompt": "言語を選択",
|
|
69
|
+
"lang.current": "現在の言語",
|
|
70
|
+
"lang.switched": "言語が変更されました:{0} ({1})",
|
|
71
|
+
"lang.firstRun": "swpmへようこそ!言語を選択してください:",
|
|
72
|
+
"executing": "実行中",
|
|
73
|
+
"exitCode": "終了コード",
|
|
74
|
+
"signal": "シグナル",
|
|
75
|
+
"launchFail": "wingetの起動に失敗",
|
|
76
|
+
"uninstall.getting": "インストール済みソフトウェアを取得中...",
|
|
77
|
+
"uninstall.starting": "{0}個のパッケージのアンインストールを開始...",
|
|
78
|
+
"uninstall.summary": "アンインストール集計",
|
|
79
|
+
"uninstall.noPackages": "アンインストール可能なパッケージがありません。",
|
|
80
|
+
"uninstall.select": "アンインストールするパッケージを選択(スペースで切替、Enterで確定)"
|
|
81
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "한국어",
|
|
3
|
+
"nativeName": "한국어",
|
|
4
|
+
"list.description": "설치된 소프트웨어 목록 표시",
|
|
5
|
+
"search.description": "패키지 검색",
|
|
6
|
+
"install.description": "패키지 설치 (패키지 ID 사용)",
|
|
7
|
+
"uninstall.description": "패키지 제거. ID 미지정 시 인터랙티브 모드",
|
|
8
|
+
"upgrade.description": "패키지 업그레이드. ID 미지정 시 인터랙티브 모드",
|
|
9
|
+
"export.description": "설치된 winget 패키지를 YAML 파일로 내보내기 (기본값 ./swpm-packages.yaml)",
|
|
10
|
+
"sync.description": "YAML 설정 파일에서 패키지 동기화 (누락된 패키지 설치)",
|
|
11
|
+
"lang.description": "표시 언어 변경",
|
|
12
|
+
"upgrade.all": "업그레이드 가능한 모든 패키지 업데이트",
|
|
13
|
+
"examples": "예시",
|
|
14
|
+
"examples.list": "설치된 소프트웨어 표시",
|
|
15
|
+
"examples.search": "패키지 검색",
|
|
16
|
+
"examples.install": "패키지 설치",
|
|
17
|
+
"examples.uninstall": "패키지 제거",
|
|
18
|
+
"examples.upgrade": "인터랙티브 업그레이드",
|
|
19
|
+
"examples.upgradeAll": "모든 패키지 일괄 업데이트",
|
|
20
|
+
"examples.upgradeOne": "단일 패키지 업데이트",
|
|
21
|
+
"examples.export": "설치된 패키지 내보내기",
|
|
22
|
+
"examples.exportPath": "지정 경로로 내보내기",
|
|
23
|
+
"examples.sync": "누락된 패키지 동기화",
|
|
24
|
+
"examples.lang": "언어 변경",
|
|
25
|
+
"winget.tip": "팁: winget에 문제가 있는 경우 PowerShell에서 다음을 실행하여 복구할 수 있습니다",
|
|
26
|
+
"install.installing": "설치 중",
|
|
27
|
+
"install.success": "설치 완료",
|
|
28
|
+
"install.fail": "설치 실패",
|
|
29
|
+
"uninstall.uninstalling": "제거 중",
|
|
30
|
+
"uninstall.success": "제거 완료",
|
|
31
|
+
"uninstall.fail": "제거 실패",
|
|
32
|
+
"upgrade.upgrading": "업그레이드 중",
|
|
33
|
+
"upgrade.success": "업그레이드 완료",
|
|
34
|
+
"upgrade.fail": "업그레이드 실패",
|
|
35
|
+
"upgrade.checking": "업데이트 확인 중...",
|
|
36
|
+
"upgrade.allUpToDate": "모든 패키지가 최신 버전입니다!",
|
|
37
|
+
"upgrade.select": "업그레이드할 패키지 선택 (스페이스로 전환, Enter로 확인)",
|
|
38
|
+
"upgrade.starting": "{0}개 패키지 업그레이드 시작...",
|
|
39
|
+
"upgrade.summary": "업그레이드 요약",
|
|
40
|
+
"upgrade.successCount": "성공",
|
|
41
|
+
"upgrade.failCount": "실패",
|
|
42
|
+
"upgrade.cancelled": "취소되었습니다.",
|
|
43
|
+
"upgrade.noSelection": "선택된 패키지가 없습니다. 취소되었습니다.",
|
|
44
|
+
"export.getting": "설치된 소프트웨어 가져오는 중...",
|
|
45
|
+
"export.fail": "소프트웨어 목록 가져오기 실패",
|
|
46
|
+
"export.resolving": "잘린 ID {0}개 해결 중...",
|
|
47
|
+
"export.exported": "{0}개 패키지를 {1}로 내보냈습니다",
|
|
48
|
+
"export.cancelled": "취소되었습니다.",
|
|
49
|
+
"export.noSelection": "선택된 패키지가 없습니다. 취소되었습니다.",
|
|
50
|
+
"export.noPackages": "내보낼 패키지가 없습니다.",
|
|
51
|
+
"export.select": "내보낼 패키지 선택 (스페이스로 전환, Enter로 확인)",
|
|
52
|
+
"sync.reading": "설정 파일 읽는 중...",
|
|
53
|
+
"sync.configNotFound": "설정 파일을 찾을 수 없습니다: {0}",
|
|
54
|
+
"sync.configParseFail": "설정 파일 읽기 실패: {0}",
|
|
55
|
+
"sync.noPackages": "설정 파일에 packages 목록이 없습니다",
|
|
56
|
+
"sync.getting": "설치된 소프트웨어 가져오는 중...",
|
|
57
|
+
"sync.fail": "소프트웨어 목록 가져오기 실패",
|
|
58
|
+
"sync.allInstalled": "모든 패키지가 이미 설치되었습니다!",
|
|
59
|
+
"sync.starting": "총 {0}개 대상 중 {1}개 누락, 설치 시작...",
|
|
60
|
+
"sync.summary": "동기화 요약",
|
|
61
|
+
"sync.successCount": "성공",
|
|
62
|
+
"sync.failCount": "실패",
|
|
63
|
+
"search.searching": "\"{0}\" 검색 중...",
|
|
64
|
+
"search.results": "\"{0}\" 검색 결과 ({1}개)",
|
|
65
|
+
"search.fail": "검색 실패",
|
|
66
|
+
"list.getting": "설치된 소프트웨어 가져오는 중...",
|
|
67
|
+
"list.fail": "소프트웨어 목록 가져오기 실패",
|
|
68
|
+
"lang.prompt": "언어 선택",
|
|
69
|
+
"lang.current": "현재 언어",
|
|
70
|
+
"lang.switched": "언어가 변경되었습니다: {0} ({1})",
|
|
71
|
+
"lang.firstRun": "swpm에 오신 것을 환영합니다! 언어를 선택하세요:",
|
|
72
|
+
"executing": "실행 중",
|
|
73
|
+
"exitCode": "종료 코드",
|
|
74
|
+
"signal": "신호",
|
|
75
|
+
"launchFail": "winget 시작 실패",
|
|
76
|
+
"uninstall.getting": "설치된 소프트웨어 가져오는 중...",
|
|
77
|
+
"uninstall.starting": "{0}개 패키지 제거 시작...",
|
|
78
|
+
"uninstall.summary": "제거 요약",
|
|
79
|
+
"uninstall.noPackages": "제거할 패키지가 없습니다.",
|
|
80
|
+
"uninstall.select": "제거할 패키지 선택 (스페이스로 전환, Enter로 확인)"
|
|
81
|
+
}
|