Jump to content

Change default language for homepage


bcartier

Recommended Posts

I while ago, I started a site on dev branch 2.5.19, and built out a bilingual site in English and French. My default language is English and I added French as a second language. I'm using LanguageSupportPageNames and my homepage names are "/" for english and "/fr" for French.

Everything works great. But... now the client wants to change the site so that French is the default language.

I've tried:

  • setting the Guest user's language preference to French - no effect.
  • detecting the URL and manually setting the $user->language  in _init.php
  • variations on naming the homepage "en" and "fr" istead of "/" and "fr", but the redirect still seems to redirect the homepage URL of the default language  to "/" even if I've specified "en". 
  • I've looked at the LanguageSupportPageNames settings and have tried both the recommended option and including the redirect in combination with URL detection. Still can't get it working.

Does anyone have any recommendations? I really don't want to rebuild the site from scratch just to reset the default language :-(

Thanks for your help,

-Brent

Link to comment
Share on other sites

Sadly I don't have any tips for you. But I think there should be a more easy way to implement a default language change. I've been working on a clients site the last week and their site should really be german by default and english optional, but they implemented german as second language and you'll get errors all the time about missing titles and stuff as you're just filling in the german value, which is not the default language.

I eventually have a tip for you. Did you refresh you modules some times? Maybe there's stuff cached that is preventing any change. 

Link to comment
Share on other sites

Hi,

Here is what you can do to redirect the home page '/' to the French home page:

  • Set page names for both languages for the home page ('en' for English, 'fr' for French)
  • In the LanguageSupportPageNames settings, choose the option "No - Root URL performs a redirect to: /name/". When you go to the root url '/' it will redirect you to '/en/'
  • Finally, create a module to hook into Session::redirect to force the redirection of the root url to the French translation as follows:
public function init() {
  $this->session->addHookBefore("redirect", function($event) {
    if ($this->page->id == 1 && $event->arguments(0) == $this->page->localUrl('default')) {
      $event->arguments(0, $this->page->localUrl('fr'));
    }
  });
}

The hook checks whether you are viewing the home page, and whether you are redirecting to the English url, and if so, it changes the url to the French url.

This solves the problem of the home page. The problem remains if someone has saved a direct link to a page without a language prefix, e.g., '/about/', since this will still be redirected to '/en/about/'.

  • Like 4
Link to comment
Share on other sites

I have the same exact problem and it's driving me totally crazy...I've installed both the module ESRCH suggested and AutoDetect Language module.

It seems to work if I reach the homepage for the first time (redirecting correctly to /it rather than /en (default)), but if I open a new tab in my browser and retry to go to the homepage the /en appears again.

Kinda desperate at this point :(

Link to comment
Share on other sites

Hi 3fingers,

I'd try taking AutoDetect language out of the picture at first, just to make sure the other part is working. Maybe try testing using a separate browser, or 'incognito/private browsing' tab, so that you're not logged in or anything.

In case it helps, here's full module code I used:

<?php

	class LanguageDefault extends WireData implements Module {

		/**
		 * getModuleInfo is a module required by all modules to tell ProcessWire about them
		 *
		 * @return array
		 *
		 */
		public static function getModuleInfo() {

			return array(
				'title' => 'LanguageDefault', 
				'version' => 1, 
				'summary' => 'A work around to changing the default language.',
				'href' => 'https://processwire.com/talk/topic/9322-change-default-language-for-homepage/?p=89717',
				'singular' => true, 
				'autoload' => true, 
			);
		}

		/**
		 * Initialize the module
		 *
		 * ProcessWire calls this when the module is loaded. For 'autoload' modules, this will be called
		 * when ProcessWire's API is ready. As a result, this is a good place to attach hooks. 
		 *
		 */
		public function init() {
			$this->session->addHookBefore('redirect', $this, 'setDefaultLanguage'); 
		}

		public function setDefaultLanguage($event) {
			if ($this->page->id == 1 && $event->arguments(0) == $this->page->localUrl('default')) {
		      $event->arguments(0, $this->page->localUrl('fr'));
		    }
		}

	}
  • Like 2
Link to comment
Share on other sites

Thanks to both of you guys, I "solved" swapping the content of my fields from one language to the other and renaming the default language from /en to /it and viceversa.

Hope someday it will be easier to switch the default language :D

Link to comment
Share on other sites

A bit OT, but if you can plan the languages hirarchy right from the start of a new site, you can do it this way:

  • enable languages support
     
  • set Title / Label of the default language to your desired none english native language, (e.g. 'Deutsch' (German))
     
  • drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)
     
  • add a new language to it and drop in a language pack for any none english language or simply don't drop in a language pack to get the english version (but not as the default one!)

As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.

So, yes, this is no solution if you once have set it up and need to switch the default language afterwards, but just want to note it.

Edited by horst
  • Like 8
Link to comment
Share on other sites

[…]

It seems to work if I reach the homepage for the first time (redirecting correctly to /it rather than /en (default)), but if I open a new tab in my browser and retry to go to the homepage the /en appears again.

[…]

