{"id":3706,"date":"2020-03-17T21:49:05","date_gmt":"2020-03-17T20:49:05","guid":{"rendered":"https:\/\/www.angulararchitects.io\/?p=3706"},"modified":"2020-03-17T21:49:05","modified_gmt":"2020-03-17T20:49:05","slug":"lazy-loading-locales-with-angular","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/","title":{"rendered":"Lazy Loading Locales with Angular"},"content":{"rendered":"<p>Angular 9 introduces a new implementation for its built-in I18N support called <a href=\"mailto:code&gt;@angular\/localize&lt;\/code\">code>@angular\/localize<\/code<\/a>. One concept it contains is called global locales. These are bundles with meta data for different date and number formats the CLI can add <strong>after<\/strong> compiling the application.<\/p>\n<p>Normally, the CLI uses these bundles under the hood to dramatically speed up the creation of different language versions. However, we can divert it from its intended use to load the meta data dynamically on demand.<\/p>\n<p>This article shows how to leverage this. The used example can be found in my <a href=\"https:\/\/github.com\/manfredsteyer\/global-locals\">GitHub repo<\/a>.<\/p>\n<blockquote><p>\nBig thanks to Angular's <a href=\"https:\/\/twitter.com\/petebd\">Pete Bacon Darwin<\/a> who helped me to see the whole picture regarding global locals.\n<\/p><\/blockquote>\n<h2>Situation Before Angular 9<\/h2>\n<p>Beginning with Angular 5, Angular is shipped with meta data for different locales. It is derived from the Unicode Common Locale Data Repository (CLDR). To support some of them, we had to import and register them before the application starts, e. g. within <code>main.ts<\/code>:<\/p>\n<pre><code class=\"language-typescript\">import { registerLocaleData } from &#039;@angular\/common&#039;;\nimport localeDe from &#039;@angular\/common\/locales\/de&#039;;\nimport localeDeAt from &#039;@angular\/common\/locales\/de-AT&#039;;\nimport localeEs from &#039;@angular\/common\/locales\/es&#039;;\n\nregisterLocaleData(localeDe);     \/\/ de-DE\nregisterLocaleData(localeDeAt);   \/\/ de-AT\nregisterLocaleData(localeEs);     \/\/ es-ES\n\n[...]\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n  .catch(err =&gt; console.error(err));<\/code><\/pre>\n<p>In addition to these locales, <code>en-US<\/code> is always available.<\/p>\n<p>Obviously, this increases the size of the main bundle as all this meta data is referenced at compile time. As the next chapters show, Angular 9 introduces a way to prevent this situation.<\/p>\n<h2>Global Locales<\/h2>\n<p>Beginning with version 9, Angular is also providing a special set of bundles registering the locale meta data globally at <code>global.ng.common.locales<\/code>. For instance, in the case of German, the meta data would be put to <code>global.ng.common.locales[&#039;de&#039;]<\/code>. Hence, they are called global locales.<\/p>\n<p>These bundles are located within <a href=\"mailto:code&gt;node_modules\/@angular\/common\/locales\/global&lt;\/code\">code>node_modules\/@angular\/common\/locales\/global<\/code<\/a>:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2020\/03\/local-files.png\" alt=\"global locales\" \/><\/p>\n<p>Global Locals go hand in hand with the new <a href=\"mailto:code&gt;@angular\/localize&lt;\/code\">code>@angular\/localize<\/code<\/a> package which brings the built-in I18N support to the next level. The idea of this package is to only compile the application once. Then, this compiled version is duplicated for each language one wants to support and each of these duplications is modified. <\/p>\n<p>These modifications involve exchanging texts but also adding the right meta data. For the latter one, we need a way to simply add this meta data after the build. This is what global locals enable.<\/p>\n<p>Obviously, this approach is much faster than the original one which compiled the whole application <strong>once per language<\/strong>.<\/p>\n<p>Saying this, <strong>normally you don't need to deal directly with these global locals<\/strong> because the CLI does the heavy lifting for you. If you want to try it out, you find a <a href=\"https:\/\/blog.ninja-squad.com\/2019\/12\/10\/angular-localize\/\">wonderful blog post about <a href=\"mailto:code&gt;@angular\/localize&lt;\/code\">code>@angular\/localize<\/code<\/a> here<\/a>.<\/p>\n<p><strong>However<\/strong>, if you don't use <a href=\"mailto:code&gt;@angular\/localize&lt;\/code\">code>@angular\/localize<\/code<\/a> do deal with translation texts but go with something like <code>ngx-translate<\/code> instead, directly dealing with global locales will come in handy. This is also the case if you do use <a href=\"mailto:code&gt;@angular\/localize&lt;\/code\">code>@angular\/localize<\/code<\/a> but define the translation texts programatically, e. g. after loading them from a custom service in a custom data format (which is called runtime tranlation).<\/p>\n<p>In these cases, loading just the needed meta data on demand instead of loading the meta data for all languages upfront will improve your startup performance.<\/p>\n<h2>Lazy Loading<\/h2>\n<p>To demonstrate lazy loading global locals by hand, I've created a simple application which is using <code>en-US<\/code> by default:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2020\/03\/lazy-locals-01.png\" alt=\"example\" \/><\/p>\n<p>After clicking the button <code>German Version<\/code>, the German locale meta data is lazy loaded and used. For this, I've created a simple script loader which is basically creating a <code>script<\/code> tag dynamically:<\/p>\n<pre><code class=\"language-typescript\">\/\/\n\/\/ Simplest Possible Script Loader TM\n\/\/\n\n@Injectable({\n  providedIn: &#039;root&#039;\n})\nexport class SimpleLoaderService {\n\n  constructor() { }\n\n  \/\/ Remeber already loaded files so that we\n  \/\/ don&#039;t load it again.\n  private loadedFiles = new Set&lt;string&gt;();\n\n  loadScript(src: string): Promise&lt;void&gt; {\n\n    \/\/ If the file is already loaded don&#039;t do anything.\n    if (this.loadedFiles.has(src)) {\n      return Promise.resolve();\n    }\n\n    return new Promise&lt;void&gt;((resolve, reject) =&gt; {\n\n      \/\/ Create a script tag and point to java script file\n      const script = document.createElement(&#039;script&#039;);\n      script.src = src;\n\n      \/\/ Resolve Promise after loading\n      script.onload = () =&gt; {\n        this.loadedFiles.add(src);\n        resolve();\n      };\n\n      \/\/ Reject Promise on error\n      script.onerror = () =&gt; {\n        reject();\n      };\n\n      \/\/ Add script tag to page\n      document.body.appendChild(script);\n    });\n  }\n\n}<\/code><\/pre>\n<p>Our demo's <code>AppComponent<\/code> holds a date which happens to be the authors birth day (just saying ...) and a property holding the locale to use:<\/p>\n<pre><code class=\"language-typescript\">@Component({ [...] })\nexport class AppComponent {\n\n  date = new Date(&#039;2020-01-20T17:00+01:00&#039;);\n  lang = &#039;en-US&#039;;\n\n  constructor(private loader: SimpleLoaderService) {\n  }\n\n  toGerman() {\n    this.loader\n        .loadScript(&#039;assets\/de.js&#039;)\n        .then(_ =&gt; this.lang = &#039;de-DE&#039;)\n        .catch(err =&gt; console.error(&#039;Error loading file&#039;, err));\n  }\n\n}<\/code><\/pre>\n<p>The template displays this date as shown above:<\/p>\n<pre><code class=\"language-html\">{{ date | date:&#039;long&#039;:&#039;&#039;:lang }}<\/code><\/pre>\n<p>The method <code>toGerman<\/code> is bound to the shown button and uses our <code>SimpleLoaderService<\/code> to load the <code>German<\/code> locale. After that, it updates the <code>lang<\/code> property.<\/p>\n<h2>Testing the Application<\/h2>\n<p>To demonstrate that lazy loading really takes happen, you can open Chrome's network tab within the dev tools and click <code>German Version<\/code> within the page. You should see that this lazy loads the <code>assets\/de.js<\/code> file. Also, you should now see a German date.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2020\/03\/lazy-locals-02.png\" alt=\"Lazy Loading\" \/><\/p>\n<h2>Conclusion<\/h2>\n<p>If you fully go with <a href=\"mailto:code&gt;@angular\/localize&lt;\/code\">code>@angular\/localize<\/code<\/a> and compile time translation, you don't need to concentrate on gobal locals. But if you use other tools for loading translation texts or runtime translation, loading the meta data on demand will come in handy. This is especially the case if you use solutions like <code>ngx-translate<\/code> which allow to switch between languages at runtime.<\/p>\n<p><\/p>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/blog.ninja-squad.com\/2019\/12\/10\/angular-localize\">Great blog article about @angular\/localize by C\u00e9dric Exbrayat<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/angular\/angular\/commit\/c5894e0\">Pull Request: Support loading locales from a global<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/manfredsteyer\/global-locals\">Example used here<\/a><\/li>\n<\/ul>\n<h3>More in Our Workshop<\/h3>\n<p>If you want to learn more about such advanced topics, check out our Advanced <a href=\"https:\/\/www.softwarearchitekt.at\/schulungen\/advanced-angular-enterprise-anwendungen-und-architektur\/\">Angular Workshop<\/a> which focusses enterprise applications and sustainable architectures.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2020\/03\/workshop1.jpg\" alt=\"Advanced Angular Workshop\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Instead of loading all supported locales upfront, we can now load them on demand.<\/p>\n","protected":false},"author":9,"featured_media":3707,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3706","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-unkategorisiert"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Lazy Loading Locales with Angular - ANGULARarchitects<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lazy Loading Locales with Angular - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"Instead of loading all supported locales upfront, we can now load them on demand.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-17T20:49:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"425\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Manfred Steyer, GDE\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daniel\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer, GDE\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/\"},\"author\":{\"name\":\"Manfred Steyer, GDE\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\"},\"headline\":\"Lazy Loading Locales with Angular\",\"datePublished\":\"2020-03-17T20:49:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/\"},\"wordCount\":22,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png\",\"articleSection\":[\"Unkategorisiert\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/\",\"name\":\"Lazy Loading Locales with Angular - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png\",\"datePublished\":\"2020-03-17T20:49:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png\",\"width\":640,\"height\":425},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lazy Loading Locales with Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951\",\"name\":\"Manfred Steyer, GDE\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer, GDE\"},\"sameAs\":[\"https:\/\/x.com\/daniel\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Lazy Loading Locales with Angular - ANGULARarchitects","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/","og_locale":"en_US","og_type":"article","og_title":"Lazy Loading Locales with Angular - ANGULARarchitects","og_description":"Instead of loading all supported locales upfront, we can now load them on demand.","og_url":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/","og_site_name":"ANGULARarchitects","article_published_time":"2020-03-17T20:49:05+00:00","og_image":[{"width":640,"height":425,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png","type":"image\/png"}],"author":"Manfred Steyer, GDE","twitter_card":"summary_large_image","twitter_creator":"@daniel","twitter_misc":{"Written by":"Manfred Steyer, GDE"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/"},"author":{"name":"Manfred Steyer, GDE","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951"},"headline":"Lazy Loading Locales with Angular","datePublished":"2020-03-17T20:49:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/"},"wordCount":22,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png","articleSection":["Unkategorisiert"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/lazy-loading-locales-with-angular\/","url":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/","name":"Lazy Loading Locales with Angular - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png","datePublished":"2020-03-17T20:49:05+00:00","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2020\/03\/main-pic1.png","width":640,"height":425},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/aktuelles\/lazy-loading-locales-with-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Lazy Loading Locales with Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/15628efa7af4475ffaaeeb26c5112951","name":"Manfred Steyer, GDE","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a0b59539674d8b71ea1c1f4764b11244b5f499203f1d11b40f37d8f3f90be033?s=96&d=mm&r=g","caption":"Manfred Steyer, GDE"},"sameAs":["https:\/\/x.com\/daniel"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/3706","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=3706"}],"version-history":[{"count":0,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/3706\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/3707"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=3706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=3706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=3706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}