我有一個角度應用程式,我已經本地化為多種語言(比如說英語和法語)。
我想根據 url 提供應用程式的不同語言環境版本:
- myapp.io/en/account
- myapp.io/en/settings
- myapp.io/fr/account
- ...
我嘗試按照
有誰知道我做錯了什么?或者任何人都可以指出一個開源作業示例或一個好的教程?
更新
我已經按照這里的建議更改了 nginx 配置;這解決了螢屏截圖中的問題,但仍然存在問題:當我嘗試加載主機(https://myapp.io/)時,我被重定向到https://myapp.io:4200/en/
更新 2
修復了更改此塊:
location = / {
try_files $uri /$accept_language/index.html;
}
uj5u.com熱心網友回復:
您沒有正確遵循官方檔案。至少您錯過了最后一個try_files指令引數中的語言代碼:
location ~ ^/(en|it)/ {
try_files $uri /$1/index.html;
}
下一部分將是我對Angular 官方檔案中上述nginx 示例的考慮,我發現它的質量很差(我指的是 nginx 示例,而不是整個檔案)。
如該示例中所建議的那樣,?$args在最后一個指令引數中使用后綴沒有任何意義:try_files
try_files $uri /$1/index.html?$args;
Angular 應用程式將繼續在瀏覽器地址欄中看到已經存在(或不存在)的查詢引數,因此后綴除了 nginx 在變數插值上花費的額外 CPU 周期外什么也不做。當請求反過來用一些 PHP 腳本處理時,該后綴是有意義的,但這里不是這種情況。
我沒有看到任何合理的理由在這里使用正則運算式:
if ($accept_language ~ "^$") {
set $accept_language "it";
}
這里可以使用性能更高的精確匹配:
if ($accept_language = "") {
set $accept_language "it";
}
如果您將default專案添加到您的map塊中,即使那個也不是真的需要:
map $http_accept_language $accept_language {
~*^en en;
~*^it it;
default it;
}
但是,如果不將支持的語言指定為第一個,它將不起作用。想象一個像Accept-Language: de;q=0.9, en;q=0.8. 將為該用戶選擇默認的意大利語,即使沒有在首選語言串列中指定(而不是英語)。如果您想考慮用戶在其瀏覽器設定中設定的語言優先級,對于兩種支持的語言,您可以使用以下內容:
map $http_accept_language $accept_language {
~en.*it(*SKIP)(*F)|it it; # when "it" substring present and not preceded with "en"
~it.*en(*SKIP)(*F)|en en; # when "en" substring present and not preceded with "it"
default it;
}
(Wiktor Stribi?ew提供的正則運算式)
考慮到優先順序,三種語言將需要以下map塊:
map $http_accept_language $accept_language {
~(?:en|fr).*it(*SKIP)(*F)|it it;
~(?:fr|it).*en(*SKIP)(*F)|en en;
~(?:en|it).*fr(*SKIP)(*F)|fr fr;
default it;
}
等等。
代替
rewrite ^/$ /$accept_language permanent;
我寧愿使用(再次,為了效率)
location = / {
return 301 /$accept_language/;
}
此外,我認為 301 永久重定向代碼根本不應該在這里使用。如果用戶以任何方式更改他的語言首選項,他將不會根據他的新語言設定收到應用頁面,因為這個重定向已經被他的瀏覽器快取。我認為 302 臨時重定向在這里會更合適:
location = / {
return 302 /$accept_language/;
}
出于同樣的效率原因,我還考慮將主要位置塊分成兩個(或更多,取決于支持的語言數量):
location /en/ {
try_files $uri /en/index.html;
}
location /it/ {
try_files $uri /it/index.html;
}
...
Nginx 并不是那種永遠適用DRY原則的東西。這種配置的另一個優點是能夠將其與alias指令一起使用而無需額外的解決方法(如果您嘗試將其與使用指令而不是指令try_files $uri /$1/index.html;定義的 angular app 目錄一起使用,您將面臨一個眾所周知的此nginx 跟蹤票據中描述的副作用)。aliasroot
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480867.html
