Problem/Motivation

On multilingual sites, Drupal does not reliably respect an explicitly specified path alias langcode when saving a node, for example.

If code sets the path field langcode to a language-neutral value, the saved alias may still use the node translation language instead. Updating only the alias langcode may also be ignored.

This makes it difficult to create language-neutral aliases programmatically when the intent is for one alias to work across languages.

Steps to reproduce

  1. Enable at least two languages, such as English and French.
  2. Create a node translation with a URL alias.
  3. Programmatically set the path field langcode to LanguageInterface::LANGCODE_NOT_SPECIFIED.
  4. Save the node, or resave it with only the alias langcode changed.

Expected result: The saved alias uses the explicitly provided alias langcode, including a language-neutral value when intended.

Actual result: The saved alias falls back to the node translation language, or a langcode-only change is not persisted.

Proposed resolution

Respect the alias langcode set on the path field during alias create and update operations, instead of always deriving it from the node translation language.

Original issue summary

Here is the case:

One website has two languages enabled. English and French.

If user who uses French as his/her language post a node, set node url alias, the url alias will only apply to French interface. That means the alias link wont work for those users using English.

The solution is to change the 'Language' value of that node's url alias to 'All' (admin/config/search/path)

I found it is annoying, because I have to change the Language value one by one for every node.

Not sure it is a feature or a bug?

That would be great that if when we set url alias for nodes, the system set it for ALL language by default.

What do you think? Any suggestions?

Issue fork drupal-1499532

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

Alessandro Pezzato’s picture

This is very annoying.

Suggestion

Add an option in admin page "admin/config/search/path/settings" to configure this behaviour:

  • All languages
  • Node language

If "All languages" is selected, every created alias will be available for all languages.
If "Node language" is selected, every created alias will be available only for respective node.

spacediver’s picture

+1 For Alessandro suggestion. Or there is another way to fix it?

q0rban’s picture

Version: 7.12 » 7.x-dev

I did some digging into the code in Path module, and there is no clean fix for this in contrib or custom code. While the form itself does have the path language set, overriding it with a form alter does nothing, as the language is then set to the node language in both the element_validate callback, and the hook_node_insert/update calls. I'm not sure why it's happening in both—I think this is cruft.

q0rban’s picture

Title: Make url alias works for all languages by default? » Cannot programmatically specify node path alias language
Version: 7.x-dev » 8.x-dev
Category: feature » bug

I'm switching this to a bug report and changing the version to 8.x. The reason I believe this to be a bug is that there is no way to programmatically set the language on the alias, as the language is forced to match the node language in hook_node_insert / hook_node_update, ignoring what might be set in $node->path['language'].

q0rban’s picture

Status: Active » Needs review
StatusFileSize
new2.01 KB

Here is a patch with just a test to prove the issue.

q0rban’s picture

StatusFileSize
new6.12 KB

And here is a patch with the above tests and a fix. Note: there was a fair bit of duplicate code in path_node_insert() and path_node_update(), so I refactored the latter to allow for being called from the former, to consolidate the code.

q0rban’s picture

Here is a patch against 7.x that does the same. Marked as do-not-test.

q0rban’s picture

I was hoping that applying this patch in d7 and adding a form alter like so would fix my issue:

function example_form_node_form_alter(&$form) {
  // Ensure node path aliases are always language neutral.
  if (isset($form['path']['language'])) {
    $form['path']['language']['#value'] = LANGUAGE_NONE;
  }
}

Alas, Pathauto also doesn't respect $node->path['language']. See #1155132: Add Entity Translation support to Pathauto.

q0rban’s picture

Status: Needs review » Needs work

The last submitted patch, 6: 1499532-alter-node-alias-language-6.patch, failed testing.

damienmckenna’s picture

Issue summary: View changes

