Problem/Motivation

D7 introduced great feature: language fallback that was used for entity translation. Unfortunately this feature was used only for entity translation. A contributed module was created to add language fallback features to the string translations too.

Unfortunately it seems that this inconsistency in translation mechanisms is now also present in D8. The core string translation ignores language fallback features that are also provided by the core.

Proposed resolution

It all boils down to the LocaleLookup::resolveCacheMiss function that in case of missing translation should check fallback languages offered by LanguageManager::getFallbackCandidates() function.

Pass the languageManager down further.
Improve test coverage.

Remaining tasks

  • (done) Create a patch.
  • (done) Review

User interface changes

No user interface changes.

API changes

No API changes beside the fact that finally language fallback will work also for string translation.

CommentFileSizeAuthor
#71 locale-2122175-71.patch17.9 KBdclavain
#64 locale-2122175-64.patch17.89 KBtim.plunkett
#64 interdiff.txt1.66 KBtim.plunkett
#62 interdiff.txt23.08 KBtim.plunkett
#62 locale-2122175-62.patch16.23 KBtim.plunkett
#57 interdiff-2122175-56-57.txt780 bytesYesCT
#57 add_language_fallback_to_string_translation-2122175-57.patch8.39 KBYesCT
#57 interdiff-notusedattempbeforetim.txt4.08 KBYesCT
#56 interdiff.txt9.22 KBtim.plunkett
#56 string-translation-2122175-56.patch8.33 KBtim.plunkett
#49 interdiff-2122175-47-49.txt8.83 KBYesCT
#49 add_language_fallback_to_string_translation-2122175-49.patch9.29 KBYesCT
#47 add_language_fallback_to_string_translation-2122175-47.patch9.57 KBdclavain
#47 interdiff.txt851 bytesdclavain
#45 add_language_fallback_to_string_translation-2122175-45.patch9.6 KBdclavain
#45 interdiff.txt689 bytesdclavain
#42 add_language_fallback_to_string_translation-2122175-42.patch9.6 KBdclavain
#42 interdiff.txt8.82 KBdclavain
#36 add_language_fallback_to_string_translation-2122175-36.patch9.52 KBdclavain
#36 interdiff.txt1.5 KBdclavain
#32 add_language_fallback_to_string_translation-2122175-31.patch9.4 KBSiliconMind
#31 add_language_fallback_to_string_translation-2122175-30.patch7.8 KBSiliconMind
#7 add_language_fallback_to_string_translation-2122175-6.patch1.56 KBSiliconMind
#4 Add_language_fallback_to_String_translation-2122175-3.patch1.29 KBSiliconMind
#3 Add_language_fallback_to_String_translation-2122175-2.patch1.36 KBSiliconMind
#1 Add_language_fallback_to_String_translation-2122175.patch1.29 KBSiliconMind
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

SiliconMind’s picture

Status: Needs work » Needs review
FileSize
1.29 KB

A patch that adds language fallback to string translation.

Status: Needs review » Needs work

The last submitted patch, Add_language_fallback_to_String_translation-2122175.patch, failed testing.

SiliconMind’s picture

Issue summary: View changes
Status: Needs work » Needs review
FileSize
1.36 KB

Previous patch failed testing on irrelevant tests. Try new one to make sure.

SiliconMind’s picture

Status: Needs review » Needs work
FileSize
1.29 KB

Trying again original modifications. Last patch was kinda dummy.

SiliconMind’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 4: Add_language_fallback_to_String_translation-2122175-3.patch, failed testing.

SiliconMind’s picture

Status: Needs review » Needs work

The last submitted patch, 7: add_language_fallback_to_string_translation-2122175-6.patch, failed testing.

SiliconMind’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 7: add_language_fallback_to_string_translation-2122175-6.patch, failed testing.

SiliconMind’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 7: add_language_fallback_to_string_translation-2122175-6.patch, failed testing.

SiliconMind’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 7: add_language_fallback_to_string_translation-2122175-6.patch, failed testing.

SiliconMind’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 7: add_language_fallback_to_string_translation-2122175-6.patch, failed testing.

SiliconMind’s picture

Status: Needs work » Needs review
Gábor Hojtsy’s picture

