PHPackages                             pagemachine/typo3-file-variants - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. pagemachine/typo3-file-variants

ActiveTypo3-cms-extension[Localization &amp; i18n](/categories/localization)

pagemachine/typo3-file-variants
===============================

Working prototype for translatable files in TYPO3

0.12.5(3mo ago)1242↓73%3[6 issues](https://github.com/pagemachine/typo3-file-variants/issues)[2 PRs](https://github.com/pagemachine/typo3-file-variants/pulls)GPL-2.0+PHPPHP ^8.2CI passing

Since Mar 16Pushed 1mo ago5 watchersCompare

[ Source](https://github.com/pagemachine/typo3-file-variants)[ Packagist](https://packagist.org/packages/pagemachine/typo3-file-variants)[ RSS](/packages/pagemachine-typo3-file-variants/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (10)Dependencies (19)Versions (25)Used By (0)

File Variants
=============

[](#file-variants)

This extension serves as a working prototype for translatable files in TYPO3.

Features
--------

[](#features)

- Upload language variants using the File list module to provide variants transparently throughout the system.
- Replace or remove variants (which resets to the file of the default language).
- Metadata records are can be translated just like before, but no longer point to the same file record.
- File records are translatable, but not directly accessible. All editing is done through metadata records.

Limits
------

[](#limits)

- Providing file variants is only possible in File list module.
- Usage of `sys_language_uid=-1` (All languages) is deactivated.

Setup
-----

[](#setup)

1. Install extension via Composer: `composer require pagemachine/typo3-file-variants`
2. Activate the extension
3. (optional) Use the extension configuration to create a dedicated file storage. If you use no dedicated storage, a dedicated folder will be used in default storage.

### Data Examples

[](#data-examples)

- Default language English, uid 0
- First language German (Deutsch), uid 1
- Second language Spain (Español), uid 2
- Third language Russian (Русский), uid 3

**sys\_file**

uidsys\_language\_uidl10n\_parentfilename100en.pdf211de.pdf321en.pdf(Notice that there is no Russian variant here.)

**sys\_file\_metadata**

uidsys\_language\_uidl10n\_parentfiletitle1001English2112Deutsch3213Español**tt\_content**

uidsys\_language\_uidl10n\_parentmediatitle1001English2111Deutsch3211Español4311Русский**sys\_file\_reference**

local is sys\_file, foreign is tt\_content

uidsys\_language\_uidl10n\_parentuid\_localuid\_foreign10011211223213343114Schematically the following relations exist and are created/maintained automatically:

1. `tt_content:1` (English) -&gt; `sys_file_reference:1` -&gt; `sys_file:1` (English)
2. `tt_content:2` (German) -&gt; `sys_file_reference:2` -&gt; `sys_file:2` (German)
3. `tt_content:3` (Spanish) -&gt; `sys_file_reference:3` -&gt; `sys_file:3` (Spanish)
4. `tt_content:4` (Russian) -&gt; `sys_file_reference:4` -&gt; `sys_file:1` (English)

Behaviour
---------

[](#behaviour)

After Installation, the file metadata (`sys_file_metadata`) edit mask in File list module is slightly changed. Nothing changes for the default language. But creating / editing a file metadata translation allows for uploading a new file for this translation. The upload works the same way as the File list module and can be found next to the file info. This file will reside in the dedicated translation storage or folder. After uploading, the fileinfo element changes its content and displays the uploaded file.

A button then allows for resetting to the file used in default language. **The file formerly used here is removed permanently!**Also, the upload control is displayed again, so the a new file can be uploaded at any time.

During this process, all file references (`sys_file_reference`) are searched for a link to the default file, and updated with the translated one.

On each translation action to any record that contains a FAL field (like files or images), a check is performed to find out whether a file variant for the target language is available. If it is, the resulting file reference will link to that file variant instead of the default file.

This results in a consistent behaviour, that summarizes as:

- If a variant is available for a specific language, it will be used, everywhere and everytime.
- If no variant is available for a specific language, the default file is used (current standard TYPO3 behaviour).

Missing Features
----------------

[](#missing-features)

1. Upgrade wizard: if file metadata translations already exist, no file variants are provided or added.
2. Workspaces support.

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance68

Regular maintenance activity

Popularity19

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity75

Established project with proven stability

 Bus Factor1

Top contributor holds 75.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~183 days

Recently: every ~1 days

Total

19

Last Release

95d ago

PHP version history (2 changes)0.11.0PHP ^8.1

0.12.0PHP ^8.2

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/10812548?v=4)[Pagemachine AG](/maintainers/pagemachine)[@pagemachine](https://github.com/pagemachine)

---

Top Contributors

[![mbrodala](https://avatars.githubusercontent.com/u/5037116?v=4)](https://github.com/mbrodala "mbrodala (213 commits)")[![maddy2101](https://avatars.githubusercontent.com/u/1925287?v=4)](https://github.com/maddy2101 "maddy2101 (21 commits)")[![NeoBlack](https://avatars.githubusercontent.com/u/1128085?v=4)](https://github.com/NeoBlack "NeoBlack (17 commits)")[![sypets](https://avatars.githubusercontent.com/u/13206455?v=4)](https://github.com/sypets "sypets (14 commits)")[![renovate[bot]](https://avatars.githubusercontent.com/in/2740?v=4)](https://github.com/renovate[bot] "renovate[bot] (7 commits)")[![wazum](https://avatars.githubusercontent.com/u/146727?v=4)](https://github.com/wazum "wazum (5 commits)")[![lsascha](https://avatars.githubusercontent.com/u/4083570?v=4)](https://github.com/lsascha "lsascha (2 commits)")[![susannemoog](https://avatars.githubusercontent.com/u/321804?v=4)](https://github.com/susannemoog "susannemoog (2 commits)")[![nsd0smoog](https://avatars.githubusercontent.com/u/259808881?v=4)](https://github.com/nsd0smoog "nsd0smoog (1 commits)")[![lolli42](https://avatars.githubusercontent.com/u/2178068?v=4)](https://github.com/lolli42 "lolli42 (1 commits)")

---

Tags

typo3typo3-cms-extension

###  Code Quality

Static AnalysisPHPStan, Rector

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/pagemachine-typo3-file-variants/health.svg)

```
[![Health](https://phpackages.com/badges/pagemachine-typo3-file-variants/health.svg)](https://phpackages.com/packages/pagemachine-typo3-file-variants)
```

###  Alternatives

[pagemachine/typo3-formlog

Form log for TYPO3

23233.9k8](/packages/pagemachine-typo3-formlog)[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

101466.4k45](/packages/friendsoftypo3-content-blocks)[web-vision/wv_deepltranslate

DeepL Translate (CORE) - This extension provides option to translate content element, and TCA record texts to DeepL supported languages.

33296.7k](/packages/web-vision-wv-deepltranslate)[eliashaeussler/typo3-form-consent

Extension for TYPO3 CMS that adds double opt-in functionality to EXT:form

1590.6k](/packages/eliashaeussler-typo3-form-consent)[web-vision/deepltranslate-core

DeepL Translate (CORE) - This extension provides option to translate content element, and TCA record texts to DeepL supported languages.

33122.1k6](/packages/web-vision-deepltranslate-core)[eliashaeussler/typo3-warming

Warming - Warms up Frontend caches based on an XML sitemap. Cache warmup can be triggered via TYPO3 backend or using a console command. Supports multiple languages and custom crawler implementations.

22249.2k](/packages/eliashaeussler-typo3-warming)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
