I have a question regarding the domain name language negotiation.

I have 3 languages and the following domains:

  • de.domain.com
  • en.domain.com
  • fr.domain.com

When I set this as the domains for each language and use the domain name language negotiation everything works as expected.

My problem is that I have an adaptive mobile theme and I have to use following domains for that:

  • m.de.domain.com
  • m.en.domain.com
  • m.fr.domain.com

How can I achieve that those urls point to the correct language (de, en, fr). Now, all point to the default language (de).

Any help?

  • Just curious - why m prefix? Can't you detect from http headers if user is on mobile? Can't your theme hide things based on actual screen it gets displayed on? – Mołot Aug 20 '13 at 7:54
  • In my oppinion its not a good thing to have different content served from the same url. think about a caching in front of the web server (varnish for example). – megadesk3000 Aug 20 '13 at 8:14
  • That's some valid point all right. On the other hand current mobile devices can usually accept normal page and you can do the most of small-screen logic in CSS with media set to handheld. – Mołot Aug 20 '13 at 8:17
  • That's totally true. But the customer has preferred adaptive over responsive for this project. So i have to deal with that now. Responsive would make my live easier at all ;) – megadesk3000 Aug 20 '13 at 8:26
  • can you make it de.m. instead of m.de.? If it's technically impossible / not easy, it's a shame both mechanisms insist on using first part for detection. – Mołot Aug 20 '13 at 8:31

Take a look at the Language Negotiation API, specifically hook_language_negotiation_info_alter. With this hook, you can replace the default URL based language negotiation callback function with one that respects the m. prefix.

Something like this should get you started.

function mymodule_language_negotiation_info_alter(&$negotiation_info) {
  // Replace the core function with our own function.
  module_load_include('language', 'inc', 'language.negotiation');
  $negotiation_info[LANGUAGE_NEGOTIATION_URL]['callbacks']['language'] = 'mymodule_from_url';
  $negotiation_info[LANGUAGE_NEGOTIATION_URL]['file'] = drupal_get_path('module', 'mymodule') . '/mymodule.module';

function mymodule_from_url($languages) {
    // Your version of locale_language_from_url() that ignores the m. prefix.

For reference, the core function that handles language negotiation based on URL is locale_language_from_url.

  • Thank you zroger. I think this way i can achieve my goal :) – megadesk3000 Aug 21 '13 at 7:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.