I don't get this patch. If I have German, Norvegian and English on my site in this order, would a German site page potentially contain Norvegian strings (instead of English) due to your proposed fallback logic? How is this useful?

SiliconMind’s picture

Gabor, you could ask the same question in regard to language fallback for entity translation which is already present in core :) Besides since the language fallback feature exists it should be used consequently for all translation cases, that is entity translation and string translation.

There are scenarios where it is not desired to have a translation fallback directly to English. Take a look at original language fallback contributed module and it's use case:

Use case

Your site is using regional variants of languages, like Dutch Netherlands (nl-nl) and Dutch Belgium (nl-be), to set this up you first add the build in Dutch (nl) language and you define 2 custom languages (nl-nl and nl-be). If a string needs to be translated it will first check nl-be, and if the string isn't found it will check nl.

Note that you can also provide your own fallback order, though UI for that is not in the core.

Gábor Hojtsy’s picture

Right, so the proposed logic makes sense for a subset of scenarios. Since there is no configuration proposed, applying it to all scenarios sounds like a problem to me.

SiliconMind’s picture

There is also no configuration for entity translation fallback. It is enabled out of the box. This could be worked out as a separate issue. Note that this patch does not change anything until you actually provide a candidates for fallback.

matsbla’s picture

This fallback function is very useful, especially when making a website containing minority languages, as it is possible to specify different fallback languages for different languages. E.g. I can have a website in Nortern Sami, but if I don't have the string translated in Northern Sami I would prefer more to have it displayed in Norwegian, than English (Most Sami people understand Norwegian much better than English). As a Norwegian I would also prefer to see strings not translated to Norwegian, in Danish, as Norwegian Bokmål writing is based on Danish; some words and sentences can even be written exactly the same. It can also be practical for other issues, e.g. Chinese simplified and Chinese traditional could benefit from using each other as fallback languages. And we can make it possible for visitors to specify their own fallback languages, so they can adapt the translations used specific for their own need.

So in general the language fallback function is practical for several use cases, but it should be a unified way to handle them. Why only use it for entity translations?

Gábor Hojtsy’s picture

So this is not useful in any way without the logic to specify those fallbacks which is not proposed. A module implementing that logic / UI could also swap the service with an implementation that does the fallback, which is a huge point of the service based architecture in Drupal 8. I'm not sure without proving this full circle is good especially since it harcodes a behaviour but only applies to some scenarios.

SiliconMind’s picture

But you do realize that current implementation is inconsistent? Entity translation works differently than string translation. The goal of this patch is to unify this.

Gábor Hojtsy’s picture

There is no field level language fallback system in entities either (in Drupal 8), so the language selected is global to the entity. Much like the language selected for the page is global to the page unless specific parts request otherwise. Same applies to configuration translation. I think the feature you are proposing here is more akin to the field level language fallback in content entities that Drupal 7 supported in entity translation. That is not present in Drupal 8 AFAIK.

SiliconMind’s picture

You can see here that EntityManager uses LanguageManager::getFallbackCandidates to obtain a list of language fallbacks to check for translations if no translation for specified context exists. We only want to implement the same behavior for string translation.

matsbla’s picture

Gábor;

If we later want to port the language fallback module to Drupal 8; could we do it without LanguageManager::getFallbackCandidates?

As you say that it makes no sense to implement the function without the UI: how could a "module [Drupal 8] implementing that logic [...] swap the service" ? Maybe you could explain more or share link that explain better how this "is a huge point of the service based architecture in Drupal 8"?

And can you explain better if/why the LanguageManager::getFallbackCandidates exists in Drupal 8?

Gábor Hojtsy’s picture

Status: Needs review » Needs work
Issue tags: +Needs tests, +D8MI, +language-ui

