Skip to content

Commit 9425d34

Browse files
committed
feat: extract strings of new tools
1 parent fdb39a8 commit 9425d34

File tree

21 files changed

+1620
-1510
lines changed

21 files changed

+1620
-1510
lines changed

locales/en.yml

Lines changed: 1430 additions & 1359 deletions
Large diffs are not rendered by default.
Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<script setup lang="ts">
2+
import { useI18n } from 'vue-i18n';
23
import { parse } from 'creditcard';
34
import { useQueryParam } from '@/composable/queryParams';
45
6+
const { t } = useI18n();
7+
58
const cardNumber = useQueryParam({ tool: 'credit-card-validator', name: 'number', defaultValue: '' });
69
const parsed = computed(() => {
710
if (!cardNumber.value) {
@@ -15,22 +18,22 @@ const parsed = computed(() => {
1518
<div style="max-width: 600px;">
1619
<c-input-text
1720
v-model:value="cardNumber"
18-
label="Credit Card Number:"
21+
:label="t('tools.credit-card-checker.texts.label-credit-card-number')"
1922
label-position="left"
20-
placeholder="e.g. 4111 1111 1111 1111"
23+
:placeholder="t('tools.credit-card-checker.texts.placeholder-e-g-4111-1111-1111-1111')"
2124
mb-2
2225
/>
2326

2427
<n-alert v-if="parsed && !parsed.validates" type="error">
25-
Invlid Credit Card Number
28+
{{ t('tools.credit-card-checker.texts.tag-invlid-credit-card-number') }}
2629
</n-alert>
27-
<n-card v-if="parsed && parsed.validates" title="Credit Card Number Info">
28-
<input-copyable label="Formatted:" label-position="left" label-width="150px" mb-1 :value="parsed.formatted" />
29-
<input-copyable label="PAN Truncated:" label-position="left" label-width="150px" mb-1 :value="parsed.truncate" />
30-
<input-copyable label="Scheme:" label-position="left" label-width="150px" mb-1 :value="parsed.scheme || 'Unknown'" />
31-
<input-copyable label="Major Industry Identifier:" mb-1 :value="parsed.mii" />
32-
<input-copyable label="Issuer Identifier Number:" mb-1 :value="parsed.iin" />
33-
<input-copyable label="CVV Length:" label-position="left" label-width="150px" mb-1 :value="parsed.cvv" />
30+
<n-card v-if="parsed && parsed.validates" :title="t('tools.credit-card-checker.texts.title-credit-card-number-info')">
31+
<input-copyable :label="t('tools.credit-card-checker.texts.label-formatted')" label-position="left" label-width="150px" mb-1 :value="parsed.formatted" />
32+
<input-copyable :label="t('tools.credit-card-checker.texts.label-pan-truncated')" label-position="left" label-width="150px" mb-1 :value="parsed.truncate" />
33+
<input-copyable :label="t('tools.credit-card-checker.texts.label-scheme')" label-position="left" label-width="150px" mb-1 :value="parsed.scheme || 'Unknown'" />
34+
<input-copyable :label="t('tools.credit-card-checker.texts.label-major-industry-identifier')" mb-1 :value="parsed.mii" />
35+
<input-copyable :label="t('tools.credit-card-checker.texts.label-issuer-identifier-number')" mb-1 :value="parsed.iin" />
36+
<input-copyable :label="t('tools.credit-card-checker.texts.label-cvv-length')" label-position="left" label-width="150px" mb-1 :value="parsed.cvv" />
3437
</n-card>
3538
</div>
3639
</template>

src/tools/credit-card-checker/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { CreditCard } from '@vicons/tabler';
22
import { defineTool } from '../tool';
3+
import { translate as t } from '@/plugins/i18n.plugin';
34

45
export const tool = defineTool({
5-
name: 'Credit Card Checker',
6+
name: t('tools.credit-card-checker.title'),
67
path: '/credit-card-checker',
7-
description: 'Check a Credit Card number for validity',
8+
description: t('tools.credit-card-checker.description'),
89
keywords: ['credit', 'card', 'checker'],
910
component: () => import('./credit-card-checker.vue'),
1011
icon: CreditCard,

src/tools/credit-card-generator/credit-card-generator.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<script setup lang="ts">
2+
import { useI18n } from 'vue-i18n';
23
import { GenCC, Schemes } from 'creditcard-generator';
34
import { useQueryParamOrStorage } from '@/composable/queryParams';
45
6+
const { t } = useI18n();
7+
58
const schemes = Object.keys(Schemes);
69
710
const selectedScheme = useQueryParamOrStorage({ name: 'type', storageName: 'credit-card-gen:t', defaultValue: 'VISA' });
@@ -19,26 +22,26 @@ function generateCards() {
1922
<c-select
2023
v-model:value="selectedScheme"
2124
:options="schemes"
22-
label="Credit Card Scheme:"
25+
:label="t('tools.credit-card-generator.texts.label-credit-card-scheme')"
2326
label-position="left"
24-
placeholder="Select Scheme"
27+
:placeholder="t('tools.credit-card-generator.texts.placeholder-select-scheme')"
2528
mb-1
2629
/>
27-
<n-form-item label="Number of Credit Card to generate:" label-placement="left">
30+
<n-form-item :label="t('tools.credit-card-generator.texts.label-number-of-credit-card-to-generate')" label-placement="left">
2831
<n-input-number
2932
v-model:value="count"
3033
:min="1"
3134
:max="50"
32-
placeholder="Number of cards"
35+
:placeholder="t('tools.credit-card-generator.texts.placeholder-number-of-cards')"
3336
/>
3437
</n-form-item>
3538
<n-space justify="center">
3639
<n-button type="primary" mb-3 @click="generateCards">
37-
Generate Random Credit Card numbers
40+
{{ t('tools.credit-card-generator.texts.tag-generate-random-credit-card-numbers') }}
3841
</n-button>
3942
</n-space>
4043

41-
<c-card v-if="cards" title="Generated Credit Card numbers">
44+
<c-card v-if="cards" :title="t('tools.credit-card-generator.texts.title-generated-credit-card-numbers')">
4245
<textarea-copyable :value="cards" />
4346
</c-card>
4447
</div>

src/tools/credit-card-generator/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { CreditCard } from '@vicons/tabler';
22
import { defineTool } from '../tool';
3+
import { translate as t } from '@/plugins/i18n.plugin';
34

45
export const tool = defineTool({
5-
name: 'Credit Card Number Generator',
6+
name: t('tools.credit-card-generator.title'),
67
path: '/credit-card-generator',
7-
description: 'Generate Random Credit Card Number',
8+
description: t('tools.credit-card-generator.description'),
89
keywords: ['credit', 'card', 'generator'],
910
component: () => import('./credit-card-generator.vue'),
1011
icon: CreditCard,

src/tools/database-connection-string-builder/database-connection-string-builder.vue

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
<script setup lang="ts">
2+
import { useI18n } from 'vue-i18n';
23
import { useQueryParamOrStorage } from '@/composable/queryParams';
34
5+
const { t } = useI18n();
6+
47
const dbType = useQueryParamOrStorage({ name: 'type', storageName: 'conn-string-builder:t', defaultValue: 'postgres' });
58
const dbOptions = [
6-
{ label: 'MySQL', value: 'mysql' },
7-
{ label: 'PostgreSQL', value: 'postgres' },
8-
{ label: 'SQL Server', value: 'sqlserver' },
9-
{ label: 'SQLite', value: 'sqlite' },
10-
{ label: 'MongoDB', value: 'mongodb' },
9+
{ label: t('tools.database-connection-string-builder.texts.label-mysql'), value: 'mysql' },
10+
{ label: t('tools.database-connection-string-builder.texts.label-postgresql'), value: 'postgres' },
11+
{ label: t('tools.database-connection-string-builder.texts.label-sql-server'), value: 'sqlserver' },
12+
{ label: t('tools.database-connection-string-builder.texts.label-sqlite'), value: 'sqlite' },
13+
{ label: t('tools.database-connection-string-builder.texts.label-mongodb'), value: 'mongodb' },
1114
];
1215
1316
const formatOptions = [
14-
{ label: 'URI Scheme', value: 'uri' },
15-
{ label: 'Keyword-Value Pairs', value: 'kvp' },
17+
{ label: t('tools.database-connection-string-builder.texts.label-uri-scheme'), value: 'uri' },
18+
{ label: t('tools.database-connection-string-builder.texts.label-keyword-value-pairs'), value: 'kvp' },
1619
];
1720
1821
const authOptions: Record<string, { label: string; value: string }[]> = {
19-
mysql: [{ label: 'Username/Password', value: 'basic' }],
22+
mysql: [{ label: t('tools.database-connection-string-builder.texts.label-username-password'), value: 'basic' }],
2023
postgres: [
21-
{ label: 'Username/Password', value: 'basic' },
22-
{ label: 'Peer', value: 'peer' },
23-
{ label: 'GSSAPI/SSPI', value: 'gssapi' },
24+
{ label: t('tools.database-connection-string-builder.texts.label-username-password'), value: 'basic' },
25+
{ label: t('tools.database-connection-string-builder.texts.label-peer'), value: 'peer' },
26+
{ label: t('tools.database-connection-string-builder.texts.label-gssapi-sspi'), value: 'gssapi' },
2427
],
2528
sqlserver: [
26-
{ label: 'Username/Password', value: 'basic' },
27-
{ label: 'Windows Integrated', value: 'windows' },
29+
{ label: t('tools.database-connection-string-builder.texts.label-username-password'), value: 'basic' },
30+
{ label: t('tools.database-connection-string-builder.texts.label-windows-integrated'), value: 'windows' },
2831
],
2932
sqlite: [],
3033
mongodb: [
31-
{ label: 'Username/Password (SCRAM)', value: 'basic' },
32-
{ label: 'X.509 Certificate', value: 'x509' },
34+
{ label: t('tools.database-connection-string-builder.texts.label-username-password-scram'), value: 'basic' },
35+
{ label: t('tools.database-connection-string-builder.texts.label-x-509-certificate'), value: 'x509' },
3336
],
3437
};
3538
@@ -123,74 +126,74 @@ const connectionString = computed(() => {
123126
</script>
124127

125128
<template>
126-
<n-card title="Database Connection String Generator" style="max-width: 750px; margin: auto;">
129+
<n-card :title="t('tools.database-connection-string-builder.texts.title-database-connection-string-generator')" style="max-width: 750px; margin: auto;">
127130
<c-select
128131
v-model:value="dbType"
129132
:options="dbOptions"
130-
placeholder="Select a database"
131-
label="Database type:"
133+
:placeholder="t('tools.database-connection-string-builder.texts.placeholder-select-a-database')"
134+
:label="t('tools.database-connection-string-builder.texts.label-database-type')"
132135
label-position="left"
133136
mb-2
134137
/>
135138

136139
<c-select
137140
v-model:value="form.format"
138141
:options="formatOptions"
139-
placeholder="Select format"
140-
label="Connection String Format:"
142+
:placeholder="t('tools.database-connection-string-builder.texts.placeholder-select-format')"
143+
:label="t('tools.database-connection-string-builder.texts.label-connection-string-format')"
141144
label-position="left"
142145
mb-2
143146
/>
144147

145-
<n-divider>Options</n-divider>
148+
<n-divider>{{ t('tools.database-connection-string-builder.texts.tag-options') }}</n-divider>
146149

147150
<n-form :model="form" label-placement="left" label-width="140">
148-
<n-form-item v-if="authOptions[dbType]?.length" label="Authentication Type">
151+
<n-form-item v-if="authOptions[dbType]?.length" :label="t('tools.database-connection-string-builder.texts.label-authentication-type')">
149152
<n-select
150153
v-model:value="form.authType"
151154
:options="authOptions[dbType]"
152-
placeholder="Select authentication"
155+
:placeholder="t('tools.database-connection-string-builder.texts.placeholder-select-authentication')"
153156
/>
154157
</n-form-item>
155158

156159
<template v-if="dbType !== 'sqlite' && form.authType !== 'peer' && form.authType !== 'windows' && form.authType !== 'x509'">
157-
<n-form-item label="Host">
158-
<n-input v-model:value="form.host" placeholder="e.g. localhost" />
160+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-host')">
161+
<n-input v-model:value="form.host" :placeholder="t('tools.database-connection-string-builder.texts.placeholder-e-g-localhost')" />
159162
</n-form-item>
160-
<n-form-item label="Port">
163+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-port')">
161164
<n-input-number v-model:value="form.port" :min="1" :max="65535" />
162165
</n-form-item>
163-
<n-form-item label="Username">
166+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-username')">
164167
<n-input v-model:value="form.username" />
165168
</n-form-item>
166-
<n-form-item label="Password">
169+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-password')">
167170
<n-input v-model:value="form.password" type="password" />
168171
</n-form-item>
169172
</template>
170173

171-
<n-form-item label="Database">
172-
<n-input v-model:value="form.database" placeholder="e.g. mydb" />
174+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-database')">
175+
<n-input v-model:value="form.database" :placeholder="t('tools.database-connection-string-builder.texts.placeholder-e-g-mydb')" />
173176
</n-form-item>
174177

175-
<n-form-item v-if="dbType === 'sqlite'" label="File Path">
176-
<n-input v-model:value="form.filePath" placeholder="/path/to/sqlite.db" />
178+
<n-form-item v-if="dbType === 'sqlite'" :label="t('tools.database-connection-string-builder.texts.label-file-path')">
179+
<n-input v-model:value="form.filePath" :placeholder="t('tools.database-connection-string-builder.texts.placeholder-path-to-sqlite-db')" />
177180
</n-form-item>
178181

179182
<details mb-3>
180-
<summary>Advanced Options</summary>
181-
<n-form-item label="SSL Enabled">
183+
<summary>{{ t('tools.database-connection-string-builder.texts.tag-advanced-options') }}</summary>
184+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-ssl-enabled')">
182185
<n-switch v-model:value="form.ssl" />
183186
</n-form-item>
184-
<n-form-item label="Timeout (s)">
187+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-timeout-s')">
185188
<n-input-number v-model:value="form.timeout" :min="0" />
186189
</n-form-item>
187-
<n-form-item label="Extra Params">
188-
<n-input v-model:value="form.extra" placeholder="e.g. charset=utf8&applicationName=myapp" />
190+
<n-form-item :label="t('tools.database-connection-string-builder.texts.label-extra-params')">
191+
<n-input v-model:value="form.extra" :placeholder="t('tools.database-connection-string-builder.texts.placeholder-e-g-charset-utf8-applicationname-myapp')" />
189192
</n-form-item>
190193
</details>
191194
</n-form>
192195

193-
<c-card title="Generate Connection String">
196+
<c-card :title="t('tools.database-connection-string-builder.texts.title-generate-connection-string')">
194197
<textarea-copyable :value="connectionString" />
195198
</c-card>
196199
</n-card>

src/tools/database-connection-string-builder/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Database } from '@vicons/tabler';
22
import { defineTool } from '../tool';
3+
import { translate as t } from '@/plugins/i18n.plugin';
34

45
export const tool = defineTool({
5-
name: 'Database Connection String Builder',
6+
name: t('tools.database-connection-string-builder.title'),
67
path: '/database-connection-string-builder',
7-
description: 'Build connection string for common database',
8+
description: t('tools.database-connection-string-builder.description'),
89
keywords: ['database', 'connection', 'builder', 'mysql', 'mongodb', 'sqlserver', 'sqlite', 'postgresql'],
910
component: () => import('./database-connection-string-builder.vue'),
1011
icon: Database,
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
<script setup lang="ts">
2-
import { dbmToMw, mwToDbm } from './dbm-mw-converter.service'; // Adjust path as needed
2+
import { useI18n } from 'vue-i18n';
3+
import { dbmToMw, mwToDbm } from './dbm-mw-converter.service';
4+
5+
const { t } = useI18n(); // Adjust path as needed
36
47
const dbmInput = ref(1);
58
const mwOutput = computed(() => dbmToMw(dbmInput.value).toFixed(3));
@@ -9,19 +12,19 @@ const dbmOutput = computed(() => mwToDbm(mwInput.value).toFixed(3));
912
</script>
1013

1114
<template>
12-
<c-card title="dBm to mW">
13-
<n-form-item label="dBm value:" label-placement="left">
15+
<c-card :title="t('tools.dbm-mw-converter.texts.title-dbm-to-mw')">
16+
<n-form-item :label="t('tools.dbm-mw-converter.texts.label-dbm-value')" label-placement="left">
1417
<n-input-number-i18n v-model:value="dbmInput" />
1518
</n-form-item>
1619

17-
<input-copyable label="Corresponding mW value:" label-position="left" :value="mwOutput" />
20+
<input-copyable :label="t('tools.dbm-mw-converter.texts.label-corresponding-mw-value')" label-position="left" :value="mwOutput" />
1821
</c-card>
1922

20-
<c-card title="mW to dBm">
21-
<n-form-item label="mW value:" label-placement="left">
23+
<c-card :title="t('tools.dbm-mw-converter.texts.title-mw-to-dbm')">
24+
<n-form-item :label="t('tools.dbm-mw-converter.texts.label-mw-value')" label-placement="left">
2225
<n-input-number-i18n v-model:value="mwInput" :min="0" />
2326
</n-form-item>
2427

25-
<input-copyable label="Corresponding dBm value:" label-position="left" :value="dbmOutput" />
28+
<input-copyable :label="t('tools.dbm-mw-converter.texts.label-corresponding-dbm-value')" label-position="left" :value="dbmOutput" />
2629
</c-card>
2730
</template>

src/tools/dbm-mw-converter/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { DeviceAudioTape } from '@vicons/tabler';
22
import { defineTool } from '../tool';
3+
import { translate as t } from '@/plugins/i18n.plugin';
34

45
export const tool = defineTool({
5-
name: 'dBm mW Converter',
6+
name: t('tools.dbm-mw-converter.title'),
67
path: '/dbm-mw-converter',
7-
description: 'Convert dBm to mW and conversely',
8+
description: t('tools.dbm-mw-converter.description'),
89
keywords: ['dbm', 'mw', 'converter'],
910
component: () => import('./dbm-mw-converter.vue'),
1011
icon: DeviceAudioTape,

0 commit comments

Comments
 (0)