sideby 0.0.0-stage → 0.2.1
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.md +111 -2
- package/README.zh-CN.md +112 -0
- package/dist/build.json +1 -0
- package/dist/src/cli/args.d.ts +13 -0
- package/dist/src/cli/args.js +38 -0
- package/dist/src/cli/commands.d.ts +50 -0
- package/dist/src/cli/commands.js +566 -0
- package/dist/src/cli/format.d.ts +16 -0
- package/dist/src/cli/format.js +80 -0
- package/dist/src/cli/json-schemas.d.ts +2 -0
- package/dist/src/cli/json-schemas.js +259 -0
- package/dist/src/cli/main.d.ts +2 -0
- package/dist/src/cli/main.js +276 -0
- package/dist/src/cli/schemas.d.ts +1 -0
- package/dist/src/cli/schemas.js +16 -0
- package/dist/src/core/account-name.d.ts +2 -0
- package/dist/src/core/account-name.js +2 -0
- package/dist/src/core/accounts.d.ts +20 -0
- package/dist/src/core/accounts.js +131 -0
- package/dist/src/core/config.d.ts +61 -0
- package/dist/src/core/config.js +184 -0
- package/dist/src/core/create.d.ts +30 -0
- package/dist/src/core/create.js +126 -0
- package/dist/src/core/doctor.d.ts +41 -0
- package/dist/src/core/doctor.js +171 -0
- package/dist/src/core/errors.d.ts +12 -0
- package/dist/src/core/errors.js +14 -0
- package/dist/src/core/file-memo.d.ts +24 -0
- package/dist/src/core/file-memo.js +41 -0
- package/dist/src/core/fs-safe.d.ts +38 -0
- package/dist/src/core/fs-safe.js +205 -0
- package/dist/src/core/handoff.d.ts +41 -0
- package/dist/src/core/handoff.js +54 -0
- package/dist/src/core/identity.d.ts +23 -0
- package/dist/src/core/identity.js +79 -0
- package/dist/src/core/last-doctor.d.ts +36 -0
- package/dist/src/core/last-doctor.js +69 -0
- package/dist/src/core/launch.d.ts +37 -0
- package/dist/src/core/launch.js +108 -0
- package/dist/src/core/login-path.d.ts +23 -0
- package/dist/src/core/login-path.js +96 -0
- package/dist/src/core/paths.d.ts +13 -0
- package/dist/src/core/paths.js +32 -0
- package/dist/src/core/quota-levels.d.ts +19 -0
- package/dist/src/core/quota-levels.js +34 -0
- package/dist/src/core/resume.d.ts +9 -0
- package/dist/src/core/resume.js +15 -0
- package/dist/src/core/secret-file.d.ts +30 -0
- package/dist/src/core/secret-file.js +116 -0
- package/dist/src/core/share-meaning.d.ts +6 -0
- package/dist/src/core/share-meaning.js +32 -0
- package/dist/src/core/share-mode-names.d.ts +1 -0
- package/dist/src/core/share-mode-names.js +10 -0
- package/dist/src/core/share-modes.d.ts +24 -0
- package/dist/src/core/share-modes.js +405 -0
- package/dist/src/core/shell-init.d.ts +31 -0
- package/dist/src/core/shell-init.js +84 -0
- package/dist/src/core/skill-check.d.ts +11 -0
- package/dist/src/core/skill-check.js +57 -0
- package/dist/src/core/usage-days.d.ts +15 -0
- package/dist/src/core/usage-days.js +33 -0
- package/dist/src/core/version.d.ts +9 -0
- package/dist/src/core/version.js +46 -0
- package/dist/src/desktop/app.d.ts +60 -0
- package/dist/src/desktop/app.js +316 -0
- package/dist/src/desktop/icon.d.ts +16 -0
- package/dist/src/desktop/icon.js +174 -0
- package/dist/src/families/claude/index.d.ts +10 -0
- package/dist/src/families/claude/index.js +127 -0
- package/dist/src/families/claude/layout.d.ts +6 -0
- package/dist/src/families/claude/layout.js +5 -0
- package/dist/src/families/claude/quota-cache.d.ts +31 -0
- package/dist/src/families/claude/quota-cache.js +111 -0
- package/dist/src/families/claude/quota.d.ts +3 -0
- package/dist/src/families/claude/quota.js +53 -0
- package/dist/src/families/claude/usage.d.ts +22 -0
- package/dist/src/families/claude/usage.js +146 -0
- package/dist/src/families/codex/index.d.ts +5 -0
- package/dist/src/families/codex/index.js +70 -0
- package/dist/src/families/codex/rollout.d.ts +67 -0
- package/dist/src/families/codex/rollout.js +298 -0
- package/dist/src/families/grok/index.d.ts +8 -0
- package/dist/src/families/grok/index.js +82 -0
- package/dist/src/families/index.d.ts +3 -0
- package/dist/src/families/index.js +40 -0
- package/dist/src/families/logos.d.ts +21 -0
- package/dist/src/families/logos.js +26 -0
- package/dist/src/families/pi/index.d.ts +3 -0
- package/dist/src/families/pi/index.js +54 -0
- package/dist/src/families/shared/sessions.d.ts +9 -0
- package/dist/src/families/shared/sessions.js +70 -0
- package/dist/src/families/shared/toml.d.ts +5 -0
- package/dist/src/families/shared/toml.js +16 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +4 -0
- package/dist/src/panel/background.d.ts +62 -0
- package/dist/src/panel/background.js +274 -0
- package/dist/src/panel/handler.d.ts +91 -0
- package/dist/src/panel/handler.js +396 -0
- package/dist/src/panel/i18n.d.ts +287 -0
- package/dist/src/panel/i18n.js +570 -0
- package/dist/src/panel/page-logic.d.ts +154 -0
- package/dist/src/panel/page-logic.js +326 -0
- package/dist/src/panel/page-script.d.ts +2 -0
- package/dist/src/panel/page-script.js +1633 -0
- package/dist/src/panel/page-styles.d.ts +7 -0
- package/dist/src/panel/page-styles.js +514 -0
- package/dist/src/panel/page.d.ts +20 -0
- package/dist/src/panel/page.js +96 -0
- package/dist/src/panel/server.d.ts +32 -0
- package/dist/src/panel/server.js +133 -0
- package/dist/src/panel/theme.d.ts +116 -0
- package/dist/src/panel/theme.js +132 -0
- package/dist/src/plugins/account-script.d.ts +4 -0
- package/dist/src/plugins/account-script.js +66 -0
- package/dist/src/plugins/bus.d.ts +33 -0
- package/dist/src/plugins/bus.js +84 -0
- package/dist/src/plugins/loader.d.ts +58 -0
- package/dist/src/plugins/loader.js +250 -0
- package/dist/src/quota/claude-statusline.d.ts +28 -0
- package/dist/src/quota/claude-statusline.js +301 -0
- package/dist/src/quota/statusline-tap.d.ts +11 -0
- package/dist/src/quota/statusline-tap.js +104 -0
- package/dist/src/runtime.d.ts +195 -0
- package/dist/src/runtime.js +424 -0
- package/dist/src/types.d.ts +285 -0
- package/dist/src/types.js +3 -0
- package/dist/testing/demo.d.ts +8 -0
- package/dist/testing/demo.js +50 -0
- package/dist/testing/index.d.ts +36 -0
- package/dist/testing/index.js +118 -0
- package/package.json +66 -4
- package/schemas/alias.json +102 -0
- package/schemas/app-install.json +74 -0
- package/schemas/app-uninstall.json +54 -0
- package/schemas/config.json +170 -0
- package/schemas/doctor.json +229 -0
- package/schemas/error.json +25 -0
- package/schemas/families.json +205 -0
- package/schemas/list.json +177 -0
- package/schemas/new.json +199 -0
- package/schemas/next.json +127 -0
- package/schemas/plugins.json +74 -0
- package/schemas/quota-setup.json +60 -0
- package/schemas/quota-teardown.json +30 -0
- package/schemas/quota.json +203 -0
- package/skills/sideby/SKILL.md +61 -0
- package/skills/sideby/references/accounts.md +31 -0
- package/skills/sideby/references/diagnose.md +47 -0
- package/skills/sideby/references/handoff.md +41 -0
- package/skills/sideby/references/quota.md +14 -0
- package/skills/sideby/references/setup.md +31 -0
- package/skills/sideby/references/sharing.md +17 -0
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
// Panel text in English and Chinese. Only the page's own words: messages from the server (errors, Findings,
|
|
2
|
+
// next steps) stay as the server wrote them. `{name}` is a placeholder; keys ending in `.one` / `.other` are
|
|
3
|
+
// chosen by count (Chinese uses the same text for both).
|
|
4
|
+
const en = {
|
|
5
|
+
'top.tagline': 'Every AI coding account, side by side.',
|
|
6
|
+
'top.refresh': 'Refresh',
|
|
7
|
+
'top.loading': 'Loading…',
|
|
8
|
+
'top.refreshing': 'Refreshing…',
|
|
9
|
+
'top.updated': 'Updated {ago}',
|
|
10
|
+
'top.updatedTitle': 'Last loaded at {at}. Refreshes on its own every {s} s while this page is open.',
|
|
11
|
+
'top.language': 'Switch language',
|
|
12
|
+
'foot.text': 'runs on this machine; nothing leaves it.',
|
|
13
|
+
'acct.title': 'Accounts',
|
|
14
|
+
'theme.system': 'Theme: follow system',
|
|
15
|
+
'theme.light': 'Theme: light',
|
|
16
|
+
'theme.dark': 'Theme: dark',
|
|
17
|
+
'err.noAnswer': 'sideby did not answer. Retry once it is back.',
|
|
18
|
+
'err.session': 'Could not renew the session. Reload the page.',
|
|
19
|
+
'err.expired': 'The session expired. Reload the page.',
|
|
20
|
+
'err.server': 'sideby hit an error: {msg}',
|
|
21
|
+
'conn.lost': 'Lost connection to sideby, reconnecting…',
|
|
22
|
+
'load.failed': 'Could not load accounts',
|
|
23
|
+
'load.failedShort': 'Could not refresh.',
|
|
24
|
+
'btn.copy': 'Copy',
|
|
25
|
+
'btn.copyText': 'Copy {text}',
|
|
26
|
+
'btn.retry': 'Retry',
|
|
27
|
+
'btn.close': 'Close',
|
|
28
|
+
'btn.cancel': 'Cancel',
|
|
29
|
+
'btn.done': 'Done',
|
|
30
|
+
'time.justNow': 'just now',
|
|
31
|
+
'time.minAgo': '{n} min ago',
|
|
32
|
+
'time.hAgo': '{n} h ago',
|
|
33
|
+
'time.dAgo': '{n} d ago',
|
|
34
|
+
'time.in': 'in {d}',
|
|
35
|
+
'toast.dismiss': 'Dismiss',
|
|
36
|
+
'toast.copied': 'Copied {text}',
|
|
37
|
+
'toast.copyFailed': 'Could not copy. Select the text and copy it by hand.',
|
|
38
|
+
'toast.reconnected': 'Back online',
|
|
39
|
+
'toast.refreshed': 'Refreshed',
|
|
40
|
+
'toast.updated': 'sideby was updated; this page reloads when you are done',
|
|
41
|
+
'toast.refreshFailed': 'Refresh failed: {msg}',
|
|
42
|
+
'toast.checkOk': '{ref} is healthy',
|
|
43
|
+
'toast.checkFound': '{ref}: {what}',
|
|
44
|
+
'toast.checkFailed': 'Could not check {ref}: {msg}',
|
|
45
|
+
'toast.show': 'Show',
|
|
46
|
+
'toast.created': 'Created {ref}',
|
|
47
|
+
'toast.createdProblems': 'Created {ref} with problems',
|
|
48
|
+
'toast.quotaOn': '{host} quota display is on',
|
|
49
|
+
'toast.quotaOff': '{host} quota display is off again; the settings file is restored',
|
|
50
|
+
'toast.undo': 'Undo',
|
|
51
|
+
'toast.undoFailed': 'Could not undo: {msg}',
|
|
52
|
+
'toast.undoMissing': 'This sideby cannot undo from the Panel. Run sideby quota teardown claude.',
|
|
53
|
+
'tip.label': 'What is {term}?',
|
|
54
|
+
'tip.api.term': 'an API account',
|
|
55
|
+
'tip.api.body': 'An account whose folder holds a proxy.env with an API key or a relay. It is billed by that provider, so it has no subscription quota.',
|
|
56
|
+
'tip.shared.term': 'a Shared Item',
|
|
57
|
+
'tip.shared.body': 'Something every account of a tool should share with its main account, such as skills, hooks or the rules file.',
|
|
58
|
+
'tip.drift.term': 'Drift',
|
|
59
|
+
'tip.drift.body': 'A Shared Item that no longer matches how it should be shared, for example a copy where a link is expected.',
|
|
60
|
+
'tip.quotaOff.term': 'quota display',
|
|
61
|
+
'tip.quotaOff.body': 'Quota is turned on once for all {host} accounts, with “Turn on quota” in the {host} group header. No need to do it per account.',
|
|
62
|
+
'tip.quotaOff.cli': 'Quota is turned on once for all {host} accounts: run sideby quota setup {family} in a terminal.',
|
|
63
|
+
'tip.age.term': 'quota data age',
|
|
64
|
+
'tip.age.body': 'Quota comes from what the tool last wrote on this machine, so it updates after your next session. Data older than an hour is greyed out.',
|
|
65
|
+
'stat.accounts': 'Accounts',
|
|
66
|
+
'stat.families.one': '{n} tool',
|
|
67
|
+
'stat.families.other': '{n} tools',
|
|
68
|
+
'stat.api.one': '{n} API',
|
|
69
|
+
'stat.api.other': '{n} API',
|
|
70
|
+
'stat.attention': 'Needs attention',
|
|
71
|
+
'stat.attentionOn': 'Show only these accounts',
|
|
72
|
+
'stat.attentionOff': 'Show all accounts',
|
|
73
|
+
'stat.btnLabel': '{label}: {value} ({sub}). {action}',
|
|
74
|
+
'stat.allClear': 'All clear',
|
|
75
|
+
'stat.tokens': 'Tokens · {n} days',
|
|
76
|
+
'stat.sessions.one': '{n} session',
|
|
77
|
+
'stat.sessions.other': '{n} sessions',
|
|
78
|
+
'stat.nextReset': 'Next quota reset',
|
|
79
|
+
'stat.noQuota': 'No quota data',
|
|
80
|
+
'need.error.one': '{n} unreadable',
|
|
81
|
+
'need.error.other': '{n} unreadable',
|
|
82
|
+
'need.health-fail.one': '{n} with issues',
|
|
83
|
+
'need.health-fail.other': '{n} with issues',
|
|
84
|
+
'need.signed-out.one': '{n} signed out',
|
|
85
|
+
'need.signed-out.other': '{n} signed out',
|
|
86
|
+
'need.not-installed.one': '{n} tool missing',
|
|
87
|
+
'need.not-installed.other': '{n} tool missing',
|
|
88
|
+
'need.quota-high.one': '{n} near limit',
|
|
89
|
+
'need.quota-high.other': '{n} near limit',
|
|
90
|
+
'need.health-warn.one': '{n} with warnings',
|
|
91
|
+
'need.health-warn.other': '{n} with warnings',
|
|
92
|
+
'tb.search': 'Search accounts',
|
|
93
|
+
'tb.searchPh': 'Search name, alias, email, model…',
|
|
94
|
+
'tb.family': 'Filter by tool',
|
|
95
|
+
'tb.allFamilies': 'All tools',
|
|
96
|
+
'tb.sort': 'Sort accounts',
|
|
97
|
+
'sort.pressure': 'Sort: quota used',
|
|
98
|
+
'sort.name': 'Sort: name',
|
|
99
|
+
'sort.recent': 'Sort: last used',
|
|
100
|
+
'tb.quota': 'Show quota as',
|
|
101
|
+
'tb.used': 'Used',
|
|
102
|
+
'tb.left': 'Left',
|
|
103
|
+
'tb.view': 'View',
|
|
104
|
+
'tb.list': 'List',
|
|
105
|
+
'tb.cards': 'Cards',
|
|
106
|
+
'tb.hideEmails': 'Hide emails',
|
|
107
|
+
'tb.showEmails': 'Show emails',
|
|
108
|
+
'tb.segLabel': '{group}: {option}',
|
|
109
|
+
'tb.new': 'New account',
|
|
110
|
+
'count.accounts.one': '{n} account',
|
|
111
|
+
'count.accounts.other': '{n} accounts',
|
|
112
|
+
'count.filtered': '{n} of {total}',
|
|
113
|
+
'filter.none': 'No accounts match',
|
|
114
|
+
'filter.noneQuery': 'Nothing matches “{q}”.',
|
|
115
|
+
'filter.noneBody': 'No account matches these filters.',
|
|
116
|
+
'filter.clear': 'Clear filters',
|
|
117
|
+
'group.expand': 'Show accounts',
|
|
118
|
+
'group.collapse': 'Hide accounts',
|
|
119
|
+
'group.toggle': '{title} ({count}): {action}',
|
|
120
|
+
'group.attention.one': '{n} needs attention',
|
|
121
|
+
'group.attention.other': '{n} need attention',
|
|
122
|
+
'acct.alias': 'Alias',
|
|
123
|
+
'acct.aliasArgs': 'Alias, starts this account with {args}',
|
|
124
|
+
'acct.api': 'API',
|
|
125
|
+
'acct.model': 'Model',
|
|
126
|
+
'acct.signedOut': 'Signed out',
|
|
127
|
+
'acct.signInHint': 'Copy the sign-in command',
|
|
128
|
+
'acct.signedOutLabel': '{ref} is signed out: copy the sign-in command',
|
|
129
|
+
'acct.next': 'Next',
|
|
130
|
+
'acct.nextHint': 'The account to move on to when this family runs low: most quota left. Click to copy `sideby next {family}`.',
|
|
131
|
+
'acct.nextLabel': '{ref} is next: copy `sideby next {family}`',
|
|
132
|
+
'acct.notInstalled': 'Tool missing',
|
|
133
|
+
'acct.readError': 'Could not read this account.',
|
|
134
|
+
'acct.installHost': '{host} is not installed on this machine. {link}',
|
|
135
|
+
'acct.installIt': 'Install it',
|
|
136
|
+
'quota.pctUsed': '{n}% used',
|
|
137
|
+
'quota.pctLeft': '{n}% left',
|
|
138
|
+
'quota.meterUsed': '{label} quota used',
|
|
139
|
+
'quota.meterLeft': '{label} quota left',
|
|
140
|
+
'quota.resetsAt': 'Resets {at}',
|
|
141
|
+
'quota.resetPassed': 'This window reset. New numbers come with your next session.',
|
|
142
|
+
'quota.resetNoData': 'Window reset · no new data since {date}',
|
|
143
|
+
'quota.dataFrom': 'Data from {ago}',
|
|
144
|
+
'quota.asOf': 'As of {ago}',
|
|
145
|
+
'quota.noWindows': 'No quota windows reported.',
|
|
146
|
+
'quota.off': 'Quota not on',
|
|
147
|
+
'quota.turnOnFamily': 'Turn on quota',
|
|
148
|
+
'quota.turnOnFamilyNote': 'Applies to all {host} accounts',
|
|
149
|
+
'quota.turnOnFamilyLabel': 'Turn on quota for all {host} accounts',
|
|
150
|
+
'quota.blocked': 'Quota unavailable',
|
|
151
|
+
'quota.api': 'Billed by provider',
|
|
152
|
+
'quota.noSession': 'No quota data yet',
|
|
153
|
+
'quota.noSessionHint': 'It shows up after your next session with this account.',
|
|
154
|
+
'quota.noSource': 'No public quota source',
|
|
155
|
+
'quota.unrecognized': 'Quota unreadable',
|
|
156
|
+
'quota.unavailable': 'Quota unavailable ({reason})',
|
|
157
|
+
'quota.unitUsed': 'used',
|
|
158
|
+
'quota.unitLeft': 'left',
|
|
159
|
+
'quota.resetShort': 'reset',
|
|
160
|
+
'quota.missing': 'No {label} window right now; it shows once that window starts.',
|
|
161
|
+
'quota.waiting': 'Waiting for the first status line… open a {host} session and send a message.',
|
|
162
|
+
'col.account': 'Account',
|
|
163
|
+
'col.used': '{label} used',
|
|
164
|
+
'col.left': '{label} left',
|
|
165
|
+
'col.tokens': 'Tokens · {n} days',
|
|
166
|
+
'col.last': 'Last used',
|
|
167
|
+
'col.health': 'Health',
|
|
168
|
+
'usage.tokens': 'tokens',
|
|
169
|
+
'usage.cache': '{n}% cache hits',
|
|
170
|
+
'usage.sessions.one': '{n} session',
|
|
171
|
+
'usage.sessions.other': '{n} sessions',
|
|
172
|
+
'usage.detail': 'Last {days} days: {sessions} sessions · in {input} · out {output} · cache {cache}',
|
|
173
|
+
'usage.none': 'No sessions in {n} days',
|
|
174
|
+
'usage.noSource': 'No local usage records',
|
|
175
|
+
'usage.unreadable': 'Usage unreadable',
|
|
176
|
+
'usage.sparkLabel': 'Tokens per day, last {n} days',
|
|
177
|
+
'last.title': 'Last activity {at}',
|
|
178
|
+
'last.unknown': 'No recent activity recorded',
|
|
179
|
+
'health.title': 'Health check',
|
|
180
|
+
'health.intro': 'Checks that shared skills, settings and credentials are in place for every account.',
|
|
181
|
+
'health.lead': 'Checks {shared} and reports {drift}.',
|
|
182
|
+
'health.sharedTerm': 'Shared Items',
|
|
183
|
+
'health.driftTerm': 'Drift',
|
|
184
|
+
'health.more.one': 'Show {n} more',
|
|
185
|
+
'health.more.other': 'Show {n} more',
|
|
186
|
+
'health.run': 'Run check',
|
|
187
|
+
'health.running': 'Checking accounts…',
|
|
188
|
+
'health.fixing': 'Fixing…',
|
|
189
|
+
'health.checking': 'Checking…',
|
|
190
|
+
'health.waiting': 'Waiting for accounts to load',
|
|
191
|
+
'health.last': 'Last check {ago}',
|
|
192
|
+
'health.never': 'Not checked yet',
|
|
193
|
+
'health.error': 'Error',
|
|
194
|
+
'health.notChecked': 'Not checked',
|
|
195
|
+
'health.ok': 'Healthy',
|
|
196
|
+
'health.issues.one': '{n} issue',
|
|
197
|
+
'health.issues.other': '{n} issues',
|
|
198
|
+
'health.warnings.one': '{n} warning',
|
|
199
|
+
'health.warnings.other': '{n} warnings',
|
|
200
|
+
'health.filterHint': 'Show this account in Health check',
|
|
201
|
+
'health.chipLabel': '{ref} health: {status}. Show it in Health check',
|
|
202
|
+
'health.only': 'Show only {ref}',
|
|
203
|
+
'health.filtered': 'Showing this account only',
|
|
204
|
+
'health.checkThis': 'Check it now',
|
|
205
|
+
'health.showAll': 'Show all',
|
|
206
|
+
'health.autoFix': 'auto-fix',
|
|
207
|
+
'health.from': 'from {source}',
|
|
208
|
+
'health.allGood': 'All healthy',
|
|
209
|
+
'health.refGood': '{ref} is healthy',
|
|
210
|
+
'health.allGoodSub': 'Every account shares what it should.',
|
|
211
|
+
'health.refNever': '{ref} has not been checked yet.',
|
|
212
|
+
'fix.all': 'Fix all',
|
|
213
|
+
'fix.hintAction': 'use Fix all',
|
|
214
|
+
'fix.off': 'Fix all is off: {why}',
|
|
215
|
+
'fix.whyNoCheck': 'Run a check first.',
|
|
216
|
+
'fix.whyManual': 'None of these findings has an automatic fix; follow the hint under each one.',
|
|
217
|
+
'fix.whyNothing': 'Nothing to fix.',
|
|
218
|
+
'fix.result': 'Fixed {ok} of {n}.',
|
|
219
|
+
'fix.nothing': 'Nothing needed fixing.',
|
|
220
|
+
'menu.title': 'More actions',
|
|
221
|
+
'menu.label': 'Actions for {ref}',
|
|
222
|
+
'menu.copyRun': 'Copy run command',
|
|
223
|
+
'menu.copyAlias': 'Copy alias',
|
|
224
|
+
'menu.copyLogin': 'Copy sign-in command',
|
|
225
|
+
'menu.copyDir': 'Copy folder path',
|
|
226
|
+
'menu.copyEmail': 'Copy email',
|
|
227
|
+
'menu.check': 'Check this account',
|
|
228
|
+
'menu.like': 'New account like this',
|
|
229
|
+
'nf.title': 'New account',
|
|
230
|
+
'nf.intro': 'It runs next to your existing accounts and shares their skills and settings.',
|
|
231
|
+
'nf.tool': 'Tool',
|
|
232
|
+
'nf.accounts.one': '{n} account',
|
|
233
|
+
'nf.accounts.other': '{n} accounts',
|
|
234
|
+
'nf.runOnce': 'Run {bin} once first',
|
|
235
|
+
'nf.notInstalled': 'Not installed',
|
|
236
|
+
'nf.name': 'Name',
|
|
237
|
+
'nf.namePh': 'name',
|
|
238
|
+
'nf.api': 'API key account',
|
|
239
|
+
'nf.apiHint': 'Gets its own proxy.env for a key or a relay. Leave off for a subscription.',
|
|
240
|
+
'nf.dir': 'Folder',
|
|
241
|
+
'nf.launch': 'Start with',
|
|
242
|
+
'nf.create': 'Create account',
|
|
243
|
+
'nf.suggested': 'Suggested name: press Enter to create, or type another.',
|
|
244
|
+
'nf.refusedApi': 'If this account will use an API key, turn on “API key account” and create it again.',
|
|
245
|
+
'nf.creating': 'Creating…',
|
|
246
|
+
'nf.mainTaken': '"main" is the default account. Pick another name.',
|
|
247
|
+
'nf.badName': 'Use 1 to 32 lowercase letters, digits or "-", starting with a letter or digit.',
|
|
248
|
+
'nf.exists': '{ref} already exists.',
|
|
249
|
+
'nf.enterName': 'Enter a name.',
|
|
250
|
+
'nf.noReady': 'No tool is ready yet: install one and run it once, then come back.',
|
|
251
|
+
'nf.created': 'Created {ref}',
|
|
252
|
+
'nf.createdProblems': 'Created {ref} with problems; see below',
|
|
253
|
+
'nf.next': 'Next steps',
|
|
254
|
+
'nf.fillIn': 'Add your key or relay to',
|
|
255
|
+
'nf.another': 'Create another',
|
|
256
|
+
'nf.alias': 'Short command',
|
|
257
|
+
'nf.optional': '(optional)',
|
|
258
|
+
'nf.aliasPh': 'none',
|
|
259
|
+
'nf.aliasHint': 'A shell command that starts this account. Leave it empty for none.',
|
|
260
|
+
'nf.aliasSuggested': 'Follows the short commands of your other {host} accounts.',
|
|
261
|
+
'nf.aliasBad': 'Use letters, digits, "_" or "-", starting with a letter or "_".',
|
|
262
|
+
'nf.aliasReserved': '"{alias}" is a shell keyword or builtin. Pick another.',
|
|
263
|
+
'nf.aliasTaken': '{alias} already starts {ref}.',
|
|
264
|
+
'nf.or': 'or',
|
|
265
|
+
'nf.aliasNewShell': 'Works in a new terminal.',
|
|
266
|
+
'nf.aliasNotAdded': 'Short command not added.',
|
|
267
|
+
'nf.shellFileUpdated': 'Updated {file}.',
|
|
268
|
+
'nf.shellFileSame': '{file} is up to date.',
|
|
269
|
+
'qs.title': 'Turn on {host} quota',
|
|
270
|
+
'qs.preparing': 'Preparing the change…',
|
|
271
|
+
'qs.changes': 'This changes {file}:',
|
|
272
|
+
'qs.undoHint': 'You can undo it right after, or later with sideby quota teardown.',
|
|
273
|
+
'qs.apply': 'Apply change',
|
|
274
|
+
'qs.applying': 'Applying…',
|
|
275
|
+
'qs.alreadyOn': 'Quota display is on. Numbers appear after your next {host} session.',
|
|
276
|
+
'empty.title': 'No accounts yet',
|
|
277
|
+
'empty.body': 'sideby picks up the folders your AI coding tools already use. Install a tool and run it once, then add a second account to run side by side.',
|
|
278
|
+
'empty.runOnce': 'run {bin} once',
|
|
279
|
+
'empty.install': 'Install',
|
|
280
|
+
'empty.noFamilies': 'No tools are registered. Check sideby plugins.',
|
|
281
|
+
'empty.create': 'Create your first account',
|
|
282
|
+
'banner.readOnly': 'Read-only view. Use the sideby CLI to fix or create accounts.',
|
|
283
|
+
'banner.plugins.one': '{n} plugin problem.',
|
|
284
|
+
'banner.plugins.other': '{n} plugin problems.',
|
|
285
|
+
'banner.pluginsHint': 'Run sideby plugins for details.',
|
|
286
|
+
};
|
|
287
|
+
const zh = {
|
|
288
|
+
'top.tagline': '所有 AI 编程账号,并排运行。',
|
|
289
|
+
'top.refresh': '刷新',
|
|
290
|
+
'top.loading': '加载中…',
|
|
291
|
+
'top.refreshing': '刷新中…',
|
|
292
|
+
'top.updated': '{ago}更新',
|
|
293
|
+
'top.updatedTitle': '上次加载于 {at}。页面打开时每 {s} 秒自动刷新。',
|
|
294
|
+
'top.language': '切换语言',
|
|
295
|
+
'foot.text': '只在本机运行,数据不会离开这台电脑。',
|
|
296
|
+
'acct.title': '账号',
|
|
297
|
+
'theme.system': '主题:跟随系统',
|
|
298
|
+
'theme.light': '主题:浅色',
|
|
299
|
+
'theme.dark': '主题:深色',
|
|
300
|
+
'err.noAnswer': 'sideby 没有响应,恢复后再重试。',
|
|
301
|
+
'err.session': '无法续期会话,请刷新页面。',
|
|
302
|
+
'err.expired': '会话已过期,请刷新页面。',
|
|
303
|
+
'err.server': 'sideby 出错:{msg}',
|
|
304
|
+
'conn.lost': '与 sideby 的连接断开,正在重连…',
|
|
305
|
+
'load.failed': '无法加载账号',
|
|
306
|
+
'load.failedShort': '刷新失败。',
|
|
307
|
+
'btn.copy': '复制',
|
|
308
|
+
'btn.copyText': '复制 {text}',
|
|
309
|
+
'btn.retry': '重试',
|
|
310
|
+
'btn.close': '关闭',
|
|
311
|
+
'btn.cancel': '取消',
|
|
312
|
+
'btn.done': '完成',
|
|
313
|
+
'time.justNow': '刚刚',
|
|
314
|
+
'time.minAgo': '{n} 分钟前',
|
|
315
|
+
'time.hAgo': '{n} 小时前',
|
|
316
|
+
'time.dAgo': '{n} 天前',
|
|
317
|
+
'time.in': '{d}后',
|
|
318
|
+
'toast.dismiss': '关闭',
|
|
319
|
+
'toast.copied': '已复制 {text}',
|
|
320
|
+
'toast.copyFailed': '复制失败,请手动选中文字复制。',
|
|
321
|
+
'toast.reconnected': '已重新连接',
|
|
322
|
+
'toast.refreshed': '已刷新',
|
|
323
|
+
'toast.updated': 'sideby 已更新,你操作完后页面会自动刷新',
|
|
324
|
+
'toast.refreshFailed': '刷新失败:{msg}',
|
|
325
|
+
'toast.checkOk': '{ref} 状态正常',
|
|
326
|
+
'toast.checkFound': '{ref}:{what}',
|
|
327
|
+
'toast.checkFailed': '无法检查 {ref}:{msg}',
|
|
328
|
+
'toast.show': '查看',
|
|
329
|
+
'toast.created': '已创建 {ref}',
|
|
330
|
+
'toast.createdProblems': '已创建 {ref},但有问题',
|
|
331
|
+
'toast.quotaOn': '已开启 {host} 额度显示',
|
|
332
|
+
'toast.quotaOff': '已关闭 {host} 额度显示,设置文件已还原',
|
|
333
|
+
'toast.undo': '撤销',
|
|
334
|
+
'toast.undoFailed': '撤销失败:{msg}',
|
|
335
|
+
'toast.undoMissing': '当前 sideby 版本不支持在面板里撤销,请运行 sideby quota teardown claude。',
|
|
336
|
+
'tip.label': '什么是{term}?',
|
|
337
|
+
'tip.api.term': 'API 账号',
|
|
338
|
+
'tip.api.body': '目录里有 proxy.env(API key 或中转)的账号。费用由对应服务商结算,所以没有订阅额度。',
|
|
339
|
+
'tip.shared.term': '共享项(Shared Item)',
|
|
340
|
+
'tip.shared.body': '同一工具的每个账号都应和主账号共享的内容,例如 skills、hooks 或规则文件。',
|
|
341
|
+
'tip.drift.term': '偏离(Drift)',
|
|
342
|
+
'tip.drift.body': '不再符合共享方式的共享项,例如本该是链接的地方变成了副本。',
|
|
343
|
+
'tip.quotaOff.term': '额度显示',
|
|
344
|
+
'tip.quotaOff.body': '额度显示对所有 {host} 账号一次开启:点 {host} 分组标题里的“开启额度显示”,不用逐个账号开。',
|
|
345
|
+
'tip.quotaOff.cli': '额度显示对所有 {host} 账号一次开启:在终端运行 sideby quota setup {family}。',
|
|
346
|
+
'tip.age.term': '额度数据的时效',
|
|
347
|
+
'tip.age.body': '额度来自工具最近一次写在本机的记录,下次使用该账号后更新。超过 1 小时的数据会变灰。',
|
|
348
|
+
'stat.accounts': '账号',
|
|
349
|
+
'stat.families.one': '{n} 个工具',
|
|
350
|
+
'stat.families.other': '{n} 个工具',
|
|
351
|
+
'stat.api.one': '{n} 个 API',
|
|
352
|
+
'stat.api.other': '{n} 个 API',
|
|
353
|
+
'stat.attention': '需要处理',
|
|
354
|
+
'stat.attentionOn': '只看这些账号',
|
|
355
|
+
'stat.attentionOff': '显示全部账号',
|
|
356
|
+
'stat.btnLabel': '{label}:{value}({sub})。{action}',
|
|
357
|
+
'stat.allClear': '一切正常',
|
|
358
|
+
'stat.tokens': '近 {n} 天 tokens',
|
|
359
|
+
'stat.sessions.one': '{n} 个会话',
|
|
360
|
+
'stat.sessions.other': '{n} 个会话',
|
|
361
|
+
'stat.nextReset': '最近一次额度重置',
|
|
362
|
+
'stat.noQuota': '暂无额度数据',
|
|
363
|
+
'need.error.one': '{n} 个读取失败',
|
|
364
|
+
'need.error.other': '{n} 个读取失败',
|
|
365
|
+
'need.health-fail.one': '{n} 个有问题',
|
|
366
|
+
'need.health-fail.other': '{n} 个有问题',
|
|
367
|
+
'need.signed-out.one': '{n} 个未登录',
|
|
368
|
+
'need.signed-out.other': '{n} 个未登录',
|
|
369
|
+
'need.not-installed.one': '{n} 个缺少工具',
|
|
370
|
+
'need.not-installed.other': '{n} 个缺少工具',
|
|
371
|
+
'need.quota-high.one': '{n} 个接近上限',
|
|
372
|
+
'need.quota-high.other': '{n} 个接近上限',
|
|
373
|
+
'need.health-warn.one': '{n} 个有警告',
|
|
374
|
+
'need.health-warn.other': '{n} 个有警告',
|
|
375
|
+
'tb.search': '搜索账号',
|
|
376
|
+
'tb.searchPh': '搜索名称、别名、邮箱、模型…',
|
|
377
|
+
'tb.family': '按工具筛选',
|
|
378
|
+
'tb.allFamilies': '全部工具',
|
|
379
|
+
'tb.sort': '账号排序',
|
|
380
|
+
'sort.pressure': '排序:额度用量',
|
|
381
|
+
'sort.name': '排序:名称',
|
|
382
|
+
'sort.recent': '排序:最近使用',
|
|
383
|
+
'tb.quota': '额度显示方式',
|
|
384
|
+
'tb.used': '已用',
|
|
385
|
+
'tb.left': '剩余',
|
|
386
|
+
'tb.view': '视图',
|
|
387
|
+
'tb.list': '列表',
|
|
388
|
+
'tb.cards': '卡片',
|
|
389
|
+
'tb.hideEmails': '隐藏邮箱',
|
|
390
|
+
'tb.showEmails': '显示邮箱',
|
|
391
|
+
'tb.segLabel': '{group}:{option}',
|
|
392
|
+
'tb.new': '新建账号',
|
|
393
|
+
'count.accounts.one': '{n} 个账号',
|
|
394
|
+
'count.accounts.other': '{n} 个账号',
|
|
395
|
+
'count.filtered': '{n} / {total}',
|
|
396
|
+
'filter.none': '没有匹配的账号',
|
|
397
|
+
'filter.noneQuery': '没有和“{q}”匹配的账号。',
|
|
398
|
+
'filter.noneBody': '没有账号符合当前筛选。',
|
|
399
|
+
'filter.clear': '清除筛选',
|
|
400
|
+
'group.expand': '展开账号',
|
|
401
|
+
'group.collapse': '收起账号',
|
|
402
|
+
'group.toggle': '{title}({count}):{action}',
|
|
403
|
+
'group.attention.one': '{n} 个需要处理',
|
|
404
|
+
'group.attention.other': '{n} 个需要处理',
|
|
405
|
+
'acct.alias': '别名',
|
|
406
|
+
'acct.aliasArgs': '别名,启动这个账号并附加 {args}',
|
|
407
|
+
'acct.api': 'API',
|
|
408
|
+
'acct.model': '模型',
|
|
409
|
+
'acct.signedOut': '未登录',
|
|
410
|
+
'acct.signInHint': '复制登录命令',
|
|
411
|
+
'acct.signedOutLabel': '{ref} 未登录:复制登录命令',
|
|
412
|
+
'acct.next': '下一个',
|
|
413
|
+
'acct.nextHint': '这个家族额度用完时换到这里:剩余额度最多。点击复制 `sideby next {family}`。',
|
|
414
|
+
'acct.nextLabel': '{ref} 是下一个:复制 `sideby next {family}`',
|
|
415
|
+
'acct.notInstalled': '未安装工具',
|
|
416
|
+
'acct.readError': '无法读取这个账号。',
|
|
417
|
+
'acct.installHost': '本机没有安装 {host}。{link}',
|
|
418
|
+
'acct.installIt': '去安装',
|
|
419
|
+
'quota.pctUsed': '已用 {n}%',
|
|
420
|
+
'quota.pctLeft': '剩余 {n}%',
|
|
421
|
+
'quota.meterUsed': '{label} 额度已用',
|
|
422
|
+
'quota.meterLeft': '{label} 额度剩余',
|
|
423
|
+
'quota.resetsAt': '{at} 重置',
|
|
424
|
+
'quota.resetPassed': '这个窗口已重置,下次使用后显示新数据。',
|
|
425
|
+
'quota.resetNoData': '已重置,{date}后无新数据',
|
|
426
|
+
'quota.dataFrom': '数据来自 {ago}',
|
|
427
|
+
'quota.asOf': '截至 {ago}',
|
|
428
|
+
'quota.noWindows': '没有额度窗口数据。',
|
|
429
|
+
'quota.off': '额度未开启',
|
|
430
|
+
'quota.turnOnFamily': '开启额度显示',
|
|
431
|
+
'quota.turnOnFamilyNote': '对所有 {host} 账号生效',
|
|
432
|
+
'quota.turnOnFamilyLabel': '为所有 {host} 账号开启额度显示',
|
|
433
|
+
'quota.blocked': '无法开启额度',
|
|
434
|
+
'quota.api': '由服务商计费',
|
|
435
|
+
'quota.noSession': '暂无额度数据',
|
|
436
|
+
'quota.noSessionHint': '下次用这个账号后就会显示。',
|
|
437
|
+
'quota.noSource': '没有公开的额度来源',
|
|
438
|
+
'quota.unrecognized': '无法读取额度',
|
|
439
|
+
'quota.unavailable': '额度不可用({reason})',
|
|
440
|
+
'quota.unitUsed': '已用',
|
|
441
|
+
'quota.unitLeft': '剩余',
|
|
442
|
+
'quota.resetShort': '已重置',
|
|
443
|
+
'quota.missing': '暂无 {label} 窗口,窗口开始后显示。',
|
|
444
|
+
'quota.waiting': '等待第一次状态栏刷新…打开 {host} 会话并发一条消息。',
|
|
445
|
+
'col.account': '账号',
|
|
446
|
+
'col.used': '{label} 已用',
|
|
447
|
+
'col.left': '{label} 剩余',
|
|
448
|
+
'col.tokens': 'Tokens · 近 {n} 天',
|
|
449
|
+
'col.last': '最近使用',
|
|
450
|
+
'col.health': '健康',
|
|
451
|
+
'usage.tokens': 'tokens',
|
|
452
|
+
'usage.cache': '缓存命中 {n}%',
|
|
453
|
+
'usage.sessions.one': '{n} 个会话',
|
|
454
|
+
'usage.sessions.other': '{n} 个会话',
|
|
455
|
+
'usage.detail': '近 {days} 天:{sessions} 个会话 · 输入 {input} · 输出 {output} · 缓存 {cache}',
|
|
456
|
+
'usage.none': '近 {n} 天没有会话',
|
|
457
|
+
'usage.noSource': '没有本地用量记录',
|
|
458
|
+
'usage.unreadable': '无法读取用量',
|
|
459
|
+
'usage.sparkLabel': '近 {n} 天每日 tokens',
|
|
460
|
+
'last.title': '最近活动 {at}',
|
|
461
|
+
'last.unknown': '没有最近的活动记录',
|
|
462
|
+
'health.title': '健康检查',
|
|
463
|
+
'health.intro': '检查每个账号的共享 skills、设置和凭据文件是否就位。',
|
|
464
|
+
'health.lead': '检查{shared},报告{drift}。',
|
|
465
|
+
'health.sharedTerm': '共享项',
|
|
466
|
+
'health.driftTerm': '偏离',
|
|
467
|
+
'health.more.one': '再显示 {n} 条',
|
|
468
|
+
'health.more.other': '再显示 {n} 条',
|
|
469
|
+
'health.run': '运行检查',
|
|
470
|
+
'health.running': '正在检查账号…',
|
|
471
|
+
'health.fixing': '正在修复…',
|
|
472
|
+
'health.checking': '检查中…',
|
|
473
|
+
'health.waiting': '等待账号加载',
|
|
474
|
+
'health.last': '上次检查 {ago}',
|
|
475
|
+
'health.never': '尚未检查',
|
|
476
|
+
'health.error': '出错',
|
|
477
|
+
'health.notChecked': '未检查',
|
|
478
|
+
'health.ok': '正常',
|
|
479
|
+
'health.issues.one': '{n} 个问题',
|
|
480
|
+
'health.issues.other': '{n} 个问题',
|
|
481
|
+
'health.warnings.one': '{n} 个警告',
|
|
482
|
+
'health.warnings.other': '{n} 个警告',
|
|
483
|
+
'health.filterHint': '在健康检查里只看这个账号',
|
|
484
|
+
'health.chipLabel': '{ref} 健康状态:{status}。在健康检查里查看',
|
|
485
|
+
'health.only': '只看 {ref}',
|
|
486
|
+
'health.filtered': '只显示这个账号',
|
|
487
|
+
'health.checkThis': '立即检查',
|
|
488
|
+
'health.showAll': '显示全部',
|
|
489
|
+
'health.autoFix': '可自动修复',
|
|
490
|
+
'health.from': '来自 {source}',
|
|
491
|
+
'health.allGood': '全部正常',
|
|
492
|
+
'health.refGood': '{ref} 状态正常',
|
|
493
|
+
'health.allGoodSub': '每个账号都共享了该共享的内容。',
|
|
494
|
+
'health.refNever': '{ref} 还没有检查过。',
|
|
495
|
+
'fix.all': '全部修复',
|
|
496
|
+
'fix.hintAction': '点「全部修复」',
|
|
497
|
+
'fix.off': '“全部修复”不可用:{why}',
|
|
498
|
+
'fix.whyNoCheck': '请先运行检查。',
|
|
499
|
+
'fix.whyManual': '这些发现都不能自动修复,请按每条下面的提示处理。',
|
|
500
|
+
'fix.whyNothing': '没有需要修复的内容。',
|
|
501
|
+
'fix.result': '已修复 {ok} / {n} 项。',
|
|
502
|
+
'fix.nothing': '没有需要修复的内容。',
|
|
503
|
+
'menu.title': '更多操作',
|
|
504
|
+
'menu.label': '{ref} 的操作',
|
|
505
|
+
'menu.copyRun': '复制启动命令',
|
|
506
|
+
'menu.copyAlias': '复制别名',
|
|
507
|
+
'menu.copyLogin': '复制登录命令',
|
|
508
|
+
'menu.copyDir': '复制目录路径',
|
|
509
|
+
'menu.copyEmail': '复制邮箱',
|
|
510
|
+
'menu.check': '检查这个账号',
|
|
511
|
+
'menu.like': '照此新建账号',
|
|
512
|
+
'nf.title': '新建账号',
|
|
513
|
+
'nf.intro': '新账号和现有账号并排运行,共享它们的 skills 和设置。',
|
|
514
|
+
'nf.tool': '工具',
|
|
515
|
+
'nf.accounts.one': '{n} 个账号',
|
|
516
|
+
'nf.accounts.other': '{n} 个账号',
|
|
517
|
+
'nf.runOnce': '先运行一次 {bin}',
|
|
518
|
+
'nf.notInstalled': '未安装',
|
|
519
|
+
'nf.name': '名称',
|
|
520
|
+
'nf.namePh': '名称',
|
|
521
|
+
'nf.api': 'API key 账号',
|
|
522
|
+
'nf.apiHint': '单独生成 proxy.env,用来填 key 或中转地址。订阅账号不要勾选。',
|
|
523
|
+
'nf.dir': '目录',
|
|
524
|
+
'nf.launch': '启动命令',
|
|
525
|
+
'nf.create': '创建账号',
|
|
526
|
+
'nf.suggested': '已填入建议名称:按回车直接创建,或输入其他名称。',
|
|
527
|
+
'nf.refusedApi': '如果这个账号用 API key,勾选“API key 账号”后再创建。',
|
|
528
|
+
'nf.creating': '创建中…',
|
|
529
|
+
'nf.mainTaken': '“main” 是默认账号,请换一个名称。',
|
|
530
|
+
'nf.badName': '只能用 1 到 32 个小写字母、数字或“-”,并以字母或数字开头。',
|
|
531
|
+
'nf.exists': '{ref} 已存在。',
|
|
532
|
+
'nf.enterName': '请输入名称。',
|
|
533
|
+
'nf.noReady': '还没有可用的工具:先安装并运行一次,再回来创建。',
|
|
534
|
+
'nf.created': '已创建 {ref}',
|
|
535
|
+
'nf.createdProblems': '已创建 {ref},但有问题,见下方',
|
|
536
|
+
'nf.next': '下一步',
|
|
537
|
+
'nf.fillIn': '把 key 或中转地址填到',
|
|
538
|
+
'nf.another': '再建一个',
|
|
539
|
+
'nf.alias': '短命令',
|
|
540
|
+
'nf.optional': '(可选)',
|
|
541
|
+
'nf.aliasPh': '不设置',
|
|
542
|
+
'nf.aliasHint': '在终端里启动这个账号的命令。留空表示不设置。',
|
|
543
|
+
'nf.aliasSuggested': '按你其他 {host} 账号的短命令规律填入。',
|
|
544
|
+
'nf.aliasBad': '只能用字母、数字、“_”或“-”,并以字母或“_”开头。',
|
|
545
|
+
'nf.aliasReserved': '“{alias}”是 shell 关键字或内置命令,请换一个。',
|
|
546
|
+
'nf.aliasTaken': '{alias} 已用于启动 {ref}。',
|
|
547
|
+
'nf.or': '或',
|
|
548
|
+
'nf.aliasNewShell': '新开终端后可用。',
|
|
549
|
+
'nf.aliasNotAdded': '短命令没有添加。',
|
|
550
|
+
'nf.shellFileUpdated': '已更新 {file}。',
|
|
551
|
+
'nf.shellFileSame': '{file} 已是最新。',
|
|
552
|
+
'qs.title': '开启 {host} 额度显示',
|
|
553
|
+
'qs.preparing': '正在准备改动…',
|
|
554
|
+
'qs.changes': '将修改 {file}:',
|
|
555
|
+
'qs.undoHint': '应用后可以马上撤销,之后也能用 sideby quota teardown 还原。',
|
|
556
|
+
'qs.apply': '应用改动',
|
|
557
|
+
'qs.applying': '应用中…',
|
|
558
|
+
'qs.alreadyOn': '额度显示已开启。下次使用 {host} 后会显示数据。',
|
|
559
|
+
'empty.title': '还没有账号',
|
|
560
|
+
'empty.body': 'sideby 会识别 AI 编程工具已经在用的目录。先安装工具并运行一次,再添加第二个账号并排使用。',
|
|
561
|
+
'empty.runOnce': '运行一次 {bin}',
|
|
562
|
+
'empty.install': '安装',
|
|
563
|
+
'empty.noFamilies': '没有注册任何工具,请检查 sideby plugins。',
|
|
564
|
+
'empty.create': '创建第一个账号',
|
|
565
|
+
'banner.readOnly': '只读视图。修复或创建账号请用 sideby 命令行。',
|
|
566
|
+
'banner.plugins.one': '{n} 个插件问题。',
|
|
567
|
+
'banner.plugins.other': '{n} 个插件问题。',
|
|
568
|
+
'banner.pluginsHint': '运行 sideby plugins 查看详情。',
|
|
569
|
+
};
|
|
570
|
+
export const MESSAGES = { en, zh };
|