@harness-engineering/cli 1.7.0 → 1.8.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/dist/agents/personas/documentation-maintainer.yaml +3 -1
- package/dist/agents/personas/performance-guardian.yaml +23 -0
- package/dist/agents/skills/claude-code/align-documentation/SKILL.md +13 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +25 -1
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +12 -0
- package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +48 -1
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +7 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +9 -1
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +76 -4
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +487 -234
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +15 -2
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +226 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +64 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +69 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +73 -8
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/claude-code/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +54 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +53 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +17 -1
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/claude-code/harness-perf/SKILL.md +37 -8
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/SKILL.md +17 -4
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +57 -3
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +16 -0
- package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +562 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +36 -2
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +8 -6
- package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +48 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +66 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/SKILL.md +11 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +15 -1
- package/dist/agents/skills/claude-code/validate-context-engineering/SKILL.md +12 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +7 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +9 -1
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +226 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +64 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +69 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/gemini-cli/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +54 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +53 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +37 -8
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/SKILL.md +17 -4
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +16 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +562 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +8 -6
- package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +48 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/shared/i18n-knowledge/accessibility/intersection.yaml +142 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/encoding.yaml +67 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/formatting.yaml +106 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/layout.yaml +80 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/pluralization.yaml +80 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/string-handling.yaml +106 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/android-resources.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/apple-strings.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/backend-patterns.yaml +50 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/flutter-intl.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/i18next.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/react-intl.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/vue-i18n.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/ecommerce.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/fintech.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/gaming.yaml +69 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/healthcare.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/legal.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ar.yaml +41 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/de.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/en.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/es.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/fi.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/fr.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/he.yaml +41 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/hi.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/it.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ja.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ko.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/nl.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/pl.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/pt.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ru.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/sv.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/th.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/tr.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hans.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hant.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/i18next-mcp.yaml +56 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lingo-dev.yaml +56 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lokalise.yaml +60 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/tolgee.yaml +60 -0
- package/dist/agents/skills/shared/i18n-knowledge/testing/locale-testing.yaml +107 -0
- package/dist/agents/skills/shared/i18n-knowledge/testing/pseudo-localization.yaml +86 -0
- package/dist/bin/harness.js +64 -4
- package/dist/{chunk-4WUGOJQ7.js → chunk-3JWCBVUZ.js} +1 -1
- package/dist/{chunk-FFIX3QVG.js → chunk-LNI4T7R6.js} +131 -41
- package/dist/{chunk-GA6GN5J2.js → chunk-SJECMKSS.js} +2244 -34
- package/dist/{dist-N4D4QWFV.js → dist-BDO5GFEM.js} +1 -1
- package/dist/{dist-C4J67MPP.js → dist-NT3GXHQZ.js} +95 -1
- package/dist/index.d.ts +187 -7
- package/dist/index.js +7 -3
- package/dist/validate-cross-check-2OPGCGGU.js +7 -0
- package/package.json +7 -7
- package/dist/validate-cross-check-WGXQ7K62.js +0 -7
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: "Healthcare"
|
|
2
|
+
description: "i18n challenges in healthcare — patient safety through unambiguous dates, medical terminology precision, and regulatory compliance"
|
|
3
|
+
|
|
4
|
+
requirements:
|
|
5
|
+
- area: "Date Format Safety"
|
|
6
|
+
description: "Ambiguous dates in medical contexts can be life-threatening — 01/02 could mean Jan 2 or Feb 1"
|
|
7
|
+
severity: error
|
|
8
|
+
locales_affected: "all"
|
|
9
|
+
examples:
|
|
10
|
+
- bad: "Prescription date: 01/02/2025"
|
|
11
|
+
good: "Prescription date: 02 Jan 2025 (unambiguous month name format per FDA/EMA guidance)"
|
|
12
|
+
- area: "Medical Terminology Precision"
|
|
13
|
+
description: "Medical terms must not be machine-translated — incorrect translation of drug names or dosages risks patient safety"
|
|
14
|
+
severity: error
|
|
15
|
+
locales_affected: "all"
|
|
16
|
+
examples:
|
|
17
|
+
- bad: "Auto-translating 'once' (English: one time) which means 'eleven' in Spanish"
|
|
18
|
+
good: "Use verified medical glossaries; have translations reviewed by locale-specific medical professionals"
|
|
19
|
+
- area: "Unit of Measurement"
|
|
20
|
+
description: "Dosage units, body measurements, and lab values use different systems by region"
|
|
21
|
+
severity: error
|
|
22
|
+
locales_affected: "all"
|
|
23
|
+
examples:
|
|
24
|
+
- bad: "Displaying weight in pounds for a metric-system locale"
|
|
25
|
+
good: "Detect locale and display in expected units (kg/cm for most locales, lb/in for US)"
|
|
26
|
+
- area: "Patient Consent Forms"
|
|
27
|
+
description: "Informed consent must be in the patient's language and meet local legal requirements"
|
|
28
|
+
severity: error
|
|
29
|
+
locales_affected: "all"
|
|
30
|
+
examples:
|
|
31
|
+
- bad: "Presenting consent form only in English for non-English-speaking patients"
|
|
32
|
+
good: "Provide certified translations of consent forms in all supported patient languages"
|
|
33
|
+
- area: "Instructions for Use (IFU)"
|
|
34
|
+
description: "Medical device IFU must be translated per MDR/IVDR requirements for EU markets"
|
|
35
|
+
severity: error
|
|
36
|
+
locales_affected: ["EU member states"]
|
|
37
|
+
examples:
|
|
38
|
+
- bad: "Shipping medical device with English-only IFU to Germany"
|
|
39
|
+
good: "Include IFU in the official language(s) of each target market per MDR Article 10(11)"
|
|
40
|
+
|
|
41
|
+
anti_patterns:
|
|
42
|
+
- pattern: "Machine-translating drug names or medical procedures"
|
|
43
|
+
reason: "Drug brand names differ by country; procedures have specific medical terminology per locale"
|
|
44
|
+
instead: "Use locale-specific medical dictionaries and have all medical content reviewed by qualified translators"
|
|
45
|
+
- pattern: "Using ambiguous date formats in clinical records"
|
|
46
|
+
reason: "Date misinterpretation in medical contexts can lead to wrong treatment timing"
|
|
47
|
+
instead: "Use DD-MMM-YYYY format (02-Jan-2025) in clinical records per ICH guidelines"
|
|
48
|
+
- pattern: "Displaying lab reference ranges without locale context"
|
|
49
|
+
reason: "Reference ranges and units vary by country (mmol/L vs mg/dL for blood glucose)"
|
|
50
|
+
instead: "Store values in a canonical unit and convert for display based on locale medical conventions"
|
|
51
|
+
- pattern: "Truncating patient names to fit fixed-width fields"
|
|
52
|
+
reason: "Names in many scripts (Arabic, Devanagari, CJK) may be truncated incorrectly, causing identity errors"
|
|
53
|
+
instead: "Use flexible-width name fields; never truncate patient identification information"
|
|
54
|
+
|
|
55
|
+
regulations:
|
|
56
|
+
- name: "FDA 21 CFR Part 11"
|
|
57
|
+
locales: ["en-US"]
|
|
58
|
+
impact: "Electronic records must maintain data integrity including proper date/time formatting"
|
|
59
|
+
- name: "EU MDR (Medical Device Regulation)"
|
|
60
|
+
locales: ["EU member states"]
|
|
61
|
+
impact: "Labeling and IFU must be in the official language(s) of the member state where the device is sold"
|
|
62
|
+
- name: "HIPAA"
|
|
63
|
+
locales: ["en-US"]
|
|
64
|
+
impact: "Translation workflows must maintain PHI security; translators need BAA agreements"
|
|
65
|
+
|
|
66
|
+
reference_products: ["epic.com", "cerner.com", "athenahealth.com"]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: "Legal"
|
|
2
|
+
description: "i18n challenges in legal technology — jurisdiction-specific terminology, unambiguous dates, and certified translation requirements"
|
|
3
|
+
|
|
4
|
+
requirements:
|
|
5
|
+
- area: "Contract Date Formats"
|
|
6
|
+
description: "Ambiguous dates in legal documents can invalidate contracts or cause disputes"
|
|
7
|
+
severity: error
|
|
8
|
+
locales_affected: "all"
|
|
9
|
+
examples:
|
|
10
|
+
- bad: "Effective date: 01/02/2025 (ambiguous month/day)"
|
|
11
|
+
good: "Effective date: 2 January 2025 (unambiguous written month format)"
|
|
12
|
+
- area: "Legal Terminology Precision"
|
|
13
|
+
description: "Legal terms have specific meanings per jurisdiction — 'tort' in common law vs civil law systems"
|
|
14
|
+
severity: error
|
|
15
|
+
locales_affected: "all"
|
|
16
|
+
examples:
|
|
17
|
+
- bad: "Machine-translating 'consideration' (legal: something of value in a contract)"
|
|
18
|
+
good: "Use jurisdiction-specific legal glossaries maintained by qualified legal translators"
|
|
19
|
+
- area: "Jurisdiction-Specific Formatting"
|
|
20
|
+
description: "Legal citations, court names, and statutory references follow jurisdiction-specific formats"
|
|
21
|
+
severity: warning
|
|
22
|
+
locales_affected: "all"
|
|
23
|
+
examples:
|
|
24
|
+
- bad: "Using US legal citation format (Bluebook) for EU legal documents"
|
|
25
|
+
good: "Apply jurisdiction-appropriate citation styles (OSCOLA for UK, Guide des citations for France)"
|
|
26
|
+
- area: "Right-to-Left Legal Documents"
|
|
27
|
+
description: "Legal documents in Arabic and Hebrew must maintain correct reading order, especially for numbered clauses"
|
|
28
|
+
severity: error
|
|
29
|
+
locales_affected: ["ar", "he"]
|
|
30
|
+
examples:
|
|
31
|
+
- bad: "Generating Arabic legal PDF with LTR numbered lists"
|
|
32
|
+
good: "Use RTL-aware document generation with proper clause numbering direction"
|
|
33
|
+
- area: "Certified Translation Requirements"
|
|
34
|
+
description: "Legal documents often require certified or sworn translations with specific attestation formats"
|
|
35
|
+
severity: error
|
|
36
|
+
locales_affected: "all"
|
|
37
|
+
examples:
|
|
38
|
+
- bad: "Using uncertified machine translation for court filings"
|
|
39
|
+
good: "Use certified translators; include translator attestation in format required by target jurisdiction"
|
|
40
|
+
|
|
41
|
+
anti_patterns:
|
|
42
|
+
- pattern: "Machine-translating legal contracts without human review"
|
|
43
|
+
reason: "Legal language is precise and jurisdiction-specific; MT errors can create unintended obligations"
|
|
44
|
+
instead: "Use qualified legal translators with jurisdiction expertise; MT may assist but never replace review"
|
|
45
|
+
- pattern: "Using the same legal terms across jurisdictions"
|
|
46
|
+
reason: "'Privacy policy' has different legal implications and required content across GDPR, CCPA, LGPD, PIPA"
|
|
47
|
+
instead: "Maintain jurisdiction-specific legal content; do not just translate — adapt to local legal frameworks"
|
|
48
|
+
- pattern: "Displaying contract amounts without locale-appropriate number formatting"
|
|
49
|
+
reason: "A contract for 1.000 means 1 in English but 1000 in German — financial disputes result"
|
|
50
|
+
instead: "Spell out amounts in words alongside numerals in legal documents; use locale-correct formatting"
|
|
51
|
+
- pattern: "Fixed-width contract templates for all languages"
|
|
52
|
+
reason: "German legal text expands 30-35% over English; Arabic/Hebrew need RTL-aware templates"
|
|
53
|
+
instead: "Use flexible document templates that adapt to text direction and expansion per locale"
|
|
54
|
+
|
|
55
|
+
regulations:
|
|
56
|
+
- name: "GDPR (Article 12)"
|
|
57
|
+
locales: ["EU member states"]
|
|
58
|
+
impact: "Privacy information must be provided in clear and plain language — implies user's language"
|
|
59
|
+
- name: "LGPD (Brazil)"
|
|
60
|
+
locales: ["pt-BR"]
|
|
61
|
+
impact: "Data processing notices must be in Portuguese and comply with Brazilian data protection law"
|
|
62
|
+
- name: "Hague Convention"
|
|
63
|
+
locales: ["all signatory countries"]
|
|
64
|
+
impact: "International legal documents must follow apostille and translation requirements per country"
|
|
65
|
+
|
|
66
|
+
reference_products: ["clio.com", "docusign.com", "ironclad.com"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
locale: "ar"
|
|
2
|
+
name: "Arabic"
|
|
3
|
+
native_name: "العربية"
|
|
4
|
+
script: "Arabic"
|
|
5
|
+
direction: rtl
|
|
6
|
+
cldr_plural_categories: [zero, one, two, few, many, other]
|
|
7
|
+
expansion_factor: 1.25
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "standard"
|
|
10
|
+
requires_complex_shaping: true
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
bidi_considerations:
|
|
13
|
+
mirror_icons: true
|
|
14
|
+
mirror_layout: true
|
|
15
|
+
mixed_direction_text: true
|
|
16
|
+
calendar_system: "gregorian"
|
|
17
|
+
digit_system: "arabic-indic"
|
|
18
|
+
number_format:
|
|
19
|
+
decimal_separator: "٫"
|
|
20
|
+
grouping_separator: "٬"
|
|
21
|
+
grouping_size: 3
|
|
22
|
+
date_format:
|
|
23
|
+
short: "DD/MM/YYYY"
|
|
24
|
+
long: "DD Month YYYY"
|
|
25
|
+
first_day_of_week: "saturday"
|
|
26
|
+
common_pitfalls:
|
|
27
|
+
- pitfall: "Six plural forms — the most of any major language"
|
|
28
|
+
example: "Arabic has zero, one, two, few (3-10), many (11-99), and other (100+) — binary singular/plural fails"
|
|
29
|
+
fix: "Use ICU MessageFormat with all 6 CLDR categories; test with values 0, 1, 2, 3, 11, and 100"
|
|
30
|
+
- pitfall: "Letter reshaping based on position"
|
|
31
|
+
example: "Arabic letters change shape depending on position (initial, medial, final, isolated)"
|
|
32
|
+
fix: "Never split Arabic strings mid-word; use proper Arabic-capable fonts and text rendering engines"
|
|
33
|
+
- pitfall: "Layout mirroring — not just text direction"
|
|
34
|
+
example: "Navigation, icons, progress bars, and sliders must all mirror for RTL"
|
|
35
|
+
fix: "Use CSS logical properties (margin-inline-start, padding-inline-end) instead of left/right"
|
|
36
|
+
- pitfall: "Mixed LTR content within RTL context"
|
|
37
|
+
example: "Numbers, URLs, code, and brand names remain LTR within an RTL paragraph — bidi algorithm needed"
|
|
38
|
+
fix: "Use Unicode bidi algorithm correctly; wrap embedded LTR content with dir='ltr' or bidi control characters"
|
|
39
|
+
- pitfall: "Arabic-Indic digits vs Western digits"
|
|
40
|
+
example: "Some Arabic locales use ٠١٢٣٤٥٦٧٨٩ instead of 0123456789 — user expectation varies by region"
|
|
41
|
+
fix: "Default to Western digits for digital interfaces; provide Arabic-Indic digit option per user preference"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
locale: "de"
|
|
2
|
+
name: "German"
|
|
3
|
+
native_name: "Deutsch"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.35
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "."
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD.MM.YYYY"
|
|
18
|
+
long: "DD. Month YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Long compound words overflowing containers"
|
|
22
|
+
example: "'Geschwindigkeitsbegrenzung' (speed limit) is 26 characters with no natural break point"
|
|
23
|
+
fix: "Use CSS hyphens: auto with lang='de', or soft hyphens (U+00AD) for compound word break hints"
|
|
24
|
+
- pitfall: "Formal vs informal address (Sie/du)"
|
|
25
|
+
example: "Using informal 'du' in a banking app where formal 'Sie' is expected"
|
|
26
|
+
fix: "Establish formal/informal convention per product and apply consistently across all translations"
|
|
27
|
+
- pitfall: "Noun capitalization rules"
|
|
28
|
+
example: "Lowercasing a translated noun — all German nouns are capitalized regardless of position"
|
|
29
|
+
fix: "Never apply text-transform: lowercase to German text; preserve translator-specified capitalization"
|
|
30
|
+
- pitfall: "Text expansion of 30-35% breaking UI layouts"
|
|
31
|
+
example: "'Submit' (6 chars) becomes 'Absenden' (8 chars); 'Settings' becomes 'Einstellungen' (13 chars)"
|
|
32
|
+
fix: "Design for at least 35% text expansion; German is often the longest common Western European language"
|
|
33
|
+
- pitfall: "Date format with periods"
|
|
34
|
+
example: "Using DD/MM/YYYY instead of DD.MM.YYYY — German dates use periods as separators"
|
|
35
|
+
fix: "Use Intl.DateTimeFormat('de') for correct date formatting with period separators"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
locale: "en"
|
|
2
|
+
name: "English"
|
|
3
|
+
native_name: "English"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.0
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: "."
|
|
14
|
+
grouping_separator: ","
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "MM/DD/YYYY"
|
|
18
|
+
long: "Month DD, YYYY"
|
|
19
|
+
first_day_of_week: "sunday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Assuming English word order applies universally"
|
|
22
|
+
example: "'Welcome, {name}!' — many languages place the name first or use different greeting structures"
|
|
23
|
+
fix: "Use complete translatable sentences with placeholders, never concatenate greeting + name"
|
|
24
|
+
- pitfall: "Using English-only date format assumptions"
|
|
25
|
+
example: "03/04/2025 is March 4 in US English but April 3 in most other locales"
|
|
26
|
+
fix: "Always use locale-aware date formatting (Intl.DateTimeFormat) and avoid ambiguous numeric dates"
|
|
27
|
+
- pitfall: "Hardcoding singular/plural as the only two forms"
|
|
28
|
+
example: "count === 1 ? 'item' : 'items' — works for English but fails for languages with more plural forms"
|
|
29
|
+
fix: "Use ICU MessageFormat or framework plural support that references CLDR plural rules"
|
|
30
|
+
- pitfall: "Relying on ASCII-only input validation"
|
|
31
|
+
example: "Regex [a-zA-Z]+ rejects valid names like 'René' or 'Müller'"
|
|
32
|
+
fix: "Use Unicode-aware patterns (\\p{Letter}) or avoid restricting character sets in name fields"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
locale: "es"
|
|
2
|
+
name: "Spanish"
|
|
3
|
+
native_name: "Español"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.25
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "."
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD/MM/YYYY"
|
|
18
|
+
long: "DD de Month de YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Ignoring inverted punctuation marks"
|
|
22
|
+
example: "Displaying 'How are you?' without the opening inverted question mark"
|
|
23
|
+
fix: "Spanish requires opening punctuation: 'Como estas?' — ensure translation tools preserve these characters"
|
|
24
|
+
- pitfall: "Not accounting for es-ES vs es-MX vs es-419 differences"
|
|
25
|
+
example: "Using 'ordenador' (Spain) when targeting Latin America where 'computadora' is standard"
|
|
26
|
+
fix: "Support regional variants (es-ES, es-MX, es-419) or use neutral Spanish as a fallback"
|
|
27
|
+
- pitfall: "Assuming gender-neutral nouns"
|
|
28
|
+
example: "Translating 'the user' — Spanish requires gendered articles (el usuario / la usuaria)"
|
|
29
|
+
fix: "Design UI strings to avoid gendered references or provide both forms where grammar requires it"
|
|
30
|
+
- pitfall: "Text expansion breaking fixed-width layouts"
|
|
31
|
+
example: "'Settings' (8 chars) becomes 'Configuracion' (13 chars) — a 62% expansion"
|
|
32
|
+
fix: "Design containers to accommodate 20-25% text expansion; test with Spanish translations early"
|
|
33
|
+
- pitfall: "Incorrect number formatting"
|
|
34
|
+
example: "Displaying 1,234.56 instead of 1.234,56 for Spanish locales"
|
|
35
|
+
fix: "Use Intl.NumberFormat('es') to format numbers with correct decimal comma and period grouping"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
locale: "fi"
|
|
2
|
+
name: "Finnish"
|
|
3
|
+
native_name: "Suomi"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.40
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "\u00A0"
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD.MM.YYYY"
|
|
18
|
+
long: "DD. MonthTA YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Extreme text expansion due to agglutinative grammar"
|
|
22
|
+
example: "'in the house' translates to 'talossa' (one word); but compound phrases can be very long"
|
|
23
|
+
fix: "Design for up to 40% expansion; Finnish is one of the longest Western languages for UI strings"
|
|
24
|
+
- pitfall: "15 grammatical cases affecting word forms"
|
|
25
|
+
example: "'talo' (house) has forms: talon, taloa, talossa, talosta, taloon, talolla, talolta, talolle..."
|
|
26
|
+
fix: "Never programmatically construct Finnish phrases — let translators handle case inflection in full sentences"
|
|
27
|
+
- pitfall: "Vowel harmony in suffixes"
|
|
28
|
+
example: "Suffixes must match the vowel pattern of the root word — back vowels (a, o, u) vs front vowels (ä, ö, y)"
|
|
29
|
+
fix: "Do not attempt to programmatically add Finnish suffixes; always use translator-provided complete forms"
|
|
30
|
+
- pitfall: "No grammatical gender but complex number agreement"
|
|
31
|
+
example: "Finnish has no gendered nouns, but number-noun agreement is partitive: '1 talo' but '2 taloa'"
|
|
32
|
+
fix: "Use CLDR plural rules (Finnish has only one/other) and let translators handle partitive case in plural form"
|
|
33
|
+
- pitfall: "Long words breaking fixed layouts"
|
|
34
|
+
example: "'lentokonesuihkuturbiinimoottoriapumekaanikkoaliupseerioppilas' — valid compound word"
|
|
35
|
+
fix: "Use CSS overflow-wrap: break-word and hyphens: auto with lang='fi' to handle extreme compound words"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
locale: "fr"
|
|
2
|
+
name: "French"
|
|
3
|
+
native_name: "Français"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.20
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "\u202F"
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD/MM/YYYY"
|
|
18
|
+
long: "DD Month YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Missing spaces before high punctuation"
|
|
22
|
+
example: "Bonjour! instead of 'Bonjour !' — French requires a non-breaking space before ; : ! and ?"
|
|
23
|
+
fix: "Insert a narrow non-breaking space (U+202F) before semicolon, colon, exclamation, and question marks"
|
|
24
|
+
- pitfall: "Confusing French number grouping"
|
|
25
|
+
example: "Displaying 1,234 instead of 1 234 — French uses narrow no-break space as grouping separator"
|
|
26
|
+
fix: "Use Intl.NumberFormat('fr') which correctly uses U+202F as the grouping separator"
|
|
27
|
+
- pitfall: "Not handling fr-FR vs fr-CA differences"
|
|
28
|
+
example: "Canadian French uses different vocabulary ('courriel' vs 'email') and some formatting conventions"
|
|
29
|
+
fix: "Support fr-FR and fr-CA as separate locales when targeting both markets"
|
|
30
|
+
- pitfall: "Gendered agreement in dynamic strings"
|
|
31
|
+
example: "'Vous etes connecte' vs 'Vous etes connectee' — adjective ending depends on user gender"
|
|
32
|
+
fix: "Use inclusive writing patterns or avoid gendered past participles in UI strings where possible"
|
|
33
|
+
- pitfall: "Quotation mark style"
|
|
34
|
+
example: "Using English \"quotes\" instead of French guillemets with spaces: 'texte'"
|
|
35
|
+
fix: "Ensure translation process converts quotation marks to locale-appropriate style (guillemets for French)"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
locale: "he"
|
|
2
|
+
name: "Hebrew"
|
|
3
|
+
native_name: "עברית"
|
|
4
|
+
script: "Hebrew"
|
|
5
|
+
direction: rtl
|
|
6
|
+
cldr_plural_categories: [one, two, other]
|
|
7
|
+
expansion_factor: 1.20
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "standard"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
bidi_considerations:
|
|
13
|
+
mirror_icons: true
|
|
14
|
+
mirror_layout: true
|
|
15
|
+
mixed_direction_text: true
|
|
16
|
+
calendar_system: "gregorian"
|
|
17
|
+
digit_system: "western"
|
|
18
|
+
number_format:
|
|
19
|
+
decimal_separator: "."
|
|
20
|
+
grouping_separator: ","
|
|
21
|
+
grouping_size: 3
|
|
22
|
+
date_format:
|
|
23
|
+
short: "DD.MM.YYYY"
|
|
24
|
+
long: "DD b-Month YYYY"
|
|
25
|
+
first_day_of_week: "sunday"
|
|
26
|
+
common_pitfalls:
|
|
27
|
+
- pitfall: "Dual number form (unique to Hebrew among major languages)"
|
|
28
|
+
example: "Hebrew has a special form for exactly two: 'יום אחד' (1 day), 'יומיים' (2 days), 'ימים' (3+ days)"
|
|
29
|
+
fix: "Use CLDR plural categories [one, two, many, other] — do not skip the 'two' form"
|
|
30
|
+
- pitfall: "RTL layout mirroring without Hebrew-specific testing"
|
|
31
|
+
example: "Icons that should NOT mirror in RTL (checkmarks, media play buttons) get mirrored anyway"
|
|
32
|
+
fix: "Create an icon exception list for bidirectional layouts; test with native Hebrew speakers"
|
|
33
|
+
- pitfall: "Nikud (vowel diacritics) in UI text"
|
|
34
|
+
example: "Modern Hebrew usually omits nikud — adding it looks childish or overly formal in a UI context"
|
|
35
|
+
fix: "Use unvocalized Hebrew for UI strings unless targeting children's educational content"
|
|
36
|
+
- pitfall: "Mixed Hebrew and English in tech interfaces"
|
|
37
|
+
example: "Hebrew UI with English brand names, code, or tech terms creates complex bidi paragraphs"
|
|
38
|
+
fix: "Wrap English terms in spans with dir='ltr' to prevent bidi algorithm from reordering them"
|
|
39
|
+
- pitfall: "Hebrew calendar for date display"
|
|
40
|
+
example: "Some users expect Hebrew calendar dates alongside or instead of Gregorian dates"
|
|
41
|
+
fix: "Use Intl.DateTimeFormat('he-IL', {calendar: 'hebrew'}) when Hebrew calendar is needed"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
locale: "hi"
|
|
2
|
+
name: "Hindi"
|
|
3
|
+
native_name: "हिन्दी"
|
|
4
|
+
script: "Devanagari"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.30
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "standard"
|
|
10
|
+
requires_complex_shaping: true
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: "."
|
|
14
|
+
grouping_separator: ","
|
|
15
|
+
grouping_sizes: [3, 2]
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD/MM/YYYY"
|
|
18
|
+
long: "DD Month YYYY"
|
|
19
|
+
first_day_of_week: "sunday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Indian number grouping system"
|
|
22
|
+
example: "1,23,45,678 not 12,345,678 — groups of 2 after the initial group of 3 (from the right)"
|
|
23
|
+
fix: "Use Intl.NumberFormat('hi-IN') which produces correct Indian grouping automatically"
|
|
24
|
+
- pitfall: "Devanagari ligatures and conjunct consonants"
|
|
25
|
+
example: "Two or more consonants combine into a single ligature glyph — font must support conjuncts"
|
|
26
|
+
fix: "Use fonts with comprehensive Devanagari OpenType support (Noto Sans Devanagari, Mangal)"
|
|
27
|
+
- pitfall: "Shirorekha (headline) connecting characters"
|
|
28
|
+
example: "Devanagari characters connect via a horizontal line at the top — breaking this line breaks readability"
|
|
29
|
+
fix: "Never insert spaces or line breaks within a Devanagari word; use proper shaping-aware text rendering"
|
|
30
|
+
- pitfall: "Hindi vs English digit display"
|
|
31
|
+
example: "Hindi can use Devanagari digits (१२३) or Western digits (123) — preference varies by context"
|
|
32
|
+
fix: "Default to Western digits for digital interfaces; use Devanagari digits only for traditional/cultural contexts"
|
|
33
|
+
- pitfall: "Font size requirements for Devanagari"
|
|
34
|
+
example: "Devanagari script has more vertical complexity than Latin — 12px may be too small for readability"
|
|
35
|
+
fix: "Use minimum 14px for Devanagari body text; the script has ascenders, descenders, and matras that need space"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
locale: "it"
|
|
2
|
+
name: "Italian"
|
|
3
|
+
native_name: "Italiano"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.20
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "."
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD/MM/YYYY"
|
|
18
|
+
long: "DD Month YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Article-noun gender agreement in dynamic content"
|
|
22
|
+
example: "'il file' (masculine) vs 'la cartella' (feminine) — article must match noun gender"
|
|
23
|
+
fix: "Include the article in the translatable string with the noun, never construct 'article + noun' dynamically"
|
|
24
|
+
- pitfall: "Double consonant sensitivity"
|
|
25
|
+
example: "Truncating words can break meaning — 'anno' (year) vs 'ano' (anus)"
|
|
26
|
+
fix: "Never truncate Italian words programmatically; use ellipsis on full word boundaries"
|
|
27
|
+
- pitfall: "Apostrophe handling in articles"
|
|
28
|
+
example: "'l'utente' (the user) — the apostrophe is grammatically required, not optional punctuation"
|
|
29
|
+
fix: "Ensure text processing and search indexing handle apostrophes within Italian words correctly"
|
|
30
|
+
- pitfall: "Text expansion in button labels"
|
|
31
|
+
example: "'Save' (4 chars) becomes 'Salva' (5 chars); 'Cancel' becomes 'Annulla' (7 chars)"
|
|
32
|
+
fix: "Allow for 15-20% expansion in Italian; test button and navigation labels with translated strings"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
locale: "ja"
|
|
2
|
+
name: "Japanese"
|
|
3
|
+
native_name: "日本語"
|
|
4
|
+
script: "CJK"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [other]
|
|
7
|
+
expansion_factor: 0.8
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "wide"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "no-spaces"
|
|
12
|
+
cjk_width_handling: true
|
|
13
|
+
vertical_text_support: true
|
|
14
|
+
multiple_scripts: true
|
|
15
|
+
number_format:
|
|
16
|
+
decimal_separator: "."
|
|
17
|
+
grouping_separator: ","
|
|
18
|
+
grouping_size: 3
|
|
19
|
+
date_format:
|
|
20
|
+
short: "YYYY/MM/DD"
|
|
21
|
+
long: "YYYY年MM月DD日"
|
|
22
|
+
first_day_of_week: "sunday"
|
|
23
|
+
common_pitfalls:
|
|
24
|
+
- pitfall: "No word boundaries for line breaking"
|
|
25
|
+
example: "Japanese text has no spaces between words — standard word-wrap algorithms fail"
|
|
26
|
+
fix: "Use CSS word-break: auto or overflow-wrap: anywhere; rely on browser's built-in CJK line-break rules"
|
|
27
|
+
- pitfall: "Three writing systems in one string"
|
|
28
|
+
example: "A single sentence may mix kanji, hiragana, and katakana — font fallback chains must cover all three"
|
|
29
|
+
fix: "Specify comprehensive font stacks: system CJK fonts first, then fallback Latin fonts"
|
|
30
|
+
- pitfall: "Full-width vs half-width characters"
|
|
31
|
+
example: "Full-width 'A' (U+FF21) vs half-width 'A' (U+0041) — both valid but visually different widths"
|
|
32
|
+
fix: "Normalize input to consistent width forms; use Unicode normalization (NFKC) for search and comparison"
|
|
33
|
+
- pitfall: "Character count vs visual width"
|
|
34
|
+
example: "10 CJK characters occupy roughly the same width as 20 Latin characters"
|
|
35
|
+
fix: "Use visual width measurement (canvas measureText or CSS ch units) instead of string.length for layout"
|
|
36
|
+
- pitfall: "Honorific levels affecting string length"
|
|
37
|
+
example: "Polite forms (desu/masu) are longer than casual forms — UI strings vary by politeness level"
|
|
38
|
+
fix: "Establish consistent politeness level (typically polite/desu-masu for apps) and apply uniformly"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
locale: "ko"
|
|
2
|
+
name: "Korean"
|
|
3
|
+
native_name: "한국어"
|
|
4
|
+
script: "Hangul"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [other]
|
|
7
|
+
expansion_factor: 1.0
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "wide"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
cjk_width_handling: true
|
|
13
|
+
vertical_text_support: false
|
|
14
|
+
multiple_scripts: false
|
|
15
|
+
number_format:
|
|
16
|
+
decimal_separator: "."
|
|
17
|
+
grouping_separator: ","
|
|
18
|
+
grouping_size: 3
|
|
19
|
+
date_format:
|
|
20
|
+
short: "YYYY. MM. DD."
|
|
21
|
+
long: "YYYY년 MM월 DD일"
|
|
22
|
+
first_day_of_week: "sunday"
|
|
23
|
+
common_pitfalls:
|
|
24
|
+
- pitfall: "Korean has spaces between words unlike Japanese and Chinese"
|
|
25
|
+
example: "Korean uses spaces between words: '한국어 번역' — do not apply CJK no-space rules blindly"
|
|
26
|
+
fix: "Use standard word-wrap for Korean; it breaks between words unlike Chinese/Japanese character-level breaking"
|
|
27
|
+
- pitfall: "Honorific speech levels affecting text length"
|
|
28
|
+
example: "Korean has 7 speech levels — formal polite forms are longer than casual forms"
|
|
29
|
+
fix: "Standardize on formal polite level (합니다체) for apps and ensure consistent usage across all strings"
|
|
30
|
+
- pitfall: "Postposition particles attached to words"
|
|
31
|
+
example: "'파일을' (file + object marker) vs '파일이' (file + subject marker) — particle depends on context"
|
|
32
|
+
fix: "Include particles in the translatable string; never programmatically append Korean particles"
|
|
33
|
+
- pitfall: "Hangul syllable block composition"
|
|
34
|
+
example: "One Hangul syllable is composed of 2-3 jamo but displays as one character block"
|
|
35
|
+
fix: "Use Unicode NFC normalization for Korean text; decomposed jamo (NFD) render as separate components"
|
|
36
|
+
- pitfall: "Number grouping with man (10,000) convention"
|
|
37
|
+
example: "Large numbers sometimes group by 10,000 (만) instead of 1,000 in informal contexts"
|
|
38
|
+
fix: "Use Intl.NumberFormat('ko') for standard grouping; add 만/억 suffixes only where culturally appropriate"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
locale: "nl"
|
|
2
|
+
name: "Dutch"
|
|
3
|
+
native_name: "Nederlands"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.20
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "."
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD-MM-YYYY"
|
|
18
|
+
long: "DD Month YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Long compound words similar to German"
|
|
22
|
+
example: "'arbeidsongeschiktheidsverzekering' (disability insurance) — 35 characters without spaces"
|
|
23
|
+
fix: "Apply CSS hyphens: auto with lang='nl' and test overflow behavior with real Dutch translations"
|
|
24
|
+
- pitfall: "Confusing nl-NL and nl-BE (Flemish)"
|
|
25
|
+
example: "Using 'fiets' vs regional vocabulary differences between Netherlands and Belgium"
|
|
26
|
+
fix: "Support nl-NL and nl-BE separately when targeting both markets; formatting conventions differ"
|
|
27
|
+
- pitfall: "IJ digraph capitalization"
|
|
28
|
+
example: "Capitalizing only the I in 'IJsselmeer' — IJ is a single unit and both letters must capitalize"
|
|
29
|
+
fix: "When applying text-transform: capitalize, handle the IJ digraph as a special case for Dutch"
|
|
30
|
+
- pitfall: "Diminutive suffixes in UI labels"
|
|
31
|
+
example: "Dutch uses diminutives extensively (-je, -tje, -pje) which can change word length unpredictably"
|
|
32
|
+
fix: "Test with actual translations rather than estimating expansion; diminutives can shorten or lengthen labels"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
locale: "pl"
|
|
2
|
+
name: "Polish"
|
|
3
|
+
native_name: "Polski"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, few, many, other]
|
|
7
|
+
expansion_factor: 1.30
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "\u00A0"
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD.MM.YYYY"
|
|
18
|
+
long: "DD Month YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Four plural forms with complex modular rules"
|
|
22
|
+
example: "1 plik, 2 pliki, 5 plikow, 22 pliki — similar to Russian but with different thresholds"
|
|
23
|
+
fix: "Use CLDR plural rules: one (1), few (2-4,22-24...), many (5-21,25-31...), other (fractional)"
|
|
24
|
+
- pitfall: "Special Polish characters in sorting and search"
|
|
25
|
+
example: "Polish has a, c, e, l, n, o, s, z, z — these sort differently than their base Latin equivalents"
|
|
26
|
+
fix: "Use Intl.Collator('pl') for sorting; Polish letters with diacritics have specific sort positions"
|
|
27
|
+
- pitfall: "Text expansion of 20-30%"
|
|
28
|
+
example: "'Settings' (8 chars) becomes 'Ustawienia' (10 chars); 'Delete' becomes 'Usun' (4 chars, shorter)"
|
|
29
|
+
fix: "Design for 30% expansion overall; individual strings may expand or contract unpredictably"
|
|
30
|
+
- pitfall: "Gendered past tense verbs"
|
|
31
|
+
example: "'You logged in' differs by gender: 'Zalogowales sie' (m) vs 'Zalogowalas sie' (f)"
|
|
32
|
+
fix: "Avoid past tense constructions in UI or use gender-neutral alternatives when possible"
|
|
33
|
+
- pitfall: "Consonant clusters in words"
|
|
34
|
+
example: "Polish has consonant clusters like 'wspolprace' that affect text-to-speech and hyphenation"
|
|
35
|
+
fix: "Use proper Polish hyphenation dictionaries; do not apply English hyphenation rules to Polish text"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
locale: "pt"
|
|
2
|
+
name: "Portuguese"
|
|
3
|
+
native_name: "Português"
|
|
4
|
+
script: "Latin"
|
|
5
|
+
direction: ltr
|
|
6
|
+
cldr_plural_categories: [one, other]
|
|
7
|
+
expansion_factor: 1.25
|
|
8
|
+
script_characteristics:
|
|
9
|
+
avg_char_width: "narrow"
|
|
10
|
+
requires_complex_shaping: false
|
|
11
|
+
line_break_rules: "standard"
|
|
12
|
+
number_format:
|
|
13
|
+
decimal_separator: ","
|
|
14
|
+
grouping_separator: "."
|
|
15
|
+
grouping_size: 3
|
|
16
|
+
date_format:
|
|
17
|
+
short: "DD/MM/YYYY"
|
|
18
|
+
long: "DD de Month de YYYY"
|
|
19
|
+
first_day_of_week: "monday"
|
|
20
|
+
common_pitfalls:
|
|
21
|
+
- pitfall: "Treating pt-BR and pt-PT as identical"
|
|
22
|
+
example: "Using 'celular' (Brazil) where 'telemovel' (Portugal) is expected, or vice versa"
|
|
23
|
+
fix: "Support pt-BR and pt-PT as separate locales; vocabulary, spelling, and formatting differ significantly"
|
|
24
|
+
- pitfall: "Spelling reform inconsistencies"
|
|
25
|
+
example: "Mixing pre-2009 and post-2009 orthographic agreement spellings in the same interface"
|
|
26
|
+
fix: "Standardize on post-reform spelling and ensure all translation memory is updated consistently"
|
|
27
|
+
- pitfall: "Gendered language in user-facing strings"
|
|
28
|
+
example: "'Bem-vindo' (masculine) vs 'Bem-vinda' (feminine) — greeting depends on user gender"
|
|
29
|
+
fix: "Use gender-neutral alternatives like 'Boas-vindas' or provide both forms based on user profile"
|
|
30
|
+
- pitfall: "Brazilian vs European number formatting"
|
|
31
|
+
example: "pt-BR and pt-PT both use comma for decimal, but currency symbol placement may differ"
|
|
32
|
+
fix: "Use locale-specific formatting (pt-BR vs pt-PT) rather than generic pt for currency display"
|