How do you translate EXT:Form forms in TYPO3 CMS 8.7 LTS? - forms

I'm new to TYPO3 and starting out with 8.7 LTS. I have created several forms with the default "form" extension. My site requires some of these forms to be translated into up to 5 other languages. So far the only solution I've found is to copy the forms and then have a separate form for each translation, but this does not seem like the best solution, as long term it would lead to form divergence.
Is it possible to add alternate translations directly in the YAML file or point to a translation file that should be used?

Here an example, like I use on a page:
For frontend translation add this to your typoscript setup:
plugin.tx_form {
settings {
yamlConfigurations {
100 = EXT:my_site_package/Configuration/Yaml/CustomFormSetup.yaml
}
}
}
"my_site_package" has to be an existing and activated TYPO3 extension
then make an yaml file under my_site_package/Configuration/Yaml/CustomFormSetup.yaml
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
Form:
renderingOptions:
translation:
translationFile:
# default translation files for the frontend
10: 'EXT:form/Resources/Private/Language/locallang.xlf'
20: 'EXT:my_site_package/Resources/Private/Language/locallang.xlf'
and have some translation files in my_site_package/Resources/Private/Language
default (en): my_site_package/Resources/Private/Language/locallang.xlf
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
<file source-language="en" datatype="plaintext" original="messages" product-name="tamods">
<header/>
<body>
<trans-unit id="ticketbestellung.element.objekt.properties.label" xml:space="preserve">
<source>Object</source>
</trans-unit>
</body>
</file>
</xliff>
german (de): my_site_package/Resources/Private/Language/de.locallang.xlf
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
<file source-language="en" target-language="de" datatype="plaintext" original="messages" product-name="tamods">
<header/>
<body>
<trans-unit id="ticketbestellung.element.objekt.properties.label" xml:space="preserve">
<target>Objekt</target>
</trans-unit>
</body>
</file>
</xliff>
german (fr): my_site_package/Resources/Private/Language/fr.locallang.xlf
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
<file source-language="en" target-language="fr" datatype="plaintext" original="messages" product-name="tamods">
<header/>
<body>
<trans-unit id="ticketbestellung.element.objekt.properties.label" xml:space="preserve">
<target>Objet</target>
</trans-unit>
</body>
</file>
</xliff>
this is yaml from the form I am using:
renderingOptions:
submitButtonLabel: Senden
type: Form
identifier: ticketbestellung
label: Ticketbestellung
prototypeName: standard
renderables:
-
renderingOptions:
previousButtonLabel: 'previous Step'
nextButtonLabel: 'next Step'
type: Page
identifier: page-1
label: Page
renderables:
-
defaultValue: ''
type: Text
identifier: objekt
label: Objekt
properties:
fluidAdditionalAttributes:
placeholder: Objekt
required: required
validators:
-
identifier: NotEmpty
Some translation key, which are hard to find:
for Submit Button
element.Form.renderingOptions.submitButtonLabel
element.ticketbestellung.renderingOptions.submitButtonLabel
for Subject in E-Mail finisher
finisher.Email.subject (workaround, working also before Version 8.7.5)
finisher.EmailToReceiver.subject (should be the solution was buggy till Version 8.7.5)
This answer would be not possible without the help from manuel-selbach in the TYPO3 Slack.

There is a (work in progress) documentation for the new Form Framework introduced with TYPO3 CMS 8 LTS.
You can find the translation docs here:
https://docs.typo3.org/typo3cms/drafts/code.tritum.de/TYPO3.CMS/Form_Documentation/Concepts/FrontendRendering/Index.html#translation
Here is how you register this file:
https://docs.typo3.org/typo3cms/drafts/code.tritum.de/TYPO3.CMS/Form_Documentation/Concepts/Configuration/Index.html#yaml-registration
Here you can find information about "What is a site package":
https://de.slideshare.net/benjaminkott/typo3-the-anatomy-of-sitepackages
And here you can find more information about the Architecture of Extensions:
https://docs.typo3.org/typo3cms/CoreApiReference/ExtensionArchitecture/Index.html
Most of the form documentation (first and second link) is already translated to english, but some parts are still in german.
I know this is a lot of stuff to read, but after reading you will have a basic knowledge about "How to build a website with TYPO3 (and translate the forms).

