热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Angular中的字符串资源

如何解决《Angular中的字符串资源》经验,为你挑选了1个好方法。

我正在开发一个Angular应用程序,我正在寻找类似于Android开发中可用的Android资源的东西.

以下是在Android中获取字符串的方法:

String mystring = getResources().getString(R.string.mystring);

我想在Angular中也一样.

例如,如果我有几个HTML模板,其中有关于提供的错误电子邮件的相同消息...

Error!Invalid e-mail

我想要以下内容:

Error!{{myStrings.INVALID_EMAIL}}

......或类似的东西......

Error!{{'INVALID_EMAIL' | stringGenerator}}

你知道我可以安装的方法或插件吗?



1> AndreaM16..:

将配置,翻译和资源与应用程序的逻辑分离是非常有用的.配置在其他上下文中也非常有用,例如,api_url对任何休息调用都有用.

你可以使用@ angular/cli设置这样的东西.具有以下应用程序结构:

|- app
|- assets
         |- i18n
                - en.json
                - it.json
         |- json-config
                - development.json
                - env.json
                - production.json
         |- resources
                - en.json
                - it.json
|- environment
         - environment.prod.ts
         - environment.ts

|- config
         - app.config.ts    

哪里:

app:包含所有应用程序逻辑

assets/i18n/*.json:包含可在任何组件中使用的文本资源.对于我们想要涵盖的每种语言,都有一种.

EG en.json:

{
  "TEST": {
    "WELCOME"  : "Welcome"
}

EG it.json:

{
  "TEST": {
    "WELCOME"  : "Benvenuto"
}

assets/json-config:包含在开发模式和生产模式下使用的配置文件.还包含env.json哪个json说明哪个是当前的开发模式:

EG env.json:

{
   "env" : "development"
}

EG development.json:

{
    "API_URL"   : "someurl",
    "MYTOKEN" : "sometoken",
    "DEBUGGING" : true
}

资产/资源:包含我们想要涵盖的每种语言的资源的jsons文件.例如,它可能包含应用程序模型的jsons初始化.例如,如果要填充要传递给*ngFor基于环境和/或语言的个性化的模型数组,这将非常有用.这种初始化应该在每个想要通过AppConfig.getResourceByKey稍后显示的精确资源访问的组件内完成.

app.config.ts:基于开发模式加载资源的Configuration Service.我将在下面显示一个片段.

基本配置:

为了在应用程序启动时加载基本配置文件,我们需要做一些事情.

app.module.ts:

import { NgModule, APP_INITIALIZER } from '@angular/core';
/** App Services **/
import { AppConfig } from '../config/app.config';
import { TranslationConfigModule } from './shared/modules/translation.config.module';

// Calling load to get configuration + translation
export function initResources(config: AppConfig, translate: TranslationConfigModule) {
        return () => config.load(translate);
}

// Initializing Resources and Translation as soon as possible
@NgModule({
     . . .
     imports: [
         . . .
         TranslationConfigModule
     ],
     providers: [
         AppConfig, {
           provide: APP_INITIALIZER,
           useFactory: initResources,
           deps: [AppConfig, TranslationConfigModule],
           multi: true
         }
     ],
     bootstrap: [AppComponent]
})
export class AppModule { }

app.config.ts:

如上所述,该服务基于开发模式加载配置文件,在这种情况下,基于浏览器语言.如果要自定义应用程序,则基于语言加载资源非常有用.例如,您的意大利语发行版会有不同的路线,不同的行为或简单的不同文本.

每个Resources,Configuration和Enviroment条目都可以通过AppConfig服务的方法获得,例如getEnvByKey,getEntryByKeygetResourceByKey.

import { Inject, Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { get } from 'lodash';
import 'rxjs/add/operator/catch';

import { TranslationConfigModule } from '../app/shared/modules/translation.config.module';

@Injectable()
export class AppConfig {

  private _configurations: any = new Object();
  private _config_path = './assets/json-config/';
  private _resources_path = './assets/resources/';

  constructor( private http: Http) { }

  // Get an Environment Entry by Key
  public getEnvByKey(key: any): any {
    return this._configurations.env[key];
  }

  // Get a Configuration Entryby Key
  public getEntryByKey(key: any): any {
    return this._configurations.config[key];
  }

  // Get a Resource Entry by Key
  public getResourceByKey(key: any): any {
    return get(this._configurations.resource, key);
  }

  // Should be self-explanatory 
  public load(translate: TranslationConfigModule){
    return new Promise((resolve, reject) => {
      // Given env.json
      this.loadFile(this._config_path + 'env.json').then((envData: any) => {
        this._configurations.env = envData;
        // Load production or development configuration file based on before
        this.loadFile(this._config_path + envData.env  + '.json').then((conf: any) => {
          this._configurations.cOnfig= conf;
          // Load resources files based on browser language
          this.loadFile(this._resources_path + translate.getBrowserLang() +'.json').then((resource: any) => {
            this._configurations.resource = resource;
            return resolve(true);
          });
        });
      });
    });
  }

  private loadFile(path: string){
    return new Promise((resolve, reject) => {
      this.http.get(path)
        .map(res => res.json())
        .catch((error: any) => {
          console.error(error);
          return Observable.throw(error.json().error || 'Server error');
        })
        .subscribe((res_data) => {
          return resolve(res_data);
        })
    });
  }

}

translation.config.module.ts

此模块设置使用ngx-translate构建的翻译.根据浏览器语言设置翻译.

import { HttpModule, Http } from '@angular/http';
import { NgModule, ModuleWithProviders } from '@angular/core';
import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { isNull, isUndefined } from 'lodash';


export function HttpLoaderFactory(http: Http) {
    return new TranslateHttpLoader(http, '../../../assets/i18n/', '.json');
}

const translatiOnOptions= {
    loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [Http]
    }
};

@NgModule({
    imports: [TranslateModule.forRoot(translationOptions)],
    exports: [TranslateModule],
    providers: [TranslateService]
})
export class TranslationConfigModule {

    private browserLang;

    /**
     * @param translate {TranslateService}
     */
    constructor(private translate: TranslateService) {
        // Setting up Translations
        translate.addLangs(['en', 'it']);
        translate.setDefaultLang('en');
        this.browserLang = translate.getBrowserLang();
        translate.use(this.browserLang.match(/en|it/) ? this.browserLang : 'en');
    }

    public getBrowserLang(){
        if(isUndefined(this.browserLang) || isNull(this.browserLang)){
            this.browserLang = 'en';
        }
        return this.browserLang;
    }
}

好的,现在呢?我该如何使用这样的配置?

导入到app.module.ts其中的任何模块/组件或导入到另一个导入的自定义模块中的任何模块/组件translation.config.module现在都可以根据浏览器语言自动转换任何插值条目.例如,使用以下snipped将根据解释的行为生成WelcomeBenvenuto:

{{ 'TEST.WELCOME' | translate }}

如果我想获取资源来初始化将传递给某个数组的某个数组*ngFor

在任何组件中,只需在构造函数中执行此操作:

. . .

// Just some model
public navigationLinks: NavigationLinkModel[];

constructor(private _config: AppConfig) {
    // PAGES.HOMEPAGE.SIDENAV.NAVIGATION contains such model data
    this.navigatiOnLinks= 
    this._config.getResourceByKey('PAGES.HOMEPAGE.SIDENAV.NAVIGATION');
 }

当然,您也可以组合资源和配置.


推荐阅读
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 详解react组件通讯方式(多种)
    这篇文章主要介绍了详解react组件通讯方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
author-avatar
点提土八撇又254
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有