Jump to content
bcartier

Change default language for homepage

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

Share this post


Link to post
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. 

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

Thanks for the suggestions guys. I'll try the module solution and report back...

Share this post


Link to post
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 :(

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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:

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?

Share this post


Link to post
Share on other sites

What might be the problem?

Well the problem was that I didn't use my language name! So now I did localUrl('suomi')); and it works.. sorry for the noise.

  • Like 1

Share this post


Link to post
Share on other sites

Just to confirm, proposed module from this thread is working fine for me in a 2.6.23 install.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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. ;)  

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

... Any constructive critique welcome.

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

  • Like 1

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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).

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
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?

Share this post


Link to post
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

Share this post


Link to post
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?

 

Share this post


Link to post
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

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By snobjorn
      Here's my Norwegian language pack for ProcessWire. I've been adding translations over some time, to suit my own projects users needs.
      Last updated:
      2020/06/29 (June 29, 2020)
      Status:
      Not yet complete. Translations that non-superusers will see is prioritized.
      Name:
      ProcessWire-Norwegian-Language-Pack-nb-NO
      Translated using:
      ProcessWire 3.0.161 dev
      Number of files:
      202 wire files and 97 site files – ranging from just started to completely translated. The site files includes translation some free and some pro modules, see the complete list in the README.md at GitHub.
      Available at GitHub:
      https://github.com/snobjorn/processwire-norwegian-language-pack-nb-no
    • By Sten
      Hello
      Till now I hacked something with the twig template but it works no more with new PW versions so I look forward to create a module. I am working on a site in multiple languages : French, English, Italian, German, Spanish, Portuguese, Hebrew, Russian. The new posts are entered in any language with a field for language. Till now, I got twig files to get the translations with constants defined for each part of the pages.
      So I'd like to create a module to include theses files added according to the url /fr/en/...
      Have you some observations to do before I begin about the direction to take ?
      Thank you
    • By ICF Church
      Hi 👋
      Anyone else having this problem?
      Requirements:
      - Repeater (matrix & normal) with mutlilanguage fields (text, textarea…) 
      - Backend language set to something other than default (ie. German) 
      Reproduce:
      - Add a new repeater Item (ajax, I found no way to possible to disable it with matrix)

      (Notice how the default language tab is active instead of the backend language…)
      - Write something into the (default language) field
      - Try to save, if field is required, this will not work. If not required, then when reloading, the content will be inside the backend language field, instead of the default language field who was (presumably) active
      Analysis:
      When  loading  a new repeater element with ajax, the default langue tab is active, but the backend language inputfield is visible (with no visual indication). When writing into the field, it will populate the backend language. When manually clicking on the default language tab (which is already active), the field will switch to the actual default language field (which is [now] empty) (that can now be populated…)
      Also Notice, the labels of the elements to be added are in default language as well instead of the translated label (images instead of Bilder)…
      ProcessWire 3.0.148, Profields 0.0.5…
      Is it my system configuration, or does anyone else have the same issue? This is a screen recording of the problem:
      Issue: https://github.com/processwire/processwire-issues/issues/1179

      Screen Recording 2020-02-25 at 14.18.31.mov
    • By horst
      Change Default Language to be None-English | Walk Trough
      When you start a new (single) language site and the default language shouldn't be English, you can change it this way:
      Go to the modules core section:

       
      Select the Language ones by the filter function:

       
      We have four language related modules here, but for a single language site in none english,
      we only need the base module, named "Languages Support". So go on and install it.

       
      After that, you can leave it, ... 

       
      ... and switch to the newly created Language section under SETUP:

       
      Select the default language

       
      Enter your new language name or its Shortcut and save the page.
      I will use DE for a single language site in german here as example:

       
      Now I go to the ProcessWire online modules directory, down to the subsection for language packs and select
      and download my desired (german) one: 

       

       

       

       
      After downloading a lang pack as ZIP, I go back into my SETUP > LANGUAGES > default language page in admin,
      select the downloaded lang pack ZIP and install it:

       

       

       
       
      After the ZIP is uploaded, the files are extracted and installed, most of my screen is already in
      the new default language. To get all fully switched, we save and leave that page, ...

       
      ... and completely logout from the admin.

       
      Now, of course, we directly login back, ...

      ... and see, that now also the cached parts of the admin have switched to the new default language. 🙂

       
      That was it for a single language site in none english.
       
      If you want to have a multi language site, just add more languages to the SETUP > LANGUAGES section.
      When using a multi language site, I think you also want to use multi language input fields, and maybe different page names for your language page pendents. If so, you need to go into MODULES > CORE > filter LANGUAGE and install what you need or want to use of it, (if not already done).
      Thanks for reading and happy coding, 🙂
       
×
×
  • Create New...