<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
<file source-language="en" target-language="fr" datatype="plaintext" original="messages" product-name="tamods">
<header/>
<body>
<trans-unit id="ticketbestellung.element.objekt.properties.label" xml:space="preserve">
<source>Object</source>
<target>Objet</target>
</trans-unit>
</body>
</file>
</xliff>

Related

TYPO3 v12 - Localization is not working with xlf files

I am trying to get the translation to work in Typo3 12.1.3.
I build a simple site package following the Sitepackage Tutorial.
I added some locallang files:
locallang.xlf
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:site_package/Resources/Private/Language/locallang.xlf" date="2011-10-17T20:22:32Z" product-name="site_package">
<header/>
<body>
<trans-unit id="test" resname="test">
<source>Test (EN)</source>
</trans-unit>
</body>
</file>
</xliff>
de.locallang.xlf
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:site_package/Resources/Private/Language/locallang.xlf" date="2011-10-17T20:22:32Z" product-name="site_package" >
<header/>
<body>
<trans-unit id="test" resname="test" approved="yes">
<source>Test (EN)</source>
<target>Test (DE)</target>
</trans-unit>
</body>
</file>
</xliff>
Created some template:
<f:layout name="Default" />
<f:section name="Main">
<main role="main">
<div class="container">
<div class="row">
<div class="col-md-12">
<f:translate key="LLL:EXT:site_package/Resources/Private/Language/locallang.xlf:test"/>
<f:translate key="test" extensionName="site_package"/>
<f:for each="{mainContent}" as="contentElement">
<f:cObject
typoscriptObjectPath="tt_content.{contentElement.data.CType}"
data="{contentElement.data}"
table="tt_content"
/>
</f:for>
</div>
</div>
</div>
</main>
</f:section>
And added a site configuration:
base: /
languages:
-
title: English
enabled: true
languageId: 0
base: /
typo3Language: default
locale: en_US.UTF-8
iso-639-1: en
navigationTitle: English
hreflang: en-us
direction: ltr
flag: us
websiteTitle: ''
-
title: Deutsch
enabled: true
base: /de/
typo3Language: de
locale: de_DE
iso-639-1: de
websiteTitle: ''
navigationTitle: Deutsch
hreflang: de-DE
direction: ''
fallbackType: strict
fallbacks: '0'
flag: de
languageId: 1
rootPageId: 1
websiteTitle: ''
Afterwards I created a site, added some content and translated it to German in the backend.
Problem:
The content elements are presented in the selected language in the frontend.
If I switch it, they are presented in the matching language.
The text from the locallang file stays in the default language.
If I switch the language, they are not presented in the right language. They stay in English.
What am I doning wrong?
Thanks a lot for your help!
can you check again with TYPO3 v12.2.0? This might solve these problems...
I have the same issue with TYPO3 v12.2 like the threadstarter. I'm using DDEV locally and the main content of the page is German and created a page translation to English. The output still remains in English.
The section for languages in the config.yaml file in my site configuration:
languages:
-
title: Deutsch
enabled: true
base: /
typo3Language: de
locale: de_DE.utf8
iso-639-1: de
websiteTitle: 'Meine Webseite'
navigationTitle: Deutsch
hreflang: de-DE
direction: ''
flag: de
languageId: 0
-
title: English
enabled: true
base: /en/
typo3Language: default
locale: en_US.utf8
iso-639-1: en
websiteTitle: 'My website'
navigationTitle: English
hreflang: en-US
direction: ''
fallbackType: fallback
fallbacks: '0'
flag: en-us-gb
languageId: 1
The German translation file de.locallang.xlf looks like this:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:custompackage/Resources/Private/Language/locallang.xlf" date="2020-10-18T18:20:51Z" product-name="custompackage" target-language="de">
<header/>
<body>
<!-- Topbar -->
<trans-unit id="topbar.book-appointment" resName="topbar.book-appointment" approved="yes">
<target state="translated">Termin online buchen</target>
</trans-unit>
</body>
</file>
</xliff>
The English (default) translation file locallang.xlf looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:custompackage/Resources/Private/Language/locallang.xlf" date="2020-10-18T18:20:51Z" product-name="custompackage">
<header/>
<body>
<!-- Topbar -->
<trans-unit id="topbar.book-appointment">
<source>Book appointment</source>
</trans-unit>
</body>
</file>
</xliff>
Fluid template, first with German default label, second without:
<f:translate extensionName="custompackage" id="topbar.book-appointment">Termin online buchen</f:translate>
<f:translate extensionName="custompackage" id="topbar.book-appointment"/>
The second variant returns the English label by default.
I also noticed changing the user backend language affects the frontend localization output. If German was set up as a user backend language, German labels appear in the frontend and with English the other way. That's a strange behavior. Any idea why this happens?
What's the right way to set up translations for own composer extensions?
Do they belong to var/labels/{language}/{customExtension} or the regular way to packages/{customExtension}/Resources/Private/Language/locallang.xlf? The localization documentation for TYPO3 v12 (main) shows the regular way.
I have the same problems like you both with TYPO3 12.2.0.
But I've made a mistake with my folder name. I created a folder named "Languages", but it has to be "Language".
So maybe check your convensions ... now the Localisation works fine with TYPO3 12. You don't need a second Website Language to show your data in different languages. You only need special files, like locallang.xlf for english and de.locallang.xlf for german.

