Skip to content

File Detection

File Detectors group translation files that represent the same content in different languages. The validator supports three detection strategies for different project layouts.

Detection Strategies

PrefixFileDetector

Groups files where the language code appears as a prefix.

  • Pattern: {lang}.{name}.{ext} or {name}.{ext} (default language)
  • Usage: TYPO3 CMS, some Symfony projects
  • Supported Extensions: .xlf, .xliff, .yaml, .yml, .json, .php

Example:

en.messages.xlf    →  grouped as "messages.xlf"
de.messages.xlf    →
fr.messages.xlf    →

SuffixFileDetector

Groups files where the language code appears as a suffix.

  • Pattern: {name}.{lang}.{ext}
  • Usage: Symfony Framework, modern PHP projects
  • Supported Extensions: .yml, .yaml, .xlf, .xliff, .json, .php

Example:

messages.en.yaml   →  grouped as "messages"
messages.de.yaml   →
messages.fr.yaml   →

DirectoryFileDetector

Groups files organized in language directories.

  • Pattern: {lang}/{name}.{ext}
  • Usage: Laravel, directory-based organization
  • Supported Extensions: .php, .json, .yml, .yaml, .xlf, .xliff

Example:

en/messages.php    →  grouped as "messages"
de/messages.php    →
es/messages.php    →

Real-World Examples

TYPO3 CMS (PrefixFileDetector)

Resources/Private/Language/
├── locallang.xlf              # Default English
├── de.locallang.xlf           # German
├── fr.locallang.xlf           # French
├── locallang_db.xlf           # Database labels (English)
├── de.locallang_db.xlf        # Database labels (German)
└── fr.locallang_db.xlf        # Database labels (French)

File Grouping:

  • Group 1: locallang.xlf, de.locallang.xlf, fr.locallang.xlf
  • Group 2: locallang_db.xlf, de.locallang_db.xlf, fr.locallang_db.xlf

Symfony (SuffixFileDetector)

translations/
├── messages.en.yaml           # General messages
├── messages.de.yaml
├── messages.fr.yaml
├── validators.en.yaml         # Form validation
├── validators.de.yaml
├── validators.fr.yaml
├── security.en.yaml           # Security messages
├── security.de.yaml
└── security.fr.yaml

File Grouping:

  • Group 1: messages.en.yaml, messages.de.yaml, messages.fr.yaml
  • Group 2: validators.en.yaml, validators.de.yaml, validators.fr.yaml
  • Group 3: security.en.yaml, security.de.yaml, security.fr.yaml

Laravel (DirectoryFileDetector)

resources/lang/
├── en/
│   ├── auth.php
│   ├── pagination.php
│   ├── passwords.php
│   └── validation.php
├── de/
│   ├── auth.php
│   ├── pagination.php
│   ├── passwords.php
│   └── validation.php
└── es/
    ├── auth.php
    ├── pagination.php
    ├── passwords.php
    └── validation.php

File Grouping:

  • Group 1: en/auth.php, de/auth.php, es/auth.php
  • Group 2: en/pagination.php, de/pagination.php, es/pagination.php
  • Group 3: en/passwords.php, de/passwords.php, es/passwords.php
  • Group 4: en/validation.php, de/validation.php, es/validation.php

Automatic Detection

The validator automatically selects the most appropriate file detector based on discovered file patterns. Detection priority:

  1. DirectoryFileDetector - If language directories are found
  2. SuffixFileDetector - If files with language suffixes are found
  3. PrefixFileDetector - If files with language prefixes are found

Manual Configuration

Override automatic detection by specifying detectors in your configuration:

YAML:

yaml
file-detectors:
  - "MoveElevator\\ComposerTranslationValidator\\FileDetector\\DirectoryFileDetector"
  - "MoveElevator\\ComposerTranslationValidator\\FileDetector\\SuffixFileDetector"

JSON:

json
{
  "file-detectors": [
    "MoveElevator\\ComposerTranslationValidator\\FileDetector\\PrefixFileDetector"
  ]
}

Language Codes

Supported Formats

  • ISO 639-1: en, de, fr, es, it, pt, ru, zh, ja
  • With regions: en_US, de_DE, en_GB, pt_BR, zh_CN, zh_TW
  • Hyphen notation: en-US, de-DE, en-GB, pt-BR

Examples

# Simple codes
en/messages.php      → locale: "en"
de.locallang.xlf     → locale: "de"
messages.fr.yaml     → locale: "fr"

# With regions
en_US/auth.php       → locale: "en_US"
de_AT.labels.xlf     → locale: "de_AT"
messages.pt_BR.yaml  → locale: "pt_BR"

# Hyphen notation
en-GB/validation.php → locale: "en-GB"
messages.zh-CN.json  → locale: "zh-CN"

See Also

Released under the GPL-3.0 License.