All right I took another look at LanguageManager::getFallbackCandidates. I have not been involved in getting that into core and have only seen it in relation to content fallback. It does seem like a very generic solution to any kind of language fallback priority generation, however, that would need to segment this use case with its own context. At least that looks like it would segregate this feature to its own corner without the chance of unrelated content fallback setups interfering.

  1. +++ b/core/modules/locale/lib/Drupal/locale/LocaleLookup.php
    @@ -102,6 +103,27 @@ protected function resolveCacheMiss($offset) {
    +    ¶
    ...
    +          ¶
    ...
    +    ¶
    

    Extra whitespaces should not be here.

  2. +++ b/core/modules/locale/lib/Drupal/locale/LocaleLookup.php
    @@ -102,6 +103,27 @@ protected function resolveCacheMiss($offset) {
    +      $fallbacks = \Drupal::languageManager()->getFallbackCandidates($this->langcode);
    

    1. Pass on a context array with an operation of 'locale_lookup' or some other specific string.

    2. Ensure no code in core does language fallback altering without checking for specific contexts, so this does not become a huge performance nightmare like it looks like :)

Also no core committer would consider committing this without test coverage. Basically multiple local languages set up with different sets of strings, a test module implementing a language fallback alter hook for this context and then a test to ensure the right fallbacks are applied.

penyaskito’s picture

@matsbla: If needed, how to override services is described in Altering existing services, providing dynamic services and but the way this is the example mentioned there.

Just thinking out loud, I was thinking about getFallbackCandidates for string translation too, but in the case that we need different behaviors for string and content.

I can think of scenarios where we want to fallback strings from Spanish (Venezuela) to Spanish, but for content I want a different behavior (like a Not found or Forbidden) if the content has not translation.

Gábor pointed on IRC that we have $context['operation'] for that and we can provide different fallbacks based on 'locale_lookup' for the locale case and 'entity_view' for the other. We still have also hook_language_fallback_candidates_OPERATION_alter in place too.

So I'm +1 for trying to get this in as makes everything more consistent (although it took me a while to understand).

SiliconMind’s picture

OK, thanks for your input guys. Well add some context string and work out a test module along with some unit test for this after Christmas.

Have a great Christmas and a happy new year!

SiliconMind’s picture

Status: Needs work » Needs review
FileSize
7.8 KB

Added patch with unit tests for language fallback.

SiliconMind’s picture

Damn, that was too soon. The patch was missing actual changes to the LocaleLookup.php

Status: Needs review » Needs work

The last submitted patch, 32: add_language_fallback_to_string_translation-2122175-31.patch, failed testing.

The last submitted patch, 31: add_language_fallback_to_string_translation-2122175-30.patch, failed testing.

dclavain’s picture

Assigned: Unassigned » dclavain
Issue tags: +SprintWeekend2013, +#D8SVQ

I'm going to work on this.

dclavain’s picture

Assigned: dclavain » Unassigned
Status: Needs work » Needs review
FileSize
1.5 KB
9.52 KB

I added the 3 required properties as variables because they were out of scope.

Gábor Hojtsy’s picture

Fix tag.

gloob’s picture

Issue tags: -#D8SVQ +D8SVQ
Gábor Hojtsy’s picture

Status: Needs review » Needs work
Issue tags: +sprint

Found several code style problems:

  1. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,214 @@
    +  /**
    +   * Instance of LocaleTranslation class.
    +   * @var \Drupal\locale\LocaleTranslation
    +   */
    ...
    +  /**
    +   * A mocked user object built from AccountInterface
    +   * @var \PHPUnit_Framework_MockObject_MockObject
    +   */
    

    Code style: add newlines before @var. (More instances not done here).

  2. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,214 @@
    +    $this->user = $this->getMock('Drupal\Core\Session\AccountInterface');
    +    $this->user->expects($this->any())
    +                ->method('getRoles')
    +                ->will($this->returnValue(array('anonymous')));
    ...
    +    list($user, $config_factory, $language_manager) = array($this->user, $this->config_factory,$this->language_manager);
    +    $this->container->expects($this->any())
    +                    ->method('get')
    +                    ->will($this->returnCallback(function ($arg) use ($user, $config_factory, $language_manager)  {
    +                      $map = array(
    +                          'current_user' => $user,
    +                          'config.factory' => $config_factory,
    +                          'language_manager' => $language_manager
    +                      );
    +
    +                      return $map[$arg];
    +                    }));
    

    I don't think this indentation is Drupal code style compatible. Also lots more elsewhere.

  3. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,214 @@
    +  /**
    +   * Test string translation with fallback.
    +   * Note that context is irrelevant here.
    +   * It is not used but it is required.
    +   */
    +  public function  testStringTranslationWithFallback(){
    

    Code style: first function comment line should be on its own line, one space between 'function' and function name.

  4. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,214 @@
    +  /**
    +   * Helper method that returns different fallback chains
    +   * depending on requested language.
    

    Function doc comment should be at most up to 80 chars, not wrapped.

  5. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,214 @@
    +   * @param string $arg
    +   *  Language code
    +   *
    +   * @return array
    +   *  Array of language codes
    ...
    +   * @param array $arg
    +   *  Array containing three keys: language, source and context.
    ...
    +   *
    +   * @return StdClass|boolean
    +   *  An object containing one property 'translation' if translations is found; otherwise TRUE.
    

    Not indented properly.

dclavain’s picture

Assigned: Unassigned » dclavain

ok Gábor Hojtsy, I going review the problems that you comments.

SiliconMind’s picture

Gábor,

I've fixed the coding issues that you've mentioned. It would be much easier if I could make my D8 sandbox to work with the coder module. Unfortunately it refuses even to register menu items :(

However there is one thing I don't get:

I don't think this indentation is Drupal code style compatible. Also lots more elsewhere.

What exactly are you referring here? The chained method calls? Drupal coding standards doesn't say a word about that and this indentation style is the same as the one used in PHPUnit examples. Can you please be more specific?

dclavain’s picture

@Gabor I fixed all problems that you comments. Could you review it?

dclavain’s picture

Assigned: dclavain » Unassigned
Status: Needs work » Needs review
penyaskito’s picture

Status: Needs review » Needs work

Found a typo in a docblock, otherwise looks good to me. Hope that Gábor agrees.

+++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
@@ -30,24 +30,29 @@ class LocaleStringFallbackTest extends UnitTestCase {
+   * A mocked config facktory built with UnitTestCase::getConfigFactoryStub

*factory

dclavain’s picture

Status: Needs work » Needs review
FileSize
689 bytes
9.6 KB

thanks for your comment @penyaskito , I added new patch that resolve this typo.

Gábor Hojtsy’s picture

+++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
@@ -0,0 +1,241 @@
+    list($user, $config_factory, $language_manager) = array(
+      $this->user,
+      $this->config_factory,
+      $this->language_manager,
+    );

This may look cooler, but doing the three assignments on their own lines would be 2 lines less and less cycles (no intermediary array).

dclavain’s picture

Thank you @Gábor. I added new patch.

Gábor Hojtsy’s picture

Status: Needs review » Reviewed & tested by the community

Looks good to me.

YesCT’s picture

Status: Reviewed & tested by the community » Needs review
Issue tags: -Needs tests
FileSize
9.29 KB
8.83 KB

saw a few nits while checking if this still applied. went a head and fixed them.

[edit removed some dreditor mistake]

  1. +++ b/core/modules/locale/lib/Drupal/locale/LocaleLookup.php
    @@ -11,6 +11,7 @@
    +use Drupal\Core\Language\LanguageManager;
    

    IDE says this use is unused. It was added in patch 6 (comment #7) when \Drupal::languageManager()->getFallbackCandidates() call was put in the patch. But it might not need to be "used" for that.

  2. +++ b/core/modules/locale/lib/Drupal/locale/LocaleLookup.php
    @@ -102,6 +103,27 @@ protected function resolveCacheMiss($offset) {
    +    // If there is no translation available for current language
    +    // then use language fallback to try other translations
    

    wrapping these to 80 chars and using period to end the sentence.

    "Lines containing comments (including docblocks) must wrap as close to 80 characters as possible without going over, with a few exceptions..."

    "All documentation and comments should form proper sentences, use proper grammar and punctuation..."

    https://drupal.org/node/1354#drupal

  3. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,239 @@
    + * Definition of Drupal\locale\Tests\LocaleStringFallbackTest.
    

    This is Contains now with \Drupal... probably copied from an older example test . https://drupal.org/node/1354#file

  4. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,239 @@
    +   * A mocked storage to use when instantiating LocaleTranslation objects.
    +   *
    +   * @var \PHPUnit_Framework_MockObject_MockObject
    ...
    +   * A mocked user object built from AccountInterface.
    +   *
    +   * @var \PHPUnit_Framework_MockObject_MockObject
    

    should these and others be type hinted with | (or) like in PermissionsHashTest?

  5. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,239 @@
    +   * Instance of LocaleTranslation class.
    +   *
    +   * @var \Drupal\locale\LocaleTranslation
    +   */
    +  protected $translation;
    

    I think we dont want the type in the one line summary. Changing that to The translation.

  6. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,239 @@
    +    $this->user->expects($this->any())
    +                ->method('getRoles')
    ...
    +    $this->container->expects($this->any())
    +    ->method('get')
    +    ->will($this->returnCallback(function ($arg) use ($user, $config_factory, $language_manager) {
    

    I think we just indent the next lines of -> with two spaces. I looked for other examples in core, and 2 spaces seemed to be what was done. Also suggested in #1516460: Define coding standard for chained method calls.

  7. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,239 @@
    +   * @param string $arg
    ...
    +  public static function getFallbackChain($arg) {
    ...
    +    return $chains[$arg];
    

    :) I dont think we usually use $arg like this. Changed to $langcode since that is what it is.

  8. +++ b/core/modules/locale/tests/Drupal/locale/Tests/LocaleStringFallbackTest.php
    @@ -0,0 +1,239 @@
    +   * @return StdClass|boolean
    +   *   An object containing one property 'translation' if translations is found;
    +   *   otherwise TRUE.
    

    a. StdClass doesn't seem like the best type hint here. but I'm not sure we dont have that many phpunit examples yet. But if it's just a object then.. hm. "object (NOT "stdClass")" https://drupal.org/node/1354#types

    b. Also, should be bool

    "bool (NOT "boolean" or "Boolean")" https://drupal.org/node/1354#types

    c. why return *true* if you *dont* find the translation?

  9. also added a newline before the closing brace of the class https://drupal.org/node/608152

ran the tests locally per https://drupal.org/node/2116263
before patch, (1 test, 2 assertions)
after patch (3 tests, 28 assertions)

removing the needs tests tag, since the patch has all the tests it needs I think.

Gábor Hojtsy’s picture

Status: Needs review » Reviewed & tested by the community

All changes look good, superb cleanups.

SiliconMind’s picture

YesCT,

c. why return *true* if you *dont* find the translation?

Well, actually that function mimics behavior of actual drupal code. Take a look at LocaleTranslation::getStringTranslation - It looks like it expects that failures will return TRUE.

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 49: add_language_fallback_to_string_translation-2122175-49.patch, failed testing.

The last submitted patch, 49: add_language_fallback_to_string_translation-2122175-49.patch, failed testing.

YesCT’s picture

YesCT’s picture

YesCT’s picture

Here are some notes I took while I tried to do that... but my attempt (in the interdiff attached) was not as elegant. :)
------
actual callback static methods
->will($this->returnCallback('Drupal\locale\Tests\LocaleStringFallbackTest::stringStorageMockFindTranslation'));

->will($this->returnCallback('Drupal\locale\Tests\LocaleStringFallbackTest::getFallbackChain'));

should be inline anonymous functions,

since then
they would be
easier to understand, and
move the code closer to where it is called

Also, we dont have static methods for any other returnCallback in core, but we do do the inline anonymous function 15 times.
See ag "returnCallback\(" --ignore-dir vendor

Looked at examples in
MigrateTestCase::getMigration()
FormBuilderTest::testSetErrorByName()

------------------

a. tim's probably more up on the @group stuff's so that's fine.
b. Note that a separate novice issue can be made to change the other lowercase group to be Locale also.
c. And adding the 2 explicit properties was something I thought of doing to, so that looks good. (could add the one line summary to them. I'll do that.)
d. Ah, I missed those camelCase property names. good.
e. it was the use, using the translations array in the returnCallback, that I saw in the examples, but couldn't quite make the leap to do. very cool.

f. Not sure about the container thing. It's probably obvious to tim, but maybe a little explanation as to why that's better would help me spot a similar situation in the future.

--
without patch
./vendor/bin/phpunit --group Locale
(4 tests, 16 assertions)

with
(6 tests, 40 assertions)

so that still looks good also.

--
should be green and I can't see anything else to improve. rtbc from me. (didn't try it manually though)

The last submitted patch, 56: string-translation-2122175-56.patch, failed testing.

YesCT’s picture

the two fails reported on patch 56 are unrelated/random and in the views_ui tests

In the test results, in the collapsed review log fieldset can see burried there:

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 268435456 bytes) in /var/lib/drupaltestbot/sites/default/files/checkout/core/lib/Drupal/Core/Database/Connection.php on line 336

Let's see how 57 does.

SiliconMind’s picture

The last submitted patch, 56: string-translation-2122175-56.patch, failed testing.

tim.plunkett’s picture

Discussed more with @YesCT, we're testing the wrong class here.
We should be testing LocaleLookup in isolation.
In order to do so, we should properly inject everything.

The interdiff is vaguely useless, since I had to move the test.

Status: Needs review » Needs work

The last submitted patch, 62: locale-2122175-62.patch, failed testing.

tim.plunkett’s picture

Status: Needs work » Needs review
FileSize
1.66 KB
17.89 KB

Doh!

YesCT’s picture

sweet! that is the same interdiff I was just about to upload. I might be getting the hang of this!

SiliconMind’s picture

This looks great. I've been struggling to test this in real life scenario, but it seems that D8 entity translation doesn't work at all even without this patch. Can anyone confirm similar behavior that I described here #2189267: When content language detection is different from interface language detection, the detected language is not applied to the rendered content?

YesCT’s picture

64: locale-2122175-64.patch queued for re-testing.

Gábor Hojtsy’s picture

Status: Needs review » Reviewed & tested by the community

Great, improvements, thanks! Looks good to me.

YesCT’s picture

64: locale-2122175-64.patch queued for re-testing.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work
Issue tags: +Needs reroll

locale-2122175-64.patch no longer applies.

error: patch failed: core/modules/locale/lib/Drupal/locale/LocaleTranslation.php:63
error: core/modules/locale/lib/Drupal/locale/LocaleTranslation.php: patch does not apply

dclavain’s picture

Status: Needs work » Needs review
FileSize
17.9 KB

reroll

YesCT’s picture

Issue tags: -Needs reroll

that applies, removing needs reroll tag.

Gábor Hojtsy’s picture

Status: Needs review » Reviewed & tested by the community

Thanks for the reroll.

plach’s picture

+++ b/core/modules/locale/lib/Drupal/locale/LocaleLookup.php
@@ -99,18 +120,46 @@ protected function resolveCacheMiss($offset) {
+        foreach($fallbacks as $langcode) {

Minor nitpick to be fixed on commit/reroll: missing white space before the parenthesis.

Gábor Hojtsy’s picture

71: locale-2122175-71.patch queued for re-testing.

Gábor Hojtsy’s picture

71: locale-2122175-71.patch queued for re-testing.

YesCT’s picture

this is rtbc, but the issue summary is out of date.
I'm starting to work on that.

YesCT’s picture

Issue summary: View changes
Issue tags: -Needs issue summary update

ok. no major changes to the summary. I think the proposed resolution is pretty much the same.

webchick’s picture

Status: Reviewed & tested by the community » Fixed

Committed and pushed to 8.x. Thanks!

  • Commit 2edd916 on 8.x by webchick:
    Issue #2122175 by dclavain, SiliconMind, tim.plunkett, YesCT: String...
Gábor Hojtsy’s picture

Issue tags: -sprint

Superb, thanks!

SiliconMind’s picture

Great!
Since this is resolved, has anyone seen that one: #2215507: Downloads broken for translated private files

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.

Gábor Hojtsy’s picture

This issue ended up sparking a critical bug. Applying the default content language fallback rules to interface translation is nonsensical. See #2240459: Applying default language fallback rules to interface translation has impressively bad results for a solution that removes the incorrect defaults but keeps the extensibility. @SiliconMind, @dclavain, @plach, @YesCT: reviews welcome there at your convenience :)