What is wrong with my layer.xml from netbeans?

I try to create a new palette in netbeans 10, but the following 2 errors don't allow me to compile the project:
Document root element "folder", must match DOCTYPE root "JavaPalette". [3]
The markup in the document following the root element must be well-formed. [11]
My XML looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<folder name="JavaPalette">
<folder name="Items">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
<file name="Item.xml" url="resources/Item.xml">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
</file>
</folder>
</folder>
<filesystem/>
I have no clue what both error messages mean, but i did exactly what is said in the tutorial.
Online validation of the xml file also shows that error.
https://platform.netbeans.org/tutorials/nbm-palette-api2.html
I didn´t followed the tutorial, but as far as i can tell, your filesystem tag is not valid. If you take a look at the DTD you can see that the element filesystem isn´t declared as EMPTY (for more information you can read more about it here). So you have to provide a start and end tag. In your posted example you are only using <filesystem/> which isn´t allowed.
You have to change the xml as follows:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
<folder name="JavaPalette">
<folder name="Items">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
<file name="Item.xml" url="resources/Item.xml">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
</file>
</folder>
</folder>
</filesystem>

Extra namespace in xsl output eclipse

Since our company is moving from AX to SAP I'm also making a 'shift' from visual studio to eclipse. I'd thought it would be nice to start with a small xslt project but when trying my existing (made in VS) xsl I noticed some differences.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="#*|node()">
<xsl:copy>
<xsl:apply-templates select="#*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="msxsl:SalesType">
<xsl:choose>
<xsl:when test="(../msxsl:SalesType) = 'ReturnItem'">
<xsl:element name="MessageType" namespace="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">384</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="MessageType" namespace="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">380</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Generates an output xml with msxsl prefix xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">380:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope
xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{0E415D3C-6D46-4E4E-B8CA-9729B11BA}</MessageId>
<SourceEndpoint>BAB</SourceEndpoint>
<DestinationEndpoint>INVOIC_WKMP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read
</Action>
</Header>
<Body>
<MessageParts>
<SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
<CustInvoiceJour class="entity">
<AccountcategoryId>FFF</AccountcategoryId>
<msxsl:MessageType
xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">380</msxsl:MessageType>
</CustInvoiceJour>
</SalesInvoice>
</MessageParts>
</Body>
</Envelope>
Whereas visual studio xsl leaves out the xmlns:msxsl specification (which is correct):
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{0E415D3C-6D46-4E4E-B8CA-9729B11BA}</MessageId>
<SourceEndpoint>BAB</SourceEndpoint>
<DestinationEndpoint>INVOIC_WKMP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
<CustInvoiceJour class="entity">
<AccountcategoryId>FFF</AccountcategoryId>
<MessageType>380</MessageType>
</CustInvoiceJour>
</SalesInvoice>
</MessageParts>
</Body>
</Envelope>
Since it’s already in the http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice namespace
I don’t want this addition here. Is there anything I can do to change this in eclipse?
Kind regards,
Mike
No, Visual Studio is NOT correct to omit this namespace. If you don't want it included you should explicitly omit it using xsl:exclude-result-prefixes="msxsl".

TYPO3 fluid translate view helper: No output when using "%0A%0A" in xlf file

