{"id":47502,"date":"2014-05-22T16:19:19","date_gmt":"2014-05-22T13:19:19","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=47502"},"modified":"2020-04-09T12:06:41","modified_gmt":"2020-04-09T09:06:41","slug":"how-to-speed-up-angularjs-apps-that-use-internalization-libraries","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/","title":{"rendered":"How to Speed Up AngularJS Apps That Use Internalization Libraries"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-47503 alignright\" alt=\"angularjs-logo\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/11\/angularjs-logo.png\" width=\"128\" height=\"128\" \/><\/p>\n<p>For a while, we were involved into development of a document workflow management-as-a-service system. The client app was created using <a href=\"https:\/\/www.altoros.com\/blog\/evaluation-of-angularjs-a-javascript-ui-framework\/\">AngularJS<\/a>, and we were to decide on the best option for its internalization (i18n) and localization (l10n). However, the service had a rather complex UI with plenty of messages to be translated and transferred between the server and the client. Therefore, we were concerned about the impact of client-side translation on performance.<\/p>\n<p>In this post, we explore this in detail and suggest an approach that accelerates performance of AngularJS internationalization.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#Why_AngularJS\" >Why AngularJS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#Internationalization_with_AngularJS\" >Internationalization with AngularJS<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#Improving_performance_of_AngularJS_i18n\" >Improving performance of AngularJS i18n<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Why_AngularJS\"><\/span>Why AngularJS<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>After a brief investigation, we agreed that AngularJS would be a good match for this project for a number of reasons. First, development using this framework is quick, and the code quality is good. Second, delivered by Google, this tool is stable and reliable. In addition, it provides great testing capabilities. Another argument in favor of AngularJS is that it already provides features that should be added through third-party libraries in other solutions. For instance, to enable validation in Backbone.js, an additional jQuery validation plug-in is required; to provide a module structure, you will need RequireJS or any other library.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Internationalization_with_AngularJS\"><\/span>Internationalization with AngularJS<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>One of the simplest ways of translating AngularJS apps is to use internationalization libraries, such as <a href=\"https:\/\/www.ng-newsletter.com\/posts\/angular-translate.html\" target=\"_blank\" rel=\"noopener noreferrer\">Angular-translate<\/a>, <a href=\"https:\/\/angular-gettext.rocketeer.be\/\" target=\"_blank\" rel=\"noopener noreferrer\">Angular-gettext<\/a>, etc.<\/p>\n<p>All these libraries use directives and filters to substitute values. However, this approach involves multiple modifications of the Document Object Model. In addition, large data sets are transferred between a server and a client. We analyzed how these two factors affected performance and measured the results using the R programming language.<\/p>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/Internalization-with-Angular-gettext.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/Internalization-with-Angular-gettext.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-47547\" \/><\/a><\/p>\n<p>This diagram illustrates how many milliseconds were added to a loading time depending on the number of words to be translated. For instance, translating 100 words at runtime results in a latency of 100+ milliseconds. If an application has a complex UI with multiple menus and tabs, then the number of translated messages may reach 300 and more.<\/p>\n<p>According to <a href=\"https:\/\/neilpatel.com\/blog\/loading-time\/\" target=\"_blank\" rel=\"noopener noreferrer\">surveys<\/a>, users are ready to wait for 2 seconds, while a web page is loading and after 3 seconds 40% of visitors leave a website. An additional 100 milliseconds delay <a href=\"http:\/\/www.strangeloopnetworks.com\/resources\/infographics\/web-performance-and-ecommerce\/amazon-100ms-faster-1-revenue-increase\/\" target=\"_blank\" rel=\"noopener noreferrer\">led<\/a> to Amazon&#8217;s sales to decrease by 1%. Therefore, in case of AngularJS i18n and l10n, directives and filters should only be used for applications with few DOM elements.<\/p>\n<p>We also analyzed how the size of a translated message bundle affects the entire page loading time. It turned out that loading 5\u201310 MB had a very low impact on performance.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Improving_performance_of_AngularJS_i18n\"><\/span>Improving performance of AngularJS i18n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The latencies illustrated by the diagram above were primarily caused by modification of multiple DOM objects. So, reducing the number of such updates could help to improve performance.<\/p>\n<p>To achieve this, the templates should be localized before they are converted into DOM elements. For example, the translated words can be added at the moment the templates are received by the server.<\/p>\n<p>To analyze how this method of localization influences performance, we created a script that:<\/p>\n<ul>\n<li>loaded message bundles to a client<\/li>\n<li>used an AJAX interceptor to process loaded templates before they were converted to DOM elements<\/li>\n<li>utilized the Underscore.js template to replace text in templates<\/li>\n<\/ul>\n<p>The source code of this solution is as follows.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.factory('i18nInterceptor', &#x5B;'$q', '$translate', function($q, $translate) {\r\n            return {\r\n                'request': function(config) {\r\n                    return config;\r\n                },\r\n\r\n                'response': function(response) {\r\n                    _.templateSettings = {\r\n                        'interpolate': \/\\&#x5B;\\&#x5B;(&#x5B;\\s\\S]+?)\\]\\]\/g\r\n                    };\r\n                    if (typeof response.data === 'string') {\r\n                        response.data = _.template(response.data, {t: $translate});\r\n                    }\r\n                    return response;\r\n                }\r\n            };\r\n        }])\r\n<\/pre>\n<p>Here is a usage sample.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;div class=\u201dbox-header\u201d&gt;    \r\n    &lt;span class=\u201dtitle\u201d&gt; &#x5B;&#x5B;t('common.tickets.page.search')]]: &lt;\/span&gt;\r\n&lt;\/div&gt;\r\n<\/pre>\n<p>As you can see from the figure below, this approach works much faster. Translating 500 words resulted in a latency of less than 20 milliseconds, which is almost 35 times faster compared to the default Angular-gettext method.<\/p>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/Performance-improvements-after-optimizing-Angular-gettext-internalization.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/Performance-improvements-after-optimizing-Angular-gettext-internalization.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-47548\" \/><\/a><\/p>\n<p>The following diagram demonstrates the achieved performance improvement. The green line stands for the Angular-gettext library, the red line is based on optimized Angular-gettext solution that reduces the number of DOM modifications.<\/p>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/Performance-comparison-default-and-optimized-methods-Angular-gettext-internalization.png\"><img decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/Performance-comparison-default-and-optimized-methods-Angular-gettext-internalization.png\" alt=\"\" width=\"640\" class=\"aligncenter size-full wp-image-47549\" \/><\/a><\/p>\n<p>In this case, the optimized solution decreased the latency for translating 500 words by 35x: from 700 milliseconds to less than 20 milliseconds.<\/p>\n<p>The project demonstrated how most of AngularJS libraries for internationalization and localization slow down the performance. While in a single-page app the latency may be slight, in large web systems this approach may increase loading time significantly. Therefore, it will only work for small-scale apps that do not have strict performance requirements.<\/p>\n<p>To reduce the number of DOM modifications, maps with translations should be generated on the server side and the ready values should be inserted into templates on the client side. After all, a template with translated words should be converted to DOM elements. As it was demonstrated, this may improve performance by up to 35x.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/evaluation-of-angularjs-a-javascript-ui-framework\/\">Evaluation of AngularJS, a JavaScript UI Framework<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/data-visualization-tools-flot-vs-highcharts-vs-d3-js\/\">Data Visualization Tools: Flot vs. Highcharts vs. D3.js<\/a><\/li>\n<li><a href=\"https:\/\/blog.altoros.com\/flash-vs-html5-how-to-%d1%81onvert-and-what-to-expect-in-future.html\">Flash vs. HTML5: How to \u0421onvert and What to Expect in the Future?<\/a><\/li>\n<\/ul>\n<hr\/>\n<p><center><small>This post was written by <b>Ilya Drabenia<\/b> and edited by <a href=\"https:\/\/www.altoros.com\/blog\/author\/alex\/\">Alex Khizhniak<\/a>.<\/small><\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<\/p>\n<p>For a while, we were involved into development of a document workflow management-as-a-service system. The client app was created using AngularJS, and we were to decide on the best option for its internalization (i18n) and localization (l10n). However, the service had a rather complex UI with plenty of messages to [&#8230;]<\/p>\n","protected":false},"author":71,"featured_media":47553,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[873],"class_list":["post-47502","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-cloud-native"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Speed Up AngularJS Apps That Use Internalization Libraries | Altoros<\/title>\n<meta name=\"description\" content=\"Learn how to increase performance of AngularJS i18n internationalization up to 35x.\" \/>\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.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Speed Up AngularJS Apps That Use Internalization Libraries | Altoros\" \/>\n<meta property=\"og:description\" content=\"For a while, we were involved into development of a document workflow management-as-a-service system. The client app was created using AngularJS, and we were to decide on the best option for its internalization (i18n) and localization (l10n). However, the service had a rather complex UI with plenty of messages to [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-22T13:19:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-04-09T09:06:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"514\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Ilya Drabenia\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ilya Drabenia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/\",\"name\":\"How to Speed Up AngularJS Apps That Use Internalization Libraries | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif\",\"datePublished\":\"2014-05-22T13:19:19+00:00\",\"dateModified\":\"2020-04-09T09:06:41+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/48c2eaf6d86abc9fa945bc3860fa2dc2\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif\",\"width\":640,\"height\":514},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Speed Up AngularJS Apps That Use Internalization Libraries\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/48c2eaf6d86abc9fa945bc3860fa2dc2\",\"name\":\"Ilya Drabenia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2017\/01\/1108467-150x150.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2017\/01\/1108467-150x150.jpg\",\"caption\":\"Ilya Drabenia\"},\"description\":\"Ilya Drabenia is a Technical Lead at Altoros. He has broad experience in building software architectures, including design and development of complex solutions. Ilya is passionate about microservices, domain-driven design, as well as scalable and parallel algorithms. He also holds an MSc degree in Computer Science. See his profile on GitHub.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/ilya-drabenia\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Speed Up AngularJS Apps That Use Internalization Libraries | Altoros","description":"Learn how to increase performance of AngularJS i18n internationalization up to 35x.","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.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/","og_locale":"en_US","og_type":"article","og_title":"How to Speed Up AngularJS Apps That Use Internalization Libraries | Altoros","og_description":"For a while, we were involved into development of a document workflow management-as-a-service system. The client app was created using AngularJS, and we were to decide on the best option for its internalization (i18n) and localization (l10n). However, the service had a rather complex UI with plenty of messages to [...]","og_url":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/","og_site_name":"Altoros","article_published_time":"2014-05-22T13:19:19+00:00","article_modified_time":"2020-04-09T09:06:41+00:00","og_image":[{"width":640,"height":514,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif","type":"image\/gif"}],"author":"Ilya Drabenia","twitter_misc":{"Written by":"Ilya Drabenia","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/","url":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/","name":"How to Speed Up AngularJS Apps That Use Internalization Libraries | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif","datePublished":"2014-05-22T13:19:19+00:00","dateModified":"2020-04-09T09:06:41+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/48c2eaf6d86abc9fa945bc3860fa2dc2"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2014\/05\/AngularJS-internalization.gif","width":640,"height":514},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Speed Up AngularJS Apps That Use Internalization Libraries"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/48c2eaf6d86abc9fa945bc3860fa2dc2","name":"Ilya Drabenia","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2017\/01\/1108467-150x150.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2017\/01\/1108467-150x150.jpg","caption":"Ilya Drabenia"},"description":"Ilya Drabenia is a Technical Lead at Altoros. He has broad experience in building software architectures, including design and development of complex solutions. Ilya is passionate about microservices, domain-driven design, as well as scalable and parallel algorithms. He also holds an MSc degree in Computer Science. See his profile on GitHub.","url":"https:\/\/www.altoros.com\/blog\/author\/ilya-drabenia\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=47502"}],"version-history":[{"count":24,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47502\/revisions"}],"predecessor-version":[{"id":53020,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47502\/revisions\/53020"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/47553"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=47502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=47502"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=47502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}