Skip to content

Commit 044cb07

Browse files
feat(i18n): internationalize Monaco completion snippets (#102)
1 parent 5ee50fe commit 044cb07

File tree

3 files changed

+50
-24
lines changed

3 files changed

+50
-24
lines changed

src/app/src/locales/en.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@
166166
"image": "Image"
167167
},
168168
"writeSomething": "Write Something",
169+
"snippets": {
170+
"title": "title",
171+
"item1": "Item 1",
172+
"item2": "Item 2",
173+
"language": "language",
174+
"code": "code",
175+
"link": "link",
176+
"alt": "alt",
177+
"src": "src",
178+
"value": "value"
179+
},
169180
"docs": {
170181
"path": "Path in project:",
171182
"props": "Props",

src/app/src/locales/fr.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@
166166
"image": "Image"
167167
},
168168
"writeSomething": "Écrivez quelque chose",
169+
"snippets": {
170+
"title": "titre",
171+
"item1": "Élément 1",
172+
"item2": "Élément 2",
173+
"language": "langage",
174+
"code": "code",
175+
"link": "lien",
176+
"alt": "alt",
177+
"src": "src",
178+
"value": "valeur"
179+
},
169180
"docs": {
170181
"path": "Chemin dans le projet :",
171182
"props": "Props",

src/app/src/utils/monaco/mdc-compilation.ts

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export const setupSuggestion = (
126126

127127
const componentProps = findComponentProps(componentName, projectComponents.value as ComponentMeta[])
128128
const suggestions = componentProps.filter(prop => typeof attributes[prop.name] === 'undefined').map((prop) => {
129-
const insertText = `${prop.name}="\${1:${unwrapQuotes(prop.default || 'value')}}"`
129+
const insertText = `${prop.name}="\${1:${unwrapQuotes(prop.default || t('studio.monaco.snippets.value'))}}"`
130130
return {
131131
label: prop.name,
132132
filterText: prop.name,
@@ -162,42 +162,46 @@ function findComponentProps(componentName: string, components: ComponentMeta[])
162162
return component.meta.props || []
163163
}
164164

165+
function normalizeText(str: string) {
166+
return str.toLowerCase().normalize('NFD').replace(/[\u0300-\u036F]/g, '').replace(/ /g, '-')
167+
}
168+
165169
function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/', t: TFunction): CompletionItem[] {
166170
return [
167171
{
168172
label: t('studio.monaco.headings.h1'),
169-
filterText: trigger + 'heading 1',
173+
filterText: trigger + normalizeText(t('studio.monaco.headings.h1')),
170174
detail: '#',
171-
insertText: '# ${1:title}',
175+
insertText: `# \${1:${t('studio.monaco.snippets.title')}}`,
172176
kind: monaco.languages.CompletionItemKind.Function,
173177
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
174178
type: 'block',
175179
range,
176180
},
177181
{
178182
label: t('studio.monaco.headings.h2'),
179-
filterText: trigger + 'heading 2',
183+
filterText: trigger + normalizeText(t('studio.monaco.headings.h2')),
180184
detail: '##',
181-
insertText: '## ${1:title}',
185+
insertText: `## \${1:${t('studio.monaco.snippets.title')}}`,
182186
kind: monaco.languages.CompletionItemKind.Function,
183187
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
184188
type: 'block',
185189
range,
186190
},
187191
{
188192
label: t('studio.monaco.headings.h3'),
189-
filterText: trigger + 'heading 3',
193+
filterText: trigger + normalizeText(t('studio.monaco.headings.h3')),
190194
detail: '###',
191-
insertText: '### ${1:title}',
195+
insertText: `### \${1:${t('studio.monaco.snippets.title')}}`,
192196
kind: monaco.languages.CompletionItemKind.Function,
193197
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
194198
type: 'block',
195199
range,
196200
},
197201
{
198202
label: t('studio.monaco.styles.bold'),
199-
filterText: trigger + 'bold',
200-
insertText: '**${1:title}**',
203+
filterText: trigger + normalizeText(t('studio.monaco.styles.bold')),
204+
insertText: `**\${1:${t('studio.monaco.snippets.title')}}**`,
201205
detail: '**',
202206
kind: monaco.languages.CompletionItemKind.Field,
203207
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
@@ -206,8 +210,8 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
206210
},
207211
{
208212
label: t('studio.monaco.styles.italic'),
209-
filterText: trigger + 'italic',
210-
insertText: '_${1:title}_',
213+
filterText: trigger + normalizeText(t('studio.monaco.styles.italic')),
214+
insertText: `_\${1:${t('studio.monaco.snippets.title')}}_`,
211215
detail: '_',
212216
kind: monaco.languages.CompletionItemKind.Field,
213217
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
@@ -216,7 +220,7 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
216220
},
217221
{
218222
label: t('studio.monaco.other.emojis'),
219-
filterText: trigger + 'emoji',
223+
filterText: trigger + normalizeText(t('studio.monaco.other.emojis')),
220224
insertText: ':${1}:',
221225
detail: ':',
222226
kind: monaco.languages.CompletionItemKind.Field,
@@ -226,8 +230,8 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
226230
},
227231
{
228232
label: t('studio.monaco.lists.bulleted'),
229-
filterText: trigger + 'bulleted-list',
230-
insertText: '- ${1:Item 1}\n- ${2:Item 2}\n\n${3}',
233+
filterText: trigger + normalizeText(t('studio.monaco.lists.bulleted')),
234+
insertText: `- \${1:${t('studio.monaco.snippets.item1')}}\n- \${2:${t('studio.monaco.snippets.item2')}}\n\n\${3}`,
231235
detail: '-',
232236
kind: monaco.languages.CompletionItemKind.Function,
233237
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
@@ -236,8 +240,8 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
236240
},
237241
{
238242
label: t('studio.monaco.lists.numbered'),
239-
filterText: trigger + 'numbered-list',
240-
insertText: '1. ${1:Item 1}\n2. ${2:Item 2}\n\n${3}',
243+
filterText: trigger + normalizeText(t('studio.monaco.lists.numbered')),
244+
insertText: `1. \${1:${t('studio.monaco.snippets.item1')}}\n2. \${2:${t('studio.monaco.snippets.item2')}}\n\n\${3}`,
241245
detail: '1.',
242246
kind: monaco.languages.CompletionItemKind.Function,
243247
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
@@ -246,7 +250,7 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
246250
},
247251
{
248252
label: t('studio.monaco.other.blockquote'),
249-
filterText: trigger + 'blockquote',
253+
filterText: trigger + normalizeText(t('studio.monaco.other.blockquote')),
250254
insertText: '> ${1}\n> ${2}\n\n${3}',
251255
detail: '>',
252256
kind: monaco.languages.CompletionItemKind.Function,
@@ -256,8 +260,8 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
256260
},
257261
{
258262
label: t('studio.monaco.other.code'),
259-
filterText: trigger + 'code',
260-
insertText: '```${1:language}\n${2:code}\n```\n\n${3}',
263+
filterText: trigger + normalizeText(t('studio.monaco.other.code')),
264+
insertText: '```${1:' + t('studio.monaco.snippets.language') + '}\n${2:' + t('studio.monaco.snippets.code') + '}\n```\n\n${3}',
261265
detail: '```',
262266
kind: monaco.languages.CompletionItemKind.Function,
263267
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
@@ -266,7 +270,7 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
266270
},
267271
{
268272
label: t('studio.monaco.other.inlineCode'),
269-
filterText: trigger + 'code-inline',
273+
filterText: trigger + normalizeText(t('studio.monaco.other.inlineCode')),
270274
insertText: '`$1` $2',
271275
detail: '`',
272276
kind: monaco.languages.CompletionItemKind.Field,
@@ -276,23 +280,23 @@ function getGlobalCompletionItems(monaco: Monaco, range: IRange, trigger = '/',
276280
},
277281
{
278282
label: t('studio.monaco.other.link'),
279-
filterText: trigger + 'link',
283+
filterText: trigger + normalizeText(t('studio.monaco.other.link')),
280284
detail: '[]()',
281285
documentation: [
282286
'[Studio](https://content.nuxt.com)',
283287
].join('\n'),
284288
kind: monaco.languages.CompletionItemKind.Field,
285-
insertText: '[${1:title}](${2:link})',
289+
insertText: `[\${1:${t('studio.monaco.snippets.title')}}](\${2:${t('studio.monaco.snippets.link')}})`,
286290
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
287291
type: 'inline',
288292
range,
289293
},
290294
{
291295
label: t('studio.monaco.other.image'),
292-
filterText: trigger + 'image',
296+
filterText: trigger + normalizeText(t('studio.monaco.other.image')),
293297
detail: '![]()',
294298
kind: monaco.languages.CompletionItemKind.Field,
295-
insertText: '![${1:alt}](${2:src})',
299+
insertText: `![\${1:${t('studio.monaco.snippets.alt')}}](\${2:${t('studio.monaco.snippets.src')}})`,
296300
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
297301
type: 'inline',
298302
range,

0 commit comments

Comments
 (0)