当前位置: 首页 > 知识库问答 >
问题:

用于角度i18n应用的Nginx配置

慕晨
2023-03-14

我建立了一个角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配置是什么?

共有3个答案

申辉
2023-03-14

Angular 9有一个新选项,可以一次构建所有语言版本。它还通过将区域设置添加到已配置的baseHref来为应用程序的每个版本设置base HREF。

ng build --prod --localize

然后需要将所有构建复制到nginx service目录

COPY /dist/my-app/ /usr/share/nginx/my-app/

并按照前面的回答配置nginx。

袁谭三
2023-03-14

在建造之后:

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

颛孙智勇
2023-03-14

我在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变量,这些变量将