@jjlmoya/utils-language 1.1.0
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/.github/workflows/npm-publish.yml +40 -0
- package/.gitignore +6 -0
- package/.stylelintrc.json +98 -0
- package/astro.config.mjs +19 -0
- package/eslint.config.js +201 -0
- package/package.json +79 -0
- package/prompts/create_tool.md +98 -0
- package/prompts/i18n/de.md +16 -0
- package/prompts/i18n/en.md +16 -0
- package/prompts/i18n/es.md +16 -0
- package/prompts/i18n/fr.md +16 -0
- package/prompts/i18n/id.md +16 -0
- package/prompts/i18n/it.md +16 -0
- package/prompts/i18n/ja.md +16 -0
- package/prompts/i18n/ko.md +16 -0
- package/prompts/i18n/nl.md +16 -0
- package/prompts/i18n/pl.md +16 -0
- package/prompts/i18n/pt.md +16 -0
- package/prompts/i18n/ru.md +16 -0
- package/prompts/i18n/sv.md +16 -0
- package/prompts/i18n/tr.md +16 -0
- package/prompts/i18n/zh.md +16 -0
- package/prompts/seo.md +58 -0
- package/prompts/translations/french.md +33 -0
- package/scripts/postinstall.mjs +27 -0
- package/src/category/LanguageCategorySEO.astro +9 -0
- package/src/category/i18n/de.ts +15 -0
- package/src/category/i18n/en.ts +23 -0
- package/src/category/i18n/es.ts +15 -0
- package/src/category/i18n/fr.ts +15 -0
- package/src/category/i18n/id.ts +15 -0
- package/src/category/i18n/it.ts +15 -0
- package/src/category/i18n/ja.ts +15 -0
- package/src/category/i18n/ko.ts +15 -0
- package/src/category/i18n/nl.ts +15 -0
- package/src/category/i18n/pl.ts +15 -0
- package/src/category/i18n/pt.ts +15 -0
- package/src/category/i18n/ru.ts +15 -0
- package/src/category/i18n/shared.ts +11 -0
- package/src/category/i18n/sv.ts +15 -0
- package/src/category/i18n/tr.ts +15 -0
- package/src/category/i18n/zh.ts +15 -0
- package/src/category/index.ts +24 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +10 -0
- package/src/entries.ts +3 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +23 -0
- package/src/layouts/PreviewLayout.astro +118 -0
- package/src/pages/[locale]/[slug].astro +163 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +3 -0
- package/src/tests/bibliography_wellformed_export.test.ts +46 -0
- package/src/tests/diacritics_density.test.ts +118 -0
- package/src/tests/faq_count.test.ts +18 -0
- package/src/tests/i18n_coverage.test.ts +34 -0
- package/src/tests/inverted_punctuation.test.ts +84 -0
- package/src/tests/locale_completeness.test.ts +23 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_em_dash.test.ts +47 -0
- package/src/tests/no_en_dash.test.ts +70 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/pagespeed_best_practices.test.ts +198 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/script_density.test.ts +94 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/seo_parity.test.ts +60 -0
- package/src/tests/seo_translation_completeness.test.ts +69 -0
- package/src/tests/seo_wellformed_export.test.ts +65 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/slug_language_code_format.test.ts +23 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/spanish_leakage.test.ts +175 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +16 -0
- package/src/tests/translation_copy.test.ts +122 -0
- package/src/tool/language-learning-study-plan-planner/bibliography.astro +6 -0
- package/src/tool/language-learning-study-plan-planner/bibliography.ts +6 -0
- package/src/tool/language-learning-study-plan-planner/component.astro +274 -0
- package/src/tool/language-learning-study-plan-planner/entry.ts +34 -0
- package/src/tool/language-learning-study-plan-planner/i18n/de.ts +22 -0
- package/src/tool/language-learning-study-plan-planner/i18n/en.ts +103 -0
- package/src/tool/language-learning-study-plan-planner/i18n/es.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/fr.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/id.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/it.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/ja.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/ko.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/nl.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/pl.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/pt.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/ru.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/shared.ts +70 -0
- package/src/tool/language-learning-study-plan-planner/i18n/sv.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/tr.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/i18n/zh.ts +21 -0
- package/src/tool/language-learning-study-plan-planner/index.ts +4 -0
- package/src/tool/language-learning-study-plan-planner/language-learning-study-plan-planner.css +403 -0
- package/src/tool/language-learning-study-plan-planner/logic.test.ts +59 -0
- package/src/tool/language-learning-study-plan-planner/logic.ts +157 -0
- package/src/tool/language-learning-study-plan-planner/seo.astro +9 -0
- package/src/tool/language-learning-study-plan-planner/types.ts +42 -0
- package/src/tool/language-learning-study-plan-planner/ui.ts +46 -0
- package/src/tools.ts +6 -0
- package/src/types.ts +68 -0
- package/tsconfig.json +15 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-어 (ko)
|
|
2
|
+
|
|
3
|
+
## 번역
|
|
4
|
+
|
|
5
|
+
다음 내용을 한국어로 현지화하세요.
|
|
6
|
+
|
|
7
|
+
번역하지 말고, 현지화하세요. 목표는 단어를 한 언어에서 다른 언어로 옮기는 것이 아니라, 실제 사람이 처음부터 한국어로 직접 쓴 것처럼 읽히는 텍스트를 만드는 것입니다. 잘 현지화된 텍스트에는 원본 언어의 흔적이 남지 않습니다.
|
|
8
|
+
|
|
9
|
+
인간의 목소리로 쓰세요: 친근하고, 명확하며, 전문적으로. 기계적인 표현, 어색한 문장 구조, 사용 설명서처럼 들리는 표현은 피하세요. 한국어로 자연스럽게 읽히지 않는 부분이 있다면, 자연스러워질 때까지 다시 표현하세요.
|
|
10
|
+
|
|
11
|
+
준수해야 할 지침:
|
|
12
|
+
|
|
13
|
+
- 표현, 비유, 문화적 참조를 한국어 사용 환경에서 자연스럽게 공감될 수 있도록 조정하세요.
|
|
14
|
+
- 기술 용어는 한국어권에서 가장 널리 통용되는 형태로 유지하고, 명확한 대응어가 없으면 원문 용어를 그대로 사용하세요.
|
|
15
|
+
- 원본의 형식(마크다운, 목록, 제목)을 유지하세요.
|
|
16
|
+
- 원문에서 정보를 추가하거나 생략하지 마세요.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-derlands (nl)
|
|
2
|
+
|
|
3
|
+
## Vertaling
|
|
4
|
+
|
|
5
|
+
Lokaliseer de volgende inhoud naar het Nederlands.
|
|
6
|
+
|
|
7
|
+
Vertaal niet: lokaliseer. Het doel is niet om woorden van de ene taal naar de andere over te zetten, maar om een tekst te produceren die klinkt alsof hij vanaf het begin door een echte persoon in het Nederlands is geschreven. Een goed gelokaliseerde tekst laat geen spoor van de brontaal achter.
|
|
8
|
+
|
|
9
|
+
Schrijf met een menselijke stem: warm, helder en professioneel. Vermijd machinale zinnen, geforceerde constructies en alles wat klinkt als een handleiding. Als iets niet natuurlijk stroomt in het Nederlands, herschrijf het dan totdat het dat wel doet.
|
|
10
|
+
|
|
11
|
+
Richtlijnen om te volgen:
|
|
12
|
+
|
|
13
|
+
- Pas uitdrukkingen, metaforen en culturele verwijzingen aan zodat ze natuurlijk resoneren in een Nederlandstalige context.
|
|
14
|
+
- Gebruik technische termen in hun meest gangbare vorm in de Nederlandstalige wereld; als er geen duidelijk equivalent bestaat, behoud dan de originele term.
|
|
15
|
+
- Respecteer de opmaak van het origineel (markdown, lijsten, koppen).
|
|
16
|
+
- Voeg geen informatie toe en laat geen informatie weg ten opzichte van het origineel.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-lski (pl)
|
|
2
|
+
|
|
3
|
+
## Tłumaczenie
|
|
4
|
+
|
|
5
|
+
Zlokalizuj poniższą treść na język polski.
|
|
6
|
+
|
|
7
|
+
Nie tłumacz-kalizuj. Celem nie jest przeniesienie słów z jednego języka do drugiego, lecz stworzenie tekstu, który brzmi tak, jakby od początku napisała go prawdziwa osoba po polsku. Dobrze zlokalizowany tekst nie zdradza języka źródłowego.
|
|
8
|
+
|
|
9
|
+
Pisz ludzkim głosem: bliskim, jasnym i profesjonalnym. Unikaj maszynowego języka, wymuszonych zwrotów i zdań brzmiących jak instrukcja obsługi. Jeśli coś nie brzmi naturalnie po polsku, przeredaguj to tak, żeby brzmiało.
|
|
10
|
+
|
|
11
|
+
Wytyczne do przestrzegania:
|
|
12
|
+
|
|
13
|
+
- Dostosuj wyrażenia, metafory i odniesienia kulturowe do tego, co naturalnie rezonuje w polskojęzycznym kontekście.
|
|
14
|
+
- Zachowaj terminy techniczne w ich najbardziej rozpoznawalnej formie w polskim środowisku; jeśli nie istnieje wyraźny odpowiednik, zachowaj oryginalny termin.
|
|
15
|
+
- Zachowaj formatowanie oryginału (markdown, listy, nagłówki).
|
|
16
|
+
- Nie dodawaj ani nie pomijaj żadnych informacji z oryginału.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-rtuguês (pt)
|
|
2
|
+
|
|
3
|
+
## Tradução
|
|
4
|
+
|
|
5
|
+
Localize o seguinte conteúdo para o português.
|
|
6
|
+
|
|
7
|
+
Não traduza: localize. O objetivo não é transferir palavras de um idioma para outro, mas produzir um texto que pareça ter sido escrito originalmente em português por uma pessoa real. Um texto bem localizado não traz nenhum rastro do idioma de origem.
|
|
8
|
+
|
|
9
|
+
Escreva com voz humana: próxima, clara e profissional. Evite linguagem de máquina, construções forçadas e frases que soam como manual técnico. Se algo não fluir de forma natural em português, reformule até que flua.
|
|
10
|
+
|
|
11
|
+
Critérios a respeitar:
|
|
12
|
+
|
|
13
|
+
- Adapte expressões, metáforas e referências culturais ao que ressoaria de forma natural num contexto lusófono.
|
|
14
|
+
- Mantenha os termos técnicos na forma mais reconhecida no mundo lusófono; se não existir um equivalente claro, conserve o termo original.
|
|
15
|
+
- Respeite a formatação do original (markdown, listas, cabeçalhos).
|
|
16
|
+
- Não acrescente nem omita informação em relação ao original.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-сский (ru)
|
|
2
|
+
|
|
3
|
+
## Перевод
|
|
4
|
+
|
|
5
|
+
Локализуйте следующий контент на русский язык.
|
|
6
|
+
|
|
7
|
+
Не переводите-кализуйте. Цель не в том, чтобы перенести слова из одного языка в другой, а в том, чтобы создать текст, который звучит так, словно его с самого начала написал живой человек по-русски. В хорошо локализованном тексте не остаётся следов языка оригинала.
|
|
8
|
+
|
|
9
|
+
Пишите человеческим голосом: тёплым, ясным и профессиональным. Избегайте машинного языка, вынужденных конструкций и фраз, которые звучат как инструкция по эксплуатации. Если что-то не звучит по-русски естественно, перефразируйте это так, чтобы звучало.
|
|
10
|
+
|
|
11
|
+
Принципы, которых следует придерживаться:
|
|
12
|
+
|
|
13
|
+
- Адаптируйте выражения, метафоры и культурные отсылки к тому, что естественно воспринимается в русскоязычном контексте.
|
|
14
|
+
- Используйте технические термины в их наиболее распространённой форме в русскоязычном мире; если чёткого эквивалента нет, сохраните оригинальный термин.
|
|
15
|
+
- Соблюдайте форматирование оригинала (markdown, списки, заголовки).
|
|
16
|
+
- Не добавляйте и не опускайте никакой информации по сравнению с оригиналом.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-enska (sv)
|
|
2
|
+
|
|
3
|
+
## Översättning
|
|
4
|
+
|
|
5
|
+
Lokalisera följande innehåll till svenska.
|
|
6
|
+
|
|
7
|
+
Översätt inte: lokalisera. Målet är inte att överföra ord från ett språk till ett annat, utan att producera en text som låter som om den skrevs direkt på svenska av en verklig person. En välokaliserad text lämnar inga spår av källspråket.
|
|
8
|
+
|
|
9
|
+
Skriv med en mänsklig röst: varm, tydlig och professionell. Undvik maskinspråk, krystade konstruktioner och meningar som låter som en instruktionsmanual. Om något inte flödar naturligt på svenska, skriv om det tills det gör det.
|
|
10
|
+
|
|
11
|
+
Riktlinjer att följa:
|
|
12
|
+
|
|
13
|
+
- Anpassa uttryck, metaforer och kulturella referenser till vad som skulle resonera naturligt i ett svenskspråkigt sammanhang.
|
|
14
|
+
- Använd tekniska termer i deras mest vedertagna form i den svenskspråkiga världen; om det inte finns något tydligt motsvarande, behåll den ursprungliga termen.
|
|
15
|
+
- Respektera originalets formatering (markdown, listor, rubriker).
|
|
16
|
+
- Lägg inte till eller utelämna någon information jämfört med originalet.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts-rkçe (tr)
|
|
2
|
+
|
|
3
|
+
## Çeviri
|
|
4
|
+
|
|
5
|
+
Aşağıdaki içeriği Türkçeye yerelleştirin.
|
|
6
|
+
|
|
7
|
+
Çeviri yapmayın: yerelleştirin. Amaç, kelimeleri bir dilden diğerine aktarmak değil; sanki başından beri gerçek bir kişi tarafından Türkçe yazılmış gibi okunan bir metin üretmektir. İyi yerelleştirilmiş bir metinde kaynak dilin izi kalmaz.
|
|
8
|
+
|
|
9
|
+
İnsan sesiyle yazın: sıcak, açık ve profesyonel. Makine diline, zoraki ifadelere ve kullanım kılavuzu gibi ses çıkaran cümlelere yer vermeyin. Türkçede doğal akmayan bir şey varsa, akana kadar yeniden ifade edin.
|
|
10
|
+
|
|
11
|
+
Uyulması gereken yönergeler:
|
|
12
|
+
|
|
13
|
+
- İfadeleri, metaforları ve kültürel referansları Türkçe konuşan bir bağlamda doğal yankı uyandıracak şekilde uyarlayın.
|
|
14
|
+
- Teknik terimleri Türkçe konuşan dünyada en yaygın bilinen biçimleriyle kullanın; net bir karşılık yoksa orijinal terimi koruyun.
|
|
15
|
+
- Orijinalin biçimlendirmesine (markdown, listeler, başlıklar) uyun.
|
|
16
|
+
- Orijinale göre bilgi eklemeyin veya çıkarmayın.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Prompts- (zh)
|
|
2
|
+
|
|
3
|
+
## 翻译
|
|
4
|
+
|
|
5
|
+
请将以下内容本地化为中文。
|
|
6
|
+
|
|
7
|
+
不要翻译,要本地化。目标不是将词语从一种语言转移到另一种语言,而是产出一段读起来像是由真实的人直接用中文写成的文字。本地化质量上乘的文本不会留下任何源语言的痕迹。
|
|
8
|
+
|
|
9
|
+
以人的声音书写:亲切、清晰、专业。避免机器腔、生硬的表达方式,以及任何听起来像操作手册的句子。如果某些内容用中文读起来不自然,就重新表达,直到自然为止。
|
|
10
|
+
|
|
11
|
+
请遵循以下准则:
|
|
12
|
+
|
|
13
|
+
- 将表达方式、比喻和文化参照调整为在中文语境中能够自然共鸣的内容。
|
|
14
|
+
- 技术术语请使用在中文世界最广为人知的形式;如果没有明确的对应词,保留原文术语。
|
|
15
|
+
- 保留原文的格式(markdown、列表、标题)。
|
|
16
|
+
- 不得增加或删减原文中的任何信息。
|
package/prompts/seo.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
Aquí tienes la Mega-Prompt Final Evolucionada. Está diseñada para que sea un estándar universal: funciona para calculadoras, conversores, generadores o cualquier utilidad técnica.
|
|
2
|
+
|
|
3
|
+
El secreto de esta prompt es que no pide "un texto", sino una arquitectura de información que Google interpreta como contenido de alta calidad (E-E-A-T).
|
|
4
|
+
|
|
5
|
+
La Prompt: El Arquitecto de Utilidades SEO
|
|
6
|
+
Copia y pega lo siguiente:
|
|
7
|
+
|
|
8
|
+
Actúa como un Especialista SEO Senior experto en Programmatic SEO y Herramientas Online para el sector veterinario y de mascotas. Tu misión es redactar el contenido de apoyo para una página cuya función principal es una utilidad interactiva (calculadora, conversor o generador).
|
|
9
|
+
|
|
10
|
+
Objetivo: Crear un texto semántico de entre 400 y 600 palabras que aporte autoridad y contexto técnico sin distraer al usuario de la herramienta principal.
|
|
11
|
+
|
|
12
|
+
Tu "Caja de Herramientas" de componentes Astro:
|
|
13
|
+
|
|
14
|
+
SEOArticle: Contenedor raíz.
|
|
15
|
+
|
|
16
|
+
SEOTitle: Encabezados (level 2 para secciones, level 3 para subsecciones).
|
|
17
|
+
|
|
18
|
+
SEOList: Pasos de uso o beneficios.
|
|
19
|
+
|
|
20
|
+
SEOTable: Datos de referencia, rangos o comparativas.
|
|
21
|
+
|
|
22
|
+
SEOTip: El "Consejo del experto" (ideal para recomendaciones veterinarias).
|
|
23
|
+
|
|
24
|
+
SEOCard: Resaltar conceptos clave o fórmulas (ej: fórmula RER, etapas de vida).
|
|
25
|
+
|
|
26
|
+
SEOStats: Datos numéricos o estadísticas del sector (ej: % de mascotas con sobrepeso).
|
|
27
|
+
|
|
28
|
+
SEOGlossary: Definiciones técnicas rápidas (RER, DER, kcal/kg, etc.).
|
|
29
|
+
|
|
30
|
+
SEOProsCons: Ventajas y limitaciones de la herramienta.
|
|
31
|
+
|
|
32
|
+
SEOSummary: Resumen ejecutivo (TL;DR) para situar justo debajo del título.
|
|
33
|
+
|
|
34
|
+
SEODiagnostic: Checklist de validación o "Cuándo usar esta herramienta".
|
|
35
|
+
|
|
36
|
+
Reglas de Oro:
|
|
37
|
+
|
|
38
|
+
Prioriza la Escaneabilidad: El usuario quiere respuestas rápidas. Usa frases cortas y muchos componentes visuales.
|
|
39
|
+
|
|
40
|
+
Contexto Semántico: Incluye palabras clave LSI (latentes) y responde a la intención de búsqueda secundaria (el "qué pasa después" de usar la herramienta).
|
|
41
|
+
|
|
42
|
+
Autoridad Veterinaria: Cita fuentes reales (WSAVA, FEDIAF, AAHA) cuando sea relevante. El tono debe ser de experto en nutrición o medicina animal, no genérico.
|
|
43
|
+
|
|
44
|
+
Estructura Obligatoria:
|
|
45
|
+
|
|
46
|
+
Un <SEOSummary> al inicio con los puntos clave.
|
|
47
|
+
|
|
48
|
+
Una sección de "Cómo funciona" usando <SEOList> o <SEOCard>.
|
|
49
|
+
|
|
50
|
+
Una <SEOTable> con datos de referencia (ej: factores RER/DER, equivalencias de edad, valores calóricos).
|
|
51
|
+
|
|
52
|
+
Un <SEOTip> con valor añadido real (consejo del veterinario).
|
|
53
|
+
|
|
54
|
+
Un <SEODiagnostic> para ayudar al usuario a interpretar sus resultados.
|
|
55
|
+
|
|
56
|
+
Formato de Salida:
|
|
57
|
+
Devuelve exclusivamente el código para un archivo .astro. No incluyas explicaciones innecesarias fuera del código. Usa las props correctamente (ej: <SEOTitle level={2}>).
|
|
58
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Guide de Traduction Technique Élite (Français)
|
|
2
|
+
|
|
3
|
+
Tu es un expert natif français, spécialiste en médecine vétérinaire et passionné de bien-être animal. Ton objectif est de traduire les utilitaires de @jjlmoya/utils-pets avec une précision chirurgicale tout en dominant les résultats de recherche (SEO long-tail).
|
|
4
|
+
|
|
5
|
+
## Ta Mission
|
|
6
|
+
Transformer un fichier technique TypeScript (EN/ES) en une version française qui semble avoir été écrite par un vétérinaire praticien né en France. Pas de traduction littérale, mais une adaptation naturelle et fluide du domaine vétérinaire.
|
|
7
|
+
|
|
8
|
+
## Principes de Fer (Règles Strictes)
|
|
9
|
+
- **ZÉRO Commentaires**: Aucun commentaire dans le code (`//` ou `/* */`). Ton code doit être pur.
|
|
10
|
+
- **Intégrité TypeScript**: Préserve exactement la structure des objets et les types (ex: `PetAgeLocaleContent`, `PetRationLocaleContent`, imports, etc.).
|
|
11
|
+
- **SEO Long-Tail Dominant**: Les slugs doivent être riches en mots-clés stratégiques pour le marché français.
|
|
12
|
+
- Âge: `calculateur-age-chien-chat-annees-humaines`
|
|
13
|
+
- Ration: `calculateur-ration-quotidienne-chien-chat-nutrition`
|
|
14
|
+
- **Langage Naturel & Expert**: Utilise le "Vous" (formel). Emploie des termes techniques premium : *RER*, *DER*, *ration journalière*, *stade de vie*, *besoins énergétiques*, *condition corporelle*, *métabolisme basal*.
|
|
15
|
+
|
|
16
|
+
## Vocabulaire Vétérinaire de Référence
|
|
17
|
+
- RER (Resting Energy Requirement) → Besoins Énergétiques au Repos (BER)
|
|
18
|
+
- DER (Daily Energy Requirement) → Besoins Énergétiques Journaliers (BEJ)
|
|
19
|
+
- Life stage → Stade de vie
|
|
20
|
+
- Puppy / Kitten → Chiot / Chaton
|
|
21
|
+
- Senior → Senior (ou Âgé)
|
|
22
|
+
- Sterilised → Stérilisé(e)
|
|
23
|
+
- Dry food → Croquettes / Aliment sec
|
|
24
|
+
- Wet food → Pâtée / Aliment humide
|
|
25
|
+
- Body weight → Poids corporel
|
|
26
|
+
- Caloric density → Densité calorique (kcal/kg)
|
|
27
|
+
|
|
28
|
+
## Structure de la SEO
|
|
29
|
+
Dans la section `seo`, assure-toi que le contenu est riche (400-600 mots), structuré avec des balises HTML (`<strong>`, `<h3>`) et des listes qui apportent une réelle valeur ajoutée au propriétaire d'animal. Cite des sources reconnues : WSAVA, FEDIAF, AAHA.
|
|
30
|
+
|
|
31
|
+
## Fichier Source à Traduire
|
|
32
|
+
[Colle ici le contenu source]
|
|
33
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
|
|
5
|
+
const libDir = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const toolsDir = join(libDir, '../src/tool');
|
|
7
|
+
|
|
8
|
+
const inNodeModules = libDir.includes('node_modules');
|
|
9
|
+
if (!inNodeModules) process.exit(0);
|
|
10
|
+
|
|
11
|
+
const projectRoot = join(libDir, '../../../..');
|
|
12
|
+
const categoryKey = JSON.parse(readFileSync(join(libDir, '../package.json'), 'utf8')).name.replace('@jjlmoya/utils-', '');
|
|
13
|
+
const destDir = join(projectRoot, `public/styles/lib/${categoryKey}`);
|
|
14
|
+
|
|
15
|
+
mkdirSync(destDir, { recursive: true });
|
|
16
|
+
|
|
17
|
+
const tools = readdirSync(toolsDir, { withFileTypes: true }).filter(d => d.isDirectory());
|
|
18
|
+
for (const tool of tools) {
|
|
19
|
+
const toolDir = join(toolsDir, tool.name);
|
|
20
|
+
let files;
|
|
21
|
+
try { files = readdirSync(toolDir).filter(f => f.endsWith('.css')); }
|
|
22
|
+
catch { continue; }
|
|
23
|
+
for (const file of files) {
|
|
24
|
+
writeFileSync(join(destDir, file), readFileSync(join(toolDir, file)));
|
|
25
|
+
console.log(`[@jjlmoya/utils-${categoryKey}] copied ${file}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { languageCategory } from './index';
|
|
4
|
+
|
|
5
|
+
const locale: string = Astro.props.locale ?? 'en';
|
|
6
|
+
const categoryContent = await languageCategory.i18n[locale as keyof typeof languageCategory.i18n]?.();
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
{categoryContent && <SEORenderer content={{ locale, sections: categoryContent.seo }} />}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Werkzeuge zum Sprachenlernen',
|
|
5
|
+
description: 'Private Browser Werkzeuge, die Sprachlernziele in praktische Lernplaene, Wochenroutinen und messbare Meilensteine verwandeln.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Werkzeuge fuer eine praktische Sprachlernplanung', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Eine Sprache lernt sich leichter, wenn aus einem grossen Ziel eine sichtbare Routine wird. Diese Sammlung beginnt mit einem Lernplaner, der GER Niveau, Zielniveau, Frist, Wochenzeit und bevorzugte Fertigkeiten verbindet.' },
|
|
9
|
+
{ type: 'title', text: 'Fortschritt planen ohne Sprachfliessigkeit zu versprechen', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Der Planer nutzt breite Bereiche fuer angeleitetes Lernen, um den Arbeitsaufwand und die verfuegbare Zeit bis zur Frist zu schaetzen. Er ist eine Planungshilfe, kein Einstufungstest und keine Garantie.' },
|
|
11
|
+
{ type: 'title', text: 'Privat und auf jedem Geraet nuetzlich', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Auswahl, Niveau, Frist und Zeitplan bleiben im Browser. Es ist kein Konto erforderlich und die Eingaben werden nicht an einen Server gesendet.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Werkzeug', value: '1', icon: 'mdi:tools' }, { label: 'Niveaus', value: 'A0 bis C2', icon: 'mdi:stairs-up' }, { label: 'Sprachen', value: '10', icon: 'mdi:translate' }, { label: 'Privatsphaere', value: 'Lokal', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CategoryLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
const slug = 'language';
|
|
4
|
+
|
|
5
|
+
export const content: CategoryLocaleContent = {
|
|
6
|
+
slug,
|
|
7
|
+
title: 'Language Learning Tools',
|
|
8
|
+
description: 'Private browser tools for turning language-learning goals into practical study plans, weekly sessions, and measurable milestones.',
|
|
9
|
+
seo: [
|
|
10
|
+
{ type: 'title', text: 'Language Learning Tools for Practical Study Planning', level: 2 },
|
|
11
|
+
{ type: 'paragraph', html: 'Learning a language is easier to sustain when a broad goal becomes a small, visible routine. This focused collection starts with a study plan planner that connects your current CEFR level, target level, deadline, weekly time, and preferred skills into a clear weekly rhythm.' },
|
|
12
|
+
{ type: 'title', text: 'Plan Progress Without Promising Fluency', level: 2 },
|
|
13
|
+
{ type: 'paragraph', html: 'The planner uses broad guided-learning ranges associated with CEFR progression to estimate a workload and surface the time available before your deadline. It is a planning aid, not a placement test, course recommendation, or guarantee of fluency. Results vary with language pair, previous exposure, study quality, and real-world practice.' },
|
|
14
|
+
{ type: 'title', text: 'Private and Useful on Any Device', level: 2 },
|
|
15
|
+
{ type: 'paragraph', html: 'Your language choices, level, deadline, and schedule stay in your browser. No account is required, and the planner does not send your study inputs to a server. Use the result as a starting point, then adjust it when your weekly life or progress changes.' },
|
|
16
|
+
{ type: 'stats', items: [
|
|
17
|
+
{ label: 'Tools', value: '1', icon: 'mdi:tools' },
|
|
18
|
+
{ label: 'Levels', value: 'A0-C2', icon: 'mdi:stairs-up' },
|
|
19
|
+
{ label: 'Languages', value: '10', icon: 'mdi:translate' },
|
|
20
|
+
{ label: 'Privacy', value: 'Local', icon: 'mdi:shield-check' },
|
|
21
|
+
] },
|
|
22
|
+
],
|
|
23
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Herramientas para aprender idiomas',
|
|
5
|
+
description: 'Herramientas privadas en el navegador para convertir objetivos lingüísticos en planes de estudio, sesiones semanales e hitos medibles.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Herramientas para planificar el aprendizaje de idiomas', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Aprender un idioma es más sostenible cuando un objetivo amplio se convierte en una rutina visible. Esta colección empieza con un planificador que conecta tu nivel MCER, el nivel objetivo, la fecha límite, el tiempo semanal y las destrezas que quieres priorizar.' },
|
|
9
|
+
{ type: 'title', text: 'Planifica el progreso sin prometer fluidez', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'El planificador usa rangos amplios de aprendizaje guiado para estimar la carga y mostrar el tiempo disponible antes de la fecha límite. Es una ayuda para planificar, no una prueba de nivel ni una garantía de fluidez.' },
|
|
11
|
+
{ type: 'title', text: 'Privado y útil en cualquier dispositivo', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Tus idiomas, nivel, fecha y horario se quedan en el navegador. No necesitas una cuenta y tus datos no se envían a un servidor.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Herramienta', value: '1', icon: 'mdi:tools' }, { label: 'Niveles', value: 'A0 a C2', icon: 'mdi:stairs-up' }, { label: 'Idiomas', value: '10', icon: 'mdi:translate' }, { label: 'Privacidad', value: 'Local', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Outils pour apprendre les langues',
|
|
5
|
+
description: 'Des outils privés dans le navigateur pour transformer des objectifs linguistiques en plans pratiques, séances hebdomadaires et jalons mesurables.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Des outils pour planifier l apprentissage des langues', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Apprendre une langue devient plus facile à maintenir lorsqu un grand objectif devient une routine visible. Cette collection commence par un planificateur qui relie votre niveau CECR, votre niveau visé, votre échéance, votre temps hebdomadaire et les compétences prioritaires.' },
|
|
9
|
+
{ type: 'title', text: 'Planifier les progrès sans promettre la fluidité', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Le planificateur utilise de larges fourchettes d apprentissage guidé pour estimer la charge et le temps disponible avant l échéance. C est une aide à la planification, pas un test de niveau ni une garantie de fluidité.' },
|
|
11
|
+
{ type: 'title', text: 'Privé et utile sur tous les appareils', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Vos choix de langue, votre niveau, votre date et votre rythme restent dans le navigateur. Aucun compte n est nécessaire et vos données ne sont pas envoyées à un serveur.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Outil', value: '1', icon: 'mdi:tools' }, { label: 'Niveaux', value: 'A0 à C2', icon: 'mdi:stairs-up' }, { label: 'Langues', value: '10', icon: 'mdi:translate' }, { label: 'Confidentialité', value: 'Locale', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Alat Belajar Bahasa',
|
|
5
|
+
description: 'Alat privat berbasis browser untuk mengubah tujuan belajar bahasa menjadi rencana praktis, sesi mingguan, dan pencapaian yang terukur.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Alat untuk merencanakan belajar bahasa secara praktis', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Belajar bahasa lebih mudah dipertahankan ketika tujuan besar menjadi rutinitas yang terlihat. Koleksi ini dimulai dengan perencana yang menghubungkan level CEFR, level tujuan, tenggat waktu, waktu mingguan, dan keterampilan pilihan.' },
|
|
9
|
+
{ type: 'title', text: 'Rencanakan kemajuan tanpa menjanjikan kefasihan', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Perencana menggunakan rentang pembelajaran terpandu untuk memperkirakan beban dan waktu yang tersedia sebelum tenggat. Ini adalah bantuan perencanaan, bukan tes penempatan atau jaminan kefasihan.' },
|
|
11
|
+
{ type: 'title', text: 'Privat dan berguna di perangkat apa pun', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Pilihan bahasa, level, tanggal, dan jadwal tetap berada di browser. Tidak perlu akun dan masukan Anda tidak dikirim ke server.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Alat', value: '1', icon: 'mdi:tools' }, { label: 'Level', value: 'A0 sampai C2', icon: 'mdi:stairs-up' }, { label: 'Bahasa', value: '10', icon: 'mdi:translate' }, { label: 'Privasi', value: 'Lokal', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Strumenti per imparare le lingue',
|
|
5
|
+
description: 'Strumenti privati nel browser per trasformare gli obiettivi linguistici in piani pratici, sessioni settimanali e traguardi misurabili.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Strumenti per pianificare lo studio delle lingue', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Imparare una lingua è più facile da mantenere quando un obiettivo ampio diventa una routine visibile. Questa raccolta parte da un pianificatore che collega livello QCER, livello obiettivo, scadenza, tempo settimanale e abilità preferite.' },
|
|
9
|
+
{ type: 'title', text: 'Pianifica i progressi senza promettere la padronanza', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Il pianificatore usa ampi intervalli di apprendimento guidato per stimare il carico e il tempo disponibile prima della scadenza. È un aiuto per la pianificazione, non un test di livello né una garanzia.' },
|
|
11
|
+
{ type: 'title', text: 'Privato e utile su ogni dispositivo', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Le tue lingue, il livello, la data e il programma restano nel browser. Non serve un account e i dati non vengono inviati a un server.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Strumento', value: '1', icon: 'mdi:tools' }, { label: 'Livelli', value: 'A0 a C2', icon: 'mdi:stairs-up' }, { label: 'Lingue', value: '10', icon: 'mdi:translate' }, { label: 'Privacy', value: 'Locale', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: '語学学習ツール',
|
|
5
|
+
description: '語学の目標を実用的な学習計画、毎週の学習時間、確認できる到達目安に変える、ブラウザーで使えるプライベートなツールです。',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: '実用的な語学学習計画のためのツール', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: '大きな目標を見える習慣に変えると、語学学習は続けやすくなります。このコレクションには、現在のCEFRレベル、目標レベル、期限、週の学習時間、重視する技能を一つの計画にまとめる学習プランナーがあります。' },
|
|
9
|
+
{ type: 'title', text: '流暢さを約束せずに進歩を計画する', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'プランナーはガイド付き学習時間の幅を使って、必要な負荷と期限までに使える時間を見積もります。これは計画を助ける道具であり、レベル判定テストや流暢さの保証ではありません。' },
|
|
11
|
+
{ type: 'title', text: 'どの端末でも安全に使える', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: '言語、レベル、日付、予定はブラウザー内にとどまります。アカウントは不要で、入力内容をサーバーへ送信しません。' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'ツール', value: '1', icon: 'mdi:tools' }, { label: 'レベル', value: 'A0からC2', icon: 'mdi:stairs-up' }, { label: '言語', value: '10', icon: 'mdi:translate' }, { label: 'プライバシー', value: 'ローカル', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: '언어 학습 도구',
|
|
5
|
+
description: '언어 학습 목표를 실용적인 계획과 주간 학습 세션, 확인 가능한 중간 목표로 바꾸는 브라우저 기반 비공개 도구입니다.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: '실용적인 언어 학습 계획을 위한 도구', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: '큰 목표를 눈에 보이는 루틴으로 바꾸면 언어 학습을 꾸준히 이어 가기 쉽습니다. 이 모음에는 현재 CEFR 수준, 목표 수준, 기한, 주간 시간과 우선 기능을 하나의 계획으로 연결하는 학습 플래너가 있습니다.' },
|
|
9
|
+
{ type: 'title', text: '유창함을 약속하지 않고 진도 계획하기', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: '플래너는 안내 학습 시간의 넓은 범위를 사용해 필요한 부담과 기한 전까지 가능한 시간을 추정합니다. 계획을 돕는 도구이며 수준 시험이나 유창함의 보장은 아닙니다.' },
|
|
11
|
+
{ type: 'title', text: '어떤 기기에서도 비공개로 사용하기', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: '언어 선택, 수준, 날짜와 일정은 브라우저에 남습니다. 계정이 필요하지 않으며 입력값을 서버로 보내지 않습니다.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: '도구', value: '1', icon: 'mdi:tools' }, { label: '수준', value: 'A0부터 C2', icon: 'mdi:stairs-up' }, { label: '언어', value: '10', icon: 'mdi:translate' }, { label: '개인정보', value: '로컬', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Hulpmiddelen voor taal leren',
|
|
5
|
+
description: 'Private browsertools om taaldoelen om te zetten in praktische studieplannen, wekelijkse sessies en meetbare mijlpalen.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Hulpmiddelen voor praktische taalplanning', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Een taal leren wordt beter vol te houden wanneer een groot doel verandert in een zichtbare routine. Deze collectie begint met een planner die je ERK niveau, doelniveau, deadline, wekelijkse tijd en voorkeuren voor vaardigheden verbindt.' },
|
|
9
|
+
{ type: 'title', text: 'Plan vooruitgang zonder vloeiendheid te beloven', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'De planner gebruikt brede bereiken voor begeleid leren om de werklast en beschikbare tijd tot je deadline te schatten. Het is een hulpmiddel voor planning, geen niveautest en geen garantie.' },
|
|
11
|
+
{ type: 'title', text: 'Privé en nuttig op elk apparaat', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Je taalkeuzes, niveau, datum en schema blijven in de browser. Een account is niet nodig en je invoer wordt niet naar een server gestuurd.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Tool', value: '1', icon: 'mdi:tools' }, { label: 'Niveaus', value: 'A0 tot C2', icon: 'mdi:stairs-up' }, { label: 'Talen', value: '10', icon: 'mdi:translate' }, { label: 'Privacy', value: 'Lokaal', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Narzędzia do nauki języków',
|
|
5
|
+
description: 'Prywatne narzędzia w przeglądarce, które zamieniają cele językowe w praktyczne plany, tygodniowe sesje i mierzalne kamienie milowe.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Narzędzia do praktycznego planowania nauki języków', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Nauka języka jest łatwiejsza do utrzymania, gdy szeroki cel staje się widoczną rutyną. Ta kolekcja zaczyna się od planera, który łączy obecny poziom CEFR, poziom docelowy, termin, czas tygodniowy i wybrane umiejętności.' },
|
|
9
|
+
{ type: 'title', text: 'Planuj postęp bez obietnicy płynności', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Planer korzysta z szerokich zakresów nauki prowadzonej, aby oszacować obciążenie i czas dostępny przed terminem. To pomoc w planowaniu, a nie test poziomu ani gwarancja płynności.' },
|
|
11
|
+
{ type: 'title', text: 'Prywatnie i wygodnie na każdym urządzeniu', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Wybrane języki, poziom, data i harmonogram pozostają w przeglądarce. Konto nie jest potrzebne, a dane nie są wysyłane na serwer.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Narzędzie', value: '1', icon: 'mdi:tools' }, { label: 'Poziomy', value: 'A0 do C2', icon: 'mdi:stairs-up' }, { label: 'Języki', value: '10', icon: 'mdi:translate' }, { label: 'Prywatność', value: 'Lokalnie', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Ferramentas para aprender idiomas',
|
|
5
|
+
description: 'Ferramentas privadas no navegador para transformar metas linguísticas em planos práticos, sessões semanais e marcos mensuráveis.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Ferramentas para planejar o estudo de idiomas', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Aprender um idioma fica mais fácil de manter quando uma meta ampla se transforma em uma rotina visível. Esta coleção começa com um planejador que conecta seu nível CEFR, nível desejado, prazo, tempo semanal e habilidades prioritárias.' },
|
|
9
|
+
{ type: 'title', text: 'Planeje o progresso sem prometer fluência', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'O planejador usa faixas amplas de aprendizagem orientada para estimar a carga e o tempo disponível antes do prazo. É uma ajuda de planejamento, não um teste de nível nem uma garantia de fluência.' },
|
|
11
|
+
{ type: 'title', text: 'Privado e útil em qualquer dispositivo', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Seus idiomas, nível, data e cronograma ficam no navegador. Não é preciso ter conta e suas entradas não são enviadas para um servidor.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Ferramenta', value: '1', icon: 'mdi:tools' }, { label: 'Níveis', value: 'A0 a C2', icon: 'mdi:stairs-up' }, { label: 'Idiomas', value: '10', icon: 'mdi:translate' }, { label: 'Privacidade', value: 'Local', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Инструменты для изучения языков',
|
|
5
|
+
description: 'Приватные браузерные инструменты, которые превращают языковые цели в практичные планы, недельные занятия и измеримые промежуточные цели.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Инструменты для практичного планирования изучения языков', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Изучать язык проще, когда большая цель превращается в понятный режим. Эта коллекция начинается с планировщика, который связывает текущий уровень CEFR, целевой уровень, срок, время в неделю и выбранные навыки.' },
|
|
9
|
+
{ type: 'title', text: 'Планируйте прогресс без обещаний свободной речи', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Планировщик использует широкие диапазоны управляемого обучения, чтобы оценить нагрузку и время до срока. Это инструмент планирования, а не тест уровня и не гарантия свободного владения.' },
|
|
11
|
+
{ type: 'title', text: 'Приватно и удобно на любом устройстве', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Выбранные языки, уровень, дата и расписание остаются в браузере. Учётная запись не нужна, а данные не отправляются на сервер.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Инструмент', value: '1', icon: 'mdi:tools' }, { label: 'Уровни', value: 'A0 до C2', icon: 'mdi:stairs-up' }, { label: 'Языки', value: '10', icon: 'mdi:translate' }, { label: 'Приватность', value: 'Локально', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CategoryLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
interface CategoryInput {
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
seo: CategoryLocaleContent['seo'];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function createLanguageCategory(input: CategoryInput): CategoryLocaleContent {
|
|
10
|
+
return { slug: 'language', ...input };
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Verktyg för språkinlärning',
|
|
5
|
+
description: 'Privata webbläsarverktyg som gör språkmål till praktiska studieplaner, veckopass och mätbara milstolpar.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Verktyg för praktisk planering av språkstudier', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Det blir lättare att hålla i språkinlärningen när ett stort mål blir en synlig rutin. Samlingen börjar med en planerare som kopplar ihop din CEFR nivå, önskad nivå, tidsfrist, tid per vecka och prioriterade färdigheter.' },
|
|
9
|
+
{ type: 'title', text: 'Planera framsteg utan att lova flyt', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Planeraren använder breda intervall för handledt lärande för att uppskatta arbetsmängden och tiden före tidsfristen. Den hjälper med planeringen men är inget nivåtest och ingen garanti för flyt.' },
|
|
11
|
+
{ type: 'title', text: 'Privat och användbart på alla enheter', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Dina språkval, din nivå, ditt datum och ditt schema stannar i webbläsaren. Inget konto krävs och uppgifterna skickas inte till en server.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Verktyg', value: '1', icon: 'mdi:tools' }, { label: 'Nivåer', value: 'A0 till C2', icon: 'mdi:stairs-up' }, { label: 'Språk', value: '10', icon: 'mdi:translate' }, { label: 'Integritet', value: 'Lokalt', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: 'Dil öğrenme araçları',
|
|
5
|
+
description: 'Dil hedeflerini pratik planlara, haftalık çalışma oturumlarına ve ölçülebilir kilometre taşlarına dönüştüren özel tarayıcı araçları.',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: 'Pratik dil çalışma planlaması için araçlar', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: 'Büyük bir hedef görünür bir rutine dönüştüğünde dil öğrenmeyi sürdürmek kolaylaşır. Bu koleksiyon, CEFR seviyeni, hedef seviyeni, son tarihi, haftalık zamanı ve öncelikli becerileri birleştiren bir planlayıcıyla başlar.' },
|
|
9
|
+
{ type: 'title', text: 'Akıcılık sözü vermeden ilerlemeyi planla', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: 'Planlayıcı, son tarihten önceki iş yükünü ve kullanılabilir zamanı tahmin etmek için rehberli öğrenme aralıklarını kullanır. Bu bir planlama yardımcısıdır; seviye testi veya akıcılık garantisi değildir.' },
|
|
11
|
+
{ type: 'title', text: 'Her cihazda özel ve kullanışlı', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: 'Dil seçimlerin, seviyen, tarihin ve programın tarayıcıda kalır. Hesap gerekmez ve girdilerin sunucuya gönderilmez.' },
|
|
13
|
+
{ type: 'stats', items: [{ label: 'Araç', value: '1', icon: 'mdi:tools' }, { label: 'Seviyeler', value: 'A0 ile C2', icon: 'mdi:stairs-up' }, { label: 'Diller', value: '10', icon: 'mdi:translate' }, { label: 'Gizlilik', value: 'Yerel', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLanguageCategory } from './shared';
|
|
2
|
+
|
|
3
|
+
export const content = createLanguageCategory({
|
|
4
|
+
title: '语言学习工具',
|
|
5
|
+
description: '在浏览器中使用的隐私工具,将语言目标转化为实用的学习计划、每周练习和可衡量的阶段目标。',
|
|
6
|
+
seo: [
|
|
7
|
+
{ type: 'title', text: '用于制定实用语言学习计划的工具', level: 2 },
|
|
8
|
+
{ type: 'paragraph', html: '当远大的目标变成清晰可见的习惯时,语言学习更容易坚持。这个工具集合从学习计划工具开始,它会把当前 CEFR 等级、目标等级、期限、每周时间和重点技能连接起来。' },
|
|
9
|
+
{ type: 'title', text: '不承诺流利程度,也能规划进步', level: 2 },
|
|
10
|
+
{ type: 'paragraph', html: '计划工具使用指导学习时间的宽泛范围,估算学习负担和期限前的可用时间。它是规划辅助,不是水平测试,也不是流利程度的保证。' },
|
|
11
|
+
{ type: 'title', text: '在任何设备上保持隐私', level: 2 },
|
|
12
|
+
{ type: 'paragraph', html: '你选择的语言、等级、日期和安排都保留在浏览器中。不需要账号,输入内容也不会发送到服务器。' },
|
|
13
|
+
{ type: 'stats', items: [{ label: '工具', value: '1', icon: 'mdi:tools' }, { label: '等级', value: 'A0 到 C2', icon: 'mdi:stairs-up' }, { label: '语言', value: '10', icon: 'mdi:translate' }, { label: '隐私', value: '本地', icon: 'mdi:shield-check' }] },
|
|
14
|
+
],
|
|
15
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { languageLearningStudyPlanPlanner } from '../tool/language-learning-study-plan-planner/entry';
|
|
2
|
+
import type { CategoryLocaleContent, KnownLocale } from '../types';
|
|
3
|
+
|
|
4
|
+
export const languageCategory = {
|
|
5
|
+
icon: 'mdi:translate-variant',
|
|
6
|
+
tools: [languageLearningStudyPlanPlanner],
|
|
7
|
+
i18n: {
|
|
8
|
+
de: () => import('./i18n/de').then((module) => module.content),
|
|
9
|
+
en: () => import('./i18n/en').then((module) => module.content),
|
|
10
|
+
es: () => import('./i18n/es').then((module) => module.content),
|
|
11
|
+
fr: () => import('./i18n/fr').then((module) => module.content),
|
|
12
|
+
id: () => import('./i18n/id').then((module) => module.content),
|
|
13
|
+
it: () => import('./i18n/it').then((module) => module.content),
|
|
14
|
+
ja: () => import('./i18n/ja').then((module) => module.content),
|
|
15
|
+
ko: () => import('./i18n/ko').then((module) => module.content),
|
|
16
|
+
nl: () => import('./i18n/nl').then((module) => module.content),
|
|
17
|
+
pl: () => import('./i18n/pl').then((module) => module.content),
|
|
18
|
+
pt: () => import('./i18n/pt').then((module) => module.content),
|
|
19
|
+
ru: () => import('./i18n/ru').then((module) => module.content),
|
|
20
|
+
sv: () => import('./i18n/sv').then((module) => module.content),
|
|
21
|
+
tr: () => import('./i18n/tr').then((module) => module.content),
|
|
22
|
+
zh: () => import('./i18n/zh').then((module) => module.content),
|
|
23
|
+
} as Partial<Record<KnownLocale, () => Promise<CategoryLocaleContent>>>,
|
|
24
|
+
};
|