Search code examples
angularnginxinternationalization

Nginx configuration for angular i18n application


I built an angular-5 application using i18n that supports both french and english. I then deployed a separate version of the app for each supported language

 - dist
    |___ en/
    |    |__ index.html
    |___ fr/
         |__ index.html

I also added the following nginx configuration to serve the application in both languages;

server {
    root /var/www/dist;
    index index.html index.htm;
    server_name host.local;

    location ^/(fr|en)/(.*)$ {
        try_files $2 $2/ /$1/index.html;
    }
}

What I wanted to do is to serve both applications and allow switching between the english and the french version.

Let's say for example I'm on host.local/en/something if I switch to host.local/fr/something I should get the french version of the "something" page.

With the nginx configuration I shared, I get a 404 not found error every time I refresh pages when browing my apps which also prevents me from browsing my apps independently from one another and switching between them.

What did I miss? What's the appropriate Nginx conf to achieve that?


Solution

  • i've done the same thing on iis, first you have to build your app with "base-href" option:

     ng build --output-path=dist/fr --prod --bh /fr/
     ng build --output-path=dist/en --prod --bh /en/
    

    and for nginx use this config

    location /fr/ {
      alias /var/www/dist/fr/;
      try_files $uri$args $uri$args/ /fr/index.html;
    }
    location /en/ {
     alias /var/www/dist/en/;
     try_files $uri$args $uri$args/ /en/index.html;
    }
    

    and for navigation from /en/someroute to /fr/someroute , you can get the current router url in your component where you have the language switcher

    getCurrentRoute() {
        return this.router.url;
    }
    

    and when click on a language selector you redirect to the same route with the selected language :

     <li *ngFor="let language of languages;let i=index" >
        <a  href="/{{language.lang}}/#{{getCurrentRoute()}}"  (click)="changeLanguage(language.lang)">
            {{language.lang}}
        </a>
     </li>
    

    change language method

    changeLanguage(lang: string) {
        const langs = ['en', 'fr'];
        this.languages = this.allLanguages.filter((language) => {
            return language.lang !== lang;
        });
        this.curentLanguage = this.allLanguages[langs.indexOf(lang)].name
        localStorage.setItem('Language', lang);
        if (isDevMode()) {
            location.reload(true);
        }
    }