In my fluid Template I am using
{f:translate(key:'LLL:path/to/file/locallang.xlf:Test', arguments: {0: 'Test'})}
Positive test case
Content of locallang.xlf:
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2016-12-06T14:00:00Z" product-name="">
<header/>
<body>
<trans-unit id="Test" xml:space="preserve">
<source><![CDATA[mailto:info#example.org?Subject=%1$s&Body=Hello%0A]]></source>
</trans-unit>
</body>
</file>
</xliff>
Output:
mailto:info#example.org?Subject=Test&Body=Hello
Negative test case
Content of locallang.xlf:
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2016-12-06T14:00:00Z" product-name="">
<header/>
<body>
<trans-unit id="Test" xml:space="preserve">
<source><![CDATA[mailto:info#example.org?Subject=%1$s&Body=Hello%0A%0A]]></source>
</trans-unit>
</body>
</file>
</xliff>
Output is an empty string
What is causing the empty output instead of the expected, encoded double line break?
I just found the underlaying PHP error message:
#1: PHP Warning: vsprintf(): Too few arguments in LocalizationUtility.php line 115
The character '%' should be escaped as '%%' as described in the PHP documentation for sprintf
This leads to
<source><![CDATA[mailto:info#example.org?Subject=%1$s&Body=Hello%%0A%%0A]]></source>
instead of
<source><![CDATA[mailto:info#example.org?Subject=%1$s&Body=Hello%0A%0A]]></source>

SYmfony plugin upload error: You must specify the min version for symfony

I have been trying to upload my SYmfony plugin for some time but I keep getting this error.
Initially the dependency on the SYmfony Package was missing, but I added that.
My package.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
<name>sfActivateablePlugin</name>
<channel>pear.symfony-project.com</channel>
<summary>sfActivateablePlugin allows auditing record activation/deactivation by setting up a flag, timestamp & user detail fields.</summary>
<description>The sfActivateablePlugin allows you to automatically:
* create a `is_active` flag (or name of your choice)
* create timestamp & user detail fields (e.g. `activated_by`, `activated_at`, ...)
* populate timestamps & user details when `is_active` flag is toggled on a record.</description>
<lead>
<name>Prasad Gupte</name>
<user>prasadgupte</user>
<email>xxxxxxxx#gmail.com</email>
<active>yes</active>
</lead>
<date>2010-09-22</date>
<time>19:33:09</time>
<version>
<release>1.0.0</release>
<api>1.0.0</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://www.symfony-project.com/license">MIT license</license>
<notes>
* First public release.
</notes>
<contents>
<dir baseinstalldir="sfActivateablePlugin/" name="/">
<file baseinstalldir="sfActivateablePlugin/" md5sum="89b09d4d48e5259a3c659dfc65b0fc52" name="config/plugin_settings.yml.sample" role="data" />
<file baseinstalldir="sfActivateablePlugin/" md5sum="8b40522acb23552e6e31ba2416387515" name="lib/Activateable.class.php" role="php" />
<file baseinstalldir="sfActivateablePlugin/" md5sum="926a9eb938eccc9083d2b116e50246b3" name="lib/Listener/Activateable.class.php" role="php" />
<file baseinstalldir="sfActivateablePlugin/" md5sum="17346d33da2ea3b9d880afc71e7022fd" name="LICENSE" role="doc" />
<file baseinstalldir="sfActivateablePlugin/" md5sum="b836dfd2f324ae4ea975842197dcf8e2" name="README" role="doc" />
</dir>
</contents>
<dependencies>
<required>
<php>
<min>5.2.6</min>
</php>
<pearinstaller>
<min>1.4.1</min>
</pearinstaller>
<package>
<name>Symfony</name>
<channel>pear.symfony-project.org</channel>
<min>1.4</min>
<recommended>1.4</recommended>
</package>
</required>
</dependencies>
<phprelease />
<changelog>
<release>
<version>
<release>1.0.0</release>
<api>1.0.0</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<date>2010-09-22</date>
<license uri="http://www.symfony-project.com/license">MIT license</license>
<notes>
* First public release.
</notes>
</release>
</changelog>
</package>
Am I missing some tag? Or specified incorrect Symfony version? Pl help
Figured out a couple of mistakes:
1. the package name is symfony and not Symfony
2. the max version is also required
If you use the Pear Package Manager API:
$packagexml->addPackageDepWithChannel('required', 'symfony', 'pear.symfony-project.com', '1.4', '1.4', '1.4');