Problem/motivation
When enabling the entity translation module, a new content language negotiation option set is enabled, that looks almost identical to the interface translation settings:
The 80% use case however is that people would want to use the same settings on both (or if more are available, on those as well). The duplicity is confusing and can lead to errors.
Steps to Reproduce
Detection and Selection UI
- Navigate to the modules page
- Enable the 'Content Translation' and 'Interface Translation' modules
- Navigate to 'admin/config/regional/language/detection'
- The problem panels are on this page
Language Select Block
- enable both content translation and interface translation
- add a few languages
- configure interface translation admin/config/regional/translate
- either translate some interface stuff or import a translation, for more visual impact, import: a) admin/config/regional/translate/import (or we could have installed in another language...) b) get translation file http://localize.drupal.org/translate/languages/es ( http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.19.es.po if that is helpful to just curl -O ) c) back at import admin/config/regional/translate/import browse for the downloaded file and import it
- go to home and see no different language
- add /es to the url and see spanish
- enable the language switcher block .. uh .. admin/structure/block
- add block admin/structure/block/list/block_plugin_ui%3Abartik/add (the instructions said to enable it, and I expected to see it on the blocks page, under disabled. Note: change the help text after language added to say to add the language switcher block, instead of enable language switcher block)
- configure block for Language switcher (User interface text) (I put it in the first sidebar)
- reorder blocks in the sidebar so language switcher is first (for convenience)
- use the language switcher block to switch to english (no prefix in the url), to spanish (/es prefix in the url) and see the UI language changes.
- Make some content. add article (title: Sample, Body: sample words)
- configure language settings to enable translation on admin/config/regional/content-language, check Content and then Article, save
- use the language switcher block and see that both the ui and the content switch (I think because the language switcher block adds or removes language code from the url and both the ui and the content detection and selection methods are using the url as the first method)
steps to show language switcher block problem
- configure block for Language switcher (content) (put it in the first sidebar)
- see two language switcher blocks
Proposed solution
Only display the first one and then provide some UI to be able to specialise other things. Like the field UI display fields setup where you can specialise for search or rss display, but if you don't do it, it just uses the same settings as the default. UI needs to be figured out and implemented.
Remaining tasks
final(?) review. This is ready or really close to ready.verify the comments are accurate, especially regarding fixed/locked
User interface changes
This is a UI issue, see the resolution above. Simplifies the detection and selection page, also only shows one language switcher block when that is appropriate.
Screenshots of with the patch in #107 are still accurate.
API changes
language_types_get_configurable
We have dropped the $stored
parameter since the info is stored in a configuration object.
-function language_types_get_configurable($stored = TRUE) {
+function language_types_get_configurable() {
language_types_set
We are now passing in the array of configurable language types.
-function language_types_set() {
+function language_types_set(array $configurable_language_types) {
Related
#2019511: Explain why the language switcher would not show under some configurations
Comments
Comment #1
YesCT CreditAttribution: YesCT commented#1831944: Make language selection and detection settings admin page not seem to be a bug was closed as a duplicate of this issue
Comment #2
YesCT CreditAttribution: YesCT commentedIn core there are 3 language type
user interface text: only the interface language type in set by language module to be true by default
content: entity translation module changes configurable to true on the content language type
url: the url language type is set to configurable false
any module can define a language type, and can set it's configurable property to true. those would also be shown here, each in an additional table
Comment #3
plachObviously only the configurable language types could be "enabled" to get specialized settings.
Comment #4
YesCT CreditAttribution: YesCT commentedThis one might be a good one for someone to jump in and give it a try. It's not novice; I'm guessing medium.
The proposed approach is a good starting point, and an initial patch to go in that direction would help move this forward.
I'll update the issue summary with some next steps.
Comment #5
Gábor HojtsyMarked #1874102: Rename language switcher blocks (to differentiate content and UI) postponed on this one, although I think this one might solve that too. Also hightening the task level since this is a major usability WTF on the UI.
Comment #6
nagwani CreditAttribution: nagwani commentedCan we discuss this on IRC?
Comment #7
YesCT CreditAttribution: YesCT commentedSure!
We talked about it a little in the recent irc meeting.
In the meantime, go ahead and ask any questions here. Detection and Selection can be confusing. I'm sure others will be interested too anyway.
slightly related: #1502816: Add help text explaining the limitations of language negotiation and page caching
Comment #8
YesCT CreditAttribution: YesCT commentedadding negotiation tag.
Comment #9
YesCT CreditAttribution: YesCT commentedWe might need a follow-up for this that... if detection and selection are using the same criteria: only have one language switcher block. Only have two language switcher blocks if the methods are different.
Related: #1874102: Rename language switcher blocks (to differentiate content and UI)
Comment #10
YesCT CreditAttribution: YesCT commentedSlightly related from Budapest User Testing under Task 1:
http://groups.drupal.org/node/271918
Comment #11
plachLanguage switchers are tied to configurable languages. If we default to having only one, we will have only one language switcher.
Comment #12
Gábor Hojtsy@plach: well, we may want to expose the configurability switch then to the user in a simple way instead of forcing it on them with content translation? :) This issue may be as simple as that.
Comment #13
plachYes, we can, but I though we also wanted to improve the UI of the language detection and selection page.
Comment #14
YesCT CreditAttribution: YesCT commentedComment #15
Gábor Hojtsy@plach: yeah, maybe the first step of the change is to expose the configuratbility switch here and only make interface configurable at all cases unless the user wants otherwise.
Comment #16
Anonymous (not verified) CreditAttribution: Anonymous commentedI really like the idea of making the secondary switcher a configurable option (the proposed solution). I contributed to the documentation on this functionality and I still struggle to understand it. I can imagine many people have troubles with this decision.
Comment #17
YesCT CreditAttribution: YesCT commentedthe "unless" was confusing me.
Comment #18
Gábor HojtsyPutting on sprint board, see if someone wants to work on this :)
Comment #19
nagwani CreditAttribution: nagwani commentedScreenshot with Content translation and Interface translation module disabled
Following table gets added on enabling Content translation and Interface translation modules
Comment #20
e0ipsoHere is one proposal.
The idea is to list all configurable languages that are listed as tables and add an extra checkbox. This checkbox (using Form API #states) would control visibility over the table.
In the submit function if save the config for the User interface settings if the checkbox says so, save the table's values otherwise.
About the image of the proposal:
Comment #21
Gábor HojtsyI wonder if we should have the checkbox(es) above the list of options like on the content language configuration screen but maybe make the interface language option uncheckable?! So you have an overview of which language types are configurable on the top of the page.
@plach, what do you think?
Comment #22
plachWell, my original idea was to adopt the same UI pattern we have with field display settings/view modes, i.e.:
IMO this solution would be more consistent with what we used to have in core although the new content language settings page has introduced a new pattern.
We probably need @Bojhan's feedback about this.
Comment #23
Gábor HojtsyI think having them all on one page makes more sense due to the inter-dependency. Eg. when the content language inherits from interface language.
Comment #24
plachI have no real preference about this. What about pinging Bojhan?
Comment #25
e0ipsoI followed suggestions from Gábor Hojtsy in #21.
The proposed patch is pretty straightforward.
Step one: make some customizations to Content language and save the settings. Customizations are honored on form submission.
Step two: save the form unchecking the customized language type checkbox (to test reseting settings).
Step three: "unfold" the Content language table to check that the settings are the same as User interface language type.
Comment #27
YesCT CreditAttribution: YesCT commentedComment #28
YesCT CreditAttribution: YesCT commentedComment #29
e0ipsoThe following patch updates tests so they reflect the changes introduced by the previous patch. In some situations the checkbox to "customize language type" had to be activated.
Comment #30
e0ipsoComment #32
e0ipso#29: drupal-language-detection-UI-1833022-29.patch queued for re-testing.
Comment #33
edrupal CreditAttribution: edrupal commentedAll worked as expected for my manual testing. One tiny correction to the 'description' text of the 'Customized language types'.
Unchecked language types will get the same settings than User interface text.
should read
Unchecked language types will get the same settings as User interface text language.
('as' instead of 'than' and the word 'language' added to the end to match the checkbox).
Also in the patch, the description is set twice for the new 'customized_language_negotiation' form
Comment #34
e0ipsoRemoved the #description duplicity and updated the text with the suggestions from #33.
Comment #35
Gábor HojtsyCan we work with the existing customisability key in language negotiation types? plach, what do you think? Sounds like a duplicate to introduce another parallel thing for this.
Comment #36
plachI agree with Gabor that we should retain the current configurability setting, but we need to introduce a "locked" setting: we definitely do not want the URL language to become available in the UI and in parallel we can make interface language always configurable by locking it.
Comment #37
e0ipsoThe proposed UI would be something like this.
The patch creates the Customized language types checkboxes and if the language is not customized then all rows are hidden but Interface and the weight is set to the top just like if the user dragged it to the top. If the user doesn't customize the language then nothing else can be done. If the user customizes the language then the default behavior is used.
This way the business logic remains intact and the customization is done using the weight in the detection table as previously. This simplifies the patch because tests do not need to be altered.
Failing is expected for, at least, unrelated reasons
Comment #38
Bojhan CreditAttribution: Bojhan commentedI am not sure this is moving in the right direction, @plach could you ping me on irc?
Comment #39
plachJust had a chat with @Bojhan in IRC: basically his suggestion is to introduce a secondary tab for each configurable language type, plain and simple. More or less what is in #1833022-22: Only display interface language detection options to customize more granularity, but without the fieldset on the bottom with the checkboxes to enable "configurability".
You can find the full log attached.
Comment #40
e0ipsoThanks for posting back the details of the conversation.
Here is a first patch in that direction. All tests involving content language negotiation will most certainly fail (the form is under a different URL) but it should be enough to test the UI before making any other steps.
Screenshots:
Comment #42
plachMissing trailing dot, looks good to me aside from that.
I think we should update language negotiation tests to cover this: we should use a language type defined in
language_test
and check that the related route is defined and settings are saved.Comment #43
YesCT CreditAttribution: YesCT commentedI read the irc log and the screenshots do look simpler without the checkboxes.
But I miss the part where we have just one default unless people want to customize. To clarify, the suggestion is not to have one default and then enable customization, right?
I think that means we need reopen #1874102: Rename language switcher blocks (to differentiate content and UI)
And.. we need to open another issue to figure out if there is a way to have one language switcher block.
Comment #44
Gábor HojtsyYeah I'm not sure this solves the confusion really. Part of the confusion is the two tables look very similar, so you might easily end up configuring one and banging your head into the wall because it does not work. Also the different or application of these is not well explained, etc. And then there is the block problem where we want one block and only expose more if the setting is different.
So maybe we want these as tabs but the tab would only display a checkbox saying "Same as interface text settings" and if you uncheck, THEN you get a table to configure AND a block exposed?
Comment #45
plach@Gabor:
Well, by default they would behave the same as content language would inherit UI language.
Which would mean going back to my original proposal, I guess :)
Comment #46
Gábor HojtsyYes, they would behave the same by default, but if you accidentally click into it, then it looks very confusing because almost the same options are visible vs. the interface language setup. Also, they would still expose blocks, which is even more of a WTF that we wanted to solve with this.
Comment #47
plachYes, I forgot to mention that part to Bojhan (busy morning ;)
I'd be ok with adding the checkbox to enable configurability + locking as proposed in #36. It should be pretty easy to add this to the current patch.
Comment #48
YesCT CreditAttribution: YesCT commentedsteps to show language switcher block problem
where did the language switcher block go? I wonder if a recent commit did something to cause it not to show...
Comment #49
e0ipsoIf I got that right the proposal is:
Plan is:
This may result in a relatively heavy patch. Am I correct?
My personal opinion is that the behavior in #37 (images re-attached here and embedded there) makes the process more clear.
Comment #50
YesCT CreditAttribution: YesCT commentedah, from #48 continuing, I found the block:
Comment #50.0
YesCT CreditAttribution: YesCT commentedUpdated issue summary to be clear about remaining tasks.
Comment #50.1
chrischinchilla CreditAttribution: chrischinchilla commentedAdded 'steps to reproduce'
Comment #51
YesCT CreditAttribution: YesCT commentedI talked with Bojhan in irc yesterday I'll post a mockup, but the quick idea is no checkboxes before, and under to ui table to have [ ] customize for content
which will then make a second table show there. (so no tabs) this should allow to also fix the 2 language switcher block thing, because most situations will have just one table, or at least start out that way.
Comment #52
YesCT CreditAttribution: YesCT commentedthis is more like #37, but without so many checkboxes and descriptions (which most people dont read).
The wording might need to be changed a little. But the point here is just the checkbox that will show the table. And, by default, it's unchecked, so it will use the Interface settings.
And this should mean, that as long as content translation detection is not customized, that there will just be one language switcher block.
Hopefully, with these sane defaults, most people can avoid trying to make sense of this page.
Comment #53
Gábor HojtsyIMHO it should explain what it does if not checked. Now it is not explained.
Comment #54
YesCT CreditAttribution: YesCT commentedI do not know what to do about the following (separate issue?)
when the Interface translation module is not enabled, this table still shows in the detection and selection for User Interface text language detection.
That's weird. So without the Interface translation module enabled, the interface will not be translated, but the detection table still shows, and it's useful to use as the default for content detection. This is confirmed just now by me, and in #19 by @nagwani.
Comment #55
e0ipsoI like the proposal.
This is almost the same as #20, regarding to that proposal Gábor and pach had some concerns that I assume still need to be addressed.
Comment #56
YesCT CreditAttribution: YesCT commented@Gabor So, add a description to the customize checkbox like:
Unchecked, Content language detection has the same settings as User interface text language detection.
(even though Bojhan says people dont read it?)
Comment #57
YesCT CreditAttribution: YesCT commentedok, from irc: no description on the customize checkbox, but wording of the checkbox like:
Customize Content language detection to differ from User interface text language detection settings.
Comment #58
YesCT CreditAttribution: YesCT commentedsince #37 from the backend passed tests,
suggestion:
use #37, but put the checkbox below the (hidden) table, and use the wording Gabor mentioned (simple checkbox, with no description)
To clarify, the reason to put the checkbox under the content table, is if we don't then when it's checked, the table appears below your viewport. With it where the table will be, the table appearing is viewable.
Comment #59
nagwani CreditAttribution: nagwani commented+Subscribe, once there is a patch, will do the manual testing
Comment #60
e0ipsoFollowing the idea behind #37 to reuse the customizability already present this patch does:
1. Adds a checkbox before every language type detection table except for language interface.
2. Using javascript: Hides all tables associated to an unchecked checkbox when loading the configuration page.
3. Using javascript: If the checkbox is clicked saves the current weight for language-interface (for multiple toggle support). This is only done the first time.
4. Using javascript: If unchecked calculates the min weight in the corresponding table and sets the weight for language interface to min - 1. Hides the table & makes sure language interface is enabled.
4bis. Using javascript: If checked restores the initial value for language interface weight. Shows the table.
5. Weights and enabled language types are processed and saved as always.
6. A new configuration object is created to hold the list of customized languages (language interface is always included in the list). A sensible default settings are added with the patch.
The effect to the user when checking/unchecking multiple times is like nothing happened to the weights, everything is back on the place where they last saw it. One exception, if the user had language interface disabled before hiding the table and they show the table back again they'll see that language interface has been enabled.
Note: If
language.negotiation.yml -> customized_language_negotiation
is changed manually, the detection settings for those languages need to be manually altered as well. This means that the config in customized_language_negotiation does not make the language interface to be selected (to reuse the customizability features).Comment #62
YesCT CreditAttribution: YesCT commentedAdded this to the list of priority issues that it would be nice to fix before doing another round of usability testing. #1868058: Open Issues based on the Drupal 8 multilingual user testing results
Comment #63
e0ipsoThere was a missing empty check. Re-testing.
Comment #64
e0ipsoComment #65
YesCT CreditAttribution: YesCT commentedtested by:
only concern is that even when not customize and using the ui detection and selection, that there is still a second language switcher block. I'm ok with dealing with that in a separate issue. (was hoping it would be magically fixed due to other changes here, but it's not, and that's ok)
it worked great!
screenshots of the final ui coming
Comment #66
YesCT CreditAttribution: YesCT commentedfrom step 5.
from step 6.
after changing block settings in step 6.
from step 7. (just seeing what the detection and selection looks like without the content translation module enabled)
from step 14.
from step 15.
still two blocks with content translation enabled, even when not customized on the detection and selection page. (lets discuss in other issue)
so, looking good. next a code review.
Comment #67
YesCT CreditAttribution: YesCT commentedmissing period at end of sentence and extra newline.
merge the two halves of the sentence. (which will also fix the trailing whitespace).
also need to check js standard for if variables should be with _ to separate words or withCase.
http://drupal.org/node/172169
says lowerCamelCased
langtype
is really detection type
or language detection type
needs at least a comment to say that. maybe listing examples like: User interface text language detection, Content language detection.
iface?
lets spell it out: interface
wrap comment to 80 chars.
19?
Initially, hide language detection types that are not customized.
Comment #68
e0ipsoI had to refactor the code a bit to avoid using the magic number -19. That came from the fact that all selects in tableDrag allow weights from -20 to 20, and that made possible to assign values from -19 and down reserving -20 to languange-interface (when switching to NOT customized).
I got rid from that "-19" and also refactored the code.
Comment #69
e0ipsoComment #70
e0ipsoAdded interdiff.
Comment #71
e0ipsoAdded interdiff.
Comment #72
YesCT CreditAttribution: YesCT commentedmanually tested the new patch and it works great.
also, the code changes look good too.
there are some very small english grammar things, but not enough to keep it from rtbc.
Comment #73
plachGreat work on the UI so far, but this is not addressing language type configurablity: we need to mark a language as non-configurable when it's not customized and make it inherit the UI language. Otherwise we will get a language switcher block for each non customized but configurable language, which will be even more confusing than now. See #35 and #36.
We may also want to address:
Cathy, can you outline the actual issues and possibly suggest corrections?
Also a couple of minor things:
Normally we don't use ellipses in inline comments :)
Double trailing semicolon.
Comment #74
plachSee hook_language_types_info and hook_language_types_info_alter for more information on defining language types and dynamically altering their definitions.
Comment #75
e0ipso@plach If I understood it well we need another checkbox (somewhere) to mark a language type as locked. This checkbox (on submit) will alter the language definition to use the fixed key with the user_interface (or something equivalent I need to figure out yet). Doing this will prevent the language types from appearing in the block and the negotiation selection UI.
If that is correct I can move on with a proposal for that UI and a first implementation patch.
Comment #76
plachNo, sorry, I did not explain myself well: the locked flag should be on the language type definition (language_language_types_info()). Then, when generating the UI, locked language types (UI and URL by default) cannot have their configurability changed. We should also hide non-configurable locked languages (the URL language type by default) as there is no point in showing them in the UI.
We may want to set also content language as locked by default and unlock it in the translation_entity_language_types_info_alter(). This way content language could be customized only when ET is enabled.
We should implement
language_language_types_info_alter()
and mark languages as configurable/fixed based on the new configuration item we are introducing here. A language that is made non configurable and has no'fixed'
key in its definition should inherit UI language as content language does.Comment #77
e0ipsoThis should do the trick. The JS part has been simplified a lot, since we really don't care about the language negotiation weights from the tables if the customize checkbox is not selected.
In the implementation of
hook_language_types_info_alter
the customization config object is read and the 'fixed' key is either set toarray(LANGUAGE_NEGOTIATION_INTERFACE)
or unset depending on the customization settings.I've done this by detecting the presence of the 'name' key in the language type info.
Since the 'fixed' property is generated and unset based on some configuration, there is no need for translation_entity_language_types_info_alter() to handle this. If any module wants their custom defined language type (or any other) to be customized by default it just needs to drop some default configuration as usual and this will be processed in language_language_types_info_alter().
Any module can implement
hook_language_types_info_alter
, this means that after executing all hooks there is no guarantee that there is a match between the configuration object and the language_types_info. Actually it will depend on the hook execution order. A good way to avoid this would be to place the current code before (or after) thedrupal_alter
in http://api.drupal.org/api/drupal/core%21includes%21language.inc/function...What do you think?
Comment #79
plachWrt the locked stuff I had in mind something like the attached interdiff, AAMOF the
'name'
key is not reliable as it might be defined also for non configurable types. In this scenario the'fixed'
key's role becomes just defining which the language negotiation settings are if the language type is non configurable. It would be nice to rename it to'settings'
, but since it would probably require an update function we could defer that to a follow-up.To recap:
ET is just unlocking the content language type, which there is no point to configure without translation enabled. As a consequence content language is hidden when ET is disabled, and it is customizable but non configurable by default when ET is enabled.
You are right. Probably the proper way to fix this is making
language_types_get_configurable()
rely only on the config settings. This way Language has only to care about saving the proper values for them. Since the language system is a core subsystem and thus is independent from the Language module, we should probably have a separate config object owned by the System module. Something like the following:When storing the language negotiation settings, the Language mdoule should check whether a non configurable language type defines a
'fixed'
key and if it don't it should default to the UI language. This does not need to be in the language types info, just in the stored language negotiation settings. Hence I guess we don't need to alter language types in the Language module after all, sorry for indicating a wrong direction :)One last minor thing: somewhere we agreed with Gabor that when there is only a single configurable language type, and therefore a single language switcher block available, the default name of the block should be just
Language switcher
, skipping the language type in parentheses. To ensure any change is picked up, we will need to clear the block discovery cache, when saving the configurability settings, by callingBlockManager::clearCachedDefinitions()
.Comment #80
plachThe interdiff...
Comment #81
e0ipsoThere are many changes in this patch so I won't add an interdiff.
It still needs work because tests are still failing (I suspect there is a bug regarding URL negotiation), but it'll be great if someone more experienced in D8MI could have a look at it in the meantime.
Comment #83
e0ipsoComment #84
plachThis should be a parameter.
Minor: it's a bit sloppy repeating twice the test on $info['fixed']. Can we initialize the value to TRUE above and set it to FALSE if appropriate?
Here we should default to the UI language type negotiation method, if there is no fixed configuration.
We have to get rid of this and provide an update function.
Can't this just be
!empty($configurable[$type])
?Let's skip this and pass the $configurable array to
language_types_set()
.This should be
Dupal::service('plugin.manager.block')->clearCachedDefinitions();
I think providing the defaults in
language_types_set()
is cleaner. And we can also remove the 'fixed' key from the content language type definition.I guess we shouldn't test for the fixed key anymore: if we do as I'm suggesting below wemight have non -configurable language types that have no 'fixed' key.
This should be moved to
language_types_set()
.Missing newline at the end of file.
Comment #85
e0ipsoI tried to centralize as much code as possible in language_types_set($configurable = NULL) [note the API change!].
I found some bugs in the cached version of language_types_get_configurable and in language_types_set.
All tests turned green in my machine (except for one that was already failing in branch 8.x).
Comment #87
e0ipso#85: drupal-language-negotiation-UX-checkboxes-1833022-85.patch queued for re-testing.
Comment #88
e0ipsoChecks for the presence of the block module before clearing block cache. This makes User Language Creation test to pass.
Comment #89
YesCT CreditAttribution: YesCT commented#88: drupal-language-negotiation-UX-checkboxes-1833022-88.patch queued for re-testing.
Comment #91
vijaycs85#88: drupal-language-negotiation-UX-checkboxes-1833022-88.patch queued for re-testing.
Comment #92
Gábor HojtsyCan you post up to date screenshots of how this works? Both on the language negotiation page and the blocks list. Thanks!
Comment #93
nod_Looking at the JS part, is there a special reason we can't be using the JS #states API?
Comment #94
Gábor Hojtsy@nod_: looks like from the code that there are multiple elements to show/hide. Not sure if those would behave if the container would be shown/hidden. (I definitely did not try).
Comment #95
YesCT CreditAttribution: YesCT commentedtagging for #92
Comment #97
YesCT CreditAttribution: YesCT commentedI'm sitting down to give this a good manual review.
On just enabling only the language module, both tables are appearing on the detection and selection tab.
I'll check more next.
Comment #98
YesCT CreditAttribution: YesCT commentedI'll wait to hear from @e0ipso or someone.
Comment #99
vijaycs85Guess, it is not removed with intention. Adding it back solves the problem.
Comment #101
YesCT CreditAttribution: YesCT commentedThat looks like a real fail:
I'll try it manually.
Comment #102
YesCT CreditAttribution: YesCT commentedThe content translation module adds a UI to support content translation.
But language support for content exists without the content translation module.
We can create an article in english, and another article in spanish, without being able to "translate".
So we need the content language negotiation settings to show, even without content translation enabled.
with the patch, with just the language module enabled (content translation not enabled):
with the patch, with both language module and content translation module enabled:
Comment #103
YesCT CreditAttribution: YesCT commentedwhile testing the language switcher block (yay, there is only one) I got frustrated that I couldn't get the interface translation ui to find any of the strings on the front page. #1966924: Interface translation UI is not indexing strings from visited pages
Comment #104
e0ipso#88: drupal-language-negotiation-UX-checkboxes-1833022-88.patch queued for re-testing.
Comment #105
e0ipsoI am facing a dilema here. According with bootstrap.inc and #79 language content should not be considered configurable, but #102 suggests that it should be configurable. Please provide more info.
There was a bug showing non-configurable locked language types in the language detection UI if they didn't have a default language negotiation setting (
fixed
key). That is why Language Content was coming up as a table (it didn't have a configurability checkbox because it is locked without ET).I will post screenshots in a separated comment as per #92.
Comment #106
e0ipsoPlease bear in mind that this patch comes with default configuration for the system module, this means that the patch should be applied before installing the system module. An alternative to this is replicating the configuration in system.language.types.yml using devel's configuration UI (
devel/config/edit/system.language.types
).Comment #107
e0ipsoThere are 2 languages enabled: English (at installation time) and Catalan.
Language enabled + ET disabled
Language selection
Block list
Language enabled + ET enabled
Without customizing Content Language
Language selection
Block list
Customizing Content Language
Language selection
Block list
Comment #108
plachThese screenshots look awesome, great work! I think we are close to RTBC, we just need some more clean-up.
Language negotation is useful when you have more than one language to pick from. When ET is disabled there is no way to have more than one language applied to content, hence I don't see how customizing content language negotiation settings is useful in this case.
I think we can get rid of the
$stored
parameter now.Thus this ternary can go away.
This is really unfortunate, as we are introducing a dependency between include-level code and module-level code. I think this is telling us that the interface language detection method actually belongs to language.inc, along with its constant. Probably it should sit next to
language_from_selected()
. Anyway we should definitely remove this line.I don't see a big value in retaining the ability to call this with no parameters. Actually calling a setter function with no value looks a bit weird. There is only one of occurence of this being called with no values: can we fix that one and remove the default here?
We need to update this comment to reflect what's actually happening.
Comments do not wrap correctly.
This is actualy making the
language_types
variable redundant. Since we needed to migrate it to config anyway can we add a @todo here, so we can complete the transition in a follow-up?I think we should use a library declared through
hook_libary_info()
here, but I am not sure. Maybe @nod_ can confirm. Btw, as already asked above, why can't we use states here?This comment needs to be fixed somehow :)
Please remove these.
We can remove the
$stored
parameter.Can we use
language_types_get_configurable()
here?Why are these changes needed?
This line can go away.
Comment #109
plachd.o--
Comment #110
plachComment #111
YesCT CreditAttribution: YesCT commented#108 @plach
OK. So the example of having content A in English, and content B in Spanish does not make a case for having content language negotiation.
Is this use case worth paying attention to:
content can have language without the Content translation module (aka translation-content and ET) enabled.
If it was enabled on a staging site, translations created, and migrated to a live site that has ET disabled there...
Language support is in core, ET provided the (a?) UI for translating content.
I agree it's confusing to SEE the content negotiation settings without having ET enabled. It makes me think, "why should I configure that if I dont translate an content?!" And my confusion at seeing that lead to a conversation in irc, I think with Gabor, where it was explained about language support being in core...
Comment #112
YesCT CreditAttribution: YesCT commented#107 about the blocks list, the last screenshot:
Will we ever need more than one language switcher?
I think they work just by adding the langcode prefix to the url...
Can I click on Spanish in the content language switcher to get spanish content no matter the detection method settings?
Or does the language switcher only work with url the first enabled method?
Can I then click on English for the UI language switcher block and end up with the UI in English and the content in spanish?
My point is I'm wondering if there is ever a case where a site builder would want to have both the UI and the content language switcher block.
This is confusing, I'll have to play with it again.
Comment #113
e0ipsoThis patch takes into account the feedback provided by plach in #108.
Comment #114
e0ipsoComments on the interdiff in #113 based on the feedback in #109.
This got much simpler now.
I removed the module-level code by including the file with the contant definitions.
language_negotiation_include
includeslanguage.inc
. If we move it tolanguage.inc
then we will need to add an include directive to be able to calllanguage_negotiation_include
which kind of defeats the purpose.This was a leftover from a test of mine. Reverted to 8.x branch.
I'm curious how you detected that…
At some point some extra JS work was done. PHP handles most of the logic now and I can't find a good reason not to move to states. I'll give it a whirl in a subsequent patch.
If we are going in the #states direction then the following is not relevant. I did that at some point (we could find it in one of the patches). I can't remember why I moved away from it… if @nod_ confirms that we need it I'll revisit and post back if any troubles arise.
Comment #115
plach@YesCT:
Content language detection is supported even if the UI for setting it is disabled. If the content language negotiation settings have been configured in the dev/staging environment, then they won't need ET to be enabled to work, they would just be picked from config.
Well, it's an edge case but I think that if one needs seprate configurations, then she may as well need separate language switchers. Think of an admin that usually has fixed UI language set through a preference but sometimes she wants to see how the UI looks like in another language. I think the current approach provides an additional level of flexibility without a too high price to pay, now that we are fixing UX for the most common scenarios. Keep in mind that language types are module-definable and we cannot predict whether a custom language type could need a language switcher.
@e0ipso:
Thanks! Some more remarks:
I guess we can remove static cache altogether here, or at least we should use it :)
No module reference of any kind in language.inc, please. We should not require this. If we do then we need to move
LANGUAGE_NEGOTIATION_INTERFACE
andlanguage_from_interface()
in language.inc.I think this should say "The configuration of a locked ...". Also, there is typo: "change" > "changed".
Can we change this sentence to "If it has no default settings"?
Again I'd use "The configuration" instead of "Configurability": we are talking about the actual settings.
Comment #116
plachDreditor has a nice line showing where comments should wrap and my eyes kinda got used to spotting stuff that does not fit well ;)
Comment #117
e0ipsoUpdated patch.
BTW: I can how Dreditor helps detecting them but I'm still impressed by your spotting skills ;-)
Comment #118
e0ipsoDouble posting.
Comment #119
plachComment #120
e0ipsoThe last submitted patch will fail for the same reasons in #113. This still needs work, but I'm going to give this a chance against the testbot.
Comment #122
e0ipso#120: drupal-language-negotiation-UX-checkboxes-1833022-120.patch queued for re-testing.
Comment #124
e0ipso#120: drupal-language-negotiation-UX-checkboxes-1833022-120.patch queued for re-testing.
Comment #126
plachProbably you need to clear static cache in the failing test.
Comment #127
e0ipsoLet's give it a shot :-)
Added default LANGUAGE_NEGOTIATION_INTERFACE to language content. And tweaked some comments.
@nod_ & @plach Since the table is rendered using a theme function instead of a render element there is no place to attach the states to. To do so we should include a FAPI container (for instance) which may require updating many tests (in case this option is viable). Is this something we want to pursue?
Comment #129
plachI'd be happy with keeping the current state (pun non intended ;), but I'll leave the final answer to @nod_.
Comment #131
plach#127: drupal-language-negotiation-UX-checkboxes-1833022-127.patch queued for re-testing.
Comment #132
e0ipsoSeems like patch from #120 randomly fails in EntityTranslationFormTest. If I add a 'fixed' key for the language type content info LANGUAGE_NEGOTIATION_INTERFACE (like in the patch #127), that test passes but another one fails LanguageNegotiationInfo.
I'm not sure which way to go. I hope I can have some free time this weekend to work on this. Any help will be appreciated :-)
Comment #133
plachIf you post a clean version of #127 (that one has unrelated hunks in it) I'll see if I can have a look to it.
Comment #134
nod_Reroll of #127 with a couple of JS changes.
table-language-group
class to the table-detectiontype-wrapper div element to simplify the JS, could be adata-
attribute too but i'm not sure themers will want to mess with that anyway.[configurable]
, makes JS a little simpler too.Leaving as NW. Happy with the JS now. I'd be even easier is the table (and the show weight links and tableheader and all) was in it's own wrapper but that's not too bad.
Comment #135
plach@nod_:
Woot!
@e0ipso:
Can you integrate #134 on your dev branch and provide a clean one? Thanks!
Comment #136
YesCT CreditAttribution: YesCT commentedI went back to the clean patch from #120 and then applied the interdiffs.
So for review purposes.. no interdiff. :)
Comment #137
YesCT CreditAttribution: YesCT commentedsomething strange happens...
when customize the content detection methods, check the box to show the table, and change url to something like session, then save the page:
when the form comes back, the session is *not* checked.
Movie: http://screencast.com/t/aGa4fFmbkG
Checking session then, and saving does save the session as checked.
Comment #138
e0ipsoThere was a problem getting the configurability before actually saving it (the first time), this accounts for the issue found by YesCT in #137.
Addtionally this ticket changes the behavior for configurable language types. After setting a language as "unlocked" (and unsetting the "fixed" key) the language is not configurable (until you make it so using the checkbox in
admin/config/regional/language/detection
). This test was failing so I had to manually make it configurable.Comment #140
YesCT CreditAttribution: YesCT commented@e0ipso make a comment when you get some time for this. I dont want to pester you too much. :)
Comment #141
attiks CreditAttribution: attiks commentedComment #142
YesCT CreditAttribution: YesCT commentedthanks attiks.
sorry @e0ipso I missed that that new comment is from today!!
Comment #143
e0ipsoLOL. No worries @YesCT, I see your point though. I've been very unavailable lately :-(
Comment #144
e0ipsoFixes:
Comment #145
e0ipso#144
I guess it was failing because of my local environment.
Comment #146
attiks CreditAttribution: attiks commented1/ I tried the patch, added a second language and a translated node and enabled both blocks: 'Language switcher (Content)', 'Language switcher (User interface text)', but the 'Language switcher (Content)' isn't displayed
2/ On '/en/admin/config/regional/language/detection' if I uncheck 'Customize Content language detection to differ from User interface text language detection settings.' and change settings from 'User interface text language detection' are they supposed to be propagated to the 'Content language detection' so they stay in sync? Or is the content language detection disabled all together?
3/ If a uncheck the box and save I get 'Drupal\Component\Plugin\Exception\PluginException: The plugin (language_block:language_content) did not specify an instance class. in Drupal\Component\Plugin\Factory\DefaultFactory::getPluginClass() (line 62 of /core/lib/Drupal/Component/Plugin/Factory/DefaultFactory.php).
The website has encountered an error. Please try again later.'
It looks like the save has to disable the blocks in some way
Comment #147
e0ipso@attiks
1/ That is a feature. If you don't explicitly tell that the content language type should be configurable it won't have a block to select the language.
Comment #148
e0ipsoScenario:
If we make Content language type non-configurable, then we get the error in #146. I tried to solve this by disabling the faulty blocks on the submit callback with:
But that didn't work. I'm not sure how to solve this. Any help will be appreciated!
Comment #149
attiks CreditAttribution: attiks commentedIt will be even more complicated, because after a person disables this, and sees the block is gone, they might expect to get it back if they enable it again?
Comment #150
attiks CreditAttribution: attiks commentedYou probably will need to clear the cache if the checkbox state is toggled to make sure the block info is refreshed
Comment #151
e0ipso1/ Please make sure when testing that you make the language content to differ from the language interface. If you don't you won't get the block in the screen (may be a follow up?).
2/ As we commented on IRC it should be in sync (since it is set to LANGUAGE_NEGOTIATION_INTERFACE).
3/ It should be fixed now.
You can check the manual testing at http://www.screencast.com/users/e0ipso/folders/Default/media/a90e6892-15...
Comment #152
e0ipsoComment #154
e0ipsoRe-rolling patch.
Comment #155
e0ipsoComment #156
YesCT CreditAttribution: YesCT commentedI manually tested this, and it seems to address all the issues.
I'd like to give it a closer look and hope to in just a bit.
found this unrelated issue while testing: #2006606: Views rendering ignores entity language, eg: Identical nodes rendered in views when nodes have translations
Comment #157
YesCT CreditAttribution: YesCT commentedThis is much better, but...
If
customize the content language detection
place the content language detection block
uncheck the customize content language detection (but the block is still there)
get error:
http://screencast.com/t/3nVhOimN
Comment #158
YesCT CreditAttribution: YesCT commentedI just tested #154 again and it works perfectly and I cannot reproduce the problem.
A code review coming up.
Comment #159
e0ipsoThis is a follow up issue: #2010542: Remove variable 'language_types' in favor of configuration object system.language.types to remove old variables.
Comment #160
YesCT CreditAttribution: YesCT commentedI guessed at adding doc for that.
I also guessed at types.. too much guessing this time.
Fixed some grammar.
Re @attiks in #149, I think people will see they will have to reconfigure it. We are actually making the settings match when we uncheck the customize, so there is no way to get the old settings back.
I'm not sure if an upgrade path is needed as part of this. Is it? Or can we do it in a follow-up?
Comment #162
Cameron Tod CreditAttribution: Cameron Tod commentedAdded upgrade path, which should kill the notice. Green locally.
Comment #164
Cameron Tod CreditAttribution: Cameron Tod commented#162: drupal-language-negotiation-UX-checkboxes-1833022-162.patch queued for re-testing.
Comment #165
YesCT CreditAttribution: YesCT commentedhttps://drupal.org/node/1354
Update functions (implementations of hook_update_N())
These use a different syntax, because the documentation summary (first line) is displayed to someone running update.php to tell them which updates need to run.
Note that the first line should start with an imperative verb, so it will make sense to people running update.php.
Comment #165.0
YesCT CreditAttribution: YesCT commentedadded steps to see the language switcher block problem
Comment #166
YesCT CreditAttribution: YesCT commented(noticed this totally separate issue #2011376: Fix verb tense in update function summaries during #165)
Comment #166.0
YesCT CreditAttribution: YesCT commentedupdate remaining tasks and ui changes.
Comment #167
plachI tested this and it works really well, awesome work!
While reviewing code I found only minor things to complain about, we are really close to RTBC :)
The comment meaning should be reversed: locked languages with a default configuration are always non-configurable and viceversa. Also, let's avoid colloquial forms: "won't" should be "will not".
This is not very important, since we are going to remove it, but the value assigned to
$language_types[$type]
should match the one assigned to$configurable[$type]
.drupal_container()
is deprecated now. We should useDrupal::service('plugin.manager.block')->clearCachedDefinitions();
instead.Surplus empty line.
Obsolete constant name: should be
Language::TYPE_CONTENT
.Comment #168
e0ipsoChanges from feedback from #167.
This is not very important, since we are going to remove it, but the value assigned to $language_types[$type] should match the one assigned to $configurable[$type].
Let's deal with this then.
Comment #169
YesCT CreditAttribution: YesCT commentedComment #170
YesCT CreditAttribution: YesCT commentedI dont see changing or removing
in the inderdiff...
but it seems it's not there.
with the patch applied:
Comment #171
YesCT CreditAttribution: YesCT commented[edit: duplicate comment]
Comment #172
plachI don't think it's worth to hold up this great work any longer on that minor stuff, since now language type configurability relies on the configuration settings. Let's just get rid of the
language_types
variable in #2010542: Remove variable 'language_types' in favor of configuration object system.language.types.Comment #172.0
plachnoted where to find screenshots of with the patch.
Comment #173
alexpottThe system.languages.type.yml could be structured differently that would mean we can lose the static in language_types_get_configurable()... and this static is a double cache atm as all config read during a request is statically cached :)
I suggest that the default file like this
i.e only store what can currently by configured and do the
array_keys(array_filter(
... on saveSo then this...
Becomes
... or might just decide to get rid of the function altogether...
Comment #174
e0ipsoI have implemented the suggestions from @alexpott.
Comment #175
e0ipsoComment #176
YesCT CreditAttribution: YesCT commentedwhat did 1 mean? 0 mean?
maybe the lines that were : '0' should be ommitted from the list if they are "not" or locked or fixed or ...
Comment #177
e0ipsoAhhh! That was me submitting too quick. Thank god to the vigilant eyes of @YesCT :-)
Comment #179
e0ipsoReroll.
Comment #181
e0ipsoFix the warnings that caused the test fails.
Comment #182
e0ipsoComment #183
plachNot sure about the
$configurables
variable name, from a first read it's not very clear which is the difference between$configurable
and$configurables
. I'd prefer something more self-documenting, if possibile:Maybe just
$configurable
and below$configurable
becomes$config_values
?So this would become
$config_values
.Comment #184
e0ipso@plach you are absolutely right. It was confusing even to fix it. I hope I didn't break anything with this fix.
Comment #186
plach#184: drupal-language-negotiation-UX-checkboxes-1833022-184.patch queued for re-testing.
Comment #188
e0ipsoreroll
Comment #189
e0ipsoComment #190
plachBack to RTBC :)
Comment #191
alexpottNeeds a reroll
Comment #192
alexpottComment #193
e0ipsoReroll
Comment #194
Gábor HojtsyLooks like the same :)
Comment #195
alexpottThis seems overly complex... is there anything we can do to simplify or explain more... the difference between locked and fixed is complete non-obvious.
Comment #196
plachI agree
'fixed'
and'locked'
clash:'fixed'
should be renamed to'settings'
or'negotiation settings'
or'default settings'
, but since this would require an upgrade path ('fixed'
is D7 stuff), we thought of deferring that to a follow-up.Comment #197
e0ipso@alexpott you can find the comment @plach is referring to in comment #79.
@plach, @YesCT do we have a follow-up for that already?
Comment #198
plachNot that I know
Comment #199
plachI added a @todo mentioning the need to rename the
'fixed'
key, which IMO is out of scope here. Opened #2019317: Rename the 'fixed' language type info key for that.Comment #199.0
plachUpdated issue summary.
Comment #200
YesCT CreditAttribution: YesCT commentedI retested this manually. still good.
Comment #201
alexpottI still think it's possible to clean up the logic here to make it easier to understand.
For example...
if ($locked = !empty($info['locked'])) {
is a double negative and the complexity serves no purpose as we have an else on this if...Also...
$language_types[$type] = !$locked;
at this point $locked can only be true so either this was not the desired intention or$language_types[$type] = FALSE
is the way to go...Comment #202
plach@alexpott:
Sorry, I probably misunderstood your earlier comment.
@e0ipso:
Can you take care of alex's reveiw?
Comment #203
e0ipsoSome cleanup and some comment changes.
Comment #204
e0ipsoComment #206
e0ipsoComment #207
andypostDrupal:moduleHandler()
Comment #208
plachThe changes in #206 look good, not sure about some english forms in the inline comments. Gabor, can you double-check?
Also, +1 for #207,
module_exists
is or should be deprecated now.Comment #209
penyaskitoChanged only Drupal:moduleHandler().
Comment #210
plachJust checked with Gabor: comments should refer to language types, not just languages.
Comment #211
plachComment #212
penyaskitoFixed language types references in comments.
Comment #213
alexpottMaintain both the variable and CMI is adding unnecessary complexity. After talking to @plach we've agreed that to progress with this patch we should fully convert the language_types variable and remove it.
Comment #214
YesCT CreditAttribution: YesCT commentedWe had a long chat in google hangout. This is a combination of some of my questions I had before the chat, answers we found while talking, and also some suggestions to change names and comments as I am understanding the code a little better. I'm saving the notes here so they do not get lost. @e0ipso is making some updates now also. After they are posted, I'll read through them and see if things are still making sense. :) The talk was very helpful. Thanks!!
-------
0.
Looking at the screenshots in #107,
are the language types:
user interface text language
content language
?
Yes.
1.
There is another type
url language
not customizable
it never has it's table shown.
2.
fixed is really the default settings that a language type comes with, and should get reset to if the customized checkbox is unchecked.
We have another issue to rename fixed, changing it is out of scope of this issue.
3.
user interface is locked
so there is no customize checkbox.
4.
content language is initially locked,
but if content translation is enabled, locked is FALSE.
language types with locked FALSE will show on the page with a checkbox allowing to be customized.
5.
customized is the word used on the checkbox in the UI.
we think it will be good to use similar word in the code, and it was generally called configurable before.
6.
Is an example of customizing a language type:
reordering the detection methods?
or
enabling or disabling a detection method?
yes.
--------
7.
This is the information about the language types, what types there are, their info: names, descriptions, their default settings (the fixed keys), and if they are locked.
8.
user interface is "locked"? yes.
user interface is a special case
and always has it's table shown.
9.
content language is not initially customized, but can be customized (when a module is enabled, when that module changed locked to false.)
content language is not "locked" because it can be customized, and then when it's customized, ... it can be un-customize, set back to the defaults, which are the keys in fixed.
10.
locked false is the same thing as customizable, but we do not know if it is customized or not customized.
== end some questions and answers == now looking at the code. note the suggestions may not have word wrap at 80 chars. :) check that later.
A.
suggest:
-----------------
B.
I suggest
-----
C.
I suggest
-------
D.
suggest
-----
E.
suggest
--------
F.
suggest separating the bit we are storing for the future from the next part saving the settings.
suggest
========
OK. I think we can get somewhere. :)
Comment #215
YesCT CreditAttribution: YesCT commentedMy english grammar in those comments will need some polish, but I think we are on the right track with the meanings.
Comment #216
e0ipsoThis still needs work, but maybe someone can use this as a baseline to figure out how to make this green. The thing is removing variable
language_types
in favor of the configuration object.Comment #217
kfritscheTestbots are currently on idle so I set this to needs review to see what is failing.
Comment #219
plachIt seems e0ipso won't be able to address the latest reviews. Kudos for all the hard work here, let's try to bring this home by tomorrow night.
Comment #220
plachComment #221
kfritscheFirst just a quick reroll to see what is failing correctly.
Comment #223
kfritscheNew patch.
This should change everything mentioned in #214.
Thanks YesCT for this!
Also most of the patches should pass now.
Comment #225
kfritscheProblem with the LanguageNegotiationInfoTest is fixed. The settings was overwritten everytime language_modules_enabled was called.
The second error
require_once(/var/lib/drupaltestbot/sites/default/files/checkout/includes/locale.inc): failed to open stream: No such file or directory
I couldn't figure out yet. It tries to include a file from a negotiation. I think somehow 'update_prepare_stored_includes()' from update.inc is not called, as there should be the change be done.If anyone wants to do that, feel free I'm on the plane for the next hours.
Also the comments I changed in #223 needs improvements.
Comment #226
kfritscheComment #228
plachThis should hopefully fix the latest failure. It also includes improvements to comments and readability of
language_types_set()
.Comment #229
kfritschePatch works for me, upgrade test runs through for me now.
Did a lot of manual testing with the language_test module today while working on #225. Latest patch only changes comments and upgrade path.
It was already RTBC and the changes needed are done.
Comment #231
penyaskitoHEAD was broken, that's why tests didn't pass. As soon as HEAD is green again, please retest.
Comment #232
kfritsche#228: drupal-language-negotiation-UX-checkboxes-1833022-228.patch queued for re-testing.
Comment #233
plachBack to RTBC
Comment #234
YesCT CreditAttribution: YesCT commentedMoving this saving of the customized setting to the end of the loop, makes more sense, because we can see right under that, that the info is then saved.
(It was set at the beginning and then overridden while going through the loop.)
Comment #235
YesCT CreditAttribution: YesCT commentedtag bug.
Comment #236
YesCT CreditAttribution: YesCT commentedThis issue was RTBC and passing tests on July 1, the beginning of API freeze.
Comment #237
YesCT CreditAttribution: YesCT commentedsigh. tag didn't stick. adding again.
Comment #238
Dries CreditAttribution: Dries commentedI think we can improve the section titles and whitespace to make things look more like sections. For example, the title 'Content language detection' is kinda small-ish and doesn't help me understand the structure of the page. I can't really put my finger on it, but there is something about the design/layout/style that still doesn't make it 100% intuitive and clear ... Given that this is cosmetic, it shouldn't hold up the patch though.
In #5, Gabor upgraded this to 'major' because it was blocking another issue. However, the issue it is blocking is 'normal'. I think this issue should be reclassified as 'normal'.
Comment #239
Gábor HojtsyEither way this is a major usability bug because it will expose multiple language switcher blocks although it does not matter for the 80% and it will be very confusing to configure. Bigger than normal.
Comment #240
alexpottCommitted d5d172e and pushed to 8.x. Thanks!
We need a follow up for the design and to do config schema...
Fixed up some very minor nits during commit...
js formatting - change to follow formatting in Drupal.js for Drupal.checkPlain()
Unnecessary blank line
Comment #240.0
alexpottadded related. are there other relates? -yesct
Comment #241
YesCT CreditAttribution: YesCT commentedwow! what a relief.
went from medium to epic I think. :)
added follow-ups to the issue summary.
Comment #241.0
YesCT CreditAttribution: YesCT commentedadded follow-ups
Comment #242
e0ipsoChange notice has been created.
Comment #243
YesCT CreditAttribution: YesCT commentedthe UI changes described in the change notice look good.
I'm not sure what kind of detail should be in the API part.
Comment #244
e0ipsoSorry @YesCT, I didn't want to mess with your tags.
Comment #245
YesCT CreditAttribution: YesCT commentedOK. Lets call the change notice done. We can iterate on it if needed.
Back to the issue settings before we needed the change record.
Comment #246
Gábor HojtsyYay!
Comment #247.0
(not verified) CreditAttribution: commentedUpdated issue summary.
Comment #248
chx CreditAttribution: chx commentedNote #2136963: Variable to config system.language.types [d7] please.
Comment #249
plach