Any thoughts on how this should work, given there have been two years' of changes since the last patch?

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.4 was released on January 3, 2018 and is the final full bugfix release for the Drupal 8.4.x series. Drupal 8.4.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.5.0 on March 7, 2018. (Drupal 8.5.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.5.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.6 was released on August 1, 2018 and is the final bugfix release for the Drupal 8.5.x series. Drupal 8.5.x will not receive any further development aside from security fixes. Sites should prepare to update to 8.6.0 on September 5, 2018. (Drupal 8.6.0-rc1 is available for testing.)

Bug reports should be targeted against the 8.6.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Chris Charlton’s picture

Bump.

Version: 8.6.x-dev » 8.8.x-dev

Drupal 8.6.x will not receive any further development aside from security fixes. Bug reports should be targeted against the 8.8.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.9.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.7 was released on June 3, 2020 and is the final full bugfix release for the Drupal 8.8.x series. Drupal 8.8.x will not receive any further development aside from security fixes. Sites should prepare to update to Drupal 8.9.0 or Drupal 9.0.0 for ongoing support.

Bug reports should be targeted against the 8.9.x-dev branch from now on, and new development or disruptive changes should be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.2.x-dev

Drupal 8 is end-of-life as of November 17, 2021. There will not be further changes made to Drupal 8. Bugfixes are now made to the 9.3.x and higher branches only. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.15 was released on June 1st, 2022 and is the final full bugfix release for the Drupal 9.3.x series. Drupal 9.3.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.4.x-dev branch from now on, and new development or disruptive changes should be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.9 was released on December 7, 2022 and is the final full bugfix release for the Drupal 9.4.x series. Drupal 9.4.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.5.x-dev branch from now on, and new development or disruptive changes should be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 11.x-dev » main

Drupal core is now using the main branch as the primary development branch. New developments and disruptive changes should now be targeted to the main branch.

Read more in the announcement.

smustgrave’s picture

Status: Needs work » Postponed (maintainer needs more info)
Issue tags: +Bug Smash Initiative, +Needs issue summary update

This came up as the daily BSI target.

First is this still an issue? Checking the patches that hook appears to have been renamed in https://git.drupalcode.org/project/drupal/-/commit/81e2d9c05107138a6cdbf...

If still an issue can we update the summary please

Thanks.

joelpittet made their first commit to this issue’s fork.

joelpittet’s picture

Title: Cannot programmatically specify node path alias language » Respect explicitly set node path alias langcode on save
Issue summary: View changes
Status: Postponed (maintainer needs more info) » Needs review
Issue tags: -Needs issue summary update

This is an old one(of ∞) I was watching, the code drift is big! We don't use $node->path['language'] it's $node->path->langcode.

I opened an MR to try and see if I can get some of the intent behind the patch in #6 into something usable and an issue summary rewrite from the "support question" to the standard template.

Disclosure: AI was assisting me with finding the drift and I am the human-in-the-loop reviewing and rewriting this as it goes. I am happy with the changes made here, questioned the extra condition and new marker variable for tracking "changed" in either case. Ran the tests with and without the fix (which I will do in the MR too) to show the red 🔴/green 🟢. I know AI can seem like slop and we are all dealing with this huge change in our own ways, though I am hoping to show it can be used responsibly as an assistive tool... I am really liking ghostty's AI policy btw, worth a read, a bit extreme but clear.

smustgrave’s picture

Status: Needs review » Reviewed & tested by the community

Test coverage does appear to be present https://git.drupalcode.org/issue/drupal-1499532/-/jobs/9307242

Test manually following the steps.
Fresh Drupal install
2 languages (I used Arabic)
I ran ddev drush php:eval "$node = \Drupal\node\Entity\Node::load(1); $node->path->langcode = \Drupal\Core\Language\LanguageInterface::LANGCODE_NOT_SPECIFIED; $node->save();"

I couldn't figure how to trigger this bug via the UI so I then ran
ddev drush php:eval "$node = \Drupal\node\Entity\Node::load(1); echo 'Langcode: ' . $node->path->langcode"

And I did get en

But with the MR I get 'und' which sounds like the fix.

So would say this works.

quietone’s picture

I updated credit and didn't see any unanswered questions.

  • amateescu committed 6c3a9c49 on 11.4.x
    fix: #1499532 Respect explicitly set node path alias langcode on save...

  • amateescu committed a5b92714 on 11.x
    fix: #1499532 Respect explicitly set node path alias langcode on save...

  • amateescu committed f30d64c5 on main
    fix: #1499532 Respect explicitly set node path alias langcode on save...
amateescu’s picture

Version: main » 11.4.x-dev
Status: Reviewed & tested by the community » Fixed

Committed and pushed f30d64c5689 to main and a5b927148fb to 11.x and 6c3a9c494ee to 11.4.x. Thanks!

I also ran the Pathauto tests and no problem came up.

Now that this issue is closed, review the contribution record.

As a contributor, attribute any organization that helped you, or if you volunteered your own time.

Maintainers, credit people who helped resolve this issue.

berdir’s picture

Yeah, I explicitly didn't want to support this in pathauto until core is handling this better. There's also #2689459: If you don't want to translate your URL alias, the original URL alias won't work with your translations which I think has some overlap with this issue, commented there.

Status: Fixed » Closed (fixed)

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