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?
Open the angular. json file and add the following configuration. Here we have added the configuration for the Spanish language. We have provided the path and format for the i18n file and set the locale to "es." When we execute the application, the app content will be served from the i18n file path provided.
NGINX can be used as a web server or reverse proxy to serve the static content. All the NGINX configuration can be placed in this file nginx. conf . We need to build the angular app and place all the static files in the root location of the NGINX to serve the web.
The way nginx and its modules work is determined in the configuration file. By default, the configuration file is named nginx. conf and placed in the directory /usr/local/nginx/conf , /etc/nginx , or /usr/local/etc/nginx .
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);
}
}
After building with:
ng build --prod --base-href /fr/ --output-path dist/fr
ng build --prod --base-href /en/ --output-path dist/en
copy the builds to nginx serve directory:
cp -r dist/* /usr/share/nginx/my-app
Then I found 2 different NGINX configs that work for me:
server {
root /usr/share/nginx/my-app;
location /en/ {
autoindex on;
try_files $uri$args $uri$args/ /en/index.html;
}
location /fr/ {
autoindex on;
try_files $uri$args $uri$args/ /fr/index.html;
}
# Default to FR
location / {
# Autoindex is disabled here + the $uri$args/ is missing from try_files
try_files $uri$args /fr/index.html;
}
}
server {
listen 80 default_server;
index index.html;
location /en/ {
alias /usr/share/nginx/my-app/en/;
try_files $uri$args $uri$args/ /en/index.html;
}
location /fr/ {
alias /usr/share/nginx/my-app/fr/;
try_files $uri$args $uri$args/ /fr/index.html;
}
# Default to FR
location / {
alias /usr/share/nginx/my-app/fr/;
try_files $uri$args $uri$args/ /fr/index.html;
}
}
Note: In the root path solution you can remove the autoindex on
option but you'll also have to remove the $uri$args/
part from the try_files
or else you'll get "directory index of "[directory]" is forbidden error".
FYI: You can find useful those nice explanations on ROOT vs ALIAS.
Angular CLI: 6.0.7
Node: 8.11.2
Angular: 6.0.3
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With