我建立了一个角5应用程序使用i18n,支持法语和英语。然后,我为每种支持的语言部署了单独版本的应用程序
- dist |___ en/ | |__ index.html |___ fr/ |__ index.html
我还添加了以下nginx配置,以提供两种语言的应用程序;
server { root /var/www/dist; index index.html index.htm; server_name host.local; location ^/(fr|en)/(.*)$ { try_files $2 $2/ /$1/index.html; } }
我想做的是为这两个应用程序提供服务,并允许在英文版和法文版之间切换。
比如说,我在主机上。本地/en/something
如果切换到主机。local/fr/something我应该得到法文版的“something”页面。
使用我共享的nginx配置,每次我在浏览应用程序时刷新页面时都会出现404 not found错误,这也会阻止我独立浏览应用程序并在它们之间切换。
我错过了什么?实现这一点的合适Nginx配置是什么?
Angular 9有一个新选项,可以一次构建所有语言版本。它还通过将区域设置添加到已配置的baseHref来为应用程序的每个版本设置base HREF。
ng build --prod --localize
然后需要将所有构建复制到nginx service目录
COPY /dist/my-app/ /usr/share/nginx/my-app/
并按照前面的回答配置nginx。
在建造之后:
ng build --prod --base-href /fr/ --output-path dist/fr
ng build --prod --base-href /en/ --output-path dist/en
将生成复制到nginx服务目录:
cp -r dist/* /usr/share/nginx/my-app
然后我发现2个不同的NGINX配置,为我工作:
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;
}
}
注意:在根路径解决方案中,您可以在选项上删除自动索引,但您还必须从
try_files
中删除$uri$args/
部分,否则您将得到"[目录]的目录索引"是禁止的错误”。
仅供参考:您可以找到关于ROOT和ALIAS的有用解释。
Angular CLI: 6.0.7
Node: 8.11.2
Angular: 6.0.3
我在iis上也做了同样的事情,首先您必须使用“base href”选项构建应用程序:
ng build --output-path=dist/fr --prod --bh /fr/
ng build --output-path=dist/en --prod --bh /en/
对于nginx,请使用此配置
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;
}
对于从 /en/someroute到 /fr/someroute的导航,您可以在您的组件中获取当前的路由器url,其中您有语言切换器
getCurrentRoute() {
return this.router.url;
}
单击语言选择器时,您将重定向到使用所选语言的同一路线:
<li *ngFor="let language of languages;let i=index" >
<a href="/{{language.lang}}/#{{getCurrentRoute()}}" (click)="changeLanguage(language.lang)">
{{language.lang}}
</a>
</li>
改变语言方法
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);
}
}
使用其他文本消息不是一个好方法,因为如果枚举中有数百个值,那该怎么办。我不会在html代码中重复枚举。
我将nginx设置为一种静态文件服务器。出于某种原因,只有当我去123.123.123.123/或123.123.123.123时,它才会起作用。然而,当我去123.123.123.123/static/content/或123.123.123.123/static/content/another.mp3它返回404未找到。下面是位于中并链接到的配置文件。我真的很困惑为什么它不起作用。 如有任何指
问题内容: 我想使用数据库存储i18n键/值对,以便我们可以在运行时修改/重新加载i18n数据。有人做过吗?还是有人对如何实现这一点有想法?我已经阅读了几个相关的主题,但是还没有看到可行的解决方案。 我专门指的是可以与jstl标记一起使用的东西,例如 我认为这将涉及扩展ResourceBundle,但是当我尝试这样做时,我遇到了与jstl标记获取资源包的方式有关的问题。 问题答案: 您是否只是问如
请参考下图。这些是我在Github中遇到的错误。 跑步时所需穿戴/衣料-action@v1上次提交的SHA是“9c3afb987475ddadfe7f091e26b348bf8421cb69”运行ESLint验证ESLint的安装程序…验证的ESLint安装程序将使用ESLint检查扩展名为js Linting的文件,这些文件位于/home/runner/work/angular app hero
我已将芹菜配置为在dev box上为Flask应用程序运行异步作业,如下所示: 配置。py: 管理py: 在启动应用程序之前,我先启动redis: 然后,当我运行应用程序(run_芹菜)时,会显示以下芹菜配置: <>** ---------- . 以及以下重复出现的错误: 错误/主进程消费者:无法连接到amqp://guest:**@127.0.0.1:5672//:[Errno 111]连接拒绝
问题内容: 我打算将Ext JS用于大型应用程序。该应用程序的功能基于角色。用户登录时,他们只会看到与其相关的菜单和屏幕功能。我的服务器端技术将是Java和JSP。 为了解决这个问题,我有两个想法 。1.使用服务器端技术在用户登录后动态创建与Ext JS相关的javascript。Servlet / JSP将根据用户角色创建必要的est js代码。 2.具有在视图JSP中设置的Js变量,这些变量将