Skip to content

Commit 255f0da

Browse files
bhirszmnojek
andauthored
Add Translate transformer (#426)
* Add Translate transformer * Replace packaging dependency with internal version handling (#425) * Fix Translate transformer in older RF versions * Apply suggestions from code review Co-authored-by: Mateusz Nojek <matnojek@gmail.com>
1 parent 1288872 commit 255f0da

35 files changed

+876
-14
lines changed

.github/workflows/unit-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
rf-version: 'stable5'
2929
- os: 'ubuntu-latest'
3030
python-version: '3.10'
31-
rf-version: 'stable5'
31+
rf-version: 'stable6'
3232
runs-on: ${{ matrix.os }}
3333

3434
steps:

docs/releasenotes/3.3.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,19 @@ Or by using ``--language / --lang`` option::
2727

2828
English language is supported by default.
2929

30+
* New Translate transformer for translating Robot Framework files
3031
* Updated NormalizeSectionHeaderName transformer to work with translated headers
3132
* Updated MergeAndOrderSections to not merge language: <lang> header with other comment sections
3233
* Sections with only language: <lang> marker and less than ``section_lines`` empty lines will be not transformed by NormalizeNewLines
3334

35+
Translate transformer
36+
----------------------
37+
38+
Added new non-default transformer for translating Robot Framework files. It is possible to automatically convert your
39+
Robot Framework files to use other supported language.
40+
41+
See the full documentation `here <https://robotidy.readthedocs.io/en/stable/transformers/Translate.html>`_.
42+
3443
Fixes
3544
------
3645
* Added missing ``--skip-comments`` option (#418)

docs/source/configuration/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Robot Framework version::
4343

4444
It will disable all transformers that require Robot Framework greater than <target-version> to run (even if you have Robot Framework greater than <target-version> installed).
4545

46+
.. _language_support:
4647
.. rubric:: Language support
4748

4849
Robot Framework 6.0 added support for Robot settings and headers translation.
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
.. _Translate:
2+
3+
Translate
4+
================================
5+
6+
Translate Robot Framework source files from one or many languages to different one.
7+
8+
.. note::
9+
Required Robot Framework version: >=6.0
10+
11+
.. |TRANSFORMERNAME| replace:: Translate
12+
.. include:: disabled_hint.txt
13+
14+
15+
Example of Robot Framework markers translation:
16+
17+
.. tab-set::
18+
19+
.. tab-item:: Before (default English)
20+
21+
.. code:: robotframework
22+
23+
*** Settings ***
24+
Documentation Dokumentacja zestawu
25+
26+
Library Collections
27+
Variables vars.py
28+
29+
*** Test Cases ***
30+
Pierwszy test
31+
[Setup] Setup Keyword
32+
Step 1
33+
34+
.. tab-item:: After (translated to Polish)
35+
36+
.. code:: robotframework
37+
38+
39+
*** Ustawienia ***
40+
Documentation Dokumentacja zestawu
41+
42+
Biblioteka Collections
43+
Zmienne vars.py
44+
45+
*** Przypadki Testowe ***
46+
Pierwszy test
47+
[Inicjalizacja] Setup Keyword
48+
Step 1
49+
50+
The language can be configured using ``language`` parameter with the language code (default ``en`` - English)::
51+
52+
robotidy --configure Translate:enabled=True:language=se
53+
54+
Since the translation is from one or many languages to one, only one language can be configured.
55+
56+
Source language
57+
----------------
58+
59+
Robotidy will translate only markers that can be recognized. If your source file is written in different language
60+
you need to configure Robotidy to recognize given language. See :ref:`language_support` for more details.
61+
Following example configure Robotidy to read English, Polish and German languages and translate Robot Framework
62+
markers to Ukrainian::
63+
64+
robotidy --configure Translate:enabled=True:language:uk --language pl,de source_in_pl_and_de.robot
65+
66+
BDD keywords
67+
-------------
68+
69+
BDD keywords are not translated by default. Set ``translate_bdd`` parameter to ``True`` to enable it::
70+
71+
robotidy --configure Translate:enabled=True:translate_bdd=True files/
72+
73+
.. tab-set::
74+
75+
.. tab-item:: Before (default English)
76+
77+
.. code:: robotframework
78+
79+
*** Test Cases ***
80+
Test with BDD keywords
81+
Given login page is open
82+
When valid username and password are inserted
83+
And credentials are submitted
84+
Then welcome page should be open
85+
86+
.. tab-item:: After (translated BDD keywords to German)
87+
88+
.. code:: robotframework
89+
90+
*** Testfälle ***
91+
Test with BDD keywords
92+
Angenommen login page is open
93+
Wenn valid username and password are inserted
94+
Und credentials are submitted
95+
Dann welcome page should be open
96+
97+
Some language have more than one alternative to BDD keyword. For example Polish can use "Kiedy" or "Gdy" when
98+
translating "When" keyword. In this situation Robotidy will chose the first one (sorted alphabetically). It can
99+
be overwritten using ``<bdd_keyword>_alternative`` parameters::
100+
101+
robotidy --configure Translate:enabled=True:language=pl:translate_bdd=True:when_alternative=Gdy files/
102+
103+
Language headers
104+
-----------------
105+
106+
Robotidy can add or replace existing language header in the files. For example, if you're translating file
107+
written in German to Swedish, the language header will change from ``language: de`` to ``language: se``.
108+
Translation to English will remove language header since it's not necessary.
109+
To do this configure ``add_language_header`` parameter to ``True``::
110+
111+
robotidy --configure Translate:enabled=True:add_language_header=True files/
112+
113+
.. tab-set::
114+
115+
.. tab-item:: Before (default German)
116+
117+
.. code:: robotframework
118+
119+
# language: de
120+
121+
*** Testfälle ***
122+
Test
123+
Step
124+
125+
.. tab-item:: Translated to Swedish
126+
127+
.. code:: robotframework
128+
129+
# language: se
130+
131+
*** Testfall ***
132+
Test
133+
Step
134+
135+
.. tab-item:: Translated to English
136+
137+
.. code:: robotframework
138+
139+
*** Test Cases ***
140+
Test
141+
Step

noxfile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def unit(session, robot_version):
2626

2727
@nox.session(python=DEFAULT_PYTHON_VERSION)
2828
def coverage(session):
29-
install_dev_deps(session, "stable5")
29+
install_dev_deps(session, "stable6")
3030
session.install("coverage")
3131
session.run("coverage", "run", "-m", "pytest")
3232
session.run("coverage", "html")

robotidy/config.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
from pathlib import Path
44
from typing import Dict, List, Optional, Pattern, Tuple
55

6+
try:
7+
from robot.api import Languages # RF 6.0
8+
except ImportError:
9+
Languages = None
10+
611
from robotidy.files import get_paths
712
from robotidy.transformers import load_transformers
813

@@ -81,7 +86,7 @@ def __init__(
8186
self.check = check
8287
self.output = output
8388
self.color = color
84-
self.language = language
89+
self.language = self.get_languages(language)
8590
transformers_config = self.convert_configure(transformers_config)
8691
self.transformers = self.get_transformers_instances(
8792
transformers, transformers_config, force_order, target_version, skip
@@ -91,6 +96,7 @@ def __init__(
9196
# inject global settings TODO: handle it better
9297
setattr(transformer, "formatting_config", self.formatting)
9398
setattr(transformer, "transformers", transformer_map)
99+
setattr(transformer, "languages", self.language)
94100

95101
@staticmethod
96102
def get_transformers_instances(transformers, transformers_config, force_order, target_version, skip):
@@ -107,3 +113,9 @@ def convert_configure(configure: List[Tuple[str, List]]) -> Dict[str, List]:
107113
for transformer, args in configure:
108114
config_map[transformer].extend(args)
109115
return config_map
116+
117+
@staticmethod
118+
def get_languages(lang):
119+
if Languages is None:
120+
return None
121+
return Languages(lang)

0 commit comments

Comments
 (0)