Repository navigation
docs(extending-modx/internationalization): fix the tag syntax and the lexicon coordinates - #676
Ibochkarev wants to merge 4 commits into
Conversation
… lexicon coordinates The review of modxorg#662 left four remarks on the page, all of them about the code. **The syntax of the tag.** The example of a placeholder was written as `[[!%userinput=`amazing`]]`, which is not a valid tag: the parser splits the tag on the first `?`, so without it the value stays part of the name. The old example of the page had the same problem in the namespace property, where the name was written as `namespace\_name` — the backslash is not an escape in the syntax of a tag. The example is now `[[!%key? &userinput=`amazing`]]`. **The optional properties.** The `topic` and the `language` can be left out — the topic falls back to `default`, the language to the one of the request. The `namespace` falls back to `core` as well, so it has to be given for a lexicon outside the core namespace; without it the tag looks in the core only. **The topics of the JavaScript connector.** The page states that `connectors/lang.js.php` takes a comma-separated `topic` parameter. The connector reads `$_REQUEST['topic']`, splits it by commas and loads every coordinate with `modLexicon::load()`; the templates of the core ask for the topics the same way (`manager/templates/default/header.tpl` requests `?ctx=mgr&topic=topmenu,file,resource,…`). The page now says so. **The lexicons of the settings.** The label of a setting is the key `setting_<key>`, and its description is `setting_<key>_desc`. The core keeps its labels in the `setting` topic, a Component outside the core namespace keeps them in the `default` topic — that is the topic the manager writes a translated label into (`modSystemSetting::updateTranslation()` picks the topic by the namespace of the setting). The Settings grid loads both topics of the namespace, so a key with the `setting_` prefix is found in either of them. The example of `modLexicon::load()` is rewritten as well: every argument is a coordinate, there is no separate parameter for the namespace. The `description` of the frontmatter of both locales is quoted, and the stray quote at its end is gone.
|
Where does this concept of manually including |
… call the connector The page told the reader to load extra lexicon topics in the browser by calling `connectors/lang.js.php` with a `topic` parameter. That is how the core does it, but it is not how a Component does it: the connector is the manager's own mechanism, and the manager calls it for the topics of the page. A page declares the topics it needs and the manager loads them: - a controller names them in `getLanguageTopics()` (`core/src/Revolution/modManagerController.php:533`, the core controllers override it); - a page that needs a topic beyond those of its controller adds it with `addLexiconTopic()` (`modManagerController.php:1027`). Both put the topic into `_lang_topics`, which the header template hands over to the connector (`manager/templates/default/header.tpl:23`), and the response replaces `MODx.lang`. The Russian page follows.
|
You are right, and the page no longer tells the reader to call the connector. Where the concept comes from. How a Component does it. The page declares the topics and the manager loads them:
Both load the topic and put it into The page now says that a Component does not call the connector itself — the manager does. The Russian page follows. |
Jako
left a comment
There was a problem hiding this comment.
I have added a comment about loading the lexicons with the lang.js.php
…ts own topics The page told that a controller names its topics in `getLanguageTopics()`, but did not say that this is the way a Component adds the topics of its own namespace, and it did not say why the connector is not the way to add topics while the page runs. It is now stated in both places: - to add the topics of an own component, name them in `getLanguageTopics()` of a controller of the component — it extends the list of the lexicons loaded for the page; - the connector does not extend the lexicon of a page that is already running. It answers with the topics of its own request — `core:default` and the ones asked for — and the response replaces `MODx.lang`, so the topics have to be declared before the page is rendered. The Russian page follows.
| ``` | ||
|
|
||
| A page declares the topics it needs, and the manager loads them into `MODx.lang`. A controller names them in `getLanguageTopics()`: | ||
| A page declares the topics it needs, and the manager loads them into `MODx.lang`. To add the topics of an own component, name them in `getLanguageTopics()` of a controller of the component — it extends the list of the lexicons loaded for the page: |
There was a problem hiding this comment.
To add multiple lexicons, the parameter of getLanguageTopics can contain an array of topics instead of a string.
There was a problem hiding this comment.
Fixed — the example returns a list now, and the page says that the method returns the list of the topics of the page:
public function getLanguageTopics()
{
return ['mycomponent:default', 'mycomponent:settings'];
}The code behind it: modManagerController::prepareLanguage() takes the return value of getLanguageTopics(), loads every topic of the list with modLexicon->load() and hands the list over to the header of the page through _lang_topics. The core controllers use the list the same way — for example return ['user','access','policy','context','setting']; in the controller of a user group.
One detail worth knowing, since the wording can be read both ways: every element of the list has to be a string with one topic. A nested array would not work — modLexicon::load() skips everything that is not a string, and implode(',', $languageTopics) would flatten it with a notice.
The Russian page follows.
…s() takes a list The method returns the list of the topics of the page, so a component names all of its topics at once. The example now returns two topics and the page says so. The code behind it: `modManagerController::prepareLanguage()` takes the return value of `getLanguageTopics()`, loads every topic of the list with `modLexicon::load()` and hands the list over to the header of the page through `_lang_topics`. The core controllers use the list the same way — `return ['user','access','policy','context','setting'];`. The Russian page follows.
Follow-up to #662, from the review comments on that pull request.
Summary
All four remarks on
en/extending-modx/internationalization.mdare addressed. The Russian page follows.1. The syntax of the tag
The example of a placeholder was written as
which is not a valid tag. The parser splits a tag on the first
?(core/src/Revolution/modParser.php:406), so without it the value stays part of the name —modLexiconTagwould look for an entry calleduserinput=amazing``. The old example of the page had the same defect in the namespace property, where the name was written asnamespace\_name: the backslash is not an escape in the syntax of a tag, so the namespace was looked up with the backslash in it.The example is now
2. The optional properties
The
topicand thelanguagecan be left out — the topic falls back todefault, the language to the one of the request. Thenamespacefalls back tocoreas well, so it has to be given for a lexicon outside the core namespace; without it the tag looks in the core only (core/src/Revolution/modLexiconTag.php,getContent()).3. The topics of the JavaScript connector
The page states that
connectors/lang.js.phptakes a comma-separatedtopicparameter. The basis is now named: the connector reads$_REQUEST['topic'], splits it by commas and loads every coordinate withmodLexicon::load(). The templates of the core ask for the topics the same way —manager/templates/default/header.tplrequests?ctx=mgr&topic=topmenu,file,resource,….4. The lexicons of the settings
The label of a setting is the key
setting_<key>, and its description issetting_<key>_desc. The core keeps its labels in thesettingtopic (core/lexicon/en/setting.inc.php, 540 entries), a Component outside the core namespace keeps them in thedefaulttopic — that is also the topic the manager writes a translated label into, becausemodSystemSetting::updateTranslation()picks the topic by the namespace of the setting (core/src/Revolution/modSystemSetting.php:41).The Settings grid loads both topics of the namespace of the setting (
core/src/Revolution/Processors/System/Settings/GetList.php:121-128), so a key with thesetting_prefix is found in either of them.Also
The example of
modLexicon::load()is rewritten: every argument is a coordinate, there is no separate parameter for the namespace ($topics = func_get_args()).The
descriptionof the frontmatter of both locales is quoted, and the stray quote at its end is gone.Checks
markdownlint-cli@0.18(the version used by CI): 0 issues