diff --git a/gtfs/spec/en/reference.md b/gtfs/spec/en/reference.md
index 26e516ef9..785012028 100644
--- a/gtfs/spec/en/reference.md
+++ b/gtfs/spec/en/reference.md
@@ -25,6 +25,7 @@ This document defines the format and structure of the files that comprise a GTFS
- [transfers.txt](#transferstxt)
- [pathways.txt](#pathwaystxt)
- [levels.txt](#levelstxt)
+ - [translations.txt](#translationstxt)
- [feed\_info.txt](#feed_infotxt)
## Term Definitions
@@ -359,17 +360,34 @@ Describe the different levels of a station. Is mostly useful when used in conjun
| `level_name` | Text | Optional | Optional name of the level (that matches level lettering/numbering used inside the building or the station). Is useful for elevator routing (e.g. “take the elevator to level “Mezzanine” or “Platforms” or “-1”).|
-### feed_info.txt
+### translations.txt
File: **Optional**
+In regions that have multiple official languages, transit agencies/operators typically have language-specific names and web pages. In order to best serve riders in those regions, it is useful for the dataset to include these language-dependent values.
+
+| Field Name | Type | Required | Description |
+| ------ | ------ | ------ | ------ |
+| `table_name` | Enum | **Required** | Defines the table that contains the field to be translated. Allowed values are: `agency`, `stops`, `routes`, `trips`, `stop_times`, `levels` and `feed_info` (do not include the `.txt` file extension). If a table with a new file name is added by another proposal in the future, the table name is the name of the filename without the `.txt` file extension. |
+| `field_name` | Text | **Required** | Name of the field to be translated. Fields with type `Text` can be translated, fields with type `URL`, `Email` and `Phone number` can also be “translated” to provide resources in the correct language. Fields with other types should not be translated. |
+| `language` | Language code | **Required** | Language of translation.
If the language is the same as in `feed_info.feed_lang`, the original value of the field will be assumed to be the default value to use in languages without specific translations (if `default_lang` doesn't specify otherwise).
Example: In Switzerland, a city in an officially bilingual canton is officially called “Biel/Bienne”, but would simply be called “Bienne” in French and “Biel” in German. |
+| `translation` | Text or URL or Email or Phone number | **Required** | Translated value. |
+| `record_id` | ID | **Conditionally Required** | Defines the record that corresponds to the field to be translated. The value in `record_id` should be a main ID of the table, as defined below:
• `agency_id` for `agency.txt`;
• `stop_id` for `stops.txt`;
• `route_id` for `routes.txt`;
• `trip_id` for `trips.txt`;
• `trip_id` for `stop_times.txt`.
No field should be translated in the other tables. However producers sometimes add extra fields that are outside the official specification and these unofficial fields may need to be translated. Below is the recommended way to use `record_id` for those tables:
• `service_id` for `calendar.txt`;
• `service_id` for `calendar_dates.txt`;
• `fare_id` for `fare_attributes.txt`;
• `fare_id` for `fare_rules.txt`;
• `shape_id` for `shapes.txt`;
• `trip_id` for `frequencies.txt`;
• `from_stop_id` for `transfers.txt`;
• `pathway_id` for `pathways.txt`;
• `level_id` for `levels.txt`.
**Conditionally Required:**
- **forbidden** if `table_name` is `feed_info`;
- **forbidden** if `field_value` is defined;
- **required** if `field_value` is empty. |
+| `record_sub_id` | ID | **Conditionally Required** | Helps the record that contains the field to be translated when the table doesn’t have a unique ID. Therefore, the value in `record_sub_id` is the secondary ID of the table, as defined by the table below:
• None for `agency.txt`;
• None for `stops.txt`;
• None for `routes.txt`;
• None for `trips.txt`;
• `stop_sequence` for `stop_times.txt`;
No field should be translated in the other tables. However producers sometimes add extra fields that are outside the official specification and these unofficial fields may need to be translated. Below is the recommended way to use `record_sub_id` for those tables:
• None for `calendar.txt`;
• `date` for `calendar_dates.txt`;
• None for `fare_attributes.txt`;
• `route_id` for `fare_rules.txt`;
• None for `shapes.txt`;
• `start_time` for `frequencies.txt`;
• `to_stop_id` for `transfers.txt`;
• None for `pathways.txt`;
• None for `levels.txt`.
**Conditionally Required:**
- **forbidden** if `table_name` is `feed_info`;
- **forbidden** if `field_value` is defined;
- **required** if `table_name=stop_times` and `record_id` is defined. |
+| `field_value` | Text or URL or Email or Phone number | **Conditionally Required** | Instead of defining which record should be translated by using `record_id` and `record_sub_id`, this field can be used to define the value which should be translated. When used, the translation will be applied when the fields identified by `table_name` and `field_name` contains the exact same value defined in field_value.
The field must have **exactly** the value defined in `field_value`. If only a subset of the value matches `field_value`, the translation won’t be applied.
If two translation rules match the same record (one with `field_value`, and the other one with `record_id`), then the rule with `record_id` is the one which should be used.
**Conditionally Required:**
- **forbidden** if `table_name` is `feed_info`;
- **forbidden** if `record_id` is defined;
- **required** if `record_id` is empty. |
+
+### feed_info.txt
+
+File: **Optional** (**Required** if `translations.txt` is provided)
+
The file contains information about the dataset itself, rather than the services that the dataset describes. Note that, in some cases, the publisher of the dataset is a different entity than any of the agencies.
| Field Name | Type | Required | Description |
| ------ | ------ | ------ | ------ |
| `feed_publisher_name` | Text | **Required** | Full name of the organization that publishes the dataset. This may be the same as one of the `agency.agency_name` values. |
| `feed_publisher_url` | URL | **Required** | URL of the dataset publishing organization's website. This may be the same as one of the `agency.agency_url` values. |
-| `feed_lang` | Language code | **Required** | Default language used for the text in this dataset. This setting helps GTFS consumers choose capitalization rules and other language-specific settings for the dataset. |
+| `feed_lang` | Language code | **Required** | Default language used for the text in this dataset. This setting helps GTFS consumers choose capitalization rules and other language-specific settings for the dataset. The file `translations.txt` can be used if the text needs to be translated into languages other than the default one.
The default language may be multilingual for datasets with the original text in multiple languages. In such cases, the `feed_lang` field should contain the language code `mul` defined by the norm ISO 639-2. The best practice here would be to provide, in `translations.txt`, a translation for each language used throughout the dataset. If all the original text in the dataset is in the same language, then `mul` should not be used.