This is the intended behavior of the AutoDetect Language module. It will only run on the first page load, to set the $user->language setting, which is created from a session variable. There is no need to detect language on each page load (and you really shouldn't, to be honest), as it's set once by PW and it will reuse it on each page load unless it's overwritten by setting $user->language manually. If you need to check if AutoDetect Language has run (and reuse its state somewhere else), there are two session variables I created (that you can read about in the documentation). If you want to force it to run again, you can set $session->languageAlreadyDetected to false, but I wouldn't say it's generally advisable.

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Hi 3fingers,

I'd try taking AutoDetect language out of the picture at first, just to make sure the other part is working. Maybe try testing using a separate browser, or 'incognito/private browsing' tab, so that you're not logged in or anything.

In case it helps, here's full module code I used:

Using 2.5.24 dev and your module code, in the LanguageSupportPageNames settings "No - Root URL performs a redirect to: /name/", I still get redirected to /en/ every time I access the home page.

I don't have AutodetectLanguage installed.

In the module info, it has correctly:

Hooks to Session->redirect()

I have my fi name active for the Home page and this line changed accordingly:

$event->arguments(0, $this->page->localUrl('fi'));

What might be the problem?

Link to comment
Share on other sites

  • 7 months later...
  • 5 months later...

Hello,

how to handle more than 2 languages ?

Ive for example en (as default) , de, tr, cz and maybe there will be more later.

So is it possible to use this module for more than 2 languages too ??

I have the problem that I need some pages only in English and German and some pages in other languages. Special in the news section. The title field on create the page I can't switch off so I can hide all other pages in the settings but not the default.

Tnx

Link to comment
Share on other sites

Hello iNoize,

I used on a project some time ago three different languages and I think it shouldn't be a problem using even more.

As for your second question: I recently thought about this case too, but could only think of checking in the language switcher, if the default language has content and if not, don't include the option. Of course someone could try to access your default language page by guessing the page name, but in this unlikely case you could also check if this page has content in the default language and if not redirect to the 404 page template.

But maybe there are better solutions for this case. Besides that I think it would be the best idea to provide all pages at least in the default language. ;)  

Link to comment
Share on other sites

I found a crude but apparently working solution.

I ask if a certain session variable $session->secondvisit exists, which is certainly not the case in the beginning.

If not, it will be created and a crude language switch starts working.

    if (!$session->secondvisit) {

        $session->secondvisit = true;

        $locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

        if (strpos($locale, 'de') === 0) {
            $user->language = 'de';
        }

        elseif (strpos($locale, 'es') === 0) {
            $user->language = 'es';
        }

    }

This is standing in front of <html>.

Any constructive critique welcome. 

For any language other than German or Spanish, the default language english will be in effect.

As the language string is e.g. "de_DE", strpos returns either 0 or false. So querying simply

if (strpos($locale,'de')) { ..... }

will not work, because the position of 'de' in 'de_DE' is 0 and php takes a 0 for a false, if I am correct.

  • Like 1
Link to comment
Share on other sites

  • 1 month later...
On 28.4.2016 at 7:44 AM, horst said:

:) What is with (Pro)-cached pages? I believe, a JS solution is needed there, as serverside PHP execution is ommitted.

You are probably right, may be I (or somebody else) adds something to it. For the time beeing i don't see i have the resources for it.

Link to comment
Share on other sites

With this script a strange problem appears: (solution below)

When loading first, i.e. with $session->secondvisit nonexistent and setting $user->language to 'de' (in my case), 

  • the menu is correctly shown in german
  • the language menu correctly shows the german link as active
  • but the content is shown in the english version
  • the url in the address field does not show the /de characteristic for the german content tree

One remark, of which i do not know the importance: the site is redirected to a subdirectory.

The URL ist http://agustin-rivas.com.

If someone has seen this before and can give a clue, i'll be grateful.

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

solution

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

It was a timing problem. I had put the above function into the main template php file, which is executed  a f t e r  the php files for the different page templates. So the content variables were filled with the $user->language still not correctly set. Moving the function code to the _init.php file, which is executed  b e f o r e  the page template php files, solved the problem. 

Took me 2 hrs to figure it out believe it or not... :-) 

Edited by dlen
added solution to problem
Link to comment
Share on other sites

  • 1 month later...
27 minutes ago, KarlvonKarton said:

How about the effect on search engines with the solution of ESRCH?
I think search engines are not very happy with redirects like that (where the URL changes).

I think it should be ok: https://en.wikipedia.org/wiki/HTTP_301#Search_engines

When sending with a 301, search engines should update their index. At least it is how I have learned it :)

 

  • Like 1
Link to comment
Share on other sites

One more thing.
I tested out the solutions of ESRCH, with success. In the LanguageDefault Class the '/' is redirected to /nl/  (in my case)

But since I only need Dutch (nl) and French (fr), but no English, I've hidden English in the setup -> languages -> English (tab settings -> status: hidden).
The great thing(s) about that: in the language selector there is only French and Dutch (on the site) and all options of English are disabled in the admin.
(I can not think of any other reason why the default language can be hidden?)

However, and I don't know if this is some kind of bug, everytime I save a page (or even some other things), then I get an error "missing required value".  I found out that the missing value is actually the English translation.  So all the English options are hidden, but the script still needs the values after posting the form (e.g. saving a page).
When I make English visible again (thus uncheck hidden) then the error disappears.

I find this behavior highly peculiar.  Any comments?

Link to comment
Share on other sites

default is default, it is required by the system for every other language that has no content in a field.

But you are not forced to use english as default. You can make every thing you want as default, - with only one language or with multiple. For example you can use nl as default and fr as additional language.

 

  • Like 1
Link to comment
Share on other sites

5 minutes ago, horst said:

default is default, it is required by the system for every other language that has no content in a field.

But you are not forced to use english as default. You can make every thing you want as default, - with only one language or with multiple. For example you can use nl as default and fr as additional language.

Can this only be done during install of PW?  Or what point?

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...