diff --git a/.nojekyll b/.nojekyll old mode 100644 new mode 100755 diff --git a/404.html b/404.html old mode 100644 new mode 100755 index d08c1659f..344f92c1e --- a/404.html +++ b/404.html @@ -1,13 +1,20 @@ - + - -Page Not Found | Format.JS - - + + + + + +Page Not Found | Format.JS + + - -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ +
+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100755 index 000000000..1556cbaea --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +formatjs.io diff --git a/assets/css/styles.c21f25d6.css b/assets/css/styles.c21f25d6.css deleted file mode 100644 index 1ba786872..000000000 --- a/assets/css/styles.c21f25d6.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}body,ol ol,ol ul,ul ol,ul ul{margin:0}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.button,.dropdown__link,.searchbox,.text--truncate{white-space:nowrap}*,.algolia-autocomplete .ds-dropdown-menu *,.searchbox,.searchbox__input{box-sizing:border-box}.searchbox__reset:focus,.searchbox__submit:focus,body:not(.navigation-with-keyboard) :not(input):focus{outline:0}pre,table{overflow:auto}.markdown li,body{word-wrap:break-word}.toggleButton_xBbf,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_PA1V,.details_O2qz>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#8339c2;--ifm-color-primary-dark:#7633af;--ifm-color-primary-darker:#6f30a5;--ifm-color-primary-darkest:#5c2888;--ifm-color-primary-light:#8f4aca;--ifm-color-primary-lighter:#9554cd;--ifm-color-primary-lightest:#a771d5;--ifm-code-font-size:95%;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_P5p4{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_nwKe,.row--align-center,.showcase_SATw .logos_NYVn{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList_Mlii{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_ppnK .wordWrapButtonIcon_rjPH{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_WfvQ,.alert__heading,.demo_F90y .exampleTitle_sQvz,.playgroundHeader_qwyd,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs__link:any-link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.algolia-autocomplete .algolia-docsearch-suggestion,.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.tag_aRgw:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_ol1t:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_zsku article>:first-child,.docItemContainer_zsku header+*,.footer__item{margin-top:0}.admonitionContent_P8nc>:last-child,.collapsibleContent_pqGZ p:last-child,.details_O2qz>summary>p:last-child,.footer__items,.tabItem_nQMB>:last-child{margin-bottom:0}.codeBlockStandalone_EikJ,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_O2qz[data-collapsed=false].isBrowser_CXln>summary:before,.details_O2qz[open]:not(.isBrowser_CXln)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_e7Wl,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.tag_aRgw{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_aRgw:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_iZ_b{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_C_wV{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_C_wV:after,.tagWithCount_C_wV:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_C_wV:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_C_wV:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_C_wV span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_xY9G{display:inline}.tag_eAgs{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_KVys{margin-right:.3em;vertical-align:sub}.lastUpdated_XIYD{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_MpPC{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_MpPC:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_IeAO:after,.tocCollapsibleExpanded_Gnnx{transform:none}.tocCollapsible_zW8v{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_hGfk>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_hGfk ul li{margin:.4rem .8rem}.tocCollapsibleContent_hGfk a{display:block}.tableOfContents_rRp3{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.label_nUUl{font-weight:700}.textarea_ImEU{overflow-y:hidden;padding:2px;resize:none;width:100%}.wFull_k1Tu{width:100%}.form_cu45{border:1px solid #000;border-radius:.4rem;margin:1rem 0;padding:.4rem}.backToTopButton_f81x{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_f81x:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow__eva{opacity:1;transform:scale(1);visibility:visible}.algolia-docsearch-suggestion{border-bottom-color:#3a3dd1}.algolia-docsearch-suggestion--category-header{background-color:#4b54de}.algolia-docsearch-suggestion--highlight{color:#3a33d1}.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background-color:#4d47d5}.aa-cursor .algolia-docsearch-suggestion--content{color:#272296}.aa-cursor .algolia-docsearch-suggestion{background:#ebebfb}.searchbox{display:inline-block;height:32px!important;position:relative;visibility:visible!important;width:200px}.searchbox .algolia-autocomplete{display:block;height:100%;width:100%}.searchbox__wrapper{height:100%;position:relative;width:100%;z-index:999}.searchbox__input{-webkit-appearance:none;appearance:none;background:#fff!important;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;display:inline-block;font-size:12px;height:100%;padding:0 26px 0 32px;transition:box-shadow .4s,background .4s;vertical-align:middle;white-space:normal;width:100%}.searchbox__reset,.searchbox__submit{font-size:inherit;-webkit-user-select:none;position:absolute}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{background:#fff;box-shadow:inset 0 0 0 1px #aaa;outline:0}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{background-color:#458ee100;border:0;border-radius:16px 0 0 16px;height:100%;left:0;margin:0;padding:0;right:inherit;text-align:center;top:0;user-select:none;vertical-align:middle;width:32px}.searchbox__submit:before{content:"";display:inline-block;height:100%;margin-right:-4px;vertical-align:middle}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion,.dropdownNavbarItemMobile_lYhX,.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit svg{height:14px;vertical-align:middle;width:14px;fill:#6d7e96}.searchbox__reset{background:none;border:0;cursor:pointer;display:block;margin:0;padding:0;right:8px;top:8px;user-select:none;fill:#00000080}.searchbox__reset.hide{display:none}.searchbox__reset svg{display:block;height:8px;margin:4px;width:8px}.searchbox__input:valid~.searchbox__reset{animation-duration:.15s;animation-name:a;display:block}@keyframes a{0%{opacity:0;transform:translate3d(-20%,0,0)}to{opacity:1;transform:none}}.algolia-autocomplete .ds-dropdown-menu:before{background:#373940;border-radius:2px;border-right:1px solid #373940;border-top:1px solid #373940;content:"";display:block;height:14px;position:absolute;top:-7px;transform:rotate(-45deg);width:14px;z-index:1000}.algolia-autocomplete .ds-dropdown-menu{box-shadow:0 1px 0 0 #0003,0 2px 3px 0 #0000001a}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background:#fff;border-radius:4px;overflow:auto;padding:0;position:relative}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;overflow:hidden;padding:0;position:relative}.algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--wrapper{background:#f1f1f1;box-shadow:inset -2px 0 0 #61dafb}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{background:#ffe564;padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight{background:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{background:inherit;box-shadow:inset 0 -2px 0 0 #458ee1cc;color:inherit;padding:0 0 1px}.algolia-autocomplete .algolia-docsearch-suggestion--content{cursor:pointer;display:block;float:right;padding:5.33333px 0 5.33333px 10.66667px;position:relative;width:70%}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{background:#ececec;content:"";display:block;height:100%;left:-1px;position:absolute;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{background-color:#373940;color:#fff;display:none;font-size:14px;font-weight:700;letter-spacing:.08em;margin:0;padding:5px 8px;position:relative;text-transform:uppercase}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{background-color:#fff;float:left;padding:8px 0 0;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{color:#777;display:none;float:left;font-size:.9em;padding:5.33333px 10.66667px;position:relative;text-align:right;width:30%;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{background:#ececec;content:"";display:block;height:100%;position:absolute;right:0;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--highlight{background-color:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{color:#02060c;font-size:.9em;font-weight:700;margin-bottom:4px}.algolia-autocomplete .algolia-docsearch-suggestion--text{color:#63676d;display:block;font-size:.85em;line-height:1.2em;padding-right:2px}.algolia-autocomplete .algolia-docsearch-suggestion--version{color:#a6aab1;display:block;font-size:.65em;padding-right:2px;padding-top:2px}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{background-color:#373940;font-size:1.2em;margin-top:-8px;padding:8px 0;text-align:center;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--no-results .algolia-docsearch-suggestion--text{color:#fff;margin-top:4px}#__docusaurus-base-url-issue-banner-container,.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before,.docSidebarContainer_jheC,.navbarSearchContainer_dESe:empty,.sidebarLogo_wzSP,.themedComponent_VwGe,[data-theme=dark] .lightToggleIcon_FrMP,[data-theme=light] .darkToggleIcon_GjSM,html[data-announcement-bar-initially-dismissed=true] .announcementBar_Zjq0{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{background-color:#ebebeb;border:none;border-radius:3px;color:#222;font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;font-size:90%;padding:1px 5px}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header{color:#fff;display:block}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary .algolia-docsearch-suggestion--subcategory-column{display:block}.algolia-autocomplete .algolia-docsearch-footer{background-color:#fff;float:right;font-size:0;height:30px;line-height:0;width:100%;z-index:2000}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 130 18'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='url(%2523a)' d='M59.4.02h13.3a2.37 2.37 0 0 1 2.38 2.37V15.6a2.37 2.37 0 0 1-2.38 2.36H59.4a2.37 2.37 0 0 1-2.38-2.36V2.38A2.37 2.37 0 0 1 59.4.02'/%3E%3Cpath fill='%2523FFF' d='M66.26 4.56c-2.82 0-5.1 2.27-5.1 5.08 0 2.8 2.28 5.07 5.1 5.07 2.8 0 5.1-2.26 5.1-5.07 0-2.8-2.28-5.07-5.1-5.07zm0 8.65c-2 0-3.6-1.6-3.6-3.56 0-1.97 1.6-3.58 3.6-3.58 1.98 0 3.6 1.6 3.6 3.58a3.58 3.58 0 0 1-3.6 3.57zm0-6.4v2.66c0 .07.08.13.15.1l2.4-1.24c.04-.02.06-.1.03-.14a2.96 2.96 0 0 0-2.46-1.5.1.1 0 0 0-.1.1zm-3.33-1.96-.3-.3a.78.78 0 0 0-1.12 0l-.36.36a.77.77 0 0 0 0 1.1l.3.3c.05.05.13.04.17 0 .2-.25.4-.5.6-.7.23-.23.46-.43.7-.6.07-.04.07-.1.03-.16zm5-.8V3.4a.78.78 0 0 0-.78-.78h-1.83a.78.78 0 0 0-.78.78v.63c0 .07.06.12.14.1a5.7 5.7 0 0 1 1.58-.22c.52 0 1.04.07 1.54.2a.1.1 0 0 0 .13-.1z'/%3E%3Cpath fill='%2523182359' d='M102.16 13.76c0 1.46-.37 2.52-1.12 3.2-.75.67-1.9 1-3.44 1-.56 0-1.74-.1-2.67-.3l.34-1.7c.78.17 1.82.2 2.36.2.86 0 1.48-.16 1.84-.5.37-.36.55-.88.55-1.57v-.35a6 6 0 0 1-.84.3 4.2 4.2 0 0 1-1.2.17 4.5 4.5 0 0 1-1.6-.28 3.4 3.4 0 0 1-1.26-.82 3.7 3.7 0 0 1-.8-1.35c-.2-.54-.3-1.5-.3-2.2 0-.67.1-1.5.3-2.06a3.9 3.9 0 0 1 .9-1.43 4.1 4.1 0 0 1 1.45-.92 5.3 5.3 0 0 1 1.94-.37c.7 0 1.35.1 1.97.2a16 16 0 0 1 1.6.33v8.46zm-5.95-4.2c0 .9.2 1.88.6 2.3.4.4.9.62 1.53.62q.51 0 .96-.15a2.8 2.8 0 0 0 .73-.33V6.7a8.5 8.5 0 0 0-1.42-.17c-.76-.02-1.36.3-1.77.8-.4.5-.62 1.4-.62 2.23zm16.13 0c0 .72-.1 1.26-.32 1.85a4.4 4.4 0 0 1-.9 1.53c-.38.42-.85.75-1.4.98-.54.24-1.4.37-1.8.37-.43 0-1.27-.13-1.8-.36a4.1 4.1 0 0 1-1.4-.97 4.5 4.5 0 0 1-.92-1.52 5 5 0 0 1-.33-1.84c0-.72.1-1.4.32-2s.53-1.1.92-1.5c.4-.43.86-.75 1.4-.98a4.55 4.55 0 0 1 1.78-.34 4.7 4.7 0 0 1 1.8.34c.54.23 1 .55 1.4.97q.57.63.9 1.5c.23.6.35 1.3.35 2zm-2.2 0c0-.92-.2-1.7-.6-2.22-.38-.54-.94-.8-1.64-.8-.72 0-1.27.26-1.67.8s-.58 1.3-.58 2.22c0 .93.2 1.56.6 2.1.38.54.94.8 1.64.8s1.25-.26 1.65-.8c.4-.55.6-1.17.6-2.1m6.97 4.7c-3.5.02-3.5-2.8-3.5-3.27L113.57.92l2.15-.34v10c0 .25 0 1.87 1.37 1.88v1.8zm3.77 0h-2.15v-9.2l2.15-.33v9.54zM119.8 3.74c.7 0 1.3-.58 1.3-1.3 0-.7-.58-1.3-1.3-1.3-.73 0-1.3.6-1.3 1.3 0 .72.58 1.3 1.3 1.3m6.43 1c.7 0 1.3.1 1.78.27.5.18.88.42 1.17.73.28.3.5.74.6 1.18.13.46.2.95.2 1.5v5.47a25 25 0 0 1-1.5.25q-1.005.15-2.25.15a6.8 6.8 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.37-.27-.9-.27-1.44 0-.52.1-.85.3-1.2.2-.37.48-.67.83-.9a3.6 3.6 0 0 1 1.23-.5 7 7 0 0 1 2.2-.1l.83.16V8.4c0-.25-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.18-.34-.3-.58-.4a2.5 2.5 0 0 0-.92-.17c-.5 0-.94.06-1.35.13-.4.08-.75.16-1 .25l-.27-1.74c.27-.1.67-.18 1.2-.28a9.3 9.3 0 0 1 1.65-.14zm.18 7.74c.66 0 1.15-.04 1.5-.1V10.2a5.1 5.1 0 0 0-2-.1c-.23.03-.45.1-.64.2a1.17 1.17 0 0 0-.47.38c-.13.17-.18.26-.18.52 0 .5.17.8.5.98.32.2.74.3 1.3.3zM84.1 4.8c.72 0 1.3.08 1.8.26.48.17.87.42 1.15.73.3.3.5.72.6 1.17.14.45.2.94.2 1.47v5.48a25 25 0 0 1-1.5.26c-.67.1-1.42.14-2.25.14a6.8 6.8 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.38-.27-.9-.27-1.44 0-.53.1-.86.3-1.22s.5-.65.84-.88a3.6 3.6 0 0 1 1.24-.5 7 7 0 0 1 2.2-.1q.39.045.84.15v-.35c0-.24-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.17-.34-.3-.58-.4a2.5 2.5 0 0 0-.9-.15c-.5 0-.96.05-1.37.12-.4.07-.75.15-1 .24l-.26-1.75c.27-.08.67-.17 1.18-.26a9 9 0 0 1 1.66-.15zm.2 7.73c.65 0 1.14-.04 1.48-.1v-2.17a5.1 5.1 0 0 0-1.98-.1c-.24.03-.46.1-.65.18a1.17 1.17 0 0 0-.47.4c-.12.17-.17.26-.17.52 0 .5.18.8.5.98.32.2.75.3 1.3.3zm8.68 1.74c-3.5 0-3.5-2.82-3.5-3.28L89.45.92 91.6.6v10c0 .25 0 1.87 1.38 1.88v1.8z'/%3E%3Cpath fill='%25231D3657' d='M5.03 11.03c0 .7-.26 1.24-.76 1.64q-.75.6-2.1.6c-.88 0-1.6-.14-2.17-.42v-1.2c.36.16.74.3 1.14.38.4.1.78.15 1.13.15.5 0 .88-.1 1.12-.3a.94.94 0 0 0 .35-.77.98.98 0 0 0-.33-.74c-.22-.2-.68-.44-1.37-.72-.72-.3-1.22-.62-1.52-1C.23 8.27.1 7.82.1 7.3c0-.65.22-1.17.7-1.55.46-.37 1.08-.56 1.86-.56.76 0 1.5.16 2.25.48l-.4 1.05c-.7-.3-1.32-.44-1.87-.44-.4 0-.73.08-.94.26a.9.9 0 0 0-.33.72c0 .2.04.38.12.52.08.15.22.3.42.4.2.14.55.3 1.06.52.58.24 1 .47 1.27.67s.47.44.6.7c.12.26.18.57.18.92zM9 13.27c-.92 0-1.64-.27-2.16-.8-.52-.55-.78-1.3-.78-2.24 0-.97.24-1.73.72-2.3.5-.54 1.15-.82 2-.82.78 0 1.4.25 1.85.72.46.48.7 1.14.7 1.97v.67H7.35c0 .58.17 1.02.46 1.33.3.3.7.47 1.24.47.36 0 .68-.04.98-.1a5 5 0 0 0 .98-.33v1.02a3.9 3.9 0 0 1-.94.32 5.7 5.7 0 0 1-1.08.1zm-.22-5.2c-.4 0-.73.12-.97.38s-.37.62-.42 1.1h2.7c0-.48-.13-.85-.36-1.1-.23-.26-.54-.38-.94-.38zm7.7 5.1-.26-.84h-.05c-.28.36-.57.6-.86.74-.28.13-.65.2-1.1.2-.6 0-1.05-.16-1.38-.48-.32-.32-.5-.77-.5-1.34 0-.62.24-1.08.7-1.4.45-.3 1.14-.47 2.07-.5l1.02-.03V9.2c0-.37-.1-.65-.27-.84-.17-.2-.45-.28-.82-.28-.3 0-.6.04-.88.13a7 7 0 0 0-.8.33l-.4-.9a4.4 4.4 0 0 1 1.05-.4 5 5 0 0 1 1.08-.12c.76 0 1.33.18 1.7.5q.6.495.6 1.56v4h-.9zm-1.9-.87c.47 0 .83-.13 1.1-.38.3-.26.43-.62.43-1.08v-.52l-.76.03c-.6.03-1.02.13-1.3.3s-.4.45-.4.82c0 .26.08.47.24.6.16.16.4.23.7.23zm7.57-5.2c.25 0 .46.03.62.06l-.12 1.18a2.4 2.4 0 0 0-.56-.06c-.5 0-.92.16-1.24.5-.3.32-.47.75-.47 1.27v3.1h-1.27V7.23h1l.16 1.05h.05c.2-.36.45-.64.77-.85a1.83 1.83 0 0 1 1.02-.3zm4.12 6.17c-.9 0-1.58-.27-2.05-.8-.47-.52-.7-1.27-.7-2.25 0-1 .24-1.77.73-2.3.5-.54 1.2-.8 2.12-.8.63 0 1.2.1 1.7.34l-.4 1c-.52-.2-.96-.3-1.3-.3-1.04 0-1.55.68-1.55 2.05 0 .67.13 1.17.38 1.5.26.34.64.5 1.13.5a3.23 3.23 0 0 0 1.6-.4v1.1a2.5 2.5 0 0 1-.73.28 4.4 4.4 0 0 1-.93.08m8.28-.1h-1.27V9.5c0-.45-.1-.8-.28-1.02-.18-.23-.47-.34-.88-.34-.53 0-.9.16-1.16.48-.25.3-.38.85-.38 1.6v2.94h-1.26V4.8h1.26v2.12c0 .34-.02.7-.06 1.1h.08a1.76 1.76 0 0 1 .72-.67c.3-.16.66-.24 1.07-.24 1.43 0 2.15.74 2.15 2.2v3.86zM42.2 7.1c.74 0 1.32.28 1.73.82.4.53.62 1.3.62 2.26 0 .97-.2 1.73-.63 2.27-.42.54-1 .82-1.75.82s-1.33-.27-1.75-.8h-.08l-.23.7h-.94V4.8h1.26v2l-.02.64-.03.56h.05c.4-.6 1-.9 1.78-.9zm-.33 1.04c-.5 0-.88.15-1.1.45s-.34.8-.35 1.5v.08c0 .72.12 1.24.35 1.57.23.32.6.48 1.12.48.44 0 .78-.17 1-.53.24-.35.36-.87.36-1.53 0-1.35-.47-2.03-1.4-2.03zm3.24-.92h1.4l1.2 3.37c.18.47.3.92.36 1.34h.04l.18-.72 1.37-4H51l-2.53 6.73c-.46 1.23-1.23 1.85-2.3 1.85-.3 0-.56-.03-.83-.1v-1c.2.05.4.08.65.08.6 0 1.03-.36 1.28-1.06l.22-.56-2.4-5.94z'/%3E%3C/g%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100%;display:block;height:100%;margin-left:auto;margin-right:5px;overflow:hidden;text-indent:-9000px;width:110px}html[data-theme=dark] .algolia-docsearch-footer,html[data-theme=dark] .algolia-docsearch-suggestion--category-header,html[data-theme=dark] .algolia-docsearch-suggestion--wrapper{background:var(--ifm-background-color)!important;color:var(--ifm-font-color-base)!important}html[data-theme=dark] .algolia-docsearch-suggestion--title{color:var(--ifm-font-color-base)!important}html[data-theme=dark] .ds-cursor .algolia-docsearch-suggestion--wrapper{background:var(--ifm-background-surface-color)!important}mark{background-color:#add8e6}.skipToContent_LO7D{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_LO7D:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_NFdY{line-height:0;padding:0}.content_jzxK{font-size:85%;padding:5px 0;text-align:center}.content_jzxK a{color:inherit;-webkit-text-decoration:underline;text-decoration:underline}.announcementBar_Zjq0{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_Toga{flex:0 0 10px}.announcementBarClose_xzy5{align-self:stretch;flex:0 0 30px}.toggle_RbQo{height:2rem;width:2rem}.toggleButton_xBbf{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_xBbf:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_Kpri{cursor:not-allowed}.darkNavbarColorModeToggle_J1Gz:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_HrC1,[data-theme=light] .themedComponent--light_P5aG,html:not([data-theme]) .themedComponent--light_P5aG{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_fvmv{display:none;margin:0}.iconExternalLink_x79Z{margin-left:.3rem}.docMainContainer_Psgd,.docRoot_v1yD{display:flex;width:100%}.docsWrapper_hDk9{display:flex;flex:1 0 auto}.iconLanguage_J5Lo{margin-right:5px;vertical-align:text-bottom}.navbarHideable_YUYf{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_R7Y8{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_K2X5{color:red;white-space:pre-wrap}.errorBoundaryFallback_DZi4{color:red;padding:.55rem}.footerLogoLink_ZlnG{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_ZlnG:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.anchorWithStickyNavbar_VKkZ{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_BfHO{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_hjzs{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.playgroundHeader_qwyd{font-weight:700;letter-spacing:.08rem;padding:.75rem}.playgroundEditorHeader_nLzM{background:var(--ifm-color-emphasis-600);color:var(--ifm-color-content-inverse)}.playgroundPreviewHeader_vpQ2{background:var(--ifm-color-emphasis-200);color:var(--ifm-color-content)}.buttonGroup_F6md button,.codeBlockContainer_GIky{background:var(--prism-background-color);color:var(--prism-color)}.playgroundEditor_PvJ1{font-family:var(--ifm-font-family-monospace)!important}.playgroundPreview_bb8I{border:1px solid var(--ifm-color-emphasis-200);border-bottom-left-radius:var(--ifm-global-radius);border-bottom-right-radius:var(--ifm-global-radius);padding:1rem;position:relative}.codeBlockContainer_GIky{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_SSiY{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Qxw5{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_AAA6{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Qxw5+.codeBlockContent_SSiY .codeBlock_AAA6{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_dKky{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_rA4V{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup_F6md{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup_F6md button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup_F6md button:focus-visible,.buttonGroup_F6md button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_F6md button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_Xwo1{counter-increment:a;display:table-row}.codeLineNumber_ol1t{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_ol1t:before{content:counter(a);opacity:.4}.codeLineContent_m0jq{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_ELHJ{opacity:1!important}.copyButtonIcons_tzcC{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_vXBr,.copyButtonSuccessIcon_Gjy7{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_Gjy7{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_ELHJ .copyButtonIcon_vXBr{opacity:0;transform:scale(.33)}.copyButtonCopied_ELHJ .copyButtonSuccessIcon_Gjy7{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_rjPH{height:1.2rem;width:1.2rem}.details_O2qz{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_O2qz>summary{cursor:pointer;padding-left:1rem;position:relative}.details_O2qz>summary::-webkit-details-marker{display:none}.details_O2qz>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_pqGZ{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_qHz3{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}:not(.containsTaskList_PA1V>li)>.containsTaskList_PA1V{padding-left:0}.img_q4K_{height:auto}.admonition_zW3T{margin-bottom:1em}.admonitionHeading_WfvQ{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_WfvQ:not(:last-child){margin-bottom:.3rem}.admonitionHeading_WfvQ code{text-transform:none}.admonitionIcon_nNYq{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_nNYq svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_zRAH{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_M485{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.heroBanner_UJJx{background-color:#673a83;background-position:100%;background-repeat:no-repeat;background-size:cover;overflow:hidden;padding:4rem 0;position:relative;text-align:center}.env_pRIt .logos_NYVn img,.hero__title img{height:100px}.hero__title{margin-bottom:0}.getStarted_Sjon.button.button--outline.button--secondary:not(:hover),.heroSubtitle_GKHc{color:var(--ifm-color-white)}.buttons_pzbO,.integration_YciV .imgs_h8Em .col{align-items:center;display:flex;justify-content:center}.getStarted_Sjon.button.button--outline.button--secondary:hover{color:var(--ifm-color-gray-900)}.features_keug{align-items:center;display:flex;padding:2rem 0;width:100%}.env_pRIt .coverage_QK8f img,.integration_YciV .imgs_h8Em img,.standards_iWjd img{height:150px}.layer_AnXp p{margin:0;padding:0;text-align:center}.layer_AnXp{align-items:center;display:flex;height:50px;justify-content:center}.layer_AnXp:first-child{background:#673a83;color:#ffffff70}.layer_AnXp:nth-child(2){background:#8339c2;color:#ffffff70}.layer_AnXp:last-child{background:#f7df1e;color:#c5a600}.demo_F90y p,.env_pRIt .coverage_QK8f,.env_pRIt .logos_NYVn,.integration_YciV .imgs_h8Em,.intro_y8hm .layers_KOB3,.showcase_SATw .logos_NYVn,.standards_iWjd img{margin-bottom:15px}.env_pRIt .coverage_QK8f{background:#fff;display:block;height:150px;width:636px}.demo_F90y{color:#ad68d8;font-size:16px;margin:25px}.demo_F90y input[type=number],.demo_F90y select{height:30px;width:100px}.demo_F90y label:first-of-type{margin-right:25px}.demo_F90y .exampleTitle_sQvz{font-size:20px;margin-bottom:15px}.demo_F90y .example_HLHF{background-color:#d092f71a;border:.125rem solid #d092f726;border-radius:.5rem;color:#fff;display:block;padding:1rem}@media (min-width:601px){.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{left:inherit!important;right:0!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete .ds-dropdown-menu{background:#0000;border:none;border-radius:4px;height:auto;margin:6px 0 0;max-width:600px;min-width:500px;padding:0;position:relative;text-align:left;top:-6px;z-index:999}}@media (min-width:768px){.algolia-docsearch-suggestion{border-bottom-color:#7671df}.algolia-docsearch-suggestion--subcategory-column{border-right-color:#7671df;color:#4e4726}}@media (min-width:997px){.collapseSidebarButton_fvmv,.expandButton_ArYG{background-color:var(--docusaurus-collapse-button-bg)}.lastUpdated_XIYD{text-align:right}.tocMobile_Hun5{display:none}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_xzy5,.announcementBarPlaceholder_Toga{flex-basis:50px}.collapseSidebarButton_fvmv{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_WgxX{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_SqJs,[dir=rtl] .collapseSidebarButtonIcon_WgxX{transform:rotate(0)}.collapseSidebarButton_fvmv:focus,.collapseSidebarButton_fvmv:hover,.expandButton_ArYG:focus,.expandButton_ArYG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_MkZS{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_avqR{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_avqR{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_eB7v{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_TOTI{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_3DEG{padding-top:0}.sidebarHidden_HOvU{opacity:0;visibility:hidden}.sidebarLogo_wzSP{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_wzSP img{height:2rem;margin-right:.5rem}.expandButton_ArYG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_SqJs{transform:rotate(180deg)}.docSidebarContainer_jheC{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_FmEi{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_YcCD{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_Psgd{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_yaWI{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_ouWo{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_dESe{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.docItemCol_Dlc_{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_BZFI,.footer__link-separator,.navbar__item,.tableOfContents_rRp3{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.docItemContainer_V5AJ{padding:0 .3rem}.navbarSearchContainer_dESe{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media screen and (max-width:966px){.heroBanner_UJJx{padding:2rem}}@media (max-width:600px){.algolia-autocomplete .ds-dropdown-menu{display:block;left:auto!important;max-height:calc(100% - 5rem);max-width:calc(100% - 2rem);position:fixed!important;right:1rem!important;top:50px!important;width:600px;z-index:100}.algolia-autocomplete .ds-dropdown-menu:before{right:6rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_f81x:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_Zjq0,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_Hun5{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_dKky{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.c3893835.css b/assets/css/styles.c3893835.css new file mode 100755 index 000000000..e0d36b59f --- /dev/null +++ b/assets/css/styles.c3893835.css @@ -0,0 +1,25 @@ +.row .col,img{max-width:100%}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.admonition-icon,.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.button,.clean-btn,.close,.menu__link,.navbar__link{cursor:pointer}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.footer__items,.menu__list,.pills__item{list-style-type:none}.tabs__item,hr,img{box-sizing:content-box}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.react-toggle,html{-webkit-tap-highlight-color:transparent}.DocSearch-Hit-content-wrapper,.navbar__title,.text--truncate{text-overflow:ellipsis;white-space:nowrap}.button,.dropdown__link,.navbar__title,.text--truncate{white-space:nowrap}:root{--ra-admonition-background-color:var(--ifm-alert-background-color);--ra-admonition-border-width:var(--ifm-alert-border-width);--ra-admonition-border-color:var(--ifm-alert-border-color);--ra-admonition-border-radius:var(--ifm-alert-border-radius);--ra-admonition-color:var(--ifm-alert-color);--ra-admonition-padding-vertical:var(--ifm-alert-padding-vertical);--ra-admonition-padding-horizontal:var(--ifm-alert-padding-horizontal);--ra-color-note:var(--ifm-color-secondary);--ra-color-important:var(--ifm-color-info);--ra-color-tip:var(--ifm-color-success);--ra-color-caution:var(--ifm-color-warning);--ra-color-warning:var(--ifm-color-danger);--ra-color-text-dark:var(--ifm-color-gray-900)}.admonition{margin-bottom:1em;--ra-admonition-icon-color:var(--ra-admonition-color)}.admonition:not(.alert){--ra-admonition-background-color:var(--ifm-color-primary);background-color:var(--ra-admonition-background-color);border:var(--ra-admonition-border-width) solid var(--ra-admonition-border-color);border-radius:var(--ra-admonition-border-radius);box-sizing:border-box;color:var(--ra-admonition-color);padding:var(--ra-admonition-padding-vertical) var(--ra-admonition-padding-horizontal)}.container,.row .col{padding:0 var(--ifm-spacing-horizontal);width:100%}.admonition h5{margin-bottom:8px;margin-top:0;text-transform:uppercase}.admonition-icon{display:inline-block;margin-right:.2em}.admonition-icon svg{stroke-width:0;fill:var(--ra-admonition-icon-color);stroke:var(--ra-admonition-icon-color);display:inline-block;height:22px;width:22px}.admonition-content>:last-child,blockquote>:last-child{margin-bottom:0}.admonition-note{--ra-admonition-color:var(--ra-color-text-dark)}:root{--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-color-primary:#3578e5;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-secondary:#ebedf0;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-success:#00a400;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-info:#54c7ec;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-warning:#ffba00;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-danger:#fa383e;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:transparent;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:rgba(0,0,0,0.05);--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 rgba(0,0,0,0.1);--ifm-global-shadow-md:0 5px 40px rgba(0,0,0,0.2);--ifm-global-shadow-tl:0 12px 28px 0 rgba(0,0,0,0.2),0 2px 4px 0 rgba(0,0,0,0.1);--ifm-z-index-dropdown:3;--ifm-z-index-fixed:4;--ifm-z-index-overlay:6;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:rgba(0,0,0,.05);--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.3rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-color-emphasis-100);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:inherit;--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:transparent;--ifm-table-stripe-background:var(--ifm-color-emphasis-100);--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-color:#6a737d;--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-padding-horizontal:1rem;--ifm-blockquote-padding-vertical:1rem;--ifm-hr-border-color:var(--ifm-color-emphasis-500);--ifm-hr-border-width:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:#888;--ifm-scrollbar-thumb-hover-background-color:#555;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:var(--ifm-global-border-width);--ifm-alert-color:var(--ifm-font-color-base-inverse);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size-sm:2rem;--ifm-avatar-photo-size-md:3rem;--ifm-avatar-photo-size-lg:4rem;--ifm-avatar-photo-size-xl:6rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.0625rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:1rem;--ifm-breadcrumb-padding-vertical:0.5rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-margin:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:1rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:80vw;--ifm-pagination-border-radius:calc(var(--ifm-global-radius)*var(--ifm-pagination-size-multiplier));--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.0625rem;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-size-multiplier:1;--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.0625rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--ifm-tabs-spacing:0.0625rem;--ifm-color-primary:#8339c2;--ifm-color-primary-dark:#7633af;--ifm-color-primary-darker:#6f30a5;--ifm-color-primary-darkest:#5c2888;--ifm-color-primary-light:#8f4aca;--ifm-color-primary-lighter:#9554cd;--ifm-color-primary-lightest:#a771d5;--ifm-code-font-size:95%;--docusaurus-announcement-bar-height:auto;--collapse-button-bg-color-dark:#2e333a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,0.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,0.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,0.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,0.12);--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:transparent}.navbar--dark,.navbar--primary{--ifm-navbar-search-input-background-color:hsla(0,0%,100%,0.1);--ifm-navbar-search-input-placeholder-color:hsla(0,0%,100%,0.5)}*{box-sizing:border-box}html{-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base)}.container{margin:0 auto;max-width:var(--ifm-container-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.container--fluid{max-width:inherit}.row{display:flex;flex-direction:row;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.markdown>:first-child,.tabItem_1uMI{margin-top:0!important}.row .col{--ifm-col-width:100%;flex:1 0;margin-left:0}.row .col.col--1,.row .col.col--2,.row .col.col--3,.row .col[class*=col--]{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--1{--ifm-col-width:8.33333%}.row .col.col--offset-1{margin-left:8.33333%}.row .col.col--2{--ifm-col-width:16.66667%}.row .col.col--offset-2{margin-left:16.66667%}.row .col.col--3{--ifm-col-width:25%}.row .col.col--offset-3{margin-left:25%}.row .col.col--4{--ifm-col-width:33.33333%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-4{margin-left:33.33333%}.row .col.col--5{--ifm-col-width:41.66667%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--6,.row .col.col--7{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-5{margin-left:41.66667%}.row .col.col--6{--ifm-col-width:50%}.row .col.col--offset-6{margin-left:50%}.row .col.col--7{--ifm-col-width:58.33333%}.row .col.col--offset-7{margin-left:58.33333%}.row .col.col--8{--ifm-col-width:66.66667%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-8{margin-left:66.66667%}.row .col.col--9{--ifm-col-width:75%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--10,.row .col.col--11{flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-9{margin-left:75%}.row .col.col--10{--ifm-col-width:83.33333%}.row .col.col--offset-10{margin-left:83.33333%}.row .col.col--11{--ifm-col-width:91.66667%}.row .col.col--offset-11{margin-left:91.66667%}.row .col.col--12{--ifm-col-width:100%;flex:0 0 var(--ifm-col-width);max-width:var(--ifm-col-width)}.row .col.col--offset-12{margin-left:100%}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.row--align-center,.showcase_1Wsv .logos_2cPk{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid rgba(0,0,0,.1);border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:transparent;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{border-style:none}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before,hr:after,hr:before{content:"";display:table}.markdown:after,hr:after{clear:both}.markdown>h1{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading));margin-top:calc(var(--ifm-h1-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.codeBlockContainer_K1bP,.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical);width:100%}.avatar__photo,.card,.text--truncate,hr{overflow:hidden}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration);transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.breadcrumbs__link:hover,.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:6px solid var(--ifm-color-emphasis-300);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}hr{border:var(--ifm-hr-border-width) solid var(--ifm-hr-border-color);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.playgroundHeader_XRlp,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;padding:0}.alert,.alert a{color:var(--ifm-alert-color)}.alert{background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-radius:var(--ifm-alert-border-radius);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary);--ifm-alert-border-color:var(--ifm-color-primary)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary);--ifm-alert-border-color:var(--ifm-color-secondary);--ifm-alert-color:var(--ifm-color-gray-900)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success);--ifm-alert-border-color:var(--ifm-color-success)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info);--ifm-alert-border-color:var(--ifm-color-info)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning);--ifm-alert-border-color:var(--ifm-color-warning)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger);--ifm-alert-border-color:var(--ifm-color-danger)}.alert a{text-decoration:underline}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0}.avatar,.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.avatar__photo-link{display:block}.avatar__photo{border-radius:50%;height:var(--ifm-avatar-photo-size-md);width:var(--ifm-avatar-photo-size-md)}.avatar__photo--sm{height:var(--ifm-avatar-photo-size-sm);width:var(--ifm-avatar-photo-size-sm)}.avatar__photo--lg{height:var(--ifm-avatar-photo-size-lg);width:var(--ifm-avatar-photo-size-lg)}.avatar__photo--xl{height:var(--ifm-avatar-photo-size-xl);width:var(--ifm-avatar-photo-size-xl)}.avatar__photo+.avatar__intro{margin-left:var(--ifm-avatar-intro-margin)}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.menu__link--sublist:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.avatar--vertical .avatar__intro{margin-left:0}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:first-child){margin-left:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child){margin-right:var(--ifm-breadcrumb-spacing)}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 .5rem;opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__item--active .breadcrumbs__link,.breadcrumbs__item:not(.breadcrumbs__item--active):hover .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.copyButton_Ue-o,.react-toggle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:transparent;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}.button--primary{--ifm-button-border-color:var(--ifm-color-primary)}.button--primary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-primary)}.button--primary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-border-color:var(--ifm-color-primary-darker);--ifm-button-background-color:var(--ifm-color-primary-darker);background-color:var( + --ifm-color-primary-darker + );border-color:var( + --ifm-color-primary-darker + )}.button--secondary{--ifm-button-border-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline){--ifm-button-background-color:var(--ifm-color-secondary)}.button--secondary:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-border-color:var(--ifm-color-secondary-darker);--ifm-button-background-color:var(--ifm-color-secondary-darker);background-color:var( + --ifm-color-secondary-darker + );border-color:var( + --ifm-color-secondary-darker + )}.button--success{--ifm-button-border-color:var(--ifm-color-success)}.button--success:not(.button--outline){--ifm-button-background-color:var(--ifm-color-success)}.button--success:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-border-color:var(--ifm-color-success-darker);--ifm-button-background-color:var(--ifm-color-success-darker);background-color:var( + --ifm-color-success-darker + );border-color:var( + --ifm-color-success-darker + )}.button--info{--ifm-button-border-color:var(--ifm-color-info)}.button--info:not(.button--outline){--ifm-button-background-color:var(--ifm-color-info)}.button--info:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-border-color:var(--ifm-color-info-darker);--ifm-button-background-color:var(--ifm-color-info-darker);background-color:var( + --ifm-color-info-darker + );border-color:var( + --ifm-color-info-darker + )}.button--warning{--ifm-button-border-color:var(--ifm-color-warning)}.button--warning:not(.button--outline){--ifm-button-background-color:var(--ifm-color-warning)}.button--warning:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-border-color:var(--ifm-color-warning-darker);--ifm-button-background-color:var(--ifm-color-warning-darker);background-color:var( + --ifm-color-warning-darker + );border-color:var( + --ifm-color-warning-darker + )}.button--danger{--ifm-button-border-color:var(--ifm-color-danger)}.button--danger:not(.button--outline){--ifm-button-background-color:var(--ifm-color-danger)}.button--danger:not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-border-color:var(--ifm-color-danger-darker);--ifm-button-background-color:var(--ifm-color-danger-darker);background-color:var( + --ifm-color-danger-darker + );border-color:var( + --ifm-color-danger-darker + )}.button-group{display:inline-flex}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:var(--ifm-button-group-margin)}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group>.button--active{z-index:1}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column}.card--full-height,body,html{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style-type:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color)}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{background:none;border:none;color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__menu,.menu__link,.menu__link:hover{transition-duration:var(--ifm-transition-fast);transition-timing-function:var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;transform:translateY(0);visibility:visible}.dropdown--right .dropdown__menu{right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);list-style:none;max-height:calc(100vh - var(--ifm-navbar-height));min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:100%;transform:translateY(-10px);transition-property:opacity,transform,visibility;visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor transparent;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:10rem}.docItemContainer_33ec header+*,.footer__item,.pills__item+.pills__item{margin-top:0}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.footer__items{margin-bottom:0;padding-left:0}[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu{font-weight:var(--ifm-font-weight-semibold);overflow-x:hidden}.menu__list{margin:0;padding-left:0}.menu__list .menu__list{margin-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item{margin-top:.25rem}.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__link{border-radius:.25rem;display:flex;justify-content:space-between;line-height:1.25;padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal);position:relative}.menu__link,.menu__link:hover{color:var(--ifm-menu-color);transition-property:color,background}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-timing-function:ease-in-out;visibility:hidden;left:0;top:0}.menu__link:hover{background:var(--ifm-menu-color-background-hover);text-decoration:none}.menu__link--sublist:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;content:" ";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;min-width:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background:var(--ifm-menu-color-background-active)}.menu--responsive .menu__button{bottom:2rem;display:none;position:fixed;right:1rem;z-index:var(--ifm-z-index-fixed)}.menu--show{-ms-scroll-chaining:none;background:var(--ifm-background-surface-color);bottom:0;left:0;overscroll-behavior:contain;padding:1rem;position:fixed;right:0;top:0;z-index:var(--ifm-z-index-overlay)}.menu--show .menu__list{display:inherit;opacity:1;transition:opacity var(--ifm-transition-fast) linear}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal);width:100%}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{align-items:stretch;display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;font-weight:700;height:2rem;margin-right:1rem;min-width:0}.navbar__brand:hover{color:inherit;text-decoration:none}.navbar__title{flex:1 1 auto;overflow:hidden}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{height:100%;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.codeBlock_23N8,.navbar__item.dropdown{padding:0}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link{font-weight:var(--ifm-font-weight-semibold);padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal);position:relative;text-decoration:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-color:var(--ifm-color-white);--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-toggle-color:var(--ifm-color-white)}.getStarted_3HA3.button.button--outline.button--secondary:not(:hover),.heroSubtitle_2Z7p,.navbar--dark .navbar__toggle{color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::-moz-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input:-ms-input-placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);overflow:auto;position:fixed;transform:translate3d(-100%,0,0);transition-duration:.25s;transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar--show .navbar-sidebar{transform:translateZ(0)}.navbar-sidebar__backdrop{background-color:rgba(0,0,0,.6);position:fixed;right:0;transition-duration:.1s;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.pagination__item,.pagination__link{display:inline-block}.navbar-sidebar__items{padding:.5rem}.pagination{font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item:not(:first-child){margin-left:var(--ifm-pagination-page-spacing)}.pagination__item:not(:last-child){margin-right:var(--ifm-pagination-page-spacing)}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.docs-wrapper,.pagination-nav{display:flex}.pagination-nav__item{display:flex;flex:1 50%;max-width:50%}.pagination-nav__item--next{text-align:right}.pagination-nav__item+.pagination-nav__item{margin-left:var(--ifm-spacing-horizontal)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);flex-grow:1;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills,.sidebarMenuCloseIcon_1lpH,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{background:var(--ifm-pills-color-background-active);color:var(--ifm-pills-color-active)}.pills__item:not(.pills__item--active):hover{background-color:var(--ifm-pills-color-background-active)}.pills__item:not(:first-child){margin-left:var(--ifm-pills-spacing)}.pills__item:not(:last-child){margin-right:var(--ifm-pills-spacing)}.pills--block{display:flex;justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid transparent;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;margin:0;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#18191a;--ifm-background-surface-color:#242526;--ifm-hover-overlay:hsla(0,0%,100%,0.05);--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:hsla(0,0%,100%,0.1);--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,0.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,0.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,0.5),0 -4px 8px 0 rgba(0,0,0,0.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}#nprogress .bar{background:#29d;height:2px;left:0;position:fixed;top:0;width:100%;z-index:7}#nprogress .peg{box-shadow:0 0 10px #29d,0 0 5px #29d;height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}#docusaurus-base-url-issue-banner-container,.collapseSidebarButton_1CGd,.sidebarLogo_3h0W,.themedImage_1VuW,html[data-announcement-bar-initially-dismissed=true] .announcementBar_3WsW{display:none}.skipToContent_1oUP{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_1oUP:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.announcementBar_3WsW{background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);height:var(--docusaurus-announcement-bar-height);position:relative;width:100%}.announcementBarClose_38nx{font-size:1.25rem;height:100%;position:absolute;right:0;top:0;width:55px}.announcementBarContent_3EUC{font-size:85%;padding:5px 0;text-align:center;width:100%}.announcementBarCloseable_3myR{margin-right:55px}.announcementBarContent_3EUC a{color:inherit;text-decoration:underline}.react-toggle{cursor:pointer;position:relative;touch-action:pan-x;user-select:none}.react-toggle-screenreader-only{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;position:absolute;width:1px}.react-toggle--disabled{cursor:not-allowed}.react-toggle-track{background-color:#4d4d4d;border-radius:30px;height:24px;transition:.2s;width:50px}.react-toggle-track-check,.react-toggle-track-x{bottom:0;height:10px;margin:auto 0;top:0;position:absolute}.react-toggle-track-check{left:8px;opacity:0;transition:opacity .25s;width:14px}.react-toggle--checked .react-toggle-track-check,.react-toggle-track-x,[data-theme=dark] .react-toggle .react-toggle-track-check{opacity:1;transition:opacity .25s}.react-toggle-track-x{right:10px;width:10px}.react-toggle--checked .react-toggle-track-x,[data-theme=dark] .react-toggle .react-toggle-track-x{opacity:0}.react-toggle-thumb{background-color:#fafafa;border:1px solid #4d4d4d;border-radius:50%;height:22px;left:1px;position:absolute;top:1px;transition:.25s;width:22px}.react-toggle--checked .react-toggle-thumb,[data-theme=dark] .react-toggle .react-toggle-thumb{left:27px}.react-toggle--focus .react-toggle-thumb,.react-toggle:hover .react-toggle-thumb{box-shadow:0 0 2px 3px var(--ifm-color-primary)}.react-toggle:active:not(.react-toggle--disabled) .react-toggle-thumb{box-shadow:0 0 5px 5px var(--ifm-color-primary)}.toggle_71bT{align-items:center;display:flex;height:10px;justify-content:center;width:10px}.toggle_71bT:before{position:absolute}.iconExternalLink_3J9K{margin-left:.3rem;position:relative;top:1px}html[data-theme=dark] .themedImage--dark_hz6m,html[data-theme=light] .themedImage--light_3UqQ{display:initial}.navbarHideable_2qcr{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_3yey{transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_MyFc{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.codeBlockContent_hGly:hover>.copyButton_Ue-o,.codeBlockTitle_eoMF:hover+.codeBlockContent_hGly .copyButton_Ue-o,.copyButton_Ue-o:focus,.footerLogoLink_MyFc:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.main-wrapper{flex:1 0 auto}.docusaurus-mt-lg{margin-top:3rem}.tabItemActive_2DSg{-webkit-animation:.5s ease-in-out 5 a;animation:.5s ease-in-out 5 a}@-webkit-keyframes a{0%{background-color:var(--ifm-hover-overlay)}to{background-color:transparent}}@keyframes a{0%{background-color:var(--ifm-hover-overlay)}to{background-color:transparent}}.tableOfContents_35-E{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.iconEdit_2_ui{margin-right:.3em;vertical-align:sub}.sidebarMenuIcon_fgN0{vertical-align:middle}.sidebarMenuCloseIcon_1lpH{align-items:center;display:inline-flex;font-size:1.5rem;height:24px;justify-content:center;line-height:.9;width:24px}.menu__list .menu__list{overflow-y:hidden;transition:height var(--ifm-transition-fast) linear;will-change:height}.menu__list-item--collapsed .menu__list{overflow:hidden;height:0!important}.playgroundHeader_XRlp{font-weight:700;letter-spacing:.08rem;padding:.75rem}.playgroundEditorHeader_1Mbl{background:var(--ifm-color-emphasis-600);color:var(--ifm-color-content-inverse)}.playgroundPreviewHeader_QSn8{background:var(--ifm-color-emphasis-200);color:var(--ifm-color-content)}.playgroundEditor_2ORJ{font-family:var(--ifm-font-family-monospace)!important}.playgroundPreview_1LSg{border:1px solid var(--ifm-color-emphasis-200);border-bottom-left-radius:var(--ifm-global-radius);border-bottom-right-radius:var(--ifm-global-radius);padding:1rem;position:relative}.codeBlockContent_hGly{direction:ltr;position:relative}.codeBlockTitle_eoMF{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:var(--ifm-global-radius);border-top-right-radius:var(--ifm-global-radius);font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlockWithTitle_2JqI{border-top-left-radius:0;border-top-right-radius:0}.copyButton_Ue-o{background:rgba(0,0,0,.3);border-radius:var(--ifm-global-radius);color:var(--ifm-color-white);opacity:0;padding:.4rem .5rem;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2);transition:opacity .2s ease-in-out;user-select:none}.DocSearch-Button,.DocSearch-Help{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.codeBlockLines_39YC{display:flex;flex-direction:column;float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.anchor{display:block;position:relative;top:-.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast)}.enhancedAnchor_2LWZ{top:calc(var(--ifm-navbar-height)*-1 - .5rem)}.h1Heading_27L5{font-size:3rem;margin-bottom:calc(var(--ifm-leading-desktop)*var(--ifm-leading))}.lastUpdated_3DPF{font-size:smaller;font-style:italic;margin-top:.2rem}.docMainContainer_3ufF,.docPage_31aa{display:flex;width:100%}.heroBanner_1_kt{background-color:#673a83;background-position:100%;background-repeat:no-repeat;background-size:cover;overflow:hidden;padding:4rem 0;position:relative;text-align:center}.env_1hTc .logos_2cPk img,.hero__title img{height:100px}.hero__title{margin-bottom:0}.buttons_2_kI,.integration_wQAR .imgs_6AVb .col{align-items:center;display:flex;justify-content:center}.features_plcZ,.layer_36aq{align-items:center;display:flex}.getStarted_3HA3.button.button--outline.button--secondary:hover{color:var(--ifm-color-gray-900)}.features_plcZ{padding:2rem 0;width:100%}.env_1hTc .coverage_2yTM img,.integration_wQAR .imgs_6AVb img,.standards_2tvp img{height:150px}.layer_36aq p{margin:0;padding:0;text-align:center}.layer_36aq{height:50px;justify-content:center}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.layer_36aq:first-child{background:#673a83;color:hsla(0,0%,100%,.44)}.layer_36aq:nth-child(2){background:#8339c2;color:hsla(0,0%,100%,.44)}.layer_36aq:last-child{background:#f7df1e;color:#c5a600}.demo_2dK- p,.env_1hTc .coverage_2yTM,.env_1hTc .logos_2cPk,.integration_wQAR .imgs_6AVb,.intro_KvgO .layers_1bsY,.showcase_1Wsv .logos_2cPk,.standards_2tvp img{margin-bottom:15px}.env_1hTc .coverage_2yTM{background:#fff;display:block;height:150px;width:636px}.demo_2dK-{color:#ad68d8;font-size:16px;margin:25px}.demo_2dK- input[type=number],.demo_2dK- select{height:30px;width:100px}.demo_2dK- label:first-of-type{margin-right:25px}.demo_2dK- .exampleTitle_2Y-S{font-size:20px;margin-bottom:15px;text-transform:uppercase}.demo_2dK- .example_3OE2{background-color:rgba(208,146,247,.1);border:.125rem solid rgba(208,146,247,.15);border-radius:.5rem;color:#fff;display:block;padding:1rem}.searchQueryInput_35WP,.searchVersionInput_3Dkp{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_35WP:focus,.searchVersionInput_3Dkp:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_35WP::-moz-placeholder{color:var(--docsearch-muted-color)}.searchQueryInput_35WP:-ms-input-placeholder{color:var(--docsearch-muted-color)}.searchQueryInput_35WP::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_3okB{font-size:.9rem;font-weight:700}.algoliaLogo_hvIi{max-width:150px}.algoliaLogoPathFill_wnAy{fill:var(--ifm-font-color-base)}.searchResultItem_3EK0{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_3ioS{font-weight:400;margin-bottom:0}.searchResultItemPath_1-7G{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_17EU{font-style:italic;margin:.5rem 0 0}.loadingSpinner_EGxz{-webkit-animation:1s linear infinite b;animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@-webkit-keyframes b{to{transform:rotate(1turn)}}@keyframes b{to{transform:rotate(1turn)}}.loader_1VUO{margin-top:2rem}.search-result-match{background:rgba(255,215,142,.25);color:var(--docsearch-hit-color);padding:.09em 0}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding-bottom:2px;position:relative;top:-1px;width:20px}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:4}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:0 0;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;-moz-appearance:none;border:0;cursor:pointer}.DocSearch-Input::-moz-placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input:-ms-input-placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{-webkit-animation:.1s ease-in forwards c;animation:.1s ease-in forwards c;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:focus{outline:0}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:0 0}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:2}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:5}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding-bottom:1px;width:20px}@-webkit-keyframes c{0%{opacity:0}to{opacity:1}}@keyframes c{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container{z-index:calc(var(--ifm-z-index-fixed) + 1)}@media (min-width:997px){.searchBox_1Doo{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.sidebar_15mo{display:flex;flex-direction:column;height:100%;max-height:100vh;padding-top:var(--ifm-navbar-height);position:sticky;top:0;transition:opacity 50ms;width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_267A{padding-top:0}.sidebarHidden_2kNb{height:0;opacity:0;overflow:hidden;visibility:hidden}.sidebarLogo_3h0W{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_3h0W img{height:2rem;margin-right:.5rem}.menu_Bmed{flex-grow:1;padding:.5rem}.menuLinkText_2aKo{cursor:auto}.menuLinkText_2aKo:hover{background:none}.menuWithAnnouncementBar_2WvA{margin-bottom:var(--docusaurus-announcement-bar-height)}.collapseSidebarButton_1CGd{background-color:var(--ifm-button-background-color);border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_3E-R{margin-top:4px;transform:rotate(180deg)}.expandSidebarButtonIcon_1naQ,html[dir=rtl] .collapseSidebarButtonIcon_3E-R{transform:rotate(0)}html[data-theme=dark] .collapseSidebarButton_1CGd,html[data-theme=dark] .collapsedDocSidebar_2JMH:focus,html[data-theme=dark] .collapsedDocSidebar_2JMH:hover{background-color:var(--collapse-button-bg-color-dark)}.collapsedDocSidebar_2JMH:focus,.collapsedDocSidebar_2JMH:hover,html[data-theme=dark] .collapseSidebarButton_1CGd:focus,html[data-theme=dark] .collapseSidebarButton_1CGd:hover{background-color:var(--ifm-color-emphasis-200)}.docMainContainer_3ufF{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_3NYZ{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docSidebarContainer_3Kbt{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_3pA8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.collapsedDocSidebar_2JMH{align-items:center;display:flex;height:100%;justify-content:center;max-height:100vh;position:sticky;top:0;transition:background-color var(--ifm-transition-fast) ease}html[dir=rtl] .expandSidebarButtonIcon_1naQ{transform:rotate(180deg)}.docItemWrapperEnhanced_2vyJ{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}}@media only screen and (min-width:997px){.docItemCol_3FnS{max-width:75%!important}.lastUpdated_3DPF{text-align:right}}@media screen and (min-width:1024px){:root{--docusaurus-announcement-bar-height:30px}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:1200px){h1{--ifm-h1-font-size:calc(1.375rem + 1.5vw)}}@media screen and (max-width:997px){.displayOnlyInLargeViewport_GrZ2{display:none!important}}@media (max-width:996px){.row .col.col.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0;max-width:var(--ifm-col-width)}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator,.navbar__item{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.menu--responsive .menu__button,.navbar__toggle{display:inherit}.menu--responsive:not(.menu--show) .menu__list{display:none;opacity:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.pills--block .pills__item:not(:first-child){margin-top:var(--ifm-pills-spacing)}.pills--block .pills__item:not(:last-child){margin-bottom:var(--ifm-pills-spacing)}.tabs--block .tabs__item:not(:first-child){margin-top:var(--ifm-tabs-spacing)}.tabs--block .tabs__item:not(:last-child){margin-bottom:var(--ifm-tabs-spacing)}.searchBox_1Doo{position:absolute;right:var(--ifm-navbar-padding-horizontal)}}@media only screen and (max-width:996px){.tableOfContents_35-E{display:none}.docItemContainer_gpai{padding:0 .3rem}.searchQueryColumn_22lI,.searchResultsColumn_3okB{max-width:60%!important}.searchLogoColumn_21YU,.searchVersionColumn_1eqi{max-width:40%!important}.searchLogoColumn_21YU{padding-left:0!important}}@media screen and (max-width:966px){.heroBanner_1_kt{padding:2rem}}@media (max-width:750px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}}@media screen and (max-width:576px){.announcementBarClose_38nx{width:35px}.announcementBarContent_3EUC{width:auto}.announcementBarCloseable_3myR{margin-right:35px}.searchQueryColumn_22lI{max-width:100%!important}.searchVersionColumn_1eqi{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (pointer:fine){.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);-webkit-animation:none;animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}@media print{.announcementBar_3WsW,.footer,.menu,.navbar,.pagination-nav,.table-of-contents{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_39YC{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/images/distribute-libs-6dd93d10e579935a5db51016ef6e7404.svg b/assets/images/distribute-libs-6dd93d10e579935a5db51016ef6e7404.svg old mode 100644 new mode 100755 diff --git a/assets/images/polyfills-202467d29ade4e2483d807fcee84da2a.svg b/assets/images/polyfills-202467d29ade4e2483d807fcee84da2a.svg deleted file mode 100644 index cd1f7af04..000000000 --- a/assets/images/polyfills-202467d29ade4e2483d807fcee84da2a.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - Intl.getCanonicalLocalesIntl.PluralRulesIntl.RelativeTimeFormatIntl.LocaleIntl.DisplayNamesIntl.NumberFormatIntl.ListFormatIntl.DateTimeFormatIntl.DurationFormatIntl.supportedValuesOf \ No newline at end of file diff --git a/assets/images/polyfills-4df8c61ae8ac32450d511a456fc7356f.svg b/assets/images/polyfills-4df8c61ae8ac32450d511a456fc7356f.svg new file mode 100755 index 000000000..22ff44679 --- /dev/null +++ b/assets/images/polyfills-4df8c61ae8ac32450d511a456fc7356f.svg @@ -0,0 +1,16 @@ + + + + + + + Intl.getCanonicalLocalesIntl.PluralRulesIntl.RelativeTimeFormatIntl.LocaleIntl.DisplayNamesIntl.NumberFormatIntl.ListFormatIntl.DateTimeFormat \ No newline at end of file diff --git a/assets/images/simple-workflow-ab306e2651814f71649fdf3ea8a5f51c.svg b/assets/images/simple-workflow-ab306e2651814f71649fdf3ea8a5f51c.svg deleted file mode 100644 index 3885fb0c3..000000000 --- a/assets/images/simple-workflow-ab306e2651814f71649fdf3ea8a5f51c.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - ExtractionSaveDevelopBuildTestTranslationEditor \ No newline at end of file diff --git a/assets/images/workflow-cfcf0fe32b9a2d1097fcf2f11ed8b384.svg b/assets/images/workflow-cfcf0fe32b9a2d1097fcf2f11ed8b384.svg old mode 100644 new mode 100755 diff --git a/assets/js/0058b4c6.86e653c4.js b/assets/js/0058b4c6.86e653c4.js deleted file mode 100644 index c28f6d061..000000000 --- a/assets/js/0058b4c6.86e653c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[849],{6164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Installation","href":"/docs/getting-started/installation","docId":"getting-started/installation","unlisted":false},{"type":"link","label":"Application Workflow","href":"/docs/getting-started/application-workflow","docId":"getting-started/application-workflow","unlisted":false},{"type":"link","label":"Message Declaration","href":"/docs/getting-started/message-declaration","docId":"getting-started/message-declaration","unlisted":false},{"type":"link","label":"Message Extraction","href":"/docs/getting-started/message-extraction","docId":"getting-started/message-extraction","unlisted":false},{"type":"link","label":"Message Distribution","href":"/docs/getting-started/message-distribution","docId":"getting-started/message-distribution","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Guides","items":[{"type":"link","label":"Develop with formatjs","href":"/docs/guides/develop","docId":"guides/develop","unlisted":false},{"type":"link","label":"Bundling with formatjs","href":"/docs/guides/bundler-plugins","docId":"guides/bundler-plugins","unlisted":false},{"type":"link","label":"Testing with formatjs","href":"/docs/guides/testing","docId":"guides/testing","unlisted":false},{"type":"link","label":"Distributing i18n-friendly libraries","href":"/docs/guides/distribute-libraries","docId":"guides/distribute-libraries","unlisted":false},{"type":"link","label":"Runtime Requirements","href":"/docs/guides/runtime-requirements","docId":"guides/runtime-requirements","unlisted":false},{"type":"link","label":"Advanced Usage","href":"/docs/guides/advanced-usage","docId":"guides/advanced-usage","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Core Concepts","items":[{"type":"link","label":"Basic Internationalization Principles","href":"/docs/core-concepts/basic-internationalization-principles","docId":"core-concepts/basic-internationalization-principles","unlisted":false},{"type":"link","label":"Message Syntax","href":"/docs/core-concepts/icu-syntax","docId":"core-concepts/icu-syntax","unlisted":false}],"collapsed":true,"collapsible":true}],"api":[{"type":"category","label":"react-intl","items":[{"type":"link","label":"Overview","href":"/docs/react-intl","docId":"react-intl","unlisted":false},{"type":"link","label":"Components","href":"/docs/react-intl/components","docId":"react-intl/components","unlisted":false},{"type":"link","label":"Imperative API","href":"/docs/react-intl/api","docId":"react-intl/api","unlisted":false},{"type":"link","label":"Upgrade Guide (v4 -> v5)","href":"/docs/react-intl/upgrade-guide-5x","docId":"react-intl/upgrade-guide-5x","unlisted":false},{"type":"link","label":"Upgrade Guide (v3 -> v4)","href":"/docs/react-intl/upgrade-guide-4x","docId":"react-intl/upgrade-guide-4x","unlisted":false},{"type":"link","label":"Upgrade Guide (v2 -> v3)","href":"/docs/react-intl/upgrade-guide-3x","docId":"react-intl/upgrade-guide-3x","unlisted":false},{"type":"link","label":"Upgrade Guide (v1 -> v2)","href":"/docs/react-intl/upgrade-guide-2x","docId":"react-intl/upgrade-guide-2x","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"@formatjs/intl","items":[{"type":"link","label":"Core FormatJS Intl","href":"/docs/intl","docId":"intl","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"vue-intl","items":[{"type":"link","label":"Vue Plugin for formatjs","href":"/docs/vue-intl","docId":"vue-intl","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"intl-messageformat","items":[{"type":"link","label":"Intl MessageFormat","href":"/docs/intl-messageformat","docId":"intl-messageformat","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"icu-messageformat-parser","items":[{"type":"link","label":"ICU MessageFormat Parser","href":"/docs/icu-messageformat-parser","docId":"icu-messageformat-parser","unlisted":false}],"collapsed":true,"collapsible":true}],"polyfills":[{"type":"category","label":"Polyfills","items":[{"type":"link","label":"Polyfills","href":"/docs/polyfills","docId":"polyfills","unlisted":false},{"type":"link","label":"Intl.DateTimeFormat (ESNext)","href":"/docs/polyfills/intl-datetimeformat","docId":"polyfills/intl-datetimeformat","unlisted":false},{"type":"link","label":"Intl.DisplayNames","href":"/docs/polyfills/intl-displaynames","docId":"polyfills/intl-displaynames","unlisted":false},{"type":"link","label":"Intl.DurationFormat","href":"/docs/polyfills/intl-durationformat","docId":"polyfills/intl-durationformat","unlisted":false},{"type":"link","label":"Intl.getCanonicalLocales","href":"/docs/polyfills/intl-getcanonicallocales","docId":"polyfills/intl-getcanonicallocales","unlisted":false},{"type":"link","label":"Intl.ListFormat","href":"/docs/polyfills/intl-listformat","docId":"polyfills/intl-listformat","unlisted":false},{"type":"link","label":"Intl.Locale","href":"/docs/polyfills/intl-locale","docId":"polyfills/intl-locale","unlisted":false},{"type":"link","label":"Intl.LocaleMatcher","href":"/docs/polyfills/intl-localematcher","docId":"polyfills/intl-localematcher","unlisted":false},{"type":"link","label":"Intl.NumberFormat (ESNext)","href":"/docs/polyfills/intl-numberformat","docId":"polyfills/intl-numberformat","unlisted":false},{"type":"link","label":"Intl.PluralRules","href":"/docs/polyfills/intl-pluralrules","docId":"polyfills/intl-pluralrules","unlisted":false},{"type":"link","label":"Intl.RelativeTimeFormat","href":"/docs/polyfills/intl-relativetimeformat","docId":"polyfills/intl-relativetimeformat","unlisted":false},{"type":"link","label":"Intl.Segmenter","href":"/docs/polyfills/intl-segmenter","docId":"polyfills/intl-segmenter","unlisted":false},{"type":"link","label":"Intl.supportedValuesOf","href":"/docs/polyfills/intl-supportedvaluesof","docId":"polyfills/intl-supportedvaluesof","unlisted":false}],"collapsed":true,"collapsible":true}],"tooling":[{"type":"category","label":"Tooling","items":[{"type":"link","label":"CLI","href":"/docs/tooling/cli","docId":"tooling/cli","unlisted":false},{"type":"link","label":"eslint-plugin-formatjs","href":"/docs/tooling/linter","docId":"tooling/linter","unlisted":false},{"type":"link","label":"babel-plugin-formatjs","href":"/docs/tooling/babel-plugin","docId":"tooling/babel-plugin","unlisted":false},{"type":"link","label":"ts-transformer","href":"/docs/tooling/ts-transformer","docId":"tooling/ts-transformer","unlisted":false},{"type":"link","label":"swc-plugin","href":"/docs/tooling/swc-plugin","docId":"tooling/swc-plugin","unlisted":false}],"collapsed":true,"collapsible":true}]},"docs":{"core-concepts/basic-internationalization-principles":{"id":"core-concepts/basic-internationalization-principles","title":"Basic Internationalization Principles","description":"What Is Internationalization and Why Does It Matter?","sidebar":"docs"},"core-concepts/icu-syntax":{"id":"core-concepts/icu-syntax","title":"Message Syntax","description":"If you are translating text you\'ll need a way for your translators to express the subtleties of spelling, grammar, and conjugation inherent in each language. We use the ICU Message syntax which is also used in Java and PHP.","sidebar":"docs"},"getting-started/application-workflow":{"id":"getting-started/application-workflow","title":"Application Workflow","description":"While our Installation guide can help you get started, this guide gives you an overview how your daily translation workflow might look like.","sidebar":"docs"},"getting-started/installation":{"id":"getting-started/installation","title":"Installation","description":"formatjs is a set of libraries that help you setup internationalization in any project whether it\'s React or not.","sidebar":"docs"},"getting-started/message-declaration":{"id":"getting-started/message-declaration","title":"Message Declaration","description":"While you can declare your messages using only ids, we highly recommend declaring defaultMessages inline along with their usages because of the following reasons:","sidebar":"docs"},"getting-started/message-distribution":{"id":"getting-started/message-distribution","title":"Message Distribution","description":"Now that you\'ve declared your messages, extracted them, sent them to your translation vendor and they have given you back the translated JSON of the same format, it\'s time to talk about how to distribute & consume the translated JSON.","sidebar":"docs"},"getting-started/message-extraction":{"id":"getting-started/message-extraction","title":"Message Extraction","description":"Now that you\'ve declared some messages, it\'s time to extract them.","sidebar":"docs"},"guides/advanced-usage":{"id":"guides/advanced-usage","title":"Advanced Usage","description":"react-intl is optimized for both runtime & compile time rendering. Below are a few guidelines you can follow if you have a strict performance budget.","sidebar":"docs"},"guides/bundler-plugins":{"id":"guides/bundler-plugins","title":"Bundling with formatjs","description":"Now that you\'ve had a working pipeline. It\'s time to dive deeper on how to optimize the build with formatjs. From Message Extraction guide, we explicitly recommend against explicit ID due to potential collision in large application. While our extractor can insert IDs in the extracted JSON file, you\'d need to also insert those IDs into the compiled JS output. This guide will cover how to do that.","sidebar":"docs"},"guides/develop":{"id":"guides/develop","title":"Develop with formatjs","description":"Aside from a strong focus on facilitating i18n production pipeline, formatjs also aims to improve i18n DevEx with our eslint-plugin-formatjs.","sidebar":"docs"},"guides/distribute-libraries":{"id":"guides/distribute-libraries","title":"Distributing i18n-friendly libraries","description":"In larger scale applications/monorepos, not all components/libraries live within the same repo/project and they might get distributed differently. While there are multiple ways to solve this problem, this guide aims to provide a guidance that we\'ve seen working quite well with large engineering orgs.","sidebar":"docs"},"guides/runtime-requirements":{"id":"guides/runtime-requirements","title":"Runtime Requirements","description":"Browser","sidebar":"docs"},"guides/testing":{"id":"guides/testing","title":"Testing with formatjs","description":"Intl APIs requirements","sidebar":"docs"},"icu-messageformat-parser":{"id":"icu-messageformat-parser","title":"ICU MessageFormat Parser","description":"Parses ICU Message strings into an AST via JavaScript.","sidebar":"api"},"intl":{"id":"intl","title":"Core FormatJS Intl","description":"This library contains core intl API that is used by react-intl.","sidebar":"api"},"intl-messageformat":{"id":"intl-messageformat","title":"Intl MessageFormat","description":"Formats ICU Message strings with number, date, plural, and select placeholders to create localized messages.","sidebar":"api"},"polyfills":{"id":"polyfills","title":"Polyfills","description":"One of our goals is to provide developers with access to newest ECMA-402 Intl APIs. Therefore, FormatJS suite also provide multiple high quality polyfills that are fully tested using the Official ECMAScript Conformance Test Suite.","sidebar":"polyfills"},"polyfills/intl-datetimeformat":{"id":"polyfills/intl-datetimeformat","title":"Intl.DateTimeFormat (ESNext)","description":"A spec-compliant polyfill for Intl.DateTimeFormat fully tested by the official ECMAScript Conformance test suite","sidebar":"polyfills"},"polyfills/intl-displaynames":{"id":"polyfills/intl-displaynames","title":"Intl.DisplayNames","description":"A polyfill for Intl.DisplayNames.","sidebar":"polyfills"},"polyfills/intl-durationformat":{"id":"polyfills/intl-durationformat","title":"Intl.DurationFormat","description":"A spec-compliant polyfill for Intl.DurationFormat","sidebar":"polyfills"},"polyfills/intl-getcanonicallocales":{"id":"polyfills/intl-getcanonicallocales","title":"Intl.getCanonicalLocales","description":"A spec-compliant polyfill/ponyfill for Intl.getCanonicalLocales tested by the official ECMAScript Conformance test suite","sidebar":"polyfills"},"polyfills/intl-listformat":{"id":"polyfills/intl-listformat","title":"Intl.ListFormat","description":"A spec-compliant polyfill for Intl.ListFormat fully tested by the official ECMAScript Conformance test suite","sidebar":"polyfills"},"polyfills/intl-locale":{"id":"polyfills/intl-locale","title":"Intl.Locale","description":"A spec-compliant polyfill/ponyfill for Intl.Locale tested by the official ECMAScript Conformance test suite","sidebar":"polyfills"},"polyfills/intl-localematcher":{"id":"polyfills/intl-localematcher","title":"Intl.LocaleMatcher","description":"A spec-compliant ponyfill for Intl.LocaleMatcher. Since this is only stage-1 this package is a ponyfill instead of polyfill.","sidebar":"polyfills"},"polyfills/intl-numberformat":{"id":"polyfills/intl-numberformat","title":"Intl.NumberFormat (ESNext)","description":"A polyfill for ESNext Intl.NumberFormat and Number.prototype.toLocaleString.","sidebar":"polyfills"},"polyfills/intl-pluralrules":{"id":"polyfills/intl-pluralrules","title":"Intl.PluralRules","description":"A spec-compliant polyfill for Intl.PluralRules fully tested by the official ECMAScript Conformance test suite","sidebar":"polyfills"},"polyfills/intl-relativetimeformat":{"id":"polyfills/intl-relativetimeformat","title":"Intl.RelativeTimeFormat","description":"A spec-compliant polyfill for Intl.RelativeTimeFormat fully tested by the official ECMAScript Conformance test suite","sidebar":"polyfills"},"polyfills/intl-segmenter":{"id":"polyfills/intl-segmenter","title":"Intl.Segmenter","description":"A polyfill for Intl.Segmenter.","sidebar":"polyfills"},"polyfills/intl-supportedvaluesof":{"id":"polyfills/intl-supportedvaluesof","title":"Intl.supportedValuesOf","description":"A spec-compliant polyfill/ponyfill for Intl.supportedValuesOf.","sidebar":"polyfills"},"react-intl":{"id":"react-intl","title":"Overview","description":"npm Version","sidebar":"api"},"react-intl/api":{"id":"react-intl/api","title":"Imperative API","description":"There are a few API layers that React Intl provides and is built on. When using React Intl you\'ll be interacting with its API (documented here) and its React components.","sidebar":"api"},"react-intl/components":{"id":"react-intl/components","title":"Components","description":"React Intl has a set of React components that provide a declarative way to setup an i18n context and format dates, numbers, and strings for display in a web UI. The components render React elements by building on React Intl\'s imperative API.","sidebar":"api"},"react-intl/upgrade-guide-2x":{"id":"react-intl/upgrade-guide-2x","title":"Upgrade Guide (v1 -> v2)","description":"Use React 0.14 or 15","sidebar":"api"},"react-intl/upgrade-guide-3x":{"id":"react-intl/upgrade-guide-3x","title":"Upgrade Guide (v2 -> v3)","description":"Breaking API Changes","sidebar":"api"},"react-intl/upgrade-guide-4x":{"id":"react-intl/upgrade-guide-4x","title":"Upgrade Guide (v3 -> v4)","description":"Breaking API Changes","sidebar":"api"},"react-intl/upgrade-guide-5x":{"id":"react-intl/upgrade-guide-5x","title":"Upgrade Guide (v4 -> v5)","description":"Breaking API Changes","sidebar":"api"},"tooling/babel-plugin":{"id":"tooling/babel-plugin","title":"babel-plugin-formatjs","description":"Process string messages for translation from modules that use react-intl, specifically:","sidebar":"tooling"},"tooling/cli":{"id":"tooling/cli","title":"CLI","description":"Installation","sidebar":"tooling"},"tooling/linter":{"id":"tooling/linter","title":"eslint-plugin-formatjs","description":"This eslint plugin allows you to enforce certain rules in your ICU message.","sidebar":"tooling"},"tooling/swc-plugin":{"id":"tooling/swc-plugin","title":"swc-plugin","description":"This has been migrated over to the swc repo itself. You can find the plugin here.","sidebar":"tooling"},"tooling/ts-transformer":{"id":"tooling/ts-transformer","title":"ts-transformer","description":"npm version","sidebar":"tooling"},"vue-intl":{"id":"vue-intl","title":"Vue Plugin for formatjs","description":"This library contains our plugin for Vue.","sidebar":"api"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/0b95a8d8.334bce93.js b/assets/js/0b95a8d8.334bce93.js deleted file mode 100644 index f8467c9ba..000000000 --- a/assets/js/0b95a8d8.334bce93.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5880],{489:(e,t,l)=>{l.r(t),l.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>f,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"polyfills/intl-getcanonicallocales","title":"Intl.getCanonicalLocales","description":"A spec-compliant polyfill/ponyfill for Intl.getCanonicalLocales tested by the official ECMAScript Conformance test suite","source":"@site/docs/polyfills/intl-getcanonicallocales.md","sourceDirName":"polyfills","slug":"/polyfills/intl-getcanonicallocales","permalink":"/docs/polyfills/intl-getcanonicallocales","draft":false,"unlisted":false,"editUrl":"https://github.com/formatjs/formatjs/edit/main/website/docs/polyfills/intl-getcanonicallocales.md","tags":[],"version":"current","lastUpdatedBy":"Long Ho","lastUpdatedAt":1745030748000,"frontMatter":{"id":"intl-getcanonicallocales","title":"Intl.getCanonicalLocales"},"sidebar":"polyfills","previous":{"title":"Intl.DurationFormat","permalink":"/docs/polyfills/intl-durationformat"},"next":{"title":"Intl.ListFormat","permalink":"/docs/polyfills/intl-listformat"}}');var a=l(6106),s=l(8299),i=l(4545),r=l(560);const o={id:"intl-getcanonicallocales",title:"Intl.getCanonicalLocales"},c=void 0,u={},d=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Via polyfill-fastly.io",id:"via-polyfill-fastlyio",level:3},{value:"Simple",id:"simple",level:3},{value:"Dynamic import + capability detection",id:"dynamic-import--capability-detection",level:3},{value:"Tests",id:"tests",level:2}];function p(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(t.p,{children:["A spec-compliant polyfill/ponyfill for ",(0,a.jsx)(t.code,{children:"Intl.getCanonicalLocales"})," tested by the ",(0,a.jsx)(t.a,{href:"https://github.com/tc39/test262",children:"official ECMAScript Conformance test suite"})]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.a,{href:"https://www.npmjs.org/package/@formatjs/intl-getcanonicallocales",children:(0,a.jsx)(t.img,{src:"https://img.shields.io/npm/v/@formatjs/intl-getcanonicallocales.svg?style=flat-square",alt:"npm Version"})}),"\n",(0,a.jsx)(t.img,{src:"https://badgen.net/bundlephobia/minzip/@formatjs/intl-getcanonicallocales",alt:"size"})]}),"\n",(0,a.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n","\n",(0,a.jsxs)(i.A,{groupId:"npm",defaultValue:"npm",values:[{label:"npm",value:"npm"},{label:"yarn",value:"yarn"}],children:[(0,a.jsx)(r.A,{value:"npm",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"npm i @formatjs/intl-getcanonicallocales\n"})})}),(0,a.jsx)(r.A,{value:"yarn",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-sh",children:"yarn add @formatjs/intl-getcanonicallocales\n"})})})]}),"\n",(0,a.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(t.h3,{id:"via-polyfill-fastlyio",children:"Via polyfill-fastly.io"}),"\n",(0,a.jsxs)(t.p,{children:["You can use ",(0,a.jsx)(t.a,{href:"https://polyfill-fastly.io/",children:"polyfill-fastly.io URL Builder"})," to create a polyfill script tag for ",(0,a.jsx)(t.code,{children:"Intl.GetCanonicalLocales"}),". For example:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-html",children:'\x3c!-- Polyfill Intl.GetCanonicalLocales & its dependencies --\x3e\n - + + + + + +Basic Internationalization Principles | Format.JS + + - -
Skip to main content

Basic Internationalization Principles

What Is Internationalization and Why Does It Matter?

-

Internationalized software supports the languages and cultural customs of people throughout the world. The Web reaches all parts of the world. Internationalized web apps provide a great user experience for people everywhere.

-

Localized software adapts to a specific language and culture by translating text into the user's language and formatting data in accordance with the user's expectations. An app is typically localized for a small set of locales.

-

The ECMA-402 JavaScript internationalization specification has an excellent overview.

-

Locales: Language and Region

-

A "locale" refers to the lingual and cultural expectations for a region. It is represented using a "locale code" defined in UTS LDML.

-

This code is comprised of several parts separated by hyphens (-). The first part is a short string representing the language. The second, optional, part is a short string representing the region. Additionally, various extensions and variants can be specified.

-

Typically, web apps are localized to just the language or language-region combination. Examples of such locale codes are:

-
    -
  • en for English
  • -
  • en-US for English as spoken in the United States
  • -
  • en-GB for English as spoken in the United Kingdom
  • -
  • es-AR for Spanish as spoken in Argentina
  • -
  • ar-001 for Arabic as spoken throughout the world
  • -
  • ar-AE for Arabic as spoken in United Arab Emirates
  • -
-

Most internationalized apps only support a small list of locales.

-

Translating Strings

-

You likely have some text in your application that is in a natural language such as English or Japanese. In order to support other locales, you will need to translate these strings.

-

FormatJS provides a mechanism to let you write the core "software" of your application without special code for different translations. The considerations for each locale are encapsulated in your translated strings and our libraries.

-
const messages = {
en: {
GREETING: 'Hello {name}',
},
fr: {
GREETING: 'Bonjour {name}',
},
}
-

We use the ICU Message syntax which is also used in Java, C, PHP and various other platforms.

-

Bundling Translated Strings

-

It is common to organize your translations primarily by locale, because you only need the translations for the user's current locale. Our template and component library integrations are designed to work with the translations for a single locale. If your app is complex, you can further subdivide your translations, such as by page or section of the site.

-

Structure of Code

-

The actual formatting and presentation of data and translated strings typically takes these steps:

-
    -
  1. Determine the user's locale, as described in Runtime Environments guide.
  2. -
  3. Setup one of FormatJS's integrations with the following data: -
      -
    • the user's current locale
    • -
    • translated strings for that locale
    • -
    • optionally, any custom formats
    • -
    -
  4. -
  5. Call the template engine, passing the data that needs formatting.
  6. -
+ +
+
Skip to main content

Basic Internationalization Principles

What Is Internationalization and Why Does It Matter?#

Internationalized software supports the languages and cultural customs of people throughout the world. The Web reaches all parts of the world. Internationalized web apps provide a great user experience for people everywhere.

Localized software adapts to a specific language and culture by translating text into the user's language and formatting data in accordance with the user's expectations. An app is typically localized for a small set of locales.

The ECMA-402 JavaScript internationalization specification has an excellent overview.

Locales: Language and Region#

A "locale" refers to the lingual and cultural expectations for a region. It is represented using a "locale code" defined in UTS LDML.

This code is comprised of several parts separated by hyphens (-). The first part is a short string representing the language. The second, optional, part is a short string representing the region. Additionally, various extensions and variants can be specified.

Typically, web apps are localized to just the language or language-region combination. Examples of such locale codes are:

  • en for English
  • en-US for English as spoken in the United States
  • en-GB for English as spoken in the United Kingdom
  • es-AR for Spanish as spoken in Argentina
  • ar-001 for Arabic as spoken throughout the world
  • ar-AE for Arabic as spoken in United Arab Emirates

Most internationalized apps only support a small list of locales.

Translating Strings#

You likely have some text in your application that is in a natural language such as English or Japanese. In order to support other locales, you will need to translate these strings.

FormatJS provides a mechanism to let you write the core "software" of your application without special code for different translations. The considerations for each locale are encapsulated in your translated strings and our libraries.

const messages = {  en: {    GREETING: 'Hello {name}',  },  fr: {    GREETING: 'Bonjour {name}',  },}

We use the ICU Message syntax which is also used in Java, C, PHP and various other platforms.

Bundling Translated Strings#

It is common to organize your translations primarily by locale, because you only need the translations for the user's current locale. Our template and component library integrations are designed to work with the translations for a single locale. If your app is complex, you can further subdivide your translations, such as by page or section of the site.

Structure of Code#

The actual formatting and presentation of data and translated strings typically takes these steps:

  1. Determine the user's locale, as described in Runtime Environments guide.
  2. Setup one of FormatJS's integrations with the following data:
    • the user's current locale
    • translated strings for that locale
    • optionally, any custom formats
  3. Call the template engine, passing the data that needs formatting.
+ + \ No newline at end of file diff --git a/docs/core-concepts/icu-syntax/index.html b/docs/core-concepts/icu-syntax/index.html old mode 100644 new mode 100755 index 6808f0c25..ab2aa9a60 --- a/docs/core-concepts/icu-syntax/index.html +++ b/docs/core-concepts/icu-syntax/index.html @@ -1,151 +1,25 @@ - + - -Message Syntax | Format.JS - - + + + + + +Message Syntax | Format.JS + + - -
Skip to main content

Message Syntax

If you are translating text you'll need a way for your translators to express the subtleties of spelling, grammar, and conjugation inherent in each language. We use the ICU Message syntax which is also used in Java and PHP.

-

The intl-messageformat library takes the message and input data and creates an appropriately formatted string. This feature is included with all of the integrations we provide.

-

The following sections describe the ICU Message syntax and show how to use this features provided the FormatJS libraries:

-

Basic Principles

-

The simplest transform for the message is a literal string.

-
Hello everyone
-

All other transforms are done using replacements called "arguments". They are enclosed in curly braces ({ and }) and refer to a value in the input data.

-

Simple Argument

-

You can use a {key} argument for placing a value into the message. The key is looked up in the input data, and the string is interpolated with its value.

-
-

Formatted Argument

-

Values can also be formatted based on their type. You use a {key, type, format} argument to do that.

-

The elements of the argument are:

-
    -
  • key is where in the input data to find the data
  • -
  • type is optional, and is how to interpret the value (see below)
  • -
  • format is optional, and is a further refinement on how to display that type of data
  • -
-
-

number Type

-

This type is used to format numbers in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument:

-
-
-

Internally it uses the Intl.NumberFormat API. You can define custom values for the format element, which are passed to the Intl.NumberFormat constructor.

-

Sometimes embedding how the number will be formatted provides great context to translators. We also support ICU Number Skeletons using the same syntax:

-
-

You can read more about this here.

-

For fine control over decimal precision, you can use the Fraction Precision # and 0 symbols, which specify the number of decimal places to display:

-
-

Note that the # symbol doesn't render trailing zeroes, as seen in this example:

-
-

To render trailing zeroes, use the 0 symbol:

-
-

For more details, see Fraction Precision.

-

date Type

-

This type is used to format dates in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument:

-
    -
  • short is used to format dates in the shortest possible way
  • -
  • medium is used to format dates with short textual representation of the month
  • -
  • long is used to format dates with long textual representation of the month
  • -
  • full is used to format dates with the most detail
  • -
-
-

Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor.

-

time Type

-

This type is used to format times in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument:

-
    -
  • short is used to format times with hours and minutes
  • -
  • medium is used to format times with hours, minutes, and seconds
  • -
  • long is used to format times with hours, minutes, seconds, and timezone
  • -
  • full is the same as long
  • -
-
-

Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor.

-

Supported DateTime Skeleton

-

Similar to number type, we also support ICU DateTime skeleton. ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, we only support the following patterns

-
SymbolMeaningNotes
GEra designator
yyear
Mmonth in year
Lstand-alone month in year
dday in month
Eday of week
elocal day of weeke..eee is not supported
cstand-alone local day of weekc..ccc is not supported
aAM/PM marker
hHour [1-12]
HHour [0-23]
KHour [0-11]
kHour [1-24]
mMinute
sSecond
zTime Zone
-

{select} Format

-

The {key, select, matches} is used to choose output by matching a value to one of many choices. (It is similar to the switch statement available in some programming languages.) The key is looked up in the input data. The corresponding value is matched to one of matches and the corresponding output is returned. The key argument must follow Unicode Pattern_Syntax. The matches is a space-separated list of matches.

-

The format of a match is match {output}. (A match is similar to the case statement of the switch found in some programming languages.) The match is a literal value. If it is the same as the value for key then the corresponding output will be used.

-

output is itself a message, so it can be a literal string or also have more arguments nested inside of it.

-

The other match is special and is used if nothing else matches. (This is similar to the default case of the switch found in some programming languages.)

-
danger

other is required as per icu4j implementation. We will throw an error if select is used without other.

-
-

Here's an example of nested arguments.

-
-

{plural} Format

-

The {key, plural, matches} is used to choose output based on the pluralization rules of the current locale. It is very similar to the {select} format above except that the value is expected to be a number and is mapped to a plural category.

-

The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories.

-
    -
  • zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)
  • -
  • one: This category is used for languages that have grammar specialized specifically for one (singular) item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)
  • -
  • two: This category is used for languages that have grammar specialized specifically for two (dual) items. (Examples are Arabic and Welsh.)
  • -
  • few: This category is used for languages that have grammar specialized specifically for a small number (paucal) of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.
  • -
  • many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)
  • -
  • other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.
  • -
  • =value: This is used to match a specific value regardless of the plural categories of the current locale.
  • -
-
info

Don't use =1 in place of one. one doesn't always mean 1 but rather means singular, which can match to more than number 1 in certain locales. -Some locales considered all numbers ends with 1 (like 1, 11, 111) to be singular.

-
danger

other is required as per icu4j implementation. We will throw an error if plural is used without other.

-
-
-

In the output of the match, you can use the # special token as a placeholder for the numeric value and it'll be formatted as if it were {key, number}. This is the style we prefer to use.

-
-

{selectordinal} Format

-

The {key, selectordinal, matches} is used to choose output based on the ordinal pluralization rules (1st, 2nd, 3rd, etc.) of the current locale. It is very similar to the {plural} format above except that the value is mapped to an ordinal plural category.

-

The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories.

-
    -
  • zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)
  • -
  • one: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)
  • -
  • two: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)
  • -
  • few: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.
  • -
  • many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)
  • -
  • other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.
  • -
  • =value: This is used to match a specific value regardless of the plural categories of the current locale.
  • -
-
danger

other is required as per icu4j implementation. We will throw an error if selectordinal is used without other.

-

In the output of the match, the # special token can be used as a placeholder for the numeric value and will be formatted as if it were {key, number}.

-
-

Rich Text Formatting

-

We also support embedded rich text formatting in our message using tags. This allows developers to embed as much text as possible so sentences don't have to be broken up into chunks -NOTE: This is not XML/HTML tag

-
-
Custom Behavior

It is expected that the system using embedded rich text formatting will have methods to handle these placeholders external to this library. The tags will be part of the generated output and can either be post-processed by your own tooling or use the defaultRichTextElements configuration.

-

Quoting / Escaping

-

The ASCII apostrophe ' (U+0027) can be used to escape syntax characters in the text portion of the message, which mimics the behavior of ICU's quoting/escaping.

-
-
-
-
-

Two consecutive ASCII apostrophes represents one ASCII apostrophe, similar to %% in printf represents one %. + +

+

Message Syntax

If you are translating text you'll need a way for your translators to express the subtleties of spelling, grammar, and conjugation inherent in each language. We use the ICU Message syntax which is also used in Java and PHP.

The intl-messageformat library takes the message and input data and creates an appropriately formatted string. This feature is included with all of the integrations we provide.

The following sections describe the ICU Message syntax and show how to use this features provided the FormatJS libraries:

Basic Principles#

The simplest transform for the message is a literal string.

Hello everyone

All other transforms are done using replacements called "arguments". They are enclosed in curly braces ({ and }) and refer to a value in the input data.

Simple Argument#

You can use a {key} argument for placing a value into the message. The key is looked up in the input data, and the string is interpolated with its value.

Hello {who}

Formatted Argument#

Values can also be formatted based on their type. You use a {key, type, format} argument to do that.

The elements of the argument are:

  • key is where in the input data to find the data
  • type is how to interpret the value (see below)
  • format is optional, and is a further refinement on how to display that type of data
I have {numCats, number} cats.

number Type#

This type is used to format numbers in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument:

I have {numCats, number} cats.Almost {pctBlack, number, ::percent} of them are black.

Internally it uses the Intl.NumberFormat API. You can define custom values for the format element, which are passed to the Intl.NumberFormat constructor.

Sometimes embedding how the number will be formatted provides great context to translators. We also support ICU Number Skeletons using the same syntax:

The price of this bagel is {num, number, ::sign-always compact-short currency/GBP}

You can read more about this here.

date Type#

This type is used to format dates in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument:

  • short is used to format dates in the shortest possible way
  • medium is used to format dates with short textual representation of the month
  • long is used to format dates with long textual representation of the month
  • full is used to format dates with the most detail
Sale begins {start, date, medium}

Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor.

time Type#

This type is used to format times in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument:

  • short is used to format times with hours and minutes
  • medium is used to format times with hours, minutes, and seconds
  • long is used to format times with hours, minutes, seconds, and timezone
  • full is the same as long
Coupon expires at {expires, time, short}

Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor.

Supported DateTime Skeleton#

Similar to number type, we also support ICU DateTime skeleton. ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, we only support the following patterns

SymbolMeaningNotes
GEra designator
yyear
Mmonth in year
Lstand-alone month in year
dday in month
Eday of week
elocal day of weeke..eee is not supported
cstand-alone local day of weekc..ccc is not supported
aAM/PM marker
hHour [1-12]
HHour [0-23]
KHour [0-11]
kHour [1-24]
mMinute
sSecond
zTime Zone

{select} Format#

The {key, select, matches} is used to choose output by matching a value to one of many choices. (It is similar to the switch statement available in some programming languages.) The key is looked up in the input data. The corresponding value is matched to one of matches and the corresponding output is returned. The key argument must follow Unicode Pattern_Syntax. The matches is a space-separated list of matches.

The format of a match is match {output}. (A match is similar to the case statement of the switch found in some programming languages.) The match is a literal value. If it is the same as the value for key then the corresponding output will be used.

output is itself a message, so it can be a literal string or also have more arguments nested inside of it.

The other match is special and is used if nothing else matches. (This is similar to the default case of the switch found in some programming languages.)

danger

other is required as per icu4j implementation. We will throw an error if select is used without other.

{gender, select,    male {He}    female {She}    other {They}} will respond shortly.

Here's an example of nested arguments.

{taxableArea, select,    yes {An additional {taxRate, number, percent} tax will be collected.}    other {No taxes apply.}}

{plural} Format#

The {key, plural, matches} is used to choose output based on the pluralization rules of the current locale. It is very similar to the {select} format above except that the value is expected to be a number and is mapped to a plural category.

The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories.

  • zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)
  • one: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)
  • two: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)
  • few: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.
  • many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)
  • other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.
  • =value: This is used to match a specific value regardless of the plural categories of the current locale.
danger

other is required as per icu4j implementation. We will throw an error if plural is used without other.

Cart: {itemCount} {itemCount, plural,    one {item}    other {items}}
You have {itemCount, plural,    =0 {no items}    one {1 item}    other {{itemCount} items}}.

In the output of the match, the # special token can be used as a placeholder for the numeric value and will be formatted as if it were {key, number}.

You have {itemCount, plural,    =0 {no items}    one {# item}    other {# items}}.

{selectordinal} Format#

The {key, selectordinal, matches} is used to choose output based on the ordinal pluralization rules (1st, 2nd, 3rd, etc.) of the current locale. It is very similar to the {plural} format above except that the value is mapped to an ordinal plural category.

The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories.

  • zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)
  • one: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)
  • two: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)
  • few: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.
  • many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)
  • other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.
  • =value: This is used to match a specific value regardless of the plural categories of the current locale.
danger

other is required as per icu4j implementation. We will throw an error if selectordinal is used without other.

In the output of the match, the # special token can be used as a placeholder for the numeric value and will be formatted as if it were {key, number}.

It's my cat's {year, selectordinal,    one {#st}    two {#nd}    few {#rd}    other {#th}} birthday!

Rich Text Formatting#

We also support embedded rich text formatting in our message using tags. This allows developers to embed as much text as possible so sentences don't have to be broken up into chunks +NOTE: This is not XML/HTML tag

Our price is <boldThis>{price, number, ::currency/USD precision-integer}</boldThis>with <link>{pct, number, ::percent} discount</link>

Quoting / Escaping#

The ASCII apostrophe ' (U+0027) can be used to escape syntax characters in the text portion of the message. A single +apostrophe escapes one syntax character immediately following it; a pair of apostrophes escape every syntax characters +wrapped between them:

"This is not an interpolation: '{word}"//→ "This is not an interpolation: {word}""These are not interpolations: '{word1} {word2}'"//→ "These are not interpolations: {word1} {word2}""'<notATag>"//→ "<notATag>""'<notATag>hello</notATag>'"//→ "<notATag>hello</notATag>"

Two consecutive ASCII apostrophes represents one ASCII apostrophe, similar to %% in printf represents one %. However, we recommend using curly apostrophe (U+2019) for human-readable strings and only use ASCII apostrophe ' -(U+0027) in ICU message syntax.

-
+(U+0027) in ICU message syntax.

"This '{isn''t}' obvious."//→ "This {isn't} obvious."
+ + \ No newline at end of file diff --git a/docs/getting-started/application-workflow/index.html b/docs/getting-started/application-workflow/index.html old mode 100644 new mode 100755 index 1324aec4b..31a816300 --- a/docs/getting-started/application-workflow/index.html +++ b/docs/getting-started/application-workflow/index.html @@ -1,53 +1,20 @@ - + - -Application Workflow | Format.JS - - + + + + + +Application Workflow | Format.JS + + - -
Skip to main content

Application Workflow

While our Installation guide can help you get started, this guide gives you an overview how your daily translation workflow might look like.

-

There are 2 types of translations tools and services:

-
    -
  • Tools that work locally on your computer - just like your IDE.
  • -
  • Cloud translation services that require an upload of your translation files. These require a translation pipeline with a complex workflow.
  • -
-

This guide will give you an idea of how to work with both types of tools.

-

Simple application workflow with a local translation tool

-
projectRoot
|-- src
| |-- App.js
|-- extracted
| |-- en.json
|-- lang
| |-- fr.json
| |-- de.json
|-- package.json
|-- .eslintrc.js
-

The extracted translation files live in the extracted folder since they have a different internal structure (e.g. they contain additional information like the comments). The translation files produced during the translation process are stored in the lang folder.

-

The workflow

-

The workflow looks like this:

-

Pipeline

-
    -
  1. Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.
  2. -
  3. Edit: Edit the translations, save when done.
  4. -
  5. The changes immediately show up in your build
  6. -
-

Complex application workflow with a cloud based translation service

-

Project Structure

-

A minimal i18n-friendly project can have the following structure:

-
projectRoot
|-- src
| |-- App.js
|-- lang
| |-- en-US.json
| |-- fr.json
|-- package.json
|-- .eslintrc.js
-

where lang folder is where the aggregated strings file from your application would live. Integration with 3rd-party translation vendor can consume the en-US.json file and produce fr.json or other locale files accordingly.

-

Pipeline

-

A generic translation pipeline looks something like this:

-

Pipeline

-
    -
  1. Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.
  2. -
  3. Upload Messages: This step uploads the JSON file to your translation vendor.
  4. -
  5. Download Translations: This step either polls your translation vendor or hook into your vendor to download translated messages in the set of locales that you configured.
  6. -
  7. Commit: This commits back translation messages to the codebase.
  8. -
-

Where formatjs comes in

-

The goal of this project is not to provide a solution for the whole pipeline, but rather focus on Developer Experience via tooling and best practices so devs are i18n-aware. This includes:

-
    -
  1. Declaring i18n-friendly messages
  2. -
  3. Linter that enforces such messages
  4. -
  5. CLI for extraction & compilation
  6. -
  7. Polyfills for a stable i18n runtime environments
  8. -
  9. Bundler plugin for compiling TypeScript/JavaScript
  10. -
+ +
+
Skip to main content

Application Workflow

While our Installation guide can help you get started, most production-ready i18n applications require a translation pipeline and workflow. This guide will give you an idea of how to build one.

Project Structure#

A minimal i18n-friendly project can have the following structure:

projectRoot|-- src|   |-- App.js|-- lang|   |-- en-US.json|   |-- fr.json|-- package.json|-- .eslintrc.js

where lang folder is where the aggregated strings file from your application would live. Integration with 3rd-party translation vendor can consume the en-US.json file and produce fr.json or other locale files accordingly.

Pipeline#

A generic translation pipeline looks something like this:

Pipeline

  1. Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.
  2. Upload Messages: This step uploads the JSON file to your translation vendor.
  3. Download Translations: This step either polls your translation vendor or hook into your vendor to download translated messages in the set of locales that you configured.
  4. Commit: This commits back translation messages to the codebase.

Where formatjs comes in#

The goal of this project is not to provide a solution for the whole pipeline, but rather focus on Developer Experience via tooling and best practices so devs are i18n-aware. This includes:

  1. Declaring i18n-friendly messages
  2. Linter that enforces such messages
  3. CLI for extraction & compilation
  4. Polyfills for a stable i18n runtime environments
  5. Bundler plugin for compiling TypeScript/JavaScript
+ + \ No newline at end of file diff --git a/docs/getting-started/installation/index.html b/docs/getting-started/installation/index.html old mode 100644 new mode 100755 index 9fd2f1ee4..b8c9a1678 --- a/docs/getting-started/installation/index.html +++ b/docs/getting-started/installation/index.html @@ -1,38 +1,31 @@ - + - -Installation | Format.JS - - + + + + + +Installation | Format.JS + + - -
Skip to main content

Installation

formatjs is a set of libraries that help you setup internationalization in any project whether it's React or not.

-

Installation

- -
npm i -S react react-intl
-

Minimal Application

-

After following the step above, you should be able to get a minimal application like this running:

-
import * as React from 'react'
import {IntlProvider, FormattedMessage, FormattedNumber} from 'react-intl'

// Translated messages in French with matching IDs to what you declared
const messagesInFrench = {
myMessage: "Aujourd'hui, nous sommes le {ts, date, ::yyyyMMdd}",
}

export default function App() {
return (
<IntlProvider messages={messagesInFrench} locale="fr" defaultLocale="en">
<p>
<FormattedMessage
id="myMessage"
defaultMessage="Today is {ts, date, ::yyyyMMdd}"
values={{ts: Date.now()}}
/>
<br />
<FormattedNumber value={19} style="currency" currency="EUR" />
</p>
</IntlProvider>
)
}

Output

<p>
Aujourd'hui, nous sommes le 23/07/2020
<br />
19,00 €
</p>
-

Adding our babel-plugin/TypeScript Transformer for compilation

-

Our tooling supports babel, ts-loader, ts-jest, rollup-plugin-typescript2 & ts-patch for message compilation:

-

Babel

-

If you're using babel, add babel-plugin-formatjs to your dependencies:

-
npm i -D babel-plugin-formatjs
-

and add it to your babel.config.js or .babelrc:

-
{
"plugins": [
[
"formatjs",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]",
"ast": true
}
]
]
}
-

ts-loader

-
npm i -D @formatjs/ts-transformer
-
import {transform} from '@formatjs/ts-transformer'

module.exports = {
...otherConfigs,
module: {
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
getCustomTransformers() {
return {
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
}),
],
}
},
},
},
],
},
],
},
}
-

ts-jest in jest.config.js

-
npm i -D @formatjs/ts-transformer
-

Take a look at ts-jest guide on how to incorporate custom AST Transformers.

-

ts-patch

-
npm i -D @formatjs/ts-transformer
-
{
"compilerOptions": {
"plugins": [
{
"transform": "@formatjs/ts-transformer",
"import": "transform",
"type": "config",
"overrideIdFn": "[sha512:contenthash:base64:6]",
"ast": true
}
]
}
}
-

rollup-plugin-typescript2

-
npm i -D @formatjs/ts-transformer
-
// rollup.config.js
import typescript from 'rollup-plugin-typescript2'
import {transform} from '@formatjs/ts-transformer'

export default {
input: './main.ts',

plugins: [
typescript({
transformers: () => ({
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
ast: true,
}),
],
}),
}),
],
}
+ +
+
Skip to main content

Installation

formatjs is a set of libraries that help you setup internationalization in any project whether it's React or not.

Installation#

npm i -S react react-intl

Minimal Application#

After following the step above, you should be able to get a minimal application like this running:

import * as React from 'react'import {IntlProvider, FormattedMessage, FormattedNumber} from 'react-intl'
+// Translated messages in French with matching IDs to what you declaredconst messagesInFrench = {  myMessage: "Aujourd'hui, c'est le {ts, date, ::yyyyMMdd}",}
+export default function App() {  return (    <IntlProvider messages={messagesInFrench} locale="fr" defaultLocale="en">      <p>        <FormattedMessage          id="myMessage"          defaultMessage="Today is {ts, date, ::yyyyMMdd}"          values={{ts: Date.now()}}        />        <br />        <FormattedNumber value={19} style="currency" currency="EUR" />      </p>    </IntlProvider>  )}

Output

<p>  Aujourd'hui, c'est le 23/07/2020  <br />  19,00 €</p>

Adding our babel-plugin/TypeScript Transformer for compilation#

Our tooling supports babel, ts-loader, ts-jest, rollup-plugin-typescript2 & ttypescript for message compilation:

Babel#

If you're using babel, add babel-plugin-formatjs to your dependencies:

npm i -D babel-plugin-formatjs

and add it to your babel.config.js or .babelrc:

{  "plugins": [    [      "formatjs",      {        "idInterpolationPattern": "[sha512:contenthash:base64:6]",        "ast": true      }    ]  ]}

ts-loader#

npm i -D @formatjs/ts-transformer
import {transform} from '@formatjs/ts-transformer'
+module.exports = {  ...otherConfigs,  module: {    rules: [      {        test: /\.tsx?$/,        use: [          {            loader: 'ts-loader',            options: {              getCustomTransformers() {                return {                  before: [                    transform({                      overrideIdFn: '[sha512:contenthash:base64:6]',                    }),                  ],                }              },            },          },        ],      },    ],  },}

ts-jest in jest.config.js#

npm i -D @formatjs/ts-transformer

Take a look at ts-jest guide on how to incorporate custom AST Transformers.

ttypescript#

npm i -D @formatjs/ts-transformer
{  "compilerOptions": {    "plugins": [      {        "transform": "@formatjs/ts-transformer",        "import": "transform",        "type": "config",        "overrideIdFn": "[sha512:contenthash:base64:6]",        "ast": true      }    ]  }}

rollup-plugin-typescript2#

npm i -D @formatjs/ts-transformer
// rollup.config.jsimport typescript from 'rollup-plugin-typescript2'import {transform} from '@formatjs/ts-transformer'
+export default {  input: './main.ts',
+  plugins: [    typescript({      transformers: () => ({        before: [          transform({            overrideIdFn: '[sha512:contenthash:base64:6]',            ast: true,          }),        ],      }),    }),  ],}
+ + \ No newline at end of file diff --git a/docs/getting-started/message-declaration/index.html b/docs/getting-started/message-declaration/index.html old mode 100644 new mode 100755 index 58ffe02e9..704b9ca91 --- a/docs/getting-started/message-declaration/index.html +++ b/docs/getting-started/message-declaration/index.html @@ -1,30 +1,22 @@ - + - -Message Declaration | Format.JS - - + + + + + +Message Declaration | Format.JS + + - -
Skip to main content

Message Declaration

While you can declare your messages using only ids, we highly recommend declaring defaultMessages inline along with their usages because of the following reasons:

-
    -
  1. Messages colocated with their usages become self-managed, as their usages change/removed, so are the messages.
  2. -
  3. Messages are highly contextual. We've seen a lot of cases where developers assume a certain grammar when they write their messages. Buttons/Call-To-Actions and labels are also translated differently.
  4. -
  5. Text styling is also dependent on the message itself. Things like truncation, capitalization... certainly affect the messages themselves.
  6. -
  7. Better integrations with toolchains. Most toolchains cannot verify cross-file references to validate syntax/usage.
  8. -
-

At a high level, formatjs messages use ICU Syntax with a couple of enhancements common in other message format such as Fluent. This section focuses on the actual supported ways of calling formatjs APIs so messages can be extracted.

-

Using imperative API intl.formatMessage

-
// Method must be exactly `intl.formatMessage`
intl.formatMessage(
{
description: 'A message', // Description should be a string literal
defaultMessage: 'My name is {name}', // Message should be a string literal
},
{
name: userName,
} // Values should be an object literal, but not necessarily every value inside
)
-

Using React API <FormattedMessage/>

-
import {FormattedMessage} from 'react-intl'
;<FormattedMessage
description="A message" // Description should be a string literal
defaultMessage="My name is {name}" // Message should be a string literal
values={
{
name: userName,
} // Values should be an object literal, but not necessarily every value inside
}
/>
-

Using Vue API & template methods such as $formatMessage

-
<template>
<p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p>
</template>
- -
import {defineMessage} from 'react-intl'
const message = defineMessage({
description: 'A message', // Description should be a string literal
defaultMessage: 'My name is {name}', // Message should be a string literal
})

intl.formatMessage(message, {name: 'John'}) // My name is John

<FormattedMessage
{...message}
values={{
name: 'John',
}}
/> // My name is John
-
caution

We rely on AST to extract messages from the codebase, so make sure you call intl.formatMessage(), use our builtin React components, use our Vue methods or configure --additionalFunctionNames/--additionalComponentNames in our CLI properly.

-
caution

You can declare a message without immediately formatting it with defineMessage and our extractor would still be able to extract it. However, our enforce-placeholders linter rule won't be able to analyze it.

+ +
+
Skip to main content

Message Declaration

While you can declare your messages using only ids, we highly recommend declaring defaultMessages inline along with their usages because of the following reasons:

  1. Messages colocated with their usages become self-managed, as their usages change/removed, so are the messages.
  2. Messages are highly contextual. We've seen a lot of cases where developers assume a certain grammar when they write their messages. Buttons/Call-To-Actions and labels are also translated differently.
  3. Text styling is also dependent on the message itself. Things like truncation, capitalization... certainly affect the messages themselves.
  4. Better integrations with toolchains. Most toolchains cannot verify cross-file references to validate syntax/usage.

At a high level, formatjs messages use ICU Syntax with a couple of enhancements common in other message format such as Fluent. This section focuses on the actual supported ways of calling formatjs APIs so messages can be extracted.

Using imperative API intl.formatMessage#

// Method must be exactly `intl.formatMessage`intl.formatMessage(  {    description: 'A message', // Description should be a string literal    defaultMessage: 'My name is {name}', // Message should be a string literal  },  {    name: userName,  } // Values should be an object literal, but not necessarily every value inside)

Using React API <FormattedMessage/>#

import {FormattedMessage} from 'react-intl';<FormattedMessage  description="A message" // Description should be a string literal  defaultMessage="My name is {name}" // Message should be a string literal  values={    {      name: userName,    } // Values should be an object literal, but not necessarily every value inside  }/>

Using Vue API & template methods such as $formatMessage#

<template>  <p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p></template>

Pre-declaring using defineMessage for later consumption (less recommended)#

import {defineMessage} from 'react-intl'const message = defineMessage({  description: 'A message', // Description should be a string literal  defaultMessage: 'My name is {name}', // Message should be a string literal})
+intl.formatMessage(message, {name: 'John'}) // My name is John
+<FormattedMessage  {...message}  values={{    name: 'John',  }}/> // My name is John
caution

We rely on AST to extract messages from the codebase, so make sure you call intl.formatMessage(), use our builtin React components, use our Vue methods or configure additionalFunctionNames/additionalComponentNames properly.

caution

You can declare a message without immediately formatting it with defineMessage and our extractor would still be able to extract it. However, our enforce-placeholders linter rule won't be able to analyze it.

+ + \ No newline at end of file diff --git a/docs/getting-started/message-distribution/index.html b/docs/getting-started/message-distribution/index.html old mode 100644 new mode 100755 index 548ea57e5..36099b273 --- a/docs/getting-started/message-distribution/index.html +++ b/docs/getting-started/message-distribution/index.html @@ -1,35 +1,28 @@ - + - -Message Distribution | Format.JS - - + + + + + +Message Distribution | Format.JS + + - -
Skip to main content

Message Distribution

Now that you've declared your messages, extracted them, sent them to your translation vendor and they have given you back the translated JSON of the same format, it's time to talk about how to distribute & consume the translated JSON.

-

Compiling Messages

-

Let's take the example from Message Extraction, assuming we are working with the French version and the file is called lang/fr.json:

-
{
"hak27d": {
"defaultMessage": "Panneau de configuration",
"description": "title of control panel section"
},
"haqsd": {
"defaultMessage": "Supprimer l'utilisateur {name}",
"description": "delete button"
},
"19hjs": {
"defaultMessage": "nouveau mot de passe",
"description": "placeholder text"
},
"explicit-id": {
"defaultMessage": "Confirmez le mot de passe",
"description": "placeholder text"
}
}
-

We can use @formatjs/cli to compile this into a react-intl consumable JSON file:

-

Add the following command to your package.json scripts:

-
{
"scripts": {
"compile": "formatjs compile"
}
}
-

and execute with npm:

- -
npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json
-
Parsing messages into AST

We recommending compiling your messages into AST as it allows us to skip parsing them during runtime. This makes your app more performant.

-

Translation Management System (TMS) Integration

-

If your TMS/vendor has a different JSON format you can specify a custom formatter with --format <formatFile> that converts that into Record<string,string> so @formatjs/cli can understand. For example:

-

If your vendor accepts the format like

-
{
"[id]": {
"string": "[message]",
"comment": "[description]"
}
}
-

you can run

-
npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json --format formatter.js
-

where formatter.js is:

-
exports.compile = function (msgs) {
const results = {}
for (const [id, msg] of Object.entries(msgs)) {
results[id] = msg.string
}
return results
}
-

In the future we will provide formatters that work with popular TMSes by default.

-

Distribution

-

While every application has a separate distribution pipeline, the common theme is the ability to map a locale to its translation file. In this example we'll assume your pipeline can understand dynamic import:

-
import * as React from 'react'
import * as ReactDOM from 'react-dom'
import {IntlProvider} from 'react-intl'

function loadLocaleData(locale: string) {
switch (locale) {
case 'fr':
return import('compiled-lang/fr.json')
default:
return import('compiled-lang/en.json')
}
}

function App(props) {
return (
<IntlProvider
locale={props.locale}
defaultLocale="en"
messages={props.messages}
>
<MainApp />
</IntlProvider>
)
}

async function bootstrapApplication(locale, mainDiv) {
const messages = await loadLocaleData(locale)
ReactDOM.render(<App locale={locale} messages={messages} />, mainDiv)
}
+ +
+
Skip to main content

Message Distribution

Now that you've declared your messages, extracted them, sent them to your translation vendor and they have given you back the translated JSON of the same format, it's time to talk about how to distribute & consume the translated JSON.

Compiling Messages#

Let's take the example from Message Extraction, assuming we are working with the French version and the file is called lang/fr.json:

{  "hak27d": {    "defaultMessage": "Panneau de configuration",    "description": "title of control panel section"  },  "haqsd": {    "defaultMessage": "Supprimer l'utilisateur {name}",    "description": "delete button"  },  "19hjs": {    "defaultMessage": "nouveau mot de passe",    "description": "placeholder text"  },  "explicit-id": {    "defaultMessage": "Confirmez le mot de passe",    "description": "placeholder text"  }}

We can use @formatjs/cli to compile this into a react-intl consumable JSON file:

Add the following command to your package.json scripts:

{  "scripts": {    "compile": "formatjs compile"  }}

and execute with npm:

npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json
Parsing messages into AST

We recommending compiling your messages into AST as it allows us to skip parsing them during runtime. This makes your app more performant.

Translation Management System (TMS) Integration#

If your TMS/vendor has a different JSON format you can specify a custom formatter with --format <formatFile> that converts that into Record<string,string> so @formatjs/cli can understand. For example:

If your vendor accepts the format like

{  "[id]": {    "string": "[message]",    "comment": "[description]"  }}

you can run

npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json --format formatter.js

where formatter.js is:

exports.compile = function (msgs) {  const results = {}  for (const [id, msg] of Object.entries(msgs)) {    results[id] = msg.string  }  return results}

In the future we will provide formatters that work with popular TMSes by default.

Distribution#

While every application has a separate distribution pipeline, the common theme is the ability to map a locale to its translation file. In this example we'll assume your pipeline can understand dynamic import:

import * as React from 'react'import * as ReactDOM from 'react-dom'import {IntlProvider} from 'react-intl'
+function loadLocaleData(locale: string) {  switch (locale) {    case 'fr':      return import('compiled-lang/fr.json')    default:      return import('compiled-lang/en.json')  }}
+function App(props) {  return (    <IntlProvider      locale={props.locale}      defaultLocale="en"      messages={props.messages}    >      <MainApp />    </IntlProvider>  )}
+async function bootstrapApplication(locale, mainDiv) {  const messages = await loadLocaleData(locale)  ReactDOM.render(<App locale={locale} messages={messages} />, mainDiv)}
+ + \ No newline at end of file diff --git a/docs/getting-started/message-extraction/index.html b/docs/getting-started/message-extraction/index.html old mode 100644 new mode 100755 index 643dca4b6..1872a846b --- a/docs/getting-started/message-extraction/index.html +++ b/docs/getting-started/message-extraction/index.html @@ -1,39 +1,24 @@ - + - -Message Extraction | Format.JS - - + + + + + +Message Extraction | Format.JS + + - -
Skip to main content

Message Extraction

Now that you've declared some messages, it's time to extract them.

-

Installation

- -
npm i -D @formatjs/cli
-

Extraction

-

Add the following command to your package.json scripts:

-
{
"scripts": {
"extract": "formatjs extract"
}
}
-

and execute with npm:

-
npm run extract -- 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'
-
ID Interpolation Pattern

Make sure this pattern matches idInterpolationPattern when you use babel-plugin-formatjs or @formatjs/ts-transformer in Bundling with formatjs or you'll get a MISSING_TRANSLATION error.

-

Given a file that has the following messages:

-
import * as React from 'react'
import {FormattedMessage, useIntl, injectIntl} from 'react-intl'

class PasswordChangeWithIntl extends React.Component {
render() {
const {intl} = this.props
return (
<li>
<input
placeholder={intl.formatMessage({
defaultMessage: 'New Password',
description: 'placeholder text',
})}
/>
<input
placeholder={intl.formatMessage({
id: 'explicit-id',
defaultMessage: 'Confirm Password',
description: 'placeholder text',
})}
/>
</li>
)
}
}

const PasswordChange = injectIntl(PasswordChangeWithIntl)

export function List(props) {
const intl = useIntl()
return (
<section>
<header>
<FormattedMessage
defaultMessage="Control Panel"
description="title of control panel section"
/>
</header>
<ul>
<li>
<button>
<FormattedMessage
defaultMessage="Delete user {name}"
description="Delete button"
values={{
name: props.name,
}}
/>
</button>
</li>
<PasswordChange />
</ul>
</section>
)
}
-

running the above command will create a file called lang/en.json:

-
{
"hak27d": {
"defaultMessage": "Control Panel",
"description": "title of control panel section"
},
"haqsd": {
"defaultMessage": "Delete user {name}",
"description": "delete button"
},
"19hjs": {
"defaultMessage": "New Password",
"description": "placeholder text"
},
"explicit-id": {
"defaultMessage": "Confirm Password",
"description": "placeholder text"
}
}
-
Message ID

During extraction, we'll preserve explicit declared IDs and insert a hash as an ID for messages without. We recommend against explicit IDs since it can cause collision.

-

Automatic ID Generation

-

Since manual IDs are discouraged, we've provided a babel plugin and a TypeScript AST transformer that will automatically insert message IDs in your transpiled code. For more details please visit Bundling with formatjs.

-

Translation Management System (TMS) Integration

-

The default format generated from @formatjs/cli might not work with the specific TMS/vendor you're working with. You can specify a custom formatter with --format <formatFile> that allows you to convert that format into something tailored to your TMS. For example:

-

If your vendor accepts the format like

-
{
"[id]": {
"string": "[message]",
"comment": "[description]"
}
}
-

you can run

-
npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' --format formatter.js
-

where formatter.js is:

-
exports.format = function (msgs) {
const results = {}
for (const [id, msg] of Object.entries(msgs)) {
results[id] = {
string: msg.defaultMessage,
comment: msg.description,
}
}
return results
}
-

We also provide several builtin formatters to integrate with 3rd party TMSes so feel free to create PRs to add more.

-
TMS--format
BabelEditsimple
Crowdin Chrome JSONcrowdin
Lingohubsimple
Localize's Simple JSONsimple
Localizelysimple
locizesimple
Lokalise Structured JSONlokalise
Phrase Stringssimple
POEditor Key-Value JSONsimple
SimpleLocalize JSONsimple
Smartling ICU JSONsmartling
Transifex's Structured JSONtransifex
+ +
+
Skip to main content

Message Extraction

Now that you've declared some messages, it's time to extract them.

Installation#

npm i -D @formatjs/cli

Extraction#

Add the following command to your package.json scripts:

{  "scripts": {    "extract": "formatjs extract"  }}

and execute with npm:

npm run extract -- 'src/**/*.ts*' --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'
ID Interpolation Pattern

Make sure this pattern matches idInterpolationPattern when you use babel-plugin-formatjs or @formatjs/ts-transformer in Bundling with formatjs or you'll get a MISSING_TRANSLATION error.

Given a file that has the following messages:

import * as React from 'react'import {FormattedMessage, useIntl, injectIntl} from 'react-intl'
+class PasswordChangeWithIntl extends React.Component {  render() {    const {intl} = this.props    return (      <li>        <input          placeholder={intl.formatMessage({            defaultMessage: 'New Password',            description: 'placeholder text',          })}        />        <input          placeholder={intl.formatMessage({            id: 'explicit-id',            defaultMessage: 'Confirm Password',            description: 'placeholder text',          })}        />      </li>    )  }}
+const PasswordChange = injectIntl(PasswordChangeWithIntl)
+export function List(props) {  const intl = useIntl()  return (    <section>      <header>        <FormattedMessage          defaultMessage="Control Panel"          description="title of control panel section"        />      </header>      <ul>        <li>          <button>            <FormattedMessage              defaultMessage="Delete user {name}"              description="Delete button"              values={{                name: props.name,              }}            />          </button>        </li>        <PasswordChange />      </ul>    </section>  )}

running the above command will create a file called lang/en.json:

{  "hak27d": {    "defaultMessage": "Control Panel",    "description": "title of control panel section"  },  "haqsd": {    "defaultMessage": "Delete user {name}",    "description": "delete button"  },  "19hjs": {    "defaultMessage": "New Password",    "description": "placeholder text"  },  "explicit-id": {    "defaultMessage": "Confirm Password",    "description": "placeholder text"  }}
Message ID

During extraction, we'll preserve explicit declared IDs and insert a hash as an ID for messages without. We recommend against explicit IDs since it can cause collision.

Automatic ID Generation#

Since manual IDs are discouraged, we've provided a babel plugin and a TypeScript AST transformer that will automatically insert message IDs in your transpiled code. For more details please visit Bundling with formatjs.

Translation Management System (TMS) Integration#

The default format generated from @formatjs/cli might not work with the specific TMS/vendor you're working with. You can specify a custom formatter with --format <formatFile> that allows you to convert that format into something tailored to your TMS. For example:

If your vendor accepts the format like

{  "[id]": {    "string": "[message]",    "comment": "[description]"  }}

you can run

npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' --format formatter.js

where formatter.js is:

exports.format = function (msgs) {  const results = {}  for (const [id, msg] of Object.entries(msgs)) {    results[id] = {      string: msg.defaultMessage,      comment: msg.description,    }  }  return results}

We also provide several builtin formatters to integrate with 3rd party TMSes so feel free to create PRs to add more.

TMS--format
Transifex's Structured JSONtransifex
Smartling ICU JSONsmartling
Lingohubsimple
Phrasesimple
Crowdin Chrome JSONcrowdin
Lokalise Structured JSONlokalise
SimpleLocalize JSONsimple
+ + \ No newline at end of file diff --git a/docs/guides/advanced-usage/index.html b/docs/guides/advanced-usage/index.html old mode 100644 new mode 100755 index cc872d685..814b98719 --- a/docs/guides/advanced-usage/index.html +++ b/docs/guides/advanced-usage/index.html @@ -1,32 +1,21 @@ - + - -Advanced Usage | Format.JS - - + + + + + +Advanced Usage | Format.JS + + - -
Skip to main content

Advanced Usage

react-intl is optimized for both runtime & compile time rendering. Below are a few guidelines you can follow if you have a strict performance budget.

-

Pre-compiling messages

-

You can also pre-compile all messages into AST using @formatjs/cli compile command and pass that into IntlProvider. This is especially faster since it saves us time parsing string into AST. The use cases for this support are:

-
    -
  1. Server-side rendering or pre-compiling where you can cache the AST and don't have to pay compilation costs multiple time.
  2. -
  3. Desktop apps using Electron or CEF where you can preload/precompile things in advanced before runtime.
  4. -
-
Caching

Since this approach uses AST as the data source, changes to @formatjs/icu-messageformat-parser's AST will require cache invalidation.

-
Asset Size

AST is also slightly larger in size than regular string messages but can be efficiently compressed.

-

react-intl without parser (40% smaller)

-

If you've made sure all your messages & defaultMessages are precompiled as above, you can resolve @formatjs/icu-messageformat-parser to @formatjs/icu-messageformat-parser/no-parser during bundling to get a much smaller bundler (~40% less). For example:

-

webpack.config.js

-
module.exports = {
//...
resolve: {
alias: {
'@formatjs/icu-messageformat-parser':
'@formatjs/icu-messageformat-parser/no-parser',
},
},
}
-

rollup.config.js

-
import alias from '@rollup/plugin-alias'

module.exports = {
//...
plugins: [
alias({
entries: {
'@formatjs/icu-messageformat-parser':
'@formatjs/icu-messageformat-parser/no-parser',
},
}),
],
}
-

In the future, we'll gear towards making this the default behavior.

-

Imperative APIs

-

Imperative APIs (e.g formatMessage...) are generally faster than Formatted component since it does not create extra ReactElement nodes. They should have the exact same capabilities as Formatted components.

-

More examples

-

Head over to https://github.com/formatjs/formatjs/tree/main/packages/react-intl/examples for more examples on how to use our libraries.

+ +
+
Skip to main content

Advanced Usage

react-intl is optimized for both runtime & compile time rendering. Below are a few guidelines you can follow if you have a strict performance budget.

Pre-compiling messages#

You can also pre-compile all messages into AST using @formatjs/cli compile command and pass that into IntlProvider. This is especially faster since it saves us time parsing string into AST. The use cases for this support are:

  1. Server-side rendering or pre-compiling where you can cache the AST and don't have to pay compilation costs multiple time.
  2. Desktop apps using Electron or CEF where you can preload/precompile things in advanced before runtime.
Caching

Since this approach uses AST as the data source, changes to @formatjs/icu-messageformat-parser's AST will require cache invalidation.

Asset Size

AST is also slightly larger in size than regular string messages but can be efficiently compressed.

react-intl without parser (40% smaller)#

If you've made sure all your messages & defaultMessages are precompiled as above, you can resolve @formatjs/icu-messageformat-parser to @formatjs/icu-messageformat-parser/no-parser during bundling to get a much smaller bundler (~40% less). For example:

webpack.config.js#

module.exports = {  //...  resolve: {    alias: {      '@formatjs/icu-messageformat-parser':        '@formatjs/icu-messageformat-parser/no-parser',    },  },}

rollup.config.js#

import alias from '@rollup/plugin-alias'
+module.exports = {  //...  plugins: [    alias({      entries: {        '@formatjs/icu-messageformat-parser':          '@formatjs/icu-messageformat-parser/no-parser',      },    }),  ],}

In the future, we'll gear towards making this the default behavior.

Imperative APIs#

Imperative APIs (e.g formatMessage...) are generally faster than Formatted component since it does not create extra ReactElement nodes. They should have the exact same capabilities as Formatted components.

More examples#

Head over to https://github.com/formatjs/formatjs/tree/main/packages/react-intl/examples for more examples on how to use our libraries.

+ + \ No newline at end of file diff --git a/docs/guides/bundler-plugins/index.html b/docs/guides/bundler-plugins/index.html old mode 100644 new mode 100755 index cca6623e0..f493341cd --- a/docs/guides/bundler-plugins/index.html +++ b/docs/guides/bundler-plugins/index.html @@ -1,35 +1,24 @@ - + - -Bundling with formatjs | Format.JS - - + + + + + +Bundling with formatjs | Format.JS + + - -
Skip to main content

Bundling with formatjs

Now that you've had a working pipeline. It's time to dive deeper on how to optimize the build with formatjs. From Message Extraction guide, we explicitly recommend against explicit ID due to potential collision in large application. While our extractor can insert IDs in the extracted JSON file, you'd need to also insert those IDs into the compiled JS output. This guide will cover how to do that.

-

Using babel-plugin-formatjs

- -
npm i -D babel-plugin-formatjs
-

Let's take this simple example:

-
import {FormattedMessage} from 'react-intl'

<FormattedMessage
description="A message"
defaultMessage="My name is {name}"
values={{
name: userName,
}}
/>
-

During runtime this will throw an Error saying ID is required. In order to inject an ID in the transpiled JS, you can use our babel-plugin-formatjs similarly as below:

-

babel.config.json

-
{
"plugins": [
[
"formatjs",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]",
"ast": true
}
]
]
}
-

This will produce the following JS

-
const {FormattedMessage} = require('react-intl')

React.createElement(FormattedMessage, {
id: '179jda',
defaultMessage: 'My name is {name}',
values: {
name: userName,
},
})
-
description

Our plugin also removes description because it's only for translator, not end-user.

-

Using @formatjs/ts-transformer

-
npm i -D @formatjs/ts-transformer
-

If you're using TypeScript, in order to enable custom AST transformer you should consider using ts-patch, ts-loader or similar.

-

Let's take this simple example:

-
import {FormattedMessage} from 'react-intl'

<FormattedMessage
description="A message"
defaultMessage="My name is {name}"
values={{
name: userName,
}}
/>
-

ts-loader

-

You can add this in your webpack config ts-loader.

-
import {transform} from '@formatjs/ts-transformer'
// webpack config
module.exports = {
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
getCustomTransformers() {
return {
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
}),
],
}
},
},
},
],
exclude: /node_modules/,
},
],
}
-

This will produce the following JS

-
const {FormattedMessage} = require('react-intl')

React.createElement(FormattedMessage, {
id: '179jda',
defaultMessage: 'My name is {name}',
values: {
name: userName,
},
})
-
description

Our transformer also removes description because it's only for translator, not end-user.

+ +
+
Skip to main content

Bundling with formatjs

Now that you've had a working pipeline. It's time to dive deeper on how to optimize the build with formatjs. From Message Extraction guide, we explicitly recommend against explicit ID due to potential collision in large application. While our extractor can insert IDs in the extracted JSON file, you'd need to also insert those IDs into the compiled JS output. This guide will cover how to do that.

Using babel-plugin-formatjs#

npm i -D babel-plugin-formatjs

Let's take this simple example:

import {FormattedMessage} from 'react-intl'
+<FormattedMessage  description="A message"  defaultMessage="My name is {name}"  values={{    name: userName,  }}/>

During runtime this will throw an Error saying ID is required. In order to inject an ID in the transpiled JS, you can use our babel-plugin-formatjs similarly as below:

babel.config.json

{  "plugins": [    [      "formatjs",      {        "idInterpolationPattern": "[sha512:contenthash:base64:6]",        "ast": true      }    ]  ]}

This will produce the following JS

const {FormattedMessage} = require('react-intl')
+React.createElement(FormattedMessage, {  id: '179jda',  defaultMessage: 'My name is {name}',  values: {    name: userName,  },})
description

Our plugin also removes description because it's only for translator, not end-user.

Using @formatjs/ts-transformer#

npm i -D @formatjs/ts-transformer

If you're using TypeScript, in order to enable custom AST transformer you should consider using ttypescript, ts-loader or similar.

Let's take this simple example:

import {FormattedMessage} from 'react-intl'
+<FormattedMessage  description="A message"  defaultMessage="My name is {name}"  values={{    name: userName,  }}/>

ts-loader#

You can add this in your webpack config ts-loader.

import {transform} from '@formatjs/ts-transformer'// webpack configmodule.exports = {  rules: [    {      test: /\.tsx?$/,      use: [        {          loader: 'ts-loader',          options: {            getCustomTransformers() {              return {                before: [                  transform({                    overrideIdFn: '[sha512:contenthash:base64:6]',                  }),                ],              }            },          },        },      ],      exclude: /node_modules/,    },  ],}

This will produce the following JS

const {FormattedMessage} = require('react-intl')
+React.createElement(FormattedMessage, {  id: '179jda',  defaultMessage: 'My name is {name}',  values: {    name: userName,  },})
description

Our transformer also removes description because it's only for translator, not end-user.

+ + \ No newline at end of file diff --git a/docs/guides/develop/index.html b/docs/guides/develop/index.html old mode 100644 new mode 100755 index 0c88abde7..438135afc --- a/docs/guides/develop/index.html +++ b/docs/guides/develop/index.html @@ -1,34 +1,20 @@ - + - -Develop with formatjs | Format.JS - - + + + + + +Develop with formatjs | Format.JS + + - -
Skip to main content

Develop with formatjs

Aside from a strong focus on facilitating i18n production pipeline, formatjs also aims to improve i18n DevEx with our eslint-plugin-formatjs.

-

Linter Installation

- -
npm i -D eslint-plugin-formatjs eslint
-

Then in your eslint config:

-
{
"plugins": ["formatjs"],
"rules": {
"formatjs/no-offset": "error"
}
}
-

Head over to eslint-plugin-formatjs for more details on our rules.

-

Error Codes

-

react-intl is designed to fail fast when there's a configuration issue but fall back to defaultLocale when there's a translation issues. Below are the list of errors that we emit out that can be caught during testing:

-

FORMAT_ERROR

-

Issue when we try to format a sentence but some of the placeholder values are malformed, e.g passing in a string for a Date or such.

-

UNSUPPORTED_FORMATTER

-

We trigger this error when a custom format is being declared but there's no corresponding formatter with it. For example:

-
intl.formatMessage({
defaultMessage: 'the price is {p, number, customCurrency}',
})
-

and there's no formatter for customCurrency.

-

INVALID_CONFIG

-

When some config values are misconfigured such as missing locale.

-

MISSING_DATA

-

When some native Intl APIs don't support certain locales, or missing locale-data when polyfills are setup. This typically happens when you're running on an older browsers/Node, or try to use newer APIs in browsers that have not supported them.

-

MISSING_TRANSLATION

-

This gets triggered whenever we try to look up a translated message in messages for a given id and it's not there and there is no fallback defaultMessage for the given id.

-
verbosity

This error will be triggered very often since it happens for every message that does not have a translation. Therefore if you do log it remotely there should be throttling in place.

+ +
+
Skip to main content

Develop with formatjs

Aside from a strong focus on facilitating i18n production pipeline, formatjs also aims to improve i18n DevEx with our eslint-plugin-formatjs.

Linter Installation#

npm i -D eslint-plugin-formatjs eslint

Then in your eslint config:

{  "plugins": ["formatjs"],  "rules": {    "formatjs/no-offset": "error"  }}

Head over to eslint-plugin-formatjs for more details on our rules.

Error Codes#

react-intl is designed to fail fast when there's a configuration issue but fall back to defaultLocale when there's a translation issues. Below are the list of errors that we emit out that can be caught during testing:

FORMAT_ERROR#

Issue when we try to format a sentence but some of the placeholder values are malformed, e.g passing in a string for a Date or such.

UNSUPPORTED_FORMATTER#

We trigger this error when a custom format is being declared but there's no corresponding formatter with it. For example:

intl.formatMessage({  defaultMessage: 'the price is {p, number, customCurrency}',})

and there's no formatter for customCurrency.

INVALID_CONFIG#

When some config values are misconfigured such as missing locale.

MISSING_DATA#

When some native Intl APIs don't support certain locales, or missing locale-data when polyfills are setup. This typically happens when you're running on an older browsers/Node, or try to use newer APIs in browsers that have not supported them.

MISSING_TRANSLATION#

This gets triggered whenever we try to look up a translated message in messages for a given id and it's not there, thus falling back to defaultMessage.

verbosity

This error will be triggered very often since it happens for every message that does not have a translation. Therefore if you do log it remotely there should be throttling in place.

+ + \ No newline at end of file diff --git a/docs/guides/distribute-libraries/index.html b/docs/guides/distribute-libraries/index.html old mode 100644 new mode 100755 index 6d0c0c6c0..f600fdcfa --- a/docs/guides/distribute-libraries/index.html +++ b/docs/guides/distribute-libraries/index.html @@ -1,44 +1,24 @@ - + - -Distributing i18n-friendly libraries | Format.JS - - + + + + + +Distributing i18n-friendly libraries | Format.JS + + - -
Skip to main content

Distributing i18n-friendly libraries

In larger scale applications/monorepos, not all components/libraries live within the same repo/project and they might get distributed differently. While there are multiple ways to solve this problem, this guide aims to provide a guidance that we've seen working quite well with large engineering orgs.

-

High level concept

-

Translated strings are basically assets, just like CSS, static configuration or images. The high level structure typically contains several layers:

-
    -
  • Reusable Components/Libraries that have translated strings, which can be nested.
  • -
  • Consuming higher-level applications that consumes those components/libraries.
  • -
-

Distribution Hierarchy

-

Each feature/library would be in charge of:

- -

Declaring in package.json

-

This is similar to using style attribute to declare CSS. You can declare something like

-
{
"name": "my-library",
"version": "1.0.0",
"lang": "my-strings",
"supportedLocales": ["en", "en-GB", "ja"]
}
-

where my-strings is the folder containing your translated strings in your supportedLocales:

-
my-strings
|- en.json
|- en-GB.json
|- ja.json
-

Consuming application can walk through node_modules looking for package.json files with these fields and aggregate the strings together into a single bundle (or multiple bundles) and serve those JSON however it chooses to.

-

This provides flexibility to output translations to any location you want as long as it's declared in package.json. However, this also incurs additional processing cost at the application level and also encourages inconsistency in output location.

-

Declaring with a convention

-

This is similar to Declaring in package.json, except translation is always output to lang/{locale}.json. Upstream application can do

-
formatjs compile "node_modules/**/lang/en.json" --ast --out-file lang/en.json
-

to aggregate all its libraries' pre-translated strings.

-
my-lib
|- src
|- lang
|- en.json
|- en-GB.json
|- ja.json
|- node_modules
|- library1
|- lang
|- en.json
|- en-GB.json
|- ja.json
|- library2
|- lang
|- en.json
|- en-GB.json
|- ja.json
-

This provides consistency and minimize processing cost of different manifest files but also is less flexible.

-
info

We've seen convention approach working better in large engineering org due to enforcement of convention & structure while manifest approach working in a more open environment.

-

Passing down intl object

-

The core of a i18n application is the intl object, which contains precompiled messages, locale settings, format settings and cache. Therefore, this should only be initialized at the top level in the application.

-

Component libraries can declare intl: IntlShape as a prop and subsequently pass it down directly like:

-
import {IntlShape} from 'react-intl'
import {MyButton, MyForm} from 'my-components'
interface Props {
intl: IntlShape
}

function MyFeature(props: Props) {
return (
<div>
<MyButton intl={props.intl} />
<MyForm intl={props.intl} />
</div>
)
}

or passing down via context using RawIntlProvider:

import {IntlShape, RawIntlProvider} from 'react-intl'
import {MyButton, MyForm} from 'my-components'
interface Props {
intl: IntlShape
}

function MyFeature(props: Props) {
return (
<RawIntlProvider value={props.intl}>
<MyButton />
<MyForm />
</RawIntlProvider>
)
}
+ +
+
Skip to main content

Distributing i18n-friendly libraries

In larger scale applications/monorepos, not all components/libraries live within the same repo/project and they might get distributed differently. While there are multiple ways to solve this problem, this guide aims to provide a guidance that we've seen working quite well with large engineering orgs.

High level concept#

Translated strings are basically assets, just like CSS, static configuration or images. The high level structure typically contains several layers:

  • Reusable Components/Libraries that have translated strings, which can be nested.
  • Consuming higher-level applications that consumes those components/libraries.

Distribution Hierarchy

Each feature/library would be in charge of:

Declaring in package.json#

This is similar to using style attribute to declare CSS. You can declare something like

{  "name": "my-library",  "version": "1.0.0",  "lang": "my-strings",  "supportedLocales": ["en", "en-GB", "ja"]}

where my-strings is the folder containing your translated strings in your supportedLocales:

my-strings|- en.json|- en-GB.json|- ja.json

Consuming application can walk through node_modules looking for package.json files with these fields and aggregate the strings together into a single bundle (or multiple bundles) and serve those JSON however it chooses to.

This provides flexibility to output translations to any location you want as long as it's declared in package.json. However, this also incurs additional processing cost at the application level and also encourages inconsistency in output location.

Declaring with a convention#

This is similar to Declaring in package.json, except translation is always output to lang/{locale}.json. Upstream application can do

formatjs compile "node_modules/**/lang/en.json" --ast --out-file lang/en.json

to aggregate all its libraries' pre-translated strings.

my-lib|- src|- lang    |- en.json    |- en-GB.json    |- ja.json|- node_modules    |- library1        |- lang            |- en.json            |- en-GB.json            |- ja.json    |- library2        |- lang            |- en.json            |- en-GB.json            |- ja.json

This provides consistency and minimize processing cost of different manifest files but also is less flexible.

info

We've seen convention approach working better in large engineering org due to enforcement of convention & structure while manifest approach working in a more open environment.

Passing down intl object#

The core of a i18n application is the intl object, which contains precompiled messages, locale settings, format settings and cache. Therefore, this should only be initialized at the top level in the application.

Component libraries can declare intl: IntlShape as a prop and subsequently pass it down directly like:

import {IntlShape} from 'react-intl'import {MyButton, MyForm} from 'my-components'interface Props {  intl: IntlShape}
+function MyFeature(props: Props) {  return (    <div>      <MyButton intl={props.intl} />      <MyForm intl={props.intl} />    </div>  )}

or passing down via context using RawIntlProvider:

import {IntlShape, RawIntlProvider} from 'react-intl'import {MyButton, MyForm} from 'my-components'interface Props {  intl: IntlShape}
+function MyFeature(props: Props) {  return (    <RawIntlProvider value={intl}>      <MyButton />      <MyForm />    </RawIntlProvider>  )}
+ + \ No newline at end of file diff --git a/docs/guides/runtime-requirements/index.html b/docs/guides/runtime-requirements/index.html old mode 100644 new mode 100755 index 112fad08e..a149c2910 --- a/docs/guides/runtime-requirements/index.html +++ b/docs/guides/runtime-requirements/index.html @@ -1,52 +1,22 @@ - + - -Runtime Requirements | Format.JS - - + + + + + +Runtime Requirements | Format.JS + + - -
Skip to main content

Runtime Requirements

Browser

-
Browser Support

We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari. If you need older browser support, take a look at polyfill-library that also uses formatjs but pre-bundle other polyfills that we use.

-

React Intl relies on these Intl APIs:

- -

We officially support IE11 along with 2 most recent versions of Edge, Chrome & Firefox.

-

Node.js

-

full-icu

-

Starting with Node.js 13.0.0 full-icu is supported by default.

-

If using React Intl in an earlier version of Node.js, your node binary has to either:

- -

OR

- -

If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly.

-

React Native

-

If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details:

- -

React Native on iOS

-

If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in polyfills to polyfill the following APIs (in this order):

-
    -
  1. Intl.getCanonicalLocales
  2. -
  3. Intl.Locale
  4. -
  5. Intl.PluralRules
  6. -
  7. Intl.NumberFormat
  8. -
  9. Intl.DateTimeFormat
  10. -
+ +
+
Skip to main content

Runtime Requirements

Browser#

Browser Support

We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari. If you need older browser support, take a look at polyfill-library that also uses formatjs but pre-bundle other polyfills that we use.

React Intl relies on these Intl APIs:

We officially support IE11 along with 2 most recent versions of Edge, Chrome & Firefox.

Node.js#

full-icu#

Starting with Node.js 13.0.0 full-icu is supported by default.

If using React Intl in an earlier version of Node.js, your node binary has to either:

OR

If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly.

React Native#

If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details:

React Native on iOS#

If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in polyfills to polyfill the following APIs (in this order):

  1. Intl.getCanonicalLocales
  2. Intl.Locale
  3. Intl.PluralRules
  4. Intl.NumberFormat
  5. Intl.DateTimeFormat
+ + \ No newline at end of file diff --git a/docs/guides/testing/index.html b/docs/guides/testing/index.html old mode 100644 new mode 100755 index 0fee6ffb8..bd2636cde --- a/docs/guides/testing/index.html +++ b/docs/guides/testing/index.html @@ -1,79 +1,51 @@ - + - -Testing with formatjs | Format.JS - - + + + + + +Testing with formatjs | Format.JS + + - -
Skip to main content

Testing with formatjs

Intl APIs requirements

-

React Intl uses the built-in Intl APIs in JavaScript. Make sure your environment satisfy the requirements listed in Intl APIs requirements

-

Mocha

-

If you're using Mocha as your test runner and testing on older JavaScript runtimes, you can load the Intl Polyfill via the CLI or by adding a <script> in the browser.

-

Command Line

-

Run mocha and auto-polyfill the runtime if needed:

-
$ mocha --recursive test/
-

Browser

-

You can either load the polyfill in the browser from node_modules or use the polyfill-fastly.io service from the Financial Times:

-
<script src="https://polyfill-fastly.io/v2/polyfill.min.js?features=Intl,Intl.~locale.en-US"></script>
-

Shallow Rendering

-

React's react-addons-test-utils package contains a shallow rendering feature which you might use to test your app's React components. If a component you're trying to test using ReactShallowRenderer uses React Intl — specifically injectIntl() — you'll need to do extra setup work because React Intl components expect to be nested inside an <IntlProvider>.

-

Testing Example Components That Use React Intl

-

The following examples will assume mocha, expect, and expect-jsx test framework.

-

ShortDate (Basic)

-
import React from 'react'
import {FormattedDate} from 'react-intl'

const ShortDate = props => (
<FormattedDate
value={props.date}
year="numeric"
month="short"
day="2-digit"
/>
)

export default ShortDate
-

Testing the <ShortDate> example component is no different than testing any other basic component in your app using React's shallow rendering:

-
import expect from 'expect'
import expectJSX from 'expect-jsx'
import React from 'react'
import {createRenderer} from 'react-addons-test-utils'
import {FormattedDate} from 'react-intl'
import ShortDate from '../short-date'

expect.extend(expectJSX)

describe('<ShortDate>', function () {
it('renders', function () {
const renderer = createRenderer()
const date = new Date()

renderer.render(<ShortDate date={date} />)
expect(renderer.getRenderOutput()).toEqualJSX(
<FormattedDate value={date} year="numeric" month="short" day="2-digit" />
)
})
})
-

DOM Rendering

-

If you use the DOM in your tests, you need to supply the IntlProvider context to your components using composition:

-
let element = ReactTestUtils.renderIntoDocument(
<IntlProvider>
<MyComponent />
</IntlProvider>
)
-

However this means that the element reference is now pointing to the IntlProvider instead of your component. To retrieve a reference to your wrapped component, you can use "refs" with these changes to the code:

-

In your component, remember to add {forwardRef: true} when calling injectIntl():

-
class MyComponent extends React.Component {
...
myClassFn() { ... }
}
export default injectIntl(MyComponent, {forwardRef: true});
-

In your test, add a "ref" to extract the reference to your tested component:

-
const element = React.createRef()
ReactTestUtils.renderIntoDocument(
<IntlProvider>
<MyComponent ref={element} />
</IntlProvider>
)
-

You can now access the wrapped component instance from element like this:

-
element.current.myClassFn()
-

Helper function

-

Since you will have to do this in all your unit tests, you should probably wrap that setup in a render function like this:

-
function renderWithIntl(element) {
let instance

ReactTestUtils.renderIntoDocument(
<IntlProvider>
{React.cloneElement(element, {
ref: instance,
})}
</IntlProvider>
)

return instance
}
-

You can now use this in your tests like this:

-
const element = React.createRef();
renderWithIntl(<MyElement ref={element}>);
element.current.myClassFn();
-

Enzyme

-

Testing with Enzyme works in a similar fashion as written above. Your mount()ed and shallow()ed components will need access to the intl context. Below is a helper function which you can import and use to mount your components which make use of any of React-Intl's library (either <Formatted* /> components or format*() methods through injectIntl).

-

Helper function

-
/**
* Components using the react-intl module require access to the intl context.
* This is not available when mounting single components in Enzyme.
* These helper functions aim to address that and wrap a valid,
* English-locale intl context around them.
*/

import React from 'react'
import {IntlProvider} from 'react-intl'
import {mount, shallow} from 'enzyme'

// You can pass your messages to the IntlProvider. Optional: remove if unneeded.
const messages = require('../locales/en') // en.json
const defaultLocale = 'en'
const locale = defaultLocale

export function mountWithIntl(node: React.ReactElement) {
return mount(node, {
wrappingComponent: IntlProvider,
wrappingComponentProps: {
locale,
defaultLocale,
messages,
},
})
}

export function shallowWithIntl(node: React.ReactElement) {
return shallow(node, {
wrappingComponent: IntlProvider,
wrappingComponentProps: {
locale,
defaultLocale,
messages,
},
})
}
-

Usage

-

Create a file with the above helper in e.g. helpers/intl-enzyme-test-helper.js and import the methods you need in your tests.

-
// intl-enzyme-test-helper.js

import {mountWithIntl} from 'helpers/intl-enzyme-test-helper.js'

const wrapper = mountWithIntl(<CustomComponent />)

expect(wrapper.state('foo')).to.equal('bar') // OK
expect(wrapper.text()).to.equal('Hello World!') // OK
-

Based on this gist.

-

Jest

-

Testing with Jest can be divided into two approaches: snapshot's testing and DOM testing. Snapshot's testing is a relatively new feature and works out of the box. If you'd like DOM testing you need to use Enzyme or React's TestUtils.

-

Snapshot Testing

-

Snapshot testing is a new feature of Jest that automatically generates text snapshots of your components and saves them on the disk so if the UI output changes, you get notified without manually writing any assertions on the component output. Use either helper function or mock as described below.

-

Helper function

-
import React from 'react'
import renderer from 'react-test-renderer'
import {IntlProvider} from 'react-intl'

const createComponentWithIntl = (children, props = {locale: 'en'}) => {
return renderer.create(<IntlProvider {...props}>{children}</IntlProvider>)
}

export default createComponentWithIntl
-

Usage

-
import React from 'react'
import createComponentWithIntl from '../../utils/createComponentWithIntl'
import AppMain from '../AppMain'

test('app main should be rendered', () => {
const component = createComponentWithIntl(<AppMain />)

let tree = component.toJSON()

expect(tree).toMatchSnapshot()

tree.props.onClick()

tree = component.toJSON()

expect(tree).toMatchSnapshot()
})
-

You can find runnable example here and more info about Jest here.

-

Usage with Jest & enzyme

-

Jest will automatically mock react-intl, so no any extra implementation is needed, tests should work as is:

-
import React from 'react'
import {shallow} from 'enzyme'
import AppMain from '../AppMain'

test('app main should be rendered', () => {
const wrapper = shallow(<AppMain />)
expect(wrapper).toMatchSnapshot()
})
-

DOM Testing

-

If you want use Jest with DOM Testing read more info above in Enzyme section or in official Jest documentation.

-

Storybook

-

Intl

-

If you want to use react-intl inside of Storybook you can use storybook-addon-intl which provides an easy to use wrapper for react-intl including a locale switcher so you can test your component in all provided languages.

-

react-testing-library

-

In order to use react-intl and react-testing-library together, you should provide some helper function to the testing flow.

-

You can check the docs.

-

To create a generic solution, We can create a custom render function using + +

+

Testing with formatjs

Intl APIs requirements#

React Intl uses the built-in Intl APIs in JavaScript. Make sure your environment satisfy the requirements listed in Intl APIs requirements

Mocha#

If you're using Mocha as your test runner and testing on older JavaScript runtimes, you can load the Intl Polyfill via the CLI or by adding a <script> in the browser.

Command Line#

Run mocha and auto-polyfill the runtime if needed:

$ mocha --recursive test/

Browser#

You can either load the polyfill in the browser from node_modules or use the polyfill.io service from the Financial Times:

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl,Intl.~locale.en-US"></script>

Shallow Rendering#

React's react-addons-test-utils package contains a shallow rendering feature which you might use to test your app's React components. If a component you're trying to test using ReactShallowRenderer uses React Intl — specifically injectIntl() — you'll need to do extra setup work because React Intl components expect to be nested inside an <IntlProvider>.

Testing Example Components That Use React Intl#

The following examples will assume mocha, expect, and expect-jsx test framework.

ShortDate (Basic)#

import React from 'react'import {FormattedDate} from 'react-intl'
+const ShortDate = props => (  <FormattedDate    value={props.date}    year="numeric"    month="short"    day="2-digit"  />)
+export default ShortDate

Testing the <ShortDate> example component is no different than testing any other basic component in your app using React's shallow rendering:

import expect from 'expect'import expectJSX from 'expect-jsx'import React from 'react'import {createRenderer} from 'react-addons-test-utils'import {FormattedDate} from 'react-intl'import ShortDate from '../short-date'
+expect.extend(expectJSX)
+describe('<ShortDate>', function () {  it('renders', function () {    const renderer = createRenderer()    const date = new Date()
+    renderer.render(<ShortDate date={date} />)    expect(renderer.getRenderOutput()).toEqualJSX(      <FormattedDate value={date} year="numeric" month="short" day="2-digit" />    )  })})

DOM Rendering#

If you use the DOM in your tests, you need to supply the IntlProvider context to your components using composition:

let element = ReactTestUtils.renderIntoDocument(  <IntlProvider>    <MyComponent />  </IntlProvider>)

However this means that the element reference is now pointing to the IntlProvider instead of your component. To retrieve a reference to your wrapped component, you can use "refs" with these changes to the code:

In your component, remember to add {forwardRef: true} when calling injectIntl():

class MyComponent extends React.Component {  ...  myClassFn() { ... }}export default injectIntl(MyComponent, {forwardRef: true});

In your test, add a "ref" to extract the reference to your tested component:

const element = React.createRef()ReactTestUtils.renderIntoDocument(  <IntlProvider>    <MyComponent ref={element} />  </IntlProvider>)

You can now access the wrapped component instance from element like this:

element.current.myClassFn()

Helper function#

Since you will have to do this in all your unit tests, you should probably wrap that setup in a render function like this:

function renderWithIntl(element) {  let instance
+  ReactTestUtils.renderIntoDocument(    <IntlProvider>      {React.cloneElement(element, {        ref: instance,      })}    </IntlProvider>  )
+  return instance}

You can now use this in your tests like this:

const element = React.createRef();renderWithIntl(<MyElement ref={element}>);element.current.myClassFn();

Enzyme#

Testing with Enzyme works in a similar fashion as written above. Your mount()ed and shallow()ed components will need access to the intl context. Below is a helper function which you can import and use to mount your components which make use of any of React-Intl's library (either <Formatted* /> components or format*() methods through injectIntl).

Helper function#

/** * Components using the react-intl module require access to the intl context. * This is not available when mounting single components in Enzyme. * These helper functions aim to address that and wrap a valid, * English-locale intl context around them. */
+import React from 'react'import {IntlProvider} from 'react-intl'import {mount, shallow} from 'enzyme'
+// You can pass your messages to the IntlProvider. Optional: remove if unneeded.const messages = require('../locales/en') // en.jsonconst defaultLocale = 'en'const locale = defaultLocale
+export function mountWithIntl(node: React.ReactElement) {  return mount(node, {    wrappingComponent: IntlProvider,    wrappingComponentProps: {      locale,      defaultLocale,      messages,    },  })}
+export function shallowWithIntl(node: React.ReactElement) {  return shallow(node, {    wrappingComponent: IntlProvider,    wrappingComponentProps: {      locale,      defaultLocale,      messages,    },  })}

Usage#

Create a file with the above helper in e.g. helpers/intl-enzyme-test-helper.js and import the methods you need in your tests.

// intl-enzyme-test-helper.js
+import {mountWithIntl} from 'helpers/intl-enzyme-test-helper.js'
+const wrapper = mountWithIntl(<CustomComponent />)
+expect(wrapper.state('foo')).to.equal('bar') // OKexpect(wrapper.text()).to.equal('Hello World!') // OK

Based on this gist.

Jest#

Testing with Jest can be divided into two approaches: snapshot's testing and DOM testing. Snapshot's testing is a relatively new feature and works out of the box. If you'd like DOM testing you need to use Enzyme or React's TestUtils.

Snapshot Testing#

Snapshot testing is a new feature of Jest that automatically generates text snapshots of your components and saves them on the disk so if the UI output changes, you get notified without manually writing any assertions on the component output. Use either helper function or mock as described below.

Helper function#

import React from 'react'import renderer from 'react-test-renderer'import {IntlProvider} from 'react-intl'
+const createComponentWithIntl = (children, props = {locale: 'en'}) => {  return renderer.create(<IntlProvider {...props}>{children}</IntlProvider>)}
+export default createComponentWithIntl

Usage#

import React from 'react'import createComponentWithIntl from '../../utils/createComponentWithIntl'import AppMain from '../AppMain'
+test('app main should be rendered', () => {  const component = createComponentWithIntl(<AppMain />)
+  let tree = component.toJSON()
+  expect(tree).toMatchSnapshot()
+  tree.props.onClick()
+  tree = component.toJSON()
+  expect(tree).toMatchSnapshot()})

You can find runnable example here and more info about Jest here.

Usage with Jest & enzyme#

Jest will automatically mock react-intl, so no any extra implementation is needed, tests should work as is:

import React from 'react'import {shallow} from 'enzyme'import AppMain from '../AppMain'
+test('app main should be rendered', () => {  const wrapper = shallow(<AppMain />)  expect(wrapper).toMatchSnapshot()})

DOM Testing#

If you want use Jest with DOM Testing read more info above in Enzyme section or in offical Jest documentation.

Storybook#

Intl#

If you want to use react-intl inside of Storybook you can use storybook-addon-intl which provides an easy to use wrapper for react-intl including a locale switcher so you can test your component in all provided languages.

react-testing-library#

In order to use react-intl and react-testing-library together, you should provide some helper function to the testing flow.

You can check the docs.

To create a generic solution, We can create a custom render function using the wrapper option as explained in the setup page.
-Our custom render function can look like this:

-
// test-utils.js
import React from 'react'
import {render as rtlRender} from '@testing-library/react'
import {IntlProvider} from 'react-intl'

function render(ui, {locale = 'pt', ...renderOptions} = {}) {
function Wrapper({children}) {
return <IntlProvider locale={locale}>{children}</IntlProvider>
}
return rtlRender(ui, {wrapper: Wrapper, ...renderOptions})
}

// re-export everything
export * from '@testing-library/react'

// override render method
export {render}
-
import React from 'react'
import '@​testing-library/jest-dom/jest-globals'
// We're importing from our own created test-utils and not RTL's
import {render, screen} from '../test-utils.js'
import {FormattedDate} from 'react-intl'

const FormatDateView = () => {
return (
<div data-testid="date-display">
<FormattedDate
value="2019-03-11"
timeZone="utc"
day="2-digit"
month="2-digit"
year="numeric"
/>
</div>
)
}

test('it should render FormattedDate and have a formated pt date', () => {
render(<FormatDateView />)
expect(screen.getByTestId('date-display')).toHaveTextContent('11/03/2019')
})
+Our custom render function can look like this:

// test-utils.jsimport React from 'react'import {render as rtlRender} from '@testing-library/react'import {IntlProvider} from 'react-intl'
+function render(ui, {locale = 'pt', ...renderOptions} = {}) {  function Wrapper({children}) {    return <IntlProvider locale={locale}>{children}</IntlProvider>  }  return rtlRender(ui, {wrapper: Wrapper, ...renderOptions})}
+// re-export everythingexport * from '@testing-library/react'
+// override render methodexport {render}
import React from 'react'import '@testing-library/jest-dom/extend-expect'// We're importing from our own created test-utils and not RTL'simport {render, screen} from '../test-utils.js'import {FormattedDate} from 'react-intl'
+const FormatDateView = () => {  return (    <div data-testid="date-display">      <FormattedDate        value="2019-03-11"        timeZone="utc"        day="2-digit"        month="2-digit"        year="numeric"      />    </div>  )}
+test('it should render FormattedDate and have a formated pt date', () => {  render(<FormatDateView />)  expect(screen.getByTestId('date-display')).toHaveTextContent('11/03/2019')})
+ + \ No newline at end of file diff --git a/docs/icu-messageformat-parser/index.html b/docs/icu-messageformat-parser/index.html old mode 100644 new mode 100755 index 11a8167c7..7def14ba8 --- a/docs/icu-messageformat-parser/index.html +++ b/docs/icu-messageformat-parser/index.html @@ -1,39 +1,123 @@ - + - -ICU MessageFormat Parser | Format.JS - - + + + + + +ICU MessageFormat Parser | Format.JS + + - -
Skip to main content

ICU MessageFormat Parser

Parses ICU Message strings into an AST via JavaScript.

-

npm Version -size

-

Overview

-

This package implements a parser in JavaScript that parses the industry standard ICU Message strings — used for internationalization — into an AST. The produced AST can then be used by a compiler, like intl-messageformat, to produce localized formatted strings for display to users.

-

Usage

-
import {parse} from '@formatjs/icu-messageformat-parser'
const ast = parse(`this is {count, plural,
one{# dog}
other{# dogs}
}`)
-

Example

-
Live Editor
<pre>
-  {JSON.stringify(
-    IcuMessageFormatParser.parse(
-      `On {takenDate, date, short} <bold>{name}</bold> took {numPhotos, plural,
-          =0 {no photos.}
-          =1 {one photo.}
-          other {# photos.}
-        }`
-    ),
-    undefined,
-    2
-  )}
-</pre>
-
Result
-

Supported DateTime Skeleton

-

ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns

-
SymbolMeaningNotes
GEra designator
yyear
Mmonth in year
Lstand-alone month in year
dday in month
Eday of week
elocal day of weeke..eee is not supported
cstand-alone local day of weekc..ccc is not supported
aAM/PM marker
hHour [1-12]
HHour [0-23]
KHour [0-11]
kHour [1-24]
mMinute
sSecond
zTime Zone
-

Benchmarks

-
complex_msg AST length 10861
normal_msg AST length 1665
simple_msg AST length 364
string_msg AST length 131

complex_msg x 29,940 ops/sec ±1.23% (89 runs sampled)
normal_msg x 253,612 ops/sec ±1.01% (92 runs sampled)
simple_msg x 1,805,642 ops/sec ±0.70% (94 runs sampled)
string_msg x 2,694,133 ops/sec ±1.05% (95 runs sampled)
+ +
+
Skip to main content

ICU MessageFormat Parser

Parses ICU Message strings into an AST via JavaScript.

npm Version +size

Overview#

This package implements a parser in JavaScript that parses the industry standard ICU Message strings — used for internationalization — into an AST. The produced AST can then be used by a compiler, like intl-messageformat, to produce localized formatted strings for display to users.

Usage#

import {parse} from '@formatjs/icu-messageformat-parser'const ast = parse(`this is {count, plural,   one{# dog}   other{# dogs}}`)

Example#

Live Editor
Result
[
+  {
+    "type": 0,
+    "value": "On "
+  },
+  {
+    "type": 3,
+    "value": "takenDate",
+    "style": "short"
+  },
+  {
+    "type": 0,
+    "value": " "
+  },
+  {
+    "type": 8,
+    "value": "bold",
+    "children": [
+      {
+        "type": 1,
+        "value": "name"
+      }
+    ]
+  },
+  {
+    "type": 0,
+    "value": " took "
+  },
+  {
+    "type": 6,
+    "value": "numPhotos",
+    "options": {
+      "=0": {
+        "value": [
+          {
+            "type": 0,
+            "value": "no photos."
+          }
+        ]
+      },
+      "=1": {
+        "value": [
+          {
+            "type": 0,
+            "value": "one photo."
+          }
+        ]
+      },
+      "other": {
+        "value": [
+          {
+            "type": 7
+          },
+          {
+            "type": 0,
+            "value": " photos."
+          }
+        ]
+      }
+    },
+    "offset": 0,
+    "pluralType": "cardinal"
+  }
+]

Supported DateTime Skeleton#

ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns

SymbolMeaningNotes
GEra designator
yyear
Mmonth in year
Lstand-alone month in year
dday in month
Eday of week
elocal day of weeke..eee is not supported
cstand-alone local day of weekc..ccc is not supported
aAM/PM marker
hHour [1-12]
HHour [0-23]
KHour [0-11]
kHour [1-24]
mMinute
sSecond
zTime Zone

Benchmarks#

complex_msg AST length 10861normal_msg AST length 1665simple_msg AST length 364string_msg AST length 131
+complex_msg x 29,940 ops/sec ±1.23% (89 runs sampled)normal_msg x 253,612 ops/sec ±1.01% (92 runs sampled)simple_msg x 1,805,642 ops/sec ±0.70% (94 runs sampled)string_msg x 2,694,133 ops/sec ±1.05% (95 runs sampled)
+ + \ No newline at end of file diff --git a/docs/intl-messageformat/index.html b/docs/intl-messageformat/index.html old mode 100644 new mode 100755 index fa9512294..a7d3a2a09 --- a/docs/intl-messageformat/index.html +++ b/docs/intl-messageformat/index.html @@ -1,183 +1,339 @@ - + - -Intl MessageFormat | Format.JS - - + + + + + +Intl MessageFormat | Format.JS + + - -
Skip to main content

Intl MessageFormat

Formats ICU Message strings with number, date, plural, and select placeholders to create localized messages.

-

npm Version -intl-messageformat minzipped size

-

Overview

-

Goals

-

This package aims to provide a way for you to manage and format your JavaScript app's string messages into localized strings for people using your app. You can use this package in the browser and on the server via Node.js.

-

This implementation is based on the Strawman proposal, but there are a few places this implementation diverges.

-
Future Changes

This IntlMessageFormat API may change to stay in sync with ECMA-402, but this package will follow semver.

-

How It Works

-

Messages are provided into the constructor as a String message, or a pre-parsed AST object.

-
const msg = new IntlMessageFormat(message, locales, [formats], [opts])
-

The string message is parsed, then stored internally in a compiled form that is optimized for the format() method to produce the formatted string for displaying to the user.

-
const output = msg.format(values)
-

Common Usage Example

-

A very common example is formatting messages that have numbers with plural labels. With this package you can make sure that the string is properly formatted for a person's locale, e.g.:

-
Live Editor
new IntlMessageFormat(
-  `{numPhotos, plural,
-      =0 {You have no photos.}
-      =1 {You have one photo.}
-      other {You have # photos.}
-    }`,
-  'en-US'
-).format({numPhotos: 1000})
-
Result
-
Live Editor
new IntlMessageFormat(
-  `{numPhotos, plural,
-      =0 {Usted no tiene fotos.}
-      =1 {Usted tiene una foto.}
-      other {Usted tiene # fotos.}
-    }`,
-  'es-ES'
-).format({numPhotos: 1000})
-
Result
-

Message Syntax

-

The message syntax that this package uses is not proprietary, in fact it's a common standard message syntax that works across programming languages and one that professional translators are familiar with. This package uses the ICU Message syntax and works for all CLDR languages which have pluralization rules defined.

-

Features

-
    -
  • -

    Uses industry standards: ICU Message syntax and CLDR locale data.

    -
  • -
  • -

    Supports plural, select, and selectordinal message arguments.

    -
  • -
  • -

    Formats numbers and dates/times in messages using Intl.NumberFormat and Intl.DateTimeFormat, respectively.

    -
  • -
  • -

    Optimized for repeated calls to an IntlMessageFormat instance's format() method.

    -
  • -
  • -

    Supports defining custom format styles/options.

    -
  • -
  • -

    Supports escape sequences for message syntax chars, e.g.: "'{foo}'" will output: "{foo}" in the formatted output instead of interpreting it as a foo argument.

    -
  • -
-

Usage

-

Modern Intl Dependency

-

This package assumes that the Intl global object exists in the runtime. Intl is present in all modern browsers (IE11+) and Node (with full ICU). The Intl methods we rely on are:

-
    -
  1. Intl.NumberFormat for number formatting (can be polyfilled using @formatjs/intl-numberformat)
  2. -
  3. Intl.DateTimeFormat for date time formatting (can be polyfilled using @formatjs/intl-datetimeformat)
  4. -
  5. Intl.PluralRules for plural/ordinal formatting (can be polyfilled using @formatjs/intl-pluralrules)
  6. -
-

Loading Intl MessageFormat in a browser

-
<script src="intl-messageformat/intl-messageformat.min.js"></script>
-

Loading Intl MessageFormat in Node.js

-

Either do:

-
import IntlMessageFormat from 'intl-messageformat'
-
const IntlMessageFormat = require('intl-messageformat').default
-

NOTE: Your Node has to include full ICU

-

Public API

-

IntlMessageFormat Constructor

-

To create a message to format, use the IntlMessageFormat constructor. The constructor takes three parameters:

-
    -
  • -

    message: string | AST - String message (or pre-parsed AST) that serves as formatting pattern.

    -
  • -
  • -

    locales: string | string[] - A string with a BCP 47 language tag, or an array of such strings. If you do not provide a locale, the default locale will be used. When an array of locales is provided, each item and its ancestor locales are checked and the first one with registered locale data is returned. See: Locale Resolution for more details.

    -
  • -
  • -

    formats?: object - Optional object with user defined options for format styles.

    -
  • -
  • -

    opts?: { formatters?: Formatters, ignoreTag?: boolean } - Optional options.

    -
      -
    • formatters: Map containing memoized formatters for performance.
    • -
    • ignoreTag: Whether to treat HTML/XML tags as string literal instead of parsing them as tag token. When this is false we only allow simple tags without any attributes
    • -
    -
  • -
-
const msg = new IntlMessageFormat('My name is {name}.', 'en-US')
-

Locale Resolution

-

IntlMessageFormat uses Intl.NumberFormat.supportedLocalesOf() to determine which locale data to use based on the locales value passed to the constructor. The result of this resolution process can be determined by call the resolvedOptions() prototype method.

-

resolvedOptions() Method

-

This method returns an object with the options values that were resolved during instance creation. It currently only contains a locale property; here's an example:

-
Live Editor
new IntlMessageFormat('', 'en-us').resolvedOptions().locale
-
Result
-

Notice how the specified locale was the all lower-case value: "en-us", but it was resolved and normalized to: "en-US".

-

format(values) Method

-

Once the message is created, formatting the message is done by calling the format() method on the instance and passing a collection of values:

-
Live Editor
new IntlMessageFormat('My name is {name}.', 'en-US').format({name: 'Eric'})
-
Result
-
placeholders

A value must be supplied for every argument in the message pattern the instance was constructed with.

-

Rich Text support

-
Live Editor
new IntlMessageFormat('hello <b>world</b>', 'en').format({
-  b: chunks => <strong>{chunks}</strong>,
-})
-
Result
-

We support embedded XML tag in the message, e.g this is a <b>strong</b> tag. This is not meant to be a full-fledged method to embed HTML, but rather to tag specific text chunk so translation can be more contextual. Therefore, the following restrictions apply:

-
    -
  1. Any attributes on the HTML tag are also ignored.
  2. -
  3. Self-closing tags are treated as string literal and not supported, please use regular ICU placeholder like {placeholder}.
  4. -
  5. All tags specified must have corresponding values and will throw -error if it's missing, e.g:
  6. -
-
Live Editor
function () {
-  try {
-    return new IntlMessageFormat('a <foo>strong</foo>').format()
-  } catch (e) {
-    return String(e)
-  }
-}
-
Result
-
    -
  1. XML/HTML tags are escaped using apostrophe just like other ICU constructs. In order to escape you can do things like:
  2. -
-
Live Editor
new IntlMessageFormat("I '<'3 cats").format()
-
Result
-
Live Editor
new IntlMessageFormat("raw '<b>HTML</b>'").format()
-
Result
-
Live Editor
new IntlMessageFormat("raw '<b>HTML</b>' with '<a>'{placeholder}'</a>'").format(
-  {placeholder: 'some word'}
-)
-
Result
-
    -
  1. Embedded valid HTML tag is a bit of a grey area right now since we're not supporting the full HTML/XHTML/XML spec.
  2. -
-

getAst Method

-

Return the underlying AST for the compiled message.

-

Date/Time/Number Skeleton

-

We support ICU Number skeleton and a subset of Date/Time Skeleton for further customization of formats.

-

Number Skeleton

-

Example:

-
Live Editor
new IntlMessageFormat(
-  'The price is: {price, number, ::currency/EUR}',
-  'en-GB'
-).format({price: 100})
-
Result
-

A full set of options and syntax can be found here

-

Date/Time Skeleton

-

ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns

-
SymbolMeaningNotes
GEra designator
yyear
Mmonth in year
Lstand-alone month in year
dday in month
Eday of week
elocal day of weeke..eee is not supported
cstand-alone local day of weekc..ccc is not supported
aAM/PM marker
hHour [1-12]
HHour [0-23]
KHour [0-11]
kHour [1-24]
mMinute
sSecond
zTime Zone
-

Example:

-
Live Editor
new IntlMessageFormat('Today is: {now, date, ::yyyyMMdd}', 'en-GB').format({
-  now: new Date(),
-})
-
Result
-

Advanced Usage

-

Passing in AST

-

You can pass in pre-parsed AST to IntlMessageFormat like this:

-
new IntlMessageFormat('hello').format() // prints out hello

// is equivalent to

import IntlMessageFormat from 'intl-messageformat'
import {parse} from '@formatjs/icu-messageformat-parser'
new IntlMessageFormat(parse('hello')).format() // prints out hello
-

This helps performance for cases like SSR or preload/precompilation-supported platforms since AST can be cached.

-

If your messages are all in ASTs, you can alias @formatjs/icu-messageformat-parser to {default: undefined} to save some bytes during bundling.

-

Formatters

-

For complex messages, initializing Intl.* constructors can be expensive. Therefore, we allow user to pass in formatters to provide memoized instances of these Intl objects. This opts combines with passing in AST and fast-memoize can speed things up by 30x per the benchmark down below.

-

For example:

-
import IntlMessageFormat from 'intl-messageformat'
import {memoize} from '@formatjs/fast-memoize'
const formatters = {
getNumberFormat: memoize(
(locale, opts) => new Intl.NumberFormat(locale, opts)
),
getDateTimeFormat: memoize(
(locale, opts) => new Intl.DateTimeFormat(locale, opts)
),
getPluralRules: memoize((locale, opts) => new Intl.PluralRules(locale, opts)),
}
new IntlMessageFormat('hello {number, number}', 'en', undefined, {
formatters,
}).format({number: 3}) // prints out `hello, 3`
-

Benchmark

-
format_cached_complex_msg x 153,868 ops/sec ±1.13% (85 runs sampled)
format_cached_string_msg x 21,661,621 ops/sec ±4.06% (84 runs sampled)
new_complex_msg_preparsed x 719,056 ops/sec ±2.83% (78 runs sampled)
new_complex_msg x 12,844 ops/sec ±1.97% (85 runs sampled)
new_string_msg x 409,770 ops/sec ±2.57% (79 runs sampled)
complex msg format x 12,065 ops/sec ±1.66% (81 runs sampled)
complex msg w/ formatters format x 11,649 ops/sec ±2.05% (78 runs sampled)
complex preparsed msg w/ formatters format x 597,153 ops/sec ±1.46% (90 runs sampled)
complex preparsed msg w/ new formatters format x 684,263 ops/sec ±1.37% (89 runs sampled)
+ +
+
Skip to main content

Intl MessageFormat

Formats ICU Message strings with number, date, plural, and select placeholders to create localized messages.

npm Version +`intl-messageformat` minzipped size

Overview#

Goals#

This package aims to provide a way for you to manage and format your JavaScript app's string messages into localized strings for people using your app. You can use this package in the browser and on the server via Node.js.

This implementation is based on the Strawman proposal, but there are a few places this implementation diverges.

Future Changes

This IntlMessageFormat API may change to stay in sync with ECMA-402, but this package will follow semver.

How It Works#

Messages are provided into the constructor as a String message, or a pre-parsed AST object.

const msg = new IntlMessageFormat(message, locales, [formats], [opts])

The string message is parsed, then stored internally in a compiled form that is optimized for the format() method to produce the formatted string for displaying to the user.

const output = msg.format(values)

Common Usage Example#

A very common example is formatting messages that have numbers with plural labels. With this package you can make sure that the string is properly formatted for a person's locale, e.g.:

Live Editor
Result
You have 1,000 photos.
Live Editor
Result
Usted tiene 1,000 fotos.

Message Syntax#

The message syntax that this package uses is not proprietary, in fact it's a common standard message syntax that works across programming languages and one that professional translators are familiar with. This package uses the ICU Message syntax and works for all CLDR languages which have pluralization rules defined.

Features#

  • Uses industry standards: ICU Message syntax and CLDR locale data.

  • Supports plural, select, and selectordinal message arguments.

  • Formats numbers and dates/times in messages using Intl.NumberFormat and Intl.DateTimeFormat, respectively.

  • Optimized for repeated calls to an IntlMessageFormat instance's format() method.

  • Supports defining custom format styles/options.

  • Supports escape sequences for message syntax chars, e.g.: "'{foo}'" will output: "{foo}" in the formatted output instead of interpreting it as a foo argument.

Usage#

Modern Intl Dependency#

This package assumes that the Intl global object exists in the runtime. Intl is present in all modern browsers (IE11+) and Node (with full ICU). The Intl methods we rely on are:

  1. Intl.NumberFormat for number formatting (can be polyfilled using @formatjs/intl-numberformat)
  2. Intl.DateTimeFormat for date time formatting (can be polyfilled using @formatjs/intl-datetimeformat)
  3. Intl.PluralRules for plural/ordinal formatting (can be polyfilled using @formatjs/intl-pluralrules)

Loading Intl MessageFormat in a browser#

<script src="intl-messageformat/intl-messageformat.min.js"></script>

Loading Intl MessageFormat in Node.js#

Either do:

import IntlMessageFormat from 'intl-messageformat'
const IntlMessageFormat = require('intl-messageformat').default

NOTE: Your Node has to include full ICU

Public API#

IntlMessageFormat Constructor#

To create a message to format, use the IntlMessageFormat constructor. The constructor takes three parameters:

  • message - {String | AST} - String message (or pre-parsed AST) that serves as formatting pattern.

  • locales - {String | String[]} - A string with a BCP 47 language tag, or an array of such strings. If you do not provide a locale, the default locale will be used. When an array of locales is provided, each item and its ancestor locales are checked and the first one with registered locale data is returned. See: Locale Resolution for more details.

  • [formats] - {Object} - Optional object with user defined options for format styles.

  • [opts] - { formatters?: Formatters, ignoreTag?: boolean }: Optional options.

    • formatters: Map containing memoized formatters for performance.
    • ignoreTag: Whether to treat HTML/XML tags as string literal instead of parsing them as tag token. When this is false we only allow simple tags without any attributes
const msg = new IntlMessageFormat('My name is {name}.', 'en-US')

Locale Resolution#

IntlMessageFormat uses Intl.NumberFormat.supportedLocalesOf() to determine which locale data to use based on the locales value passed to the constructor. The result of this resolution process can be determined by call the resolvedOptions() prototype method.

resolvedOptions() Method#

This method returns an object with the options values that were resolved during instance creation. It currently only contains a locale property; here's an example:

Live Editor
Result
en-US

Notice how the specified locale was the all lower-case value: "en-us", but it was resolved and normalized to: "en-US".

format(values) Method#

Once the message is created, formatting the message is done by calling the format() method on the instance and passing a collection of values:

Live Editor
Result
My name is Eric.
placeholders

A value must be supplied for every argument in the message pattern the instance was constructed with.

Rich Text support#

Live Editor
Result
hello world

We support embedded XML tag in the message, e.g this is a <b>strong</b> tag. This is not meant to be a full-fledged method to embed HTML, but rather to tag specific text chunk so translation can be more contextual. Therefore, the following restrictions apply:

  1. Any attributes on the HTML tag are also ignored.
  2. Self-closing tags are treated as string literal and not supported, please use regular ICU placeholder like {placeholder}.
  3. All tags specified must have corresponding values and will throw +error if it's missing, e.g:
Live Editor
Result
Error: The intl string context variable "foo" was not provided to the string "a <foo>strong</foo>"
  1. XML/HTML tags are escaped using apostrophe just like other ICU constructs. In order to escape you can do things like:
Live Editor
Result
I <3 cats
Live Editor
Result
raw <b>HTML</b>
Live Editor
Result
raw <b>HTML</b> with <a>some word</a>
  1. Embedded valid HTML tag is a bit of a grey area right now since we're not supporting the full HTML/XHTML/XML spec.

getAst Method#

Return the underlying AST for the compiled message.

Date/Time/Number Skeleton#

We support ICU Number skeleton and a subset of Date/Time Skeleton for further customization of formats.

Number Skeleton#

Example:

Live Editor
Result
The price is: €100.00

A full set of options and syntax can be found here

Date/Time Skeleton#

ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns

SymbolMeaningNotes
GEra designator
yyear
Mmonth in year
Lstand-alone month in year
dday in month
Eday of week
elocal day of weeke..eee is not supported
cstand-alone local day of weekc..ccc is not supported
aAM/PM marker
hHour [1-12]
HHour [0-23]
KHour [0-11]
kHour [1-24]
mMinute
sSecond
zTime Zone

Example:

Live Editor
Result
Today is: 14/08/2021

Advanced Usage#

Passing in AST#

You can pass in pre-parsed AST to IntlMessageFormat like this:

new IntlMessageFormat('hello').format() // prints out hello
+// is equivalent to
+import IntlMessageFormat from 'intl-messageformat'import {parse} from '@formatjs/icu-messageformat-parser'new IntlMessageFormat(parse('hello')).format() // prints out hello

This helps performance for cases like SSR or preload/precompilation-supported platforms since AST can be cached.

If your messages are all in ASTs, you can alias @formatjs/icu-messageformat-parser to {default: undefined} to save some bytes during bundling.

Formatters#

For complex messages, initializing Intl.* constructors can be expensive. Therefore, we allow user to pass in formatters to provide memoized instances of these Intl objects. This opts combines with passing in AST and fast-memoize can speed things up by 30x per the benchmark down below.

For example:

import IntlMessageFormat from 'intl-messageformat'import memoize from '@formatjs/fast-memoize'const formatters = {  getNumberFormat: memoize(    (locale, opts) => new Intl.NumberFormat(locale, opts)  ),  getDateTimeFormat: memoize(    (locale, opts) => new Intl.DateTimeFormat(locale, opts)  ),  getPluralRules: memoize((locale, opts) => new Intl.PluralRules(locale, opts)),}new IntlMessageFormat('hello {number, number}', 'en', undefined, {  formatters,}).format({number: 3}) // prints out `hello, 3`

Benchmark#

format_cached_complex_msg x 153,868 ops/sec ±1.13% (85 runs sampled)format_cached_string_msg x 21,661,621 ops/sec ±4.06% (84 runs sampled)new_complex_msg_preparsed x 719,056 ops/sec ±2.83% (78 runs sampled)new_complex_msg x 12,844 ops/sec ±1.97% (85 runs sampled)new_string_msg x 409,770 ops/sec ±2.57% (79 runs sampled)complex msg format x 12,065 ops/sec ±1.66% (81 runs sampled)complex msg w/ formatters format x 11,649 ops/sec ±2.05% (78 runs sampled)complex preparsed msg w/ formatters format x 597,153 ops/sec ±1.46% (90 runs sampled)complex preparsed msg w/ new formatters format x 684,263 ops/sec ±1.37% (89 runs sampled)
+ + \ No newline at end of file diff --git a/docs/intl/index.html b/docs/intl/index.html old mode 100644 new mode 100755 index 30533a902..7bc3797d5 --- a/docs/intl/index.html +++ b/docs/intl/index.html @@ -1,201 +1,583 @@ - + - -Core FormatJS Intl | Format.JS - - + + + + + +Core FormatJS Intl | Format.JS + + - -
Skip to main content

Core FormatJS Intl

This library contains core intl API that is used by react-intl.

-

Installation

- -
npm i -S @formatjs/intl
-

The intl object

-

The core of @formatjs/intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated.

-
tip

The intl object should be reused as much as possible for performance.

-

createIntl

-

This allows you to create an IntlShape object that contains all format* methods. For example:

-
import {createIntl, createIntlCache} from '@formatjs/intl'

// This is optional but highly recommended
// since it prevents memory leak
const cache = createIntlCache()

const intl = createIntl(
{
locale: 'fr-FR',
messages: {},
},
cache
)

// Call imperatively
intl.formatNumber(20)
-

createIntlCache

-

Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache.

-

IntlShape

-
interface IntlConfig {
locale: string
timeZone?: string
fallbackOnEmptyString?: boolean
formats: CustomFormats
messages: Record<string, string> | Record<string, MessageFormatElement[]>
defaultLocale: string
defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>>
defaultFormats: CustomFormats
onError(err: string): void
onWarn(warning: string): void
}

interface IntlFormatters {
formatDate(value: number | Date | string, opts?: FormatDateOptions): string
formatTime(value: number | Date | string, opts?: FormatDateOptions): string
formatDateToParts(
value: number | Date | string,
opts?: FormatDateOptions
): Intl.DateTimeFormatPart[]
formatTimeToParts(
value: number | Date | string,
opts?: FormatDateOptions
): Intl.DateTimeFormatPart[]
formatRelativeTime(
value: number,
unit?: FormattableUnit,
opts?: FormatRelativeTimeOptions
): string
formatNumber(value: number, opts?: FormatNumberOptions): string
formatNumberToParts(
value: number,
opts?: FormatNumberOptions
): Intl.NumberFormatPart[]
formatPlural(
value: number | string,
opts?: FormatPluralOptions
): ReturnType<Intl.PluralRules['select']>
formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>
): string
formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>>
): R
formatList(values: Array<string>, opts?: FormatListOptions): string
formatList(
values: Array<string | T>,
opts?: FormatListOptions
): T | string | Array<string | T>
formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[]
formatDisplayName(
value: string,
opts?: FormatDisplayNameOptions
): string | undefined
}

type IntlShape = IntlConfig & IntlFormatters
-

The definition above shows what the intl object will look like. It's made up of two parts:

-
    -
  • IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.
  • -
  • IntlFormatters: The imperative formatting API described below.
  • -
-

locale, formats, and messages

-

The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage.

-

defaultLocale and defaultFormats

-

Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish.

-

onError

-

Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production.

-

defaultRichTextElements

-

A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context.

-

fallbackOnEmptyString

-

Defaults to true.

-

This boolean option can be useful if you want to intentionally provide empty values for certain locales via empty strings. When fallbackOnEmptyString is false, empty strings will be returned instead of triggering the fallback procedure. This behaviour can be leveraged to "skip" content in specific locales.

-

See this issue for more context.

-

formatDate

-
function formatDate(
value: number | Date,
options?: Intl.DateTimeFormatOptions & {format?: string}
): string
-

This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

-
Live Editor
intl.formatDate(Date.now(), {
-  year: 'numeric',
-  month: 'numeric',
-  day: 'numeric',
-})
-
Result
-

formatTime

-
function formatTime(
value: number | Date,
options?: Intl.DateTimeFormatOptions & {format?: string}
): string
-

This function will return a formatted date string, but it differs from formatDate by having the following default options:

-
{
hour: 'numeric',
minute: 'numeric',
}
-

It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

-
Live Editor
intl.formatTime(Date.now()) // "4:03 PM"
-
Result
-

formatRelativeTime

-
browser support

This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them.

-
type Unit =
| 'second'
| 'minute'
| 'hour'
| 'day'
| 'week'
| 'month'
| 'quarter'
| 'year'

type RelativeTimeFormatOptions = {
numeric?: 'always' | 'auto'
style?: 'long' | 'short' | 'narrow'
}

function formatRelativeTime(
value: number,
unit: Unit,
options?: Intl.RelativeTimeFormatOptions & {
format?: string
}
): string
-

This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions.

-
Live Editor
intl.formatRelativeTime(0)
-
Result
-
Live Editor
intl.formatRelativeTime(-24, 'hour', {style: 'narrow'})
-
Result
-

formatNumber

-

This function uses Intl.NumberFormat options.

-
function formatNumber(
value: number,
options?: Intl.NumberFormatOptions & {format?: string}
): string
-

This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions.

-
Live Editor
intl.formatNumber(1000, {style: 'currency', currency: 'USD'})
-
Result
-

Formatting Number using unit

-

Currently this is part of ES2020 NumberFormat. + +

+

Core FormatJS Intl

This library contains core intl API that is used by react-intl.

Installation#

npm i -S @formatjs/intl

The intl object#

The core of @formatjs/intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated.

tip

The intl object should be reused as much as possible for performance.

createIntl#

This allows you to create an IntlShape object that contains all format* methods. For example:

import {createIntl, createIntlCache} from '@formatjs/intl'
+// This is optional but highly recommended// since it prevents memory leakconst cache = createIntlCache()
+const intl = createIntl(  {    locale: 'fr-FR',    messages: {},  },  cache)
+// Call imperativelyintl.formatNumber(20)

createIntlCache#

Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache.

IntlShape#

interface IntlConfig {  locale: string  timeZone?: string  formats: CustomFormats  messages: Record<string, string> | Record<string, MessageFormatElement[]>  defaultLocale: string  defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>>  defaultFormats: CustomFormats  onError(err: string): void}
+interface IntlFormatters {  formatDate(value: number | Date | string, opts?: FormatDateOptions): string  formatTime(value: number | Date | string, opts?: FormatDateOptions): string  formatDateToParts(    value: number | Date | string,    opts?: FormatDateOptions  ): Intl.DateTimeFormatPart[]  formatTimeToParts(    value: number | Date | string,    opts?: FormatDateOptions  ): Intl.DateTimeFormatPart[]  formatRelativeTime(    value: number,    unit?: FormattableUnit,    opts?: FormatRelativeTimeOptions  ): string  formatNumber(value: number, opts?: FormatNumberOptions): string  formatNumberToParts(    value: number,    opts?: FormatNumberOptions  ): Intl.NumberFormatPart[]  formatPlural(    value: number | string,    opts?: FormatPluralOptions  ): ReturnType<Intl.PluralRules['select']>  formatMessage(    descriptor: MessageDescriptor,    values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>  ): string  formatMessage(    descriptor: MessageDescriptor,    values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>>  ): R  formatList(values: Array<string>, opts?: FormatListOptions): string  formatList(    values: Array<string | T>,    opts?: FormatListOptions  ): T | string | Array<string | T>  formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[]  formatDisplayName(    value: string,    opts?: FormatDisplayNameOptions  ): string | undefined}
+type IntlShape = IntlConfig & IntlFormatters

The definition above shows what the intl object will look like. It's made up of two parts:

  • IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.
  • IntlFormatters: The imperative formatting API described below.

locale, formats, and messages#

The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage.

defaultLocale and defaultFormats#

Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embeded date/time is in Spanish.

onError#

Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production.

defaultRichTextElements#

A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context.

formatDate#

function formatDate(  value: number | Date,  options?: Intl.DateTimeFormatOptions & {format?: string}): string

This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

Live Editor
Result
8/14/2021

formatTime#

function formatTime(  value: number | Date,  options?: Intl.DateTimeFormatOptions & {format?: string}): string

This function will return a formatted date string, but it differs from formatDate by having the following default options:

{    hour: 'numeric',    minute: 'numeric',}

It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

Live Editor
Result
SyntaxError: Unexpected token (1:49)
+1 : return (intl.formatTime(Date.now()) // "4:03 PM")
+                                                     ^

formatRelativeTime#

browser support

This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them.

type Unit =  | 'second'  | 'minute'  | 'hour'  | 'day'  | 'week'  | 'month'  | 'quarter'  | 'year'
+type RelativeTimeFormatOptions = {  numeric?: 'always' | 'auto'  style?: 'long' | 'short' | 'narrow'}
+function formatRelativeTime(  value: number,  unit: Unit,  options?: Intl.RelativeTimeFormatOptions & {    format?: string  }): string

This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions.

Live Editor
Result
in 0 seconds
Live Editor
Result
24 hr. ago

formatNumber#

This function uses Intl.NumberFormat options.

function formatNumber(  value: number,  options?: Intl.NumberFormatOptions & {format?: string}): string

This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions.

Live Editor
Result
$1,000.00

Formatting Number using unit

Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and @formatjs/intl types allow users to pass -in a sanctioned unit:

-
Live Editor
intl.formatNumber(1000, {
-  style: 'unit',
-  unit: 'kilobyte',
-  unitDisplay: 'narrow',
-})
-
Result
-
Live Editor
intl.formatNumber(1000, {
-  unit: 'fahrenheit',
-  unitDisplay: 'long',
-  style: 'unit',
-})
-
Result
-

formatPlural

-
type PluralFormatOptions = {
type?: 'cardinal' | 'ordinal' = 'cardinal'
}

function formatPlural(
value: number,
options?: Intl.PluralFormatOptions
): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'
-

This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions.

-

This is a low-level utility whose output could be provided to a switch statement to select a particular string to display.

-
Live Editor
intl.formatPlural(1)
-
Result
-
Live Editor
intl.formatPlural(3, {style: 'ordinal'})
-
Result
-
Live Editor
intl.formatPlural(4, {style: 'ordinal'})
-
Result
-
multiple language support

This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead.

-

formatList

-
browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

-
type ListFormatOptions = {
type?: 'disjunction' | 'conjunction' | 'unit'
style?: 'long' | 'short' | 'narrow'
}

function formatList(
elements: (string | React.ReactNode)[],
options?: Intl.ListFormatOptions
): string | React.ReactNode[]
-

This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en:

-
Live Editor
intl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'})
-
Result
-
Live Editor
intl.formatList(['5 hours', '3 minutes'], {type: 'unit'})
-
Result
-

formatDisplayName

-
browser support

This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them.

-
type FormatDisplayNameOptions = {
style?: 'narrow' | 'short' | 'long'
type?: 'language' | 'region' | 'script' | 'currency'
fallback?: 'code' | 'none'
}

function formatDisplayName(
value: string | number | Record<string, unknown>,
options: FormatDisplayNameOptions
): string | undefined
-

Usage examples:

-
Live Editor
intl.formatDisplayName('zh-Hans-SG', {type: 'language'})
-
Result
-
Live Editor
// ISO-15924 four letters script code to localized display name
-intl.formatDisplayName('Deva', {type: 'script'})
-
Result
-
Live Editor
// ISO-4217 currency code to localized display name
-intl.formatDisplayName('CNY', {type: 'currency'})
-
Result
-
Live Editor
// ISO-3166 two letters region code to localized display name
-intl.formatDisplayName('UN', {type: 'region'})
-
Result
-

formatMessage

-

Message Syntax

-

String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.

-

Simple Message:

-
Hello, {name}
-

Complex Message:

-
Hello, {name}, you have {itemCount, plural,
=0 {no items}
one {# item}
other {# items}
}.
-

See: The Message Syntax Guide.

-

Message Descriptor

-

React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:

-
    -
  • id: A unique, stable identifier for the message
  • -
  • description: Context for the translator about how it's used in the UI
  • -
  • defaultMessage: The default message (probably in English)
  • -
-
type MessageDescriptor = {
id: string
defaultMessage?: string
description?: string | object
}
-
Extracting Message Descriptor

You can extract inline-declared messages from source files using our CLI.

-

Message Formatting Fallbacks

-

The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm:

-
    -
  1. Lookup and format the translated message at id, passed to <IntlProvider>.
  2. -
  3. Fallback to formatting the defaultMessage.
  4. -
  5. Fallback to source of translated message at id.
  6. -
  7. Fallback to source of defaultMessage.
  8. -
  9. Fallback to the literal message id.
  10. -
-

Above, "source" refers to using the template as is, without any substitutions made.

-

Usage

-
type MessageFormatPrimitiveValue = string | number | boolean | null | undefined
function formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, MessageFormatPrimitiveValue>
): string
function formatMessage(
descriptor: MessageDescriptor,
values?: Record<
string,
MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn
>
): string | React.ReactNode[]
-

This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message.

-

If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details.

-
Live Editor
function () {
-  const messages = defineMessages({
-    greeting: {
-      id: 'app.greeting',
-      defaultMessage: 'Hello, {name}!',
-      description: 'Greeting to welcome the user to the app',
-    },
-  })
-
-  return intl.formatMessage(messages.greeting, {name: 'Eric'})
-}
-
Result
-

with ReactElement

-
Live Editor
function () {
-  const messages = defineMessages({
-    greeting: {
-      id: 'app.greeting',
-      defaultMessage: 'Hello, {name}!',
-      description: 'Greeting to welcome the user to the app',
-    },
-  })
-
-  return intl.formatMessage(messages.greeting, {name: <b>Eric</b>})
-}
-
Result
-

with rich text formatting

-
Live Editor
function () {
-  const messages = defineMessages({
-    greeting: {
-      id: 'app.greeting',
-      defaultMessage: 'Hello, <bold>{name}</bold>!',
-      description: 'Greeting to welcome the user to the app',
-    },
-  })
-
-  return intl.formatMessage(messages.greeting, {
-    name: 'Eric',
-    bold: str => <b>{str}</b>,
-  })
-}
-
Result
-

The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin.

-
simple message

Messages can be simple strings without placeholders, and that's the most common type of message.

-

defineMessages/defineMessage

-
interface MessageDescriptor {
id?: string
description?: string | object
defaultMessage?: string
}

function defineMessages(
messageDescriptors: Record<string, MessageDescriptor>
): Record<string, MessageDescriptor>

function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor
-

These functions are exported by the @formatjs/intl package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in.

-
import {defineMessages, defineMessage} from '@formatjs/intl'

const messages = defineMessages({
greeting: {
id: 'app.home.greeting',
description: 'Message to greet the user.',
defaultMessage: 'Hello, {name}!',
},
})

const msg = defineMessage({
id: 'single',
defaultMessage: 'single message',
description: 'header',
})
+in a sanctioned unit:

Live Editor
Result
1,000kB
Live Editor
Result
1,000 degrees Fahrenheit

formatPlural#

type PluralFormatOptions = {  type?: 'cardinal' | 'ordinal' = 'cardinal'}
+function formatPlural(  value: number,  options?: Intl.PluralFormatOptions): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'

This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions.

This is a low-level utility whose output could be provided to a switch statement to select a particular string to display.

Live Editor
Result
one
Live Editor
Result
other
Live Editor
Result
other
multiple language support

This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead.

formatList#

browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

type ListFormatOptions = {  type?: 'disjunction' | 'conjunction' | 'unit'  style?: 'long' | 'short' | 'narrow'}
+function formatList(  elements: (string | React.ReactNode)[],  options?: Intl.ListFormatOptions): string | React.ReactNode[]

This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en:

Live Editor
Result
Me, myself, and I
Live Editor
Result
5 hours, 3 minutes

formatDisplayName#

browser support

This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them.

type FormatDisplayNameOptions = {  style?: 'narrow' | 'short' | 'long'  type?: 'language' | 'region' | 'script' | 'currency'  fallback?: 'code' | 'none'}
+function formatDisplayName(  value: string | number | Record<string, unknown>,  options: FormatDisplayNameOptions): string | undefined

Usage examples:

Live Editor
Result
Simplified Chinese (Singapore)
Live Editor
Result
Devanagari
Live Editor
Result
Chinese Yuan
Live Editor
Result
United Nations

formatMessage#

Message Syntax#

String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.

Simple Message:

Hello, {name}

Complex Message:

Hello, {name}, you have {itemCount, plural,    =0 {no items}    one {# item}    other {# items}}.

See: The Message Syntax Guide.

Message Descriptor#

React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:

  • id: A unique, stable identifier for the message
  • description: Context for the translator about how it's used in the UI
  • defaultMessage: The default message (probably in English)
type MessageDescriptor = {  id: string  defaultMessage?: string  description?: string | object}
Extracting Message Descriptor

You can extract inline-declared messages from source files using our CLI.

Message Formatting Fallbacks#

The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm:

  1. Lookup and format the translated message at id, passed to <IntlProvider>.
  2. Fallback to formatting the defaultMessage.
  3. Fallback to source of translated message at id.
  4. Fallback to source of defaultMessage.
  5. Fallback to the literal message id.

Above, "source" refers to using the template as is, without any substitutions made.

Usage#

type MessageFormatPrimitiveValue = string | number | boolean | null | undefinedfunction formatMessage(  descriptor: MessageDescriptor,  values?: Record<string, MessageFormatPrimitiveValue>): stringfunction formatMessage(  descriptor: MessageDescriptor,  values?: Record<    string,    MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn  >): string | React.ReactNodeArray

This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message.

If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details.

Live Editor
Result
Hello, Eric!

with ReactElement

Live Editor
Result
Hello, Eric!

with rich text formatting

Live Editor
Result
Hello, Eric!

The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin.

simple message

Messages can be simple strings without placeholders, and that's the most common type of message.

defineMessages/defineMessage#

interface MessageDescriptor {  id?: string  description?: string | object  defaultMessage?: string}
+function defineMessages(  messageDescriptors: Record<string, MessageDescriptor>): Record<string, MessageDescriptor>
+function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor

These functions is exported by the @formatjs/intl package and is simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in.

import {defineMessages, defineMessage} from '@formatjs/intl'
+const messages = defineMessages({  greeting: {    id: 'app.home.greeting',    description: 'Message to greet the user.',    defaultMessage: 'Hello, {name}!',  },})
+const msg = defineMessage({  id: 'single',  defaultMessage: 'single message',  description: 'header',})
+ + \ No newline at end of file diff --git a/docs/polyfills/index.html b/docs/polyfills/index.html old mode 100644 new mode 100755 index f78039bda..a1c52fb3f --- a/docs/polyfills/index.html +++ b/docs/polyfills/index.html @@ -1,31 +1,20 @@ - + - -Polyfills | Format.JS - - + + + + + +Polyfills | Format.JS + + - -
Skip to main content

One of our goals is to provide developers with access to newest ECMA-402 Intl APIs. Therefore, FormatJS suite also provide multiple high quality polyfills that are fully tested using the Official ECMAScript Conformance Test Suite.

-

Our current list of polyfills includes:

- -

Polyfill Hierarchy

-

polyfill-fastly.io Integration

-

For basic use cases, we recommend using polyfill-fastly.io or polyfill-library to generate polyfill bundle since it automatically resolves the dependencies above for you.

+ +
+
Skip to main content

Polyfills

One of our goals is to provide developers with access to newest ECMA-402 Intl APIs. Therefore, FormatJS suite also provide multiple high quality polyfills that are fully tested using the Official ECMAScript Conformance Test Suite.

Our current list of polyfills includes:

Polyfill Hierarchy

polyfill.io Integration

For basic use cases, we recommend using polyfill.io or polyfill-library to generate polyfill bundle since it automatically resolves the dependencies above for you.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-datetimeformat/index.html b/docs/polyfills/intl-datetimeformat/index.html old mode 100644 new mode 100755 index a0609bb29..3ff45e7e6 --- a/docs/polyfills/intl-datetimeformat/index.html +++ b/docs/polyfills/intl-datetimeformat/index.html @@ -1,53 +1,24 @@ - + - -Intl.DateTimeFormat (ESNext) | Format.JS - - + + + + + +Intl.DateTimeFormat (ESNext) | Format.JS + + - -
Skip to main content

Intl.DateTimeFormat (ESNext)

A spec-compliant polyfill for Intl.DateTimeFormat fully tested by the official ECMAScript Conformance test suite

-

npm Version -size

-
caution

Right now we only support Gregorian calendar in this polyfill. Therefore we recommend setting calendar: 'gregory' in your options to be safe.

-
caution

Right now this polyfill supports daylight transition until 2100 to reduce the dataset size

-

Features

- -

Installation

- -
npm i @formatjs/intl-datetimeformat
-

Requirements

-

This package requires the following capabilities:

- -

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.DateTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DateTimeFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example:

-
<!-- Polyfill Intl.DateTimeFormat, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.DateTimeFormat,Intl.DateTimeFormat.~locale.en,Intl.NumberFormat.~locale.en"></script>
-

Simple

-
import '@formatjs/intl-datetimeformat/polyfill'
import '@formatjs/intl-datetimeformat/locale-data/en' // locale-data for en
import '@formatjs/intl-datetimeformat/add-all-tz' // Add ALL tz data
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-datetimeformat/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-datetimeformat/polyfill-force')

// Parallelize CLDR data loading
const dataPolyfills = [
import('@formatjs/intl-datetimeformat/add-all-tz'),
import(`@formatjs/intl-datetimeformat/locale-data/${unsupportedLocale}`),
]
await Promise.all(dataPolyfills)
}
-

Adding IANA Timezone Database

-

We provide 2 pre-processed IANA Timezone:

-

Full: contains ALL Timezone from IANA database

-
import '@formatjs/intl-datetimeformat/polyfill'
import '@formatjs/intl-datetimeformat/add-all-tz'
- -
import '@formatjs/intl-datetimeformat/polyfill'
import '@formatjs/intl-datetimeformat/add-golden-tz'
-

Default Timezone

-

Since JS Engines do not expose default timezone, there's currently no way for us to detect local timezone that a browser is in. Therefore, the default timezone in this polyfill is UTC.

-

You can change this by either calling __setDefaultTimeZone or always explicitly pass in timeZone option for accurate date time calculation.

-

Since __setDefaultTimeZone is not in the spec, you should make sure to check for its existence before calling it & after tz data has been loaded, e.g:

-
import '@formatjs/intl-datetimeformat/polyfill'
import '@formatjs/intl-datetimeformat/add-all-tz.js'

if ('__setDefaultTimeZone' in Intl.DateTimeFormat) {
Intl.DateTimeFormat.__setDefaultTimeZone('America/Los_Angeles')
}
-

Tests

-

This library is fully test262-compliant.

+ +
+
Skip to main content

Intl.DateTimeFormat (ESNext)

A spec-compliant polyfill for Intl.DateTimeFormat fully tested by the official ECMAScript Conformance test suite

npm Version +size

caution

Right now we only support Gregorian calendar in this polyfill. Therefore we recommend setting calendar: 'gregory' in your options to be safe.

caution

Right now this polyfill supports daylight transition until 2038 due to Year 2038 problem.

Features#

Installation#

npm i @formatjs/intl-datetimeformat

Requirements#

This package requires the following capabilities:

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.DateTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DateTimeFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example:

<!-- Polyfill Intl.DateTimeFormat, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.DateTimeFormat,Intl.DateTimeFormat.~locale.en,Intl.NumberFormat.~locale.en"></script>

Simple#

import '@formatjs/intl-datetimeformat/polyfill'import '@formatjs/intl-datetimeformat/locale-data/en' // locale-data for enimport '@formatjs/intl-datetimeformat/add-all-tz' // Add ALL tz data

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-datetimeformat/should-polyfill'async function polyfill(locale: string) {  if (!shouldPolyfill(locale)) {    return  }  // Load the polyfill 1st BEFORE loading data  await import('@formatjs/intl-datetimeformat/polyfill')
+  // Parallelize CLDR data loading  const dataPolyfills = [import('@formatjs/intl-datetimeformat/add-all-tz')]
+  switch (locale) {    default:      dataPolyfills.push(import('@formatjs/intl-datetimeformat/locale-data/en'))      break    case 'fr':      dataPolyfills.push(import('@formatjs/intl-datetimeformat/locale-data/fr'))      break  }  await Promise.all(dataPolyfills)}

Adding IANA Timezone Database#

We provide 2 pre-processed IANA Timezone:

Full: contains ALL Timezone from IANA database#

import '@formatjs/intl-datetimeformat/polyfill'import '@formatjs/intl-datetimeformat/add-all-tz'

Golden: contains popular set of timezones from IANA database#

import '@formatjs/intl-datetimeformat/polyfill'import '@formatjs/intl-datetimeformat/add-golden-tz'

Default Timezone#

Since JS Engines do not expose default timezone, there's currently no way for us to detect local timezone that a browser is in. Therefore, the default timezone in this polyfill is UTC.

You can change this by either calling __setDefaultTimeZone or always explicitly pass in timeZone option for accurate date time calculation.

Since __setDefaultTimeZone is not in the spec, you should make sure to check for its existence before calling it & after tz data has been loaded, e.g:

import '@formatjs/intl-datetimeformat/polyfill'import '@formatjs/intl-datetimeformat/add-all-tz.js'
+if ('__setDefaultTimeZone' in Intl.DateTimeFormat) {  Intl.DateTimeFormat.__setDefaultTimeZone('America/Los_Angeles')}

Tests#

This library is fully test262-compliant.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-displaynames/index.html b/docs/polyfills/intl-displaynames/index.html old mode 100644 new mode 100755 index 60da30474..818f2e9b6 --- a/docs/polyfills/intl-displaynames/index.html +++ b/docs/polyfills/intl-displaynames/index.html @@ -1,33 +1,22 @@ - + - -Intl.DisplayNames | Format.JS - - + + + + + +Intl.DisplayNames | Format.JS + + - -
Skip to main content

Intl.DisplayNames

A polyfill for Intl.DisplayNames.

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-displaynames
-

Requirements

- -

Features

-

Everything in intl-displaynames proposal.

-

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.DisplayNames. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DisplayNames.~locale.<locale> to your list of features. For example:

-
<!-- Polyfill Intl.DisplayNames, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.DisplayNames,Intl.DisplayNames.~locale.en"></script>
-

Simple

-
import '@formatjs/intl-displaynames/polyfill'
import '@formatjs/intl-displaynames/locale-data/en' // locale-data for en
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-displaynames/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-displaynames/polyfill-force')
await import(`@formatjs/intl-displaynames/locale-data/${locale}`)
}
+ +
+
Skip to main content

Intl.DisplayNames

A polyfill for Intl.DisplayNames.

npm Version +size

Installation#

npm i @formatjs/intl-displaynames

Requirements#

Features#

Everything in https://github.com/tc39/proposal-intl-displaynames.

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.DisplayNames. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DisplayNames.~locale.<locale> to your list of features. For example:

<!-- Polyfill Intl.DisplayNames, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.DisplayNames,Intl.DisplayNames.~locale.en"></script>

Simple#

import '@formatjs/intl-displaynames/polyfill'import '@formatjs/intl-displaynames/locale-data/en' // locale-data for en

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-displaynames/should-polyfill'async function polyfill(locale: string) {  if (!shouldPolyfill(locale)) {    return  }  // Load the polyfill 1st BEFORE loading data  await import('@formatjs/intl-displaynames/polyfill')
+  switch (locale) {    default:      await import('@formatjs/intl-displaynames/locale-data/en')      break    case 'fr':      await import('@formatjs/intl-displaynames/locale-data/fr')      break  }}
+ + \ No newline at end of file diff --git a/docs/polyfills/intl-durationformat/index.html b/docs/polyfills/intl-durationformat/index.html deleted file mode 100644 index fcb08eb43..000000000 --- a/docs/polyfills/intl-durationformat/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Intl.DurationFormat | Format.JS - - - - -
Skip to main content

Intl.DurationFormat

A spec-compliant polyfill for Intl.DurationFormat

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-durationformat
-

Requirements

- -

Usage

-

Simple

-
import '@formatjs/intl-durationformat/polyfill'
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-durationformat/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-durationformat/polyfill-force')
}
- - \ No newline at end of file diff --git a/docs/polyfills/intl-getcanonicallocales/index.html b/docs/polyfills/intl-getcanonicallocales/index.html old mode 100644 new mode 100755 index 2e23a9e88..f101f17d2 --- a/docs/polyfills/intl-getcanonicallocales/index.html +++ b/docs/polyfills/intl-getcanonicallocales/index.html @@ -1,28 +1,21 @@ - + - -Intl.getCanonicalLocales | Format.JS - - + + + + + +Intl.getCanonicalLocales | Format.JS + + - -
Skip to main content

Intl.getCanonicalLocales

A spec-compliant polyfill/ponyfill for Intl.getCanonicalLocales tested by the official ECMAScript Conformance test suite

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-getcanonicallocales
-

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.GetCanonicalLocales. For example:

-
<!-- Polyfill Intl.GetCanonicalLocales & its dependencies -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.GetCanonicalLocales"></script>
-

Simple

-
import '@formatjs/intl-getcanonicallocales/polyfill'
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-getcanonicallocales/should-polyfill'
async function polyfill() {
// This platform already supports Intl.getCanonicalLocales
if (shouldPolyfill()) {
await import('@formatjs/intl-getcanonicallocales/polyfill')
}
// Alternatively, force the polyfill regardless of support
await import('@formatjs/intl-getcanonicallocales/polyfill-force')
}
-

Tests

-

This library is test262-compliant.

+ +
+
Skip to main content

Intl.getCanonicalLocales

A spec-compliant polyfill/ponyfill for Intl.getCanonicalLocales tested by the official ECMAScript Conformance test suite

npm Version +size

Installation#

npm i @formatjs/intl-getcanonicallocales

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.GetCanonicalLocales. For example:

<!-- Polyfill Intl.GetCanonicalLocales & its dependencies --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.GetCanonicalLocales"></script>

Simple#

import '@formatjs/intl-getcanonicallocales/polyfill'

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-getcanonicallocales/should-polyfill'async function polyfill() {  // This platform already supports Intl.getCanonicalLocales  if (shouldPolyfill()) {    await import('@formatjs/intl-getcanonicallocales/polyfill')  }}

Tests#

This library is test262-compliant.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-listformat/index.html b/docs/polyfills/intl-listformat/index.html old mode 100644 new mode 100755 index 8768922df..6c8bdac0e --- a/docs/polyfills/intl-listformat/index.html +++ b/docs/polyfills/intl-listformat/index.html @@ -1,33 +1,23 @@ - + - -Intl.ListFormat | Format.JS - - + + + + + +Intl.ListFormat | Format.JS + + - -
Skip to main content

Intl.ListFormat

A spec-compliant polyfill for Intl.ListFormat fully tested by the official ECMAScript Conformance test suite

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-listformat
-

Requirements

- -

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.ListFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.ListFormat.~locale.<locale> to your list of features. For example:

-
<!-- Polyfill Intl.ListFormat, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.ListFormat,Intl.ListFormat.~locale.en"></script>
-

Simple

-
import '@formatjs/intl-listformat/polyfill'
import '@formatjs/intl-listformat/locale-data/en' // locale-data for en
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-listformat/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-listformat/polyfill-force')
await import(`@formatjs/intl-listformat/locale-data/${unsupportedLocale}`)
}
-

Tests

-

This library is fully test262-compliant.

+ +
+
Skip to main content

Intl.ListFormat

A spec-compliant polyfill for Intl.ListFormat fully tested by the official ECMAScript Conformance test suite

npm Version +size

Installation#

npm i @formatjs/intl-listformat

Requirements#

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.ListFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.ListFormat.~locale.<locale> to your list of features. For example:

<!-- Polyfill Intl.ListFormat, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.ListFormat,Intl.ListFormat.~locale.en"></script>

Simple#

import '@formatjs/intl-listformat/polyfill'import '@formatjs/intl-listformat/locale-data/en' // locale-data for en

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-listformat/should-polyfill'async function polyfill(locale: string) {  // This platform already supports Intl.ListFormat  if (!shouldPolyfill(locale)) {    return  }  // Load the polyfill 1st BEFORE loading data  await import('@formatjs/intl-listformat/polyfill')
+  switch (locale) {    default:      await import('@formatjs/intl-listformat/locale-data/en')      break
+    case 'fr':      await import('@formatjs/intl-listformat/locale-data/fr')      break  }}

Tests#

This library is fully test262-compliant.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-locale/index.html b/docs/polyfills/intl-locale/index.html old mode 100644 new mode 100755 index 31dcb2cfa..55cf41469 --- a/docs/polyfills/intl-locale/index.html +++ b/docs/polyfills/intl-locale/index.html @@ -1,32 +1,21 @@ - + - -Intl.Locale | Format.JS - - + + + + + +Intl.Locale | Format.JS + + - -
Skip to main content

Intl.Locale

A spec-compliant polyfill/ponyfill for Intl.Locale tested by the official ECMAScript Conformance test suite

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-locale
-

Requirements

- -

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.Locale. For example:

-
<!-- Polyfill Intl.Locale & its dependencies -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.Locale"></script>
-

Simple

-
import '@formatjs/intl-locale/polyfill'
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-locale/should-polyfill'
async function polyfill() {
// This platform already supports Intl.Locale
if (shouldPolyfill()) {
await import('@formatjs/intl-locale/polyfill')
}
// Alternatively, force the polyfill regardless of support
await import('@formatjs/intl-locale/polyfill-force')
}
-

Tests

-

This library is test262-compliant.

+ +
+
Skip to main content

Intl.Locale

A spec-compliant polyfill/ponyfill for Intl.Locale tested by the official ECMAScript Conformance test suite

npm Version +size

Installation#

npm i @formatjs/intl-locale

Requirements#

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.Locale. For example:

<!-- Polyfill Intl.Locale & its dependencies --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.Locale"></script>

Simple#

import '@formatjs/intl-locale/polyfill'

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-locale/should-polyfill'async function polyfill() {  // This platform already supports Intl.Locale  if (shouldPolyfill()) {    await import('@formatjs/intl-locale/polyfill')  }}

Tests#

This library is test262-compliant.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-localematcher/index.html b/docs/polyfills/intl-localematcher/index.html old mode 100644 new mode 100755 index d8a651a49..01c9bafc6 --- a/docs/polyfills/intl-localematcher/index.html +++ b/docs/polyfills/intl-localematcher/index.html @@ -1,26 +1,23 @@ - + - -Intl.LocaleMatcher | Format.JS - - + + + + + +Intl.LocaleMatcher | Format.JS + + - -
Skip to main content

Intl.LocaleMatcher

A spec-compliant ponyfill for Intl.LocaleMatcher. Since this is only stage-1 this package is a ponyfill instead of polyfill.

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-localematcher
-

Requirements

- -

Usage

-

Simple

-
import {match} from '@formatjs/intl-localematcher'

match(['fr-XX', 'en'], ['fr', 'en'], 'en') // 'fr'

match(['zh'], ['fr', 'en'], 'en') // 'en'
+ +
+
Skip to main content

Intl.LocaleMatcher

A spec-compliant ponyfill for Intl.LocaleMatcher. Since this is only stage-1 this package is a ponyfill instead of polyfill.

npm Version +size

Installation#

npm i @formatjs/intl-localematcher

Requirements#

Usage#

Simple#

import {match} from '@formatjs/intl-localematcher'
+match(  ['fr-XX', 'en'],  ['fr', 'en']  'en') // 'fr'
+match(  ['zh'],  ['fr', 'en']  'en') // 'en'
+ + \ No newline at end of file diff --git a/docs/polyfills/intl-numberformat/index.html b/docs/polyfills/intl-numberformat/index.html old mode 100644 new mode 100755 index d3cfdc8db..d841ebc1c --- a/docs/polyfills/intl-numberformat/index.html +++ b/docs/polyfills/intl-numberformat/index.html @@ -1,44 +1,22 @@ - + - -Intl.NumberFormat (ESNext) | Format.JS - - + + + + + +Intl.NumberFormat (ESNext) | Format.JS + + - -
Skip to main content

Intl.NumberFormat (ESNext)

A polyfill for ESNext Intl.NumberFormat and Number.prototype.toLocaleString.

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-numberformat
-

Requirements

-

This package requires the following capabilities:

- -

Features

-

Everything in the ES2020 Internationalization API spec (https://tc39.es/ecma402).

-

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.NumberFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.NumberFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example:

-
<!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en"></script>
-

Or if Intl.PluralRules needs to be polyfilled as well:

-
<!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en,Intl.PluralRules.~locale.en"></script>
-

Simple

-
import '@formatjs/intl-numberformat/polyfill'
import '@formatjs/intl-numberformat/locale-data/en' // locale-data for en
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-numberformat/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-numberformat/polyfill-force')
await import(`@formatjs/intl-numberformat/locale-data/${unsupportedLocale}`)
}
-

Supported Units

-

Simple Units

-

Currently, the spec defines a list of sanctioned units as below.

-
type Unit =
| 'acre'
| 'bit'
| 'byte'
| 'celsius'
| 'centimeter'
| 'day'
| 'degree'
| 'fahrenheit'
| 'fluid-ounce'
| 'foot'
| 'gallon'
| 'gigabit'
| 'gigabyte'
| 'gram'
| 'hectare'
| 'hour'
| 'inch'
| 'kilobit'
| 'kilobyte'
| 'kilogram'
| 'kilometer'
| 'liter'
| 'megabit'
| 'megabyte'
| 'meter'
| 'mile'
| 'mile-scandinavian'
| 'millimeter'
| 'milliliter'
| 'millisecond'
| 'minute'
| 'month'
| 'ounce'
| 'percent'
| 'petabyte'
| 'pound'
| 'second'
| 'stone'
| 'terabit'
| 'terabyte'
| 'week'
| 'yard'
| 'year'
-

Compound Units

-

You can specify X-per-Y unit, where X and Y are sanctioned simple units (e.g. kilometer-per-hour). -The library will choose the best-fit localized pattern to format this compound unit.

+ +
+
Skip to main content

Intl.NumberFormat (ESNext)

A polyfill for ESNext Intl.NumberFormat and Number.prototype.toLocaleString.

npm Version +size

Installation#

npm i @formatjs/intl-numberformat

Requirements#

This package requires the following capabilities:

Features#

Everything in the ES2020 Internationalization API spec (https://tc39.es/ecma402).

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.NumberFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.NumberFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example:

<!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en"></script>

Or if Intl.PluralRules needs to be polyfilled as well:

<!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en,Intl.PluralRules.~locale.en"></script>

Simple#

import '@formatjs/intl-numberformat/polyfill'import '@formatjs/intl-numberformat/locale-data/en' // locale-data for en

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-numberformat/should-polyfill'async function polyfill(locale: string) {  if (!shouldPolyfill(locale)) {    return  }  // Load the polyfill 1st BEFORE loading data  await import('@formatjs/intl-numberformat/polyfill')  switch (locale) {    default:      await import('@formatjs/intl-numberformat/locale-data/en')      break    case 'fr':      await import('@formatjs/intl-numberformat/locale-data/fr')      break  }}

Supported Units#

Simple Units#

Currently, the spec defines a list of sanctioned units as below.

type Unit =  | 'acre'  | 'bit'  | 'byte'  | 'celsius'  | 'centimeter'  | 'day'  | 'degree'  | 'fahrenheit'  | 'fluid-ounce'  | 'foot'  | 'gallon'  | 'gigabit'  | 'gigabyte'  | 'gram'  | 'hectare'  | 'hour'  | 'inch'  | 'kilobit'  | 'kilobyte'  | 'kilogram'  | 'kilometer'  | 'liter'  | 'megabit'  | 'megabyte'  | 'meter'  | 'mile'  | 'mile-scandinavian'  | 'millimeter'  | 'milliliter'  | 'millisecond'  | 'minute'  | 'month'  | 'ounce'  | 'percent'  | 'petabyte'  | 'pound'  | 'second'  | 'stone'  | 'terabit'  | 'terabyte'  | 'week'  | 'yard'  | 'year'

Compound Units#

You can specify X-per-Y unit, where X and Y are sanctioned simple units (e.g. kilometer-per-hour). +The library will choose the best-fit localized pattern to format this compound unit.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-pluralrules/index.html b/docs/polyfills/intl-pluralrules/index.html old mode 100644 new mode 100755 index a4ea710cc..a7402a418 --- a/docs/polyfills/intl-pluralrules/index.html +++ b/docs/polyfills/intl-pluralrules/index.html @@ -1,34 +1,22 @@ - + - -Intl.PluralRules | Format.JS - - + + + + + +Intl.PluralRules | Format.JS + + - -
Skip to main content

Intl.PluralRules

A spec-compliant polyfill for Intl.PluralRules fully tested by the official ECMAScript Conformance test suite

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-pluralrules
-

Requirements

- -

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.PluralRules. By default the created URL does not come with any locale data. In order to add locale data, append Intl.PluralRules.~locale.<locale> to your list of features. For example:

-
<!-- Polyfill Intl.PluralRules, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.PluralRules,Intl.PluralRules.~locale.en"></script>
-

Simple

-
import '@formatjs/intl-pluralrules/polyfill'
import '@formatjs/intl-pluralrules/locale-data/en' // locale-data for en
-

React Native

-

The polyfill conditional detection code runs very slowly on Android and can slow down your app's startup time by seconds. Since React Native uses Hermes which does not support Intl.PluralRules, import /polyfill-force instead for much better performance:

-
import '@formatjs/intl-pluralrules/polyfill-force' // instead of /polyfill
import '@formatjs/intl-pluralrules/locale-data/en'
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-pluralrules/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-pluralrules/polyfill-force')
await import(`@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}`)
}
+ +
+
Skip to main content

Intl.PluralRules

A spec-compliant polyfill for Intl.PluralRules fully tested by the official ECMAScript Conformance test suite

npm Version +size

Installation#

npm i @formatjs/intl-pluralrules

Requirements#

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.PluralRules. By default the created URL does not come with any locale data. In order to add locale data, append Intl.PluralRules.~locale.<locale> to your list of features. For example:

<!-- Polyfill Intl.PluralRules, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.PluralRules,Intl.PluralRules.~locale.en"></script>

Simple#

import '@formatjs/intl-pluralrules/polyfill'import '@formatjs/intl-pluralrules/locale-data/en' // locale-data for en

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-pluralrules/should-polyfill'async function polyfill(locale: string) {  if (!shouldPolyfill(locale)) {    return  }  // Load the polyfill 1st BEFORE loading data  await import('@formatjs/intl-pluralrules/polyfill')
+  switch (locale) {    default:      await import('@formatjs/intl-pluralrules/locale-data/en')      break    case 'fr':      await import('@formatjs/intl-pluralrules/locale-data/fr')      break  }}
+ + \ No newline at end of file diff --git a/docs/polyfills/intl-relativetimeformat/index.html b/docs/polyfills/intl-relativetimeformat/index.html old mode 100644 new mode 100755 index c91c56687..c4bea55c9 --- a/docs/polyfills/intl-relativetimeformat/index.html +++ b/docs/polyfills/intl-relativetimeformat/index.html @@ -1,36 +1,22 @@ - + - -Intl.RelativeTimeFormat | Format.JS - - + + + + + +Intl.RelativeTimeFormat | Format.JS + + - -
Skip to main content

Intl.RelativeTimeFormat

A spec-compliant polyfill for Intl.RelativeTimeFormat fully tested by the official ECMAScript Conformance test suite

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-relativetimeformat
-

Requirements

-

This package requires the following capabilities:

- -

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.RelativeTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.RelativeTimeFormat.~locale.<locale> to your list of features. For example:

-
<!-- Polyfill Intl.RelativeTimeFormat, its dependencies & `en` locale data -->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.RelativeTimeFormat,Intl.RelativeTimeFormat.~locale.en"></script>
-

Simple

-
import '@formatjs/intl-relativetimeformat/polyfill'
import '@formatjs/intl-relativetimeformat/locale-data/en' // locale-data for en
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-relativetimeformat/should-polyfill'
async function polyfill(locale: string) {
const unsupportedLocale = shouldPolyfill(locale)
// This locale is supported
if (!unsupportedLocale) {
return
}
// Load the polyfill 1st BEFORE loading data
await import('@formatjs/intl-relativetimeformat/polyfill-force')
await import(
`@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}`
)
}
-

Tests

-

This library is fully test262-compliant.

+ +
+
Skip to main content

Intl.RelativeTimeFormat

A spec-compliant polyfill for Intl.RelativeTimeFormat fully tested by the official ECMAScript Conformance test suite

npm Version +size

Installation#

npm i @formatjs/intl-relativetimeformat

Requirements#

This package requires the following capabilities:

Usage#

Via polyfill.io#

You can use polyfill.io URL Builder to create a polyfill script tag for Intl.RelativeTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.RelativeTimeFormat.~locale.<locale> to your list of features. For example:

<!-- Polyfill Intl.RelativeTimeFormat, its dependencies & `en` locale data --><script src="https://polyfill.io/v3/polyfill.min.js?features=Intl.RelativeTimeFormat,Intl.RelativeTimeFormat.~locale.en"></script>

Simple#

import '@formatjs/intl-relativetimeformat/polyfill'import '@formatjs/intl-relativetimeformat/locale-data/en' // locale-data for en

Dynamic import + capability detection#

import {shouldPolyfill} from '@formatjs/intl-relativetimeformat/should-polyfill'async function polyfill(locale: string) {  if (!shouldPolyfill(locale)) {    return  }  // Load the polyfill 1st BEFORE loading data  await import('@formatjs/intl-relativetimeformat/polyfill')
+  switch (locale) {    default:      await import('@formatjs/intl-relativetimeformat/locale-data/en')      break    case 'fr':      await import('@formatjs/intl-relativetimeformat/locale-data/fr')      break  }}

Tests#

This library is fully test262-compliant.

+ + \ No newline at end of file diff --git a/docs/polyfills/intl-segmenter/index.html b/docs/polyfills/intl-segmenter/index.html deleted file mode 100644 index 2a0855ca6..000000000 --- a/docs/polyfills/intl-segmenter/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Intl.Segmenter | Format.JS - - - - -
Skip to main content

Intl.Segmenter

A polyfill for Intl.Segmenter.

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-segmenter
-

Features

-

Everything in intl-segmenter proposal

-

Usage

-

Via polyfill-fastly.io

-

You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.Segmenter. -For example:

-
<!-- Polyfill Intl.Segmenter-->
<script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.Segmenter"></script>
-

Simple

-
import '@formatjs/intl-segmenter/polyfill'
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-segmenter/should-polyfill'
async function polyfill(locale: string) {
if (shouldPolyfill()) {
await import('@formatjs/intl-segmenter/polyfill-force')
}
}
- - \ No newline at end of file diff --git a/docs/polyfills/intl-supportedvaluesof/index.html b/docs/polyfills/intl-supportedvaluesof/index.html deleted file mode 100644 index cb82bca9f..000000000 --- a/docs/polyfills/intl-supportedvaluesof/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Intl.supportedValuesOf | Format.JS - - - - -
Skip to main content

Intl.supportedValuesOf

A spec-compliant polyfill/ponyfill for Intl.supportedValuesOf.

-

npm Version -size

-

Installation

- -
npm i @formatjs/intl-enumerator
-

Requirements

- -

Usage

-

Simple

-
import '@formatjs/intl-enumerator/polyfill'
-

Dynamic import + capability detection

-
import {shouldPolyfill} from '@formatjs/intl-enumerator/should-polyfill'
async function polyfill() {
// This platform already supports Intl.supportedValuesOf
if (shouldPolyfill()) {
await import('@formatjs/intl-enumerator/polyfill')
}
// Alternatively, force the polyfill regardless of support
await import('@formatjs/intl-enumerator/polyfill-force')
}
-

Tests

-

This library is test262-compliant.

- - \ No newline at end of file diff --git a/docs/react-intl/api/index.html b/docs/react-intl/api/index.html old mode 100644 new mode 100755 index c1da718d9..e463142ef --- a/docs/react-intl/api/index.html +++ b/docs/react-intl/api/index.html @@ -1,228 +1,615 @@ - + - -Imperative API | Format.JS - - + + + + + +Imperative API | Format.JS + + - -
Skip to main content

Imperative API

There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with its API (documented here) and its React components.

-

Why Imperative API?

-

While our components provide a seamless integration with React, the imperative API are recommended (sometimes required) in several use cases:

-
    -
  • Setting text attributes such as title, aria-label and the like where a React component cannot be used (e.g <img title/>)
  • -
  • Formatting text/datetime... in non-React environment such as Node, Server API, Redux store, testing...
  • -
  • High performance scenarios where the number of React components rendered becomes the bottleneck (e.g Finance stock portfolio rendering, virtual tables with a lot of cells...)
  • -
-

The intl object

-

The core of react-intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated.

-
tip

The intl object should be reused as much as possible for performance.

-

There are a few ways to get access to the intl object:

-
    -
  • useIntl hook: Once you've declared your IntlProvider, you can get access to the intl object via calling this hook in your functional React component
  • -
  • injectIntl HOC: In class-based React components, you can wrap them with the injectIntl HOC and intl should be available as a prop.
  • -
  • createIntl: In a non-React environment (Node, vue, angular, testing... you name it), you can directly create a intl object by calling this function with the same configuration as the IntlProvider.
  • -
-

useIntl hook

-

If a component can be expressed in a form of function component, using useIntl hook can be handy. This useIntl hook does not expect any option as its argument when being called. Typically, here is how you would like to use:

-
import React from 'react'
import {useIntl, FormattedDate} from 'react-intl'

const FunctionComponent: React.FC<{date: number | Date}> = ({date}) => {
const intl = useIntl()
return (
<span title={intl.formatDate(date)}>
<FormattedDate value={date} />
</span>
)
}

export default FunctionComponent
-

To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks.

-

injectIntl HOC

-
type WrappedComponentProps<IntlPropName extends string = 'intl'> = {
[k in IntlPropName]: IntlShape
}

type WithIntlProps<P> = Omit<P, keyof WrappedComponentProps> & {
forwardedRef?: React.Ref<any>
}

function injectIntl<
IntlPropName extends string = 'intl',
P extends WrappedComponentProps<IntlPropName> = WrappedComponentProps<any>,
>(
WrappedComponent: React.ComponentType<P>,
options?: Opts<IntlPropName>
): React.ComponentType<WithIntlProps<P>> & {
WrappedComponent: typeof WrappedComponent
}
-

This function is exported by the react-intl package and is a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.)

-

By default, the formatting API will be provided to the wrapped component via props.intl, but this can be overridden when specifying options.intlPropName. The value of the prop will be of type IntlShape, defined in the next section.

-
import React from 'react'
import {injectIntl, FormattedDate} from 'react-intl'

interface Props {
date: Date | number
}

const FunctionalComponent: React.FC<Props> = props => {
const {
date,
intl, // Injected by `injectIntl`
} = props
return (
<span title={intl.formatDate(date)}>
<FormattedDate value={date} />
</span>
)
}

export default injectIntl(FunctionalComponent)
-

createIntl

-

This allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example:

-
import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'

// This is optional but highly recommended
// since it prevents memory leak
const cache = createIntlCache()

const intl = createIntl({
locale: 'fr-FR',
messages: {}
}, cache)

// Call imperatively
intl.formatNumber(20)

// Pass it to IntlProvider
<RawIntlProvider value={intl}>{foo}</RawIntlProvider>
-

createIntlCache

-

Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache.

-

IntlShape

-
interface IntlConfig {
locale: string
timeZone?: string
formats: CustomFormats
textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements
messages: Record<string, string> | Record<string, MessageFormatElement[]>
defaultLocale: string
defaultFormats: CustomFormats
onError(err: string): void
onWarn(warning: string): void
}

interface IntlFormatters {
formatDate(value: number | Date | string, opts?: FormatDateOptions): string
formatTime(value: number | Date | string, opts?: FormatDateOptions): string
formatDateToParts(
value: number | Date | string,
opts?: FormatDateOptions
): Intl.DateTimeFormatPart[]
formatTimeToParts(
value: number | Date | string,
opts?: FormatDateOptions
): Intl.DateTimeFormatPart[]
formatRelativeTime(
value: number,
unit?: FormattableUnit,
opts?: FormatRelativeTimeOptions
): string
formatNumber(value: number, opts?: FormatNumberOptions): string
formatNumberToParts(
value: number,
opts?: FormatNumberOptions
): Intl.NumberFormatPart[]
formatPlural(
value: number | string,
opts?: FormatPluralOptions
): ReturnType<Intl.PluralRules['select']>
formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>
): string
formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>>
): R
formatList(values: Array<string>, opts?: FormatListOptions): string
formatList(
values: Array<string | T>,
opts?: FormatListOptions
): T | string | Array<string | T>
formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[]
formatDisplayName(
value: string,
opts?: FormatDisplayNameOptions
): string | undefined
}

type IntlShape = IntlConfig & IntlFormatters
-

This interface is exported by the react-intl package that can be used in conjunction with the injectIntl HOC factory function.

-

The definition above shows what the props.intl object will look like that's injected to your component via injectIntl. It's made up of two parts:

-
    -
  • IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.
  • -
  • IntlFormatters: The imperative formatting API described below.
  • -
-

locale, formats, and messages

-

The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage.

-

defaultLocale and defaultFormats

-

Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish.

-

textComponent

-

Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info.

-

onError

-

Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production.

-

wrapRichTextChunksInFragment

-

When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that.

-

defaultRichTextElements

-

A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context.

-

formatDate

-
function formatDate(
value: number | Date | string,
options?: Intl.DateTimeFormatOptions & {format?: string}
): string
-

This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

-
Live Editor
intl.formatDate(Date.now(), {
-  year: 'numeric',
-  month: 'numeric',
-  day: 'numeric',
-})
-
Result
-

formatTime

-
function formatTime(
value: number | Date | string,
options?: Intl.DateTimeFormatOptions & {format?: string}
): string
-

This function will return a formatted date string, but it differs from formatDate by having the following default options:

-
{
hour: 'numeric',
minute: 'numeric',
}
-

It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

-
Live Editor
intl.formatTime(Date.now()) /* "4:03 PM" */
-
Result
-

formatDateTimeRange

-
browser support

This requires Intl.DateTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them.

-
function formatDateTimeRange(
from: number | Date | string,
to: number | Date | string,
options?: Intl.DateTimeFormatOptions & {format?: string}
): string
-

This function will return a formatted date/time range string. Both from & to must be values which can be parsed as a date (i.e., isFinite(new Date(value))).

-

It expects 2 values (a from Date & a to Date) and accepts options that conform to DateTimeFormatOptions.

-
Live Editor
intl.formatDateTimeRange(new Date('2020-1-1'), new Date('2020-1-15'))
-
Result
-

formatRelativeTime

-
browser support

This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them.

-
type Unit =
| 'second'
| 'minute'
| 'hour'
| 'day'
| 'week'
| 'month'
| 'quarter'
| 'year'

type RelativeTimeFormatOptions = {
numeric?: 'always' | 'auto'
style?: 'long' | 'short' | 'narrow'
}

function formatRelativeTime(
value: number,
unit: Unit,
options?: Intl.RelativeTimeFormatOptions & {
format?: string
}
): string
-

This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions.

-
Live Editor
intl.formatRelativeTime(0)
-
Result
-
Live Editor
intl.formatRelativeTime(-24, 'hour', {style: 'narrow'})
-
Result
-

formatNumber

-

This function uses Intl.NumberFormat options.

-
function formatNumber(
value: number,
options?: Intl.NumberFormatOptions & {format?: string}
): string
-

This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions.

-
Live Editor
intl.formatNumber(1000, {style: 'currency', currency: 'USD'})
-
Result
-

Formatting Number using unit

-

Currently this is part of ES2020 NumberFormat. + +

+

Imperative API

There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with its API (documented here) and its React components.

Why Imperative API?#

While our components provide a seamless integration with React, the imperative API are recommended (sometimes required) in several use cases:

  • Setting text attributes such as title, aria-label and the like where a React component cannot be used (e.g <img title/>)
  • Formatting text/datetime... in non-React environment such as Node, Server API, Redux store, testing...
  • High performance scenarios where the number of React components rendered becomes the bottleneck (e.g Finance stock portfolio rendering, virtual tables with a lot of cells...)

The intl object#

The core of react-intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated.

tip

The intl object should be reused as much as possible for performance.

There are a few ways to get access to the intl object:

  • useIntl hook: Once you've declared your IntlProvider, you can get access to the intl object via calling this hook in your functional React component
  • injectIntl HOC: In class-based React components, you can wrap them with the injectIntl HOC and intl should be available as a prop.
  • createIntl: In a non-React environment (Node, vue, angular, testing... you name it), you can directly create a intl object by calling this function with the same configuration as the IntlProvider.

useIntl hook#

If a component can be expressed in a form of function component, using useIntl hook can be handy. This useIntl hook does not expect any option as its argument when being called. Typically, here is how you would like to use:

import React from 'react'import {useIntl, FormattedDate} from 'react-intl'
+const FunctionComponent: React.FC<{date: number | Date}> = ({date}) => {  const intl = useIntl()  return (    <span title={intl.formatDate(date)}>      <FormattedDate value={date} />    </span>  )}
+export default FunctionComponent

To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks.

injectIntl HOC#

type WrappedComponentProps<IntlPropName extends string = 'intl'> = {  [k in IntlPropName]: IntlShape}
+type WithIntlProps<P> = Omit<P, keyof WrappedComponentProps> & {  forwardedRef?: React.Ref<any>}
+function injectIntl<  IntlPropName extends string = 'intl',  P extends WrappedComponentProps<IntlPropName> = WrappedComponentProps<any>>(  WrappedComponent: React.ComponentType<P>,  options?: Opts<IntlPropName>): React.ComponentType<WithIntlProps<P>> & {  WrappedComponent: typeof WrappedComponent}

This function is exported by the react-intl package and is a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.)

By default, the formatting API will be provided to the wrapped component via props.intl, but this can be overridden when specifying options.intlPropName. The value of the prop will be of type IntlShape, defined in the next section.

import React, {PropTypes} from 'react'import {injectIntl, FormattedDate} from 'react-intl'
+interface Props {  date: Date | number}
+const FunctionalComponent: React.FC<Props> = props => {  const {    date,    intl, // Injected by `injectIntl`  } = props  return (    <span title={intl.formatDate(date)}>      <FormattedDate value={date} />    </span>  )}
+export default injectIntl(FunctionalComponent)

createIntl#

This allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example:

import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'
+// This is optional but highly recommended// since it prevents memory leakconst cache = createIntlCache()
+const intl = createIntl({  locale: 'fr-FR',  messages: {}}, cache)
+// Call imperativelyintl.formatNumber(20)
+// Pass it to IntlProvider<RawIntlProvider value={intl}>{foo}</RawIntlProvider>

createIntlCache#

Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache.

IntlShape#

interface IntlConfig {  locale: string  timeZone?: string  formats: CustomFormats  textComponent?: React.ComponentType | keyof React.ReactHTML  messages: Record<string, string> | Record<string, MessageFormatElement[]>  defaultLocale: string  defaultFormats: CustomFormats  onError(err: string): void}
+interface IntlFormatters {  formatDate(value: number | Date | string, opts?: FormatDateOptions): string  formatTime(value: number | Date | string, opts?: FormatDateOptions): string  formatDateToParts(    value: number | Date | string,    opts?: FormatDateOptions  ): Intl.DateTimeFormatPart[]  formatTimeToParts(    value: number | Date | string,    opts?: FormatDateOptions  ): Intl.DateTimeFormatPart[]  formatRelativeTime(    value: number,    unit?: FormattableUnit,    opts?: FormatRelativeTimeOptions  ): string  formatNumber(value: number, opts?: FormatNumberOptions): string  formatNumberToParts(    value: number,    opts?: FormatNumberOptions  ): Intl.NumberFormatPart[]  formatPlural(    value: number | string,    opts?: FormatPluralOptions  ): ReturnType<Intl.PluralRules['select']>  formatMessage(    descriptor: MessageDescriptor,    values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>>  ): string  formatMessage(    descriptor: MessageDescriptor,    values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>>  ): R  formatList(values: Array<string>, opts?: FormatListOptions): string  formatList(    values: Array<string | T>,    opts?: FormatListOptions  ): T | string | Array<string | T>  formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[]  formatDisplayName(    value: string,    opts?: FormatDisplayNameOptions  ): string | undefined}
+type IntlShape = IntlConfig & IntlFormatters

This interface is exported by the react-intl package that can be used in conjunction with the injectIntl HOC factory function.

The definition above shows what the props.intl object will look like that's injected to your component via injectIntl. It's made up of two parts:

  • IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.
  • IntlFormatters: The imperative formatting API described below.

locale, formats, and messages#

The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage.

defaultLocale and defaultFormats#

Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embeded date/time is in Spanish.

textComponent#

Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info.

onError#

Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production.

wrapRichTextChunksInFragment#

When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that.

defaultRichTextElements#

A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context.

formatDate#

function formatDate(  value: number | Date,  options?: Intl.DateTimeFormatOptions & {format?: string}): string

This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

Live Editor
Result
8/14/2021

formatTime#

function formatTime(  value: number | Date,  options?: Intl.DateTimeFormatOptions & {format?: string}): string

This function will return a formatted date string, but it differs from formatDate by having the following default options:

{    hour: 'numeric',    minute: 'numeric',}

It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions.

Live Editor
Result
9:55 PM

formatDateTimeRange#

browser support

This requires stage-3 API Intl.RelativeTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them.

function formatDateTimeRange(  from: number | Date,  to: number | Date,  options?: Intl.DateTimeFormatOptions & {format?: string}): string

This function will return a formatted date/time range string

It expects 2 values (a from Date & a to Date) and accepts options that conform to DateTimeFormatOptions.

Live Editor
Result
1/1/2020 – 1/15/2020

formatRelativeTime#

browser support

This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them.

type Unit =  | 'second'  | 'minute'  | 'hour'  | 'day'  | 'week'  | 'month'  | 'quarter'  | 'year'
+type RelativeTimeFormatOptions = {  numeric?: 'always' | 'auto'  style?: 'long' | 'short' | 'narrow'}
+function formatRelativeTime(  value: number,  unit: Unit,  options?: Intl.RelativeTimeFormatOptions & {    format?: string  }): string

This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions.

Live Editor
Result
in 0 seconds
Live Editor
Result
24 hr. ago

formatNumber#

This function uses Intl.NumberFormat options.

function formatNumber(  value: number,  options?: Intl.NumberFormatOptions & {format?: string}): string

This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions.

Live Editor
Result
$1,000.00

Formatting Number using unit

Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and react-intl types allow users to pass -in a sanctioned unit:

-
Live Editor
intl.formatNumber(1000, {
-  style: 'unit',
-  unit: 'kilobyte',
-  unitDisplay: 'narrow',
-})
-
Result
-
Live Editor
intl.formatNumber(1000, {
-  unit: 'fahrenheit',
-  unitDisplay: 'long',
-  style: 'unit',
-})
-
Result
-

formatPlural

-
type PluralFormatOptions = {
type?: 'cardinal' | 'ordinal' = 'cardinal'
}

function formatPlural(
value: number,
options?: Intl.PluralFormatOptions
): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'
-

This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions.

-

This is a low-level utility whose output could be provided to a switch statement to select a particular string to display.

-
Live Editor
intl.formatPlural(1)
-
Result
-
Live Editor
intl.formatPlural(3, {style: 'ordinal'})
-
Result
-
Live Editor
intl.formatPlural(4, {style: 'ordinal'})
-
Result
-
multiple language support

This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead.

-

formatList

-
browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

-
type ListFormatOptions = {
type?: 'disjunction' | 'conjunction' | 'unit'
style?: 'long' | 'short' | 'narrow'
}

function formatList(
elements: (string | React.ReactNode)[],
options?: Intl.ListFormatOptions
): string | React.ReactNode[]
-

This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en:

-
Live Editor
intl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'})
-
Result
-
Live Editor
intl.formatList(['5 hours', '3 minutes'], {type: 'unit'})
-
Result
-

formatDisplayName

-
browser support

This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them.

-
type FormatDisplayNameOptions = {
style?: 'narrow' | 'short' | 'long'
type?: 'language' | 'region' | 'script' | 'currency'
fallback?: 'code' | 'none'
}

function formatDisplayName(
value: string | number | Record<string, unknown>,
options?: FormatDisplayNameOptions
): string | undefined
-

Usage examples:

-
Live Editor
intl.formatDisplayName('zh-Hans-SG', {type: 'language'})
-
Result
-
Live Editor
// ISO-15924 four letters script code to localized display name
-intl.formatDisplayName('Deva', {type: 'script'})
-
Result
-
Live Editor
// ISO-4217 currency code to localized display name
-intl.formatDisplayName('CNY', {type: 'currency'})
-
Result
-
Live Editor
// ISO-3166 two letters region code to localized display name
-intl.formatDisplayName('UN', {type: 'region'})
-
Result
-

formatMessage

-

Message Syntax

-

String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.

-

Simple Message:

-
Hello, {name}
-

Complex Message:

-
Hello, {name}, you have {itemCount, plural,
=0 {no items}
one {# item}
other {# items}
}.
-

See: The Message Syntax Guide.

-

Message Descriptor

-

React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:

-
    -
  • id: A unique, stable identifier for the message
  • -
  • description: Context for the translator about how it's used in the UI
  • -
  • defaultMessage: The default message (probably in English)
  • -
-
type MessageDescriptor = {
id: string
defaultMessage?: string
description?: string | object
}
-
Extracting Message Descriptor

You can extract inline-declared messages from source files using our CLI.

-

Message Formatting Fallbacks

-

The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm:

-
    -
  1. Lookup and format the translated message at id, passed to <IntlProvider>.
  2. -
  3. Fallback to formatting the defaultMessage.
  4. -
  5. Fallback to source of translated message at id.
  6. -
  7. Fallback to source of defaultMessage.
  8. -
  9. Fallback to the literal message id.
  10. -
-

Above, "source" refers to using the template as is, without any substitutions made.

-

Usage

-
type MessageFormatPrimitiveValue = string | number | boolean | null | undefined
function formatMessage(
descriptor: MessageDescriptor,
values?: Record<string, MessageFormatPrimitiveValue>
): string
function formatMessage(
descriptor: MessageDescriptor,
values?: Record<
string,
MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn
>
): string | React.ReactNode[]
-

This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message.

-

If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details.

-
Live Editor
function () {
-  const messages = defineMessages({
-    greeting: {
-      id: 'app.greeting',
-      defaultMessage: 'Hello, {name}!',
-      description: 'Greeting to welcome the user to the app',
-    },
-  })
-
-  return intl.formatMessage(messages.greeting, {name: 'Eric'})
-}
-
Result
-

with ReactElement

-
Live Editor
function () {
-  const messages = defineMessages({
-    greeting: {
-      id: 'app.greeting',
-      defaultMessage: 'Hello, {name}!',
-      description: 'Greeting to welcome the user to the app',
-    },
-  })
-
-  return intl.formatMessage(messages.greeting, {name: <b>Eric</b>})
-}
-
Result
-

with rich text formatting

-
Live Editor
function () {
-  const messages = defineMessages({
-    greeting: {
-      id: 'app.greeting',
-      defaultMessage: 'Hello, <bold>{name}</bold>!',
-      description: 'Greeting to welcome the user to the app',
-    },
-  })
-
-  return intl.formatMessage(messages.greeting, {
-    name: 'Eric',
-    bold: str => <b>{str}</b>,
-  })
-}
-
Result
-

The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin.

-
simple message

Messages can be simple strings without placeholders, and that's the most common type of message.

-

defineMessages/defineMessage

-
interface MessageDescriptor {
id?: string
description?: string | object
defaultMessage?: string
}

function defineMessages(
messageDescriptors: Record<string, MessageDescriptor>
): Record<string, MessageDescriptor>

function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor
-

These functions are exported by the react-intl package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in.

-
import {defineMessages, defineMessage} from 'react-intl'

const messages = defineMessages({
greeting: {
id: 'app.home.greeting',
description: 'Message to greet the user.',
defaultMessage: 'Hello, {name}!',
},
})

const msg = defineMessage({
id: 'single',
defaultMessage: 'single message',
description: 'header',
})
+in a sanctioned unit:

Live Editor
Result
1,000kB
Live Editor
Result
1,000 degrees Fahrenheit

formatPlural#

type PluralFormatOptions = {  type?: 'cardinal' | 'ordinal' = 'cardinal'}
+function formatPlural(  value: number,  options?: Intl.PluralFormatOptions): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'

This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions.

This is a low-level utility whose output could be provided to a switch statement to select a particular string to display.

Live Editor
Result
one
Live Editor
Result
other
Live Editor
Result
other
multiple language support

This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead.

formatList#

browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

type ListFormatOptions = {  type?: 'disjunction' | 'conjunction' | 'unit'  style?: 'long' | 'short' | 'narrow'}
+function formatList(  elements: (string | React.ReactNode)[],  options?: Intl.ListFormatOptions): string | React.ReactNode[]

This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en:

Live Editor
Result
Me, myself, and I
Live Editor
Result
5 hours, 3 minutes

formatDisplayName#

browser support

This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them.

type FormatDisplayNameOptions = {  style?: 'narrow' | 'short' | 'long'  type?: 'language' | 'region' | 'script' | 'currency'  fallback?: 'code' | 'none'}
+function formatDisplayName(  value: string | number | Record<string, unknown>,  options?: FormatDisplayNameOptions): string | undefined

Usage examples:

Live Editor
Result
Simplified Chinese (Singapore)
Live Editor
Result
Devanagari
Live Editor
Result
Chinese Yuan
Live Editor
Result
United Nations

formatMessage#

Message Syntax#

String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.

Simple Message:

Hello, {name}

Complex Message:

Hello, {name}, you have {itemCount, plural,    =0 {no items}    one {# item}    other {# items}}.

See: The Message Syntax Guide.

Message Descriptor#

React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:

  • id: A unique, stable identifier for the message
  • description: Context for the translator about how it's used in the UI
  • defaultMessage: The default message (probably in English)
type MessageDescriptor = {  id: string  defaultMessage?: string  description?: string | object}
Extracting Message Descriptor

You can extract inline-declared messages from source files using our CLI.

Message Formatting Fallbacks#

The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm:

  1. Lookup and format the translated message at id, passed to <IntlProvider>.
  2. Fallback to formatting the defaultMessage.
  3. Fallback to source of translated message at id.
  4. Fallback to source of defaultMessage.
  5. Fallback to the literal message id.

Above, "source" refers to using the template as is, without any substitutions made.

Usage#

type MessageFormatPrimitiveValue = string | number | boolean | null | undefinedfunction formatMessage(  descriptor: MessageDescriptor,  values?: Record<string, MessageFormatPrimitiveValue>): stringfunction formatMessage(  descriptor: MessageDescriptor,  values?: Record<    string,    MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn  >): string | React.ReactNodeArray

This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message.

If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details.

Live Editor
Result
Hello, Eric!

with ReactElement

Live Editor
Result
Hello, Eric!

with rich text formatting

Live Editor
Result
Hello, Eric!

The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin.

simple message

Messages can be simple strings without placeholders, and that's the most common type of message.

defineMessages/defineMessage#

interface MessageDescriptor {  id?: string  description?: string | object  defaultMessage?: string}
+function defineMessages(  messageDescriptors: Record<string, MessageDescriptor>): Record<string, MessageDescriptor>
+function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor

These functions is exported by the react-intl package and is simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in.

import {defineMessages, defineMessage} from 'react-intl'
+const messages = defineMessages({  greeting: {    id: 'app.home.greeting',    description: 'Message to greet the user.',    defaultMessage: 'Hello, {name}!',  },})
+const msg = defineMessage({  id: 'single',  defaultMessage: 'single message',  description: 'header',})
+ + \ No newline at end of file diff --git a/docs/react-intl/components/index.html b/docs/react-intl/components/index.html old mode 100644 new mode 100755 index bddd4ebfe..4158f24cc --- a/docs/react-intl/components/index.html +++ b/docs/react-intl/components/index.html @@ -1,332 +1,757 @@ - + - -Components | Format.JS - - + + + + + +Components | Format.JS + + - -
Skip to main content

Components

React Intl has a set of React components that provide a declarative way to setup an i18n context and format dates, numbers, and strings for display in a web UI. The components render React elements by building on React Intl's imperative API.

-

Why Components?

-

Beyond providing an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly:

-
    -
  • Render React elements that seamlessly compose with other React components.
  • -
  • Support rich-text string/message formatting in <FormattedMessage>.
  • -
  • Implement advanced features like <FormattedRelativeTime>'s updating over time.
  • -
  • Provide TypeScript type definitions.
  • -
-

IntlProvider

-

React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree.

-
caution

All apps using React Intl must use the <IntlProvider> or <RawIntlProvider> component.

-

This component is used to setup the i18n context for a tree. Usually, this component will wrap an app's root component so that the entire app will be within the configured i18n context. The following are the i18n configuration props that can be set:

-
interface IntlConfig {
locale: string
formats: CustomFormats
messages: Record<string, string> | Record<string, MessageFormatElement[]>
defaultLocale: string
defaultFormats: CustomFormats
timeZone?: string
textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements
wrapRichTextChunksInFragment?: boolean
defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>>
onError(err: string): void
}
-

locale, formats, and messages

-

The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage.

-

defaultLocale and defaultFormats

-

Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish.

-

textComponent

-

Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info.

-

onError

-

Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production.

-

onWarn

-

Allows the user to provide a custom warning handler. By default, warning messages are logged using console.warning if NODE_ENV is not set to production.

-

wrapRichTextChunksInFragment

-

When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that.

-

defaultRichTextElements

-

A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context.

-

These configuration props are combined with the <IntlProvider>'s component-specific props:

-

Props:

-
props: IntlConfig &
{
children: ReactNode,
}
-

Finally, child elements must be supplied to <IntlProvider>.

-

Example:

-
const App = ({importantDate}) => (
<div>
<FormattedDate
value={importantDate}
year="numeric"
month="long"
day="numeric"
weekday="long"
/>
</div>
)

ReactDOM.render(
<IntlProvider locale={navigator.language}>
<App importantDate={new Date(1459913574887)} />
</IntlProvider>,
document.getElementById('container')
)
-

Assuming navigator.language is "fr":

-
<div>mardi 5 avril 2016</div>
-

RawIntlProvider

-

This is the underlying React.Context.Provider object that IntlProvider use. It can be used in conjunction with createIntl:

-
import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'

// This is optional but highly recommended
// since it prevents memory leak
const cache = createIntlCache()

const intl = createIntl({
locale: 'fr-FR',
messages: {}
}, cache)

// Pass it to IntlProvider
<RawIntlProvider value={intl}>{foo}</RawIntlProvider>
-

FormattedDate

-

This component uses the formatDate and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above.

-

Props:

-
props: Intl.DateTimeFormatOptions &
{
value: any,
format: string,
children: (formattedDate: string) => ReactElement,
}
-

By default <FormattedDate> will render the formatted date into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedDate value={new Date(1459832991883)} />
-
Result
-

Example with Options:

-
Live Editor
<FormattedDate
-  value={new Date(1459832991883)}
-  year="numeric"
-  month="long"
-  day="2-digit"
-/>
-
Result
-

FormattedDateParts

-
browser support

This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11.

-

This component provides more customization to FormattedDate by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here

-

Props:

-
props: Intl.DateTimeFormatOptions &
{
value: any,
format: string,
children: (parts: Intl.DateTimeFormatPart[]) => ReactElement,
}
-
Live Editor
<FormattedDateParts
-  value={new Date(1459832991883)}
-  year="numeric"
-  month="long"
-  day="2-digit"
->
-  {parts => (
-    <>
-      <b>{parts[0].value}</b>
-      {parts[1].value}
-      <small>{parts[2].value}</small>
-    </>
-  )}
-</FormattedDateParts>
-
Result
-

FormattedTime

-

This component uses the formatTime and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above, with the following defaults:

-
{
hour: 'numeric',
minute: 'numeric',
}
-

Props:

-
props: DateTimeFormatOptions &
{
value: any,
format: string,
children: (formattedDate: string) => ReactElement,
}
-

By default <FormattedTime> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedTime value={new Date(1459832991883)} />
-
Result
-

FormattedTimeParts

-
browser support

This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11.

-

This component provides more customization to FormattedTime by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here

-

Props:

-
props: Intl.DateTimeFormatOptions &
{
value: any,
format: string,
children: (parts: Intl.DateTimeFormatPart[]) => ReactElement,
}
-
Live Editor
<FormattedTimeParts value={new Date(1459832991883)}>
-  {parts => (
-    <>
-      <b>{parts[0].value}</b>
-      {parts[1].value}
-      <small>{parts[2].value}</small>
-    </>
-  )}
-</FormattedTimeParts>
-
Result
-

FormattedDateTimeRange

-
browser support

This requires stage-3 API Intl.RelativeTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them.

-

This component uses the formatDateTimeRange and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above

-

Props:

-
props: DateTimeFormatOptions &
{
from: number | Date,
to: number | Date,
children: (formattedDate: string) => ReactElement,
}
-

By default <FormattedDateTimeRange> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedDateTimeRange
-  from={new Date('2020-1-1')}
-  to={new Date('2020-1-15')}
-/>
-
Result
-

FormattedRelativeTime

-
browser support

This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them.

-

This component uses the formatRelativeTime API and has props that correspond to the following relative formatting options:

-
type RelativeTimeFormatOptions = {
numeric?: 'always' | 'auto'
style?: 'long' | 'short' | 'narrow'
}
-

Prop Types:

-
props: RelativeTimeFormatOptions &
{
value: number,
unit: Unit,
format: string,
updateIntervalInSeconds: number,
children: (formattedDate: string) => ReactElement,
}
-

By default <FormattedRelativeTime> will render the formatted relative time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedRelativeTime value={0} numeric="auto" updateIntervalInSeconds={1} />
-
Result
-
maximum interval

You can adjust the maximum interval that the component will re-render by setting the updateIntervalInSeconds. A falsy value will turn off auto-updating. The updating is smart and will schedule the next update for the next interesting moment.

-

An interesting moment is defined as the next non-fractional value for that unit. For example:

-
Live Editor
<FormattedRelativeTime value={-50} updateIntervalInSeconds={1} />
-
Result
-

This will initially renders 59 seconds ago, after 1 second, will render 1 minute ago, and will not re-render until a full minute goes by, it'll render 2 minutes ago. It will not try to render 1.2 minutes ago.

-
limitation

updateIntervalInSeconds cannot be enabled for unit longer than hour (so not for day, week, quarter, year). This is primarily because it doesn't make sense to schedule a timeout in days, and the number of ms in a day is larger than the max timeout that setTimeout accepts.

-

FormattedNumber

-

This component uses the formatNumber and Intl.NumberFormat APIs and has props that correspond to Intl.NumberFormatOptions.

-

Props:

-
props: NumberFormatOptions &
{
value: number,
format: string,
children: (formattedNumber: string) => ReactElement,
}
-

By default <FormattedNumber> will render the formatted number into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedNumber value={1000} />
-
Result
-

Example Formatting Currency Values

-
Live Editor
<FormattedNumber value={1000} style="currency" currency="USD" />
-
Result
-

Formatting Number using unit

-

Currently this is part of ES2020 NumberFormat. + +

+

Components

React Intl has a set of React components that provide a declarative way to setup an i18n context and format dates, numbers, and strings for display in a web UI. The components render React elements by building on React Intl's imperative API.

Why Components?#

Beyond providing an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly:

  • Render React elements that seamlessly compose with other React components.
  • Support rich-text string/message formatting in <FormattedMessage>.
  • Implement advanced features like <FormattedRelativeTime>'s updating over time.
  • Provide TypeScript type definitions.

IntlProvider#

React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree.

caution

All apps using React Intl must use the <IntlProvider> or <RawIntlProvider> component.

This component is used to setup the i18n context for a tree. Usually, this component will wrap an app's root component so that the entire app will be within the configured i18n context. The following are the i18n configuration props that can be set:

interface IntlConfig {  locale: string  formats: CustomFormats  messages: Record<string, string> | Record<string, MessageFormatElement[]>  defaultLocale: string  defaultFormats: CustomFormats  timeZone?: string  textComponent?: React.ComponentType | keyof React.ReactHTML  wrapRichTextChunksInFragment?: boolean  defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>>  onError(err: string): void}

locale, formats, and messages#

The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage.

defaultLocale and defaultFormats#

Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embeded date/time is in Spanish.

textComponent#

Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info.

onError#

Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production.

wrapRichTextChunksInFragment#

When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that.

defaultRichTextElements#

A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context.

These configuration props are combined with the <IntlProvider>'s component-specific props:

Props:

props: IntlConfig &  {    children: ReactNode,  }

Finally, child elements must be supplied to <IntlProvider>.

Example:

const App = ({importantDate}) => (  <div>    <FormattedDate      value={importantDate}      year="numeric"      month="long"      day="numeric"      weekday="long"    />  </div>)
+ReactDOM.render(  <IntlProvider locale={navigator.language}>    <App importantDate={new Date(1459913574887)} />  </IntlProvider>,  document.getElementById('container'))

Assuming navigator.language is "fr":

<div>mardi 5 avril 2016</div>

RawIntlProvider#

This is the underlying React.Context.Provider object that IntlProvider use. It can be used in conjunction with createIntl:

import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'
+// This is optional but highly recommended// since it prevents memory leakconst cache = createIntlCache()
+const intl = createIntl({  locale: 'fr-FR',  messages: {}}, cache)
+// Pass it to IntlProvider<RawIntlProvider value={intl}>{foo}</RawIntlProvider>

Dynamic Language Selection#

By default, changes to the locale at runtime may not trigger a re-render of child elements. To solve this, and enable dynamic locale modification, add a key property to the <IntlProvider> and set it to the locale, which persuades React that the component has been modified:

<IntlProvider locale={localeProp} key={localeProp} messages={messagesProp}>  <App /></IntlProvider>

(See Issue #243.)

FormattedDate#

This component uses the formatDate and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above.

Props:

props: Intl.DateTimeFormatOptions &  {    value: any,    format: string,    children: (formattedDate: string) => ReactElement,  }

By default <FormattedDate> will render the formatted date into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

Example:

Live Editor
Result
4/5/2016

Example with Options:

Live Editor
Result
April 05, 2016

FormattedDateParts#

browser support

This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11.

This component provides more customization to FormattedDate by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here

Props:

props: Intl.DateTimeFormatOptions &  {    value: any,    format: string,    children: (parts: Intl.DateTimeFormatPart[]) => ReactElement,  }
Live Editor
Result
April 05

FormattedTime#

This component uses the formatTime and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above, with the following defaults:

{    hour: 'numeric',    minute: 'numeric',}

Props:

props: DateTimeFormatOptions &  {    value: any,    format: string,    children: (formattedDate: string) => ReactElement,  }

By default <FormattedTime> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

Example:

Live Editor
Result
1:09 AM

FormattedTimeParts#

browser support

This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11.

This component provides more customization to FormattedTime by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here

Props:

props: Intl.DateTimeFormatOptions &  {    value: any,    format: string,    children: (parts: Intl.DateTimeFormatPart[]) => ReactElement,  }
Live Editor
Result
1:09

FormattedDateTimeRange#

browser support

This requires stage-3 API Intl.RelativeTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them.

This component uses the formatDateTimeRange and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above

Props:

props: DateTimeFormatOptions &  {    from: number | Date,    to: number | Date,    children: (formattedDate: string) => ReactElement,  }

By default <FormattedDateTimeRange> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

Example:

Live Editor
Result
1/1/2020 – 1/15/2020

FormattedRelativeTime#

browser support

This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them.

This component uses the formatRelativeTime API and has props that correspond to the following relative formatting options:

type RelativeTimeFormatOptions = {  numeric?: 'always' | 'auto'  style?: 'long' | 'short' | 'narrow'}

Prop Types:

props: RelativeTimeFormatOptions &  {    value: number,    unit: Unit,    format: string,    updateIntervalInSeconds: number,    children: (formattedDate: string) => ReactElement,  }

By default <FormattedRelativeTime> will render the formatted relative time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

Example:

Live Editor
Result
now
maximum interval

You can adjust the maximum interval that the component will re-render by setting the updateIntervalInSeconds. A falsy value will turn off auto-updating. The updating is smart and will schedule the next update for the next interesting moment.

An interesting moment is defined as the next non-fractional value for that unit. For example:

Live Editor
Result
50 seconds ago

This will initially renders 59 seconds ago, after 1 second, will render 1 minute ago, and will not re-render until a full minute goes by, it'll render 2 minutes ago. It will not try to render 1.2 minutes ago.

limitation

updateIntervalInSeconds cannot be enabled for unit longer than hour (so not for day, week, quarter, year). This is primarily because it doesn't make sense to schedule a timeout in days, and the number of ms in a day is larger than the max timeout that setTimeout accepts.

FormattedNumber#

This component uses the formatNumber and Intl.NumberFormat APIs and has props that correspond to Intl.NumberFormatOptions.

Props:

props: NumberFormatOptions &  {    value: number,    format: string,    children: (formattedNumber: string) => ReactElement,  }

By default <FormattedNumber> will render the formatted number into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

Example:

Live Editor
Result
1,000

Example Formatting Currency Values

Live Editor
Result
$1,000.00

Formatting Number using unit

Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and react-intl types allow users to pass -in a sanctioned unit. For example:

-
Live Editor
<FormattedNumber
-  value={1000}
-  style="unit"
-  unit="kilobyte"
-  unitDisplay="narrow"
-/>
-
Result
-
Live Editor
<FormattedNumber
-  value={1000}
-  unit="fahrenheit"
-  unitDisplay="long"
-  style="unit"
-/>
-
Result
-

FormattedNumberParts

-
browser support

This requires Intl.NumberFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11.

-

This component provides more customization to FormattedNumber by allowing children function to have access to underlying parts of the formatted number. The available parts are listed here.

-

Props:

-
props: NumberFormatOptions &
{
value: number,
format: string,
children: (parts: Intl.NumberFormatPart[]) => ReactElement,
}
-

Example:

-
Live Editor
<FormattedNumberParts value={1000}>
-  {parts => (
-    <>
-      <b>{parts[0].value}</b>
-      {parts[1].value}
-      <small>{parts[2].value}</small>
-    </>
-  )}
-</FormattedNumberParts>
-
Result
-

FormattedPlural

-

This component uses the formatPlural API and Intl.PluralRules has props that correspond to Intl.PluralRulesOptions.

-

Props:

-
props: PluralFormatOptions &
{
value: any,

other: ReactElement,
zero: ReactElement,
one: ReactElement,
two: ReactElement,
few: ReactElement,
many: ReactElement,

children: (formattedPlural: ReactElement) => ReactElement,
}
-

By default <FormattedPlural> will select a plural category (zero, one, two, few, many, or other) and render the corresponding React element into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedPlural value={10} one="message" other="messages" />
-
Result
-

FormattedList

-
browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

-

This component uses formatList API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions.

-

Props:

-
props: ListFormatOptions &
{
children: (chunksOrString: string | React.ReactElement[]) => ReactElement,
}
-

Example:

-

When the locale is en:

-
Live Editor
<FormattedList type="conjunction" value={['Me', 'myself', 'I']} />
-
Result
-
Live Editor
<FormattedList type="conjunction" value={['Me', <b>myself</b>, 'I']} />
-
Result
-

FormattedListParts

-
browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

-

This component uses formatListToParts API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions.

-

Props:

-
props: ListFormatOptions &
{
children: (chunks: Array<React.ReactElement | string>) => ReactElement,
}
-

Example:

-

When the locale is en:

-
Live Editor
<FormattedListParts type="conjunction" value={['Me', 'myself', 'I']}>
-  {parts => (
-    <>
-      <b>{parts[0].value}</b>
-      {parts[1].value}
-      <small>{parts[2].value}</small>
-      {parts[3].value}
-      <small>{parts[4].value}</small>
-    </>
-  )}
-</FormattedListParts>
-
Result
-

FormattedDisplayName

-
browser support

This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them.

-

This component uses formatDisplayName and Intl.DisplayNames -has props that correspond to DisplayNameOptions. You might need a polyfill.

-

Props:

-
props: FormatDisplayNameOptions &
{
value: string | number | Record<string, unknown>,
}
-

Example:

-

When the locale is en:

-
Live Editor
<FormattedDisplayName type="language" value="zh-Hans-SG" />
-
Result
-
Live Editor
<FormattedDisplayName type="currency" value="JPY" />
-
Result
-

FormattedMessage

-

This component uses the formatMessage API and has props that correspond to a Message Descriptor.

-

Props:

-
props: MessageDescriptor &
{
values: object,
tagName: string,
children: (chunks: ReactElement) => ReactElement,
}
-

Message Syntax

-

String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.

-

Simple Message:

-
Hello, {name}
-

Complex Message:

-
Hello, {name}, you have {itemCount, plural,
=0 {no items}
one {# item}
other {# items}
}.
-

See: The Message Syntax Guide.

-

Message Descriptor

-

React Intl has a Message Descriptor concept which is used to define your app's default messages/strings. <FormattedMessage> have props which correspond to a Message Descriptor. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:

-
    -
  • id: A unique, stable identifier for the message
  • -
  • description: Context for the translator about how it's used in the UI
  • -
  • defaultMessage: The default message (probably in English)
  • -
-
type MessageDescriptor = {
id?: string
defaultMessage?: string
description?: string
}
-
compile message descriptors

The babel-plugin-formatjs and @formatjs/ts-transformer packages can be used to compile Message Descriptors defined in JavaScript source files into AST for performance.

-

Message Formatting Fallbacks

-

The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm:

-
    -
  1. Lookup and format the translated message at id, passed to <IntlProvider>.
  2. -
  3. Fallback to formatting the defaultMessage.
  4. -
  5. Fallback to translated message at id's source.
  6. -
  7. Fallback to defaultMessage source.
  8. -
  9. Fallback to the literal message id.
  10. -
-

Usage

-

By default <FormattedMessage> will render the formatted string into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), specify a different tagName (e.g., 'div'), or pass a function as the child.

-

Example:

-
Live Editor
<FormattedMessage
-  id="app.greeting"
-  description="Greeting to welcome the user to the app"
-  defaultMessage="Hello, {name}!"
-  values={{
-    name: 'Eric',
-  }}
-/>
-
Result
-

Example: function as the child

-
Live Editor
<FormattedMessage id="title">{txt => <h1>{txt}</h1>}</FormattedMessage>
-
Result
-
simple message

Messages can be simple strings without placeholders, and that's the most common type of message. This case is highly-optimized, but still has the benefits of the fallback procedure.

-

Rich Text Formatting

-

<FormattedMessage> also supports rich-text formatting by specifying a XML tag in the message & resolving that tag in the values prop. Here's an example:

-
Live Editor
<FormattedMessage
-  id="app.greeting"
-  description="Greeting to welcome the user to the app"
-  defaultMessage="Hello, <b>Eric</b> {icon}"
-  values={{
-    b: chunks => <b>{chunks}</b>,
-    icon: <svg />,
-  }}
-/>
-
Result
-

By allowing embedding XML tag we want to make sure contextual information is not lost when you need to style part of the string. In a more complicated example like:

-
Live Editor
<FormattedMessage
-  id="foo"
-  defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>"
-  values={{
-    a: chunks => (
-      <a
-        class="external_link"
-        target="_blank"
-        href="https://www.example.com/shoe"
-      >
-        {chunks}
-      </a>
-    ),
-    cta: chunks => <strong class="important">{chunks}</strong>,
-  }}
-/>
-
Result
-

Function as the child

-

Since rich text formatting allows embedding ReactElement, in function as the child scenario, the function will receive the formatted message chunks as a single parameter.

-
Live Editor
<FormattedMessage
-  id="foo"
-  defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>"
-  values={{
-    a: chunks => (
-      <a
-        class="external_link"
-        target="_blank"
-        href="https://www.example.com/shoe"
-      >
-        {chunks}
-      </a>
-    ),
-    cta: chunks => <strong class="important">{chunks}</strong>,
-  }}
->
-  {chunks => <h2>{chunks}</h2>}
-</FormattedMessage>
-
Result
-

All the rich text gets translated together which yields higher quality output. This brings feature-parity with other translation libs as well, such as fluent by Mozilla (using overlays concept).

-

Extending this also allows users to potentially utilizing other rich text format, like Markdown.

+in a sanctioned unit. For example:

Live Editor
Result
1,000kB
Live Editor
Result
1,000 degrees Fahrenheit

FormattedNumberParts#

browser support

This requires Intl.NumberFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11.

This component provides more customization to FormattedNumber by allowing children function to have access to underlying parts of the formatted number. The available parts are listed here.

Props:

props: NumberFormatOptions &  {    value: number,    format: string,    children: (parts: Intl.NumberFormatPart[]) => ReactElement,  }

Example:

Live Editor
Result
1,000

FormattedPlural#

This component uses the formatPlural API and Intl.PluralRules has props that correspond to Intl.PluralRulesOptions.

Props:

props: PluralFormatOptions &  {    value: any,
+    other: ReactElement,    zero: ReactElement,    one: ReactElement,    two: ReactElement,    few: ReactElement,    many: ReactElement,
+    children: (formattedPlural: ReactElement) => ReactElement,  }

By default <FormattedPlural> will select a plural category (zero, one, two, few, many, or other) and render the corresponding React element into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child.

Example:

Live Editor
Result
messages

FormattedList#

browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

This component uses formatList API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions.

Props:

props: ListFormatOptions &  {    children: (chunksOrString: string | React.ReactElement[]) => ReactElement,  }

Example:

When the locale is en:

Live Editor
Result
Me, myself, and I
Live Editor
Result
Me, myself, and I

FormattedListParts#

browser support

This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them.

This component uses formatListToParts API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions.

Props:

props: ListFormatOptions &  {    children: (chunks: Array<React.ReactElement | string>) => ReactElement,  }

Example:

When the locale is en:

Live Editor
Result
Me, myself, and I

FormattedDisplayName#

browser support

This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them.

This component uses formatDisplayName and Intl.DisplayNames +has props that correspond to DisplayNameOptions. You might need a polyfill.

Props:

props: FormatDisplayNameOptions &  {    value: string | number | Record<string, unknown>,  }

Example:

When the locale is en:

Live Editor
Result
Simplified Chinese (Singapore)
Live Editor
Result
Japanese Yen

FormattedMessage#

This component uses the formatMessage API and has props that correspond to a Message Descriptor.

Props:

props: MessageDescriptor &  {    values: object,    tagName: string,    children: (chunks: ReactElement) => ReactElement,  }

Message Syntax#

String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.

Simple Message:

Hello, {name}

Complex Message:

Hello, {name}, you have {itemCount, plural,    =0 {no items}    one {# item}    other {# items}}.

See: The Message Syntax Guide.

Message Descriptor#

React Intl has a Message Descriptor concept which is used to define your app's default messages/strings. <FormattedMessage> have props which correspond to a Message Descriptor. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:

  • id: A unique, stable identifier for the message
  • description: Context for the translator about how it's used in the UI
  • defaultMessage: The default message (probably in English)
type MessageDescriptor = {  id?: string  defaultMessage?: string  description?: string}
compile message descriptors

The babel-plugin-formatjs and @formatjs/ts-transformer packages can be used to compile Message Descriptors defined in JavaScript source files into AST for performance.

Message Formatting Fallbacks#

The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm:

  1. Lookup and format the translated message at id, passed to <IntlProvider>.
  2. Fallback to formatting the defaultMessage.
  3. Fallback to translated message at id's source.
  4. Fallback to defaultMessage source.
  5. Fallback to the literal message id.

Usage#

By default <FormattedMessage> will render the formatted string into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), specify a different tagName (e.g., 'div'), or pass a function as the child.

Example:

Live Editor
Result
Hello, Eric!

Example: function as the child

Live Editor
Result

title

simple message

Messages can be simple strings without placeholders, and that's the most common type of message. This case is highly-optimized, but still has the benefits of the fallback procedure.

Rich Text Formatting#

<FormattedMessage> also supports rich-text formatting by specifying a XML tag in the message & resolving that tag in the values prop. Here's an example:

Live Editor
Result
Hello, Eric

By allowing embedding XML tag we want to make sure contextual information is not lost when you need to style part of the string. In a more complicated example like:

Live Editor
Result
To buy a shoe, visit our website and buy a shoe

Function as the child#

Since rich text formatting allows embedding ReactElement, in function as the child scenario, the function will receive the formatted message chunks as a single parameter.

Live Editor
Result

To buy a shoe, visit our website and buy a shoe

All the rich text gets translated together which yields higher quality output. This brings feature-parity with other translation libs as well, such as fluent by Mozilla (using overlays concept).

Extending this also allows users to potentially utilizing other rich text format, like Markdown.

+ + \ No newline at end of file diff --git a/docs/react-intl/index.html b/docs/react-intl/index.html old mode 100644 new mode 100755 index 5f817b34f..0a07c275d --- a/docs/react-intl/index.html +++ b/docs/react-intl/index.html @@ -1,174 +1,28 @@ - + - -Overview | Format.JS - - + + + + + +Overview | Format.JS + + - -
Skip to main content

Overview

npm Version

-

Welcome to React Intl's docs! This is the place to find React Intl's docs. Feel free to open a pull request and contribute to the docs to make them better.

-

Runtime Requirements

-

We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari.

-

React Intl relies on these Intl APIs:

- -

If you need to support older browsers, we recommend you do the following:

-
    -
  1. -

    If you're supporting browsers that do not have Intl, include this polyfill in your build.

    -
  2. -
  3. -

    Polyfill Intl.NumberFormat with @formatjs/intl-numberformat.

    -
  4. -
  5. -

    Polyfill Intl.DateTimeFormat with @formatjs/intl-datetimeformat

    -
  6. -
  7. -

    If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build.

    -
  8. -
  9. -

    If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 12-), include this polyfill in your build along with individual CLDR data for each locale you support.

    -
  10. -
  11. -

    If you need Intl.DisplayNames, include this polyfill in your build along with individual CLDR data for each locale you support.

    -
  12. -
-

Node.js

-

full-icu

-

Starting with Node.js 13.0.0 full-icu is supported by default.

-

If using React Intl in an earlier version of Node.js, your node binary has to either:

- -

OR

- -

If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly.

-

React Native

-

If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details:

- -

React Native on iOS

-

If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in Runtime Requirements to polyfill those APIs accordingly.

-

The react-intl Package

-

Install the react-intl npm package via npm:

- -
npm i -S react-intl
-

The react-intl npm package distributes the following modules (links from unpkg):

-
    -
  • CommonJS: -unbundled dependencies, "main" in package.json, warnings in dev.
  • -
  • ES6: -unbundled dependencies, "module" in package.json, warnings in dev.
  • -
-

Module Bundlers

-

We've made React Intl work well with module bundlers like: Browserify, Webpack, or Rollup which can be used to bundle React Intl for the browser:

-
    -
  • -

    The "browser" field in package.json is specified so that only basic English locale data is included when bundling. This way when using the "main" module in Node all locale data is loaded, but ignored when bundled for the browser.

    -
  • -
  • -

    An ES6 version of React Intl is provided as "jsnext:main" and "module" in package.json and can be used with Rollup.

    -
  • -
  • -

    Development-time warnings are wrapped with process.env.NODE_ENV !== 'production', this allows you to specify NODE_ENV when bundling and minifying to have these code blocks removed.

    -
  • -
-

The React Intl Module

-

Whether you use the ES6, CommonJS, or UMD version of React Intl, they all provide the same named exports:

- -
react

When using the UMD version of React Intl without a module system, it will expect react to exist on the global variable: React, and put the above named exports on the global variable: ReactIntl.

-

Creating an I18n Context

-

Now with React Intl and its locale data loaded an i18n context can be created for your React app.

-

React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree.

-

All apps using React Intl must use the <IntlProvider> component.

-

The most common usage is to wrap your root React component with <IntlProvider> and configure it with the user's current locale and the corresponding translated strings/messages:

-
ReactDOM.render(
<IntlProvider locale={usersLocale} messages={translationsForUsersLocale}>
<App />
</IntlProvider>,
document.getElementById('container')
)
-

See: The <IntlProvider> docs for more details.

-

Formatting Data

-

React Intl has two ways to format data, through React components and its API. The components provide an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly. The API should be used when your React component needs to format data to a string value where a React element is not suitable; e.g., a title or aria attribute, or for side-effect in componentDidMount.

-

React Intl's imperative API is accessed via injectIntl, a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.)

-

Here's an example using <IntlProvider>, <Formatted*> components, and the imperative API to setup an i18n context and format data:

-
import React from 'react';
import ReactDOM from 'react-dom';
import {IntlProvider, FormattedRelative, useIntl} from 'react-intl';

const MS_IN_DAY = 1e3 * 3600 * 24

const PostDate = ({date}) => {
const intl = useIntl()
return (
<span title={intl.formatDate(date)}>
<FormattedRelativeTime value={(Date.now() - date)/MS_IN_DAY} unit="day"/>
</span>
)
});

const App = ({post}) => (
<div>
<h1>{post.title}</h1>
<p>
<PostDate date={post.date} />
</p>
<div>{post.body}</div>
</div>
);

ReactDOM.render(
<IntlProvider locale={navigator.language}>
<App
post={{
title: 'Hello, World!',
date: new Date(1459913574887),
body: 'Amazing content.',
}}
/>
</IntlProvider>,
document.getElementById('container')
);
-

Assuming navigator.language is "en-us":

-
<div>
<h1>Hello, World!</h1>
<p><span title="4/5/2016">yesterday</span></p>
<div>Amazing content.</div>
</div>
-

See: The API docs and Component docs for more details.

-

ESM Build

-

react-intl and its underlying libraries (@formatjs/icu-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries.

-

Jest

-

Add transformIgnorePatterns to always include those libraries, e.g:

-
{
transformIgnorePatterns: [
'/node_modules/(?!intl-messageformat|@formatjs/icu-messageformat-parser).+\\.js$',
],
}
-

webpack

-

If you're using babel-loader, or ts-loader, you can do 1 of the following:

-
    -
  1. Add those libraries in include:
  2. -
-
{
include: [
path.join(__dirname, 'node_modules/react-intl'),
path.join(__dirname, 'node_modules/intl-messageformat'),
path.join(__dirname, 'node_modules/@formatjs/icu-messageformat-parser'),
]
}
-

OR

-
    -
  1. Add those libraries in exclude:
  2. -
-
exclude: /node_modules\/(?!react-intl|intl-messageformat|@formatjs\/icu-messageformat-parser)/,
-

Core Concepts

-
    -
  • Formatters (Date, Number, Message, Relative)
  • -
  • Provider and Injector
  • -
  • API and Components
  • -
  • Message Descriptor
  • -
  • Message Syntax
  • -
  • Defining default messages for extraction
  • -
  • Custom, named formats
  • -
-

Example Apps

-

There are several runnable example apps in this Git repo. These are a great way to see React Intl's core concepts in action in simplified applications.

-

API Reference

-

There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with Intl built-ins, React Intl's API, and its React components:

- -

TypeScript Usage

-

react-intl is written in TypeScript, thus having 1st-class TS support.

-

In order to use react-intl in TypeScript, make sure your compilerOptions's lib config include ["esnext.intl", "es2017.intl", "es2018.intl"].

-

Typing message IDs and locale

-

By default, the type for the id prop of <FormattedMessage> and formatMessage is string. However, you can set a more restrictive type to get autocomplete and error checking. In order to do this, override the following global namespace with the union type of all of your message IDs. You can do this by including the following somewhere in your code:

-
declare global {
namespace FormatjsIntl {
interface Message {
ids: keyof typeof messages
}
}
}
-

Where messages is the object you would normally pass to <IntlProvider>, and would look something like:

-
const messages = {
greeting: 'Hello',
planet: 'World',
// ...
}
-

You can also override the following global to use a custom type for locale

-
declare global {
namespace FormatjsIntl {
interface IntlConfig {
locale: 'en' | 'fr'
}
}
}
-

Advanced Usage

-

Our Advanced Usage has further guides for production setup in environments where performance is important.

-

Supported Tooling

-

Message extraction

-

We've built @formatjs/cli that helps you extract messages from a list of files. It uses babel-plugin-formatjs under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below:

-
import {defineMessages} from 'react-intl'

defineMessages({
foo: {
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
},
})
-
import {FormattedMessage} from 'react-intl'
;<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
-
function Comp(props) {
const {intl} = props
return intl.formatMessage({
// The whole `intl.formatMessage` is required so we can extract
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
})
}
-

ESLint Plugin

-

We've also built eslint-plugin-formatjs that helps enforcing specific rules on your messages if your translation vendor has restrictions.

+ +
+
Skip to main content

Overview

npm Version

Welcome to React Intl's docs! This is the place to find React Intl's docs. Feel free to open a pull request and contribute to the docs to make them better.

Runtime Requirements#

We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari.

React Intl relies on these Intl APIs:

If you need to support older browsers, we recommend you do the following:

  1. Polyfill Intl.NumberFormat with @formatjs/intl-numberformat.

  2. Polyfill Intl.DateTimeFormat with @formatjs/intl-datetimeformat

  3. If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build.

  4. If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 12-), include this polyfill in your build along with individual CLDR data for each locale you support.

  5. If you need Intl.DisplayNames, include this polyfill in your build along with individual CLDR data for each locale you support.

Browser#

We officially support IE11 along with 2 most recent versions of Edge, Chrome & Firefox.

Node.js#

full-icu#

Starting with Node.js 13.0.0 full-icu is supported by default.

If using React Intl in an earlier version of Node.js, your node binary has to either:

OR

If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly.

React Native#

If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details:

React Native on iOS#

If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in Runtime Requirements to polyfill those APIs accordingly.

Experimental Intl Features#

FormatJS also provides types & polyfill for the following Intl API proposals:

The react-intl Package#

Install the react-intl npm package via npm:

npm i -S react-intl

The react-intl npm package distributes the following modules (links from unpkg):

  • CommonJS: +unbundled dependencies, "main" in package.json, warnings in dev.
  • ES6: +unbundled dependencies, "module" in package.json, warnings in dev.

Module Bundlers#

We've made React Intl work well with module bundlers like: Browserify, Webpack, or Rollup which can be used to bundle React Intl for the browser:

  • The "browser" field in package.json is specified so that only basic English locale data is included when bundling. This way when using the "main" module in Node all locale data is loaded, but ignored when bundled for the browser.

  • An ES6 version of React Intl is provided as "jsnext:main" and "module" in package.json and can be used with Rollup.

  • Development-time warnings are wrapped with process.env.NODE_ENV !== 'production', this allows you to specify NODE_ENV when bundling and minifying to have these code blocks removed.

The React Intl Module#

Whether you use the ES6, CommonJS, or UMD version of React Intl, they all provide the same named exports:

react

When using the UMD version of React Intl without a module system, it will expect react to exist on the global variable: React, and put the above named exports on the global variable: ReactIntl.

Creating an I18n Context#

Now with React Intl and its locale data loaded an i18n context can be created for your React app.

React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree.

All apps using React Intl must use the <IntlProvider> component.

The most common usage is to wrap your root React component with <IntlProvider> and configure it with the user's current locale and the corresponding translated strings/messages:

ReactDOM.render(  <IntlProvider locale={usersLocale} messages={translationsForUsersLocale}>    <App />  </IntlProvider>,  document.getElementById('container'))

See: The <IntlProvider> docs for more details.

Formatting Data#

React Intl has two ways to format data, through React components and its API. The components provide an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly. The API should be used when your React component needs to format data to a string value where a React element is not suitable; e.g., a title or aria attribute, or for side-effect in componentDidMount.

React Intl's imperative API is accessed via injectIntl, a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.)

Here's an example using <IntlProvider>, <Formatted*> components, and the imperative API to setup an i18n context and format data:

import React from 'react';import ReactDOM from 'react-dom';import {injectIntl, IntlProvider, FormattedRelative, useIntl} from 'react-intl';
+const MS_IN_DAY = 1e3 * 3600 * 24
+const PostDate = ({date}) => {  const intl = useIntl()  return (    <span title={intl.formatDate(date)}>      <FormattedRelativeTime value={(Date.now() - date)/MS_IN_DAY} unit="day"/>    </span>  )});
+const App = ({post}) => (  <div>    <h1>{post.title}</h1>    <p>      <PostDate date={post.date} />    </p>    <div>{post.body}</div>  </div>);
+ReactDOM.render(  <IntlProvider locale={navigator.language}>    <App      post={{        title: 'Hello, World!',        date: new Date(1459913574887),        body: 'Amazing content.',      }}    />  </IntlProvider>,  document.getElementById('container'));

Assuming navigator.language is "en-us":

<div>  <h1>Hello, World!</h1>  <p><span title="4/5/2016">yesterday</span></p>  <div>Amazing content.</div></div>

See: The API docs and Component docs for more details.

ESM Build

react-intl and its underlying libraries (@formatjs/icu-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries.

Jest#

Add transformIgnorePatterns to always include those libraries, e.g:

{  transformIgnorePatterns: [    '/node_modules/(?!intl-messageformat|@formatjs/icu-messageformat-parser).+\\.js$',  ],}

webpack#

If you're using babel-loader, or ts-loader, you can do 1 of the following:

  1. Add those libraries in include:
{  include: [    path.join(__dirname, 'node_modules/react-intl'),    path.join(__dirname, 'node_modules/intl-messageformat'),    path.join(__dirname, 'node_modules/@formatjs/icu-messageformat-parser'),  ]}

OR

  1. Add those libraries in exclude:
exclude: /node_modules\/(?!react-intl|intl-messageformat|@formatjs\/icu-messageformat-parser)/,

Core Concepts

  • Formatters (Date, Number, Message, Relative)
  • Provider and Injector
  • API and Components
  • Message Descriptor
  • Message Syntax
  • Defining default messages for extraction
  • Custom, named formats

Example Apps

There are several runnable example apps in this Git repo. These are a great way to see React Intl's core concepts in action in simplified applications.

API Reference

There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with Intl built-ins, React Intl's API, and its React components:

TypeScript Usage

react-intl is written in TypeScript, thus having 1st-class TS support.

In order to use react-intl in TypeScript, make sure your compilerOptions's lib config include ["esnext.intl", "es2017.intl", "es2018.intl"].

Advanced Usage

Our Advanced Usage has further guides for production setup in environments where performance is important.

Supported Tooling

Message extraction#

We've built @formatjs/cli that helps you extract messages from a list of files. It uses babel-plugin-formatjs under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below:

import {defineMessages} from 'react-intl'
+defineMessages({  foo: {    id: 'foo',    defaultMessage: 'foo',    description: 'bar',  },})
import {FormattedMessage} from 'react-intl';<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
function Comp(props) {  const {intl} = props  return intl.formatMessage({    // The whole `intl.formatMessage` is required so we can extract    id: 'foo',    defaultMessage: 'foo',    description: 'bar',  })}

ESLint Plugin#

We've also built eslint-plugin-formatjs that helps enforcing specific rules on your messages if your translation vendor has restrictions.

+ + \ No newline at end of file diff --git a/docs/react-intl/upgrade-guide-2x/index.html b/docs/react-intl/upgrade-guide-2x/index.html old mode 100644 new mode 100755 index 2f8c7c9f3..de445c432 --- a/docs/react-intl/upgrade-guide-2x/index.html +++ b/docs/react-intl/upgrade-guide-2x/index.html @@ -1,88 +1,33 @@ - + - -Upgrade Guide (v1 -> v2) | Format.JS - - + + + + + +Upgrade Guide (v1 -> v2) | Format.JS + + - -
Skip to main content

Upgrade Guide (v1 -> v2)

Use React 0.14 or 15

-

React Intl v2 has a peer dependency on react@^0.14.0 || ^15.0.0-0 and now takes advantage of features and changes in React 0.14 and also works with React 15.

-

Update How Locale Data is Added

-

The locale data modules in React Intl v2 have been refactored to provide data, instead of mutating React Intl's internal locale data registry. The react-intl/locale-data/* files are also decoupled from the ReactIntl global and instead provide UMD modules with a new ReactIntlLocaleData global. These changes, mean apps need update how they are registering the locale data they need in the browser.

-

Add Call to addLocaleData() in Browser

-

There is now an addLocaleData() function that needs to be called with the locale data that has been loaded. You can do the following in your main client JavaScript entry point:

-

This assumes a locale data <script> is added based on the request; e.g., for French speaking users:

-
<script src="react-intl/locale-data/fr.js"></script>
-

Using <script src="react-intl/dist/react-intl.js>

-
if ('ReactIntl' in window && 'ReactIntlLocaleData' in window) {
Object.keys(ReactIntlLocaleData).forEach(lang => {
ReactIntl.addLocaleData(ReactIntlLocaleData[lang])
})
}
-

Using Browserify/Webpack to Load React Intl

-
import {addLocaleData} from 'react-intl'

if ('ReactIntlLocaleData' in window) {
Object.keys(ReactIntlLocaleData).forEach(lang => {
addLocaleData(ReactIntlLocaleData[lang])
})
}
-
info

This decoupling of the library from the locale data, allows for the files to be loaded via <script async>. When using async scripts, your client bootstrapping code will need to wait for the load event, including the code above.

-

Remove Intl Mixin

-

The IntlMixin has been removed from React Intl v2. The mixin did two things: it automatically propagated locales, formats, and messages throughout an app's hierarchy, and it provided an imperative API via format*() functions. These jobs are now handled by <IntlProvider> and injectIntl(), respectively:

-

Update to IntlProvider

-

In React Intl v1, you would add the IntlMixin to your root component; e.g., <App>. Remove the IntlMixin and instead wrap your root component with <IntlProvider>:

-
import ReactDOM from 'react-dom'
import {IntlProvider} from 'react-intl'

ReactDOM.render(
<IntlProvider locale="en">
<App />
</IntlProvider>,
document.getElementById('container')
)
-
info

The locale prop is singular, required, and only accepts a string value. This is a simplification of the plural locales prop used by the IntlMixin.

-

Update to injectIntl()

-

The IntlMixin also provided the imperative API for custom components to use the format*() methods; e.g., formatDate() to get formatted strings for using in places like title and aria attribute. Remove the IntlMixin and instead use the injectIntl() Hight Order Component (HOC) factory function to inject the imperative API via props.

-

Here's an example of a custom <RelativeTime> stateless component which uses injectIntl() and the imperative formatDate() API:

-
import React from 'react'
import {injectIntl, FormattedRelative} from 'react-intl'

const to2Digits = num => `${num < 10 ? `0${num}` : num}`

const RelativeTime = ({date, intl}) => {
date = new Date(date)

let year = date.getFullYear()
let month = date.getMonth() + 1
let day = date.getDate()

let formattedDate = intl.formatDate(date, {
year: 'long',
month: 'numeric',
day: 'numeric',
})

return (
<time
dateTime={`${year}-${to2Digits(month)}-${to2Digits(day)}`}
title={formattedDate}
>
<FormattedRelative value={date} />
</time>
)
}

export default injectIntl(RelativeTime)
-

injectIntl() is similar to a connect() HOC factory function you might find in a Flux framework to connect a component to a store.

-

Change How Messages are Formatted

-

The way string messages are formatted in React Intl v2 has changed significantly! This is the most disruptive set of change when upgrading from v1 to v2; but it enables many great new features.

-

React Intl v2 introduces a new Message Descriptor concept which can be used to define an app's default string messages. A Message Descriptor is an object with the following properties, id is the only required prop:

-
    -
  • id: A unique, stable identifier for the message
  • -
  • description: Context for the translator about how it's used in the UI
  • -
  • defaultMessage: The default message (probably in English)
  • -
-
info

This upgrade guide will focus on using Message Descriptors that only contain an id property.

-

Flatten messages Object

-

React Intl v2 no longer supports nested messages objects, instead the collection of translated string messages passed to <IntlProvider> must be flat. This is an explicit design choice which simplifies while increasing flexibility. React Intl v2 does not apply any special semantics to strings with dots; e.g., "namespaced.string_id".

-

Apps using a nested messages object structure could use the following function to flatten their object according to React Intl v1's semantics:

-
function flattenMessages(nestedMessages, prefix = '') {
return Object.keys(nestedMessages).reduce((messages, key) => {
let value = nestedMessages[key]
let prefixedKey = prefix ? `${prefix}.${key}` : key

if (typeof value === 'string') {
messages[prefixedKey] = value
} else {
Object.assign(messages, flattenMessages(value, prefixedKey))
}

return messages
}, {})
}

let messages = flattenMessages(nestedMessages)
-
info

Message ids can still contain "."s, so the ids themselves remain the same, it's only the messages object structure that needs to change.

-

Replace getIntlMessage() Calls with Message Descriptors

-

The getIntlMessage() method that was provided by the IntlMixin has been removed in React Intl v2. It was simply a helper that interpreted a message id string with "."s by looking up the translated message in a nested messages object. With the removal of IntlMixin and the change to a flat messages object, this method has been removed.

-

All calls to getIntlMessage() need to be replaced with a Message Descriptor.

-

Replace:

-
this.getIntlMessage('some.message.id')
-

With:

-
{
id: 'some.message.id'
}
-

Update formatMessage() Calls

-

A typical pattern when calling formatMessage() is to nest a call to getIntlMessage(). These can be easily updated:

-

1.0:

-
let message = this.formatMessage(this.getIntlMessage('some.message.id'), values)
-

2.0:

-
let message = this.props.intl.formatMessage({id: 'some.message.id'}, values)
-
info

In React Intl v2, the formatMessage() function is injected via injectIntl().

-

Update FormattedMessage and FormattedHTMLMessage Instances

-

The props for these two components have completely changed in React Intl v2. Instead of taking a message prop and treating all other props as values to fill in placeholders in a message, <FormattedMessage> and <FormattedHTMLMessage> now the same props as a Message Descriptor plus a new values prop.

-

The new values prop groups all of the message's placeholder values together into an object.

-

The following example shows up to update a <FormattedMessage> instance to use the new props and remove the call to getIntlMessage():

-

1.0:

-
<FormattedMessage message={this.getIntlMessage('greeting')} name="Eric" />
-

2.0:

-
<FormattedMessage id="greeting" values={{name: 'Eric'}} />
-

Update How Relative Times are Formatted

-

Minor changes have been made to how the "now" reference time is specified when formatting relative times in React Intl v2. It's uncommon to specify this value outside of test code, so it might not exist in your app.

-

Rename FormattedRelative's now Prop to initialNow

-

A new feature has been added to <FormattedRelative> instances in React Intl v2, they now "tick" and stay up to date. Since time moves forward, it was confusing to have a prop named now, so it has been renamed to initialNow. Any <FormattedRelative> instances that use now should update to prop name to initialNow:

-

1.0:

-
<FormattedRelative value={date} now={otherDate} />
-

2.0:

-
<FormattedRelative value={date} initialNow={otherDate} />
-
info

The <IntlProvider> component also has a initialNow prop which can be assigned a value to stabilize the "now" reference time for all <FormattedRelative> instances. This is useful for universal/isomorphic apps to proper React checksums between the server and client initial render.

-

Merge formatRelative()'s Second and Third Arguments

-

The signature of the formatRelative() function has been aligned with the other format*() functions and in React Intl v2, it only accepts two arguments: value and options. To specify a "now" reference time, add it to the options argument, and remove the third formatOptions argument:

-

1.0:

-
let relative = this.formatRelative(date, {units: 'hour'}, {now: otherDate})
-

2.0:

-
let relative = this.props.intl.formatRelative(date, {
units: 'hour',
now: otherDate,
})
-
info

In React Intl v2, the formatRelative() function is injected via injectIntl().

+ +
+
Skip to main content

Upgrade Guide (v1 -> v2)

Use React 0.14 or 15#

React Intl v2 has a peer dependency on react@^0.14.0 || ^15.0.0-0 and now takes advantage of features and changes in React 0.14 and also works with React 15.

Update How Locale Data is Added#

The locale data modules in React Intl v2 have been refactored to provide data, instead of mutating React Intl's internal locale data registry. The react-intl/locale-data/* files are also decoupled from the ReactIntl global and instead provide UMD modules with a new ReactIntlLocaleData global. These changes, mean apps need update how they are registering the locale data they need in the browser.

Add Call to addLocaleData() in Browser#

There is now an addLocaleData() function that needs to be called with the locale data that has been loaded. You can do the following in your main client JavaScript entry point:

This assumes a locale data <script> is added based on the request; e.g., for French speaking users:

<script src="react-intl/locale-data/fr.js"></script>

Using <script src="react-intl/dist/react-intl.js>:

if ('ReactIntl' in window && 'ReactIntlLocaleData' in window) {  Object.keys(ReactIntlLocaleData).forEach(lang => {    ReactIntl.addLocaleData(ReactIntlLocaleData[lang])  })}

Using Browserify/Webpack to Load React Intl:

import {addLocaleData} from 'react-intl'
+if ('ReactIntlLocaleData' in window) {  Object.keys(ReactIntlLocaleData).forEach(lang => {    addLocaleData(ReactIntlLocaleData[lang])  })}

::info +This decoupling of the library from the locale data, allows for the files to be loaded via <script async>. When using async scripts, your client bootstrapping code will need to wait for the load event, including the code above. +:::

Remove Intl Mixin#

The IntlMixin has been removed from React Intl v2. The mixin did two things: it automatically propagated locales, formats, and messages throughout an app's hierarchy, and it provided an imperative API via format*() functions. These jobs are now handled by <IntlProvider> and injectIntl(), respectively:

Update to IntlProvider#

In React Intl v1, you would add the IntlMixin to your root component; e.g., <App>. Remove the IntlMixin and instead wrap your root component with <IntlProvider>:

import ReactDOM from 'react-dom'import {IntlProvider} from 'react-intl'
+ReactDOM.render(  <IntlProvider locale="en">    <App />  </IntlProvider>,  document.getElementById('container'))
info

The locale prop is singular, required, and only accepts a string value. This is a simplification of the plural locales prop used by the IntlMixin.

Update to injectIntl()#

The IntlMixin also provided the imperative API for custom components to use the format*() methods; e.g., formatDate() to get formatted strings for using in places like title and aria attribute. Remove the IntlMixin and instead use the injectIntl() Hight Order Component (HOC) factory function to inject the imperative API via props.

Here's an example of a custom <RelativeTime> stateless component which uses injectIntl() and the imperative formatDate() API:

import React from 'react'import {injectIntl, FormattedRelative} from 'react-intl'
+const to2Digits = num => `${num < 10 ? `0${num}` : num}`
+const RelativeTime = ({date, intl}) => {  date = new Date(date)
+  let year = date.getFullYear()  let month = date.getMonth() + 1  let day = date.getDate()
+  let formattedDate = intl.formatDate(date, {    year: 'long',    month: 'numeric',    day: 'numeric',  })
+  return (    <time      dateTime={`${year}-${to2Digits(month)}-${to2Digits(day)}`}      title={formattedDate}    >      <FormattedRelative value={date} />    </time>  )}
+export default injectIntl(RelativeTime)

injectIntl() is similar to a connect() HOC factory function you might find in a Flux framework to connect a component to a store.

Change How Messages are Formatted#

The way string messages are formatted in React Intl v2 has changed significantly! This is the most disruptive set of change when upgrading from v1 to v2; but it enables many great new features.

React Intl v2 introduces a new Message Descriptor concept which can be used to define an app's default string messages. A Message Descriptor is an object with the following properties, id is the only required prop:

  • id: A unique, stable identifier for the message
  • description: Context for the translator about how it's used in the UI
  • defaultMessage: The default message (probably in English)
info

This upgrade guide will focus on using Message Descriptors that only contain an id property.

Flatten messages Object#

React Intl v2 no longer supports nested messages objects, instead the collection of translated string messages passed to <IntlProvider> must be flat. This is an explicit design choice which simplifies while increasing flexibility. React Intl v2 does not apply any special semantics to strings with dots; e.g., "namespaced.string_id".

Apps using a nested messages object structure could use the following function to flatten their object according to React Intl v1's semantics:

function flattenMessages(nestedMessages, prefix = '') {  return Object.keys(nestedMessages).reduce((messages, key) => {    let value = nestedMessages[key]    let prefixedKey = prefix ? `${prefix}.${key}` : key
+    if (typeof value === 'string') {      messages[prefixedKey] = value    } else {      Object.assign(messages, flattenMessages(value, prefixedKey))    }
+    return messages  }, {})}
+let messages = flattenMessages(nestedMessages)
info

Message ids can still contain "."s, so the ids themselves remain the same, it's only the messages object structure that needs to change.

Replace getIntlMessage() Calls with Message Descriptors#

The getIntlMessage() method that was provided by the IntlMixin has been removed in React Intl v2. It was simply a helper that interpreted a message id string with "."s by looking up the translated message in a nested messages object. With the removal of IntlMixin and the change to a flat messages object, this method has been removed.

All calls to getIntlMessage() need to be replaced with a Message Descriptor.

Replace:

this.getIntlMessage('some.message.id')

With:

{  id: 'some.message.id'}

Update formatMessage() Calls#

A typical pattern when calling formatMessage() is to nest a call to getIntlMessage(). These can be easily updated:

1.0:

let message = this.formatMessage(this.getIntlMessage('some.message.id'), values)

2.0:

let message = this.props.intl.formatMessage({id: 'some.message.id'}, values)
info

In React Intl v2, the formatMessage() function is injected via injectIntl().

Update FormattedMessage and FormattedHTMLMessage Instances#

The props for these two components have completely changed in React Intl v2. Instead of taking a message prop and treating all other props as values to fill in placeholders in a message, <FormattedMessage> and <FormattedHTMLMessage> now the same props as a Message Descriptor plus a new values prop.

The new values prop groups all of the message's placeholder values together into an object.

The following example shows up to update a <FormattedMessage> instance to use the new props and remove the call to getIntlMessage():

1.0:

<FormattedMessage message={this.getIntlMessage('greeting')} name="Eric" />

2.0:

<FormattedMessage id="greeting" values={{name: 'Eric'}} />

Update How Relative Times are Formatted#

Minor changes have been made to how the "now" reference time is specified when formatting relative times in React Intl v2. It's uncommon to specify this value outside of test code, so it might not exist in your app.

Rename FormattedRelative's now Prop to initialNow#

A new feature has been added to <FormattedRelative> instances in React Intl v2, they now "tick" and stay up to date. Since time moves forward, it was confusing to have a prop named now, so it has been renamed to initialNow. Any <FormattedRelative> instances that use now should update to prop name to initialNow:

1.0:

<FormattedRelative value={date} now={otherDate} />

2.0:

<FormattedRelative value={date} initialNow={otherDate} />
info

The <IntlProvider> component also has a initialNow prop which can be assigned a value to stabilize the "now" reference time for all <FormattedRelative> instances. This is useful for universal/isomorphic apps to proper React checksums between the server and client initial render.

Merge formatRelative()'s Second and Third Arguments#

The signature of the formatRelative() function has been aligned with the other format*() functions and in React Intl v2, it only accepts two arguments: value and options. To specify a "now" reference time, add it to the options argument, and remove the third formatOptions argument:

1.0:

let relative = this.formatRelative(date, {units: 'hour'}, {now: otherDate})

2.0:

let relative = this.props.intl.formatRelative(date, {  units: 'hour',  now: otherDate,})
info

In React Intl v2, the formatRelative() function is injected via injectIntl().

+ + \ No newline at end of file diff --git a/docs/react-intl/upgrade-guide-3x/index.html b/docs/react-intl/upgrade-guide-3x/index.html old mode 100644 new mode 100755 index 0c578bbeb..bb3a161c5 --- a/docs/react-intl/upgrade-guide-3x/index.html +++ b/docs/react-intl/upgrade-guide-3x/index.html @@ -1,132 +1,46 @@ - + - -Upgrade Guide (v2 -> v3) | Format.JS - - + + + + + +Upgrade Guide (v2 -> v3) | Format.JS + + - -
Skip to main content

Upgrade Guide (v2 -> v3)

Breaking API Changes

- -
<IntlProvider textComponent="span" />
-
    -
  • FormattedRelative has been renamed to FormattedRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.
  • -
  • formatRelative has been renamed to formatRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.
  • -
  • Message Format syntax changes. See Message Format Syntax Changes for more details.
  • -
  • IntlProvider no longer inherits from upstream IntlProvider.
  • -
-

Use React 16.3 and upwards

-

React Intl v3 supports the new context API, fixing all kinds of tree update problems 🎉 + +

+

Upgrade Guide (v2 -> v3)

Breaking API Changes#

<IntlProvider textComponent="span" />
  • FormattedRelative has been renamed to FormattedRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.
  • formatRelative has been renamed to formatRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.
  • Message Format syntax changes. See Message Format Syntax Changes for more details.
  • IntlProvider no longer inherits from upstream IntlProvider.

Use React 16.3 and upwards#

React Intl v3 supports the new context API, fixing all kinds of tree update problems 🎉 In addition it makes use of the new lifecycle hooks (and gets rid of the deprecated ones). -It also supports the new React.forwardRef() enabling users to directly access refs using the standard ref prop (see beneath for further information).

-

Migrate withRef to forwardRef

-

With the update to React >= 16.3 we got the option to use the new React.forwardRef() feature and because of this deprecated the use of the withRef option for the injectIntl HOC in favour of forwardRef. -When forwardRef is set to true, you can now simply pretend the HOC wasn't there at all.

-

Intl v2:

-
import React from 'react'
import {injectIntl} from 'react-intl'

class MyComponent extends React.Component {
doSomething = () => console.log(this.state || null)

render() {
return <div>Hello World</div>
}
}

export default injectIntl(MyComponent, {withRef: true})

// somewhere else
class Parent extends React.Component {
componentDidMount() {
this.myComponentRef.getWrappedInstance().doSomething()
}

render() {
return (
<MyComponent
ref={ref => {
this.myComponentRef = ref
}}
/>
)
}
}
-

Intl v3:

-
import React from 'react'
import {injectIntl} from 'react-intl'

class MyComponent extends React.Component {
doSomething = () => console.log(this.state || null)

render() {
return <div>Hello World</div>
}
}

export default injectIntl(MyComponent, {forwardRef: true})

// somewhere else
class Parent extends React.Component {
myComponentRef = React.createRef()

componentDidMount() {
this.myComponentRef.doSomething() // no need to call getWrappedInstance()
}

render() {
return <MyComponent ref={this.myComponentRef} />
}
}
-

New useIntl hook as an alternative of injectIntl HOC

-

This v3 release also supports the latest React hook API for user with React >= 16.8. You can now take useIntl hook as an alternative to injectIntl HOC on function components. Both methods allow you to access the intl instance, here is a quick comparison:

-
// injectIntl
import {injectIntl} from 'react-intl'

const MyComponentWithHOC = injectIntl(({intl, ...props}) => {
// do something
})

// useIntl
import {useIntl} from 'react-intl'

const MyComponentWithHook = props => {
const intl = useIntl()

// do something
}
-

To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks.

-

Migrate to using native Intl APIs

-

React Intl v3 no longer comes with CLDR data and rely on native Intl API instead. Specifically the new APIs we're relying on are:

- -

This shift is meant to future-proof React Intl as these APIs are all stable and being implemented in modern browsers. This also means we no longer package and consume CLDRs in this package.

-

If you previously were using addLocaleData to support older browsers, we recommend you do the following:

-
    -
  1. If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build.
  2. -
  3. If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 13-), include this polyfill in your build along with individual CLDR data for each locale you support.
  4. -
-
require('@formatjs/intl-pluralrules/polyfill')
require('@formatjs/intl-pluralrules/locale-data/de') // Add locale data for de

require('@formatjs/intl-relativetimeformat/polyfill')
require('@formatjs/intl-relativetimeformat/locale-data/de') // Add locale data for de
-

When using React Intl in Node.js, your node binary has to either:

- -

OR

- -

TypeScript Support

-

react-intl has been rewritten in TypeScript and thus has native TypeScript support. Therefore, we've also removed prop-types dependency and expose IntlShape as an interface instead.

-

All types should be available from top level index file without importing from specific subfiles. For example:

-
import {IntlShape} from 'react-intl' // Correct
import {IntlShape} from 'react-intl/lib/types' // Incorrect
-

If we're missing any interface top level support, please let us know and/or submitting a PR is greatly appreciated :)

-
info

You might need to make a few changes to your code if you were relying on the now deprecated @types/react-intl package. The most common example is InjectedIntlProps which must be replaced with WrappedComponentProps.

-

FormattedRelativeTime

-

When we introduced FormattedRelative, the spec for Intl.RelativeTimeFormat was still unstable. It has now reached stage 3 and multiple browsers have implemented it. However, its API is different from FormattedRelative so we've adjusted its API to match the spec which means it's not backwards compatible.

-
    -
  1. All units (such as day-short) becomes a combination of unit & style:
  2. -
-
<FormattedRelative units="second-short"/>
// will be
<FormattedRelativeTime unit="second" style="short"/>
-
    -
  1. style becomes numeric (which is the default):
  2. -
-
<FormattedRelative style="numeric"/>
// will be
<FormattedRelativeTime />

<FormattedRelative style="best fit"/>
// will be
<FormattedRelativeTime numeric="auto"/>
-
    -
  1. Type of value is no longer Date, but rather delta in the specified unit:
  2. -
-
<FormattedRelative value={Date.now() - 1000} units="second-narrow"/>
// will be
<FormattedRelativeTime value={-1} unit="second" style="narrow" />

<FormattedRelative value={Date.now() + 2000} units="second-narrow"/>
// will be
<FormattedRelativeTime value={2} unit="second" style="narrow" />
-
    -
  1. updateInterval becomes updateIntervalInSeconds and will only take the time delta in seconds. Update behavior remains the same, e.g:
  2. -
-
<FormattedRelativeTime
value={2}
numeric="auto"
unit="second"
style="narrow"
updateIntervalInSeconds={1}
/>
// Initially prints: `in 2s`
// 1 second later: `in 1s`
// 1 second later: `now`
// 1 second later: `1s ago`
// 60 seconds later: `1m ago`
-
    -
  1. initialNow has been removed.
  2. -
-

Similarly, the functional counterpart of this component which is formatRelative has been renamed to formatRelativeTime and its parameters have been changed to reflect this component's props accordingly.

-
    -
  1. Implementing FormattedRelative behavior
  2. -
-

You can use @formatjs/intl-utils to get close to the previous behavior like this:

-
import {selectUnit} from '@formatjs/intl-utils'
const {value, unit} = selectUnit(Date.now() - 48 * 3600 * 1000)
// render
;<FormattedRelativeTime value={value} unit={unit} />
-

Enhanced FormattedMessage & formatMessage rich text formatting

-

In v2, in order to do rich text formatting (embedding a ReactElement), you had to do this:

-
<FormattedMessage
defaultMessage="To buy a shoe, { link } and { cta }"
values={{
link: (
<a class="external_link" target="_blank" href="https://www.shoe.com/">
visit our website
</a>
),
cta: <strong class="important">eat a shoe</strong>,
}}
/>
-

Now you can do:

-
<FormattedMessage
defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>eat a shoe</cta>"
values={{
a: msg => (
<a class="external_link" target="_blank" href="https://www.shoe.com/">
{msg}
</a>
),
cta: msg => <strong class="important">{msg}</strong>,
}}
/>
-

The change solves several issues:

-
    -
  1. Contextual information was lost when you need to style part of the string: In this example above, link effectively is a blackbox placeholder to a translator. It can be a person, an animal, or a timestamp. Conveying contextual information via description & placeholder variable is often not enough since the variable can get sufficiently complicated.
  2. -
  3. This brings feature-parity with other translation libs, such as fluent by Mozilla (using Overlays).
  4. -
-

If previously in cases where you pass in a ReactElement to a placeholder we highly recommend that you rethink the structure so that as much text is declared as possible:

-

Before

-
<FormattedMessage
defaultMessage="Hello, {name} is {awesome} and {fun}"
values={{
name: <b>John</b>,
awesome: <span style="font-weight: bold;">awesome</span>
fun: <span>fun and <FormattedTime value={Date.now()}/></span>
}}
/>
-

After

-
<FormattedMessage
defaultMessage="Hello, <b>John</b> is <custom>awesome</custom> and <more>fun and {ts, time}</more>"
values={{
b: name => <b>{name}</b>,
custom: str => <span style="font-weight: bold;">{str}</span>,
more: chunks => <span>{chunks}</span>,
}}
/>
-

ESM Build

-

react-intl and its underlying libraries (intl-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat, intl-format-cache, intl-utils) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries.

-

Jest

-

Add transformIgnorePatterns to always include those libraries, e.g:

-
{
transformIgnorePatterns: [
'/node_modules/(?!intl-messageformat|intl-messageformat-parser).+\\.js$',
],
}
-

webpack

-

If you're using babel-loader, add those libraries in include, e.g:

-
include: [
path.join(__dirname, "node_modules/react-intl"),
path.join(__dirname, "node_modules/intl-messageformat"),
path.join(__dirname, "node_modules/intl-messageformat-parser"),
],
-

Creating intl without using Provider

-

We've added a new API called createIntl that allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example:

-
import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'

// This is optional but highly recommended
// since it prevents memory leak
const cache = createIntlCache()

const intl = createIntl({
locale: 'fr-FR',
messages: {}
}, cache)

// Call imperatively
intl.formatNumber(20)

// Pass it to IntlProvider
<RawIntlProvider value={intl}>{foo}</RawIntlProvider>
-

This is especially beneficial in SSR where you can reuse the same intl object across requests.

-

Message Format Syntax Changes

-

We've rewritten our parser to be more faithful to ICU Message Format, in order to potentially support skeleton. So far the backwards-incompatible changes are:

-

Escape character has been changed to apostrophe (').

-

Previously while we were using ICU message format syntax, our escape char was backslash (\). This however creates issues with strict ICU translation vendors that support other implementations like ICU4J/ICU4C. Thanks to @pyrocat101 we've changed this behavior to be spec-compliant. This means:

-
// Before
<FormattedMessage defaultMessage="\\{foo\\}" /> //prints out "{foo}"

// After
<FormattedMessage defaultMessage="'{foo}'" /> //prints out "{foo}"
-

We highly recommend reading the spec to learn more about how quote/escaping works here under Quoting/Escaping section.

-

Placeholder argument syntax change

-

Placeholder argument can no longer have - (e.g: this is a {placeholder-var} is invalid but this is a {placeholder_var} is).

-

Testing

-

We've removed IntlProvider.getChildContext for testing and now you can use createIntl to create a standalone intl object outside of React and use that for testing purposes. See Testing with React Intl for more details.

+It also supports the new React.forwardRef() enabling users to directly access refs using the standard ref prop (see beneath for further information).

Migrate withRef to forwardRef#

With the update to React >= 16.3 we got the option to use the new React.forwardRef() feature and because of this deprecated the use of the withRef option for the injectIntl HOC in favour of forwardRef. +When forwardRef is set to true, you can now simply pretend the HOC wasn't there at all.

Intl v2:

import React from 'react'import {injectIntl} from 'react-intl'
+class MyComponent extends React.Component {  doSomething = () => console.log(this.state || null)
+  render() {    return <div>Hello World</div>  }}
+export default injectIntl(MyComponent, {withRef: true})
+// somewhere elseclass Parent extends React.Component {  componentDidMount() {    this.myComponentRef.getWrappedInstance().doSomething()  }
+  render() {    return (      <MyComponent        ref={ref => {          this.myComponentRef = ref        }}      />    )  }}

Intl v3:

import React from 'react'import {injectIntl} from 'react-intl'
+class MyComponent extends React.Component {  doSomething = () => console.log(this.state || null)
+  render() {    return <div>Hello World</div>  }}
+export default injectIntl(MyComponent, {forwardRef: true})
+// somewhere elseclass Parent extends React.Component {  myComponentRef = React.createRef()
+  componentDidMount() {    this.myComponentRef.doSomething() // no need to call getWrappedInstance()  }
+  render() {    return <MyComponent ref={this.myComponentRef} />  }}

New useIntl hook as an alternative of injectIntl HOC#

This v3 release also supports the latest React hook API for user with React >= 16.8. You can now take useIntl hook as an alternative to injectIntl HOC on function components. Both methods allow you to access the intl instance, here is a quick comparison:

// injectIntlimport {injectIntl} from 'react-intl'
+const MyComponentWithHOC = injectIntl(({intl, ...props}) => {  // do something})
+// useIntlimport {useIntl} from 'react-intl'
+const MyComponentWithHook = props => {  const intl = useIntl()
+  // do something}

To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks.

Migrate to using native Intl APIs#

React Intl v3 no longer comes with CLDR data and rely on native Intl API instead. Specifically the new APIs we're relying on are:

This shift is meant to future-proof React Intl as these APIs are all stable and being implemented in modern browsers. This also means we no longer package and consume CLDRs in this package.

If you previously were using addLocaleData to support older browsers, we recommend you do the following:

  1. If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build.
  2. If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 13-), include this polyfill in your build along with individual CLDR data for each locale you support.
require('@formatjs/intl-pluralrules/polyfill')require('@formatjs/intl-pluralrules/locale-data/de') // Add locale data for de
+require('@formatjs/intl-relativetimeformat/polyfill')require('@formatjs/intl-relativetimeformat/locale-data/de') // Add locale data for de

When using React Intl in Node.js, your node binary has to either:

OR

TypeScript Support#

react-intl has been rewritten in TypeScript and thus has native TypeScript support. Therefore, we've also removed prop-types dependency and expose IntlShape as an interface instead.

All types should be available from top level index file without importing from specific subfiles. For example:

import {IntlShape} from 'react-intl' // Correctimport {IntlShape} from 'react-intl/lib/types' // Incorrect

If we're missing any interface top level support, please let us know and/or submitting a PR is greatly appreciated :)

info

You might need to make a few changes to your code if you were relying on the now deprecated @types/react-intl package. The most common example is InjectedIntlProps which must be replaced with WrappedComponentProps.

FormattedRelativeTime#

When we introduced FormattedRelative, the spec for Intl.RelativeTimeFormat was still unstable. It has now reached stage 3 and multiple browsers have implemented it. However, its API is different from FormattedRelative so we've adjusted its API to match the spec which means it's not backwards compatible.

  1. All units (such as day-short) becomes a combination of unit & style:
<FormattedRelative units="second-short"/>// will be<FormattedRelativeTime unit="second" style="short"/>
  1. style becomes numeric (which is the default):
<FormattedRelative style="numeric"/>// will be<FormattedRelativeTime />
+<FormattedRelative style="best fit"/>// will be<FormattedRelativeTime numeric="auto"/>
  1. Type of value is no longer Date, but rather delta in the specified unit:
<FormattedRelative value={Date.now() - 1000} units="second-narrow"/>// will be<FormattedRelativeTime value={-1} unit="second" style="narrow" />
+<FormattedRelative value={Date.now() + 2000} units="second-narrow"/>// will be<FormattedRelativeTime value={2} unit="second" style="narrow" />
  1. updateInterval becomes updateIntervalInSeconds and will only take the time delta in seconds. Update behavior remains the same, e.g:
<FormattedRelativeTime  value={2}  numeric="auto"  unit="second"  style="narrow"  updateIntervalInSeconds={1}/>// Initially prints: `in 2s`// 1 second later: `in 1s`// 1 second later: `now`// 1 second later: `1s ago`// 60 seconds later: `1m ago`
  1. initialNow has been removed.

Similarly, the functional counterpart of this component which is formatRelative has been renamed to formatRelativeTime and its parameters have been changed to reflect this component's props accordingly.

  1. Implementing FormattedRelative behavior

You can use @formatjs/intl-utils to get close to the previous behavior like this:

import {selectUnit} from '@formatjs/intl-utils'const {value, unit} = selectUnit(Date.now() - 48 * 3600 * 1000)// render;<FormattedRelativeTime value={value} unit={unit} />

Enhanced FormattedMessage & formatMessage rich text formatting#

In v2, in order to do rich text formatting (embedding a ReactElement), you had to do this:

<FormattedMessage  defaultMessage="To buy a shoe, { link } and { cta }"  values={{    link: (      <a class="external_link" target="_blank" href="https://www.shoe.com/">        visit our website      </a>    ),    cta: <strong class="important">eat a shoe</strong>,  }}/>

Now you can do:

<FormattedMessage  defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>eat a shoe</cta>"  values={{    a: msg => (      <a class="external_link" target="_blank" href="https://www.shoe.com/">        {msg}      </a>    ),    cta: msg => <strong class="important">{msg}</strong>,  }}/>

The change solves several issues:

  1. Contextual information was lost when you need to style part of the string: In this example above, link effectively is a blackbox placeholder to a translator. It can be a person, an animal, or a timestamp. Conveying contextual information via description & placeholder variable is often not enough since the variable can get sufficiently complicated.
  2. This brings feature-parity with other translation libs, such as fluent by Mozilla (using Overlays).

If previously in cases where you pass in a ReactElement to a placeholder we highly recommend that you rethink the structure so that as much text is declared as possible:

Before

<FormattedMessage  defaultMessage="Hello, {name} is {awesome} and {fun}"  values={{    name: <b>John</b>,    awesome: <span style="font-weight: bold;">awesome</span>    fun: <span>fun and <FormattedTime value={Date.now()}/></span>  }}/>

After

<FormattedMessage  defaultMessage="Hello, <b>John</b> is <custom>awesome</custom> and <more>fun and {ts, time}</more>"  values={{    b: name => <b>{name}</b>,    custom: str => <span style="font-weight: bold;">{str}</span>,    more: chunks => <span>{chunks}</span>,  }}/>

ESM Build#

react-intl and its underlying libraries (intl-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat, intl-format-cache, intl-utils) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries.

Jest#

Add transformIgnorePatterns to always include those libraries, e.g:

{  transformIgnorePatterns: [    '/node_modules/(?!intl-messageformat|intl-messageformat-parser).+\\.js$',  ],}

webpack#

If you're using babel-loader, add those libraries in include, e.g:

include: [  path.join(__dirname, "node_modules/react-intl"),  path.join(__dirname, "node_modules/intl-messageformat"),  path.join(__dirname, "node_modules/intl-messageformat-parser"),],

Creating intl without using Provider#

We've added a new API called createIntl that allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example:

import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl'
+// This is optional but highly recommended// since it prevents memory leakconst cache = createIntlCache()
+const intl = createIntl({  locale: 'fr-FR',  messages: {}}, cache)
+// Call imperativelyintl.formatNumber(20)
+// Pass it to IntlProvider<RawIntlProvider value={intl}>{foo}</RawIntlProvider>

This is especially beneficial in SSR where you can reuse the same intl object across requests.

Message Format Syntax Changes#

We've rewritten our parser to be more faithful to ICU Message Format, in order to potentially support skeleton. So far the backwards-incompatible changes are:

Escape character has been changed to apostrophe (').#

Previously while we were using ICU message format syntax, our escape char was backslash (\). This however creates issues with strict ICU translation vendors that support other implementations like ICU4J/ICU4C. Thanks to @pyrocat101 we've changed this behavior to be spec-compliant. This means:

// Before<FormattedMessage defaultMessage="\\{foo\\}" /> //prints out "{foo}"
+// After<FormattedMessage defaultMessage="'{foo}'" /> //prints out "{foo}"

We highly recommend reading the spec to learn more about how quote/escaping works here under Quoting/Escaping section.

Placeholder argument syntax change#

Placeholder argument can no longer have - (e.g: this is a {placeholder-var} is invalid but this is a {placeholder_var} is).

Testing#

We've removed IntlProvider.getChildContext for testing and now you can use createIntl to create a standalone intl object outside of React and use that for testing purposes. See Testing with React Intl for more details.

+ + \ No newline at end of file diff --git a/docs/react-intl/upgrade-guide-4x/index.html b/docs/react-intl/upgrade-guide-4x/index.html old mode 100644 new mode 100755 index cd048a507..df38200dc --- a/docs/react-intl/upgrade-guide-4x/index.html +++ b/docs/react-intl/upgrade-guide-4x/index.html @@ -1,35 +1,20 @@ - + - -Upgrade Guide (v3 -> v4) | Format.JS - - + + + + + +Upgrade Guide (v3 -> v4) | Format.JS + + - -
Skip to main content

Upgrade Guide (v3 -> v4)

Breaking API Changes

-
    -
  • All tags specified must have corresponding values and will throw error if it's missing, e.g:
  • -
-
new IntlMessageFormat('a<b>strong</b>').format({
b: (...chunks) => <strong>{chunks}</strong>,
})
-
    -
  • We don't allow formatting self-closing tags because we already use ICU {placeholder} syntax for that.
  • -
  • XML/HTML tags are escaped using apostrophe just like other ICU constructs.
  • -
  • Remove dependency on DOMParser and restrictions on void element like <link>. This effectively means you don't need to polyfill DOMParser in Node anymore.
  • -
  • FormattedHTMLMessage & intl.formatHTMLMessage have been removed since FormattedMessage now fully supports embedded HTML tag.
  • -
-

Why are we doing those changes?

-
    -
  • FormattedHTMLMessage & intl.formatHTMLMessage were originally created when React was fairly new. These components helped ease migration over from raw HTML to JSX. Given that current popularity of React right now and the fact that FormattedMessage allow rendering embedded HTML tag, this is no longer needed.
  • -
  • Initially during the 1st iteration of embedded HTML support, we allow any tag that doesn’t have a corresponding formatter to be rendered as raw HTML. We’ve received feedbacks internally that allowing embedded HTML tag to be rendered as-is without sanitization is a XSS security risk. Therefore, in order to allow raw HTML tag you have to opt-in by escaping them using apostrophe. We will update our linter to check for this as well.
  • -
-

Migrating off embedded HTML in messages

-

In order to restore the old behavior of FormattedHTMLMessage & intl.formatHTMLMessage, we suggest you use the rich text format feature as below:

-

Old way:

-
intl.formatHTMLMessage('This is a <a href="foo">link</a>')
-

New way:

-
intl.formatMessage('This is a <a>link</a>', {
a: (...chunks) => sanitizeHTML(`<a href="foo">${chunks.join('')}</a>`),
})
-

This forces developers to always sanitize their rendered HTML & chunks, thus minimizing XSS.

+ +
+
Skip to main content

Upgrade Guide (v3 -> v4)

Breaking API Changes#

  • All tags specified must have corresponding values and will throw error if it's missing, e.g:
new IntlMessageFormat('a<b>strong</b>').format({  b: (...chunks) => <strong>{chunks}</strong>,})
  • We don't allow formatting self-closing tags because we already use ICU {placeholder} syntax for that.
  • XML/HTML tags are escaped using apostrophe just like other ICU constructs.
  • Remove dependency on DOMParser and restrictions on void element like <link>. This effectively means you don't need to polyfill DOMParser in Node anymore.
  • FormattedHTMLMessage & intl.formatHTMLMessage have been removed since FormattedMessage now fully supports embedded HTML tag.

Why are we doing those changes?#

  • FormattedHTMLMessage & intl.formatHTMLMessage were originally created when React was fairly new. These components helped ease migration over from raw HTML to JSX. Given that current popularity of React right now and the fact that FormattedMessage allow rendering embedded HTML tag, this is no longer needed.
  • Initially during the 1st iteration of embedded HTML support, we allow any tag that doesn’t have a corresponding formatter to be rendered as raw HTML. We’ve received feedbacks internally that allowing embedded HTML tag to be rendered as-is without sanitization is a XSS security risk. Therefore, in order to allow raw HTML tag you have to opt-in by escaping them using apostrophe. We will update our linter to check for this as well.

Migrating off embedded HTML in messages#

In order to restore the old behavior of FormattedHTMLMessage & intl.formatHTMLMessage, we suggest you use the rich text format feature as below:

Old way:

intl.formatHTMLMessage('This is a <a href="foo">link</a>')

New way:

intl.formatMessage('This is a <a>link</a>', {  a: (...chunks) => sanitizeHTML(`<a href="foo">${chunks.join('')}</a>`),})

This forces developers to always sanitize their rendered HTML & chunks, thus minimizing XSS.

+ + \ No newline at end of file diff --git a/docs/react-intl/upgrade-guide-5x/index.html b/docs/react-intl/upgrade-guide-5x/index.html old mode 100644 new mode 100755 index 092610165..e581dc1a6 --- a/docs/react-intl/upgrade-guide-5x/index.html +++ b/docs/react-intl/upgrade-guide-5x/index.html @@ -1,45 +1,20 @@ - + - -Upgrade Guide (v4 -> v5) | Format.JS - - + + + + + +Upgrade Guide (v4 -> v5) | Format.JS + + - -
Skip to main content

Upgrade Guide (v4 -> v5)

Breaking API Changes

-
    -
  • Rich text formatting callback function is no longer variadic.
  • -
-

Before:

-
new IntlMessageFormat('a<b>strong</b>').format({
b: (...chunks) => <strong>{chunks}</strong>,
})
-

After:

-
new IntlMessageFormat('a<b>strong</b>').format({
b: chunks => <strong>{chunks}</strong>,
})
-
    -
  • FormattedMessage render prop is no longer variadic.
  • -
-

Before:

-
<FormattedMessage defaultMessage="a<b>strong</b>">
{(...chunks) => <b>{chunks}</b>}
</FormattedMessage>
-

After:

-
<FormattedMessage defaultMessage="a<b>strong</b>">
{chunks => <b>{chunks}</b>}
</FormattedMessage>
-
    -
  • Using FormattedMessage without a intl context will fail fast.
  • -
-

Why are we doing those changes?

-

Rich text formatting callback function is no longer variadic

-
    -
  • We received feedback from the community that variadic callback function isn't really ergonomic.
  • -
  • There's also an issue where React chunks do not come with keys, thus causing warning in React during development.
  • -
  • The chunks by themselves are not enough to render duplicate tags, such as <a>link</a> and another <a>link</a> where you want to render 2 different hrefs for the <a> tag. In this case a: chunks => <a>{chunks}</a> isn't enough especially when the contents are the same. In the future we can set another argument that might contain metadata to distinguish between the 2 elements.
  • -
-

FormattedMessage render prop is no longer variadic

-
    -
  • Same reasons as above.
  • -
-

Using FormattedMessage without a intl context will fail fast

-
    -
  • This also comes from Dropbox internal developer feedback. FormattedMessage has a default English renderer that masks Provider setup issues which causes them to not be handled during testing phase.
  • -
+ +
+
Skip to main content

Upgrade Guide (v4 -> v5)

Breaking API Changes#

  • Rich text formatting callback function is no longer variadic.

Before:

new IntlMessageFormat('a<b>strong</b>').format({  b: (...chunks) => <strong>{chunks}</strong>,})

After:

new IntlMessageFormat('a<b>strong</b>').format({  b: chunks => <strong>{chunks}</strong>,})
  • FormattedMessage render prop is no longer variadic.

Before:

<FormattedMessage defaultMessage="a<b>strong</b>">  {(...chunks) => <b>{chunks}</b>}</FormattedMessage>

After:

<FormattedMessage defaultMessage="a<b>strong</b>">  {chunks => <b>{chunks}</b>}</FormattedMessage>
  • Using FormattedMessage without a intl context will fail fast.

Why are we doing those changes?#

Rich text formatting callback function is no longer variadic#

  • We received feedback from the community that variadic callback function isn't really ergonomic.
  • There's also an issue where React chunks do not come with keys, thus causing warning in React during development.
  • The chunks by themselves are not enough to render duplicate tags, such as <a>link</a> and another <a>link</a> where you want to render 2 different hrefs for the <a> tag. In this case a: chunks => <a>{chunks}</a> isn't enough especially when the contents are the same. In the future we can set another argument that might contain metadata to distinguish between the 2 elements.

FormattedMessage render prop is no longer variadic#

  • Same reasons as above.

Using FormattedMessage without a intl context will fail fast#

  • This also comes from Dropbox internal developer feedback. FormattedMessage has a default English renderer that masks Provider setup issues which causes them to not be handled during testing phase.
+ + \ No newline at end of file diff --git a/docs/tooling/babel-plugin/index.html b/docs/tooling/babel-plugin/index.html old mode 100644 new mode 100755 index 6c4288da1..685c69c52 --- a/docs/tooling/babel-plugin/index.html +++ b/docs/tooling/babel-plugin/index.html @@ -1,48 +1,20 @@ - + - -babel-plugin-formatjs | Format.JS - - + + + + + +babel-plugin-formatjs | Format.JS + + - -
Skip to main content

babel-plugin-formatjs

Process string messages for translation from modules that use react-intl, specifically:

-
    -
  • Parse and verify that messages are ICU-compliant w/o any syntax issues.
  • -
  • Remove description from message descriptor to save bytes since it isn't used at runtime.
  • -
  • Option to remove defaultMessage from message descriptor to save bytes since it isn't used at runtime.
  • -
  • Automatically inject message ID based on specific pattern.
  • -
-

Installation

- -
npm i babel-plugin-formatjs
-

Usage

-

This Babel plugin only visits ES6 modules which import React Intl.

-

The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package.

- -

babel.config.json

-
{
"plugins": [
[
"formatjs",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]",
"ast": true
}
]
]
}
-

Via Node API

-

The extract message descriptors are available via the metadata property on the object returned from Babel's transform() API:

-
require('@babel/core').transform('code', {
plugins: ['formatjs'],
}) // => { code, map, ast, metadata['formatjs'].messages, metadata['formatjs'].meta };
-

Options

-

overrideIdFn

-

A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages.

-

idInterpolationPattern

-

If certain message descriptors don't have id, this pattern will be used to automaticallygenerate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings.

-

removeDefaultMessage

-

Remove defaultMessage field in generated js after extraction.

-

additionalComponentNames

-

Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe.

-

additionalFunctionNames

-

Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t.

-

pragma

-

parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file:

-
// @intl-meta project:my-custom-project
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" id="bar" />
-

and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file.

-

ast

-

Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true.

+ +
+
Skip to main content

babel-plugin-formatjs

Process string messages for translation from modules that use react-intl, specifically:

  • Parse and verify that messages are ICU-compliant w/o any syntax issues.
  • Remove description from message descriptor to save bytes since it isn't used at runtime.
  • Option to remove defaultMessage from message descriptor to save bytes since it isn't used at runtime.
  • Automatically inject message ID based on specific pattern.

Installation#

npm i babel-plugin-formatjs

Usage#

This Babel plugin only visits ES6 modules which import React Intl.

The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package.

Via babel.config.json (Recommended)#

babel.config.json

{  "plugins": [    [      "formatjs",      {        "idInterpolationPattern": "[sha512:contenthash:base64:6]",        "ast": true      }    ]  ]}

Options#

overrideIdFn#

A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages.

idInterpolationPattern#

If certain message descriptors don't have id, this pattern will be used to automaticallygenerate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings.

removeDefaultMessage#

Remove defaultMessage field in generated js after extraction.

additionalComponentNames#

Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe.

additionalFunctionNames#

Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t.

pragma#

parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file:

// @intl-meta project:my-custom-projectimport {FormattedMessage} from 'react-intl';<FormattedMessage defaultMessage="foo" id="bar" />

and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file.

ast#

Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true.

Via Node API#

The extract message descriptors are available via the metadata property on the object returned from Babel's transform() API:

require('@babel/core').transform('code', {  plugins: ['formatjs'],}) // => { code, map, ast, metadata['formatjs'].messages, metadata['formatjs'].meta };
+ + \ No newline at end of file diff --git a/docs/tooling/cli/index.html b/docs/tooling/cli/index.html old mode 100644 new mode 100755 index 8b2343cc6..b5ef8d83d --- a/docs/tooling/cli/index.html +++ b/docs/tooling/cli/index.html @@ -1,128 +1,34 @@ - + - -CLI | Format.JS - - + + + + + +CLI | Format.JS + + - -
Skip to main content

CLI

Installation

- -
npm i -D @formatjs/cli
-

Add the following command to your package.json scripts:

-
{
"scripts": {
"extract": "formatjs extract",
"compile": "formatjs compile"
}
}
-

We've built this CLI that helps you extract messages from a list of files. It uses @formatjs/ts-transformer under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below:

-
import {defineMessages, defineMessage} from 'react-intl'

defineMessages({
foo: {
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
},
})

defineMessage({
id: 'single',
defaultMessage: 'single message',
description: 'header',
})
-
import {FormattedMessage} from 'react-intl'
;<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
-
function Comp(props) {
const {intl} = props
return intl.formatMessage({
// The whole `intl.formatMessage` is required so we can extract
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
})
}
-

Extraction

-
npm run extract -- --help
# Usage: formatjs extract [options] [files...]

# Extract string messages from React components that use react-intl.
# The input language is expected to be TypeScript or ES2017 with JSX.

For example:

npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang.json
-
caution

You should always quote (" or ') your glob pattern (like "src/**/*") to avoid auto shell expansion of those glob, which varies depending on your shell (zsh vs fish vs bash).

-

--format [path]

-

Path to a formatter file that controls the shape of JSON file from --out-file. -The formatter file must export a function called format with the signature.

-
type FormatFn = <T = Record<string, MessageDescriptor>>(
msgs: Record<string, MessageDescriptor>
) => T
-

This is especially useful to convert from our extracted format to a TMS-specific format.

-

See our builtin formatters for examples.

-

--out-file [path]

-

The target file path where the plugin will output an aggregated .json file of allthe translations from the files supplied. This flag will ignore --messages-dir

-

--id-interpolation-pattern [pattern]

-

If certain message descriptors don't have id, this pattern will be used to automatically generate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings.

-

--extract-source-location

-

Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. (default: false)

-

--additional-component-names [comma-separated-names]

-

Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage is imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe.

-

--additional-function-names [comma-separated-names]

-

Additional function names to extract messages from, e.g: ['$t'].

-

--ignore [files]

-

List of glob paths to not extract translations from.

-

--throws

-

Whether to throw an exception when we fail to process any file in the batch.

-

--pragma [pragma]

-

Parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file:

-
// @intl-meta project:my-custom-project
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" id="bar" />
-

and with option {pragma: "intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file.

-

--preserve-whitespace

-

Whether to preserve whitespace and newlines in output. We typically remove consecutive whitespaces and newlines since those often gets abused for styling purposes.

-

--flatten

-

Whether to hoist selectors & flatten sentences as much as possible. E.g:

-
I have {count, plural, one{a dog} other{many dogs}}
-

becomes

-
{count, plural, one{I have a dog} other{I have many dogs}}
-

The goal is to provide as many full sentences as possible since fragmented -sentences are not translator-friendly.

-

Verification

-

Verify translation files to make sure keys are translated and messages are structurally compatible with source locale.

-
npm run formatjs verify [options] <translationFiles>
-

--source-locale <sourceLocale>

-

The source locale of the translation files. There must be a file named <sourceLocale>.json in the list of translation files. This is used as source to verify other translations against.

-

--missing-keys

-

Whether to check for missing keys in target locale compared to source locale. This basically guarantees that no messages are untranslated.

-

--structural-equality

-

Whether to check for structural equality of messages between source and target locale. This makes sure translations are formattable and are not missing any tokens.

-

Compilation

-

Compile extracted files from formatjs extract to a react-intl consumable -JSON file. This also does ICU message verification. See Message Distribution for more details.

-
npm run compile -- --help
-

--format [path]

-

Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature:

-
type CompileFn = <T = Record<string, MessageDescriptor>>(
msgs: T
) => Record<string, string>
-

This is especially useful to convert from a TMS-specific format back to react-intl format.

-

See our builtin formatters for examples.

-

--out-file <output>

-

The target file that contains compiled messages.

-

--ast

-

Whether to compile message into AST instead of just string. See Advanced Usage

-

--pseudo-locale <pseudoLocale>

-

Whether we should compile messages into pseudo locales instead. Available pseudo-locales:

-

Given the English message my name is {name}

-
LocaleMessage
xx-LSmy name is {name}SSSSSSSSSSSSSSSSSSSSSSSSS
xx-ACMY NAME IS {name}
xx-HA[javascript]my name is {name}
en-XA[ḿẏ ƞȧȧḿḗḗ īş {name}]
en-XB‮ɯʎ uɐɯǝ ıs {name}‬
-
caution

Requires --ast

-

Extraction and compilation with a single script

-

In some environments you may want to simply extract your messages to a file ready for use with react-intl without using an intermediary extracted message file format. This could be useful for quickly and easily creating the file for the original language that uses the default messages. This could also be useful if you use a Translation Management System (TMS) that is best suited to working with the compiled files. Keep in mind that the compiled file does not contain message descriptions so it is harder to work with for translators. Ideally you want to find or write a custom formatter you can use to extract messages into a file format that works with your TMS.

-

In order to achieve extraction and compilation in a single script, you can simply set up a script for that in package.json like in this example:

-
"scripts": {
"extract": "formatjs extract",
"compile": "formatjs compile",
"extract-compile": "formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' && formatjs compile 'temp.json' --out-file lang/en.json && rm temp.json"
}
-

Breakdown of the script

-

The extract-compile example script consists of three operations performed one after the other.

-
formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]'
-

The first script extracts messages from all typescript files that are located in subfolders of src. You may need to ignore certain files that could trigger errors or warnings in the script, such as --ignore myFolder/myFile.ts

-
formatjs compile 'temp.json' --out-file lang/en.json
-

The second script compiles the messages from temp.json into the file lang/en.json. This file is ready to be consumed by react-intl.

-
rm temp.json
-

The last script deletes the temp.json extracted file. Feel free remove this from the script if you wish to keep this file around.

-

The resulting files

-

Here you can see the difference between the extracted (using the default formatter) and the compiled file formats. In the script above, temp.json is the extracted file and en.json is the compiled file.

-
{
"hak27d": {
"defaultMessage": "Control Panel",
"description": "title of control panel section"
},
"haqsd": {
"defaultMessage": "Delete user {name}",
"description": "delete button"
},
"19hjs": {
"defaultMessage": "New Password",
"description": "placeholder text"
},
"explicit-id": {
"defaultMessage": "Confirm Password",
"description": "placeholder text"
}
}
-

Folder Compilation

-

Batch compile a folder with extracted files from formatjs extract to a folder containing react-intl consumable JSON files. This also does ICU message verification. See Message Distribution for more details.

-
npm run formatjs compile-folder [options] <folder> <outFolder>
-

Folder structure should be in the form of <folder>/<locale>.json and the output would be <outFolder>/<locale>.json.

-

--format [path]

-

Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature:

-
type CompileFn = <T = Record<string, MessageDescriptor>>(
msgs: T
) => Record<string, string>
-

This is especially useful to convert from a TMS-specific format back to react-intl format

-

--ast

-

Whether to compile message into AST instead of just string. See Advanced Usage

-

--skip-errors

-

Whether to continue compiling messages after encountering an error parsing one of them. Any keys with errors will not be included in the output file.

-

Builtin Formatters

-

We provide the following built-in formatters to integrate with 3rd party TMSes:

-
TMS--format
BabelEditsimple
Crowdin Chrome JSONcrowdin
Lingohubsimple
Localize's Simple JSONsimple
Localizelysimple
locizesimple
Lokalise Structured JSONlokalise
Phrasesimple
POEditor Key-Value JSONsimple
SimpleLocalizesimple
Smartling ICU JSONsmartling
Transifex's Structured JSONtransifex
-
caution

The formats of extract & compile have to be the same, which means if you extract --format smartling, you have to compile --format smartling as well & vice versa.

-

Custom Formatters

-

You can provide your own formatter by using our interfaces:

-
import {FormatFn, CompileFn, Comparator} from '@formatjs/cli'

interface VendorJson {}

// [Optional] Format @formatjs/cli structure to vendor's structure
export const format: FormatFn<VendorJson> = () => {}
// [Optional] Format vendor's structure to @formatjs/cli structure
export const compile: CompileFn<VendorJson> = () => {}
// [Optional] Sort the messages in a specific order during serialization
export const compareMessages: Comparator = () => {}
-

Take a look at our builtin formatter code for some examples.

-

Node API

-

Install @formatjs/cli-lib instead to use programmatically

-
npm i -D @formatjs/cli-lib
-

Extraction

-
import {extract} from '@formatjs/cli-lib'

const resultAsString: Promise<string> = extract(files, {
idInterpolationPattern: '[sha512:contenthash:base64:6]',
})
-

Compilation

-
import {compile} from '@formatjs/cli-lib'

const resultAsString: Promise<string> = compile(files, {
ast: true,
})
-

Custom Formatter

-
import {FormatFn, CompileFn, Comparator} from '@formatjs/cli-lib'

export const format: FormatFn = msgs => msgs

// Sort key reverse alphabetically
export const compareMessages = (el1, el2) => {
return el1.key < el2.key ? 1 : -1
}

export const compile: CompileFn = msgs => {
const results: Record<string, string> = {}
for (const k in msgs) {
results[k] = msgs[k].defaultMessage!
}
return results
}
+ +
+
Skip to main content

CLI

Installation#

npm i -D @formatjs/cli

Add the following command to your package.json scripts:

{  "scripts": {    "extract": "formatjs extract",    "compile": "formatjs compile"  }}

We've built https://www.npmjs.com/package/@formatjs/cli that helps you extract messages from a list of files. It uses @formatjs/ts-transformer under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below:

import {defineMessages, defineMessage} from 'react-intl'
+defineMessages({  foo: {    id: 'foo',    defaultMessage: 'foo',    description: 'bar',  },})
+defineMessage({  id: 'single',  defaultMessage: 'single message',  description: 'header',})
import {FormattedMessage} from 'react-intl';<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
function Comp(props) {  const {intl} = props  return intl.formatMessage({    // The whole `intl.formatMessage` is required so we can extract    id: 'foo',    defaultMessage: 'foo',    description: 'bar',  })}

Extraction#

npm run extract --help# Usage: formatjs extract [options] [files...]
+# Extract string messages from React components that use react-intl.# The input language is expected to be TypeScript or ES2017 with JSX.

For example:

npm run extract "src/**/*.{ts,tsx,vue}" --out-file lang.json
caution

You should always quote (" or ') your glob pattern (like "src/**/*") to avoid auto shell expansion of those glob, which varies depending on your shell (zsh vs fish vs bash).

--format [path]#

Path to a formatter file that controls the shape of JSON file from --out-file. +The formatter file must export a function called format with the signature.

type FormatFn = <T = Record<string, MessageDescriptor>>(  msgs: Record<string, MessageDescriptor>) => T

This is especially useful to convert from our extracted format to a TMS-specific format.

See our builtin formatters for examples.

--out-file [path]#

The target file path where the plugin will output an aggregated .json file of allthe translations from the files supplied. This flag will ignore --messages-dir

--id-interpolation-pattern [pattern]#

If certain message descriptors don't have id, this pattern will be used to automatically generate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings.

--extract-source-location#

Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. (default: false)

--additional-component-names [comma-separated-names]#

Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage is imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe.

--additional-function-names [comma-separated-names]#

Additional function names to extract messages from, e.g: ['$t'].

--output-empty-json#

Output file with empty [] if src has no messages. For build systems like bazel that relies on specific output mapping, not writing out a file can cause issues. (default: false)

--ignore [files]#

List of glob paths to not extract translations from.

--throws#

Whether to throw an exception when we fail to process any file in the batch.

--pragma [pragma]#

Parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file:

// @intl-meta project:my-custom-projectimport {FormattedMessage} from 'react-intl';<FormattedMessage defaultMessage="foo" id="bar" />

and with option {pragma: "intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file.

--flatten#

Whether to hoist selectors & flatten sentences as much as possible. E.g:

I have {count, plural, one{a dog} other{many dogs}}

becomes

{count, plural, one{I have a dog} other{I have many dogs}}

The goal is to provide as many full sentences as possible since fragmented +sentences are not translator-friendly.

Compilation#

Compile extracted files from formatjs extract to a react-intl consumable +JSON file. This also does ICU message verification. See Message Distribution for more details.

npm run compile --help

--format [path]#

Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature:

type CompileFn = <T = Record<string, MessageDescriptor>>(  msgs: T) => Record<string, string>

This is especially useful to convert from a TMS-specific format back to react-intl format.

See our builtin formatters for examples.

--out-file <output>#

The target file that contains compiled messages.

--ast#

Whether to compile message into AST instead of just string. See Advanced Usage

--pseudo-locale <pseudoLocale>#

Whether we should compile messages into pseudo locales instead. Available pseudo-locales:

Given the English message my name is {name}

LocaleMessage
xx-LSmy name is {name}SSSSSSSSSSSSSSSSSSSSSSSSS
xx-ACMY NAME IS {name}
xx-HA[javascript]my name is {name}
en-XAṁẏ ńâṁè íś {name}

Extraction and compilation with a single script#

In some environments you may want to simply extract your messages to a file ready for use with react-intl without using an intermediary extracted message file format. This could be useful for quickly and easily creating the file for the original language that uses the default messages. This could also be useful if you use a Translation Management System (TMS) that is best suited to working with the compiled files. Keep in mind that the compiled file does not contain message descriptions so it is harder to work with for translators. Ideally you want to find or write a custom formatter you can use to extract messages into a file format that works with your TMS.

In order to achieve extraction and compilation in a single script, you can simply set up a script for that in package.json like in this example:

"scripts": {  "extract": "formatjs extract",  "compile": "formatjs compile",  "extract-compile": "formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' && formatjs compile 'temp.json' --out-file lang/en.json && rm temp.json"}

Breakdown of the script#

The extract-compile example script consists of three operations performed one after the other.

formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]'

The first script extracts messages from all typescript files that are located in subfolders of src. You may need to ignore certain files that could trigger errors or warnings in the script, such as --ignore myFolder/myFile.ts

formatjs compile 'temp.json' --out-file lang/en.json

The second script compiles the messages from temp.json into the file lang/en.json. This file is ready to be consumed by react-intl.

rm temp.json

The last script deletes the temp.json extracted file. Feel free remove this from the script if you wish to keep this file around.

The resulting files#

Here you can see the difference between the extracted (using the default formatter) and the compiled file formats. In the script above, temp.json is the extracted file and en.json is the compiled file.

{  "hak27d": {    "defaultMessage": "Control Panel",    "description": "title of control panel section"  },  "haqsd": {    "defaultMessage": "Delete user {name}",    "description": "delete button"  },  "19hjs": {    "defaultMessage": "New Password",    "description": "placeholder text"  },  "explicit-id": {    "defaultMessage": "Confirm Password",    "description": "placeholder text"  }}

Folder Compilation#

Batch compile a folder with extracted files from formatjs extract to a folder containing react-intl consumable JSON files. This also does ICU message verification. See Message Distribution for more details.

npm run formatjs compile-folder [options] <folder> <outFolder>

Folder structure should be in the form of <folder>/<locale>.json and the output would be <outFolder>/<locale>.json.

--format [path]#

Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature:

type CompileFn = <T = Record<string, MessageDescriptor>>(  msgs: T) => Record<string, string>

This is especially useful to convert from a TMS-specific format back to react-intl format

--ast#

Whether to compile message into AST instead of just string. See Advanced Usage

--skip-errors#

Whether to continue compiling messages after encountering an error parsing one of them. Any keys with errors will not be included in the output file.

Builtin Formatters#

We provide the following built-in formatters to integrate with 3rd party TMSes:

TMS--format
Transifex's Structured JSONtransifex
Smartling ICU JSONsmartling
Lingohubsimple
Phrasesimple
Crowdin Chrome JSONcrowdin
Lokalise Structured JSONlokalise
locizesimple
SimpleLocalizesimple
caution

The formats of extract & compile have to be the same, which means if you extract --format smartling, you have to compile --format smartling as well & vice versa.

Custom Formatters#

You can provide your own formatter by using our interfaces:

import {FormatFn, CompileFn, Comparator} from '@formatjs/cli'
+interface VendorJson {}
+// [Optional] Format @formatjs/cli structure to vendor's structureexport const format: FormatFn<VendorJson> = () => {}// [Optional] Format vendor's structure to @formatjs/cli structureexport const compile: CompileFn<VendorJson> = () => {}// [Optional] Sort the messages in a specific order during serializationexport const compareMessages: Comparator = () => {}

Take a look at our builtin formatter code for some examples.

Node API#

@formatjs/cli can also be consumed programmatically like below:

Extraction#

import {extract} from '@formatjs/cli'
+const resultAsString: Promise<string> = extract(files, {  idInterpolationPattern: '[sha512:contenthash:base64:6]',})

Compilation#

import {compile} from '@formatjs/cli'
+const resultAsString: Promise<string> = compile(files, {  ast: true,})

Custom Formatter#

import {FormatFn, CompileFn, Comparator} from '@formatjs/cli'
+export const format: FormatFn = msgs => msgs
+// Sort key reverse alphabeticallyexport const compareMessages = (el1, el2) => {  return el1.key < el2.key ? 1 : -1}
+export const compile: CompileFn = msgs => {  const results: Record<string, string> = {}  for (const k in msgs) {    results[k] = msgs[k].defaultMessage!  }  return results}
+ + \ No newline at end of file diff --git a/docs/tooling/linter/index.html b/docs/tooling/linter/index.html old mode 100644 new mode 100755 index ee06a1c6c..de4712140 --- a/docs/tooling/linter/index.html +++ b/docs/tooling/linter/index.html @@ -1,206 +1,39 @@ - + - -eslint-plugin-formatjs | Format.JS - - + + + + + +eslint-plugin-formatjs | Format.JS + + - -
Skip to main content

eslint-plugin-formatjs

This eslint plugin allows you to enforce certain rules in your ICU message.

-

Usage

- -
npm i -D eslint-plugin-formatjs
-

Then in your eslint config:

-
import formatjs from 'eslint-plugin-formatjs'

export default [
// other configs...
{
plugins: {
formatjs,
},
rules: {
'formatjs/no-offset': 'error',
},
},
]
-

React

-

Currently this uses intl.formatMessage, defineMessage, defineMessages, <FormattedMessage> from react-intl as hooks to verify the message. Therefore, in your code use 1 of the following mechanisms:

-
import {defineMessages, defineMessage} from 'react-intl'

const messages = defineMessages({
foo: {
defaultMessage: 'foo',
description: 'bar',
},
})

defineMessage({
defaultMessage: 'single message',
})
-
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" description="bar" />
-
function foo() {
intl.formatMessage({
defaultMessage: 'foo',
})
}
-

Vue

-

This will check against intl.formatMessage, $formatMessage function calls in both your JS/TS & your SFC .vue files. For example:

-
<template>
<p>
{{
$formatMessage({
defaultMessage: 'today is {now, date}',
})
}}
</p>
</template>
-

Shared Settings

-

These settings are applied globally to all formatjs rules once specified. See Shared Settings for more details on how to set them.

-

formatjs.additionalFunctionNames

-

Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional function names to check besides formatMessage & $formatMessage.

-

formatjs.additionalComponentNames

-

Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional component names to check besides FormattedMessage.

-

Shareable Configs

-

The plugin provides the following two shareable configs:

-
    -
  1. recommended
  2. -
  3. strict
  4. -
-

By using these, you can simplify your configuration while still using a set of rules that aligns with your -quality standards.

-

Example

-
import formatjs from 'eslint-plugin-formatjs'

export default [
formatjs.configs.recommended,
// Other configs...
]
-

Available Rules

-

blocklist-elements

-

This blocklists usage of specific elements in ICU message.

-

Why

-
    -
  • Certain translation vendors cannot handle things like selectordinal
  • -
-

Available elements

-
enum Element {
// literal text, like `defaultMessage: 'some text'`
literal = 'literal',
// placeholder, like `defaultMessage: '{placeholder} var'`
argument = 'argument',
// number, like `defaultMessage: '{placeholder, number} var'`
number = 'number',
// date, like `defaultMessage: '{placeholder, date} var'`
date = 'date',
// time, like `defaultMessage: '{placeholder, time} var'`
time = 'time',
// select, like `defaultMessage: '{var, select, foo{one} bar{two}} var'`
select = 'select',
// selectordinal, like `defaultMessage: '{var, selectordinal, one{one} other{two}} var'`
selectordinal = 'selectordinal',
// plural, like `defaultMessage: '{var, plural, one{one} other{two}} var'`
plural = 'plural',
}
-

Example

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/blocklist-elements': [2, ['selectordinal']],
},
},
]
-

enforce-description

-

This enforces description in the message descriptor.

-

Why

-
    -
  • Description provides helpful context for translators
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// WORKS
foo: {
defaultMessage: 'foo',
description: 'bar',
},
// FAILS
bar: {
defaultMessage: 'bar',
},
})
-

Options

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/enforce-description': ['error', 'literal'],
},
},
]
-

Setting literal forces description to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects description to always be a literal

-

enforce-default-message

-

This enforces defaultMessage in the message descriptor.

-

Why

-
    -
  • Can be useful in case we want to extract messages for translations from source code. This way can make sure people won't forget about defaultMessage
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// WORKS
foo: {
defaultMessage: 'This is default message',
description: 'bar',
},
// FAILS
bar: {
description: 'bar',
},
})
-

Options

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/enforce-default-message': ['error', 'literal'],
},
},
]
-

Setting literal forces defaultMessage to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects defaultMessage to always be a literal

-

enforce-placeholders

-

Makes sure all values are passed in if message has placeholders (number/date/time/plural/select/selectordinal). This requires values to be passed in as literal object (not a variable).

-
// WORKS, no error
<FormattedMessage
defaultMessage="this is a {placeholder}"
values={{placeholder: 'dog'}}
/>

// WORKS, no error
intl.formatMessage({
defaultMessage: 'this is a {placeholder}'
}, {placeholder: 'dog'})

// WORKS, error bc no values were provided
<FormattedMessage
defaultMessage="this is a {placeholder}"
/>

// WORKS, error bc no values were provided
intl.formatMessage({
defaultMessage: 'this is a {placeholder}'
})

// WORKS, error bc `placeholder` is not passed in
<FormattedMessage
defaultMessage="this is a {placeholder}"
values={{foo: 1}}
/>

// WORKS, error bc `placeholder` is not passed in
intl.formatMessage({
defaultMessage: 'this is a {placeholder}'
}, {foo: 1})

// DOESN'T WORK
<FormattedMessage
defaultMessage="this is a {placeholder}"
values={someVar}
/>

// DOESN'T WORK
intl.formatMessage({
defaultMessage: 'this is a {placeholder}'
}, values)
-

Options

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/enforce-placeholders': [
'error',
{
ignoreList: ['foo'],
},
],
},
},
]
-
    -
  • ignoreList: List of placeholder names to ignore. This works with defaultRichTextElements in react-intl so we don't provide false positive for ambient global tag formatting
  • -
-

enforce-plural-rules

-

Enforce certain plural rules to always be specified/forbidden in a message.

-

Why

-
    -
  • It is recommended to always specify other as fallback in the message.
  • -
  • Some translation vendors only accept certain rules.
  • -
-

Available rules

-
enum LDML {
zero = 'zero',
one = 'one',
two = 'two',
few = 'few',
many = 'many',
other = 'other',
}
-

Example

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/enforce-plural-rules': [
2,
{
one: true,
other: true,
zero: false,
},
],
},
},
]
-

no-camel-case

-

This make sure placeholders are not camel-case.

-

Why

-
    -
  • This is to prevent case-sensitivity issue in certain translation vendors.
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// WORKS
foo: {
defaultMessage: 'foo {snake_case} {nothing}',
},
// FAILS
bar: {
defaultMessage: 'foo {camelCase}',
},
})
-

no-missing-icu-plural-one-placeholders

-

Messages that look like {thing, plural, one {1 thing} other {# things}} will need to be changed to {thing, plural, one {# thing} other {# things}}

-

Why

-
    -
  • one is a category for any number that behaves like 1. So in some languages, for example Ukrainian, Russian and Polish, one → numbers that end in 1 (like 1, 21, 151) but that don’t end in 11 (like 11, 111, 10311). More info
  • -
-

no-emoji

-

This prevents usage of emojis (or above a certain Unicode version) in message

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/no-emoji': ['error'],
},
},

// OR
{
plugins: {
formatjs,
},
rules: {
'formatjs/no-emoji': ['error', {versionAbove: '12.0'}],
},
},
]
-

Why

-
    -
  • Certain translation vendors cannot handle emojis.
  • -
  • Cross-platform encoding for emojis are faulty.
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// WORKS
foo: {
defaultMessage: 'Smileys & People',
},
// WORKS with option {versionAbove: '12.0'}
foo_bar: {
defaultMessage: '😃 Smileys & People',
},
// FAILS
bar: {
defaultMessage: '😃 Smileys & People',
},
// FAILS with option {versionAbove: '12.0'}
bar_foo: {
defaultMessage: '🥹 Smileys & People',
},
})
-

no-literal-string-in-jsx

-

This prevents untranslated strings in JSX.

-

Why

-
    -
  • It is easy to forget wrapping JSX text in translation functions or components.
  • -
  • It is easy to forget wrapping certain accessibility attributes (e.g. aria-label) in translation functions.
  • -
-
// WORKS
<Button>
<FormattedMessage defaultMessage="Submit" />
</Button>
// WORKS
<Button>
{customTranslateFn("Submit")}
</Button>
// WORKS
<input aria-label={intl.formatMessage({defaultMessage: "Label"})} />
// WORKS
<img
src="/example.png"
alt={intl.formatMessage({defaultMessage: "Image description"})}
/>
// FAILS
<Button>Submit</Button>
// FAILS
<Button>{'Submit'}</Button>
// FAILS
<Button>{`Te` + 's' + t}</Button>
// FAILS
<input aria-label="Untranslated label" />
// FAILS
<img src="/example.png" alt="Image description" />
// FAILS
<input aria-label={`Untranslated label`} />
-

This linter reports text literals or string expressions, including string -concatenation expressions in the JSX children. It also checks certain JSX -attributes that you can customize.

-

Example

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/no-literal-string-in-jsx': [
2,
{
// Include or exclude additional prop checks (merged with the default checks)
props: {
include: [
// picomatch style glob pattern for tag name and prop name.
// check `name` prop of `UI.Button` tag.
['UI.Button', 'name'],
// check `message` of any component.
['*', 'message'],
],
// Exclude will always override include.
exclude: [
// do not check `message` of the `Foo` tag.
['Foo', 'message'],
// do not check aria-label and aria-description of `Bar` tag.
['Bar', 'aria-{label,description}'],
],
},
},
],
},
},
]
-

The default prop checks are:

-
{
include: [
// check aria attributes that the screen reader announces.
['*', 'aria-{label,description,details,errormessage}'],
// check placeholder and title attribute of all native DOM elements.
['[a-z]*([a-z0-9])', '(placeholder|title)'],
// check alt attribute of the img tag.
['img', 'alt'],
],
exclude: []
}
-

no-literal-string-in-object

-

This prevents untranslated strings in chosen object properties.

-

Why

-
    -
  • It is easy to forget wrapping literal strings in translation functions, when they are defined in an object field like {label: "Untranslated label"}.
  • -
-
const options = () => [
// FAILS
{value: 'chocolate', label: 'Chocolate'},
// WORKS
{
value: 'strawberry',
label: intl.formatMessage({defaultMessage: 'Strawberry'}),
},
// WORKS, custom translation function
{
value: 'mint',
label: customTranslateFn('Mint'),
},
// FAILS, string concatenation
{
value: 'coconut',
label: 'Coconut' + intl.formatMessage({defaultMessage: 'Ice Cream'}),
},
// FAILS, template literal
{
value: 'mango',
label: `Mango ${intl.formatMessage({defaultMessage: 'Ice Cream'})}`,
},
// FAILS, conditional rendering
{
value: 'recommended',
label: feelLikeSour
? intl.formatMessage({defaultMessage: 'Lime'})
: 'Vanilla',
},
]

const MyComponent = () => <Select options={options()} />
-

This linter reports text literals or string expressions, including string concatenation expressions in the object properties that you can customize.

-

Example

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/no-literal-string-in-object': [
'warn',
{
// The object properties to check for untranslated literal strings, default: ['label']
include: ['label'],
},
],
},
},
]
-

no-multiple-whitespaces

-

This prevents usage of multiple consecutive whitespaces in message.

-

Why

-
    -
  • Consecutive whitespaces are handled differently in different locales.
  • -
  • Prevents \ linebreaks in JS string which results in awkward whitespaces.
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// WORKS
foo: {
defaultMessage: 'Smileys & People',
},
// FAILS
bar: {
defaultMessage: 'Smileys & People',
},
// FAILS
baz: {
defaultMessage:
'this message is too long \
so I wanna line break it.',
},
})
-

no-multiple-plurals

-

This prevents specifying multiple plurals in your message.

-

Why

-
    -
  • Nested plurals are hard to translate across languages so some translation vendors don't allow it.
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// WORKS
foo: {
defaultMessage: '{p1, plural, one{one}}',
},
// FAILS
bar: {
defaultMessage: '{p1, plural, one{one}} {p2, plural, one{two}}',
}
// ALSO FAILS
bar2: {
defaultMessage: '{p1, plural, one{{p2, plural, one{two}}}}',
}
})
-

no-offset

-

This prevents specifying offset in plural rules in your message.

-

Why

-
    -
  • Offset has complicated logic implication so some translation vendors don't allow it.
  • -
-
import {defineMessages} from 'react-intl'

const messages = defineMessages({
// PASS
foo: {
defaultMessage: '{var, plural, one{one} other{other}}',
},
// FAILS
bar: {
defaultMessage: '{var, plural, offset:1 one{one} other{other}}',
},
})
-

enforce-id

-

This enforces generated ID to be set in MessageDescriptor.

-

Why

-

Pipelines can enforce automatic/manual ID generation at the linter level (autofix to insert autogen ID) so this guarantees that.

-
import {defineMessages} from 'react-intl';

const messages = defineMessages({
// PASS
foo: {
id: '19shaf'
defaultMessage: '{var, plural, one{one} other{other}}',
},
// FAILS
bar: {
id: 'something',
defaultMessage: '{var, plural, offset:1 one{one} other{other}}',
},
// FAILS
bar: {
defaultMessage: '{var, plural, offset:1 one{one} other{other}}',
},
});
-

Options

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/enforce-id': [
'error',
{
idInterpolationPattern: '[sha512:contenthash:base64:6]',
},
],
},
},
]
-
    -
  • idInterpolationPattern: Pattern to verify ID against
  • -
  • idWhitelist: An array of strings with regular expressions. This array allows allowlist custom ids for messages. For example '\\.' allows any id which has dot; '^payment_.*' - allows any custom id which has prefix payment_. Be aware that any backslash \ provided via string must be escaped with an additional backslash.
  • -
-

no-invalid-icu

-

This bans strings inside defaultMessage that are syntactically invalid.

-

Why

-

It's easy to miss strings that look correct to you as a developer but which are actually syntactically invalid ICU strings. For instance, the following would cause an eslint error:

-
formatMessage(
{
defaultMessage: '{count, plural one {#} other {# more}}', //Missing a comma!
},
{
count: 1,
}
)
-

no-id

-

This bans explicit ID in MessageDescriptor.

-

Why

-

We generally encourage automatic ID generation due to these reasons. This makes sure no explicit IDs are set.

-

no-complex-selectors

-

Make sure a sentence is not too complex. -Complexity is determined by how many strings are produced when we try to flatten the sentence given its selectors. For example:

-
I have {count, plural, one{a dog} other{many dogs}}
-

has the complexity of 2 because flattening the plural selector results in 2 sentences: I have a dog & I have many dogs. -Default complexity limit is 20 (using Smartling as a reference)

-

Options

-
import formatjs from 'eslint-plugin-formatjs'

export default [
{
plugins: {
formatjs,
},
rules: {
'formatjs/no-complex-selectors': [
'error',
{
limit: 3,
},
],
},
},
]
-

no-useless-message

-

This bans messages that do not require translation.

-

Why

-

Messages like {test} is not actionable by translators. The code should just directly reference test.

-

prefer-formatted-message

-

Use <FormattedMessage> instead of the imperative intl.formatMessage(...) if applicable.

-
// Bad
<p>
{intl.formatMessage({defaultMessage: 'hello'})}
</p>

// Good
<p>
<FormattedMessage defaultMessage="hello" />
</p>
-

Why

-

Consistent coding style in JSX and less syntax clutter.

-

prefer-pound-in-plural

-

Use # in the plural argument to reference the count instead of repeating the argument.

-
// Bad
I have {count} {
count, plural,
one {apple}
other {apples}
}
}
// Good
I have {
count, plural,
one {# apple}
other {# apples}
}
}

// Bad
I have {
count, plural,
one {{count} apple}
other {{count} apples}
}
}
// Good
I have {
count, plural,
one {# apple}
other {# apples}
}
}

// Bad
I won the {ranking}{
count, selectordinal,
one {st}
two {nd}
few {rd}
other {th}
} place.
// Good
I won the {ranking}{
count, selectordinal,
one {#st}
two {#nd}
few {#rd}
other {#th}
} place.
-

Why

-
    -
  1. More concise message.
  2. -
  3. Ensures that the count are correctly formatted as numbers.
  4. -
+ +
+
Skip to main content

eslint-plugin-formatjs

This eslint plugin allows you to enforce certain rules in your ICU message.

Usage#

npm i -D eslint-plugin-formatjs

Then in your eslint config:

{  "plugins": ["formatjs"],  "rules": {    "formatjs/no-offset": "error"  }}

React#

Currently this uses intl.formatMessage, defineMessage, defineMessages, <FormattedMessage> from react-intl as hooks to verify the message. Therefore, in your code use 1 of the following mechanisms:

import {defineMessages, defineMessage} from 'react-intl'
+const messages = defineMessages({  foo: {    defaultMessage: 'foo',    description: 'bar',  },})
+defineMessage({  defaultMessage: 'single message',})
import {FormattedMessage} from 'react-intl';<FormattedMessage defaultMessage="foo" description="bar" />
function foo() {  intl.formatMessage({    defaultMessage: 'foo',  })}

Vue#

This will check against intl.formatMessage, $formatMessage function calls in both your JS/TS & your SFC .vue files. For example:

<template>  <p>    {{      $formatMessage({        defaultMessage: 'today is {now, date}',      })    }}  </p></template>

Shared Settings#

These settings are applied globally to all formatjs rules once specified. See Shared Settings for more details on how to set them.

additionalFunctionNames#

Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional function names to check besides formatMessage & $formatMessage.

additionalComponentNames#

Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional component names to check besides FormattedMessage.

Available Rules#

blacklist-elements#

This blacklists usage of specific elements in ICU message.

Why#

  • Certain translation vendors cannot handle things like selectordinal

Available elements#

enum Element {  // literal text, like `defaultMessage: 'some text'`  literal = 'literal',  // placeholder, like `defaultMessage: '{placeholder} var'`  argument = 'argument',  // number, like `defaultMessage: '{placeholder, number} var'`  number = 'number',  // date, like `defaultMessage: '{placeholder, date} var'`  date = 'date',  // time, like `defaultMessage: '{placeholder, time} var'`  time = 'time',  // select, like `defaultMessage: '{var, select, foo{one} bar{two}} var'`  select = 'select',  // selectordinal, like `defaultMessage: '{var, selectordinal, one{one} other{two}} var'`  selectordinal = 'selectordinal',  // plural, like `defaultMessage: '{var, plural, one{one} other{two}} var'`  plural = 'plural',}

Example#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/blacklist-elements": [2, ["selectordinal"]]  }}

enforce-description#

This enforces description in the message descriptor.

Why#

  • Description provides helpful context for translators
import {defineMessages} from 'react-intl'
+const messages = defineMessages({  // WORKS  foo: {    defaultMessage: 'foo',    description: 'bar',  },  // FAILS  bar: {    defaultMessage: 'bar',  },})

Options#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/enforce-description": ["error", "literal"]  }}

Setting literal forces description to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects description to always be a literal

enforce-default-message#

This enforces defaultMessage in the message descriptor.

Why#

  • Can be useful in case we want to extract messages for translations from source code. This way can make sure people won't forget about defaultMessage
import {defineMessages} from 'react-intl'
+const messages = defineMessages({  // WORKS  foo: {    defaultMessage: 'This is default message',    description: 'bar',  },  // FAILS  bar: {    description: 'bar',  },})

Options#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/enforce-default-message": ["error", "literal"]  }}

Setting literal forces defaultMessage to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects defaultMessage to always be a literal

enforce-placeholders#

Makes sure all values are passed in if message has placeholders (number/date/time/plural/select/selectordinal). This requires values to be passed in as literal object (not a variable).

// WORKS, no error<FormattedMessage  defaultMessage="this is a {placeholder}"  values={{placeholder: 'dog'}}/>
+// WORKS, no errorintl.formatMessage({  defaultMessage: 'this is a {placeholder}'}, {placeholder: 'dog'})
+// WORKS, error bc no values were provided<FormattedMessage  defaultMessage="this is a {placeholder}"/>
+// WORKS, error bc no values were providedintl.formatMessage({  defaultMessage: 'this is a {placeholder}'})
+// WORKS, error bc `placeholder` is not passed in<FormattedMessage  defaultMessage="this is a {placeholder}"  values={{foo: 1}}/>
+// WORKS, error bc `placeholder` is not passed inintl.formatMessage({  defaultMessage: 'this is a {placeholder}'}, {foo: 1})
+// DOESN'T WORK<FormattedMessage  defaultMessage="this is a {placeholder}"  values={someVar}/>
+// DOESN'T WORKintl.formatMessage({  defaultMessage: 'this is a {placeholder}'}, values)

Options#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/enforce-placeholders": [      "error",      {        "ignoreList": ["foo"]      }    ]  }}
  • ignoreList: List of placeholder names to ignore. This works with defaultRichTextElements in react-intl so we don't provide false positive for ambient global tag formatting

enforce-plural-rules#

Enforce certain plural rules to always be specified/forbidden in a message.

Why#

  • It is recommended to always specify other as fallback in the message.
  • Some translation vendors only accept certain rules.

Available rules#

enum LDML {  zero = 'zero',  one = 'one',  two = 'two',  few = 'few',  many = 'many',  other = 'other',}

Example#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/enforce-plural-rules": [      2,      {        "one": true,        "other": true,        "zero": false      }    ]  }}

no-camel-case#

This make sure placeholders are not camel-case.

Why#

  • This is to prevent case-sensitivity issue in certain translation vendors.
import {defineMessages} from 'react-intl'
+const messages = defineMessages({  // WORKS  foo: {    defaultMessage: 'foo {snake_case} {nothing}',  },  // FAILS  bar: {    defaultMessage: 'foo {camelCase}',  },})

no-emoji#

This prevents usage of emoji in message.

Why#

  • Certain translation vendors cannot handle emojis.
  • Cross-platform encoding for emojis are faulty.
import {defineMessages} from 'react-intl'
+const messages = defineMessages({  // WORKS  foo: {    defaultMessage: 'Smileys & People',  },  // FAILS  bar: {    defaultMessage: '😃 Smileys & People',  },})

no-multiple-whitespaces#

This prevents usage of multiple consecutive whitespaces in message.

Why#

  • Consecutive whitespaces are handled differently in different locales.
  • Prevents \ linebreaks in JS string which results in awkward whitespaces.
import {defineMessages} from 'react-intl'
+const messages = defineMessages({  // WORKS  foo: {    defaultMessage: 'Smileys & People',  },  // FAILS  bar: {    defaultMessage: 'Smileys &   People',  },  // FAILS  baz: {    defaultMessage:      'this message is too long \    so I wanna line break it.',  },})

no-multiple-plurals#

This prevents specifying multiple plurals in your message.

Why#

  • Nested plurals are hard to translate across languages so some translation vendors don't allow it.
import {defineMessages} from 'react-intl'
+const messages = defineMessages({    // WORKS    foo: {        defaultMessage: '{p1, plural, one{one}}',    },    // FAILS    bar: {        defaultMessage: '{p1, plural, one{one}} {p2, plural, one{two}}',    }    // ALSO FAILS    bar2: {        defaultMessage: '{p1, plural, one{{p2, plural, one{two}}}}',    }})

no-offset#

This prevents specifying offset in plural rules in your message.

Why#

  • Offset has complicated logic implication so some translation vendors don't allow it.
import {defineMessages} from 'react-intl'
+const messages = defineMessages({  // PASS  foo: {    defaultMessage: '{var, plural, one{one} other{other}}',  },  // FAILS  bar: {    defaultMessage: '{var, plural, offset:1 one{one} other{other}}',  },})

enforce-id#

This enforces generated ID to be set in MessageDescriptor.

Why#

Pipelines can enforce automatic/manual ID generation at the linter level (autofix to insert autogen ID) so this guarantees that.

import {defineMessages} from 'react-intl';
+const messages = defineMessages({  // PASS  foo: {    id: '19shaf'    defaultMessage: '{var, plural, one{one} other{other}}',  },  // FAILS  bar: {    id: 'something',    defaultMessage: '{var, plural, offset:1 one{one} other{other}}',  },  // FAILS  bar: {    defaultMessage: '{var, plural, offset:1 one{one} other{other}}',  },});

Options#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/enforce-id": [      "error",      {        "idInterpolationPattern": "[sha512:contenthash:base64:6]"      }    ]  }}
  • idInterpolationPattern: Pattern to verify ID against

no-id#

This bans explicit ID in MessageDescriptor.

Why#

We generally encourage automatic ID generation due to these reasons. This makes sure no explicit IDs are set.

no-complex-selectors#

Make sure a sentence is not too complex. +Complexity is determined by how many strings are produced when we try to flatten the sentence given its selectors. For example:

I have {count, plural, one{a dog} other{many dogs}}

has the complexity of 2 because flattening the plural selector results in 2 sentences: I have a dog & I have many dogs. +Default complexity limit is 20 (using Smartling as a reference)

Options#

{  "plugins": ["formatjs"],  "rules": {    "formatjs/no-complex-selectors": [      "error",      {        "limit": 3      }    ]  }}
+ + \ No newline at end of file diff --git a/docs/tooling/swc-plugin/index.html b/docs/tooling/swc-plugin/index.html deleted file mode 100644 index 629b3bc27..000000000 --- a/docs/tooling/swc-plugin/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -swc-plugin | Format.JS - - - - -
Skip to main content

swc-plugin

This has been migrated over to the swc repo itself. You can find the plugin here.

- - \ No newline at end of file diff --git a/docs/tooling/ts-transformer/index.html b/docs/tooling/ts-transformer/index.html old mode 100644 new mode 100755 index 1a19f1ac3..96b19521f --- a/docs/tooling/ts-transformer/index.html +++ b/docs/tooling/ts-transformer/index.html @@ -1,59 +1,23 @@ - + - -ts-transformer | Format.JS - - + + + + + +ts-transformer | Format.JS + + - -
Skip to main content

ts-transformer

npm version

-

Process string messages for translation from modules that use react-intl, specifically:

-
    -
  • Parse and verify that messages are ICU-compliant w/o any syntax issues.
  • -
  • Remove description from message descriptor to save bytes since it isn't used at runtime.
  • -
  • Option to remove defaultMessage from message descriptor to save bytes since it isn't used at runtime.
  • -
  • Automatically inject message ID based on specific pattern.
  • -
-

Installation

- -
npm i @formatjs/ts-transformer
-

Usage

-

The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package.

-

Via ts-loader

-
import {transform} from '@formatjs/ts-transformer'

module.exports = {
...otherConfigs,
module: {
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
getCustomTransformers() {
return {
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
}),
],
}
},
},
},
],
},
],
},
}
-

Via ts-jest in jest.config.js

-
caution

This requires ts-jest@26.4.0 or later

-
// jest.config.js
module.exports = {
// [...]
globals: {
'ts-jest': {
astTransformers: {
before: [
{
path: '@formatjs/ts-transformer/ts-jest-integration',
options: {
// options
overrideIdFn: '[sha512:contenthash:base64:6]',
ast: true,
},
},
],
},
},
},
}
-

Via ts-patch

-
{
"compilerOptions": {
"plugins": [
{
"transform": "@formatjs/ts-transformer",
"import": "transform",
"type": "config",
"overrideIdFn": "[sha512:contenthash:base64:6]",
"ast": true
}
]
}
}
-

Via rollup-plugin-typescript2

-
// rollup.config.js
import typescript from 'rollup-plugin-typescript2'
import {transform} from '@formatjs/ts-transformer'

export default {
input: './main.ts',

plugins: [
typescript({
transformers: () => ({
before: [
transform({
overrideIdFn: '[sha512:contenthash:base64:6]',
ast: true,
}),
],
}),
}),
],
}
-

Options

-

overrideIdFn

-

A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages.

-

Alternatively, overrideIdFn can be a template string, which is used only if the message ID is empty.

-

removeDefaultMessage

-

Remove defaultMessage field in generated js after extraction.

-

extractSourceLocation

-

Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. Defaults to false.

-

additionalComponentNames

-

Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe.

-

additionalFunctionNames

-

Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t.

-

pragma

-

parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file:

-
// @intl-meta project:my-custom-project
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" id="bar" />
-

and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file.

-

ast

-

Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true.

-

onMsgExtracted(filePath: string, msgs: MessageDescriptor[])

-

Callback that gets triggered whenever a message is encountered.

-

onMetaExtracted(filePath: string, meta: Record<string, string>)

-

Callback that gets triggered whenever a pragme meta is encountered.

-

preserveWhitespace

-

Whether to preserve whitespace and newlines.

-

Take a look at compile.ts for example in integration.

+ +
+
Skip to main content

ts-transformer

npm version

Process string messages for translation from modules that use react-intl, specifically:

  • Parse and verify that messages are ICU-compliant w/o any syntax issues.
  • Remove description from message descriptor to save bytes since it isn't used at runtime.
  • Option to remove defaultMessage from message descriptor to save bytes since it isn't used at runtime.
  • Automatically inject message ID based on specific pattern.

Installation#

npm i @formatjs/ts-transformer

Usage#

The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package.

Via ts-loader#

import {transform} from '@formatjs/ts-transformer'
+module.exports = {  ...otherConfigs,  module: {    rules: [      {        test: /\.tsx?$/,        use: [          {            loader: 'ts-loader',            options: {              getCustomTransformers() {                return {                  before: [                    transform({                      overrideIdFn: '[sha512:contenthash:base64:6]',                    }),                  ],                }              },            },          },        ],      },    ],  },}

Via ts-jest in jest.config.js#

caution

This requires ts-jest@26.4.0 or later

// jest.config.jsmodule.exports = {  // [...]  globals: {    'ts-jest': {      astTransformers: {        before: [          {            path: '@formatjs/ts-transformer/ts-jest-integration',            options: {              // options              overrideIdFn: '[sha512:contenthash:base64:6]',              ast: true,            },          },        ],      },    },  },}

Via ttypescript#

{  "compilerOptions": {    "plugins": [      {        "transform": "@formatjs/ts-transformer",        "import": "transform",        "type": "config",        "overrideIdFn": "[sha512:contenthash:base64:6]",        "ast": true      }    ]  }}

Via rollup-plugin-typescript2#

// rollup.config.jsimport typescript from 'rollup-plugin-typescript2'import {transform} from '@formatjs/ts-transformer'
+export default {  input: './main.ts',
+  plugins: [    typescript({      transformers: () => ({        before: [          transform({            overrideIdFn: '[sha512:contenthash:base64:6]',            ast: true,          }),        ],      }),    }),  ],}

Options#

overrideIdFn#

A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages.

Alternatively, overrideIdFn can be a template string, which is used only if the message ID is empty.

removeDefaultMessage#

Remove defaultMessage field in generated js after extraction.

extractSourceLocation#

Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. Defaults to false.

additionalComponentNames#

Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe.

additionalFunctionNames#

Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t.

pragma#

parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file:

// @intl-meta project:my-custom-projectimport {FormattedMessage} from 'react-intl';<FormattedMessage defaultMessage="foo" id="bar" />

and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file.

ast#

Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true.

onMsgExtracted(filePath: string, msgs: MessageDescriptor[])#

Callback that gets triggered whenever a message is encountered.

onMetaExtracted(filePath: string, meta: Record<string, string>)#

Callback that gets triggered whenever a pragme meta is encountered.

Take a look at compile.ts for example in integration.

+ + \ No newline at end of file diff --git a/docs/vue-intl/index.html b/docs/vue-intl/index.html old mode 100644 new mode 100755 index dbb0edbc6..246a73673 --- a/docs/vue-intl/index.html +++ b/docs/vue-intl/index.html @@ -1,54 +1,23 @@ - + - -Vue Plugin for formatjs | Format.JS - - + + + + + +Vue Plugin for formatjs | Format.JS + + - -
Skip to main content

Vue Plugin for formatjs

This library contains our plugin for Vue.

-

Installation

- -
npm i -S vue-intl
-

Usage

-

Initialize VueIntl plugin with the same IntlConfig documented in @formatjs/intl.

-
import {createIntl} from 'vue-intl'

const app = createApp(App)
app.use(
createIntl({
locale: 'en',
defaultLocale: 'en',
messages: {
foo: 'bar',
},
})
)
-

From there you can use our APIs in 2 ways:

-

inject

-

By specifying inject: {intl: intlKey}, you can use the full IntlFormatters API documented in @formatjs/intl.

-

Note: intlKey needs to be imported from vue-intl.

-

Composition API

-

We also support Vue's Composition API with provideIntl & useIntl.

-
import {createIntl} from '@formatjs/intl'
import {provideIntl, useIntl} from 'vue-intl'

const Ancestor = {
setup() {
provideIntl(
createIntl({
locale: 'en',
defaultLocale: 'en',
messages: {
foo: 'Composed',
},
})
)
},
render() {
return h(Descendant)
},
}

const Descendant = {
setup() {
const intl = useIntl()
return () =>
h(
'p',
{},
intl.formatMessage({
id: 'foo',
defaultMessage: 'Hello',
})
)
},
}
-

Methods

-

You can also use our formatters in Vue template by prepending $ like below:

-
<template>
<p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p>
</template>
-

We currently support:

-
    -
  • $formatMessage
  • -
  • $formatDate
  • -
  • $formatTime
  • -
  • $formatRelativeTime
  • -
  • $formatTimeRange
  • -
  • $formatDisplayName
  • -
  • $formatList
  • -
-

See @formatjs/intl for the full list of API signatures.

-

Tooling

-

formatjs toolchain fully supports vue:

- -

Caveats

-

Using ICU in Vue SFC

-

Since }} & {{ are special tokens in .vue <template>, this can cause potential conflict with ICU MessageFormat syntax, e.g:

-
<template>
<p>
{{ $formatMessage({ defaultMessage: '{count, selectordinal, offset:1 one {#}
other {# more}}', }) }}
</p>
</template>
-

Notice the {# more}} where it ends with }}. This will cause parsing issue in your vue template. In order to work around this issue, we recommend using space to turn }} into } }.

-
<template>
<p>
{{
$formatMessage({
defaultMessage:
'{count, selectordinal, offset:1 one {#} other {# more} }',
})
}}
</p>
</template>
+ +
+
Skip to main content

Vue Plugin for formatjs

This library contains our plugin for Vue.

Installation#

npm i -S vue-intl

Usage#

Initialize VueIntl plugin with the same IntlConfig documented in @formatjs/intl.

import {createIntl} from 'vue-intl'
+const app = createApp(App)app.use(  createIntl({    locale: 'en',    defaultLocale: 'en',    messages: {      foo: 'bar',    },  }))

From there you can use our APIs in 2 ways:

inject#

By specifying inject: {intl: intlKey}, you can use the full IntlFormatters API documented in @formatjs/intl.

Note: intlKey needs to be imported from vue-intl.

Composition API#

We also support Vue's Composition API with provideIntl & useIntl.

import {createIntl} from '@formatjs/intl'import {provideIntl, useIntl} from 'vue-intl'
+const Ancestor = {  setup() {    provideIntl(      createIntl({        locale: 'en',        defaultLocale: 'en',        messages: {          foo: 'Composed',        },      })    )  },  render() {    return h(Descendant)  },}
+const Descendant = {  setup() {    const intl = useIntl()    return () =>      h(        'p',        {},        intl.formatMessage({          id: 'foo',          defaultMessage: 'Hello',        })      )  },}

Methods#

You can also use our formatters in Vue template by prepending $ like below:

<template>  <p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p></template>

We currently support:

  • $formatMessage
  • $formatDate
  • $formatTime
  • $formatRelativeTime
  • $formatTimeRange
  • $formatDisplayName
  • $formatList

See @formatjs/intl for the full list of API signatures.

Tooling#

formatjs toolchain fully supports vue:

Caveats#

Using ICU in Vue SFC#

Since }} & {{ are special tokens in .vue <template>, this can cause potential conflict with ICU MessageFormat syntax, e.g:

<template>  <p>    {{ $formatMessage({ defaultMessage: '{count, selectordinal, offset:1 one {#}    other {# more}}', }) }}  </p></template>

Notice the {# more}} where it ends with }}. This will cause parsing issue in your vue template. In order to work around this issue, we recommend using space to turn }} into } }.

<template>  <p>    {{      $formatMessage({        defaultMessage:          '{count, selectordinal, offset:1 one {#} other {# more} }',      })    }}  </p></template>
+ + \ No newline at end of file diff --git a/img/chrome.png b/img/chrome.png old mode 100644 new mode 100755 diff --git a/img/coinbase.svg b/img/coinbase.svg old mode 100644 new mode 100755 diff --git a/img/coinbase_white.svg b/img/coinbase_white.svg old mode 100644 new mode 100755 diff --git a/img/distribute-libs.excalidraw b/img/distribute-libs.excalidraw old mode 100644 new mode 100755 diff --git a/img/distribute-libs.svg b/img/distribute-libs.svg old mode 100644 new mode 100755 diff --git a/img/dropbox.svg b/img/dropbox.svg old mode 100644 new mode 100755 diff --git a/img/edge.png b/img/edge.png old mode 100644 new mode 100755 diff --git a/img/ember.svg b/img/ember.svg old mode 100644 new mode 100755 diff --git a/img/ethereum.svg b/img/ethereum.svg old mode 100644 new mode 100755 diff --git a/img/favicon.ico b/img/favicon.ico old mode 100644 new mode 100755 diff --git a/img/firefox.png b/img/firefox.png old mode 100644 new mode 100755 diff --git a/img/ie11.png b/img/ie11.png old mode 100644 new mode 100755 diff --git a/img/js.svg b/img/js.svg old mode 100644 new mode 100755 diff --git a/img/logo-dark.svg b/img/logo-dark.svg old mode 100644 new mode 100755 diff --git a/img/logo-header.svg b/img/logo-header.svg old mode 100644 new mode 100755 diff --git a/img/logo.svg b/img/logo.svg old mode 100644 new mode 100755 diff --git a/img/mozilla.svg b/img/mozilla.svg old mode 100644 new mode 100755 diff --git a/img/node.svg b/img/node.svg old mode 100644 new mode 100755 diff --git a/img/polyfills.excalidraw b/img/polyfills.excalidraw old mode 100644 new mode 100755 index 17ccf661f..fb5a43732 --- a/img/polyfills.excalidraw +++ b/img/polyfills.excalidraw @@ -1,12 +1,12 @@ { "type": "excalidraw", "version": 2, - "source": "https://app.excalidraw.com", + "source": "https://excalidraw.com", "elements": [ { "type": "text", - "version": 140, - "versionNonce": 1105866419, + "version": 139, + "versionNonce": 1938986376, "isDeleted": false, "id": "o9-ugmQsi6z6M0k9Q4ijw", "fillStyle": "hachure", @@ -19,35 +19,26 @@ "y": 304, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 237.03981018066406, + "width": 238, "height": 32, "seed": 1349359589, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "MoyUXlU-6KXn4KL6130du" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "KgQhYlzhjHyduUI9xJ8ii", + "MoyUXlU-6KXn4KL6130du" ], - "updated": 1699933563221, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.getCanonicalLocales", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.getCanonicalLocales", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "text", - "version": 135, - "versionNonce": 1276873213, + "version": 134, + "versionNonce": 1925721336, "isDeleted": false, "id": "6k13Zx4eRwAGNkFfH0Y8q", "fillStyle": "hachure", @@ -60,35 +51,26 @@ "y": 520, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 151.29986572265625, + "width": 147, "height": 32, "seed": 1613737995, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "3d06_xvWD6uyZgR_NHcWX" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "Rmaj7D2Ylf6ixejzosIfI", + "3d06_xvWD6uyZgR_NHcWX" ], - "updated": 1699933563222, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.PluralRules", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.PluralRules", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "text", - "version": 463, - "versionNonce": 1285479837, + "version": 432, + "versionNonce": 1583812744, "isDeleted": false, "id": "8JU_rpvx7MfwgqhErMnuj", "fillStyle": "hachure", @@ -97,39 +79,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 30.73046875, - "y": 792.859375, + "x": 138.5, + "y": 798, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 234.97979736328125, + "width": 235, "height": 32, "seed": 1696542283, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "4Q9MqGqoxmosaxUakowQ8" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "4Q9MqGqoxmosaxUakowQ8" ], - "updated": 1699933573015, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.RelativeTimeFormat", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.RelativeTimeFormat", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "text", - "version": 146, - "versionNonce": 1936933469, + "version": 145, + "versionNonce": 1170762744, "isDeleted": false, "id": "zhrH4GALW-FOtpySVgx-q", "fillStyle": "hachure", @@ -142,47 +114,28 @@ "y": 401, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 104.919921875, + "width": 103, "height": 32, "seed": 514487147, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "MoyUXlU-6KXn4KL6130du" - }, - { - "type": "arrow", - "id": "ufWdIm0X2K2cGvXZeUCSa" - }, - { - "type": "arrow", - "id": "w8yvGExM_X1WA77NLf7Wk" - }, - { - "type": "arrow", - "id": "3d06_xvWD6uyZgR_NHcWX" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "MoyUXlU-6KXn4KL6130du", + "ufWdIm0X2K2cGvXZeUCSa", + "w8yvGExM_X1WA77NLf7Wk", + "3d06_xvWD6uyZgR_NHcWX" ], - "updated": 1699933563222, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.Locale", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.Locale", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "text", - "version": 230, - "versionNonce": 572415475, + "version": 229, + "versionNonce": 207314568, "isDeleted": false, "id": "w9XvzMllLfvOn1deWsoIb", "fillStyle": "hachure", @@ -195,35 +148,26 @@ "y": 523, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 171.6398468017578, + "width": 173, "height": 32, "seed": 1718717893, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "w8yvGExM_X1WA77NLf7Wk" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "KgQhYlzhjHyduUI9xJ8ii", + "w8yvGExM_X1WA77NLf7Wk" ], - "updated": 1699933563222, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.DisplayNames", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.DisplayNames", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "text", - "version": 366, - "versionNonce": 155553821, + "version": 337, + "versionNonce": 1732493192, "isDeleted": false, "id": "lnz2EAa32ZjkSTSCDSQVC", "fillStyle": "hachure", @@ -232,55 +176,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 453.353844618942, - "y": 663.3674659905865, + "x": 337.5, + "y": 654, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 177.33984375, + "width": 175, "height": 32, "seed": 732189413, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "1xaKOH-wh-NF5xS7H73pq" - }, - { - "id": "TiG2s6XomTG6iGXks_Qdj", - "type": "arrow" - }, - { - "id": "m47dwr0-yKODe727cnace", - "type": "arrow" - }, - { - "id": "4Q9MqGqoxmosaxUakowQ8", - "type": "arrow" - }, - { - "id": "J5lMevVSRbGy3iFSLsQI5", - "type": "arrow" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "1xaKOH-wh-NF5xS7H73pq" ], - "updated": 1699933844800, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.NumberFormat", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.NumberFormat", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "text", - "version": 273, - "versionNonce": 1531621715, + "version": 271, + "versionNonce": 824045448, "isDeleted": false, "id": "qZR72Ok_NQrQGZp802E0q", "fillStyle": "hachure", @@ -293,39 +211,26 @@ "y": 517, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 149.25987243652344, + "width": 147, "height": 32, "seed": 901849131, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "arrow", - "id": "ufWdIm0X2K2cGvXZeUCSa" - }, - { - "id": "KuI4IdeLv1Ru5mWpPUG86", - "type": "arrow" - } + "strokeSharpness": "sharp", + "boundElementIds": [ + "WFy9XDr8AYhcX-54VLA_N", + "ufWdIm0X2K2cGvXZeUCSa" ], - "updated": 1699933599709, - "link": null, - "locked": false, "fontSize": 20, "fontFamily": 1, "text": "Intl.ListFormat", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.ListFormat", - "lineHeight": 1.6, - "baseline": 21 + "verticalAlign": "top" }, { "type": "arrow", - "version": 389, - "versionNonce": 213507965, + "version": 341, + "versionNonce": 159922936, "isDeleted": false, "id": "4Q9MqGqoxmosaxUakowQ8", "fillStyle": "hachure", @@ -334,50 +239,37 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 441.92173136635085, - "y": 692.4461237829498, + "x": 367.66183958612385, + "y": 701.8586617831141, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 252.33437476808217, - "height": 86.63759101253527, + "width": 99.78746498446463, + "height": 82.365678012371, "seed": 1703564427, "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1699933840828, - "link": null, - "locked": false, - "startBinding": { - "elementId": "lnz2EAa32ZjkSTSCDSQVC", - "focus": 0.4584158850697033, - "gap": 11.432113252591165 - }, + "strokeSharpness": "round", + "boundElementIds": [], "endBinding": { "elementId": "8JU_rpvx7MfwgqhErMnuj", - "focus": -0.27640531938218477, + "focus": -0.1767869936492142, "gap": 13.775660204514907 }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", "points": [ [ 0, 0 ], [ - -252.33437476808217, - 86.63759101253527 + -99.78746498446463, + 82.365678012371 ] - ] + ], + "lastCommittedPoint": null }, { "type": "text", - "version": 359, - "versionNonce": 1187287037, + "version": 309, + "versionNonce": 662279304, "isDeleted": false, "id": "wU6q-18jJJ_8YhXv-1uKQ", "fillStyle": "hachure", @@ -386,399 +278,149 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 320.9152075483879, - "y": 797.1702101086306, + "x": 468, + "y": 797, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 205.97982788085938, + "width": 212, "height": 32, "seed": 106787643, "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "id": "TiG2s6XomTG6iGXks_Qdj", - "type": "arrow" - }, - { - "id": "EiP7dIJo7Yz_PUhIieNf3", - "type": "arrow" - } - ], - "updated": 1699933848079, - "link": null, - "locked": false, + "strokeSharpness": "sharp", + "boundElementIds": [], "fontSize": 20, "fontFamily": 1, "text": "Intl.DateTimeFormat", + "baseline": 23, "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Intl.DateTimeFormat", - "lineHeight": 1.6, - "baseline": 21 - }, - { - "type": "arrow", - "version": 171, - "versionNonce": 113125939, - "isDeleted": false, - "id": "1xaKOH-wh-NF5xS7H73pq", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 408, - "y": 572, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 91.20893244710788, - "height": 80.36746599058654, - "seed": 966905807, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1699933837282, - "link": null, - "locked": false, - "startBinding": null, - "endBinding": { - "elementId": "lnz2EAa32ZjkSTSCDSQVC", - "focus": -0.1139451728247914, - "gap": 11 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 91.20893244710788, - 80.36746599058654 - ] - ] + "verticalAlign": "top" }, { "type": "arrow", - "version": 47, - "versionNonce": 884041464, + "version": 206, + "versionNonce": 1442699256, "isDeleted": false, - "id": "MoyUXlU-6KXn4KL6130du", + "id": "x7M2r6i4CyQ6KaNx1mw_r", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 1, "opacity": 100, "angle": 0, - "x": 738, - "y": 342, + "x": 489, + "y": 710, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 1, - "height": 52, - "seed": 1449114760, + "width": 60, + "height": 68, + "seed": 2068784571, "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1699933561206, - "link": null, - "locked": false, - "startBinding": { - "elementId": "o9-ugmQsi6z6M0k9Q4ijw", - "focus": 0.003546099290780142, - "gap": 6 - }, - "endBinding": { - "elementId": "zhrH4GALW-FOtpySVgx-q", - "focus": -0.049368968077208614, - "gap": 7 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", + "strokeSharpness": "round", + "boundElementIds": [], "points": [ [ 0, 0 ], [ - 1, - 52 + 60, + 68 ] - ] - }, - { - "type": "arrow", - "version": 261, - "versionNonce": 499564168, - "isDeleted": false, - "id": "ufWdIm0X2K2cGvXZeUCSa", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 776.1782670389522, - "y": 442.5, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 108.12380928134519, - "height": 66.5, - "seed": 819578872, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1699933561206, - "link": null, - "locked": false, - "startBinding": { - "elementId": "zhrH4GALW-FOtpySVgx-q", - "focus": 0.08993973110802041, - "gap": 9.5 - }, - "endBinding": { - "elementId": "qZR72Ok_NQrQGZp802E0q", - "focus": 0.3650132525558501, - "gap": 8 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 108.12380928134519, - 66.5 - ] - ] + ], + "lastCommittedPoint": null }, { "type": "arrow", - "version": 44, - "versionNonce": 324144376, + "version": 147, + "versionNonce": 1807096824, "isDeleted": false, - "id": "w8yvGExM_X1WA77NLf7Wk", + "id": "1xaKOH-wh-NF5xS7H73pq", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 1, "opacity": 100, "angle": 0, - "x": 734, - "y": 443, + "x": 408, + "y": 572, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 53, - "height": 75, - "seed": 920033016, + "width": 5, + "height": 71, + "seed": 966905807, "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1699933561206, - "link": null, - "locked": false, - "startBinding": { - "elementId": "zhrH4GALW-FOtpySVgx-q", - "focus": -0.16516293387113898, - "gap": 10 - }, + "strokeSharpness": "round", + "boundElementIds": [], "endBinding": { - "elementId": "w9XvzMllLfvOn1deWsoIb", - "focus": 0.2061209188194397, - "gap": 5 + "elementId": "lnz2EAa32ZjkSTSCDSQVC", + "focus": -0.1139451728247914, + "gap": 11 }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", "points": [ [ 0, 0 ], [ - -53, - 75 + 5, + 71 ] - ] + ], + "lastCommittedPoint": null }, { + "id": "MoyUXlU-6KXn4KL6130du", "type": "arrow", - "version": 60, - "versionNonce": 708734856, - "isDeleted": false, - "id": "3d06_xvWD6uyZgR_NHcWX", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, + "x": 738, + "y": 342, + "width": 1, + "height": 52, "angle": 0, - "x": 680, - "y": 442, "strokeColor": "#000000", "backgroundColor": "transparent", - "width": 221, - "height": 73, - "seed": 763252104, - "groupIds": [], - "frameId": null, - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1699933561206, - "link": null, - "locked": false, - "startBinding": { - "elementId": "zhrH4GALW-FOtpySVgx-q", - "focus": -0.13693372626961825, - "gap": 10.5 - }, - "endBinding": { - "elementId": "6k13Zx4eRwAGNkFfH0Y8q", - "focus": -0.1851373364039769, - "gap": 5 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -221, - 73 - ] - ] - }, - { - "id": "TiG2s6XomTG6iGXks_Qdj", - "type": "arrow", - "x": 492.59067001637527, - "y": 705.775547045274, - "width": 56.99311582432654, - "height": 81.06836911804407, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 1, "opacity": 100, "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 228866397, - "version": 105, - "versionNonce": 1338603891, + "strokeSharpness": "round", + "seed": 1449114760, + "version": 47, + "versionNonce": 884041464, "isDeleted": false, - "boundElements": null, - "updated": 1699933837283, - "link": null, - "locked": false, + "boundElementIds": null, "points": [ [ 0, 0 ], [ - -56.99311582432654, - 81.06836911804407 + 1, + 52 ] ], "lastCommittedPoint": null, "startBinding": { - "elementId": "lnz2EAa32ZjkSTSCDSQVC", - "focus": 0.3083972326540485, - "gap": 10.4080810546875 + "elementId": "o9-ugmQsi6z6M0k9Q4ijw", + "focus": 0.003546099290780142, + "gap": 6 }, "endBinding": { - "elementId": "wU6q-18jJJ_8YhXv-1uKQ", - "focus": -0.05966140327523623, - "gap": 10.3262939453125 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "s1gu8ck0bqOLhyqvDWiyv", - "type": "text", - "x": 709.262186782912, - "y": 992.6763897245937, - "width": 195.73983764648438, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 91495325, - "version": 114, - "versionNonce": 682115869, - "isDeleted": false, - "boundElements": [ - { - "id": "m47dwr0-yKODe727cnace", - "type": "arrow" - }, - { - "id": "KuI4IdeLv1Ru5mWpPUG86", - "type": "arrow" - } - ], - "updated": 1699933868199, - "link": null, - "locked": false, - "text": "Intl.DurationFormat", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 18, - "containerId": null, - "originalText": "Intl.DurationFormat", - "lineHeight": 1.25 + "elementId": "zhrH4GALW-FOtpySVgx-q", + "focus": -0.049368968077208614, + "gap": 7 + } }, { - "id": "m47dwr0-yKODe727cnace", + "id": "ufWdIm0X2K2cGvXZeUCSa", "type": "arrow", - "x": 586.0772752558979, - "y": 705.115390795274, - "width": 201.29849794844847, - "height": 275.1781864293197, + "x": 776.1782670389522, + "y": 442.5, + "width": 108.12380928134519, + "height": 66.5, "angle": 0, - "strokeColor": "#1e1e1e", + "strokeColor": "#000000", "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, @@ -786,144 +428,43 @@ "roughness": 1, "opacity": 100, "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 828640669, - "version": 223, - "versionNonce": 1933434845, + "strokeSharpness": "round", + "seed": 819578872, + "version": 261, + "versionNonce": 499564168, "isDeleted": false, - "boundElements": null, - "updated": 1699933868199, - "link": null, - "locked": false, + "boundElementIds": null, "points": [ [ 0, 0 ], [ - 201.29849794844847, - 275.1781864293197 + 108.12380928134519, + 66.5 ] ], "lastCommittedPoint": null, "startBinding": { - "elementId": "lnz2EAa32ZjkSTSCDSQVC", - "focus": -0.25112323693077254, - "gap": 9.7479248046875 + "elementId": "zhrH4GALW-FOtpySVgx-q", + "focus": 0.08993973110802041, + "gap": 9.5 }, "endBinding": { - "elementId": "s1gu8ck0bqOLhyqvDWiyv", - "focus": -0.014521883360090897, - "gap": 12.3828125 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "KuI4IdeLv1Ru5mWpPUG86", - "type": "arrow", - "x": 857.3569826100612, - "y": 557.7322998046875, - "width": 14.979134261586523, - "height": 424.09252741990633, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 2056402365, - "version": 199, - "versionNonce": 1696812189, - "isDeleted": false, - "boundElements": null, - "updated": 1699933868199, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -14.979134261586523, - 424.09252741990633 - ] - ], - "lastCommittedPoint": null, - "startBinding": { "elementId": "qZR72Ok_NQrQGZp802E0q", - "focus": 0.3980440954637873, - "gap": 8.7322998046875 - }, - "endBinding": { - "elementId": "s1gu8ck0bqOLhyqvDWiyv", - "focus": 0.350121621609391, - "gap": 10.8515625 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "oR1TI7Lrt0tYHkl7TuUNE", - "type": "text", - "x": 420.4087057056001, - "y": 1003.4560623601471, - "width": 223.85977172851562, - "height": 25, - "angle": 0, - "strokeColor": "#1e1e1e", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 28441779, - "version": 45, - "versionNonce": 412382397, - "isDeleted": false, - "boundElements": [ - { - "id": "J5lMevVSRbGy3iFSLsQI5", - "type": "arrow" - }, - { - "id": "EiP7dIJo7Yz_PUhIieNf3", - "type": "arrow" - } - ], - "updated": 1699933848079, - "link": null, - "locked": false, - "text": "Intl.supportedValuesOf", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 18, - "containerId": null, - "originalText": "Intl.supportedValuesOf", - "lineHeight": 1.25 + "focus": 0.3650132525558501, + "gap": 8 + } }, { - "id": "J5lMevVSRbGy3iFSLsQI5", + "id": "w8yvGExM_X1WA77NLf7Wk", "type": "arrow", - "x": 558.2802270032984, - "y": 704.1779187635417, - "width": 26.280737584656663, - "height": 291.713557989131, + "x": 734, + "y": 443, + "width": 53, + "height": 75, "angle": 0, - "strokeColor": "#1e1e1e", + "strokeColor": "#000000", "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, @@ -931,49 +472,43 @@ "roughness": 1, "opacity": 100, "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1505611891, - "version": 56, - "versionNonce": 2105390355, + "strokeSharpness": "round", + "seed": 920033016, + "version": 44, + "versionNonce": 324144376, "isDeleted": false, - "boundElements": null, - "updated": 1699933844803, - "link": null, - "locked": false, + "boundElementIds": null, "points": [ [ 0, 0 ], [ - 26.280737584656663, - 291.713557989131 + -53, + 75 ] ], "lastCommittedPoint": null, "startBinding": { - "elementId": "lnz2EAa32ZjkSTSCDSQVC", - "focus": -0.15559927073349408, - "gap": 8.81045277295516 + "elementId": "zhrH4GALW-FOtpySVgx-q", + "focus": -0.16516293387113898, + "gap": 10 }, "endBinding": { - "elementId": "oR1TI7Lrt0tYHkl7TuUNE", - "focus": 0.47790474680008155, - "gap": 7.5645856074744415 - }, - "startArrowhead": null, - "endArrowhead": "arrow" + "elementId": "w9XvzMllLfvOn1deWsoIb", + "focus": 0.2061209188194397, + "gap": 5 + } }, { - "id": "EiP7dIJo7Yz_PUhIieNf3", + "id": "3d06_xvWD6uyZgR_NHcWX", "type": "arrow", - "x": 431.8231921311784, - "y": 838.124419227173, - "width": 37.011631864971775, - "height": 153.61667664354377, + "x": 680, + "y": 442, + "width": 221, + "height": 73, "angle": 0, - "strokeColor": "#1e1e1e", + "strokeColor": "#000000", "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, @@ -981,44 +516,37 @@ "roughness": 1, "opacity": 100, "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 483105459, - "version": 51, - "versionNonce": 234379059, + "strokeSharpness": "round", + "seed": 763252104, + "version": 60, + "versionNonce": 708734856, "isDeleted": false, - "boundElements": null, - "updated": 1699933848081, - "link": null, - "locked": false, + "boundElementIds": null, "points": [ [ 0, 0 ], [ - 37.011631864971775, - 153.61667664354377 + -221, + 73 ] ], "lastCommittedPoint": null, "startBinding": { - "elementId": "wU6q-18jJJ_8YhXv-1uKQ", - "focus": -0.017836406621810776, - "gap": 8.954209118542394 + "elementId": "zhrH4GALW-FOtpySVgx-q", + "focus": -0.13693372626961825, + "gap": 10.5 }, "endBinding": { - "elementId": "oR1TI7Lrt0tYHkl7TuUNE", - "focus": -0.5017291251179896, - "gap": 11.714966489430367 - }, - "startArrowhead": null, - "endArrowhead": "arrow" + "elementId": "6k13Zx4eRwAGNkFfH0Y8q", + "focus": -0.1851373364039769, + "gap": 5 + } } ], "appState": { - "gridSize": null, - "viewBackgroundColor": "#ffffff" - }, - "files": {} + "viewBackgroundColor": "#ffffff", + "gridSize": null + } } \ No newline at end of file diff --git a/img/polyfills.svg b/img/polyfills.svg old mode 100644 new mode 100755 index cd1f7af04..22ff44679 --- a/img/polyfills.svg +++ b/img/polyfills.svg @@ -1,21 +1,16 @@ - + - - Intl.getCanonicalLocalesIntl.PluralRulesIntl.RelativeTimeFormatIntl.LocaleIntl.DisplayNamesIntl.NumberFormatIntl.ListFormatIntl.DateTimeFormatIntl.DurationFormatIntl.supportedValuesOf \ No newline at end of file + Intl.getCanonicalLocalesIntl.PluralRulesIntl.RelativeTimeFormatIntl.LocaleIntl.DisplayNamesIntl.NumberFormatIntl.ListFormatIntl.DateTimeFormat \ No newline at end of file diff --git a/img/react.svg b/img/react.svg old mode 100644 new mode 100755 diff --git a/img/safari.png b/img/safari.png old mode 100644 new mode 100755 diff --git a/img/simple-workflow.excalidraw b/img/simple-workflow.excalidraw deleted file mode 100644 index f34adb40f..000000000 --- a/img/simple-workflow.excalidraw +++ /dev/null @@ -1,544 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "type": "rectangle", - "version": 570, - "versionNonce": 354893259, - "isDeleted": false, - "id": "cTme02egaX20aNq-QZQDX", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 388.14285714285717, - "y": 1007.7857142857144, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 162.28571428571422, - "height": 79.85714285714292, - "seed": 1592454919, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "id": "P_PDsZI9U_cJWvi3F22TD", - "type": "arrow" - } - ], - "updated": 1665653314502, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 170, - "versionNonce": 1763698987, - "isDeleted": false, - "id": "vsZQvHuiURSLG5NHwBWxA", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 240.57142857142875, - "y": 999.5714285714287, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 102, - "height": 32, - "seed": 1762112969, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Extraction", - "baseline": 23, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Extraction" - }, - { - "type": "arrow", - "version": 287, - "versionNonce": 1756580971, - "isDeleted": false, - "id": "P_PDsZI9U_cJWvi3F22TD", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 216.89218986643723, - "y": 1036.5000000000002, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 157.39352441927744, - "height": 0, - "seed": 156053575, - "groupIds": [], - "strokeSharpness": "round", - "boundElements": [], - "updated": 1665653314521, - "link": null, - "locked": false, - "startBinding": { - "elementId": "mk52fd6nNmcK6kAJhLsJN", - "gap": 11.979624626253347, - "focus": -0.37142857142856284 - }, - "endBinding": { - "elementId": "cTme02egaX20aNq-QZQDX", - "gap": 13.857142857142463, - "focus": 0.2808586762075092 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 157.39352441927744, - 0 - ] - ] - }, - { - "type": "arrow", - "version": 244, - "versionNonce": 1145004069, - "isDeleted": false, - "id": "6t9xgRkLTqS5yfFCZ14xO", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 366.28571428571445, - "y": 1060.3571428571418, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 148.5714285714286, - "height": 0, - "seed": 1353988009, - "groupIds": [], - "strokeSharpness": "round", - "boundElements": [], - "updated": 1665653304254, - "link": null, - "locked": false, - "endBinding": { - "elementId": "mk52fd6nNmcK6kAJhLsJN", - "focus": 0.42380952380948805, - "gap": 13.162627555321052 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -148.5714285714286, - 0 - ] - ] - }, - { - "type": "text", - "version": 228, - "versionNonce": 1017008587, - "isDeleted": false, - "id": "xwkrl9QOynWVjPfGLmkyN", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 273.7142857142851, - "y": 1062.7142857142858, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 49, - "height": 25, - "seed": 2058405127, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653352140, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Save", - "baseline": 18, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Save" - }, - { - "type": "ellipse", - "version": 53, - "versionNonce": 704766123, - "isDeleted": false, - "id": "mk52fd6nNmcK6kAJhLsJN", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 83.28571428571422, - "y": 1017.6428571428571, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 124.28571428571433, - "height": 60, - "seed": 1448083815, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "id": "P_PDsZI9U_cJWvi3F22TD", - "type": "arrow" - }, - { - "id": "6t9xgRkLTqS5yfFCZ14xO", - "type": "arrow" - } - ], - "updated": 1665653304254, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 20, - "versionNonce": 64984517, - "isDeleted": false, - "id": "tD1GP0vGNo537B4W2CDwi", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 106.92857142857139, - "y": 1031.642857142857, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 77, - "height": 32, - "seed": 657246313, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Develop", - "baseline": 23, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": null, - "originalText": "Develop" - }, - { - "type": "ellipse", - "version": 62, - "versionNonce": 1541494027, - "isDeleted": false, - "id": "s9Jclc_TdSR08iSXW08ms", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 164.71428571428567, - "y": 1141.9285714285716, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 118.57142857142861, - "height": 60, - "seed": 2142594761, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 11, - "versionNonce": 1297257765, - "isDeleted": false, - "id": "BkNIIzwPz2cKDksqfOZUO", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 200.99999999999997, - "y": 1155.9285714285716, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 46, - "height": 32, - "seed": 899016681, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Build", - "baseline": 23, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": null, - "originalText": "Build" - }, - { - "type": "ellipse", - "version": 61, - "versionNonce": 1453882283, - "isDeleted": false, - "id": "7lCDWF0x1tes6Mztml9PI", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": -9.571428571428555, - "y": 1146.2142857142853, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 110, - "height": 52.85714285714289, - "seed": 1470023849, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 35, - "versionNonce": 586066053, - "isDeleted": false, - "id": "ov004qb4BsD7lxau1USEz", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 22.928571428571445, - "y": 1156.6428571428569, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 45, - "height": 32, - "seed": 1010581641, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Test", - "baseline": 23, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": null, - "originalText": "Test" - }, - { - "type": "arrow", - "version": 29, - "versionNonce": 1192349259, - "isDeleted": false, - "id": "Uipbx0awHZ929HbBMnlkq", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 173.28571428571428, - "y": 1079.0714285714287, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 22.857142857142833, - "height": 54.28571428571422, - "seed": 878381257, - "groupIds": [], - "strokeSharpness": "round", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 22.857142857142833, - 54.28571428571422 - ] - ] - }, - { - "type": "arrow", - "version": 23, - "versionNonce": 1181831141, - "isDeleted": false, - "id": "0OLDdjglutKdlEUu9gnpU", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 154.71428571428567, - "y": 1176.2142857142858, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 44.28571428571422, - "height": 0, - "seed": 625781767, - "groupIds": [], - "strokeSharpness": "round", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - -44.28571428571422, - 0 - ] - ] - }, - { - "type": "arrow", - "version": 38, - "versionNonce": 267898091, - "isDeleted": false, - "id": "G0JMAV2Dpu_rNJGs24oM8", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 57.571428571428555, - "y": 1133.357142857143, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 38.571428571428555, - "height": 47.14285714285711, - "seed": 491986535, - "groupIds": [], - "strokeSharpness": "round", - "boundElements": [], - "updated": 1665653301413, - "link": null, - "locked": false, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 38.571428571428555, - -47.14285714285711 - ] - ] - }, - { - "type": "text", - "version": 81, - "versionNonce": 1647712549, - "isDeleted": false, - "id": "sZFf5HFtUxKcabdhj3uJE", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 412.2857142857142, - "y": 1022.7142857142858, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 114, - "height": 50, - "seed": 667948169, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1665653323979, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Translation\nEditor", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": null, - "originalText": "Translation\nEditor" - } - ], - "appState": { - "gridSize": null, - "viewBackgroundColor": "#ffffff" - }, - "files": {} -} \ No newline at end of file diff --git a/img/simple-workflow.svg b/img/simple-workflow.svg deleted file mode 100644 index 3885fb0c3..000000000 --- a/img/simple-workflow.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - ExtractionSaveDevelopBuildTestTranslationEditor \ No newline at end of file diff --git a/img/splash-head.jpg b/img/splash-head.jpg old mode 100644 new mode 100755 diff --git a/img/tinder.svg b/img/tinder.svg old mode 100644 new mode 100755 diff --git a/img/undraw_docusaurus_mountain.svg b/img/undraw_docusaurus_mountain.svg old mode 100644 new mode 100755 diff --git a/img/undraw_docusaurus_react.svg b/img/undraw_docusaurus_react.svg old mode 100644 new mode 100755 diff --git a/img/undraw_docusaurus_tree.svg b/img/undraw_docusaurus_tree.svg old mode 100644 new mode 100755 diff --git a/img/vue-logo.svg b/img/vue-logo.svg old mode 100644 new mode 100755 diff --git a/img/workflow.excalidraw b/img/workflow.excalidraw old mode 100644 new mode 100755 diff --git a/img/workflow.svg b/img/workflow.svg old mode 100644 new mode 100755 diff --git a/img/yahoo.svg b/img/yahoo.svg old mode 100644 new mode 100755 diff --git a/index.html b/index.html old mode 100644 new mode 100755 index 55b42a969..6302798c2 --- a/index.html +++ b/index.html @@ -1,13 +1,20 @@ - + - -Format.JS | Format.JS - - + + + + + +Format.JS | Format.JS + + - -
Skip to main content

Internationalize your web apps on the client & server.

ExampleAnnie took no photos on April 19, 2025.

FORMATJS INTEGRATIONS

FORMATJS CORE LIBS

ECMA-402 + FORMATJS POLYFILLS

FormatJS is a set of JavaScript libraries.

FormatJS is a modular collection of JavaScript libraries for internationalization that are focused on formatting numbers, dates, and strings for displaying to people. It includes a set of core libraries that build on the JavaScript Intl built-ins and industry-wide i18n standards, plus a set of integrations for common template and component libraries.

ReactEmberVue

Integrates with other libraries.

For most web projects, internationalization happens in the template or view layer, so we've built integrations with React & Vue.

Built on standards.

FormatJS is aligned with: ECMAScript Internationalization API (ECMA-402), Unicode CLDR, and ICU Message syntax. By building on these industry standards, FormatJS leverages APIs in modern browsers and works with the message syntax used by professional translators.

Runs in the browser and Node.js.

FormatJS has been tested in all the major browsers (IE11, Chrome, FF & Safari) on both desktop and mobile devices. For many web apps rendering happens on the server, so we made sure FormatJS works perfectly in Node.js. This allows developers to use FormatJS on both the server and client-side of their apps.

Trusted by industry leaders.

+ +
+
Skip to main content

Internationalize your web apps on the client & server.

ExampleAnnie took no photos on August 14, 2021.

FORMATJS INTEGRATIONS

FORMATJS CORE LIBS

ECMA-402 + FORMATJS POLYFILLS

FormatJS is a set of JavaScript libraries.

FormatJS is a modular collection of JavaScript libraries for internationalization that are focused on formatting numbers, dates, and strings for displaying to people. It includes a set of core libraries that build on the JavaScript Intl built-ins and industry-wide i18n standards, plus a set of integrations for common template and component libraries.

ReactEmberVue

Integrates with other libraries.

For most web projects, internationalization happens in the template or view layer, so we've built integrations with React & Vue.

Built on standards.

FormatJS is aligned with: ECMAScript Internationalization API (ECMA-402), Unicode CLDR, and ICU Message syntax. By building on these industry standards, FormatJS leverages APIs in modern browsers and works with the message syntax used by professional translators.

Runs in the browser and Node.js.

FormatJS has been tested in all the major browsers (IE11, Chrome, FF & Safari) on both desktop and mobile devices. For many web apps rendering happens on the server, so we made sure FormatJS works perfectly in Node.js. This allows developers to use FormatJS on both the server and client-side of their apps.

Trusted by industry leaders.

+ + \ No newline at end of file diff --git a/lunr-index-1745030820210.json b/lunr-index-1745030820210.json deleted file mode 100644 index f1a9a7b75..000000000 --- a/lunr-index-1745030820210.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,699.662,1,659.566,2,886.004]],["content/0",[]],["keywords/0",[]],["title/1",[1,791.12,3,1166.646]],["content/1",[1,11.597,4,14.728,5,3.392,6,9.303,7,13.416,8,4.252,9,11.391,10,8.863,11,11.907,12,13.416,13,9.473,14,6.285,15,7.353,16,3.342,17,8.407,18,5.124,19,9.473,20,10.399,21,4.361,22,10.399,23,8.012,24,3.496,25,5.06,26,10.595,27,2.4,28,4.252,29,9.473,30,5.334,31,6.87,32,8.407,33,4.997,34,8.863,35,8.863,36,6.705,37,10.399,38,8.407]],["keywords/1",[]],["title/2",[6,529.109,21,248.045,39,786.306]],["content/2",[1,5.398,5,2.596,6,7.965,7,7.251,10,6.784,12,7.251,14,8.849,15,6.042,21,3.734,30,4.083,31,5.259,32,6.435,39,11.837,40,7.96,41,5.017,42,7.96,43,11.325,44,1.258,45,7.96,46,7.96,47,4.201,48,7.96,49,7.251,50,6.584,51,7.96,52,5.925,53,6.157,54,7.96,55,1.551,56,6.784,57,7.314,58,3.187,59,4.811,60,2.828,61,7.96,62,7.251,63,7.96,64,6.435,65,3.923,66,6.435,67,2.466,68,4.083,69,3.568,70,7.96,71,7.174,72,17.596,73,8.093,74,7.96,75,7.251,76,7.96,77,7.96,78,6.435,79,7.96,80,7.96,81,12.479,82,7.96,83,7.96,84,7.96,85,4.027]],["keywords/2",[]],["title/3",[24,392.195,58,307.208]],["content/3",[5,3.13,6,5.221,16,3.084,21,3.546,24,5.497,25,4.669,44,2.197,50,5.221,55,2.623,58,3.662,62,8.742,68,4.923,69,4.302,71,5.689,86,8.091,87,9.597,88,8.179,89,4.856,90,4.21,91,3.814,92,7.759,93,8.179,94,7.143,95,9.597,96,4.791,97,7.143,98,6.049,99,9.597,100,6.341,101,9.597,102,4.791,103,3.355,104,2.442,105,10.35,106,5.584,107,5.74,108,6.694,109,9.597,110,4.04,111,5.141,112,9.597,113,7.759,114,9.597,115,7.143]],["keywords/3",[]],["title/4",[24,326.978,58,256.123,116,627.16]],["content/4",[15,6.524,21,4.911,24,6.881,26,9.401,68,6.703,90,5.733,102,6.524,117,7.604,118,13.068,119,11.904,120,7.223,121,8.862,122,4.881,123,7.898,124,8.862,125,6.13,126,7.47,127,8.426,128,10.107,129,13.068,130,11.904,131,10.565,132,13.068]],["keywords/4",[]],["title/5",[50,634.643,133,691.523]],["content/5",[8,4.939,21,3.081,24,4.062,26,11.754,27,4.274,28,7.569,31,7.982,58,4.303,90,5.3,120,6.678,121,8.193,123,7.302,134,11.005,135,11.005,136,7.452,137,9.767,138,10.297,139,9.767,140,7.03,141,8.691,142,12.082,143,6.031,144,12.082,145,4.939,146,12.082,147,12.082,148,5.953,149,10.297,150,4.847]],["keywords/5",[]],["title/6",[86,678.803,151,902.312]],["content/6",[]],["keywords/6",[]],["title/7",[21,165.489,24,218.151,86,377.571,151,501.893,152,304.397,153,452.631]],["content/7",[24,5.868,55,2.932,98,6.807,133,6.402,154,9.838,155,8.731,156,9.838,157,6.875,158,8.353,159,12.891,160,9.838,161,10.8,162,6.807,163,9.838,164,6.012,165,4.64,166,11.699,167,7.135,168,4.593,169,5.875,170,5.969,171,8.731,172,9.838,173,7.324,174,6.284,175,7.324,176,7.135]],["keywords/7",[]],["title/8",[151,1127.121]],["content/8",[24,4.665,86,8.075,126,7.932,137,11.219,151,10.734,157,5.465,164,5.516,177,7.932,178,9.983,179,5.516,180,7.434,181,10.734,182,6.928,183,11.219,184,13.878,185,13.878,186,11.219,187,13.878,188,6.669,189,12.642,190,11.219,191,8.747,192,9.411]],["keywords/8",[]],["title/9",[24,196.365,86,339.865,127,376.639,151,451.772,193,584.12,194,396.1,195,532.086]],["content/9",[]],["keywords/9",[]],["title/10",[133,691.523,196,868.326]],["content/10",[21,2.754,24,3.631,55,2.853,58,2.844,69,6.78,86,6.284,123,6.527,133,6.402,145,4.415,154,9.838,155,8.731,156,9.838,159,12.891,160,13.779,162,6.807,163,9.838,164,6.938,165,4.64,166,8.353,173,7.324,178,7.769,196,8.039,197,8.353,198,7.135,199,8.731,200,15.126,201,8.731,202,9.205,203,6.807,204,7.533,205,8.353]],["keywords/10",[]],["title/11",[206,1127.121]],["content/11",[21,2.865,24,7.023,33,5.398,86,6.536,104,3.131,126,6.421,137,14.412,157,4.424,164,6.179,177,6.421,178,8.081,179,4.465,180,8.328,181,8.688,182,5.608,183,9.081,203,9.798,206,8.688,207,6.659,208,7.836,209,11.234,210,11.234,211,11.234,212,11.234,213,7.422,214,11.234,215,11.234,216,11.234,217,9.081,218,8.688]],["keywords/11",[]],["title/12",[91,463.686,219,770.758]],["content/12",[16,3.924,19,11.125,68,6.264,140,7.106,153,8.519,157,4.81,196,9.09,198,12.3,199,9.874,206,9.446,220,9.874,221,11.125,222,10.409,223,11.125,224,7.875,225,5.302,226,10.409,227,12.213,228,11.125,229,11.125,230,7.106,231,6.353,232,12.213,233,7.106,234,12.213,235,4.044,236,12.213,237,9.09,238,12.213,239,4.854,240,5.142,241,12.213]],["keywords/12",[]],["title/13",[104,204.877,231,606.857]],["content/13",[]],["keywords/13",[]],["title/14",[44,131.777,242,476.681,243,278.219,244,514.422]],["content/14",[55,2.904,58,4.399,104,2.934,107,7.771,179,4.962,182,8.34,244,10.304,245,6.688,246,12.486,247,10.085,248,9.657,249,5.489,250,5.477,251,11.374,252,9.293]],["keywords/14",[]],["title/15",[44,131.777,243,278.219,253,197.289,254,416.334]],["content/15",[55,2.764,58,4.399,104,2.193,107,6.896,182,6.233,247,10.085,248,9.657,249,6.186,250,5.477,251,11.374,252,9.293,253,2.954,254,6.233,255,3.105,256,2.632,257,6.589,258,10.641,259,10.641,260,10.641,261,9.293,262,3.683]],["keywords/15",[]],["title/16",[44,83.918,55,68.067,68,272.396,121,360.136,243,177.174,245,284.493,263,320.974,264,276.255]],["content/16",[265,13.574,266,11.093,267,15.295,268,8.861,269,14.504,270,13.574,271,12.078,272,13.574]],["keywords/16",[]],["title/17",[44,83.918,231,276.255,273,342.442,274,293.535,275,452.613,276,531.084,277,382.029,278,268.691]],["content/17",[27,1.934,44,1.987,55,2.512,58,3.312,96,4.182,103,2.929,104,3.318,107,7.8,122,3.129,148,4.128,157,4.954,179,3.33,182,6.279,189,7.631,218,6.479,231,4.358,233,4.874,244,5.167,245,4.487,247,6.738,249,2.753,253,2.976,255,2.083,256,1.766,257,4.421,262,2.471,263,5.063,274,8.347,279,8.377,280,16.788,281,9.362,282,6.235,283,3.884,284,4.128,285,4.557,286,6.235,287,5.063,288,7.139,289,7.139,290,5.843,291,7.631,292,8.377,293,6.479,294,4.487,295,6.235,296,4.238,297,7.631,298,8.377]],["keywords/17",[]],["title/18",[299,758.054]],["content/18",[]],["keywords/18",[]],["title/19",[299,758.054]],["content/19",[253,4.902,256,3.707,300,7.632,301,7.402,302,11.922]],["keywords/19",[]],["title/20",[86,678.803,197,902.312]],["content/20",[15,4.031,24,2.715,55,2.667,86,4.698,103,2.823,104,1.418,137,6.528,145,3.301,197,6.246,231,4.2,253,3.494,254,4.031,255,3.042,256,1.703,257,4.262,262,4.86,266,8.083,271,8.801,303,4.142,304,4.616,305,7.356,306,4.698,307,6.528,308,6.882,309,5.809,310,3.505,311,8.075,312,8.075,313,8.075,314,12.235,315,12.235,316,11.145,317,6.875,318,5.672,319,12.235,320,3.505,321,2.398,322,2.256,323,2.99,324,5.633,325,8.075,326,8.075,327,8.075,328,8.075,329,8.075,330,8.075,331,8.075,332,12.235,333,7.356,334,8.075,335,7.356,336,8.075,337,5.633,338,4.326,339,8.075,340,8.075,341,8.075]],["keywords/20",[]],["title/21",[240,307.288,342,525.045,343,403.423,344,729.901,345,390.996]],["content/21",[5,5.024,104,2.705,153,10.745,235,5.1,239,6.123,240,6.485,317,11.691,343,8.514,346,10.177,347,9.933,348,11.466,349,11.915,350,12.454]],["keywords/21",[]],["title/22",[343,805.472]],["content/22",[44,1.995,55,2.875,91,6.689,239,6.689,300,5.481,301,5.316,343,10.464,351,7.347,352,8.882,353,7.347,354,7.484,355,12.627,356,12.627,357,9.398,358,10.207,359,10.761,360,9.766,361,9.766,362,7.217]],["keywords/22",[]],["title/23",[317,655.527,346,770.758]],["content/23",[44,1.674,55,3.043,60,3.764,255,2.635,296,5.361,300,4.6,301,4.461,317,5.954,323,3.924,345,10.047,346,9.86,354,6.281,363,8.684,364,7.887,365,9.652,366,7,367,4.802,368,9.03,369,9.03,370,5.764,371,7.185,372,6.404]],["keywords/23",[]],["title/24",[317,546.521,347,627.16,373,828.933]],["content/24",[8,6.386,136,9.635,177,8.928,283,7.242,300,6.78,301,6.576,317,8.777,345,10.336,347,10.072,354,9.259,363,9.088,374,9.844,375,15.62]],["keywords/24",[]],["title/25",[317,655.527,350,943.138]],["content/25",[55,2.911,300,5.808,301,5.633,345,7.168,354,7.931,357,9.959,360,10.349,361,10.349,362,7.648,363,7.785,376,12.189,377,15.93,378,12.189,379,12.189,380,12.189,381,12.189,382,12.189,383,12.189]],["keywords/25",[]],["title/26",[239,386.58,348,723.934,349,752.269]],["content/26",[55,2.935,239,6.222,255,3.892,262,3.347,283,5.261,300,4.926,301,4.777,320,4.926,321,3.37,345,10.859,348,8.446,349,8.776,354,6.726,362,6.486,363,9.108,370,6.173,371,7.695,372,6.858,384,9.671,385,9.866,386,8.163,387,10.337]],["keywords/26",[]],["title/27",[104,204.877,111,624.953]],["content/27",[]],["keywords/27",[]],["title/28",[0,839.212,2,1062.721]],["content/28",[28,5.745,41,8.856,44,2.22,55,2.314,58,3.7,104,2.468,106,8.176,148,6.924,247,7.527,249,4.617,345,9.67,386,10.108,388,14.052,389,14.052,390,12.8,391,11.36,392,14.052,393,14.052,394,12.8,395,14.052]],["keywords/28",[]],["title/29",[152,547.25,396,655.527]],["content/29",[28,5.893,44,2.278,58,3.796,104,3.222,106,8.387,110,6.068,177,8.239,180,7.721,191,9.084,249,6.632,386,10.368,396,8.099,397,10.675,398,10.368,399,10.368,400,5.249]],["keywords/29",[]],["title/30",[27,269.29,396,655.527]],["content/30",[27,3.772,28,6.68,44,1.909,60,5.805,104,2.122,110,5.086,128,9.344,180,6.472,194,8.193,249,6.084,386,8.691,396,9.181,397,9.507,400,4.399,401,7.718,402,6.285,403,9.344,404,12.082,405,10.297,406,5.667,407,12.082,408,12.082,409,8.427,410,11.005,411,4.987,412,11.005]],["keywords/30",[]],["title/31",[401,486.314,411,481.583]],["content/31",[5,1.829,8,2.293,16,1.802,17,4.534,21,1.43,24,1.885,27,3.107,44,2.346,47,2.96,55,1.725,57,3.39,59,5.547,60,1.993,65,2.764,67,1.738,104,2.799,110,7.083,111,3.004,145,2.293,150,2.25,167,3.705,180,8.538,243,1.871,249,5.768,396,3.151,398,4.035,400,5.804,401,2.338,402,4.774,406,2.631,409,3.912,410,5.109,411,7.902,412,5.109,413,3.004,414,4.534,415,4.338,416,5.609,417,4.534,418,5.609,419,6.063,420,3.705,421,5.109,422,3.535,423,3.004,424,4.035,425,3.206,426,4.534,427,5.609,428,12.26,429,5.609,430,3.004,431,5.609,432,5.609,433,4.78,434,3.682,435,3.39,436,5.609,437,4.338,438,4.035,439,9.177,440,12.26,441,8.36,442,5.918,443,9.416,444,9.177,445,3.912,446,3.803,447,4.206,448,9.177,449,6.602,450,5.109,451,3.535,452,5.609,453,3.325]],["keywords/31",[]],["title/32",[318,540.891,401,486.314]],["content/32",[8,3.858,21,2.406,27,4.7,44,3.117,47,4.98,57,8.301,60,3.352,104,1.657,110,3.972,145,3.858,150,3.785,167,6.234,180,5.055,243,3.148,249,5.321,318,9.146,396,5.302,400,3.436,401,3.933,402,7.145,413,5.055,414,7.628,415,7.298,420,6.234,453,5.593,454,9.436,455,7.023,456,9.436,457,13.735,458,13.735,459,9.436,460,5.703,461,9.436,462,9.436,463,9.436,464,7.298,465,9.436,466,9.074]],["keywords/32",[]],["title/33",[401,486.314,467,615.704]],["content/33",[8,3.992,21,2.49,27,4.608,44,3.028,47,5.153,57,8.51,59,5.902,60,3.469,104,1.715,110,4.111,145,3.992,150,3.917,167,6.451,180,5.231,243,3.258,249,5.426,396,5.487,400,3.556,401,4.07,402,7.324,413,5.231,414,7.894,415,7.552,420,6.451,425,5.581,460,5.902,466,9.302,467,10.112,468,9.788,469,9.765,470,8.685,471,9.765,472,9.765,473,9.765,474,14.08]],["keywords/33",[]],["title/34",[5,317.213,424,699.662,475,828.933]],["content/34",[5,5.296,8,3.209,16,2.522,21,3.053,27,1.812,59,4.744,110,5.041,113,6.345,124,5.322,145,3.209,225,3.407,243,2.618,256,1.655,302,5.322,318,3.639,354,4.652,401,3.272,411,3.24,424,5.646,442,7.72,443,6.345,467,6.319,468,9.626,470,4.841,475,6.689,476,4.567,477,6.689,478,6.07,479,6.414,480,4.338,481,6.689,482,4.947,483,4.652,484,6.689,485,6.689,486,6.345,487,9.36,488,10.204,489,9.843,490,6.689,491,10.204,492,10.204,493,10.471,494,9.679,495,10.442,496,6.689,497,6.689,498,6.689,499,6.689,500,9.679,501,6.618,502,6.07,503,6.689,504,9.26,505,6.07,506,5.842,507,6.689,508,6.689]],["keywords/34",[]],["title/35",[27,269.29,509,813.748]],["content/35",[6,6.635,27,1.385,28,2.453,44,2.213,53,4.64,55,1.242,58,1.58,67,1.859,85,3.035,96,2.995,97,4.465,104,2.142,110,4.081,143,4.839,145,2.453,170,3.316,177,3.429,180,5.193,191,3.781,247,5.193,249,5.404,252,4.465,309,14.323,321,1.782,323,2.222,338,8.236,386,4.315,396,6.854,397,8.149,400,3.53,411,2.476,417,4.85,425,3.429,434,2.407,476,7.097,480,3.316,509,9.769,510,4.64,511,3.781,512,5.465,513,9.078,514,8.261,515,11.111,516,6.972,517,5.465,518,5.999,519,5.465,520,5.979,521,7.836,522,5.465,523,7.215,524,5.465,525,5.113,526,2.28,527,4.64,528,5.113,529,3.868,530,4.185,531,2.919,532,5.999,533,5.999,534,12.197,535,12.197,536,5.999,537,4.185,538,5.999,539,5.999,540,12.197,541,5.113,542,4.85]],["keywords/35",[]],["title/36",[27,269.29,543,560.595]],["content/36",[6,8.929,21,2.597,23,6.915,27,1.473,30,1.873,32,2.952,44,2.959,55,1.629,67,2.633,68,3.273,71,2.165,81,7.241,88,3.112,96,1.823,97,9.462,104,1.492,110,3.577,120,3.527,127,2.355,143,7.245,152,1.713,180,4.551,194,2.477,247,1.956,249,4.769,268,1.927,294,1.956,296,1.848,303,1.873,309,9.842,338,3.418,397,3.712,398,2.627,400,3.094,411,6.776,430,1.956,434,2.56,442,4.114,445,2.547,446,4.327,449,4.59,451,2.302,476,2.125,483,3.782,501,6.392,505,2.825,509,2.547,510,2.825,511,4.021,525,3.112,526,1.388,527,2.825,528,3.112,529,2.355,530,2.547,531,1.777,543,8.124,544,2.952,545,2.413,546,12.583,547,10.534,548,13.472,549,3.327,550,7.74,551,2.825,552,3.327,553,3.327,554,3.327,555,2.052,556,3.652,557,3.327,558,3.652,559,2.207,560,3.327,561,2.547,562,2.952,563,3.327,564,3.327,565,2.952,566,3.112,567,3.327,568,5.812,569,3.327,570,3.327,571,3.327,572,2.825,573,2.165,574,2.413,575,2.087,576,3.327,577,2.627,578,3.327,579,11.061,580,6.381,581,2.825,582,2.302,583,3.327,584,2.627]],["keywords/36",[]],["title/37",[27,269.29,585,868.326]],["content/37",[6,9.733,21,1.976,23,7.834,27,1.789,32,3.7,44,3.065,55,0.993,67,3.122,68,3.974,71,2.713,81,8.587,88,3.901,96,2.285,97,10.719,104,0.804,110,1.927,120,4.283,127,2.951,143,5.919,152,2.147,180,2.452,194,3.104,201,3.7,247,2.452,249,4.732,294,2.452,296,2.316,303,2.348,309,10.359,338,4.151,397,4.509,400,1.667,411,4.894,434,1.836,445,3.193,446,3.104,449,5.574,451,2.885,476,2.663,487,2.951,510,3.54,511,4.884,525,3.901,526,1.739,527,3.54,528,3.901,529,2.951,530,3.193,531,2.227,543,7.752,544,3.7,545,3.024,546,13.648,547,12.081,548,11.419,549,4.17,551,3.54,552,4.17,553,4.17,554,4.17,555,4.354,557,4.17,559,2.766,560,4.17,561,3.193,562,3.7,563,4.17,564,4.17,565,3.7,566,3.901,567,4.17,568,7.059,569,4.17,570,4.17,571,4.17,572,3.54,581,3.54,582,2.885,585,7.5,586,6.604,587,3.024,588,4.577,589,4.577,590,2.348,591,4.577,592,4.17,593,4.17,594,3.024,595,4.17,596,4.17,597,4.577]],["keywords/37",[]],["title/38",[25,473.225,27,224.511,598,537.592]],["content/38",[5,3.103,8,3.89,14,5.751,25,7.917,27,3.19,30,4.881,44,2.571,102,4.75,104,2.427,110,4.006,153,6.637,175,6.453,180,5.097,191,5.997,207,5.64,224,6.136,245,5.097,249,3.127,287,5.751,294,5.097,338,5.097,400,3.465,411,5.705,417,7.693,422,8.71,426,7.693,440,8.668,455,7.083,574,6.287,598,7.638,599,8.346,600,3.967,601,8.668,602,6.845,603,6.845,604,9.516,605,9.516,606,8.668,607,9.516,608,9.516,609,9.516,610,9.516,611,9.516,612,6.845,613,6.637,614,7.083,615,9.516,616,8.668,617,6.845]],["keywords/38",[]],["title/39",[55,124.66,618,828.933,619,659.566]],["content/39",[25,3.986,43,9.567,44,2.355,55,2.128,58,2.158,104,3.416,110,7.888,111,6.626,143,6.175,180,9.546,249,5.855,278,4.145,394,7.463,399,8.898,400,6.489,476,4.767,555,4.604,612,5.894,619,5.556,620,16.601,621,13.782,622,12.37,623,7.463,624,8.193,625,8.193,626,8.193,627,7.463,628,7.463,629,8.193,630,8.193,631,8.193,632,8.193,633,6.983,634,8.193,635,8.193,636,8.193,637,8.193,638,8.193,639,8.193]],["keywords/39",[]],["title/40",[104,204.877,157,459.447]],["content/40",[]],["keywords/40",[]],["title/41",[299,758.054]],["content/41",[300,7.879,301,7.641,354,10.759,640,11.44]],["keywords/41",[]],["title/42",[157,573.917]],["content/42",[18,3.438,25,3.394,44,0.64,55,2.767,91,2.773,96,2.021,103,3.214,104,1.615,107,1.671,116,2.61,145,2.852,148,1.995,157,2.748,162,2.551,164,3.654,174,2.355,179,2.773,182,3.483,231,2.106,239,1.609,249,1.33,253,2.175,254,2.021,255,1.735,256,1.938,257,3.682,261,5.193,262,3.636,278,2.048,284,1.995,285,2.202,294,3.737,300,1.757,301,2.937,303,2.076,304,3.988,309,2.912,310,6.621,320,1.757,322,1.131,323,2.584,343,2.237,345,2.168,352,2.136,363,2.355,372,2.446,399,5.019,437,5.396,447,1.855,479,4.925,531,1.969,641,5.396,642,2.202,643,3.272,644,3.45,645,3.272,646,3.45,647,3.687,648,3.45,649,4.048,650,2.237,651,5.193,652,3.272,653,3.45,654,3.687,655,3.131,656,3.687,657,4.866,658,2.314,659,3.131,660,4.048,661,3.131,662,3.45,663,4.048,664,6.977,665,6.355,666,6.977,667,1.945,668,6.977,669,7.835,670,4.048,671,6.977,672,4.048,673,4.048,674,4.048,675,4.048,676,4.048,677,4.048,678,6.355,679,4.048,680,5.946,681,5.946,682,4.048,683,4.048,684,3.131,685,4.048,686,4.048,687,5.946,688,4.048,689,3.687,690,4.048,691,4.048,692,4.048,693,1.945,694,3.45,695,9.316,696,3.687,697,9.316,698,3.45,699,3.45,700,5.946,701,3.45,702,3.687,703,6.355,704,5.946,705,5.946,706,3.45,707,3.45,708,3.687,709,3.013,710,3.272,711,3.45,712,3.45,713,3.45,714,3.131,715,4.048]],["keywords/42",[]],["title/43",[207,576.531,310,422.212,716,699.662]],["content/43",[16,4.515,50,7.644,91,5.585,104,2.468,116,9.061,239,5.585,283,6.515,310,7.836,343,7.767,345,7.527,385,8.856,434,5.637,453,8.329,711,11.976,716,10.108,717,12.8,718,14.052,719,8.329,720,11.36,721,7.644,722,10.868]],["keywords/43",[]],["title/44",[24,245.373,123,441.133,613,509.114,723,590.065,724,509.114]],["content/44",[8,2.453,16,1.928,21,1.53,23,3.264,27,3.549,52,4.465,55,2.631,58,2.553,65,2.956,67,1.859,103,3.389,110,2.526,123,3.626,125,4.547,133,5.746,152,8.727,157,2.363,164,2.384,172,5.465,180,9.27,201,4.85,202,5.113,203,3.781,207,3.556,208,4.185,249,1.971,286,4.465,300,2.604,301,2.526,304,5.541,310,4.208,321,1.782,322,1.676,323,2.222,351,3.491,352,3.166,372,3.626,397,3.491,399,4.315,400,3.53,434,2.407,479,3.214,600,2.501,640,3.781,650,3.316,651,4.465,693,2.883,724,6.761,725,5.465,726,5.193,727,5.465,728,4.64,729,5.999,730,3.429,731,5.465,732,5.465,733,5.465,734,5.465,735,5.465,736,5.465,737,8.83,738,5.999,739,5.979,740,5.465,741,5.465,742,5.999,743,5.999,744,5.113,745,5.465,746,5.465,747,5.465,748,5.465,749,8.83,750,4.85,751,5.465,752,5.465,753,5.465,754,8.83,755,5.465,756,5.465,757,5.465,758,8.261,759,5.465,760,5.465]],["keywords/44",[]],["title/45",[104,204.877,761,839.212]],["content/45",[]],["keywords/45",[]],["title/46",[104,204.877,240,491.158]],["content/46",[15,3.354,44,1.062,55,2.702,67,2.082,104,2.31,125,3.152,136,4.144,140,3.909,145,2.747,148,3.311,157,2.646,162,4.235,164,5.227,174,3.909,180,3.599,204,4.687,240,6.29,253,1.589,256,1.417,261,5.001,278,3.399,283,6.098,284,3.311,300,2.917,301,4.468,304,3.84,308,5.726,316,6.12,352,3.546,434,2.695,437,5.197,600,2.801,640,4.235,641,5.197,642,3.655,643,5.432,645,5.432,647,6.12,650,3.714,680,5.726,681,5.726,687,5.726,694,5.726,695,12.733,697,12.733,698,5.726,699,5.726,700,5.726,701,5.726,704,9.044,705,9.044,706,5.726,707,5.726,762,5.726,763,4.833,764,4.687,765,11.209,766,6.719,767,11.981,768,6.719,769,6.719,770,6.719,771,6.719,772,10.612,773,10.612,774,6.719,775,5.726,776,5.726,777,5.52,778,6.12,779,4.332]],["keywords/46",[]],["title/47",[24,245.373,123,441.133,613,509.114,723,590.065,724,509.114]],["content/47",[8,3.643,16,2.863,27,3.995,55,2.806,65,4.391,67,2.761,98,5.616,103,4.604,125,4.18,164,3.541,180,4.773,203,5.616,240,5.544,283,4.131,300,3.868,301,3.751,304,7.528,310,3.868,321,2.646,322,2.489,323,3.3,400,4.796,415,6.891,551,6.891,640,5.616,650,4.925,725,8.117,726,7.055,727,8.117,728,6.891,730,5.093,731,8.117,732,8.117,733,8.117,734,8.117,735,8.117,737,11.997,739,8.124,740,8.117,741,8.117,744,7.594,765,11.224,780,8.91,781,8.91,782,8.91,783,6.891]],["keywords/47",[]],["title/48",[761,1048.3]],["content/48",[21,3.12,24,2.715,53,6.246,55,2.78,58,2.126,67,2.502,86,4.698,103,2.823,104,1.418,108,5.633,117,4.698,164,3.209,206,9.463,253,3.898,255,4.097,256,1.703,262,4.357,305,7.356,306,4.698,321,2.398,322,4.126,323,5.47,324,5.633,337,5.633,415,6.246,513,6.01,520,4.981,545,5.335,651,6.01,709,6.01,761,5.809,763,5.809,765,6.882,784,8.075,785,8.075,786,5.089,787,6.882,788,5.476,789,12.235,790,12.235,791,8.075,792,8.075,793,8.075,794,8.075,795,8.075,796,4.981,797,8.075,798,12.235,799,5.089,800,8.075,801,8.075,802,8.075]],["keywords/48",[]],["title/49",[803,839.212,804,511.778]],["content/49",[]],["keywords/49",[]],["title/50",[104,170.808,240,409.485,273,627.16]],["content/50",[5,2.929,15,4.484,28,3.672,44,2.745,58,3.488,104,2.326,140,5.226,150,3.603,186,7.261,188,4.316,240,7.314,273,8.542,283,8.988,306,5.226,370,4.886,447,4.117,467,4.74,520,5.54,526,3.413,565,7.261,574,5.934,640,5.661,641,6.947,777,4.672,803,6.461,805,6.685,806,7.261,807,7.261,808,8.182,809,9.92,810,8.982,811,7.655,812,5.934,813,8.982,814,8.982,815,8.982,816,8.182,817,5.934,818,7.655,819,5.134,820,6.461,821,4.886,822,8.982,823,7.261,824,8.182,825,13.248,826,8.982,827,7.655,828,8.982,829,8.982]],["keywords/50",[]],["title/51",[96,323.956,253,153.513,256,136.816,830,392.193,831,591.117,832,591.117]],["content/51",[67,4.247,104,2.407,116,8.839,174,7.976,179,5.448,235,4.539,277,9.861,285,7.457,303,7.031,602,9.861,820,12.779,821,9.664,830,10.737,831,12.487,832,12.487,833,12.487,834,9.296,835,12.487,836,10.602,837,11.683,838,11.683]],["keywords/51",[]],["title/52",[839,1457.314]],["content/52",[55,2.972,364,11.011,820,13.417,821,10.147,830,11.273,836,11.442,837,12.609,840,10.319]],["keywords/52",[]],["title/53",[384,1241.986]],["content/53",[55,2.911,239,5.018,255,3.14,284,6.222,321,3.75,364,9.398,612,9.083,709,9.398,783,9.766,820,12.107,821,9.156,830,10.172,837,10.761,840,13.205,841,12.627,842,11.502,843,12.627,844,12.627]],["keywords/53",[]],["title/54",[242,666.833,243,389.203]],["content/54",[27,4.342,122,7.025,168,6.376,207,8.887,242,8.569,243,5.002,264,7.799,425,8.569,693,7.204,806,12.12,845,11.159,846,8.569,847,9.248,848,14.993,849,8.887]],["keywords/54",[]],["title/55",[67,361.481,434,468.014]],["content/55",[44,2.693,67,5.282,102,8.51,434,6.838,438,12.262,850,15.527,851,17.046,852,17.046]],["keywords/55",[]],["title/56",[91,463.686,224,752.25]],["content/56",[]],["keywords/56",[]],["title/57",[295,868.326,299,606.857]],["content/57",[55,2.635,91,6.897,239,6.897,296,6.69,300,5.74,301,5.567,354,7.838,357,9.842,358,10.689,434,5.304,438,9.512,453,7.838,850,12.045,853,11.554,854,9.223,855,13.223,856,13.223,857,13.223,858,13.223]],["keywords/57",[]],["title/58",[50,634.643,531,567.611]],["content/58",[24,4.724,85,7.109,124,9.529,174,8.176,217,11.36,253,3.324,256,2.963,287,8.493,367,6.369,531,6.837,650,7.767,859,8.032,860,11.36,861,15.384,862,11.639,863,14.052,864,8.176,865,8.856,866,14.052,867,14.052]],["keywords/58",[]],["title/59",[868,1457.314]],["content/59",[27,3.709,58,4.231,68,8.241,150,6.446,168,6.833,249,5.28,294,8.607,318,7.45,603,11.558,862,10.361,869,11.558,870,16.068]],["keywords/59",[]],["title/60",[871,1457.314]],["content/60",[8,5.893,27,3.327,55,1.847,67,4.466,179,5.729,231,7.498,244,8.891,411,5.95,426,11.652,516,8.239,531,7.013,726,9.828,861,15.636,872,10.054,873,12.284,874,12.284,875,18.347]],["keywords/60",[]],["title/61",[876,1457.314]],["content/61",[21,4.484,68,9.017,249,5.777,854,12.263,877,17.581,878,10.421]],["keywords/61",[]],["title/62",[879,1457.314]],["content/62",[5,5.794,21,4.53,28,5.604,31,9.056,44,2.166,243,5.926,256,2.89,304,7.835,351,7.976,574,9.056,575,7.835,869,9.861,878,8.125,880,8.456,881,4.437,882,9.562,883,12.487,884,10.602,885,13.708,886,13.708,887,6.587]],["keywords/62",[]],["title/63",[654,1327.496]],["content/63",[24,5.788,104,3.382,177,7.47,179,5.194,191,8.236,310,7.474,398,9.401,451,8.236,482,8.236,531,6.358,590,6.703,655,13.317,869,9.401,872,12.01,883,11.904,888,9.727,889,11.137,890,7.47,891,13.068,892,10.107,893,13.068,894,13.068]],["keywords/63",[]],["title/64",[140,678.803,526,443.324]],["content/64",[]],["keywords/64",[]],["title/65",[887,700.266]],["content/65",[5,5.666,44,3.168,90,3.94,91,3.57,102,4.484,116,5.791,136,5.54,177,5.134,181,6.947,235,5.211,243,2.996,253,2.125,256,2.793,273,5.791,282,6.685,419,5.934,480,7.322,526,5.034,559,8.007,750,10.71,764,9.24,881,5.998,884,6.947,887,6.366,895,9.24,896,12.067,897,11.29,898,12.067,899,7.655,900,8.182,901,8.182,902,12.067,903,6.091,904,8.982,905,7.261,906,6.461,907,8.182,908,7.655,909,4.484,910,6.947]],["keywords/65",[]],["title/66",[911,1048.3]],["content/66",[]],["keywords/66",[]],["title/67",[110,491.158,912,719.629]],["content/67",[5,3.983,44,2.942,110,7.838,205,9.446,240,5.142,243,4.075,253,2.889,256,3.47,301,5.142,303,6.264,321,3.627,464,9.446,764,11.481,847,10.153,878,7.239,881,3.954,909,6.097,911,11.84,912,11.484,913,11.125,914,11.125,915,10.409,916,9.446,917,9.874]],["keywords/67",[]],["title/68",[253,275.989,880,719.629]],["content/68",[5,4.641,44,2.249,64,11.504,140,8.28,167,9.402,253,4.305,256,3.837,284,7.012,285,7.741,351,8.28,406,6.675,434,5.709,453,8.435,476,8.28,862,9.176,880,8.778,918,9.402,919,12.128,920,12.963]],["keywords/68",[]],["title/69",[253,230.095,880,599.964,921,828.933]],["content/69",[44,2.468,64,12.627,89,7.902,145,7.888,168,6.642,243,5.211,256,3.293,881,6.246,916,12.081,919,13.312,921,13.312,922,15.62]],["keywords/69",[]],["title/70",[91,463.686,116,752.25]],["content/70",[]],["keywords/70",[]],["title/71",[44,131.777,91,331.462,239,331.462,343,460.943]],["content/71",[18,3.814,24,2.602,44,1.223,55,2.784,67,2.398,89,3.916,91,4.708,103,2.706,107,7.173,136,4.775,140,4.504,145,3.164,152,3.631,173,5.249,174,4.504,179,3.076,182,5.914,239,5.72,248,9.162,249,3.893,253,1.831,254,5.914,255,1.925,256,2.498,257,4.085,258,6.597,259,6.597,260,6.597,261,5.761,262,2.283,300,3.36,301,3.259,310,6.247,343,6.548,354,4.588,357,5.761,358,6.257,359,6.597,360,5.987,361,5.987,362,4.424,526,2.941,530,5.399,531,3.766,577,5.568,590,3.97,720,6.257,762,6.597,865,4.878,923,7.74,924,5.399,925,8.817,926,7.051,927,6.597,928,7.051,929,7.051,930,7.051,931,4.211]],["keywords/71",[]],["title/72",[44,153.69,345,521.031,363,565.927]],["content/72",[8,4.735,44,2.509,55,1.484,67,3.589,89,5.86,107,6.554,136,7.144,152,5.433,248,8.958,249,3.806,253,2.74,254,5.782,255,2.88,256,2.442,257,6.112,258,9.871,259,9.871,260,9.871,261,8.62,262,3.416,283,5.37,300,5.028,301,4.876,317,8.921,345,8.505,346,7.652,350,9.363,351,6.739,354,6.865,363,6.739,385,7.3,476,6.739,576,10.55,762,9.871,932,9.363]],["keywords/72",[]],["title/73",[317,655.527,346,770.758]],["content/73",[18,4.067,24,2.775,44,1.304,55,2.997,60,2.932,103,2.885,107,6.179,145,3.374,173,5.597,179,3.28,182,6.21,248,6.384,249,2.712,254,4.12,255,2.052,256,1.74,296,4.176,310,3.583,317,6.989,323,3.056,345,8.926,346,9.889,352,4.356,363,4.802,364,6.143,367,3.741,368,7.034,369,7.034,370,4.49,371,5.597,372,4.988,577,5.937,590,4.233,854,8.676,925,6.143,928,7.518,929,7.518,930,7.518,931,4.49,933,10.056,934,7.034,935,6.672]],["keywords/73",[]],["title/74",[110,409.485,821,529.109,830,587.843]],["content/74",[]],["keywords/74",[]],["title/75",[38,1178.119]],["content/75",[1,8.967,18,6.516,21,3.372,27,3.052,36,8.526,44,2.742,55,2.224,58,4.569,104,2.322,110,5.567,173,11.767,240,5.567,256,2.788,283,8.045,409,9.223,529,8.526,777,6.878,821,7.193,830,7.991,909,6.601,936,12.045,937,9.223]],["keywords/75",[]],["title/76",[804,639.286]],["content/76",[55,2.452,103,5.385,143,7.69,255,3.83,283,7.142,543,7.402,777,8.013,820,11.081,821,8.38,830,9.31,938,15.405,939,11.466,940,15.465]],["keywords/76",[]],["title/77",[67,451.543]],["content/77",[55,2.648,57,8.087,143,6.68,165,5.749,318,6.204,400,4.872,442,8.628,501,7.396,543,6.43,559,8.087,941,5.87,942,13.381,943,13.381,944,13.381,945,13.381,946,11.404,947,13.381,948,12.189,949,17.745,950,9.074,951,13.381]],["keywords/77",[]],["title/78",[5,317.213,424,699.662,475,828.933]],["content/78",[5,4.86,8,3.35,16,2.633,21,3.155,27,1.891,59,4.952,110,3.449,113,6.624,124,5.556,145,3.35,225,3.557,243,2.733,256,1.727,302,5.556,318,3.799,354,4.857,442,7.976,443,6.624,467,6.528,468,9.84,470,5.054,477,6.983,478,6.337,479,6.626,480,4.529,481,6.983,482,5.164,483,4.857,484,6.983,485,6.983,486,6.624,487,9.609,488,10.542,489,10.105,490,6.983,491,10.542,492,10.542,493,10.704,494,10,495,10.719,496,6.983,497,6.983,498,6.983,499,6.983,500,10,501,6.837,502,6.337,503,6.983,504,9.567,505,6.337,506,6.098,507,6.983,508,6.983,830,4.952]],["keywords/78",[]],["title/79",[952,1241.986]],["content/79",[283,8.695,304,10.72,953,14.924,954,18.755,955,10.596,956,14.924,957,10.596,958,14.924,959,10.596,960,14.924,961,10.596,962,15.984,963,10.596,964,17.084,965,10.596,966,9.652,967,17.084,968,10.596,969,10.596,970,10.596,971,10.596,972,10.596,973,10.596,974,10.596,975,10.596,976,10.596]],["keywords/79",[]],["title/80",[102,416.334,198,550.971,199,674.195,761,599.905]],["content/80",[]],["keywords/80",[]],["title/81",[977,752.269,978,678.432,979,659.566]],["content/81",[0,7.769,23,5.875,24,6.358,31,7.135,44,1.707,52,8.039,58,4.597,86,6.284,100,7.135,133,6.402,162,6.807,169,5.875,178,7.769,204,7.533,231,5.618,235,3.576,287,6.527,338,5.786,430,5.786,824,9.838,977,8.353,978,10.551,980,9.838,981,10.8,982,10.8,983,9.838,984,10.8,985,15.126,986,10.8,987,9.838,988,6.662,989,10.8,990,10.8,991,10.8,992,10.8,993,9.838,994,9.205,995,8.039,996,8.039]],["keywords/81",[]],["title/82",[162,735.287,231,606.857]],["content/82",[16,2.672,24,4.205,44,1.314,55,2.299,58,4.404,69,3.727,86,7.278,116,8.065,126,4.753,158,6.431,162,7.883,164,3.305,166,6.431,169,4.523,170,4.596,175,5.638,177,4.753,178,5.981,180,4.454,204,5.8,208,5.8,231,7.821,268,4.388,338,6.7,460,5.025,476,4.838,510,6.431,590,4.265,811,7.086,812,5.493,935,6.722,978,5.8,980,7.574,988,5.129,995,9.31,997,5.981,998,8.315,999,12.508,1000,8.315,1001,8.315,1002,8.315,1003,8.315,1004,8.315,1005,8.315,1006,8.315,1007,7.086,1008,8.315,1009,8.315,1010,8.315,1011,7.574,1012,7.574,1013,8.315,1014,7.086,1015,5.981,1016,6.189,1017,7.574,1018,7.086,1019,5.8,1020,8.315,1021,7.574,1022,8.315]],["keywords/82",[]],["title/83",[231,606.857,994,994.267]],["content/83",[16,2.453,24,3.941,55,2.827,58,2.01,69,6.396,86,4.442,91,3.034,98,4.812,102,3.811,125,5.499,133,4.526,141,5.492,149,6.507,155,6.172,158,11.036,159,12.161,162,4.812,164,4.659,175,5.177,178,5.492,197,5.905,231,3.971,233,4.442,235,2.528,240,3.214,273,4.923,277,5.492,283,3.54,338,4.09,430,4.09,434,3.063,450,6.955,476,4.442,544,6.172,573,4.526,650,4.22,651,5.683,719,4.526,811,6.507,818,9.99,935,6.172,993,10.678,994,9.99,1011,12.998,1012,12.998,1018,6.507,1023,7.635,1024,6.955,1025,7.635,1026,5.325,1027,7.635,1028,7.635,1029,6.507,1030,6.955,1031,7.635,1032,7.635,1033,6.955,1034,7.635]],["keywords/83",[]],["title/84",[150,334.557,250,365.841,256,175.83,1035,674.195]],["content/84",[21,1.871,27,1.693,33,5.461,44,1.159,55,2.687,86,6.613,94,5.459,102,3.662,104,1.288,122,5.197,150,4.559,169,3.99,198,4.846,225,3.184,231,3.815,250,3.218,253,2.689,255,3.897,256,3.782,262,4.622,322,3.175,323,4.209,423,3.929,482,4.623,656,6.681,809,4.623,835,6.681,978,5.116,1035,9.188,1036,5.459,1037,6.681,1038,10.687,1039,7.068,1040,7.335,1041,5.459,1042,11.366,1043,11.366,1044,7.509,1045,11.366,1046,6.251,1047,11.366,1048,11.366,1049,11.366,1050,5.93,1051,8.791,1052,5.93,1053,7.335,1054,7.335]],["keywords/84",[]],["title/85",[91,463.686,367,528.742]],["content/85",[]],["keywords/85",[]],["title/86",[243,324.483,256,205.068,526,369.605]],["content/86",[36,9.798,44,2.401,85,7.688,141,10.931,243,6.328,253,3.595,256,4.36,284,7.488,285,8.266,526,7.208,918,10.039,1055,15.196]],["keywords/86",[]],["title/87",[1056,1241.986]],["content/87",[36,7.101,44,2.423,55,1.411,90,4.831,140,8.921,195,10.032,225,4.78,256,2.322,290,7.681,304,6.295,342,7.922,351,6.408,367,7.995,467,5.812,641,8.517,881,6.175,884,8.517,887,8.476,935,8.903,1056,15.033,1057,11.013,1058,9.267,1059,10.032,1060,10.032,1061,8.517,1062,11.013,1063,5.899,1064,11.013,1065,6.941,1066,7.276,1067,11.013,1068,11.013]],["keywords/87",[]],["title/88",[447,534.726,1069,839.212]],["content/88",[23,6.236,30,5.88,44,2.847,55,2.02,90,5.029,122,6.729,125,5.377,169,6.236,252,8.532,253,4.591,256,3.324,351,6.67,367,8.166,447,5.254,523,8.532,653,9.77,658,6.552,845,8.532,869,8.246,882,7.996,909,5.723,1069,8.246,1070,8.866,1071,9.77,1072,7.996,1073,5.8,1074,6.928,1075,11.464,1076,6.928]],["keywords/88",[]],["title/89",[44,102.538,67,201.066,122,242.359,253,153.513,256,136.816,367,294.102]],["content/89",[0,7.819,15,3.458,30,8.467,44,1.094,55,2.65,57,4.186,67,3.368,98,4.366,103,4.69,122,4.059,145,2.832,253,4.333,255,4.716,256,2.292,262,4.481,318,6.219,320,3.007,321,2.057,322,3.036,367,6.886,447,4.982,667,3.328,763,4.983,1039,2.887,1056,5.903,1069,4.983,1070,5.357,1071,5.903,1072,4.831,1077,8.09,1078,5.6,1079,15.194,1080,7.009,1081,8.09,1082,6.927,1083,8.407,1084,10.869,1085,8.787,1086,8.787,1087,6.927,1088,6.927,1089,10.869,1090,6.927,1091,6.927,1092,6.927,1093,6.927,1094,6.927,1095,6.927,1096,5.357]],["keywords/89",[]],["title/90",[447,534.726,788,791.12]],["content/90",[41,9.269,44,2.324,50,4.361,55,2.662,90,3.517,103,2.803,122,6.94,148,3.951,157,3.157,188,3.852,262,3.589,306,7.08,320,3.48,321,2.381,337,8.487,352,6.422,362,6.955,367,6.665,402,8.54,423,4.295,483,4.752,658,4.583,659,6.201,661,6.201,662,6.833,788,5.437,1076,7.354,1097,6.481,1098,6.833,1099,11.084,1100,11.084,1101,6.422,1102,7.303,1103,4.112,1104,8.017,1105,6.33,1106,8.017,1107,8.017,1108,10.37,1109,6.833,1110,8.017,1111,7.303,1112,8.017,1113,6.833,1114,8.017,1115,4.845,1116,4.845,1117,7.303]],["keywords/90",[]],["title/91",[322,325.905,1118,813.748]],["content/91",[44,1.951,55,2.755,73,6.825,103,4.317,322,4.632,323,4.573,337,8.613,367,7.515,402,6.423,447,5.66,882,8.613,1076,7.463,1099,11.248,1101,6.517,1105,6.423,1113,10.524,1116,11.314,1117,11.248,1119,9.55,1120,12.348,1121,12.348,1122,10.524,1123,12.348,1124,12.348]],["keywords/91",[]],["title/92",[1125,1048.3]],["content/92",[27,2.85,44,2.62,90,5.417,102,6.164,122,6.992,125,5.792,245,6.615,253,2.921,255,3.07,256,2.603,262,3.642,284,6.085,303,6.333,322,3.449,367,5.596,423,6.615,476,7.185,658,7.058,865,7.782,1014,10.524,1115,7.463,1118,8.613,1125,8.882,1126,12.348,1127,11.248,1128,12.348,1129,12.348,1130,11.248,1131,9.191,1132,12.348]],["keywords/92",[]],["title/93",[322,325.905,1118,813.748]],["content/93",[21,3.942,44,1.129,55,2.913,60,2.539,69,3.204,71,4.237,103,4.785,104,2.714,122,4.16,126,4.085,150,2.867,158,5.528,253,3.656,255,3.403,256,3.259,306,8.993,320,4.836,322,3.824,323,4.125,366,4.722,423,5.967,480,3.951,526,2.716,864,8.993,931,3.888,1069,5.142,1105,3.718,1115,4.32,1118,4.986,1125,8.013,1130,10.147,1133,6.511,1134,7.148,1135,6.511,1136,6.092,1137,7.148,1138,7.148,1139,7.148,1140,9.005,1141,7.148,1142,11.14,1143,11.14,1144,7.148,1145,7.148]],["keywords/93",[]],["title/94",[804,639.286]],["content/94",[11,9.461,55,2.509,90,5.134,103,4.091,164,4.651,168,4.977,194,7.936,245,6.269,255,3.976,256,2.467,262,3.452,303,6.003,367,8.871,693,5.624,1118,8.163,1125,13.102,1146,15.99,1147,18.213,1148,11.703,1149,8.71,1150,11.703,1151,11.703,1152,15.99,1153,11.703,1154,11.703]],["keywords/94",[]],["title/95",[347,939.672]],["content/95",[44,2.14,90,5.941,125,6.352,347,8.732,367,9.752,555,7.609,650,7.485,667,6.507,788,11.952,818,11.541,917,10.948,1070,10.474,1073,6.852,1125,9.742,1155,13.542,1156,17.625,1157,9.742,1158,13.542,1159,13.542]],["keywords/95",[]],["title/96",[367,528.742,1160,1062.721]],["content/96",[21,1.49,25,2.843,44,0.923,55,2.614,67,1.81,69,2.619,90,2.563,93,4.979,96,2.917,103,4.188,122,4.474,125,2.741,139,4.723,186,4.723,188,2.808,207,3.463,235,1.934,253,4.361,255,4.584,256,2,262,4.473,306,3.4,320,2.536,321,1.735,322,2.651,323,2.164,338,5.083,347,8.892,367,5.429,403,4.519,434,2.344,435,5.734,447,6.321,529,3.767,573,3.463,667,2.808,716,6.825,717,5.322,804,4.162,845,4.349,865,3.682,1039,2.436,1069,4.203,1073,2.956,1118,6.618,1125,6.825,1149,4.349,1160,8.643,1161,5.843,1162,5.843,1163,5.843,1164,5.843,1165,9.488,1166,11.98,1167,3.463,1168,5.843,1169,5.843,1170,5.843,1171,13.791,1172,9.488,1173,8.643,1174,5.843,1175,7.671,1176,9.488,1177,9.488,1178,5.843,1179,5.322,1180,5.843,1181,5.843]],["keywords/96",[]],["title/97",[367,528.742,788,791.12]],["content/97",[44,2.468,131,12.627,303,8.011,347,12.441,367,7.079,433,13.312,434,6.266,573,9.259,788,10.592,910,12.081,1019,10.895,1125,11.236,1182,13.312]],["keywords/97",[]],["title/98",[1183,1327.496]],["content/98",[]],["keywords/98",[]],["title/99",[256,307.252]],["content/99",[6,7.549,16,5.754,21,3.539,44,3.133,122,5.183,230,8.075,252,10.329,253,4.236,256,4.18,367,6.29,1019,9.68,1071,11.827,1149,10.329,1183,16.312,1184,11.219,1185,13.878]],["keywords/99",[]],["title/100",[102,485.566,253,230.095,367,440.819]],["content/100",[8,3.677,16,1.758,21,1.395,27,1.263,28,2.237,44,1.421,55,2.759,60,1.944,89,2.768,102,2.732,103,1.913,130,4.984,177,3.128,207,3.243,221,4.984,245,2.931,253,4.112,255,4.323,256,2.414,262,3.911,306,3.184,318,2.537,320,4.97,322,4.093,323,4.24,324,3.817,367,7.879,447,7.629,693,5.502,1016,4.073,1050,4.423,1072,3.817,1080,5.799,1081,4.073,1083,4.232,1085,4.423,1086,7.27,1118,3.817,1149,8.522,1186,5.472,1187,3.128,1188,4.232,1189,5.472,1190,5.472,1191,8.993,1192,5.472,1193,8.993,1194,5.472,1195,8.993,1196,8.993,1197,5.472,1198,5.472,1199,5.472,1200,4.984,1201,4.423,1202,4.232,1203,5.472,1204,5.472,1205,3.615,1206,4.423,1207,5.472,1208,4.984,1209,5.472,1210,5.472,1211,5.472,1212,5.472,1213,5.472,1214,5.472,1215,5.472,1216,5.472,1217,5.472,1218,5.472,1219,5.472,1220,5.472,1221,5.472]],["keywords/100",[]],["title/101",[123,587.843,881,314.857,1063,521.031]],["content/101",[0,7.344,16,4.671,34,8.701,35,8.701,44,2.675,85,5.165,91,4.058,102,5.097,116,6.583,120,5.643,123,6.17,143,5.097,207,6.052,220,8.254,224,6.583,230,5.94,243,3.406,256,2.153,278,5.165,303,5.237,353,5.94,367,6.588,482,6.435,520,6.298,716,7.344,812,6.745,836,7.896,881,6.559,910,7.896,977,7.896,1063,7.787,1115,6.17,1222,10.21,1223,13.242,1224,8.701,1225,7.599,1226,9.3,1227,6.435,1228,10.21,1229,10.21,1230,10.21]],["keywords/101",[]],["title/102",[906,1048.3]],["content/102",[]],["keywords/102",[]],["title/103",[299,758.054]],["content/103",[300,7.879,301,7.641,1231,6.838,1232,16.534]],["keywords/103",[]],["title/104",[526,553.777]],["content/104",[881,5.972,1233,11.896,1234,13.272]],["keywords/104",[]],["title/105",[1073,737.297]],["content/105",[256,3.827,1201,14.673,1232,16.534,1235,15.469]],["keywords/105",[]],["title/106",[804,639.286]],["content/106",[]],["keywords/106",[]],["title/107",[225,422.212,881,314.857,1063,521.031]],["content/107",[21,4.67,28,7.487,44,1.869,67,3.664,69,5.301,85,5.983,89,5.983,219,7.813,235,3.916,262,3.488,321,3.513,352,6.242,353,6.881,599,6.066,642,6.434,693,7.739,881,5.928,906,11.585,1063,6.335,1065,7.454,1066,7.813,1073,5.983,1236,10.921,1237,8.02,1238,8.802,1239,11.827,1240,7.626,1241,11.827]],["keywords/107",[]],["title/108",[152,683.596]],["content/108",[21,4.157,28,6.665,55,2.089,69,7.307,255,4.925,1231,7.461,1242,14.85,1243,14.85,1244,11.726]],["keywords/108",[]],["title/109",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/109",[5,3.857,21,3.016,28,4.835,55,2.783,58,3.114,103,4.135,255,2.941,322,3.304,323,4.379,370,6.434,587,7.813,796,7.295,799,10.15,881,5.213,1058,9.733,1231,4.455,1242,10.773,1243,10.773,1246,7.626,1247,11.827,1248,8.249,1249,11.585,1250,8.507,1251,7.626,1252,7.01,1253,9.147,1254,11.827]],["keywords/109",[]],["title/110",[466,770.758,1255,1062.721]],["content/110",[]],["keywords/110",[]],["title/111",[1073,737.297]],["content/111",[1256,19.078]],["keywords/111",[]],["title/112",[299,758.054]],["content/112",[300,7.879,301,7.641,1231,6.838,1257,16.534]],["keywords/112",[]],["title/113",[526,553.777]],["content/113",[145,6.969,526,6.477,849,10.104,881,5.518,909,8.51,1233,10.991,1234,12.262,1258,17.046]],["keywords/113",[]],["title/114",[804,639.286]],["content/114",[]],["keywords/114",[]],["title/115",[225,422.212,881,314.857,1063,521.031]],["content/115",[21,4.906,28,7.865,44,1.775,67,3.481,69,5.035,85,5.683,89,5.683,219,7.422,235,3.719,262,3.313,321,3.336,352,5.929,353,6.536,466,10.271,526,4.269,599,5.762,642,6.111,693,7.47,881,6.228,1063,6.018,1065,7.08,1066,7.422,1073,5.683,1236,10.542,1237,7.618,1238,8.361,1240,7.243,1259,11.234,1260,7.618,1261,11.234]],["keywords/115",[]],["title/116",[152,683.596]],["content/116",[21,3.724,28,7.563,55,2.371,69,6.545,255,5.049,352,7.706,1231,7.649,1244,10.504,1262,11.804,1263,13.301,1264,11.804,1265,14.954]],["keywords/116",[]],["title/117",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/117",[5,3.36,21,2.628,28,5.982,55,2.857,58,2.713,103,5.115,255,2.562,322,2.878,323,3.816,370,5.605,587,6.807,796,6.356,799,9.222,881,4.737,1058,10.283,1231,3.881,1246,6.644,1248,7.187,1249,10.525,1250,7.412,1251,9.435,1252,6.107,1253,7.969,1262,8.33,1263,9.386,1264,8.33,1265,8.33,1266,10.304,1267,10.304,1268,7.969,1269,10.304,1270,7.969,1271,10.304]],["keywords/117",[]],["title/118",[342,599.905,1272,759.678,1273,599.905,1274,759.678]],["content/118",[16,3.968,33,5.933,169,9.02,175,8.373,255,4.976,273,7.962,551,9.55,559,7.463,912,7.617,1231,7.539,1262,13.405,1264,13.405,1265,13.405,1272,17.053,1273,13.467,1274,15.104,1275,16.581]],["keywords/118",[]],["title/119",[321,346.496,1273,839.212]],["content/119",[21,2.557,28,4.099,55,1.839,60,3.562,120,5.542,148,7.072,149,8.545,150,4.022,168,4.264,188,4.818,235,3.32,255,3.568,284,4.941,285,5.455,318,4.649,321,4.262,370,5.455,413,5.371,430,5.371,466,6.624,467,5.292,482,6.32,861,8.545,881,3.246,887,4.818,925,7.463,1058,6.06,1187,5.731,1231,5.406,1245,6.185,1262,8.106,1264,8.106,1265,8.106,1273,13.161,1276,9.134,1277,10.027,1278,16.76,1279,9.134,1280,10.027,1281,10.027,1282,7.463,1283,7.463,1284,10.027,1285,10.027]],["keywords/119",[]],["title/120",[367,660.477]],["content/120",[102,9.061,1225,13.509,1286,13.509,1287,13.057]],["keywords/120",[]],["title/121",[256,245.969,821,634.643]],["content/121",[]],["keywords/121",[]],["title/122",[38,1178.119]],["content/122",[]],["keywords/122",[]],["title/123",[220,1178.119]],["content/123",[9,8.776,15,5.665,16,3.646,21,2.894,27,2.619,34,9.671,35,9.671,36,7.317,44,2.474,58,4.122,104,1.993,145,4.639,188,7.522,194,7.695,225,4.926,243,3.786,398,8.163,413,6.079,529,10.094,594,7.497,723,9.173,783,8.776,807,9.173,887,5.453,909,8.947,911,8.163,1074,6.858,1133,10.337,1235,9.671,1288,11.347,1289,11.347,1290,7.317,1291,10.337,1292,11.347,1293,11.347]],["keywords/123",[]],["title/124",[125,683.596]],["content/124",[16,3.841,18,5.89,21,3.048,27,4.25,55,2.079,58,4.849,103,5.671,104,3.234,167,7.897,173,8.105,176,7.897,240,5.032,245,6.403,250,5.243,273,7.707,283,5.542,338,6.403,409,8.337,420,7.897,667,5.744,739,7.373,777,8.438,1294,11.953,1295,8.896,1296,10.187,1297,10.187,1298,11.953]],["keywords/124",[]],["title/125",[67,301.371,117,565.927,804,426.676]],["content/125",[21,2.427,27,3.19,55,2.289,58,2.506,67,2.948,69,4.265,104,1.671,117,5.537,143,4.75,165,5.937,168,4.047,284,4.689,285,5.176,291,8.668,400,5.032,411,3.928,442,8.911,451,5.997,501,7.638,543,7.819,667,6.641,909,4.75,941,6.062,948,12.589,949,14.823,1290,8.911,1299,7.693,1300,9.516,1301,13.82,1302,12.589,1303,16.273,1304,16.273,1305,16.273,1306,9.516,1307,13.82]],["keywords/125",[]],["title/126",[104,204.877,111,624.953]],["content/126",[6,9.295,24,4.343,44,2.7,47,6.817,104,3.363,110,5.438,111,10.257,117,7.516,125,8.015,143,6.449,296,6.535,515,11.767,543,6.207,590,6.626,909,8.53,937,9.01,1268,9.991,1308,12.918,1309,9.991,1310,12.918,1311,12.918]],["keywords/126",[]],["title/127",[1073,737.297]],["content/127",[5,5.549,8,4.212,21,2.628,27,4.275,28,4.212,44,2.312,47,5.438,104,3.253,110,4.338,111,7.838,148,5.077,168,4.382,245,5.519,338,7.838,396,8.222,405,8.781,411,4.253,419,6.807,466,6.807,509,7.187,543,4.951,585,7.669,619,6.987,936,9.386,937,7.187,1103,5.285,1268,7.969,1290,6.644,1297,8.781,1312,10.304,1313,9.386,1314,9.386,1315,10.304,1316,10.304,1317,10.304,1318,9.386,1319,10.304,1320,9.386,1321,5.995]],["keywords/127",[]],["title/128",[804,639.286]],["content/128",[]],["keywords/128",[]],["title/129",[256,205.068,353,565.927,1322,828.933]],["content/129",[27,4.204,44,2.878,110,4.927,135,10.661,140,6.809,245,6.269,250,5.134,256,3.84,282,8.71,318,5.426,411,4.831,419,7.732,467,6.176,763,8.418,847,7.219,881,5.896,887,5.624,895,8.163,909,5.842,912,7.219,1205,7.732,1231,6.861,1283,8.71,1322,9.974,1323,11.703,1324,11.703,1325,11.703,1326,10.661]],["keywords/129",[]],["title/130",[256,175.83,821,453.67,887,400.737,1058,504.029]],["content/130",[1065,11.44,1327,18.151,1328,18.151,1329,18.151]],["keywords/130",[]],["title/131",[256,175.83,821,453.67,911,599.905,1058,504.029]],["content/131",[55,2.002,103,5.461,110,6.576,230,9.088,255,3.884,256,3.293,445,10.895,821,8.497,847,9.635,912,9.635,1290,12.441,1330,15.62,1331,15.62]],["keywords/131",[]],["title/132",[243,389.203,1332,1166.646]],["content/132",[]],["keywords/132",[]],["title/133",[420,770.758,1290,752.25]],["content/133",[6,3.722,16,3.459,18,3.371,21,4.649,27,3.483,28,2.797,44,1.701,47,3.611,55,2.103,56,5.831,58,4.801,60,5.361,68,3.509,69,3.067,96,3.416,100,4.52,103,2.392,104,2.337,107,4.444,136,4.22,143,3.416,152,3.209,169,3.722,247,3.665,250,4.722,268,3.611,273,4.412,283,4.991,321,2.032,323,2.534,406,3.209,420,7.112,434,2.745,453,4.056,478,8.326,479,3.665,545,4.52,548,5.092,581,5.292,599,7.74,600,2.852,667,3.288,693,3.288,726,8.084,739,4.22,777,5.6,997,4.922,1017,6.233,1103,3.509,1187,3.911,1290,4.412,1295,5.092,1333,6.233,1334,5.831,1335,6.842,1336,6.842,1337,6.233,1338,6.233,1339,5.831,1340,6.842,1341,5.092,1342,5.531,1343,6.842,1344,4.135,1345,5.831,1346,6.842,1347,5.092,1348,6.233]],["keywords/133",[]],["title/134",[21,297.519,1339,994.267]],["content/134",[21,4.679,28,5.893,44,2.899,138,15.636,148,7.103,150,5.782,175,9.774,194,9.774,245,7.721,249,4.736,400,5.249,420,9.523,1290,9.294,1339,12.284,1349,14.414,1350,13.13,1351,14.414]],["keywords/134",[]],["title/135",[245,624.953,1350,1062.721]],["content/135",[21,4.198,60,4.339,65,6.018,67,3.784,69,5.474,120,6.751,165,5.247,169,6.644,174,7.106,245,6.543,249,5.408,250,5.358,323,4.523,400,4.447,520,7.534,537,8.519,667,5.869,836,12.73,941,5.358,1007,14.028,1116,7.382,1290,7.875,1352,12.213,1353,8.282,1354,12.213,1355,9.446,1356,12.213,1357,14.993,1358,11.125]],["keywords/135",[]],["title/136",[245,624.953,1359,1166.646]],["content/136",[5,4.129,23,2.761,24,1.706,25,4.111,27,1.951,44,1.335,55,2.244,58,1.336,65,2.501,69,2.275,89,2.568,104,2.223,107,3.488,110,3.558,145,2.075,148,2.501,150,2.036,165,6.522,168,3.594,245,4.527,247,2.719,249,3.568,262,1.497,294,5.816,322,1.418,323,3.129,390,4.623,396,2.852,400,5.528,422,5.326,434,2.036,479,2.719,482,3.199,494,4.103,516,2.901,530,3.54,531,2.469,541,4.325,542,4.103,590,2.603,598,2.805,599,8.648,601,4.623,606,4.623,619,5.73,621,3.925,628,4.623,667,7.295,693,2.439,721,2.761,817,3.353,827,4.325,869,3.651,878,3.008,912,5.213,941,6.66,997,3.651,1097,4.103,1101,2.678,1116,5.107,1135,4.623,1206,4.103,1282,3.777,1345,4.325,1348,4.623,1360,4.325,1361,5.075,1362,3.925,1363,8.45,1364,4.623,1365,5.075,1366,5.075,1367,3.925,1368,5.583,1369,4.325,1370,4.623,1371,5.075,1372,3.925,1373,5.075,1374,8.397,1375,4.325,1376,4.103,1377,5.075,1378,4.325,1379,5.075,1380,5.075,1381,5.075,1382,5.075,1383,5.075,1384,5.075,1385,5.075,1386,5.075,1387,8.45,1388,5.075,1389,5.075,1390,5.075,1391,4.623,1392,5.075,1393,5.075,1394,4.623,1395,5.075]],["keywords/136",[]],["title/137",[245,624.953,1396,1166.646]],["content/137",[104,3.137,240,7.52,283,8.281,323,6.614,1397,12.848]],["keywords/137",[]],["title/138",[424,839.212,1398,1166.646]],["content/138",[5,4.582,8,3.98,16,1.938,21,2.483,27,2.247,33,2.898,55,0.773,59,3.645,60,2.143,67,3.017,69,4.364,75,5.494,110,4.099,111,3.231,113,4.876,124,4.09,128,4.665,145,2.466,165,4.183,225,2.618,243,2.012,256,1.272,302,4.09,318,5.676,354,3.575,400,3.545,411,5.053,424,10.107,426,7.871,435,3.645,442,6.278,443,4.876,467,5.138,468,8.328,470,3.72,477,5.14,478,4.665,479,5.215,480,3.334,481,5.14,482,3.801,483,3.575,484,5.14,485,5.14,486,4.876,487,7.893,488,8.297,489,8.301,490,5.14,491,8.297,492,8.297,493,9.059,494,7.871,495,8.806,496,5.14,497,5.14,498,5.14,499,5.14,500,7.871,501,5.381,502,4.665,503,5.14,504,7.53,505,4.665,506,4.489,507,5.14,508,5.14,521,4.876,667,5.882,830,3.645,912,3.72,941,4.271,1101,5.138,1290,3.889,1399,6.032,1400,7.53,1401,6.032,1402,6.032,1403,6.032,1404,6.032,1405,6.032,1406,6.032]],["keywords/138",[]],["title/139",[803,839.212,804,511.778]],["content/139",[]],["keywords/139",[]],["title/140",[150,468.014,283,540.891]],["content/140",[5,3.423,55,2.203,104,1.843,106,8.626,115,7.813,116,6.768,150,4.211,174,6.107,186,8.486,255,3.686,256,2.213,273,6.768,283,7.969,321,3.118,520,6.475,650,8.194,667,7.124,777,7.712,779,6.768,809,6.616,816,9.562,820,10.665,821,9.35,830,8.96,840,7.322,950,7.118,1290,9.56,1407,10.497,1408,11.985,1409,10.497,1410,10.497,1411,7.118,1412,9.562,1413,9.562]],["keywords/140",[]],["title/141",[726,780.658]],["content/141",[16,2.54,18,3.895,21,3.07,55,2.463,66,6.39,67,2.449,69,3.543,103,2.763,104,1.388,106,4.599,127,5.097,150,4.829,191,4.982,250,3.467,255,2.993,256,3.074,262,4.3,283,3.665,411,4.969,420,5.222,482,4.982,527,6.113,561,8.396,600,3.295,650,4.369,667,7.832,726,7.81,817,5.222,821,4.3,860,6.39,865,4.982,950,5.36,952,6.736,1035,6.39,1036,5.883,1116,4.777,1290,5.097,1295,14.301,1342,14.939,1364,7.2,1408,6.39,1414,7.904,1415,7.904,1416,7.904,1417,7.904,1418,7.904,1419,7.904,1420,7.904,1421,7.904,1422,7.904,1423,7.904,1424,7.904,1425,7.904]],["keywords/141",[]],["title/142",[952,1241.986]],["content/142",[27,3.695,127,10.322,304,11.482,667,3.669,726,7.644,739,9.874,962,17.119,964,18.298,966,6.955,967,18.298,1426,7.635,1427,7.635,1428,7.635,1429,11.723,1430,7.635,1431,7.635,1432,7.635,1433,7.635,1434,7.635,1435,7.635,1436,7.635,1437,11.723,1438,7.635,1439,7.635,1440,7.635,1441,7.635,1442,7.635,1443,7.635,1444,7.635,1445,7.635,1446,7.635,1447,7.635,1448,14.269,1449,7.635,1450,7.635,1451,11.723,1452,7.635,1453,7.635,1454,7.635,1455,7.635,1456,7.635]],["keywords/142",[]],["title/143",[1457,1457.314]],["content/143",[]],["keywords/143",[]],["title/144",[299,758.054]],["content/144",[300,7.879,301,7.641,1231,6.838,1458,18.151]],["keywords/144",[]],["title/145",[526,553.777]],["content/145",[881,5.972,1459,13.272,1460,16.806]],["keywords/145",[]],["title/146",[804,639.286]],["content/146",[]],["keywords/146",[]],["title/147",[152,683.596]],["content/147",[255,4.588,1231,6.95,1461,16.806]],["keywords/147",[]],["title/148",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/148",[5,4.027,21,3.149,28,5.048,55,2.814,58,3.252,103,4.317,255,3.07,322,3.449,323,4.573,370,6.717,587,8.158,796,7.617,799,7.782,881,5.368,1058,10.021,1231,4.652,1246,7.962,1248,8.613,1249,11.928,1250,8.882,1251,7.962,1252,7.319,1461,11.248,1462,12.348]],["keywords/148",[]],["title/149",[1233,939.672]],["content/149",[]],["keywords/149",[]],["title/150",[299,758.054]],["content/150",[300,7.879,301,7.641,1231,6.838,1463,18.151]],["keywords/150",[]],["title/151",[804,639.286]],["content/151",[]],["keywords/151",[]],["title/152",[225,422.212,881,314.857,1063,521.031]],["content/152",[44,2.278,67,4.466,235,4.772,262,4.251,353,8.387,599,7.393,642,7.841,693,6.926,881,6.533,1063,7.721,1065,9.084,1066,9.523,1233,11.83,1236,9.774,1237,9.774,1240,9.294,1464,14.414]],["keywords/152",[]],["title/153",[152,683.596]],["content/153",[255,4.588,1231,6.95,1465,16.806]],["keywords/153",[]],["title/154",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/154",[5,5.489,55,2.773,115,9.398,255,3.14,322,3.527,572,9.766,796,7.788,799,10.608,881,6.128,1231,4.757,1233,8.142,1246,10.852,1251,10.852,1252,9.976,1465,15.331,1466,12.627,1467,10.207,1468,9.398]],["keywords/154",[]],["title/155",[367,660.477]],["content/155",[102,9.21,1286,13.732,1287,13.272]],["keywords/155",[]],["title/156",[1469,1241.986]],["content/156",[]],["keywords/156",[]],["title/157",[299,758.054]],["content/157",[21,4.629,300,7.879,301,7.641,1231,6.838]],["keywords/157",[]],["title/158",[526,553.777]],["content/158",[881,6.072,1233,12.096]],["keywords/158",[]],["title/159",[804,639.286]],["content/159",[]],["keywords/159",[]],["title/160",[225,422.212,881,314.857,1063,521.031]],["content/160",[44,2.278,67,4.466,235,4.772,262,4.251,353,8.387,599,7.393,642,7.841,693,6.926,881,6.533,1063,7.721,1065,9.084,1066,9.523,1236,9.774,1237,9.774,1240,9.294,1469,15.636,1470,14.414]],["keywords/160",[]],["title/161",[152,683.596]],["content/161",[255,4.588,1231,6.95,1471,16.806]],["keywords/161",[]],["title/162",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/162",[5,5.489,55,2.773,115,9.398,255,3.14,322,3.527,572,9.766,796,7.788,799,10.608,881,6.128,1231,4.757,1246,10.852,1251,10.852,1252,9.976,1467,10.207,1468,9.398,1469,10.761,1471,15.331,1472,12.627]],["keywords/162",[]],["title/163",[367,660.477]],["content/163",[102,9.21,1286,13.732,1287,13.272]],["keywords/163",[]],["title/164",[1473,1457.314]],["content/164",[]],["keywords/164",[]],["title/165",[299,758.054]],["content/165",[300,7.879,301,7.641,1231,6.838,1474,16.534]],["keywords/165",[]],["title/166",[526,553.777]],["content/166",[881,5.972,1233,11.896,1234,13.272]],["keywords/166",[]],["title/167",[804,639.286]],["content/167",[]],["keywords/167",[]],["title/168",[152,683.596]],["content/168",[55,2.391,69,10.12,108,14.249,255,3.679,309,10.642,1231,5.573,1474,13.477,1475,14.795,1476,13.477,1477,14.795]],["keywords/168",[]],["title/169",[1459,1048.3]],["content/169",[]],["keywords/169",[]],["title/170",[299,758.054]],["content/170",[300,7.879,301,7.641,1231,6.838,1478,18.151]],["keywords/170",[]],["title/171",[526,553.777]],["content/171",[881,5.972,1233,11.896,1234,13.272]],["keywords/171",[]],["title/172",[804,639.286]],["content/172",[]],["keywords/172",[]],["title/173",[225,422.212,881,314.857,1063,521.031]],["content/173",[21,4.67,28,7.487,44,1.869,67,3.664,69,5.301,85,5.983,89,5.983,219,7.813,235,3.916,262,3.488,321,3.513,352,6.242,353,6.881,599,6.066,642,6.434,693,7.739,881,5.928,1063,6.335,1065,7.454,1066,7.813,1073,5.983,1236,10.921,1237,8.02,1238,8.802,1240,7.626,1459,11.585,1479,11.827,1480,11.827]],["keywords/173",[]],["title/174",[152,683.596]],["content/174",[21,4.157,28,6.665,55,2.089,69,7.307,255,4.925,1231,7.461,1244,11.726,1481,14.85,1482,14.85]],["keywords/174",[]],["title/175",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/175",[5,3.857,21,3.016,28,4.835,55,2.783,58,3.114,103,4.135,255,2.941,322,3.304,323,4.379,370,6.434,587,7.813,796,7.295,799,10.15,881,5.213,1058,9.733,1231,4.455,1246,7.626,1248,8.249,1249,11.585,1250,8.507,1251,7.626,1252,7.01,1253,9.147,1270,9.147,1481,10.773,1482,10.773,1483,11.827]],["keywords/175",[]],["title/176",[367,660.477]],["content/176",[102,9.061,1225,13.509,1286,13.509,1287,13.057]],["keywords/176",[]],["title/177",[419,770.758,1255,1062.721]],["content/177",[]],["keywords/177",[]],["title/178",[299,758.054]],["content/178",[300,7.879,301,7.641,1231,6.838,1484,13.509]],["keywords/178",[]],["title/179",[526,553.777]],["content/179",[145,6.969,526,6.477,849,10.104,881,5.518,909,8.51,1233,10.991,1234,12.262,1485,15.527]],["keywords/179",[]],["title/180",[1073,737.297]],["content/180",[1,11.922,243,5.865,1201,14.213,1282,13.085,1486,14.213,1487,17.581]],["keywords/180",[]],["title/181",[804,639.286]],["content/181",[]],["keywords/181",[]],["title/182",[225,422.212,881,314.857,1063,521.031]],["content/182",[21,4.87,28,7.807,44,1.53,67,2.999,69,6.272,85,4.898,89,4.898,90,4.246,219,6.395,235,4.633,262,4.127,321,2.875,352,5.109,353,8.141,419,10.856,526,3.678,599,4.965,642,5.266,693,6.724,881,6.443,1063,5.186,1065,8.819,1066,9.244,1073,4.898,1236,9.488,1237,6.564,1238,7.205,1240,9.022,1260,9.488,1488,9.68,1489,9.68,1490,6.963,1491,9.68]],["keywords/182",[]],["title/183",[152,683.596]],["content/183",[21,4.157,28,6.665,55,2.089,69,7.307,255,4.925,1231,7.461,1244,11.726,1492,14.85,1493,14.85]],["keywords/183",[]],["title/184",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/184",[5,3.857,21,3.016,28,4.835,55,2.783,58,3.114,103,4.135,255,2.941,322,3.304,323,4.379,370,6.434,587,7.813,796,7.295,799,10.15,881,5.213,1058,9.733,1231,4.455,1246,7.626,1248,8.249,1249,11.585,1250,8.507,1251,7.626,1252,7.01,1253,9.147,1270,9.147,1492,10.773,1493,10.773,1494,11.827]],["keywords/184",[]],["title/185",[5,380.483,73,644.817]],["content/185",[]],["keywords/185",[]],["title/186",[73,644.817,152,547.25]],["content/186",[47,3.796,55,3.059,59,4.348,73,6.188,85,3.639,120,3.976,247,3.853,401,2.999,417,5.815,468,4.264,470,4.437,487,4.638,489,4.878,493,4.638,495,5.175,865,4.534,1282,5.354,1391,6.553,1413,6.553,1495,5.564,1496,7.194,1497,7.194,1498,7.194,1499,7.194,1500,6.131,1501,7.194,1502,11.195,1503,7.194,1504,7.194,1505,7.194,1506,7.194,1507,7.194,1508,7.194,1509,7.194,1510,7.194,1511,6.131,1512,7.194,1513,6.553,1514,7.194,1515,7.194,1516,7.194,1517,9.05,1518,7.194,1519,7.194,1520,7.194,1521,7.194,1522,7.194,1523,6.553,1524,7.194,1525,7.194,1526,7.194,1527,7.194]],["keywords/186",[]],["title/187",[73,644.817,1528,1062.721]],["content/187",[21,3.539,27,3.203,65,6.839,73,10.958,102,6.928,152,6.51,168,5.902,226,11.827,468,8.226,479,7.434,486,14.476,510,10.734,527,13.85,962,15.261,1495,10.734,1513,12.642,1528,12.642,1529,13.878]],["keywords/187",[]],["title/188",[1490,1048.3]],["content/188",[]],["keywords/188",[]],["title/189",[299,758.054]],["content/189",[300,7.879,301,7.641,1231,6.838,1326,16.534]],["keywords/189",[]],["title/190",[526,553.777]],["content/190",[881,5.972,1233,11.896,1234,13.272]],["keywords/190",[]],["title/191",[804,639.286]],["content/191",[]],["keywords/191",[]],["title/192",[225,422.212,881,314.857,1063,521.031]],["content/192",[21,4.67,28,7.487,44,1.869,67,3.664,69,5.301,85,5.983,89,5.983,219,7.813,235,3.916,262,3.488,321,3.513,352,6.242,353,6.881,599,6.066,642,6.434,693,7.739,881,5.928,1063,6.335,1065,7.454,1066,7.813,1073,5.983,1236,10.921,1237,8.02,1238,8.802,1240,7.626,1490,11.585,1530,11.827,1531,11.827]],["keywords/192",[]],["title/193",[152,683.596]],["content/193",[21,4.157,28,6.665,55,2.089,69,7.307,255,4.925,1231,7.461,1244,11.726,1532,13.179,1533,13.179]],["keywords/193",[]],["title/194",[253,275.989,880,719.629]],["content/194",[5,3.817,44,1.849,50,6.366,55,1.5,59,7.073,253,2.769,255,4.529,304,6.689,451,7.376,467,6.176,602,8.418,779,7.546,880,7.219,881,5.896,1030,10.661,1035,9.461,1074,7.073,1103,8.201,1231,6.023,1244,8.418,1245,7.219,1252,9.478,1490,8.418,1532,9.461,1533,9.461,1534,10.661,1535,11.703,1536,11.703,1537,11.703,1538,11.703,1539,11.703]],["keywords/194",[]],["title/195",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/195",[5,3.857,21,3.016,28,4.835,55,2.783,58,3.114,103,4.135,255,2.941,322,3.304,323,4.379,370,6.434,587,7.813,796,7.295,799,10.15,881,5.213,1058,9.733,1231,4.455,1246,7.626,1248,8.249,1249,11.585,1250,8.507,1251,7.626,1252,7.01,1253,9.147,1270,9.147,1532,9.561,1533,9.561,1540,11.827]],["keywords/195",[]],["title/196",[1541,1327.496]],["content/196",[]],["keywords/196",[]],["title/197",[299,758.054]],["content/197",[300,7.879,301,7.641,1231,6.838,1542,18.151]],["keywords/197",[]],["title/198",[526,553.777]],["content/198",[881,5.972,1460,16.806,1543,18.45]],["keywords/198",[]],["title/199",[804,639.286]],["content/199",[]],["keywords/199",[]],["title/200",[152,683.596]],["content/200",[255,4.588,1231,6.95,1544,16.806]],["keywords/200",[]],["title/201",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/201",[5,5.489,55,2.773,115,9.398,255,3.14,322,3.527,572,9.766,796,7.788,799,10.608,881,6.128,1231,4.757,1246,10.852,1251,10.852,1252,9.976,1467,10.207,1468,9.398,1541,11.502,1544,15.331,1545,12.627]],["keywords/201",[]],["title/202",[367,660.477]],["content/202",[102,9.21,1286,13.732,1287,13.272]],["keywords/202",[]],["title/203",[1546,1327.496]],["content/203",[]],["keywords/203",[]],["title/204",[299,758.054]],["content/204",[300,7.879,301,7.641,1231,6.838,1547,16.534]],["keywords/204",[]],["title/205",[1073,737.297]],["content/205",[256,3.827,1201,14.673,1235,15.469,1547,16.534]],["keywords/205",[]],["title/206",[804,639.286]],["content/206",[]],["keywords/206",[]],["title/207",[225,422.212,881,314.857,1063,521.031]],["content/207",[44,2.338,67,4.584,262,4.364,599,7.588,642,8.048,693,7.109,881,6.613,1063,7.925,1065,9.324,1066,9.774,1236,10.032,1237,10.032,1240,9.539,1546,16.991,1548,14.795]],["keywords/207",[]],["title/208",[152,683.596]],["content/208",[255,4.588,1231,6.95,1549,16.806]],["keywords/208",[]],["title/209",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/209",[55,2.749,58,3.896,255,3.679,322,4.133,796,9.126,799,9.324,881,4.789,1231,5.573,1246,12.027,1248,10.319,1251,9.539,1252,8.769,1549,13.477,1550,14.795]],["keywords/209",[]],["title/210",[903,988.226]],["content/210",[]],["keywords/210",[]],["title/211",[299,758.054]],["content/211",[300,7.879,301,7.641,1231,6.838,1551,15.469]],["keywords/211",[]],["title/212",[526,553.777]],["content/212",[5,4.641,44,2.249,55,1.824,90,7.983,145,5.818,526,5.408,562,11.504,847,8.778,849,8.435,881,4.607,895,9.926,909,7.104,917,11.504,1231,5.361,1233,9.176,1234,10.237,1484,10.592,1485,12.963,1552,14.231,1553,14.231]],["keywords/212",[]],["title/213",[804,639.286]],["content/213",[]],["keywords/213",[]],["title/214",[225,422.212,881,314.857,1063,521.031]],["content/214",[21,4.67,28,7.487,44,1.869,67,3.664,69,5.301,85,5.983,89,5.983,219,7.813,235,3.916,262,3.488,321,3.513,352,6.242,353,6.881,599,6.066,642,6.434,693,7.739,881,5.928,903,10.921,1063,6.335,1065,7.454,1066,7.813,1073,5.983,1236,10.921,1237,8.02,1238,8.802,1240,7.626,1554,11.827,1555,11.827]],["keywords/214",[]],["title/215",[152,683.596]],["content/215",[21,4.157,28,6.665,55,2.089,69,7.307,255,4.925,1231,7.461,1244,11.726,1556,13.893,1557,13.893]],["keywords/215",[]],["title/216",[55,93.548,255,181.489,786,460.025,849,432.645,1245,450.229]],["content/216",[5,3.777,21,2.954,28,4.735,55,2.819,58,3.05,103,4.049,255,3.948,322,3.235,323,4.289,370,6.301,587,7.652,796,7.144,799,10.006,881,5.139,1058,9.595,1231,5.981,1246,7.468,1248,8.079,1249,11.42,1250,8.331,1251,7.468,1252,6.865,1270,8.958,1556,9.871,1557,9.871,1558,11.582]],["keywords/216",[]],["title/217",[367,660.477]],["content/217",[102,9.061,1225,13.509,1286,13.509,1287,13.057]],["keywords/217",[]],["title/218",[91,386.58,94,723.934,256,205.068]],["content/218",[]],["keywords/218",[]],["title/219",[299,758.054]],["content/219",[300,7.879,301,7.641,302,12.308,1231,6.838]],["keywords/219",[]],["title/220",[250,511.778,256,245.969]],["content/220",[21,4.107,31,7.813,68,6.066,85,5.983,94,8.802,104,2.828,169,6.434,176,7.813,235,3.916,240,4.979,243,3.945,250,8.625,256,4.145,287,7.148,401,4.93,455,8.802,483,7.01,513,8.802,602,8.507,779,7.626,809,7.454,1038,7.454,1116,7.148,1231,4.455,1559,9.147,1560,10.773,1561,10.773,1562,10.773,1563,9.561]],["keywords/220",[]],["title/221",[1564,988.226]],["content/221",[21,2.894,27,2.619,55,2.847,60,4.031,67,3.516,103,5.473,104,1.993,108,10.919,148,5.592,169,6.173,242,6.486,245,6.079,250,4.978,255,2.822,256,2.392,278,5.741,600,4.73,693,5.453,809,9.866,1038,7.152,1231,4.275,1564,10.616,1565,11.651,1566,8.163,1567,7.317,1568,8.446,1569,9.173,1570,9.671]],["keywords/221",[]],["title/222",[1565,1084.667]],["content/222",[21,3.983,44,2.468,256,3.293,420,10.319,693,9.272,779,10.072,809,12.161,1116,9.44,1205,10.319,1342,12.627,1568,11.626,1571,12.081]],["keywords/222",[]],["title/223",[1038,918.482]],["content/223",[14,4.573,21,1.135,27,1.746,55,2.833,58,5.333,73,2.46,104,0.781,139,3.597,150,1.785,177,2.544,190,3.597,191,2.805,235,1.473,242,2.544,243,1.485,249,5.458,250,1.952,256,1.595,264,3.935,303,2.282,318,5.397,401,1.855,411,6.576,555,2.5,590,2.282,617,3.201,834,3.018,864,2.589,865,2.805,950,3.018,1038,2.805,1039,1.855,1044,4.998,1273,3.201,1295,13.519,1341,3.312,1572,7.345,1573,3.793,1574,6.448,1575,7.885,1576,3.201,1577,3.793,1578,4.054,1579,3.018,1580,3.793,1581,6.116,1582,4.054,1583,6.448,1584,4.054,1585,10.604,1586,4.054,1587,4.054,1588,6.116,1589,4.054,1590,3.018,1591,4.054,1592,4.054,1593,4.054,1594,6.892,1595,4.054,1596,3.793,1597,3.201,1598,4.054,1599,4.054,1600,3.635,1601,4.667,1602,6.892,1603,4.054,1604,4.054,1605,5.277,1606,4.054,1607,4.054,1608,4.054,1609,4.054,1610,4.054,1611,8.99,1612,3.201,1613,7.978,1614,8.99,1615,4.054,1616,3.201,1617,3.442,1618,3.793,1619,3.018,1620,3.793,1621,4.054]],["keywords/223",[]],["title/224",[21,248.045,27,224.511,104,170.808]],["content/224",[15,7.104,16,4.573,21,3.629,26,10.237,43,11.006,100,9.402,104,2.499,120,7.865,174,8.28,179,7.233,224,9.176,321,4.227,447,6.523,864,8.28,890,8.134,1074,8.601,1355,11.006,1579,9.65,1600,6.838,1622,9.65]],["keywords/224",[]],["title/225",[864,678.803,1579,791.12]],["content/225",[21,4.883,24,4.343,27,2.982,33,6.207,71,7.657,78,10.443,96,6.449,104,3.001,126,7.384,179,5.134,231,6.719,235,4.277,304,7.384,321,3.837,422,8.141,590,6.626,603,12.292,864,9.942,878,7.657,1400,9.991,1623,11.009,1624,10.443,1625,11.009,1626,9.991]],["keywords/225",[]],["title/226",[1627,1241.986]],["content/226",[8,6.298,16,4.95,18,7.591,33,7.402,44,2.434,104,2.705,321,4.575,531,9.307,600,6.422,892,11.915,1628,12.454,1629,13.129,1630,11.915,1631,11.466]],["keywords/226",[]],["title/227",[617,1048.3]],["content/227",[16,4.151,25,6.285,27,3.944,68,6.626,117,7.516,124,8.76,168,5.493,218,9.991,233,7.516,266,8.534,322,3.609,406,6.059,413,6.92,423,6.92,434,5.182,545,8.534,575,7.384,598,7.14,599,8.764,613,9.01,684,9.991,937,9.01,1372,9.991,1632,11.009,1633,11.009,1634,10.443,1635,11.009]],["keywords/227",[]],["title/228",[1573,1241.986]],["content/228",[16,3.924,21,4.198,23,6.644,44,1.93,58,4.334,60,4.339,225,5.302,249,4.013,321,3.627,323,4.523,362,6.981,406,5.729,423,6.543,434,4.9,575,6.981,862,7.875,872,8.519,890,6.981,1019,8.519,1103,6.264,1341,9.09,1347,9.09,1573,10.409,1636,12.213,1637,14.399,1638,11.125,1639,12.213,1640,12.213,1641,12.213,1642,10.409]],["keywords/228",[]],["title/229",[1643,1016.492]],["content/229",[27,3.613,30,5.82,55,2.476,58,4.719,60,5.561,165,4.875,235,3.757,249,5.144,318,8.309,322,4.373,323,4.202,400,4.132,411,4.684,487,7.317,489,7.695,493,7.317,582,11.295,730,6.486,777,5.903,941,4.978,1227,7.152,1643,7.915,1644,7.915,1645,8.776,1646,8.776,1647,8.776,1648,7.915,1649,10.337]],["keywords/229",[]],["title/230",[1650,1127.121]],["content/230",[27,3.445,30,5.435,55,2.534,58,4.549,60,6.138,98,6.678,145,4.332,165,4.552,235,3.508,249,4.904,318,8.01,321,3.147,322,4.169,323,3.924,400,3.858,411,4.374,468,6.281,470,6.536,582,9.406,730,6.056,777,5.512,941,4.648,1227,6.678,1643,7.391,1644,7.391,1645,8.195,1646,8.195,1647,8.195,1648,7.391,1650,8.195,1651,7.887,1652,9.652,1653,9.652,1654,9.652]],["keywords/230",[]],["title/231",[1590,988.226]],["content/231",[5,4.634,27,2.692,30,3.889,44,1.198,55,2.864,57,4.583,58,3.742,59,4.583,60,4.143,73,8.816,165,5.01,168,3.225,235,2.511,249,3.832,268,6.154,322,3.258,323,2.808,400,4.246,401,4.861,411,4.814,430,4.062,460,4.583,467,4.002,468,8.422,470,4.678,487,4.89,489,5.142,493,4.89,495,5.455,506,5.644,526,2.882,582,4.779,721,4.125,881,2.455,887,5.604,903,5.142,941,5.116,1061,5.865,1157,5.455,1227,4.779,1590,5.142,1655,4.678,1656,4.495,1657,6.463,1658,6.463,1659,7.908,1660,10.623,1661,6.908,1662,6.908,1663,6.908,1664,6.908]],["keywords/231",[]],["title/232",[1665,1127.121]],["content/232",[14,4.952,16,2.633,18,4.037,27,3.44,30,4.202,44,1.955,55,2.284,58,3.924,60,5.294,73,10.356,120,4.529,150,3.287,165,6.402,235,2.713,249,4.065,268,7.865,269,8.898,270,6.624,322,4.163,323,3.034,400,5.426,401,3.415,411,6.853,419,5.413,435,4.952,460,4.952,600,3.415,719,4.857,730,4.683,777,4.262,881,2.652,941,6.537,1227,5.164,1231,3.086,1484,6.098,1486,6.624,1495,6.337,1500,6.983,1511,6.983,1659,5.556,1665,6.337,1666,6.983,1667,6.624,1668,13.574,1669,11.268]],["keywords/232",[]],["title/233",[1597,1048.3]],["content/233",[5,4.595,6,7.665,15,5.762,16,2.404,30,3.837,44,1.824,55,2.66,58,3.039,60,4.1,90,3.282,143,5.762,165,6.053,249,3.792,264,3.892,268,6.091,322,3.936,323,2.771,338,4.008,400,5.131,401,4.811,409,5.219,411,4.764,449,5.382,509,5.219,511,4.715,513,5.569,514,6.376,543,3.595,546,5.569,555,4.204,586,12.008,594,4.943,730,4.276,777,3.892,812,7.625,941,6.181,978,5.219,1072,5.219,1103,3.837,1227,4.715,1597,5.382,1670,9.836,1671,10.513,1672,6.815,1673,6.815,1674,6.815,1675,6.815,1676,6.815,1677,6.815,1678,6.815,1679,6.815,1680,6.815,1681,6.815,1682,6.815,1683,6.815,1684,6.815]],["keywords/233",[]],["title/234",[1612,1048.3]],["content/234",[5,5.086,21,2.254,44,1.397,55,2.728,57,5.343,58,3.448,60,3.141,67,2.739,69,3.962,73,7.236,85,4.472,165,5.625,198,5.84,268,4.665,322,3.657,400,4.768,401,7.186,402,4.598,413,4.735,460,5.343,468,5.24,470,5.453,526,3.359,561,6.166,600,3.685,721,4.809,817,5.84,881,2.862,887,6.291,941,5.743,1016,6.579,1459,6.359,1612,6.359,1655,5.453,1656,5.24,1659,5.994,1685,7.146,1686,8.052,1687,10.584,1688,10.584,1689,7.146,1690,8.052,1691,6.837,1692,8.052,1693,7.146,1694,8.052]],["keywords/234",[]],["title/235",[1616,1048.3]],["content/235",[5,4.34,6,5.856,21,3.394,39,10.759,44,1.081,50,8.209,55,2.769,57,4.135,58,2.835,60,2.431,67,2.12,107,5.494,165,6.483,249,2.248,268,3.611,269,9.573,322,1.911,400,5.495,401,7.264,409,9.283,411,2.824,460,4.135,526,2.6,555,3.844,642,7.24,721,3.722,804,3.001,881,2.215,887,5.173,890,3.911,906,4.922,941,6.62,950,4.64,1575,4.135,1616,4.922,1617,8.326,1655,4.22,1656,4.056,1659,4.64,1695,6.233,1696,5.831,1697,6.233,1698,5.831,1699,6.233,1700,12.123,1701,6.233,1702,6.233,1703,9.806,1704,6.233,1705,6.233,1706,6.233,1707,6.233,1708,6.233]],["keywords/235",[]],["title/236",[264,758.054]],["content/236",[]],["keywords/236",[]],["title/237",[104,204.877,111,624.953]],["content/237",[24,3.631,27,4.029,44,1.707,47,5.7,55,2.237,104,3.721,106,8.801,107,6.244,110,6.368,111,9.351,127,9.753,140,6.284,143,5.392,152,7.095,192,7.324,253,2.555,256,2.277,374,6.807,406,5.066,442,6.964,543,5.19,548,12.993,579,8.731,600,4.502,1073,5.464,1709,8.731,1710,9.205]],["keywords/237",[]],["title/238",[104,204.877,1600,560.595]],["content/238",[16,2.957,24,4.534,28,3.762,44,2.522,47,4.857,55,2.253,58,4.204,71,5.455,104,3.286,125,4.317,145,3.762,150,3.692,157,5.311,164,3.658,169,5.006,179,3.658,182,4.594,231,4.787,237,6.85,250,4.037,253,2.177,256,1.94,264,4.787,290,6.419,310,5.854,321,4.006,401,3.836,423,4.93,451,5.8,590,4.72,819,5.26,979,6.241,1074,5.562,1119,7.118,1260,6.241,1353,6.241,1600,7.671,1601,5.677,1651,6.85,1711,7.843,1712,7.843,1713,7.118,1714,7.44,1715,7.44,1716,7.44,1717,7.44,1718,8.383]],["keywords/238",[]],["title/239",[27,224.511,104,170.808,890,555.947]],["content/239",[16,3.373,24,4.984,27,4.547,41,6.616,44,1.659,58,2.764,96,5.24,104,3.46,117,6.107,121,7.118,150,4.211,243,3.502,247,5.623,303,5.384,310,6.436,323,3.887,430,5.623,451,6.616,537,7.322,819,8.474,834,7.118,845,7.813,859,6,890,8.474,1517,8.486,1637,8.118,1719,8.946,1720,8.946,1721,7.813,1722,8.118,1723,8.946,1724,8.946,1725,12.635,1726,9.562,1727,9.562,1728,9.562]],["keywords/239",[]],["title/240",[804,639.286]],["content/240",[5,1.434,15,4.884,18,4.821,24,1.478,25,2.14,27,2.991,30,2.256,44,1.546,47,2.321,55,2.828,58,3.713,91,1.748,96,2.195,103,3.42,104,3.177,105,10.494,106,5.692,107,5.348,117,2.559,150,1.764,152,3.513,157,1.732,165,4.203,179,4.591,182,4.884,225,3.251,239,2.977,249,3.215,250,1.929,262,2.209,264,3.896,274,6.384,294,4.012,310,5.624,322,3.939,323,4.277,343,4.14,351,2.559,400,3.562,401,3.122,406,2.063,411,1.815,434,1.764,446,2.982,453,2.607,598,2.431,730,2.514,846,2.514,890,4.281,941,4.291,946,3.748,950,2.982,1039,1.833,1069,3.163,1076,2.658,1140,3.555,1341,3.273,1353,2.982,1362,5.793,1575,2.658,1600,3.599,1601,6.034,1622,2.982,1688,3.555,1729,6.823,1730,3.748,1731,4.006,1732,4.006,1733,4.006,1734,3.748,1735,4.006,1736,8.911,1737,7.909,1738,8.911,1739,3.748,1740,4.006,1741,3.748,1742,4.006]],["keywords/240",[]],["title/241",[1743,1327.496]],["content/241",[18,3.895,36,5.097,44,1.249,47,4.171,55,2.652,58,3.839,103,4.208,104,3.08,105,8.959,106,4.599,107,3.263,126,6.88,150,3.171,164,3.142,179,5.794,182,7.278,213,5.222,235,2.617,239,3.142,240,3.328,250,5.281,255,1.965,274,9.695,290,5.513,310,6.328,320,3.431,321,2.348,322,4.553,323,2.927,545,5.222,739,4.876,819,4.518,909,3.946,1044,5.222,1231,4.535,1575,7.275,1600,3.798,1601,10.054,1622,5.36,1744,10.259,1745,7.2,1746,9.31,1747,7.2,1748,7.2,1749,6.736]],["keywords/241",[]],["title/242",[38,1178.119]],["content/242",[]],["keywords/242",[]],["title/243",[140,678.803,526,443.324]],["content/243",[5,6.016,21,2.813,28,4.509,44,2.425,55,1.414,90,4.839,100,7.287,145,2.885,168,4.691,181,8.531,192,10.409,230,8.931,235,4.495,243,2.354,253,1.67,256,2.863,278,3.571,282,5.253,351,7.9,419,7.287,466,4.663,480,6.096,502,8.531,526,2.682,559,4.265,750,5.705,764,4.923,881,6.351,884,5.459,887,7.376,895,9.47,896,6.429,897,9.4,898,6.429,899,11.571,900,6.429,901,6.429,902,6.429,903,4.786,906,7.934,907,6.429,908,6.015,909,3.523,1231,4.155,1257,6.429,1268,8.531,1484,5.253,1490,5.077,1750,6.429,1751,10.047]],["keywords/243",[]],["title/244",[911,1048.3]],["content/244",[5,3.898,44,2.909,110,8.314,205,9.245,240,5.032,243,3.988,253,2.828,256,3.42,301,5.032,303,6.131,321,3.55,464,9.245,764,11.314,847,10.006,878,7.085,881,3.869,909,5.967,911,11.669,912,12.181,913,10.888,914,10.888,915,10.187,916,9.245,917,9.663]],["keywords/244",[]],["title/245",[253,275.989,880,719.629]],["content/245",[5,3.817,44,2.527,64,12.926,140,9.303,145,4.785,167,7.732,168,4.977,205,9.051,243,3.904,253,4.309,256,3.84,284,5.767,285,6.366,351,6.809,406,5.49,434,4.695,453,6.937,476,6.809,526,4.447,862,7.546,880,9.863,881,3.788,916,9.051,918,7.732,919,13.627,920,10.661,921,13.627,988,7.219]],["keywords/245",[]],["title/246",[253,230.095,256,205.068,909,485.566]],["content/246",[145,4.993,162,10.374,225,5.302,228,11.125,253,4.404,256,3.925,299,6.353,300,5.302,301,8.387,302,8.282,353,9.577,366,8.069,761,8.786,909,8.217,1752,11.125,1753,12.213,1754,11.125,1755,16.46,1756,11.125,1757,12.251,1758,12.213,1759,11.125]],["keywords/246",[]],["title/247",[366,770.758,838,994.267]],["content/247",[0,6.731,16,3.007,21,3.481,28,5.581,44,2.547,50,5.09,55,1.199,65,6.727,71,5.546,116,11.424,125,4.389,162,8.604,224,6.033,230,5.444,253,3.813,256,3.398,348,10.16,366,9.019,413,5.012,467,4.938,600,3.9,719,5.546,764,6.526,834,6.345,838,7.974,847,5.772,887,6.56,931,5.09,933,7.564,1015,6.731,1058,5.655,1105,4.867,1260,6.345,1630,7.237,1631,6.964,1756,8.523,1757,6.964,1759,8.523,1760,9.357,1761,9.357,1762,7.237,1763,7.974,1764,9.357,1765,9.357,1766,9.357,1767,9.357]],["keywords/247",[]],["title/248",[253,230.095,256,205.068,366,642.591]],["content/248",[16,3.882,30,6.197,44,2.582,96,6.031,107,6.745,253,4.902,256,3.445,303,6.197,320,7.093,366,7.982,425,6.906,613,8.427,764,11.397,1205,10.795,1283,8.992,1344,7.302,1754,11.005,1763,10.297,1768,14.884,1769,12.082,1770,11.397,1771,12.082,1772,10.297]],["keywords/248",[]],["title/249",[198,642.591,423,521.031,693,467.375]],["content/249",[15,6.042,16,4.705,21,3.734,24,4.069,26,5.726,28,3.254,33,3.825,44,2.585,55,1.02,117,4.632,120,6.689,122,6.921,176,5.259,198,7.996,253,4.163,256,3.087,262,2.348,287,7.314,324,5.552,337,5.552,406,3.734,423,6.483,425,4.55,434,3.193,453,4.718,479,4.264,480,4.4,516,4.55,600,3.318,693,3.825,804,3.492,834,5.398,979,5.398,1058,4.811,1076,8.849,1078,6.435,1101,4.201,1105,4.141,1115,4.811,1175,11.837,1188,6.157,1713,9.36,1773,7.251,1774,10.314,1775,5.925,1776,6.157,1777,6.784,1778,7.251,1779,6.435,1780,7.96,1781,7.96,1782,6.435,1783,6.435]],["keywords/249",[]],["title/250",[27,269.29,28,476.959]],["content/250",[1,2.796,11,3.333,15,3.538,16,2.277,27,2.554,28,3.811,44,1.473,55,2.368,58,1.086,67,1.277,89,2.086,90,1.808,102,3.538,103,3.869,106,2.399,122,6.232,123,2.492,150,1.654,168,1.753,176,2.724,192,4.806,198,2.724,225,3.076,242,6.325,243,4.861,249,1.355,253,4.37,255,2.318,256,2.628,262,3.264,266,2.724,271,2.965,287,2.492,306,2.399,318,3.286,320,1.79,323,1.527,324,2.875,337,2.875,402,2.144,406,1.934,413,3.796,423,2.208,430,2.208,434,1.654,438,2.965,453,2.444,476,2.399,479,2.208,483,2.444,506,3.068,511,2.598,521,3.333,529,2.658,537,2.875,555,2.316,616,6.456,657,4.943,658,2.356,667,1.981,720,3.333,763,2.965,787,3.513,788,2.796,808,3.755,820,2.965,821,3.855,830,2.492,882,2.875,977,3.188,988,2.543,997,2.965,1007,3.513,1014,3.513,1039,1.718,1041,3.068,1046,6.04,1050,5.729,1076,2.492,1105,3.686,1115,2.492,1131,3.068,1188,5.481,1231,1.553,1357,3.755,1397,2.965,1551,3.513,1642,3.513,1775,5.275,1776,3.188,1779,3.333,1782,3.333,1783,3.333,1784,3.755,1785,3.513,1786,4.122,1787,5.729,1788,3.333,1789,3.513,1790,3.755,1791,2.796,1792,3.333,1793,2.724,1794,3.513,1795,3.333,1796,4.122,1797,4.122,1798,3.755,1799,4.122,1800,3.333,1801,3.513,1802,3.513,1803,4.122,1804,4.122,1805,4.122,1806,3.513,1807,4.122,1808,4.122,1809,4.122,1810,4.122,1811,3.755,1812,3.755,1813,4.122,1814,4.122,1815,3.755,1816,4.122,1817,4.122,1818,4.122,1819,4.122,1820,4.122,1821,4.122,1822,6.04,1823,3.755,1824,3.513]],["keywords/250",[]],["title/251",[347,939.672]],["content/251",[55,2.776,102,7.586,168,6.462,230,8.842,352,8.02,430,8.14,821,8.266,988,9.373,1825,17.278,1826,13.842,1827,15.196,1828,13.842]],["keywords/251",[]],["title/252",[933,1178.119]],["content/252",[1,4.135,5,1.988,15,4.903,16,1.959,17,4.929,27,1.407,41,3.843,44,1.949,52,4.538,55,1.812,67,3.043,86,3.548,89,3.085,94,7.31,102,4.903,104,1.725,107,2.517,122,3.668,145,2.493,230,7.175,243,4.114,253,4.121,256,3.821,284,3.004,285,3.317,317,5.518,318,2.827,321,1.811,343,3.37,346,6.488,351,3.548,352,5.183,385,7.772,406,2.86,411,2.517,413,3.266,501,3.37,587,4.028,594,4.028,653,5.196,659,4.716,726,3.266,804,2.675,821,6.708,830,5.936,854,4.253,918,6.488,934,8.37,979,6.66,983,5.554,988,6.058,1026,4.253,1127,5.554,1131,7.31,1179,5.554,1226,5.554,1651,4.538,1829,11.233,1830,6.097,1831,6.097,1832,6.097,1833,6.097,1834,6.097,1835,6.097,1836,6.097,1837,6.097,1838,6.097,1839,6.097,1840,6.097,1841,6.097,1842,6.097,1843,5.554,1844,5.554,1845,5.196,1846,6.097,1847,6.097,1848,9.821,1849,4.929,1850,6.097,1851,6.097,1852,6.097,1853,6.097]],["keywords/252",[]],["title/253",[21,212.679,104,146.455,310,362.014,401,347.638]],["content/253",[5,2.361,8,2.96,11,5.853,21,2.869,33,3.479,44,1.144,50,3.939,55,2.842,58,1.906,69,3.245,89,3.663,103,2.531,104,2.96,105,5.389,106,4.213,108,5.05,128,5.6,141,5.208,145,5.642,150,2.904,153,5.05,177,4.138,208,5.05,230,4.213,231,5.853,250,3.176,255,1.8,264,3.766,310,5.991,321,2.15,374,4.563,401,6.487,434,2.904,531,3.523,779,4.668,803,8.094,804,4.936,882,5.05,1039,3.018,1044,7.433,1076,4.376,1187,4.138,1202,8.702,1205,10.282,1358,6.595,1376,5.853,1572,5.389,1631,5.389,1854,4.91,1855,7.24,1856,13.8,1857,7.24,1858,6.595,1859,11.252,1860,5.853,1861,6.17,1862,7.24]],["keywords/253",[]],["title/254",[104,204.877,157,459.447]],["content/254",[44,2.081,55,2.631,85,4.508,91,3.541,92,7.203,103,3.115,104,2.313,157,6.17,164,3.541,179,5.234,182,6.575,222,7.594,231,4.635,239,3.541,244,8.124,253,3.116,254,4.448,255,3.275,256,3.303,257,4.702,262,2.628,274,7.279,310,5.717,322,2.489,323,3.3,343,4.925,351,5.184,501,4.925,526,3.386,640,5.616,719,5.281,865,5.616,918,5.887,1039,3.714,1321,10.744,1411,6.042,1863,7.594,1864,8.117,1865,8.124,1866,7.203,1867,6.632,1868,7.594,1869,8.117]],["keywords/254",[]],["title/255",[239,463.686,853,655.527]],["content/255",[23,8.617,24,5.325,91,6.296,104,2.782,203,9.984,233,9.217,239,6.296,296,8.014,719,9.389,853,8.901,918,10.465,1376,12.806,1411,10.742]],["keywords/255",[]],["title/256",[55,93.548,374,460.025,1870,564.523,1871,622.053,1872,432.645]],["content/256",[]],["keywords/256",[]],["title/257",[44,131.777,253,197.289,1873,759.678,1874,674.195]],["content/257",[55,1.871,125,6.849,136,9.007,188,7.016,253,4.803,256,3.079,353,8.496,442,9.415,1073,7.387,1101,7.706,1872,8.655,1873,13.301,1874,11.804,1875,14.602,1876,14.602,1877,14.602,1878,14.602]],["keywords/257",[]],["title/258",[21,212.679,28,340.95,342,599.905,1879,485.238]],["content/258",[15,5.665,16,5.03,21,4.57,28,8.287,90,6.867,164,4.51,167,7.497,188,5.453,253,4.24,256,2.392,366,10.342,483,6.726,667,5.453,887,5.453,1103,8.029,1131,8.446,1205,10.342,1338,10.337,1768,10.337,1772,9.671,1872,6.726,1879,6.602,1880,11.347,1881,11.347,1882,11.347,1883,10.337,1884,10.337,1885,10.337]],["keywords/258",[]],["title/259",[148,410.947,352,440.131,887,400.737,1886,674.195]],["content/259",[18,3.788,21,3.654,28,5.858,36,4.957,44,2.264,50,6.41,55,2.516,90,5.169,102,3.838,145,3.143,148,3.788,164,3.055,168,3.269,194,5.213,225,3.337,230,4.473,253,2.788,255,1.911,256,2.485,262,3.476,303,3.943,308,6.551,322,2.147,342,5.53,573,4.557,600,3.204,642,4.182,763,5.53,796,4.742,842,7.002,1058,9.709,1059,7.002,1065,9.032,1101,4.057,1102,7.002,1173,7.002,1772,6.551,1883,7.002,1884,7.002,1885,10.734,1886,9.527,1887,10.734,1888,7.002,1889,7.687,1890,11.784,1891,7.687,1892,7.687,1893,7.687,1894,14.33,1895,7.002,1896,11.784,1897,7.687,1898,7.687,1899,7.687,1900,7.687,1901,7.687,1902,7.687,1903,7.687]],["keywords/259",[]],["title/260",[256,205.068,931,529.109,1904,886.004]],["content/260",[10,11.137,16,4.199,21,3.333,27,3.974,104,2.295,225,5.673,242,7.47,243,4.36,253,3.092,256,2.755,322,3.651,555,7.343,614,9.727,658,7.47,716,9.401,817,8.634,931,7.109,1074,7.898,1076,7.898,1101,6.897,1313,11.904,1872,7.746,1904,11.904,1905,10.565,1906,13.068,1907,13.068,1908,13.068]],["keywords/260",[]],["title/261",[306,678.803,1879,678.803]],["content/261",[21,3.857,44,1.707,55,1.384,58,2.844,122,5.649,168,4.593,249,3.549,253,4.13,255,3.761,256,3.189,262,3.186,306,6.284,324,7.533,337,7.533,352,5.7,526,4.104,543,5.19,550,9.838,573,6.402,730,6.173,787,9.205,788,7.324,931,5.875,1039,6.305,1076,6.527,1103,5.54,1105,5.618,1774,12.891,1779,8.731,1782,8.731,1783,8.731,1871,9.205,1905,14.112,1909,10.8,1910,10.8,1911,10.8]],["keywords/261",[]],["title/262",[658,666.833,1879,678.803]],["content/262",[8,3.998,16,1.949,27,2.257,44,2.227,55,2.7,58,1.597,67,1.879,89,3.068,103,3.418,122,5.264,168,2.579,176,4.006,225,2.632,242,7.023,243,4.099,245,3.248,253,2.907,255,2.431,256,2.062,262,4.157,318,4.533,320,2.632,321,1.801,322,2.732,323,2.246,398,4.362,403,4.69,428,11.192,460,3.665,476,3.528,487,6.305,489,6.631,493,6.305,501,3.352,537,4.23,562,4.902,582,6.163,658,8.056,667,2.914,924,4.23,931,3.299,997,4.362,1039,2.528,1078,4.902,1080,3.91,1096,4.69,1103,3.11,1240,3.91,1643,6.82,1776,4.69,1787,4.902,1788,4.902,1791,6.631,1792,7.905,1794,8.333,1795,4.902,1905,7.905,1912,6.064,1913,6.064,1914,6.064,1915,6.064,1916,6.064,1917,6.064,1918,6.064,1919,6.064,1920,6.064,1921,6.064,1922,6.064,1923,6.064,1924,6.064,1925,6.064,1926,6.064,1927,6.064,1928,5.168,1929,6.064,1930,6.064]],["keywords/262",[]],["title/263",[27,224.511,104,170.808,188,467.375]],["content/263",[17,7.32,24,3.044,27,2.09,33,4.351,44,2.499,47,4.778,58,3.509,71,5.367,104,3.414,145,3.702,169,4.925,188,6.404,223,8.248,237,6.739,250,3.972,253,3.153,256,2.81,310,6.864,321,3.958,374,5.707,413,4.85,423,4.85,511,5.707,526,3.441,573,5.367,590,4.644,667,6.404,932,7.32,979,6.14,1039,3.774,1073,4.581,1074,5.472,1119,7.003,1353,9.037,1600,7.599,1714,7.32,1715,7.32,1716,7.32,1717,7.32,1870,10.307,1871,7.716,1872,9.373,1931,8.248,1932,9.054,1933,8.248]],["keywords/263",[]],["title/264",[104,170.808,250,426.676,1934,699.662]],["content/264",[5,2.218,15,3.395,24,2.286,29,6.195,44,1.693,55,2.811,58,3.491,90,2.983,97,5.062,104,3.194,124,4.612,133,6.35,145,2.78,150,2.728,168,2.892,169,3.699,188,3.268,249,4.356,250,6.598,253,3.136,256,2.795,262,2.006,293,5.26,310,4.651,322,2.993,323,3.967,397,6.234,425,3.887,512,6.195,523,7.974,541,5.796,542,5.498,573,4.031,590,3.488,669,5.796,1018,5.796,1076,4.11,1103,3.488,1845,5.796,1861,5.796,1872,6.35,1934,4.892,1935,4.493,1936,6.195,1937,6.801,1938,10.713,1939,6.195,1940,6.801,1941,6.801,1942,10.713,1943,9.759,1944,6.801,1945,6.801,1946,10.713,1947,6.801,1948,6.801,1949,6.801,1950,6.801,1951,6.195,1952,6.195,1953,6.195]],["keywords/264",[]],["title/265",[104,128.179,148,359.667,391,590.065,1600,350.731,1954,590.065]],["content/265",[16,3.61,24,3.776,55,1.992,58,2.958,90,4.928,104,3.547,148,5.535,177,6.421,188,5.398,191,7.08,245,8.328,250,6.82,253,2.657,256,2.368,310,6.748,391,12.568,405,9.574,523,8.361,931,9.698,1118,7.836,1600,5.398,1746,8.688,1872,6.659,1905,12.568,1936,10.233,1951,10.233,1954,12.568,1955,11.234,1956,10.233]],["keywords/265",[]],["title/266",[148,479.283,264,505.944,1879,565.927]],["content/266",[31,8.534,55,2.19,104,3.001,148,8.42,225,5.607,249,5.615,253,3.056,256,2.724,264,8.888,322,3.609,479,6.92,523,9.615,573,7.657,658,7.384,924,9.01,1872,7.657,1879,7.516,1954,10.443,1956,11.767,1957,10.443,1958,10.443,1959,12.918,1960,10.443,1961,12.918]],["keywords/266",[]],["title/267",[254,416.334,1116,504.029,1879,485.238,1962,710.745]],["content/267",[44,1.478,67,2.899,104,2.83,122,3.495,136,5.772,145,3.825,148,4.611,188,4.496,190,7.564,191,5.897,249,5.822,250,4.105,253,2.214,256,1.973,257,7.205,262,4.026,294,7.313,425,5.348,555,5.258,667,7.744,931,5.09,1016,6.964,1039,8.466,1101,4.938,1103,4.799,1116,5.655,1345,7.974,1362,7.237,1600,4.496,1734,7.974,1854,9.257,1872,5.546,1879,5.444,1954,7.564,1958,7.564,1960,7.564,1963,9.357,1964,9.357,1965,9.357,1966,9.357,1967,9.357,1968,9.357,1969,9.357,1970,9.357,1971,9.357]],["keywords/267",[]],["title/268",[27,192.5,467,440.131,1157,599.905,1879,485.238]],["content/268",[15,7.015,27,3.244,41,8.856,50,7.644,65,8.895,188,6.752,249,4.617,253,3.324,256,2.963,367,6.369,467,9.527,590,7.207,834,9.529,1157,10.108,1283,10.459,1872,8.329,1972,14.052,1973,11.976,1974,14.052,1975,11.36]],["keywords/268",[]],["title/269",[1039,304.258,1101,385.209,1976,590.065,1977,729.901,1978,622.053]],["content/269",[15,4.594,41,5.8,44,2.131,107,5.567,122,3.437,191,5.8,249,3.024,253,3.191,256,1.94,262,3.978,318,4.267,342,6.62,447,4.218,467,7.118,573,5.455,667,4.422,807,7.44,1036,6.85,1039,6.654,1073,4.656,1076,5.562,1096,10.431,1101,8.425,1116,9.648,1291,8.383,1872,5.455,1879,5.355,1887,8.383,1928,11.494,1958,7.44,1960,7.44,1973,7.843,1976,7.44,1978,13.605,1979,15.964,1980,9.203,1981,9.203,1982,9.203,1983,9.203,1984,9.203,1985,9.203,1986,9.203,1987,9.203,1988,9.203,1989,9.203,1990,9.203,1991,7.44]],["keywords/269",[]],["title/270",[59,441.133,396,410.124,1992,664.881,1993,729.901,1994,664.881]],["content/270",[27,2.357,41,6.435,55,2.364,60,5.165,65,5.031,73,8.035,225,4.432,249,3.355,253,3.439,256,3.065,322,4.729,352,5.388,396,9.512,467,5.388,468,8.617,555,5.737,573,6.052,658,5.836,730,5.836,924,7.121,931,5.554,1101,7.672,1157,10.457,1872,8.617,1958,8.254,1960,8.254,1973,8.701,1994,9.3,1995,7.344,1996,13.242,1997,9.3,1998,10.21,1999,10.21,2000,14.537,2001,10.21]],["keywords/270",[]],["title/271",[55,93.548,374,460.025,1870,564.523,2002,509.114,2003,664.881]],["content/271",[]],["keywords/271",[]],["title/272",[188,467.375,243,324.483,2004,786.306]],["content/272",[5,3.157,27,2.234,44,2.211,55,1.241,65,4.77,90,4.246,110,5.891,111,5.186,168,4.117,235,3.205,249,3.181,254,4.833,262,2.855,294,5.186,353,5.632,402,5.035,422,6.101,483,5.738,516,5.533,530,6.752,531,4.71,574,9.244,590,4.965,599,9.233,600,4.035,619,6.564,621,7.487,667,4.652,847,5.971,878,5.738,881,3.134,931,5.266,1101,5.109,1225,7.205,1367,7.487,1368,6.395,1369,8.25,1374,7.487,1376,7.826,1378,8.25,1467,7.826,1581,7.826,1789,8.25,2005,8.818,2006,9.68,2007,9.68,2008,9.68,2009,13.992,2010,9.68,2011,9.68,2012,8.25]],["keywords/272",[]],["title/273",[188,467.375,988,599.964,2013,886.004]],["content/273",[5,2.795,44,1.354,89,4.336,96,4.278,120,4.736,122,3.2,167,5.661,174,4.986,235,2.837,253,3.027,254,4.278,295,6.378,422,9.649,438,6.164,447,7.017,482,5.401,516,4.898,551,6.628,587,5.661,599,8.708,600,7.077,619,5.811,621,6.628,655,6.628,667,4.118,693,4.118,726,4.59,1077,6.378,1101,4.523,1187,4.898,1260,5.811,1295,6.378,1309,6.628,1374,14.738,1394,7.806,1411,5.811,1879,4.986,1935,5.661,1962,7.303,2012,7.303,2014,7.806,2015,8.569,2016,8.569,2017,5.977,2018,15.309,2019,8.569,2020,8.569,2021,8.569,2022,8.569,2023,7.303,2024,7.303,2025,7.806,2026,7.806,2027,8.569,2028,8.569]],["keywords/273",[]],["title/274",[104,146.455,422,525.614,1374,645.011,2017,581.702]],["content/274",[25,5.577,27,2.646,44,1.811,55,2.02,89,5.8,197,8.866,224,7.392,235,5.219,262,3.381,413,8.445,430,6.141,447,5.254,598,6.336,612,8.246,667,5.508,865,7.225,1073,5.8,1252,6.795,1368,10.415,1374,8.866,1849,9.267,1962,9.77,2012,9.77,2025,10.442,2026,10.442,2029,11.464,2030,14.36,2031,11.464,2032,11.464,2033,9.267,2034,11.464,2035,11.464,2036,10.442,2037,11.464,2038,11.464]],["keywords/274",[]],["title/275",[55,93.548,374,460.025,1870,564.523,2003,664.881,2039,729.901]],["content/275",[]],["keywords/275",[]],["title/276",[188,467.375,243,324.483,2004,786.306]],["content/276",[25,5.205,27,2.469,44,1.69,55,1.926,96,5.34,254,7.501,256,2.255,257,7.929,262,5.555,322,2.988,370,8.173,423,5.73,447,4.903,598,5.912,667,7.22,859,6.114,860,8.648,1039,4.459,1367,11.62,1368,12.443,1369,12.805,1935,9.926,2005,13.686,2040,8.273,2041,12.146,2042,15.025,2043,13.686,2044,13.686]],["keywords/276",[]],["title/277",[188,467.375,988,599.964,2013,886.004]],["content/277",[]],["keywords/277",[]],["title/278",[25,284.193,27,134.829,322,163.175,598,322.849,1935,385.906,2040,451.772,2041,472.213]],["content/278",[33,4.733,68,5.052,98,6.208,169,5.359,174,5.731,219,6.508,253,3.352,262,2.905,322,2.752,396,5.535,397,5.731,402,5.124,425,5.63,447,6.494,520,6.076,559,8.564,599,7.267,714,7.619,783,7.619,805,7.332,862,6.352,1019,6.871,1368,10.963,1619,6.68,1634,7.963,1642,8.395,1757,7.332,1793,9.361,1849,7.963,1952,8.973,1991,7.963,2023,8.395,2024,8.395,2036,12.907,2040,7.619,2041,7.963,2045,9.851,2046,14.169,2047,9.851,2048,9.851,2049,9.851,2050,12.907,2051,9.851,2052,9.851,2053,9.851,2054,9.851]],["keywords/278",[]],["title/279",[254,364.381,447,334.546,1039,304.258,1935,482.217,2041,590.065]],["content/279",[303,9.463,425,10.546,2055,16.806]],["keywords/279",[]],["title/280",[44,92.298,96,291.605,254,291.605,256,123.153,423,312.903,859,333.872,860,472.213]],["content/280",[16,4.754,71,8.769,167,9.774,174,8.608,219,9.774,224,9.539,254,7.386,321,4.394,367,6.705,447,6.781,614,11.011,714,11.442,862,9.539,882,10.319,2024,12.609,2056,14.795,2057,14.795,2058,14.795]],["keywords/280",[]],["title/281",[122,544.276]],["content/281",[]],["keywords/281",[]],["title/282",[122,544.276]],["content/282",[1,7.854,15,5.782,16,3.722,25,5.635,27,2.673,44,1.83,122,4.326,123,7,242,6.62,243,3.864,253,4.611,385,7.3,401,4.828,402,6.025,413,6.204,430,6.204,438,11.42,447,5.309,598,6.402,803,8.331,1041,8.62,1073,5.86,1618,9.871,1709,9.363,1775,8.62,1784,10.55,1785,9.871,1879,6.739,2059,11.582,2060,11.582,2061,10.55,2062,11.582,2063,11.582,2064,11.582,2065,11.582]],["keywords/282",[]],["title/283",[306,847.926]],["content/283",[15,5.479,16,4.345,21,2.799,24,2.358,27,1.619,33,5.274,44,2.624,55,1.961,58,4.028,104,1.232,120,3.876,122,7.114,145,2.867,176,4.633,198,10.106,253,2.597,256,2.314,281,5.22,287,8.173,423,7.244,425,4.009,479,3.757,480,3.876,600,2.924,617,5.045,834,4.756,864,4.081,882,4.892,979,4.756,1039,2.924,1044,4.633,1074,4.239,1076,4.239,1078,5.67,1105,3.648,1115,4.239,1175,12.367,1273,5.045,1341,5.22,1572,5.22,1574,9.354,1575,8.173,1576,5.045,1577,5.977,1578,6.389,1579,4.756,1580,5.977,1581,5.67,1713,5.424,1773,6.389,1774,9.354,1775,5.22,1776,5.424,1777,5.977,1778,9.998,1860,5.67,2066,7.013,2067,7.013,2068,7.013,2069,5.424,2070,6.389,2071,6.389,2072,5.977]],["keywords/283",[]],["title/284",[21,248.045,27,224.511,104,170.808]],["content/284",[15,7.104,16,4.573,21,3.629,26,10.237,43,11.006,100,9.402,104,2.499,120,7.865,174,8.28,179,7.233,224,9.176,321,4.227,447,6.523,864,8.28,890,8.134,1074,8.601,1355,11.006,1579,9.65,1600,6.838,1622,9.65]],["keywords/284",[]],["title/285",[864,678.803,1579,791.12]],["content/285",[21,4.883,24,4.343,27,2.982,33,6.207,71,7.657,78,10.443,96,6.449,104,3.001,126,7.384,179,5.134,231,6.719,235,4.277,304,7.384,321,3.837,422,8.141,590,6.626,603,12.292,864,9.942,878,7.657,1400,9.991,1623,11.009,1624,10.443,1625,11.009,1626,9.991]],["keywords/285",[]],["title/286",[2069,1127.121]],["content/286",[16,4.515,44,2.852,65,6.924,122,5.248,253,3.324,287,8.493,321,4.174,370,7.644,374,8.856,413,7.527,434,5.637,573,8.329,1103,7.207,1131,10.459,1149,10.459,1187,8.032,1775,10.459,2002,9.802,2017,9.802,2073,11.36,2074,11.976]],["keywords/286",[]],["title/287",[1627,1241.986]],["content/287",[8,6.298,16,4.95,18,7.591,33,7.402,44,2.434,104,2.705,321,4.575,531,9.307,600,6.422,892,11.915,1628,12.454,1629,13.129,1630,11.915,1631,11.466]],["keywords/287",[]],["title/288",[2075,1457.314]],["content/288",[8,6.298,16,4.95,18,7.591,33,7.402,44,2.434,104,2.705,321,4.575,600,6.422,892,11.915,1628,12.454,1630,11.915,1631,11.466,1757,14.238,2076,15.405]],["keywords/288",[]],["title/289",[2072,1241.986]],["content/289",[25,7.198,27,3.415,55,1.896,104,2.598,126,8.456,173,10.032,338,9.992,397,8.608,401,6.167,531,7.198,598,8.177,872,10.319,1105,7.696,1613,11.96,2077,13.477,2078,10.319,2079,13.477]],["keywords/289",[]],["title/290",[617,1048.3]],["content/290",[15,3.974,16,2.558,23,4.33,25,3.873,27,2.794,55,2.375,66,6.435,67,2.466,68,4.083,103,2.783,117,4.632,122,2.973,124,5.398,168,3.385,218,6.157,233,4.632,235,2.636,262,4.319,266,5.259,287,4.811,322,2.224,324,5.552,337,5.552,402,4.141,406,3.734,413,4.264,423,4.264,434,3.193,545,5.259,575,4.55,598,4.4,599,6.207,613,5.552,684,6.157,763,5.726,937,5.552,1039,6.819,1046,6.784,1050,6.435,1076,4.811,1081,5.925,1083,6.157,1097,6.435,1167,4.718,1372,6.157,1572,5.925,1632,6.784,1633,6.784,1634,6.435,1635,6.784,1779,6.435,1782,6.435,1783,6.435,1811,7.251,1812,7.251,1815,7.251,2080,7.96,2081,7.96,2082,7.96,2083,5.259,2084,7.96,2085,7.96,2086,6.784,2087,7.96,2088,7.96,2089,7.96,2090,7.96,2091,7.96,2092,7.96,2093,7.96,2094,7.96]],["keywords/290",[]],["title/291",[1051,1127.121]],["content/291",[21,2.865,44,2.456,55,2.745,60,3.991,103,5.435,104,1.973,108,10.843,150,4.506,250,4.928,253,2.657,255,2.793,256,3.278,278,5.683,306,9.045,809,9.798,1051,8.688,1052,9.081,1397,8.081,1564,12.089,1565,11.571,1566,8.081,1567,7.243,1568,8.361,1569,9.081,1687,9.081,2095,11.234,2096,9.574]],["keywords/291",[]],["title/292",[1080,939.672]],["content/292",[8,3.825,27,3.151,44,1.478,55,1.75,58,3.595,60,3.324,65,4.611,67,4.23,90,4.105,122,3.495,150,3.754,165,5.865,235,3.098,243,3.122,249,3.075,253,2.214,262,4.754,278,4.734,303,4.799,318,4.338,321,2.779,322,2.614,400,4.971,402,4.867,447,6.257,466,6.182,516,5.348,846,5.348,941,5.988,1039,6.718,1080,6.033,1081,10.16,1083,7.237,1085,7.564,1086,7.564,1105,4.867,1167,5.546,1643,6.526,1644,6.526,1648,6.526,1793,6.182,2073,7.564,2083,6.182,2086,7.974,2097,9.357,2098,11.036,2099,11.634]],["keywords/292",[]],["title/293",[2100,1457.314]],["content/293",[5,4.399,8,3.762,14,10.624,16,2.957,27,3.113,44,1.454,55,2.253,58,2.423,85,4.656,122,3.437,165,3.954,235,3.047,249,3.024,262,4.709,318,4.267,322,2.571,400,3.351,434,3.692,435,5.562,480,7.454,526,3.497,600,3.836,721,5.006,846,5.26,881,2.979,887,4.422,895,9.407,941,4.037,1039,5.622,1080,5.934,1083,7.118,1085,7.44,1086,7.44,1115,5.562,1167,7.994,1397,6.62,1588,7.44,1644,6.419,1656,5.455,2086,7.843,2098,7.44,2099,7.843,2101,8.383,2102,9.203,2103,7.44,2104,7.44,2105,7.44,2106,7.44,2107,7.44,2108,9.203]],["keywords/293",[]],["title/294",[2109,1327.496]],["content/294",[8,3.992,27,3.25,44,1.543,55,2.317,58,3.708,65,4.812,67,3.026,90,4.284,122,3.647,145,3.992,150,3.917,165,4.195,235,3.233,243,3.258,249,3.209,253,2.31,262,4.153,278,4.94,303,5.008,321,4.182,322,2.728,400,3.556,402,5.079,447,6.454,466,6.451,467,5.153,468,5.788,470,6.023,516,5.581,582,8.874,846,5.581,941,4.284,1039,6.883,1080,6.296,1105,5.079,1167,5.788,1648,9.821,1650,7.552,1793,6.451,2078,6.811,2083,6.451,2098,7.894,2099,8.322,2110,9.765,2111,8.895]],["keywords/294",[]],["title/295",[2112,1457.314]],["content/295",[5,4.535,8,3.924,14,10.836,16,3.084,27,3.21,44,1.516,55,2.298,58,2.527,85,4.856,122,3.584,165,4.123,235,3.177,249,3.154,262,4.101,318,4.45,322,2.681,400,3.495,434,3.85,435,5.8,480,7.686,526,3.647,600,4.001,721,5.221,846,5.486,881,3.107,887,4.612,895,9.699,941,4.21,1039,5.796,1115,5.8,1167,8.242,1397,6.904,1588,7.759,1644,6.694,1656,5.689,2098,7.759,2101,8.742,2103,7.759,2104,7.759,2105,7.759,2106,7.759,2107,7.759,2109,8.742,2113,9.597,2114,9.597,2115,9.597]],["keywords/295",[]],["title/296",[2116,1457.314]],["content/296",[5,4.993,8,3.503,27,1.978,44,2.022,55,2.176,58,2.257,65,4.223,67,2.655,90,3.759,122,3.2,150,3.438,165,3.682,235,2.837,243,4.268,253,2.027,262,3.773,278,4.336,303,4.395,318,5.932,321,2.545,322,2.394,400,3.12,402,4.458,411,5.281,447,5.864,466,5.661,467,4.523,501,8.462,516,4.898,526,3.256,561,5.977,721,4.662,846,4.898,881,2.774,887,6.148,941,3.759,1039,6.382,1080,5.526,1105,4.458,1167,5.079,1648,8.924,1655,5.286,1656,5.079,1793,5.661,1874,6.928,2078,5.977,2083,5.661,2117,7.806,2118,8.569,2119,7.303,2120,8.569,2121,8.569,2122,8.569,2123,11.654,2124,8.569]],["keywords/296",[]],["title/297",[905,1178.119]],["content/297",[5,3.398,8,1.959,27,2.405,33,2.303,44,1.273,47,2.529,55,2.109,57,2.897,58,2.121,59,4.868,60,1.703,67,2.496,73,6.75,90,2.102,119,4.366,122,3.009,145,1.959,150,1.923,165,3.461,235,1.587,243,1.599,249,4.013,253,1.134,262,3.073,268,2.529,278,2.425,284,2.362,321,1.423,322,1.339,400,2.933,401,3.358,402,2.493,411,4.301,430,2.567,441,4.366,446,3.25,447,7.544,460,2.897,467,2.529,468,2.841,470,7.533,487,3.09,493,6.719,495,3.448,501,4.452,516,2.739,526,1.821,559,2.897,565,3.875,582,3.021,583,4.366,721,2.607,730,2.739,846,2.739,869,3.448,881,1.551,887,3.871,903,3.25,912,2.956,932,3.875,941,3.534,1036,3.567,1039,4.343,1061,6.23,1080,3.09,1105,2.493,1157,5.795,1167,2.841,1200,7.338,1590,3.25,1655,4.969,1656,2.841,1657,4.085,1658,6.865,1659,3.25,1721,3.567,1793,3.166,1802,6.865,1879,6.063,1935,3.166,2078,3.343,2083,3.166,2125,9.492,2126,4.793,2127,4.793,2128,4.366,2129,7.338,2130,8.055,2131,8.055,2132,4.366,2133,4.793,2134,4.366,2135,4.793,2136,8.055,2137,9.492,2138,8.055,2139,8.055,2140,4.793,2141,4.793,2142,11.124,2143,4.793,2144,4.793,2145,4.793,2146,4.793,2147,8.055,2148,4.793,2149,4.793,2150,4.793]],["keywords/297",[]],["title/298",[307,1178.119]],["content/298",[8,2.941,14,4.348,16,2.311,18,3.545,27,3.58,44,1.769,55,1.435,58,2.948,67,4.258,73,6.188,90,3.156,120,3.976,122,2.687,150,4.491,165,6.663,235,2.382,243,2.4,249,3.679,253,2.648,256,1.517,262,4.956,269,5.175,278,3.639,307,5.815,321,2.137,322,2.01,333,14.128,335,6.553,400,5.647,401,2.999,402,3.742,411,5.673,419,4.753,435,4.348,447,5.131,516,4.112,600,2.999,719,4.264,846,4.112,881,2.329,941,6.803,1039,5.729,1105,3.742,1167,4.264,1484,5.354,1486,5.815,1495,5.564,1665,5.564,1666,6.131,1667,5.815,1793,4.753,2078,5.018,2083,4.753,2151,7.194,2152,15.509,2153,7.194,2154,11.195,2155,7.194,2156,7.194,2157,7.194,2158,7.194]],["keywords/298",[]],["title/299",[2159,1457.314]],["content/299",[5,4.507,8,3.89,14,10.793,16,3.058,27,3.19,44,1.504,55,2.289,58,2.506,67,2.948,85,4.814,122,3.554,165,4.088,235,3.151,249,3.127,262,4.076,307,7.693,322,2.658,400,3.465,411,5.705,434,3.817,435,5.751,480,7.638,526,3.616,600,3.967,721,5.176,846,5.439,881,3.08,887,4.573,895,9.639,941,4.174,1039,5.761,1115,5.751,1167,8.192,1397,6.845,1596,8.11,1656,5.64,1667,7.693,2103,7.693,2104,7.693,2105,7.693,2106,7.693,2107,7.693,2160,9.516,2161,9.516,2162,9.516,2163,9.516]],["keywords/299",[]],["title/300",[2164,1327.496]],["content/300",[8,3.702,44,1.431,55,1.708,67,2.805,90,3.972,122,3.382,143,6.653,150,3.632,165,3.89,235,2.998,243,3.021,249,2.975,253,3.153,262,3.931,278,4.581,321,2.689,322,2.529,400,3.297,402,6.932,447,6.108,449,9.586,509,6.315,511,8.399,516,7.617,543,4.351,546,6.739,555,7.488,594,8.804,846,11.789,941,3.972,1039,6.592,1105,4.71,1167,5.367,1490,6.513,1597,6.513,1670,7.716,1793,5.982,2078,6.315,2083,5.982,2164,8.248,2165,9.054,2166,9.054,2167,9.054,2168,9.054,2169,9.054,2170,9.054]],["keywords/300",[]],["title/301",[2171,1457.314]],["content/301",[5,5.521,21,2.604,44,2.297,55,2.17,58,2.688,67,3.163,69,4.576,122,3.813,165,6.245,235,3.38,243,3.406,262,4.993,400,5.293,516,5.836,526,3.88,721,5.554,846,5.836,881,3.305,887,6.985,941,6.377,1039,7.057,1140,8.254,1167,6.052,1459,10.457,1612,7.344,1655,6.298,1656,6.052,1685,8.254,1689,8.254,1693,8.254,2172,10.21,2173,14.537,2174,13.242,2175,13.242,2176,10.21]],["keywords/301",[]],["title/302",[2177,1457.314]],["content/302",[5,5.412,14,5.953,21,2.512,44,2.239,55,2.464,67,3.052,69,4.415,122,3.679,165,4.232,235,3.261,243,3.286,262,4.179,400,3.587,516,5.63,526,3.743,721,5.359,846,5.63,881,3.189,887,6.809,941,4.321,1039,6.917,1167,5.839,1368,6.508,1459,10.192,1576,7.086,1655,6.076,1656,5.839,1685,7.963,1689,7.963,1693,7.963,2103,7.963,2104,7.963,2105,7.963,2106,7.963,2107,7.963,2174,8.973,2175,8.973,2178,9.851,2179,9.851,2180,9.851,2181,9.851,2182,9.851,2183,9.851,2184,9.851]],["keywords/302",[]],["title/303",[908,1241.986]],["content/303",[5,5.493,21,2.58,44,2.282,55,2.354,58,2.664,67,3.135,69,4.535,90,4.438,122,3.779,165,6.205,235,3.35,249,3.324,262,4.26,400,5.259,411,4.176,516,5.783,526,3.845,721,5.504,881,4.675,887,6.94,906,7.278,941,6.336,1039,7.021,1575,6.115,1616,7.278,1617,7.825,1655,6.241,1656,5.997,1696,8.623,1698,8.623,2185,10.117,2186,10.117,2187,14.443,2188,10.117,2189,10.117,2190,10.117,2191,10.117,2192,10.117]],["keywords/303",[]],["title/304",[254,727.521]],["content/304",[44,2.193,55,2.295,58,3.654,104,2.437,122,5.183,235,4.595,243,4.63,249,4.56,250,6.088,262,4.093,264,7.219,516,7.932,846,10.235,1039,8.264,1167,8.226,1368,9.169,1600,6.669,1601,8.56,2193,12.642]],["keywords/304",[]],["title/305",[104,204.877,111,624.953]],["content/305",[24,3.631,27,4.029,44,1.707,47,5.7,55,2.237,104,3.721,106,8.801,107,6.244,110,6.368,111,9.351,127,9.753,140,6.284,143,5.392,152,7.095,192,7.324,253,2.555,256,2.277,374,6.807,406,5.066,442,6.964,543,5.19,548,12.993,579,8.731,600,4.502,1073,5.464,1709,8.731,1710,9.205]],["keywords/305",[]],["title/306",[104,204.877,1600,560.595]],["content/306",[16,2.754,24,4.301,28,3.503,36,5.526,44,2.419,47,6.752,55,1.962,58,4.031,71,5.079,91,3.406,104,3.346,125,4.02,145,3.503,164,3.406,169,4.662,179,3.406,182,4.278,237,6.378,239,3.406,240,5.386,253,2.027,256,1.807,283,3.973,310,5.554,321,3.8,343,4.736,345,4.59,363,4.986,401,3.572,423,4.59,451,5.401,516,4.898,590,4.395,779,5.526,819,4.898,909,4.278,979,5.811,1039,3.572,1074,5.179,1119,6.628,1260,5.811,1353,5.811,1600,8.73,1601,5.286,1651,6.378,1711,7.303,1712,7.303,1713,6.628,1714,6.928,1715,6.928,1716,6.928,1717,6.928,1854,5.811]],["keywords/306",[]],["title/307",[27,224.511,104,170.808,890,555.947]],["content/307",[16,3.646,24,5.263,27,4.679,58,2.988,104,3.56,117,6.602,150,4.552,179,4.51,243,3.786,247,6.079,310,6.795,323,4.202,430,6.079,451,7.152,537,7.915,845,8.446,859,6.486,890,8.948,1517,9.173,1637,8.776,1719,9.671,1720,9.671,1721,8.446,1722,8.776,1723,9.671,1724,9.671,1725,9.671,2194,11.347,2195,15.654]],["keywords/307",[]],["title/308",[804,639.286]],["content/308",[8,3.672,18,4.426,27,2.073,55,1.151,58,3.488,65,4.426,67,4.105,90,3.94,96,4.484,98,5.661,104,2.764,107,3.708,117,5.226,150,3.603,152,6.214,165,5.691,168,3.819,249,2.951,253,2.125,257,6.991,262,3.907,278,4.544,293,6.947,294,4.811,321,2.668,322,3.701,400,4.824,401,3.744,402,4.672,447,6.072,520,5.54,890,5.134,941,5.811,1105,4.672,1297,7.655,1362,6.947,1566,6.461,1622,6.091,1638,8.182,1737,7.261,1785,7.655,1793,5.934,1854,6.091,2073,7.261,2083,8.752,2193,8.182,2196,8.982,2197,8.182,2198,8.182,2199,8.182,2200,7.655,2201,8.982,2202,8.982,2203,8.982]],["keywords/308",[]],["title/309",[25,473.225,27,224.511,598,537.592]],["content/309",[5,2.542,14,4.711,18,3.841,25,3.792,27,1.799,55,2.074,58,2.052,65,3.841,67,3.69,90,3.419,104,1.369,165,5.116,171,6.301,235,2.581,249,4.749,257,6.285,262,5.64,268,4.113,284,3.841,285,4.24,400,4.337,422,4.912,434,3.127,537,5.437,598,4.308,599,7.413,600,3.249,836,6.028,941,5.224,1019,5.437,1039,3.249,1367,6.028,1368,10.69,1370,10.849,1375,6.643,1737,6.301,1739,6.643,1854,5.285,1866,6.301,2033,6.301,2043,7.1,2197,7.1,2198,7.1,2199,7.1,2200,6.643,2204,7.794,2205,7.794,2206,7.794,2207,7.1,2208,7.1,2209,6.643,2210,6.643,2211,6.643,2212,6.643,2213,6.643,2214,7.1,2215,6.643,2216,6.643,2217,6.643,2218,7.1,2219,6.643,2220,6.643,2221,6.643,2222,7.1]],["keywords/309",[]],["title/310",[322,325.905,2083,770.758]],["content/310",[18,3.979,24,4.113,25,7.187,27,3.409,44,1.276,55,1.893,68,4.142,104,1.418,126,4.616,165,3.469,249,2.653,257,4.262,262,5.223,322,3.418,338,4.326,400,2.94,422,5.089,598,8.164,600,5.1,661,6.246,846,4.616,888,6.01,941,3.542,979,5.476,987,7.356,1016,6.01,1026,5.633,1072,5.633,1073,4.085,1224,6.882,1260,5.476,1334,6.882,1368,11.699,1626,6.246,1866,6.528,2023,6.882,2033,6.528,2044,7.356,2083,5.335,2209,6.882,2210,6.882,2211,6.882,2212,6.882,2213,6.882,2214,7.356,2215,6.882,2216,6.882,2217,6.882,2218,7.356,2219,6.882,2220,6.882,2221,6.882,2222,7.356,2223,8.075,2224,8.075,2225,7.356,2226,7.356,2227,7.356,2228,7.356,2229,7.356,2230,6.882,2231,8.075]],["keywords/310",[]],["title/311",[91,386.58,239,386.58,343,537.592]],["content/311",[]],["keywords/311",[]],["title/312",[299,758.054]],["content/312",[91,7.099,239,7.099,300,7.753,301,7.52,343,9.872]],["keywords/312",[]],["title/313",[804,639.286]],["content/313",[6,7.457,104,2.407,107,5.659,175,9.296,239,5.448,244,8.456,253,4.203,255,3.409,256,3.745,274,9.819,320,5.951,321,5.276,343,7.577,366,9.056,722,10.602,909,6.843,1074,8.285,1600,6.587,1763,11.683,1854,9.296]],["keywords/313",[]],["title/314",[225,422.212,278,492.09,927,828.933]],["content/314",[55,2.995,357,11.466,358,12.454,359,13.129,360,11.915,361,11.915,362,8.805,927,13.129]],["keywords/314",[]],["title/315",[225,422.212,243,324.483,847,599.964]],["content/315",[50,7.279,55,2.747,91,5.318,104,2.35,157,5.27,225,5.808,239,5.318,243,4.464,250,5.87,262,3.947,283,6.204,323,4.955,345,7.168,480,7.396,545,8.84,1353,9.074,1600,6.43,1619,9.074,2232,13.381,2233,13.381,2234,13.381,2235,13.381]],["keywords/315",[]],["title/316",[60,517.733]],["content/316",[]],["keywords/316",[]],["title/317",[371,988.226]],["content/317",[36,9.667,58,5.412,104,2.633,157,5.904,179,5.959,182,7.485,262,4.422,310,8.165,322,4.188,600,6.25,996,11.159,1202,11.596,1995,10.785,2236,13.657]],["keywords/317",[]],["title/318",[652,1178.119]],["content/318",[44,2.193,104,2.437,235,4.595,310,7.773,321,4.122,372,8.388,406,6.51,479,7.434,574,9.169,575,7.932,712,11.827,1188,10.734,1600,6.669,1722,10.734,2237,13.878,2238,16.312,2239,12.642,2240,12.642,2241,12.642,2242,12.642,2243,11.827]],["keywords/318",[]],["title/319",[2244,1178.119]],["content/319",[157,6.924,179,6.988,207,10.421,925,13.085,931,9.564,1015,12.647]],["keywords/319",[]],["title/320",[289,1241.986]],["content/320",[60,4.93,104,2.437,107,5.729,122,5.183,125,6.51,157,5.465,168,5.902,170,7.671,254,6.928,255,3.451,277,9.983,284,6.839,285,7.549,321,4.122,445,9.68,590,7.118,840,9.68,1187,7.932,1309,10.734,1691,10.734,1770,9.68,2245,11.827,2246,11.827]],["keywords/320",[]],["title/321",[288,1241.986]],["content/321",[44,2.468,104,2.743,107,6.448,157,6.151,168,6.642,170,8.633,208,10.895,264,10.037,322,4.363,584,11.236,840,10.895,1605,10.895,2247,14.228]],["keywords/321",[]],["title/322",[2248,1084.667]],["content/322",[8,7.732,23,5.875,55,1.939,60,3.837,67,3.346,68,5.54,164,6.938,170,5.969,196,14.819,253,2.555,254,5.392,255,2.685,256,3.68,257,5.7,262,3.186,400,3.933,575,6.173,599,5.54,600,4.502,650,5.969,709,8.039,777,7.868,1619,7.324,1867,8.039,2248,11.258,2249,11.699,2250,12.891,2251,9.205,2252,9.838,2253,9.205]],["keywords/322",[]],["title/323",[283,675.653]],["content/323",[140,9.349,179,6.386,273,10.361,283,7.45,362,9.184,446,10.896,777,8.358,806,12.99,2244,12.99,2254,14.637,2255,13.694,2256,14.637]],["keywords/323",[]],["title/324",[55,93.548,374,460.025,1870,564.523,1872,432.645,2002,509.114]],["content/324",[]],["keywords/324",[]],["title/325",[188,467.375,243,324.483,2004,786.306]],["content/325",[5,2.795,27,2.953,33,4.118,44,2.022,89,4.336,104,1.505,111,6.853,188,8.158,243,5.664,256,2.697,262,2.528,306,7.444,321,2.545,324,5.977,385,5.401,406,8.939,434,7.645,612,6.164,880,7.892,905,12.376,931,8.328,1024,7.806,1279,7.806,1590,5.811,1795,6.928,1886,6.928,1931,11.654,1935,5.661,1976,10.343,2017,8.924,2030,7.806,2069,9.895,2074,7.303,2078,5.977,2257,8.569,2258,8.569,2259,8.569,2260,6.628,2261,8.569,2262,8.569,2263,8.569,2264,8.569,2265,8.569]],["keywords/325",[]],["title/326",[44,131.777,253,197.289,2266,759.678,2267,833.969]],["content/326",[5,5.215,18,5.767,44,2.527,128,9.051,143,5.842,170,6.468,171,9.461,213,7.732,243,3.904,253,2.769,256,2.467,284,5.767,406,5.49,423,6.269,667,8.752,888,8.71,932,9.461,937,8.163,1039,4.878,1041,8.71,1115,7.073,1122,13.627,1175,9.461,1559,9.051,1879,6.809,2002,8.163,2268,11.703,2269,11.703,2270,11.703,2271,11.703,2272,9.974,2273,10.661,2274,11.703]],["keywords/326",[]],["title/327",[1108,828.933,2017,678.432,2275,886.004]],["content/327",[33,2.668,44,1.438,55,2.936,60,3.234,90,2.436,148,2.736,253,3.963,255,3.327,256,2.821,262,4.679,320,3.951,321,2.704,323,4.954,362,6.612,447,6.132,658,6.612,659,10.348,661,10.348,662,11.402,667,2.668,1073,2.809,1100,8.292,1101,2.931,1108,9.858,1109,7.758,1111,8.292,1113,4.733,1122,4.733,1620,7.758,1730,7.758,1746,4.295,1790,8.292,1791,6.173,1858,8.292,1872,3.292,1879,3.231,2002,3.873,2266,5.058,2272,4.733,2273,5.058,2275,8.292,2276,5.553,2277,5.553,2278,5.553,2279,9.103,2280,9.103,2281,9.103,2282,9.103,2283,5.553,2284,5.553,2285,5.553,2286,5.553,2287,5.553,2288,5.553,2289,5.553]],["keywords/327",[]],["title/328",[213,428.719,657,452.631,658,370.912,667,311.82,1468,482.989,1791,440.045]],["content/328",[5,2.424,8,3.039,16,2.388,18,5.658,55,2.656,103,4.905,122,2.776,136,4.584,152,3.486,207,4.405,208,8.009,213,11.914,243,3.831,245,3.981,253,4.036,255,2.855,256,3.327,262,4.138,284,3.662,322,2.076,434,2.982,435,4.492,584,5.346,600,3.098,657,11.9,658,8.02,721,4.043,722,5.748,909,3.71,910,5.748,918,4.91,996,5.532,1039,4.786,1070,5.748,1101,3.922,1105,3.866,1115,4.492,1116,4.492,1468,5.532,1791,5.04,1957,6.008,2002,5.184,2260,5.748,2290,7.432,2291,7.432,2292,7.432,2293,7.432,2294,7.432,2295,7.432,2296,7.432,2297,7.432,2298,6.77,2299,6.77,2300,6.77,2301,6.334,2302,6.77]],["keywords/328",[]],["title/329",[44,115.333,243,243.501,256,153.888,880,450.229,2017,509.114]],["content/329",[5,4.715,21,3.228,23,3.448,28,5.911,44,2.664,55,1.853,100,4.188,110,4.266,145,2.591,168,4.309,181,4.903,192,4.298,204,4.421,219,4.188,230,5.895,235,2.099,237,4.718,240,2.669,243,4.222,253,2.994,256,3.048,278,3.207,282,7.541,301,2.669,351,5.895,352,5.347,483,3.757,502,4.903,529,4.087,667,3.046,767,9.229,783,4.903,847,3.91,873,5.402,880,3.91,881,4.68,884,4.903,887,6.947,895,7.067,897,5.402,899,8.635,903,4.298,909,7.218,911,4.56,912,6.25,915,5.402,916,4.903,1103,3.251,1206,5.124,1268,9.789,1322,5.402,1372,4.903,1490,7.288,1532,5.124,1533,5.124,1556,5.402,1557,5.402,1571,4.903,1750,5.774,1751,5.774,1886,5.124,1935,6.694,2002,4.421,2303,6.339,2304,6.339,2305,6.339,2306,6.339,2307,14.458,2308,10.132]],["keywords/329",[]],["title/330",[5,380.483,385,735.287]],["content/330",[5,4.196,23,4.698,50,4.698,55,1.971,67,3.987,90,3.788,96,4.311,117,5.024,164,3.432,188,4.15,253,3.638,255,3.824,256,3.242,282,6.427,284,4.255,353,5.024,385,8.11,391,6.981,401,5.364,480,4.773,482,5.443,573,5.119,594,5.705,719,5.119,721,4.698,747,7.866,878,5.119,880,5.327,909,4.311,931,4.698,978,8.975,1037,11.721,1038,9.693,1039,3.6,1044,8.501,1101,4.557,1103,4.429,1206,6.981,1276,7.866,1624,6.981,1849,6.981,2272,7.36,2309,7.866,2310,8.635,2311,8.635,2312,7.866,2313,8.635,2314,8.635,2315,8.635,2316,8.635,2317,8.635,2318,8.635,2319,8.635,2320,8.635,2321,8.635]],["keywords/330",[]],["title/331",[905,1178.119]],["content/331",[13,4.366,44,0.757,55,2.518,57,2.897,59,8.23,65,2.362,66,3.875,68,2.458,73,6.75,98,3.021,103,1.676,122,1.79,136,2.956,168,2.038,188,2.303,205,3.707,235,1.587,243,2.687,249,3.424,255,1.192,262,4.016,268,4.251,275,10.408,293,3.707,309,3.448,318,2.222,321,1.423,322,1.339,401,1.998,425,2.739,447,2.197,467,2.529,483,2.841,493,3.09,501,6.75,529,5.194,561,3.343,582,3.021,590,2.458,612,7.495,719,2.841,812,3.166,887,2.303,903,3.25,926,4.366,931,2.607,1036,3.567,1039,1.998,1072,5.619,1101,4.251,1231,3.035,1282,5.996,1302,7.338,1334,4.085,1378,4.085,1408,3.875,1590,3.25,1795,8.424,1798,4.366,1802,13.363,1879,2.789,1928,11.605,1933,4.366,1935,3.166,1953,4.366,1976,3.875,1978,4.085,1996,4.366,2117,4.366,2125,4.366,2128,4.366,2129,4.366,2132,4.366,2142,7.338,2322,4.793,2323,4.366,2324,4.366,2325,8.88,2326,10.42,2327,4.793,2328,12.212,2329,4.793,2330,4.793,2331,4.793,2332,4.793,2333,4.793,2334,8.055,2335,8.055,2336,8.055,2337,10.42,2338,4.793,2339,8.055,2340,4.793,2341,4.793,2342,8.055,2343,4.793,2344,4.793,2345,4.793,2346,4.793,2347,4.793,2348,4.793,2349,4.793,2350,4.793,2351,4.793,2352,4.793,2353,4.793]],["keywords/331",[]],["title/332",[25,284.193,27,134.829,55,74.864,254,291.605,264,303.843,598,322.849,2354,584.12]],["content/332",[8,2.084,14,3.081,24,2.852,25,4.127,27,1.177,44,0.806,52,3.795,55,2.38,58,1.342,67,1.58,68,2.615,89,2.579,90,2.236,107,4.496,133,3.022,150,2.045,171,6.857,182,2.545,188,2.45,225,2.213,231,2.652,235,1.688,249,4.172,257,6.701,262,5.172,268,2.691,278,2.579,294,5.835,303,2.615,317,2.865,370,2.773,422,3.213,434,2.045,455,3.795,520,3.145,598,2.818,602,3.667,618,4.345,722,3.943,739,6.719,846,4.848,862,3.287,1026,3.556,1073,2.579,1101,2.691,1367,3.943,1368,3.368,1375,7.229,1566,3.667,1571,3.943,1741,4.345,1752,9.922,1770,5.917,1789,4.345,1800,6.857,1872,3.022,2033,6.857,2050,4.644,2111,4.644,2200,7.229,2207,4.644,2209,7.229,2210,7.229,2211,7.229,2212,4.345,2213,4.345,2215,4.345,2216,7.229,2217,7.229,2219,7.229,2220,9.283,2221,7.229,2225,4.644,2226,4.644,2227,4.644,2228,4.644,2229,4.644,2301,4.345,2355,8.482,2356,5.098,2357,5.098,2358,5.098,2359,5.098,2360,5.098,2361,5.098,2362,5.098,2363,5.098,2364,5.098,2365,5.098,2366,5.098,2367,5.098,2368,5.098,2369,8.482,2370,5.098,2371,8.482,2372,8.482,2373,8.482,2374,5.098,2375,5.098,2376,5.098,2377,5.098,2378,5.098,2379,5.098,2380,5.098,2381,5.098,2382,5.098,2383,5.098]],["keywords/332",[]],["title/333",[192,791.12,1822,994.267]],["content/333",[27,3.089,102,8.73,192,9.074,253,3.165,256,4.519,287,8.087,320,5.808,483,7.931,720,10.817,809,8.433,821,9.513,830,8.087,988,8.254,1072,9.333,1231,5.041,1397,9.625,1551,11.404,1822,11.404,1823,12.189,1824,11.404]],["keywords/333",[]],["title/334",[347,939.672]],["content/334",[55,2.776,102,7.586,168,6.462,230,8.842,352,8.02,430,8.14,821,8.266,988,9.373,1825,17.278,1826,13.842,1828,13.842,2384,15.196]],["keywords/334",[]],["title/335",[933,1178.119]],["content/335",[44,2.22,55,2.314,102,7.015,168,5.976,230,10.503,343,7.767,346,9.284,351,8.176,352,7.416,821,7.644,988,8.668,1829,18.166,2385,14.052,2386,14.052,2387,18.051,2388,14.052,2389,14.052]],["keywords/335",[]],["title/336",[16,234.534,44,115.333,96,364.381,256,153.888,693,350.731]],["content/336",[16,2.818,21,2.237,27,2.024,44,1.386,55,2.619,60,3.116,67,2.718,96,4.379,103,4.551,104,1.54,108,9.079,148,6.414,150,3.518,242,5.013,243,2.926,250,6.809,253,3.079,255,2.181,256,3.621,278,4.437,306,5.103,342,6.309,425,7.44,600,5.426,667,4.214,693,4.214,719,5.199,805,6.528,809,8.204,817,5.794,1038,5.528,1051,6.783,1052,7.09,1412,7.989,1559,6.783,1563,10.523,1564,10.525,1565,9.688,1566,6.309,1567,5.655,1568,6.528,1569,7.09,1570,7.475,1888,7.989,1975,7.09,2096,7.475,2390,8.771]],["keywords/336",[]],["title/337",[27,192.5,104,146.455,111,446.743,188,400.737]],["content/337",[5,4.956,27,3.508,89,7.688,104,2.669,110,6.397,188,7.302,424,10.931,434,6.096,719,9.007,830,9.184,2230,12.951,2309,13.842,2323,13.842,2391,15.196,2392,15.196,2393,15.196]],["keywords/337",[]],["title/338",[55,93.548,188,350.731,619,494.956,621,564.523,623,664.881]],["content/338",[5,3.27,24,3.371,27,2.314,44,1.584,55,2.148,104,1.761,110,6.042,111,5.371,125,4.703,131,8.106,188,4.818,203,6.32,257,7.574,262,4.233,278,5.073,370,5.455,433,8.545,434,4.022,435,6.06,483,5.943,529,6.465,612,7.213,619,6.799,627,9.134,650,7.932,693,4.818,719,5.943,862,6.465,1282,10.681,1287,7.213,1318,9.134,1320,13.072,1408,11.601,1566,7.213,1571,7.755,1863,8.545,2394,9.134,2395,10.027,2396,10.027,2397,10.027,2398,10.027,2399,10.027,2400,10.027,2401,10.027,2402,10.027]],["keywords/338",[]],["title/339",[111,446.743,188,400.737,294,446.743,396,468.599]],["content/339",[168,7.249,294,10.899,396,9.578,823,13.78,1935,11.262,2403,13.78,2404,17.046]],["keywords/339",[]],["title/340",[367,660.477]],["content/340",[44,2.852,250,6.164,253,4.27,256,3.806,367,9.038,406,6.592,434,5.637,453,8.329,693,6.752,719,8.329,931,7.644,1101,7.416,1564,9.529,1975,11.36,2405,14.052,2406,14.052,2407,12.8]],["keywords/340",[]],["title/341",[242,666.833,243,389.203]],["content/341",[]],["keywords/341",[]],["title/342",[242,666.833,243,389.203]],["content/342",[16,3.222,25,4.878,33,4.818,44,2.268,52,7.463,68,7.361,122,6.259,123,6.06,141,7.213,168,6.103,176,6.624,242,5.731,243,4.788,253,4.328,278,5.073,411,4.139,421,9.134,447,6.578,520,6.185,526,3.81,779,6.465,807,8.106,847,6.185,997,7.213,1299,8.106,1626,7.755,1721,7.463,1777,8.545,1787,8.106,1788,8.106,2325,8.545,2408,10.027,2409,9.134,2410,10.027,2411,10.027,2412,10.027,2413,10.027,2414,10.027,2415,10.027,2416,10.027,2417,10.027,2418,10.027,2419,10.027,2420,10.027]],["keywords/342",[]],["title/343",[250,511.778,256,245.969]],["content/343",[21,3.037,31,5.149,68,3.998,85,3.943,94,5.801,104,2.091,107,3.217,122,2.911,141,5.607,148,5.869,169,4.24,176,5.149,194,5.285,213,7.868,225,3.383,231,4.054,235,2.581,240,3.281,243,2.6,250,8.388,253,3.828,256,4.261,263,4.711,287,7.198,306,6.929,322,3.327,367,3.532,401,3.249,413,4.175,425,4.455,455,5.801,480,4.308,483,4.62,513,5.801,594,5.149,602,5.607,657,5.437,658,4.455,659,6.028,693,3.745,779,5.026,809,4.912,833,7.1,847,4.808,1038,4.912,1041,5.801,1105,4.054,1115,7.198,1116,4.711,1360,6.643,1559,6.028,1560,7.1,1561,7.1,1562,7.1,1563,6.301,1721,5.801,1791,8.076,2421,7.794,2422,7.794,2423,7.794]],["keywords/343",[]],["title/344",[213,770.758,657,813.748]],["content/344",[8,3.254,16,2.558,18,3.923,30,4.083,31,5.259,44,1.912,55,2.469,60,2.828,103,4.231,122,4.52,148,3.923,152,3.734,207,4.718,213,12.243,243,2.656,253,3.87,255,3.009,256,2.552,262,3.57,284,3.923,318,3.691,320,3.455,321,2.364,322,2.224,323,2.948,396,4.473,411,3.286,434,3.193,435,4.811,584,5.726,657,12.273,721,4.33,722,6.157,873,6.784,909,3.974,910,6.157,918,5.259,1070,6.157,1080,5.133,1081,5.925,1096,6.157,1105,4.141,1296,6.784,1800,6.435,1801,6.784,1806,6.784,1957,6.435,2260,6.157,2298,7.251,2299,7.251,2300,7.251,2301,6.784,2302,7.251,2424,6.435,2425,7.96,2426,12.103,2427,7.96,2428,7.96]],["keywords/344",[]],["title/345",[658,666.833,1791,791.12]],["content/345",[16,2.913,27,2.093,47,2.916,55,2.815,58,2.387,60,1.963,65,2.723,89,2.796,103,3.169,122,5.5,131,4.467,150,2.217,176,3.651,225,3.935,235,3.002,242,3.158,243,3.024,249,1.816,253,3.744,255,2.254,256,2.812,262,3.4,318,5.345,320,3.935,321,2.693,322,2.533,323,2.046,401,4.805,411,2.281,476,3.215,479,2.96,504,4.274,511,3.483,521,4.467,529,3.563,658,5.182,661,8.916,874,4.709,909,2.759,924,3.854,977,4.274,1038,5.714,1039,6.139,1044,3.651,1080,3.563,1081,4.113,1096,4.274,1105,5.996,1776,4.274,1791,3.747,1792,4.467,1793,3.651,1794,4.709,1800,4.467,1801,4.709,1806,4.709,1860,4.467,1861,4.709,2137,5.033,2429,5.526,2430,5.526,2431,9.066,2432,5.526,2433,5.526,2434,5.526,2435,5.526,2436,5.526,2437,5.526,2438,5.526,2439,5.526,2440,11.528,2441,5.526,2442,5.526,2443,5.526,2444,5.033,2445,5.526,2446,5.526,2447,5.526,2448,5.526,2449,5.526]],["keywords/345",[]],["title/346",[1564,988.226]],["content/346",[16,3.165,21,2.512,27,2.274,44,1.556,55,2.706,60,3.5,67,3.052,96,4.918,103,4.953,104,1.73,108,9.883,148,4.854,150,3.952,242,5.63,250,6.216,253,3.352,255,2.449,256,3.499,278,4.984,306,5.731,425,5.63,600,5.906,693,4.733,809,8.93,817,6.508,1038,6.208,1051,7.619,1052,7.963,1559,7.619,1563,7.963,1564,9.608,1565,10.546,1566,7.086,1567,6.352,1568,7.332,1569,7.963,1570,8.395,1975,7.963,2096,8.395]],["keywords/346",[]],["title/347",[1565,1084.667]],["content/347",[21,3.983,44,2.468,256,3.293,420,10.319,693,9.272,779,10.072,809,12.161,1116,9.44,1205,10.319,1342,12.627,1568,11.626,1571,12.081]],["keywords/347",[]],["title/348",[1038,918.482]],["content/348",[14,4.338,21,1.067,27,1.657,44,0.661,55,2.817,58,5.253,73,2.313,104,0.735,122,1.563,139,3.382,150,1.678,177,2.392,190,3.382,191,2.637,225,1.816,235,1.385,242,2.392,243,1.396,249,5.318,250,1.835,253,0.99,256,1.513,264,3.734,303,2.146,318,5.182,320,1.816,322,1.169,401,1.744,411,6.395,555,2.351,590,2.146,658,4.103,834,2.837,864,2.434,865,2.637,909,2.089,924,2.918,950,2.837,1038,2.637,1039,1.744,1044,6.227,1273,3.01,1295,13.233,1572,7.016,1574,6.117,1575,6.755,1576,3.01,1577,3.566,1579,2.837,1580,3.566,1581,5.803,1582,3.811,1583,6.117,1584,3.811,1585,10.181,1586,3.811,1587,3.811,1588,5.803,1589,3.811,1590,2.837,1591,3.811,1592,3.811,1593,3.811,1594,6.538,1595,3.811,1596,3.566,1597,3.01,1598,3.811,1599,3.811,1600,3.449,1601,4.428,1602,6.538,1603,3.811,1604,3.811,1605,5.007,1606,3.811,1607,3.811,1608,3.811,1609,3.811,1610,3.811,1611,8.586,1612,3.01,1613,7.62,1614,8.586,1615,3.811,1616,3.01,1617,3.236,1618,3.566,1619,2.837,1620,3.566,1621,3.811,1622,2.837,1687,3.382,1791,2.837,1792,3.382,1860,3.382,2069,3.236,2070,3.811,2071,3.811,2444,3.811]],["keywords/348",[]],["title/349",[21,248.045,27,224.511,104,170.808]],["content/349",[15,7.104,16,4.573,21,3.629,26,10.237,43,11.006,100,9.402,104,2.499,120,7.865,174,8.28,179,7.233,224,9.176,321,4.227,447,6.523,864,8.28,890,8.134,1074,8.601,1355,11.006,1579,9.65,1600,6.838,1622,9.65]],["keywords/349",[]],["title/350",[864,678.803,1579,791.12]],["content/350",[21,4.883,24,4.343,27,2.982,33,6.207,71,7.657,78,10.443,96,6.449,104,3.001,126,7.384,179,5.134,231,6.719,235,4.277,304,7.384,321,3.837,422,8.141,590,6.626,603,12.292,864,9.942,878,7.657,1400,9.991,1623,11.009,1624,10.443,1625,11.009,1626,9.991]],["keywords/350",[]],["title/351",[2069,1127.121]],["content/351",[16,4.515,44,2.852,65,6.924,122,5.248,253,3.324,287,8.493,321,4.174,370,7.644,374,8.856,413,7.527,434,5.637,573,8.329,1103,7.207,1131,10.459,1149,10.459,1187,8.032,1775,10.459,2002,9.802,2017,9.802,2073,11.36,2074,11.976]],["keywords/351",[]],["title/352",[1627,1241.986]],["content/352",[8,6.298,16,4.95,18,7.591,33,7.402,44,2.434,104,2.705,321,4.575,531,9.307,600,6.422,892,11.915,1628,12.454,1629,13.129,1630,11.915,1631,11.466]],["keywords/352",[]],["title/353",[2072,1241.986]],["content/353",[25,7.198,27,3.415,55,1.896,104,2.598,126,8.456,173,10.032,338,9.992,397,8.608,401,6.167,531,7.198,598,8.177,872,10.319,1105,7.696,1613,11.96,2077,13.477,2078,10.319,2079,13.477]],["keywords/353",[]],["title/354",[617,1048.3]],["content/354",[16,4.151,25,6.285,27,3.944,68,6.626,117,7.516,124,8.76,168,5.493,218,9.991,233,7.516,266,8.534,322,3.609,406,6.059,413,6.92,423,6.92,434,5.182,545,8.534,575,7.384,598,7.14,599,8.764,613,9.01,684,9.991,937,9.01,1372,9.991,1632,11.009,1633,11.009,1634,10.443,1635,11.009]],["keywords/354",[]],["title/355",[1643,1016.492]],["content/355",[27,3.564,30,5.705,55,2.579,58,5.044,60,5.485,165,4.778,235,3.682,249,5.073,318,8.221,322,4.313,323,4.119,400,4.05,411,4.591,487,7.171,489,7.542,493,7.171,582,11.176,730,6.357,777,5.785,941,4.879,1227,7.01,1643,7.758,1644,7.758,1645,8.602,1646,8.602,1647,8.602,1648,7.758,1649,10.131]],["keywords/355",[]],["title/356",[1650,1127.121]],["content/356",[27,3.377,30,5.285,55,2.679,58,4.877,60,6.045,98,6.494,145,4.212,165,4.427,235,3.411,249,4.808,318,7.888,321,3.06,322,4.087,323,3.816,400,3.752,411,4.253,468,6.107,470,6.356,582,9.222,730,5.889,777,5.36,941,4.52,1227,6.494,1643,7.187,1644,7.187,1645,7.969,1646,7.969,1647,7.969,1648,7.187,1650,7.969,1651,7.669,1652,9.386,1653,9.386,1654,9.386]],["keywords/356",[]],["title/357",[2119,1241.986]],["content/357",[5,5.157,27,3.076,30,4.644,44,1.431,55,2.382,58,4.895,60,4.734,165,3.89,235,5.236,249,4.379,318,8.618,322,3.723,323,3.353,400,3.297,411,5.501,501,8.74,526,3.441,559,5.472,667,4.351,721,4.925,730,5.175,777,4.71,881,2.931,887,6.404,941,3.972,996,6.739,1227,5.707,1400,7.003,1644,6.315,1645,7.003,1646,7.003,1647,7.003,1648,6.315,1655,5.585,1656,5.367,1874,7.32,2119,7.716,2123,12.139,2450,9.054,2451,9.054,2452,9.054]],["keywords/357",[]],["title/358",[1590,988.226]],["content/358",[5,4.634,27,2.692,30,3.889,44,1.198,55,2.864,57,4.583,58,3.742,59,4.583,60,4.143,73,8.816,165,5.01,168,3.225,235,2.511,249,3.832,268,6.154,322,3.258,323,2.808,400,4.246,401,4.861,411,4.814,430,4.062,460,4.583,467,4.002,468,8.422,470,4.678,487,4.89,489,5.142,493,4.89,495,5.455,506,5.644,526,2.882,582,4.779,721,4.125,881,2.455,887,5.604,903,5.142,941,5.116,1061,5.865,1157,5.455,1227,4.779,1590,5.142,1655,4.678,1656,4.495,1657,6.463,1658,6.463,1659,7.908,1660,10.623,1661,6.908,1662,6.908,1663,6.908,1664,6.908]],["keywords/358",[]],["title/359",[1665,1127.121]],["content/359",[14,4.916,16,2.614,18,4.008,27,3.425,30,4.172,44,1.944,55,2.277,58,3.907,60,5.271,73,10.328,120,4.496,150,3.263,165,6.374,235,2.693,249,4.042,253,1.924,256,1.715,268,7.83,269,8.849,270,6.576,322,4.144,323,3.012,400,5.402,401,3.391,411,6.827,419,5.374,435,4.916,460,4.916,600,3.391,719,4.821,730,4.649,777,4.231,881,2.633,941,6.508,1227,5.126,1484,6.054,1486,6.576,1495,6.291,1500,6.932,1511,6.932,1659,5.516,1665,6.291,1666,6.932,1667,6.576,1668,13.514,1669,11.206]],["keywords/359",[]],["title/360",[1597,1048.3]],["content/360",[5,4.595,6,7.665,15,5.762,16,2.404,30,3.837,44,1.824,55,2.66,58,3.039,60,4.1,90,3.282,143,5.762,165,6.053,249,3.792,264,3.892,268,6.091,322,3.936,323,2.771,338,4.008,400,5.131,401,4.811,409,5.219,411,4.764,449,5.382,509,5.219,511,4.715,513,5.569,514,6.376,543,3.595,546,5.569,555,4.204,586,12.008,594,4.943,730,4.276,777,3.892,812,7.625,941,6.181,978,5.219,1072,5.219,1103,3.837,1227,4.715,1597,5.382,1670,9.836,1671,10.513,1672,6.815,1673,6.815,1674,6.815,1675,6.815,1676,6.815,1677,6.815,1678,6.815,1679,6.815,1680,6.815,1681,6.815,1682,6.815,1683,6.815,1684,6.815]],["keywords/360",[]],["title/361",[1612,1048.3]],["content/361",[5,5.086,21,2.254,44,1.397,55,2.728,57,5.343,58,3.448,60,3.141,67,2.739,69,3.962,73,7.236,85,4.472,165,5.625,198,5.84,268,4.665,322,3.657,400,4.768,401,7.186,402,4.598,413,4.735,460,5.343,468,5.24,470,5.453,526,3.359,561,6.166,600,3.685,721,4.809,817,5.84,881,2.862,887,6.291,941,5.743,1016,6.579,1459,6.359,1612,6.359,1655,5.453,1656,5.24,1659,5.994,1685,7.146,1686,8.052,1687,10.584,1688,10.584,1689,7.146,1690,8.052,1691,6.837,1692,8.052,1693,7.146,1694,8.052]],["keywords/361",[]],["title/362",[1616,1048.3]],["content/362",[5,4.34,6,5.856,21,3.394,39,10.759,44,1.081,50,8.209,55,2.769,57,4.135,58,2.835,60,2.431,67,2.12,107,5.494,165,6.483,249,2.248,268,3.611,269,9.573,322,1.911,400,5.495,401,7.264,409,9.283,411,2.824,460,4.135,526,2.6,555,3.844,642,7.24,721,3.722,804,3.001,881,2.215,887,5.173,890,3.911,906,4.922,941,6.62,950,4.64,1575,4.135,1616,4.922,1617,8.326,1655,4.22,1656,4.056,1659,4.64,1695,6.233,1696,5.831,1697,6.233,1698,5.831,1699,6.233,1700,12.123,1701,6.233,1702,6.233,1703,9.806,1704,6.233,1705,6.233,1706,6.233,1707,6.233,1708,6.233]],["keywords/362",[]],["title/363",[264,758.054]],["content/363",[]],["keywords/363",[]],["title/364",[104,204.877,111,624.953]],["content/364",[24,3.631,27,4.029,44,1.707,47,5.7,55,2.237,104,3.721,106,8.801,107,6.244,110,6.368,111,9.351,127,9.753,140,6.284,143,5.392,152,7.095,192,7.324,253,2.555,256,2.277,374,6.807,406,5.066,442,6.964,543,5.19,548,12.993,579,8.731,600,4.502,1073,5.464,1709,8.731,1710,9.205]],["keywords/364",[]],["title/365",[104,204.877,1600,560.595]],["content/365",[16,2.957,24,4.534,28,3.762,44,2.522,47,4.857,55,2.253,58,4.204,71,5.455,104,3.286,125,4.317,145,3.762,150,3.692,157,5.311,164,3.658,169,5.006,179,3.658,182,4.594,231,4.787,237,6.85,250,4.037,253,2.177,256,1.94,264,4.787,290,6.419,310,5.854,321,4.006,401,3.836,423,4.93,451,5.8,590,4.72,819,5.26,979,6.241,1074,5.562,1119,7.118,1260,6.241,1353,6.241,1600,7.671,1601,5.677,1651,6.85,1711,7.843,1712,7.843,1713,7.118,1714,7.44,1715,7.44,1716,7.44,1717,7.44,1718,8.383]],["keywords/365",[]],["title/366",[27,224.511,104,170.808,890,555.947]],["content/366",[16,3.373,24,4.984,27,4.547,41,6.616,44,1.659,58,2.764,96,5.24,104,3.46,117,6.107,121,7.118,150,4.211,243,3.502,247,5.623,303,5.384,310,6.436,323,3.887,430,5.623,451,6.616,537,7.322,819,8.474,834,7.118,845,7.813,859,6,890,8.474,1517,8.486,1637,8.118,1719,8.946,1720,8.946,1721,7.813,1722,8.118,1723,8.946,1724,8.946,1725,12.635,1726,9.562,1727,9.562,1728,9.562]],["keywords/366",[]],["title/367",[804,639.286]],["content/367",[5,1.434,15,4.884,18,4.821,24,1.478,25,2.14,27,2.991,30,2.256,44,1.546,47,2.321,55,2.828,58,3.713,91,1.748,96,2.195,103,3.42,104,3.177,105,10.494,106,5.692,107,5.348,117,2.559,150,1.764,152,3.513,157,1.732,165,4.203,179,4.591,182,4.884,225,3.251,239,2.977,249,3.215,250,1.929,262,2.209,264,3.896,274,6.384,294,4.012,310,5.624,322,3.939,323,4.277,343,4.14,351,2.559,400,3.562,401,3.122,406,2.063,411,1.815,434,1.764,446,2.982,453,2.607,598,2.431,730,2.514,846,2.514,890,4.281,941,4.291,946,3.748,950,2.982,1039,1.833,1069,3.163,1076,2.658,1140,3.555,1341,3.273,1353,2.982,1362,5.793,1575,2.658,1600,3.599,1601,6.034,1622,2.982,1688,3.555,1729,6.823,1730,3.748,1731,4.006,1732,4.006,1733,4.006,1734,3.748,1735,4.006,1736,8.911,1737,7.909,1738,8.911,1739,3.748,1740,4.006,1741,3.748,1742,4.006]],["keywords/367",[]],["title/368",[1743,1327.496]],["content/368",[18,3.841,36,5.026,44,1.232,47,4.113,55,2.643,58,3.806,103,4.163,104,3.061,105,8.864,106,4.535,107,3.217,126,6.807,150,3.127,164,3.098,179,5.744,182,7.215,213,5.149,235,2.581,239,3.098,240,3.281,250,5.224,253,2.817,255,1.938,256,2.511,274,9.635,290,5.437,310,6.274,320,3.383,321,2.315,322,4.52,323,2.886,545,5.149,739,4.808,819,4.455,909,3.891,1044,5.149,1575,7.198,1600,3.745,1601,9.981,1622,5.285,1744,10.15,1745,7.1,1746,9.211,1747,7.1,1748,7.1,1749,6.643]],["keywords/368",[]],["title/369",[239,463.686,2453,1062.721]],["content/369",[239,7.942,403,12.794,435,9.998,438,11.9,522,15.069,1843,15.069,2017,11.539,2453,18.203]],["keywords/369",[]],["title/370",[290,1016.492]],["content/370",[]],["keywords/370",[]],["title/371",[299,758.054]],["content/371",[44,1.778,55,2.715,85,3.663,92,5.853,103,2.531,104,2.423,126,6.431,145,2.96,157,5.435,162,4.563,164,2.878,179,5.485,182,6.889,222,6.17,231,3.766,244,6.94,253,2.662,254,3.614,255,2.798,256,2.91,257,3.821,262,2.135,274,8.602,290,5.05,300,3.143,301,3.048,310,5.991,322,2.023,323,2.681,345,3.878,351,4.213,352,3.821,354,4.292,363,4.213,501,4.002,526,2.751,640,4.563,641,5.6,642,3.939,643,5.853,644,6.17,645,9.096,646,6.17,719,4.292,775,6.17,776,6.17,865,4.563,918,4.783,1039,3.018,1321,9.807,1411,4.91,1749,6.17,1863,6.17,1864,6.595,1865,6.94,1866,5.853,1867,5.389,1868,6.17,1869,6.595]],["keywords/371",[]],["title/372",[157,573.917]],["content/372",[6,5.312,30,5.008,44,1.543,55,2.317,58,2.571,60,3.469,67,3.026,91,3.881,104,1.715,122,3.647,157,7.118,164,5.596,253,3.331,256,2.059,281,7.268,300,4.239,301,5.928,304,8.048,353,5.681,385,6.154,386,7.024,430,5.231,479,5.231,618,12,650,5.397,736,8.895,804,4.284,988,6.023,1061,7.552,1077,7.268,1411,6.622,2454,9.765,2455,9.765,2456,12,2457,9.765,2458,9.765,2459,14.08,2460,9.765,2461,9.765,2462,9.765,2463,14.08,2464,9.765,2465,9.765]],["keywords/372",[]],["title/373",[27,269.29,2466,770.758]],["content/373",[23,6.173,27,4.137,44,1.793,55,2.297,67,3.516,148,5.592,157,4.469,164,7.679,180,6.079,262,3.347,286,8.446,320,4.926,322,3.17,401,4.73,406,5.323,437,8.776,650,6.272,724,7.915,726,9.601,728,8.776,739,6.999,805,8.446,1575,9.461,1605,7.915,1744,9.671,1995,8.163,2466,7.497,2467,11.347,2468,9.671,2469,9.671,2470,9.671]],["keywords/373",[]],["title/374",[164,386.58,650,537.592,2466,642.591]],["content/374",[24,5.108,104,2.669,164,8.219,178,10.931,180,8.14,239,6.04,338,8.14,1097,12.285,1762,11.753,2255,12.951,2466,10.039,2471,12.285,2472,15.196,2473,15.196]],["keywords/374",[]],["title/375",[310,362.014,399,599.905,479,671.528]],["content/375",[44,2.166,104,2.407,207,8.125,235,4.539,310,7.711,321,4.071,372,8.285,406,6.43,479,7.343,574,9.056,575,7.835,712,11.683,716,9.861,1188,10.602,1600,6.587,1722,10.602,2238,16.182,2239,12.487,2240,12.487,2241,12.487,2242,12.487,2243,11.683]],["keywords/375",[]],["title/376",[157,383.047,819,555.947,995,723.934]],["content/376",[100,9.647,104,3.249,157,7.285,164,7.352,321,4.337,362,8.346,464,11.293,577,10.504,819,8.346,995,10.868,1015,10.504,1283,10.868,1344,8.825,1347,10.868,1600,7.016,1619,9.902]],["keywords/376",[]],["title/377",[53,501.893,107,426.142,122,242.359,170,358.667,2474,553.041]],["content/377",[60,4.93,104,2.437,107,5.729,122,5.183,125,6.51,157,5.465,168,5.902,170,7.671,254,6.928,255,3.451,277,9.983,284,6.839,285,7.549,321,4.122,445,9.68,590,7.118,840,9.68,1187,7.932,1309,10.734,1691,10.734,1770,9.68,2245,11.827,2246,11.827]],["keywords/377",[]],["title/378",[53,501.893,107,426.142,170,358.667,322,181.278,2474,553.041]],["content/378",[104,3.04,107,7.145,157,6.817,168,7.361,170,9.567,322,4.835,1605,12.073]],["keywords/378",[]],["title/379",[164,463.686,1762,902.312]],["content/379",[24,6.005,85,9.037,157,7.034,2456,15.222,2466,11.8]],["keywords/379",[]],["title/380",[530,1016.492]],["content/380",[164,6.88,175,11.738,530,12.073,544,13.993,859,9.894,1344,10.461,2475,15.767]],["keywords/380",[]],["title/381",[2248,1187.553]],["content/381",[8,7.732,23,5.875,55,1.939,60,3.837,67,3.346,68,5.54,164,6.938,170,5.969,196,14.819,253,2.555,254,5.392,255,2.685,256,3.68,257,5.7,262,3.186,400,3.933,575,6.173,599,5.54,600,4.502,650,5.969,709,8.039,777,7.868,1619,7.324,1867,8.039,2248,11.258,2249,11.699,2250,12.891,2251,9.205,2253,9.205,2476,10.8]],["keywords/381",[]],["title/382",[710,943.138,2477,902.312]],["content/382",[31,10.177,268,8.13,338,8.252,633,13.129,710,12.454,888,11.466,931,8.38,988,9.502,1344,9.31,2407,14.033,2477,14.796,2478,17.426,2479,15.405]],["keywords/382",[]],["title/383",[1934,1048.3]],["content/383",[16,3.968,24,4.151,168,5.251,199,9.982,220,9.982,235,4.088,455,12.341,511,10.451,543,7.968,602,8.882,603,13.467,912,7.617,939,12.341,940,16.178,1344,7.463,1934,8.882,2325,10.524,2480,12.348,2481,10.524,2482,11.248,2483,11.248,2484,12.348,2485,12.348,2486,12.348]],["keywords/383",[]],["title/384",[2487,1241.986]],["content/384",[21,3.724,24,6.219,60,5.187,91,5.803,104,2.564,133,8.655,164,5.803,284,7.195,285,7.943,300,6.338,301,6.147,304,8.346,397,8.496,819,8.346,2324,13.301,2488,14.954,2489,14.602]],["keywords/384",[]],["title/385",[21,248.045,819,555.947,2490,972.648]],["content/385",[21,3.929,24,6.995,44,2.434,85,7.794,107,6.359,164,8.27,713,13.129,819,10.934,2488,12.454,2491,15.405]],["keywords/385",[]],["title/386",[397,678.803,878,691.523]],["content/386",[0,11.395,21,4.963,104,2.782,397,9.217,819,9.054,878,9.389,1187,9.054,1344,9.574,2471,12.806,2492,13.5,2493,14.43,2494,13.5]],["keywords/386",[]],["title/387",[133,691.523,2495,1062.721]],["content/387",[21,3.929,24,5.179,104,2.705,133,9.131,284,7.591,285,8.38,581,11.915,726,8.252,819,8.805,878,9.131,1187,8.805,1344,9.31,1991,12.454,2471,12.454,2495,14.033]],["keywords/387",[]],["title/388",[240,613.529]],["content/388",[91,5.516,104,3.145,110,5.843,157,7.052,164,7.117,180,7.434,204,9.68,240,7.539,253,3.283,256,2.926,300,6.024,301,5.843,304,7.932,406,6.51,434,5.567,453,8.226,761,9.983,1411,9.411,2487,11.827]],["keywords/388",[]],["title/389",[27,269.29,2466,770.758]],["content/389",[23,6.173,27,3.613,44,1.793,55,2.297,67,3.516,107,4.684,164,6.222,217,9.173,240,6.591,253,2.684,256,2.392,262,3.347,286,8.446,320,4.926,322,3.17,401,4.73,406,5.323,724,7.915,726,8.386,728,12.108,739,6.999,805,8.446,1575,10.832,1576,11.261,1605,7.915,1995,8.163,2466,7.497,2469,9.671,2470,9.671,2496,10.337,2497,9.173]],["keywords/389",[]],["title/390",[164,386.58,338,521.031,650,537.592]],["content/390",[104,3.137,164,7.099,169,9.716,240,7.52,2471,14.439]],["keywords/390",[]],["title/391",[283,675.653]],["content/391",[58,4.421,104,2.949,240,7.069,283,7.785,406,7.876,803,12.078,804,7.366,1103,8.612,1344,10.148]],["keywords/391",[]],["title/392",[21,248.045,2498,886.004,2499,972.648]],["content/392",[21,4.522,55,2.455,69,6.92,71,6.593,104,2.711,107,9.129,240,4.682,281,8.278,283,5.157,302,7.542,480,6.147,526,4.226,655,8.602,1103,5.705,1344,6.722,1476,14.063,2498,14.063,2500,11.122,2501,11.122,2502,11.122,2503,11.122,2504,11.122,2505,11.122,2506,11.122,2507,11.122,2508,11.122]],["keywords/392",[]],["title/393",[126,476.681,157,328.432,240,351.101,642,453.67]],["content/393",[6,3.745,8,2.814,24,3.636,27,2.497,33,3.308,44,2.887,55,1.386,67,2.133,89,3.483,91,2.736,93,5.867,96,3.437,104,2.89,125,6.268,126,3.935,141,4.952,157,6.482,162,4.339,164,7.522,169,3.745,182,3.437,183,5.565,191,4.339,226,5.867,240,6.375,253,1.629,256,1.451,310,2.988,321,2.045,372,4.161,399,4.952,403,5.324,479,3.688,613,4.802,642,5.884,643,5.565,644,5.867,645,10.802,646,5.867,648,5.867,650,5.979,651,5.124,693,3.308,723,5.565,724,7.545,726,3.688,775,5.867,776,9.219,1019,7.545,1223,6.271,1746,8.366,1895,9.853,1934,4.952,1957,5.565,2014,6.271,2260,5.324,2509,6.884,2510,6.884,2511,6.884,2512,6.884,2513,6.884,2514,6.884,2515,6.884,2516,9.219,2517,6.271,2518,6.884]],["keywords/393",[]],["title/394",[642,634.643,2519,1166.646]],["content/394",[56,7.248,59,5.14,67,2.635,68,4.362,90,3.731,91,5.056,104,2.234,143,4.246,155,6.875,157,6.661,164,8.049,183,6.875,204,5.932,240,6.416,253,2.012,256,1.793,310,3.692,372,5.14,385,5.36,399,6.117,479,4.556,531,4.138,575,4.861,642,10.337,648,7.248,650,7.031,651,9.468,745,7.747,746,7.747,779,5.484,872,5.932,931,4.626,995,6.33,1029,7.248,1136,7.248,1333,7.747,1757,6.33,1762,9.839,1934,6.117,2260,6.577,2516,15.433,2517,7.747,2520,8.504,2521,8.504,2522,8.504,2523,8.504,2524,8.504,2525,8.504]],["keywords/394",[]],["title/395",[164,463.686,400,424.816]],["content/395",[18,4.535,27,2.124,44,1.454,55,2.754,98,5.8,104,1.616,157,6.287,158,7.118,164,6.345,240,5.678,261,6.85,303,4.72,321,2.733,406,4.317,435,5.562,437,7.118,642,5.006,678,8.383,680,7.843,681,7.843,687,7.843,694,7.843,695,14.981,696,8.383,697,14.981,698,7.843,699,7.843,700,11.494,701,7.843,702,8.383,703,12.285,704,11.494,705,11.494,706,7.843,707,7.843,708,8.383,726,4.93,1991,7.44,2516,7.843,2526,9.203]],["keywords/395",[]],["title/396",[166,902.312,240,491.158]],["content/396",[60,4.202,91,6.401,104,2.828,110,4.979,133,7.01,157,6.342,164,6.401,166,15.206,169,6.434,180,6.335,204,8.249,240,6.78,253,2.798,256,2.493,300,5.134,301,4.979,304,6.76,338,6.335,406,5.548,434,4.744,453,7.01,761,8.507,1296,10.079,2475,10.773,2487,10.079,2527,11.827,2528,11.827,2529,11.827,2530,11.827]],["keywords/396",[]],["title/397",[27,269.29,2466,770.758]],["content/397",[23,6.434,27,3.717,44,1.869,55,2.347,107,4.882,164,6.401,217,9.561,240,6.78,253,2.798,256,2.493,262,3.488,320,5.134,322,3.304,401,4.93,724,8.249,726,6.335,728,12.456,739,7.295,805,8.802,1575,11.068,1576,11.585,1605,8.249,1995,8.507,2466,7.813,2469,10.079,2470,10.079,2496,10.773,2497,9.561]],["keywords/397",[]],["title/398",[283,675.653]],["content/398",[58,4.421,104,2.949,240,7.069,283,7.785,406,7.876,803,12.078,804,7.366,1103,8.612,1344,10.148]],["keywords/398",[]],["title/399",[531,567.611,778,1062.721]],["content/399",[104,2.782,143,7.908,164,6.296,230,9.217,240,6.669,338,8.486,397,9.217,531,9.469,777,8.24,1344,9.574,2531,15.841,2532,13.5]],["keywords/399",[]],["title/400",[286,868.326,726,624.953]],["content/400",[16,2.982,21,2.366,27,3.702,110,3.907,123,5.608,133,8.043,145,3.794,152,9.937,157,5.344,180,10.506,201,7.502,202,7.908,235,4.492,240,5.712,249,3.049,281,6.907,397,5.399,425,5.304,483,5.5,724,6.472,726,4.971,744,7.908,748,8.453,749,12.36,750,7.502,751,8.453,752,8.453,753,8.453,754,12.36,755,8.453,756,8.453,757,8.453,758,15.04,759,8.453,760,8.453,918,6.13,1260,6.292,2533,9.279,2534,9.279]],["keywords/400",[]],["title/401",[8,476.959,726,624.953]],["content/401",[16,2.957,23,5.006,27,3.685,44,1.454,50,5.006,55,2.852,60,5.671,67,2.852,89,4.656,103,5.581,104,1.616,133,10.419,136,5.677,174,5.355,177,5.26,240,3.874,255,2.288,262,4.709,286,6.85,320,6.93,640,10.061,726,7.225,1044,8.91,2468,7.843,2492,11.494,2497,7.44,2535,9.203,2536,13.487,2537,9.203,2538,9.203,2539,8.383,2540,9.203,2541,8.383]],["keywords/401",[]],["title/402",[243,389.203,847,719.629]],["content/402",[44,2.576,299,8.48,300,7.076,301,6.863,354,9.663,640,12.483,1026,13.815,1103,8.361,2542,16.302]],["keywords/402",[]],["title/403",[157,573.917]],["content/403",[55,2.7,103,5.538,157,6.238,255,3.939,372,9.574,640,9.984,652,12.806,1026,11.049,2543,14.43,2544,14.43,2545,15.841]],["keywords/403",[]],["title/404",[240,613.529]],["content/404",[55,2.7,103,5.538,240,6.669,255,3.939,283,7.344,362,9.054,640,9.984,1026,11.049,2543,14.43,2544,14.43,2546,15.841]],["keywords/404",[]],["title/405",[8,476.959,726,624.953]],["content/405",[27,2.178,55,2.909,103,6.608,240,3.972,255,2.346,262,4.777,320,7.03,323,5.086,397,5.49,400,5.001,501,7.591,504,7.298,640,5.947,739,10.972,1026,6.581,1240,6.084,1575,5.703,1576,6.787,2468,11.705,2492,8.041,2497,11.104,2539,8.595,2541,8.595,2547,9.436,2548,9.436,2549,9.436,2550,9.436,2551,9.436,2552,9.436,2553,9.436,2554,9.436]],["keywords/405",[]],["title/406",[91,386.58,239,386.58,263,587.843]],["content/406",[]],["keywords/406",[]],["title/407",[299,758.054]],["content/407",[256,3.766,263,10.795,300,7.753,301,7.52,302,12.112]],["keywords/407",[]],["title/408",[804,639.286]],["content/408",[15,6.233,21,3.184,44,1.973,55,2.686,69,7.488,103,4.365,104,2.193,239,4.962,243,4.165,255,3.105,256,2.632,263,7.546,413,6.688,425,7.137,559,7.546,864,7.265,1036,9.293,1182,10.641,1231,4.703,1321,7.265,1564,11.328,1572,9.293,1865,7.702,2555,12.486,2556,12.486,2557,12.486]],["keywords/408",[]],["title/409",[924,1016.492]],["content/409",[44,2.401,65,7.488,90,6.666,243,5.069,255,3.778,256,3.999,263,9.184,445,10.599,912,9.373,924,10.599,1182,12.951,1231,5.724,1583,12.951,2558,18.968]],["keywords/409",[]],["title/410",[243,389.203,1098,994.267]],["content/410",[5,2.953,21,2.309,55,2.98,69,5.973,103,5.528,104,1.59,106,5.268,179,3.599,235,2.998,243,3.021,244,5.585,255,3.314,256,2.81,262,2.671,263,5.472,310,3.93,323,4.935,447,4.15,500,7.32,657,11.03,864,5.268,874,7.716,882,9.295,1098,7.716,1231,3.411,1321,7.754,1337,8.248,1564,9.037,2061,8.248,2559,9.054,2560,15.814,2561,9.054,2562,9.054]],["keywords/410",[]],["title/411",[245,780.658]],["content/411",[5,4.417,44,2.14,55,1.736,85,6.852,120,7.485,121,9.183,243,4.518,263,8.185,265,10.948,266,8.947,267,12.336,268,7.147,269,12.678,270,10.948,271,9.742,272,10.948,406,6.352,726,7.254,865,8.535,912,8.353,1231,5.102,1995,9.742,2563,13.542,2564,13.542]],["keywords/411",[]],["title/412",[153,1016.492]],["content/412",[5,6.14,91,7.482,104,3.306,116,10.771,157,4.917,174,9.72,239,6.639,240,7.033,263,11.378,345,6.688,385,7.869,853,7.016,1101,6.589,1225,12.433,1824,10.641,2565,12.486,2566,10.641,2567,12.486,2568,12.486]],["keywords/412",[]],["title/413",[2569,1457.314]],["content/413",[]],["keywords/413",[]],["title/414",[44,131.777,110,351.101,263,504.029,2566,710.745]],["content/414",[44,1.408,55,2.935,89,4.508,97,6.632,110,3.751,111,4.773,121,6.042,125,4.18,143,6.575,168,3.789,179,5.234,235,2.95,263,7.959,264,6.851,265,12.665,266,8.701,271,9.473,272,10.647,278,4.508,434,6.285,519,8.117,577,6.409,581,6.891,585,9.802,714,10.186,777,4.635,821,4.847,862,8.492,939,9.802,1136,7.594,1355,6.891,2134,8.117,2230,7.594,2570,8.91,2571,11.224]],["keywords/414",[]],["title/415",[317,655.527,345,624.953]],["content/415",[]],["keywords/415",[]],["title/416",[299,758.054]],["content/416",[300,7.879,301,7.641,345,9.723,363,10.561]],["keywords/416",[]],["title/417",[804,639.286]],["content/417",[6,8.266,104,2.669,107,6.273,175,10.305,244,9.373,253,3.595,256,3.204,274,10.484,320,6.596,321,5.634,909,7.586,1074,9.184,1600,7.302,1854,10.305]],["keywords/417",[]],["title/418",[225,422.212,317,546.521,346,642.591]],["content/418",[44,1.757,55,3.058,60,3.951,255,2.765,296,5.627,317,6.249,323,4.119,345,9.499,346,10.2,363,6.471,364,8.278,365,10.131,366,7.348,367,5.041,368,9.479,369,9.479,370,6.05,371,7.542,372,6.722]],["keywords/418",[]],["title/419",[225,362.014,317,468.599,347,537.741,373,710.745]],["content/419",[55,3.035,60,5.523,123,6.789,275,9.574,281,8.361,283,5.208,317,8.735,347,10.024,362,6.421,363,6.536,364,8.361,370,6.111,371,7.618,372,6.789,373,9.574,526,4.269,1205,7.422,2466,7.422,2572,11.234,2573,11.234,2574,11.234]],["keywords/419",[]],["title/420",[225,422.212,317,546.521,350,786.306]],["content/420",[55,2.949,357,10.592,360,11.006,361,11.006,362,8.134,376,12.963,377,16.577,378,12.963,379,12.963,380,12.963,381,12.963,382,12.963,383,12.963]],["keywords/420",[]],["title/421",[225,362.014,239,331.462,348,620.716,349,645.011]],["content/421",[55,2.96,239,6.447,255,4.033,262,3.525,283,5.542,320,5.189,321,3.55,345,10.578,348,8.896,349,9.245,362,6.832,363,6.955,370,6.502,371,8.105,372,7.224,384,10.187,385,10.224,386,8.598,387,10.888]],["keywords/421",[]],["title/422",[60,517.733]],["content/422",[]],["keywords/422",[]],["title/423",[371,988.226]],["content/423",[36,8.732,44,2.14,58,5.465,104,3.095,121,9.183,157,5.333,179,5.382,182,6.761,262,3.994,310,8.505,322,3.783,371,9.183,600,5.645,996,10.08,1202,10.474,1468,10.08,1637,10.474,1995,9.742,2236,12.336]],["keywords/423",[]],["title/424",[2244,1178.119]],["content/424",[157,6.924,179,6.988,207,10.421,925,13.085,931,9.564,1015,12.647]],["keywords/424",[]],["title/425",[2575,1457.314]],["content/425",[100,9.647,104,3.249,157,7.285,164,7.352,321,4.337,362,8.346,464,11.293,577,10.504,819,8.346,995,10.868,1015,10.504,1283,10.868,1344,8.825,1347,10.868,1600,7.016,1619,9.902]],["keywords/425",[]],["title/426",[289,1241.986]],["content/426",[60,4.93,104,2.437,107,5.729,122,5.183,125,6.51,157,5.465,168,5.902,170,7.671,254,6.928,255,3.451,277,9.983,284,6.839,285,7.549,321,4.122,445,9.68,590,7.118,840,9.68,1187,7.932,1309,10.734,1691,10.734,1770,9.68,2245,11.827,2246,11.827]],["keywords/426",[]],["title/427",[288,1241.986]],["content/427",[44,2.468,104,2.743,107,6.448,157,6.151,168,6.642,170,8.633,208,10.895,264,10.037,322,4.363,584,11.236,840,10.895,1605,10.895,2247,14.228]],["keywords/427",[]],["title/428",[2248,1084.667]],["content/428",[8,7.732,23,5.875,55,1.939,60,3.837,67,3.346,68,5.54,164,6.938,170,5.969,196,14.819,253,2.555,254,5.392,255,2.685,256,3.68,257,5.7,262,3.186,400,3.933,575,6.173,599,5.54,600,4.502,650,5.969,709,8.039,777,7.868,1619,7.324,1867,8.039,2248,11.258,2249,11.699,2250,12.891,2251,9.205,2252,9.838,2253,9.205]],["keywords/428",[]],["title/429",[283,675.653]],["content/429",[140,9.349,179,6.386,273,10.361,283,7.45,362,9.184,446,10.896,777,8.358,806,12.99,2244,12.99,2254,14.637,2255,13.694,2256,14.637]],["keywords/429",[]],["title/430",[58,219.606,739,514.422,1601,514.422,2576,833.969]],["content/430",[104,3.087,872,12.263,888,13.085,889,14.983,2040,13.598,2532,14.983]],["keywords/430",[]],["title/431",[58,298.153,2249,564.523,2577,729.901,2578,729.901]],["content/431",[872,12.073,888,12.883,889,14.752,2040,13.387,2249,13.387,2532,14.752,2579,17.309]],["keywords/431",[]],["title/432",[2580,1457.314]],["content/432",[67,5.202,123,10.148,136,10.357,177,9.597,710,13.574,1344,10.148,2477,12.986,2478,15.295,2581,16.79]],["keywords/432",[]],["title/433",[91,386.58,239,386.58,853,546.521]],["content/433",[]],["keywords/433",[]],["title/434",[804,639.286]],["content/434",[55,2.911,91,8.025,239,7.524,255,3.14,296,6.388,300,5.481,301,5.316,320,5.481,321,3.75,354,7.484,531,6.143,853,10.638,854,11.739,2582,9.766,2583,10.761]],["keywords/434",[]],["title/435",[253,344.751]],["content/435",[44,2.253,50,5.406,55,2.712,92,8.034,103,3.474,104,2.929,120,5.493,126,5.68,145,4.063,179,6.628,182,4.961,213,6.566,244,8.796,253,3.945,254,4.961,255,3.546,256,3.516,257,5.245,262,2.931,274,11.099,322,2.776,482,6.263,501,5.493,1321,10.602,1854,6.739,1865,6.13,1867,7.397,1868,8.47,2488,8.034]],["keywords/435",[]],["title/436",[263,880.763]],["content/436",[55,2.511,67,4.196,148,6.673,164,5.382,179,5.382,235,4.484,244,8.353,263,8.185,264,9.168,265,10.948,266,8.947,271,9.742,272,10.948,318,6.279,322,3.783,713,11.541,996,10.08,1101,7.147,1187,7.741,2566,11.541,2584,13.542,2585,13.542]],["keywords/436",[]],["title/437",[33,560.595,2586,1062.721]],["content/437",[33,10.124,65,7.806,91,6.296,296,8.014,406,7.431,434,6.355,453,9.389,542,12.806,1205,10.465,1360,13.5,2586,14.43]],["keywords/437",[]],["title/438",[2587,1457.314]],["content/438",[65,7.388,91,5.959,107,6.189,170,8.287,235,6.227,239,5.959,264,9.784,322,4.188,343,8.287,345,8.031,363,8.723,476,8.723,600,6.25,1187,8.569,2588,13.657]],["keywords/438",[]],["title/439",[2589,1457.314]],["content/439",[65,7.591,91,6.123,107,6.359,122,5.753,170,8.514,235,5.1,239,6.123,254,7.69,343,8.514,345,8.252,363,8.963,476,8.963,600,6.422,1187,8.805,2588,14.033]],["keywords/439",[]],["title/440",[854,813.748,2590,1062.721]],["content/440",[16,4.817,33,7.204,44,2.972,145,6.129,239,5.959,287,9.061,293,11.596,296,7.585,555,8.424,854,10.457,937,10.457,1224,12.777,1845,12.777,1997,13.657,2590,13.657,2591,14.993]],["keywords/440",[]],["title/441",[67,451.543]],["content/441",[55,2.717,91,7.803,239,6.386,255,3.995,320,6.975,321,4.772,853,9.028,854,11.207,2592,16.068]],["keywords/441",[]],["title/442",[296,590.24,480,644.817]],["content/442",[]],["keywords/442",[]],["title/443",[402,606.857,2593,1062.721]],["content/443",[23,3.488,24,2.155,25,4.975,55,2.906,67,1.987,91,5.069,104,1.126,110,2.699,179,7.336,203,4.041,239,4.064,247,6.831,255,1.594,294,8.516,296,3.244,318,6.747,320,2.783,321,1.904,396,5.745,402,7.57,411,6.007,467,7.68,480,3.544,509,10.15,543,6.993,559,3.875,575,3.665,585,12.61,614,4.772,804,2.812,817,4.236,853,3.602,2403,15.769,2593,5.84,2594,5.84,2595,6.411,2596,6.411,2597,8.266,2598,10.224,2599,6.411]],["keywords/443",[]],["title/444",[182,582.414,233,678.803]],["content/444",[16,2.712,24,2.837,30,4.329,33,4.056,55,2.876,58,2.223,60,2.999,91,6.03,103,2.951,104,2.221,125,3.959,148,4.159,153,5.887,157,3.324,179,5.027,182,9.46,233,4.911,239,5.027,247,9.027,253,1.997,255,3.145,256,1.779,274,6.991,296,4.27,320,3.664,321,2.507,322,2.358,423,4.521,430,6.776,531,4.106,853,4.742,859,4.824,1103,4.329,1252,5.003,1321,7.36,1411,8.578,1600,4.056,1770,5.887,1865,9.358,2600,6.528]],["keywords/444",[]],["title/445",[104,170.808,233,565.927,321,288.878]],["content/445",[9,5.987,24,2.602,30,3.97,33,3.719,44,1.223,50,4.211,55,2.834,58,2.038,60,2.75,91,5.72,103,2.706,104,3.052,125,3.631,148,3.814,153,5.399,157,4.665,179,6.907,182,5.914,233,4.504,239,4.708,247,8.637,253,1.831,255,2.946,256,1.632,274,6.548,284,3.814,285,4.211,296,3.916,297,7.051,320,3.36,321,4.274,322,2.162,413,4.146,430,6.346,520,4.775,531,3.766,819,4.424,853,4.349,859,4.424,1019,5.399,1103,3.97,1252,4.588,1321,4.504,1411,5.249,1600,3.719,1770,5.399,1865,8.877,2600,5.987,2601,6.597]],["keywords/445",[]],["title/446",[233,678.803,294,624.953]],["content/446",[16,3.822,27,1.335,55,2.836,60,2.054,85,2.925,91,4.728,104,1.015,107,2.387,125,8.616,150,5.498,179,5.448,239,3.739,244,8.455,247,3.098,249,4.957,250,2.537,253,1.368,255,1.438,256,1.219,257,7.234,262,4.043,284,2.849,285,3.146,294,10.114,296,2.925,320,2.51,321,1.717,446,6.38,501,5.2,526,2.197,531,8.292,574,3.82,599,2.966,617,4.16,853,3.249,940,7.606,1205,3.82,1321,5.474,1347,4.304,1762,4.472,1770,4.033,2600,4.472,2602,5.782,2603,13.706,2604,13.706,2605,5.782,2606,13.706,2607,5.782,2608,5.782,2609,9.409,2610,5.782,2611,5.782]],["keywords/446",[]],["title/447",[233,565.927,296,492.09,543,467.375]],["content/447",[24,2.926,49,7.927,55,2.953,65,4.288,67,2.696,91,6.141,104,1.528,143,7.713,203,5.485,233,5.064,239,5.144,255,2.164,278,4.403,296,9.251,320,3.778,321,2.585,362,7.397,430,6.933,449,11.114,480,4.81,511,8.156,543,6.219,555,7.272,559,5.26,575,7.397,594,8.55,730,4.974,853,4.89,890,4.974,1347,6.477,2594,7.927,2600,6.731,2612,8.703,2613,8.703]],["keywords/447",[]],["title/448",[520,719.629,2614,1062.721]],["content/448",[24,3.934,55,2.826,103,4.091,104,2.055,125,5.49,179,6.355,203,7.376,253,2.769,255,2.91,256,2.467,274,8.838,284,5.767,285,6.366,294,6.269,414,9.461,520,9.863,524,10.661,575,6.689,859,6.689,862,7.546,1321,10.597,1567,7.546,1865,7.219,2614,10.661,2615,11.703,2616,11.703]],["keywords/448",[]],["title/449",[110,307.288,143,364.381,294,390.996,543,350.731,878,432.645]],["content/449",[6,5.991,55,2.445,67,3.412,90,4.831,104,1.934,143,9.522,177,6.295,188,5.292,411,6.329,434,4.418,501,10.543,505,11.859,543,7.368,546,8.197,566,9.385,573,6.528,577,11.03,578,10.032,817,13.718,2617,11.013,2618,11.013,2619,11.013,2620,11.013,2621,11.013,2622,11.013,2623,11.013]],["keywords/449",[]],["title/450",[2624,1327.496]],["content/450",[9,11.633,24,2.286,55,2.981,60,3.806,91,5.978,103,2.377,104,1.881,115,5.062,125,5.025,179,5.978,203,4.286,235,4.98,239,5.269,253,1.609,255,2.664,256,1.434,274,5.921,296,5.42,303,3.488,320,2.952,321,2.02,517,6.195,531,5.212,575,6.124,614,5.062,764,4.743,804,2.983,853,3.821,859,6.124,1321,3.957,1567,4.385,1865,4.195,2243,5.796,2582,8.286,2624,13.701,2625,13.256,2626,13.256,2627,6.801,2628,6.801,2629,13.701,2630,6.801,2631,6.801]],["keywords/450",[]],["title/451",[58,256.123,247,521.031,1077,723.934]],["content/451",[8,1.575,24,2.247,25,3.253,55,2.892,58,2.783,67,1.194,91,3.519,104,1.856,107,4.363,122,1.439,125,4.958,168,1.639,170,2.13,182,1.924,230,6.959,239,2.657,247,3.581,255,0.958,257,2.033,262,3.867,268,2.033,294,2.064,295,2.868,296,1.949,302,2.613,320,1.673,321,2.63,322,1.868,402,2.004,430,2.064,479,2.064,559,2.329,575,3.821,599,6.134,665,8.066,684,5.17,689,6.09,788,2.613,853,2.165,859,7.493,880,2.377,934,9.008,997,8.603,1039,4.985,1077,8.902,1105,3.477,1115,2.329,1167,2.284,1184,5.404,1187,9.586,1202,2.98,1208,3.51,1299,7.158,1321,3.89,1567,2.484,1787,3.115,1788,12.618,1865,4.124,1992,3.51,2409,6.09,2424,5.404,2456,3.284,2494,3.284,2582,2.98,2601,5.697,2632,3.853,2633,3.853,2634,3.853,2635,3.853,2636,3.853,2637,6.685,2638,3.853,2639,3.853,2640,6.685,2641,3.853,2642,3.853,2643,3.853,2644,3.853,2645,3.853,2646,3.51,2647,3.853,2648,3.853,2649,3.51,2650,3.51,2651,3.853,2652,6.685,2653,3.853,2654,3.853,2655,3.853,2656,3.853,2657,3.853,2658,3.853,2659,3.853,2660,3.853,2661,6.685,2662,6.685]],["keywords/451",[]],["title/452",[58,256.123,247,521.031,250,426.676]],["content/452",[8,3.576,24,2.941,25,2.574,47,2.792,55,2.942,58,4.319,60,1.88,67,1.639,91,4.445,103,3.058,121,3.588,125,4.103,230,5.09,239,3.477,247,7.707,249,5.092,250,6.311,255,1.316,262,3.298,278,2.677,295,3.938,296,2.677,320,2.297,321,2.598,322,2.444,447,2.425,853,2.973,859,7.425,1015,3.806,1105,2.752,1109,4.509,1184,4.277,1187,3.024,1299,14.377,1353,7.583,1534,4.819,1567,3.411,1757,3.938,2424,7.072,2494,7.455,2582,4.092,2601,4.509,2646,4.819,2649,4.819,2650,7.968,2663,5.291,2664,5.291,2665,8.747,2666,8.747,2667,11.834,2668,5.291,2669,5.291,2670,8.747,2671,8.747,2672,8.747,2673,8.747,2674,5.291,2675,5.291,2676,5.291,2677,5.291,2678,5.291]],["keywords/452",[]],["title/453",[812,770.758,2477,902.312]],["content/453",[9,10.822,55,2.878,58,2.549,98,8.819,103,3.384,104,2.886,125,4.541,179,6.531,235,4.633,253,2.29,255,2.407,256,2.041,274,7.734,400,3.525,460,5.851,614,7.205,633,11.925,804,4.246,812,6.395,859,7.998,925,7.205,1060,8.818,1321,5.632,1567,6.242,1865,5.971,2004,7.826,2477,12.709,2629,12.746,2679,9.68,2680,9.68,2681,9.68,2682,9.68,2683,9.68]],["keywords/453",[]],["title/454",[543,560.595,812,770.758]],["content/454",[6,5.406,24,4.794,55,2.837,65,4.897,103,3.474,104,2.504,125,4.662,179,6.628,203,6.263,253,2.351,255,2.471,256,2.095,274,7.881,523,7.397,543,9.939,574,6.566,600,4.143,812,6.566,859,8.15,1321,5.782,1567,6.408,1865,6.13,2597,11.528,2684,9.938,2685,16.677,2686,9.938,2687,14.259,2688,9.938,2689,9.938]],["keywords/454",[]],["title/455",[2583,1241.986]],["content/455",[24,3.702,55,2.784,65,5.427,103,3.85,104,2.693,150,4.418,179,6.094,203,6.941,253,2.605,255,2.738,256,2.322,274,8.475,296,5.572,543,8.476,574,7.276,600,4.591,859,6.295,1321,6.408,1567,7.101,1865,6.793,2208,10.032,2403,12.395,2571,9.385,2583,13.067,2597,12.395,2690,11.013,2691,11.013,2692,13.967]],["keywords/455",[]],["title/456",[233,678.803,310,506.424]],["content/456",[8,4.033,16,1.97,33,2.946,55,2.875,58,2.598,60,2.178,67,1.9,91,4.919,103,2.143,104,1.732,150,2.459,170,3.388,179,4.919,206,4.742,207,5.847,208,4.276,225,2.661,229,5.584,233,5.739,239,3.921,253,1.45,255,2.453,256,1.293,274,5.452,295,4.563,296,3.102,310,8.351,320,2.661,321,1.821,372,3.705,478,7.629,479,3.284,531,2.983,543,5.947,600,5.159,619,4.157,652,7.975,711,5.225,827,5.225,853,3.445,859,5.638,978,4.276,1321,3.567,1601,3.782,1865,6.085,1939,5.584,1943,5.584,2394,8.986,2403,10.006,2424,4.956,2488,4.956,2493,5.584,2571,8.407,2597,10.006,2600,4.742,2692,11.275,2693,6.131,2694,6.131,2695,6.131,2696,6.131,2697,6.131,2698,6.131,2699,9.864]],["keywords/456",[]],["title/457",[110,491.158,823,943.138]],["content/457",[55,2.76,58,4.745,110,4.826,134,10.442,143,5.723,145,4.687,177,6.552,179,6.266,224,7.392,252,8.532,264,5.963,434,4.599,501,6.336,531,5.577,543,5.508,590,5.88,714,8.866,823,12.744,853,6.441,878,9.344,939,11.733,1116,6.928,1184,9.267,2312,10.442,2474,9.77,2700,9.77,2701,15.765]],["keywords/457",[]],["title/458",[310,632.598]],["content/458",[33,7.302,207,11.243,284,7.488,285,8.266,310,8.977,669,16.165,716,10.931,1021,13.842,1033,13.842,1601,9.373,2055,13.842,2700,12.951]],["keywords/458",[]],["title/459",[127,752.25,2481,994.267]],["content/459",[41,5.571,44,1.397,55,2.801,58,2.328,60,3.141,67,2.739,91,6.198,127,11.868,138,7.534,173,5.994,235,2.927,239,5.204,255,2.198,284,4.356,285,4.809,296,4.472,320,3.837,321,3.889,400,3.219,511,8.252,531,4.301,543,6.291,559,7.913,561,6.166,603,11.217,655,6.837,758,7.534,853,4.967,869,6.359,939,6.579,940,13.937,1655,8.076,1934,9.418,2481,13.289,2482,8.052,2483,8.052,2582,6.837,2702,8.84]],["keywords/459",[]],["title/460",[104,204.877,2703,1166.646]],["content/460",[24,6.6,41,10.127,50,8.741,104,3.448,367,8.898,526,6.106,1041,11.959,1844,14.637,2700,13.694]],["keywords/460",[]],["title/461",[27,224.511,104,170.808,584,699.662]],["content/461",[44,2.114,50,7.279,55,2.241,86,7.785,106,7.785,111,7.168,242,7.648,244,8.254,257,7.062,262,3.947,266,11.553,268,7.062,271,12.579,277,9.625,1029,11.404,1077,9.959,1103,6.863,1854,9.074,2667,12.189,2704,12.189,2705,12.189,2706,13.381,2707,13.381]],["keywords/461",[]],["title/462",[543,467.375,584,699.662,1523,886.004]],["content/462",[27,1.716,41,4.684,44,1.174,55,2.951,143,9.003,396,6.452,398,8.26,411,3.068,434,2.982,543,8.198,555,6.452,585,8.546,592,10.459,593,10.459,594,7.586,595,10.459,596,10.459,939,15.422,1103,3.812,1314,6.77,2704,12.781,2705,12.781,2708,19.418,2709,11.482,2710,11.482,2711,7.432,2712,7.432,2713,7.432]],["keywords/462",[]]],"invertedIndex":[["",{"_index":55,"title":{"16":{"position":[[14,1]]},"39":{"position":[[8,1]]},"109":{"position":[[15,1]]},"117":{"position":[[15,1]]},"148":{"position":[[15,1]]},"154":{"position":[[15,1]]},"162":{"position":[[15,1]]},"175":{"position":[[15,1]]},"184":{"position":[[15,1]]},"195":{"position":[[15,1]]},"201":{"position":[[15,1]]},"209":{"position":[[15,1]]},"216":{"position":[[15,1]]},"256":{"position":[[19,1]]},"271":{"position":[[19,1]]},"275":{"position":[[19,1]]},"324":{"position":[[19,1]]},"332":{"position":[[26,1]]},"338":{"position":[[48,5]]}},"content":{"2":{"position":[[217,1],[219,2]]},"3":{"position":[[444,1],[446,1],[452,1],[480,2],[487,1],[517,2],[520,1]]},"7":{"position":[[13,1],[21,1],[23,1],[34,1],[48,1],[50,1],[62,1],[71,1],[73,1],[85,1],[87,1],[99,1],[116,1]]},"10":{"position":[[80,1],[88,1],[90,1],[101,1],[110,1],[112,1],[127,1],[129,1],[141,1],[158,1]]},"14":{"position":[[1,2],[68,1],[96,2],[175,2],[213,2],[216,1],[234,1],[236,2],[314,1]]},"15":{"position":[[101,2],[188,2],[235,1],[253,1],[255,2],[333,1]]},"17":{"position":[[56,1],[100,2],[179,2],[217,2],[264,2],[341,2],[350,2]]},"20":{"position":[[122,1],[221,2],[316,1],[318,1],[395,1],[427,1],[436,1],[820,1],[822,1],[899,1]]},"22":{"position":[[163,1],[186,1],[188,1],[212,1],[315,1],[317,1],[319,1],[321,1]]},"23":{"position":[[111,1],[113,1],[140,1],[149,1],[151,1],[175,1],[177,1],[209,1],[235,1],[244,1],[254,1],[315,3],[319,2],[322,1],[324,2],[327,2],[330,2],[333,2],[336,2],[339,2],[342,2],[345,1]]},"25":{"position":[[45,1],[76,1],[99,1],[101,1],[336,1],[338,1],[340,1],[342,1]]},"26":{"position":[[45,2],[182,1],[213,1],[242,2],[251,2],[262,1],[334,3],[338,2],[341,3],[345,3],[349,2],[352,1]]},"28":{"position":[[192,2],[199,2]]},"31":{"position":[[860,1],[975,6],[1027,1],[1136,6]]},"35":{"position":[[1170,1],[1355,1]]},"36":{"position":[[2101,1],[2267,1],[2336,1],[2550,1],[2575,1],[2585,1]]},"37":{"position":[[1790,1],[1999,1]]},"39":{"position":[[22,1],[523,2],[551,2],[599,1]]},"42":{"position":[[58,1],[81,1],[133,1],[135,1],[586,1],[728,1],[739,1],[754,1],[774,1],[896,3],[1038,3],[1060,1],[1062,1],[1064,1],[1087,1],[1152,1],[1165,1],[1184,1],[1526,2],[1617,1],[1619,1],[1690,1],[1712,1],[1837,2],[1859,1],[1972,2],[1994,1],[2104,2],[2132,1],[2246,1],[2248,1]]},"44":{"position":[[312,1],[332,1],[424,1],[426,1],[650,1],[668,1],[684,1],[686,2],[735,1],[749,1],[751,1],[807,1],[809,1],[826,1]]},"46":{"position":[[135,1],[157,1],[293,2],[315,1],[440,2],[462,1],[580,2],[608,1],[731,1],[733,1],[876,1],[899,1],[951,1],[953,1]]},"47":{"position":[[255,1],[275,1],[367,1],[369,1],[529,1],[547,1],[563,1],[565,2],[614,1],[628,1],[641,1],[658,1]]},"48":{"position":[[232,1],[263,1],[374,1],[392,1],[492,1],[494,1],[516,1],[525,1],[666,1],[668,1],[723,1],[740,1],[847,1]]},"52":{"position":[[16,1],[18,1],[20,5],[35,1],[44,1],[132,2],[135,2],[138,1]]},"53":{"position":[[57,1],[59,1],[61,5],[76,1],[95,1],[183,2],[186,3],[190,2],[193,1]]},"57":{"position":[[81,1],[147,1],[199,1],[201,1]]},"60":{"position":[[205,2]]},"71":{"position":[[247,2],[446,1],[469,1],[471,1],[495,1],[598,1],[600,1],[602,1],[604,1],[669,1],[731,1],[792,1],[810,2],[813,2]]},"72":{"position":[[377,2]]},"73":{"position":[[104,2],[137,1],[139,1],[148,1],[150,1],[174,1],[176,1],[208,1],[234,1],[243,1],[253,1],[314,3],[318,2],[321,1],[323,2],[326,2],[329,2],[332,2],[360,2],[363,2],[366,1],[431,1],[493,1],[554,1],[572,2],[575,2]]},"75":{"position":[[102,1],[134,1]]},"76":{"position":[[68,1],[126,3]]},"77":{"position":[[196,2],[208,2],[211,2],[227,2]]},"82":{"position":[[90,1],[298,1],[406,1],[417,1],[431,1]]},"83":{"position":[[289,1],[296,1],[304,1],[315,1],[329,1],[340,1],[356,1],[368,1],[376,1],[387,1],[401,1],[412,1],[424,1],[432,1],[443,1],[457,1]]},"84":{"position":[[428,1],[446,1],[481,1],[490,1],[589,1],[591,1],[761,1],[779,1],[814,1],[823,1],[929,1],[931,1]]},"87":{"position":[[242,1]]},"88":{"position":[[215,1],[243,1]]},"89":{"position":[[186,1],[200,1],[318,1],[783,2],[786,1],[811,2],[814,1],[831,1],[861,1],[1080,1],[1082,2],[1085,2]]},"90":{"position":[[130,1],[232,1],[582,1],[584,3],[600,1],[602,3],[606,1],[608,1],[774,1],[908,1]]},"91":{"position":[[158,1],[258,1],[275,3],[301,1],[319,1],[384,1]]},"93":{"position":[[1,3],[5,1],[82,1],[149,1],[212,1],[255,2],[362,2],[458,1],[485,2],[516,1],[536,1],[608,1],[629,1],[688,1],[723,2],[726,2],[729,1],[789,1],[812,1],[871,1],[906,2],[909,2],[912,1]]},"94":{"position":[[128,2],[237,1],[325,2],[379,2]]},"96":{"position":[[457,1],[476,1],[500,1],[589,1],[809,2],[818,1],[836,1],[890,1],[968,1],[1020,2],[1358,2],[1367,1],[1383,1],[1446,2]]},"100":{"position":[[324,2],[494,1],[520,1],[522,3],[526,1],[557,1],[634,1],[695,1],[697,2],[728,1],[760,2],[879,2],[1054,1],[1056,2],[1065,1],[1074,1],[1291,1],[1293,1],[1362,2],[1371,1],[1481,2]]},"108":{"position":[[99,2]]},"109":{"position":[[116,1],[142,1],[167,2],[219,1],[228,1],[230,2],[400,1]]},"116":{"position":[[103,2],[175,2]]},"117":{"position":[[118,1],[144,1],[169,2],[221,1],[230,1],[232,2],[338,2],[391,1],[393,1],[521,1],[556,1]]},"119":{"position":[[636,1],[702,1]]},"124":{"position":[[104,1],[355,1]]},"125":{"position":[[310,1],[321,3],[500,1],[510,3]]},"131":{"position":[[90,1]]},"133":{"position":[[128,1],[222,1],[638,1],[685,1],[947,1]]},"136":{"position":[[517,2],[1087,2],[1090,1],[1096,1],[1171,1],[1183,1],[1202,1],[1204,1],[1666,1]]},"138":{"position":[[958,2]]},"140":{"position":[[105,2],[125,2],[300,2]]},"141":{"position":[[417,1],[419,1],[504,2],[594,2],[679,1],[746,1],[783,2]]},"148":{"position":[[118,1],[144,1],[169,2],[221,1],[230,1],[232,2],[338,1]]},"154":{"position":[[109,1],[111,2],[192,1],[254,1],[256,2],[381,1]]},"162":{"position":[[96,1],[98,2],[166,1],[215,1],[217,2],[329,1]]},"168":{"position":[[95,2],[137,2]]},"174":{"position":[[95,2]]},"175":{"position":[[114,1],[140,1],[165,2],[217,1],[226,1],[228,2],[405,1]]},"183":{"position":[[99,2]]},"184":{"position":[[116,1],[142,1],[167,2],[219,1],[228,1],[230,2],[411,1]]},"186":{"position":[[77,1],[79,1],[88,1],[96,1],[105,1],[117,1],[132,1],[140,1],[151,1],[166,1],[182,1],[191,1],[202,1],[214,1],[227,1],[236,1],[248,1],[257,1],[266,1],[278,1],[291,1],[304,1],[318,1],[328,1],[340,1],[353,1],[363,1],[372,1],[394,1],[409,1],[424,1],[440,1],[451,1],[461,1],[471,1],[483,1],[496,1],[506,1],[517,1],[527,1],[539,1],[552,1],[561,1],[570,1]]},"193":{"position":[[97,2]]},"194":{"position":[[307,2]]},"195":{"position":[[115,1],[141,1],[166,2],[218,1],[227,1],[229,2],[408,1]]},"201":{"position":[[100,1],[102,2],[181,1],[234,1],[236,2],[352,1]]},"209":{"position":[[113,1],[137,1],[195,1],[197,1]]},"212":{"position":[[204,1]]},"215":{"position":[[111,2]]},"216":{"position":[[122,1],[148,1],[173,2],[225,1],[234,1],[236,2],[429,1],[431,1]]},"221":{"position":[[155,2],[198,2],[243,1],[274,1],[288,1],[317,3],[321,2],[330,1],[332,2]]},"223":{"position":[[22,1],[151,1],[397,1],[424,1],[451,1],[458,1],[527,1],[534,1],[611,1],[618,1],[653,2],[715,1],[722,1],[757,2],[878,2],[1015,2],[1070,1],[1107,2],[1242,1],[1289,2],[1386,1],[1390,1],[1427,2],[1542,1],[1576,2],[1581,1],[1590,1],[1608,1],[1658,1],[1767,2],[1777,1],[1789,1],[1806,1]]},"229":{"position":[[36,1],[105,2],[352,1],[405,2]]},"230":{"position":[[36,1],[105,2],[241,1],[279,1],[467,2]]},"231":{"position":[[154,1],[156,1],[167,1],[178,1],[187,1],[195,1],[204,1],[214,1],[226,1],[266,1],[268,1],[289,1],[313,1],[323,1],[334,1],[439,1],[457,1],[459,2]]},"232":{"position":[[145,2],[616,1],[674,2],[723,1],[781,2]]},"233":{"position":[[26,1],[28,1],[48,1],[60,1],[73,1],[148,2],[158,1],[166,1],[174,1],[182,1],[191,1]]},"234":{"position":[[159,1],[161,1],[184,1],[200,1],[224,1],[234,1],[245,1],[286,1],[341,2],[351,1]]},"235":{"position":[[168,1],[170,1],[189,1],[199,1],[226,1],[237,1],[248,1],[279,1],[288,1],[332,1],[341,1],[408,2],[418,1],[540,2],[675,2],[799,2]]},"237":{"position":[[367,2],[382,2],[392,2]]},"238":{"position":[[497,1],[499,1],[557,1],[566,1]]},"240":{"position":[[34,1],[43,1],[52,1],[62,1],[69,1],[195,2],[316,1],[337,1],[363,2],[373,1],[854,2],[857,1],[874,1],[903,1],[1015,2],[1018,2],[1082,1],[1134,2],[1137,1],[1154,1],[1183,1],[1295,2],[1298,2],[1379,1],[1439,2],[1442,1],[1459,1],[1488,1],[1625,2],[1628,2],[1676,1],[1734,2],[1737,1]]},"241":{"position":[[29,1],[64,1],[97,1],[184,2],[657,1],[686,1],[790,2],[793,2],[806,1],[895,2]]},"243":{"position":[[844,2],[982,2]]},"247":{"position":[[598,3]]},"249":{"position":[[927,1]]},"250":{"position":[[1110,1],[1116,1],[1123,1],[1143,1],[1160,1],[1173,1],[1192,1],[1341,1],[1343,3],[1357,1],[1374,1],[1527,2],[1693,2],[1762,2]]},"251":{"position":[[70,1],[97,1],[182,2],[185,1]]},"252":{"position":[[110,1],[121,1],[302,1],[304,1]]},"253":{"position":[[372,1],[397,1],[417,1],[446,1],[448,1],[450,1],[579,1],[581,1],[619,2],[622,3],[626,1],[721,1],[746,1],[769,1],[784,1],[791,1],[793,1],[795,1]]},"254":{"position":[[283,1],[339,2],[342,2],[520,1],[535,1],[571,2],[689,2],[692,1]]},"257":{"position":[[54,2]]},"259":{"position":[[495,1],[549,1],[602,2],[605,1],[732,1],[786,1],[829,2],[832,1]]},"261":{"position":[[383,1]]},"262":{"position":[[567,1],[594,1],[606,1],[633,1],[656,1],[663,1],[689,1],[720,1],[738,1],[750,1],[785,1],[809,1],[859,2],[869,1],[1021,1],[1023,1]]},"264":{"position":[[544,1],[546,3],[550,1],[616,1],[628,1],[666,1],[675,1],[696,1],[719,3],[733,1],[757,1],[765,1],[772,1],[835,1],[853,2],[856,3],[860,1],[875,1]]},"265":{"position":[[484,1],[508,1]]},"266":{"position":[[135,1],[224,1]]},"270":{"position":[[314,1],[398,1],[437,1],[470,2]]},"272":{"position":[[216,2]]},"274":{"position":[[310,1],[409,2]]},"276":{"position":[[194,2],[323,2]]},"283":{"position":[[779,1],[858,1],[1011,1],[1203,1]]},"289":{"position":[[86,1]]},"290":{"position":[[449,1],[472,1],[563,1],[589,1],[759,1],[941,1]]},"291":{"position":[[197,2],[240,2],[285,1],[316,1],[358,2],[361,2],[371,2]]},"292":{"position":[[190,1],[274,1]]},"293":{"position":[[394,1],[489,1],[650,1],[768,2]]},"294":{"position":[[171,1],[209,1],[256,1],[340,1]]},"295":{"position":[[394,1],[489,1],[577,1],[695,2]]},"296":{"position":[[370,1],[385,1],[404,1],[466,1]]},"297":{"position":[[299,1],[301,1],[322,1],[346,1],[356,1],[367,1],[423,1],[555,1]]},"298":{"position":[[166,1],[255,1]]},"299":{"position":[[390,1],[486,1],[567,1],[685,2]]},"300":{"position":[[159,1],[353,1]]},"301":{"position":[[281,1],[317,1],[361,1]]},"302":{"position":[[288,1],[337,1],[371,1],[520,1],[699,2]]},"303":{"position":[[320,1],[336,1],[345,1],[378,1]]},"304":{"position":[[138,1],[226,1]]},"305":{"position":[[367,2],[382,2],[392,2]]},"306":{"position":[[542,1],[544,1],[603,1]]},"308":{"position":[[480,2]]},"309":{"position":[[431,2],[811,1],[948,2],[1036,2]]},"310":{"position":[[368,1],[505,2],[593,2]]},"314":{"position":[[20,1],[43,1],[45,1],[69,1],[172,1],[174,1],[176,1],[178,1]]},"315":{"position":[[168,1],[193,2],[196,2],[205,1],[280,2]]},"322":{"position":[[138,2],[368,2]]},"327":{"position":[[411,1],[425,1],[427,2],[459,2],[477,1],[521,1],[523,1],[581,2],[636,1],[658,1],[715,1],[726,1],[735,1],[768,1],[790,1],[796,2],[805,1],[807,1],[809,1],[929,1],[943,1],[945,2],[977,2],[995,1],[1039,1],[1041,1],[1102,2],[1157,1],[1174,1],[1214,1],[1250,2],[1290,1],[1301,1],[1358,1],[1360,1]]},"328":{"position":[[260,2],[337,1],[375,1],[377,2],[393,2],[396,2],[468,1],[482,1],[495,1],[507,2],[523,1]]},"329":{"position":[[648,2],[785,2],[986,2],[1126,2]]},"330":{"position":[[333,2],[391,2],[521,2]]},"331":{"position":[[439,2],[631,2],[728,2],[956,2],[1099,1],[1144,2],[1525,2],[1554,2],[1581,2],[1606,2],[1634,2],[2092,1],[2121,1],[2128,1],[2136,2]]},"332":{"position":[[150,1],[157,1],[163,1],[193,1],[331,2],[408,2],[597,1],[723,2],[805,2],[1769,2],[2146,2]]},"334":{"position":[[70,1],[97,1],[173,2],[176,1]]},"335":{"position":[[78,1],[280,2]]},"336":{"position":[[293,2],[336,2],[381,1],[412,1],[454,2],[457,2],[467,2],[510,2]]},"338":{"position":[[89,4],[296,2],[401,2]]},"344":{"position":[[353,1],[365,1],[382,1],[395,1],[414,1],[510,1],[512,1]]},"345":{"position":[[59,1],[72,1],[74,1],[107,1],[137,1],[188,1],[226,1],[280,1],[342,1],[467,2],[526,1],[570,1],[1246,1],[1259,1],[1268,1],[1319,1],[1333,1],[1341,1],[1355,2],[1383,1],[1385,1],[1400,1],[1496,1],[1498,1]]},"346":{"position":[[253,2],[296,2],[341,1],[372,1],[414,2],[417,2],[427,2],[470,2]]},"348":{"position":[[22,1],[116,1],[191,1],[347,1],[374,1],[401,1],[408,1],[477,1],[484,1],[561,1],[568,1],[603,2],[665,1],[672,1],[707,2],[828,2],[965,2],[1020,1],[1057,2],[1192,1],[1239,2],[1336,1],[1340,1],[1377,2],[1492,1],[1526,2],[1531,1],[1540,1],[1558,1],[1608,1],[1717,2],[1727,1],[1739,1],[1756,1]]},"353":{"position":[[86,1]]},"355":{"position":[[36,1],[43,1],[114,2],[361,1],[414,2]]},"356":{"position":[[36,1],[43,1],[114,2],[250,1],[288,1],[476,2],[499,2]]},"357":{"position":[[205,1],[212,1],[233,1],[240,1],[311,2]]},"358":{"position":[[154,1],[156,1],[167,1],[178,1],[187,1],[195,1],[204,1],[214,1],[226,1],[266,1],[268,1],[289,1],[313,1],[323,1],[334,1],[439,1],[457,1],[459,2]]},"359":{"position":[[145,2],[612,1],[670,2],[719,1],[777,2]]},"360":{"position":[[26,1],[28,1],[48,1],[60,1],[73,1],[148,2],[158,1],[166,1],[174,1],[182,1],[191,1]]},"361":{"position":[[159,1],[161,1],[184,1],[200,1],[224,1],[234,1],[245,1],[286,1],[341,2],[351,1]]},"362":{"position":[[168,1],[170,1],[189,1],[199,1],[226,1],[237,1],[248,1],[279,1],[288,1],[332,1],[341,1],[409,2],[419,1],[541,2],[676,2],[800,2]]},"364":{"position":[[367,2],[382,2],[392,2]]},"365":{"position":[[497,1],[499,1],[557,1],[566,1]]},"367":{"position":[[34,1],[43,1],[52,1],[62,1],[69,1],[195,2],[316,1],[337,1],[363,2],[373,1],[854,2],[857,1],[874,1],[903,1],[1015,2],[1018,2],[1082,1],[1134,2],[1137,1],[1154,1],[1183,1],[1295,2],[1298,2],[1379,1],[1439,2],[1442,1],[1459,1],[1488,1],[1625,2],[1628,2],[1676,1],[1734,2],[1737,1]]},"368":{"position":[[29,1],[64,1],[97,1],[184,2],[649,1],[678,1],[782,2],[785,2],[798,1],[887,2]]},"371":{"position":[[93,1],[116,1],[219,1],[221,1],[520,1],[576,2],[579,2],[669,2],[847,1],[862,1],[898,2],[1016,2],[1019,1]]},"372":{"position":[[35,1],[82,1],[151,1],[353,2]]},"373":{"position":[[171,1],[179,1],[272,1]]},"381":{"position":[[138,2],[367,2]]},"389":{"position":[[198,1],[206,1],[261,1]]},"392":{"position":[[266,3],[270,6],[277,2],[294,2]]},"393":{"position":[[837,1],[1192,1]]},"395":{"position":[[240,1],[262,1],[387,2],[409,1],[522,2],[544,1],[654,2],[682,1],[796,1],[798,1]]},"397":{"position":[[198,1],[206,1],[261,1]]},"401":{"position":[[145,2],[148,2],[263,1],[265,2],[274,2],[277,2],[394,1],[396,2],[405,2],[408,2],[522,1],[524,2],[533,2]]},"403":{"position":[[87,1],[104,1],[163,2]]},"404":{"position":[[87,1],[104,1],[117,2]]},"405":{"position":[[97,1],[115,2],[179,1],[198,1],[228,1],[232,1],[237,1],[271,1],[284,1],[330,1],[332,2],[357,1],[370,1],[396,1],[413,1]]},"408":{"position":[[129,1],[213,1],[227,2],[230,2],[233,1]]},"410":{"position":[[175,1],[177,1],[187,1],[260,1],[279,2],[282,2],[285,1],[287,2],[299,1],[322,2],[325,1],[344,1],[346,1],[356,1],[369,1],[388,2],[405,3],[466,2],[469,1],[471,2],[474,1]]},"411":{"position":[[63,1]]},"414":{"position":[[7,2],[16,2],[162,2],[235,3],[245,2],[257,2],[260,2],[305,2],[334,3],[459,2],[467,1],[469,2],[500,2],[573,3],[583,2],[592,3],[596,2],[599,2]]},"418":{"position":[[67,1],[69,1],[96,1],[105,1],[107,1],[131,1],[133,1],[165,1],[191,1],[200,1],[210,1],[271,3],[275,2],[278,1],[280,2],[283,2],[286,2],[289,2],[292,2],[295,2],[298,2],[301,1]]},"419":{"position":[[48,2],[81,1],[83,1],[85,2],[88,5],[103,1],[116,1],[135,1],[145,1],[147,1],[212,1],[214,2],[283,2],[286,2],[289,2],[292,2],[295,2],[298,2],[301,1]]},"420":{"position":[[1,1],[32,1],[55,1],[57,1],[292,1],[294,1],[296,1],[298,1]]},"421":{"position":[[1,2],[138,1],[169,1],[198,2],[207,2],[218,1],[290,3],[294,2],[297,3],[301,3],[305,2],[308,1]]},"428":{"position":[[138,2],[368,2]]},"434":{"position":[[135,1],[137,2],[157,1],[168,1],[180,2],[190,1],[223,2],[226,2],[229,1]]},"435":{"position":[[277,1],[301,1],[346,2],[349,2],[402,2],[555,1],[601,2],[604,1]]},"436":{"position":[[162,2],[222,2],[225,2]]},"441":{"position":[[62,1],[94,2],[114,1]]},"443":{"position":[[170,1],[172,2],[232,1],[245,2],[313,1],[327,2],[396,1],[408,2],[471,1],[481,2],[544,1],[554,2],[634,1],[646,2],[749,1],[768,2],[850,1],[862,1],[937,1],[939,1],[950,1],[962,2],[972,1],[1029,2],[1032,2],[1035,1]]},"444":{"position":[[172,1],[191,2],[205,1],[250,2],[253,2],[267,1],[292,2],[295,2],[371,1],[373,1],[384,1],[396,2],[406,1],[462,2],[465,2],[468,1]]},"445":{"position":[[271,1],[290,2],[304,1],[369,2],[372,2],[386,1],[408,2],[411,2],[487,1],[489,1],[500,1],[512,2],[522,1],[582,2],[585,2],[588,1]]},"446":{"position":[[187,2],[314,2],[396,2],[421,2],[542,2],[648,2],[651,2],[797,2],[910,2],[923,2],[1034,2],[1113,2],[1197,1],[1199,1],[1210,1],[1222,2],[1232,1],[1267,1],[1278,1],[1301,2],[1304,2],[1307,2],[1310,2],[1313,1]]},"447":{"position":[[234,1],[241,1],[255,1],[268,1],[281,1],[295,1],[311,1],[322,1],[397,1],[399,1],[410,1],[422,2],[432,1],[467,1],[472,1],[511,2],[514,2],[517,2],[520,2],[523,1]]},"448":{"position":[[188,1],[207,2],[221,1],[269,2],[272,2],[286,1],[323,2],[326,2]]},"449":{"position":[[61,2],[120,2],[136,2],[278,1]]},"450":{"position":[[141,1],[143,1],[154,1],[166,2],[176,1],[210,2],[213,2],[216,2],[222,1],[233,1],[245,2],[255,1],[313,2],[316,2],[319,1],[483,1],[502,2],[516,1],[558,2],[561,2],[614,1],[632,3],[659,2],[662,2],[676,1],[694,3],[721,2],[724,2],[777,1],[795,3],[822,2],[825,2]]},"451":{"position":[[237,2],[338,2],[418,2],[512,2],[638,2],[683,2],[732,2],[761,1],[767,1],[787,2],[854,2],[940,2],[1256,1],[1258,1],[1269,1],[1281,2],[1291,1],[1330,1],[1335,1],[1337,2],[1422,1],[1433,1],[1435,2],[1495,2],[1559,2],[1596,5],[1614,2],[1617,2],[1667,1],[1669,2],[1733,2],[1832,2],[1835,2],[1838,2],[1841,2],[1844,2],[1847,2],[1850,1],[1884,1],[1895,1],[1897,2],[1956,5],[2012,2],[2126,2],[2181,2],[2193,2],[2196,1]]},"452":{"position":[[246,1],[248,2],[257,1],[259,2],[310,2],[319,1],[401,2],[404,2],[442,1],[493,2],[496,2],[527,1],[564,1],[617,2],[620,2],[647,1],[734,2],[737,2],[769,1],[813,1],[860,1],[873,2],[876,1],[896,1],[898,2],[1167,1],[1169,1],[1180,1],[1192,2],[1202,1],[1244,1],[1254,1],[1256,2],[1363,2],[1366,2],[1369,2],[1372,2],[1375,1]]},"453":{"position":[[154,1],[276,1],[295,2],[309,1],[351,2],[354,2],[368,1],[410,2],[413,2],[427,1],[471,1],[501,2],[504,2]]},"454":{"position":[[223,1],[242,2],[256,1],[300,2],[303,2],[317,1],[384,1],[386,2],[406,1],[469,1],[471,2]]},"455":{"position":[[216,1],[235,2],[248,1],[306,2],[309,2],[323,1],[390,2],[393,2]]},"456":{"position":[[255,1],[274,2],[287,1],[358,2],[361,2],[375,1],[459,2],[462,2],[476,1],[543,2],[546,3],[623,1],[625,1],[636,1],[648,2],[658,1],[683,1],[694,1],[753,2],[756,2],[759,2],[762,2],[765,1],[945,5],[1072,1]]},"457":{"position":[[277,1],[315,3],[325,2],[356,2],[359,1],[371,1],[373,1]]},"459":{"position":[[485,1],[487,1],[498,1],[510,2],[520,1],[555,1],[566,1],[578,2],[581,2],[584,2],[587,2],[590,1]]},"461":{"position":[[96,2],[172,2]]},"462":{"position":[[5,1],[89,2],[111,1],[155,1],[157,1],[159,2],[174,1],[195,2],[211,2],[222,1],[224,1],[226,2],[240,1],[300,1],[302,1],[304,2],[319,1],[340,2],[356,2],[367,1],[369,1],[371,2],[459,1],[468,2],[561,1]]}},"keywords":{}}],["0",{"_index":442,"title":{},"content":{"31":{"position":[[866,1],[1209,1]]},"34":{"position":[[499,2],[513,2]]},"36":{"position":[[2158,2],[2512,2]]},"77":{"position":[[158,2]]},"78":{"position":[[444,2],[458,2]]},"125":{"position":[[244,2],[427,2]]},"138":{"position":[[775,2],[789,2]]},"237":{"position":[[349,2]]},"257":{"position":[[65,1]]},"305":{"position":[[349,2]]},"364":{"position":[[349,2]]}},"keywords":{}}],["0${num",{"_index":1916,"title":{},"content":{"262":{"position":[[596,9]]}},"keywords":{}}],["0.14",{"_index":1873,"title":{"257":{"position":[[10,4]]}},"content":{"257":{"position":[[124,4]]}},"keywords":{}}],["0.70",{"_index":972,"title":{},"content":{"79":{"position":[[248,6]]}},"keywords":{}}],["00",{"_index":452,"title":{},"content":{"31":{"position":[[1273,6]]}},"keywords":{}}],["001",{"_index":80,"title":{},"content":{"2":{"position":[[694,3]]}},"keywords":{}}],["03",{"_index":1214,"title":{},"content":{"100":{"position":[[1160,2]]}},"keywords":{}}],["1",{"_index":501,"title":{},"content":{"34":{"position":[[485,2],[527,2]]},"36":{"position":[[1667,2],[1711,1],[1776,1],[1844,1],[1852,2]]},"77":{"position":[[174,2]]},"78":{"position":[[430,2],[472,2]]},"125":{"position":[[269,2],[454,2]]},"138":{"position":[[761,2],[803,2]]},"252":{"position":[[56,1]]},"254":{"position":[[191,1]]},"262":{"position":[[740,1]]},"296":{"position":[[771,1],[773,4],[797,1]]},"297":{"position":[[1424,1],[1446,1]]},"331":{"position":[[1001,2],[1557,1],[1584,1],[1609,1]]},"357":{"position":[[647,1],[649,4],[669,1]]},"371":{"position":[[413,1]]},"405":{"position":[[230,1],[235,1]]},"435":{"position":[[173,1]]},"446":{"position":[[787,3],[919,3]]},"449":{"position":[[45,2],[206,2],[300,1],[308,2]]},"457":{"position":[[368,2]]}},"keywords":{}}],["1,805,642",{"_index":971,"title":{},"content":{"79":{"position":[[230,9]]}},"keywords":{}}],["1.0",{"_index":1958,"title":{},"content":{"266":{"position":[[117,4]]},"267":{"position":[[547,4]]},"269":{"position":[[337,4]]},"270":{"position":[[295,4]]}},"keywords":{}}],["1.01",{"_index":969,"title":{},"content":{"79":{"position":[[192,6]]}},"keywords":{}}],["1.05",{"_index":975,"title":{},"content":{"79":{"position":[[304,6]]}},"keywords":{}}],["1.13",{"_index":1428,"title":{},"content":{"142":{"position":[[45,6]]}},"keywords":{}}],["1.2",{"_index":2145,"title":{},"content":{"297":{"position":[[1566,3]]}},"keywords":{}}],["1.23",{"_index":965,"title":{},"content":{"79":{"position":[[138,6]]}},"keywords":{}}],["1.37",{"_index":1456,"title":{},"content":{"142":{"position":[[613,6]]}},"keywords":{}}],["1.46",{"_index":1453,"title":{},"content":{"142":{"position":[[523,6]]}},"keywords":{}}],["1.66",{"_index":1446,"title":{},"content":{"142":{"position":[[362,6]]}},"keywords":{}}],["1.97",{"_index":1440,"title":{},"content":{"142":{"position":[[243,6]]}},"keywords":{}}],["10",{"_index":562,"title":{},"content":{"36":{"position":[[1082,2]]},"37":{"position":[[1070,2]]},"212":{"position":[[201,2]]},"262":{"position":[[591,2]]}},"keywords":{}}],["100",{"_index":1403,"title":{},"content":{"138":{"position":[[243,5]]}},"keywords":{}}],["1000",{"_index":1302,"title":{},"content":{"125":{"position":[[354,6],[543,6]]},"331":{"position":[[913,5],[2130,5]]}},"keywords":{}}],["10311",{"_index":2623,"title":{},"content":{"449":{"position":[[360,7]]}},"keywords":{}}],["10861",{"_index":955,"title":{},"content":{"79":{"position":[[24,5]]}},"keywords":{}}],["11",{"_index":505,"title":{},"content":{"34":{"position":[[516,3]]},"36":{"position":[[1855,3]]},"78":{"position":[[461,3]]},"138":{"position":[[792,3]]},"449":{"position":[[342,2],[351,3]]}},"keywords":{}}],["11"",{"_index":1215,"title":{},"content":{"100":{"position":[[1163,8]]}},"keywords":{}}],["11,649",{"_index":1449,"title":{},"content":{"142":{"position":[[422,6]]}},"keywords":{}}],["111",{"_index":578,"title":{},"content":{"36":{"position":[[1859,4]]},"449":{"position":[[355,4]]}},"keywords":{}}],["12",{"_index":502,"title":{},"content":{"34":{"position":[[488,3]]},"78":{"position":[[433,3]]},"138":{"position":[[764,3]]},"243":{"position":[[841,2],[979,2]]},"329":{"position":[[645,2]]}},"keywords":{}}],["12,065",{"_index":1445,"title":{},"content":{"142":{"position":[[347,6]]}},"keywords":{}}],["12,844",{"_index":1439,"title":{},"content":{"142":{"position":[[228,6]]}},"keywords":{}}],["12.0",{"_index":2626,"title":{},"content":{"450":{"position":[[303,9],[597,7],[760,7]]}},"keywords":{}}],["13",{"_index":2306,"title":{},"content":{"329":{"position":[[782,2]]}},"keywords":{}}],["13.0.0",{"_index":913,"title":{},"content":{"67":{"position":[[23,6]]},"244":{"position":[[34,6]]}},"keywords":{}}],["131",{"_index":961,"title":{},"content":{"79":{"position":[[105,3]]}},"keywords":{}}],["15",{"_index":1874,"title":{"257":{"position":[[18,3]]}},"content":{"257":{"position":[[155,3]]},"296":{"position":[[799,5]]},"357":{"position":[[671,5]]}},"keywords":{}}],["15.0.0",{"_index":1877,"title":{},"content":{"257":{"position":[[57,7]]}},"keywords":{}}],["151",{"_index":2621,"title":{},"content":{"449":{"position":[[315,4]]}},"keywords":{}}],["153,868",{"_index":1427,"title":{},"content":{"142":{"position":[[29,7]]}},"keywords":{}}],["15924",{"_index":1701,"title":{},"content":{"235":{"position":[[547,5]]},"362":{"position":[[548,5]]}},"keywords":{}}],["16.3",{"_index":2266,"title":{"326":{"position":[[10,4]]}},"content":{"327":{"position":[[32,4]]}},"keywords":{}}],["16.8",{"_index":2292,"title":{},"content":{"328":{"position":[[83,5]]}},"keywords":{}}],["1665",{"_index":957,"title":{},"content":{"79":{"position":[[52,4]]}},"keywords":{}}],["179jda",{"_index":930,"title":{},"content":{"71":{"position":[[737,9]]},"73":{"position":[[499,9]]}},"keywords":{}}],["19,00",{"_index":341,"title":{},"content":{"20":{"position":[[893,5]]}},"keywords":{}}],["19shaf",{"_index":2696,"title":{},"content":{"456":{"position":[[293,8]]}},"keywords":{}}],["1e3",{"_index":1797,"title":{},"content":{"250":{"position":[[1112,3]]}},"keywords":{}}],["1m",{"_index":2344,"title":{},"content":{"331":{"position":[[1655,3]]}},"keywords":{}}],["1s",{"_index":2342,"title":{},"content":{"331":{"position":[[1577,3],[1625,3]]}},"keywords":{}}],["1st",{"_index":587,"title":{},"content":{"37":{"position":[[101,5]]},"109":{"position":[[251,3]]},"117":{"position":[[253,3]]},"148":{"position":[[253,3]]},"175":{"position":[[249,3]]},"184":{"position":[[251,3]]},"195":{"position":[[250,3]]},"216":{"position":[[257,3]]},"252":{"position":[[1136,3]]},"273":{"position":[[333,3]]}},"keywords":{}}],["2",{"_index":559,"title":{},"content":{"36":{"position":[[1060,1]]},"37":{"position":[[1048,1]]},"65":{"position":[[39,1],[728,1]]},"77":{"position":[[225,1]]},"118":{"position":[[12,1]]},"243":{"position":[[23,1]]},"278":{"position":[[368,1],[619,1]]},"297":{"position":[[1525,1]]},"357":{"position":[[496,1]]},"408":{"position":[[272,1]]},"443":{"position":[[1005,3]]},"447":{"position":[[469,2]]},"451":{"position":[[1332,2]]},"459":{"position":[[247,1],[299,1]]}},"keywords":{}}],["2,694,133",{"_index":974,"title":{},"content":{"79":{"position":[[286,9]]}},"keywords":{}}],["2.0",{"_index":1960,"title":{},"content":{"266":{"position":[[206,4]]},"267":{"position":[[646,4]]},"269":{"position":[[402,4]]},"270":{"position":[[379,4]]}},"keywords":{}}],["2.05",{"_index":1450,"title":{},"content":{"142":{"position":[[437,6]]}},"keywords":{}}],["2.57",{"_index":1443,"title":{},"content":{"142":{"position":[[301,6]]}},"keywords":{}}],["2.83",{"_index":1436,"title":{},"content":{"142":{"position":[[185,6]]}},"keywords":{}}],["20",{"_index":2702,"title":{},"content":{"459":{"position":[[377,2]]}},"keywords":{}}],["2000",{"_index":2338,"title":{},"content":{"331":{"position":[[1101,5]]}},"keywords":{}}],["2016</div>",{"_index":2094,"title":{},"content":{"290":{"position":[[1018,16]]}},"keywords":{}}],["21",{"_index":2620,"title":{},"content":{"449":{"position":[[311,3]]}},"keywords":{}}],["21,661,621",{"_index":1431,"title":{},"content":{"142":{"position":[[97,10]]}},"keywords":{}}],["23",{"_index":503,"title":{},"content":{"34":{"position":[[502,3]]},"78":{"position":[[447,3]]},"138":{"position":[[778,3]]}},"keywords":{}}],["23/07/2020",{"_index":340,"title":{},"content":{"20":{"position":[[869,10]]}},"keywords":{}}],["24",{"_index":506,"title":{},"content":{"34":{"position":[[530,3]]},"78":{"position":[[475,3]]},"138":{"position":[[806,3]]},"231":{"position":[[754,3]]},"250":{"position":[[1125,2]]},"358":{"position":[[754,3]]}},"keywords":{}}],["253,612",{"_index":968,"title":{},"content":{"79":{"position":[[176,7]]}},"keywords":{}}],["29,940",{"_index":963,"title":{},"content":{"79":{"position":[[123,6]]}},"keywords":{}}],["2nd",{"_index":588,"title":{},"content":{"37":{"position":[[107,4]]}},"keywords":{}}],["2s",{"_index":2341,"title":{},"content":{"331":{"position":[[1550,3]]}},"keywords":{}}],["3",{"_index":561,"title":{},"content":{"36":{"position":[[1080,1]]},"37":{"position":[[1068,1]]},"141":{"position":[[779,3],[805,2]]},"234":{"position":[[612,2]]},"296":{"position":[[37,1]]},"331":{"position":[[121,1]]},"361":{"position":[[612,2]]},"459":{"position":[[575,2]]}},"keywords":{}}],["30x",{"_index":1416,"title":{},"content":{"141":{"position":[[253,3]]}},"keywords":{}}],["3166",{"_index":1707,"title":{},"content":{"235":{"position":[[806,4]]},"362":{"position":[[807,4]]}},"keywords":{}}],["3600",{"_index":1798,"title":{},"content":{"250":{"position":[[1118,4]]},"331":{"position":[[2123,4]]}},"keywords":{}}],["364",{"_index":959,"title":{},"content":{"79":{"position":[[79,3]]}},"keywords":{}}],["3rd",{"_index":201,"title":{},"content":{"10":{"position":[[283,3]]},"37":{"position":[[112,4]]},"44":{"position":[[891,3]]},"400":{"position":[[64,3]]}},"keywords":{}}],["4",{"_index":560,"title":{},"content":{"36":{"position":[[1062,1]]},"37":{"position":[[1050,1]]}},"keywords":{}}],["4.06",{"_index":1432,"title":{},"content":{"142":{"position":[[116,6]]}},"keywords":{}}],["40",{"_index":831,"title":{"51":{"position":[[26,4]]}},"content":{"51":{"position":[[232,5]]}},"keywords":{}}],["402",{"_index":35,"title":{},"content":{"1":{"position":[[465,3]]},"101":{"position":[[69,3]]},"123":{"position":[[417,4]]}},"keywords":{}}],["409,770",{"_index":1442,"title":{},"content":{"142":{"position":[[285,7]]}},"keywords":{}}],["4217",{"_index":1705,"title":{},"content":{"235":{"position":[[682,4]]},"362":{"position":[[683,4]]}},"keywords":{}}],["47",{"_index":1336,"title":{},"content":{"133":{"position":[[255,2]]}},"keywords":{}}],["48",{"_index":2351,"title":{},"content":{"331":{"position":[[2118,2]]}},"keywords":{}}],["5",{"_index":2092,"title":{},"content":{"290":{"position":[[1010,1]]}},"keywords":{}}],["50",{"_index":2140,"title":{},"content":{"297":{"position":[[1326,3]]}},"keywords":{}}],["59",{"_index":2141,"title":{},"content":{"297":{"position":[[1402,2]]}},"keywords":{}}],["597,153",{"_index":1452,"title":{},"content":{"142":{"position":[[507,7]]}},"keywords":{}}],["60",{"_index":2343,"title":{},"content":{"331":{"position":[[1637,2]]}},"keywords":{}}],["684,263",{"_index":1455,"title":{},"content":{"142":{"position":[[597,7]]}},"keywords":{}}],["719,056",{"_index":1435,"title":{},"content":{"142":{"position":[[169,7]]}},"keywords":{}}],["78",{"_index":1437,"title":{},"content":{"142":{"position":[[192,3],[444,3]]}},"keywords":{}}],["79",{"_index":1444,"title":{},"content":{"142":{"position":[[308,3]]}},"keywords":{}}],["81",{"_index":1447,"title":{},"content":{"142":{"position":[[369,3]]}},"keywords":{}}],["84",{"_index":1433,"title":{},"content":{"142":{"position":[[123,3]]}},"keywords":{}}],["85",{"_index":1429,"title":{},"content":{"142":{"position":[[52,3],[250,3]]}},"keywords":{}}],["89",{"_index":966,"title":{},"content":{"79":{"position":[[145,3]]},"142":{"position":[[620,3]]}},"keywords":{}}],["9",{"_index":2659,"title":{},"content":{"451":{"position":[[2096,5]]}},"keywords":{}}],["90",{"_index":1454,"title":{},"content":{"142":{"position":[[530,3]]}},"keywords":{}}],["92",{"_index":970,"title":{},"content":{"79":{"position":[[199,3]]}},"keywords":{}}],["94",{"_index":973,"title":{},"content":{"79":{"position":[[255,3]]}},"keywords":{}}],["95",{"_index":976,"title":{},"content":{"79":{"position":[[311,3]]}},"keywords":{}}],["__setdefaulttimezon",{"_index":1278,"title":{},"content":{"119":{"position":[[225,20],[334,20],[588,23]]}},"keywords":{}}],["abil",{"_index":785,"title":{},"content":{"48":{"position":[[87,7]]}},"keywords":{}}],["abov",{"_index":303,"title":{},"content":{"20":{"position":[[26,6]]},"36":{"position":[[151,5]]},"37":{"position":[[188,5]]},"42":{"position":[[1635,5]]},"51":{"position":[[80,6]]},"67":{"position":[[289,6]]},"92":{"position":[[59,6]]},"94":{"position":[[24,5]]},"97":{"position":[[54,5]]},"101":{"position":[[692,5]]},"223":{"position":[[1857,5]]},"239":{"position":[[475,6]]},"244":{"position":[[300,6]]},"248":{"position":[[384,5]]},"259":{"position":[[1068,6]]},"279":{"position":[[17,6]]},"292":{"position":[[134,6]]},"294":{"position":[[134,6]]},"296":{"position":[[320,5]]},"332":{"position":[[942,6]]},"348":{"position":[[1935,5]]},"366":{"position":[[475,6]]},"395":{"position":[[130,6]]},"450":{"position":[[35,5]]}},"keywords":{}}],["abus",{"_index":2479,"title":{},"content":{"382":{"position":[[136,6]]}},"keywords":{}}],["ac",{"_index":2503,"title":{},"content":{"392":{"position":[[203,2]]}},"keywords":{}}],["accept",{"_index":730,"title":{},"content":{"44":{"position":[[287,7]]},"47":{"position":[[230,7]]},"229":{"position":[[256,7]]},"230":{"position":[[371,7]]},"232":{"position":[[266,7]]},"233":{"position":[[420,7]]},"240":{"position":[[514,7]]},"261":{"position":[[440,7]]},"270":{"position":[[130,7]]},"297":{"position":[[1858,8]]},"355":{"position":[[265,7]]},"356":{"position":[[380,7]]},"357":{"position":[[539,7]]},"359":{"position":[[266,7]]},"360":{"position":[[420,7]]},"367":{"position":[[514,7]]},"447":{"position":[[183,6]]}},"keywords":{}}],["access",{"_index":1115,"title":{},"content":{"90":{"position":[[924,6]]},"92":{"position":[[118,6]]},"93":{"position":[[54,6]]},"101":{"position":[[47,6]]},"249":{"position":[[455,6]]},"250":{"position":[[511,8]]},"283":{"position":[[356,6]]},"293":{"position":[[259,6]]},"295":{"position":[[259,6]]},"299":{"position":[[259,6]]},"326":{"position":[[250,6]]},"328":{"position":[[205,6]]},"343":{"position":[[450,6],[544,6]]},"451":{"position":[[167,13]]}},"keywords":{}}],["accord",{"_index":29,"title":{},"content":{"1":{"position":[[356,10]]},"264":{"position":[[455,9]]}},"keywords":{}}],["accordingli",{"_index":205,"title":{},"content":{"10":{"position":[[386,12]]},"67":{"position":[[324,12]]},"244":{"position":[[335,12]]},"245":{"position":[[416,12]]},"331":{"position":[[1886,12]]}},"keywords":{}}],["accur",{"_index":1280,"title":{},"content":{"119":{"position":[[295,8]]}},"keywords":{}}],["achiev",{"_index":2514,"title":{},"content":{"393":{"position":[[682,7]]}},"keywords":{}}],["acr",{"_index":1496,"title":{},"content":{"186":{"position":[[81,6]]}},"keywords":{}}],["action",{"_index":1844,"title":{},"content":{"252":{"position":[[767,6]]},"460":{"position":[[88,10]]}},"keywords":{}}],["actual",{"_index":134,"title":{},"content":{"5":{"position":[[5,6]]},"457":{"position":[[160,8]]}},"keywords":{}}],["ad",{"_index":342,"title":{"21":{"position":[[0,6]]},"118":{"position":[[0,6]]},"258":{"position":[[26,6]]}},"content":{"87":{"position":[[134,6]]},"259":{"position":[[224,5]]},"269":{"position":[[24,5]]},"336":{"position":[[7,5]]}},"keywords":{}}],["adapt",{"_index":22,"title":{},"content":{"1":{"position":[[246,6]]}},"keywords":{}}],["add",{"_index":352,"title":{"259":{"position":[[0,3]]}},"content":{"22":{"position":[[24,3],[118,3]]},"42":{"position":[[1,3]]},"44":{"position":[[937,3]]},"46":{"position":[[819,3]]},"73":{"position":[[9,3]]},"90":{"position":[[489,3],[686,3]]},"107":{"position":[[174,3]]},"115":{"position":[[176,3]]},"116":{"position":[[178,3]]},"173":{"position":[[172,3]]},"182":{"position":[[174,3]]},"192":{"position":[[173,3]]},"214":{"position":[[180,3]]},"251":{"position":[[1,3]]},"252":{"position":[[77,3],[312,3]]},"261":{"position":[[29,3]]},"270":{"position":[[217,3]]},"329":{"position":[[989,3],[1129,3]]},"334":{"position":[[1,3]]},"335":{"position":[[31,3]]},"371":{"position":[[36,3]]}},"keywords":{}}],["addit",{"_index":170,"title":{"377":{"position":[[2,10]]},"378":{"position":[[2,10]]}},"content":{"7":{"position":[[262,10]]},"35":{"position":[[1273,10]]},"82":{"position":[[810,10]]},"320":{"position":[[1,10]]},"321":{"position":[[1,10]]},"322":{"position":[[16,10]]},"326":{"position":[[91,8]]},"377":{"position":[[1,10]]},"378":{"position":[[1,10]]},"381":{"position":[[16,10]]},"426":{"position":[[1,10]]},"427":{"position":[[1,10]]},"428":{"position":[[16,10]]},"438":{"position":[[93,10]]},"439":{"position":[[93,10]]},"451":{"position":[[1359,10]]},"456":{"position":[[1118,10]]}},"keywords":{}}],["addition",{"_index":61,"title":{},"content":{"2":{"position":[[352,13]]}},"keywords":{}}],["additionalcomponentnam",{"_index":289,"title":{"320":{"position":[[0,25]]},"426":{"position":[[0,25]]}},"content":{"17":{"position":[[572,24]]}},"keywords":{}}],["additionalfunctionnam",{"_index":288,"title":{"321":{"position":[[0,24]]},"427":{"position":[[0,24]]}},"content":{"17":{"position":[[546,24]]}},"keywords":{}}],["addlocaledata",{"_index":1886,"title":{"259":{"position":[[12,15]]}},"content":{"259":{"position":[[17,15],[661,15]]},"325":{"position":[[1,13]]},"329":{"position":[[481,13]]}},"keywords":{}}],["addlocaledata(reactintllocaledata[lang",{"_index":1899,"title":{},"content":{"259":{"position":[[788,40]]}},"keywords":{}}],["addon",{"_index":1071,"title":{},"content":{"88":{"position":[[15,6]]},"89":{"position":[[621,6]]},"99":{"position":[[73,5]]}},"keywords":{}}],["address",{"_index":1134,"title":{},"content":{"93":{"position":[[181,7]]}},"keywords":{}}],["adjust",{"_index":2132,"title":{},"content":{"297":{"position":[[950,6]]},"331":{"position":[[228,8]]}},"keywords":{}}],["advanc",{"_index":803,"title":{"49":{"position":[[0,8]]},"139":{"position":[[0,8]]}},"content":{"50":{"position":[[427,8]]},"253":{"position":[[799,8],[819,8]]},"282":{"position":[[351,8]]},"391":{"position":[[65,8]]},"398":{"position":[[65,8]]}},"keywords":{}}],["advantag",{"_index":1878,"title":{},"content":{"257":{"position":[[81,9]]}},"keywords":{}}],["ae",{"_index":83,"title":{},"content":{"2":{"position":[[742,2]]}},"keywords":{}}],["against",{"_index":713,"title":{},"content":{"42":{"position":[[2381,7]]},"385":{"position":[[184,8]]},"436":{"position":[[17,7]]}},"keywords":{}}],["againstidwhitelist",{"_index":2697,"title":{},"content":{"456":{"position":[[814,19]]}},"keywords":{}}],["aggreg",{"_index":178,"title":{},"content":{"8":{"position":[[56,10]]},"10":{"position":[[208,10]]},"11":{"position":[[84,10]]},"81":{"position":[[452,10]]},"82":{"position":[[549,9]]},"83":{"position":[[228,9]]},"374":{"position":[[54,10]]}},"keywords":{}}],["ago",{"_index":2142,"title":{},"content":{"297":{"position":[[1413,4],[1455,4],[1535,4],[1578,4]]},"331":{"position":[[1629,4],[1659,4]]}},"keywords":{}}],["ago"",{"_index":1662,"title":{},"content":{"231":{"position":[[550,11]]},"358":{"position":[[550,11]]}},"keywords":{}}],["aim",{"_index":1133,"title":{},"content":{"93":{"position":[[174,3]]},"123":{"position":[[14,4]]}},"keywords":{}}],["algorithm",{"_index":1722,"title":{},"content":{"239":{"position":[[221,10]]},"307":{"position":[[221,10]]},"318":{"position":[[192,10]]},"366":{"position":[[221,10]]},"375":{"position":[[193,10]]}},"keywords":{}}],["alia",{"_index":840,"title":{},"content":{"52":{"position":[[37,6]]},"53":{"position":[[8,5],[35,6],[78,7]]},"140":{"position":[[478,5]]},"320":{"position":[[205,5]]},"321":{"position":[[104,5]]},"377":{"position":[[204,5]]},"426":{"position":[[205,5]]},"427":{"position":[[104,5]]}},"keywords":{}}],["align",{"_index":1997,"title":{},"content":{"270":{"position":[[57,7]]},"440":{"position":[[168,6]]}},"keywords":{}}],["allow",{"_index":600,"title":{},"content":{"38":{"position":[[79,6]]},"44":{"position":[[187,6]]},"46":{"position":[[1144,6]]},"133":{"position":[[895,5]]},"141":{"position":[[88,5]]},"221":{"position":[[6,6]]},"226":{"position":[[1,6]]},"232":{"position":[[537,5]]},"234":{"position":[[387,6]]},"237":{"position":[[157,6]]},"247":{"position":[[621,6]]},"249":{"position":[[192,6]]},"259":{"position":[[894,6]]},"272":{"position":[[230,5]]},"273":{"position":[[252,5],[376,5],[503,8],[619,5]]},"283":{"position":[[93,6]]},"287":{"position":[[1,6]]},"288":{"position":[[1,6]]},"293":{"position":[[224,8]]},"295":{"position":[[224,8]]},"298":{"position":[[834,5]]},"299":{"position":[[224,8]]},"305":{"position":[[157,6]]},"309":{"position":[[453,8]]},"310":{"position":[[28,6],[898,6]]},"317":{"position":[[115,6]]},"322":{"position":[[47,6]]},"328":{"position":[[192,5]]},"336":{"position":[[46,6],[116,6]]},"346":{"position":[[6,6],[76,6]]},"352":{"position":[[1,6]]},"359":{"position":[[533,5]]},"361":{"position":[[387,6]]},"364":{"position":[[157,6]]},"381":{"position":[[47,6]]},"423":{"position":[[115,6]]},"428":{"position":[[47,6]]},"438":{"position":[[71,6]]},"439":{"position":[[71,6]]},"454":{"position":[[155,5]]},"455":{"position":[[148,5]]},"456":{"position":[[891,6],[951,6],[996,6]]}},"keywords":{}}],["allowlist",{"_index":2698,"title":{},"content":{"456":{"position":[[898,9]]}},"keywords":{}}],["allth",{"_index":2472,"title":{},"content":{"374":{"position":[[79,6]]}},"keywords":{}}],["alon",{"_index":492,"title":{},"content":{"34":{"position":[[314,5],[415,5]]},"78":{"position":[[259,5],[360,5]]},"138":{"position":[[590,5],[691,5]]}},"keywords":{}}],["along",{"_index":181,"title":{},"content":{"8":{"position":[[133,5]]},"11":{"position":[[161,5]]},"65":{"position":[[717,5]]},"243":{"position":[[1021,5],[1149,5]]},"329":{"position":[[824,5]]}},"keywords":{}}],["alphabet",{"_index":2548,"title":{},"content":{"405":{"position":[[135,14]]}},"keywords":{}}],["alreadi",{"_index":1467,"title":{},"content":{"154":{"position":[[128,7]]},"162":{"position":[[115,7]]},"201":{"position":[[119,7]]},"272":{"position":[[276,7]]}},"keywords":{}}],["alt",{"_index":2661,"title":{},"content":{"451":{"position":[[2135,3],[2173,7]]}},"keywords":{}}],["alt="imag",{"_index":2647,"title":{},"content":{"451":{"position":[[900,15]]}},"keywords":{}}],["alt={intl.formatmessage({defaultmessag",{"_index":2638,"title":{},"content":{"451":{"position":[[558,40]]}},"keywords":{}}],["altern",{"_index":1468,"title":{"328":{"position":[[23,11]]}},"content":{"154":{"position":[[259,14]]},"162":{"position":[[220,14]]},"201":{"position":[[239,14]]},"328":{"position":[[125,11]]},"423":{"position":[[193,14]]}},"keywords":{}}],["alway",{"_index":430,"title":{},"content":{"31":{"position":[[690,6]]},"36":{"position":[[1699,6]]},"81":{"position":[[529,7]]},"83":{"position":[[69,6]]},"119":{"position":[[249,6]]},"231":{"position":[[280,8]]},"239":{"position":[[162,6]]},"250":{"position":[[236,6]]},"251":{"position":[[32,6]]},"274":{"position":[[440,6]]},"282":{"position":[[152,6]]},"297":{"position":[[313,8]]},"307":{"position":[[162,6]]},"334":{"position":[[32,6]]},"358":{"position":[[280,8]]},"366":{"position":[[162,6]]},"372":{"position":[[329,6]]},"444":{"position":[[510,6],[642,6]]},"445":{"position":[[633,6],[768,6]]},"447":{"position":[[33,6],[105,6]]},"451":{"position":[[1633,6]]}},"keywords":{}}],["am/pm",{"_index":498,"title":{},"content":{"34":{"position":[[465,5]]},"78":{"position":[[410,5]]},"138":{"position":[[741,5]]}},"keywords":{}}],["amaz",{"_index":1814,"title":{},"content":{"250":{"position":[[1673,8]]}},"keywords":{}}],["ambient",{"_index":2611,"title":{},"content":{"446":{"position":[[1459,7]]}},"keywords":{}}],["amp",{"_index":235,"title":{},"content":{"12":{"position":[[276,5]]},"21":{"position":[[75,5]]},"51":{"position":[[39,5]]},"65":{"position":[[33,5],[87,5],[767,5]]},"81":{"position":[[446,5]]},"83":{"position":[[690,5]]},"96":{"position":[[1108,5]]},"107":{"position":[[332,5]]},"115":{"position":[[390,5]]},"119":{"position":[[441,5]]},"152":{"position":[[162,5]]},"160":{"position":[[136,5]]},"173":{"position":[[326,5]]},"182":{"position":[[384,5],[673,5]]},"192":{"position":[[329,5]]},"214":{"position":[[350,5]]},"220":{"position":[[236,5]]},"223":{"position":[[1819,5]]},"225":{"position":[[16,5]]},"229":{"position":[[81,5]]},"230":{"position":[[81,5]]},"231":{"position":[[433,5]]},"232":{"position":[[121,5]]},"241":{"position":[[402,5]]},"243":{"position":[[17,5],[71,5],[828,5]]},"272":{"position":[[576,5]]},"273":{"position":[[22,5]]},"274":{"position":[[62,5],[476,5]]},"285":{"position":[[16,5]]},"290":{"position":[[443,5]]},"292":{"position":[[184,5]]},"293":{"position":[[388,5]]},"294":{"position":[[250,5]]},"295":{"position":[[388,5]]},"296":{"position":[[364,5]]},"297":{"position":[[417,5]]},"298":{"position":[[160,5]]},"299":{"position":[[384,5]]},"300":{"position":[[153,5]]},"301":{"position":[[275,5]]},"302":{"position":[[282,5]]},"303":{"position":[[314,5]]},"304":{"position":[[132,5]]},"309":{"position":[[100,5]]},"318":{"position":[[203,5]]},"329":{"position":[[632,5]]},"331":{"position":[[367,5]]},"332":{"position":[[1105,5]]},"343":{"position":[[232,5]]},"345":{"position":[[182,5],[520,5]]},"348":{"position":[[1769,5]]},"350":{"position":[[16,5]]},"355":{"position":[[90,5]]},"356":{"position":[[90,5]]},"357":{"position":[[287,5],[395,5],[518,5]]},"358":{"position":[[433,5]]},"359":{"position":[[121,5]]},"368":{"position":[[398,5]]},"375":{"position":[[204,5]]},"383":{"position":[[28,5]]},"400":{"position":[[417,5],[546,5]]},"410":{"position":[[56,5]]},"414":{"position":[[10,5]]},"436":{"position":[[94,5]]},"438":{"position":[[34,5],[150,5]]},"439":{"position":[[34,5]]},"450":{"position":[[543,5],[644,5],[706,5],[807,5]]},"453":{"position":[[336,5],[395,5]]},"459":{"position":[[325,5]]}},"keywords":{}}],["amp;&",{"_index":1895,"title":{},"content":{"259":{"position":[[451,10]]},"393":{"position":[[1098,10],[1162,10]]}},"keywords":{}}],["analyz",{"_index":298,"title":{},"content":{"17":{"position":[[822,7]]}},"keywords":{}}],["ancestor",{"_index":1337,"title":{},"content":{"133":{"position":[[422,8]]},"410":{"position":[[166,8]]}},"keywords":{}}],["and/or",{"_index":1624,"title":{},"content":{"225":{"position":[[237,6]]},"285":{"position":[[237,6]]},"330":{"position":[[475,6]]},"350":{"position":[[237,6]]}},"keywords":{}}],["android",{"_index":1536,"title":{},"content":{"194":{"position":[[61,7]]}},"keywords":{}}],["angular",{"_index":2423,"title":{},"content":{"343":{"position":[[807,8]]}},"keywords":{}}],["anim",{"_index":2363,"title":{},"content":{"332":{"position":[[1032,7]]}},"keywords":{}}],["announc",{"_index":2655,"title":{},"content":{"451":{"position":[[1945,10]]}},"keywords":{}}],["anoth",{"_index":1793,"title":{},"content":{"250":{"position":[[622,7]]},"278":{"position":[[311,7],[547,7]]},"292":{"position":[[437,7]]},"294":{"position":[[495,7]]},"296":{"position":[[630,7]]},"297":{"position":[[727,7]]},"298":{"position":[[414,7]]},"300":{"position":[[590,7]]},"308":{"position":[[165,7]]},"345":{"position":[[719,7]]}},"keywords":{}}],["anymore.formattedhtmlmessag",{"_index":2011,"title":{},"content":{"272":{"position":[[547,28]]}},"keywords":{}}],["anyth",{"_index":2256,"title":{},"content":{"323":{"position":[[81,8]]},"429":{"position":[[81,8]]}},"keywords":{}}],["api",{"_index":243,"title":{"14":{"position":[[17,3]]},"15":{"position":[[12,3]]},"16":{"position":[[10,3]]},"54":{"position":[[11,5]]},"86":{"position":[[5,4]]},"132":{"position":[[7,4]]},"272":{"position":[[9,3]]},"276":{"position":[[9,3]]},"315":{"position":[[9,4]]},"325":{"position":[[9,3]]},"329":{"position":[[29,5]]},"341":{"position":[[11,3]]},"342":{"position":[[15,5]]},"402":{"position":[[5,4]]},"410":{"position":[[12,4]]}},"content":{"31":{"position":[[363,4]]},"32":{"position":[[535,4]]},"33":{"position":[[493,4]]},"34":{"position":[[190,4]]},"54":{"position":[[12,4]]},"62":{"position":[[23,4],[198,4]]},"65":{"position":[[269,5]]},"67":{"position":[[284,4]]},"69":{"position":[[120,4]]},"78":{"position":[[127,4]]},"86":{"position":[[35,4],[122,4]]},"101":{"position":[[78,5]]},"123":{"position":[[376,3]]},"138":{"position":[[458,4]]},"180":{"position":[[47,3]]},"220":{"position":[[121,5]]},"223":{"position":[[2059,3]]},"239":{"position":[[24,4]]},"243":{"position":[[118,5]]},"244":{"position":[[295,4]]},"245":{"position":[[411,4]]},"250":{"position":[[74,4],[264,3],[282,3],[504,3],[687,3],[917,3],[2010,3]]},"252":{"position":[[803,3],[834,3],[965,4]]},"260":{"position":[[198,3]]},"262":{"position":[[44,3],[319,3],[462,4]]},"282":{"position":[[180,3]]},"292":{"position":[[60,4]]},"294":{"position":[[60,4]]},"296":{"position":[[39,3],[246,4]]},"297":{"position":[[187,3]]},"298":{"position":[[60,4]]},"300":{"position":[[38,3]]},"301":{"position":[[167,3]]},"302":{"position":[[174,3]]},"304":{"position":[[39,3]]},"307":{"position":[[24,4]]},"315":{"position":[[121,4]]},"325":{"position":[[66,4],[159,4],[519,3],[655,3]]},"326":{"position":[[40,4]]},"328":{"position":[[53,3],[539,3]]},"329":{"position":[[70,3],[104,4],[317,4]]},"331":{"position":[[179,3],[241,3]]},"336":{"position":[[19,3]]},"342":{"position":[[80,3],[344,4]]},"343":{"position":[[117,5]]},"344":{"position":[[561,3]]},"345":{"position":[[784,3],[945,3]]},"348":{"position":[[2192,3]]},"366":{"position":[[24,4]]},"408":{"position":[[264,4]]},"409":{"position":[[76,3]]},"410":{"position":[[35,3]]},"411":{"position":[[360,3]]}},"keywords":{}}],["apireact",{"_index":1848,"title":{},"content":{"252":{"position":[[1029,8],[1043,8]]}},"keywords":{}}],["apostroph",{"_index":621,"title":{"338":{"position":[[37,10]]}},"content":{"39":{"position":[[11,10],[467,11],[500,11],[588,10],[656,10]]},"136":{"position":[[1248,10]]},"272":{"position":[[354,10]]},"273":{"position":[[680,11]]}},"keywords":{}}],["app",{"_index":15,"title":{},"content":{"1":{"position":[[166,4],[400,3]]},"2":{"position":[[432,4],[814,4]]},"4":{"position":[[255,3]]},"20":{"position":[[421,5]]},"46":{"position":[[1207,3]]},"50":{"position":[[357,4]]},"89":{"position":[[458,3]]},"123":{"position":[[148,4]]},"224":{"position":[[40,3]]},"233":{"position":[[830,4],[883,3]]},"240":{"position":[[1009,5],[1289,5],[1619,5]]},"249":{"position":[[94,4],[503,4]]},"250":{"position":[[174,4],[1353,3]]},"252":{"position":[[644,4],[685,4]]},"258":{"position":[[315,4]]},"264":{"position":[[352,4]]},"268":{"position":[[222,4]]},"269":{"position":[[704,4]]},"282":{"position":[[90,4]]},"283":{"position":[[412,4],[645,3]]},"284":{"position":[[40,3]]},"290":{"position":[[559,3]]},"349":{"position":[[40,3]]},"360":{"position":[[830,4],[883,3]]},"367":{"position":[[1009,5],[1289,5],[1619,5]]},"408":{"position":[[125,3]]}},"keywords":{}}],["app"",{"_index":2199,"title":{},"content":{"308":{"position":[[404,9]]},"309":{"position":[[280,9]]}},"keywords":{}}],["app'",{"_index":1074,"title":{},"content":{"88":{"position":[[111,5]]},"123":{"position":[[81,5]]},"194":{"position":[[92,5]]},"224":{"position":[[164,5]]},"238":{"position":[[74,5]]},"260":{"position":[[151,5]]},"263":{"position":[[285,5]]},"283":{"position":[[605,5]]},"284":{"position":[[164,5]]},"306":{"position":[[74,5]]},"313":{"position":[[109,5]]},"349":{"position":[[164,5]]},"365":{"position":[[74,5]]},"417":{"position":[[41,5]]}},"keywords":{}}],["app(prop",{"_index":791,"title":{},"content":{"48":{"position":[[505,10]]}},"keywords":{}}],["app.greet",{"_index":1736,"title":{},"content":{"240":{"position":[[909,15],[1189,15],[1494,15]]},"367":{"position":[[909,15],[1189,15],[1494,15]]}},"keywords":{}}],["app.home.greet",{"_index":1748,"title":{},"content":{"241":{"position":[[692,20]]},"368":{"position":[[684,20]]}},"keywords":{}}],["app.j",{"_index":156,"title":{},"content":{"7":{"position":[[27,6]]},"10":{"position":[[94,6]]}},"keywords":{}}],["app.us",{"_index":2557,"title":{},"content":{"408":{"position":[[146,8]]}},"keywords":{}}],["append",{"_index":1238,"title":{},"content":{"107":{"position":[[191,6]]},"115":{"position":[[193,6]]},"173":{"position":[[189,6]]},"182":{"position":[[191,6]]},"192":{"position":[[190,6]]},"214":{"position":[[197,6]]}},"keywords":{}}],["appl",{"_index":2708,"title":{},"content":{"462":{"position":[[132,7],[146,8],[198,6],[214,7],[270,6],[292,7],[343,6],[359,7]]}},"keywords":{}}],["appli",{"_index":542,"title":{},"content":{"35":{"position":[[1347,7]]},"136":{"position":[[795,6]]},"264":{"position":[[261,5]]},"437":{"position":[[20,7]]}},"keywords":{}}],["applic",{"_index":86,"title":{"6":{"position":[[0,11]]},"7":{"position":[[7,11]]},"9":{"position":[[8,11]]},"20":{"position":[[8,12]]}},"content":{"3":{"position":[[35,11],[269,11]]},"8":{"position":[[97,11]]},"10":{"position":[[242,11]]},"11":{"position":[[125,11]]},"20":{"position":[[69,11]]},"48":{"position":[[13,11]]},"81":{"position":[[253,12]]},"82":{"position":[[454,11],[844,11]]},"83":{"position":[[115,11]]},"84":{"position":[[20,11],[200,12]]},"252":{"position":[[788,13]]},"461":{"position":[[83,11]]}},"keywords":{}}],["appmain",{"_index":1171,"title":{},"content":{"96":{"position":[[747,7],[760,12],[1296,7],[1309,12]]}},"keywords":{}}],["appreci",{"_index":2318,"title":{},"content":{"330":{"position":[[509,11]]}},"keywords":{}}],["approach",{"_index":818,"title":{},"content":{"50":{"position":[[472,8]]},"83":{"position":[[608,8],[721,8]]},"95":{"position":[[43,11]]}},"keywords":{}}],["ar",{"_index":77,"title":{},"content":{"2":{"position":[[654,2]]}},"keywords":{}}],["arab",{"_index":81,"title":{},"content":{"2":{"position":[[702,6],[749,6],[776,4]]},"36":{"position":[[493,6],[884,6],[1270,7]]},"37":{"position":[[508,6],[881,6],[1258,7]]}},"keywords":{}}],["area",{"_index":1393,"title":{},"content":{"136":{"position":[[1721,4]]}},"keywords":{}}],["argentinaar",{"_index":79,"title":{},"content":{"2":{"position":[[682,11]]}},"keywords":{}}],["argument",{"_index":396,"title":{"29":{"position":[[7,9]]},"30":{"position":[[10,9]]},"270":{"position":[[42,10]]},"339":{"position":[[12,8]]}},"content":{"29":{"position":[[21,8]]},"30":{"position":[[81,8],[123,8]]},"31":{"position":[[154,9]]},"32":{"position":[[152,9]]},"33":{"position":[[152,9]]},"35":{"position":[[321,8],[742,9],[1223,10]]},"127":{"position":[[118,10],[534,9]]},"136":{"position":[[291,8]]},"270":{"position":[[142,10],[239,9],[284,9]]},"278":{"position":[[555,8]]},"339":{"position":[[13,8]]},"344":{"position":[[151,8]]},"443":{"position":[[304,8],[315,11]]},"462":{"position":[[21,8],[78,9]]}},"keywords":{}}],["aria",{"_index":1788,"title":{},"content":{"250":{"position":[[422,4]]},"262":{"position":[[179,4]]},"342":{"position":[[183,4]]},"451":{"position":[[198,4],[437,4],[806,4],[959,4],[1749,4],[1764,4],[1803,5],[1906,4],[1962,5]]}},"keywords":{}}],["around",{"_index":1136,"title":{},"content":{"93":{"position":[[242,6]]},"394":{"position":[[773,7]]},"414":{"position":[[407,6]]}},"keywords":{}}],["array",{"_index":478,"title":{},"content":{"34":{"position":[[84,5]]},"78":{"position":[[21,5]]},"133":{"position":[[278,5],[374,5]]},"138":{"position":[[352,5]]},"456":{"position":[[837,5],[885,5]]}},"keywords":{}}],["array<react.reactel",{"_index":2179,"title":{},"content":{"302":{"position":[[309,27]]}},"keywords":{}}],["array<str",{"_index":1613,"title":{},"content":{"223":{"position":[[1526,15],[1592,15],[1642,15]]},"289":{"position":[[70,15]]},"348":{"position":[[1476,15],[1542,15],[1592,15]]},"353":{"position":[[70,15]]}},"keywords":{}}],["array<string>",{"_index":1610,"title":{},"content":{"223":{"position":[[1451,20]]},"348":{"position":[[1401,20]]}},"keywords":{}}],["artifact",{"_index":1823,"title":{},"content":{"250":{"position":[[2211,10]]},"333":{"position":[[166,10]]}},"keywords":{}}],["ascii",{"_index":620,"title":{},"content":{"39":{"position":[[5,5],[461,5],[494,5],[650,5]]}},"keywords":{}}],["asian",{"_index":552,"title":{},"content":{"36":{"position":[[691,5]]},"37":{"position":[[695,5]]}},"keywords":{}}],["assert",{"_index":1164,"title":{},"content":{"96":{"position":[[208,10]]}},"keywords":{}}],["asset",{"_index":824,"title":{},"content":{"50":{"position":[[596,5]]},"81":{"position":[[34,7]]}},"keywords":{}}],["assign",{"_index":1986,"title":{},"content":{"269":{"position":[[554,8]]}},"keywords":{}}],["assum",{"_index":763,"title":{},"content":{"46":{"position":[[49,8]]},"48":{"position":[[158,6]]},"89":{"position":[[29,6]]},"129":{"position":[[14,7]]},"250":{"position":[[1767,8]]},"259":{"position":[[184,7]]},"290":{"position":[[945,8]]}},"keywords":{}}],["ast",{"_index":283,"title":{"140":{"position":[[11,4]]},"323":{"position":[[0,4]]},"391":{"position":[[2,4]]},"398":{"position":[[2,4]]},"429":{"position":[[0,4]]}},"content":{"17":{"position":[[390,3]]},"24":{"position":[[103,3]]},"26":{"position":[[323,4]]},"43":{"position":[[82,3]]},"46":{"position":[[1024,3],[1085,3],[1134,3]]},"47":{"position":[[428,3]]},"50":{"position":[[44,3],[186,4],[291,3],[486,3],[558,3],[607,3]]},"72":{"position":[[99,3]]},"75":{"position":[[144,4],[162,3]]},"76":{"position":[[64,3]]},"79":{"position":[[13,3],[41,3],[68,3],[94,3]]},"83":{"position":[[195,3]]},"124":{"position":[[81,3]]},"133":{"position":[[130,3],[166,4]]},"137":{"position":[[23,3]]},"140":{"position":[[28,3],[416,3],[464,5]]},"141":{"position":[[209,3]]},"306":{"position":[[782,3]]},"315":{"position":[[218,4]]},"323":{"position":[[31,3]]},"391":{"position":[[33,3]]},"392":{"position":[[332,3]]},"398":{"position":[[33,3]]},"404":{"position":[[106,4]]},"419":{"position":[[272,4]]},"421":{"position":[[279,4]]},"429":{"position":[[31,3]]}},"keywords":{}}],["asttransform",{"_index":2573,"title":{},"content":{"419":{"position":[[118,16]]}},"keywords":{}}],["async",{"_index":796,"title":{},"content":{"48":{"position":[[670,5]]},"109":{"position":[[76,5]]},"117":{"position":[[78,5]]},"148":{"position":[[78,5]]},"154":{"position":[[83,5]]},"162":{"position":[[70,5]]},"175":{"position":[[74,5]]},"184":{"position":[[76,5]]},"195":{"position":[[75,5]]},"201":{"position":[[74,5]]},"209":{"position":[[73,5]]},"216":{"position":[[82,5]]},"259":{"position":[[965,5]]}},"keywords":{}}],["async>",{"_index":1900,"title":{},"content":{"259":{"position":[[943,10]]}},"keywords":{}}],["attribut",{"_index":997,"title":{},"content":{"82":{"position":[[32,9]]},"133":{"position":[[925,10]]},"136":{"position":[[807,10]]},"250":{"position":[[427,10]]},"262":{"position":[[184,10]]},"342":{"position":[[157,10]]},"451":{"position":[[181,10],[1149,10],[1911,10],[2043,9],[2139,9]]}},"keywords":{}}],["aujourd'hui",{"_index":339,"title":{},"content":{"20":{"position":[[841,12]]}},"keywords":{}}],["auto",{"_index":1061,"title":{},"content":{"87":{"position":[[204,4]]},"231":{"position":[[291,6]]},"297":{"position":[[324,6],[1080,4]]},"358":{"position":[[291,6]]},"372":{"position":[[411,4]]}},"keywords":{}}],["autocomplet",{"_index":1855,"title":{},"content":{"253":{"position":[[147,12]]}},"keywords":{}}],["autofix",{"_index":2694,"title":{},"content":{"456":{"position":[[140,8]]}},"keywords":{}}],["autogen",{"_index":2695,"title":{},"content":{"456":{"position":[[159,7]]}},"keywords":{}}],["automat",{"_index":716,"title":{"43":{"position":[[0,9]]}},"content":{"43":{"position":[[108,13]]},"96":{"position":[[48,13],[1133,13]]},"101":{"position":[[652,13]]},"260":{"position":[[81,13]]},"375":{"position":[[76,13]]},"458":{"position":[[75,9]]}},"keywords":{}}],["automatic/manu",{"_index":2693,"title":{},"content":{"456":{"position":[[89,16]]}},"keywords":{}}],["automaticallygener",{"_index":2237,"title":{},"content":{"318":{"position":[[76,21]]}},"keywords":{}}],["avail",{"_index":480,"title":{"442":{"position":[[0,9]]}},"content":{"34":{"position":[[161,9]]},"35":{"position":[[136,9]]},"65":{"position":[[295,9],[334,9]]},"78":{"position":[[98,9]]},"93":{"position":[[96,9]]},"138":{"position":[[429,9]]},"243":{"position":[[144,9],[183,9]]},"249":{"position":[[332,9]]},"283":{"position":[[233,9]]},"293":{"position":[[88,9],[313,9]]},"295":{"position":[[88,9],[313,9]]},"299":{"position":[[86,9],[315,9]]},"315":{"position":[[37,9]]},"330":{"position":[[204,9]]},"343":{"position":[[736,9]]},"392":{"position":[[65,9]]},"443":{"position":[[136,9]]},"447":{"position":[[206,9]]}},"keywords":{}}],["avoid",{"_index":2458,"title":{},"content":{"372":{"position":[[405,5]]}},"keywords":{}}],["avril",{"_index":2093,"title":{},"content":{"290":{"position":[[1012,5]]}},"keywords":{}}],["await",{"_index":799,"title":{},"content":{"48":{"position":[[742,5]]},"109":{"position":[[275,5],[334,5]]},"117":{"position":[[277,5],[523,5]]},"148":{"position":[[277,5]]},"154":{"position":[[194,5],[315,5]]},"162":{"position":[[168,5],[276,5]]},"175":{"position":[[273,5],[330,5]]},"184":{"position":[[275,5],[334,5]]},"195":{"position":[[274,5],[332,5]]},"201":{"position":[[183,5],[295,5]]},"209":{"position":[[139,5]]},"216":{"position":[[281,5],[346,5]]}},"keywords":{}}],["awar",{"_index":229,"title":{},"content":{"12":{"position":[[168,6]]},"456":{"position":[[1047,5]]}},"keywords":{}}],["awesom",{"_index":2369,"title":{},"content":{"332":{"position":[[1543,9],[1610,8]]}},"keywords":{}}],["awkward",{"_index":2681,"title":{},"content":{"453":{"position":[[197,7]]}},"keywords":{}}],["b",{"_index":1367,"title":{},"content":{"136":{"position":[[462,2]]},"272":{"position":[[156,2]]},"276":{"position":[[134,2],[268,2]]},"309":{"position":[[365,2]]},"332":{"position":[[1964,2]]}},"keywords":{}}],["babel",{"_index":343,"title":{"21":{"position":[[11,5]]},"22":{"position":[[0,6]]},"71":{"position":[[6,5]]},"311":{"position":[[0,5]]}},"content":{"21":{"position":[[22,6]]},"22":{"position":[[17,6],[28,5],[90,5]]},"42":{"position":[[402,5]]},"43":{"position":[[52,5]]},"71":{"position":[[20,5],[384,5]]},"240":{"position":[[1819,5],[1892,5]]},"252":{"position":[[17,5]]},"254":{"position":[[89,5]]},"306":{"position":[[639,5]]},"312":{"position":[[17,5]]},"313":{"position":[[6,5]]},"335":{"position":[[17,5]]},"367":{"position":[[1819,5],[1892,5]]},"438":{"position":[[12,5]]},"439":{"position":[[12,5]]}},"keywords":{}}],["babel'",{"_index":2232,"title":{},"content":{"315":{"position":[[101,7]]}},"keywords":{}}],["babel.@formatjs/t",{"_index":2568,"title":{},"content":{"412":{"position":[[230,18]]}},"keywords":{}}],["babel.config.j",{"_index":355,"title":{},"content":{"22":{"position":[[133,15]]}},"keywords":{}}],["babel.config.json",{"_index":927,"title":{"314":{"position":[[4,17]]}},"content":{"71":{"position":[[427,17]]},"314":{"position":[[1,17]]}},"keywords":{}}],["babel/t",{"_index":1747,"title":{},"content":{"241":{"position":[[408,8]]},"368":{"position":[[404,8]]}},"keywords":{}}],["babelrc",{"_index":356,"title":{},"content":{"22":{"position":[[152,9]]}},"keywords":{}}],["back",{"_index":217,"title":{},"content":{"11":{"position":[[474,4]]},"58":{"position":[[81,4]]},"389":{"position":[[364,4]]},"397":{"position":[[364,4]]}},"keywords":{}}],["backslash",{"_index":2394,"title":{},"content":{"338":{"position":[[79,9]]},"456":{"position":[[1062,9],[1129,10]]}},"keywords":{}}],["backward",{"_index":2323,"title":{},"content":{"331":{"position":[[284,9]]},"337":{"position":[[124,9]]}},"keywords":{}}],["bad",{"_index":2704,"title":{},"content":{"461":{"position":[[99,3]]},"462":{"position":[[92,3],[229,3],[374,3]]}},"keywords":{}}],["bagel",{"_index":427,"title":{},"content":{"31":{"position":[[660,5]]}},"keywords":{}}],["ban",{"_index":2700,"title":{},"content":{"457":{"position":[[6,4]]},"458":{"position":[[6,4]]},"460":{"position":[[6,4]]}},"keywords":{}}],["bar",{"_index":1865,"title":{},"content":{"254":{"position":[[332,6],[682,6]]},"371":{"position":[[569,6],[1009,6]]},"408":{"position":[[220,6]]},"435":{"position":[[339,6]]},"444":{"position":[[243,6],[262,4],[285,6]]},"445":{"position":[[362,6],[381,4],[401,6]]},"448":{"position":[[281,4]]},"450":{"position":[[671,4]]},"451":{"position":[[1784,5],[1795,7]]},"453":{"position":[[363,4]]},"454":{"position":[[312,4]]},"455":{"position":[[318,4]]},"456":{"position":[[370,4],[471,4]]}},"keywords":{}}],["bar2",{"_index":2688,"title":{},"content":{"454":{"position":[[400,5]]}},"keywords":{}}],["bar_foo",{"_index":2631,"title":{},"content":{"450":{"position":[[768,8]]}},"keywords":{}}],["bar{two",{"_index":2596,"title":{},"content":{"443":{"position":[[611,9]]}},"keywords":{}}],["base",{"_index":194,"title":{"9":{"position":[[42,5]]}},"content":{"30":{"position":[[30,5]]},"36":{"position":[[53,5]]},"37":{"position":[[60,5]]},"94":{"position":[[387,5]]},"123":{"position":[[248,5]]},"134":{"position":[[101,5]]},"259":{"position":[[230,5]]},"343":{"position":[[651,5]]}},"keywords":{}}],["bash",{"_index":2465,"title":{},"content":{"372":{"position":[[500,6]]}},"keywords":{}}],["basic",{"_index":0,"title":{"0":{"position":[[0,5]]},"28":{"position":[[0,5]]}},"content":{"81":{"position":[[24,9]]},"89":{"position":[[93,8],[434,5]]},"101":{"position":[[540,5]]},"247":{"position":[[220,5]]},"386":{"position":[[84,9]]}},"keywords":{}}],["batch",{"_index":2475,"title":{},"content":{"380":{"position":[[71,6]]},"396":{"position":[[1,5]]}},"keywords":{}}],["baz",{"_index":2682,"title":{},"content":{"453":{"position":[[422,4]]}},"keywords":{}}],["bc",{"_index":2606,"title":{},"content":{"446":{"position":[[437,2],[558,2],[667,2],[813,2]]}},"keywords":{}}],["bcp",{"_index":1335,"title":{},"content":{"133":{"position":[[251,3]]}},"keywords":{}}],["be",{"_index":873,"title":{},"content":{"60":{"position":[[47,5]]},"329":{"position":[[341,5]]},"344":{"position":[[165,5]]}},"keywords":{}}],["becom",{"_index":2325,"title":{},"content":{"331":{"position":[[337,7],[537,7],[1263,7]]},"342":{"position":[[445,7]]},"383":{"position":[[133,7]]}},"keywords":{}}],["befor",{"_index":370,"title":{},"content":{"23":{"position":[[246,7]]},"26":{"position":[[254,7]]},"50":{"position":[[436,6]]},"73":{"position":[[245,7]]},"109":{"position":[[255,6]]},"117":{"position":[[257,6]]},"119":{"position":[[423,6]]},"148":{"position":[[257,6]]},"175":{"position":[[253,6]]},"184":{"position":[[255,6]]},"195":{"position":[[254,6]]},"216":{"position":[[261,6]]},"276":{"position":[[64,7],[381,7]]},"286":{"position":[[147,6]]},"332":{"position":[[1476,6]]},"338":{"position":[[299,6]]},"351":{"position":[[147,6]]},"418":{"position":[[202,7]]},"419":{"position":[[137,7]]},"421":{"position":[[210,7]]}},"keywords":{}}],["begin",{"_index":463,"title":{},"content":{"32":{"position":[[440,6]]}},"keywords":{}}],["behav",{"_index":2617,"title":{},"content":{"449":{"position":[[193,7]]}},"keywords":{}}],["behavior",{"_index":612,"title":{},"content":{"38":{"position":[[416,8]]},"39":{"position":[[126,8]]},"53":{"position":[[255,9]]},"274":{"position":[[29,8]]},"325":{"position":[[338,9]]},"331":{"position":[[1348,8],[1931,8],[2003,8]]},"338":{"position":[[252,8]]}},"keywords":{}}],["behaviour",{"_index":1639,"title":{},"content":{"228":{"position":[[262,9]]}},"keywords":{}}],["below",{"_index":865,"title":{},"content":{"58":{"position":[[138,5]]},"71":{"position":[[419,6]]},"92":{"position":[[146,5]]},"96":{"position":[[292,6]]},"141":{"position":[[280,6]]},"186":{"position":[[59,6]]},"223":{"position":[[2073,6]]},"254":{"position":[[211,6]]},"274":{"position":[[143,6]]},"348":{"position":[[2206,6]]},"371":{"position":[[433,6]]},"411":{"position":[[70,6]]}},"keywords":{}}],["below)format",{"_index":407,"title":{},"content":{"30":{"position":[[242,12]]}},"keywords":{}}],["benchmark",{"_index":952,"title":{"79":{"position":[[0,11]]},"142":{"position":[[0,10]]}},"content":{"141":{"position":[[265,9]]}},"keywords":{}}],["beneath",{"_index":2274,"title":{},"content":{"326":{"position":[[295,7]]}},"keywords":{}}],["benefici",{"_index":2390,"title":{},"content":{"336":{"position":[[624,10]]}},"keywords":{}}],["benefit",{"_index":1785,"title":{},"content":{"250":{"position":[[222,8]]},"282":{"position":[[138,8]]},"308":{"position":[[823,8]]}},"keywords":{}}],["besid",{"_index":2588,"title":{},"content":{"438":{"position":[[128,7]]},"439":{"position":[[129,7]]}},"keywords":{}}],["best",{"_index":226,"title":{},"content":{"12":{"position":[[136,4]]},"187":{"position":[[128,4]]},"393":{"position":[[371,4]]}},"keywords":{}}],["better",{"_index":1030,"title":{},"content":{"83":{"position":[[625,6]]},"194":{"position":[[235,6]]}},"keywords":{}}],["between",{"_index":1991,"title":{},"content":{"269":{"position":[[735,7]]},"278":{"position":[[607,7]]},"387":{"position":[[54,7]]},"395":{"position":[[33,7]]}},"keywords":{}}],["beyond",{"_index":2059,"title":{},"content":{"282":{"position":[[1,6]]}},"keywords":{}}],["binari",{"_index":915,"title":{},"content":{"67":{"position":[[129,6]]},"244":{"position":[[140,6]]},"329":{"position":[[1198,6]]}},"keywords":{}}],["birthday",{"_index":597,"title":{},"content":{"37":{"position":[[2001,9]]}},"keywords":{}}],["bit",{"_index":1391,"title":{},"content":{"136":{"position":[[1707,3]]},"186":{"position":[[90,5]]}},"keywords":{}}],["black",{"_index":418,"title":{},"content":{"31":{"position":[[292,6]]}},"keywords":{}}],["blackbox",{"_index":2361,"title":{},"content":{"332":{"position":[[971,8]]}},"keywords":{}}],["block",{"_index":1767,"title":{},"content":{"247":{"position":[[699,6]]}},"keywords":{}}],["blocklist",{"_index":2593,"title":{"443":{"position":[[0,9]]}},"content":{"443":{"position":[[6,10]]}},"keywords":{}}],["bodi",{"_index":1813,"title":{},"content":{"250":{"position":[[1667,5]]}},"keywords":{}}],["bold",{"_index":1740,"title":{},"content":{"240":{"position":[[1692,5]]},"367":{"position":[[1692,5]]}},"keywords":{}}],["bold;">awesome</span>",{"_index":2374,"title":{},"content":{"332":{"position":[[1653,35]]}},"keywords":{}}],["bold;">{str}</span>",{"_index":2382,"title":{},"content":{"332":{"position":[[2057,34]]}},"keywords":{}}],["bonjour",{"_index":109,"title":{},"content":{"3":{"position":[[499,8]]}},"keywords":{}}],["boolean",{"_index":1341,"title":{},"content":{"133":{"position":[[677,7]]},"223":{"position":[[81,7]]},"228":{"position":[[25,7]]},"240":{"position":[[54,7]]},"283":{"position":[[1078,7]]},"367":{"position":[[54,7]]}},"keywords":{}}],["bootstrap",{"_index":1901,"title":{},"content":{"259":{"position":[[992,13]]}},"keywords":{}}],["bootstrapapplication(local",{"_index":797,"title":{},"content":{"48":{"position":[[685,28]]}},"keywords":{}}],["both",{"_index":996,"title":{},"content":{"81":{"position":[[571,5]]},"317":{"position":[[145,4]]},"328":{"position":[[179,4]]},"357":{"position":[[385,4]]},"423":{"position":[[145,4]]},"436":{"position":[[78,4]]}},"keywords":{}}],["bottleneck",{"_index":2413,"title":{},"content":{"342":{"position":[[457,10]]}},"keywords":{}}],["box",{"_index":1158,"title":{},"content":{"95":{"position":[[159,4]]}},"keywords":{}}],["brace",{"_index":395,"title":{},"content":{"28":{"position":[[185,6]]}},"keywords":{}}],["break",{"_index":2004,"title":{"272":{"position":[[0,8]]},"276":{"position":[[0,8]]},"325":{"position":[[0,8]]}},"content":{"453":{"position":[[489,5]]}},"keywords":{}}],["breakdown",{"_index":2519,"title":{"394":{"position":[[0,9]]}},"content":{},"keywords":{}}],["bring",{"_index":2225,"title":{},"content":{"310":{"position":[[766,6]]},"332":{"position":[[1209,6]]}},"keywords":{}}],["broken",{"_index":604,"title":{},"content":{"38":{"position":[[161,6]]}},"keywords":{}}],["browser",{"_index":887,"title":{"65":{"position":[[0,8]]},"130":{"position":[[32,8]]},"259":{"position":[[31,8]]}},"content":{"62":{"position":[[206,8]]},"65":{"position":[[1,7],[119,7]]},"87":{"position":[[165,8],[270,8],[320,7]]},"119":{"position":[[114,7]]},"123":{"position":[[185,7]]},"129":{"position":[[103,8]]},"231":{"position":[[1,7],[73,7]]},"234":{"position":[[1,7],[65,7]]},"235":{"position":[[1,7],[67,7]]},"243":{"position":[[493,9],[560,8],[775,8],[905,8]]},"247":{"position":[[138,8],[389,8]]},"258":{"position":[[390,8]]},"293":{"position":[[1,7]]},"295":{"position":[[1,7]]},"296":{"position":[[1,7],[107,7]]},"297":{"position":[[1,7],[73,7]]},"299":{"position":[[1,7]]},"301":{"position":[[1,7],[65,7]]},"302":{"position":[[1,7],[65,7]]},"303":{"position":[[1,7],[67,7]]},"329":{"position":[[369,9],[512,9],[579,8],[708,8]]},"331":{"position":[[136,8]]},"357":{"position":[[1,7],[91,7]]},"358":{"position":[[1,7],[73,7]]},"361":{"position":[[1,7],[65,7]]},"362":{"position":[[1,7],[67,7]]}},"keywords":{}}],["browserifi",{"_index":1760,"title":{},"content":{"247":{"position":[[60,11]]}},"keywords":{}}],["browserify/webpack",{"_index":1898,"title":{},"content":{"259":{"position":[[615,18]]}},"keywords":{}}],["browsers/nod",{"_index":885,"title":{},"content":{"62":{"position":[[163,14]]}},"keywords":{}}],["buffer",{"_index":2241,"title":{},"content":{"318":{"position":[[216,6]]},"375":{"position":[[217,6]]}},"keywords":{}}],["build",{"_index":192,"title":{"333":{"position":[[4,6]]}},"content":{"8":{"position":[[264,5]]},"237":{"position":[[71,6]]},"243":{"position":[[622,6],[877,6],[1015,5],[1143,5]]},"250":{"position":[[2061,5],[2259,5]]},"305":{"position":[[71,6]]},"329":{"position":[[818,5]]},"333":{"position":[[214,5]]},"364":{"position":[[71,6]]}},"keywords":{}}],["build.if",{"_index":2305,"title":{},"content":{"329":{"position":[[681,8]]}},"keywords":{}}],["builder",{"_index":1237,"title":{},"content":{"107":{"position":[[36,7]]},"115":{"position":[[36,7]]},"152":{"position":[[36,7]]},"160":{"position":[[36,7]]},"173":{"position":[[36,7]]},"182":{"position":[[36,7]]},"192":{"position":[[36,7]]},"207":{"position":[[36,7]]},"214":{"position":[[36,7]]}},"keywords":{}}],["built",{"_index":918,"title":{},"content":{"68":{"position":[[72,5]]},"86":{"position":[[21,5]]},"245":{"position":[[72,5]]},"252":{"position":[[877,5],[941,5]]},"254":{"position":[[7,5]]},"255":{"position":[[12,5]]},"328":{"position":[[648,5]]},"344":{"position":[[670,5]]},"371":{"position":[[231,5]]},"400":{"position":[[26,5]]}},"keywords":{}}],["builtin",{"_index":286,"title":{"400":{"position":[[0,7]]}},"content":{"17":{"position":[[485,7]]},"44":{"position":[[854,7]]},"373":{"position":[[382,7]]},"389":{"position":[[400,7]]},"401":{"position":[[557,7]]}},"keywords":{}}],["bundl",{"_index":116,"title":{"4":{"position":[[0,8]]},"70":{"position":[[0,8]]}},"content":{"42":{"position":[[455,8]]},"43":{"position":[[196,8]]},"51":{"position":[[193,8]]},"65":{"position":[[200,6]]},"82":{"position":[[594,6],[614,8]]},"101":{"position":[[636,6]]},"140":{"position":[[569,9]]},"247":{"position":[[112,6],[263,9],[373,7],[657,8]]},"412":{"position":[[217,8],[286,8]]}},"keywords":{}}],["bundler",{"_index":838,"title":{"247":{"position":[[7,9]]}},"content":{"51":{"position":[[224,7]]},"247":{"position":[[45,8]]}},"keywords":{}}],["button"",{"_index":687,"title":{},"content":{"42":{"position":[[1485,12],[1959,12]]},"46":{"position":[[427,12]]},"395":{"position":[[509,12]]}},"keywords":{}}],["buy",{"_index":2210,"title":{},"content":{"309":{"position":[[692,3]]},"310":{"position":[[249,3]]},"332":{"position":[[138,3],[481,3]]}},"keywords":{}}],["byte",{"_index":1413,"title":{},"content":{"140":{"position":[[556,5]]},"186":{"position":[[98,6]]}},"keywords":{}}],["c",{"_index":113,"title":{},"content":{"3":{"position":[[582,2]]},"34":{"position":[[407,1]]},"78":{"position":[[352,1]]},"138":{"position":[[683,1]]}},"keywords":{}}],["c..ccc",{"_index":497,"title":{},"content":{"34":{"position":[[439,6]]},"78":{"position":[[384,6]]},"138":{"position":[[715,6]]}},"keywords":{}}],["cach",{"_index":809,"title":{},"content":{"50":{"position":[[281,5],[453,7],[575,5]]},"84":{"position":[[126,6]]},"140":{"position":[[427,7]]},"220":{"position":[[101,5]]},"221":{"position":[[237,5],[324,5]]},"222":{"position":[[11,5],[156,6]]},"291":{"position":[[279,5],[364,6]]},"333":{"position":[[136,6]]},"336":{"position":[[375,5],[460,6]]},"343":{"position":[[97,5]]},"346":{"position":[[335,5],[420,6]]},"347":{"position":[[11,5],[156,6]]}},"keywords":{}}],["calcul",{"_index":1281,"title":{},"content":{"119":{"position":[[314,12]]}},"keywords":{}}],["call",{"_index":148,"title":{"259":{"position":[[4,4]]},"265":{"position":[[25,5]]},"266":{"position":[[23,6]]}},"content":{"5":{"position":[[325,4]]},"17":{"position":[[450,4]]},"28":{"position":[[128,6]]},"42":{"position":[[1668,6]]},"46":{"position":[[113,6]]},"90":{"position":[[517,7]]},"119":{"position":[[217,7],[430,7]]},"127":{"position":[[259,5]]},"134":{"position":[[214,4]]},"136":{"position":[[64,7]]},"221":{"position":[[335,4]]},"259":{"position":[[59,6]]},"265":{"position":[[352,5]]},"266":{"position":[[24,7],[61,4]]},"267":{"position":[[520,4]]},"327":{"position":[[1264,4]]},"336":{"position":[[23,6],[470,4]]},"343":{"position":[[574,7],[882,7]]},"344":{"position":[[171,7]]},"346":{"position":[[430,4]]},"373":{"position":[[122,6]]},"436":{"position":[[69,5]]},"444":{"position":[[557,5]]},"445":{"position":[[680,5]]}},"keywords":{}}],["callback",{"_index":2040,"title":{"278":{"position":[[21,8]]}},"content":{"276":{"position":[[22,8]]},"278":{"position":[[55,8]]},"430":{"position":[[1,8]]},"431":{"position":[[1,8]]}},"keywords":{}}],["camel",{"_index":2614,"title":{"448":{"position":[[3,5]]}},"content":{"448":{"position":[[37,5]]}},"keywords":{}}],["camelcas",{"_index":2616,"title":{},"content":{"448":{"position":[[309,13]]}},"keywords":{}}],["capabl",{"_index":849,"title":{"109":{"position":[[17,10]]},"117":{"position":[[17,10]]},"148":{"position":[[17,10]]},"154":{"position":[[17,10]]},"162":{"position":[[17,10]]},"175":{"position":[[17,10]]},"184":{"position":[[17,10]]},"195":{"position":[[17,10]]},"201":{"position":[[17,10]]},"209":{"position":[[17,10]]},"216":{"position":[[17,10]]}},"content":{"54":{"position":[[169,12]]},"113":{"position":[[37,13]]},"179":{"position":[[37,13]]},"212":{"position":[[37,13]]}},"keywords":{}}],["cardin",{"_index":1671,"title":{},"content":{"233":{"position":[[37,10],[62,10]]},"360":{"position":[[37,10],[62,10]]}},"keywords":{}}],["cart",{"_index":580,"title":{},"content":{"36":{"position":[[2028,6],[2067,6]]}},"keywords":{}}],["case",{"_index":520,"title":{"448":{"position":[[9,5]]}},"content":{"35":{"position":[[485,4],[870,4]]},"48":{"position":[[394,4]]},"50":{"position":[[199,5]]},"101":{"position":[[550,6]]},"135":{"position":[[298,4]]},"140":{"position":[[349,5]]},"278":{"position":[[417,4]]},"308":{"position":[[779,4]]},"332":{"position":[[1322,5]]},"342":{"position":[[136,6]]},"445":{"position":[[81,4]]},"448":{"position":[[43,5],[75,4]]}},"keywords":{}}],["cat",{"_index":412,"title":{},"content":{"30":{"position":[[370,5]]},"31":{"position":[[202,5]]}},"keywords":{}}],["cat'",{"_index":591,"title":{},"content":{"37":{"position":[[1929,5]]}},"keywords":{}}],["catch",{"_index":1382,"title":{},"content":{"136":{"position":[[1173,5]]}},"keywords":{}}],["categori",{"_index":546,"title":{},"content":{"36":{"position":[[232,9],[310,11],[355,11],[379,8],[523,8],[667,9],[774,8],[912,8],[1152,8],[1311,8],[1379,11],[1617,10]]},"37":{"position":[[247,9],[325,11],[370,11],[394,8],[538,8],[671,9],[778,8],[909,8],[1140,8],[1299,8],[1367,11],[1605,10]]},"233":{"position":[[238,8]]},"300":{"position":[[413,8]]},"360":{"position":[[238,8]]},"449":{"position":[[164,8]]}},"keywords":{}}],["category.)two",{"_index":554,"title":{},"content":{"36":{"position":[[754,14]]},"37":{"position":[[758,14]]}},"keywords":{}}],["cats").format",{"_index":1386,"title":{},"content":{"136":{"position":[[1385,20]]}},"keywords":{}}],["caught",{"_index":867,"title":{},"content":{"58":{"position":[[196,6]]}},"keywords":{}}],["caus",{"_index":714,"title":{},"content":{"42":{"position":[[2415,5]]},"278":{"position":[[165,7]]},"280":{"position":[[146,6]]},"414":{"position":[[73,5],[348,5]]},"457":{"position":[[238,5]]}},"keywords":{}}],["caution",{"_index":281,"title":{},"content":{"17":{"position":[[371,7],[619,7]]},"283":{"position":[[400,7]]},"372":{"position":[[310,7]]},"392":{"position":[[313,7]]},"400":{"position":[[386,7]]},"419":{"position":[[1,7]]}},"keywords":{}}],["caveat",{"_index":2569,"title":{"413":{"position":[[0,8]]}},"content":{},"keywords":{}}],["cef",{"_index":815,"title":{},"content":{"50":{"position":[[380,3]]}},"keywords":{}}],["cell",{"_index":2420,"title":{},"content":{"342":{"position":[[537,9]]}},"keywords":{}}],["celsiu",{"_index":1497,"title":{},"content":{"186":{"position":[[107,9]]}},"keywords":{}}],["centimet",{"_index":1498,"title":{},"content":{"186":{"position":[[119,12]]}},"keywords":{}}],["central",{"_index":1632,"title":{},"content":{"227":{"position":[[75,11]]},"290":{"position":[[75,11]]},"354":{"position":[[75,11]]}},"keywords":{}}],["certain",{"_index":575,"title":{},"content":{"36":{"position":[[1781,7]]},"62":{"position":[[42,7]]},"227":{"position":[[158,7]]},"228":{"position":[[108,7]]},"290":{"position":[[158,7]]},"318":{"position":[[4,7]]},"322":{"position":[[65,7]]},"354":{"position":[[158,7]]},"375":{"position":[[4,7]]},"381":{"position":[[65,7]]},"394":{"position":[[344,7]]},"428":{"position":[[65,7]]},"443":{"position":[[67,7]]},"447":{"position":[[9,7],[190,7]]},"448":{"position":[[101,7]]},"450":{"position":[[43,7],[329,7]]},"451":{"position":[[159,7],[1137,7]]}},"keywords":{}}],["chang",{"_index":188,"title":{"263":{"position":[[0,6]]},"272":{"position":[[13,8]]},"273":{"position":[[23,9]]},"276":{"position":[[13,8]]},"277":{"position":[[23,9]]},"325":{"position":[[13,8]]},"337":{"position":[[22,8]]},"338":{"position":[[26,7]]},"339":{"position":[[28,7]]}},"content":{"8":{"position":[[228,7]]},"50":{"position":[[510,7]]},"90":{"position":[[436,7]]},"96":{"position":[[153,8]]},"119":{"position":[[195,6]]},"123":{"position":[[345,7],[384,6]]},"257":{"position":[[107,7]]},"258":{"position":[[301,8]]},"263":{"position":[[60,7],[118,6]]},"264":{"position":[[1055,7]]},"265":{"position":[[283,6]]},"267":{"position":[[52,7]]},"268":{"position":[[7,7]]},"325":{"position":[[527,7],[663,7],[751,8],[786,7]]},"330":{"position":[[559,7]]},"331":{"position":[[1844,7]]},"332":{"position":[[820,6]]},"337":{"position":[[147,7]]},"338":{"position":[[239,7]]},"449":{"position":[[89,7]]}},"keywords":{}}],["char",{"_index":1318,"title":{},"content":{"127":{"position":[[410,6]]},"338":{"position":[[70,4]]}},"keywords":{}}],["charact",{"_index":623,"title":{"338":{"position":[[7,9]]}},"content":{"39":{"position":[[62,10]]}},"keywords":{}}],["charg",{"_index":990,"title":{},"content":{"81":{"position":[[344,6]]}},"keywords":{}}],["check",{"_index":1187,"title":{},"content":{"100":{"position":[[134,5]]},"119":{"position":[[399,5]]},"133":{"position":[[443,7]]},"253":{"position":[[170,9]]},"273":{"position":[[721,5]]},"286":{"position":[[181,5]]},"320":{"position":[[107,5]]},"351":{"position":[[181,5]]},"377":{"position":[[107,5]]},"386":{"position":[[12,5]]},"387":{"position":[[12,5]]},"426":{"position":[[107,5]]},"436":{"position":[[11,5]]},"438":{"position":[[122,5]]},"439":{"position":[[123,5]]},"451":{"position":[[1130,6],[1375,6],[1407,7],[1498,5],[1562,5],[1679,5],[1743,5],[1871,6],[1900,5],[2015,5],[2129,5]]},"452":{"position":[[1284,5]]}},"keywords":{}}],["checksum",{"_index":1990,"title":{},"content":{"269":{"position":[[725,9]]}},"keywords":{}}],["child",{"_index":2083,"title":{"310":{"position":[[16,6]]}},"content":{"290":{"position":[[485,5]]},"292":{"position":[[500,6]]},"294":{"position":[[558,6]]},"296":{"position":[[693,6]]},"297":{"position":[[790,6]]},"298":{"position":[[477,6]]},"300":{"position":[[653,6]]},"308":{"position":[[271,6],[524,5]]},"310":{"position":[[78,5]]}},"keywords":{}}],["children",{"_index":1167,"title":{},"content":{"96":{"position":[[459,10]]},"290":{"position":[[451,9]]},"292":{"position":[[220,9]]},"293":{"position":[[233,8],[424,9]]},"294":{"position":[[286,9]]},"295":{"position":[[233,8],[424,9]]},"296":{"position":[[412,9]]},"297":{"position":[[501,9]]},"298":{"position":[[199,9]]},"299":{"position":[[233,8],[423,9]]},"300":{"position":[[291,9]]},"301":{"position":[[283,9]]},"302":{"position":[[290,9]]},"304":{"position":[[173,9]]},"451":{"position":[[1112,9]]}},"keywords":{}}],["chines",{"_index":553,"title":{},"content":{"36":{"position":[[716,7]]},"37":{"position":[[720,7]]}},"keywords":{}}],["chocol",{"_index":2665,"title":{},"content":{"452":{"position":[[276,12],[296,13]]}},"keywords":{}}],["choic",{"_index":512,"title":{},"content":{"35":{"position":[[88,8]]},"264":{"position":[[184,6]]}},"keywords":{}}],["choos",{"_index":510,"title":{},"content":{"35":{"position":[[39,6]]},"36":{"position":[[39,6]]},"37":{"position":[[46,6]]},"82":{"position":[[655,7]]},"187":{"position":[[117,6]]}},"keywords":{}}],["chosen",{"_index":2663,"title":{},"content":{"452":{"position":[[39,6]]}},"keywords":{}}],["chrome",{"_index":750,"title":{},"content":{"44":{"position":[[985,6]]},"65":{"position":[[71,7],[760,6]]},"243":{"position":[[55,7]]},"400":{"position":[[119,6]]}},"keywords":{}}],["chunk",{"_index":1368,"title":{},"content":{"136":{"position":[[465,6],[712,5]]},"272":{"position":[[159,11]]},"274":{"position":[[315,11],[482,7]]},"276":{"position":[[137,11],[271,6],[469,12],[632,7]]},"278":{"position":[[130,6],[213,6],[425,6]]},"302":{"position":[[300,8]]},"304":{"position":[[183,8]]},"309":{"position":[[368,6],[798,6],[928,8],[956,6]]},"310":{"position":[[142,6],[355,6],[485,8],[513,6],[601,7]]},"332":{"position":[[2098,6]]}},"keywords":{}}],["chunksnot",{"_index":605,"title":{},"content":{"38":{"position":[[176,11]]}},"keywords":{}}],["chunksorstr",{"_index":2172,"title":{},"content":{"301":{"position":[[293,16]]}},"keywords":{}}],["class",{"_index":659,"title":{},"content":{"42":{"position":[[675,5]]},"90":{"position":[[540,5]]},"252":{"position":[[1140,5]]},"327":{"position":[[369,5],[599,5],[887,5],[1120,5]]},"343":{"position":[[645,5]]}},"keywords":{}}],["class="external_link"",{"_index":2216,"title":{},"content":{"309":{"position":[[819,31]]},"310":{"position":[[376,31]]},"332":{"position":[[201,31],[605,31]]}},"keywords":{}}],["class="important">eat",{"_index":2356,"title":{},"content":{"332":{"position":[[350,34]]}},"keywords":{}}],["class="important">{chunks}</strong>",{"_index":2222,"title":{},"content":{"309":{"position":[[980,55]]},"310":{"position":[[537,55]]}},"keywords":{}}],["class="important">{msg}</strong>",{"_index":2359,"title":{},"content":{"332":{"position":[[752,52]]}},"keywords":{}}],["cldr",{"_index":1268,"title":{},"content":{"117":{"position":[[353,4]]},"126":{"position":[[265,4]]},"127":{"position":[[49,4]]},"243":{"position":[[1043,4],[1171,4]]},"329":{"position":[[36,4],[428,5],[846,4]]}},"keywords":{}}],["clean",{"_index":2299,"title":{},"content":{"328":{"position":[[551,5]]},"344":{"position":[[573,5]]}},"keywords":{}}],["cli",{"_index":290,"title":{"370":{"position":[[0,3]]}},"content":{"17":{"position":[[604,3]]},"87":{"position":[[124,3]]},"238":{"position":[[669,4]]},"241":{"position":[[398,3]]},"365":{"position":[[669,4]]},"368":{"position":[[394,3]]},"371":{"position":[[242,3]]}},"keywords":{}}],["client",{"_index":1887,"title":{},"content":{"259":{"position":[[147,6],[985,6]]},"269":{"position":[[758,6]]}},"keywords":{}}],["close",{"_index":1378,"title":{},"content":{"136":{"position":[[856,7]]},"272":{"position":[[252,7]]},"331":{"position":[[1981,5]]}},"keywords":{}}],["cloud",{"_index":193,"title":{"9":{"position":[[36,5]]}},"content":{},"keywords":{}}],["clutter",{"_index":2707,"title":{},"content":{"461":{"position":[[316,8]]}},"keywords":{}}],["coconut",{"_index":2670,"title":{},"content":{"452":{"position":[[536,10],[554,9]]}},"keywords":{}}],["code",{"_index":50,"title":{"5":{"position":[[13,5]]},"58":{"position":[[6,6]]}},"content":{"2":{"position":[[161,4],[528,5]]},"3":{"position":[[297,4]]},"43":{"position":[[160,5]]},"90":{"position":[[451,5]]},"194":{"position":[[36,4]]},"235":{"position":[[272,6],[573,4],[696,4],[830,4]]},"247":{"position":[[694,4]]},"253":{"position":[[350,5]]},"259":{"position":[[1006,4],[1063,4]]},"268":{"position":[[186,5]]},"315":{"position":[[207,5]]},"330":{"position":[[575,4]]},"362":{"position":[[272,6],[574,4],[697,4],[831,4]]},"401":{"position":[[575,4]]},"435":{"position":[[164,4]]},"445":{"position":[[143,5]]},"460":{"position":[[119,4]]},"461":{"position":[[280,6]]}},"keywords":{}}],["code"",{"_index":46,"title":{},"content":{"2":{"position":[[123,10]]}},"keywords":{}}],["codebas",{"_index":218,"title":{},"content":{"11":{"position":[[507,9]]},"17":{"position":[[423,9]]},"227":{"position":[[187,8]]},"290":{"position":[[187,8]]},"354":{"position":[[187,8]]}},"keywords":{}}],["coher",{"_index":1623,"title":{},"content":{"225":{"position":[[186,8]]},"285":{"position":[[186,8]]},"350":{"position":[[186,8]]}},"keywords":{}}],["collect",{"_index":541,"title":{},"content":{"35":{"position":[[1319,11]]},"136":{"position":[[122,10]]},"264":{"position":[[71,10]]}},"keywords":{}}],["collis",{"_index":715,"title":{},"content":{"42":{"position":[[2421,10]]}},"keywords":{}}],["combin",{"_index":66,"title":{},"content":{"2":{"position":[[491,12]]},"141":{"position":[[184,8]]},"290":{"position":[[349,8]]},"331":{"position":[[347,11]]}},"keywords":{}}],["come",{"_index":219,"title":{"12":{"position":[[15,5]]}},"content":{"107":{"position":[[135,4]]},"115":{"position":[[137,4]]},"173":{"position":[[133,4]]},"182":{"position":[[135,4]]},"192":{"position":[[134,4]]},"214":{"position":[[141,4]]},"278":{"position":[[144,4]]},"280":{"position":[[11,5]]},"329":{"position":[[25,5]]}},"keywords":{}}],["comma",{"_index":2474,"title":{"377":{"position":[[29,6]]},"378":{"position":[[28,6]]}},"content":{"457":{"position":[[349,6]]}},"keywords":{}}],["command",{"_index":641,"title":{},"content":{"42":{"position":[[19,7],[1641,7]]},"46":{"position":[[837,7]]},"50":{"position":[[76,7]]},"87":{"position":[[175,7]]},"371":{"position":[[54,7]]}},"keywords":{}}],["comment",{"_index":172,"title":{},"content":{"7":{"position":[[294,10]]},"44":{"position":[[781,8]]}},"keywords":{}}],["commit",{"_index":216,"title":{},"content":{"11":{"position":[[466,7]]}},"keywords":{}}],["common",{"_index":117,"title":{"125":{"position":[[0,6]]}},"content":{"4":{"position":[[7,6]]},"48":{"position":[[67,6]]},"125":{"position":[[8,6]]},"126":{"position":[[78,6]]},"227":{"position":[[101,6]]},"239":{"position":[[76,6]]},"240":{"position":[[1995,6]]},"249":{"position":[[580,6]]},"290":{"position":[[101,6]]},"307":{"position":[[76,6]]},"308":{"position":[[750,6]]},"330":{"position":[[658,6]]},"354":{"position":[[101,6]]},"366":{"position":[[76,6]]},"367":{"position":[[1995,6]]}},"keywords":{}}],["commonj",{"_index":1754,"title":{},"content":{"246":{"position":[[160,9]]},"248":{"position":[[26,9]]}},"keywords":{}}],["commun",{"_index":2045,"title":{},"content":{"278":{"position":[[31,9]]}},"keywords":{}}],["comp(prop",{"_index":1869,"title":{},"content":{"254":{"position":[[508,11]]},"371":{"position":[[835,11]]}},"keywords":{}}],["compact",{"_index":431,"title":{},"content":{"31":{"position":[[697,7]]}},"keywords":{}}],["compar",{"_index":2492,"title":{},"content":{"386":{"position":[[52,8]]},"401":{"position":[[91,11],[511,10]]},"405":{"position":[[30,11]]}},"keywords":{}}],["comparemessag",{"_index":2541,"title":{},"content":{"401":{"position":[[494,16]]},"405":{"position":[[163,15]]}},"keywords":{}}],["comparison",{"_index":2294,"title":{},"content":{"328":{"position":[[247,11]]}},"keywords":{}}],["compat",{"_index":2324,"title":{},"content":{"331":{"position":[[294,11]]},"384":{"position":[[89,10]]}},"keywords":{}}],["compil",{"_index":240,"title":{"21":{"position":[[51,12]]},"46":{"position":[[0,9]]},"50":{"position":[[4,9]]},"388":{"position":[[0,12]]},"393":{"position":[[15,11]]},"396":{"position":[[7,12]]},"404":{"position":[[0,12]]}},"content":{"12":{"position":[[360,9]]},"21":{"position":[[102,12]]},"46":{"position":[[765,7],[998,7],[1039,8],[1105,9]]},"47":{"position":[[402,7],[443,8]]},"50":{"position":[[18,7],[68,7],[257,9],[317,11]]},"67":{"position":[[156,8]]},"75":{"position":[[188,9]]},"83":{"position":[[144,7]]},"124":{"position":[[225,8]]},"137":{"position":[[35,8]]},"220":{"position":[[143,8]]},"241":{"position":[[436,9]]},"244":{"position":[[167,8]]},"306":{"position":[[607,7],[714,7]]},"329":{"position":[[1225,8]]},"343":{"position":[[139,8]]},"368":{"position":[[432,9]]},"388":{"position":[[1,7],[186,7]]},"389":{"position":[[107,8],[154,7]]},"390":{"position":[[31,8]]},"391":{"position":[[12,7]]},"392":{"position":[[19,7]]},"393":{"position":[[403,8],[441,8],[705,11],[1118,7]]},"394":{"position":[[13,7],[457,7],[521,8]]},"395":{"position":[[93,8],[188,8]]},"396":{"position":[[7,7],[234,7]]},"397":{"position":[[107,8],[154,7]]},"398":{"position":[[12,7]]},"399":{"position":[[21,9]]},"400":{"position":[[423,7],[511,7]]},"401":{"position":[[357,8]]},"404":{"position":[[8,9]]},"405":{"position":[[252,8]]},"412":{"position":[[193,7],[262,7]]}},"keywords":{}}],["compilationpolyfil",{"_index":236,"title":{},"content":{"12":{"position":[[282,20]]}},"keywords":{}}],["compile"",{"_index":776,"title":{},"content":{"46":{"position":[[937,13]]},"371":{"position":[[205,13]]},"393":{"position":[[926,14],[955,14]]}},"keywords":{}}],["compile(fil",{"_index":2546,"title":{},"content":{"404":{"position":[[89,14]]}},"keywords":{}}],["compile.t",{"_index":2581,"title":{},"content":{"432":{"position":[[62,10]]}},"keywords":{}}],["compilefn",{"_index":2497,"title":{},"content":{"389":{"position":[[188,9]]},"397":{"position":[[188,9]]},"401":{"position":[[80,10]]},"405":{"position":[[19,10],[261,9]]}},"keywords":{}}],["compilefn<vendorjson>",{"_index":2538,"title":{},"content":{"401":{"position":[[366,27]]}},"keywords":{}}],["compileroptions'",{"_index":1850,"title":{},"content":{"252":{"position":[[1216,17]]}},"keywords":{}}],["complet",{"_index":1963,"title":{},"content":{"267":{"position":[[41,10]]}},"keywords":{}}],["complex",{"_index":127,"title":{"9":{"position":[[0,7]]},"459":{"position":[[3,7]]}},"content":{"4":{"position":[[262,8]]},"36":{"position":[[1127,7]]},"37":{"position":[[1115,7]]},"141":{"position":[[5,7]]},"142":{"position":[[326,7],[387,7],[462,7],[548,7]]},"237":{"position":[[178,7],[287,7]]},"305":{"position":[[178,7],[287,7]]},"364":{"position":[[178,7],[287,7]]},"459":{"position":[[33,8],[42,10],[233,10],[357,10],[535,7]]}},"keywords":{}}],["complex_msg",{"_index":953,"title":{},"content":{"79":{"position":[[1,11],[109,11]]}},"keywords":{}}],["compliant",{"_index":1287,"title":{},"content":{"120":{"position":[[31,10]]},"155":{"position":[[25,10]]},"163":{"position":[[25,10]]},"176":{"position":[[31,10]]},"202":{"position":[[25,10]]},"217":{"position":[[31,10]]},"338":{"position":[[272,10]]}},"keywords":{}}],["complic",{"_index":2208,"title":{},"content":{"309":{"position":[[589,11]]},"455":{"position":[[84,11]]}},"keywords":{}}],["complicated.thi",{"_index":2367,"title":{},"content":{"332":{"position":[[1192,16]]}},"keywords":{}}],["compon",{"_index":122,"title":{"89":{"position":[[16,10]]},"281":{"position":[[0,10]]},"282":{"position":[[4,12]]},"377":{"position":[[13,9]]}},"content":{"4":{"position":[[152,9]]},"17":{"position":[[499,11]]},"54":{"position":[[76,9],[195,11]]},"84":{"position":[[214,9],[400,11],[733,11]]},"88":{"position":[[123,11],[140,9],[299,10]]},"89":{"position":[[385,9],[440,9]]},"90":{"position":[[87,10],[334,10],[385,10],[466,10],[748,10],[943,9]]},"92":{"position":[[97,10],[216,10],[302,10]]},"93":{"position":[[7,10],[127,10]]},"96":{"position":[[95,10],[226,9],[826,9]]},"99":{"position":[[186,9]]},"249":{"position":[[175,11],[308,9],[368,11],[482,9],[559,10],[620,9]]},"250":{"position":[[55,10],[83,10],[206,10],[317,9],[549,9],[607,9],[636,9],[708,9],[886,11],[2023,9]]},"252":{"position":[[984,11],[1057,10]]},"261":{"position":[[60,10],[138,9]]},"262":{"position":[[59,10],[261,9],[396,9],[1175,9]]},"267":{"position":[[25,10]]},"269":{"position":[[504,9]]},"273":{"position":[[108,10]]},"282":{"position":[[122,10]]},"283":{"position":[[76,11],[209,9],[269,11],[383,9],[495,10],[512,9],[582,9],[616,9]]},"286":{"position":[[85,11]]},"290":{"position":[[390,9]]},"292":{"position":[[6,9]]},"293":{"position":[[166,9]]},"294":{"position":[[6,9]]},"295":{"position":[[166,9]]},"296":{"position":[[183,9]]},"297":{"position":[[149,9],[987,9]]},"298":{"position":[[6,9]]},"299":{"position":[[164,9]]},"300":{"position":[[6,9]]},"301":{"position":[[141,9]]},"302":{"position":[[141,9]]},"303":{"position":[[143,9]]},"304":{"position":[[6,9]]},"320":{"position":[[12,9]]},"328":{"position":[[167,11]]},"331":{"position":[[1742,9]]},"342":{"position":[[11,10],[221,9],[425,10]]},"343":{"position":[[663,11]]},"344":{"position":[[6,9],[55,10]]},"345":{"position":[[646,9],[704,9],[733,9],[805,9],[981,9]]},"348":{"position":[[2013,9]]},"351":{"position":[[85,11]]},"372":{"position":[[119,10]]},"377":{"position":[[12,9]]},"426":{"position":[[12,9]]},"439":{"position":[[104,9]]},"451":{"position":[[1585,10]]}},"keywords":{}}],["component'",{"_index":2347,"title":{},"content":{"331":{"position":[[1868,11]]}},"keywords":{}}],["component.tojson",{"_index":1176,"title":{},"content":{"96":{"position":[[892,18],[970,18]]}},"keywords":{}}],["componentdidmount",{"_index":1790,"title":{},"content":{"250":{"position":[[460,18]]},"327":{"position":[[638,19],[1194,19]]}},"keywords":{}}],["componentinjectintl",{"_index":2421,"title":{},"content":{"343":{"position":[[617,19]]}},"keywords":{}}],["components.it",{"_index":2632,"title":{},"content":{"451":{"position":[[118,13]]}},"keywords":{}}],["components.support",{"_index":2062,"title":{},"content":{"282":{"position":[[258,18]]}},"keywords":{}}],["components/librari",{"_index":985,"title":{},"content":{"81":{"position":[[159,20],[286,21]]}},"keywords":{}}],["componentsmessag",{"_index":1838,"title":{},"content":{"252":{"position":[[531,17]]}},"keywords":{}}],["compos",{"_index":2061,"title":{},"content":{"282":{"position":[[233,7]]},"410":{"position":[[267,11]]}},"keywords":{}}],["composit",{"_index":1098,"title":{"410":{"position":[[0,11]]}},"content":{"90":{"position":[[104,12]]},"410":{"position":[[23,11]]}},"keywords":{}}],["compound",{"_index":1528,"title":{"187":{"position":[[0,8]]}},"content":{"187":{"position":[[170,8]]}},"keywords":{}}],["compress",{"_index":829,"title":{},"content":{"50":{"position":[[695,11]]}},"keywords":{}}],["compris",{"_index":51,"title":{},"content":{"2":{"position":[[169,9]]}},"keywords":{}}],["concaten",{"_index":2650,"title":{},"content":{"451":{"position":[[1075,13]]},"452":{"position":[[513,13],[1020,13]]}},"keywords":{}}],["concept",{"_index":979,"title":{"81":{"position":[[11,8]]}},"content":{"238":{"position":[[37,7]]},"249":{"position":[[397,7]]},"252":{"position":[[448,8],[755,8]]},"263":{"position":[[246,7]]},"283":{"position":[[298,7]]},"306":{"position":[[37,7]]},"310":{"position":[[867,9]]},"365":{"position":[[37,7]]}},"keywords":{}}],["concis",{"_index":2711,"title":{},"content":{"462":{"position":[[583,7]]}},"keywords":{}}],["condit",{"_index":1534,"title":{},"content":{"194":{"position":[[14,11]]},"452":{"position":[[747,11]]}},"keywords":{}}],["config",{"_index":854,"title":{"440":{"position":[[10,8]]}},"content":{"57":{"position":[[72,7]]},"61":{"position":[[11,6]]},"73":{"position":[[34,6],[115,6]]},"252":{"position":[[1238,6]]},"434":{"position":[[65,7],[146,10]]},"440":{"position":[[49,8]]},"441":{"position":[[103,10]]}},"keywords":{}}],["configur",{"_index":287,"title":{},"content":{"17":{"position":[[534,9]]},"38":{"position":[[699,14]]},"58":{"position":[[52,13]]},"81":{"position":[[64,13]]},"220":{"position":[[127,15]]},"249":{"position":[[199,13],[660,9]]},"250":{"position":[[2244,9]]},"283":{"position":[[100,13],[668,10],[720,13]]},"286":{"position":[[19,9]]},"290":{"position":[[325,13]]},"333":{"position":[[199,9]]},"343":{"position":[[123,15],[918,13]]},"351":{"position":[[19,9]]},"440":{"position":[[116,13]]}},"keywords":{}}],["configuration"",{"_index":768,"title":{},"content":{"46":{"position":[[204,20]]}},"keywords":{}}],["configured.commit",{"_index":215,"title":{},"content":{"11":{"position":[[442,18]]}},"keywords":{}}],["confirm",{"_index":670,"title":{},"content":{"42":{"position":[[985,8]]}},"keywords":{}}],["conflict",{"_index":2570,"title":{},"content":{"414":{"position":[[89,8]]}},"keywords":{}}],["conform",{"_index":1227,"title":{},"content":{"101":{"position":[[207,11]]},"229":{"position":[[277,7]]},"230":{"position":[[392,7]]},"231":{"position":[[624,7]]},"232":{"position":[[287,7]]},"233":{"position":[[441,7]]},"355":{"position":[[286,7]]},"356":{"position":[[401,7]]},"357":{"position":[[560,7]]},"358":{"position":[[624,7]]},"359":{"position":[[287,7]]},"360":{"position":[[441,7]]}},"keywords":{}}],["confus",{"_index":1983,"title":{},"content":{"269":{"position":[[167,9]]}},"keywords":{}}],["conjunct",{"_index":1687,"title":{},"content":{"234":{"position":[[186,13],[546,15]]},"291":{"position":[[95,11]]},"348":{"position":[[1865,11]]},"361":{"position":[[186,13],[546,15]]}},"keywords":{}}],["connect",{"_index":1794,"title":{},"content":{"250":{"position":[[757,7]]},"262":{"position":[[1096,9],[1165,7]]},"345":{"position":[[854,7]]}},"keywords":{}}],["consecut",{"_index":633,"title":{},"content":{"39":{"position":[[449,11]]},"382":{"position":[[76,11]]},"453":{"position":[[33,11],[76,11]]}},"keywords":{}}],["consid",{"_index":576,"title":{},"content":{"36":{"position":[[1811,10]]},"72":{"position":[[126,8]]}},"keywords":{}}],["consider",{"_index":99,"title":{},"content":{"3":{"position":[[334,14]]}},"keywords":{}}],["consist",{"_index":1029,"title":{},"content":{"83":{"position":[[484,11]]},"394":{"position":[[36,8]]},"461":{"position":[[269,10]]}},"keywords":{}}],["console.error",{"_index":1629,"title":{},"content":{"226":{"position":[[96,13]]},"287":{"position":[[96,13]]},"352":{"position":[[96,13]]}},"keywords":{}}],["console.log(this.st",{"_index":2280,"title":{},"content":{"327":{"position":[[436,22],[954,22]]}},"keywords":{}}],["console.warn",{"_index":2076,"title":{},"content":{"288":{"position":[[100,15]]}},"keywords":{}}],["const",{"_index":103,"title":{},"content":{"3":{"position":[[429,5]]},"17":{"position":[[42,5]]},"20":{"position":[[293,5]]},"42":{"position":[[741,5],[1066,5],[1154,5]]},"44":{"position":[[670,5],[693,6]]},"47":{"position":[[549,5],[572,6]]},"48":{"position":[[725,5]]},"71":{"position":[[644,5]]},"73":{"position":[[406,5]]},"76":{"position":[[58,5]]},"89":{"position":[[170,5],[816,5],[850,5]]},"90":{"position":[[760,5]]},"91":{"position":[[370,5]]},"93":{"position":[[443,5],[496,5],[523,5]]},"94":{"position":[[223,5]]},"96":{"position":[[427,5],[820,5],[1369,5]]},"100":{"position":[[1033,5]]},"109":{"position":[[118,5]]},"117":{"position":[[120,5],[371,5]]},"124":{"position":[[94,5],[342,5]]},"131":{"position":[[66,5]]},"133":{"position":[[937,5]]},"141":{"position":[[400,5]]},"148":{"position":[[120,5]]},"175":{"position":[[116,5]]},"184":{"position":[[118,5]]},"195":{"position":[[117,5]]},"216":{"position":[[124,5]]},"221":{"position":[[231,5],[263,5]]},"240":{"position":[[859,5],[1139,5],[1444,5]]},"241":{"position":[[642,5],[796,5]]},"250":{"position":[[1094,5],[1128,5],[1162,5],[1347,5]]},"253":{"position":[[564,5]]},"254":{"position":[[522,5]]},"262":{"position":[[551,5],[614,5]]},"290":{"position":[[553,5]]},"291":{"position":[[273,5],[305,5]]},"328":{"position":[[312,5],[442,5],[484,5]]},"331":{"position":[[2072,5]]},"336":{"position":[[369,5],[401,5]]},"344":{"position":[[302,5],[384,5]]},"345":{"position":[[1270,5],[1335,5]]},"346":{"position":[[329,5],[361,5]]},"367":{"position":[[859,5],[1139,5],[1444,5]]},"368":{"position":[[634,5],[788,5]]},"371":{"position":[[849,5]]},"401":{"position":[[222,5],[351,5],[488,5]]},"403":{"position":[[43,5]]},"404":{"position":[[43,5]]},"405":{"position":[[74,5],[157,5],[246,5],[286,5],[339,6]]},"408":{"position":[[119,5]]},"410":{"position":[[160,5],[327,5],[358,5]]},"435":{"position":[[262,5]]},"444":{"position":[[157,5]]},"445":{"position":[[256,5]]},"448":{"position":[[173,5]]},"450":{"position":[[468,5]]},"452":{"position":[[232,5],[878,5]]},"453":{"position":[[261,5]]},"454":{"position":[[208,5]]},"455":{"position":[[201,5]]},"456":{"position":[[240,5]]}},"keywords":{}}],["construct",{"_index":1363,"title":{},"content":{"136":{"position":[[340,11],[1279,11]]}},"keywords":{}}],["constructor",{"_index":420,"title":{"133":{"position":[[18,12]]}},"content":{"31":{"position":[[463,12]]},"32":{"position":[[637,12]]},"33":{"position":[[595,12]]},"124":{"position":[[32,11]]},"133":{"position":[[58,12],[75,11]]},"134":{"position":[[142,12]]},"141":{"position":[[43,12]]},"222":{"position":[[102,12]]},"347":{"position":[[102,12]]}},"keywords":{}}],["constructs.remov",{"_index":2008,"title":{},"content":{"272":{"position":[[385,17]]}},"keywords":{}}],["consum",{"_index":204,"title":{},"content":{"10":{"position":[[316,7]]},"46":{"position":[[796,10]]},"81":{"position":[[271,8]]},"82":{"position":[[444,9]]},"329":{"position":[[420,7]]},"388":{"position":[[63,10]]},"394":{"position":[[611,8]]},"396":{"position":[[101,10]]}},"keywords":{}}],["consumpt",{"_index":276,"title":{"17":{"position":[[44,11]]}},"content":{},"keywords":{}}],["contain",{"_index":169,"title":{},"content":{"7":{"position":[[254,7]]},"81":{"position":[[124,8]]},"82":{"position":[[333,10]]},"84":{"position":[[58,8]]},"88":{"position":[[41,8]]},"118":{"position":[[50,8],[201,8]]},"133":{"position":[[723,10]]},"135":{"position":[[118,8]]},"220":{"position":[[271,9]]},"221":{"position":[[52,8]]},"238":{"position":[[264,7]]},"263":{"position":[[661,7]]},"264":{"position":[[938,7]]},"278":{"position":[[575,7]]},"306":{"position":[[309,7]]},"343":{"position":[[267,9]]},"365":{"position":[[264,7]]},"390":{"position":[[22,8]]},"393":{"position":[[464,7]]},"396":{"position":[[79,10]]}},"keywords":{}}],["content",{"_index":1642,"title":{},"content":{"228":{"position":[[309,7]]},"250":{"position":[[1682,10]]},"278":{"position":[[499,8]]}},"keywords":{}}],["content.</div>",{"_index":1821,"title":{},"content":{"250":{"position":[[1965,20]]}},"keywords":{}}],["context",{"_index":423,"title":{"249":{"position":[[17,8]]},"280":{"position":[[38,7]]}},"content":{"31":{"position":[[545,7]]},"84":{"position":[[613,7]]},"90":{"position":[[71,7]]},"92":{"position":[[137,8]]},"93":{"position":[[73,8],[234,7]]},"227":{"position":[[309,8]]},"228":{"position":[[363,8]]},"238":{"position":[[359,7]]},"249":{"position":[[56,7],[154,7]]},"250":{"position":[[938,7]]},"263":{"position":[[472,7]]},"276":{"position":[[741,7]]},"283":{"position":[[55,7],[548,7],[684,8]]},"290":{"position":[[309,8]]},"306":{"position":[[404,7]]},"326":{"position":[[32,7]]},"354":{"position":[[309,8]]},"365":{"position":[[359,7]]},"444":{"position":[[90,7]]}},"keywords":{}}],["contextu",{"_index":1375,"title":{},"content":{"136":{"position":[[745,11]]},"309":{"position":[[501,10]]},"332":{"position":[[851,10],[1066,10]]}},"keywords":{}}],["continu",{"_index":2531,"title":{},"content":{"399":{"position":[[12,8]]}},"keywords":{}}],["control",{"_index":437,"title":{},"content":{"31":{"position":[[793,7]]},"42":{"position":[[1306,7],[1809,7]]},"46":{"position":[[265,7]]},"373":{"position":[[31,8]]},"395":{"position":[[359,7]]}},"keywords":{}}],["convent",{"_index":994,"title":{"83":{"position":[[17,11]]}},"content":{"81":{"position":[[518,10]]},"83":{"position":[[597,10],[679,10]]}},"keywords":{}}],["convert",{"_index":728,"title":{},"content":{"44":{"position":[[201,7]]},"47":{"position":[[121,8]]},"373":{"position":[[313,7]]},"389":{"position":[[31,8],[329,7]]},"397":{"position":[[31,8],[329,7]]}},"keywords":{}}],["convey",{"_index":2365,"title":{},"content":{"332":{"position":[[1056,9]]}},"keywords":{}}],["core",{"_index":94,"title":{"218":{"position":[[0,4]]}},"content":{"3":{"position":[[235,4]]},"84":{"position":[[5,4]]},"220":{"position":[[5,4]]},"252":{"position":[[443,4],[750,4]]},"343":{"position":[[5,4]]}},"keywords":{}}],["correct",{"_index":2312,"title":{},"content":{"330":{"position":[[336,7]]},"457":{"position":[[116,7]]}},"keywords":{}}],["correctli",{"_index":2713,"title":{},"content":{"462":{"position":[[626,9]]}},"keywords":{}}],["correspond",{"_index":516,"title":{},"content":{"35":{"position":[[222,13],[279,13],[630,13]]},"60":{"position":[[77,13]]},"136":{"position":[[1001,13]]},"249":{"position":[[712,13]]},"272":{"position":[[30,13]]},"273":{"position":[[410,13]]},"292":{"position":[[84,10]]},"294":{"position":[[84,10]]},"296":{"position":[[270,10]]},"297":{"position":[[210,10]]},"298":{"position":[[84,10]]},"300":{"position":[[78,10],[475,13]]},"301":{"position":[[202,11]]},"302":{"position":[[209,11]]},"303":{"position":[[212,10]]},"304":{"position":[[62,10]]},"306":{"position":[[148,10]]}},"keywords":{}}],["cost",{"_index":811,"title":{},"content":{"50":{"position":[[329,5]]},"82":{"position":[[832,4]]},"83":{"position":[[520,4]]}},"keywords":{}}],["count",{"_index":939,"title":{},"content":{"76":{"position":[[85,7]]},"383":{"position":[[86,7],[142,7]]},"414":{"position":[[198,8],[536,8]]},"457":{"position":[[295,8],[361,6]]},"459":{"position":[[178,7]]},"462":{"position":[[47,5],[103,7],[113,6],[176,6],[242,6],[261,8],[283,8],[321,6],[399,6],[497,6],[616,5]]}},"keywords":{}}],["counterpart",{"_index":2345,"title":{},"content":{"331":{"position":[[1722,11]]}},"keywords":{}}],["coupon",{"_index":473,"title":{},"content":{"33":{"position":[[387,6]]}},"keywords":{}}],["cream",{"_index":2672,"title":{},"content":{"452":{"position":[[607,9],[722,11]]}},"keywords":{}}],["creat",{"_index":693,"title":{"249":{"position":[[0,8]]},"336":{"position":[[0,8]]}},"content":{"42":{"position":[[1654,6]]},"44":{"position":[[923,6]]},"54":{"position":[[104,6]]},"94":{"position":[[1,6]]},"100":{"position":[[154,6],[188,6],[911,7]]},"107":{"position":[[47,6],[114,7]]},"115":{"position":[[47,6],[116,7]]},"133":{"position":[[4,6]]},"136":{"position":[[21,8]]},"152":{"position":[[47,6]]},"160":{"position":[[47,6]]},"173":{"position":[[47,6],[112,7]]},"182":{"position":[[47,6],[114,7]]},"192":{"position":[[47,6],[113,7]]},"207":{"position":[[47,6]]},"214":{"position":[[47,6],[120,7]]},"221":{"position":[[20,6]]},"222":{"position":[[1,7],[87,7]]},"249":{"position":[[71,7]]},"273":{"position":[[67,7]]},"336":{"position":[[60,6]]},"338":{"position":[[107,7]]},"340":{"position":[[90,6]]},"343":{"position":[[858,6]]},"346":{"position":[[20,6]]},"347":{"position":[[1,7],[87,7]]},"393":{"position":[[212,8]]}},"keywords":{}}],["createapp(app",{"_index":2556,"title":{},"content":{"408":{"position":[[131,14]]}},"keywords":{}}],["createcomponentwithintl",{"_index":1166,"title":{},"content":{"96":{"position":[[433,23],[606,23],[673,23]]}},"keywords":{}}],["createcomponentwithintl(<appmain",{"_index":1174,"title":{},"content":{"96":{"position":[[838,35]]}},"keywords":{}}],["createhash",{"_index":2240,"title":{},"content":{"318":{"position":[[172,10]]},"375":{"position":[[173,10]]}},"keywords":{}}],["createintl",{"_index":1564,"title":{"221":{"position":[[0,11]]},"346":{"position":[[0,11]]}},"content":{"221":{"position":[[103,12],[276,11]]},"291":{"position":[[112,11],[132,12],[318,12]]},"336":{"position":[[30,10],[228,12],[414,12]]},"340":{"position":[[76,10]]},"346":{"position":[[188,12],[374,12]]},"408":{"position":[[90,12],[155,12]]},"410":{"position":[[79,12],[202,12]]}},"keywords":{}}],["createintlcach",{"_index":1565,"title":{"222":{"position":[[0,16]]},"347":{"position":[[0,16]]}},"content":{"221":{"position":[[116,16],[245,17]]},"291":{"position":[[145,16],[287,17]]},"336":{"position":[[241,16],[383,17]]},"346":{"position":[[201,16],[343,17]]}},"keywords":{}}],["createrender",{"_index":1089,"title":{},"content":{"89":{"position":[[592,16],[833,16]]}},"keywords":{}}],["creation",{"_index":1352,"title":{},"content":{"135":{"position":[[90,9]]}},"keywords":{}}],["crowdin",{"_index":749,"title":{},"content":{"44":{"position":[[977,7],[997,7]]},"400":{"position":[[111,7],[131,7]]}},"keywords":{}}],["crypto",{"_index":2239,"title":{},"content":{"318":{"position":[[165,6]]},"375":{"position":[[166,6]]}},"keywords":{}}],["css",{"_index":980,"title":{},"content":{"81":{"position":[[52,4]]},"82":{"position":[[53,4]]}},"keywords":{}}],["cta",{"_index":2220,"title":{},"content":{"309":{"position":[[951,4]]},"310":{"position":[[508,4]]},"332":{"position":[[165,3],[334,4],[726,4]]}},"keywords":{}}],["cultur",{"_index":7,"title":{},"content":{"1":{"position":[[55,8],[280,7]]},"2":{"position":[[48,8]]}},"keywords":{}}],["curli",{"_index":394,"title":{},"content":{"28":{"position":[[179,5]]},"39":{"position":[[582,5]]}},"keywords":{}}],["currenc",{"_index":269,"title":{},"content":{"16":{"position":[[55,11],[67,9]]},"232":{"position":[[364,11],[376,9]]},"235":{"position":[[250,10],[687,8],[764,12]]},"298":{"position":[[575,8]]},"359":{"position":[[364,11],[376,9]]},"362":{"position":[[250,10],[688,8],[765,12]]},"411":{"position":[[132,11],[144,9]]}},"keywords":{}}],["currency/eur",{"_index":1401,"title":{},"content":{"138":{"position":[[200,17]]}},"keywords":{}}],["currency/gbp",{"_index":432,"title":{},"content":{"31":{"position":[[711,13]]}},"keywords":{}}],["currency/usd",{"_index":608,"title":{},"content":{"38":{"position":[[271,14]]}},"keywords":{}}],["currency="eur"",{"_index":336,"title":{},"content":{"20":{"position":[[756,24]]}},"keywords":{}}],["currency="usd"",{"_index":2153,"title":{},"content":{"298":{"position":[[664,24]]}},"keywords":{}}],["current",{"_index":120,"title":{},"content":{"4":{"position":[[119,7]]},"5":{"position":[[246,7]]},"36":{"position":[[93,7],[1635,7]]},"37":{"position":[[130,7],[1623,7]]},"101":{"position":[[235,7]]},"119":{"position":[[58,9]]},"135":{"position":[[103,9]]},"186":{"position":[[1,10]]},"224":{"position":[[12,7]]},"232":{"position":[[434,9]]},"249":{"position":[[222,7],[689,7]]},"273":{"position":[[179,7]]},"283":{"position":[[123,7]]},"284":{"position":[[12,7]]},"298":{"position":[[735,9]]},"349":{"position":[[12,7]]},"359":{"position":[[434,9]]},"411":{"position":[[198,9]]},"435":{"position":[[1,9]]}},"keywords":{}}],["custom",{"_index":8,"title":{"401":{"position":[[0,6]]},"405":{"position":[[0,6]]}},"content":{"1":{"position":[[64,7]]},"5":{"position":[[310,6]]},"24":{"position":[[96,6]]},"31":{"position":[[383,6]]},"32":{"position":[[555,6]]},"33":{"position":[[513,6]]},"34":{"position":[[104,9]]},"38":{"position":[[409,6]]},"44":{"position":[[132,6]]},"47":{"position":[[66,6]]},"60":{"position":[[30,6]]},"72":{"position":[[92,6]]},"78":{"position":[[41,9]]},"100":{"position":[[197,6],[280,6]]},"127":{"position":[[335,6]]},"138":{"position":[[79,13],[372,9]]},"226":{"position":[[30,6]]},"253":{"position":[[682,6]]},"262":{"position":[[52,6],[358,6]]},"287":{"position":[[30,6]]},"288":{"position":[[30,6]]},"292":{"position":[[388,9]]},"293":{"position":[[190,13]]},"294":{"position":[[446,9]]},"295":{"position":[[190,13]]},"296":{"position":[[581,9]]},"297":{"position":[[678,9]]},"298":{"position":[[365,9]]},"299":{"position":[[188,13]]},"300":{"position":[[541,9]]},"308":{"position":[[116,9]]},"322":{"position":[[27,6],[163,6],[393,6],[427,6]]},"328":{"position":[[670,10]]},"332":{"position":[[2005,7]]},"344":{"position":[[692,10]]},"352":{"position":[[30,6]]},"381":{"position":[[27,6],[163,6],[392,6],[426,6]]},"393":{"position":[[575,6]]},"428":{"position":[[27,6],[163,6],[393,6],[427,6]]},"451":{"position":[[1173,10]]},"452":{"position":[[414,6],[1084,10]]},"456":{"position":[[908,6],[1007,6]]}},"keywords":{}}],["customcurr",{"_index":875,"title":{},"content":{"60":{"position":[[187,17],[239,15]]}},"keywords":{}}],["customformat",{"_index":1574,"title":{},"content":{"223":{"position":[[98,13],[326,13]]},"283":{"position":[[805,13],[943,13]]},"348":{"position":[[66,13],[276,13]]}},"keywords":{}}],["customtranslatefn("submit"",{"_index":2634,"title":{},"content":{"451":{"position":[[362,39]]}},"keywords":{}}],["customtranslatefn('mint",{"_index":2669,"title":{},"content":{"452":{"position":[[466,26]]}},"keywords":{}}],["d",{"_index":354,"title":{},"content":{"22":{"position":[[88,1]]},"23":{"position":[[16,1]]},"24":{"position":[[16,1]]},"25":{"position":[[16,1]]},"26":{"position":[[16,1]]},"34":{"position":[[334,1]]},"41":{"position":[[18,1]]},"57":{"position":[[18,1]]},"71":{"position":[[18,1]]},"72":{"position":[[16,1]]},"78":{"position":[[279,1]]},"138":{"position":[[610,1]]},"371":{"position":[[18,1]]},"402":{"position":[[75,1]]},"434":{"position":[[18,1]]}},"keywords":{}}],["danger",{"_index":525,"title":{},"content":{"35":{"position":[[928,6]]},"36":{"position":[[1881,6]]},"37":{"position":[[1640,6]]}},"keywords":{}}],["data",{"_index":28,"title":{"250":{"position":[[11,5]]},"258":{"position":[[18,4]]}},"content":{"1":{"position":[[348,4]]},"5":{"position":[[43,4],[229,5],[363,4]]},"28":{"position":[[236,5]]},"29":{"position":[[102,5]]},"30":{"position":[[164,4],[327,4]]},"35":{"position":[[212,5]]},"50":{"position":[[497,4]]},"62":{"position":[[77,4]]},"100":{"position":[[1084,4]]},"107":{"position":[[156,5],[185,5],[350,4]]},"108":{"position":[[109,4]]},"109":{"position":[[270,4]]},"115":{"position":[[158,5],[187,5],[262,4],[408,4]]},"116":{"position":[[113,4],[189,4]]},"117":{"position":[[272,4],[358,4]]},"119":{"position":[[456,4]]},"127":{"position":[[61,5]]},"133":{"position":[[492,4]]},"134":{"position":[[89,4]]},"148":{"position":[[272,4]]},"173":{"position":[[154,5],[183,5],[344,4]]},"174":{"position":[[105,4]]},"175":{"position":[[268,4]]},"182":{"position":[[156,5],[185,5],[258,4],[402,4],[691,4]]},"183":{"position":[[109,4]]},"184":{"position":[[270,4]]},"192":{"position":[[155,5],[184,5],[347,4]]},"193":{"position":[[107,4]]},"195":{"position":[[269,4]]},"214":{"position":[[162,5],[191,5],[368,4]]},"215":{"position":[[121,4]]},"216":{"position":[[276,4]]},"238":{"position":[[196,4]]},"243":{"position":[[1048,4],[1176,4]]},"247":{"position":[[241,4],[340,4]]},"249":{"position":[[36,4]]},"250":{"position":[[35,5],[343,4],[957,5]]},"258":{"position":[[12,4],[74,5],[129,4],[166,6],[368,4]]},"259":{"position":[[82,4],[201,4],[888,5]]},"306":{"position":[[241,4]]},"329":{"position":[[41,4],[851,4],[1000,4],[1140,4]]},"365":{"position":[[196,4]]}},"keywords":{}}],["data/${local",{"_index":1254,"title":{},"content":{"109":{"position":[[383,16]]}},"keywords":{}}],["data/${unsupportedlocal",{"_index":1270,"title":{},"content":{"117":{"position":[[492,28]]},"175":{"position":[[377,27]]},"184":{"position":[[383,27]]},"195":{"position":[[380,27]]},"216":{"position":[[402,26]]}},"keywords":{}}],["data/d",{"_index":2308,"title":{},"content":{"329":{"position":[[976,9],[1116,9]]}},"keywords":{}}],["data/en",{"_index":1244,"title":{},"content":{"108":{"position":[[90,8]]},"116":{"position":[[94,8]]},"174":{"position":[[86,8]]},"183":{"position":[[90,8]]},"193":{"position":[[88,8]]},"194":{"position":[[373,8]]},"215":{"position":[[102,8]]}},"keywords":{}}],["data/fr.js"></script>",{"_index":1891,"title":{},"content":{"259":{"position":[[325,35]]}},"keywords":{}}],["databas",{"_index":1274,"title":{"118":{"position":[[21,9]]}},"content":{"118":{"position":[[82,9],[245,9]]}},"keywords":{}}],["datapolyfil",{"_index":1269,"title":{},"content":{"117":{"position":[[377,13]]}},"keywords":{}}],["datatyp",{"_index":404,"title":{},"content":{"30":{"position":[[181,8]]}},"keywords":{}}],["date",{"_index":318,"title":{"32":{"position":[[0,4]]}},"content":{"20":{"position":[[370,5],[629,5]]},"32":{"position":[[29,5],[187,5],[246,5],[321,5],[395,5],[455,5]]},"34":{"position":[[114,4]]},"59":{"position":[[120,4]]},"77":{"position":[[88,5]]},"78":{"position":[[51,4]]},"89":{"position":[[713,5],[856,4],[867,6]]},"100":{"position":[[1355,6]]},"119":{"position":[[304,4]]},"129":{"position":[[297,4]]},"138":{"position":[[382,4],[903,5],[950,7]]},"223":{"position":[[453,4],[529,4],[613,4],[717,4]]},"229":{"position":[[38,5],[155,4],[212,4]]},"230":{"position":[[38,5],[155,4],[327,4]]},"250":{"position":[[1145,8],[1636,5]]},"252":{"position":[[469,6]]},"262":{"position":[[635,7],[658,4]]},"269":{"position":[[128,5]]},"292":{"position":[[337,4]]},"293":{"position":[[303,5]]},"295":{"position":[[303,5]]},"296":{"position":[[387,5],[406,5]]},"331":{"position":[[824,5]]},"344":{"position":[[367,8]]},"345":{"position":[[1248,5],[1254,4],[1343,5]]},"348":{"position":[[403,4],[479,4],[563,4],[667,4]]},"355":{"position":[[38,4],[164,4],[221,4]]},"356":{"position":[[38,4],[164,4],[336,4]]},"357":{"position":[[207,4],[235,4],[444,4],[513,4],[529,5]]},"436":{"position":[[214,7]]},"443":{"position":[[411,5],[454,5],[466,4],[473,7]]}},"keywords":{}}],["date('2020",{"_index":2123,"title":{},"content":{"296":{"position":[[760,10],[786,10]]},"357":{"position":[[636,10],[658,10]]}},"keywords":{}}],["date(1459832991883",{"_index":2099,"title":{},"content":{"292":{"position":[[559,20],[660,20]]},"293":{"position":[[539,20]]},"294":{"position":[[617,20]]}},"keywords":{}}],["date(1459832991883)}>",{"_index":2114,"title":{},"content":{"295":{"position":[[539,24]]}},"keywords":{}}],["date(1459913574887",{"_index":1812,"title":{},"content":{"250":{"position":[[1646,20]]},"290":{"position":[[854,20]]}},"keywords":{}}],["date(d",{"_index":1918,"title":{},"content":{"262":{"position":[[669,10]]}},"keywords":{}}],["date(valu",{"_index":1647,"title":{},"content":{"229":{"position":[[237,14]]},"230":{"position":[[352,14]]},"355":{"position":[[246,14]]},"356":{"position":[[361,14]]},"357":{"position":[[469,14]]}},"keywords":{}}],["date)/ms_in_day",{"_index":1804,"title":{},"content":{"250":{"position":[[1284,16]]}},"keywords":{}}],["date.getd",{"_index":1921,"title":{},"content":{"262":{"position":[[752,14]]}},"keywords":{}}],["date.getfullyear",{"_index":1919,"title":{},"content":{"262":{"position":[[691,18]]}},"keywords":{}}],["date.getmonth",{"_index":1920,"title":{},"content":{"262":{"position":[[722,15]]}},"keywords":{}}],["date.now",{"_index":331,"title":{},"content":{"20":{"position":[[666,12]]}},"keywords":{}}],["date/tim",{"_index":1400,"title":{},"content":{"138":{"position":[[48,9],[311,9]]},"225":{"position":[[341,9]]},"285":{"position":[[341,9]]},"350":{"position":[[341,9]]},"357":{"position":[[361,9]]}},"keywords":{}}],["date/time/numb",{"_index":1398,"title":{"138":{"position":[[0,16]]}},"content":{},"keywords":{}}],["date={d",{"_index":1094,"title":{},"content":{"89":{"position":[[904,11]]}},"keywords":{}}],["date={post.d",{"_index":1809,"title":{},"content":{"250":{"position":[[1445,16]]}},"keywords":{}}],["dates/tim",{"_index":1312,"title":{},"content":{"127":{"position":[[149,11]]}},"keywords":{}}],["datestyle/timestyleformatrang",{"_index":1256,"title":{},"content":{"111":{"position":[[1,30]]}},"keywords":{}}],["datetim",{"_index":475,"title":{"34":{"position":[[10,8]]},"78":{"position":[[10,8]]}},"content":{"34":{"position":[[45,8]]}},"keywords":{}}],["datetime={`${year",{"_index":1924,"title":{},"content":{"262":{"position":[[880,18]]}},"keywords":{}}],["datetimeformat",{"_index":1257,"title":{},"content":{"112":{"position":[[32,14]]},"243":{"position":[[739,14]]}},"keywords":{}}],["datetimeformat)intl.pluralrul",{"_index":1324,"title":{},"content":{"129":{"position":[[358,31]]}},"keywords":{}}],["datetimeformat/add",{"_index":1264,"title":{},"content":{"116":{"position":[[148,18]]},"117":{"position":[[418,18]]},"118":{"position":[[164,18],[327,18]]},"119":{"position":[[555,18]]}},"keywords":{}}],["datetimeformat/local",{"_index":1263,"title":{},"content":{"116":{"position":[[72,21]]},"117":{"position":[[470,21]]}},"keywords":{}}],["datetimeformat/polyfil",{"_index":1262,"title":{},"content":{"116":{"position":[[24,24]]},"117":{"position":[[306,23]]},"118":{"position":[[116,24],[279,24]]},"119":{"position":[[507,24]]}},"keywords":{}}],["datetimeformat/should",{"_index":1266,"title":{},"content":{"117":{"position":[[46,21]]}},"keywords":{}}],["datetimeformatopt",{"_index":1648,"title":{},"content":{"229":{"position":[[288,22]]},"230":{"position":[[403,22]]},"292":{"position":[[102,21]]},"294":{"position":[[102,21],[228,21]]},"296":{"position":[[288,21],[342,21]]},"355":{"position":[[297,22]]},"356":{"position":[[412,22]]},"357":{"position":[[571,22]]}},"keywords":{}}],["date}>",{"_index":2428,"title":{},"content":{"344":{"position":[[355,9]]}},"keywords":{}}],["day",{"_index":493,"title":{},"content":{"34":{"position":[[336,3],[351,3],[371,3],[427,3]]},"78":{"position":[[281,3],[296,3],[316,3],[372,3]]},"138":{"position":[[612,3],[627,3],[647,3],[703,3]]},"186":{"position":[[134,5]]},"229":{"position":[[389,4]]},"231":{"position":[[189,5]]},"262":{"position":[[746,3],[843,4]]},"297":{"position":[[1675,4],[1775,5],[1807,3]]},"331":{"position":[[326,3]]},"355":{"position":[[398,4]]},"358":{"position":[[189,5]]}},"keywords":{}}],["day="2",{"_index":1085,"title":{},"content":{"89":{"position":[[288,11],[1050,11]]},"100":{"position":[[1197,11]]},"292":{"position":[[729,11]]},"293":{"position":[[608,11]]}},"keywords":{}}],["day="numeric"",{"_index":2087,"title":{},"content":{"290":{"position":[[691,23]]}},"keywords":{}}],["de",{"_index":767,"title":{},"content":{"46":{"position":[[201,2],[510,2],[661,2]]},"329":{"position":[[1009,2],[1149,2]]}},"keywords":{}}],["de.json",{"_index":161,"title":{},"content":{"7":{"position":[[91,7]]}},"keywords":{}}],["decim",{"_index":439,"title":{},"content":{"31":{"position":[[806,7],[905,7]]}},"keywords":{}}],["declar",{"_index":231,"title":{"13":{"position":[[8,11]]},"17":{"position":[[4,9]]},"82":{"position":[[0,9]]},"83":{"position":[[0,9]]}},"content":{"12":{"position":[[191,9]]},"17":{"position":[[635,7]]},"20":{"position":[[284,8]]},"42":{"position":[[2306,8]]},"60":{"position":[[53,8]]},"81":{"position":[[356,9]]},"82":{"position":[[45,7],[66,7],[758,8]]},"83":{"position":[[20,9]]},"84":{"position":[[238,7]]},"225":{"position":[[152,8]]},"238":{"position":[[623,8]]},"253":{"position":[[357,7],[706,7]]},"254":{"position":[[175,9]]},"285":{"position":[[152,8]]},"332":{"position":[[1453,8]]},"343":{"position":[[504,8]]},"350":{"position":[[152,8]]},"365":{"position":[[623,8]]},"371":{"position":[[397,9]]}},"keywords":{}}],["decoupl",{"_index":1884,"title":{},"content":{"258":{"position":[[188,9]]},"259":{"position":[[846,10]]}},"keywords":{}}],["default",{"_index":321,"title":{"119":{"position":[[0,7]]},"445":{"position":[[8,7]]}},"content":{"20":{"position":[[404,7]]},"26":{"position":[[174,7]]},"35":{"position":[[862,7]]},"44":{"position":[[5,7]]},"47":{"position":[[735,8]]},"48":{"position":[[444,8]]},"53":{"position":[[247,7]]},"67":{"position":[[55,8]]},"89":{"position":[[327,7]]},"90":{"position":[[617,7]]},"96":{"position":[[598,7]]},"107":{"position":[[102,7]]},"115":{"position":[[104,7]]},"119":{"position":[[32,7],[144,7]]},"133":{"position":[[337,7]]},"140":{"position":[[522,9]]},"173":{"position":[[100,7]]},"182":{"position":[[102,7]]},"192":{"position":[[101,7]]},"214":{"position":[[108,7]]},"224":{"position":[[170,8]]},"225":{"position":[[1,7]]},"226":{"position":[[55,8]]},"228":{"position":[[1,8]]},"230":{"position":[[223,7]]},"238":{"position":[[80,7],[435,7]]},"241":{"position":[[446,7]]},"244":{"position":[[66,8]]},"252":{"position":[[582,7]]},"253":{"position":[[4,8]]},"262":{"position":[[1032,7]]},"263":{"position":[[291,7],[548,7]]},"280":{"position":[[82,7]]},"284":{"position":[[170,8]]},"285":{"position":[[1,7]]},"286":{"position":[[33,7]]},"287":{"position":[[55,8]]},"288":{"position":[[57,8]]},"292":{"position":[[281,7]]},"294":{"position":[[160,9],[347,7]]},"296":{"position":[[473,7]]},"297":{"position":[[562,7]]},"298":{"position":[[262,7]]},"300":{"position":[[360,7]]},"306":{"position":[[80,7],[480,7]]},"308":{"position":[[4,7]]},"313":{"position":[[73,7],[115,7]]},"318":{"position":[[112,7]]},"320":{"position":[[96,7]]},"325":{"position":[[256,7]]},"327":{"position":[[532,7],[1050,7]]},"331":{"position":[[567,9]]},"344":{"position":[[521,7]]},"345":{"position":[[921,8],[1507,7]]},"349":{"position":[[170,8]]},"350":{"position":[[1,7]]},"351":{"position":[[33,7]]},"352":{"position":[[55,8]]},"356":{"position":[[232,7]]},"365":{"position":[[80,7],[435,7]]},"368":{"position":[[442,7]]},"375":{"position":[[113,7]]},"376":{"position":[[189,9]]},"377":{"position":[[96,7]]},"393":{"position":[[270,7]]},"395":{"position":[[66,7]]},"417":{"position":[[5,7],[47,7]]},"421":{"position":[[130,7]]},"425":{"position":[[189,8]]},"426":{"position":[[96,7]]},"434":{"position":[[127,7]]},"441":{"position":[[54,7]]},"443":{"position":[[929,7]]},"444":{"position":[[363,7]]},"445":{"position":[[331,7],[479,7],[542,7]]},"446":{"position":[[1189,7]]},"447":{"position":[[389,7]]},"450":{"position":[[133,7]]},"451":{"position":[[1248,7],[1399,7],[1858,7]]},"452":{"position":[[1159,7],[1324,8]]},"456":{"position":[[615,7]]},"459":{"position":[[349,7],[477,7]]}},"keywords":{}}],["defaultformat",{"_index":1579,"title":{"225":{"position":[[18,15]]},"285":{"position":[[18,15]]},"350":{"position":[[18,15]]}},"content":{"223":{"position":[[310,15]]},"224":{"position":[[91,14]]},"283":{"position":[[927,15]]},"284":{"position":[[91,14]]},"348":{"position":[[260,15]]},"349":{"position":[[91,14]]}},"keywords":{}}],["defaultlocal",{"_index":864,"title":{"225":{"position":[[0,13]]},"285":{"position":[[0,13]]},"350":{"position":[[0,13]]}},"content":{"58":{"position":[[89,13]]},"93":{"position":[[502,13],[538,13],[698,14],[881,14]]},"223":{"position":[[198,14]]},"224":{"position":[[73,13]]},"225":{"position":[[92,13],[223,13]]},"283":{"position":[[905,14]]},"284":{"position":[[73,13]]},"285":{"position":[[92,13],[223,13]]},"348":{"position":[[238,14]]},"349":{"position":[[73,13]]},"350":{"position":[[92,13],[223,13]]},"408":{"position":[[182,14]]},"410":{"position":[[229,14]]}},"keywords":{}}],["defaultlocale="en"",{"_index":793,"title":{},"content":{"48":{"position":[[566,28]]}},"keywords":{}}],["defaultlocale="en">",{"_index":327,"title":{},"content":{"20":{"position":[[505,32]]}},"keywords":{}}],["defaultmessag",{"_index":179,"title":{},"content":{"8":{"position":[[71,15]]},"11":{"position":[[99,15]]},"14":{"position":[[138,15]]},"17":{"position":[[142,15]]},"42":{"position":[[831,15],[969,15]]},"51":{"position":[[45,15]]},"60":{"position":[[145,15]]},"63":{"position":[[140,14]]},"71":{"position":[[747,15]]},"73":{"position":[[509,15]]},"224":{"position":[[202,16],[269,15]]},"225":{"position":[[132,15]]},"238":{"position":[[512,16]]},"240":{"position":[[764,15],[925,15],[1205,15],[1510,15]]},"241":{"position":[[73,16],[756,15],[838,15]]},"254":{"position":[[296,15],[646,15]]},"284":{"position":[[202,16],[269,15]]},"285":{"position":[[132,15]]},"306":{"position":[[558,16]]},"307":{"position":[[412,14]]},"317":{"position":[[44,15]]},"319":{"position":[[8,14]]},"323":{"position":[[11,14]]},"349":{"position":[[202,16],[269,15]]},"350":{"position":[[132,15]]},"365":{"position":[[512,16]]},"367":{"position":[[764,15],[925,15],[1205,15],[1510,15]]},"368":{"position":[[73,16],[748,15],[830,15]]},"371":{"position":[[533,15],[612,15],[973,15]]},"410":{"position":[[441,15]]},"414":{"position":[[182,15],[520,15]]},"423":{"position":[[44,15]]},"424":{"position":[[8,14]]},"429":{"position":[[11,14]]},"435":{"position":[[303,15],[368,15],[578,15]]},"436":{"position":[[182,15]]},"443":{"position":[[194,16],[266,16],[343,16],[422,16],[495,16],[570,16],[669,16],[784,16]]},"444":{"position":[[207,15],[269,15]]},"445":{"position":[[15,14],[198,14],[306,15],[615,14],[750,14]]},"446":{"position":[[354,15],[606,15],[868,15],[1071,15]]},"448":{"position":[[223,15],[288,15]]},"450":{"position":[[518,15],[616,15],[678,15],[779,15]]},"453":{"position":[[311,15],[370,15],[429,15]]},"454":{"position":[[258,15],[319,15],[408,15]]},"455":{"position":[[250,15],[325,15]]},"456":{"position":[[302,15],[394,15],[478,15]]},"457":{"position":[[26,14],[279,15]]}},"keywords":{}}],["defaultmessage.fallback",{"_index":1725,"title":{},"content":{"239":{"position":[[339,23],[423,23]]},"307":{"position":[[339,23]]},"366":{"position":[[339,23],[423,23]]}},"keywords":{}}],["defaultmessage="'{foo}'"",{"_index":2400,"title":{},"content":{"338":{"position":[[431,34]]}},"keywords":{}}],["defaultmessage="\\\\{foo\\\\}"",{"_index":2399,"title":{},"content":{"338":{"position":[[327,36]]}},"keywords":{}}],["defaultmessage="a<b>strong</b>">",{"_index":2042,"title":{},"content":{"276":{"position":[[411,57],[574,57]]}},"keywords":{}}],["defaultmessage="control",{"_index":677,"title":{},"content":{"42":{"position":[[1238,28]]}},"keywords":{}}],["defaultmessage="delet",{"_index":685,"title":{},"content":{"42":{"position":[[1414,27]]}},"keywords":{}}],["defaultmessage="foo"",{"_index":1867,"title":{},"content":{"254":{"position":[[432,30]]},"322":{"position":[[244,30]]},"371":{"position":[[759,30]]},"381":{"position":[[244,30]]},"428":{"position":[[244,30]]},"435":{"position":[[473,30]]}},"keywords":{}}],["defaultmessage="hello",{"_index":2200,"title":{},"content":{"308":{"position":[[414,27]]},"309":{"position":[[290,27]]},"332":{"position":[[1505,27],[1808,27]]}},"keywords":{}}],["defaultmessage="hello"",{"_index":2706,"title":{},"content":{"461":{"position":[[211,32]]}},"keywords":{}}],["defaultmessage="mi",{"_index":260,"title":{},"content":{"15":{"position":[[143,23]]},"71":{"position":[[176,23]]},"72":{"position":[[306,23]]}},"keywords":{}}],["defaultmessage="submit"",{"_index":2633,"title":{},"content":{"451":{"position":[[282,33]]}},"keywords":{}}],["defaultmessage="thi",{"_index":2603,"title":{},"content":{"446":{"position":[[227,25],[485,25],[722,25],[960,25]]}},"keywords":{}}],["defaultmessage="to",{"_index":2209,"title":{},"content":{"309":{"position":[[668,23]]},"310":{"position":[[225,23]]},"332":{"position":[[114,23],[457,23]]}},"keywords":{}}],["defaultmessage="today",{"_index":329,"title":{},"content":{"20":{"position":[[594,26]]}},"keywords":{}}],["defaultrichtextel",{"_index":617,"title":{"227":{"position":[[0,24]]},"290":{"position":[[0,24]]},"354":{"position":[[0,24]]}},"content":{"38":{"position":[[675,23]]},"223":{"position":[[220,25]]},"283":{"position":[[1086,25]]},"446":{"position":[[1382,23]]}},"keywords":{}}],["defin",{"_index":47,"title":{},"content":{"2":{"position":[[134,7]]},"31":{"position":[[376,6]]},"32":{"position":[[548,6]]},"33":{"position":[[506,6]]},"126":{"position":[[311,8]]},"127":{"position":[[326,8]]},"133":{"position":[[596,7]]},"186":{"position":[[21,7]]},"237":{"position":[[201,8]]},"238":{"position":[[62,6]]},"240":{"position":[[1764,7]]},"241":{"position":[[463,7]]},"263":{"position":[[275,6]]},"297":{"position":[[1210,7]]},"305":{"position":[[201,8]]},"306":{"position":[[62,6],[742,7]]},"345":{"position":[[1121,7]]},"364":{"position":[[201,8]]},"365":{"position":[[62,6]]},"367":{"position":[[1764,7]]},"368":{"position":[[459,7]]},"452":{"position":[[158,7]]}},"keywords":{}}],["definemessag",{"_index":274,"title":{"17":{"position":[[20,13]]}},"content":{"17":{"position":[[8,15],[58,15],[692,13]]},"240":{"position":[[876,16],[1156,16],[1461,16],[1778,14]]},"241":{"position":[[108,15],[588,16],[605,14],[659,16],[808,15]]},"254":{"position":[[226,16],[261,16]]},"313":{"position":[[156,17],[174,16]]},"367":{"position":[[876,16],[1156,16],[1461,16],[1778,14]]},"368":{"position":[[108,15],[584,16],[601,14],[651,16],[800,15]]},"371":{"position":[[448,16],[465,14],[498,16],[582,15]]},"417":{"position":[[88,17],[106,16]]},"435":{"position":[[41,14],[56,15],[212,16],[229,14],[279,16],[352,15]]},"444":{"position":[[122,16],[174,16]]},"445":{"position":[[221,16],[273,16]]},"448":{"position":[[138,16],[190,16]]},"450":{"position":[[433,16],[485,16]]},"453":{"position":[[226,16],[278,16]]},"454":{"position":[[173,16],[225,16]]},"455":{"position":[[166,16],[218,16]]},"456":{"position":[[204,16],[257,16]]}},"keywords":{}}],["definemessage(messagedescriptor",{"_index":1745,"title":{},"content":{"241":{"position":[[236,32]]},"368":{"position":[[236,32]]}},"keywords":{}}],["definemessages/definemessag",{"_index":1743,"title":{"241":{"position":[[0,29]]},"368":{"position":[[0,29]]}},"content":{},"keywords":{}}],["definit",{"_index":1618,"title":{},"content":{"223":{"position":[[1846,10]]},"282":{"position":[[449,12]]},"348":{"position":[[1924,10]]}},"keywords":{}}],["degre",{"_index":1499,"title":{},"content":{"186":{"position":[[142,8]]}},"keywords":{}}],["delet",{"_index":2524,"title":{},"content":{"394":{"position":[[667,7]]}},"keywords":{}}],["delta",{"_index":2334,"title":{},"content":{"331":{"position":[[841,5],[1323,5]]}},"keywords":{}}],["depend",{"_index":353,"title":{"129":{"position":[[12,11]]}},"content":{"22":{"position":[[58,13]]},"101":{"position":[[679,12]]},"107":{"position":[[319,12]]},"115":{"position":[[377,12]]},"152":{"position":[[172,12]]},"160":{"position":[[146,12]]},"173":{"position":[[313,12]]},"182":{"position":[[371,12],[660,12]]},"192":{"position":[[316,12]]},"214":{"position":[[337,12]]},"246":{"position":[[180,13],[259,13]]},"257":{"position":[[26,10]]},"272":{"position":[[403,10]]},"330":{"position":[[126,10]]},"372":{"position":[[460,9]]}},"keywords":{}}],["deprec",{"_index":2272,"title":{},"content":{"326":{"position":[[161,10]]},"327":{"position":[[117,10]]},"330":{"position":[[611,10]]}},"keywords":{}}],["descend",{"_index":2562,"title":{},"content":{"410":{"position":[[333,10]]}},"keywords":{}}],["describ",{"_index":139,"title":{},"content":{"5":{"position":[[133,9]]},"96":{"position":[[282,9]]},"223":{"position":[[2063,9]]},"348":{"position":[[2196,9]]}},"keywords":{}}],["describe('<shortdate>",{"_index":1091,"title":{},"content":{"89":{"position":[[744,29]]}},"keywords":{}}],["descript",{"_index":182,"title":{"444":{"position":[[8,12]]}},"content":{"8":{"position":[[144,12]]},"11":{"position":[[172,12]]},"14":{"position":[[70,12],[99,11]]},"15":{"position":[[104,11]]},"17":{"position":[[74,12],[103,11]]},"42":{"position":[[863,12],[1005,12]]},"71":{"position":[[818,11],[854,11]]},"73":{"position":[[580,11],[621,11]]},"238":{"position":[[536,13]]},"240":{"position":[[959,12],[1239,12],[1569,12]]},"241":{"position":[[43,13],[713,12],[872,12]]},"254":{"position":[[319,12],[669,12]]},"306":{"position":[[582,13]]},"317":{"position":[[68,12]]},"332":{"position":[[1093,11]]},"365":{"position":[[536,13]]},"367":{"position":[[959,12],[1239,12],[1569,12]]},"368":{"position":[[43,13],[705,12],[864,12]]},"371":{"position":[[556,12],[646,12],[996,12]]},"393":{"position":[[480,12]]},"423":{"position":[[68,12]]},"435":{"position":[[326,12]]},"444":{"position":[[15,11],[61,11],[230,12],[426,13],[495,11],[627,11]]},"445":{"position":[[349,12],[388,12]]},"451":{"position":[[1769,11]]}},"keywords":{}}],["description"",{"_index":2640,"title":{},"content":{"451":{"position":[[611,20],[916,17]]}},"keywords":{}}],["description="a",{"_index":258,"title":{},"content":{"15":{"position":[[67,19]]},"71":{"position":[[142,19]]},"72":{"position":[[272,19]]}},"keywords":{}}],["description="bar"",{"_index":1868,"title":{},"content":{"254":{"position":[[463,27]]},"371":{"position":[[790,27]]},"435":{"position":[[504,27]]}},"keywords":{}}],["description="delet",{"_index":686,"title":{},"content":{"42":{"position":[[1460,24]]}},"keywords":{}}],["description="greet",{"_index":2198,"title":{},"content":{"308":{"position":[[350,26]]},"309":{"position":[[226,26]]}},"keywords":{}}],["description="titl",{"_index":679,"title":{},"content":{"42":{"position":[[1279,23]]}},"keywords":{}}],["descriptor",{"_index":1600,"title":{"238":{"position":[[8,11]]},"265":{"position":[[44,12]]},"306":{"position":[[8,11]]},"365":{"position":[[8,11]]}},"content":{"223":{"position":[[1170,11],[1314,11]]},"224":{"position":[[247,10]]},"238":{"position":[[26,10],[151,11],[589,10]]},"240":{"position":[[105,11],[229,11]]},"241":{"position":[[540,10]]},"263":{"position":[[235,10],[326,10],[639,11]]},"265":{"position":[[413,11]]},"267":{"position":[[278,10]]},"284":{"position":[[247,10]]},"304":{"position":[[86,11]]},"306":{"position":[[26,10],[172,11],[196,11],[623,11],[730,11]]},"313":{"position":[[89,11]]},"315":{"position":[[21,11]]},"318":{"position":[[20,11]]},"348":{"position":[[1120,11],[1264,11]]},"349":{"position":[[247,10]]},"365":{"position":[[26,10],[151,11],[589,10]]},"367":{"position":[[105,11],[229,11]]},"368":{"position":[[536,10]]},"375":{"position":[[20,11]]},"376":{"position":[[176,12]]},"417":{"position":[[21,11]]},"425":{"position":[[176,12]]},"444":{"position":[[42,11]]},"445":{"position":[[45,11]]}},"keywords":{}}],["descriptormessag",{"_index":1839,"title":{},"content":{"252":{"position":[[549,17]]}},"keywords":{}}],["design",{"_index":124,"title":{},"content":{"4":{"position":[[187,8]]},"34":{"position":[[272,10]]},"58":{"position":[[15,8]]},"78":{"position":[[217,10]]},"138":{"position":[[548,10]]},"227":{"position":[[166,6]]},"264":{"position":[[177,6]]},"290":{"position":[[166,6]]},"354":{"position":[[166,6]]}},"keywords":{}}],["detail",{"_index":453,"title":{},"content":{"31":{"position":[[1312,8]]},"32":{"position":[[415,6]]},"43":{"position":[[175,7]]},"57":{"position":[[250,7]]},"68":{"position":[[160,8]]},"133":{"position":[[542,8]]},"240":{"position":[[823,8]]},"245":{"position":[[160,8]]},"249":{"position":[[975,8]]},"250":{"position":[[2047,8]]},"340":{"position":[[211,8]]},"367":{"position":[[823,8]]},"388":{"position":[[160,8]]},"396":{"position":[[199,8]]},"437":{"position":[[104,7]]}},"keywords":{}}],["details.chang",{"_index":2259,"title":{},"content":{"325":{"position":[[241,14]]}},"keywords":{}}],["details.formatrel",{"_index":2262,"title":{},"content":{"325":{"position":[[585,22]]}},"keywords":{}}],["details.intlprovid",{"_index":2264,"title":{},"content":{"325":{"position":[[803,20]]}},"keywords":{}}],["details.intlshap",{"_index":2258,"title":{},"content":{"325":{"position":[[173,17]]}},"keywords":{}}],["details.messag",{"_index":2263,"title":{},"content":{"325":{"position":[[721,15]]}},"keywords":{}}],["details.reactintllocaledata",{"_index":2257,"title":{},"content":{"325":{"position":[[80,27]]}},"keywords":{}}],["detect",{"_index":1245,"title":{"109":{"position":[[28,10]]},"117":{"position":[[28,10]]},"148":{"position":[[28,10]]},"154":{"position":[[28,10]]},"162":{"position":[[28,10]]},"175":{"position":[[28,10]]},"184":{"position":[[28,10]]},"195":{"position":[[28,10]]},"201":{"position":[[28,10]]},"209":{"position":[[28,10]]},"216":{"position":[[28,10]]}},"content":{"119":{"position":[[85,6]]},"194":{"position":[[26,9]]}},"keywords":{}}],["determin",{"_index":138,"title":{},"content":{"5":{"position":[[101,9]]},"134":{"position":[[66,9],[200,10]]},"459":{"position":[[56,10]]}},"keywords":{}}],["dev",{"_index":228,"title":{},"content":{"12":{"position":[[154,4]]},"246":{"position":[[321,4]]}},"keywords":{}}],["dev.es6",{"_index":1758,"title":{},"content":{"246":{"position":[[240,8]]}},"keywords":{}}],["develop",{"_index":224,"title":{"56":{"position":[[0,7]]}},"content":{"12":{"position":[[99,9]]},"38":{"position":[[86,10]]},"101":{"position":[[31,10]]},"224":{"position":[[134,11]]},"247":{"position":[[534,11]]},"274":{"position":[[426,10]]},"280":{"position":[[39,9]]},"284":{"position":[[134,11]]},"349":{"position":[[134,11]]},"457":{"position":[[136,9]]}},"keywords":{}}],["development.th",{"_index":2049,"title":{},"content":{"278":{"position":[[197,15]]}},"keywords":{}}],["dichotomy.=valu",{"_index":571,"title":{},"content":{"36":{"position":[[1535,17]]},"37":{"position":[[1523,17]]}},"keywords":{}}],["differ",{"_index":98,"title":{},"content":{"3":{"position":[[306,9]]},"7":{"position":[[214,9]]},"47":{"position":[[26,9]]},"83":{"position":[[528,9]]},"89":{"position":[[401,9]]},"230":{"position":[[175,7]]},"278":{"position":[[370,9]]},"308":{"position":[[212,9]]},"331":{"position":[[186,9]]},"356":{"position":[[184,7]]},"395":{"position":[[22,10]]},"453":{"position":[[112,11],[127,9]]}},"keywords":{}}],["digest",{"_index":2242,"title":{},"content":{"318":{"position":[[232,6]]},"375":{"position":[[233,6]]}},"keywords":{}}],["digit"",{"_index":1086,"title":{},"content":{"89":{"position":[[300,11],[1062,11]]},"100":{"position":[[1209,11],[1235,11]]},"292":{"position":[[741,11]]},"293":{"position":[[620,11]]}},"keywords":{}}],["dir",{"_index":2473,"title":{},"content":{"374":{"position":[[157,3]]}},"keywords":{}}],["directli",{"_index":1041,"title":{},"content":{"84":{"position":[[302,8]]},"250":{"position":[[268,9]]},"282":{"position":[[184,9]]},"326":{"position":[[241,8]]},"343":{"position":[[849,8]]},"460":{"position":[[136,8]]}},"keywords":{}}],["discount</link>",{"_index":611,"title":{},"content":{"38":{"position":[[364,21]]}},"keywords":{}}],["discourag",{"_index":718,"title":{},"content":{"43":{"position":[[22,12]]}},"keywords":{}}],["disjunct",{"_index":1686,"title":{},"content":{"234":{"position":[[170,13]]},"361":{"position":[[170,13]]}},"keywords":{}}],["disk",{"_index":1161,"title":{},"content":{"96":{"position":[[128,4]]}},"keywords":{}}],["display",{"_index":409,"title":{},"content":{"30":{"position":[[306,7]]},"31":{"position":[[923,8]]},"75":{"position":[[266,7]]},"124":{"position":[[317,10]]},"233":{"position":[[588,8]]},"235":{"position":[[591,7],[714,7],[848,7]]},"360":{"position":[[588,8]]},"362":{"position":[[592,7],[715,7],[849,7]]}},"keywords":{}}],["display">",{"_index":1212,"title":{},"content":{"100":{"position":[[1107,17]]}},"keywords":{}}],["display')).tohavetextcontent('11/03/2019",{"_index":1221,"title":{},"content":{"100":{"position":[[1438,42]]}},"keywords":{}}],["displaynam",{"_index":1232,"title":{},"content":{"103":{"position":[[32,12]]},"105":{"position":[[20,12]]}},"keywords":{}}],["displaynameopt",{"_index":2186,"title":{},"content":{"303":{"position":[[226,19]]}},"keywords":{}}],["displaynames/local",{"_index":1243,"title":{},"content":{"108":{"position":[[70,19]]},"109":{"position":[[363,19]]}},"keywords":{}}],["displaynames/polyfil",{"_index":1242,"title":{},"content":{"108":{"position":[[24,22]]},"109":{"position":[[304,21]]}},"keywords":{}}],["displaynames/should",{"_index":1247,"title":{},"content":{"109":{"position":[[46,19]]}},"keywords":{}}],["disrupt",{"_index":1932,"title":{},"content":{"263":{"position":[[100,10]]}},"keywords":{}}],["distinguish",{"_index":2054,"title":{},"content":{"278":{"position":[[595,11]]}},"keywords":{}}],["distribut",{"_index":761,"title":{"45":{"position":[[8,12]]},"48":{"position":[[0,13]]},"80":{"position":[[0,12]]}},"content":{"48":{"position":[[40,12]]},"246":{"position":[[105,11]]},"388":{"position":[[138,12]]},"396":{"position":[[177,12]]}},"keywords":{}}],["div",{"_index":2196,"title":{},"content":{"308":{"position":[[237,7]]}},"keywords":{}}],["diverg",{"_index":1289,"title":{},"content":{"123":{"position":[[327,9]]}},"keywords":{}}],["divid",{"_index":1155,"title":{},"content":{"95":{"position":[[26,7]]}},"keywords":{}}],["do",{"_index":2013,"title":{"273":{"position":[[11,5]]},"277":{"position":[[11,5]]}},"content":{},"keywords":{}}],["doc",{"_index":1188,"title":{},"content":{"100":{"position":[[144,5]]},"249":{"position":[[961,4]]},"250":{"position":[[2014,4],[2033,4]]},"318":{"position":[[223,4]]},"375":{"position":[[224,4]]}},"keywords":{}}],["document",{"_index":1182,"title":{},"content":{"97":{"position":[[98,14]]},"408":{"position":[[52,10]]},"409":{"position":[[80,10]]}},"keywords":{}}],["document.getelementbyid('contain",{"_index":1783,"title":{},"content":{"249":{"position":[[890,36]]},"250":{"position":[[1725,36]]},"261":{"position":[[346,36]]},"290":{"position":[[904,36]]}},"keywords":{}}],["doesn't",{"_index":446,"title":{},"content":{"31":{"position":[[1036,7]]},"36":{"position":[[1341,7],[1691,7]]},"37":{"position":[[1329,7]]},"240":{"position":[[1849,7]]},"297":{"position":[[1731,7]]},"323":{"position":[[70,7]]},"367":{"position":[[1849,7]]},"429":{"position":[[70,7]]},"446":{"position":[[926,7],[1037,7]]}},"keywords":{}}],["doesn’t",{"_index":2021,"title":{},"content":{"273":{"position":[[395,7]]}},"keywords":{}}],["dog",{"_index":940,"title":{},"content":{"76":{"position":[[107,4],[120,5]]},"383":{"position":[[108,4],[124,6],[171,4],[194,6]]},"446":{"position":[[300,7],[413,7]]},"459":{"position":[[200,4],[216,6],[321,3],[343,5]]}},"keywords":{}}],["dom",{"_index":788,"title":{"90":{"position":[[0,3]]},"97":{"position":[[0,3]]}},"content":{"48":{"position":[[289,4]]},"90":{"position":[[16,3]]},"95":{"position":[[78,3],[178,3]]},"97":{"position":[[27,3]]},"250":{"position":[[1019,5]]},"261":{"position":[[204,4]]},"451":{"position":[[2067,3]]}},"keywords":{}}],["dom/jest",{"_index":1204,"title":{},"content":{"100":{"position":[[861,8]]}},"keywords":{}}],["dompars",{"_index":2009,"title":{},"content":{"272":{"position":[[417,9],[529,9]]}},"keywords":{}}],["don't",{"_index":574,"title":{},"content":{"36":{"position":[[1657,5]]},"38":{"position":[[144,5]]},"50":{"position":[[299,5]]},"62":{"position":[[28,5]]},"272":{"position":[[224,5],[506,5]]},"318":{"position":[[32,5]]},"375":{"position":[[32,5]]},"446":{"position":[[1426,5]]},"454":{"position":[[149,5]]},"455":{"position":[[142,5]]}},"keywords":{}}],["done",{"_index":390,"title":{},"content":{"28":{"position":[[104,4]]},"136":{"position":[[56,4]]}},"keywords":{}}],["done.th",{"_index":187,"title":{},"content":{"8":{"position":[[219,8]]}},"keywords":{}}],["don’t",{"_index":2622,"title":{},"content":{"449":{"position":[[329,5]]}},"keywords":{}}],["dosometh",{"_index":2279,"title":{},"content":{"327":{"position":[[413,11],[931,11]]}},"keywords":{}}],["dot",{"_index":1939,"title":{},"content":{"264":{"position":[[305,5]]},"456":{"position":[[975,4]]}},"keywords":{}}],["down",{"_index":1035,"title":{"84":{"position":[[8,4]]}},"content":{"84":{"position":[[297,4],[604,4]]},"141":{"position":[[275,4]]},"194":{"position":[[82,4]]}},"keywords":{}}],["download",{"_index":214,"title":{},"content":{"11":{"position":[[382,8]]}},"keywords":{}}],["dropbox",{"_index":2056,"title":{},"content":{"280":{"position":[[22,7]]}},"keywords":{}}],["dual",{"_index":556,"title":{},"content":{"36":{"position":[[856,6]]}},"keywords":{}}],["due",{"_index":1033,"title":{},"content":{"83":{"position":[[657,3]]},"458":{"position":[[99,3]]}},"keywords":{}}],["duplic",{"_index":2051,"title":{},"content":{"278":{"position":[[259,9]]}},"keywords":{}}],["durat",{"_index":444,"title":{},"content":{"31":{"position":[[949,8],[1110,8]]}},"keywords":{}}],["durationformat",{"_index":1458,"title":{},"content":{"144":{"position":[[32,14]]}},"keywords":{}}],["durationformat/polyfil",{"_index":1461,"title":{},"content":{"147":{"position":[[24,24]]},"148":{"position":[[306,23]]}},"keywords":{}}],["durationformat/should",{"_index":1462,"title":{},"content":{"148":{"position":[[46,21]]}},"keywords":{}}],["dure",{"_index":174,"title":{},"content":{"7":{"position":[[336,6]]},"42":{"position":[[2263,6]]},"46":{"position":[[1175,6]]},"51":{"position":[[186,6]]},"58":{"position":[[203,6]]},"71":{"position":[[258,6]]},"135":{"position":[[74,6]]},"140":{"position":[[562,6]]},"224":{"position":[[127,6]]},"273":{"position":[[322,6]]},"278":{"position":[[190,6]]},"280":{"position":[[176,6]]},"284":{"position":[[127,6]]},"349":{"position":[[127,6]]},"401":{"position":[[460,6]]},"412":{"position":[[210,6],[279,6]]}},"keywords":{}}],["dynam",{"_index":786,"title":{"109":{"position":[[0,7]]},"117":{"position":[[0,7]]},"148":{"position":[[0,7]]},"154":{"position":[[0,7]]},"162":{"position":[[0,7]]},"175":{"position":[[0,7]]},"184":{"position":[[0,7]]},"195":{"position":[[0,7]]},"201":{"position":[[0,7]]},"209":{"position":[[0,7]]},"216":{"position":[[0,7]]}},"content":{"48":{"position":[[194,7]]}},"keywords":{}}],["e",{"_index":494,"title":{},"content":{"34":{"position":[[349,1],[363,1]]},"78":{"position":[[294,1],[308,1]]},"136":{"position":[[1179,3]]},"138":{"position":[[625,1],[639,1]]}},"keywords":{}}],["e..ee",{"_index":496,"title":{},"content":{"34":{"position":[[383,6]]},"78":{"position":[[328,6]]},"138":{"position":[[659,6]]}},"keywords":{}}],["e.g",{"_index":168,"title":{},"content":{"7":{"position":[[243,5]]},"54":{"position":[[17,4]]},"59":{"position":[[90,3]]},"69":{"position":[[43,4]]},"94":{"position":[[40,4]]},"119":{"position":[[478,4]]},"125":{"position":[[181,5]]},"127":{"position":[[417,5]]},"136":{"position":[[574,3],[1060,4]]},"187":{"position":[[73,5]]},"227":{"position":[[196,4]]},"231":{"position":[[530,6]]},"243":{"position":[[818,4],[955,4]]},"245":{"position":[[331,4]]},"250":{"position":[[405,5]]},"251":{"position":[[64,4]]},"259":{"position":[[252,5]]},"261":{"position":[[71,5]]},"262":{"position":[[100,5]]},"264":{"position":[[311,5]]},"272":{"position":[[89,4]]},"290":{"position":[[196,4]]},"308":{"position":[[230,6]]},"320":{"position":[[54,4]]},"321":{"position":[[53,4]]},"329":{"position":[[622,4],[758,4]]},"331":{"position":[[1375,4]]},"334":{"position":[[64,4]]},"335":{"position":[[63,4]]},"339":{"position":[[43,5]]},"342":{"position":[[246,4],[468,4]]},"354":{"position":[[196,4]]},"358":{"position":[[530,6]]},"377":{"position":[[54,4]]},"378":{"position":[[53,4]]},"383":{"position":[[73,4]]},"414":{"position":[[129,4]]},"426":{"position":[[54,4]]},"427":{"position":[[53,4]]},"451":{"position":[[192,5]]}},"keywords":{}}],["each",{"_index":100,"title":{},"content":{"3":{"position":[[353,4]]},"81":{"position":[[311,4]]},"133":{"position":[[404,4]]},"224":{"position":[[234,4]]},"243":{"position":[[1057,4],[1185,4]]},"284":{"position":[[234,4]]},"329":{"position":[[860,4]]},"349":{"position":[[234,4]]},"376":{"position":[[153,4]]},"425":{"position":[[153,4]]}},"keywords":{}}],["earlier",{"_index":914,"title":{},"content":{"67":{"position":[[91,7]]},"244":{"position":[[102,7]]}},"keywords":{}}],["eas",{"_index":2016,"title":{},"content":{"273":{"position":[[126,4]]}},"keywords":{}}],["easi",{"_index":1184,"title":{},"content":{"99":{"position":[[102,4]]},"451":{"position":[[57,4],[135,4]]},"452":{"position":[[78,4]]},"457":{"position":[[85,4]]}},"keywords":{}}],["easili",{"_index":1957,"title":{},"content":{"266":{"position":[[100,6]]},"328":{"position":[[708,7]]},"344":{"position":[[730,7]]},"393":{"position":[[205,6]]}},"keywords":{}}],["ecma",{"_index":34,"title":{},"content":{"1":{"position":[[460,4]]},"101":{"position":[[64,4]]},"123":{"position":[[412,4]]}},"keywords":{}}],["ecma402'",{"_index":481,"title":{},"content":{"34":{"position":[[175,9]]},"78":{"position":[[112,9]]},"138":{"position":[[443,9]]}},"keywords":{}}],["ecmascript",{"_index":1226,"title":{},"content":{"101":{"position":[[196,10]]},"252":{"position":[[997,10]]}},"keywords":{}}],["edg",{"_index":897,"title":{},"content":{"65":{"position":[[65,5],[754,5]]},"243":{"position":[[49,5],[966,5]]},"329":{"position":[[769,5]]}},"keywords":{}}],["edit",{"_index":185,"title":{},"content":{"8":{"position":[[186,4]]}},"keywords":{}}],["editor",{"_index":941,"title":{},"content":{"77":{"position":[[6,6]]},"125":{"position":[[193,6],[376,6]]},"135":{"position":[[171,6]]},"136":{"position":[[150,6],[384,6],[1071,6],[1340,6],[1421,6],[1517,6]]},"138":{"position":[[139,6],[857,6]]},"229":{"position":[[317,6]]},"230":{"position":[[432,6]]},"231":{"position":[[673,6],[722,6]]},"232":{"position":[[325,6],[585,6],[692,6]]},"233":{"position":[[603,6],[646,6],[709,6]]},"234":{"position":[[493,6],[577,6]]},"235":{"position":[[454,6],[533,6],[668,6],[792,6]]},"240":{"position":[[838,6],[1118,6],[1423,6]]},"292":{"position":[[523,6],[624,6]]},"293":{"position":[[498,6]]},"294":{"position":[[581,6]]},"295":{"position":[[498,6]]},"296":{"position":[[716,6]]},"297":{"position":[[813,6],[1285,6]]},"298":{"position":[[500,6],[597,6],[895,6],[1036,6]]},"299":{"position":[[505,6]]},"300":{"position":[[676,6]]},"301":{"position":[[404,6],[509,6]]},"302":{"position":[[414,6]]},"303":{"position":[[421,6],[529,6]]},"308":{"position":[[294,6],[536,6]]},"309":{"position":[[170,6],[621,6]]},"310":{"position":[[178,6]]},"355":{"position":[[326,6]]},"356":{"position":[[441,6]]},"357":{"position":[[600,6]]},"358":{"position":[[673,6],[722,6]]},"359":{"position":[[325,6],[581,6],[688,6]]},"360":{"position":[[603,6],[646,6],[709,6]]},"361":{"position":[[493,6],[577,6]]},"362":{"position":[[455,6],[534,6],[669,6],[793,6]]},"367":{"position":[[838,6],[1118,6],[1423,6]]}},"keywords":{}}],["effect",{"_index":1789,"title":{},"content":{"250":{"position":[[450,6]]},"272":{"position":[[484,11]]},"332":{"position":[[954,11]]}},"keywords":{}}],["effici",{"_index":828,"title":{},"content":{"50":{"position":[[683,11]]}},"keywords":{}}],["el1",{"_index":2549,"title":{},"content":{"405":{"position":[[181,5]]}},"keywords":{}}],["el1.key",{"_index":2551,"title":{},"content":{"405":{"position":[[207,7]]}},"keywords":{}}],["el2",{"_index":2550,"title":{},"content":{"405":{"position":[[187,4]]}},"keywords":{}}],["el2.key",{"_index":2552,"title":{},"content":{"405":{"position":[[220,7]]}},"keywords":{}}],["electron",{"_index":814,"title":{},"content":{"50":{"position":[[368,8]]}},"keywords":{}}],["element",{"_index":402,"title":{"443":{"position":[[10,9]]}},"content":{"30":{"position":[[107,8]]},"31":{"position":[[139,7],[412,8]]},"32":{"position":[[137,7],[584,8]]},"33":{"position":[[137,7],[542,8]]},"90":{"position":[[122,7],[264,7],[766,7],[967,7]]},"91":{"position":[[376,7]]},"234":{"position":[[268,9]]},"250":{"position":[[380,7]]},"272":{"position":[[452,7]]},"278":{"position":[[621,9]]},"282":{"position":[[208,8]]},"290":{"position":[[491,8]]},"292":{"position":[[451,7]]},"294":{"position":[[509,7]]},"296":{"position":[[644,7]]},"297":{"position":[[741,7]]},"298":{"position":[[428,7]]},"300":{"position":[[495,7],[604,7]]},"308":{"position":[[179,7]]},"361":{"position":[[268,9]]},"443":{"position":[[35,8],[146,9],[162,7],[994,10]]},"451":{"position":[[2071,9]]}},"keywords":{}}],["element.current.myclassfn",{"_index":1117,"title":{},"content":{"90":{"position":[[987,27]]},"91":{"position":[[454,28]]}},"keywords":{}}],["emb",{"_index":601,"title":{},"content":{"38":{"position":[[100,5]]},"136":{"position":[[668,5]]}},"keywords":{}}],["embed",{"_index":422,"title":{"274":{"position":[[14,8]]}},"content":{"31":{"position":[[487,9]]},"38":{"position":[[17,8],[462,8]]},"136":{"position":[[541,8],[1678,8]]},"225":{"position":[[332,8]]},"272":{"position":[[665,8]]},"273":{"position":[[268,8],[350,8],[512,8]]},"285":{"position":[[332,8]]},"309":{"position":[[462,9]]},"310":{"position":[[35,9]]},"332":{"position":[[44,10]]},"350":{"position":[[332,8]]}},"keywords":{}}],["emir",{"_index":84,"title":{},"content":{"2":{"position":[[781,8]]}},"keywords":{}}],["emit",{"_index":866,"title":{},"content":{"58":{"position":[[175,4]]}},"keywords":{}}],["emoji",{"_index":2624,"title":{"450":{"position":[[3,6]]}},"content":{"450":{"position":[[24,6],[191,7],[270,7],[406,6]]}},"keywords":{}}],["emojis.cross",{"_index":2627,"title":{},"content":{"450":{"position":[[371,12]]}},"keywords":{}}],["empti",{"_index":1637,"title":{},"content":{"228":{"position":[[91,5],[128,5],[180,5]]},"239":{"position":[[142,5]]},"307":{"position":[[142,5]]},"366":{"position":[[142,5]]},"423":{"position":[[287,6]]}},"keywords":{}}],["en",{"_index":69,"title":{},"content":{"2":{"position":[[540,2]]},"3":{"position":[[448,3]]},"10":{"position":[[116,2],[328,2]]},"82":{"position":[[420,2]]},"83":{"position":[[318,2],[390,2],[446,2]]},"93":{"position":[[518,4]]},"96":{"position":[[487,6]]},"107":{"position":[[338,4]]},"108":{"position":[[118,2]]},"115":{"position":[[396,4]]},"116":{"position":[[122,2]]},"125":{"position":[[325,3]]},"133":{"position":[[993,3]]},"135":{"position":[[204,3]]},"136":{"position":[[201,3]]},"138":{"position":[[218,3],[923,3]]},"141":{"position":[[729,5]]},"168":{"position":[[68,6],[82,6],[89,5],[124,6],[131,5],[140,4]]},"173":{"position":[[332,4]]},"174":{"position":[[114,2]]},"182":{"position":[[390,4],[679,4]]},"183":{"position":[[118,2]]},"192":{"position":[[335,4]]},"193":{"position":[[116,2]]},"214":{"position":[[356,4]]},"215":{"position":[[130,2]]},"234":{"position":[[483,3]]},"253":{"position":[[779,4]]},"301":{"position":[[394,3]]},"302":{"position":[[404,3]]},"303":{"position":[[411,3]]},"361":{"position":[[483,3]]},"392":{"position":[[260,2],[288,2]]},"408":{"position":[[176,5],[197,5]]},"410":{"position":[[223,5],[244,5]]}},"keywords":{}}],["en').format",{"_index":1366,"title":{},"content":{"136":{"position":[[447,14]]}},"keywords":{}}],["en.json",{"_index":158,"title":{},"content":{"7":{"position":[[54,7]]},"82":{"position":[[409,7]]},"83":{"position":[[307,7],[379,7],[435,7]]},"93":{"position":[[488,7]]},"395":{"position":[[173,7]]}},"keywords":{}}],["enabl",{"_index":932,"title":{},"content":{"72":{"position":[[85,6]]},"263":{"position":[[162,7]]},"297":{"position":[[1629,7]]},"326":{"position":[[223,8]]}},"keywords":{}}],["encapsul",{"_index":101,"title":{},"content":{"3":{"position":[[369,12]]}},"keywords":{}}],["enclos",{"_index":393,"title":{},"content":{"28":{"position":[[167,8]]}},"keywords":{}}],["encod",{"_index":2243,"title":{},"content":{"318":{"position":[[239,10]]},"375":{"position":[[240,10]]},"450":{"position":[[393,8]]}},"keywords":{}}],["encount",{"_index":2532,"title":{},"content":{"399":{"position":[[46,12]]},"430":{"position":[[52,12]]},"431":{"position":[[56,12]]}},"keywords":{}}],["encourag",{"_index":1021,"title":{},"content":{"82":{"position":[[871,10]]},"458":{"position":[[65,9]]}},"keywords":{}}],["end",{"_index":577,"title":{},"content":{"36":{"position":[[1834,4]]},"71":{"position":[[904,3]]},"73":{"position":[[671,3]]},"376":{"position":[[127,3]]},"414":{"position":[[324,4]]},"425":{"position":[[127,3]]},"449":{"position":[[293,3],[335,3]]}},"keywords":{}}],["enforc",{"_index":233,"title":{"444":{"position":[[0,7]]},"445":{"position":[[0,7]]},"446":{"position":[[0,7]]},"447":{"position":[[0,7]]},"456":{"position":[[0,7]]}},"content":{"12":{"position":[[235,8]]},"17":{"position":[[772,7]]},"83":{"position":[[664,11]]},"227":{"position":[[148,9]]},"255":{"position":[[52,9]]},"290":{"position":[[148,9]]},"354":{"position":[[148,9]]},"444":{"position":[[6,8]]},"445":{"position":[[6,8]]},"447":{"position":[[1,7]]},"456":{"position":[[6,8],[81,7]]}},"keywords":{}}],["engin",{"_index":149,"title":{},"content":{"5":{"position":[[343,7]]},"83":{"position":[[641,11]]},"119":{"position":[[10,7]]}},"keywords":{}}],["english",{"_index":71,"title":{},"content":{"2":{"position":[[564,7],[612,7]]},"3":{"position":[[85,7]]},"36":{"position":[[1460,8]]},"37":{"position":[[1448,8]]},"93":{"position":[[214,7]]},"225":{"position":[[320,7]]},"238":{"position":[[464,8]]},"247":{"position":[[226,7]]},"263":{"position":[[577,8]]},"280":{"position":[[90,7]]},"285":{"position":[[320,7]]},"306":{"position":[[509,8]]},"350":{"position":[[320,7]]},"365":{"position":[[464,8]]},"392":{"position":[[102,7]]}},"keywords":{}}],["englishen",{"_index":70,"title":{},"content":{"2":{"position":[[547,9]]}},"keywords":{}}],["enhanc",{"_index":2354,"title":{"332":{"position":[[0,8]]}},"content":{},"keywords":{}}],["enough",{"_index":2050,"title":{},"content":{"278":{"position":[[242,6],[472,6]]},"332":{"position":[[1145,6]]}},"keywords":{}}],["entir",{"_index":2068,"title":{},"content":{"283":{"position":[[638,6]]}},"keywords":{}}],["entri",{"_index":842,"title":{},"content":{"53":{"position":[[86,8]]},"259":{"position":[[165,5]]}},"keywords":{}}],["enum",{"_index":2594,"title":{},"content":{"443":{"position":[[157,4]]},"447":{"position":[[224,4]]}},"keywords":{}}],["enumer",{"_index":1542,"title":{},"content":{"197":{"position":[[32,10]]}},"keywords":{}}],["enumerator/polyfil",{"_index":1544,"title":{},"content":{"200":{"position":[[24,20]]},"201":{"position":[[212,21],[324,19]]}},"keywords":{}}],["enumerator/should",{"_index":1545,"title":{},"content":{"201":{"position":[[46,17]]}},"keywords":{}}],["environ",{"_index":141,"title":{},"content":{"5":{"position":[[154,12]]},"83":{"position":[[753,12]]},"86":{"position":[[70,11]]},"253":{"position":[[877,12]]},"342":{"position":[[311,11]]},"343":{"position":[[783,11]]},"393":{"position":[[9,12]]}},"keywords":{}}],["environmentsbundl",{"_index":238,"title":{},"content":{"12":{"position":[[329,19]]}},"keywords":{}}],["enzym",{"_index":1125,"title":{"92":{"position":[[0,7]]}},"content":{"92":{"position":[[14,6]]},"93":{"position":[[141,7],[353,8]]},"94":{"position":[[58,6],[136,6],[200,6]]},"95":{"position":[[206,6]]},"96":{"position":[[1114,7],[1280,8]]},"97":{"position":[[63,6]]}},"keywords":{}}],["equal",{"_index":2495,"title":{"387":{"position":[[13,9]]}},"content":{"387":{"position":[[33,8]]}},"keywords":{}}],["equival",{"_index":1409,"title":{},"content":{"140":{"position":[[131,10]]}},"keywords":{}}],["era",{"_index":485,"title":{},"content":{"34":{"position":[[268,3]]},"78":{"position":[[213,3]]},"138":{"position":[[544,3]]}},"keywords":{}}],["ergonomic.there'",{"_index":2048,"title":{},"content":{"278":{"position":[[86,17]]}},"keywords":{}}],["eric",{"_index":1362,"title":{},"content":{"136":{"position":[[224,8]]},"240":{"position":[[1073,8],[1684,7]]},"267":{"position":[[712,8]]},"308":{"position":[[472,7]]},"367":{"position":[[1073,8],[1684,7]]}},"keywords":{}}],["error",{"_index":531,"title":{"58":{"position":[[0,5]]},"399":{"position":[[7,7]]}},"content":{"35":{"position":[[999,5]]},"36":{"position":[[1952,5]]},"37":{"position":[[1711,5]]},"42":{"position":[[514,6]]},"58":{"position":[[160,6]]},"60":{"position":[[17,5]]},"63":{"position":[[189,5]]},"71":{"position":[[292,5]]},"136":{"position":[[1037,5]]},"226":{"position":[[37,5],[64,5]]},"253":{"position":[[164,5]]},"272":{"position":[[66,5]]},"287":{"position":[[37,5],[64,5]]},"289":{"position":[[135,6]]},"352":{"position":[[37,5],[64,5]]},"353":{"position":[[135,6]]},"394":{"position":[[377,6]]},"399":{"position":[[62,5],[103,6]]},"434":{"position":[[214,8]]},"444":{"position":[[440,9]]},"445":{"position":[[560,9]]},"446":{"position":[[200,5],[327,5],[431,5],[552,5],[661,5],[807,5],[1269,8]]},"450":{"position":[[199,10],[278,9]]},"456":{"position":[[685,8]]},"457":{"position":[[254,6]]},"459":{"position":[[557,8]]}},"keywords":{}}],["es",{"_index":1307,"title":{},"content":{"125":{"position":[[514,3],[518,3]]}},"keywords":{}}],["es2017",{"_index":2454,"title":{},"content":{"372":{"position":[[204,6]]}},"keywords":{}}],["es2020",{"_index":1486,"title":{},"content":{"180":{"position":[[19,6]]},"232":{"position":[[460,6]]},"298":{"position":[[761,6]]},"359":{"position":[[460,6]]}},"keywords":{}}],["es2020)intl.localeintl.localematcherintl.getcanonicallocalesintl.datetimeformat",{"_index":1229,"title":{},"content":{"101":{"position":[[360,80]]}},"keywords":{}}],["es2020)intl.segmenterintl.durationformatintl.supportedvaluesof",{"_index":1230,"title":{},"content":{"101":{"position":[[441,63]]}},"keywords":{}}],["es6",{"_index":1763,"title":{},"content":{"247":{"position":[[401,3]]},"248":{"position":[[21,4]]},"313":{"position":[[31,3]]}},"keywords":{}}],["escap",{"_index":619,"title":{"39":{"position":[[10,9]]},"338":{"position":[[0,6]]}},"content":{"39":{"position":[[48,6]]},"127":{"position":[[374,6]]},"136":{"position":[[1234,7],[1303,6]]},"272":{"position":[[340,7]]},"273":{"position":[[660,8]]},"338":{"position":[[63,6]]},"456":{"position":[[1102,7]]}},"keywords":{}}],["eslint",{"_index":853,"title":{"255":{"position":[[0,6]]},"433":{"position":[[0,6]]}},"content":{"57":{"position":[[20,6],[43,6],[65,6],[218,6]]},"255":{"position":[[18,6]]},"412":{"position":[[41,6]]},"434":{"position":[[20,6],[58,6],[95,7]]},"441":{"position":[[22,7]]},"443":{"position":[[897,7]]},"444":{"position":[[331,7]]},"445":{"position":[[447,7]]},"446":{"position":[[1157,7]]},"447":{"position":[[357,7]]},"450":{"position":[[101,7]]},"451":{"position":[[1216,7]]},"452":{"position":[[1127,7]]},"456":{"position":[[583,7]]},"457":{"position":[[247,6]]},"459":{"position":[[445,7]]}},"keywords":{}}],["eslintrc.j",{"_index":163,"title":{},"content":{"7":{"position":[[120,12]]},"10":{"position":[[162,12]]}},"keywords":{}}],["esm",{"_index":1822,"title":{"333":{"position":[[0,3]]}},"content":{"250":{"position":[[2057,3],[2207,3]]},"333":{"position":[[162,3]]}},"keywords":{}}],["esnext",{"_index":1255,"title":{"110":{"position":[[20,8]]},"177":{"position":[[18,8]]}},"content":{},"keywords":{}}],["especi",{"_index":805,"title":{},"content":{"50":{"position":[[125,10]]},"278":{"position":[[479,10]]},"336":{"position":[[613,10]]},"373":{"position":[[292,10]]},"389":{"position":[[308,10]]},"397":{"position":[[308,10]]}},"keywords":{}}],["etc",{"_index":589,"title":{},"content":{"37":{"position":[[117,5]]}},"keywords":{}}],["even",{"_index":563,"title":{},"content":{"36":{"position":[[1117,4]]},"37":{"position":[[1105,4]]}},"keywords":{}}],["event",{"_index":1903,"title":{},"content":{"259":{"position":[[1042,6]]}},"keywords":{}}],["everyon",{"_index":389,"title":{},"content":{"28":{"position":[[68,8]]}},"keywords":{}}],["everyth",{"_index":1201,"title":{},"content":{"100":{"position":[[710,10]]},"105":{"position":[[1,10]]},"180":{"position":[[1,10]]},"205":{"position":[[1,10]]}},"keywords":{}}],["everywher",{"_index":20,"title":{},"content":{"1":{"position":[[214,11]]}},"keywords":{}}],["exact",{"_index":848,"title":{},"content":{"54":{"position":[[158,5]]}},"keywords":{}}],["exactli",{"_index":246,"title":{},"content":{"14":{"position":[[19,7]]}},"keywords":{}}],["exampl",{"_index":67,"title":{"55":{"position":[[5,9]]},"77":{"position":[[0,8]]},"89":{"position":[[8,7]]},"125":{"position":[[13,8]]},"441":{"position":[[0,8]]}},"content":{"2":{"position":[[504,8]]},"31":{"position":[[1084,8]]},"35":{"position":[[1205,7]]},"36":{"position":[[479,9],[870,9],[1256,9]]},"37":{"position":[[494,9],[867,9],[1244,9]]},"44":{"position":[[262,8]]},"46":{"position":[[16,7]]},"47":{"position":[[205,8]]},"48":{"position":[[144,7]]},"51":{"position":[[249,8]]},"55":{"position":[[99,8]]},"60":{"position":[[114,8]]},"71":{"position":[[67,8]]},"72":{"position":[[197,8]]},"89":{"position":[[15,8],[377,7]]},"96":{"position":[[1047,7]]},"107":{"position":[[269,8]]},"115":{"position":[[325,8]]},"125":{"position":[[15,7]]},"135":{"position":[[156,8]]},"138":{"position":[[124,8],[842,8]]},"141":{"position":[[292,8]]},"152":{"position":[[110,8]]},"160":{"position":[[97,8]]},"173":{"position":[[265,8]]},"182":{"position":[[321,8]]},"192":{"position":[[267,8]]},"207":{"position":[[100,8]]},"214":{"position":[[281,8]]},"221":{"position":[[86,8]]},"234":{"position":[[455,8]]},"235":{"position":[[438,9]]},"250":{"position":[[831,7]]},"252":{"position":[[636,7],[677,7]]},"262":{"position":[[345,7]]},"267":{"position":[[421,7]]},"290":{"position":[[543,8]]},"292":{"position":[[508,8],[596,7]]},"294":{"position":[[566,8]]},"296":{"position":[[701,8]]},"297":{"position":[[798,8],[1270,8]]},"298":{"position":[[485,8],[556,7],[880,8]]},"299":{"position":[[490,8]]},"300":{"position":[[661,8]]},"301":{"position":[[365,8]]},"302":{"position":[[375,8]]},"303":{"position":[[382,8]]},"308":{"position":[[279,8],[499,8]]},"309":{"position":[[155,8],[601,7]]},"322":{"position":[[113,7]]},"330":{"position":[[286,8],[665,7]]},"332":{"position":[[934,7]]},"336":{"position":[[211,8]]},"346":{"position":[[171,8]]},"361":{"position":[[455,8]]},"362":{"position":[[439,9]]},"372":{"position":[[225,8]]},"373":{"position":[[405,9]]},"381":{"position":[[113,7]]},"389":{"position":[[423,9]]},"393":{"position":[[806,8]]},"394":{"position":[[21,7]]},"401":{"position":[[589,9]]},"428":{"position":[[113,7]]},"432":{"position":[[77,7]]},"436":{"position":[[125,8]]},"443":{"position":[[866,8]]},"447":{"position":[[326,8]]},"449":{"position":[[235,7]]},"451":{"position":[[1185,8]]},"452":{"position":[[1096,8]]},"456":{"position":[[937,7]]},"459":{"position":[[161,8]]}},"keywords":{}}],["excel",{"_index":37,"title":{},"content":{"1":{"position":[[522,9]]}},"keywords":{}}],["except",{"_index":544,"title":{},"content":{"36":{"position":[[157,6]]},"37":{"position":[[194,6]]},"83":{"position":[[47,6]]},"380":{"position":[[21,9]]}},"keywords":{}}],["exclud",{"_index":934,"title":{},"content":{"73":{"position":[[335,8]]},"252":{"position":[[335,8],[345,8]]},"451":{"position":[[1351,7],[1620,7],[1658,8],[2184,8]]}},"keywords":{}}],["execut",{"_index":647,"title":{},"content":{"42":{"position":[[143,7]]},"46":{"position":[[961,7]]}},"keywords":{}}],["exist",{"_index":1283,"title":{},"content":{"119":{"position":[[413,9]]},"129":{"position":[[50,6]]},"248":{"position":[[335,5]]},"268":{"position":[[208,5]]},"376":{"position":[[143,5]]},"425":{"position":[[143,5]]}},"keywords":{}}],["expans",{"_index":2460,"title":{},"content":{"372":{"position":[[422,9]]}},"keywords":{}}],["expect",{"_index":30,"title":{},"content":{"1":{"position":[[383,13]]},"2":{"position":[[57,12]]},"36":{"position":[[182,8]]},"38":{"position":[[431,8]]},"88":{"position":[[310,6]]},"89":{"position":[[43,7],[55,6],[503,6],[515,8],[546,7]]},"229":{"position":[[171,7]]},"230":{"position":[[286,7]]},"231":{"position":[[565,7]]},"232":{"position":[[213,7]]},"233":{"position":[[367,7]]},"240":{"position":[[452,7]]},"248":{"position":[[319,6]]},"344":{"position":[[126,6]]},"355":{"position":[[180,7]]},"356":{"position":[[295,7]]},"357":{"position":[[488,7]]},"358":{"position":[[565,7]]},"359":{"position":[[213,7]]},"360":{"position":[[367,7]]},"367":{"position":[[452,7]]},"372":{"position":[[175,8]]},"444":{"position":[[619,7]]},"445":{"position":[[742,7]]}},"keywords":{}}],["expect(renderer.getrenderoutput()).toequaljsx",{"_index":1095,"title":{},"content":{"89":{"position":[[923,46]]}},"keywords":{}}],["expect(screen.getbytestid('d",{"_index":1220,"title":{},"content":{"100":{"position":[[1406,31]]}},"keywords":{}}],["expect(tree).tomatchsnapshot",{"_index":1177,"title":{},"content":{"96":{"position":[[911,30],[989,30]]}},"keywords":{}}],["expect(wrapper).tomatchsnapshot",{"_index":1181,"title":{},"content":{"96":{"position":[[1412,33]]}},"keywords":{}}],["expect(wrapper.state('foo')).to.equal('bar",{"_index":1151,"title":{},"content":{"94":{"position":[[280,44]]}},"keywords":{}}],["expect(wrapper.text()).to.equal('hello",{"_index":1153,"title":{},"content":{"94":{"position":[[331,38]]}},"keywords":{}}],["expect.extend(expectjsx",{"_index":1090,"title":{},"content":{"89":{"position":[[719,24]]}},"keywords":{}}],["expectjsx",{"_index":1088,"title":{},"content":{"89":{"position":[[531,9]]}},"keywords":{}}],["expens",{"_index":1414,"title":{},"content":{"141":{"position":[[63,10]]}},"keywords":{}}],["experi",{"_index":19,"title":{},"content":{"1":{"position":[[192,10]]},"12":{"position":[[109,10]]}},"keywords":{}}],["expir",{"_index":474,"title":{},"content":{"33":{"position":[[394,7],[405,8]]}},"keywords":{}}],["explain",{"_index":1189,"title":{},"content":{"100":{"position":[[248,9]]}},"keywords":{}}],["explicit",{"_index":669,"title":{},"content":{"42":{"position":[[954,9],[2297,8],[2389,8]]},"264":{"position":[[168,8]]},"458":{"position":[[11,8],[140,8]]}},"keywords":{}}],["explicitli",{"_index":1279,"title":{},"content":{"119":{"position":[[256,10]]},"325":{"position":[[356,10]]}},"keywords":{}}],["export",{"_index":320,"title":{},"content":{"20":{"position":[[397,6]]},"26":{"position":[[167,6]]},"42":{"position":[[1124,6]]},"89":{"position":[[320,6]]},"90":{"position":[[610,6]]},"93":{"position":[[552,6],[731,6]]},"96":{"position":[[591,6]]},"100":{"position":[[703,6],[721,6],[786,6]]},"241":{"position":[[329,8]]},"248":{"position":[[98,8],[396,7]]},"250":{"position":[[2200,6]]},"262":{"position":[[1025,6]]},"313":{"position":[[263,7]]},"327":{"position":[[525,6],[1043,6]]},"333":{"position":[[155,6]]},"344":{"position":[[514,6]]},"345":{"position":[[591,8],[1500,6]]},"348":{"position":[[1810,8]]},"368":{"position":[[329,8]]},"373":{"position":[[104,6]]},"389":{"position":[[130,6]]},"397":{"position":[[130,6]]},"401":{"position":[[215,6],[344,6],[481,6]]},"405":{"position":[[67,6],[150,6],[239,6]]},"417":{"position":[[195,7]]},"421":{"position":[[123,6]]},"434":{"position":[[120,6]]},"441":{"position":[[47,6]]},"443":{"position":[[922,6]]},"444":{"position":[[356,6]]},"445":{"position":[[472,6]]},"446":{"position":[[1182,6]]},"447":{"position":[[382,6]]},"450":{"position":[[126,6]]},"451":{"position":[[1241,6]]},"452":{"position":[[1152,6]]},"456":{"position":[[608,6]]},"459":{"position":[[470,6]]}},"keywords":{}}],["exports.compil",{"_index":781,"title":{},"content":{"47":{"position":[[513,15]]}},"keywords":{}}],["exports.format",{"_index":738,"title":{},"content":{"44":{"position":[[635,14]]}},"keywords":{}}],["expos",{"_index":1276,"title":{},"content":{"119":{"position":[[25,6]]},"330":{"position":[[141,6]]}},"keywords":{}}],["express",{"_index":2424,"title":{},"content":{"344":{"position":[[23,9]]},"451":{"position":[[1045,12],[1089,11]]},"452":{"position":[[990,12],[1034,11]]},"456":{"position":[[867,12]]}},"keywords":{}}],["extend",{"_index":661,"title":{},"content":{"42":{"position":[[704,7]]},"90":{"position":[[558,7]]},"310":{"position":[[878,9]]},"327":{"position":[[387,7],[612,7],[905,7],[1133,7]]},"345":{"position":[[44,7],[265,7],[292,7]]}},"keywords":{}}],["extens",{"_index":63,"title":{},"content":{"2":{"position":[[374,10]]}},"keywords":{}}],["extern",{"_index":615,"title":{},"content":{"38":{"position":[[539,8]]}},"keywords":{}}],["extra",{"_index":845,"title":{},"content":{"54":{"position":[[111,5]]},"88":{"position":[[263,5]]},"96":{"position":[[1174,5]]},"239":{"position":[[36,5]]},"307":{"position":[[36,5]]},"366":{"position":[[36,5]]}},"keywords":{}}],["extract",{"_index":157,"title":{"40":{"position":[[8,10]]},"42":{"position":[[0,11]]},"254":{"position":[[8,11]]},"372":{"position":[[0,11]]},"376":{"position":[[2,7]]},"393":{"position":[[0,10]]},"403":{"position":[[0,11]]}},"content":{"7":{"position":[[38,9],[139,9],[179,9]]},"8":{"position":[[34,11]]},"11":{"position":[[62,11]]},"12":{"position":[[265,10]]},"17":{"position":[[397,7],[747,7]]},"42":{"position":[[178,7],[2270,11]]},"44":{"position":[[459,7]]},"46":{"position":[[37,11]]},"90":{"position":[[711,7]]},"238":{"position":[[570,10],[608,7]]},"240":{"position":[[1804,10]]},"254":{"position":[[42,7],[148,7],[627,7]]},"315":{"position":[[5,7]]},"317":{"position":[[157,9]]},"319":{"position":[[51,11]]},"320":{"position":[[31,7]]},"321":{"position":[[30,7]]},"365":{"position":[[570,10],[608,7]]},"367":{"position":[[1804,10]]},"371":{"position":[[261,7],[370,7],[954,7]]},"372":{"position":[[17,7],[53,7],[84,7],[242,7]]},"373":{"position":[[330,9]]},"376":{"position":[[85,10],[158,9]]},"377":{"position":[[31,7]]},"378":{"position":[[30,7]]},"379":{"position":[[27,7]]},"388":{"position":[[9,9],[39,7]]},"393":{"position":[[45,7],[137,9],[607,7],[690,10],[985,7]]},"394":{"position":[[5,7],[106,7],[238,8],[689,9]]},"395":{"position":[[45,9],[154,9],[204,9]]},"396":{"position":[[29,9],[59,7]]},"400":{"position":[[409,7],[471,7]]},"403":{"position":[[8,9]]},"412":{"position":[[130,10]]},"423":{"position":[[157,9]]},"424":{"position":[[51,11]]},"425":{"position":[[85,10],[158,9]]},"426":{"position":[[31,7]]},"427":{"position":[[30,7]]},"444":{"position":[[597,10]]},"445":{"position":[[97,7],[720,10]]}},"keywords":{}}],["extract"",{"_index":646,"title":{},"content":{"42":{"position":[[119,13]]},"371":{"position":[[154,14]]},"393":{"position":[[875,14]]}},"keywords":{}}],["extract(fil",{"_index":2545,"title":{},"content":{"403":{"position":[[89,14]]}},"keywords":{}}],["extractioncustom",{"_index":1841,"title":{},"content":{"252":{"position":[[603,17]]}},"keywords":{}}],["extractor",{"_index":292,"title":{},"content":{"17":{"position":[[714,9]]}},"keywords":{}}],["extractsourceloc",{"_index":2575,"title":{"425":{"position":[[0,22]]}},"content":{},"keywords":{}}],["fact",{"_index":1309,"title":{},"content":{"126":{"position":[[66,4]]},"273":{"position":[[225,4]]},"320":{"position":[[121,4]]},"377":{"position":[[121,4]]},"426":{"position":[[121,4]]}},"keywords":{}}],["factori",{"_index":1792,"title":{},"content":{"250":{"position":[[565,8]]},"262":{"position":[[277,7],[1110,7]]},"345":{"position":[[662,8]]},"348":{"position":[[1901,7]]}},"keywords":{}}],["fahrenheit",{"_index":1500,"title":{},"content":{"186":{"position":[[153,12]]},"232":{"position":[[731,13]]},"359":{"position":[[727,13]]}},"keywords":{}}],["fail",{"_index":859,"title":{"280":{"position":[[51,4]]}},"content":{"58":{"position":[[27,4]]},"239":{"position":[[111,6]]},"276":{"position":[[754,4]]},"307":{"position":[[111,6]]},"366":{"position":[[111,6]]},"380":{"position":[[39,4]]},"444":{"position":[[256,5]]},"445":{"position":[[375,5]]},"448":{"position":[[275,5]]},"450":{"position":[[665,5],[727,5]]},"451":{"position":[[641,5],[686,5],[735,5],[790,5],[857,5],[943,5]]},"452":{"position":[[262,5],[499,6],[623,6],[740,6]]},"453":{"position":[[357,5],[416,5]]},"454":{"position":[[306,5],[394,5]]},"455":{"position":[[312,5]]},"456":{"position":[[364,5],[465,5]]}},"keywords":{}}],["fairli",{"_index":2015,"title":{},"content":{"273":{"position":[[90,6]]}},"keywords":{}}],["faith",{"_index":2391,"title":{},"content":{"337":{"position":[[39,8]]}},"keywords":{}}],["fall",{"_index":863,"title":{},"content":{"58":{"position":[[76,4]]}},"keywords":{}}],["fallback",{"_index":890,"title":{"239":{"position":[[19,10]]},"307":{"position":[[19,10]]},"366":{"position":[[19,10]]}},"content":{"63":{"position":[[131,8]]},"224":{"position":[[114,9]]},"228":{"position":[[237,8]]},"235":{"position":[[261,10]]},"239":{"position":[[58,9],[212,8]]},"240":{"position":[[741,8],[804,9]]},"284":{"position":[[114,9]]},"307":{"position":[[58,9],[212,8]]},"308":{"position":[[839,8]]},"349":{"position":[[114,9]]},"362":{"position":[[261,10]]},"366":{"position":[[58,9],[212,8]]},"367":{"position":[[741,8],[804,9]]},"447":{"position":[[129,8]]}},"keywords":{}}],["fallbackonemptystr",{"_index":1573,"title":{"228":{"position":[[0,22]]}},"content":{"223":{"position":[[57,23]]},"228":{"position":[[148,21]]}},"keywords":{}}],["fals",{"_index":1347,"title":{},"content":{"133":{"position":[[881,5]]},"228":{"position":[[173,6]]},"376":{"position":[[199,6]]},"425":{"position":[[201,6]]},"446":{"position":[[1440,5]]},"447":{"position":[[504,6]]}},"keywords":{}}],["falsi",{"_index":2133,"title":{},"content":{"297":{"position":[[1054,5]]}},"keywords":{}}],["familiar",{"_index":1311,"title":{},"content":{"126":{"position":[[191,8]]}},"keywords":{}}],["far",{"_index":2392,"title":{},"content":{"337":{"position":[[116,3]]}},"keywords":{}}],["fashion",{"_index":1126,"title":{},"content":{"92":{"position":[[40,7]]}},"keywords":{}}],["fast",{"_index":860,"title":{"280":{"position":[[56,5]]}},"content":{"58":{"position":[[32,4]]},"141":{"position":[[217,4]]},"276":{"position":[[759,5]]}},"keywords":{}}],["faster",{"_index":806,"title":{},"content":{"50":{"position":[[136,6]]},"54":{"position":[[54,6]]},"323":{"position":[[39,6]]},"429":{"position":[[39,6]]}},"keywords":{}}],["fastly.io",{"_index":1063,"title":{"101":{"position":[[9,9]]},"107":{"position":[[13,10]]},"115":{"position":[[13,10]]},"152":{"position":[[13,10]]},"160":{"position":[[13,10]]},"173":{"position":[[13,10]]},"182":{"position":[[13,10]]},"192":{"position":[[13,10]]},"207":{"position":[[13,10]]},"214":{"position":[[13,10]]}},"content":{"87":{"position":[[366,9]]},"101":{"position":[[514,9],[585,9]]},"107":{"position":[[22,9]]},"115":{"position":[[22,9]]},"152":{"position":[[22,9]]},"160":{"position":[[22,9]]},"173":{"position":[[22,9]]},"182":{"position":[[22,9]]},"192":{"position":[[22,9]]},"207":{"position":[[22,9]]},"214":{"position":[[22,9]]}},"keywords":{}}],["fastly.io/v2/polyfill.min.js?features=intl,intl.~locale.en",{"_index":1067,"title":{},"content":{"87":{"position":[[449,58]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.datetimeformat,intl.datetimeformat.~locale.en,intl.numberformat.~locale.en"></script>",{"_index":1261,"title":{},"content":{"115":{"position":[[458,142]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.displaynames,intl.displaynames.~locale.en"></script>",{"_index":1241,"title":{},"content":{"107":{"position":[[400,109]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.getcanonicallocales"></script>",{"_index":1464,"title":{},"content":{"152":{"position":[[230,87]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.listformat,intl.listformat.~locale.en"></script>",{"_index":1480,"title":{},"content":{"173":{"position":[[394,105]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.locale"></script>",{"_index":1470,"title":{},"content":{"160":{"position":[[204,74]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.numberformat,intl.numberformat.~locale.en"></script>",{"_index":1489,"title":{},"content":{"182":{"position":[[452,109]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.numberformat,intl.numberformat.~locale.en,intl.pluralrules.~locale.en"></script>",{"_index":1491,"title":{},"content":{"182":{"position":[[741,137]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.pluralrules,intl.pluralrules.~locale.en"></script>",{"_index":1531,"title":{},"content":{"192":{"position":[[397,107]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.relativetimeformat,intl.relativetimeformat.~locale.en"></script>",{"_index":1555,"title":{},"content":{"214":{"position":[[418,121]]}},"keywords":{}}],["fastly.io/v3/polyfill.min.js?features=intl.segmenter"></script>",{"_index":1548,"title":{},"content":{"207":{"position":[[186,77]]}},"keywords":{}}],["faulti",{"_index":2628,"title":{},"content":{"450":{"position":[[417,7]]}},"keywords":{}}],["favour",{"_index":2276,"title":{},"content":{"327":{"position":[[184,6]]}},"keywords":{}}],["featur",{"_index":1073,"title":{"105":{"position":[[0,9]]},"111":{"position":[[0,9]]},"127":{"position":[[0,9]]},"180":{"position":[[0,9]]},"205":{"position":[[0,9]]}},"content":{"88":{"position":[[70,7]]},"95":{"position":[[130,7]]},"96":{"position":[[27,7]]},"107":{"position":[[255,9]]},"115":{"position":[[311,9]]},"173":{"position":[[251,9]]},"182":{"position":[[307,9]]},"192":{"position":[[253,9]]},"214":{"position":[[267,9]]},"237":{"position":[[42,7]]},"257":{"position":[[94,8]]},"263":{"position":[[185,9]]},"269":{"position":[[7,7]]},"274":{"position":[[132,7]]},"282":{"position":[[360,8]]},"305":{"position":[[42,7]]},"310":{"position":[[773,7]]},"327":{"position":[[89,7]]},"332":{"position":[[1216,7]]},"364":{"position":[[42,7]]}},"keywords":{}}],["feature/librari",{"_index":989,"title":{},"content":{"81":{"position":[[316,15]]}},"keywords":{}}],["feedback",{"_index":2024,"title":{},"content":{"273":{"position":[[477,9]]},"278":{"position":[[13,8]]},"280":{"position":[[49,9]]}},"keywords":{}}],["feel",{"_index":745,"title":{},"content":{"44":{"position":[[910,4]]},"394":{"position":[[705,4]]}},"keywords":{}}],["feellikesour",{"_index":2674,"title":{},"content":{"452":{"position":[[800,12]]}},"keywords":{}}],["femal",{"_index":536,"title":{},"content":{"35":{"position":[[1100,6]]}},"keywords":{}}],["few",{"_index":594,"title":{},"content":{"37":{"position":[[1977,3]]},"123":{"position":[[296,3]]},"233":{"position":[[176,5]]},"252":{"position":[[830,3]]},"300":{"position":[[252,4],[439,4]]},"330":{"position":[[555,3]]},"343":{"position":[[434,3]]},"360":{"position":[[176,5]]},"447":{"position":[[277,3],[283,6]]},"462":{"position":[[439,3],[539,3]]}},"keywords":{}}],["field",{"_index":1015,"title":{},"content":{"82":{"position":[[538,6]]},"247":{"position":[[172,5]]},"319":{"position":[[23,5]]},"376":{"position":[[131,6]]},"424":{"position":[[23,5]]},"425":{"position":[[131,6]]},"452":{"position":[[179,5]]}},"keywords":{}}],["file",{"_index":164,"title":{"374":{"position":[[6,4]]},"379":{"position":[[9,8]]},"390":{"position":[[6,4]]},"395":{"position":[[14,6]]}},"content":{"7":{"position":[[161,5],[321,5]]},"8":{"position":[[128,4]]},"10":{"position":[[227,4],[339,4],[380,5]]},"11":{"position":[[156,4],[252,4]]},"42":{"position":[[231,4],[530,4],[1663,4]]},"44":{"position":[[510,4]]},"46":{"position":[[105,4],[812,5],[1034,4]]},"47":{"position":[[438,4]]},"48":{"position":[[130,5]]},"82":{"position":[[521,5]]},"83":{"position":[[205,4],[547,5]]},"94":{"position":[[10,4]]},"238":{"position":[[653,5]]},"241":{"position":[[492,6]]},"254":{"position":[[74,6]]},"258":{"position":[[173,5]]},"259":{"position":[[909,5]]},"306":{"position":[[771,5]]},"322":{"position":[[73,4],[131,5],[458,5]]},"330":{"position":[[235,4]]},"365":{"position":[[653,5]]},"368":{"position":[[488,6]]},"371":{"position":[[293,6]]},"372":{"position":[[71,10],[293,4]]},"373":{"position":[[21,4],[58,4],[74,5],[94,4]]},"374":{"position":[[12,4],[71,4],[108,5]]},"376":{"position":[[70,4],[110,5]]},"380":{"position":[[59,4]]},"381":{"position":[[73,4],[131,5],[457,5]]},"384":{"position":[[20,5]]},"385":{"position":[[38,6],[61,4],[125,6]]},"388":{"position":[[19,5],[79,5]]},"389":{"position":[[21,4],[120,4]]},"390":{"position":[[12,4]]},"393":{"position":[[72,4],[155,4],[225,4],[412,6],[450,4],[631,4],[1014,4],[1144,4]]},"394":{"position":[[135,4],[276,5],[352,5],[483,4],[567,4],[591,4],[699,5],[768,4]]},"395":{"position":[[102,4],[164,4],[197,5]]},"396":{"position":[[39,5],[117,6]]},"397":{"position":[[21,4],[120,4]]},"399":{"position":[[145,5]]},"425":{"position":[[70,4],[110,5]]},"428":{"position":[[73,4],[131,5],[458,5]]},"436":{"position":[[114,6]]}},"keywords":{}}],["files.babel",{"_index":2567,"title":{},"content":{"412":{"position":[[164,11]]}},"keywords":{}}],["fill",{"_index":1734,"title":{},"content":{"240":{"position":[[564,4]]},"267":{"position":[[153,4]]},"367":{"position":[[564,4]]}},"keywords":{}}],["final",{"_index":2082,"title":{},"content":{"290":{"position":[[476,8]]}},"keywords":{}}],["financ",{"_index":2414,"title":{},"content":{"342":{"position":[[473,7]]}},"keywords":{}}],["financi",{"_index":1064,"title":{},"content":{"87":{"position":[[393,9]]}},"keywords":{}}],["find",{"_index":403,"title":{},"content":{"30":{"position":[[172,4]]},"96":{"position":[[1033,4]]},"262":{"position":[[1137,4]]},"369":{"position":[[71,4]]},"393":{"position":[[559,4]]}},"keywords":{}}],["fine",{"_index":436,"title":{},"content":{"31":{"position":[[788,4]]}},"keywords":{}}],["firefox",{"_index":898,"title":{},"content":{"65":{"position":[[79,7],[773,8]]},"243":{"position":[[63,7]]}},"keywords":{}}],["first",{"_index":56,"title":{},"content":{"2":{"position":[[226,5]]},"133":{"position":[[459,5]]},"394":{"position":[[225,5]]}},"keywords":{}}],["fish",{"_index":2464,"title":{},"content":{"372":{"position":[[492,4]]}},"keywords":{}}],["fit",{"_index":1529,"title":{},"content":{"187":{"position":[[133,3]]}},"keywords":{}}],["fit"/>",{"_index":2332,"title":{},"content":{"331":{"position":[[713,14]]}},"keywords":{}}],["fix",{"_index":2268,"title":{},"content":{"326":{"position":[[45,6]]}},"keywords":{}}],["flag",{"_index":2255,"title":{},"content":{"323":{"position":[[65,4]]},"374":{"position":[[129,4]]},"429":{"position":[[65,4]]}},"keywords":{}}],["flat",{"_index":1936,"title":{},"content":{"264":{"position":[[151,5]]},"265":{"position":[[295,4]]}},"keywords":{}}],["flatten",{"_index":1934,"title":{"264":{"position":[[0,7]]},"383":{"position":[[2,8]]}},"content":{"264":{"position":[[434,7]]},"383":{"position":[[34,7]]},"393":{"position":[[1031,7]]},"394":{"position":[[152,7]]},"459":{"position":[[115,7],[257,10]]}},"keywords":{}}],["flattenmessages(nestedmessag",{"_index":1942,"title":{},"content":{"264":{"position":[[505,31],[877,31]]}},"keywords":{}}],["flattenmessages(valu",{"_index":1950,"title":{},"content":{"264":{"position":[[798,22]]}},"keywords":{}}],["fledg",{"_index":1373,"title":{},"content":{"136":{"position":[[650,7]]}},"keywords":{}}],["flexibl",{"_index":1018,"title":{},"content":{"82":{"position":[[682,11]]},"83":{"position":[[570,9]]},"264":{"position":[[225,12]]}},"keywords":{}}],["flow",{"_index":1186,"title":{},"content":{"100":{"position":[[119,5]]}},"keywords":{}}],["fluent",{"_index":2227,"title":{},"content":{"310":{"position":[[833,6]]},"332":{"position":[[1268,6]]}},"keywords":{}}],["fluid",{"_index":1501,"title":{},"content":{"186":{"position":[[168,6]]}},"keywords":{}}],["flux",{"_index":1776,"title":{},"content":{"249":{"position":[[413,4]]},"250":{"position":[[797,4]]},"262":{"position":[[1147,4]]},"283":{"position":[[314,4]]},"345":{"position":[[894,4]]}},"keywords":{}}],["focu",{"_index":223,"title":{},"content":{"12":{"position":[[90,5]]},"263":{"position":[[616,5]]}},"keywords":{}}],["folder",{"_index":166,"title":{"396":{"position":[[0,6]]}},"content":{"7":{"position":[[189,6],[390,7]]},"10":{"position":[[188,6]]},"82":{"position":[[326,6]]},"396":{"position":[[17,6],[72,6],[242,6],[294,6]]}},"keywords":{}}],["follow",{"_index":145,"title":{},"content":{"5":{"position":[[219,9]]},"10":{"position":[[46,9]]},"20":{"position":[[7,9]]},"31":{"position":[[98,9]]},"32":{"position":[[96,9]]},"33":{"position":[[96,9]]},"34":{"position":[[226,9]]},"35":{"position":[[335,6]]},"42":{"position":[[9,9],[548,9]]},"46":{"position":[[827,9]]},"69":{"position":[[57,6],[110,9]]},"71":{"position":[[630,9]]},"73":{"position":[[392,9]]},"78":{"position":[[171,9]]},"89":{"position":[[5,9]]},"113":{"position":[[27,9]]},"123":{"position":[[444,6]]},"136":{"position":[[772,9]]},"138":{"position":[[502,9]]},"179":{"position":[[27,9]]},"212":{"position":[[27,9]]},"230":{"position":[[213,9]]},"238":{"position":[[276,9]]},"243":{"position":[[527,10]]},"245":{"position":[[345,6]]},"246":{"position":[[121,9]]},"252":{"position":[[65,10]]},"253":{"position":[[214,9],[322,9],[656,9]]},"259":{"position":[[124,9]]},"263":{"position":[[359,9]]},"264":{"position":[[412,9]]},"267":{"position":[[411,9]]},"283":{"position":[[697,9]]},"294":{"position":[[150,9]]},"297":{"position":[[228,9]]},"306":{"position":[[321,9]]},"329":{"position":[[546,10]]},"356":{"position":[[222,9]]},"365":{"position":[[276,9]]},"371":{"position":[[44,9]]},"400":{"position":[[16,9]]},"435":{"position":[[182,9]]},"440":{"position":[[25,9]]},"457":{"position":[[222,9]]}},"keywords":{}}],["foo",{"_index":1321,"title":{},"content":{"127":{"position":[[530,3]]},"254":{"position":[[278,4],[289,6],[312,6],[639,6],[662,6]]},"371":{"position":[[515,4],[526,6],[549,6],[966,6],[989,6]]},"408":{"position":[[215,4]]},"410":{"position":[[262,4],[434,6]]},"435":{"position":[[296,4],[319,6],[549,5],[594,6]]},"444":{"position":[[200,4],[223,6]]},"445":{"position":[[299,4]]},"446":{"position":[[913,5],[1292,8]]},"448":{"position":[[216,4],[239,4],[304,4]]},"450":{"position":[[511,4]]},"451":{"position":[[1702,5],[1713,7]]},"453":{"position":[[304,4]]},"454":{"position":[[251,4]]},"455":{"position":[[243,4]]},"456":{"position":[[282,4]]}},"keywords":{}}],["foo_bar",{"_index":2630,"title":{},"content":{"450":{"position":[[605,8]]}},"keywords":{}}],["foot",{"_index":1503,"title":{},"content":{"186":{"position":[[184,6]]}},"keywords":{}}],["foo{on",{"_index":2595,"title":{},"content":{"443":{"position":[[602,8]]}},"keywords":{}}],["forc",{"_index":1252,"title":{},"content":{"109":{"position":[[326,7]]},"117":{"position":[[330,7]]},"148":{"position":[[330,7]]},"154":{"position":[[274,5],[373,7]]},"162":{"position":[[235,5],[321,7]]},"175":{"position":[[322,7]]},"184":{"position":[[326,7]]},"194":{"position":[[212,5],[300,6]]},"195":{"position":[[324,7]]},"201":{"position":[[254,5],[344,7]]},"209":{"position":[[187,7]]},"216":{"position":[[338,7]]},"274":{"position":[[419,6]]},"444":{"position":[[488,6]]},"445":{"position":[[608,6]]}},"keywords":{}}],["forget",{"_index":2601,"title":{},"content":{"445":{"position":[[185,6]]},"451":{"position":[[65,6],[143,6]]},"452":{"position":[[86,6]]}},"keywords":{}}],["form",{"_index":1296,"title":{},"content":{"124":{"position":[[234,4]]},"344":{"position":[[38,4]]},"396":{"position":[[328,4]]}},"keywords":{}}],["format",{"_index":27,"title":{"30":{"position":[[0,9]]},"35":{"position":[[9,7]]},"36":{"position":[[9,7]]},"37":{"position":[[16,7]]},"38":{"position":[[10,11]]},"224":{"position":[[8,8]]},"239":{"position":[[8,10]]},"250":{"position":[[0,10]]},"263":{"position":[[24,10]]},"268":{"position":[[30,10]]},"278":{"position":[[10,10]]},"284":{"position":[[8,8]]},"307":{"position":[[8,10]]},"309":{"position":[[10,11]]},"332":{"position":[[52,11]]},"337":{"position":[[8,6]]},"349":{"position":[[8,8]]},"366":{"position":[[8,10]]},"373":{"position":[[2,6]]},"389":{"position":[[2,6]]},"397":{"position":[[2,6]]},"461":{"position":[[7,9]]}},"content":{"1":{"position":[[337,10]]},"5":{"position":[[12,10],[317,7],[379,11]]},"17":{"position":[[673,10]]},"30":{"position":[[20,9],[73,7]]},"31":{"position":[[22,6],[132,6],[405,6],[520,9]]},"32":{"position":[[22,6],[130,6],[180,6],[239,6],[314,6],[388,6],[577,6]]},"33":{"position":[[22,6],[130,6],[180,6],[233,6],[294,6],[535,6]]},"34":{"position":[[124,7]]},"35":{"position":[[421,6]]},"36":{"position":[[144,6],[2404,9]]},"37":{"position":[[181,6],[1869,9]]},"38":{"position":[[36,10],[481,10]]},"44":{"position":[[13,6],[156,6],[214,6],[299,6],[589,6]]},"47":{"position":[[41,6],[90,6],[242,6],[467,6]]},"54":{"position":[[66,9],[185,9]]},"59":{"position":[[22,6]]},"60":{"position":[[37,6]]},"75":{"position":[[244,9]]},"78":{"position":[[61,7]]},"84":{"position":[[106,6]]},"92":{"position":[[316,9]]},"100":{"position":[[1343,8]]},"123":{"position":[[58,6]]},"124":{"position":[[146,10],[265,8],[296,9]]},"125":{"position":[[26,10],[148,9]]},"127":{"position":[[129,7],[300,8],[342,6],[481,9]]},"129":{"position":[[209,10],[307,10],[409,10]]},"133":{"position":[[24,7],[186,10],[551,9],[616,6]]},"136":{"position":[[30,10],[76,8]]},"138":{"position":[[96,8],[392,7]]},"142":{"position":[[338,6],[413,6],[498,6],[588,6]]},"187":{"position":[[158,6]]},"221":{"position":[[65,7]]},"223":{"position":[[89,8],[2048,10]]},"225":{"position":[[22,7]]},"227":{"position":[[27,10],[94,6]]},"229":{"position":[[87,9],[145,9]]},"230":{"position":[[87,9],[145,9]]},"231":{"position":[[441,8],[499,9]]},"232":{"position":[[127,9],[185,9],[404,10]]},"237":{"position":[[16,10],[93,10],[231,9]]},"239":{"position":[[13,10],[100,10],[201,10],[244,6],[324,10]]},"240":{"position":[[423,9],[712,10],[753,10],[793,10],[1406,10]]},"250":{"position":[[28,6],[336,6],[676,10],[950,6]]},"252":{"position":[[627,7]]},"260":{"position":[[115,8],[206,9]]},"262":{"position":[[81,9],[126,9]]},"263":{"position":[[29,9]]},"268":{"position":[[90,10]]},"270":{"position":[[80,9]]},"272":{"position":[[236,10]]},"274":{"position":[[125,6]]},"276":{"position":[[11,10]]},"282":{"position":[[302,10]]},"283":{"position":[[796,8]]},"285":{"position":[[22,7]]},"289":{"position":[[6,10]]},"290":{"position":[[27,10],[94,6]]},"292":{"position":[[204,7],[327,9]]},"293":{"position":[[293,9],[408,7]]},"294":{"position":[[270,7],[393,9]]},"295":{"position":[[293,9],[408,7]]},"296":{"position":[[528,9]]},"297":{"position":[[247,10],[452,7],[616,9]]},"298":{"position":[[183,7],[310,9],[564,10],[705,10]]},"299":{"position":[[293,9],[407,7]]},"305":{"position":[[16,10],[93,10],[231,9]]},"307":{"position":[[13,10],[100,10],[201,10],[244,6],[324,10]]},"308":{"position":[[53,9]]},"309":{"position":[[50,10]]},"310":{"position":[[17,10],[124,9],[952,7]]},"325":{"position":[[737,6],[772,6]]},"332":{"position":[[33,10]]},"333":{"position":[[129,6]]},"336":{"position":[[130,6]]},"337":{"position":[[63,7]]},"338":{"position":[[44,6]]},"345":{"position":[[773,10],[934,10]]},"346":{"position":[[90,6]]},"348":{"position":[[57,8],[2181,10]]},"350":{"position":[[22,7]]},"353":{"position":[[6,10]]},"354":{"position":[[27,10],[94,6]]},"355":{"position":[[96,9],[154,9]]},"356":{"position":[[96,9],[154,9]]},"357":{"position":[[293,9],[351,9]]},"358":{"position":[[441,8],[499,9]]},"359":{"position":[[127,9],[185,9],[404,10]]},"364":{"position":[[16,10],[93,10],[231,9]]},"366":{"position":[[13,10],[100,10],[201,10],[244,6],[324,10]]},"367":{"position":[[423,9],[712,10],[753,10],[793,10],[1406,10]]},"373":{"position":[[129,6],[340,6],[365,7]]},"389":{"position":[[357,6],[383,7]]},"393":{"position":[[160,7],[636,6]]},"395":{"position":[[107,8]]},"397":{"position":[[357,6],[383,6]]},"400":{"position":[[398,7],[481,6],[521,6]]},"401":{"position":[[162,6],[228,7],[291,6]]},"405":{"position":[[80,7]]},"446":{"position":[[1478,10]]},"462":{"position":[[636,9]]}},"keywords":{}}],["format(valu",{"_index":1359,"title":{"136":{"position":[[0,14]]}},"content":{},"keywords":{}}],["format({numb",{"_index":1425,"title":{},"content":{"141":{"position":[[760,18]]}},"keywords":{}}],["format({numphoto",{"_index":1301,"title":{},"content":{"125":{"position":[[333,20],[522,20]]}},"keywords":{}}],["format({pric",{"_index":1402,"title":{},"content":{"138":{"position":[[226,16]]}},"keywords":{}}],["format_cached_complex_msg",{"_index":1426,"title":{},"content":{"142":{"position":[[1,25]]}},"keywords":{}}],["format_cached_string_msg",{"_index":1430,"title":{},"content":{"142":{"position":[[70,24]]}},"keywords":{}}],["format_error",{"_index":868,"title":{"59":{"position":[[0,13]]}},"content":{},"keywords":{}}],["formatbabeledit",{"_index":748,"title":{},"content":{"44":{"position":[[954,15]]},"400":{"position":[[88,15]]}},"keywords":{}}],["formatd",{"_index":1643,"title":{"229":{"position":[[0,11]]},"355":{"position":[[0,11]]}},"content":{"229":{"position":[[10,11]]},"230":{"position":[[188,10]]},"262":{"position":[[106,12],[449,12]]},"292":{"position":[[25,10]]},"355":{"position":[[10,11]]},"356":{"position":[[197,10]]}},"keywords":{}}],["formatdate(valu",{"_index":1584,"title":{},"content":{"223":{"position":[[426,17]]},"348":{"position":[[376,17]]}},"keywords":{}}],["formatdateopt",{"_index":1585,"title":{},"content":{"223":{"position":[[475,19],[551,19],[635,17],[739,17]]},"348":{"position":[[425,19],[501,19],[585,17],[689,17]]}},"keywords":{}}],["formatdatetimerang",{"_index":2119,"title":{"357":{"position":[[0,20]]}},"content":{"296":{"position":[[202,19]]},"357":{"position":[[171,20]]}},"keywords":{}}],["formatdatetopart",{"_index":1587,"title":{},"content":{"223":{"position":[[578,18]]},"348":{"position":[[528,18]]}},"keywords":{}}],["formatdateview",{"_index":1209,"title":{},"content":{"100":{"position":[[1039,14]]}},"keywords":{}}],["formatdisplaynam",{"_index":1616,"title":{"235":{"position":[[0,18]]},"362":{"position":[[0,18]]}},"content":{"223":{"position":[[1701,18]]},"235":{"position":[[299,18]]},"303":{"position":[[158,17]]},"348":{"position":[[1651,18]]},"362":{"position":[[299,18]]}},"keywords":{}}],["formatdisplaynameopt",{"_index":1617,"title":{},"content":{"223":{"position":[[1742,24]]},"235":{"position":[[143,24],[383,24]]},"303":{"position":[[289,24]]},"348":{"position":[[1692,24]]},"362":{"position":[[143,24],[384,24]]}},"keywords":{}}],["formatdisplaynameor",{"_index":907,"title":{},"content":{"65":{"position":[[604,19]]},"243":{"position":[[378,19]]}},"keywords":{}}],["formatfn",{"_index":2468,"title":{},"content":{"373":{"position":[[162,8]]},"401":{"position":[[69,10]]},"405":{"position":[[8,10],[88,8]]}},"keywords":{}}],["formatfn<vendorjson>",{"_index":2537,"title":{},"content":{"401":{"position":[[236,26]]}},"keywords":{}}],["formatj",{"_index":91,"title":{"12":{"position":[[6,8]]},"56":{"position":[[13,8]]},"70":{"position":[[14,8]]},"71":{"position":[[19,9]]},"85":{"position":[[13,8]]},"218":{"position":[[5,8]]},"311":{"position":[[13,8]]},"406":{"position":[[15,8]]},"433":{"position":[[14,8]]}},"content":{"3":{"position":[[184,8]]},"22":{"position":[[41,8],[103,8]]},"42":{"position":[[415,8],[469,8]]},"43":{"position":[[210,9]]},"57":{"position":[[34,8],[232,8]]},"65":{"position":[[183,8]]},"71":{"position":[[33,8],[397,8]]},"83":{"position":[[135,8]]},"101":{"position":[[95,8]]},"240":{"position":[[1832,9]]},"254":{"position":[[102,8]]},"255":{"position":[[32,8]]},"306":{"position":[[652,8]]},"312":{"position":[[30,8]]},"315":{"position":[[179,13]]},"367":{"position":[[1832,9]]},"372":{"position":[[44,8]]},"384":{"position":[[137,8]]},"388":{"position":[[30,8]]},"393":{"position":[[1109,8]]},"394":{"position":[[97,8],[448,8]]},"396":{"position":[[50,8],[225,8]]},"412":{"position":[[1,8],[55,9],[183,9]]},"434":{"position":[[34,8],[81,8],[110,9],[170,9]]},"437":{"position":[[44,8]]},"438":{"position":[[25,8]]},"439":{"position":[[25,8]]},"441":{"position":[[8,8],[37,9]]},"443":{"position":[[883,8],[912,9],[952,9]]},"444":{"position":[[317,8],[346,9],[386,9]]},"445":{"position":[[433,8],[462,9],[502,9]]},"446":{"position":[[1143,8],[1172,9],[1212,9]]},"447":{"position":[[343,8],[372,9],[412,9]]},"450":{"position":[[87,8],[116,9],[156,9],[235,9]]},"451":{"position":[[1202,8],[1231,9],[1271,9]]},"452":{"position":[[1113,8],[1142,9],[1182,9]]},"456":{"position":[[569,8],[598,9],[638,9]]},"459":{"position":[[431,8],[460,9],[500,9]]}},"keywords":{}}],["formatjs'",{"_index":144,"title":{},"content":{"5":{"position":[[186,10]]}},"keywords":{}}],["formatjs.additionalcomponentnam",{"_index":2589,"title":{"439":{"position":[[0,34]]}},"content":{},"keywords":{}}],["formatjs.additionalfunctionnam",{"_index":2587,"title":{"438":{"position":[[0,33]]}},"content":{},"keywords":{}}],["formatjs.configs.recommend",{"_index":2592,"title":{},"content":{"441":{"position":[[64,29]]}},"keywords":{}}],["formatjs/blocklist",{"_index":2599,"title":{},"content":{"443":{"position":[[974,19]]}},"keywords":{}}],["formatjs/cli",{"_index":640,"title":{},"content":{"41":{"position":[[20,13]]},"44":{"position":[[35,13]]},"46":{"position":[[748,13]]},"47":{"position":[[171,13]]},"50":{"position":[[54,13]]},"254":{"position":[[13,13]]},"371":{"position":[[20,13]]},"401":{"position":[[108,15],[169,13],[320,13]]},"402":{"position":[[9,13],[77,13]]},"403":{"position":[[23,14]]},"404":{"position":[[23,14]]},"405":{"position":[[47,14]]}},"keywords":{}}],["formatjs/enforc",{"_index":2600,"title":{},"content":{"444":{"position":[[408,17]]},"445":{"position":[[524,17]]},"446":{"position":[[1234,17]]},"447":{"position":[[434,17]]},"456":{"position":[[660,17]]}},"keywords":{}}],["formatjs/fast",{"_index":1417,"title":{},"content":{"141":{"position":[[375,15]]}},"keywords":{}}],["formatjs/icu",{"_index":820,"title":{},"content":{"50":{"position":[[521,13]]},"51":{"position":[[103,13],[141,13]]},"52":{"position":[[46,14],[84,14]]},"53":{"position":[[97,14],[135,14]]},"76":{"position":[[21,14]]},"140":{"position":[[216,14],[484,13]]},"250":{"position":[[2108,14]]}},"keywords":{}}],["formatjs/intl",{"_index":1231,"title":{},"content":{"103":{"position":[[17,14]]},"108":{"position":[[8,15],[54,15]]},"109":{"position":[[30,15]]},"112":{"position":[[17,14]]},"116":{"position":[[8,15],[56,15],[132,15]]},"117":{"position":[[30,15]]},"118":{"position":[[100,15],[148,15],[263,15],[311,15]]},"119":{"position":[[491,15],[539,15]]},"129":{"position":[[245,14],[343,14],[445,14]]},"144":{"position":[[17,14]]},"147":{"position":[[8,15]]},"148":{"position":[[30,15]]},"150":{"position":[[17,14]]},"153":{"position":[[8,15]]},"154":{"position":[[30,15]]},"157":{"position":[[17,14]]},"161":{"position":[[8,15]]},"162":{"position":[[30,15]]},"165":{"position":[[17,14]]},"168":{"position":[[21,15]]},"170":{"position":[[17,14]]},"174":{"position":[[8,15],[52,15]]},"175":{"position":[[30,15]]},"178":{"position":[[17,14]]},"183":{"position":[[8,15],[54,15]]},"184":{"position":[[30,15]]},"189":{"position":[[17,14]]},"193":{"position":[[8,15],[53,15]]},"194":{"position":[[263,15],[338,15]]},"195":{"position":[[30,15]]},"197":{"position":[[17,14]]},"200":{"position":[[8,15]]},"201":{"position":[[30,15]]},"204":{"position":[[17,14]]},"208":{"position":[[8,15]]},"209":{"position":[[30,15]]},"211":{"position":[[17,14]]},"212":{"position":[[235,14]]},"215":{"position":[[8,15],[60,15]]},"216":{"position":[[30,15],[360,15]]},"219":{"position":[[20,14]]},"220":{"position":[[13,14]]},"221":{"position":[[138,16]]},"232":{"position":[[516,14]]},"241":{"position":[[345,14],[625,16]]},"243":{"position":[[661,14],[724,14]]},"250":{"position":[[2165,14]]},"331":{"position":[[1953,14],[2049,15]]},"333":{"position":[[89,14]]},"408":{"position":[[66,15]]},"409":{"position":[[94,15]]},"410":{"position":[[97,16]]},"411":{"position":[[324,14]]}},"keywords":{}}],["formatjs/no",{"_index":2582,"title":{},"content":{"434":{"position":[[192,12]]},"450":{"position":[[178,12],[257,12]]},"451":{"position":[[1293,12]]},"452":{"position":[[1204,12]]},"459":{"position":[[522,12]]}},"keywords":{}}],["formatjs/t",{"_index":363,"title":{"72":{"position":[[6,12]]}},"content":{"23":{"position":[[18,12],[69,13]]},"24":{"position":[[18,12]]},"25":{"position":[[18,12]]},"26":{"position":[[18,12],[140,13]]},"42":{"position":[[427,12]]},"72":{"position":[[18,12]]},"73":{"position":[[77,13]]},"306":{"position":[[665,12]]},"371":{"position":[[308,12]]},"416":{"position":[[17,12]]},"418":{"position":[[25,13]]},"419":{"position":[[155,13]]},"421":{"position":[[96,13]]},"438":{"position":[[40,12]]},"439":{"position":[[40,12]]}},"keywords":{}}],["formatjsintl",{"_index":1859,"title":{},"content":{"253":{"position":[[384,12],[733,12]]}},"keywords":{}}],["formatlist",{"_index":1612,"title":{"234":{"position":[[0,11]]},"361":{"position":[[0,11]]}},"content":{"223":{"position":[[1506,11]]},"234":{"position":[[256,11]]},"301":{"position":[[156,10]]},"348":{"position":[[1456,11]]},"361":{"position":[[256,11]]}},"keywords":{}}],["formatlist(valu",{"_index":1609,"title":{},"content":{"223":{"position":[[1432,18]]},"348":{"position":[[1382,18]]}},"keywords":{}}],["formatlistopt",{"_index":1611,"title":{},"content":{"223":{"position":[[1479,19],[1558,17],[1674,19]]},"348":{"position":[[1429,19],[1508,17],[1624,19]]}},"keywords":{}}],["formatlisttopart",{"_index":2178,"title":{},"content":{"302":{"position":[[156,17]]}},"keywords":{}}],["formatlisttoparts(valu",{"_index":1615,"title":{},"content":{"223":{"position":[[1616,25]]},"348":{"position":[[1566,25]]}},"keywords":{}}],["formatmessag",{"_index":264,"title":{"16":{"position":[[41,15]]},"236":{"position":[[0,14]]},"266":{"position":[[7,15]]},"332":{"position":[[28,13]]},"363":{"position":[[0,14]]}},"content":{"54":{"position":[[22,17]]},"223":{"position":[[1155,14],[1299,14]]},"233":{"position":[[919,13]]},"238":{"position":[[124,14]]},"240":{"position":[[90,14],[214,14]]},"253":{"position":[[70,13]]},"266":{"position":[[32,15],[318,15]]},"304":{"position":[[25,13]]},"321":{"position":[[58,19],[110,13]]},"348":{"position":[[1105,14],[1249,14]]},"360":{"position":[[919,13]]},"365":{"position":[[124,14]]},"367":{"position":[[90,14],[214,14]]},"414":{"position":[[165,16],[503,16]]},"427":{"position":[[58,19],[110,13]]},"436":{"position":[[45,14],[165,16]]},"438":{"position":[[136,13],[156,15]]},"457":{"position":[[262,14]]}},"keywords":{}}],["formatmessage$formatdate$formattime$formatrelativetime$formattimerange$formatdisplayname$formatlist",{"_index":2564,"title":{},"content":{"411":{"position":[[218,100]]}},"keywords":{}}],["formatnumb",{"_index":1665,"title":{"232":{"position":[[0,13]]},"359":{"position":[[0,13]]}},"content":{"232":{"position":[[57,13]]},"298":{"position":[[25,12]]},"359":{"position":[[57,13]]}},"keywords":{}}],["formatnumber(3",{"_index":267,"title":{},"content":{"16":{"position":[[30,16]]},"411":{"position":[[107,16]]}},"keywords":{}}],["formatnumber(valu",{"_index":1593,"title":{},"content":{"223":{"position":[[888,19]]},"348":{"position":[[838,19]]}},"keywords":{}}],["formatnumberopt",{"_index":1594,"title":{},"content":{"223":{"position":[[923,21],[995,19]]},"348":{"position":[[873,21],[945,19]]}},"keywords":{}}],["formatnumbertopart",{"_index":1595,"title":{},"content":{"223":{"position":[[952,20]]},"348":{"position":[[902,20]]}},"keywords":{}}],["formatopt",{"_index":1998,"title":{},"content":{"270":{"position":[[270,13]]}},"keywords":{}}],["formatplur",{"_index":1597,"title":{"233":{"position":[[0,13]]},"360":{"position":[[0,13]]}},"content":{"223":{"position":[[1042,13]]},"233":{"position":[[84,13]]},"300":{"position":[[25,12]]},"348":{"position":[[992,13]]},"360":{"position":[[84,13]]}},"keywords":{}}],["formatpluralopt",{"_index":1598,"title":{},"content":{"223":{"position":[[1087,19]]},"348":{"position":[[1037,19]]}},"keywords":{}}],["formatrel",{"_index":1996,"title":{},"content":{"270":{"position":[[22,16],[502,16]]},"331":{"position":[[1761,14]]}},"keywords":{}}],["formatrelative()'",{"_index":1993,"title":{"270":{"position":[[6,18]]}},"content":{},"keywords":{}}],["formatrelativetim",{"_index":1590,"title":{"231":{"position":[[0,19]]},"358":{"position":[[0,19]]}},"content":{"223":{"position":[[786,19]]},"231":{"position":[[345,19]]},"297":{"position":[[168,18]]},"325":{"position":[[628,18]]},"331":{"position":[[1796,18]]},"348":{"position":[[736,19]]},"358":{"position":[[345,19]]}},"keywords":{}}],["formatrelativetimeopt",{"_index":1592,"title":{},"content":{"223":{"position":[[852,25]]},"348":{"position":[[802,25]]}},"keywords":{}}],["formatrelativetimeor",{"_index":904,"title":{},"content":{"65":{"position":[[468,20]]}},"keywords":{}}],["formatt",{"_index":726,"title":{"141":{"position":[[0,11]]},"400":{"position":[[8,11]]},"401":{"position":[[7,11]]},"405":{"position":[[7,10]]}},"content":{"44":{"position":[[139,9],[862,10]]},"47":{"position":[[73,9],[692,10]]},"60":{"position":[[91,9],[225,9]]},"133":{"position":[[640,12],[653,11],[707,11],[743,10]]},"141":{"position":[[110,10],[406,10],[748,11]]},"142":{"position":[[402,10],[487,10],[577,10]]},"252":{"position":[[458,10]]},"273":{"position":[[424,9]]},"373":{"position":[[11,9],[84,9],[390,10]]},"387":{"position":[[121,11]]},"389":{"position":[[11,9],[408,10]]},"393":{"position":[[582,9]]},"395":{"position":[[74,10]]},"397":{"position":[[11,9]]},"400":{"position":[[35,10]]},"401":{"position":[[26,9],[565,9]]},"411":{"position":[[22,10]]}},"keywords":{}}],["formattableunit",{"_index":1591,"title":{},"content":{"223":{"position":[[828,16]]},"348":{"position":[[778,16]]}},"keywords":{}}],["formattedd",{"_index":1080,"title":{"292":{"position":[[0,14]]}},"content":{"89":{"position":[[136,15],[647,15]]},"100":{"position":[[999,15],[1318,13]]},"262":{"position":[[771,13]]},"292":{"position":[[230,15]]},"293":{"position":[[207,13]]},"294":{"position":[[296,15]]},"296":{"position":[[422,15]]},"297":{"position":[[511,15]]},"344":{"position":[[269,14]]},"345":{"position":[[1197,14]]}},"keywords":{}}],["formatteddatepart",{"_index":2100,"title":{"293":{"position":[[0,19]]}},"content":{},"keywords":{}}],["formatteddatetimerang",{"_index":2116,"title":{"296":{"position":[[0,23]]}},"content":{},"keywords":{}}],["formatteddisplaynam",{"_index":908,"title":{"303":{"position":[[0,21]]}},"content":{"65":{"position":[[624,21]]},"243":{"position":[[398,21]]}},"keywords":{}}],["formattedfoobarmessag",{"_index":2245,"title":{},"content":{"320":{"position":[[59,27]]},"377":{"position":[[59,27]]},"426":{"position":[[59,27]]}},"keywords":{}}],["formattedhtmlmessag",{"_index":1962,"title":{"267":{"position":[[28,20]]}},"content":{"273":{"position":[[1,20]]},"274":{"position":[[41,20]]}},"keywords":{}}],["formattedlist",{"_index":2171,"title":{"301":{"position":[[0,14]]}},"content":{},"keywords":{}}],["formattedlistpart",{"_index":2177,"title":{"302":{"position":[[0,19]]}},"content":{},"keywords":{}}],["formattedmessag",{"_index":254,"title":{"15":{"position":[[16,20]]},"267":{"position":[[7,16]]},"279":{"position":[[0,16]]},"280":{"position":[[6,16]]},"304":{"position":[[0,17]]},"332":{"position":[[9,16]]}},"content":{"15":{"position":[[8,18]]},"20":{"position":[[168,17]]},"42":{"position":[[617,18]]},"71":{"position":[[84,18],[650,18]]},"72":{"position":[[214,18]]},"73":{"position":[[412,18]]},"254":{"position":[[354,18]]},"272":{"position":[[629,16]]},"273":{"position":[[235,16]]},"276":{"position":[[328,16],[709,16]]},"280":{"position":[[59,16]]},"320":{"position":[[131,16]]},"322":{"position":[[185,18]]},"371":{"position":[[681,18]]},"377":{"position":[[131,16]]},"381":{"position":[[185,18]]},"426":{"position":[[131,16]]},"428":{"position":[[185,18]]},"435":{"position":[[414,18]]},"439":{"position":[[137,17]]}},"keywords":{}}],["formattednumb",{"_index":307,"title":{"298":{"position":[[0,16]]}},"content":{"20":{"position":[[186,16]]},"298":{"position":[[209,17]]},"299":{"position":[[205,15]]}},"keywords":{}}],["formattednumberpart",{"_index":2159,"title":{"299":{"position":[[0,21]]}},"content":{},"keywords":{}}],["formattedplur",{"_index":2164,"title":{"300":{"position":[[0,16]]}},"content":{"300":{"position":[[301,17]]}},"keywords":{}}],["formattedrel",{"_index":1795,"title":{},"content":{"250":{"position":[[1047,18]]},"262":{"position":[[514,18]]},"325":{"position":[[451,17]]},"331":{"position":[[20,18],[201,17],[1913,17]]}},"keywords":{}}],["formattedrelative'",{"_index":1977,"title":{"269":{"position":[[7,19]]}},"content":{},"keywords":{}}],["formattedrelativetim",{"_index":905,"title":{"297":{"position":[[0,22]]},"331":{"position":[[0,22]]}},"content":{"65":{"position":[[489,22]]},"325":{"position":[[489,21],[554,21],[690,21]]}},"keywords":{}}],["formattedtim",{"_index":2109,"title":{"294":{"position":[[0,14]]}},"content":{"295":{"position":[[207,13]]}},"keywords":{}}],["formattedtimepart",{"_index":2112,"title":{"295":{"position":[[0,19]]}},"content":{},"keywords":{}}],["formatter.j",{"_index":737,"title":{},"content":{"44":{"position":[[596,12],[617,12]]},"47":{"position":[[474,12],[495,12]]}},"keywords":{}}],["formattim",{"_index":1650,"title":{"230":{"position":[[0,11]]},"356":{"position":[[0,11]]}},"content":{"230":{"position":[[10,11]]},"294":{"position":[[25,10]]},"356":{"position":[[10,11]]}},"keywords":{}}],["formattime(valu",{"_index":1586,"title":{},"content":{"223":{"position":[[502,17]]},"348":{"position":[[452,17]]}},"keywords":{}}],["formattimetopart",{"_index":1589,"title":{},"content":{"223":{"position":[[682,18]]},"348":{"position":[[632,18]]}},"keywords":{}}],["formattopart",{"_index":1553,"title":{},"content":{"212":{"position":[[153,13]]}},"keywords":{}}],["formatxmlelementfn",{"_index":1733,"title":{},"content":{"240":{"position":[[339,18]]},"367":{"position":[[339,18]]}},"keywords":{}}],["formatxmlelementfn<react.reactnode>>",{"_index":1578,"title":{},"content":{"223":{"position":[[264,45]]},"283":{"position":[[1130,45]]}},"keywords":{}}],["formatxmlelementfn<str",{"_index":1603,"title":{},"content":{"223":{"position":[[1244,29]]},"348":{"position":[[1194,29]]}},"keywords":{}}],["formatxmlelementfn<t",{"_index":1606,"title":{},"content":{"223":{"position":[[1392,24]]},"348":{"position":[[1342,24]]}},"keywords":{}}],["forward",{"_index":1982,"title":{},"content":{"269":{"position":[[151,8]]}},"keywords":{}}],["forwardedref",{"_index":2435,"title":{},"content":{"345":{"position":[[190,14]]}},"keywords":{}}],["forwardref",{"_index":1108,"title":{"327":{"position":[[19,11]]}},"content":{"90":{"position":[[493,12],[649,12]]},"327":{"position":[[194,11],[211,10],[1082,12]]}},"keywords":{}}],["foto",{"_index":1305,"title":{},"content":{"125":{"position":[[446,7],[474,6],[502,7]]}},"keywords":{}}],["found",{"_index":521,"title":{},"content":{"35":{"position":[[514,5],[889,5]]},"138":{"position":[[299,5]]},"250":{"position":[[783,5]]},"345":{"position":[[880,5]]}},"keywords":{}}],["four",{"_index":1702,"title":{},"content":{"235":{"position":[[553,4]]},"362":{"position":[[554,4]]}},"keywords":{}}],["fr",{"_index":108,"title":{},"content":{"3":{"position":[[483,3]]},"48":{"position":[[399,5]]},"168":{"position":[[75,6],[98,4],[117,6]]},"221":{"position":[[298,3],[302,4]]},"253":{"position":[[786,4]]},"291":{"position":[[339,3],[343,4]]},"336":{"position":[[435,3],[439,4]]},"346":{"position":[[395,3],[399,4]]}},"keywords":{}}],["fr.json",{"_index":160,"title":{},"content":{"7":{"position":[[77,7]]},"10":{"position":[[133,7],[356,7]]}},"keywords":{}}],["fraction",{"_index":441,"title":{},"content":{"31":{"position":[[841,8],[1325,8]]},"297":{"position":[[1234,10]]}},"keywords":{}}],["fragment",{"_index":2486,"title":{},"content":{"383":{"position":[[267,10]]}},"keywords":{}}],["framework",{"_index":1078,"title":{},"content":{"89":{"position":[[71,10]]},"249":{"position":[[418,10]]},"262":{"position":[[1152,9]]},"283":{"position":[[319,10]]}},"keywords":{}}],["free",{"_index":746,"title":{},"content":{"44":{"position":[[915,4]]},"394":{"position":[[710,4]]}},"keywords":{}}],["french",{"_index":308,"title":{},"content":{"20":{"position":[[247,6]]},"46":{"position":[[82,6]]},"259":{"position":[[262,6]]}},"keywords":{}}],["friendli",{"_index":199,"title":{"80":{"position":[[18,8]]}},"content":{"10":{"position":[[16,8]]},"12":{"position":[[206,8]]},"383":{"position":[[307,9]]}},"keywords":{}}],["from={new",{"_index":2122,"title":{},"content":{"296":{"position":[[750,9]]}},"keywords":{}}],["full",{"_index":912,"title":{"67":{"position":[[0,4]]}},"content":{"67":{"position":[[30,4],[170,4],[214,4]]},"118":{"position":[[44,5]]},"129":{"position":[[135,4]]},"131":{"position":[[163,4]]},"136":{"position":[[645,4],[1767,4]]},"138":{"position":[[261,4]]},"244":{"position":[[1,4],[41,4],[181,4],[225,4]]},"297":{"position":[[1491,4]]},"329":{"position":[[1239,4],[1283,4]]},"383":{"position":[[234,4]]},"409":{"position":[[56,4]]},"411":{"position":[[347,4]]}},"keywords":{}}],["fulli",{"_index":1225,"title":{},"content":{"101":{"position":[[164,5]]},"120":{"position":[[17,5]]},"176":{"position":[[17,5]]},"217":{"position":[[17,5]]},"272":{"position":[[650,5]]},"412":{"position":[[20,5],[70,5]]}},"keywords":{}}],["fun",{"_index":2375,"title":{},"content":{"332":{"position":[[1689,4]]}},"keywords":{}}],["function",{"_index":322,"title":{"91":{"position":[[7,9]]},"93":{"position":[[7,9]]},"278":{"position":[[30,8]]},"310":{"position":[[0,8]]},"378":{"position":[[13,8]]}},"content":{"20":{"position":[[412,8]]},"42":{"position":[[1131,8]]},"44":{"position":[[652,8]]},"47":{"position":[[531,8]]},"48":{"position":[[334,8],[496,8],[676,8]]},"84":{"position":[[448,8],[781,8]]},"89":{"position":[[774,8],[802,8]]},"91":{"position":[[104,8],[125,8]]},"92":{"position":[[164,8]]},"93":{"position":[[164,9],[559,8],[738,8]]},"96":{"position":[[262,8],[307,9]]},"100":{"position":[[95,8],[211,8],[294,8],[466,8],[528,8]]},"109":{"position":[[82,8]]},"117":{"position":[[84,8]]},"136":{"position":[[1078,8]]},"148":{"position":[[84,8]]},"154":{"position":[[89,8]]},"162":{"position":[[76,8]]},"175":{"position":[[80,8]]},"184":{"position":[[82,8]]},"195":{"position":[[81,8]]},"201":{"position":[[80,8]]},"209":{"position":[[79,8]]},"216":{"position":[[88,8]]},"227":{"position":[[38,9]]},"229":{"position":[[1,8],[122,8]]},"230":{"position":[[1,8],[122,8]]},"231":{"position":[[336,8],[476,8]]},"232":{"position":[[6,8],[48,8],[162,8]]},"233":{"position":[[75,8],[208,8],[798,8]]},"234":{"position":[[247,8],[378,8]]},"235":{"position":[[290,8]]},"240":{"position":[[81,8],[205,8],[400,8],[845,8],[1125,8],[1430,8]]},"241":{"position":[[99,8],[227,8],[315,9],[504,8]]},"254":{"position":[[499,8]]},"259":{"position":[[33,8]]},"260":{"position":[[216,10]]},"262":{"position":[[285,8],[1118,8]]},"264":{"position":[[422,8],[496,8]]},"266":{"position":[[334,8]]},"270":{"position":[[39,8],[90,9],[519,8]]},"276":{"position":[[31,8]]},"278":{"position":[[64,8]]},"290":{"position":[[38,9]]},"292":{"position":[[484,8]]},"293":{"position":[[242,8]]},"294":{"position":[[542,8]]},"295":{"position":[[242,8]]},"296":{"position":[[677,8]]},"297":{"position":[[774,8]]},"298":{"position":[[461,8]]},"299":{"position":[[242,8]]},"300":{"position":[[637,8]]},"308":{"position":[[255,8],[508,8]]},"310":{"position":[[62,8],[98,8]]},"317":{"position":[[3,8]]},"321":{"position":[[12,8]]},"328":{"position":[[158,8]]},"331":{"position":[[1711,10]]},"343":{"position":[[600,10],[895,8]]},"344":{"position":[[46,8]]},"345":{"position":[[228,8],[579,8]]},"348":{"position":[[1909,9]]},"354":{"position":[[38,9]]},"355":{"position":[[1,8],[131,8]]},"356":{"position":[[1,8],[131,8]]},"357":{"position":[[162,8],[328,8]]},"358":{"position":[[336,8],[476,8]]},"359":{"position":[[6,8],[48,8],[162,8]]},"360":{"position":[[75,8],[208,8],[798,8]]},"361":{"position":[[247,8],[378,8]]},"362":{"position":[[290,8]]},"367":{"position":[[81,8],[205,8],[400,8],[845,8],[1125,8],[1430,8]]},"368":{"position":[[99,8],[227,8],[315,9],[500,8]]},"371":{"position":[[826,8]]},"373":{"position":[[113,8]]},"378":{"position":[[12,8]]},"389":{"position":[[139,8]]},"397":{"position":[[139,8]]},"423":{"position":[[3,8]]},"427":{"position":[[12,8]]},"435":{"position":[[540,8]]},"436":{"position":[[60,8]]},"438":{"position":[[104,8]]},"444":{"position":[[548,8]]},"445":{"position":[[671,8]]},"451":{"position":[[105,9],[225,10]]},"452":{"position":[[133,10],[433,8]]}},"keywords":{}}],["functionalcompon",{"_index":2447,"title":{},"content":{"345":{"position":[[1276,20]]}},"keywords":{}}],["functioncompon",{"_index":2426,"title":{},"content":{"344":{"position":[[308,18],[529,17]]}},"keywords":{}}],["fun}"",{"_index":2370,"title":{},"content":{"332":{"position":[[1557,11]]}},"keywords":{}}],["further",{"_index":128,"title":{},"content":{"4":{"position":[[279,7]]},"30":{"position":[[277,7]]},"138":{"position":[[71,7]]},"253":{"position":[[838,7]]},"326":{"position":[[307,7]]}},"keywords":{}}],["futur",{"_index":783,"title":{},"content":{"47":{"position":[[669,6]]},"53":{"position":[[204,7]]},"123":{"position":[[338,6]]},"278":{"position":[[529,6]]},"329":{"position":[[284,6]]}},"keywords":{}}],["gallon",{"_index":1504,"title":{},"content":{"186":{"position":[[193,8]]}},"keywords":{}}],["gb",{"_index":75,"title":{},"content":{"2":{"position":[[605,2]]},"138":{"position":[[222,3]]}},"keywords":{}}],["gb"",{"_index":1008,"title":{},"content":{"82":{"position":[[272,9]]}},"keywords":{}}],["gb').format",{"_index":1406,"title":{},"content":{"138":{"position":[[927,13]]}},"keywords":{}}],["gb.json",{"_index":1011,"title":{},"content":{"82":{"position":[[423,7]]},"83":{"position":[[321,7],[393,7],[449,7]]}},"keywords":{}}],["gear",{"_index":843,"title":{},"content":{"53":{"position":[[218,4]]}},"keywords":{}}],["gender",{"_index":532,"title":{},"content":{"35":{"position":[[1051,8]]}},"keywords":{}}],["gener",{"_index":207,"title":{"43":{"position":[[13,11]]}},"content":{"11":{"position":[[3,7]]},"38":{"position":[[594,9]]},"44":{"position":[[20,9]]},"54":{"position":[[44,9]]},"96":{"position":[[62,9]]},"100":{"position":[[163,7]]},"101":{"position":[[618,8]]},"319":{"position":[[32,9]]},"328":{"position":[[763,7]]},"344":{"position":[[785,7]]},"375":{"position":[[90,8]]},"424":{"position":[[32,9]]},"456":{"position":[[15,9],[109,10]]},"458":{"position":[[55,9],[88,10]]}},"keywords":{}}],["get",{"_index":888,"title":{},"content":{"63":{"position":[[6,4]]},"310":{"position":[[700,4]]},"326":{"position":[[145,4]]},"382":{"position":[[131,4]]},"430":{"position":[[15,4]]},"431":{"position":[[15,4]]}},"keywords":{}}],["getast",{"_index":1396,"title":{"137":{"position":[[0,6]]}},"content":{},"keywords":{}}],["getcanonicallocal",{"_index":1463,"title":{},"content":{"150":{"position":[[32,19]]}},"keywords":{}}],["getcanonicallocales/polyfil",{"_index":1465,"title":{},"content":{"153":{"position":[[24,29]]},"154":{"position":[[223,30],[344,28]]}},"keywords":{}}],["getcanonicallocales/should",{"_index":1466,"title":{},"content":{"154":{"position":[[46,26]]}},"keywords":{}}],["getcustomtransform",{"_index":369,"title":{},"content":{"23":{"position":[[211,23]]},"73":{"position":[[210,23]]},"418":{"position":[[167,23]]}},"keywords":{}}],["getdatetimeformat",{"_index":1420,"title":{},"content":{"141":{"position":[[507,18]]}},"keywords":{}}],["getintlmessag",{"_index":1954,"title":{"265":{"position":[[8,16]]}},"content":{"265":{"position":[[5,16],[361,16]]},"266":{"position":[[69,17]]},"267":{"position":[[528,17]]}},"keywords":{}}],["getnumberformat",{"_index":1418,"title":{},"content":{"141":{"position":[[421,16]]}},"keywords":{}}],["getpluralrul",{"_index":1422,"title":{},"content":{"141":{"position":[[597,15]]}},"keywords":{}}],["getwrappedinst",{"_index":2288,"title":{},"content":{"327":{"position":[[1269,20]]}},"keywords":{}}],["gigabit",{"_index":1505,"title":{},"content":{"186":{"position":[[204,9]]}},"keywords":{}}],["gigabyt",{"_index":1506,"title":{},"content":{"186":{"position":[[216,10]]}},"keywords":{}}],["gist",{"_index":1154,"title":{},"content":{"94":{"position":[[401,5]]}},"keywords":{}}],["git",{"_index":1842,"title":{},"content":{"252":{"position":[[698,3]]}},"keywords":{}}],["given",{"_index":655,"title":{},"content":{"42":{"position":[[522,5]]},"63":{"position":[[87,5],[163,5]]},"273":{"position":[[168,5]]},"392":{"position":[[92,5]]},"459":{"position":[[136,5]]}},"keywords":{}}],["glob",{"_index":2456,"title":{},"content":{"372":{"position":[[361,4],[441,5]]},"379":{"position":[[9,4]]},"451":{"position":[[1454,4]]}},"keywords":{}}],["global",{"_index":1205,"title":{},"content":{"100":{"position":[[870,8]]},"129":{"position":[[36,6]]},"222":{"position":[[37,8]]},"248":{"position":[[348,6],[411,6]]},"253":{"position":[[224,6],[365,6],[666,6],[714,6]]},"258":{"position":[[217,6],[287,7]]},"347":{"position":[[37,8]]},"419":{"position":[[94,8]]},"437":{"position":[[28,8]]},"446":{"position":[[1467,6]]}},"keywords":{}}],["go",{"_index":1719,"title":{},"content":{"239":{"position":[[29,2]]},"307":{"position":[[29,2]]},"366":{"position":[[29,2]]}},"keywords":{}}],["goal",{"_index":220,"title":{"123":{"position":[[0,6]]}},"content":{"12":{"position":[[5,4]]},"101":{"position":[[11,5]]},"383":{"position":[[207,4]]}},"keywords":{}}],["goe",{"_index":2144,"title":{},"content":{"297":{"position":[[1503,4]]}},"keywords":{}}],["golden",{"_index":1275,"title":{},"content":{"118":{"position":[[193,7],[346,6]]}},"keywords":{}}],["good",{"_index":2705,"title":{},"content":{"461":{"position":[[175,4]]},"462":{"position":[[162,4],[307,4],[471,4]]}},"keywords":{}}],["gram",{"_index":1507,"title":{},"content":{"186":{"position":[[229,6]]}},"keywords":{}}],["grammar",{"_index":547,"title":{},"content":{"36":{"position":[[420,7],[564,7],[815,7],[953,7],[1193,7]]},"37":{"position":[[435,7],[579,7],[819,7],[950,7],[1181,7]]}},"keywords":{}}],["great",{"_index":17,"title":{},"content":{"1":{"position":[[181,5]]},"31":{"position":[[539,5]]},"252":{"position":[[720,5]]},"263":{"position":[[175,5]]}},"keywords":{}}],["greatli",{"_index":2317,"title":{},"content":{"330":{"position":[[501,7]]}},"keywords":{}}],["greet",{"_index":105,"title":{},"content":{"3":{"position":[[454,9],[489,9]]},"240":{"position":[[893,9],[972,9],[1173,9],[1252,9],[1478,9],[1582,9]]},"241":{"position":[[676,9],[738,5]]},"253":{"position":[[583,9]]},"367":{"position":[[893,9],[972,9],[1173,9],[1252,9],[1478,9],[1582,9]]},"368":{"position":[[668,9],[730,5]]}},"keywords":{}}],["grey",{"_index":1392,"title":{},"content":{"136":{"position":[[1716,4]]}},"keywords":{}}],["group",{"_index":1966,"title":{},"content":{"267":{"position":[[334,6]]}},"keywords":{}}],["gt",{"_index":262,"title":{},"content":{"15":{"position":[[335,5]]},"17":{"position":[[344,5]]},"20":{"position":[[679,5],[692,5],[781,5],[887,5]]},"26":{"position":[[245,5]]},"42":{"position":[[900,5],[1042,5],[1334,5],[1529,5],[1582,5]]},"48":{"position":[[621,4],[638,5],[831,6]]},"71":{"position":[[250,5]]},"72":{"position":[[380,5]]},"84":{"position":[[535,5],[570,5],[881,5],[898,5]]},"89":{"position":[[194,5],[312,5],[916,6],[1074,5]]},"90":{"position":[[204,5],[880,5]]},"92":{"position":[[296,5]]},"94":{"position":[[273,6]]},"96":{"position":[[494,5],[812,5],[874,6],[1361,5],[1405,6]]},"100":{"position":[[1059,5],[1272,5],[1365,5],[1399,6]]},"107":{"position":[[357,4]]},"115":{"position":[[415,4]]},"136":{"position":[[472,5]]},"141":{"position":[[462,5],[550,5],[636,5]]},"152":{"position":[[187,4]]},"160":{"position":[[161,4]]},"173":{"position":[[351,4]]},"182":{"position":[[409,4],[698,4]]},"192":{"position":[[354,4]]},"207":{"position":[[143,4]]},"214":{"position":[[375,4]]},"240":{"position":[[358,4],[1702,5]]},"249":{"position":[[861,5]]},"250":{"position":[[1154,5],[1368,5],[1462,5],[1696,5]]},"254":{"position":[[491,5]]},"259":{"position":[[543,5],[780,5]]},"261":{"position":[[317,5]]},"262":{"position":[[573,5],[650,5],[961,4],[1001,5]]},"264":{"position":[[610,5]]},"267":{"position":[[638,5],[721,5]]},"269":{"position":[[394,5],[466,5]]},"272":{"position":[[171,5]]},"274":{"position":[[327,5]]},"276":{"position":[[149,5],[278,5],[482,5],[640,5]]},"278":{"position":[[432,5]]},"290":{"position":[[583,5],[740,5],[875,5]]},"292":{"position":[[254,5],[580,5],[753,5]]},"293":{"position":[[469,5],[632,4],[644,5]]},"294":{"position":[[320,5],[638,5]]},"295":{"position":[[469,5],[571,5]]},"296":{"position":[[446,5],[805,5]]},"297":{"position":[[535,5],[909,5],[1358,5]]},"298":{"position":[[235,5],[540,5],[689,5],[1015,5],[1156,5]]},"299":{"position":[[466,5],[561,5]]},"300":{"position":[[333,5],[765,5]]},"301":{"position":[[341,5],[488,5],[610,5]]},"302":{"position":[[351,5],[514,5]]},"303":{"position":[[508,5],[609,5]]},"304":{"position":[[206,5]]},"308":{"position":[[483,5],[593,5]]},"309":{"position":[[375,5],[424,6],[434,5],[805,5],[923,4],[963,5],[1039,5]]},"310":{"position":[[362,5],[480,4],[520,5],[596,4],[609,5]]},"315":{"position":[[199,5]]},"317":{"position":[[96,5]]},"322":{"position":[[294,5]]},"325":{"position":[[443,5]]},"327":{"position":[[26,5],[430,5],[762,5],[799,5],[948,5],[1352,5]]},"328":{"position":[[77,5],[369,5],[476,5]]},"331":{"position":[[668,5],[1053,5],[1240,5],[1519,5],[2199,5]]},"332":{"position":[[411,5],[591,5],[735,5],[808,5],[1772,5],[1972,5],[2017,5],[2105,5],[2149,5]]},"338":{"position":[[364,5],[466,5]]},"344":{"position":[[376,5],[490,5]]},"345":{"position":[[378,5],[1327,5],[1476,5]]},"367":{"position":[[358,4],[1702,5]]},"371":{"position":[[818,5]]},"373":{"position":[[274,5]]},"381":{"position":[[294,5]]},"389":{"position":[[263,5]]},"397":{"position":[[263,5]]},"401":{"position":[[268,5],[399,5],[527,5]]},"405":{"position":[[104,5],[192,5],[278,5]]},"410":{"position":[[391,5]]},"421":{"position":[[201,5]]},"423":{"position":[[96,5]]},"428":{"position":[[294,5]]},"435":{"position":[[532,5]]},"446":{"position":[[308,5],[536,5],[791,5],[1028,5]]},"451":{"position":[[316,5],[506,5],[632,5],[848,5],[934,5],[993,5]]},"452":{"position":[[251,5],[901,5],[938,5]]},"461":{"position":[[244,5]]}},"keywords":{}}],["guarante",{"_index":2493,"title":{},"content":{"386":{"position":[[94,10]]},"456":{"position":[[179,10]]}},"keywords":{}}],["guid",{"_index":374,"title":{"256":{"position":[[8,5]]},"271":{"position":[[8,5]]},"275":{"position":[[8,5]]},"324":{"position":[[8,5]]}},"content":{"24":{"position":[[68,5]]},"237":{"position":[[421,6]]},"253":{"position":[[846,6]]},"263":{"position":[[605,5]]},"286":{"position":[[201,5]]},"305":{"position":[[421,6]]},"351":{"position":[[201,5]]},"364":{"position":[[421,6]]}},"keywords":{}}],["guide.setup",{"_index":142,"title":{},"content":{"5":{"position":[[167,11]]}},"keywords":{}}],["h",{"_index":500,"title":{},"content":{"34":{"position":[[478,1],[492,1]]},"78":{"position":[[423,1],[437,1]]},"138":{"position":[[754,1],[768,1]]},"410":{"position":[[397,2]]}},"keywords":{}}],["h(descend",{"_index":2561,"title":{},"content":{"410":{"position":[[308,13]]}},"keywords":{}}],["ha",{"_index":2504,"title":{},"content":{"392":{"position":[[227,2]]}},"keywords":{}}],["han",{"_index":1698,"title":{},"content":{"235":{"position":[[488,4]]},"303":{"position":[[494,4]]},"362":{"position":[[489,4]]}},"keywords":{}}],["handi",{"_index":2425,"title":{},"content":{"344":{"position":[[92,6]]}},"keywords":{}}],["handl",{"_index":614,"title":{},"content":{"38":{"position":[[513,6]]},"260":{"position":[[246,7]]},"280":{"position":[[168,7]]},"443":{"position":[[102,6]]},"450":{"position":[[364,6]]},"453":{"position":[[104,7]]}},"keywords":{}}],["handler",{"_index":1628,"title":{},"content":{"226":{"position":[[43,8]]},"287":{"position":[[43,8]]},"288":{"position":[[45,8]]},"352":{"position":[[43,8]]}},"keywords":{}}],["happen",{"_index":883,"title":{},"content":{"62":{"position":[[123,7]]},"63":{"position":[[233,7]]}},"keywords":{}}],["hard",{"_index":2684,"title":{},"content":{"454":{"position":[[86,4]]}},"keywords":{}}],["harder",{"_index":2512,"title":{},"content":{"393":{"position":[[502,6]]}},"keywords":{}}],["hash",{"_index":712,"title":{},"content":{"42":{"position":[[2332,4]]},"318":{"position":[[187,4]]},"375":{"position":[[188,4]]}},"keywords":{}}],["have",{"_index":1651,"title":{},"content":{"230":{"position":[[202,6]]},"238":{"position":[[215,6]]},"252":{"position":[[1129,6]]},"306":{"position":[[260,6]]},"356":{"position":[[211,6]]},"365":{"position":[[215,6]]}},"keywords":{}}],["head",{"_index":850,"title":{},"content":{"55":{"position":[[1,4]]},"57":{"position":[[205,4]]}},"keywords":{}}],["header",{"_index":1749,"title":{},"content":{"241":{"position":[[885,9]]},"368":{"position":[[877,9]]},"371":{"position":[[659,9]]}},"keywords":{}}],["hectar",{"_index":1508,"title":{},"content":{"186":{"position":[[238,9]]}},"keywords":{}}],["hello",{"_index":106,"title":{},"content":{"3":{"position":[[464,6]]},"28":{"position":[[62,5]]},"29":{"position":[[168,5]]},"140":{"position":[[119,5],[314,5]]},"141":{"position":[[797,7]]},"237":{"position":[[271,6],[305,6]]},"240":{"position":[[941,7],[1221,7],[1526,7]]},"241":{"position":[[772,7]]},"250":{"position":[[1619,7]]},"253":{"position":[[593,8]]},"305":{"position":[[271,6],[305,6]]},"364":{"position":[[271,6],[305,6]]},"367":{"position":[[941,7],[1221,7],[1526,7]]},"368":{"position":[[764,7]]},"410":{"position":[[457,8]]},"461":{"position":[[150,10]]}},"keywords":{}}],["help",{"_index":1411,"title":{},"content":{"140":{"position":[[327,5]]},"254":{"position":[[32,5]]},"255":{"position":[[46,5]]},"273":{"position":[[119,6]]},"371":{"position":[[251,5]]},"372":{"position":[[30,4]]},"388":{"position":[[199,4]]},"444":{"position":[[82,7],[585,7]]},"445":{"position":[[708,7]]}},"keywords":{}}],["helper",{"_index":1118,"title":{"91":{"position":[[0,6]]},"93":{"position":[[0,6]]}},"content":{"92":{"position":[[157,6]]},"93":{"position":[[157,6]]},"94":{"position":[[30,6]]},"96":{"position":[[255,6],[300,6]]},"100":{"position":[[88,6]]},"265":{"position":[[115,6]]}},"keywords":{}}],["helper.j",{"_index":1147,"title":{},"content":{"94":{"position":[[70,9],[148,9],[212,10]]}},"keywords":{}}],["helpers/intl",{"_index":1146,"title":{},"content":{"94":{"position":[[45,12],[186,13]]}},"keywords":{}}],["here",{"_index":435,"title":{},"content":{"31":{"position":[[777,5]]},"96":{"position":[[1055,4],[1085,5]]},"138":{"position":[[305,4]]},"232":{"position":[[507,4]]},"293":{"position":[[340,4]]},"295":{"position":[[340,4]]},"298":{"position":[[808,4]]},"299":{"position":[[342,5]]},"328":{"position":[[231,4]]},"338":{"position":[[587,4]]},"344":{"position":[[190,4]]},"359":{"position":[[507,4]]},"369":{"position":[[87,5]]},"395":{"position":[[1,4]]}},"keywords":{}}],["here'",{"_index":537,"title":{},"content":{"35":{"position":[[1195,6]]},"135":{"position":[[146,6]]},"239":{"position":[[182,6]]},"250":{"position":[[821,6]]},"262":{"position":[[335,6]]},"307":{"position":[[182,6]]},"309":{"position":[[145,6]]},"366":{"position":[[182,6]]}},"keywords":{}}],["herm",{"_index":1539,"title":{},"content":{"194":{"position":[[147,6]]}},"keywords":{}}],["hierarchi",{"_index":1907,"title":{},"content":{"260":{"position":[[157,10]]}},"keywords":{}}],["high",{"_index":977,"title":{"81":{"position":[[0,4]]}},"content":{"81":{"position":[[93,4]]},"101":{"position":[[132,4]]},"250":{"position":[[538,4]]},"345":{"position":[[635,4]]}},"keywords":{}}],["higher",{"_index":987,"title":{},"content":{"81":{"position":[[240,6]]},"310":{"position":[[738,6]]}},"keywords":{}}],["highli",{"_index":1566,"title":{},"content":{"221":{"position":[[179,6]]},"291":{"position":[[221,6]]},"308":{"position":[[787,6]]},"332":{"position":[[1381,6]]},"336":{"position":[[317,6]]},"338":{"position":[[508,6]]},"346":{"position":[[277,6]]}},"keywords":{}}],["hight",{"_index":1912,"title":{},"content":{"262":{"position":[[249,5]]}},"keywords":{}}],["hoc",{"_index":1791,"title":{"328":{"position":[[49,4]]},"345":{"position":[[11,4]]}},"content":{"250":{"position":[[559,5]]},"262":{"position":[[271,5],[1106,3]]},"327":{"position":[[177,3],[269,3]]},"328":{"position":[[151,3]]},"343":{"position":[[637,4],[713,3]]},"345":{"position":[[656,5]]},"348":{"position":[[1897,3]]}},"keywords":{}}],["hoist",{"_index":2480,"title":{},"content":{"383":{"position":[[12,5]]}},"keywords":{}}],["hood",{"_index":1864,"title":{},"content":{"254":{"position":[[121,4]]},"371":{"position":[[343,4]]}},"keywords":{}}],["hook",{"_index":213,"title":{"328":{"position":[[12,4]]},"344":{"position":[[8,5]]}},"content":{"11":{"position":[[357,4]]},"241":{"position":[[385,4]]},"326":{"position":[[134,5]]},"328":{"position":[[48,4],[114,4],[593,4],[657,4],[681,4],[793,6]]},"343":{"position":[[486,5],[587,4]]},"344":{"position":[[80,4],[112,4],[615,4],[679,4],[703,4],[815,6]]},"368":{"position":[[381,4]]},"435":{"position":[[116,5]]}},"keywords":{}}],["hour",{"_index":468,"title":{},"content":{"33":{"position":[[198,5],[251,6],[312,6]]},"34":{"position":[[480,4],[494,4],[508,4],[522,4]]},"78":{"position":[[425,4],[439,4],[453,4],[467,4]]},"138":{"position":[[756,4],[770,4],[784,4],[798,4]]},"186":{"position":[[250,6]]},"187":{"position":[[93,6]]},"230":{"position":[[243,5]]},"231":{"position":[[180,6],[545,4],[758,7]]},"234":{"position":[[604,7]]},"270":{"position":[[350,8],[446,7]]},"294":{"position":[[173,5]]},"297":{"position":[[1658,4]]},"356":{"position":[[252,5]]},"358":{"position":[[180,6],[545,4],[758,7]]},"361":{"position":[[604,7]]}},"keywords":{}}],["href",{"_index":2052,"title":{},"content":{"278":{"position":[[380,5]]}},"keywords":{}}],["href="foo">${chunks.join('')}</a>",{"_index":2038,"title":{},"content":{"274":{"position":[[353,55]]}},"keywords":{}}],["href="foo">link</a>",{"_index":2034,"title":{},"content":{"274":{"position":[[201,40]]}},"keywords":{}}],["href="https://www.example.com/shoe"",{"_index":2218,"title":{},"content":{"309":{"position":[[877,45]]},"310":{"position":[[434,45]]}},"keywords":{}}],["href="https://www.shoe.com/">",{"_index":2355,"title":{},"content":{"332":{"position":[[259,42],[663,42]]}},"keywords":{}}],["html",{"_index":1374,"title":{"274":{"position":[[23,4]]}},"content":{"136":{"position":[[674,5],[825,4],[1693,4]]},"272":{"position":[[674,4]]},"273":{"position":[[155,4],[277,4],[359,4],[456,5],[521,4],[629,4]]},"274":{"position":[[471,4]]}},"keywords":{}}],["html/xhtml/xml",{"_index":1395,"title":{},"content":{"136":{"position":[[1772,14]]}},"keywords":{}}],["html/xml",{"_index":1346,"title":{},"content":{"133":{"position":[[798,8]]}},"keywords":{}}],["https://github.com/formatjs/formatjs/issues/1356https://github.com/formatjs/formatjs/issues/992",{"_index":920,"title":{},"content":{"68":{"position":[[170,95]]},"245":{"position":[[170,95]]}},"keywords":{}}],["https://github.com/formatjs/formatjs/issues/1752",{"_index":1635,"title":{},"content":{"227":{"position":[[251,48]]},"290":{"position":[[251,48]]},"354":{"position":[[251,48]]}},"keywords":{}}],["https://github.com/formatjs/formatjs/tree/main/packages/react",{"_index":851,"title":{},"content":{"55":{"position":[[14,61]]}},"keywords":{}}],["https://tc39.es/ecma402",{"_index":1487,"title":{},"content":{"180":{"position":[[56,26]]}},"keywords":{}}],["human",{"_index":636,"title":{},"content":{"39":{"position":[[614,5]]}},"keywords":{}}],["hyphen",{"_index":54,"title":{},"content":{"2":{"position":[[209,7]]}},"keywords":{}}],["i']}>",{"_index":2181,"title":{},"content":{"302":{"position":[[497,9]]}},"keywords":{}}],["i.",{"_index":1645,"title":{},"content":{"229":{"position":[[217,6]]},"230":{"position":[[332,6]]},"355":{"position":[[226,6]]},"356":{"position":[[341,6]]},"357":{"position":[[449,6]]}},"keywords":{}}],["i18n",{"_index":198,"title":{"80":{"position":[[13,4]]},"249":{"position":[[12,4]]}},"content":{"10":{"position":[[11,4]]},"12":{"position":[[163,4],[201,4],[316,4]]},"84":{"position":[[15,4]]},"234":{"position":[[436,4]]},"249":{"position":[[51,4],[149,4]]},"250":{"position":[[933,4]]},"283":{"position":[[50,4],[543,4],[679,4],[715,4]]},"361":{"position":[[436,4]]}},"keywords":{}}],["iana",{"_index":1272,"title":{"118":{"position":[[7,4]]}},"content":{"118":{"position":[[28,4],[77,4],[240,4]]}},"keywords":{}}],["ic",{"_index":2671,"title":{},"content":{"452":{"position":[[602,4],[717,4]]}},"keywords":{}}],["icon",{"_index":2205,"title":{},"content":{"309":{"position":[[410,5]]}},"keywords":{}}],["icon}"",{"_index":2204,"title":{},"content":{"309":{"position":[[342,12]]}},"keywords":{}}],["icu",{"_index":110,"title":{"67":{"position":[[5,4]]},"74":{"position":[[0,3]]},"414":{"position":[[6,3]]},"449":{"position":[[11,3]]},"457":{"position":[[11,4]]}},"content":{"3":{"position":[[535,3]]},"29":{"position":[[156,3]]},"30":{"position":[[333,3]]},"31":{"position":[[165,3],[231,3],[585,3],[630,3],[933,3],[1094,3],[1220,3]]},"32":{"position":[[423,3]]},"33":{"position":[[375,3]]},"34":{"position":[[41,3],[64,3]]},"35":{"position":[[1039,3],[1235,3]]},"36":{"position":[[1992,3],[2126,3],[2480,3]]},"37":{"position":[[1909,3]]},"38":{"position":[[214,3]]},"39":{"position":[[163,3],[236,3],[319,3],[371,3],[680,3],[701,3]]},"44":{"position":[[1207,3]]},"67":{"position":[[35,3],[175,3],[219,3]]},"75":{"position":[[82,3]]},"78":{"position":[[1,3]]},"126":{"position":[[228,3]]},"127":{"position":[[26,3]]},"129":{"position":[[140,5]]},"131":{"position":[[168,3]]},"136":{"position":[[937,3],[1275,3]]},"138":{"position":[[12,3],[332,3]]},"237":{"position":[[81,3],[117,3]]},"244":{"position":[[6,4],[46,3],[186,3],[230,3]]},"272":{"position":[[288,3],[381,3]]},"305":{"position":[[81,3],[117,3]]},"329":{"position":[[1244,3],[1288,3]]},"337":{"position":[[51,3]]},"338":{"position":[[32,3],[134,3]]},"364":{"position":[[81,3],[117,3]]},"388":{"position":[[100,3]]},"396":{"position":[[139,3]]},"400":{"position":[[328,3]]},"414":{"position":[[103,3]]},"443":{"position":[[47,3]]},"457":{"position":[[191,3]]}},"keywords":{}}],["icu'",{"_index":626,"title":{},"content":{"39":{"position":[[138,5]]}},"keywords":{}}],["icu4j",{"_index":528,"title":{},"content":{"35":{"position":[[960,5]]},"36":{"position":[[1913,5]]},"37":{"position":[[1672,5]]}},"keywords":{}}],["icu4j/icu4c",{"_index":2396,"title":{},"content":{"338":{"position":[[198,12]]}},"keywords":{}}],["icumessageformatparser.pars",{"_index":944,"title":{},"content":{"77":{"position":[[42,29]]}},"keywords":{}}],["id",{"_index":310,"title":{"43":{"position":[[10,2]]},"253":{"position":[[15,3]]},"375":{"position":[[2,2]]},"456":{"position":[[8,3]]},"458":{"position":[[3,3]]}},"content":{"20":{"position":[[268,3]]},"42":{"position":[[251,2],[310,2],[950,3],[964,4],[2260,2],[2315,3],[2343,2],[2398,3]]},"43":{"position":[[14,3],[137,3]]},"44":{"position":[[530,2],[700,4]]},"47":{"position":[[579,4]]},"63":{"position":[[93,2],[169,3]]},"71":{"position":[[305,2],[343,2],[733,3]]},"73":{"position":[[495,3]]},"238":{"position":[[299,3],[501,3]]},"239":{"position":[[277,3],[470,3]]},"240":{"position":[[497,2],[632,2],[905,3],[1185,3],[1490,3]]},"241":{"position":[[31,4],[688,3],[824,3]]},"253":{"position":[[30,2],[284,4],[419,4]]},"254":{"position":[[285,3],[635,3]]},"263":{"position":[[381,2],[412,3],[672,2]]},"264":{"position":[[924,3],[969,3]]},"265":{"position":[[149,2],[486,3]]},"306":{"position":[[344,3],[546,4]]},"307":{"position":[[277,3],[466,3]]},"317":{"position":[[31,4],[142,2]]},"318":{"position":[[43,3],[98,3]]},"365":{"position":[[299,3],[501,3]]},"366":{"position":[[277,3],[470,3]]},"367":{"position":[[497,2],[632,2],[905,3],[1185,3],[1490,3]]},"368":{"position":[[31,4],[680,3],[816,3]]},"371":{"position":[[522,3],[598,3],[962,3]]},"375":{"position":[[43,3],[99,3]]},"393":{"position":[[1041,2]]},"394":{"position":[[162,2]]},"410":{"position":[[430,3]]},"423":{"position":[[31,4],[142,2],[281,2]]},"456":{"position":[[25,2],[106,2],[167,3],[289,3],[377,3],[678,4],[811,2],[915,3],[962,2],[1014,2]]},"458":{"position":[[20,2],[85,2],[149,3]]}},"keywords":{}}],["id"",{"_index":707,"title":{},"content":{"42":{"position":[[2122,9]]},"46":{"position":[[598,9]]},"395":{"position":[[672,9]]}},"keywords":{}}],["id'",{"_index":2194,"title":{},"content":{"307":{"position":[[388,4]]}},"keywords":{}}],["id.fallback",{"_index":1726,"title":{},"content":{"239":{"position":[[398,11]]},"366":{"position":[[398,11]]}},"keywords":{}}],["id="app.greeting"",{"_index":2197,"title":{},"content":{"308":{"position":[[322,27]]},"309":{"position":[[198,27]]}},"keywords":{}}],["id="bar"",{"_index":2251,"title":{},"content":{"322":{"position":[[275,18]]},"381":{"position":[[275,18]]},"428":{"position":[[275,18]]}},"keywords":{}}],["id="foo"",{"_index":1866,"title":{},"content":{"254":{"position":[[413,18]]},"309":{"position":[[649,18]]},"310":{"position":[[206,18]]},"371":{"position":[[740,18]]}},"keywords":{}}],["id="greeting"",{"_index":1970,"title":{},"content":{"267":{"position":[[673,23]]}},"keywords":{}}],["id="mymessage"",{"_index":328,"title":{},"content":{"20":{"position":[[569,24]]}},"keywords":{}}],["id="title">{txt",{"_index":2202,"title":{},"content":{"308":{"position":[[564,28]]}},"keywords":{}}],["ideal",{"_index":2513,"title":{},"content":{"393":{"position":[[539,7]]}},"keywords":{}}],["identifi",{"_index":1715,"title":{},"content":{"238":{"position":[[320,10]]},"263":{"position":[[433,10]]},"306":{"position":[[365,10]]},"365":{"position":[[320,10]]}},"keywords":{}}],["idinterpolationpattern",{"_index":652,"title":{"318":{"position":[[0,23]]}},"content":{"42":{"position":[[366,22]]},"403":{"position":[[106,23]]},"456":{"position":[[696,23],[769,23]]}},"keywords":{}}],["idiomat",{"_index":1784,"title":{},"content":{"250":{"position":[[105,9]]},"282":{"position":[[21,9]]}},"keywords":{}}],["ie11",{"_index":895,"title":{},"content":{"65":{"position":[[28,4],[712,4]]},"129":{"position":[[112,7]]},"212":{"position":[[187,4]]},"243":{"position":[[12,4],[823,4],[960,5]]},"293":{"position":[[101,5],[154,5]]},"295":{"position":[[101,5],[154,5]]},"299":{"position":[[99,5],[152,5]]},"329":{"position":[[627,4],[763,5]]}},"keywords":{}}],["ie11+intl.datetimeformat",{"_index":900,"title":{},"content":{"65":{"position":[[308,25]]},"243":{"position":[[157,25]]}},"keywords":{}}],["ie11+intl.pluralrul",{"_index":901,"title":{},"content":{"65":{"position":[[347,22]]},"243":{"position":[[196,22]]}},"keywords":{}}],["ignor",{"_index":1762,"title":{"379":{"position":[[2,6]]}},"content":{"247":{"position":[[360,7]]},"374":{"position":[[139,6]]},"394":{"position":[[337,6],[421,6]]},"446":{"position":[[1358,7]]}},"keywords":{}}],["ignore='**/*.d.t",{"_index":649,"title":{},"content":{"42":{"position":[[206,18]]}},"keywords":{}}],["ignored.self",{"_index":1377,"title":{},"content":{"136":{"position":[[843,12]]}},"keywords":{}}],["ignorelist",{"_index":2609,"title":{},"content":{"446":{"position":[[1280,11],[1317,11]]}},"keywords":{}}],["ignoretag",{"_index":1340,"title":{},"content":{"133":{"position":[[665,11]]}},"keywords":{}}],["imag",{"_index":982,"title":{},"content":{"81":{"position":[[81,7]]}},"keywords":{}}],["img",{"_index":2662,"title":{},"content":{"451":{"position":[[2156,3],[2165,7]]}},"keywords":{}}],["immedi",{"_index":189,"title":{},"content":{"8":{"position":[[236,11]]},"17":{"position":[[661,11]]}},"keywords":{}}],["imper",{"_index":242,"title":{"14":{"position":[[6,10]]},"54":{"position":[[0,10]]},"341":{"position":[[0,10]]},"342":{"position":[[4,10]]}},"content":{"54":{"position":[[1,10]]},"221":{"position":[[340,12]]},"223":{"position":[[2037,10]]},"250":{"position":[[253,10],[493,10],[665,10],[906,10]]},"260":{"position":[[187,10]]},"262":{"position":[[33,10],[308,10],[438,10]]},"282":{"position":[[169,10]]},"336":{"position":[[475,12]]},"342":{"position":[[69,10]]},"345":{"position":[[762,10]]},"346":{"position":[[435,12]]},"348":{"position":[[2170,10]]},"461":{"position":[[45,10]]}},"keywords":{}}],["implement",{"_index":529,"title":{},"content":{"35":{"position":[[966,15]]},"36":{"position":[[1919,15]]},"37":{"position":[[1678,15]]},"75":{"position":[[14,10]]},"96":{"position":[[1180,14]]},"123":{"position":[[230,14],[312,14]]},"250":{"position":[[802,17]]},"329":{"position":[[347,11]]},"331":{"position":[[150,11],[1900,12]]},"338":{"position":[[177,15]]},"345":{"position":[[899,17]]}},"keywords":{}}],["implic",{"_index":2691,"title":{},"content":{"455":{"position":[[102,11]]}},"keywords":{}}],["import",{"_index":255,"title":{"109":{"position":[[8,6]]},"117":{"position":[[8,6]]},"148":{"position":[[8,6]]},"154":{"position":[[8,6]]},"162":{"position":[[8,6]]},"175":{"position":[[8,6]]},"184":{"position":[[8,6]]},"195":{"position":[[8,6]]},"201":{"position":[[8,6]]},"209":{"position":[[8,6]]},"216":{"position":[[8,6]]}},"content":{"15":{"position":[[1,6]]},"17":{"position":[[1,6]]},"20":{"position":[[115,6],[146,6]]},"23":{"position":[[45,6]]},"26":{"position":[[65,6],[116,6]]},"42":{"position":[[579,6],[610,6]]},"48":{"position":[[202,7],[225,6],[256,6],[294,6]]},"53":{"position":[[1,6]]},"71":{"position":[[77,6]]},"72":{"position":[[207,6]]},"73":{"position":[[53,6]]},"76":{"position":[[1,6]]},"84":{"position":[[328,6],[365,6],[644,6],[698,6]]},"89":{"position":[[103,6],[129,6],[496,6],[524,6],[559,6],[585,6],[640,6],[681,6]]},"92":{"position":[[187,6]]},"93":{"position":[[258,6],[284,6],[324,6]]},"94":{"position":[[84,6],[158,6]]},"96":{"position":[[318,6],[344,6],[387,6],[640,6],[666,6],[740,6],[1232,6],[1258,6],[1289,6]]},"100":{"position":[[341,6],[367,6],[426,6],[804,6],[830,6],[888,9],[944,6],[992,6]]},"108":{"position":[[1,6],[47,6]]},"109":{"position":[[1,6]]},"116":{"position":[[1,6],[49,6],[125,6]]},"117":{"position":[[1,6]]},"118":{"position":[[93,6],[141,6],[256,6],[304,6]]},"119":{"position":[[484,6],[532,6]]},"131":{"position":[[13,6]]},"140":{"position":[[145,6],[196,6]]},"141":{"position":[[302,6],[353,6]]},"147":{"position":[[1,6]]},"148":{"position":[[1,6]]},"153":{"position":[[1,6]]},"154":{"position":[[1,6]]},"161":{"position":[[1,6]]},"162":{"position":[[1,6]]},"168":{"position":[[1,6]]},"174":{"position":[[1,6],[45,6]]},"175":{"position":[[1,6]]},"183":{"position":[[1,6],[47,6]]},"184":{"position":[[1,6]]},"193":{"position":[[1,6],[46,6]]},"194":{"position":[[195,6],[256,6],[331,6]]},"195":{"position":[[1,6]]},"200":{"position":[[1,6]]},"201":{"position":[[1,6]]},"208":{"position":[[1,6]]},"209":{"position":[[1,6]]},"215":{"position":[[1,6],[53,6]]},"216":{"position":[[1,6],[352,7]]},"221":{"position":[[96,6]]},"241":{"position":[[581,6]]},"250":{"position":[[964,6],[991,6],[1025,6]]},"253":{"position":[[911,10]]},"254":{"position":[[219,6],[347,6]]},"259":{"position":[[654,6]]},"261":{"position":[[176,6],[209,6]]},"262":{"position":[[468,6],[494,6]]},"291":{"position":[[125,6]]},"313":{"position":[[49,6]]},"320":{"position":[[152,8]]},"322":{"position":[[178,6]]},"327":{"position":[[305,6],[331,6],[823,6],[849,6]]},"328":{"position":[[274,6],[407,6]]},"330":{"position":[[248,9],[296,6],[344,6]]},"331":{"position":[[2024,6]]},"336":{"position":[[221,6]]},"344":{"position":[[226,6],[252,6]]},"345":{"position":[[1151,6],[1177,6]]},"346":{"position":[[181,6]]},"368":{"position":[[577,6]]},"371":{"position":[[441,6],[674,6]]},"377":{"position":[[151,8]]},"381":{"position":[[178,6]]},"401":{"position":[[62,6]]},"403":{"position":[[1,6]]},"404":{"position":[[1,6]]},"405":{"position":[[1,6]]},"408":{"position":[[83,6]]},"409":{"position":[[137,8]]},"410":{"position":[[72,6],[114,6]]},"418":{"position":[[1,6]]},"421":{"position":[[21,6],[72,6]]},"426":{"position":[[152,8]]},"428":{"position":[[178,6]]},"434":{"position":[[74,6]]},"435":{"position":[[205,6],[407,6]]},"441":{"position":[[1,6]]},"443":{"position":[[876,6]]},"444":{"position":[[115,6],[310,6]]},"445":{"position":[[214,6],[426,6]]},"446":{"position":[[1136,6]]},"447":{"position":[[336,6]]},"448":{"position":[[131,6]]},"450":{"position":[[80,6],[426,6]]},"451":{"position":[[1195,6]]},"452":{"position":[[1106,6]]},"453":{"position":[[219,6]]},"454":{"position":[[166,6]]},"455":{"position":[[159,6]]},"456":{"position":[[197,6],[562,6]]},"459":{"position":[[424,6]]}},"keywords":{}}],["import('@formatjs/intl",{"_index":1251,"title":{},"content":{"109":{"position":[[281,22]]},"117":{"position":[[283,22],[395,22]]},"148":{"position":[[283,22]]},"154":{"position":[[200,22],[321,22]]},"162":{"position":[[174,22],[282,22]]},"175":{"position":[[279,22]]},"184":{"position":[[281,22]]},"195":{"position":[[280,22]]},"201":{"position":[[189,22],[301,22]]},"209":{"position":[[145,22]]},"216":{"position":[[287,22]]}},"keywords":{}}],["import('compil",{"_index":790,"title":{},"content":{"48":{"position":[[412,16],[460,16]]}},"keywords":{}}],["import(`@formatjs/intl",{"_index":1253,"title":{},"content":{"109":{"position":[[340,22]]},"117":{"position":[[447,22]]},"175":{"position":[[336,22]]},"184":{"position":[[340,22]]},"195":{"position":[[338,22]]}},"keywords":{}}],["importantd",{"_index":2084,"title":{},"content":{"290":{"position":[[565,17]]}},"keywords":{}}],["importantdate={new",{"_index":2089,"title":{},"content":{"290":{"position":[[835,18]]}},"keywords":{}}],["in",{"_index":1847,"title":{},"content":{"252":{"position":[[947,4]]}},"keywords":{}}],["inch",{"_index":1509,"title":{},"content":{"186":{"position":[[259,6]]}},"keywords":{}}],["includ",{"_index":230,"title":{},"content":{"12":{"position":[[180,9]]},"99":{"position":[[137,9]]},"101":{"position":[[261,9]]},"131":{"position":[[155,7]]},"243":{"position":[[592,7],[847,7],[985,7],[1113,7]]},"247":{"position":[[249,8]]},"251":{"position":[[39,7]]},"252":{"position":[[100,8],[112,8],[1245,7]]},"253":{"position":[[308,9]]},"259":{"position":[[1049,9]]},"329":{"position":[[651,7],[788,7]]},"334":{"position":[[39,7]]},"335":{"position":[[54,8],[69,8]]},"399":{"position":[[122,8]]},"451":{"position":[[1058,9],[1340,7],[1424,8],[1649,8],[1886,8]]},"452":{"position":[[1003,9],[1343,8]]}},"keywords":{}}],["incompat",{"_index":2393,"title":{},"content":{"337":{"position":[[134,12]]}},"keywords":{}}],["inconsist",{"_index":1022,"title":{},"content":{"82":{"position":[[882,13]]}},"keywords":{}}],["incorpor",{"_index":375,"title":{},"content":{"24":{"position":[[84,11]]}},"keywords":{}}],["incorrect",{"_index":2314,"title":{},"content":{"330":{"position":[[394,9]]}},"keywords":{}}],["incorrectli",{"_index":1625,"title":{},"content":{"225":{"position":[[256,12]]},"285":{"position":[[256,12]]},"350":{"position":[[256,12]]}},"keywords":{}}],["increas",{"_index":1937,"title":{},"content":{"264":{"position":[[214,10]]}},"keywords":{}}],["incur",{"_index":1020,"title":{},"content":{"82":{"position":[[803,6]]}},"keywords":{}}],["index",{"_index":2310,"title":{},"content":{"330":{"position":[[229,5]]}},"keywords":{}}],["individu",{"_index":1751,"title":{},"content":{"243":{"position":[[1032,10],[1160,10]]},"329":{"position":[[835,10]]}},"keywords":{}}],["industri",{"_index":936,"title":{},"content":{"75":{"position":[[64,8]]},"127":{"position":[[6,8]]}},"keywords":{}}],["info",{"_index":573,"title":{},"content":{"36":{"position":[[1652,4]]},"83":{"position":[[581,4]]},"96":{"position":[[1069,4]]},"97":{"position":[[49,4]]},"259":{"position":[[836,4]]},"261":{"position":[[387,4]]},"263":{"position":[[587,4]]},"264":{"position":[[911,4]]},"266":{"position":[[291,4]]},"269":{"position":[[474,4]]},"270":{"position":[[475,4]]},"286":{"position":[[216,5]]},"330":{"position":[[525,4]]},"351":{"position":[[216,5]]},"449":{"position":[[373,4]]}},"keywords":{}}],["inform",{"_index":171,"title":{},"content":{"7":{"position":[[273,11]]},"309":{"position":[[512,11]]},"326":{"position":[[315,13]]},"332":{"position":[[862,11],[1077,11]]}},"keywords":{}}],["inherit",{"_index":2265,"title":{},"content":{"325":{"position":[[834,8]]}},"keywords":{}}],["initi",{"_index":1036,"title":{},"content":{"84":{"position":[[164,11]]},"141":{"position":[[23,12]]},"269":{"position":[[765,7]]},"297":{"position":[[1384,9]]},"331":{"position":[[1528,9]]},"408":{"position":[[1,10]]}},"keywords":{}}],["initialnow",{"_index":1978,"title":{"269":{"position":[[39,11]]}},"content":{"269":{"position":[[229,11],[324,11],[525,10]]},"331":{"position":[[1666,10]]}},"keywords":{}}],["initialnow={otherd",{"_index":1985,"title":{},"content":{"269":{"position":[[443,22]]}},"keywords":{}}],["inject",{"_index":924,"title":{"409":{"position":[[0,7]]}},"content":{"71":{"position":[[333,6]]},"262":{"position":[[297,6]]},"266":{"position":[[346,8]]},"270":{"position":[[531,8]]},"345":{"position":[[1358,8]]},"348":{"position":[[1996,8]]},"409":{"position":[[15,7]]}},"keywords":{}}],["injectedintlprop",{"_index":2320,"title":{},"content":{"330":{"position":[[676,17]]}},"keywords":{}}],["injectintl",{"_index":658,"title":{"262":{"position":[[10,13]]},"328":{"position":[[38,10]]},"345":{"position":[[0,10]]}},"content":{"42":{"position":[[645,11]]},"88":{"position":[[230,12]]},"90":{"position":[[525,13]]},"92":{"position":[[342,12]]},"250":{"position":[[524,11]]},"260":{"position":[[282,13]]},"262":{"position":[[236,12],[417,12],[501,12],[1067,12]]},"266":{"position":[[359,13]]},"270":{"position":[[544,13]]},"327":{"position":[[166,10],[338,12],[856,12]]},"328":{"position":[[140,10],[263,10],[281,12]]},"343":{"position":[[702,10]]},"345":{"position":[[1184,12],[1370,12]]},"348":{"position":[[1886,10],[2027,11]]}},"keywords":{}}],["injectintl<",{"_index":2437,"title":{},"content":{"345":{"position":[[237,14]]}},"keywords":{}}],["injectintl(({intl",{"_index":2296,"title":{},"content":{"328":{"position":[[339,18]]}},"keywords":{}}],["injectintl(functionalcompon",{"_index":2449,"title":{},"content":{"345":{"position":[[1515,31]]}},"keywords":{}}],["injectintl(mycompon",{"_index":1111,"title":{},"content":{"90":{"position":[[625,23]]},"327":{"position":[[540,23],[1058,23]]}},"keywords":{}}],["injectintl(passwordchangewithintl",{"_index":673,"title":{},"content":{"42":{"position":[[1089,34]]}},"keywords":{}}],["injectintl(relativetim",{"_index":1930,"title":{},"content":{"262":{"position":[[1040,24]]}},"keywords":{}}],["injectintldefinemessagesintlproviderformatteddateformattedtimeformattedrelativetimeformattednumberformattedpluralformattedmessag",{"_index":1769,"title":{},"content":{"248":{"position":[[108,129]]}},"keywords":{}}],["injectorapi",{"_index":1837,"title":{},"content":{"252":{"position":[[515,11]]}},"keywords":{}}],["inlin",{"_index":1718,"title":{},"content":{"238":{"position":[[616,6]]},"365":{"position":[[616,6]]}},"keywords":{}}],["input",{"_index":386,"title":{},"content":{"26":{"position":[[184,6]]},"28":{"position":[[230,5]]},"29":{"position":[[96,5]]},"30":{"position":[[158,5]]},"35":{"position":[[206,5]]},"372":{"position":[[157,5]]},"421":{"position":[[140,6]]}},"keywords":{}}],["insert",{"_index":711,"title":{},"content":{"42":{"position":[[2323,6]]},"43":{"position":[[122,6]]},"456":{"position":[[152,6]]}},"keywords":{}}],["insid",{"_index":252,"title":{},"content":{"14":{"position":[[307,6]]},"15":{"position":[[326,6]]},"35":{"position":[[759,6]]},"88":{"position":[[330,6]]},"99":{"position":[[31,6]]},"457":{"position":[[19,6]]}},"keywords":{}}],["instal",{"_index":299,"title":{"18":{"position":[[0,12]]},"19":{"position":[[0,13]]},"41":{"position":[[0,13]]},"57":{"position":[[7,13]]},"103":{"position":[[0,13]]},"112":{"position":[[0,13]]},"144":{"position":[[0,13]]},"150":{"position":[[0,13]]},"157":{"position":[[0,13]]},"165":{"position":[[0,13]]},"170":{"position":[[0,13]]},"178":{"position":[[0,13]]},"189":{"position":[[0,13]]},"197":{"position":[[0,13]]},"204":{"position":[[0,13]]},"211":{"position":[[0,13]]},"219":{"position":[[0,13]]},"312":{"position":[[0,13]]},"371":{"position":[[0,13]]},"407":{"position":[[0,13]]},"416":{"position":[[0,13]]}},"content":{"246":{"position":[[1,7]]},"402":{"position":[[1,7]]}},"keywords":{}}],["instanc",{"_index":1116,"title":{"267":{"position":[[49,10]]}},"content":{"90":{"position":[[953,8]]},"91":{"position":[[164,8],[265,9],[310,8]]},"135":{"position":[[81,8]]},"136":{"position":[[99,8],[327,8]]},"141":{"position":[[141,9]]},"220":{"position":[[81,8]]},"222":{"position":[[17,8]]},"267":{"position":[[475,8]]},"269":{"position":[[59,9],[271,9],[653,10]]},"328":{"position":[[221,9]]},"343":{"position":[[77,8]]},"347":{"position":[[17,8]]},"457":{"position":[[208,9]]}},"keywords":{}}],["instance'",{"_index":1315,"title":{},"content":{"127":{"position":[[289,10]]}},"keywords":{}}],["instead",{"_index":1103,"title":{},"content":{"90":{"position":[[318,7]]},"127":{"position":[[498,7]]},"133":{"position":[[830,7]]},"194":{"position":[[218,7],[310,7]]},"228":{"position":[[211,7]]},"233":{"position":[[933,8]]},"258":{"position":[[80,7],[228,7]]},"261":{"position":[[115,7]]},"262":{"position":[[220,7]]},"264":{"position":[[59,7]]},"267":{"position":[[78,7]]},"286":{"position":[[172,8]]},"329":{"position":[[74,8]]},"330":{"position":[[174,8]]},"351":{"position":[[172,8]]},"360":{"position":[[933,8]]},"391":{"position":[[37,7]]},"392":{"position":[[56,8]]},"398":{"position":[[37,7]]},"402":{"position":[[27,7]]},"444":{"position":[[537,7]]},"445":{"position":[[660,7]]},"461":{"position":[[30,7]]},"462":{"position":[[53,7]]}},"keywords":{}}],["instruct",{"_index":916,"title":{},"content":{"67":{"position":[[191,12]]},"69":{"position":[[68,12]]},"244":{"position":[[202,12]]},"245":{"position":[[356,12]]},"329":{"position":[[1260,12]]}},"keywords":{}}],["integer}</boldthis>",{"_index":609,"title":{},"content":{"38":{"position":[[296,25]]}},"keywords":{}}],["integr",{"_index":123,"title":{"44":{"position":[[36,12]]},"47":{"position":[[36,12]]},"101":{"position":[[19,11]]}},"content":{"4":{"position":[[170,12]]},"5":{"position":[[197,12]]},"10":{"position":[[266,11]]},"44":{"position":[[876,9]]},"101":{"position":[[524,11]]},"250":{"position":[[128,11]]},"282":{"position":[[44,11]]},"342":{"position":[[41,11]]},"400":{"position":[[49,9]]},"419":{"position":[[189,13]]},"432":{"position":[[88,12]]}},"keywords":{}}],["intention",{"_index":1636,"title":{},"content":{"228":{"position":[[69,13]]}},"keywords":{}}],["interact",{"_index":1846,"title":{},"content":{"252":{"position":[[919,11]]}},"keywords":{}}],["interest",{"_index":2138,"title":{},"content":{"297":{"position":[[1164,11],[1188,11]]}},"keywords":{}}],["interfac",{"_index":1044,"title":{},"content":{"84":{"position":[[412,9],[745,9]]},"223":{"position":[[1,9],[399,9]]},"241":{"position":[[1,9]]},"253":{"position":[[399,9],[748,9]]},"283":{"position":[[758,9]]},"330":{"position":[[164,9],[427,9]]},"345":{"position":[[1230,9]]},"348":{"position":[[1,9],[349,9],[1797,9]]},"368":{"position":[[1,9]]},"401":{"position":[[49,11],[124,9]]}},"keywords":{}}],["intermediari",{"_index":2509,"title":{},"content":{"393":{"position":[[124,12]]}},"keywords":{}}],["intern",{"_index":167,"title":{},"content":{"7":{"position":[[224,8]]},"31":{"position":[[322,10]]},"32":{"position":[[492,10]]},"33":{"position":[[450,10]]},"68":{"position":[[110,13]]},"124":{"position":[[209,10]]},"245":{"position":[[110,13]]},"258":{"position":[[113,8]]},"273":{"position":[[487,10]]},"280":{"position":[[30,8]]}},"keywords":{}}],["internation",{"_index":1,"title":{"0":{"position":[[6,20]]},"1":{"position":[[8,20]]}},"content":{"1":{"position":[[1,17],[144,17],[480,20]]},"2":{"position":[[796,17]]},"75":{"position":[[113,20]]},"180":{"position":[[26,20]]},"250":{"position":[[140,20]]},"252":{"position":[[1008,20]]},"282":{"position":[[56,20]]}},"keywords":{}}],["interpol",{"_index":399,"title":{"375":{"position":[[5,13]]}},"content":{"29":{"position":[[126,12]]},"39":{"position":[[190,14],[262,15]]},"42":{"position":[[254,13],[313,13]]},"44":{"position":[[533,13]]},"393":{"position":[[1044,13]]},"394":{"position":[[165,13]]}},"keywords":{}}],["interpret",{"_index":405,"title":{},"content":{"30":{"position":[[217,9]]},"127":{"position":[[509,12]]},"265":{"position":[[127,11]]}},"keywords":{}}],["interv",{"_index":2131,"title":{},"content":{"297":{"position":[[933,8],[969,8]]}},"keywords":{}}],["intl",{"_index":256,"title":{"51":{"position":[[6,4]]},"84":{"position":[[13,4]]},"86":{"position":[[0,4]]},"89":{"position":[[42,5]]},"99":{"position":[[0,5]]},"121":{"position":[[0,4]]},"129":{"position":[[7,4]]},"130":{"position":[[8,4]]},"131":{"position":[[8,4]]},"218":{"position":[[14,4]]},"220":{"position":[[4,4]]},"246":{"position":[[10,4]]},"248":{"position":[[10,4]]},"260":{"position":[[7,4]]},"280":{"position":[[33,4]]},"329":{"position":[[24,4]]},"336":{"position":[[9,4]]},"343":{"position":[[4,4]]}},"content":{"15":{"position":[[39,5]]},"17":{"position":[[36,5]]},"19":{"position":[[32,4]]},"20":{"position":[[215,5]]},"34":{"position":[[185,4]]},"42":{"position":[[669,5],[747,6],[1160,4]]},"46":{"position":[[791,4]]},"48":{"position":[[328,5]]},"58":{"position":[[7,4]]},"62":{"position":[[18,4]]},"65":{"position":[[243,4],[264,4]]},"67":{"position":[[80,4],[279,4]]},"68":{"position":[[23,4],[81,4]]},"69":{"position":[[23,4]]},"71":{"position":[[115,5],[686,6]]},"72":{"position":[[245,5]]},"73":{"position":[[448,6]]},"75":{"position":[[203,4]]},"78":{"position":[[122,4]]},"84":{"position":[[39,4],[246,5],[359,5],[430,5],[692,5],[763,5]]},"86":{"position":[[7,4],[30,4],[117,4]]},"87":{"position":[[102,4]]},"88":{"position":[[210,4],[294,4]]},"89":{"position":[[164,5],[675,5]]},"92":{"position":[[132,4]]},"93":{"position":[[34,4],[68,4],[229,4],[318,5]]},"94":{"position":[[131,4]]},"96":{"position":[[421,5],[1158,5]]},"99":{"position":[[26,4],[79,4],[132,4]]},"100":{"position":[[23,4],[460,5],[1027,5]]},"101":{"position":[[73,4]]},"105":{"position":[[15,4]]},"129":{"position":[[31,4],[73,4],[150,4]]},"131":{"position":[[43,5]]},"138":{"position":[[453,4]]},"140":{"position":[[175,5]]},"141":{"position":[[36,6],[160,4],[332,5]]},"205":{"position":[[15,4]]},"220":{"position":[[35,4],[114,6],[192,4],[359,4]]},"221":{"position":[[269,4]]},"222":{"position":[[95,6]]},"223":{"position":[[1878,4],[1950,4]]},"237":{"position":[[59,4]]},"238":{"position":[[7,4]]},"243":{"position":[[92,4],[113,4],[586,5]]},"244":{"position":[[91,4],[290,4]]},"245":{"position":[[23,4],[81,4],[311,4]]},"246":{"position":[[19,4],[71,4],[88,4]]},"247":{"position":[[18,4],[125,4],[422,4]]},"248":{"position":[[60,5],[281,4]]},"249":{"position":[[16,4],[106,4],[520,4]]},"250":{"position":[[7,4],[1087,6],[1168,4],[2074,4],[2145,4]]},"252":{"position":[[164,7],[856,4],[904,4],[936,4],[1038,4],[1052,4],[1093,4],[1181,4]]},"254":{"position":[[255,5],[385,5],[528,6]]},"257":{"position":[[7,4]]},"258":{"position":[[34,4]]},"259":{"position":[[648,4],[689,5]]},"260":{"position":[[43,4]]},"261":{"position":[[10,4],[243,5]]},"262":{"position":[[545,5],[643,6]]},"263":{"position":[[48,4],[202,4]]},"264":{"position":[[7,4],[244,4],[474,4]]},"265":{"position":[[90,4]]},"266":{"position":[[305,4]]},"267":{"position":[[69,4]]},"268":{"position":[[125,4]]},"269":{"position":[[78,4]]},"270":{"position":[[113,4],[489,4]]},"276":{"position":[[736,4]]},"283":{"position":[[7,4],[429,4]]},"291":{"position":[[191,5],[311,4]]},"298":{"position":[[823,4]]},"305":{"position":[[59,4]]},"306":{"position":[[7,4]]},"313":{"position":[[62,5],[284,4]]},"322":{"position":[[141,5],[216,5],[371,5]]},"325":{"position":[[61,4],[154,4]]},"326":{"position":[[7,4]]},"327":{"position":[[295,4],[363,5],[813,4],[881,5]]},"328":{"position":[[216,4],[306,5],[436,5],[490,4]]},"329":{"position":[[7,4],[65,4],[303,4],[1171,4]]},"330":{"position":[[7,4],[327,5],[635,4]]},"333":{"position":[[7,4],[41,5],[69,4],[124,4],[143,4]]},"336":{"position":[[194,4],[287,5],[407,4],[671,4]]},"340":{"position":[[110,4],[197,4]]},"343":{"position":[[19,4],[31,4],[110,6],[188,4],[355,4],[464,4],[558,4],[721,4],[867,4]]},"344":{"position":[[296,5],[390,4]]},"345":{"position":[[282,7],[613,4],[1224,5],[1349,5]]},"346":{"position":[[154,4],[247,5],[367,4]]},"347":{"position":[[95,6]]},"348":{"position":[[1832,4],[2083,4]]},"359":{"position":[[522,4]]},"364":{"position":[[59,4]]},"365":{"position":[[7,4]]},"368":{"position":[[351,4],[628,5]]},"371":{"position":[[492,5],[712,5],[855,6]]},"372":{"position":[[145,5]]},"381":{"position":[[141,5],[216,5],[370,5]]},"388":{"position":[[58,4]]},"389":{"position":[[378,4]]},"393":{"position":[[102,4]]},"394":{"position":[[629,5]]},"396":{"position":[[96,4]]},"397":{"position":[[378,4]]},"407":{"position":[[24,4]]},"408":{"position":[[113,5]]},"409":{"position":[[23,6],[155,5]]},"410":{"position":[[154,5],[364,4]]},"417":{"position":[[216,4]]},"428":{"position":[[141,5],[216,5],[371,5]]},"435":{"position":[[108,4],[256,5],[445,5]]},"444":{"position":[[151,5]]},"445":{"position":[[250,5]]},"446":{"position":[[1415,4]]},"448":{"position":[[167,5]]},"450":{"position":[[462,5]]},"453":{"position":[[255,5]]},"454":{"position":[[202,5]]},"455":{"position":[[195,5]]},"456":{"position":[[233,6]]}},"keywords":{}}],["intl"",{"_index":2386,"title":{},"content":{"335":{"position":[[126,12]]}},"keywords":{}}],["intl'",{"_index":1131,"title":{},"content":{"92":{"position":[[258,6]]},"250":{"position":[[486,6]]},"252":{"position":[[743,6],[958,6]]},"258":{"position":[[106,6]]},"286":{"position":[[59,6]]},"351":{"position":[[59,6]]}},"keywords":{}}],["intl'>",{"_index":2430,"title":{},"content":{"345":{"position":[[61,10]]}},"keywords":{}}],["intl.collatorintl.datetimeformat",{"_index":1543,"title":{},"content":{"198":{"position":[[1,32]]}},"keywords":{}}],["intl.datetimeformat",{"_index":466,"title":{"110":{"position":[[0,19]]}},"content":{"32":{"position":[[515,19],[617,19]]},"33":{"position":[[473,19],[575,19]]},"115":{"position":[[80,20],[352,20]]},"119":{"position":[[615,20]]},"127":{"position":[[201,20]]},"243":{"position":[[699,19]]},"292":{"position":[[40,19]]},"294":{"position":[[40,19]]},"296":{"position":[[226,19]]}},"keywords":{}}],["intl.datetimeformat(local",{"_index":1421,"title":{},"content":{"141":{"position":[[560,27]]}},"keywords":{}}],["intl.datetimeformat.__setdefaulttimezone('america/los_angel",{"_index":1285,"title":{},"content":{"119":{"position":[[638,63]]}},"keywords":{}}],["intl.datetimeformat.prototype.formatrang",{"_index":2450,"title":{},"content":{"357":{"position":[[31,41]]}},"keywords":{}}],["intl.datetimeformat.prototype.formattopart",{"_index":2101,"title":{},"content":{"293":{"position":[[31,43]]},"295":{"position":[[31,43]]}},"keywords":{}}],["intl.datetimeformat.~locale.<locale>",{"_index":1259,"title":{},"content":{"115":{"position":[[200,43]]}},"keywords":{}}],["intl.datetimeformatopt",{"_index":1644,"title":{},"content":{"229":{"position":[[54,26]]},"230":{"position":[[54,26]]},"292":{"position":[[157,26]]},"293":{"position":[[361,26]]},"295":{"position":[[361,26]]},"355":{"position":[[63,26]]},"356":{"position":[[63,26]]},"357":{"position":[[260,26]]}},"keywords":{}}],["intl.datetimeformatpart",{"_index":1588,"title":{},"content":{"223":{"position":[[656,25],[760,25]]},"293":{"position":[[442,26]]},"295":{"position":[[442,26]]},"348":{"position":[[606,25],[710,25]]}},"keywords":{}}],["intl.displaynam",{"_index":906,"title":{"102":{"position":[[0,17]]}},"content":{"65":{"position":[[565,18]]},"107":{"position":[[80,18],[296,18]]},"235":{"position":[[31,17]]},"243":{"position":[[339,18],[1094,18]]},"303":{"position":[[31,17]]},"362":{"position":[[31,17]]}},"keywords":{}}],["intl.displaynames.~locale.<locale>",{"_index":1239,"title":{},"content":{"107":{"position":[[198,40]]}},"keywords":{}}],["intl.displaynamesha",{"_index":2185,"title":{},"content":{"303":{"position":[[180,20]]}},"keywords":{}}],["intl.durationformat",{"_index":1457,"title":{"143":{"position":[[0,19]]}},"content":{},"keywords":{}}],["intl.formatdate(d",{"_index":1922,"title":{},"content":{"262":{"position":[[787,21]]}},"keywords":{}}],["intl.formatdate(date.now",{"_index":1649,"title":{},"content":{"229":{"position":[[324,27]]},"355":{"position":[[333,27]]}},"keywords":{}}],["intl.formatdatetimerange(new",{"_index":2452,"title":{},"content":{"357":{"position":[[607,28]]}},"keywords":{}}],["intl.formatdisplayname('cni",{"_index":1706,"title":{},"content":{"235":{"position":[[727,29]]},"362":{"position":[[728,29]]}},"keywords":{}}],["intl.formatdisplayname('deva",{"_index":1704,"title":{},"content":{"235":{"position":[[604,30]]},"362":{"position":[[605,30]]}},"keywords":{}}],["intl.formatdisplayname('un",{"_index":1708,"title":{},"content":{"235":{"position":[[861,28]]},"362":{"position":[[862,28]]}},"keywords":{}}],["intl.formatdisplayname('zh",{"_index":1697,"title":{},"content":{"235":{"position":[[461,26]]},"362":{"position":[[462,26]]}},"keywords":{}}],["intl.formathtmlmessag",{"_index":2012,"title":{},"content":{"272":{"position":[[582,22]]},"273":{"position":[[28,22]]},"274":{"position":[[68,23]]}},"keywords":{}}],["intl.formathtmlmessage('thi",{"_index":2032,"title":{},"content":{"274":{"position":[[161,28]]}},"keywords":{}}],["intl.formatlist(['5",{"_index":1694,"title":{},"content":{"234":{"position":[[584,19]]},"361":{"position":[[584,19]]}},"keywords":{}}],["intl.formatlist(['m",{"_index":1692,"title":{},"content":{"234":{"position":[[500,22]]},"361":{"position":[[500,22]]}},"keywords":{}}],["intl.formatmessag",{"_index":244,"title":{"14":{"position":[[21,19]]}},"content":{"14":{"position":[[27,20],[48,19]]},"17":{"position":[[455,21]]},"60":{"position":[[124,20]]},"254":{"position":[[550,20],[584,20]]},"313":{"position":[[191,18]]},"371":{"position":[[877,20],[911,20]]},"410":{"position":[[409,20]]},"417":{"position":[[123,18]]},"435":{"position":[[21,19],[557,20]]},"436":{"position":[[25,19]]},"446":{"position":[[333,20],[585,20],[847,20],[1050,20]]},"461":{"position":[[56,23]]}},"keywords":{}}],["intl.formatmessage('thi",{"_index":2035,"title":{},"content":{"274":{"position":[[254,24]]}},"keywords":{}}],["intl.formatmessage(messag",{"_index":279,"title":{},"content":{"17":{"position":[[220,27]]}},"keywords":{}}],["intl.formatmessage(messages.greet",{"_index":1738,"title":{},"content":{"240":{"position":[[1028,37],[1308,37],[1638,37]]},"367":{"position":[[1028,37],[1308,37],[1638,37]]}},"keywords":{}}],["intl.formatmessage({defaultmessag",{"_index":2667,"title":{},"content":{"452":{"position":[[349,35],[566,35],[679,37],[815,35]]},"461":{"position":[[113,36]]}},"keywords":{}}],["intl.formatnumber(1000",{"_index":1668,"title":{},"content":{"232":{"position":[[332,23],[592,23],[699,23]]},"359":{"position":[[332,23],[588,23],[695,23]]}},"keywords":{}}],["intl.formatnumber(20",{"_index":1570,"title":{},"content":{"221":{"position":[[353,21]]},"336":{"position":[[488,21]]},"346":{"position":[[448,21]]}},"keywords":{}}],["intl.formatplural(1",{"_index":1682,"title":{},"content":{"233":{"position":[[610,20]]},"360":{"position":[[610,20]]}},"keywords":{}}],["intl.formatplural(3",{"_index":1683,"title":{},"content":{"233":{"position":[[653,20]]},"360":{"position":[[653,20]]}},"keywords":{}}],["intl.formatplural(4",{"_index":1684,"title":{},"content":{"233":{"position":[[716,20]]},"360":{"position":[[716,20]]}},"keywords":{}}],["intl.formatrelativetim",{"_index":1664,"title":{},"content":{"231":{"position":[[729,24]]},"358":{"position":[[729,24]]}},"keywords":{}}],["intl.formatrelativetime(0",{"_index":1663,"title":{},"content":{"231":{"position":[[680,26]]},"358":{"position":[[680,26]]}},"keywords":{}}],["intl.formattime(date.now",{"_index":1652,"title":{},"content":{"230":{"position":[[439,27]]},"356":{"position":[[448,27]]}},"keywords":{}}],["intl.getcanonicallocal",{"_index":1233,"title":{"149":{"position":[[0,24]]}},"content":{"104":{"position":[[1,24]]},"113":{"position":[[52,24]]},"152":{"position":[[80,25],[137,24]]},"154":{"position":[[145,24]]},"158":{"position":[[1,24]]},"166":{"position":[[1,24]]},"171":{"position":[[1,24]]},"179":{"position":[[52,24]]},"190":{"position":[[1,24]]},"212":{"position":[[52,24]]}},"keywords":{}}],["intl.getcanonicallocalesintl.localeintl.pluralrulesintl.numberformatintl.datetimeformat",{"_index":922,"title":{},"content":{"69":{"position":[[143,87]]}},"keywords":{}}],["intl.js>",{"_index":1893,"title":{},"content":{"259":{"position":[[412,11]]}},"keywords":{}}],["intl.listformat",{"_index":1459,"title":{"169":{"position":[[0,15]]}},"content":{"145":{"position":[[1,15]]},"173":{"position":[[80,16],[292,16]]},"234":{"position":[[31,15]]},"301":{"position":[[31,15],[175,16]]},"302":{"position":[[31,15],[182,16]]},"361":{"position":[[31,15]]}},"keywords":{}}],["intl.listformat.~locale.<locale>",{"_index":1479,"title":{},"content":{"173":{"position":[[196,38]]}},"keywords":{}}],["intl.listformatopt",{"_index":1689,"title":{},"content":{"234":{"position":[[318,22]]},"301":{"position":[[217,23]]},"302":{"position":[[224,23]]},"361":{"position":[[318,22]]}},"keywords":{}}],["intl.local",{"_index":1469,"title":{"156":{"position":[[0,11]]}},"content":{"160":{"position":[[80,12],[124,11]]},"162":{"position":[[132,11]]}},"keywords":{}}],["intl.localematch",{"_index":1473,"title":{"164":{"position":[[0,18]]}},"content":{},"keywords":{}}],["intl.numberformat",{"_index":419,"title":{"177":{"position":[[0,17]]}},"content":{"31":{"position":[[345,17],[445,17]]},"65":{"position":[[276,18]]},"127":{"position":[[179,17]]},"129":{"position":[[180,17]]},"182":{"position":[[80,18],[348,18],[637,18]]},"232":{"position":[[20,17]]},"243":{"position":[[125,18],[638,17]]},"298":{"position":[[42,17]]},"359":{"position":[[20,17]]}},"keywords":{}}],["intl.numberformat(local",{"_index":1419,"title":{},"content":{"141":{"position":[[472,25]]}},"keywords":{}}],["intl.numberformat.prototype.formattopart",{"_index":2160,"title":{},"content":{"299":{"position":[[31,41]]}},"keywords":{}}],["intl.numberformat.supportedlocalesof",{"_index":1349,"title":{},"content":{"134":{"position":[[24,38]]}},"keywords":{}}],["intl.numberformat.~locale.<locale>",{"_index":1488,"title":{},"content":{"182":{"position":[[198,41]]}},"keywords":{}}],["intl.numberformatopt",{"_index":1666,"title":{},"content":{"232":{"position":[[96,24]]},"298":{"position":[[98,25]]},"359":{"position":[[96,24]]}},"keywords":{}}],["intl.numberformatpart",{"_index":1596,"title":{},"content":{"223":{"position":[[1018,23]]},"299":{"position":[[441,24]]},"348":{"position":[[968,23]]}},"keywords":{}}],["intl.pluralformatopt",{"_index":1672,"title":{},"content":{"233":{"position":[[123,24]]},"360":{"position":[[123,24]]}},"keywords":{}}],["intl.pluralrul",{"_index":1490,"title":{"188":{"position":[[0,16]]}},"content":{"182":{"position":[[570,16]]},"192":{"position":[[80,17],[294,17]]},"194":{"position":[[177,17]]},"243":{"position":[[801,16]]},"300":{"position":[[46,16]]},"329":{"position":[[132,17],[605,16]]}},"keywords":{}}],["intl.pluralrules(local",{"_index":1424,"title":{},"content":{"141":{"position":[[646,24]]}},"keywords":{}}],["intl.pluralrules.~locale.<locale>",{"_index":1530,"title":{},"content":{"192":{"position":[[197,39]]}},"keywords":{}}],["intl.pluralrulesintl.relativetimeformatintl.listformatintl.displaynamesintl.numberformat",{"_index":1228,"title":{},"content":{"101":{"position":[[271,88]]}},"keywords":{}}],["intl.pluralrulesopt",{"_index":2165,"title":{},"content":{"300":{"position":[[92,24]]}},"keywords":{}}],["intl.relativetimeformat",{"_index":903,"title":{"210":{"position":[[0,23]]}},"content":{"65":{"position":[[423,24]]},"214":{"position":[[80,24],[308,24]]},"231":{"position":[[31,23]]},"243":{"position":[[931,23]]},"297":{"position":[[31,23]]},"329":{"position":[[734,23]]},"331":{"position":[[52,23]]},"358":{"position":[[31,23]]}},"keywords":{}}],["intl.relativetimeformat.prototype.formatrang",{"_index":2118,"title":{},"content":{"296":{"position":[[43,45]]}},"keywords":{}}],["intl.relativetimeformat.~locale.<locale>",{"_index":1554,"title":{},"content":{"214":{"position":[[204,46]]}},"keywords":{}}],["intl.relativetimeformatopt",{"_index":1660,"title":{},"content":{"231":{"position":[[402,30],[635,31]]},"358":{"position":[[402,30],[635,31]]}},"keywords":{}}],["intl.segment",{"_index":1546,"title":{"203":{"position":[[0,14]]}},"content":{"207":{"position":[[80,15],[127,14]]}},"keywords":{}}],["intl.supportedvaluesof",{"_index":1541,"title":{"196":{"position":[[0,22]]}},"content":{"201":{"position":[[136,22]]}},"keywords":{}}],["intl/dist/react",{"_index":1892,"title":{},"content":{"259":{"position":[[396,15]]}},"keywords":{}}],["intl/exampl",{"_index":852,"title":{},"content":{"55":{"position":[[76,13]]}},"keywords":{}}],["intl/lib/typ",{"_index":2313,"title":{},"content":{"330":{"position":[[375,15]]}},"keywords":{}}],["intl/local",{"_index":1883,"title":{},"content":{"258":{"position":[[154,11]]},"259":{"position":[[313,11]]}},"keywords":{}}],["intl={props.intl",{"_index":1048,"title":{},"content":{"84":{"position":[[517,17],[552,17]]}},"keywords":{}}],["intlconfig",{"_index":1572,"title":{},"content":{"223":{"position":[[11,10],[1808,10],[1934,11]]},"253":{"position":[[758,10]]},"283":{"position":[[768,10]]},"290":{"position":[[432,10]]},"348":{"position":[[11,10],[1758,10],[2067,11]]},"408":{"position":[[41,10]]}},"keywords":{}}],["intlformatt",{"_index":1583,"title":{},"content":{"223":{"position":[[409,14],[1825,14]]},"348":{"position":[[359,14],[1775,14]]},"409":{"position":[[61,14]]}},"keywords":{}}],["intlkey",{"_index":2558,"title":{},"content":{"409":{"position":[[30,9],[117,7]]}},"keywords":{}}],["intlmessageformat",{"_index":1290,"title":{"133":{"position":[[0,17]]}},"content":{"123":{"position":[[358,17]]},"125":{"position":[[204,18],[387,18]]},"127":{"position":[[271,17]]},"131":{"position":[[20,17],[72,17]]},"133":{"position":[[40,17]]},"134":{"position":[[1,17]]},"135":{"position":[[182,21]]},"138":{"position":[[150,18]]},"140":{"position":[[35,17],[152,17]]},"141":{"position":[[309,17]]}},"keywords":{}}],["intlmessageformat("i",{"_index":1384,"title":{},"content":{"136":{"position":[[1351,25]]}},"keywords":{}}],["intlmessageformat("raw",{"_index":1387,"title":{},"content":{"136":{"position":[[1432,27],[1528,27]]}},"keywords":{}}],["intlmessageformat('a",{"_index":1380,"title":{},"content":{"136":{"position":[[1109,20]]}},"keywords":{}}],["intlmessageformat('a<b>strong</b>').format",{"_index":2005,"title":{},"content":{"272":{"position":[[99,56]]},"276":{"position":[[77,56],[211,56]]}},"keywords":{}}],["intlmessageformat('hello",{"_index":1364,"title":{},"content":{"136":{"position":[[395,24]]},"141":{"position":[[685,24]]}},"keywords":{}}],["intlmessageformat('hello').format",{"_index":1407,"title":{},"content":{"140":{"position":[[69,35]]}},"keywords":{}}],["intlmessageformat('mi",{"_index":1348,"title":{},"content":{"133":{"position":[[953,21]]},"136":{"position":[[161,21]]}},"keywords":{}}],["intlmessageformat('today",{"_index":1404,"title":{},"content":{"138":{"position":[[868,24]]}},"keywords":{}}],["intlmessageformat(messag",{"_index":1294,"title":{},"content":{"124":{"position":[[110,26]]}},"keywords":{}}],["intlmessageformat(parse('hello')).format",{"_index":1410,"title":{},"content":{"140":{"position":[[257,42]]}},"keywords":{}}],["intlmixin",{"_index":1905,"title":{},"content":{"260":{"position":[[5,9]]},"261":{"position":[[37,9],[101,9],[528,10]]},"262":{"position":[[5,9],[206,9]]},"265":{"position":[[54,9],[265,9]]}},"keywords":{}}],["intlpropnam",{"_index":2431,"title":{},"content":{"345":{"position":[[82,14],[252,12]]}},"keywords":{}}],["intlprovid",{"_index":306,"title":{"261":{"position":[[10,13]]},"283":{"position":[[0,13]]}},"content":{"20":{"position":[[153,14]]},"48":{"position":[[301,14]]},"50":{"position":[[103,13]]},"90":{"position":[[58,12],[305,12]]},"93":{"position":[[291,14],[399,13],[650,13],[833,13]]},"96":{"position":[[394,14]]},"100":{"position":[[433,14]]},"250":{"position":[[1032,14]]},"261":{"position":[[216,14]]},"291":{"position":[[59,12],[385,12]]},"325":{"position":[[281,12],[857,13]]},"336":{"position":[[524,12]]},"343":{"position":[[518,13],[939,13]]},"346":{"position":[[484,12]]}},"keywords":{}}],["intlprovider.getchildcontext",{"_index":2405,"title":{},"content":{"340":{"position":[[15,28]]}},"keywords":{}}],["intlshap",{"_index":1038,"title":{"223":{"position":[[0,10]]},"348":{"position":[[0,10]]}},"content":{"84":{"position":[[252,9],[335,11],[436,9],[651,11],[769,9]]},"220":{"position":[[56,11]]},"221":{"position":[[30,9]]},"223":{"position":[[1796,9]]},"330":{"position":[[148,9],[303,11],[351,11]]},"336":{"position":[[70,9]]},"343":{"position":[[52,11]]},"345":{"position":[[97,9],[1110,10]]},"346":{"position":[[30,9]]},"348":{"position":[[1746,9]]}},"keywords":{}}],["intl|intl",{"_index":1834,"title":{},"content":{"252":{"position":[[378,9]]}},"keywords":{}}],["introduc",{"_index":1933,"title":{},"content":{"263":{"position":[[210,10]]},"331":{"position":[[9,10]]}},"keywords":{}}],["introduct",{"_index":2302,"title":{},"content":{"328":{"position":[[771,12]]},"344":{"position":[[793,12]]}},"keywords":{}}],["invalid",{"_index":823,"title":{"457":{"position":[[3,7]]}},"content":{"50":{"position":[[581,13]]},"339":{"position":[[80,7]]},"457":{"position":[[64,8],[183,7]]}},"keywords":{}}],["invalid_config",{"_index":876,"title":{"61":{"position":[[0,15]]}},"content":{},"keywords":{}}],["io",{"_index":921,"title":{"69":{"position":[[16,4]]}},"content":{"69":{"position":[[51,5]]},"245":{"position":[[283,4],[339,5]]}},"keywords":{}}],["isfinite(new",{"_index":1646,"title":{},"content":{"229":{"position":[[224,12]]},"230":{"position":[[339,12]]},"355":{"position":[[233,12]]},"356":{"position":[[348,12]]},"357":{"position":[[456,12]]}},"keywords":{}}],["isn''t",{"_index":638,"title":{},"content":{"39":{"position":[[718,10]]}},"keywords":{}}],["isn't",{"_index":2046,"title":{},"content":{"278":{"position":[[73,5],[466,5]]}},"keywords":{}}],["iso",{"_index":1700,"title":{},"content":{"235":{"position":[[543,3],[678,3],[802,3]]},"362":{"position":[[544,3],[679,3],[803,3]]}},"keywords":{}}],["issu",{"_index":862,"title":{},"content":{"58":{"position":[[66,5],[130,7]]},"59":{"position":[[1,5]]},"68":{"position":[[144,6]]},"228":{"position":[[348,5]]},"245":{"position":[[144,6]]},"278":{"position":[[112,5]]},"280":{"position":[[133,6]]},"332":{"position":[[842,7]]},"338":{"position":[[115,6]]},"414":{"position":[[362,5],[419,6]]},"448":{"position":[[92,5]]}},"keywords":{}}],["istax",{"_index":538,"title":{},"content":{"35":{"position":[[1247,9]]}},"keywords":{}}],["it'",{"_index":590,"title":{},"content":{"37":{"position":[[1921,4]]},"63":{"position":[[100,4]]},"71":{"position":[[874,4]]},"73":{"position":[[641,4]]},"82":{"position":[[753,4]]},"126":{"position":[[71,4]]},"136":{"position":[[1046,4]]},"223":{"position":[[1906,4]]},"225":{"position":[[247,4]]},"238":{"position":[[396,4]]},"263":{"position":[[509,4]]},"264":{"position":[[1001,4]]},"268":{"position":[[134,4]]},"272":{"position":[[75,4]]},"285":{"position":[[247,4]]},"306":{"position":[[441,4]]},"320":{"position":[[250,4]]},"331":{"position":[[275,4]]},"348":{"position":[[2039,4]]},"350":{"position":[[247,4]]},"365":{"position":[[396,4]]},"377":{"position":[[249,4]]},"426":{"position":[[250,4]]},"457":{"position":[[80,4]]}},"keywords":{}}],["it'll",{"_index":583,"title":{},"content":{"36":{"position":[[2395,5]]},"297":{"position":[[1512,5]]}},"keywords":{}}],["it('rend",{"_index":1092,"title":{},"content":{"89":{"position":[[788,13]]}},"keywords":{}}],["item",{"_index":548,"title":{},"content":{"36":{"position":[[472,6],[616,5],[863,6],[1017,6],[1064,6],[1085,6],[1249,6],[2055,5],[2094,6],[2174,7],[2216,6],[2259,7],[2528,7],[2552,6],[2577,7]]},"37":{"position":[[487,6],[620,5],[860,6],[1005,6],[1052,6],[1073,6],[1237,6]]},"133":{"position":[[409,4]]},"237":{"position":[[356,6],[370,5],[385,6]]},"305":{"position":[[356,6],[370,5],[385,6]]},"364":{"position":[[356,6],[370,5],[385,6]]}},"keywords":{}}],["itemcount",{"_index":579,"title":{},"content":{"36":{"position":[[2004,11],[2035,11],[2074,11],[2138,11],[2196,11],[2239,11],[2492,11]]},"237":{"position":[[329,11]]},"305":{"position":[[329,11]]},"364":{"position":[[329,11]]}},"keywords":{}}],["iter",{"_index":2020,"title":{},"content":{"273":{"position":[[337,9]]}},"keywords":{}}],["itself",{"_index":522,"title":{},"content":{"35":{"position":[[676,6]]},"369":{"position":[[55,7]]}},"keywords":{}}],["ja.json",{"_index":1012,"title":{},"content":{"82":{"position":[[434,7]]},"83":{"position":[[332,7],[404,7],[460,7]]}},"keywords":{}}],["japanes",{"_index":88,"title":{},"content":{"3":{"position":[[96,9]]},"36":{"position":[[728,9]]},"37":{"position":[[732,9]]}},"keywords":{}}],["java",{"_index":112,"title":{},"content":{"3":{"position":[[576,5]]}},"keywords":{}}],["javascript",{"_index":36,"title":{},"content":{"1":{"position":[[469,10]]},"75":{"position":[[37,10]]},"86":{"position":[[43,11]]},"87":{"position":[[64,10]]},"123":{"position":[[70,10]]},"241":{"position":[[474,10]]},"259":{"position":[[154,10]]},"306":{"position":[[753,10]]},"317":{"position":[[167,10]]},"368":{"position":[[470,10]]},"423":{"position":[[167,10]]}},"keywords":{}}],["javascript]mi",{"_index":2505,"title":{},"content":{"392":{"position":[[230,14]]}},"keywords":{}}],["jest",{"_index":347,"title":{"24":{"position":[[3,4]]},"95":{"position":[[0,5]]},"251":{"position":[[0,5]]},"334":{"position":[[0,5]]},"419":{"position":[[7,4]]}},"content":{"21":{"position":[[43,5]]},"24":{"position":[[63,4]]},"95":{"position":[[14,4]]},"96":{"position":[[38,4],[1080,4],[1103,4],[1123,4]]},"97":{"position":[[17,4],[93,4]]},"419":{"position":[[109,6],[184,4]]}},"keywords":{}}],["jest.config.j",{"_index":373,"title":{"24":{"position":[[11,15]]},"419":{"position":[[15,15]]}},"content":{"419":{"position":[[51,14]]}},"keywords":{}}],["jest@26.4.0",{"_index":2572,"title":{},"content":{"419":{"position":[[26,11]]}},"keywords":{}}],["job",{"_index":1908,"title":{},"content":{"260":{"position":[[233,4]]}},"keywords":{}}],["john",{"_index":280,"title":{},"content":{"17":{"position":[[255,8],[278,4],[333,7],[364,4]]}},"keywords":{}}],["join",{"_index":1690,"title":{},"content":{"234":{"position":[[401,4]]},"361":{"position":[[401,4]]}},"keywords":{}}],["js",{"_index":925,"title":{},"content":{"71":{"position":[[364,3],[640,2]]},"73":{"position":[[402,2]]},"119":{"position":[[7,2]]},"319":{"position":[[42,2]]},"424":{"position":[[42,2]]},"453":{"position":[[170,2]]}},"keywords":{}}],["js/t",{"_index":2584,"title":{},"content":{"436":{"position":[[88,5]]}},"keywords":{}}],["js/ts.@formatjs/cli",{"_index":2565,"title":{},"content":{"412":{"position":[[94,20]]}},"keywords":{}}],["jsc",{"_index":919,"title":{},"content":{"68":{"position":[[106,3]]},"69":{"position":[[39,3]]},"245":{"position":[[106,3],[327,3]]}},"keywords":{}}],["json",{"_index":180,"title":{},"content":{"8":{"position":[[123,4]]},"11":{"position":[[151,4],[247,4]]},"29":{"position":[[190,4]]},"30":{"position":[[386,4]]},"31":{"position":[[218,4],[309,4],[735,4],[1000,4],[1161,4],[1290,4]]},"32":{"position":[[479,4]]},"33":{"position":[[437,4]]},"35":{"position":[[1182,4],[1367,4]]},"36":{"position":[[2113,4],[2279,4],[2597,4]]},"37":{"position":[[2021,4]]},"38":{"position":[[396,4]]},"39":{"position":[[223,4],[306,4],[358,4],[432,4],[748,4]]},"44":{"position":[[992,4],[1039,4],[1103,4],[1158,4],[1185,4],[1211,4],[1249,4]]},"46":{"position":[[807,4]]},"47":{"position":[[36,4]]},"82":{"position":[[639,4]]},"373":{"position":[[53,4]]},"374":{"position":[[65,5]]},"388":{"position":[[74,4]]},"396":{"position":[[112,4]]},"400":{"position":[[126,4],[173,4],[237,4],[284,4],[332,4],[370,4]]}},"keywords":{}}],["json.stringifi",{"_index":943,"title":{},"content":{"77":{"position":[[25,16]]}},"keywords":{}}],["jsx",{"_index":1077,"title":{"451":{"position":[[21,4]]}},"content":{"89":{"position":[[62,3],[554,4]]},"273":{"position":[[163,4]]},"372":{"position":[[216,4]]},"451":{"position":[[39,4],[81,3],[1108,3],[1145,3],[1324,5]]},"461":{"position":[[296,3]]}},"keywords":{}}],["k",{"_index":504,"title":{},"content":{"34":{"position":[[506,1],[520,1]]},"78":{"position":[[451,1],[465,1]]},"138":{"position":[[782,1],[796,1]]},"345":{"position":[[76,2]]},"405":{"position":[[346,1]]}},"keywords":{}}],["keep",{"_index":2260,"title":{},"content":{"325":{"position":[[325,4]]},"328":{"position":[[530,4]]},"344":{"position":[[552,4]]},"393":{"position":[[419,4]]},"394":{"position":[[758,4]]}},"keywords":{}}],["key",{"_index":397,"title":{"386":{"position":[[10,5]]}},"content":{"29":{"position":[[15,5],[72,3]]},"30":{"position":[[61,5],[138,3]]},"35":{"position":[[5,5],[182,3],[317,3],[617,3]]},"36":{"position":[[5,5],[2428,5]]},"37":{"position":[[5,5],[1893,5]]},"44":{"position":[[1148,3]]},"264":{"position":[[605,4],[698,3]]},"278":{"position":[[154,5]]},"289":{"position":[[131,3]]},"353":{"position":[[131,3]]},"384":{"position":[[39,4]]},"386":{"position":[[30,4]]},"399":{"position":[[93,4]]},"400":{"position":[[274,3]]},"405":{"position":[[123,3]]}},"keywords":{}}],["keyof",{"_index":1860,"title":{},"content":{"253":{"position":[[424,5]]},"283":{"position":[[1013,5]]},"345":{"position":[[150,5]]},"348":{"position":[[118,5]]}},"keywords":{}}],["kilobit",{"_index":1510,"title":{},"content":{"186":{"position":[[268,9]]}},"keywords":{}}],["kilobyt",{"_index":1511,"title":{},"content":{"186":{"position":[[280,10]]},"232":{"position":[[639,11]]},"359":{"position":[[635,11]]}},"keywords":{}}],["kilogram",{"_index":1512,"title":{},"content":{"186":{"position":[[293,10]]}},"keywords":{}}],["kilomet",{"_index":1513,"title":{},"content":{"186":{"position":[[306,11]]},"187":{"position":[[79,9]]}},"keywords":{}}],["kind",{"_index":2269,"title":{},"content":{"326":{"position":[[56,5]]}},"keywords":{}}],["kingdom",{"_index":76,"title":{},"content":{"2":{"position":[[644,9]]}},"keywords":{}}],["know",{"_index":2315,"title":{},"content":{"330":{"position":[[470,4]]}},"keywords":{}}],["l",{"_index":490,"title":{},"content":{"34":{"position":[[306,1]]},"78":{"position":[[251,1]]},"138":{"position":[[582,1]]}},"keywords":{}}],["l'utilisateur",{"_index":770,"title":{},"content":{"46":{"position":[[361,13]]}},"keywords":{}}],["label",{"_index":1299,"title":{},"content":{"125":{"position":[[76,7]]},"342":{"position":[[188,5]]},"451":{"position":[[203,6],[985,7],[1754,5]]},"452":{"position":[[190,7],[289,6],[342,6],[459,6],[547,6],[665,6],[793,6],[1333,9],[1352,10]]}},"keywords":{}}],["label"",{"_index":2646,"title":{},"content":{"451":{"position":[[836,11]]},"452":{"position":[[217,13]]}},"keywords":{}}],["label,descript",{"_index":2653,"title":{},"content":{"451":{"position":[[1809,22]]}},"keywords":{}}],["label,description,details,errormessag",{"_index":2656,"title":{},"content":{"451":{"position":[[1968,43]]}},"keywords":{}}],["label="untransl",{"_index":2645,"title":{},"content":{"451":{"position":[[811,24]]}},"keywords":{}}],["label={`untransl",{"_index":2648,"title":{},"content":{"451":{"position":[[964,20]]}},"keywords":{}}],["label={intl.formatmessage({defaultmessag",{"_index":2635,"title":{},"content":{"451":{"position":[[442,42]]}},"keywords":{}}],["lang",{"_index":159,"title":{},"content":{"7":{"position":[[66,4],[385,4]]},"10":{"position":[[105,4],[183,4]]},"83":{"position":[[299,4],[371,4],[427,4]]}},"keywords":{}}],["lang.json",{"_index":2455,"title":{},"content":{"372":{"position":[[298,9]]}},"keywords":{}}],["lang/en.json",{"_index":651,"title":{},"content":{"42":{"position":[[236,12],[1675,13]]},"44":{"position":[[515,12]]},"48":{"position":[[477,14]]},"83":{"position":[[210,12]]},"393":{"position":[[1149,12]]},"394":{"position":[[488,12],[572,13]]}},"keywords":{}}],["lang/fr.json",{"_index":765,"title":{},"content":{"46":{"position":[[120,13],[1009,12],[1048,12]]},"47":{"position":[[413,12],[452,12]]},"48":{"position":[[429,14]]}},"keywords":{}}],["lang/{locale}.json",{"_index":1023,"title":{},"content":{"83":{"position":[[86,19]]}},"keywords":{}}],["languag",{"_index":6,"title":{"2":{"position":[[9,8]]}},"content":{"1":{"position":[[41,9],[267,8],[324,8]]},"2":{"position":[[272,9],[463,8],[475,8]]},"3":{"position":[[68,8]]},"35":{"position":[[166,11],[540,11],[915,11]]},"36":{"position":[[330,9],[400,9],[544,9],[627,10],[697,10],[795,9],[933,9],[1033,9],[1102,9],[1173,9],[1441,9]]},"37":{"position":[[345,9],[415,9],[559,9],[631,10],[701,10],[799,9],[930,9],[1021,9],[1090,9],[1161,9],[1429,9]]},"99":{"position":[[212,10]]},"126":{"position":[[139,9],[270,9]]},"133":{"position":[[258,8]]},"233":{"position":[[776,8],[865,9],[905,9]]},"235":{"position":[[215,10],[505,12]]},"313":{"position":[[123,8]]},"360":{"position":[[776,8],[865,9],[905,9]]},"362":{"position":[[215,10],[506,12]]},"372":{"position":[[163,8]]},"393":{"position":[[247,8]]},"417":{"position":[[55,8]]},"449":{"position":[[220,10]]},"454":{"position":[[111,9]]}},"keywords":{}}],["larg",{"_index":1031,"title":{},"content":{"83":{"position":[[635,5]]}},"keywords":{}}],["larger",{"_index":565,"title":{},"content":{"36":{"position":[[1232,6]]},"37":{"position":[[1220,6]]},"50":{"position":[[628,6]]},"297":{"position":[[1814,6]]}},"keywords":{}}],["last",{"_index":2523,"title":{},"content":{"394":{"position":[[655,4]]}},"keywords":{}}],["later",{"_index":275,"title":{"17":{"position":[[38,5]]}},"content":{"331":{"position":[[1566,6],[1593,6],[1618,6],[1648,6]]},"419":{"position":[[41,5]]}},"keywords":{}}],["latest",{"_index":2291,"title":{},"content":{"328":{"position":[[35,6]]}},"keywords":{}}],["latvian.)on",{"_index":549,"title":{},"content":{"36":{"position":[[504,13]]},"37":{"position":[[519,13]]}},"keywords":{}}],["layer",{"_index":983,"title":{},"content":{"81":{"position":[[141,7]]},"252":{"position":[[838,6]]}},"keywords":{}}],["ldml",{"_index":49,"title":{},"content":{"2":{"position":[[149,5]]},"447":{"position":[[229,4]]}},"keywords":{}}],["le",{"_index":316,"title":{},"content":{"20":{"position":[[362,2],[866,2]]},"46":{"position":[[654,2]]}},"keywords":{}}],["leak",{"_index":1569,"title":{},"content":{"221":{"position":[[226,4]]},"291":{"position":[[268,4]]},"336":{"position":[[364,4]]},"346":{"position":[[324,4]]}},"keywords":{}}],["learn",{"_index":2401,"title":{},"content":{"338":{"position":[[545,5]]}},"keywords":{}}],["length",{"_index":954,"title":{},"content":{"79":{"position":[[17,6],[45,6],[72,6],[98,6]]}},"keywords":{}}],["less",{"_index":277,"title":{"17":{"position":[[56,5]]}},"content":{"51":{"position":[[238,6]]},"83":{"position":[[565,4]]},"320":{"position":[[255,4]]},"377":{"position":[[254,4]]},"426":{"position":[[255,4]]},"461":{"position":[[304,4]]}},"keywords":{}}],["let'",{"_index":762,"title":{},"content":{"46":{"position":[[1,5]]},"71":{"position":[[44,5]]},"72":{"position":[[174,5]]}},"keywords":{}}],["letter",{"_index":1703,"title":{},"content":{"235":{"position":[[558,7],[815,7]]},"362":{"position":[[559,7],[816,7]]}},"keywords":{}}],["level",{"_index":978,"title":{"81":{"position":[[5,5]]}},"content":{"81":{"position":[[98,5],[247,5]]},"82":{"position":[[856,5]]},"84":{"position":[[187,5]]},"233":{"position":[[488,5]]},"330":{"position":[[223,5],[441,5]]},"360":{"position":[[488,5]]},"456":{"position":[[134,5]]}},"keywords":{}}],["leverag",{"_index":1640,"title":{},"content":{"228":{"position":[[279,9]]}},"keywords":{}}],["lib",{"_index":1026,"title":{},"content":{"83":{"position":[[285,3]]},"252":{"position":[[1234,3]]},"310":{"position":[[811,4]]},"332":{"position":[[1254,5]]},"402":{"position":[[23,3],[91,3]]},"403":{"position":[[38,4]]},"404":{"position":[[38,4]]},"405":{"position":[[62,4]]}},"keywords":{}}],["librari",{"_index":102,"title":{"80":{"position":[[27,9]]},"100":{"position":[[14,8]]}},"content":{"3":{"position":[[417,10]]},"4":{"position":[[162,7]]},"38":{"position":[[556,8]]},"55":{"position":[[126,10]]},"65":{"position":[[160,7]]},"83":{"position":[[246,10]]},"84":{"position":[[224,9]]},"92":{"position":[[265,7]]},"100":{"position":[[46,7]]},"101":{"position":[[607,7]]},"120":{"position":[[6,7]]},"155":{"position":[[6,7]]},"163":{"position":[[6,7]]},"176":{"position":[[6,7]]},"187":{"position":[[104,7]]},"202":{"position":[[6,7]]},"217":{"position":[[6,7]]},"250":{"position":[[2098,9],[2294,10]]},"251":{"position":[[53,10]]},"252":{"position":[[87,9],[322,9]]},"259":{"position":[[864,7]]},"333":{"position":[[31,9],[249,10]]},"334":{"position":[[53,10]]},"335":{"position":[[41,9]]}},"keywords":{}}],["library"",{"_index":1000,"title":{},"content":{"82":{"position":[[119,14]]}},"keywords":{}}],["library/jest",{"_index":1203,"title":{},"content":{"100":{"position":[[848,12]]}},"keywords":{}}],["library/react",{"_index":1193,"title":{},"content":{"100":{"position":[[411,14],[745,14]]}},"keywords":{}}],["library1",{"_index":1027,"title":{},"content":{"83":{"position":[[359,8]]}},"keywords":{}}],["library2",{"_index":1028,"title":{},"content":{"83":{"position":[[415,8]]}},"keywords":{}}],["lifecycl",{"_index":1559,"title":{},"content":{"220":{"position":[[175,9]]},"326":{"position":[[124,9]]},"336":{"position":[[161,9]]},"343":{"position":[[171,9]]},"346":{"position":[[121,9]]}},"keywords":{}}],["lime",{"_index":2675,"title":{},"content":{"452":{"position":[[851,8]]}},"keywords":{}}],["limit",{"_index":1655,"title":{},"content":{"231":{"position":[[65,7]]},"234":{"position":[[57,7]]},"235":{"position":[[59,7]]},"296":{"position":[[99,7]]},"297":{"position":[[65,7],[1584,10]]},"301":{"position":[[57,7]]},"302":{"position":[[57,7]]},"303":{"position":[[59,7]]},"357":{"position":[[83,7]]},"358":{"position":[[65,7]]},"361":{"position":[[57,7]]},"362":{"position":[[59,7]]},"459":{"position":[[368,5],[568,6]]}},"keywords":{}}],["line",{"_index":1060,"title":{},"content":{"87":{"position":[[183,5]]},"453":{"position":[[484,4]]}},"keywords":{}}],["linebreak",{"_index":2680,"title":{},"content":{"453":{"position":[[156,10]]}},"keywords":{}}],["lingohub",{"_index":751,"title":{},"content":{"44":{"position":[[1005,8]]},"400":{"position":[[139,8]]}},"keywords":{}}],["lingual",{"_index":42,"title":{},"content":{"2":{"position":[[36,7]]}},"keywords":{}}],["link",{"_index":1752,"title":{},"content":{"246":{"position":[[139,6]]},"332":{"position":[[152,4],[187,5],[949,4]]}},"keywords":{}}],["linter",{"_index":295,"title":{"57":{"position":[[0,6]]}},"content":{"17":{"position":[[793,6]]},"273":{"position":[[711,6]]},"451":{"position":[[1006,6]]},"452":{"position":[[951,6]]},"456":{"position":[[127,6]]}},"keywords":{}}],["list",{"_index":85,"title":{},"content":{"2":{"position":[[840,4]]},"35":{"position":[[399,4]]},"58":{"position":[[152,4]]},"86":{"position":[[107,6]]},"101":{"position":[[243,4]]},"107":{"position":[[247,4]]},"115":{"position":[[303,4]]},"173":{"position":[[243,4]]},"182":{"position":[[299,4]]},"186":{"position":[[31,4]]},"192":{"position":[[245,4]]},"214":{"position":[[259,4]]},"220":{"position":[[246,4]]},"234":{"position":[[406,4]]},"254":{"position":[[66,4]]},"293":{"position":[[333,6]]},"295":{"position":[[333,6]]},"299":{"position":[[335,6]]},"343":{"position":[[242,4]]},"361":{"position":[[406,4]]},"371":{"position":[[285,4]]},"379":{"position":[[1,4]]},"385":{"position":[[105,4]]},"411":{"position":[[352,4]]},"446":{"position":[[1329,4]]}},"keywords":{}}],["list(prop",{"_index":674,"title":{},"content":{"42":{"position":[[1140,11]]}},"keywords":{}}],["listformat",{"_index":1478,"title":{},"content":{"170":{"position":[[32,10]]}},"keywords":{}}],["listformat/local",{"_index":1482,"title":{},"content":{"174":{"position":[[68,17]]},"175":{"position":[[359,17]]}},"keywords":{}}],["listformat/polyfil",{"_index":1481,"title":{},"content":{"174":{"position":[[24,20]]},"175":{"position":[[302,19]]}},"keywords":{}}],["listformat/should",{"_index":1483,"title":{},"content":{"175":{"position":[[46,17]]}},"keywords":{}}],["listformatopt",{"_index":1685,"title":{},"content":{"234":{"position":[[141,17]]},"301":{"position":[[257,17]]},"302":{"position":[[264,17]]},"361":{"position":[[141,17]]}},"keywords":{}}],["liter",{"_index":247,"title":{"451":{"position":[[3,7]]},"452":{"position":[[3,7]]}},"content":{"14":{"position":[[130,7],[205,7],[266,8]]},"15":{"position":[[135,7],[218,7],[285,8]]},"17":{"position":[[134,7],[209,7]]},"28":{"position":[[45,7]]},"35":{"position":[[567,7],[709,7]]},"36":{"position":[[258,7]]},"37":{"position":[[273,7]]},"133":{"position":[[822,7]]},"136":{"position":[[891,7]]},"186":{"position":[[320,7]]},"239":{"position":[[454,7]]},"307":{"position":[[450,7]]},"366":{"position":[[454,7]]},"443":{"position":[[175,7],[224,7],[234,10]]},"444":{"position":[[450,11],[480,7],[529,7],[654,7]]},"445":{"position":[[570,11],[600,7],[652,7],[780,7]]},"446":{"position":[[153,7]]},"451":{"position":[[1026,8],[1306,7]]},"452":{"position":[[102,7],[639,7],[971,8],[1217,7],[1307,7]]}},"keywords":{}}],["live",{"_index":165,"title":{},"content":{"7":{"position":[[167,4]]},"10":{"position":[[260,5]]},"77":{"position":[[1,4]]},"125":{"position":[[188,4],[371,4]]},"135":{"position":[[166,4]]},"136":{"position":[[145,4],[379,4],[1066,4],[1335,4],[1416,4],[1512,4]]},"138":{"position":[[134,4],[852,4]]},"229":{"position":[[312,4]]},"230":{"position":[[427,4]]},"231":{"position":[[668,4],[717,4]]},"232":{"position":[[320,4],[580,4],[687,4]]},"233":{"position":[[598,4],[641,4],[704,4]]},"234":{"position":[[488,4],[572,4]]},"235":{"position":[[449,4],[528,4],[663,4],[787,4]]},"240":{"position":[[833,4],[1113,4],[1418,4]]},"292":{"position":[[518,4],[619,4]]},"293":{"position":[[493,4]]},"294":{"position":[[576,4]]},"295":{"position":[[493,4]]},"296":{"position":[[711,4]]},"297":{"position":[[808,4],[1280,4]]},"298":{"position":[[495,4],[592,4],[890,4],[1031,4]]},"299":{"position":[[500,4]]},"300":{"position":[[671,4]]},"301":{"position":[[399,4],[504,4]]},"302":{"position":[[409,4]]},"303":{"position":[[416,4],[524,4]]},"308":{"position":[[289,4],[531,4]]},"309":{"position":[[165,4],[616,4]]},"310":{"position":[[173,4]]},"355":{"position":[[321,4]]},"356":{"position":[[436,4]]},"357":{"position":[[595,4]]},"358":{"position":[[668,4],[717,4]]},"359":{"position":[[320,4],[576,4],[683,4]]},"360":{"position":[[598,4],[641,4],[704,4]]},"361":{"position":[[488,4],[572,4]]},"362":{"position":[[450,4],[529,4],[664,4],[788,4]]},"367":{"position":[[833,4],[1113,4],[1418,4]]}},"keywords":{}}],["load",{"_index":1058,"title":{"130":{"position":[[0,7]]},"131":{"position":[[0,7]]}},"content":{"87":{"position":[[93,4],[295,4]]},"109":{"position":[[233,4],[262,7]]},"117":{"position":[[235,4],[264,7],[363,7]]},"119":{"position":[[470,7]]},"148":{"position":[[235,4],[264,7]]},"175":{"position":[[231,4],[260,7]]},"184":{"position":[[233,4],[262,7]]},"195":{"position":[[232,4],[261,7]]},"216":{"position":[[239,4],[268,7]]},"247":{"position":[[348,7]]},"249":{"position":[[41,6]]},"259":{"position":[[101,7],[637,4],[921,6],[1037,4]]}},"keywords":{}}],["loader",{"_index":346,"title":{"23":{"position":[[3,7]]},"73":{"position":[[3,7]]},"418":{"position":[[7,7]]}},"content":{"21":{"position":[[32,7]]},"23":{"position":[[179,7],[191,8]]},"72":{"position":[[154,6]]},"73":{"position":[[44,7],[178,7],[190,8]]},"252":{"position":[[23,7],[37,7]]},"335":{"position":[[23,7]]},"418":{"position":[[135,7],[147,8]]}},"keywords":{}}],["loadlocaledata(local",{"_index":789,"title":{},"content":{"48":{"position":[[343,22],[748,22]]}},"keywords":{}}],["local",{"_index":21,"title":{"2":{"position":[[0,8]]},"7":{"position":[[35,5]]},"134":{"position":[[0,6]]},"224":{"position":[[0,7]]},"253":{"position":[[23,7]]},"258":{"position":[[11,6]]},"284":{"position":[[0,7]]},"349":{"position":[[0,7]]},"385":{"position":[[9,6]]},"392":{"position":[[9,6]]}},"content":{"1":{"position":[[227,9],[417,9],[446,8]]},"2":{"position":[[441,9],[521,6],[848,8]]},"3":{"position":[[132,8],[358,6]]},"4":{"position":[[57,7],[127,7],[239,7]]},"5":{"position":[[122,7]]},"10":{"position":[[373,6]]},"11":{"position":[[425,7]]},"31":{"position":[[71,7]]},"32":{"position":[[69,7]]},"33":{"position":[[69,7]]},"34":{"position":[[365,5],[421,5]]},"36":{"position":[[101,7],[1643,7],[1789,8],[1803,7]]},"37":{"position":[[138,7],[1631,7]]},"44":{"position":[[1051,10]]},"48":{"position":[[104,6],[383,8]]},"61":{"position":[[59,7]]},"62":{"position":[[50,8],[70,6]]},"75":{"position":[[234,9]]},"78":{"position":[[310,5],[366,5]]},"84":{"position":[[89,6]]},"93":{"position":[[222,6],[529,6],[690,7],[873,7]]},"96":{"position":[[478,8]]},"99":{"position":[[149,6]]},"100":{"position":[[486,7]]},"107":{"position":[[149,6],[178,6],[343,6]]},"108":{"position":[[102,6]]},"109":{"position":[[175,6]]},"115":{"position":[[151,6],[180,6],[255,6],[401,6]]},"116":{"position":[[106,6]]},"117":{"position":[[177,6]]},"119":{"position":[[92,5]]},"123":{"position":[[108,9]]},"124":{"position":[[137,8]]},"125":{"position":[[173,7]]},"127":{"position":[[54,6]]},"133":{"position":[[206,8],[325,7],[345,6],[383,7],[431,7],[485,6],[515,6]]},"134":{"position":[[82,6],[114,7]]},"135":{"position":[[129,6],[273,6]]},"138":{"position":[[641,5],[697,5]]},"141":{"position":[[447,8],[535,8]]},"148":{"position":[[177,6]]},"157":{"position":[[32,6]]},"173":{"position":[[147,6],[176,6],[337,6]]},"174":{"position":[[98,6]]},"175":{"position":[[173,6]]},"182":{"position":[[149,6],[178,6],[251,6],[395,6],[684,6]]},"183":{"position":[[102,6]]},"184":{"position":[[175,6]]},"187":{"position":[[137,9]]},"192":{"position":[[148,6],[177,6],[340,6]]},"193":{"position":[[100,6]]},"195":{"position":[[174,6]]},"214":{"position":[[155,6],[184,6],[361,6]]},"215":{"position":[[114,6]]},"216":{"position":[[181,6]]},"220":{"position":[[229,6],[309,7]]},"221":{"position":[[290,7]]},"222":{"position":[[53,8]]},"223":{"position":[[24,7]]},"224":{"position":[[20,6]]},"225":{"position":[[9,6],[120,6],[207,7]]},"228":{"position":[[116,7],[329,8]]},"234":{"position":[[473,6]]},"235":{"position":[[581,9],[704,9],[838,9]]},"243":{"position":[[1062,6],[1190,6]]},"247":{"position":[[234,6],[333,6]]},"249":{"position":[[29,6],[230,6],[697,6]]},"253":{"position":[[698,6],[771,7]]},"258":{"position":[[5,6],[122,6],[361,6]]},"259":{"position":[[75,6],[194,6],[881,6]]},"260":{"position":[[106,8]]},"261":{"position":[[396,6],[503,7]]},"283":{"position":[[131,6],[781,7]]},"284":{"position":[[20,6]]},"285":{"position":[[9,6],[120,6],[207,7]]},"291":{"position":[[331,7]]},"301":{"position":[[384,6]]},"302":{"position":[[394,6]]},"303":{"position":[[401,6]]},"329":{"position":[[865,6],[993,6],[1133,6]]},"336":{"position":[[427,7]]},"343":{"position":[[225,6],[305,7]]},"346":{"position":[[387,7]]},"347":{"position":[[53,8]]},"348":{"position":[[24,7]]},"349":{"position":[[20,6]]},"350":{"position":[[9,6],[120,6],[207,7]]},"361":{"position":[[473,6]]},"362":{"position":[[582,9],[705,9],[839,9]]},"384":{"position":[[112,7]]},"385":{"position":[[12,6]]},"386":{"position":[[45,6],[71,7]]},"387":{"position":[[80,7]]},"392":{"position":[[48,7],[82,8],[137,6]]},"400":{"position":[[185,10]]},"408":{"position":[[168,7]]},"410":{"position":[[215,7]]}},"keywords":{}}],["locale/polyfil",{"_index":1471,"title":{},"content":{"161":{"position":[[24,16]]},"162":{"position":[[197,17],[305,15]]}},"keywords":{}}],["locale/should",{"_index":1472,"title":{},"content":{"162":{"position":[[46,13]]}},"keywords":{}}],["locale="en">",{"_index":1910,"title":{},"content":{"261":{"position":[[283,25]]}},"keywords":{}}],["locale="fr"",{"_index":326,"title":{},"content":{"20":{"position":[[483,21]]}},"keywords":{}}],["locale={local",{"_index":801,"title":{},"content":{"48":{"position":[[795,15]]}},"keywords":{}}],["locale={locale}>{children}</intlprovider>",{"_index":1198,"title":{},"content":{"100":{"position":[[583,50]]}},"keywords":{}}],["locale={navigator.language}>",{"_index":1811,"title":{},"content":{"250":{"position":[[1564,31]]},"290":{"position":[[795,31]]}},"keywords":{}}],["locale={props.local",{"_index":792,"title":{},"content":{"48":{"position":[[544,21]]}},"keywords":{}}],["locale={userslocal",{"_index":1780,"title":{},"content":{"249":{"position":[[790,20]]}},"keywords":{}}],["localematch",{"_index":1474,"title":{},"content":{"165":{"position":[[32,13]]},"168":{"position":[[37,14]]}},"keywords":{}}],["localeoption",{"_index":147,"title":{},"content":{"5":{"position":[[288,17]]}},"keywords":{}}],["locales.prev",{"_index":2679,"title":{},"content":{"453":{"position":[[137,16]]}},"keywords":{}}],["localetransl",{"_index":146,"title":{},"content":{"5":{"position":[[254,16]]}},"keywords":{}}],["localize'",{"_index":752,"title":{},"content":{"44":{"position":[[1021,10]]},"400":{"position":[[155,10]]}},"keywords":{}}],["locat",{"_index":995,"title":{"376":{"position":[[17,9]]}},"content":{"81":{"position":[[558,9]]},"82":{"position":[[724,8],[906,9]]},"376":{"position":[[32,8]]},"394":{"position":[[291,7]]},"425":{"position":[[32,8]]}},"keywords":{}}],["lociz",{"_index":753,"title":{},"content":{"44":{"position":[[1069,6]]},"400":{"position":[[203,6]]}},"keywords":{}}],["log",{"_index":892,"title":{},"content":{"63":{"position":[[313,3]]},"226":{"position":[[83,6]]},"287":{"position":[[83,6]]},"288":{"position":[[87,6]]},"352":{"position":[[83,6]]}},"keywords":{}}],["logic",{"_index":2690,"title":{},"content":{"455":{"position":[[96,5]]}},"keywords":{}}],["lokalis",{"_index":754,"title":{},"content":{"44":{"position":[[1083,8],[1108,8]]},"400":{"position":[[217,8],[242,8]]}},"keywords":{}}],["long",{"_index":460,"title":{},"content":{"32":{"position":[[332,4]]},"33":{"position":[[369,4]]},"82":{"position":[[745,4]]},"231":{"position":[[306,6]]},"232":{"position":[[758,7]]},"234":{"position":[[217,6]]},"235":{"position":[[201,6]]},"262":{"position":[[817,7]]},"297":{"position":[[339,6]]},"358":{"position":[[306,6]]},"359":{"position":[[754,7]]},"361":{"position":[[217,6]]},"362":{"position":[[201,6]]},"453":{"position":[[466,4]]}},"keywords":{}}],["longer",{"_index":1935,"title":{"278":{"position":[[45,6]]},"279":{"position":[[35,6]]}},"content":{"264":{"position":[[18,6]]},"273":{"position":[[298,6]]},"276":{"position":[[46,6],[363,6]]},"297":{"position":[[1646,6]]},"325":{"position":[[827,6]]},"329":{"position":[[18,6],[401,6]]},"331":{"position":[[817,6]]},"339":{"position":[[29,6]]}},"keywords":{}}],["look",{"_index":177,"title":{},"content":{"8":{"position":[[14,5]]},"11":{"position":[[32,5]]},"24":{"position":[[52,4]]},"29":{"position":[[79,6]]},"35":{"position":[[189,6]]},"63":{"position":[[40,4]]},"65":{"position":[[143,4]]},"82":{"position":[[496,7]]},"100":{"position":[[307,4]]},"223":{"position":[[1895,4]]},"253":{"position":[[542,4]]},"265":{"position":[[182,7]]},"348":{"position":[[1979,4]]},"401":{"position":[[545,4]]},"432":{"position":[[54,4]]},"449":{"position":[[15,4]]},"457":{"position":[[111,4]]}},"keywords":{}}],["lookup",{"_index":1723,"title":{},"content":{"239":{"position":[[233,6]]},"307":{"position":[[233,6]]},"366":{"position":[[233,6]]}},"keywords":{}}],["lost",{"_index":2207,"title":{},"content":{"309":{"position":[[531,4]]},"332":{"position":[[878,4]]}},"keywords":{}}],["lot",{"_index":2419,"title":{},"content":{"342":{"position":[[530,3]]}},"keywords":{}}],["low",{"_index":1679,"title":{},"content":{"233":{"position":[[484,3]]},"360":{"position":[[484,3]]}},"keywords":{}}],["lower",{"_index":1356,"title":{},"content":{"135":{"position":[[292,5]]}},"keywords":{}}],["ls",{"_index":2501,"title":{},"content":{"392":{"position":[[154,2]]}},"keywords":{}}],["lt",{"_index":1240,"title":{},"content":{"107":{"position":[[279,5]]},"115":{"position":[[335,5]]},"152":{"position":[[120,5]]},"160":{"position":[[107,5]]},"173":{"position":[[275,5]]},"182":{"position":[[331,5],[620,5]]},"192":{"position":[[277,5]]},"207":{"position":[[110,5]]},"214":{"position":[[291,5]]},"262":{"position":[[586,4]]},"405":{"position":[[215,4]]}},"keywords":{}}],["lt;>",{"_index":2103,"title":{},"content":{"293":{"position":[[652,8]]},"295":{"position":[[579,8]]},"299":{"position":[[569,8]]},"302":{"position":[[522,8]]}},"keywords":{}}],["lt;'3",{"_index":1385,"title":{},"content":{"136":{"position":[[1377,7]]}},"keywords":{}}],["lt;/>",{"_index":2107,"title":{},"content":{"293":{"position":[[758,9]]},"295":{"position":[[685,9]]},"299":{"position":[[675,9]]},"302":{"position":[[689,9]]}},"keywords":{}}],["lt;/a>",{"_index":2219,"title":{},"content":{"309":{"position":[[937,10]]},"310":{"position":[[494,10]]},"332":{"position":[[320,10],[712,10]]}},"keywords":{}}],["lt;/button>",{"_index":689,"title":{},"content":{"42":{"position":[[1535,15]]},"451":{"position":[[322,15],[402,15]]}},"keywords":{}}],["lt;/div>",{"_index":1050,"title":{},"content":{"84":{"position":[[576,12]]},"100":{"position":[[1278,12]]},"250":{"position":[[1514,12],[1986,12]]},"290":{"position":[[746,12]]}},"keywords":{}}],["lt;/formatteddateparts>",{"_index":2108,"title":{},"content":{"293":{"position":[[771,27]]}},"keywords":{}}],["lt;/formattedlistparts>",{"_index":2184,"title":{},"content":{"302":{"position":[[702,27]]}},"keywords":{}}],["lt;/formattedmessage>",{"_index":2044,"title":{},"content":{"276":{"position":[[517,25],[675,25]]},"310":{"position":[[646,25]]}},"keywords":{}}],["lt;/formattednumberparts>",{"_index":2163,"title":{},"content":{"299":{"position":[[688,29]]}},"keywords":{}}],["lt;/formattedtimeparts>",{"_index":2115,"title":{},"content":{"295":{"position":[[698,27]]}},"keywords":{}}],["lt;/header>",{"_index":682,"title":{},"content":{"42":{"position":[[1340,15]]}},"keywords":{}}],["lt;/intlprovider>",{"_index":337,"title":{},"content":{"20":{"position":[[798,21]]},"48":{"position":[[644,21]]},"90":{"position":[[210,21],[886,21]]},"91":{"position":[[279,21]]},"249":{"position":[[867,22]]},"250":{"position":[[1702,22]]},"261":{"position":[[323,22]]},"290":{"position":[[881,22]]}},"keywords":{}}],["lt;/li>",{"_index":671,"title":{},"content":{"42":{"position":[[1048,11],[1551,11]]}},"keywords":{}}],["lt;/p>",{"_index":271,"title":{},"content":{"16":{"position":[[85,12]]},"20":{"position":[[787,10],[901,10]]},"250":{"position":[[1468,10]]},"411":{"position":[[162,12]]},"414":{"position":[[263,10],[602,10]]},"436":{"position":[[228,10]]},"461":{"position":[[161,10],[250,10]]}},"keywords":{}}],["lt;/pre>",{"_index":951,"title":{},"content":{"77":{"position":[[230,12]]}},"keywords":{}}],["lt;/rawintlprovider>",{"_index":1054,"title":{},"content":{"84":{"position":[[904,24]]}},"keywords":{}}],["lt;/section>",{"_index":692,"title":{},"content":{"42":{"position":[[1600,16]]}},"keywords":{}}],["lt;/span>",{"_index":1806,"title":{},"content":{"250":{"position":[[1327,13]]},"344":{"position":[[496,13]]},"345":{"position":[[1482,13]]}},"keywords":{}}],["lt;/template>",{"_index":272,"title":{},"content":{"16":{"position":[[98,17]]},"411":{"position":[[175,17]]},"414":{"position":[[274,17],[613,17]]},"436":{"position":[[239,17]]}},"keywords":{}}],["lt;/time>",{"_index":1929,"title":{},"content":{"262":{"position":[[1007,13]]}},"keywords":{}}],["lt;/ul>",{"_index":691,"title":{},"content":{"42":{"position":[[1588,11]]}},"keywords":{}}],["lt;a",{"_index":2033,"title":{},"content":{"274":{"position":[[195,5]]},"309":{"position":[[813,5]]},"310":{"position":[[370,5]]},"332":{"position":[[195,5],[599,5]]}},"keywords":{}}],["lt;a>",{"_index":1634,"title":{},"content":{"227":{"position":[[214,9]]},"278":{"position":[[394,9]]},"290":{"position":[[214,9]]},"354":{"position":[[214,9]]}},"keywords":{}}],["lt;a>'{placeholder}'</a>'").format",{"_index":1390,"title":{},"content":{"136":{"position":[[1587,51]]}},"keywords":{}}],["lt;a>link</a>",{"_index":2036,"title":{},"content":{"274":{"position":[[284,25]]},"278":{"position":[[283,23],[319,23]]}},"keywords":{}}],["lt;a>visit",{"_index":2212,"title":{},"content":{"309":{"position":[[704,14]]},"310":{"position":[[261,14]]},"332":{"position":[[493,14]]}},"keywords":{}}],["lt;a>{chunks}</a>",{"_index":2053,"title":{},"content":{"278":{"position":[[438,27]]}},"keywords":{}}],["lt;app",{"_index":1782,"title":{},"content":{"249":{"position":[[853,7]]},"250":{"position":[[1596,7]]},"261":{"position":[[309,7]]},"290":{"position":[[827,7]]}},"keywords":{}}],["lt;app>",{"_index":1909,"title":{},"content":{"261":{"position":[[77,12]]}},"keywords":{}}],["lt;b>",{"_index":1633,"title":{},"content":{"227":{"position":[[121,10]]},"290":{"position":[[121,10]]},"354":{"position":[[121,10]]}},"keywords":{}}],["lt;b>eric</b>",{"_index":1739,"title":{},"content":{"240":{"position":[[1353,25]]},"309":{"position":[[318,23]]},"367":{"position":[[1353,25]]}},"keywords":{}}],["lt;b>html</b>",{"_index":1389,"title":{},"content":{"136":{"position":[[1556,25]]}},"keywords":{}}],["lt;b>html</b>'").format",{"_index":1388,"title":{},"content":{"136":{"position":[[1460,41]]}},"keywords":{}}],["lt;b>john</b>",{"_index":2371,"title":{},"content":{"332":{"position":[[1585,24],[1836,23]]}},"keywords":{}}],["lt;b>myself</b>",{"_index":2176,"title":{},"content":{"301":{"position":[[577,26]]}},"keywords":{}}],["lt;b>strong</b>",{"_index":1371,"title":{},"content":{"136":{"position":[[588,25]]}},"keywords":{}}],["lt;b>world</b>",{"_index":1365,"title":{},"content":{"136":{"position":[[420,26]]}},"keywords":{}}],["lt;b>{chunks}</b>",{"_index":2043,"title":{},"content":{"276":{"position":[[488,28],[646,28]]},"309":{"position":[[381,28]]}},"keywords":{}}],["lt;b>{name}</b>",{"_index":2381,"title":{},"content":{"332":{"position":[[1978,26]]}},"keywords":{}}],["lt;b>{parts[0].value}</b>",{"_index":2104,"title":{},"content":{"293":{"position":[[661,35]]},"295":{"position":[[588,35]]},"299":{"position":[[578,35]]},"302":{"position":[[531,35]]}},"keywords":{}}],["lt;b>{str}</b>",{"_index":1742,"title":{},"content":{"240":{"position":[[1708,25]]},"367":{"position":[[1708,25]]}},"keywords":{}}],["lt;bold>{name}</bold>",{"_index":946,"title":{},"content":{"77":{"position":[[101,31]]},"240":{"position":[[1534,34]]},"367":{"position":[[1534,34]]}},"keywords":{}}],["lt;boldthis>{pric",{"_index":607,"title":{},"content":{"38":{"position":[[239,23]]}},"keywords":{}}],["lt;br",{"_index":332,"title":{},"content":{"20":{"position":[[685,6],[880,6]]}},"keywords":{}}],["lt;button>",{"_index":684,"title":{},"content":{"42":{"position":[[1378,14]]},"227":{"position":[[227,19]]},"290":{"position":[[227,19]]},"354":{"position":[[227,19]]},"451":{"position":[[246,14],[347,14]]}},"keywords":{}}],["lt;button>submit</button>",{"_index":2641,"title":{},"content":{"451":{"position":[[647,35]]}},"keywords":{}}],["lt;button>{'submit'}</button>",{"_index":2642,"title":{},"content":{"451":{"position":[[692,39]]}},"keywords":{}}],["lt;button>{`t",{"_index":2643,"title":{},"content":{"451":{"position":[[741,19]]}},"keywords":{}}],["lt;cta>buy",{"_index":2214,"title":{},"content":{"309":{"position":[[745,14]]},"310":{"position":[[302,14]]}},"keywords":{}}],["lt;cta>eat",{"_index":2358,"title":{},"content":{"332":{"position":[[534,14]]}},"keywords":{}}],["lt;custom>awesome</custom>",{"_index":2378,"title":{},"content":{"332":{"position":[[1863,36]]}},"keywords":{}}],["lt;div",{"_index":1210,"title":{},"content":{"100":{"position":[[1076,7]]}},"keywords":{}}],["lt;div>",{"_index":1046,"title":{},"content":{"84":{"position":[[492,11]]},"250":{"position":[[1376,11],[1818,11]]},"290":{"position":[[591,11]]}},"keywords":{}}],["lt;div>amaz",{"_index":1820,"title":{},"content":{"250":{"position":[[1946,18]]}},"keywords":{}}],["lt;div>hello",{"_index":2281,"title":{},"content":{"327":{"position":[[486,16],[1004,16]]}},"keywords":{}}],["lt;div>mardi",{"_index":2091,"title":{},"content":{"290":{"position":[[993,16]]}},"keywords":{}}],["lt;div>{post.body}</div>",{"_index":1810,"title":{},"content":{"250":{"position":[[1479,34]]}},"keywords":{}}],["lt;folder>",{"_index":2527,"title":{},"content":{"396":{"position":[[259,14]]}},"keywords":{}}],["lt;folder>/<locale>.json",{"_index":2529,"title":{},"content":{"396":{"position":[[336,34]]}},"keywords":{}}],["lt;foo>strong</foo>').format",{"_index":1381,"title":{},"content":{"136":{"position":[[1130,40]]}},"keywords":{}}],["lt;format",{"_index":1132,"title":{},"content":{"92":{"position":[[281,14]]}},"keywords":{}}],["lt;formatfile>",{"_index":727,"title":{},"content":{"44":{"position":[[163,18]]},"47":{"position":[[97,18]]}},"keywords":{}}],["lt;formatted*>",{"_index":1775,"title":{},"content":{"249":{"position":[[349,18]]},"250":{"position":[[187,18],[867,18]]},"282":{"position":[[103,18]]},"283":{"position":[[250,18]]},"286":{"position":[[66,18]]},"351":{"position":[[66,18]]}},"keywords":{}}],["lt;formattedd",{"_index":1081,"title":{},"content":{"89":{"position":[[202,17],[970,17]]},"100":{"position":[[1125,17]]},"290":{"position":[[603,17]]},"292":{"position":[[530,17],[631,17]]},"344":{"position":[[459,17]]},"345":{"position":[[1445,17]]}},"keywords":{}}],["lt;formatteddate>",{"_index":2097,"title":{},"content":{"292":{"position":[[289,21]]}},"keywords":{}}],["lt;formatteddatepart",{"_index":2102,"title":{},"content":{"293":{"position":[[505,22]]}},"keywords":{}}],["lt;formatteddatetimerang",{"_index":2121,"title":{},"content":{"296":{"position":[[723,26]]}},"keywords":{}}],["lt;formatteddatetimerange>",{"_index":2120,"title":{},"content":{"296":{"position":[[481,30]]}},"keywords":{}}],["lt;formatteddisplaynam",{"_index":2187,"title":{},"content":{"303":{"position":[[428,24],[536,24]]}},"keywords":{}}],["lt;formattedhtmlmessage>",{"_index":1964,"title":{},"content":{"267":{"position":[[217,28]]}},"keywords":{}}],["lt;formattedlist",{"_index":2173,"title":{},"content":{"301":{"position":[[411,17],[516,17]]}},"keywords":{}}],["lt;formattedlistpart",{"_index":2180,"title":{},"content":{"302":{"position":[[421,22]]}},"keywords":{}}],["lt;formattedmessag",{"_index":257,"title":{},"content":{"15":{"position":[[45,21]]},"17":{"position":[[283,20]]},"20":{"position":[[548,20]]},"42":{"position":[[1217,20],[1393,20]]},"71":{"position":[[121,20]]},"72":{"position":[[251,20]]},"254":{"position":[[391,21]]},"267":{"position":[[553,20],[652,20]]},"276":{"position":[[390,20],[553,20]]},"308":{"position":[[301,20],[543,20]]},"309":{"position":[[177,20],[628,20]]},"310":{"position":[[185,20]]},"322":{"position":[[222,21]]},"332":{"position":[[93,20],[436,20],[1484,20],[1787,20]]},"338":{"position":[[306,20],[410,20]]},"371":{"position":[[718,21]]},"381":{"position":[[222,21]]},"428":{"position":[[222,21]]},"435":{"position":[[451,21]]},"446":{"position":[[206,20],[464,20],[701,20],[939,20]]},"451":{"position":[[261,20]]},"461":{"position":[[190,20]]}},"keywords":{}}],["lt;formattedmessage>",{"_index":1854,"title":{},"content":{"253":{"position":[[41,24]]},"267":{"position":[[188,24],[450,24]]},"306":{"position":[[106,24]]},"308":{"position":[[12,24]]},"309":{"position":[[1,24]]},"313":{"position":[[214,25]]},"417":{"position":[[146,25]]},"435":{"position":[[72,24]]},"461":{"position":[[5,24]]}},"keywords":{}}],["lt;formattedmessage>.impl",{"_index":2063,"title":{},"content":{"282":{"position":[[316,34]]}},"keywords":{}}],["lt;formattednumb",{"_index":333,"title":{},"content":{"20":{"position":[[698,19]]},"298":{"position":[[507,19],[604,19],[902,19],[1043,19]]}},"keywords":{}}],["lt;formattednumber>",{"_index":2151,"title":{},"content":{"298":{"position":[[270,23]]}},"keywords":{}}],["lt;formattednumberpart",{"_index":2161,"title":{},"content":{"299":{"position":[[512,24]]}},"keywords":{}}],["lt;formattedplur",{"_index":2167,"title":{},"content":{"300":{"position":[[683,19]]}},"keywords":{}}],["lt;formattedplural>",{"_index":2166,"title":{},"content":{"300":{"position":[[368,23]]}},"keywords":{}}],["lt;formattedrel",{"_index":1928,"title":{},"content":{"262":{"position":[[966,21]]},"269":{"position":[[343,21],[408,21]]},"331":{"position":[[381,21],[578,21],[674,21],[871,21],[1059,21]]}},"keywords":{}}],["lt;formattedrelative>",{"_index":1979,"title":{},"content":{"269":{"position":[[33,25],[245,25],[627,25]]}},"keywords":{}}],["lt;formattedrelativetim",{"_index":1802,"title":{},"content":{"250":{"position":[[1237,25]]},"297":{"position":[[820,25],[1292,25]]},"331":{"position":[[450,25],[642,25],[739,25],[967,25],[1155,25],[1381,25],[2146,26]]}},"keywords":{}}],["lt;formattedrelativetime>",{"_index":2126,"title":{},"content":{"297":{"position":[[570,29]]}},"keywords":{}}],["lt;formattedrelativetime>'",{"_index":2064,"title":{},"content":{"282":{"position":[[374,31]]}},"keywords":{}}],["lt;formattedtim",{"_index":2111,"title":{},"content":{"294":{"position":[[588,17]]},"332":{"position":[[1714,17]]}},"keywords":{}}],["lt;formattedtime>",{"_index":2110,"title":{},"content":{"294":{"position":[[355,21]]}},"keywords":{}}],["lt;formattedtimepart",{"_index":2113,"title":{},"content":{"295":{"position":[[505,22]]}},"keywords":{}}],["lt;h1>hello",{"_index":1816,"title":{},"content":{"250":{"position":[[1830,16]]}},"keywords":{}}],["lt;h1>{post.title}</h1>",{"_index":1807,"title":{},"content":{"250":{"position":[[1388,33]]}},"keywords":{}}],["lt;h1>{txt}</h1>}</formattedmessage>",{"_index":2203,"title":{},"content":{"308":{"position":[[599,52]]}},"keywords":{}}],["lt;h2>{chunks}</h2>",{"_index":2223,"title":{},"content":{"310":{"position":[[615,30]]}},"keywords":{}}],["lt;header>",{"_index":676,"title":{},"content":{"42":{"position":[[1202,14]]}},"keywords":{}}],["lt;img",{"_index":2409,"title":{},"content":{"342":{"position":[[251,7]]},"451":{"position":[[521,7],[863,7]]}},"keywords":{}}],["lt;input",{"_index":665,"title":{},"content":{"42":{"position":[[787,9],[906,9]]},"451":{"position":[[427,9],[796,9],[949,9]]}},"keywords":{}}],["lt;intlprovid",{"_index":324,"title":{},"content":{"20":{"position":[[438,16]]},"48":{"position":[[527,16]]},"100":{"position":[[566,16]]},"249":{"position":[[773,16]]},"250":{"position":[[1547,16]]},"261":{"position":[[266,16]]},"290":{"position":[[778,16]]},"325":{"position":[[395,16]]}},"keywords":{}}],["lt;intlprovider>",{"_index":1076,"title":{},"content":{"88":{"position":[[340,21]]},"90":{"position":[[167,20],[829,20]]},"91":{"position":[[208,20]]},"240":{"position":[[658,20]]},"249":{"position":[[538,20],[635,20],[940,20]]},"250":{"position":[[845,21]]},"253":{"position":[[510,21]]},"260":{"position":[[257,20]]},"261":{"position":[[153,21]]},"264":{"position":[[122,20]]},"269":{"position":[[483,20]]},"283":{"position":[[447,20]]},"290":{"position":[[520,21]]},"367":{"position":[[658,20]]}},"keywords":{}}],["lt;intlprovider>'",{"_index":2080,"title":{},"content":{"290":{"position":[[367,22]]}},"keywords":{}}],["lt;intlprovider>.fallback",{"_index":1724,"title":{},"content":{"239":{"position":[[291,29]]},"307":{"position":[[291,29]]},"366":{"position":[[291,29]]}},"keywords":{}}],["lt;intlprovider>.intlformatt",{"_index":1621,"title":{},"content":{"223":{"position":[[1996,36]]},"348":{"position":[[2129,36]]}},"keywords":{}}],["lt;li>",{"_index":664,"title":{},"content":{"42":{"position":[[776,10],[1367,10]]}},"keywords":{}}],["lt;link>",{"_index":2010,"title":{},"content":{"272":{"position":[[465,13]]}},"keywords":{}}],["lt;link>{pct",{"_index":610,"title":{},"content":{"38":{"position":[[327,17]]}},"keywords":{}}],["lt;mainapp",{"_index":795,"title":{},"content":{"48":{"position":[[626,11]]}},"keywords":{}}],["lt;more>fun",{"_index":2379,"title":{},"content":{"332":{"position":[[1904,15]]}},"keywords":{}}],["lt;mybutton",{"_index":1047,"title":{},"content":{"84":{"position":[[504,12],[868,12]]}},"keywords":{}}],["lt;mycompon",{"_index":1100,"title":{},"content":{"90":{"position":[[188,15],[850,15]]},"327":{"position":[[737,15],[1310,15]]}},"keywords":{}}],["lt;myform",{"_index":1049,"title":{},"content":{"84":{"position":[[541,10],[887,10]]}},"keywords":{}}],["lt;notatag>",{"_index":631,"title":{},"content":{"39":{"position":[[331,16]]}},"keywords":{}}],["lt;notatag>hello</notatag>",{"_index":632,"title":{},"content":{"39":{"position":[[383,38]]}},"keywords":{}}],["lt;outfolder>",{"_index":2528,"title":{},"content":{"396":{"position":[[274,17]]}},"keywords":{}}],["lt;outfolder>/<locale>.json",{"_index":2530,"title":{},"content":{"396":{"position":[[395,38]]}},"keywords":{}}],["lt;p>",{"_index":266,"title":{},"content":{"16":{"position":[[18,11]]},"20":{"position":[[538,9],[831,9]]},"227":{"position":[[132,12]]},"250":{"position":[[1422,9]]},"290":{"position":[[132,12]]},"354":{"position":[[132,12]]},"411":{"position":[[95,11]]},"414":{"position":[[152,9],[490,9]]},"436":{"position":[[152,9]]},"461":{"position":[[103,9],[180,9]]}},"keywords":{}}],["lt;p><span",{"_index":1818,"title":{},"content":{"250":{"position":[[1865,17]]}},"keywords":{}}],["lt;passwordchang",{"_index":690,"title":{},"content":{"42":{"position":[[1563,18]]}},"keywords":{}}],["lt;postdat",{"_index":1808,"title":{},"content":{"250":{"position":[[1432,12]]}},"keywords":{}}],["lt;pre>",{"_index":942,"title":{},"content":{"77":{"position":[[13,11]]}},"keywords":{}}],["lt;rawintlprovid",{"_index":1052,"title":{},"content":{"84":{"position":[[825,19]]},"291":{"position":[[398,19]]},"336":{"position":[[537,19]]},"346":{"position":[[497,19]]}},"keywords":{}}],["lt;rawintlprovider>",{"_index":2066,"title":{},"content":{"283":{"position":[[471,23]]}},"keywords":{}}],["lt;react.fragment>",{"_index":2073,"title":{},"content":{"286":{"position":[[115,22]]},"292":{"position":[[349,23]]},"308":{"position":[[77,23]]},"351":{"position":[[115,22]]}},"keywords":{}}],["lt;relativetime>",{"_index":1913,"title":{},"content":{"262":{"position":[[365,20]]}},"keywords":{}}],["lt;script",{"_index":1065,"title":{},"content":{"87":{"position":[[411,10]]},"107":{"position":[[362,10]]},"115":{"position":[[420,10]]},"130":{"position":[[1,10]]},"152":{"position":[[192,10]]},"160":{"position":[[166,10]]},"173":{"position":[[356,10]]},"182":{"position":[[414,10],[703,10]]},"192":{"position":[[359,10]]},"207":{"position":[[148,10]]},"214":{"position":[[380,10]]},"259":{"position":[[286,10],[369,10],[932,10]]}},"keywords":{}}],["lt;script>",{"_index":1059,"title":{},"content":{"87":{"position":[[143,14]]},"259":{"position":[[206,14]]}},"keywords":{}}],["lt;section>",{"_index":675,"title":{},"content":{"42":{"position":[[1186,15]]}},"keywords":{}}],["lt;select",{"_index":2677,"title":{},"content":{"452":{"position":[[907,10]]}},"keywords":{}}],["lt;shortdate>",{"_index":1087,"title":{},"content":{"89":{"position":[[359,17]]}},"keywords":{}}],["lt;small>{parts[2].value}</small>",{"_index":2106,"title":{},"content":{"293":{"position":[[714,43]]},"295":{"position":[[641,43]]},"299":{"position":[[631,43]]},"302":{"position":[[584,43]]}},"keywords":{}}],["lt;small>{parts[4].value}</small>",{"_index":2183,"title":{},"content":{"302":{"position":[[645,43]]}},"keywords":{}}],["lt;sourcelocale>.json",{"_index":2491,"title":{},"content":{"385":{"position":[[72,25]]}},"keywords":{}}],["lt;span",{"_index":1800,"title":{},"content":{"250":{"position":[[1194,8]]},"332":{"position":[[1619,8],[2023,8]]},"344":{"position":[[416,8]]},"345":{"position":[[1402,8]]}},"keywords":{}}],["lt;span>fun",{"_index":2376,"title":{},"content":{"332":{"position":[[1694,15]]}},"keywords":{}}],["lt;span>{chunks}</span>",{"_index":2383,"title":{},"content":{"332":{"position":[[2111,34]]}},"keywords":{}}],["lt;strong",{"_index":2221,"title":{},"content":{"309":{"position":[[969,10]]},"310":{"position":[[526,10]]},"332":{"position":[[339,10],[741,10]]}},"keywords":{}}],["lt;strong>{chunks}</strong>",{"_index":1369,"title":{},"content":{"136":{"position":[[478,38]]},"272":{"position":[[177,38]]},"276":{"position":[[155,38],[284,38]]}},"keywords":{}}],["lt;svg",{"_index":2206,"title":{},"content":{"309":{"position":[[416,7]]}},"keywords":{}}],["lt;t",{"_index":2469,"title":{},"content":{"373":{"position":[[173,5]]},"389":{"position":[[200,5]]},"397":{"position":[[200,5]]}},"keywords":{}}],["lt;template>",{"_index":265,"title":{},"content":{"16":{"position":[[1,16]]},"411":{"position":[[78,16]]},"414":{"position":[[46,17],[135,16],[473,16]]},"436":{"position":[[135,16]]}},"keywords":{}}],["lt;time",{"_index":1923,"title":{},"content":{"262":{"position":[[871,8]]}},"keywords":{}}],["lt;translation_file>",{"_index":2496,"title":{},"content":{"389":{"position":[[40,24]]},"397":{"position":[[40,24]]}},"keywords":{}}],["lt;translationfiles>",{"_index":2489,"title":{},"content":{"384":{"position":[[163,24]]}},"keywords":{}}],["lt;ul>",{"_index":683,"title":{},"content":{"42":{"position":[[1356,10]]}},"keywords":{}}],["m",{"_index":488,"title":{},"content":{"34":{"position":[[290,1],[534,1]]},"78":{"position":[[235,1],[479,1]]},"138":{"position":[[566,1],[810,1]]}},"keywords":{}}],["made",{"_index":834,"title":{},"content":{"51":{"position":[[11,4]]},"223":{"position":[[1911,4]]},"239":{"position":[[563,5]]},"247":{"position":[[7,4]]},"249":{"position":[[327,4]]},"268":{"position":[[25,4]]},"283":{"position":[[228,4]]},"348":{"position":[[2044,4]]},"366":{"position":[[563,5]]}},"keywords":{}}],["main",{"_index":1173,"title":{},"content":{"96":{"position":[[783,4],[1332,4]]},"259":{"position":[[142,4]]}},"keywords":{}}],["main.t",{"_index":387,"title":{},"content":{"26":{"position":[[191,12]]},"421":{"position":[[147,12]]}},"keywords":{}}],["maindiv",{"_index":798,"title":{},"content":{"48":{"position":[[714,8],[838,8]]}},"keywords":{}}],["make",{"_index":284,"title":{},"content":{"17":{"position":[[436,4]]},"42":{"position":[[335,4]]},"46":{"position":[[1196,5]]},"53":{"position":[[231,6]]},"68":{"position":[[45,4]]},"86":{"position":[[55,4]]},"92":{"position":[[233,4]]},"119":{"position":[[386,4]]},"125":{"position":[[110,4]]},"245":{"position":[[45,4]]},"252":{"position":[[1201,4]]},"297":{"position":[[1739,4]]},"309":{"position":[[491,4]]},"320":{"position":[[186,4]]},"326":{"position":[[103,5]]},"328":{"position":[[665,4]]},"330":{"position":[[548,4]]},"344":{"position":[[687,4]]},"377":{"position":[[185,4]]},"384":{"position":[[29,4]]},"387":{"position":[[93,5]]},"426":{"position":[[186,4]]},"445":{"position":[[162,4]]},"446":{"position":[[1,5]]},"448":{"position":[[6,4]]},"458":{"position":[[126,5]]},"459":{"position":[[1,4]]}},"keywords":{}}],["male",{"_index":533,"title":{},"content":{"35":{"position":[[1068,4]]}},"keywords":{}}],["malform",{"_index":870,"title":{},"content":{"59":{"position":[[79,10]]}},"keywords":{}}],["manag",{"_index":723,"title":{"44":{"position":[[12,10]]},"47":{"position":[[12,10]]}},"content":{"123":{"position":[[47,6]]},"393":{"position":[[339,10]]}},"keywords":{}}],["mango",{"_index":2673,"title":{},"content":{"452":{"position":[[656,8],[672,6]]}},"keywords":{}}],["mani",{"_index":511,"title":{},"content":{"35":{"position":[[83,4]]},"36":{"position":[[622,4],[677,5]]},"37":{"position":[[626,4],[681,5]]},"233":{"position":[[184,6]]},"250":{"position":[[792,4]]},"263":{"position":[[170,4]]},"300":{"position":[[271,5],[444,5]]},"345":{"position":[[889,4]]},"360":{"position":[[184,6]]},"383":{"position":[[189,4],[229,4]]},"447":{"position":[[290,4],[297,7]]},"459":{"position":[[74,4],[338,4]]}},"keywords":{}}],["manifest",{"_index":993,"title":{},"content":{"81":{"position":[[486,8]]},"83":{"position":[[538,8],[712,8]]}},"keywords":{}}],["manual",{"_index":717,"title":{},"content":{"43":{"position":[[7,6]]},"96":{"position":[[187,8]]}},"keywords":{}}],["map",{"_index":545,"title":{},"content":{"36":{"position":[[213,6]]},"37":{"position":[[219,6]]},"48":{"position":[[98,3]]},"133":{"position":[[719,3]]},"227":{"position":[[3,3]]},"241":{"position":[[551,3]]},"290":{"position":[[3,3]]},"315":{"position":[[213,4]]},"354":{"position":[[3,3]]},"368":{"position":[[547,3]]}},"keywords":{}}],["markdown",{"_index":2231,"title":{},"content":{"310":{"position":[[965,9]]}},"keywords":{}}],["marker",{"_index":499,"title":{},"content":{"34":{"position":[[471,6]]},"78":{"position":[[416,6]]},"138":{"position":[[747,6]]}},"keywords":{}}],["mask",{"_index":2057,"title":{},"content":{"280":{"position":[[112,5]]}},"keywords":{}}],["match",{"_index":309,"title":{},"content":{"20":{"position":[[259,8]]},"35":{"position":[[19,8],[56,8],[245,7],[263,7],[370,7],[407,8],[433,5],[442,5],[461,5],[556,5],[784,5],[829,8]]},"36":{"position":[[19,8],[247,5],[279,7],[1349,5],[1569,5],[1750,5],[2313,6]]},"37":{"position":[[26,8],[262,5],[294,7],[1337,5],[1557,5],[1779,6]]},"42":{"position":[[358,7]]},"168":{"position":[[8,7]]},"331":{"position":[[248,5]]}},"keywords":{}}],["match(['fr",{"_index":1475,"title":{},"content":{"168":{"position":[[52,10]]}},"keywords":{}}],["match(['zh",{"_index":1477,"title":{},"content":{"168":{"position":[[103,13]]}},"keywords":{}}],["matter",{"_index":3,"title":{"1":{"position":[[45,8]]}},"content":{},"keywords":{}}],["max",{"_index":2149,"title":{},"content":{"297":{"position":[[1830,3]]}},"keywords":{}}],["maximum",{"_index":2130,"title":{},"content":{"297":{"position":[[925,7],[961,7]]}},"keywords":{}}],["mean",{"_index":483,"title":{},"content":{"34":{"position":[[253,7]]},"36":{"position":[[1706,4],[1724,5]]},"78":{"position":[[198,7]]},"90":{"position":[[249,5]]},"138":{"position":[[529,7]]},"220":{"position":[[287,5]]},"250":{"position":[[2227,5]]},"258":{"position":[[310,4]]},"272":{"position":[[496,5]]},"329":{"position":[[389,5]]},"331":{"position":[[269,5]]},"333":{"position":[[182,5]]},"338":{"position":[[288,6]]},"343":{"position":[[283,5]]},"400":{"position":[[458,5]]}},"keywords":{}}],["meant",{"_index":1372,"title":{},"content":{"136":{"position":[[631,5]]},"227":{"position":[[56,5]]},"290":{"position":[[56,5]]},"329":{"position":[[275,5]]},"354":{"position":[[56,5]]}},"keywords":{}}],["mechan",{"_index":92,"title":{},"content":{"3":{"position":[[204,9]]},"254":{"position":[[200,10]]},"371":{"position":[[422,10]]},"435":{"position":[[192,11]]}},"keywords":{}}],["medium",{"_index":465,"title":{},"content":{"32":{"position":[[461,7]]}},"keywords":{}}],["megabit",{"_index":1514,"title":{},"content":{"186":{"position":[[330,9]]}},"keywords":{}}],["megabyt",{"_index":1515,"title":{},"content":{"186":{"position":[[342,10]]}},"keywords":{}}],["memoiz",{"_index":1342,"title":{},"content":{"133":{"position":[[734,8]]},"141":{"position":[[132,8],[222,7],[360,9],[391,8],[438,8],[526,8]]},"222":{"position":[[67,8]]},"347":{"position":[[67,8]]}},"keywords":{}}],["memoize((local",{"_index":1423,"title":{},"content":{"141":{"position":[[613,16]]}},"keywords":{}}],["memori",{"_index":1568,"title":{},"content":{"221":{"position":[[219,6]]},"222":{"position":[[149,6]]},"291":{"position":[[261,6]]},"336":{"position":[[357,6]]},"346":{"position":[[317,6]]},"347":{"position":[[149,6]]}},"keywords":{}}],["merg",{"_index":1992,"title":{"270":{"position":[[0,5]]}},"content":{"451":{"position":[[1382,7]]}},"keywords":{}}],["messag",{"_index":104,"title":{"13":{"position":[[0,7]]},"27":{"position":[[0,7]]},"40":{"position":[[0,7]]},"45":{"position":[[0,7]]},"46":{"position":[[10,9]]},"50":{"position":[[14,9]]},"126":{"position":[[0,7]]},"224":{"position":[[21,9]]},"237":{"position":[[0,7]]},"238":{"position":[[0,7]]},"239":{"position":[[0,7]]},"253":{"position":[[7,7]]},"254":{"position":[[0,7]]},"263":{"position":[[11,8]]},"264":{"position":[[8,8]]},"265":{"position":[[36,7]]},"274":{"position":[[31,9]]},"284":{"position":[[21,9]]},"305":{"position":[[0,7]]},"306":{"position":[[0,7]]},"307":{"position":[[0,7]]},"337":{"position":[[0,7]]},"349":{"position":[[21,9]]},"364":{"position":[[0,7]]},"365":{"position":[[0,7]]},"366":{"position":[[0,7]]},"445":{"position":[[16,8]]},"460":{"position":[[11,8]]},"461":{"position":[[17,8]]}},"content":{"3":{"position":[[435,8],[539,7]]},"11":{"position":[[215,9],[402,8],[491,8]]},"14":{"position":[[86,9],[178,7]]},"15":{"position":[[191,7]]},"17":{"position":[[48,7],[90,9],[182,7],[304,12],[405,8],[645,7]]},"20":{"position":[[235,8]]},"21":{"position":[[94,7]]},"28":{"position":[[32,7]]},"29":{"position":[[59,8],[160,7]]},"30":{"position":[[337,7]]},"31":{"position":[[169,7],[235,7],[634,7],[937,7],[1098,7],[1224,7]]},"32":{"position":[[427,7]]},"33":{"position":[[379,7]]},"35":{"position":[[685,8],[1043,7],[1239,7]]},"36":{"position":[[1996,7],[2130,7],[2484,7]]},"37":{"position":[[1913,7]]},"38":{"position":[[54,7],[218,7]]},"39":{"position":[[100,8],[167,7],[240,7],[323,7],[375,7],[684,7],[705,7]]},"42":{"position":[[558,9],[2252,7],[2350,8]]},"43":{"position":[[129,7]]},"46":{"position":[[29,7],[1071,8],[1120,8]]},"48":{"position":[[731,8]]},"50":{"position":[[30,8],[663,8]]},"51":{"position":[[30,8]]},"63":{"position":[[61,7],[72,8],[251,7]]},"75":{"position":[[86,7]]},"84":{"position":[[79,9]]},"93":{"position":[[383,8],[449,8],[713,9],[896,9]]},"123":{"position":[[94,8]]},"124":{"position":[[1,8],[56,8],[178,7]]},"125":{"position":[[37,8]]},"126":{"position":[[5,7],[94,7],[232,7]]},"127":{"position":[[30,7],[110,7],[164,8],[395,7]]},"133":{"position":[[13,7],[112,8],[143,7]]},"136":{"position":[[10,7],[45,7],[307,7],[565,8]]},"137":{"position":[[44,8]]},"140":{"position":[[444,8]]},"141":{"position":[[13,9]]},"220":{"position":[[152,8],[254,8]]},"221":{"position":[[307,9]]},"223":{"position":[[112,9]]},"224":{"position":[[239,7]]},"225":{"position":[[41,7],[81,10]]},"226":{"position":[[70,8]]},"237":{"position":[[85,7],[121,7],[142,7],[186,8],[261,8],[295,8],[406,7]]},"238":{"position":[[18,7],[143,7],[443,7],[581,7],[632,8]]},"239":{"position":[[5,7],[193,7],[266,7],[387,7],[462,7]]},"240":{"position":[[433,7],[589,8],[615,7],[687,8],[785,7],[865,8],[1145,8],[1450,8],[1753,7],[1914,7],[1922,8],[2010,8]]},"241":{"position":[[454,8],[532,7],[648,8],[726,8],[862,9]]},"252":{"position":[[484,8],[590,8]]},"253":{"position":[[276,7],[409,7],[437,8],[460,8],[570,8]]},"254":{"position":[[50,8],[156,8]]},"255":{"position":[[85,8]]},"260":{"position":[[128,8]]},"263":{"position":[[16,8],[227,7],[306,9],[318,7],[556,7],[631,7]]},"264":{"position":[[41,8],[103,8],[372,8],[844,8],[866,8],[916,7],[1015,8]]},"265":{"position":[[141,7],[208,7],[228,8],[300,8],[405,7]]},"266":{"position":[[127,7],[216,7]]},"267":{"position":[[98,7],[179,8],[270,7]]},"283":{"position":[[819,9]]},"284":{"position":[[239,7]]},"285":{"position":[[41,7],[81,10]]},"287":{"position":[[70,8]]},"288":{"position":[[74,8]]},"289":{"position":[[27,8]]},"291":{"position":[[348,9]]},"304":{"position":[[78,7]]},"305":{"position":[[85,7],[121,7],[142,7],[186,8],[261,8],[295,8],[406,7]]},"306":{"position":[[18,7],[164,7],[188,7],[488,7],[615,7],[722,7]]},"307":{"position":[[5,7],[193,7],[266,7],[377,7],[458,7]]},"308":{"position":[[669,7],[677,8],[765,8]]},"309":{"position":[[92,7]]},"310":{"position":[[134,7]]},"313":{"position":[[81,7]]},"315":{"position":[[13,7]]},"317":{"position":[[182,9]]},"318":{"position":[[12,7]]},"320":{"position":[[39,8]]},"321":{"position":[[38,8]]},"325":{"position":[[764,7]]},"336":{"position":[[444,9]]},"337":{"position":[[55,7]]},"338":{"position":[[36,7]]},"343":{"position":[[148,8],[250,8]]},"346":{"position":[[404,9]]},"348":{"position":[[152,9]]},"349":{"position":[[239,7]]},"350":{"position":[[41,7],[81,10]]},"352":{"position":[[70,8]]},"353":{"position":[[27,8]]},"364":{"position":[[85,7],[121,7],[142,7],[186,8],[261,8],[295,8],[406,7]]},"365":{"position":[[18,7],[143,7],[443,7],[581,7],[632,8]]},"366":{"position":[[5,7],[193,7],[266,7],[387,7],[462,7]]},"367":{"position":[[433,7],[589,8],[615,7],[687,8],[785,7],[865,8],[1145,8],[1450,8],[1753,7],[1914,7],[1922,8],[2010,8]]},"368":{"position":[[450,8],[528,7],[640,8],[718,8],[854,9]]},"371":{"position":[[269,8],[378,8],[636,9]]},"372":{"position":[[99,8]]},"374":{"position":[[148,8]]},"375":{"position":[[12,7]]},"376":{"position":[[48,7],[168,7]]},"377":{"position":[[39,8]]},"378":{"position":[[38,8]]},"384":{"position":[[63,8]]},"386":{"position":[[113,8]]},"387":{"position":[[45,8]]},"388":{"position":[[104,7],[130,7]]},"390":{"position":[[40,9]]},"391":{"position":[[20,7]]},"392":{"position":[[27,8],[110,7]]},"393":{"position":[[58,8],[147,7],[278,9],[472,7],[615,8]]},"394":{"position":[[247,8],[534,8]]},"395":{"position":[[231,8]]},"396":{"position":[[143,7],[169,7]]},"398":{"position":[[20,7]]},"399":{"position":[[31,8]]},"401":{"position":[[431,8]]},"408":{"position":[[203,9]]},"410":{"position":[[250,9]]},"412":{"position":[[141,8],[201,8],[270,8]]},"417":{"position":[[13,7]]},"423":{"position":[[182,9],[273,7]]},"425":{"position":[[48,7],[168,7]]},"426":{"position":[[39,8]]},"427":{"position":[[38,8]]},"430":{"position":[[41,7]]},"435":{"position":[[136,8],[268,8],[392,9]]},"443":{"position":[[51,8]]},"444":{"position":[[34,7],[163,8]]},"445":{"position":[[37,7],[105,8],[262,8],[339,9],[550,9]]},"446":{"position":[[40,7]]},"447":{"position":[[68,8]]},"448":{"position":[[179,8]]},"449":{"position":[[1,8]]},"450":{"position":[[71,7],[474,8]]},"451":{"position":[[1568,9],[1602,11],[1685,9],[1721,11]]},"453":{"position":[[60,8],[267,8],[451,7]]},"454":{"position":[[51,8],[214,8]]},"455":{"position":[[57,8],[207,8]]},"456":{"position":[[246,8],[923,9]]},"460":{"position":[[11,8],[60,8]]}},"keywords":{}}],["message"",{"_index":259,"title":{},"content":{"15":{"position":[[87,13]]},"71":{"position":[[162,13]]},"72":{"position":[[292,13]]}},"keywords":{}}],["message'",{"_index":1967,"title":{},"content":{"267":{"position":[[352,9]]}},"keywords":{}}],["message.ensur",{"_index":2712,"title":{},"content":{"462":{"position":[[591,15]]}},"keywords":{}}],["message.som",{"_index":2613,"title":{},"content":{"447":{"position":[[145,12]]}},"keywords":{}}],["message={this.getintlmessage('greet",{"_index":1968,"title":{},"content":{"267":{"position":[[574,41]]}},"keywords":{}}],["messagedescript",{"_index":1716,"title":{},"content":{"238":{"position":[[339,19]]},"263":{"position":[[452,19]]},"306":{"position":[[384,19]]},"365":{"position":[[339,19]]}},"keywords":{}}],["messagedescriptor",{"_index":1601,"title":{"430":{"position":[[39,21]]}},"content":{"223":{"position":[[1182,18],[1326,18]]},"238":{"position":[[479,17]]},"240":{"position":[[117,18],[241,18],[462,17]]},"241":{"position":[[11,17],[124,19],[269,19],[289,17]]},"304":{"position":[[114,17]]},"306":{"position":[[524,17]]},"348":{"position":[[1132,18],[1276,18]]},"365":{"position":[[479,17]]},"367":{"position":[[117,18],[241,18],[462,17]]},"368":{"position":[[11,17],[124,19],[269,19],[289,17]]},"456":{"position":[[41,18]]},"458":{"position":[[26,18]]}},"keywords":{}}],["messagedescriptor>",{"_index":1744,"title":{},"content":{"241":{"position":[[162,21],[205,21]]},"368":{"position":[[162,21],[205,21]]},"373":{"position":[[250,21]]}},"keywords":{}}],["messagedescriptor>>",{"_index":2470,"title":{},"content":{"373":{"position":[[199,26]]},"389":{"position":[[226,26]]},"397":{"position":[[226,26]]}},"keywords":{}}],["messageformat",{"_index":821,"title":{"74":{"position":[[4,13]]},"121":{"position":[[5,13]]},"130":{"position":[[13,13]]},"131":{"position":[[13,13]]}},"content":{"50":{"position":[[535,13]]},"51":{"position":[[117,13],[155,13]]},"52":{"position":[[61,13],[99,13]]},"53":{"position":[[112,13],[150,13]]},"75":{"position":[[208,14]]},"76":{"position":[[36,13]]},"131":{"position":[[49,14]]},"140":{"position":[[181,14],[231,13],[498,13]]},"141":{"position":[[338,14]]},"250":{"position":[[2123,13],[2150,14]]},"251":{"position":[[150,13]]},"252":{"position":[[212,16],[278,13],[417,13]]},"333":{"position":[[47,13],[74,14]]},"334":{"position":[[141,13]]},"335":{"position":[[251,13]]},"414":{"position":[[107,13]]}},"keywords":{}}],["messageformat"",{"_index":2388,"title":{},"content":{"335":{"position":[[184,21]]}},"keywords":{}}],["messageformat').default",{"_index":1331,"title":{},"content":{"131":{"position":[[106,23]]}},"keywords":{}}],["messageformat.min.js"></script>",{"_index":1329,"title":{},"content":{"130":{"position":[[46,45]]}},"keywords":{}}],["messageformat/intl",{"_index":1328,"title":{},"content":{"130":{"position":[[27,18]]}},"keywords":{}}],["messageformatelement[]>",{"_index":1577,"title":{},"content":{"223":{"position":[[171,26]]},"283":{"position":[[878,26]]},"348":{"position":[[211,26]]}},"keywords":{}}],["messageformatprimitivevalu",{"_index":1729,"title":{},"content":{"240":{"position":[[6,27],[288,27]]},"367":{"position":[[6,27],[288,27]]}},"keywords":{}}],["messageformatprimitivevalue>",{"_index":1731,"title":{},"content":{"240":{"position":[[163,31]]},"367":{"position":[[163,31]]}},"keywords":{}}],["messageformat|@formatjs/icu",{"_index":1827,"title":{},"content":{"251":{"position":[[122,27]]}},"keywords":{}}],["messageformat|@formatjs\\/icu",{"_index":1835,"title":{},"content":{"252":{"position":[[388,28]]}},"keywords":{}}],["messageformat|intl",{"_index":2384,"title":{},"content":{"334":{"position":[[122,18]]}},"keywords":{}}],["messages.integr",{"_index":991,"title":{},"content":{"81":{"position":[[370,20]]}},"keywords":{}}],["messages/str",{"_index":1711,"title":{},"content":{"238":{"position":[[88,16]]},"306":{"position":[[88,17]]},"365":{"position":[[88,16]]}},"keywords":{}}],["messages={messag",{"_index":802,"title":{},"content":{"48":{"position":[[811,19]]}},"keywords":{}}],["messages={messagesinfrench",{"_index":325,"title":{},"content":{"20":{"position":[[455,27]]}},"keywords":{}}],["messages={props.messag",{"_index":794,"title":{},"content":{"48":{"position":[[595,25]]}},"keywords":{}}],["messages={translationsforuserslocale}>",{"_index":1781,"title":{},"content":{"249":{"position":[[811,41]]}},"keywords":{}}],["messages[prefixedkey",{"_index":1948,"title":{},"content":{"264":{"position":[[735,21]]}},"keywords":{}}],["messagescli",{"_index":234,"title":{},"content":{"12":{"position":[[249,11]]}},"keywords":{}}],["messagescompil",{"_index":2526,"title":{},"content":{"395":{"position":[[214,16]]}},"keywords":{}}],["messagesinfrench",{"_index":311,"title":{},"content":{"20":{"position":[[299,16]]}},"keywords":{}}],["messageslint",{"_index":232,"title":{},"content":{"12":{"position":[[215,14]]}},"keywords":{}}],["messagexx",{"_index":2500,"title":{},"content":{"392":{"position":[[144,9]]}},"keywords":{}}],["meta",{"_index":2249,"title":{"431":{"position":[[34,5]]}},"content":{"322":{"position":[[147,4],[377,4]]},"381":{"position":[[147,4],[376,4]]},"428":{"position":[[147,4],[377,4]]},"431":{"position":[[48,4]]}},"keywords":{}}],["meta"",{"_index":2253,"title":{},"content":{"322":{"position":[[339,12]]},"381":{"position":[[338,12]]},"428":{"position":[[339,12]]}},"keywords":{}}],["metadata",{"_index":1619,"title":{},"content":{"223":{"position":[[1955,8]]},"278":{"position":[[583,8]]},"315":{"position":[[55,8]]},"322":{"position":[[83,8]]},"348":{"position":[[2088,8]]},"376":{"position":[[13,8]]},"381":{"position":[[83,8]]},"425":{"position":[[13,8]]},"428":{"position":[[83,8]]}},"keywords":{}}],["metadata['formatjs'].messag",{"_index":2234,"title":{},"content":{"315":{"position":[[223,30]]}},"keywords":{}}],["metadata['formatjs'].meta",{"_index":2235,"title":{},"content":{"315":{"position":[[254,25]]}},"keywords":{}}],["meter",{"_index":1516,"title":{},"content":{"186":{"position":[[355,7]]}},"keywords":{}}],["method",{"_index":245,"title":{"16":{"position":[[25,7]]},"135":{"position":[[18,7]]},"136":{"position":[[15,7]]},"137":{"position":[[7,7]]},"411":{"position":[[0,8]]}},"content":{"14":{"position":[[4,6]]},"17":{"position":[[523,7]]},"38":{"position":[[502,7]]},"92":{"position":[[326,7]]},"94":{"position":[[95,7]]},"100":{"position":[[779,6]]},"124":{"position":[[274,6]]},"127":{"position":[[309,7]]},"129":{"position":[[155,7]]},"134":{"position":[[251,7]]},"135":{"position":[[6,6]]},"136":{"position":[[85,6],[658,6]]},"221":{"position":[[73,8]]},"262":{"position":[[91,8]]},"265":{"position":[[22,6],[322,6]]},"328":{"position":[[184,7]]}},"keywords":{}}],["migrat",{"_index":2017,"title":{"274":{"position":[[0,9]]},"327":{"position":[[0,7]]},"329":{"position":[[0,7]]}},"content":{"273":{"position":[[131,9]]},"286":{"position":[[191,9]]},"325":{"position":[[37,7],[130,7]]},"351":{"position":[[191,9]]},"369":{"position":[[25,8]]}},"keywords":{}}],["mile",{"_index":1517,"title":{},"content":{"186":{"position":[[365,6],[374,5]]},"239":{"position":[[42,4]]},"307":{"position":[[42,4]]},"366":{"position":[[42,4]]}},"keywords":{}}],["millilit",{"_index":1520,"title":{},"content":{"186":{"position":[[411,12]]}},"keywords":{}}],["millimet",{"_index":1519,"title":{},"content":{"186":{"position":[[396,12]]}},"keywords":{}}],["millisecond",{"_index":1521,"title":{},"content":{"186":{"position":[[426,13]]}},"keywords":{}}],["mimic",{"_index":625,"title":{},"content":{"39":{"position":[[115,6]]}},"keywords":{}}],["mind",{"_index":2511,"title":{},"content":{"393":{"position":[[427,4]]}},"keywords":{}}],["minifi",{"_index":1766,"title":{},"content":{"247":{"position":[[670,9]]}},"keywords":{}}],["minim",{"_index":197,"title":{"20":{"position":[[0,7]]}},"content":{"10":{"position":[[3,7]]},"20":{"position":[[61,7]]},"83":{"position":[[500,8]]},"274":{"position":[[495,10]]}},"keywords":{}}],["minor",{"_index":1972,"title":{},"content":{"268":{"position":[[1,5]]}},"keywords":{}}],["mint",{"_index":2668,"title":{},"content":{"452":{"position":[[451,7]]}},"keywords":{}}],["minut",{"_index":470,"title":{},"content":{"33":{"position":[[258,8],[319,8]]},"34":{"position":[[536,6]]},"78":{"position":[[481,6]]},"138":{"position":[[812,6]]},"186":{"position":[[442,8]]},"230":{"position":[[260,7]]},"231":{"position":[[169,8]]},"234":{"position":[[615,10]]},"294":{"position":[[190,7]]},"297":{"position":[[1448,6],[1496,6],[1527,7],[1570,7]]},"356":{"position":[[269,7]]},"358":{"position":[[169,8]]},"361":{"position":[[615,10]]}},"keywords":{}}],["minutesmedium",{"_index":469,"title":{},"content":{"33":{"position":[[208,13]]}},"keywords":{}}],["misconfigur",{"_index":877,"title":{},"content":{"61":{"position":[[29,13]]}},"keywords":{}}],["miss",{"_index":878,"title":{"386":{"position":[[2,7]]},"449":{"position":[[3,7]]}},"content":{"61":{"position":[[51,7]]},"62":{"position":[[62,7]]},"67":{"position":[[260,7]]},"136":{"position":[[1051,8]]},"225":{"position":[[67,8]]},"244":{"position":[[271,7]]},"272":{"position":[[80,8]]},"285":{"position":[[67,8]]},"330":{"position":[[415,7]]},"350":{"position":[[67,8]]},"386":{"position":[[22,7]]},"387":{"position":[[145,7]]},"457":{"position":[[93,4],[337,9]]}},"keywords":{}}],["missing_data",{"_index":879,"title":{"62":{"position":[[0,13]]}},"content":{},"keywords":{}}],["missing_transl",{"_index":654,"title":{"63":{"position":[[0,20]]}},"content":{"42":{"position":[[494,19]]}},"keywords":{}}],["mixin",{"_index":1904,"title":{"260":{"position":[[12,6]]}},"content":{"260":{"position":[[56,5]]}},"keywords":{}}],["mocha",{"_index":1056,"title":{"87":{"position":[[0,6]]}},"content":{"87":{"position":[[17,5],[194,5],[244,5]]},"89":{"position":[[36,6]]}},"keywords":{}}],["mock",{"_index":1165,"title":{},"content":{"96":{"position":[[274,4],[1147,4]]}},"keywords":{}}],["modern",{"_index":1322,"title":{"129":{"position":[[0,6]]}},"content":{"129":{"position":[[96,6]]},"329":{"position":[[362,6]]}},"keywords":{}}],["modul",{"_index":366,"title":{"247":{"position":[[0,6]]},"248":{"position":[[15,7]]}},"content":{"23":{"position":[[132,7]]},"93":{"position":[[39,6]]},"246":{"position":[[131,7]]},"247":{"position":[[38,6],[314,6]]},"248":{"position":[[296,6]]},"258":{"position":[[17,7],[248,7]]},"313":{"position":[[35,7]]},"418":{"position":[[88,7]]}},"keywords":{}}],["module.export",{"_index":364,"title":{},"content":{"23":{"position":[[96,14]]},"52":{"position":[[1,14]]},"53":{"position":[[42,14]]},"73":{"position":[[122,14]]},"418":{"position":[[52,14]]},"419":{"position":[[66,14]]}},"keywords":{}}],["modulesourcenam",{"_index":2246,"title":{},"content":{"320":{"position":[[166,16]]},"377":{"position":[[165,16]]},"426":{"position":[[166,16]]}},"keywords":{}}],["moment",{"_index":2139,"title":{},"content":{"297":{"position":[[1176,7],[1200,6]]}},"keywords":{}}],["month",{"_index":489,"title":{},"content":{"34":{"position":[[292,5],[320,5],[343,5]]},"78":{"position":[[237,5],[265,5],[288,5]]},"138":{"position":[[568,5],[596,5],[619,5]]},"186":{"position":[[453,7]]},"229":{"position":[[371,6]]},"231":{"position":[[206,7]]},"262":{"position":[[714,5],[825,6]]},"355":{"position":[[380,6]]},"358":{"position":[[206,7]]}},"keywords":{}}],["month="2",{"_index":1217,"title":{},"content":{"100":{"position":[[1221,13]]}},"keywords":{}}],["month="long"",{"_index":2086,"title":{},"content":{"290":{"position":[[668,22]]},"292":{"position":[[706,22]]},"293":{"position":[[585,22]]}},"keywords":{}}],["month="short"",{"_index":1084,"title":{},"content":{"89":{"position":[[264,23],[1026,23]]}},"keywords":{}}],["monthful",{"_index":461,"title":{},"content":{"32":{"position":[[367,9]]}},"keywords":{}}],["monthlong",{"_index":459,"title":{},"content":{"32":{"position":[[293,9]]}},"keywords":{}}],["more",{"_index":434,"title":{"55":{"position":[[0,4]]}},"content":{"31":{"position":[[761,4],[1307,4]]},"35":{"position":[[737,4]]},"36":{"position":[[1122,4],[1759,4]]},"37":{"position":[[1110,4]]},"43":{"position":[[170,4]]},"44":{"position":[[941,5]]},"46":{"position":[[1211,4]]},"55":{"position":[[94,4]]},"57":{"position":[[245,4]]},"68":{"position":[[155,4]]},"83":{"position":[[743,4]]},"96":{"position":[[1064,4]]},"97":{"position":[[44,4]]},"133":{"position":[[537,4]]},"136":{"position":[[740,4]]},"227":{"position":[[304,4]]},"228":{"position":[[358,4]]},"240":{"position":[[818,4]]},"245":{"position":[[155,4]]},"249":{"position":[[970,4]]},"250":{"position":[[2042,4]]},"253":{"position":[[118,4]]},"286":{"position":[[211,4]]},"290":{"position":[[304,4]]},"293":{"position":[[185,4]]},"295":{"position":[[185,4]]},"299":{"position":[[183,4]]},"309":{"position":[[584,4]]},"325":{"position":[[75,4],[168,4],[236,4],[580,4],[716,4],[798,4]]},"328":{"position":[[758,4]]},"332":{"position":[[2092,5]]},"337":{"position":[[34,4]]},"338":{"position":[[551,4]]},"340":{"position":[[206,4]]},"344":{"position":[[780,4]]},"351":{"position":[[211,4]]},"354":{"position":[[304,4]]},"367":{"position":[[818,4]]},"388":{"position":[[155,4]]},"396":{"position":[[194,4]]},"414":{"position":[[248,8],[308,6],[586,5]]},"437":{"position":[[99,4]]},"449":{"position":[[368,4]]},"457":{"position":[[328,8]]},"462":{"position":[[578,4]]}},"keywords":{}}],["mot",{"_index":772,"title":{},"content":{"46":{"position":[[506,3],[657,3]]}},"keywords":{}}],["mount",{"_index":1130,"title":{},"content":{"92":{"position":[[205,5]]},"93":{"position":[[111,8],[331,7]]}},"keywords":{}}],["mount()",{"_index":1128,"title":{},"content":{"92":{"position":[[71,9]]}},"keywords":{}}],["mount(nod",{"_index":1141,"title":{},"content":{"93":{"position":[[617,11]]}},"keywords":{}}],["mountwithintl",{"_index":1148,"title":{},"content":{"94":{"position":[[165,15]]}},"keywords":{}}],["mountwithintl(<customcompon",{"_index":1150,"title":{},"content":{"94":{"position":[[239,33]]}},"keywords":{}}],["mountwithintl(nod",{"_index":1139,"title":{},"content":{"93":{"position":[[568,19]]}},"keywords":{}}],["move",{"_index":1981,"title":{},"content":{"269":{"position":[[145,5]]}},"keywords":{}}],["mozilla",{"_index":2228,"title":{},"content":{"310":{"position":[[843,7]]},"332":{"position":[[1278,7]]}},"keywords":{}}],["ms",{"_index":2148,"title":{},"content":{"297":{"position":[[1799,2]]}},"keywords":{}}],["ms_in_day",{"_index":1796,"title":{},"content":{"250":{"position":[[1100,9]]}},"keywords":{}}],["msg",{"_index":739,"title":{"430":{"position":[[33,5]]}},"content":{"44":{"position":[[661,6],[705,4]]},"47":{"position":[[540,6],[584,4]]},"124":{"position":[[100,3]]},"133":{"position":[[943,3]]},"142":{"position":[[334,3],[395,3],[480,3],[566,3]]},"241":{"position":[[802,3]]},"332":{"position":[[587,3],[706,5],[731,3]]},"368":{"position":[[794,3]]},"373":{"position":[[226,5]]},"389":{"position":[[253,5]]},"397":{"position":[[253,5]]},"405":{"position":[[99,4],[110,4],[273,4],[351,5]]}},"keywords":{}}],["msg.defaultmessag",{"_index":742,"title":{},"content":{"44":{"position":[[761,19]]}},"keywords":{}}],["msg.descript",{"_index":743,"title":{},"content":{"44":{"position":[[790,16]]}},"keywords":{}}],["msg.format(valu",{"_index":1298,"title":{},"content":{"124":{"position":[[357,18]]}},"keywords":{}}],["msg.string",{"_index":782,"title":{},"content":{"47":{"position":[[630,10]]}},"keywords":{}}],["msgs[k].defaultmessag",{"_index":2554,"title":{},"content":{"405":{"position":[[372,23]]}},"keywords":{}}],["much",{"_index":602,"title":{},"content":{"38":{"position":[[109,4]]},"51":{"position":[[211,4]]},"194":{"position":[[230,4]]},"220":{"position":[[391,4]]},"332":{"position":[[1440,4]]},"343":{"position":[[387,4]]},"383":{"position":[[55,4]]}},"keywords":{}}],["multipl",{"_index":812,"title":{"453":{"position":[[3,8]]},"454":{"position":[[3,8]]}},"content":{"50":{"position":[[335,8]]},"82":{"position":[[605,8]]},"101":{"position":[[123,8]]},"233":{"position":[[767,8],[896,8]]},"331":{"position":[[127,8]]},"360":{"position":[[767,8],[896,8]]},"453":{"position":[[24,8]]},"454":{"position":[[26,8]]}},"keywords":{}}],["mutat",{"_index":1881,"title":{},"content":{"258":{"position":[[91,8]]}},"keywords":{}}],["mybutton",{"_index":1042,"title":{},"content":{"84":{"position":[[372,10],[705,10]]}},"keywords":{}}],["myclassfn",{"_index":1110,"title":{},"content":{"90":{"position":[[588,11]]}},"keywords":{}}],["mycompon",{"_index":1109,"title":{},"content":{"90":{"position":[[546,11]]},"327":{"position":[[375,11],[893,11]]},"452":{"position":[[884,11]]}},"keywords":{}}],["mycomponentref",{"_index":2286,"title":{},"content":{"327":{"position":[[1159,14]]}},"keywords":{}}],["mycomponentwithhoc",{"_index":2295,"title":{},"content":{"328":{"position":[[318,18]]}},"keywords":{}}],["mycomponentwithhook",{"_index":2297,"title":{},"content":{"328":{"position":[[448,19]]}},"keywords":{}}],["myfeature(prop",{"_index":1045,"title":{},"content":{"84":{"position":[[457,16],[790,16]]}},"keywords":{}}],["myfolder/myfile.t",{"_index":2522,"title":{},"content":{"394":{"position":[[428,18]]}},"keywords":{}}],["myform",{"_index":1043,"title":{},"content":{"84":{"position":[[383,7],[716,7]]}},"keywords":{}}],["mymessag",{"_index":312,"title":{},"content":{"20":{"position":[[320,10]]}},"keywords":{}}],["myself",{"_index":1693,"title":{},"content":{"234":{"position":[[523,9]]},"301":{"position":[[472,9]]},"302":{"position":[[487,9]]},"361":{"position":[[523,9]]}},"keywords":{}}],["name",{"_index":107,"title":{"377":{"position":[[23,5],[46,7]]},"378":{"position":[[22,5],[45,7]]}},"content":{"3":{"position":[[471,8],[508,8]]},"14":{"position":[[158,4],[166,8],[218,5]]},"15":{"position":[[167,4],[237,5]]},"17":{"position":[[162,4],[170,8],[248,6],[270,4],[327,5],[356,4]]},"42":{"position":[[1508,5]]},"71":{"position":[[200,4],[231,5],[767,4],[775,8],[794,5]]},"72":{"position":[[330,4],[361,5]]},"73":{"position":[[529,4],[537,8],[556,5]]},"133":{"position":[[975,4],[983,9]]},"136":{"position":[[183,4],[191,9]]},"235":{"position":[[599,4],[722,4],[856,4]]},"237":{"position":[[278,6],[312,7]]},"240":{"position":[[949,9],[1066,6],[1229,9],[1346,6],[1678,5]]},"241":{"position":[[780,9]]},"248":{"position":[[92,5],[390,5]]},"252":{"position":[[621,5]]},"269":{"position":[[192,5],[316,4]]},"305":{"position":[[278,6],[312,7]]},"308":{"position":[[466,5]]},"313":{"position":[[257,5]]},"320":{"position":[[22,5]]},"321":{"position":[[21,5]]},"332":{"position":[[1533,6],[1579,5],[1967,4]]},"343":{"position":[[831,4]]},"362":{"position":[[600,4],[723,4],[857,4]]},"364":{"position":[[278,6],[312,7]]},"367":{"position":[[949,9],[1066,6],[1229,9],[1346,6],[1678,5]]},"368":{"position":[[772,9]]},"377":{"position":[[22,5]]},"378":{"position":[[21,5]]},"385":{"position":[[66,5]]},"389":{"position":[[148,5]]},"392":{"position":[[121,4],[129,6],[160,4],[209,4],[217,6],[245,4],[253,6],[280,7],[305,6]]},"397":{"position":[[148,5]]},"417":{"position":[[189,5]]},"426":{"position":[[22,5]]},"427":{"position":[[21,5]]},"438":{"position":[[113,5]]},"439":{"position":[[114,5]]},"446":{"position":[[1349,5]]},"451":{"position":[[1475,4],[1489,5],[1504,6],[1550,8]]}},"keywords":{}}],["name="eric"",{"_index":1969,"title":{},"content":{"267":{"position":[[616,21]]}},"keywords":{}}],["namespac",{"_index":1856,"title":{},"content":{"253":{"position":[[231,9],[374,9],[723,9]]}},"keywords":{}}],["name}!"",{"_index":2201,"title":{},"content":{"308":{"position":[[442,13]]}},"keywords":{}}],["name}"",{"_index":261,"title":{},"content":{"15":{"position":[[175,12]]},"42":{"position":[[1447,12],[1907,13]]},"46":{"position":[[375,13]]},"71":{"position":[[208,12]]},"72":{"position":[[338,12]]},"395":{"position":[[457,13]]}},"keywords":{}}],["name}sssssssssssssssssssssssss",{"_index":2502,"title":{},"content":{"392":{"position":[[168,31]]}},"keywords":{}}],["narrow",{"_index":1659,"title":{},"content":{"231":{"position":[[325,8],[774,10]]},"232":{"position":[[664,9]]},"234":{"position":[[236,8]]},"235":{"position":[[180,8]]},"297":{"position":[[358,8]]},"358":{"position":[[325,8],[774,10]]},"359":{"position":[[660,9]]},"361":{"position":[[236,8]]},"362":{"position":[[180,8]]}},"keywords":{}}],["narrow"/>",{"_index":2336,"title":{},"content":{"331":{"position":[[938,17],[1126,17]]}},"keywords":{}}],["nativ",{"_index":880,"title":{"68":{"position":[[6,7]]},"69":{"position":[[6,6]]},"194":{"position":[[6,7]]},"245":{"position":[[6,7]]},"329":{"position":[[17,6]]}},"content":{"62":{"position":[[11,6]]},"68":{"position":[[37,7]]},"194":{"position":[[135,6]]},"245":{"position":[[37,7],[273,6]]},"325":{"position":[[54,6],[147,6]]},"329":{"position":[[58,6]]},"330":{"position":[[58,6]]},"451":{"position":[[2060,6]]}},"keywords":{}}],["natur",{"_index":87,"title":{},"content":{"3":{"position":[[60,7]]}},"keywords":{}}],["navigator.languag",{"_index":1815,"title":{},"content":{"250":{"position":[[1776,18]]},"290":{"position":[[954,18]]}},"keywords":{}}],["nd",{"_index":593,"title":{},"content":{"37":{"position":[[1971,5]]},"462":{"position":[[434,4],[533,5]]}},"keywords":{}}],["necessari",{"_index":1712,"title":{},"content":{"238":{"position":[[201,9]]},"306":{"position":[[246,9]]},"365":{"position":[[201,9]]}},"keywords":{}}],["necessarili",{"_index":251,"title":{},"content":{"14":{"position":[[283,11]]},"15":{"position":[[302,11]]}},"keywords":{}}],["need",{"_index":90,"title":{},"content":{"3":{"position":[[150,4]]},"4":{"position":[[82,4]]},"5":{"position":[[373,5]]},"65":{"position":[[108,4]]},"87":{"position":[[233,7]]},"88":{"position":[[252,4]]},"90":{"position":[[39,4]]},"92":{"position":[[113,4]]},"94":{"position":[[107,4]]},"95":{"position":[[194,4]]},"96":{"position":[[1198,7]]},"182":{"position":[[587,5]]},"212":{"position":[[148,4],[212,4]]},"233":{"position":[[845,4]]},"243":{"position":[[471,4],[1089,4]]},"250":{"position":[[327,5]]},"258":{"position":[[320,4],[378,4]]},"259":{"position":[[47,5],[1016,4]]},"264":{"position":[[1046,5]]},"265":{"position":[[378,4]]},"272":{"position":[[512,4]]},"292":{"position":[[380,4]]},"294":{"position":[[438,4]]},"296":{"position":[[573,4]]},"297":{"position":[[670,4]]},"298":{"position":[[357,4]]},"300":{"position":[[533,4]]},"303":{"position":[[256,4]]},"308":{"position":[[108,4]]},"309":{"position":[[545,4]]},"327":{"position":[[1256,4]]},"330":{"position":[[540,4]]},"332":{"position":[[892,4]]},"360":{"position":[[845,4]]},"394":{"position":[[329,4]]},"409":{"position":[[125,5]]},"449":{"position":[[78,4]]}},"keywords":{}}],["needed.initi",{"_index":2019,"title":{},"content":{"273":{"position":[[305,16]]}},"keywords":{}}],["nest",{"_index":523,"title":{},"content":{"35":{"position":[[752,6],[1216,6]]},"88":{"position":[[323,6]]},"264":{"position":[[34,6],[365,6]]},"265":{"position":[[221,6]]},"266":{"position":[[54,4]]},"454":{"position":[[67,6]]}},"keywords":{}}],["nested.consum",{"_index":986,"title":{},"content":{"81":{"position":[[223,16]]}},"keywords":{}}],["nestedmessages[key",{"_index":1945,"title":{},"content":{"264":{"position":[[630,19]]}},"keywords":{}}],["new",{"_index":667,"title":{"328":{"position":[[0,3]]}},"content":{"42":{"position":[[847,4]]},"89":{"position":[[863,3]]},"95":{"position":[[126,3]]},"96":{"position":[[23,3]]},"124":{"position":[[106,3]]},"125":{"position":[[200,3],[383,3]]},"133":{"position":[[949,3]]},"135":{"position":[[178,3]]},"136":{"position":[[157,3],[391,3],[1105,3],[1347,3],[1428,3],[1524,3]]},"138":{"position":[[146,3],[864,3],[946,3]]},"140":{"position":[[65,3],[253,3]]},"141":{"position":[[468,3],[556,3],[642,3],[681,3]]},"142":{"position":[[573,3]]},"250":{"position":[[1642,3]]},"258":{"position":[[263,3]]},"262":{"position":[[665,3]]},"263":{"position":[[181,3],[223,3]]},"267":{"position":[[296,3],[318,3],[495,3]]},"269":{"position":[[3,3]]},"272":{"position":[[95,3]]},"273":{"position":[[97,4]]},"274":{"position":[[244,3]]},"276":{"position":[[73,3],[207,3]]},"326":{"position":[[28,3],[120,3],[200,3]]},"327":{"position":[[66,3]]},"329":{"position":[[100,3]]},"336":{"position":[[15,3]]},"357":{"position":[[654,3]]}},"keywords":{}}],["new_complex_msg",{"_index":1438,"title":{},"content":{"142":{"position":[[210,15]]}},"keywords":{}}],["new_complex_msg_prepars",{"_index":1434,"title":{},"content":{"142":{"position":[[141,25]]}},"keywords":{}}],["new_string_msg",{"_index":1441,"title":{},"content":{"142":{"position":[[268,14]]}},"keywords":{}}],["newer",{"_index":886,"title":{},"content":{"62":{"position":[[192,5]]}},"keywords":{}}],["newest",{"_index":1222,"title":{},"content":{"101":{"position":[[57,6]]}},"keywords":{}}],["newlin",{"_index":2478,"title":{},"content":{"382":{"position":[[36,8],[104,8]]},"432":{"position":[[36,9]]}},"keywords":{}}],["next",{"_index":2137,"title":{},"content":{"297":{"position":[[1139,4],[1159,4],[1225,4]]},"345":{"position":[[1136,4]]}},"keywords":{}}],["node",{"_index":847,"title":{"315":{"position":[[4,4]]},"402":{"position":[[0,4]]}},"content":{"54":{"position":[[130,6]]},"67":{"position":[[124,4],[244,4]]},"129":{"position":[[124,4]]},"131":{"position":[[143,4]]},"212":{"position":[[196,4]]},"244":{"position":[[135,4],[255,4]]},"247":{"position":[[324,4]]},"272":{"position":[[542,4]]},"329":{"position":[[1193,4]]},"342":{"position":[[331,5]]},"343":{"position":[[795,6]]}},"keywords":{}}],["node.j",{"_index":911,"title":{"66":{"position":[[0,8]]},"131":{"position":[[30,8]]},"244":{"position":[[0,8]]}},"content":{"67":{"position":[[15,7],[110,8]]},"123":{"position":[[215,8]]},"244":{"position":[[26,7],[121,8]]},"329":{"position":[[1179,8]]}},"keywords":{}}],["node_env",{"_index":1630,"title":{},"content":{"226":{"position":[[113,8]]},"247":{"position":[[643,8]]},"287":{"position":[[113,8]]},"288":{"position":[[119,8]]},"352":{"position":[[113,8]]}},"keywords":{}}],["node_modul",{"_index":935,"title":{},"content":{"73":{"position":[[344,15]]},"82":{"position":[[483,12]]},"83":{"position":[[343,12]]},"87":{"position":[[333,12]]}},"keywords":{}}],["node_modules/(?!intl",{"_index":1826,"title":{},"content":{"251":{"position":[[99,22]]},"334":{"position":[[99,22]]}},"keywords":{}}],["node_modules/@formatjs/icu",{"_index":1832,"title":{},"content":{"252":{"position":[[250,27]]}},"keywords":{}}],["node_modules/intl",{"_index":1831,"title":{},"content":{"252":{"position":[[193,18]]}},"keywords":{}}],["node_modules/react",{"_index":1830,"title":{},"content":{"252":{"position":[[144,19]]}},"keywords":{}}],["node_modules\\/(?!react",{"_index":1833,"title":{},"content":{"252":{"position":[[354,23]]}},"keywords":{}}],["nodej",{"_index":2238,"title":{},"content":{"318":{"position":[[158,6],[209,6]]},"375":{"position":[[159,6],[210,6]]}},"keywords":{}}],["nodereactvue3",{"_index":305,"title":{},"content":{"20":{"position":[[101,13]]},"48":{"position":[[211,13]]}},"keywords":{}}],["non",{"_index":1721,"title":{},"content":{"239":{"position":[[138,3]]},"297":{"position":[[1230,3]]},"307":{"position":[[138,3]]},"342":{"position":[[301,3]]},"343":{"position":[[773,3]]},"366":{"position":[[138,3]]}},"keywords":{}}],["none",{"_index":1695,"title":{},"content":{"235":{"position":[[281,6]]},"362":{"position":[[281,6]]}},"keywords":{}}],["normal",{"_index":1358,"title":{},"content":{"135":{"position":[[353,10]]},"253":{"position":[[493,8]]}},"keywords":{}}],["normal_msg",{"_index":956,"title":{},"content":{"79":{"position":[[30,10],[163,10]]}},"keywords":{}}],["note",{"_index":445,"title":{},"content":{"31":{"position":[[1013,4]]},"36":{"position":[[1391,4]]},"37":{"position":[[1379,4]]},"131":{"position":[[132,5]]},"320":{"position":[[87,5]]},"377":{"position":[[87,5]]},"409":{"position":[[111,5]]},"426":{"position":[[87,5]]}},"keywords":{}}],["notesg",{"_index":484,"title":{},"content":{"34":{"position":[[261,6]]},"78":{"position":[[206,6]]},"138":{"position":[[537,6]]}},"keywords":{}}],["noth",{"_index":524,"title":{},"content":{"35":{"position":[[816,7]]},"448":{"position":[[257,11]]}},"keywords":{}}],["notic",{"_index":1355,"title":{},"content":{"135":{"position":[[248,6]]},"224":{"position":[[179,6]]},"284":{"position":[[179,6]]},"349":{"position":[[179,6]]},"414":{"position":[[294,6]]}},"keywords":{}}],["notifi",{"_index":1163,"title":{},"content":{"96":{"position":[[170,8]]}},"keywords":{}}],["nou",{"_index":314,"title":{},"content":{"20":{"position":[[350,4],[854,4]]}},"keywords":{}}],["now",{"_index":1101,"title":{"269":{"position":[[27,3]]}},"content":{"90":{"position":[[285,3],[920,3]]},"91":{"position":[[331,3]]},"136":{"position":[[1732,3]]},"138":{"position":[[897,5],[941,4]]},"249":{"position":[[1,3]]},"257":{"position":[[71,3]]},"259":{"position":[[10,3]]},"260":{"position":[[242,3]]},"267":{"position":[[246,3]]},"269":{"position":[[92,3],[198,4],[290,3]]},"270":{"position":[[359,5],[454,4]]},"272":{"position":[[646,3]]},"273":{"position":[[213,3]]},"327":{"position":[[246,3]]},"328":{"position":[[97,3]]},"330":{"position":[[607,3]]},"331":{"position":[[103,3],[1600,5]]},"332":{"position":[[419,3]]},"340":{"position":[[60,3]]},"412":{"position":[[118,3]]},"436":{"position":[[208,5]]}},"keywords":{}}],["now={otherd",{"_index":1984,"title":{},"content":{"269":{"position":[[378,15]]}},"keywords":{}}],["npm",{"_index":301,"title":{},"content":{"19":{"position":[[11,3]]},"22":{"position":[[81,3]]},"23":{"position":[[9,3]]},"24":{"position":[[9,3]]},"25":{"position":[[9,3]]},"26":{"position":[[9,3]]},"41":{"position":[[11,3]]},"42":{"position":[[156,4],[170,3]]},"44":{"position":[[451,3]]},"46":{"position":[[974,4],[990,3]]},"47":{"position":[[394,3]]},"57":{"position":[[11,3]]},"67":{"position":[[223,3]]},"71":{"position":[[11,3]]},"72":{"position":[[9,3]]},"103":{"position":[[11,3]]},"112":{"position":[[11,3]]},"144":{"position":[[11,3]]},"150":{"position":[[11,3]]},"157":{"position":[[11,3]]},"165":{"position":[[11,3]]},"170":{"position":[[11,3]]},"178":{"position":[[11,3]]},"189":{"position":[[11,3]]},"197":{"position":[[11,3]]},"204":{"position":[[11,3]]},"211":{"position":[[11,3]]},"219":{"position":[[11,3]]},"244":{"position":[[234,3]]},"246":{"position":[[24,3],[40,4],[56,3],[93,3]]},"312":{"position":[[11,3]]},"329":{"position":[[1292,3]]},"371":{"position":[[11,3]]},"372":{"position":[[9,3],[234,3]]},"384":{"position":[[129,3]]},"388":{"position":[[178,3]]},"396":{"position":[[217,3]]},"402":{"position":[[68,3]]},"407":{"position":[[11,3]]},"416":{"position":[[11,3]]},"434":{"position":[[11,3]]}},"keywords":{}}],["npmyarn",{"_index":300,"title":{},"content":{"19":{"position":[[3,7]]},"22":{"position":[[73,7]]},"23":{"position":[[1,7]]},"24":{"position":[[1,7]]},"25":{"position":[[1,7]]},"26":{"position":[[1,7]]},"41":{"position":[[3,7]]},"42":{"position":[[162,7]]},"44":{"position":[[443,7]]},"46":{"position":[[982,7]]},"47":{"position":[[386,7]]},"57":{"position":[[3,7]]},"71":{"position":[[3,7]]},"72":{"position":[[1,7]]},"103":{"position":[[3,7]]},"112":{"position":[[3,7]]},"144":{"position":[[3,7]]},"150":{"position":[[3,7]]},"157":{"position":[[3,7]]},"165":{"position":[[3,7]]},"170":{"position":[[3,7]]},"178":{"position":[[3,7]]},"189":{"position":[[3,7]]},"197":{"position":[[3,7]]},"204":{"position":[[3,7]]},"211":{"position":[[3,7]]},"219":{"position":[[3,7]]},"246":{"position":[[48,7]]},"312":{"position":[[3,7]]},"371":{"position":[[3,7]]},"372":{"position":[[1,7]]},"384":{"position":[[121,7]]},"388":{"position":[[170,7]]},"396":{"position":[[209,7]]},"402":{"position":[[60,7]]},"407":{"position":[[3,7]]},"416":{"position":[[3,7]]},"434":{"position":[[3,7]]}},"keywords":{}}],["null",{"_index":1730,"title":{},"content":{"240":{"position":[[64,4]]},"327":{"position":[[462,5],[980,5]]},"367":{"position":[[64,4]]}},"keywords":{}}],["num",{"_index":428,"title":{},"content":{"31":{"position":[[669,5],[961,5],[1122,5],[1259,5]]},"262":{"position":[[569,3],[579,6],[608,5]]}},"keywords":{}}],["number",{"_index":411,"title":{"31":{"position":[[0,6]]}},"content":{"30":{"position":[[362,7]]},"31":{"position":[[29,7],[194,7],[261,7],[505,6],[589,6],[675,7],[895,6],[967,7],[1128,7],[1249,6],[1265,7]]},"34":{"position":[[12,6]]},"35":{"position":[[1290,7]]},"36":{"position":[[199,6],[462,6],[998,6],[1239,6],[1769,6],[1826,7],[2047,7],[2086,7],[2208,7],[2251,7],[2434,8]]},"37":{"position":[[477,6],[995,6],[1227,6],[1899,8]]},"38":{"position":[[263,7],[345,7]]},"60":{"position":[[179,7]]},"125":{"position":[[56,7]]},"127":{"position":[[137,7]]},"129":{"position":[[202,6]]},"138":{"position":[[16,6],[106,6],[192,7]]},"141":{"position":[[710,8],[719,9]]},"223":{"position":[[444,6],[520,6],[604,6],[708,6],[813,7],[908,7],[980,7],[1063,6]]},"229":{"position":[[29,6]]},"230":{"position":[[29,6]]},"231":{"position":[[372,7],[592,7]]},"232":{"position":[[78,7],[195,6],[254,7],[415,6]]},"233":{"position":[[105,7],[408,7]]},"235":{"position":[[334,6]]},"240":{"position":[[45,6]]},"252":{"position":[[476,7]]},"296":{"position":[[378,6],[397,6]]},"297":{"position":[[432,7],[493,7],[1789,6]]},"298":{"position":[[175,7],[320,6],[716,6]]},"299":{"position":[[303,7],[399,7]]},"303":{"position":[[338,6]]},"342":{"position":[[409,6]]},"344":{"position":[[346,6]]},"345":{"position":[[1261,6]]},"348":{"position":[[394,6],[470,6],[554,6],[658,6],[763,7],[858,7],[930,7],[1013,6]]},"355":{"position":[[29,6]]},"356":{"position":[[29,6]]},"357":{"position":[[198,6],[226,6]]},"358":{"position":[[372,7],[592,7]]},"359":{"position":[[78,7],[195,6],[254,7],[415,6]]},"360":{"position":[[105,7],[408,7]]},"362":{"position":[[334,6]]},"367":{"position":[[45,6]]},"443":{"position":[[330,7],[375,7],[389,6],[398,9]]},"449":{"position":[[181,6],[280,7]]},"462":{"position":[[649,8]]}},"keywords":{}}],["number/date/time/plural/select/selectordin",{"_index":2602,"title":{},"content":{"446":{"position":[[65,47]]}},"keywords":{}}],["numberformat",{"_index":1484,"title":{},"content":{"178":{"position":[[32,12]]},"212":{"position":[[250,13]]},"232":{"position":[[467,13]]},"243":{"position":[[676,13]]},"298":{"position":[[768,13]]},"359":{"position":[[467,13]]}},"keywords":{}}],["numberformat)intl.datetimeformat",{"_index":1323,"title":{},"content":{"129":{"position":[[260,32]]}},"keywords":{}}],["numberformat/local",{"_index":1493,"title":{},"content":{"183":{"position":[[70,19]]},"184":{"position":[[363,19]]}},"keywords":{}}],["numberformat/polyfil",{"_index":1492,"title":{},"content":{"183":{"position":[[24,22]]},"184":{"position":[[304,21]]}},"keywords":{}}],["numberformat/should",{"_index":1494,"title":{},"content":{"184":{"position":[[46,19]]}},"keywords":{}}],["numberformatopt",{"_index":1667,"title":{},"content":{"232":{"position":[[298,20]]},"298":{"position":[[140,19]]},"299":{"position":[[364,19]]},"359":{"position":[[298,20]]}},"keywords":{}}],["numcat",{"_index":410,"title":{},"content":{"30":{"position":[[352,9]]},"31":{"position":[[184,9]]}},"keywords":{}}],["numer",{"_index":582,"title":{},"content":{"36":{"position":[[2377,7]]},"37":{"position":[[1843,7]]},"229":{"position":[[360,10],[378,10],[394,10]]},"230":{"position":[[249,10],[268,10]]},"231":{"position":[[270,9]]},"262":{"position":[[832,10],[848,10]]},"294":{"position":[[179,10],[198,10]]},"297":{"position":[[303,9]]},"331":{"position":[[545,7]]},"355":{"position":[[369,10],[387,10],[403,10]]},"356":{"position":[[258,10],[277,10]]},"358":{"position":[[270,9]]}},"keywords":{}}],["numeric="auto"",{"_index":2128,"title":{},"content":{"297":{"position":[[856,24]]},"331":{"position":[[1417,24]]}},"keywords":{}}],["numeric="auto"/>",{"_index":2333,"title":{},"content":{"331":{"position":[[765,29]]}},"keywords":{}}],["numphoto",{"_index":948,"title":{},"content":{"77":{"position":[[138,11]]},"125":{"position":[[223,12],[406,12]]}},"keywords":{}}],["object",{"_index":250,"title":{"84":{"position":[[18,7]]},"220":{"position":[[9,7]]},"264":{"position":[[17,7]]},"343":{"position":[[9,7]]},"452":{"position":[[21,7]]}},"content":{"14":{"position":[[259,6]]},"15":{"position":[[278,6]]},"84":{"position":[[44,7]]},"124":{"position":[[85,7]]},"129":{"position":[[43,6]]},"133":{"position":[[561,6],[579,6]]},"135":{"position":[[24,6]]},"141":{"position":[[165,8]]},"220":{"position":[[40,6],[197,6],[322,6],[364,6]]},"221":{"position":[[40,6]]},"223":{"position":[[1883,6]]},"238":{"position":[[559,6]]},"240":{"position":[[539,6]]},"241":{"position":[[66,6],[555,6]]},"253":{"position":[[476,6]]},"263":{"position":[[343,6]]},"264":{"position":[[50,8],[381,6],[448,6],[1024,6]]},"265":{"position":[[237,7],[309,7]]},"267":{"position":[[398,7]]},"291":{"position":[[47,6]]},"304":{"position":[[148,7]]},"315":{"position":[[80,6]]},"336":{"position":[[80,6],[199,7],[676,6]]},"340":{"position":[[115,6]]},"343":{"position":[[36,6],[193,6],[318,6],[360,6],[469,7],[563,6],[872,6]]},"346":{"position":[[40,6],[159,7]]},"348":{"position":[[1967,6]]},"365":{"position":[[559,6]]},"367":{"position":[[539,6]]},"368":{"position":[[66,6],[551,6]]},"446":{"position":[[161,6]]},"452":{"position":[[46,6],[172,6],[1053,6],[1235,8],[1263,6]]}},"keywords":{}}],["object.assign(messag",{"_index":1949,"title":{},"content":{"264":{"position":[[774,23]]}},"keywords":{}}],["object.entries(msg",{"_index":740,"title":{},"content":{"44":{"position":[[713,21]]},"47":{"position":[[592,21]]}},"keywords":{}}],["object.keys(nestedmessages).reduce((messag",{"_index":1944,"title":{},"content":{"264":{"position":[[559,45]]}},"keywords":{}}],["object.keys(reactintllocaledata).foreach(lang",{"_index":1896,"title":{},"content":{"259":{"position":[[497,45],[734,45]]}},"keywords":{}}],["obviou",{"_index":639,"title":{},"content":{"39":{"position":[[729,8]]}},"keywords":{}}],["offici",{"_index":910,"title":{},"content":{"65":{"position":[[693,10]]},"97":{"position":[[84,8]]},"101":{"position":[[187,8]]},"328":{"position":[[737,8]]},"344":{"position":[[759,8]]}},"keywords":{}}],["offset",{"_index":2583,"title":{"455":{"position":[[3,7]]}},"content":{"434":{"position":[[205,8]]},"455":{"position":[[26,6],[73,6]]}},"keywords":{}}],["offset"",{"_index":857,"title":{},"content":{"57":{"position":[[167,13]]}},"keywords":{}}],["offset:1",{"_index":2571,"title":{},"content":{"414":{"position":[[222,8],[560,8]]},"455":{"position":[[356,8]]},"456":{"position":[[425,8],[509,8]]}},"keywords":{}}],["ok",{"_index":1152,"title":{},"content":{"94":{"position":[[328,2],[382,2]]}},"keywords":{}}],["old",{"_index":2030,"title":{},"content":{"274":{"position":[[25,3],[151,3]]},"325":{"position":[[334,3]]}},"keywords":{}}],["older",{"_index":884,"title":{},"content":{"62":{"position":[[157,5]]},"65":{"position":[[113,5]]},"87":{"position":[[58,5]]},"243":{"position":[[487,5]]},"329":{"position":[[506,5]]}},"keywords":{}}],["omit<p",{"_index":2433,"title":{},"content":{"345":{"position":[[139,10]]}},"keywords":{}}],["on",{"_index":143,"title":{"449":{"position":[[22,3]]}},"content":{"5":{"position":[[179,3]]},"35":{"position":[[76,3],[256,3]]},"36":{"position":[[290,3],[601,3],[1355,3],[1682,4],[1687,3],[2024,3],[2182,3],[2536,3]]},"37":{"position":[[305,3],[616,3],[1343,3],[1957,3]]},"39":{"position":[[490,3],[547,3]]},"76":{"position":[[101,5]]},"77":{"position":[[177,4]]},"101":{"position":[[0,3]]},"125":{"position":[[282,3]]},"126":{"position":[[153,3]]},"133":{"position":[[465,3]]},"233":{"position":[[160,5],[861,3]]},"237":{"position":[[363,3]]},"300":{"position":[[214,4],[429,4]]},"305":{"position":[[363,3]]},"326":{"position":[[172,6]]},"360":{"position":[[160,5],[861,3]]},"364":{"position":[[363,3]]},"394":{"position":[[75,3]]},"399":{"position":[[76,3]]},"414":{"position":[[231,3],[569,3]]},"447":{"position":[[251,3],[257,6],[474,4]]},"449":{"position":[[41,3],[116,3],[155,3],[274,3]]},"457":{"position":[[311,3]]},"462":{"position":[[128,3],[191,3],[257,3],[336,3],[421,3],[519,3]]}},"keywords":{}}],["onc",{"_index":1360,"title":{},"content":{"136":{"position":[[1,4]]},"343":{"position":[[492,4]]},"437":{"position":[[59,4]]}},"keywords":{}}],["one="message"",{"_index":2169,"title":{},"content":{"300":{"position":[[714,23]]}},"keywords":{}}],["onerror",{"_index":1627,"title":{"226":{"position":[[0,8]]},"287":{"position":[[0,8]]},"352":{"position":[[0,8]]}},"content":{},"keywords":{}}],["onerror(err",{"_index":1580,"title":{},"content":{"223":{"position":[[340,12]]},"283":{"position":[[1176,12]]},"348":{"position":[[290,12]]}},"keywords":{}}],["one{a",{"_index":2482,"title":{},"content":{"383":{"position":[[102,5]]},"459":{"position":[[194,5]]}},"keywords":{}}],["one{i",{"_index":2484,"title":{},"content":{"383":{"position":[[158,5]]}},"keywords":{}}],["one{on",{"_index":2597,"title":{},"content":{"443":{"position":[[708,8],[816,8]]},"454":{"position":[[288,11],[349,9]]},"455":{"position":[[281,8],[365,8]]},"456":{"position":[[333,8],[434,8],[518,8]]}},"keywords":{}}],["one{two",{"_index":2687,"title":{},"content":{"454":{"position":[[372,11],[455,13]]}},"keywords":{}}],["one{{p2",{"_index":2689,"title":{},"content":{"454":{"position":[[438,8]]}},"keywords":{}}],["onmetaextracted(filepath",{"_index":2577,"title":{"431":{"position":[[0,25]]}},"content":{},"keywords":{}}],["onmsgextracted(filepath",{"_index":2576,"title":{"430":{"position":[[0,24]]}},"content":{},"keywords":{}}],["onwarn",{"_index":2075,"title":{"288":{"position":[[0,7]]}},"content":{},"keywords":{}}],["onwarn(warn",{"_index":1582,"title":{},"content":{"223":{"position":[[367,15]]},"348":{"position":[[317,15]]}},"keywords":{}}],["open",{"_index":1034,"title":{},"content":{"83":{"position":[[748,4]]}},"keywords":{}}],["oper",{"_index":2520,"title":{},"content":{"394":{"position":[[54,10]]}},"keywords":{}}],["ops/sec",{"_index":964,"title":{},"content":{"79":{"position":[[130,7],[184,7],[240,7],[296,7]]},"142":{"position":[[37,7],[108,7],[177,7],[235,7],[293,7],[354,7],[429,7],[515,7],[605,7]]}},"keywords":{}}],["opt",{"_index":1295,"title":{},"content":{"124":{"position":[[157,7]]},"133":{"position":[[631,6]]},"141":{"position":[[179,4],[456,5],[498,5],[544,5],[588,5],[630,5],[671,7]]},"223":{"position":[[468,6],[544,6],[628,6],[732,6],[845,6],[916,6],[988,6],[1080,6],[1472,6],[1551,6],[1667,6],[1735,6]]},"273":{"position":[[650,3]]},"348":{"position":[[418,6],[494,6],[578,6],[682,6],[795,6],[866,6],[938,6],[1030,6],[1422,6],[1501,6],[1617,6],[1685,6]]}},"keywords":{}}],["optim",{"_index":1297,"title":{},"content":{"124":{"position":[[247,9]]},"127":{"position":[[236,9]]},"308":{"position":[[794,10]]}},"keywords":{}}],["option",{"_index":60,"title":{"316":{"position":[[0,8]]},"422":{"position":[[0,8]]}},"content":{"2":{"position":[[294,9]]},"23":{"position":[[200,8]]},"30":{"position":[[193,9],[258,9]]},"31":{"position":[[123,8]]},"32":{"position":[[121,8]]},"33":{"position":[[121,8]]},"73":{"position":[[199,8]]},"93":{"position":[[413,9]]},"100":{"position":[[238,6]]},"119":{"position":[[284,6]]},"133":{"position":[[570,8],[604,7],[689,8],[698,8]]},"135":{"position":[[40,7]]},"138":{"position":[[273,7]]},"221":{"position":[[166,8]]},"228":{"position":[[33,6]]},"229":{"position":[[44,9],[264,7]]},"230":{"position":[[44,9],[231,8],[379,7]]},"231":{"position":[[392,9],[611,7]]},"232":{"position":[[38,8],[86,9],[274,7]]},"233":{"position":[[113,9],[428,7]]},"234":{"position":[[308,9]]},"235":{"position":[[374,8]]},"270":{"position":[[163,8],[231,7]]},"291":{"position":[[208,8]]},"292":{"position":[[609,8]]},"297":{"position":[[258,8]]},"320":{"position":[[223,6]]},"322":{"position":[[311,6]]},"327":{"position":[[48,6],[151,6]]},"336":{"position":[[304,8]]},"344":{"position":[[137,6]]},"345":{"position":[[432,9]]},"346":{"position":[[264,8]]},"355":{"position":[[53,9],[273,7]]},"356":{"position":[[53,9],[240,8],[388,7]]},"357":{"position":[[250,9],[547,7]]},"358":{"position":[[392,9],[611,7]]},"359":{"position":[[38,8],[86,9],[274,7]]},"360":{"position":[[113,9],[428,7]]},"361":{"position":[[308,9]]},"362":{"position":[[374,9]]},"372":{"position":[[61,9]]},"377":{"position":[[222,6]]},"381":{"position":[[311,6]]},"384":{"position":[[153,9]]},"396":{"position":[[249,9]]},"401":{"position":[[151,10],[280,10],[411,10]]},"418":{"position":[[156,8]]},"419":{"position":[[203,8],[217,7]]},"426":{"position":[[223,6]]},"428":{"position":[[311,6]]},"444":{"position":[[300,8]]},"445":{"position":[[416,8]]},"446":{"position":[[1126,8]]},"450":{"position":[[575,6],[738,6]]},"452":{"position":[[238,7]]},"456":{"position":[[552,8]]},"459":{"position":[[414,8]]}},"keywords":{}}],["options.intlpropnam",{"_index":2446,"title":{},"content":{"345":{"position":[[1050,21]]}},"keywords":{}}],["options={opt",{"_index":2678,"title":{},"content":{"452":{"position":[[918,19]]}},"keywords":{}}],["opts<intlpropname>",{"_index":2442,"title":{},"content":{"345":{"position":[[442,24]]}},"keywords":{}}],["order",{"_index":89,"title":{},"content":{"3":{"position":[[109,5]]},"69":{"position":[[134,7]]},"71":{"position":[[324,5]]},"72":{"position":[[76,5]]},"100":{"position":[[4,5]]},"107":{"position":[[165,5]]},"115":{"position":[[167,5]]},"136":{"position":[[1294,5]]},"173":{"position":[[163,5]]},"182":{"position":[[165,5]]},"192":{"position":[[164,5]]},"214":{"position":[[171,5]]},"250":{"position":[[543,5]]},"252":{"position":[[1162,5]]},"253":{"position":[[183,5]]},"262":{"position":[[255,5]]},"273":{"position":[[610,5]]},"274":{"position":[[4,5]]},"325":{"position":[[316,5]]},"332":{"position":[[11,5]]},"337":{"position":[[74,5]]},"345":{"position":[[640,5]]},"393":{"position":[[673,5]]},"401":{"position":[[454,5]]},"414":{"position":[[393,5]]}},"keywords":{}}],["ordin",{"_index":586,"title":{},"content":{"37":{"position":[[73,7],[232,7]]},"233":{"position":[[50,9],[682,11],[745,11]]},"360":{"position":[[50,9],[682,11],[745,11]]}},"keywords":{}}],["org",{"_index":1032,"title":{},"content":{"83":{"position":[[653,3]]}},"keywords":{}}],["organ",{"_index":118,"title":{},"content":{"4":{"position":[[17,8]]}},"keywords":{}}],["origin",{"_index":2014,"title":{},"content":{"273":{"position":[[56,10]]},"393":{"position":[[238,8]]}},"keywords":{}}],["other="messages"",{"_index":2170,"title":{},"content":{"300":{"position":[[738,26]]}},"keywords":{}}],["otherconfig",{"_index":365,"title":{},"content":{"23":{"position":[[115,16]]},"418":{"position":[[71,16]]}},"keywords":{}}],["otherd",{"_index":2000,"title":{},"content":{"270":{"position":[[365,11],[459,10]]}},"keywords":{}}],["otherwis",{"_index":1735,"title":{},"content":{"240":{"position":[[723,9]]},"367":{"position":[[723,9]]}},"keywords":{}}],["other{i",{"_index":2485,"title":{},"content":{"383":{"position":[[176,7]]}},"keywords":{}}],["other{mani",{"_index":2483,"title":{},"content":{"383":{"position":[[113,10]]},"459":{"position":[[205,10]]}},"keywords":{}}],["other{oth",{"_index":2692,"title":{},"content":{"455":{"position":[[290,15],[374,15]]},"456":{"position":[[342,15],[443,15],[527,15]]}},"keywords":{}}],["other{two",{"_index":2598,"title":{},"content":{"443":{"position":[[717,11],[825,11]]}},"keywords":{}}],["ounc",{"_index":1502,"title":{},"content":{"186":{"position":[[175,6],[463,7]]}},"keywords":{}}],["out",{"_index":650,"title":{"374":{"position":[[2,3]]},"390":{"position":[[2,3]]}},"content":{"42":{"position":[[227,3]]},"44":{"position":[[506,3]]},"46":{"position":[[1030,3]]},"47":{"position":[[434,3]]},"58":{"position":[[180,3]]},"83":{"position":[[201,3]]},"95":{"position":[[148,3]]},"140":{"position":[[115,3],[310,3]]},"141":{"position":[[793,3]]},"322":{"position":[[364,3]]},"338":{"position":[[379,3],[481,3]]},"372":{"position":[[289,3]]},"373":{"position":[[70,3]]},"381":{"position":[[363,3]]},"393":{"position":[[1010,3],[1140,3]]},"394":{"position":[[131,3],[479,3]]},"428":{"position":[[364,3]]}},"keywords":{}}],["output",{"_index":338,"title":{"390":{"position":[[11,9]]}},"content":{"20":{"position":[[824,6]]},"35":{"position":[[46,6],[293,6],[448,9],[644,6],[666,6]]},"36":{"position":[[46,6],[2299,6]]},"37":{"position":[[53,6],[1765,6]]},"38":{"position":[[604,6]]},"81":{"position":[[537,6]]},"82":{"position":[[697,6],[899,6]]},"83":{"position":[[76,6]]},"96":{"position":[[146,6],[236,7]]},"124":{"position":[[348,6]]},"127":{"position":[[448,7],[491,6]]},"233":{"position":[[508,6]]},"289":{"position":[[40,6],[157,6]]},"310":{"position":[[753,7]]},"353":{"position":[[40,6],[157,6]]},"360":{"position":[[508,6]]},"374":{"position":[[44,6]]},"382":{"position":[[48,7]]},"396":{"position":[[379,6]]},"399":{"position":[[138,6]]}},"keywords":{}}],["outsid",{"_index":1975,"title":{},"content":{"268":{"position":[[170,7]]},"336":{"position":[[144,7]]},"340":{"position":[[122,7]]},"346":{"position":[[104,7]]}},"keywords":{}}],["over",{"_index":438,"title":{},"content":{"31":{"position":[[801,4]]},"55":{"position":[[6,4]]},"57":{"position":[[210,4]]},"250":{"position":[[231,4]]},"273":{"position":[[141,4]]},"282":{"position":[[147,4],[415,4]]},"369":{"position":[[34,4]]}},"keywords":{}}],["overlay",{"_index":2229,"title":{},"content":{"310":{"position":[[858,8]]},"332":{"position":[[1293,10]]}},"keywords":{}}],["overrid",{"_index":1202,"title":{},"content":{"100":{"position":[[763,8]]},"253":{"position":[[201,8],[643,8]]},"317":{"position":[[129,8]]},"423":{"position":[[129,8]]},"451":{"position":[[1640,8]]}},"keywords":{}}],["overridden",{"_index":2445,"title":{},"content":{"345":{"position":[[1023,10]]}},"keywords":{}}],["overrideidfn",{"_index":371,"title":{"317":{"position":[[0,13]]},"423":{"position":[[0,13]]}},"content":{"23":{"position":[[268,13]]},"26":{"position":[[276,13]]},"73":{"position":[[267,13]]},"418":{"position":[[224,13]]},"419":{"position":[[225,13]]},"421":{"position":[[232,13]]},"423":{"position":[[208,12]]}},"keywords":{}}],["overview",{"_index":38,"title":{"75":{"position":[[0,9]]},"122":{"position":[[0,9]]},"242":{"position":[[0,8]]}},"content":{"1":{"position":[[532,9]]}},"keywords":{}}],["p",{"_index":874,"title":{},"content":{"60":{"position":[[175,3]]},"345":{"position":[[290,1]]},"410":{"position":[[400,4]]}},"keywords":{}}],["p1",{"_index":2685,"title":{},"content":{"454":{"position":[[274,5],[335,5],[424,5]]}},"keywords":{}}],["p2",{"_index":2686,"title":{},"content":{"454":{"position":[[359,4]]}},"keywords":{}}],["packag",{"_index":909,"title":{"246":{"position":[[15,8]]}},"content":{"65":{"position":[[680,8]]},"67":{"position":[[227,7]]},"75":{"position":[[6,7]]},"88":{"position":[[33,7]]},"113":{"position":[[6,7]]},"123":{"position":[[6,7],[170,7],[431,7]]},"125":{"position":[[94,7]]},"126":{"position":[[30,7],[211,7]]},"129":{"position":[[6,7]]},"179":{"position":[[6,7]]},"212":{"position":[[6,7]]},"241":{"position":[[360,7]]},"243":{"position":[[454,8]]},"244":{"position":[[238,7]]},"246":{"position":[[28,7],[97,7]]},"306":{"position":[[690,8]]},"313":{"position":[[289,8]]},"328":{"position":[[605,8]]},"329":{"position":[[251,8],[408,7],[442,8],[1296,7]]},"330":{"position":[[640,8]]},"344":{"position":[[627,8]]},"345":{"position":[[618,7]]},"348":{"position":[[1837,7]]},"368":{"position":[[356,7]]},"417":{"position":[[221,8]]}},"keywords":{}}],["package.(opt",{"_index":902,"title":{},"content":{"65":{"position":[[404,18],[546,18]]},"243":{"position":[[320,18]]}},"keywords":{}}],["package.intl.relativetimeformat",{"_index":1750,"title":{},"content":{"243":{"position":[[253,32]]},"329":{"position":[[184,32]]}},"keywords":{}}],["package.json",{"_index":162,"title":{"82":{"position":[[13,13]]}},"content":{"7":{"position":[[103,12]]},"10":{"position":[[145,12]]},"42":{"position":[[35,12]]},"46":{"position":[[853,12]]},"81":{"position":[[500,12]]},"82":{"position":[[508,12],[770,13]]},"83":{"position":[[33,13]]},"246":{"position":[[214,13],[295,13]]},"247":{"position":[[181,12],[492,12]]},"371":{"position":[[70,12]]},"393":{"position":[[780,12]]}},"keywords":{}}],["page",{"_index":130,"title":{},"content":{"4":{"position":[[327,4]]},"100":{"position":[[270,5]]}},"keywords":{}}],["panel",{"_index":680,"title":{},"content":{"42":{"position":[[1314,5],[1817,5]]},"46":{"position":[[273,5]]},"395":{"position":[[367,5]]}},"keywords":{}}],["panel"",{"_index":678,"title":{},"content":{"42":{"position":[[1267,11],[1756,12]]},"395":{"position":[[306,12]]}},"keywords":{}}],["parallel",{"_index":1267,"title":{},"content":{"117":{"position":[[341,11]]}},"keywords":{}}],["paramet",{"_index":1334,"title":{},"content":{"133":{"position":[[99,11]]},"310":{"position":[[161,10]]},"331":{"position":[[1823,10]]}},"keywords":{}}],["paramount",{"_index":1710,"title":{},"content":{"237":{"position":[[32,9]]},"305":{"position":[[32,9]]},"364":{"position":[[32,9]]}},"keywords":{}}],["parent",{"_index":1620,"title":{},"content":{"223":{"position":[[1989,6]]},"327":{"position":[[605,6],[1126,6]]},"348":{"position":[[2122,6]]}},"keywords":{}}],["pariti",{"_index":2226,"title":{},"content":{"310":{"position":[[781,6]]},"332":{"position":[[1224,6]]}},"keywords":{}}],["pars",{"_index":777,"title":{},"content":{"46":{"position":[[1063,7],[1162,7]]},"50":{"position":[[166,7]]},"75":{"position":[[53,6]]},"76":{"position":[[8,7]]},"124":{"position":[[74,6],[189,7]]},"133":{"position":[[159,6],[841,7]]},"140":{"position":[[21,6],[203,7]]},"229":{"position":[[200,6]]},"230":{"position":[[315,6]]},"232":{"position":[[242,6]]},"233":{"position":[[396,6]]},"322":{"position":[[1,5],[358,5]]},"323":{"position":[[5,5]]},"355":{"position":[[209,6]]},"356":{"position":[[324,6]]},"357":{"position":[[432,6]]},"359":{"position":[[242,6]]},"360":{"position":[[396,6]]},"381":{"position":[[1,5],[357,5]]},"399":{"position":[[68,7]]},"414":{"position":[[354,7]]},"428":{"position":[[1,5],[358,5]]},"429":{"position":[[5,5]]}},"keywords":{}}],["parse(`thi",{"_index":938,"title":{},"content":{"76":{"position":[[70,11]]}},"keywords":{}}],["parser",{"_index":830,"title":{"51":{"position":[[19,6]]},"74":{"position":[[18,6]]}},"content":{"51":{"position":[[131,6],[179,6]]},"52":{"position":[[75,8],[123,8]]},"53":{"position":[[126,8],[174,8]]},"75":{"position":[[27,6]]},"76":{"position":[[50,7]]},"78":{"position":[[147,6]]},"138":{"position":[[478,6]]},"140":{"position":[[245,7],[512,6]]},"250":{"position":[[2137,7]]},"252":{"position":[[292,9],[431,9]]},"333":{"position":[[61,7]]},"337":{"position":[[21,6]]}},"keywords":{}}],["parser"",{"_index":2389,"title":{},"content":{"335":{"position":[[265,14]]}},"keywords":{}}],["parser'",{"_index":822,"title":{},"content":{"50":{"position":[[549,8]]}},"keywords":{}}],["parser).+\\\\.j",{"_index":1828,"title":{},"content":{"251":{"position":[[164,17]]},"334":{"position":[[155,17]]}},"keywords":{}}],["parser/no",{"_index":837,"title":{},"content":{"51":{"position":[[169,9]]},"52":{"position":[[113,9]]},"53":{"position":[[164,9]]}},"keywords":{}}],["part",{"_index":14,"title":{},"content":{"1":{"position":[[124,5]]},"2":{"position":[[190,5],[232,4],[304,4]]},"38":{"position":[[582,4]]},"223":{"position":[[1694,6],[1926,6]]},"232":{"position":[[452,4]]},"293":{"position":[[280,5],[323,5],[434,7],[637,6]]},"295":{"position":[[280,5],[323,5],[434,7],[564,6]]},"298":{"position":[[753,4]]},"299":{"position":[[280,5],[325,5],[433,7],[554,6]]},"302":{"position":[[507,6]]},"309":{"position":[[559,4]]},"332":{"position":[[906,4]]},"348":{"position":[[1644,6],[2059,6]]},"359":{"position":[[452,4]]}},"keywords":{}}],["parti",{"_index":202,"title":{},"content":{"10":{"position":[[287,5]]},"44":{"position":[[895,5]]},"400":{"position":[[68,5]]}},"keywords":{}}],["particular",{"_index":1681,"title":{},"content":{"233":{"position":[[567,10]]},"360":{"position":[[567,10]]}},"keywords":{}}],["parts[1].valu",{"_index":2105,"title":{},"content":{"293":{"position":[[697,16]]},"295":{"position":[[624,16]]},"299":{"position":[[614,16]]},"302":{"position":[[567,16]]}},"keywords":{}}],["parts[3].valu",{"_index":2182,"title":{},"content":{"302":{"position":[[628,16]]}},"keywords":{}}],["pass",{"_index":150,"title":{"84":{"position":[[0,7]]},"140":{"position":[[0,7]]}},"content":{"5":{"position":[[351,7]]},"31":{"position":[[431,6]]},"32":{"position":[[603,6]]},"33":{"position":[[561,6]]},"50":{"position":[[88,4]]},"59":{"position":[[94,7]]},"84":{"position":[[289,4],[596,7]]},"93":{"position":[[373,4]]},"119":{"position":[[267,4]]},"134":{"position":[[128,6]]},"136":{"position":[[112,7]]},"140":{"position":[[9,4]]},"141":{"position":[[102,4],[198,7]]},"223":{"position":[[1964,6]]},"232":{"position":[[552,4]]},"238":{"position":[[112,6]]},"239":{"position":[[281,6]]},"240":{"position":[[644,6]]},"241":{"position":[[569,6]]},"250":{"position":[[591,6]]},"253":{"position":[[502,4]]},"264":{"position":[[112,6]]},"291":{"position":[[374,4]]},"292":{"position":[[477,4]]},"294":{"position":[[535,4]]},"296":{"position":[[670,4]]},"297":{"position":[[767,4]]},"298":{"position":[[454,4],[849,4]]},"300":{"position":[[630,4]]},"307":{"position":[[281,6]]},"308":{"position":[[248,4]]},"332":{"position":[[1338,4]]},"336":{"position":[[513,4]]},"345":{"position":[[688,6]]},"346":{"position":[[473,4]]},"348":{"position":[[2097,6]]},"359":{"position":[[548,4]]},"365":{"position":[[112,6]]},"366":{"position":[[281,6]]},"367":{"position":[[644,6]]},"368":{"position":[[565,6]]},"446":{"position":[[27,6],[140,6],[691,6],[837,6]]},"455":{"position":[[238,4]]},"456":{"position":[[277,4]]}},"keywords":{}}],["passe"",{"_index":773,"title":{},"content":{"46":{"position":[[513,12],[664,12]]}},"keywords":{}}],["password",{"_index":668,"title":{},"content":{"42":{"position":[[852,10],[994,10]]}},"keywords":{}}],["password"",{"_index":703,"title":{},"content":{"42":{"position":[[2034,15],[2176,15]]},"395":{"position":[[584,15],[726,15]]}},"keywords":{}}],["passwordchang",{"_index":672,"title":{},"content":{"42":{"position":[[1072,14]]}},"keywords":{}}],["passwordchangewithintl",{"_index":660,"title":{},"content":{"42":{"position":[[681,22]]}},"keywords":{}}],["patch",{"_index":350,"title":{"25":{"position":[[3,6]]},"420":{"position":[[7,6]]}},"content":{"21":{"position":[[84,5]]},"72":{"position":[[144,6]]}},"keywords":{}}],["path",{"_index":2466,"title":{"373":{"position":[[9,7]]},"374":{"position":[[11,7]]},"389":{"position":[[9,7]]},"397":{"position":[[9,7]]}},"content":{"373":{"position":[[1,4]]},"374":{"position":[[17,4]]},"379":{"position":[[14,5]]},"389":{"position":[[1,4]]},"397":{"position":[[1,4]]},"419":{"position":[[149,5]]}},"keywords":{}}],["path.join(__dirnam",{"_index":1829,"title":{},"content":{"252":{"position":[[123,20],[172,20],[229,20]]},"335":{"position":[[80,20],[139,20],[206,20]]}},"keywords":{}}],["pattern",{"_index":479,"title":{"375":{"position":[[19,7],[27,10]]}},"content":{"34":{"position":[[93,7],[236,8]]},"42":{"position":[[268,7],[327,7],[350,7]]},"44":{"position":[[547,7]]},"78":{"position":[[30,7],[181,8]]},"133":{"position":[[197,8]]},"136":{"position":[[315,7]]},"138":{"position":[[361,7],[512,8]]},"187":{"position":[[147,7]]},"249":{"position":[[129,7]]},"250":{"position":[[775,7]]},"266":{"position":[[11,7]]},"283":{"position":[[30,7]]},"318":{"position":[[52,7]]},"345":{"position":[[872,7]]},"372":{"position":[[366,7]]},"375":{"position":[[52,7]]},"393":{"position":[[1058,7]]},"394":{"position":[[179,7]]},"451":{"position":[[1459,7]]},"456":{"position":[[793,7]]}},"keywords":{}}],["pattern_syntax",{"_index":518,"title":{},"content":{"35":{"position":[[350,15]]}},"keywords":{}}],["paucal",{"_index":558,"title":{},"content":{"36":{"position":[[1005,8]]}},"keywords":{}}],["pay",{"_index":810,"title":{},"content":{"50":{"position":[[313,3]]}},"keywords":{}}],["payment_",{"_index":2699,"title":{},"content":{"456":{"position":[[980,13],[1034,9]]}},"keywords":{}}],["pctblack",{"_index":416,"title":{},"content":{"31":{"position":[[250,10]]}},"keywords":{}}],["peer",{"_index":1875,"title":{},"content":{"257":{"position":[[21,4]]}},"keywords":{}}],["peopl",{"_index":9,"title":{},"content":{"1":{"position":[[75,6],[207,6]]},"123":{"position":[[130,6]]},"445":{"position":[[172,6]]},"450":{"position":[[549,8],[650,8],[712,8],[813,8]]},"453":{"position":[[342,8],[401,8]]}},"keywords":{}}],["per",{"_index":527,"title":{},"content":{"35":{"position":[[956,3]]},"36":{"position":[[1909,3]]},"37":{"position":[[1668,3]]},"141":{"position":[[257,3]]},"187":{"position":[[19,3],[89,3]]}},"keywords":{}}],["percent",{"_index":417,"title":{},"content":{"31":{"position":[[269,10]]},"35":{"position":[[1298,8]]},"38":{"position":[[353,10]]},"186":{"position":[[473,9]]}},"keywords":{}}],["perf",{"_index":2254,"title":{},"content":{"323":{"position":[[54,5]]},"429":{"position":[[54,5]]}},"keywords":{}}],["perform",{"_index":779,"title":{},"content":{"46":{"position":[[1216,11]]},"140":{"position":[[333,11]]},"194":{"position":[[242,12]]},"220":{"position":[[412,12]]},"222":{"position":[[119,11]]},"253":{"position":[[896,11]]},"306":{"position":[[790,12]]},"342":{"position":[[377,11]]},"343":{"position":[[408,12]]},"347":{"position":[[119,11]]},"394":{"position":[[65,9]]}},"keywords":{}}],["performance.ignoretag",{"_index":1343,"title":{},"content":{"133":{"position":[[758,22]]}},"keywords":{}}],["person",{"_index":2362,"title":{},"content":{"332":{"position":[[1021,7]]}},"keywords":{}}],["person'",{"_index":1300,"title":{},"content":{"125":{"position":[[164,8]]}},"keywords":{}}],["petabyt",{"_index":1522,"title":{},"content":{"186":{"position":[[485,10]]}},"keywords":{}}],["phase",{"_index":2058,"title":{},"content":{"280":{"position":[[191,6]]}},"keywords":{}}],["photo",{"_index":949,"title":{},"content":{"77":{"position":[[165,8],[182,7],[199,8]]},"125":{"position":[[260,8],[286,7],[312,8]]}},"keywords":{}}],["php",{"_index":114,"title":{},"content":{"3":{"position":[[585,3]]}},"keywords":{}}],["phrase",{"_index":755,"title":{},"content":{"44":{"position":[[1117,6]]},"400":{"position":[[251,6]]}},"keywords":{}}],["picomatch",{"_index":2651,"title":{},"content":{"451":{"position":[[1438,9]]}},"keywords":{}}],["pipelin",{"_index":206,"title":{"11":{"position":[[0,9]]}},"content":{"11":{"position":[[23,8]]},"12":{"position":[[69,9]]},"48":{"position":[[53,9],[170,8]]},"456":{"position":[[67,9]]}},"keywords":{}}],["pipeline.declar",{"_index":992,"title":{},"content":{"81":{"position":[[412,18]]}},"keywords":{}}],["place",{"_index":398,"title":{},"content":{"29":{"position":[[34,7]]},"31":{"position":[[913,6]]},"36":{"position":[[1673,5]]},"63":{"position":[[359,6]]},"123":{"position":[[300,6]]},"262":{"position":[[157,6]]},"462":{"position":[[461,6],[563,6]]}},"keywords":{}}],["placehold",{"_index":294,"title":{"339":{"position":[[0,11]]},"446":{"position":[[8,13]]},"449":{"position":[[26,13]]}},"content":{"17":{"position":[[780,12]]},"36":{"position":[[2357,11]]},"37":{"position":[[1823,11]]},"38":{"position":[[526,12]]},"42":{"position":[[876,12],[1018,12]]},"59":{"position":[[56,11]]},"136":{"position":[[243,12],[941,11],[1639,13]]},"240":{"position":[[569,12],[1961,13]]},"267":{"position":[[161,12],[362,11]]},"272":{"position":[[292,13]]},"308":{"position":[[716,13]]},"332":{"position":[[980,11],[1111,11],[1366,11]]},"339":{"position":[[1,11],[59,12]]},"367":{"position":[[569,12],[1961,13]]},"443":{"position":[[248,12],[283,14],[360,14],[439,14],[512,14]]},"446":{"position":[[52,12],[381,14],[399,13],[633,14],[670,13],[816,13],[895,14],[1098,14],[1252,14],[1337,11]]},"448":{"position":[[16,12]]},"451":{"position":[[2021,11]]}},"keywords":{}}],["placeholder={intl.formatmessag",{"_index":666,"title":{},"content":{"42":{"position":[[797,33],[916,33]]}},"keywords":{}}],["placeholder_var",{"_index":2404,"title":{},"content":{"339":{"position":[[102,17]]}},"keywords":{}}],["placeholder|titl",{"_index":2660,"title":{},"content":{"451":{"position":[[2102,23]]}},"keywords":{}}],["placeholder}"",{"_index":2604,"title":{},"content":{"446":{"position":[[258,19],[516,19],[753,19],[991,19]]}},"keywords":{}}],["placeholder}.al",{"_index":1379,"title":{},"content":{"136":{"position":[[958,17]]}},"keywords":{}}],["plan",{"_index":1656,"title":{},"content":{"231":{"position":[[121,4]]},"234":{"position":[[113,4]]},"235":{"position":[[115,4]]},"293":{"position":[[138,4]]},"295":{"position":[[138,4]]},"296":{"position":[[155,4]]},"297":{"position":[[121,4]]},"299":{"position":[[136,4]]},"301":{"position":[[113,4]]},"302":{"position":[[113,4]]},"303":{"position":[[115,4]]},"357":{"position":[[139,4]]},"358":{"position":[[121,4]]},"361":{"position":[[113,4]]},"362":{"position":[[115,4]]}},"keywords":{}}],["planet",{"_index":1862,"title":{},"content":{"253":{"position":[[602,7]]}},"keywords":{}}],["platform",{"_index":115,"title":{},"content":{"3":{"position":[[607,10]]},"140":{"position":[[400,9]]},"154":{"position":[[119,8]]},"162":{"position":[[106,8]]},"201":{"position":[[110,8]]},"450":{"position":[[384,8]]}},"keywords":{}}],["pleas",{"_index":721,"title":{},"content":{"43":{"position":[[183,6]]},"136":{"position":[[918,6]]},"231":{"position":[[90,6]]},"234":{"position":[[82,6]]},"235":{"position":[[84,6]]},"293":{"position":[[107,6]]},"295":{"position":[[107,6]]},"296":{"position":[[124,6]]},"297":{"position":[[90,6]]},"299":{"position":[[105,6]]},"301":{"position":[[82,6]]},"302":{"position":[[82,6]]},"303":{"position":[[84,6]]},"328":{"position":[[716,6]]},"330":{"position":[[456,6]]},"344":{"position":[[738,6]]},"357":{"position":[[108,6]]},"358":{"position":[[90,6]]},"361":{"position":[[82,6]]},"362":{"position":[[84,6]]}},"keywords":{}}],["plu",{"_index":1965,"title":{},"content":{"267":{"position":[[289,4]]}},"keywords":{}}],["plugin",{"_index":239,"title":{"26":{"position":[[7,6]]},"71":{"position":[[12,6]]},"255":{"position":[[7,7]]},"311":{"position":[[6,6]]},"369":{"position":[[4,6]]},"406":{"position":[[4,6]]},"421":{"position":[[11,6]]},"433":{"position":[[7,6]]}},"content":{"12":{"position":[[349,6]]},"21":{"position":[[56,6]]},"22":{"position":[[34,6],[96,6]]},"26":{"position":[[96,6],[204,8]]},"42":{"position":[[408,6]]},"43":{"position":[[58,6]]},"53":{"position":[[67,8]]},"57":{"position":[[27,6],[225,6]]},"71":{"position":[[26,6],[390,6],[834,6]]},"240":{"position":[[1825,6],[1898,7]]},"241":{"position":[[417,6]]},"254":{"position":[[95,6]]},"255":{"position":[[25,6]]},"306":{"position":[[645,6]]},"312":{"position":[[23,6]]},"313":{"position":[[12,6]]},"315":{"position":[[170,8]]},"367":{"position":[[1825,6],[1898,7]]},"368":{"position":[[413,6]]},"369":{"position":[[4,6],[80,6]]},"374":{"position":[[32,6]]},"408":{"position":[[20,6]]},"412":{"position":[[48,6],[176,6]]},"421":{"position":[[52,6],[160,8]]},"434":{"position":[[27,6],[103,6],[159,8]]},"438":{"position":[[18,6]]},"439":{"position":[[18,6]]},"440":{"position":[[5,6]]},"441":{"position":[[30,6]]},"443":{"position":[[905,6],[941,8]]},"444":{"position":[[339,6],[375,8]]},"445":{"position":[[455,6],[491,8]]},"446":{"position":[[1165,6],[1201,8]]},"447":{"position":[[365,6],[401,8]]},"450":{"position":[[109,6],[145,8],[224,8]]},"451":{"position":[[1224,6],[1260,8]]},"452":{"position":[[1135,6],[1171,8]]},"456":{"position":[[591,6],[627,8]]},"459":{"position":[[453,6],[489,8]]}},"keywords":{}}],["plugin/typescript",{"_index":344,"title":{"21":{"position":[[17,17]]}},"content":{},"keywords":{}}],["plural",{"_index":543,"title":{"36":{"position":[[0,8]]},"447":{"position":[[8,6]]},"449":{"position":[[15,6]]},"454":{"position":[[12,8]]},"462":{"position":[[16,7]]}},"content":{"36":{"position":[[11,7],[66,13],[225,6],[303,6],[348,6],[660,6],[1372,6],[1610,6],[1961,6],[2016,7],[2150,7],[2504,7]]},"37":{"position":[[81,13],[172,8],[240,6],[318,6],[363,6],[664,6],[1360,6],[1598,6]]},"76":{"position":[[93,7]]},"77":{"position":[[150,7]]},"125":{"position":[[69,6],[236,7],[419,7]]},"126":{"position":[[291,13]]},"127":{"position":[[76,7]]},"233":{"position":[[231,6]]},"237":{"position":[[341,7]]},"261":{"position":[[496,6]]},"300":{"position":[[406,6]]},"305":{"position":[[341,7]]},"360":{"position":[[231,6]]},"364":{"position":[[341,7]]},"383":{"position":[[94,7],[150,7]]},"443":{"position":[[771,7],[808,7],[843,6],[852,9]]},"447":{"position":[[17,6],[452,6]]},"449":{"position":[[33,7],[108,7]]},"454":{"position":[[35,7],[74,7],[280,7],[341,7],[364,7],[430,7],[447,7]]},"455":{"position":[[36,6],[273,7],[348,7]]},"456":{"position":[[325,7],[417,7],[501,7]]},"457":{"position":[[304,6]]},"459":{"position":[[186,7],[272,6]]},"462":{"position":[[14,6],[120,7],[183,7],[249,7],[328,7]]}},"keywords":{}}],["plural/ordin",{"_index":1325,"title":{},"content":{"129":{"position":[[394,14]]}},"keywords":{}}],["pluralformatopt",{"_index":1670,"title":{},"content":{"233":{"position":[[6,19],[452,20]]},"300":{"position":[[133,19]]},"360":{"position":[[6,19],[452,20]]}},"keywords":{}}],["pluralrul",{"_index":1326,"title":{},"content":{"129":{"position":[[460,12]]},"189":{"position":[[32,11]]}},"keywords":{}}],["pluralrules/local",{"_index":1533,"title":{},"content":{"193":{"position":[[69,18]]},"194":{"position":[[354,18]]},"195":{"position":[[361,18]]},"329":{"position":[[957,18]]}},"keywords":{}}],["pluralrules/polyfil",{"_index":1532,"title":{},"content":{"193":{"position":[[24,21]]},"194":{"position":[[279,20]]},"195":{"position":[[303,20]]},"329":{"position":[[910,22]]}},"keywords":{}}],["pluralrules/should",{"_index":1540,"title":{},"content":{"195":{"position":[[46,18]]}},"keywords":{}}],["pm"",{"_index":1654,"title":{},"content":{"230":{"position":[[481,8]]},"356":{"position":[[490,8]]}},"keywords":{}}],["poeditor",{"_index":756,"title":{},"content":{"44":{"position":[[1139,8]]},"400":{"position":[[265,8]]}},"keywords":{}}],["point",{"_index":1102,"title":{},"content":{"90":{"position":[[289,8]]},"259":{"position":[[171,6]]}},"keywords":{}}],["polish",{"_index":566,"title":{},"content":{"36":{"position":[[1278,7]]},"37":{"position":[[1266,7]]},"449":{"position":[[266,7]]}},"keywords":{}}],["poll",{"_index":212,"title":{},"content":{"11":{"position":[[324,5]]}},"keywords":{}}],["polyfil",{"_index":881,"title":{"101":{"position":[[0,8]]},"107":{"position":[[4,8]]},"115":{"position":[[4,8]]},"152":{"position":[[4,8]]},"160":{"position":[[4,8]]},"173":{"position":[[4,8]]},"182":{"position":[[4,8]]},"192":{"position":[[4,8]]},"207":{"position":[[4,8]]},"214":{"position":[[4,8]]}},"content":{"62":{"position":[[87,9]]},"65":{"position":[[151,8],[213,9],[382,10],[524,10],[658,10]]},"67":{"position":[[310,8]]},"69":{"position":[[84,9],[97,8]]},"87":{"position":[[107,8],[209,8],[304,8],[357,8]]},"101":{"position":[[145,9],[251,9],[505,8],[576,8],[598,8],[627,8]]},"104":{"position":[[52,9]]},"107":{"position":[[13,8],[56,8],[287,8]]},"109":{"position":[[66,9],[242,8]]},"113":{"position":[[133,9]]},"115":{"position":[[13,8],[56,8],[284,10],[343,8]]},"117":{"position":[[68,9],[244,8]]},"119":{"position":[[169,8]]},"129":{"position":[[228,10],[326,10],[428,10]]},"145":{"position":[[49,9]]},"148":{"position":[[68,9],[244,8]]},"152":{"position":[[13,8],[56,8],[128,8]]},"154":{"position":[[73,9],[98,10],[284,8]]},"158":{"position":[[29,8]]},"160":{"position":[[13,8],[56,8],[115,8]]},"162":{"position":[[60,9],[85,10],[245,8]]},"166":{"position":[[52,8]]},"171":{"position":[[52,9]]},"173":{"position":[[13,8],[56,8],[283,8]]},"175":{"position":[[64,9],[240,8]]},"179":{"position":[[132,9]]},"182":{"position":[[13,8],[56,8],[280,10],[339,8],[599,10],[628,8]]},"184":{"position":[[66,9],[242,8]]},"190":{"position":[[52,9]]},"192":{"position":[[13,8],[56,8],[285,8]]},"194":{"position":[[5,8],[202,9],[321,9]]},"195":{"position":[[65,9],[241,8]]},"198":{"position":[[66,9]]},"201":{"position":[[64,9],[89,10],[264,8]]},"207":{"position":[[13,8],[56,8],[118,8]]},"209":{"position":[[63,9]]},"212":{"position":[[220,8]]},"214":{"position":[[13,8],[56,8],[299,8]]},"216":{"position":[[72,9],[248,8]]},"231":{"position":[[105,8]]},"232":{"position":[[498,8]]},"234":{"position":[[97,8]]},"235":{"position":[[99,8]]},"243":{"position":[[231,10],[298,10],[432,10],[605,8],[629,8],[690,8],[860,8],[998,8],[1126,8]]},"244":{"position":[[321,8]]},"245":{"position":[[396,8]]},"272":{"position":[[520,8]]},"293":{"position":[[122,8]]},"295":{"position":[[122,8]]},"296":{"position":[[139,8]]},"297":{"position":[[105,8]]},"298":{"position":[[799,8]]},"299":{"position":[[120,8]]},"301":{"position":[[97,8]]},"302":{"position":[[97,8]]},"303":{"position":[[99,8],[263,9]]},"329":{"position":[[162,10],[229,10],[664,8],[801,8]]},"357":{"position":[[123,8]]},"358":{"position":[[105,8]]},"359":{"position":[[498,8]]},"361":{"position":[[97,8]]},"362":{"position":[[99,8]]}},"keywords":{}}],["polyfill(local",{"_index":1248,"title":{},"content":{"109":{"position":[[91,16]]},"117":{"position":[[93,16]]},"148":{"position":[[93,16]]},"175":{"position":[[89,16]]},"184":{"position":[[91,16]]},"195":{"position":[[90,16]]},"209":{"position":[[88,16]]},"216":{"position":[[97,16]]}},"keywords":{}}],["polyfill.if",{"_index":1552,"title":{},"content":{"212":{"position":[[132,11]]}},"keywords":{}}],["polyfill.intl.numberformat",{"_index":1258,"title":{},"content":{"113":{"position":[[103,26]]}},"keywords":{}}],["polyfill.intl.pluralrul",{"_index":1485,"title":{},"content":{"179":{"position":[[103,25]]},"212":{"position":[[103,25]]}},"keywords":{}}],["polyfillintl.local",{"_index":1234,"title":{},"content":{"104":{"position":[[29,19]]},"113":{"position":[[80,19]]},"166":{"position":[[29,19]]},"171":{"position":[[29,19]]},"179":{"position":[[80,19]]},"190":{"position":[[29,19]]},"212":{"position":[[80,19]]}},"keywords":{}}],["polyfillintl.numberformat",{"_index":1460,"title":{},"content":{"145":{"position":[[20,25]]},"198":{"position":[[37,25]]}},"keywords":{}}],["popular",{"_index":551,"title":{},"content":{"36":{"position":[[683,7]]},"37":{"position":[[687,7]]},"47":{"position":[[718,7]]},"118":{"position":[[210,7]]},"273":{"position":[[187,10]]}},"keywords":{}}],["portfolio",{"_index":2416,"title":{},"content":{"342":{"position":[[487,9]]}},"keywords":{}}],["portion",{"_index":624,"title":{},"content":{"39":{"position":[[85,7]]}},"keywords":{}}],["posit",{"_index":2610,"title":{},"content":{"446":{"position":[[1446,8]]}},"keywords":{}}],["possibl",{"_index":455,"title":{},"content":{"32":{"position":[[209,8]]},"38":{"position":[[122,8]]},"220":{"position":[[399,8]]},"332":{"position":[[1465,9]]},"343":{"position":[[395,8]]},"383":{"position":[[63,9],[252,8]]}},"keywords":{}}],["post",{"_index":616,"title":{},"content":{"38":{"position":[[629,4]]},"250":{"position":[[1359,8],[1604,7]]}},"keywords":{}}],["postdat",{"_index":1799,"title":{},"content":{"250":{"position":[[1134,8]]}},"keywords":{}}],["potenti",{"_index":2230,"title":{},"content":{"310":{"position":[[914,11]]},"337":{"position":[[83,11]]},"414":{"position":[[79,9]]}},"keywords":{}}],["pound",{"_index":1523,"title":{"462":{"position":[[7,5]]}},"content":{"186":{"position":[[498,7]]}},"keywords":{}}],["pr",{"_index":747,"title":{},"content":{"44":{"position":[[930,3]]},"330":{"position":[[495,2]]}},"keywords":{}}],["practic",{"_index":227,"title":{},"content":{"12":{"position":[[141,9]]}},"keywords":{}}],["pragm",{"_index":2579,"title":{},"content":{"431":{"position":[[41,6]]}},"keywords":{}}],["pragma",{"_index":2248,"title":{"322":{"position":[[0,7]]},"381":{"position":[[2,6],[9,9]]},"428":{"position":[[0,7]]}},"content":{"322":{"position":[[34,7],[318,8]]},"381":{"position":[[34,7],[318,8]]},"428":{"position":[[34,7],[318,8]]}},"keywords":{}}],["pre",{"_index":273,"title":{"17":{"position":[[0,3]]},"50":{"position":[[0,3]]}},"content":{"50":{"position":[[14,3],[253,3]]},"65":{"position":[[196,3]]},"83":{"position":[[257,3]]},"118":{"position":[[14,3]]},"124":{"position":[[70,3]]},"133":{"position":[[155,3]]},"140":{"position":[[17,3]]},"323":{"position":[[1,3]]},"429":{"position":[[1,3]]}},"keywords":{}}],["precis",{"_index":440,"title":{},"content":{"31":{"position":[[814,10],[850,9],[1241,7],[1334,10]]},"38":{"position":[[286,9]]}},"keywords":{}}],["precompil",{"_index":835,"title":{},"content":{"51":{"position":[[65,11]]},"84":{"position":[[67,11]]}},"keywords":{}}],["prefer",{"_index":584,"title":{"461":{"position":[[0,6]]},"462":{"position":[[0,6]]}},"content":{"36":{"position":[[2464,6]]},"321":{"position":[[94,6]]},"328":{"position":[[617,11]]},"344":{"position":[[639,11]]},"427":{"position":[[94,6]]}},"keywords":{}}],["prefix",{"_index":1943,"title":{},"content":{"264":{"position":[[537,6],[668,6]]},"456":{"position":[[1027,6]]}},"keywords":{}}],["prefixedkey",{"_index":1946,"title":{},"content":{"264":{"position":[[654,11],[821,13]]}},"keywords":{}}],["prefix}.${key",{"_index":1947,"title":{},"content":{"264":{"position":[[677,18]]}},"keywords":{}}],["preload/precompil",{"_index":816,"title":{},"content":{"50":{"position":[[398,18]]},"140":{"position":[[367,22]]}},"keywords":{}}],["prepars",{"_index":1451,"title":{},"content":{"142":{"position":[[470,9],[556,9]]}},"keywords":{}}],["prepend",{"_index":2563,"title":{},"content":{"411":{"position":[[52,10]]}},"keywords":{}}],["present",{"_index":135,"title":{},"content":{"5":{"position":[[27,12]]},"129":{"position":[[81,7]]}},"keywords":{}}],["preserv",{"_index":710,"title":{"382":{"position":[[2,8]]}},"content":{"42":{"position":[[2288,8]]},"382":{"position":[[12,8]]},"432":{"position":[[12,8]]}},"keywords":{}}],["preservewhitespac",{"_index":2580,"title":{"432":{"position":[[0,19]]}},"content":{},"keywords":{}}],["pretend",{"_index":2277,"title":{},"content":{"327":{"position":[[257,7]]}},"keywords":{}}],["prevent",{"_index":1567,"title":{},"content":{"221":{"position":[[210,8]]},"291":{"position":[[252,8]]},"336":{"position":[[348,8]]},"346":{"position":[[308,8]]},"448":{"position":[[67,7]]},"450":{"position":[[6,8]]},"451":{"position":[[6,8]]},"452":{"position":[[6,8]]},"453":{"position":[[6,8]]},"454":{"position":[[6,8]]},"455":{"position":[[6,8]]}},"keywords":{}}],["previou",{"_index":2348,"title":{},"content":{"331":{"position":[[1994,8]]}},"keywords":{}}],["previous",{"_index":1571,"title":{},"content":{"222":{"position":[[76,10]]},"329":{"position":[[459,10]]},"332":{"position":[[1308,10]]},"338":{"position":[[1,10]]},"347":{"position":[[76,10]]}},"keywords":{}}],["price",{"_index":426,"title":{},"content":{"31":{"position":[[646,5]]},"38":{"position":[[230,5]]},"60":{"position":[[166,5]]},"138":{"position":[[174,5],[184,7]]}},"keywords":{}}],["primarili",{"_index":119,"title":{},"content":{"4":{"position":[[44,9]]},"297":{"position":[[1710,9]]}},"keywords":{}}],["primitivetyp",{"_index":1602,"title":{},"content":{"223":{"position":[[1228,13],[1372,13]]},"348":{"position":[[1178,13],[1322,13]]}},"keywords":{}}],["principl",{"_index":2,"title":{"0":{"position":[[27,10]]},"28":{"position":[[6,11]]}},"content":{},"keywords":{}}],["print",{"_index":1408,"title":{},"content":{"140":{"position":[[108,6],[303,6]]},"141":{"position":[[786,6]]},"331":{"position":[[1538,7]]},"338":{"position":[[370,8],[472,8]]}},"keywords":{}}],["printf",{"_index":634,"title":{},"content":{"39":{"position":[[529,6]]}},"keywords":{}}],["probabl",{"_index":1119,"title":{},"content":{"91":{"position":[[67,8]]},"238":{"position":[[451,9]]},"263":{"position":[[564,9]]},"306":{"position":[[496,9]]},"365":{"position":[[451,9]]}},"keywords":{}}],["problem",{"_index":2270,"title":{},"content":{"326":{"position":[[77,8]]}},"keywords":{}}],["procedur",{"_index":1638,"title":{},"content":{"228":{"position":[[246,10]]},"308":{"position":[[848,10]]}},"keywords":{}}],["process",{"_index":175,"title":{},"content":{"7":{"position":[[359,7]]},"38":{"position":[[634,9]]},"82":{"position":[[821,10]]},"83":{"position":[[509,10]]},"118":{"position":[[18,9]]},"134":{"position":[[185,7]]},"313":{"position":[[140,9]]},"380":{"position":[[47,7]]},"417":{"position":[[72,9]]}},"keywords":{}}],["process.env.node_env",{"_index":1765,"title":{},"content":{"247":{"position":[[577,20]]}},"keywords":{}}],["produc",{"_index":173,"title":{},"content":{"7":{"position":[[327,8]]},"10":{"position":[[348,7]]},"71":{"position":[[618,7]]},"73":{"position":[[380,7]]},"75":{"position":[[153,8],[226,7]]},"124":{"position":[[284,7]]},"289":{"position":[[50,8]]},"353":{"position":[[50,8]]},"459":{"position":[[91,8]]}},"keywords":{}}],["product",{"_index":1631,"title":{},"content":{"226":{"position":[[136,11]]},"247":{"position":[[602,13]]},"253":{"position":[[857,10]]},"287":{"position":[[136,11]]},"288":{"position":[[142,11]]},"352":{"position":[[136,11]]}},"keywords":{}}],["profession",{"_index":1310,"title":{},"content":{"126":{"position":[[162,12]]}},"keywords":{}}],["program",{"_index":515,"title":{},"content":{"35":{"position":[[154,11],[528,11],[903,11]]},"126":{"position":[[127,11]]}},"keywords":{}}],["programmat",{"_index":2542,"title":{},"content":{"402":{"position":[[42,16]]}},"keywords":{}}],["project",{"_index":196,"title":{"10":{"position":[[0,7]]}},"content":{"10":{"position":[[25,7]]},"12":{"position":[[18,7]]},"322":{"position":[[100,8],[170,7],[400,7],[413,9],[434,9]]},"381":{"position":[[100,8],[170,7],[399,7],[412,9],[433,9]]},"428":{"position":[[100,8],[170,7],[400,7],[413,9],[434,9]]}},"keywords":{}}],["project:mi",{"_index":2250,"title":{},"content":{"322":{"position":[[152,10],[382,10]]},"381":{"position":[[152,10],[381,10]]},"428":{"position":[[152,10],[382,10]]}},"keywords":{}}],["projectroot",{"_index":154,"title":{},"content":{"7":{"position":[[1,11]]},"10":{"position":[[68,11]]}},"keywords":{}}],["promise<string>",{"_index":2544,"title":{},"content":{"403":{"position":[[65,21]]},"404":{"position":[[65,21]]}},"keywords":{}}],["promise.all(datapolyfil",{"_index":1271,"title":{},"content":{"117":{"position":[[529,26]]}},"keywords":{}}],["proof",{"_index":2304,"title":{},"content":{"329":{"position":[[291,5]]}},"keywords":{}}],["prop",{"_index":1039,"title":{"269":{"position":[[31,4]]},"279":{"position":[[24,4]]}},"content":{"84":{"position":[[267,4],[422,5],[474,6],[755,5],[807,6]]},"89":{"position":[[188,5]]},"96":{"position":[[470,5]]},"223":{"position":[[1974,5]]},"240":{"position":[[696,4]]},"250":{"position":[[726,6]]},"253":{"position":[[33,4]]},"254":{"position":[[537,5]]},"261":{"position":[[403,4],[511,4]]},"262":{"position":[[327,6]]},"263":{"position":[[405,5]]},"267":{"position":[[5,5],[106,4],[134,5],[259,5],[307,5],[329,4],[499,5]]},"269":{"position":[[187,4],[311,4],[536,4]]},"276":{"position":[[352,4]]},"283":{"position":[[734,5]]},"290":{"position":[[339,5],[409,6],[417,6],[425,6]]},"292":{"position":[[73,5],[142,6],[150,6]]},"293":{"position":[[346,6],[354,6]]},"294":{"position":[[73,5],[213,6],[221,6]]},"295":{"position":[[346,6],[354,6]]},"296":{"position":[[259,5],[327,6],[335,6]]},"297":{"position":[[199,5],[371,4],[384,6]]},"298":{"position":[[73,5],[125,6],[133,6]]},"299":{"position":[[349,6],[357,6]]},"300":{"position":[[67,5],[118,6],[126,6]]},"301":{"position":[[196,5],[242,6],[250,6]]},"302":{"position":[[203,5],[249,6],[257,6]]},"303":{"position":[[201,5],[274,6],[282,6]]},"304":{"position":[[51,5],[99,6],[107,6]]},"306":{"position":[[136,5]]},"309":{"position":[[139,5]]},"326":{"position":[[285,4]]},"328":{"position":[[358,10],[470,5]]},"330":{"position":[[115,4]]},"331":{"position":[[1880,5]]},"345":{"position":[[823,6],[1089,4],[1240,5],[1321,5],[1387,5]]},"348":{"position":[[2107,5]]},"367":{"position":[[696,4]]},"371":{"position":[[864,5]]},"451":{"position":[[1370,4],[1415,6],[1484,4],[1511,4],[1866,4]]}},"keywords":{}}],["prop.createintl",{"_index":2422,"title":{},"content":{"343":{"position":[[751,16]]}},"keywords":{}}],["propag",{"_index":1906,"title":{},"content":{"260":{"position":[[95,10]]}},"keywords":{}}],["proper",{"_index":1989,"title":{},"content":{"269":{"position":[[712,6]]}},"keywords":{}}],["properli",{"_index":291,"title":{},"content":{"17":{"position":[[608,9]]},"125":{"position":[[139,8]]}},"keywords":{}}],["properti",{"_index":1353,"title":{},"content":{"135":{"position":[[136,9]]},"238":{"position":[[286,11]]},"240":{"position":[[500,9]]},"263":{"position":[[369,11],[675,9]]},"306":{"position":[[331,11]]},"315":{"position":[[64,8]]},"365":{"position":[[286,11]]},"367":{"position":[[500,9]]},"452":{"position":[[53,11],[1060,10],[1270,10]]}},"keywords":{}}],["propos",{"_index":1235,"title":{},"content":{"105":{"position":[[33,9]]},"123":{"position":[[270,9]]},"205":{"position":[[30,8]]}},"keywords":{}}],["proprietari",{"_index":1308,"title":{},"content":{"126":{"position":[[50,12]]}},"keywords":{}}],["props.intl",{"_index":2444,"title":{},"content":{"345":{"position":[[995,11]]},"348":{"position":[[1956,10]]}},"keywords":{}}],["props.nam",{"_index":688,"title":{},"content":{"42":{"position":[[1514,11]]}},"keywords":{}}],["props}>{children}</intlprovider>",{"_index":1169,"title":{},"content":{"96":{"position":[[542,46]]}},"keywords":{}}],["prototyp",{"_index":1351,"title":{},"content":{"134":{"position":[[241,9]]}},"keywords":{}}],["provid",{"_index":16,"title":{"336":{"position":[[28,9]]}},"content":{"1":{"position":[[171,7]]},"3":{"position":[[193,8]]},"12":{"position":[[36,7]]},"31":{"position":[[530,8]]},"34":{"position":[[68,8]]},"43":{"position":[[41,8]]},"44":{"position":[[838,7]]},"47":{"position":[[684,7]]},"78":{"position":[[5,8]]},"82":{"position":[[673,8]]},"83":{"position":[[475,8]]},"99":{"position":[[90,8],[203,8]]},"100":{"position":[[75,7]]},"101":{"position":[[23,7],[115,7]]},"118":{"position":[[4,7]]},"123":{"position":[[22,7]]},"124":{"position":[[14,8]]},"133":{"position":[[315,7],[394,9]]},"138":{"position":[[336,8]]},"141":{"position":[[124,7]]},"224":{"position":[[258,8]]},"226":{"position":[[20,7]]},"227":{"position":[[65,7]]},"228":{"position":[[83,7]]},"232":{"position":[[487,8]]},"233":{"position":[[524,8]]},"238":{"position":[[182,9]]},"239":{"position":[[50,7]]},"247":{"position":[[430,8]]},"248":{"position":[[75,7]]},"249":{"position":[[120,8],[282,8],[447,7]]},"250":{"position":[[94,7],[652,8]]},"252":{"position":[[861,8]]},"258":{"position":[[66,7],[236,7]]},"260":{"position":[[175,8]]},"262":{"position":[[20,8]]},"265":{"position":[[38,8]]},"280":{"position":[[118,8]]},"282":{"position":[[8,9]]},"283":{"position":[[21,8],[183,8],[348,7]]},"284":{"position":[[258,8]]},"286":{"position":[[1,8]]},"287":{"position":[[20,7]]},"288":{"position":[[20,7]]},"290":{"position":[[65,7]]},"293":{"position":[[176,8]]},"295":{"position":[[176,8]]},"298":{"position":[[788,8]]},"299":{"position":[[174,8]]},"306":{"position":[[227,9]]},"307":{"position":[[50,7]]},"328":{"position":[[577,7]]},"336":{"position":[[101,9]]},"342":{"position":[[22,7]]},"344":{"position":[[599,7]]},"345":{"position":[[749,8],[957,8]]},"346":{"position":[[61,9]]},"349":{"position":[[258,8]]},"351":{"position":[[1,8]]},"352":{"position":[[20,7]]},"354":{"position":[[65,7]]},"359":{"position":[[487,8]]},"360":{"position":[[524,8]]},"365":{"position":[[182,9]]},"366":{"position":[[50,7]]},"383":{"position":[[218,7]]},"400":{"position":[[4,7]]},"401":{"position":[[9,7]]},"440":{"position":[[12,8]]},"444":{"position":[[73,8]]},"446":{"position":[[455,8],[576,8],[1432,7]]},"456":{"position":[[1074,8]]}},"keywords":{}}],["provideintl",{"_index":2560,"title":{},"content":{"410":{"position":[[44,11],[121,13],[189,12]]}},"keywords":{}}],["pseudo",{"_index":2498,"title":{"392":{"position":[[2,6]]}},"content":{"392":{"position":[[41,6],[75,6]]}},"keywords":{}}],["pseudolocal",{"_index":2499,"title":{"392":{"position":[[16,15]]}},"content":{},"keywords":{}}],["pt",{"_index":1195,"title":{},"content":{"100":{"position":[[496,5],[1352,2]]}},"keywords":{}}],["public",{"_index":1332,"title":{"132":{"position":[[0,6]]}},"content":{},"keywords":{}}],["purpos",{"_index":2407,"title":{},"content":{"340":{"position":[[164,9]]},"382":{"position":[[155,9]]}},"keywords":{}}],["put",{"_index":1771,"title":{},"content":{"248":{"position":[[376,3]]}},"keywords":{}}],["pyrocat101",{"_index":2398,"title":{},"content":{"338":{"position":[[221,11]]}},"keywords":{}}],["qualiti",{"_index":1224,"title":{},"content":{"101":{"position":[[137,7]]},"310":{"position":[[745,7]]},"440":{"position":[[185,7]]}},"keywords":{}}],["quarter",{"_index":1657,"title":{},"content":{"231":{"position":[[216,9]]},"297":{"position":[[1686,8]]},"358":{"position":[[216,9]]}},"keywords":{}}],["quick",{"_index":2293,"title":{},"content":{"328":{"position":[[241,5]]}},"keywords":{}}],["quickli",{"_index":2510,"title":{},"content":{"393":{"position":[[193,7]]}},"keywords":{}}],["quot",{"_index":618,"title":{"39":{"position":[[0,7]]}},"content":{"332":{"position":[[169,7]]},"372":{"position":[[336,5],[342,7]]}},"keywords":{}}],["quot;'{foo}'"",{"_index":1319,"title":{},"content":{"127":{"position":[[423,19]]}},"keywords":{}}],["quot;."",{"_index":1951,"title":{},"content":{"264":{"position":[[946,15]]},"265":{"position":[[164,14]]}},"keywords":{}}],["quot;1",{"_index":1661,"title":{},"content":{"231":{"position":[[537,7]]},"358":{"position":[[537,7]]}},"keywords":{}}],["quot;1.0.0"",{"_index":1002,"title":{},"content":{"82":{"position":[[155,18]]}},"keywords":{}}],["quot;19hjs"",{"_index":701,"title":{},"content":{"42":{"position":[[1975,18]]},"46":{"position":[[443,18]]},"395":{"position":[[525,18]]}},"keywords":{}}],["quot;4:03",{"_index":1653,"title":{},"content":{"230":{"position":[[470,10]]},"356":{"position":[[479,10]]}},"keywords":{}}],["quot;@formatjs/t",{"_index":378,"title":{},"content":{"25":{"position":[[126,18]]},"420":{"position":[[82,18]]}},"keywords":{}}],["quot;@intl",{"_index":2252,"title":{},"content":{"322":{"position":[[327,11]]},"428":{"position":[[327,11]]}},"keywords":{}}],["quot;[description]"",{"_index":735,"title":{},"content":{"44":{"position":[[398,25]]},"47":{"position":[[341,25]]}},"keywords":{}}],["quot;[id]"",{"_index":731,"title":{},"content":{"44":{"position":[[314,17]]},"47":{"position":[[257,17]]}},"keywords":{}}],["quot;[message]"",{"_index":733,"title":{},"content":{"44":{"position":[[354,22]]},"47":{"position":[[297,22]]}},"keywords":{}}],["quot;[sha512:contenthash:base64:6]"",{"_index":360,"title":{},"content":{"22":{"position":[[250,42]]},"25":{"position":[[271,42]]},"71":{"position":[[533,42]]},"314":{"position":[[107,42]]},"420":{"position":[[227,42]]}},"keywords":{}}],["quot;arguments"",{"_index":392,"title":{},"content":{"28":{"position":[[135,22]]}},"keywords":{}}],["quot;ast"",{"_index":361,"title":{},"content":{"22":{"position":[[293,16]]},"25":{"position":[[314,16]]},"71":{"position":[[576,16]]},"314":{"position":[[150,16]]},"420":{"position":[[270,16]]}},"keywords":{}}],["quot;aujourd'hui",{"_index":313,"title":{},"content":{"20":{"position":[[331,18]]}},"keywords":{}}],["quot;browser"",{"_index":1761,"title":{},"content":{"247":{"position":[[152,19]]}},"keywords":{}}],["quot;comment"",{"_index":734,"title":{},"content":{"44":{"position":[[377,20]]},"47":{"position":[[320,20]]}},"keywords":{}}],["quot;compile"",{"_index":775,"title":{},"content":{"46":{"position":[[901,20]]},"371":{"position":[[169,20]]},"393":{"position":[[890,20]]}},"keywords":{}}],["quot;compileroptions"",{"_index":376,"title":{},"content":{"25":{"position":[[47,28]]},"420":{"position":[[3,28]]}},"keywords":{}}],["quot;config"",{"_index":382,"title":{},"content":{"25":{"position":[[225,19]]},"420":{"position":[[181,19]]}},"keywords":{}}],["quot;confirm",{"_index":708,"title":{},"content":{"42":{"position":[[2162,13]]},"395":{"position":[[712,13]]}},"keywords":{}}],["quot;confirmez",{"_index":774,"title":{},"content":{"46":{"position":[[638,15]]}},"keywords":{}}],["quot;control",{"_index":696,"title":{},"content":{"42":{"position":[[1742,13]]},"395":{"position":[[292,13]]}},"keywords":{}}],["quot;defaultmessage"",{"_index":695,"title":{},"content":{"42":{"position":[[1714,27],[1861,27],[1996,27],[2134,27]]},"46":{"position":[[159,27],[317,27],[464,27],[610,27]]},"395":{"position":[[264,27],[411,27],[546,27],[684,27]]}},"keywords":{}}],["quot;delet",{"_index":700,"title":{},"content":{"42":{"position":[[1889,12],[1946,12]]},"46":{"position":[[414,12]]},"395":{"position":[[439,12],[496,12]]}},"keywords":{}}],["quot;description"",{"_index":697,"title":{},"content":{"42":{"position":[[1769,24],[1921,24],[2050,24],[2192,24]]},"46":{"position":[[225,24],[389,24],[526,24],[677,24]]},"395":{"position":[[319,24],[471,24],[600,24],[742,24]]}},"keywords":{}}],["quot;en",{"_index":1007,"title":{},"content":{"82":{"position":[[263,8]]},"135":{"position":[[310,8],[368,8]]},"250":{"position":[[1798,8]]}},"keywords":{}}],["quot;en"",{"_index":1006,"title":{},"content":{"82":{"position":[[246,16]]}},"keywords":{}}],["quot;error"",{"_index":858,"title":{},"content":{"57":{"position":[[181,17]]}},"keywords":{}}],["quot;es2017.intl"",{"_index":1852,"title":{},"content":{"252":{"position":[[1279,24]]}},"keywords":{}}],["quot;es2018.intl"",{"_index":1853,"title":{},"content":{"252":{"position":[[1304,25]]}},"keywords":{}}],["quot;esnext.intl"",{"_index":1851,"title":{},"content":{"252":{"position":[[1253,25]]}},"keywords":{}}],["quot;explicit",{"_index":706,"title":{},"content":{"42":{"position":[[2107,14]]},"46":{"position":[[583,14]]},"395":{"position":[[657,14]]}},"keywords":{}}],["quot;extract",{"_index":2515,"title":{},"content":{"393":{"position":[[941,13]]}},"keywords":{}}],["quot;extract"",{"_index":644,"title":{},"content":{"42":{"position":[[83,20]]},"371":{"position":[[118,20]]},"393":{"position":[[839,20]]}},"keywords":{}}],["quot;few"",{"_index":1676,"title":{},"content":{"233":{"position":[[307,16]]},"360":{"position":[[307,16]]}},"keywords":{}}],["quot;formatj",{"_index":645,"title":{},"content":{"42":{"position":[[104,14]]},"46":{"position":[[922,14]]},"371":{"position":[[139,14],[190,14]]},"393":{"position":[[860,14],[911,14],[970,14]]}},"keywords":{}}],["quot;formatjs"",{"_index":358,"title":{},"content":{"22":{"position":[[190,21]]},"57":{"position":[[104,23]]},"71":{"position":[[473,21]]},"314":{"position":[[47,21]]}},"keywords":{}}],["quot;formatjs/no",{"_index":856,"title":{},"content":{"57":{"position":[[149,17]]}},"keywords":{}}],["quot;fr"",{"_index":2090,"title":{},"content":{"290":{"position":[[976,15]]}},"keywords":{}}],["quot;hak27d"",{"_index":694,"title":{},"content":{"42":{"position":[[1692,19]]},"46":{"position":[[137,19]]},"395":{"position":[[242,19]]}},"keywords":{}}],["quot;haqsd"",{"_index":699,"title":{},"content":{"42":{"position":[[1840,18]]},"46":{"position":[[296,18]]},"395":{"position":[[390,18]]}},"keywords":{}}],["quot;idinterpolationpattern"",{"_index":359,"title":{},"content":{"22":{"position":[[214,35]]},"71":{"position":[[497,35]]},"314":{"position":[[71,35]]}},"keywords":{}}],["quot;imag",{"_index":2639,"title":{},"content":{"451":{"position":[[599,11]]}},"keywords":{}}],["quot;import"",{"_index":380,"title":{},"content":{"25":{"position":[[164,19]]},"420":{"position":[[120,19]]}},"keywords":{}}],["quot;intl",{"_index":2476,"title":{},"content":{"381":{"position":[[327,10]]}},"keywords":{}}],["quot;ja"",{"_index":1009,"title":{},"content":{"82":{"position":[[282,15]]}},"keywords":{}}],["quot;jsnext:main"",{"_index":1764,"title":{},"content":{"247":{"position":[[442,23]]}},"keywords":{}}],["quot;label"",{"_index":2636,"title":{},"content":{"451":{"position":[[485,20]]}},"keywords":{}}],["quot;lang"",{"_index":1003,"title":{},"content":{"82":{"position":[[174,17]]}},"keywords":{}}],["quot;local",{"_index":45,"title":{},"content":{"2":{"position":[[110,12]]}},"keywords":{}}],["quot;locale"",{"_index":40,"title":{},"content":{"2":{"position":[[3,18]]}},"keywords":{}}],["quot;main"",{"_index":1756,"title":{},"content":{"246":{"position":[[194,16]]},"247":{"position":[[297,16]]}},"keywords":{}}],["quot;many"",{"_index":1677,"title":{},"content":{"233":{"position":[[324,17]]},"360":{"position":[[324,17]]}},"keywords":{}}],["quot;mi",{"_index":999,"title":{},"content":{"82":{"position":[[110,8],[192,8]]}},"keywords":{}}],["quot;module"",{"_index":1759,"title":{},"content":{"246":{"position":[[273,18]]},"247":{"position":[[470,18]]}},"keywords":{}}],["quot;name"",{"_index":998,"title":{},"content":{"82":{"position":[[92,17]]}},"keywords":{}}],["quot;namespaced.string_id"",{"_index":1940,"title":{},"content":{"264":{"position":[[317,33]]}},"keywords":{}}],["quot;new",{"_index":702,"title":{},"content":{"42":{"position":[[2024,9]]},"395":{"position":[[574,9]]}},"keywords":{}}],["quot;node_modules/**/lang/en.json"",{"_index":1025,"title":{},"content":{"83":{"position":[[152,40]]}},"keywords":{}}],["quot;node_modules/intl",{"_index":2387,"title":{},"content":{"335":{"position":[[160,23],[227,23]]}},"keywords":{}}],["quot;node_modules/react",{"_index":2385,"title":{},"content":{"335":{"position":[[101,24]]}},"keywords":{}}],["quot;nouveau",{"_index":771,"title":{},"content":{"46":{"position":[[492,13]]}},"keywords":{}}],["quot;now"",{"_index":1973,"title":{},"content":{"268":{"position":[[41,15]]},"269":{"position":[[588,15]]},"270":{"position":[[185,15]]}},"keywords":{}}],["quot;one"",{"_index":1674,"title":{},"content":{"233":{"position":[[273,16]]},"360":{"position":[[273,16]]}},"keywords":{}}],["quot;other"",{"_index":1678,"title":{},"content":{"233":{"position":[[345,18]]},"360":{"position":[[345,18]]}},"keywords":{}}],["quot;overrideidfn"",{"_index":383,"title":{},"content":{"25":{"position":[[245,25]]},"420":{"position":[[201,25]]}},"keywords":{}}],["quot;panneau",{"_index":766,"title":{},"content":{"46":{"position":[[187,13]]}},"keywords":{}}],["quot;placehold",{"_index":704,"title":{},"content":{"42":{"position":[[2075,17],[2217,17]]},"46":{"position":[[551,17],[702,17]]},"395":{"position":[[625,17],[767,17]]}},"keywords":{}}],["quot;plugins"",{"_index":357,"title":{},"content":{"22":{"position":[[165,20]]},"25":{"position":[[78,20]]},"57":{"position":[[83,20]]},"71":{"position":[[448,20]]},"314":{"position":[[22,20]]},"420":{"position":[[34,20]]}},"keywords":{}}],["quot;plural"",{"_index":568,"title":{},"content":{"36":{"position":[[1418,18],[1516,18]]},"37":{"position":[[1406,18],[1504,18]]}},"keywords":{}}],["quot;ref"",{"_index":1112,"title":{},"content":{"90":{"position":[[692,15]]}},"keywords":{}}],["quot;refs"",{"_index":1106,"title":{},"content":{"90":{"position":[[408,16]]}},"keywords":{}}],["quot;rules"",{"_index":855,"title":{},"content":{"57":{"position":[[128,18]]}},"keywords":{}}],["quot;scripts"",{"_index":643,"title":{},"content":{"42":{"position":[[60,20]]},"46":{"position":[[878,20]]},"371":{"position":[[95,20]]},"393":{"position":[[816,20]]}},"keywords":{}}],["quot;singular"",{"_index":569,"title":{},"content":{"36":{"position":[[1488,20]]},"37":{"position":[[1476,20]]}},"keywords":{}}],["quot;skip"",{"_index":1641,"title":{},"content":{"228":{"position":[[292,16]]}},"keywords":{}}],["quot;software"",{"_index":95,"title":{},"content":{"3":{"position":[[240,20]]}},"keywords":{}}],["quot;source"",{"_index":1727,"title":{},"content":{"239":{"position":[[482,18]]},"366":{"position":[[482,18]]}},"keywords":{}}],["quot;src/**/*"",{"_index":2457,"title":{},"content":{"372":{"position":[[380,21]]}},"keywords":{}}],["quot;src/**/*.{ts,tsx,vue}"",{"_index":736,"title":{},"content":{"44":{"position":[[470,33]]},"372":{"position":[[253,33]]}},"keywords":{}}],["quot;string"",{"_index":732,"title":{},"content":{"44":{"position":[[334,19]]},"47":{"position":[[277,19]]}},"keywords":{}}],["quot;supportedlocales"",{"_index":1005,"title":{},"content":{"82":{"position":[[216,29]]}},"keywords":{}}],["quot;supprim",{"_index":769,"title":{},"content":{"46":{"position":[[345,15]]}},"keywords":{}}],["quot;tick"",{"_index":1980,"title":{},"content":{"269":{"position":[[96,16]]}},"keywords":{}}],["quot;titl",{"_index":698,"title":{},"content":{"42":{"position":[[1794,11]]},"46":{"position":[[250,11]]},"395":{"position":[[344,11]]}},"keywords":{}}],["quot;transform"",{"_index":377,"title":{},"content":{"25":{"position":[[103,22],[184,22]]},"420":{"position":[[59,22],[140,22]]}},"keywords":{}}],["quot;two"",{"_index":1675,"title":{},"content":{"233":{"position":[[290,16]]},"360":{"position":[[290,16]]}},"keywords":{}}],["quot;type"",{"_index":381,"title":{},"content":{"25":{"position":[[207,17]]},"420":{"position":[[163,17]]}},"keywords":{}}],["quot;untransl",{"_index":2664,"title":{},"content":{"452":{"position":[[198,18]]}},"keywords":{}}],["quot;version"",{"_index":1001,"title":{},"content":{"82":{"position":[[134,20]]}},"keywords":{}}],["quot;zero"",{"_index":1673,"title":{},"content":{"233":{"position":[[255,17]]},"360":{"position":[[255,17]]}},"keywords":{}}],["quot;{foo}"",{"_index":1320,"title":{},"content":{"127":{"position":[[456,17]]},"338":{"position":[[383,17],[485,17]]}},"keywords":{}}],["quote/escap",{"_index":2402,"title":{},"content":{"338":{"position":[[566,14]]}},"keywords":{}}],["quoting/escap",{"_index":627,"title":{},"content":{"39":{"position":[[144,17]]},"338":{"position":[[598,16]]}},"keywords":{}}],["r",{"_index":1608,"title":{},"content":{"223":{"position":[[1430,1]]},"348":{"position":[[1380,1]]}},"keywords":{}}],["r>>",{"_index":1607,"title":{},"content":{"223":{"position":[[1417,9]]},"348":{"position":[[1367,9]]}},"keywords":{}}],["rang",{"_index":2451,"title":{},"content":{"357":{"position":[[371,5]]}},"keywords":{}}],["rank",{"_index":2710,"title":{},"content":{"462":{"position":[[388,10],[486,10]]}},"keywords":{}}],["raw",{"_index":2018,"title":{},"content":{"273":{"position":[[151,3],[452,3],[625,3]]}},"keywords":{}}],["rawintlprovid",{"_index":1051,"title":{"291":{"position":[[0,16]]}},"content":{"84":{"position":[[627,16],[663,16]]},"291":{"position":[[162,16]]},"336":{"position":[[258,16]]},"346":{"position":[[218,16]]}},"keywords":{}}],["rd",{"_index":595,"title":{},"content":{"37":{"position":[[1981,5]]},"462":{"position":[[443,4],[543,5]]}},"keywords":{}}],["re",{"_index":1200,"title":{},"content":{"100":{"position":[[700,2]]},"297":{"position":[[1002,2],[1473,2]]}},"keywords":{}}],["reach",{"_index":13,"title":{},"content":{"1":{"position":[[112,7]]},"331":{"position":[[107,7]]}},"keywords":{}}],["react",{"_index":253,"title":{"15":{"position":[[6,5]]},"51":{"position":[[0,5]]},"68":{"position":[[0,5]]},"69":{"position":[[0,5]]},"89":{"position":[[36,5]]},"100":{"position":[[0,5]]},"194":{"position":[[0,5]]},"245":{"position":[[0,5]]},"246":{"position":[[4,5]]},"248":{"position":[[4,5]]},"257":{"position":[[4,5]]},"326":{"position":[[4,5]]},"435":{"position":[[0,6]]}},"content":{"15":{"position":[[32,6]]},"17":{"position":[[29,6],[493,5]]},"19":{"position":[[20,5],[26,5]]},"20":{"position":[[127,5],[138,7],[208,6]]},"42":{"position":[[591,5],[602,7],[662,6]]},"46":{"position":[[785,5]]},"48":{"position":[[237,5],[248,7],[282,6],[321,6]]},"58":{"position":[[1,5]]},"65":{"position":[[237,5]]},"67":{"position":[[74,5]]},"68":{"position":[[17,5],[31,5]]},"71":{"position":[[108,6]]},"72":{"position":[[238,6]]},"84":{"position":[[352,6],[685,6]]},"86":{"position":[[1,5]]},"88":{"position":[[9,5],[117,5],[204,5],[288,5]]},"89":{"position":[[110,5],[121,7],[157,6],[566,5],[577,7],[614,6],[668,6]]},"92":{"position":[[252,5]]},"93":{"position":[[28,5],[265,5],[276,7],[311,6]]},"96":{"position":[[325,5],[336,7],[365,6],[414,6],[647,5],[658,7],[1152,5],[1239,5],[1250,7]]},"99":{"position":[[20,5],[126,5]]},"100":{"position":[[17,5],[32,5],[348,5],[359,7],[453,6],[811,5],[822,7],[1020,6]]},"194":{"position":[[129,5]]},"237":{"position":[[53,5]]},"238":{"position":[[1,5]]},"243":{"position":[[86,5]]},"244":{"position":[[85,5]]},"245":{"position":[[17,5],[31,5],[267,5]]},"246":{"position":[[13,5],[65,5],[82,5]]},"247":{"position":[[12,5],[119,5],[416,5]]},"248":{"position":[[54,5],[239,5],[275,5],[326,5],[365,6]]},"249":{"position":[[10,5],[88,5],[100,5],[514,5],[614,5]]},"250":{"position":[[1,5],[49,5],[115,5],[168,5],[311,5],[374,5],[480,5],[601,5],[630,5],[971,5],[982,8],[1012,6],[1080,6],[2068,5]]},"252":{"position":[[737,5],[850,5],[898,5],[952,5],[978,5],[1087,5],[1175,5]]},"254":{"position":[[248,6],[378,6]]},"257":{"position":[[1,5],[118,5],[149,5]]},"258":{"position":[[28,5],[100,5],[148,5]]},"259":{"position":[[642,5],[682,6]]},"260":{"position":[[37,5]]},"261":{"position":[[4,5],[197,6],[236,6]]},"262":{"position":[[475,5],[486,7],[538,6]]},"263":{"position":[[42,5],[196,5]]},"264":{"position":[[1,5],[238,5],[468,5]]},"265":{"position":[[84,5]]},"266":{"position":[[299,5]]},"267":{"position":[[63,5]]},"268":{"position":[[119,5]]},"269":{"position":[[72,5],[719,5]]},"270":{"position":[[107,5],[483,5]]},"273":{"position":[[80,5],[201,5]]},"278":{"position":[[124,5],[184,5]]},"282":{"position":[[31,5],[84,5],[202,5],[252,5]]},"283":{"position":[[1,5],[423,5]]},"286":{"position":[[53,5]]},"291":{"position":[[184,6]]},"292":{"position":[[445,5]]},"294":{"position":[[503,5]]},"296":{"position":[[638,5]]},"297":{"position":[[735,5]]},"298":{"position":[[422,5],[817,5]]},"300":{"position":[[489,5],[598,5]]},"305":{"position":[[53,5]]},"306":{"position":[[1,5]]},"308":{"position":[[173,5]]},"313":{"position":[[56,5],[278,5]]},"322":{"position":[[209,6]]},"326":{"position":[[1,5]]},"327":{"position":[[20,5],[312,5],[323,7],[356,6],[830,5],[841,7],[874,6]]},"328":{"position":[[42,5],[71,5],[299,6],[429,6],[787,5]]},"329":{"position":[[1,5],[297,5],[1165,5]]},"330":{"position":[[1,5],[320,6],[368,6]]},"333":{"position":[[1,5]]},"336":{"position":[[155,5],[280,6]]},"340":{"position":[[133,5],[191,5]]},"342":{"position":[[58,6],[215,5],[305,5],[419,5]]},"343":{"position":[[13,5],[611,5],[657,5],[777,5]]},"344":{"position":[[233,5],[244,7],[289,6],[809,5]]},"345":{"position":[[607,5],[698,5],[727,5],[1158,5],[1169,7],[1217,6]]},"346":{"position":[[115,5],[240,6]]},"348":{"position":[[1826,5]]},"351":{"position":[[53,5]]},"359":{"position":[[516,5]]},"364":{"position":[[53,5]]},"365":{"position":[[1,5]]},"368":{"position":[[345,5],[621,6]]},"371":{"position":[[485,6],[705,6]]},"372":{"position":[[113,5],[139,5]]},"381":{"position":[[209,6]]},"388":{"position":[[52,5]]},"389":{"position":[[372,5]]},"393":{"position":[[96,5]]},"394":{"position":[[623,5]]},"396":{"position":[[90,5]]},"397":{"position":[[372,5]]},"417":{"position":[[210,5]]},"428":{"position":[[209,6]]},"435":{"position":[[102,5],[249,6],[438,6]]},"444":{"position":[[144,6]]},"445":{"position":[[243,6]]},"446":{"position":[[1409,5]]},"448":{"position":[[160,6]]},"450":{"position":[[455,6]]},"453":{"position":[[248,6]]},"454":{"position":[[195,6]]},"455":{"position":[[188,6]]},"456":{"position":[[226,6]]}},"keywords":{}}],["react'",{"_index":1070,"title":{},"content":{"88":{"position":[[1,7]]},"89":{"position":[[468,7]]},"95":{"position":[[216,7]]},"328":{"position":[[729,7]]},"344":{"position":[[751,7]]}},"keywords":{}}],["react.cloneelement(el",{"_index":1121,"title":{},"content":{"91":{"position":[[229,28]]}},"keywords":{}}],["react.compon",{"_index":662,"title":{},"content":{"42":{"position":[[712,15]]},"90":{"position":[[566,15]]},"327":{"position":[[395,15],[620,15],[913,15],[1141,15]]}},"keywords":{}}],["react.componenttyp",{"_index":2070,"title":{},"content":{"283":{"position":[[991,19]]},"348":{"position":[[96,19]]}},"keywords":{}}],["react.componenttype<p>",{"_index":2441,"title":{},"content":{"345":{"position":[[402,29]]}},"keywords":{}}],["react.componenttype<withintlprops<p>>",{"_index":2443,"title":{},"content":{"345":{"position":[[470,49]]}},"keywords":{}}],["react.context.provid",{"_index":2095,"title":{},"content":{"291":{"position":[[24,22]]}},"keywords":{}}],["react.createelement(formattedmessag",{"_index":929,"title":{},"content":{"71":{"position":[[693,37]]},"73":{"position":[[455,37]]}},"keywords":{}}],["react.createref",{"_index":1113,"title":{},"content":{"90":{"position":[[776,17]]},"91":{"position":[[386,18]]},"327":{"position":[[1176,17]]}},"keywords":{}}],["react.fc<props>",{"_index":2448,"title":{},"content":{"345":{"position":[[1297,21]]}},"keywords":{}}],["react.fc<{dat",{"_index":2427,"title":{},"content":{"344":{"position":[[327,18]]}},"keywords":{}}],["react.forwardref",{"_index":2273,"title":{},"content":{"326":{"position":[[204,18]]},"327":{"position":[[70,18]]}},"keywords":{}}],["react.frag",{"_index":2078,"title":{},"content":{"289":{"position":[[176,14]]},"294":{"position":[[415,15]]},"296":{"position":[[550,15]]},"297":{"position":[[647,15]]},"298":{"position":[[334,15]]},"300":{"position":[[510,15]]},"325":{"position":[[297,15]]},"353":{"position":[[176,14]]}},"keywords":{}}],["react.jsx.intrinsicel",{"_index":2071,"title":{},"content":{"283":{"position":[[1019,27]]},"348":{"position":[[124,27]]}},"keywords":{}}],["react.reactel",{"_index":1140,"title":{},"content":{"93":{"position":[[588,19],[769,19]]},"240":{"position":[[318,18]]},"301":{"position":[[319,21]]},"367":{"position":[[318,18]]}},"keywords":{}}],["react.reactelement>",{"_index":2077,"title":{},"content":{"289":{"position":[[88,23]]},"353":{"position":[[88,23]]}},"keywords":{}}],["react.reactnod",{"_index":1688,"title":{},"content":{"234":{"position":[[288,19],[353,17]]},"240":{"position":[[375,17]]},"361":{"position":[[288,19],[353,17]]},"367":{"position":[[375,17]]}},"keywords":{}}],["react.ref<any>",{"_index":2436,"title":{},"content":{"345":{"position":[[205,20]]}},"keywords":{}}],["react@^0.14.0",{"_index":1876,"title":{},"content":{"257":{"position":[[40,13]]}},"keywords":{}}],["reactdom",{"_index":787,"title":{},"content":{"48":{"position":[[268,8]]},"250":{"position":[[998,8]]},"261":{"position":[[183,8]]}},"keywords":{}}],["reactdom.rend",{"_index":1779,"title":{},"content":{"249":{"position":[[756,16]]},"250":{"position":[[1530,16]]},"261":{"position":[[249,16]]},"290":{"position":[[761,16]]}},"keywords":{}}],["reactdom.render(<app",{"_index":800,"title":{},"content":{"48":{"position":[[771,23]]}},"keywords":{}}],["reactel",{"_index":846,"title":{},"content":{"54":{"position":[[117,12]]},"240":{"position":[[1099,12]]},"292":{"position":[[260,13]]},"293":{"position":[[475,13]]},"294":{"position":[[326,13]]},"295":{"position":[[475,13]]},"296":{"position":[[452,13]]},"297":{"position":[[541,13]]},"298":{"position":[[241,13]]},"299":{"position":[[472,13]]},"300":{"position":[[180,13],[200,13],[219,13],[238,13],[257,13],[277,13],[319,13],[339,13]]},"301":{"position":[[347,13]]},"302":{"position":[[357,13]]},"304":{"position":[[192,13],[212,13]]},"310":{"position":[[45,13]]},"332":{"position":[[57,14],[1348,12]]},"367":{"position":[[1099,12]]}},"keywords":{}}],["reactintl",{"_index":1772,"title":{},"content":{"248":{"position":[[428,10]]},"258":{"position":[[207,9]]},"259":{"position":[[428,12]]}},"keywords":{}}],["reactintl.addlocaledata(reactintllocaledata[lang",{"_index":1897,"title":{},"content":{"259":{"position":[[551,50]]}},"keywords":{}}],["reactintllocaledata",{"_index":1885,"title":{},"content":{"258":{"position":[[267,19]]},"259":{"position":[[462,21],[698,22]]}},"keywords":{}}],["reactnod",{"_index":2081,"title":{},"content":{"290":{"position":[[461,10]]}},"keywords":{}}],["reactshallowrender",{"_index":1075,"title":{},"content":{"88":{"position":[[178,20]]}},"keywords":{}}],["reacttestutils.renderintodocu",{"_index":1099,"title":{},"content":{"90":{"position":[[132,34],[794,34]]},"91":{"position":[[173,34]]}},"keywords":{}}],["reactvue3",{"_index":656,"title":{},"content":{"42":{"position":[[569,9]]},"84":{"position":[[318,9]]}},"keywords":{}}],["read",{"_index":433,"title":{},"content":{"31":{"position":[[756,4]]},"97":{"position":[[39,4]]},"338":{"position":[[525,7]]}},"keywords":{}}],["readabl",{"_index":637,"title":{},"content":{"39":{"position":[[620,8]]}},"keywords":{}}],["reader",{"_index":2654,"title":{},"content":{"451":{"position":[[1938,6]]}},"keywords":{}}],["readi",{"_index":183,"title":{},"content":{"8":{"position":[[157,5]]},"11":{"position":[[185,5]]},"393":{"position":[[77,5]]},"394":{"position":[[599,5]]}},"keywords":{}}],["realli",{"_index":2047,"title":{},"content":{"278":{"position":[[79,6]]}},"keywords":{}}],["reason",{"_index":2055,"title":{},"content":{"279":{"position":[[6,7]]},"458":{"position":[[112,8]]}},"keywords":{}}],["receiv",{"_index":2023,"title":{},"content":{"273":{"position":[[468,8]]},"278":{"position":[[4,8]]},"310":{"position":[[112,7]]}},"keywords":{}}],["recent",{"_index":896,"title":{},"content":{"65":{"position":[[46,6],[735,6]]},"243":{"position":[[30,6]]}},"keywords":{}}],["recommend",{"_index":278,"title":{"17":{"position":[[62,13]]},"314":{"position":[[22,14]]}},"content":{"39":{"position":[[566,9]]},"42":{"position":[[2371,9]]},"46":{"position":[[1092,12]]},"101":{"position":[[560,9]]},"221":{"position":[[186,11]]},"243":{"position":[[506,9]]},"291":{"position":[[228,11]]},"292":{"position":[[459,14]]},"294":{"position":[[517,14]]},"296":{"position":[[652,14]]},"297":{"position":[[749,14]]},"298":{"position":[[436,14]]},"300":{"position":[[612,14]]},"308":{"position":[[187,14]]},"329":{"position":[[525,9]]},"332":{"position":[[1388,9]]},"336":{"position":[[324,11]]},"338":{"position":[[515,9]]},"342":{"position":[[88,11]]},"346":{"position":[[284,11]]},"414":{"position":[[429,9]]},"447":{"position":[[90,11]]},"452":{"position":[[778,14]]}},"keywords":{}}],["recommendedstrict",{"_index":2591,"title":{},"content":{"440":{"position":[[59,17]]}},"keywords":{}}],["record<",{"_index":1732,"title":{},"content":{"240":{"position":[[269,10]]},"367":{"position":[[269,10]]}},"keywords":{}}],["record<str",{"_index":1575,"title":{},"content":{"223":{"position":[[122,17],[153,17],[246,17],[1210,17],[1354,17]]},"235":{"position":[[343,17]]},"240":{"position":[[145,17]]},"241":{"position":[[144,17],[187,17]]},"283":{"position":[[829,17],[860,17],[1112,17]]},"303":{"position":[[347,17]]},"348":{"position":[[162,17],[193,17],[1160,17],[1304,17]]},"362":{"position":[[343,17]]},"367":{"position":[[145,17]]},"368":{"position":[[144,17],[187,17]]},"373":{"position":[[181,17],[232,17]]},"389":{"position":[[68,17],[208,17],[269,17]]},"397":{"position":[[68,17],[208,17],[269,17]]},"405":{"position":[[301,17]]}},"keywords":{}}],["record<string,string>",{"_index":780,"title":{},"content":{"47":{"position":[[140,27]]}},"keywords":{}}],["record + + Format.JS + Search Format.JS + UTF-8 + https://formatjs.github.io/img/favicon.ico + + + https://formatjs.github.io// + \ No newline at end of file diff --git a/search-doc-1745030820210.json b/search-doc-1745030820210.json deleted file mode 100644 index 8fe95f9df..000000000 --- a/search-doc-1745030820210.json +++ /dev/null @@ -1 +0,0 @@ -{"searchDocs":[{"title":"Basic Internationalization Principles","type":0,"sectionRef":"#","url":"/docs/core-concepts/basic-internationalization-principles","content":"","keywords":"","version":"Next"},{"title":"What Is Internationalization and Why Does It Matter?​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#what-is-internationalization-and-why-does-it-matter","content":" Internationalized software supports the languages and cultural customs of people throughout the world. The Web reaches all parts of the world. Internationalized web apps provide a great user experience for people everywhere. Localized software adapts to a specific language and culture by translating text into the user's language and formatting data in accordance with the user's expectations. An app is typically localized for a small set of locales. The ECMA-402 JavaScript internationalization specification has an excellent overview. ","version":"Next","tagName":"h2"},{"title":"Locales: Language and Region​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#locales-language-and-region","content":" A "locale" refers to the lingual and cultural expectations for a region. It is represented using a "locale code" defined in UTS LDML. This code is comprised of several parts separated by hyphens (-). The first part is a short string representing the language. The second, optional, part is a short string representing the region. Additionally, various extensions and variants can be specified. Typically, web apps are localized to just the language or language-region combination. Examples of such locale codes are: en for Englishen-US for English as spoken in the United Statesen-GB for English as spoken in the United Kingdomes-AR for Spanish as spoken in Argentinaar-001 for Arabic as spoken throughout the worldar-AE for Arabic as spoken in United Arab Emirates Most internationalized apps only support a small list of locales. ","version":"Next","tagName":"h2"},{"title":"Translating Strings​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#translating-strings","content":" You likely have some text in your application that is in a natural language such as English or Japanese. In order to support other locales, you will need to translate these strings. FormatJS provides a mechanism to let you write the core "software" of your application without special code for different translations. The considerations for each locale are encapsulated in your translated strings and our libraries. const messages = { en: { GREETING: 'Hello {name}', }, fr: { GREETING: 'Bonjour {name}', }, } We use the ICU Message syntax which is also used in Java, C, PHP and various other platforms. ","version":"Next","tagName":"h2"},{"title":"Bundling Translated Strings​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#bundling-translated-strings","content":" It is common to organize your translations primarily by locale, because you only need the translations for the user's current locale. Our template and component library integrations are designed to work with the translations for a single locale. If your app is complex, you can further subdivide your translations, such as by page or section of the site. ","version":"Next","tagName":"h2"},{"title":"Structure of Code​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#structure-of-code","content":" The actual formatting and presentation of data and translated strings typically takes these steps: Determine the user's locale, as described in Runtime Environments guide.Setup one of FormatJS's integrations with the following data: the user's current localetranslated strings for that localeoptionally, any custom formats Call the template engine, passing the data that needs formatting. ","version":"Next","tagName":"h2"},{"title":"Application Workflow","type":0,"sectionRef":"#","url":"/docs/getting-started/application-workflow","content":"","keywords":"","version":"Next"},{"title":"Simple application workflow with a local translation tool​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#simple-application-workflow-with-a-local-translation-tool","content":" projectRoot |-- src | |-- App.js |-- extracted | |-- en.json |-- lang | |-- fr.json | |-- de.json |-- package.json |-- .eslintrc.js The extracted translation files live in the extracted folder since they have a different internal structure (e.g. they contain additional information like the comments). The translation files produced during the translation process are stored in the lang folder. ","version":"Next","tagName":"h2"},{"title":"The workflow​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#the-workflow","content":" The workflow looks like this: Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.Edit: Edit the translations, save when done.The changes immediately show up in your build ","version":"Next","tagName":"h3"},{"title":"Complex application workflow with a cloud based translation service​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#complex-application-workflow-with-a-cloud-based-translation-service","content":" ","version":"Next","tagName":"h2"},{"title":"Project Structure​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#project-structure","content":" A minimal i18n-friendly project can have the following structure: projectRoot |-- src | |-- App.js |-- lang | |-- en-US.json | |-- fr.json |-- package.json |-- .eslintrc.js where lang folder is where the aggregated strings file from your application would live. Integration with 3rd-party translation vendor can consume the en-US.json file and produce fr.json or other locale files accordingly. ","version":"Next","tagName":"h3"},{"title":"Pipeline​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#pipeline","content":" A generic translation pipeline looks something like this: Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.Upload Messages: This step uploads the JSON file to your translation vendor.Download Translations: This step either polls your translation vendor or hook into your vendor to download translated messages in the set of locales that you configured.Commit: This commits back translation messages to the codebase. ","version":"Next","tagName":"h3"},{"title":"Where formatjs comes in​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#where-formatjs-comes-in","content":" The goal of this project is not to provide a solution for the whole pipeline, but rather focus on Developer Experience via tooling and best practices so devs are i18n-aware. This includes: Declaring i18n-friendly messagesLinter that enforces such messagesCLI for extraction & compilationPolyfills for a stable i18n runtime environmentsBundler plugin for compiling TypeScript/JavaScript ","version":"Next","tagName":"h2"},{"title":"Message Declaration","type":0,"sectionRef":"#","url":"/docs/getting-started/message-declaration","content":"","keywords":"","version":"Next"},{"title":"Using imperative API intl.formatMessage​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#using-imperative-api-intlformatmessage","content":" // Method must be exactly `intl.formatMessage` intl.formatMessage( { description: 'A message', // Description should be a string literal defaultMessage: 'My name is {name}', // Message should be a string literal }, { name: userName, } // Values should be an object literal, but not necessarily every value inside ) ","version":"Next","tagName":"h2"},{"title":"Using React API ​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#using-react-api-formattedmessage","content":" import {FormattedMessage} from 'react-intl' ;<FormattedMessage description="A message" // Description should be a string literal defaultMessage="My name is {name}" // Message should be a string literal values={ { name: userName, } // Values should be an object literal, but not necessarily every value inside } /> ","version":"Next","tagName":"h2"},{"title":"Using Vue API & template methods such as $formatMessage​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#using-vue-api--template-methods-such-as-formatmessage","content":" <template> <p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p> </template> ","version":"Next","tagName":"h2"},{"title":"Pre-declaring using defineMessage for later consumption (less recommended)​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#pre-declaring-using-definemessage-for-later-consumption-less-recommended","content":" import {defineMessage} from 'react-intl' const message = defineMessage({ description: 'A message', // Description should be a string literal defaultMessage: 'My name is {name}', // Message should be a string literal }) intl.formatMessage(message, {name: 'John'}) // My name is John <FormattedMessage {...message} values={{ name: 'John', }} /> // My name is John caution We rely on AST to extract messages from the codebase, so make sure you call intl.formatMessage(), use our builtin React components, use our Vue methods or configure --additionalFunctionNames/--additionalComponentNames in our CLI properly. caution You can declare a message without immediately formatting it with defineMessage and our extractor would still be able to extract it. However, our enforce-placeholders linter rule won't be able to analyze it. ","version":"Next","tagName":"h2"},{"title":"Installation","type":0,"sectionRef":"#","url":"/docs/getting-started/installation","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#installation","content":" npmyarn npm i -S react react-intl ","version":"Next","tagName":"h2"},{"title":"Minimal Application​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#minimal-application","content":" After following the step above, you should be able to get a minimal application like this running: NodeReactVue3 import * as React from 'react' import {IntlProvider, FormattedMessage, FormattedNumber} from 'react-intl' // Translated messages in French with matching IDs to what you declared const messagesInFrench = { myMessage: "Aujourd'hui, nous sommes le {ts, date, ::yyyyMMdd}", } export default function App() { return ( <IntlProvider messages={messagesInFrench} locale="fr" defaultLocale="en"> <p> <FormattedMessage id="myMessage" defaultMessage="Today is {ts, date, ::yyyyMMdd}" values={{ts: Date.now()}} /> <br /> <FormattedNumber value={19} style="currency" currency="EUR" /> </p> </IntlProvider> ) } Output <p> Aujourd'hui, nous sommes le 23/07/2020 <br /> 19,00 € </p> ","version":"Next","tagName":"h2"},{"title":"Adding our babel-plugin/TypeScript Transformer for compilation​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#adding-our-babel-plugintypescript-transformer-for-compilation","content":" Our tooling supports babel, ts-loader, ts-jest, rollup-plugin-typescript2 & ts-patch for message compilation: ","version":"Next","tagName":"h2"},{"title":"Babel​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#babel","content":" If you're using babel, add babel-plugin-formatjs to your dependencies: npmyarn npm i -D babel-plugin-formatjs and add it to your babel.config.js or .babelrc: { "plugins": [ [ "formatjs", { "idInterpolationPattern": "[sha512:contenthash:base64:6]", "ast": true } ] ] } ","version":"Next","tagName":"h3"},{"title":"ts-loader​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#ts-loader","content":" npmyarn npm i -D @formatjs/ts-transformer import {transform} from '@formatjs/ts-transformer' module.exports = { ...otherConfigs, module: { rules: [ { test: /\\.tsx?$/, use: [ { loader: 'ts-loader', options: { getCustomTransformers() { return { before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), ], } }, }, }, ], }, ], }, } ","version":"Next","tagName":"h3"},{"title":"ts-jest in jest.config.js​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#ts-jest-in-jestconfigjs","content":" npmyarn npm i -D @formatjs/ts-transformer Take a look at ts-jest guide on how to incorporate custom AST Transformers. ","version":"Next","tagName":"h3"},{"title":"ts-patch​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#ts-patch","content":" npmyarn npm i -D @formatjs/ts-transformer { "compilerOptions": { "plugins": [ { "transform": "@formatjs/ts-transformer", "import": "transform", "type": "config", "overrideIdFn": "[sha512:contenthash:base64:6]", "ast": true } ] } } ","version":"Next","tagName":"h3"},{"title":"rollup-plugin-typescript2​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#rollup-plugin-typescript2","content":" npmyarn npm i -D @formatjs/ts-transformer // rollup.config.js import typescript from 'rollup-plugin-typescript2' import {transform} from '@formatjs/ts-transformer' export default { input: './main.ts', plugins: [ typescript({ transformers: () => ({ before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', ast: true, }), ], }), }), ], } ","version":"Next","tagName":"h3"},{"title":"Message Syntax","type":0,"sectionRef":"#","url":"/docs/core-concepts/icu-syntax","content":"","keywords":"","version":"Next"},{"title":"Basic Principles​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#basic-principles","content":" The simplest transform for the message is a literal string. Hello everyone All other transforms are done using replacements called "arguments". They are enclosed in curly braces ({ and }) and refer to a value in the input data. ","version":"Next","tagName":"h2"},{"title":"Simple Argument​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#simple-argument","content":" You can use a {key} argument for placing a value into the message. The key is looked up in the input data, and the string is interpolated with its value. ICU Message Hello {who} Values as JSON Result ","version":"Next","tagName":"h2"},{"title":"Formatted Argument​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#formatted-argument","content":" Values can also be formatted based on their type. You use a {key, type, format} argument to do that. The elements of the argument are: key is where in the input data to find the datatype is optional, and is how to interpret the value (see below)format is optional, and is a further refinement on how to display that type of data ICU Message I have {numCats, number} cats. Values as JSON Result ","version":"Next","tagName":"h2"},{"title":"number Type​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#number-type","content":" This type is used to format numbers in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument: ICU Message I have {numCats, number} cats. Values as JSON Result ICU Message Almost {pctBlack, number, ::percent} of them are black. Values as JSON Result Internally it uses the Intl.NumberFormat API. You can define custom values for the format element, which are passed to the Intl.NumberFormat constructor. Sometimes embedding how the number will be formatted provides great context to translators. We also support ICU Number Skeletons using the same syntax: ICU Message The price of this bagel is {num, number, ::sign-always compact-short currency/GBP} Values as JSON Result You can read more about this here. For fine control over decimal precision, you can use the Fraction Precision # and 0 symbols, which specify the number of decimal places to display: ICU Message The duration is {num, number, ::.##} seconds Values as JSON Result Note that the # symbol doesn't render trailing zeroes, as seen in this example: ICU Message The duration is {num, number, ::.##} seconds Values as JSON Result To render trailing zeroes, use the 0 symbol: ICU Message The very precise number is {num, number, ::.00} Values as JSON Result For more details, see Fraction Precision. ","version":"Next","tagName":"h3"},{"title":"date Type​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#date-type","content":" This type is used to format dates in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument: short is used to format dates in the shortest possible waymedium is used to format dates with short textual representation of the monthlong is used to format dates with long textual representation of the monthfull is used to format dates with the most detail ICU Message Sale begins {start, date, medium} Values as JSON Result Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor. ","version":"Next","tagName":"h3"},{"title":"time Type​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#time-type","content":" This type is used to format times in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument: short is used to format times with hours and minutesmedium is used to format times with hours, minutes, and secondslong is used to format times with hours, minutes, seconds, and timezonefull is the same as long ICU Message Coupon expires at {expire, time, short} Values as JSON Result Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor. ","version":"Next","tagName":"h3"},{"title":"Supported DateTime Skeleton​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#supported-datetime-skeleton","content":" Similar to number type, we also support ICU DateTime skeleton. ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, we only support the following patterns Symbol\tMeaning\tNotesG\tEra designator y\tyear M\tmonth in year L\tstand-alone month in year d\tday in month E\tday of week e\tlocal day of week\te..eee is not supported c\tstand-alone local day of week\tc..ccc is not supported a\tAM/PM marker h\tHour [1-12] H\tHour [0-23] K\tHour [0-11] k\tHour [1-24] m\tMinute s\tSecond z\tTime Zone\t ","version":"Next","tagName":"h3"},{"title":"{select} Format​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#select-format","content":" The {key, select, matches} is used to choose output by matching a value to one of many choices. (It is similar to the switch statement available in some programming languages.) The key is looked up in the input data. The corresponding value is matched to one of matches and the corresponding output is returned. The key argument must follow Unicode Pattern_Syntax. The matches is a space-separated list of matches. The format of a match is match {output}. (A match is similar to the case statement of the switch found in some programming languages.) The match is a literal value. If it is the same as the value for key then the corresponding output will be used. output is itself a message, so it can be a literal string or also have more arguments nested inside of it. The other match is special and is used if nothing else matches. (This is similar to the default case of the switch found in some programming languages.) danger other is required as per icu4j implementation. We will throw an error if select is used without other. ICU Message {gender, select, male {He will respond shortly.} female {She will respond shortly.} other {They will respond shortly.} } Values as JSON Result Here's an example of nested arguments. ICU Message {isTaxed, select, yes {An additional {tax, number, percent} tax will be collected.} other {No taxes apply.} } Values as JSON Result ","version":"Next","tagName":"h3"},{"title":"{plural} Format​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#plural-format","content":" The {key, plural, matches} is used to choose output based on the pluralization rules of the current locale. It is very similar to the {select} format above except that the value is expected to be a number and is mapped to a plural category. The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories. zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)one: This category is used for languages that have grammar specialized specifically for one (singular) item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)two: This category is used for languages that have grammar specialized specifically for two (dual) items. (Examples are Arabic and Welsh.)few: This category is used for languages that have grammar specialized specifically for a small number (paucal) of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.=value: This is used to match a specific value regardless of the plural categories of the current locale. info Don't use =1 in place of one. one doesn't always mean 1 but rather means singular, which can match to more than number 1 in certain locales. Some locales considered all numbers ends with 1 (like 1, 11, 111) to be singular. danger other is required as per icu4j implementation. We will throw an error if plural is used without other. ICU Message {itemCount, plural, one {Cart: {itemCount, number} item} other {Cart: {itemCount, number} items} } Values as JSON Result ICU Message {itemCount, plural, =0 {You have no items.} one {You have {itemCount, number} item.} other {You have {itemCount, number} items.} } Values as JSON Result In the output of the match, you can use the # special token as a placeholder for the numeric value and it'll be formatted as if it were {key, number}. This is the style we prefer to use. ICU Message {itemCount, plural, =0 {You have no items.} one {You have # item.} other {You have # items.} } Values as JSON Result ","version":"Next","tagName":"h3"},{"title":"{selectordinal} Format​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#selectordinal-format","content":" The {key, selectordinal, matches} is used to choose output based on the ordinal pluralization rules (1st, 2nd, 3rd, etc.) of the current locale. It is very similar to the {plural} format above except that the value is mapped to an ordinal plural category. The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories. zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)one: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)two: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)few: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.=value: This is used to match a specific value regardless of the plural categories of the current locale. danger other is required as per icu4j implementation. We will throw an error if selectordinal is used without other. In the output of the match, the # special token can be used as a placeholder for the numeric value and will be formatted as if it were {key, number}. ICU Message It's my cat's {year, selectordinal, one {#st} two {#nd} few {#rd} other {#th} } birthday! Values as JSON Result ","version":"Next","tagName":"h3"},{"title":"Rich Text Formatting​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#rich-text-formatting","content":" We also support embedded rich text formatting in our message using tags. This allows developers to embed as much text as possible so sentences don't have to be broken up into chunksNOTE: This is not XML/HTML tag ICU Message Our price is <boldThis>{price, number, ::currency/USD precision-integer}</boldThis> with <link>{pct, number, ::percent} discount</link> Values as JSON Result Custom Behavior It is expected that the system using embedded rich text formatting will have methods to handle these placeholders external to this library. The tags will be part of the generated output and can either be post-processed by your own tooling or use the defaultRichTextElements configuration. ","version":"Next","tagName":"h2"},{"title":"Quoting / Escaping​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#quoting--escaping","content":" The ASCII apostrophe ' (U+0027) can be used to escape syntax characters in the text portion of the message, which mimics the behavior of ICU's quoting/escaping. ICU Message This is not an interpolation: '{word} Values as JSON Result ICU Message These are not interpolations: '{word1} {word2}' Values as JSON Result ICU Message '<notATag> Values as JSON Result ICU Message '<notATag>hello</notATag>' Values as JSON Result Two consecutive ASCII apostrophes represents one ASCII apostrophe, similar to %% in printf represents one %. However, we recommend using curly apostrophe ’ (U+2019) for human-readable strings and only use ASCII apostrophe '(U+0027) in ICU message syntax. ICU Message This '{isn''t}' obvious. Values as JSON Result ","version":"Next","tagName":"h2"},{"title":"Message Extraction","type":0,"sectionRef":"#","url":"/docs/getting-started/message-extraction","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#installation","content":" npmyarn npm i -D @formatjs/cli ","version":"Next","tagName":"h2"},{"title":"Extraction​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#extraction","content":" Add the following command to your package.json scripts: { "scripts": { "extract": "formatjs extract" } } and execute with npm: npmyarn npm run extract -- 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' ID Interpolation Pattern Make sure this pattern matches idInterpolationPattern when you use babel-plugin-formatjs or @formatjs/ts-transformer in Bundling with formatjs or you'll get a MISSING_TRANSLATION error. Given a file that has the following messages: ReactVue3 import * as React from 'react' import {FormattedMessage, useIntl, injectIntl} from 'react-intl' class PasswordChangeWithIntl extends React.Component { render() { const {intl} = this.props return ( <li> <input placeholder={intl.formatMessage({ defaultMessage: 'New Password', description: 'placeholder text', })} /> <input placeholder={intl.formatMessage({ id: 'explicit-id', defaultMessage: 'Confirm Password', description: 'placeholder text', })} /> </li> ) } } const PasswordChange = injectIntl(PasswordChangeWithIntl) export function List(props) { const intl = useIntl() return ( <section> <header> <FormattedMessage defaultMessage="Control Panel" description="title of control panel section" /> </header> <ul> <li> <button> <FormattedMessage defaultMessage="Delete user {name}" description="Delete button" values={{ name: props.name, }} /> </button> </li> <PasswordChange /> </ul> </section> ) } running the above command will create a file called lang/en.json: { "hak27d": { "defaultMessage": "Control Panel", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Delete user {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "New Password", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirm Password", "description": "placeholder text" } } Message ID During extraction, we'll preserve explicit declared IDs and insert a hash as an ID for messages without. We recommend against explicit IDs since it can cause collision. ","version":"Next","tagName":"h2"},{"title":"Automatic ID Generation​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#automatic-id-generation","content":" Since manual IDs are discouraged, we've provided a babel plugin and a TypeScript AST transformer that will automatically insert message IDs in your transpiled code. For more details please visit Bundling with formatjs. ","version":"Next","tagName":"h2"},{"title":"Translation Management System (TMS) Integration​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#translation-management-system-tms-integration","content":" The default format generated from @formatjs/cli might not work with the specific TMS/vendor you're working with. You can specify a custom formatter with --format <formatFile> that allows you to convert that format into something tailored to your TMS. For example: If your vendor accepts the format like { "[id]": { "string": "[message]", "comment": "[description]" } } you can run npmyarn npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' --format formatter.js where formatter.js is: exports.format = function (msgs) { const results = {} for (const [id, msg] of Object.entries(msgs)) { results[id] = { string: msg.defaultMessage, comment: msg.description, } } return results } We also provide several builtin formatters to integrate with 3rd party TMSes so feel free to create PRs to add more. TMS\t--formatBabelEdit\tsimple Crowdin Chrome JSON\tcrowdin Lingohub\tsimple Localize's Simple JSON\tsimple Localizely\tsimple locize\tsimple Lokalise Structured JSON\tlokalise Phrase Strings\tsimple POEditor Key-Value JSON\tsimple SimpleLocalize JSON\tsimple Smartling ICU JSON\tsmartling Transifex's Structured JSON\ttransifex ","version":"Next","tagName":"h2"},{"title":"Message Distribution","type":0,"sectionRef":"#","url":"/docs/getting-started/message-distribution","content":"","keywords":"","version":"Next"},{"title":"Compiling Messages​","type":1,"pageTitle":"Message Distribution","url":"/docs/getting-started/message-distribution#compiling-messages","content":" Let's take the example from Message Extraction, assuming we are working with the French version and the file is called lang/fr.json: { "hak27d": { "defaultMessage": "Panneau de configuration", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Supprimer l'utilisateur {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "nouveau mot de passe", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirmez le mot de passe", "description": "placeholder text" } } We can use @formatjs/cli to compile this into a react-intl consumable JSON file: Add the following command to your package.json scripts: { "scripts": { "compile": "formatjs compile" } } and execute with npm: npmyarn npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json Parsing messages into AST We recommending compiling your messages into AST as it allows us to skip parsing them during runtime. This makes your app more performant. ","version":"Next","tagName":"h2"},{"title":"Translation Management System (TMS) Integration​","type":1,"pageTitle":"Message Distribution","url":"/docs/getting-started/message-distribution#translation-management-system-tms-integration","content":" If your TMS/vendor has a different JSON format you can specify a custom formatter with --format <formatFile> that converts that into Record<string,string> so @formatjs/cli can understand. For example: If your vendor accepts the format like { "[id]": { "string": "[message]", "comment": "[description]" } } you can run npmyarn npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json --format formatter.js where formatter.js is: exports.compile = function (msgs) { const results = {} for (const [id, msg] of Object.entries(msgs)) { results[id] = msg.string } return results } In the future we will provide formatters that work with popular TMSes by default. ","version":"Next","tagName":"h2"},{"title":"Distribution​","type":1,"pageTitle":"Message Distribution","url":"/docs/getting-started/message-distribution#distribution","content":" While every application has a separate distribution pipeline, the common theme is the ability to map a locale to its translation file. In this example we'll assume your pipeline can understand dynamic import: NodeReactVue3 import * as React from 'react' import * as ReactDOM from 'react-dom' import {IntlProvider} from 'react-intl' function loadLocaleData(locale: string) { switch (locale) { case 'fr': return import('compiled-lang/fr.json') default: return import('compiled-lang/en.json') } } function App(props) { return ( <IntlProvider locale={props.locale} defaultLocale="en" messages={props.messages} > <MainApp /> </IntlProvider> ) } async function bootstrapApplication(locale, mainDiv) { const messages = await loadLocaleData(locale) ReactDOM.render(<App locale={locale} messages={messages} />, mainDiv) } ","version":"Next","tagName":"h2"},{"title":"Advanced Usage","type":0,"sectionRef":"#","url":"/docs/guides/advanced-usage","content":"","keywords":"","version":"Next"},{"title":"Pre-compiling messages​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#pre-compiling-messages","content":" You can also pre-compile all messages into AST using @formatjs/cli compile command and pass that into IntlProvider. This is especially faster since it saves us time parsing string into AST. The use cases for this support are: Server-side rendering or pre-compiling where you can cache the AST and don't have to pay compilation costs multiple time.Desktop apps using Electron or CEF where you can preload/precompile things in advanced before runtime. Caching Since this approach uses AST as the data source, changes to @formatjs/icu-messageformat-parser's AST will require cache invalidation. Asset Size AST is also slightly larger in size than regular string messages but can be efficiently compressed. ","version":"Next","tagName":"h2"},{"title":"react-intl without parser (40% smaller)​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#react-intl-without-parser-40-smaller","content":" If you've made sure all your messages & defaultMessages are precompiled as above, you can resolve @formatjs/icu-messageformat-parser to @formatjs/icu-messageformat-parser/no-parser during bundling to get a much smaller bundler (~40% less). For example: ","version":"Next","tagName":"h2"},{"title":"webpack.config.js​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#webpackconfigjs","content":" module.exports = { //... resolve: { alias: { '@formatjs/icu-messageformat-parser': '@formatjs/icu-messageformat-parser/no-parser', }, }, } ","version":"Next","tagName":"h3"},{"title":"rollup.config.js​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#rollupconfigjs","content":" import alias from '@rollup/plugin-alias' module.exports = { //... plugins: [ alias({ entries: { '@formatjs/icu-messageformat-parser': '@formatjs/icu-messageformat-parser/no-parser', }, }), ], } In the future, we'll gear towards making this the default behavior. ","version":"Next","tagName":"h3"},{"title":"Imperative APIs​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#imperative-apis","content":" Imperative APIs (e.g formatMessage...) are generally faster than Formatted component since it does not create extra ReactElement nodes. They should have the exact same capabilities as Formatted components. ","version":"Next","tagName":"h2"},{"title":"More examples​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#more-examples","content":" Head over to https://github.com/formatjs/formatjs/tree/main/packages/react-intl/examples for more examples on how to use our libraries. ","version":"Next","tagName":"h2"},{"title":"Develop with formatjs","type":0,"sectionRef":"#","url":"/docs/guides/develop","content":"","keywords":"","version":"Next"},{"title":"Linter Installation​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#linter-installation","content":" npmyarn npm i -D eslint-plugin-formatjs eslint Then in your eslint config: { "plugins": ["formatjs"], "rules": { "formatjs/no-offset": "error" } } Head over to eslint-plugin-formatjs for more details on our rules. ","version":"Next","tagName":"h2"},{"title":"Error Codes​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#error-codes","content":" react-intl is designed to fail fast when there's a configuration issue but fall back to defaultLocale when there's a translation issues. Below are the list of errors that we emit out that can be caught during testing: ","version":"Next","tagName":"h2"},{"title":"FORMAT_ERROR​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#format_error","content":" Issue when we try to format a sentence but some of the placeholder values are malformed, e.g passing in a string for a Date or such. ","version":"Next","tagName":"h3"},{"title":"UNSUPPORTED_FORMATTER​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#unsupported_formatter","content":" We trigger this error when a custom format is being declared but there's no corresponding formatter with it. For example: intl.formatMessage({ defaultMessage: 'the price is {p, number, customCurrency}', }) and there's no formatter for customCurrency. ","version":"Next","tagName":"h3"},{"title":"INVALID_CONFIG​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#invalid_config","content":" When some config values are misconfigured such as missing locale. ","version":"Next","tagName":"h3"},{"title":"MISSING_DATA​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#missing_data","content":" When some native Intl APIs don't support certain locales, or missing locale-data when polyfills are setup. This typically happens when you're running on an older browsers/Node, or try to use newer APIs in browsers that have not supported them. ","version":"Next","tagName":"h3"},{"title":"MISSING_TRANSLATION​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#missing_translation","content":" This gets triggered whenever we try to look up a translated message in messages for a given id and it's not there and there is no fallback defaultMessage for the given id. verbosity This error will be triggered very often since it happens for every message that does not have a translation. Therefore if you do log it remotely there should be throttling in place. ","version":"Next","tagName":"h3"},{"title":"Runtime Requirements","type":0,"sectionRef":"#","url":"/docs/guides/runtime-requirements","content":"","keywords":"","version":"Next"},{"title":"Browser​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#browser","content":" Browser Support We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari. If you need older browser support, take a look at polyfill-library that also uses formatjs but pre-bundle other polyfills that we use. React Intl relies on these Intl APIs: Intl.NumberFormat: Available on IE11+Intl.DateTimeFormat: Available on IE11+Intl.PluralRules: This can be polyfilled using this package.(Optional) Intl.RelativeTimeFormat: Required if you use formatRelativeTimeor FormattedRelativeTime. This can be polyfilled using this package.(Optional) Intl.DisplayNames: Required if you use formatDisplayNameor FormattedDisplayName. This can be polyfilled using this package. We officially support IE11 along with 2 most recent versions of Edge, Chrome & Firefox. ","version":"Next","tagName":"h2"},{"title":"Node.js​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#nodejs","content":" ","version":"Next","tagName":"h2"},{"title":"full-icu​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#full-icu","content":" Starting with Node.js 13.0.0 full-icu is supported by default. If using React Intl in an earlier version of Node.js, your node binary has to either: Get compiled with full-icu using these instructions OR Uses full-icu npm package If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly. ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#react-native","content":" If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details: https://github.com/formatjs/formatjs/issues/1356https://github.com/formatjs/formatjs/issues/992 ","version":"Next","tagName":"h2"},{"title":"React Native on iOS​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#react-native-on-ios","content":" If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in polyfills to polyfill the following APIs (in this order): Intl.getCanonicalLocalesIntl.LocaleIntl.PluralRulesIntl.NumberFormatIntl.DateTimeFormat ","version":"Next","tagName":"h3"},{"title":"Bundling with formatjs","type":0,"sectionRef":"#","url":"/docs/guides/bundler-plugins","content":"","keywords":"","version":"Next"},{"title":"Using babel-plugin-formatjs​","type":1,"pageTitle":"Bundling with formatjs","url":"/docs/guides/bundler-plugins#using-babel-plugin-formatjs","content":" npmyarn npm i -D babel-plugin-formatjs Let's take this simple example: import {FormattedMessage} from 'react-intl' <FormattedMessage description="A message" defaultMessage="My name is {name}" values={{ name: userName, }} /> During runtime this will throw an Error saying ID is required. In order to inject an ID in the transpiled JS, you can use our babel-plugin-formatjs similarly as below: babel.config.json { "plugins": [ [ "formatjs", { "idInterpolationPattern": "[sha512:contenthash:base64:6]", "ast": true } ] ] } This will produce the following JS const {FormattedMessage} = require('react-intl') React.createElement(FormattedMessage, { id: '179jda', defaultMessage: 'My name is {name}', values: { name: userName, }, }) description Our plugin also removes description because it's only for translator, not end-user. ","version":"Next","tagName":"h2"},{"title":"Using @formatjs/ts-transformer​","type":1,"pageTitle":"Bundling with formatjs","url":"/docs/guides/bundler-plugins#using-formatjsts-transformer","content":" npmyarn npm i -D @formatjs/ts-transformer If you're using TypeScript, in order to enable custom AST transformer you should consider using ts-patch, ts-loader or similar. Let's take this simple example: import {FormattedMessage} from 'react-intl' <FormattedMessage description="A message" defaultMessage="My name is {name}" values={{ name: userName, }} /> ","version":"Next","tagName":"h2"},{"title":"ts-loader​","type":1,"pageTitle":"Bundling with formatjs","url":"/docs/guides/bundler-plugins#ts-loader","content":" You can add this in your webpack config ts-loader. import {transform} from '@formatjs/ts-transformer' // webpack config module.exports = { rules: [ { test: /\\.tsx?$/, use: [ { loader: 'ts-loader', options: { getCustomTransformers() { return { before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), ], } }, }, }, ], exclude: /node_modules/, }, ], } This will produce the following JS const {FormattedMessage} = require('react-intl') React.createElement(FormattedMessage, { id: '179jda', defaultMessage: 'My name is {name}', values: { name: userName, }, }) description Our transformer also removes description because it's only for translator, not end-user. ","version":"Next","tagName":"h3"},{"title":"ICU MessageFormat Parser","type":0,"sectionRef":"#","url":"/docs/icu-messageformat-parser","content":"","keywords":"","version":"Next"},{"title":"Overview​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#overview","content":" This package implements a parser in JavaScript that parses the industry standard ICU Message strings — used for internationalization — into an AST. The produced AST can then be used by a compiler, like intl-messageformat, to produce localized formatted strings for display to users. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#usage","content":" import {parse} from '@formatjs/icu-messageformat-parser' const ast = parse(`this is {count, plural, one{# dog} other{# dogs} }`) ","version":"Next","tagName":"h2"},{"title":"Example​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#example","content":" Live Editor <pre> {JSON.stringify( IcuMessageFormatParser.parse( `On {takenDate, date, short} <bold>{name}</bold> took {numPhotos, plural, =0 {no photos.} =1 {one photo.} other {# photos.} }` ), undefined, 2 )} </pre> Result ","version":"Next","tagName":"h3"},{"title":"Supported DateTime Skeleton​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#supported-datetime-skeleton","content":" ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns Symbol\tMeaning\tNotesG\tEra designator y\tyear M\tmonth in year L\tstand-alone month in year d\tday in month E\tday of week e\tlocal day of week\te..eee is not supported c\tstand-alone local day of week\tc..ccc is not supported a\tAM/PM marker h\tHour [1-12] H\tHour [0-23] K\tHour [0-11] k\tHour [1-24] m\tMinute s\tSecond z\tTime Zone\t ","version":"Next","tagName":"h2"},{"title":"Benchmarks​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#benchmarks","content":" complex_msg AST length 10861 normal_msg AST length 1665 simple_msg AST length 364 string_msg AST length 131 complex_msg x 29,940 ops/sec ±1.23% (89 runs sampled) normal_msg x 253,612 ops/sec ±1.01% (92 runs sampled) simple_msg x 1,805,642 ops/sec ±0.70% (94 runs sampled) string_msg x 2,694,133 ops/sec ±1.05% (95 runs sampled) ","version":"Next","tagName":"h2"},{"title":"Distributing i18n-friendly libraries","type":0,"sectionRef":"#","url":"/docs/guides/distribute-libraries","content":"","keywords":"","version":"Next"},{"title":"High level concept​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#high-level-concept","content":" Translated strings are basically assets, just like CSS, static configuration or images. The high level structure typically contains several layers: Reusable Components/Libraries that have translated strings, which can be nested.Consuming higher-level applications that consumes those components/libraries. Each feature/library would be in charge of: Declaring its messages.Integrating with the translation pipeline.Declaring its translated & aggregated strings using either a manifest like package.json or a convention (always output to a specific location) or both. ","version":"Next","tagName":"h2"},{"title":"Declaring in package.json​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#declaring-in-packagejson","content":" This is similar to using style attribute to declare CSS. You can declare something like { "name": "my-library", "version": "1.0.0", "lang": "my-strings", "supportedLocales": ["en", "en-GB", "ja"] } where my-strings is the folder containing your translated strings in your supportedLocales: my-strings |- en.json |- en-GB.json |- ja.json Consuming application can walk through node_modules looking for package.json files with these fields and aggregate the strings together into a single bundle (or multiple bundles) and serve those JSON however it chooses to. This provides flexibility to output translations to any location you want as long as it's declared in package.json. However, this also incurs additional processing cost at the application level and also encourages inconsistency in output location. ","version":"Next","tagName":"h2"},{"title":"Declaring with a convention​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#declaring-with-a-convention","content":" This is similar to Declaring in package.json, except translation is always output to lang/{locale}.json. Upstream application can do formatjs compile "node_modules/**/lang/en.json" --ast --out-file lang/en.json to aggregate all its libraries' pre-translated strings. my-lib |- src |- lang |- en.json |- en-GB.json |- ja.json |- node_modules |- library1 |- lang |- en.json |- en-GB.json |- ja.json |- library2 |- lang |- en.json |- en-GB.json |- ja.json This provides consistency and minimize processing cost of different manifest files but also is less flexible. info We've seen convention approach working better in large engineering org due to enforcement of convention & structure while manifest approach working in a more open environment. ","version":"Next","tagName":"h2"},{"title":"Passing down intl object​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#passing-down-intl-object","content":" The core of a i18n application is the intl object, which contains precompiled messages, locale settings, format settings and cache. Therefore, this should only be initialized at the top level in the application. Component libraries can declare intl: IntlShape as a prop and subsequently pass it down directly like: ReactVue3 import {IntlShape} from 'react-intl' import {MyButton, MyForm} from 'my-components' interface Props { intl: IntlShape } function MyFeature(props: Props) { return ( <div> <MyButton intl={props.intl} /> <MyForm intl={props.intl} /> </div> ) } or passing down via context using RawIntlProvider: import {IntlShape, RawIntlProvider} from 'react-intl' import {MyButton, MyForm} from 'my-components' interface Props { intl: IntlShape } function MyFeature(props: Props) { return ( <RawIntlProvider value={props.intl}> <MyButton /> <MyForm /> </RawIntlProvider> ) } ","version":"Next","tagName":"h2"},{"title":"Testing with formatjs","type":0,"sectionRef":"#","url":"/docs/guides/testing","content":"","keywords":"","version":"Next"},{"title":"Intl APIs requirements​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#intl-apis-requirements","content":" React Intl uses the built-in Intl APIs in JavaScript. Make sure your environment satisfy the requirements listed in Intl APIs requirements ","version":"Next","tagName":"h2"},{"title":"Mocha​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#mocha","content":" If you're using Mocha as your test runner and testing on older JavaScript runtimes, you can load the Intl Polyfill via the CLI or by adding a <script> in the browser. Command Line​ Run mocha and auto-polyfill the runtime if needed: $ mocha --recursive test/ Browser​ You can either load the polyfill in the browser from node_modules or use the polyfill-fastly.io service from the Financial Times: <script src="https://polyfill-fastly.io/v2/polyfill.min.js?features=Intl,Intl.~locale.en-US"></script> ","version":"Next","tagName":"h3"},{"title":"Shallow Rendering​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#shallow-rendering","content":" React's react-addons-test-utils package contains a shallow rendering feature which you might use to test your app's React components. If a component you're trying to test using ReactShallowRenderer uses React Intl — specifically injectIntl() — you'll need to do extra setup work because React Intl components expect to be nested inside an <IntlProvider>. ","version":"Next","tagName":"h2"},{"title":"Testing Example Components That Use React Intl​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#testing-example-components-that-use-react-intl","content":" The following examples will assume mocha, expect, and expect-jsx test framework. ShortDate (Basic)​ import React from 'react' import {FormattedDate} from 'react-intl' const ShortDate = props => ( <FormattedDate value={props.date} year="numeric" month="short" day="2-digit" /> ) export default ShortDate Testing the <ShortDate> example component is no different than testing any other basic component in your app using React's shallow rendering: import expect from 'expect' import expectJSX from 'expect-jsx' import React from 'react' import {createRenderer} from 'react-addons-test-utils' import {FormattedDate} from 'react-intl' import ShortDate from '../short-date' expect.extend(expectJSX) describe('<ShortDate>', function () { it('renders', function () { const renderer = createRenderer() const date = new Date() renderer.render(<ShortDate date={date} />) expect(renderer.getRenderOutput()).toEqualJSX( <FormattedDate value={date} year="numeric" month="short" day="2-digit" /> ) }) }) ","version":"Next","tagName":"h3"},{"title":"DOM Rendering​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#dom-rendering","content":" If you use the DOM in your tests, you need to supply the IntlProvider context to your components using composition: let element = ReactTestUtils.renderIntoDocument( <IntlProvider> <MyComponent /> </IntlProvider> ) However this means that the element reference is now pointing to the IntlProvider instead of your component. To retrieve a reference to your wrapped component, you can use "refs" with these changes to the code: In your component, remember to add {forwardRef: true} when calling injectIntl(): class MyComponent extends React.Component { ... myClassFn() { ... } } export default injectIntl(MyComponent, {forwardRef: true}); In your test, add a "ref" to extract the reference to your tested component: const element = React.createRef() ReactTestUtils.renderIntoDocument( <IntlProvider> <MyComponent ref={element} /> </IntlProvider> ) You can now access the wrapped component instance from element like this: element.current.myClassFn() ","version":"Next","tagName":"h2"},{"title":"Helper function​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#helper-function","content":" Since you will have to do this in all your unit tests, you should probably wrap that setup in a render function like this: function renderWithIntl(element) { let instance ReactTestUtils.renderIntoDocument( <IntlProvider> {React.cloneElement(element, { ref: instance, })} </IntlProvider> ) return instance } You can now use this in your tests like this: const element = React.createRef(); renderWithIntl(<MyElement ref={element}>); element.current.myClassFn(); ","version":"Next","tagName":"h3"},{"title":"Enzyme​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#enzyme","content":" Testing with Enzyme works in a similar fashion as written above. Your mount()ed and shallow()ed components will need access to the intl context. Below is a helper function which you can import and use to mount your components which make use of any of React-Intl's library (either <Formatted* /> components or format*() methods through injectIntl). ","version":"Next","tagName":"h2"},{"title":"Helper function​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#helper-function-1","content":" /** * Components using the react-intl module require access to the intl context. * This is not available when mounting single components in Enzyme. * These helper functions aim to address that and wrap a valid, * English-locale intl context around them. */ import React from 'react' import {IntlProvider} from 'react-intl' import {mount, shallow} from 'enzyme' // You can pass your messages to the IntlProvider. Optional: remove if unneeded. const messages = require('../locales/en') // en.json const defaultLocale = 'en' const locale = defaultLocale export function mountWithIntl(node: React.ReactElement) { return mount(node, { wrappingComponent: IntlProvider, wrappingComponentProps: { locale, defaultLocale, messages, }, }) } export function shallowWithIntl(node: React.ReactElement) { return shallow(node, { wrappingComponent: IntlProvider, wrappingComponentProps: { locale, defaultLocale, messages, }, }) } ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#usage","content":" Create a file with the above helper in e.g. helpers/intl-enzyme-test-helper.js and import the methods you need in your tests. // intl-enzyme-test-helper.js import {mountWithIntl} from 'helpers/intl-enzyme-test-helper.js' const wrapper = mountWithIntl(<CustomComponent />) expect(wrapper.state('foo')).to.equal('bar') // OK expect(wrapper.text()).to.equal('Hello World!') // OK Based on this gist. ","version":"Next","tagName":"h3"},{"title":"Jest​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#jest","content":" Testing with Jest can be divided into two approaches: snapshot's testing and DOM testing. Snapshot's testing is a relatively new feature and works out of the box. If you'd like DOM testing you need to use Enzyme or React's TestUtils. ","version":"Next","tagName":"h2"},{"title":"Snapshot Testing​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#snapshot-testing","content":" Snapshot testing is a new feature of Jest that automatically generates text snapshots of your components and saves them on the disk so if the UI output changes, you get notified without manually writing any assertions on the component output. Use either helper function or mock as described below. Helper function​ import React from 'react' import renderer from 'react-test-renderer' import {IntlProvider} from 'react-intl' const createComponentWithIntl = (children, props = {locale: 'en'}) => { return renderer.create(<IntlProvider {...props}>{children}</IntlProvider>) } export default createComponentWithIntl Usage​ import React from 'react' import createComponentWithIntl from '../../utils/createComponentWithIntl' import AppMain from '../AppMain' test('app main should be rendered', () => { const component = createComponentWithIntl(<AppMain />) let tree = component.toJSON() expect(tree).toMatchSnapshot() tree.props.onClick() tree = component.toJSON() expect(tree).toMatchSnapshot() }) You can find runnable example here and more info about Jest here. Usage with Jest & enzyme​ Jest will automatically mock react-intl, so no any extra implementation is needed, tests should work as is: import React from 'react' import {shallow} from 'enzyme' import AppMain from '../AppMain' test('app main should be rendered', () => { const wrapper = shallow(<AppMain />) expect(wrapper).toMatchSnapshot() }) ","version":"Next","tagName":"h3"},{"title":"DOM Testing​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#dom-testing","content":" If you want use Jest with DOM Testing read more info above in Enzyme section or in official Jest documentation. ","version":"Next","tagName":"h3"},{"title":"Storybook​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#storybook","content":" ","version":"Next","tagName":"h2"},{"title":"Intl​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#intl","content":" If you want to use react-intl inside of Storybook you can use storybook-addon-intl which provides an easy to use wrapper for react-intl including a locale switcher so you can test your component in all provided languages. ","version":"Next","tagName":"h3"},{"title":"react-testing-library​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#react-testing-library","content":" In order to use react-intl and react-testing-library together, you should provide some helper function to the testing flow. You can check the docs. To create a generic solution, We can create a custom render function using the wrapper option as explained in thesetup page. Our custom render function can look like this: // test-utils.js import React from 'react' import {render as rtlRender} from '@testing-library/react' import {IntlProvider} from 'react-intl' function render(ui, {locale = 'pt', ...renderOptions} = {}) { function Wrapper({children}) { return <IntlProvider locale={locale}>{children}</IntlProvider> } return rtlRender(ui, {wrapper: Wrapper, ...renderOptions}) } // re-export everything export * from '@testing-library/react' // override render method export {render} import React from 'react' import '@​testing-library/jest-dom/jest-globals' // We're importing from our own created test-utils and not RTL's import {render, screen} from '../test-utils.js' import {FormattedDate} from 'react-intl' const FormatDateView = () => { return ( <div data-testid="date-display"> <FormattedDate value="2019-03-11" timeZone="utc" day="2-digit" month="2-digit" year="numeric" /> </div> ) } test('it should render FormattedDate and have a formated pt date', () => { render(<FormatDateView />) expect(screen.getByTestId('date-display')).toHaveTextContent('11/03/2019') }) ","version":"Next","tagName":"h2"},{"title":"polyfill-fastly.io Integration","type":0,"sectionRef":"#","url":"/docs/polyfills","content":"One of our goals is to provide developers with access to newest ECMA-402 Intl APIs. Therefore, FormatJS suite also provide multiple high quality polyfills that are fully tested using the Official ECMAScript Conformance Test Suite. Our current list of polyfills includes: Intl.PluralRulesIntl.RelativeTimeFormatIntl.ListFormatIntl.DisplayNamesIntl.NumberFormat (ES2020)Intl.LocaleIntl.LocaleMatcherIntl.getCanonicalLocalesIntl.DateTimeFormat (ES2020)Intl.SegmenterIntl.DurationFormatIntl.supportedValuesOf polyfill-fastly.io Integration For basic use cases, we recommend using polyfill-fastly.io or polyfill-library to generate polyfill bundle since it automatically resolves the dependencies above for you.","keywords":"","version":"Next"},{"title":"Intl.DisplayNames","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-displaynames","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#installation","content":" npmyarn npm i @formatjs/intl-displaynames ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill. ","version":"Next","tagName":"h2"},{"title":"Features​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#features","content":" Everything in intl-displaynames proposal. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.DisplayNames. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DisplayNames.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.DisplayNames, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.DisplayNames,Intl.DisplayNames.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#simple","content":" import '@formatjs/intl-displaynames/polyfill' import '@formatjs/intl-displaynames/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-displaynames/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-displaynames/polyfill-force') await import(`@formatjs/intl-displaynames/locale-data/${locale}`) } ","version":"Next","tagName":"h3"},{"title":"Intl.DateTimeFormat (ESNext)","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-datetimeformat","content":"","keywords":"","version":"Next"},{"title":"Features​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#features","content":" dateStyle/timeStyleformatRange ","version":"Next","tagName":"h2"},{"title":"Installation​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#installation","content":" npmyarn npm i @formatjs/intl-datetimeformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#requirements","content":" This package requires the following capabilities: Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill.Intl.NumberFormat or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.DateTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DateTimeFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example: <!-- Polyfill Intl.DateTimeFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.DateTimeFormat,Intl.DateTimeFormat.~locale.en,Intl.NumberFormat.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#simple","content":" import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/locale-data/en' // locale-data for en import '@formatjs/intl-datetimeformat/add-all-tz' // Add ALL tz data ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-datetimeformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-datetimeformat/polyfill-force') // Parallelize CLDR data loading const dataPolyfills = [ import('@formatjs/intl-datetimeformat/add-all-tz'), import(`@formatjs/intl-datetimeformat/locale-data/${unsupportedLocale}`), ] await Promise.all(dataPolyfills) } ","version":"Next","tagName":"h3"},{"title":"Adding IANA Timezone Database​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#adding-iana-timezone-database","content":" We provide 2 pre-processed IANA Timezone: Full: contains ALL Timezone from IANA database​ import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/add-all-tz' Golden: contains popular set of timezones from IANA database​ import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/add-golden-tz' ","version":"Next","tagName":"h3"},{"title":"Default Timezone​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#default-timezone","content":" Since JS Engines do not expose default timezone, there's currently no way for us to detect local timezone that a browser is in. Therefore, the default timezone in this polyfill is UTC. You can change this by either calling __setDefaultTimeZone or always explicitly pass in timeZone option for accurate date time calculation. Since __setDefaultTimeZone is not in the spec, you should make sure to check for its existence before calling it & after tz data has been loaded, e.g: import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/add-all-tz.js' if ('__setDefaultTimeZone' in Intl.DateTimeFormat) { Intl.DateTimeFormat.__setDefaultTimeZone('America/Los_Angeles') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#tests","content":" This library is fully test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl MessageFormat","type":0,"sectionRef":"#","url":"/docs/intl-messageformat","content":"","keywords":"","version":"Next"},{"title":"Overview​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#overview","content":" ","version":"Next","tagName":"h2"},{"title":"Goals​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#goals","content":" This package aims to provide a way for you to manage and format your JavaScript app's string messages into localized strings for people using your app. You can use this package in the browser and on the server via Node.js. This implementation is based on the Strawman proposal, but there are a few places this implementation diverges. Future Changes This IntlMessageFormat API may change to stay in sync with ECMA-402, but this package will follow semver. ","version":"Next","tagName":"h3"},{"title":"How It Works​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#how-it-works","content":" Messages are provided into the constructor as a String message, or a pre-parsed AST object. const msg = new IntlMessageFormat(message, locales, [formats], [opts]) The string message is parsed, then stored internally in a compiled form that is optimized for the format() method to produce the formatted string for displaying to the user. const output = msg.format(values) ","version":"Next","tagName":"h3"},{"title":"Common Usage Example​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#common-usage-example","content":" A very common example is formatting messages that have numbers with plural labels. With this package you can make sure that the string is properly formatted for a person's locale, e.g.: Live Editor new IntlMessageFormat( `{numPhotos, plural, =0 {You have no photos.} =1 {You have one photo.} other {You have # photos.} }`, 'en-US' ).format({numPhotos: 1000}) Result Live Editor new IntlMessageFormat( `{numPhotos, plural, =0 {Usted no tiene fotos.} =1 {Usted tiene una foto.} other {Usted tiene # fotos.} }`, 'es-ES' ).format({numPhotos: 1000}) Result ","version":"Next","tagName":"h3"},{"title":"Message Syntax​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#message-syntax","content":" The message syntax that this package uses is not proprietary, in fact it's a common standard message syntax that works across programming languages and one that professional translators are familiar with. This package uses the ICU Message syntax and works for all CLDR languages which have pluralization rules defined. ","version":"Next","tagName":"h3"},{"title":"Features​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#features","content":" Uses industry standards: ICU Message syntax and CLDR locale data. Supports plural, select, and selectordinal message arguments. Formats numbers and dates/times in messages using Intl.NumberFormat and Intl.DateTimeFormat, respectively. Optimized for repeated calls to an IntlMessageFormat instance's format() method. Supports defining custom format styles/options. Supports escape sequences for message syntax chars, e.g.: "'{foo}'" will output: "{foo}" in the formatted output instead of interpreting it as a foo argument. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Modern Intl Dependency​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#modern-intl-dependency","content":" This package assumes that the Intl global object exists in the runtime. Intl is present in all modern browsers (IE11+) and Node (with full ICU). The Intl methods we rely on are: Intl.NumberFormat for number formatting (can be polyfilled using @formatjs/intl-numberformat)Intl.DateTimeFormat for date time formatting (can be polyfilled using @formatjs/intl-datetimeformat)Intl.PluralRules for plural/ordinal formatting (can be polyfilled using @formatjs/intl-pluralrules) ","version":"Next","tagName":"h3"},{"title":"Loading Intl MessageFormat in a browser​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#loading-intl-messageformat-in-a-browser","content":" <script src="intl-messageformat/intl-messageformat.min.js"></script> ","version":"Next","tagName":"h3"},{"title":"Loading Intl MessageFormat in Node.js​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#loading-intl-messageformat-in-nodejs","content":" Either do: import IntlMessageFormat from 'intl-messageformat' const IntlMessageFormat = require('intl-messageformat').default NOTE: Your Node has to include full ICU ","version":"Next","tagName":"h3"},{"title":"Public API​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#public-api","content":" ","version":"Next","tagName":"h2"},{"title":"IntlMessageFormat Constructor​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#intlmessageformat-constructor","content":" To create a message to format, use the IntlMessageFormat constructor. The constructor takes three parameters: message: string | AST - String message (or pre-parsed AST) that serves as formatting pattern. locales: string | string[] - A string with a BCP 47 language tag, or an array of such strings. If you do not provide a locale, the default locale will be used. When an array of locales is provided, each item and its ancestor locales are checked and the first one with registered locale data is returned. See: Locale Resolution for more details. formats?: object - Optional object with user defined options for format styles. opts?: { formatters?: Formatters, ignoreTag?: boolean } - Optional options. formatters: Map containing memoized formatters for performance.ignoreTag: Whether to treat HTML/XML tags as string literal instead of parsing them as tag token. When this is false we only allow simple tags without any attributes const msg = new IntlMessageFormat('My name is {name}.', 'en-US') ","version":"Next","tagName":"h3"},{"title":"Locale Resolution​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#locale-resolution","content":" IntlMessageFormat uses Intl.NumberFormat.supportedLocalesOf() to determine which locale data to use based on the locales value passed to the constructor. The result of this resolution process can be determined by call the resolvedOptions() prototype method. ","version":"Next","tagName":"h3"},{"title":"resolvedOptions() Method​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#resolvedoptions-method","content":" This method returns an object with the options values that were resolved during instance creation. It currently only contains a locale property; here's an example: Live Editor new IntlMessageFormat('', 'en-us').resolvedOptions().locale Result Notice how the specified locale was the all lower-case value: "en-us", but it was resolved and normalized to: "en-US". ","version":"Next","tagName":"h3"},{"title":"format(values) Method​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#formatvalues-method","content":" Once the message is created, formatting the message is done by calling the format() method on the instance and passing a collection of values: Live Editor new IntlMessageFormat('My name is {name}.', 'en-US').format({name: 'Eric'}) Result placeholders A value must be supplied for every argument in the message pattern the instance was constructed with. Rich Text support​ Live Editor new IntlMessageFormat('hello <b>world</b>', 'en').format({ b: chunks => <strong>{chunks}</strong>, }) Result We support embedded XML tag in the message, e.g this is a <b>strong</b> tag. This is not meant to be a full-fledged method to embed HTML, but rather to tag specific text chunk so translation can be more contextual. Therefore, the following restrictions apply: Any attributes on the HTML tag are also ignored.Self-closing tags are treated as string literal and not supported, please use regular ICU placeholder like {placeholder}.All tags specified must have corresponding values and will throw error if it's missing, e.g: Live Editor function () { try { return new IntlMessageFormat('a <foo>strong</foo>').format() } catch (e) { return String(e) } } Result XML/HTML tags are escaped using apostrophe just like other ICU constructs. In order to escape you can do things like: Live Editor new IntlMessageFormat("I '<'3 cats").format() Result Live Editor new IntlMessageFormat("raw '<b>HTML</b>'").format() Result Live Editor new IntlMessageFormat("raw '<b>HTML</b>' with '<a>'{placeholder}'</a>'").format( {placeholder: 'some word'} ) Result Embedded valid HTML tag is a bit of a grey area right now since we're not supporting the full HTML/XHTML/XML spec. ","version":"Next","tagName":"h3"},{"title":"getAst Method​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#getast-method","content":" Return the underlying AST for the compiled message. ","version":"Next","tagName":"h3"},{"title":"Date/Time/Number Skeleton​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#datetimenumber-skeleton","content":" We support ICU Number skeleton and a subset of Date/Time Skeleton for further customization of formats. Number Skeleton​ Example: Live Editor new IntlMessageFormat( 'The price is: {price, number, ::currency/EUR}', 'en-GB' ).format({price: 100}) Result A full set of options and syntax can be found here Date/Time Skeleton​ ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns Symbol\tMeaning\tNotesG\tEra designator y\tyear M\tmonth in year L\tstand-alone month in year d\tday in month E\tday of week e\tlocal day of week\te..eee is not supported c\tstand-alone local day of week\tc..ccc is not supported a\tAM/PM marker h\tHour [1-12] H\tHour [0-23] K\tHour [0-11] k\tHour [1-24] m\tMinute s\tSecond z\tTime Zone\t Example: Live Editor new IntlMessageFormat('Today is: {now, date, ::yyyyMMdd}', 'en-GB').format({ now: new Date(), }) Result ","version":"Next","tagName":"h3"},{"title":"Advanced Usage​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#advanced-usage","content":" ","version":"Next","tagName":"h2"},{"title":"Passing in AST​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#passing-in-ast","content":" You can pass in pre-parsed AST to IntlMessageFormat like this: new IntlMessageFormat('hello').format() // prints out hello // is equivalent to import IntlMessageFormat from 'intl-messageformat' import {parse} from '@formatjs/icu-messageformat-parser' new IntlMessageFormat(parse('hello')).format() // prints out hello This helps performance for cases like SSR or preload/precompilation-supported platforms since AST can be cached. If your messages are all in ASTs, you can alias @formatjs/icu-messageformat-parser to {default: undefined} to save some bytes during bundling. ","version":"Next","tagName":"h3"},{"title":"Formatters​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#formatters","content":" For complex messages, initializing Intl.* constructors can be expensive. Therefore, we allow user to pass in formatters to provide memoized instances of these Intl objects. This opts combines with passing in AST and fast-memoize can speed things up by 30x per the benchmark down below. For example: import IntlMessageFormat from 'intl-messageformat' import {memoize} from '@formatjs/fast-memoize' const formatters = { getNumberFormat: memoize( (locale, opts) => new Intl.NumberFormat(locale, opts) ), getDateTimeFormat: memoize( (locale, opts) => new Intl.DateTimeFormat(locale, opts) ), getPluralRules: memoize((locale, opts) => new Intl.PluralRules(locale, opts)), } new IntlMessageFormat('hello {number, number}', 'en', undefined, { formatters, }).format({number: 3}) // prints out `hello, 3` ","version":"Next","tagName":"h3"},{"title":"Benchmark​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#benchmark","content":" format_cached_complex_msg x 153,868 ops/sec ±1.13% (85 runs sampled) format_cached_string_msg x 21,661,621 ops/sec ±4.06% (84 runs sampled) new_complex_msg_preparsed x 719,056 ops/sec ±2.83% (78 runs sampled) new_complex_msg x 12,844 ops/sec ±1.97% (85 runs sampled) new_string_msg x 409,770 ops/sec ±2.57% (79 runs sampled) complex msg format x 12,065 ops/sec ±1.66% (81 runs sampled) complex msg w/ formatters format x 11,649 ops/sec ±2.05% (78 runs sampled) complex preparsed msg w/ formatters format x 597,153 ops/sec ±1.46% (90 runs sampled) complex preparsed msg w/ new formatters format x 684,263 ops/sec ±1.37% (89 runs sampled) ","version":"Next","tagName":"h2"},{"title":"Intl.DurationFormat","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-durationformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#installation","content":" npmyarn npm i @formatjs/intl-durationformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#requirements","content":" Intl.ListFormat or polyfillIntl.NumberFormat or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Simple​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#simple","content":" import '@formatjs/intl-durationformat/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-durationformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-durationformat/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Intl.getCanonicalLocales","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-getcanonicallocales","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#installation","content":" npmyarn npm i @formatjs/intl-getcanonicallocales ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.GetCanonicalLocales. For example: <!-- Polyfill Intl.GetCanonicalLocales & its dependencies --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.GetCanonicalLocales"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#simple","content":" import '@formatjs/intl-getcanonicallocales/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-getcanonicallocales/should-polyfill' async function polyfill() { // This platform already supports Intl.getCanonicalLocales if (shouldPolyfill()) { await import('@formatjs/intl-getcanonicallocales/polyfill') } // Alternatively, force the polyfill regardless of support await import('@formatjs/intl-getcanonicallocales/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#tests","content":" This library is test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.Locale","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-locale","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#installation","content":" npmyarn npm i @formatjs/intl-locale ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#requirements","content":" Intl.getCanonicalLocales or polyfill ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.Locale. For example: <!-- Polyfill Intl.Locale & its dependencies --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.Locale"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#simple","content":" import '@formatjs/intl-locale/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-locale/should-polyfill' async function polyfill() { // This platform already supports Intl.Locale if (shouldPolyfill()) { await import('@formatjs/intl-locale/polyfill') } // Alternatively, force the polyfill regardless of support await import('@formatjs/intl-locale/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#tests","content":" This library is test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.LocaleMatcher","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-localematcher","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#installation","content":" npmyarn npm i @formatjs/intl-localematcher ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Simple​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#simple","content":" import {match} from '@formatjs/intl-localematcher' match(['fr-XX', 'en'], ['fr', 'en'], 'en') // 'fr' match(['zh'], ['fr', 'en'], 'en') // 'en' ","version":"Next","tagName":"h3"},{"title":"Intl.ListFormat","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-listformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#installation","content":" npmyarn npm i @formatjs/intl-listformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.ListFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.ListFormat.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.ListFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.ListFormat,Intl.ListFormat.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#simple","content":" import '@formatjs/intl-listformat/polyfill' import '@formatjs/intl-listformat/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-listformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-listformat/polyfill-force') await import(`@formatjs/intl-listformat/locale-data/${unsupportedLocale}`) } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#tests","content":" This library is fully test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.NumberFormat (ESNext)","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-numberformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#installation","content":" npmyarn npm i @formatjs/intl-numberformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#requirements","content":" This package requires the following capabilities: Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill.Intl.PluralRules or polyfill. ","version":"Next","tagName":"h2"},{"title":"Features​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#features","content":" Everything in the ES2020 Internationalization API spec (https://tc39.es/ecma402). ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.NumberFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.NumberFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example: <!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en"></script> Or if Intl.PluralRules needs to be polyfilled as well: <!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en,Intl.PluralRules.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#simple","content":" import '@formatjs/intl-numberformat/polyfill' import '@formatjs/intl-numberformat/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-numberformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-numberformat/polyfill-force') await import(`@formatjs/intl-numberformat/locale-data/${unsupportedLocale}`) } ","version":"Next","tagName":"h3"},{"title":"Supported Units​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#supported-units","content":" ","version":"Next","tagName":"h2"},{"title":"Simple Units​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#simple-units","content":" Currently, the spec defines a list of sanctioned units as below. type Unit = | 'acre' | 'bit' | 'byte' | 'celsius' | 'centimeter' | 'day' | 'degree' | 'fahrenheit' | 'fluid-ounce' | 'foot' | 'gallon' | 'gigabit' | 'gigabyte' | 'gram' | 'hectare' | 'hour' | 'inch' | 'kilobit' | 'kilobyte' | 'kilogram' | 'kilometer' | 'liter' | 'megabit' | 'megabyte' | 'meter' | 'mile' | 'mile-scandinavian' | 'millimeter' | 'milliliter' | 'millisecond' | 'minute' | 'month' | 'ounce' | 'percent' | 'petabyte' | 'pound' | 'second' | 'stone' | 'terabit' | 'terabyte' | 'week' | 'yard' | 'year' ","version":"Next","tagName":"h3"},{"title":"Compound Units​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#compound-units","content":" You can specify X-per-Y unit, where X and Y are sanctioned simple units (e.g. kilometer-per-hour). The library will choose the best-fit localized pattern to format this compound unit. ","version":"Next","tagName":"h3"},{"title":"Intl.PluralRules","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-pluralrules","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#installation","content":" npmyarn npm i @formatjs/intl-pluralrules ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.PluralRules. By default the created URL does not come with any locale data. In order to add locale data, append Intl.PluralRules.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.PluralRules, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.PluralRules,Intl.PluralRules.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#simple","content":" import '@formatjs/intl-pluralrules/polyfill' import '@formatjs/intl-pluralrules/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#react-native","content":" The polyfill conditional detection code runs very slowly on Android and can slow down your app's startup time by seconds. Since React Native uses Hermes which does not support Intl.PluralRules, import /polyfill-force instead for much better performance: import '@formatjs/intl-pluralrules/polyfill-force' // instead of /polyfill import '@formatjs/intl-pluralrules/locale-data/en' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-pluralrules/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-pluralrules/polyfill-force') await import(`@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}`) } ","version":"Next","tagName":"h3"},{"title":"Intl.supportedValuesOf","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-supportedvaluesof","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#installation","content":" npmyarn npm i @formatjs/intl-enumerator ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#requirements","content":" Intl.CollatorIntl.DateTimeFormat or polyfillIntl.NumberFormat or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Simple​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#simple","content":" import '@formatjs/intl-enumerator/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-enumerator/should-polyfill' async function polyfill() { // This platform already supports Intl.supportedValuesOf if (shouldPolyfill()) { await import('@formatjs/intl-enumerator/polyfill') } // Alternatively, force the polyfill regardless of support await import('@formatjs/intl-enumerator/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#tests","content":" This library is test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.Segmenter","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-segmenter","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#installation","content":" npmyarn npm i @formatjs/intl-segmenter ","version":"Next","tagName":"h2"},{"title":"Features​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#features","content":" Everything in intl-segmenter proposal ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.Segmenter. For example: <!-- Polyfill Intl.Segmenter--> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.Segmenter"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#simple","content":" import '@formatjs/intl-segmenter/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-segmenter/should-polyfill' async function polyfill(locale: string) { if (shouldPolyfill()) { await import('@formatjs/intl-segmenter/polyfill-force') } } ","version":"Next","tagName":"h3"},{"title":"Intl.RelativeTimeFormat","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-relativetimeformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#installation","content":" npmyarn npm i @formatjs/intl-relativetimeformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#requirements","content":" This package requires the following capabilities: Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill.Intl.PluralRules or polyfill.If you need formatToParts and have to support IE11- or Node 10-, you'd need to polyfill using @formatjs/intl-numberformat. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.RelativeTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.RelativeTimeFormat.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.RelativeTimeFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.RelativeTimeFormat,Intl.RelativeTimeFormat.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#simple","content":" import '@formatjs/intl-relativetimeformat/polyfill' import '@formatjs/intl-relativetimeformat/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-relativetimeformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-relativetimeformat/polyfill-force') await import( `@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}` ) } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#tests","content":" This library is fully test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Core FormatJS Intl","type":0,"sectionRef":"#","url":"/docs/intl","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#installation","content":" npmyarn npm i -S @formatjs/intl ","version":"Next","tagName":"h2"},{"title":"The intl object​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#the-intl-object","content":" The core of @formatjs/intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated. tip The intl object should be reused as much as possible for performance. ","version":"Next","tagName":"h2"},{"title":"createIntl​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#createintl","content":" This allows you to create an IntlShape object that contains all format* methods. For example: import {createIntl, createIntlCache} from '@formatjs/intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl( { locale: 'fr-FR', messages: {}, }, cache ) // Call imperatively intl.formatNumber(20) ","version":"Next","tagName":"h2"},{"title":"createIntlCache​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#createintlcache","content":" Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache. ","version":"Next","tagName":"h2"},{"title":"IntlShape​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#intlshape","content":" interface IntlConfig { locale: string timeZone?: string fallbackOnEmptyString?: boolean formats: CustomFormats messages: Record<string, string> | Record<string, MessageFormatElement[]> defaultLocale: string defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>> defaultFormats: CustomFormats onError(err: string): void onWarn(warning: string): void } interface IntlFormatters { formatDate(value: number | Date | string, opts?: FormatDateOptions): string formatTime(value: number | Date | string, opts?: FormatDateOptions): string formatDateToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatTimeToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatRelativeTime( value: number, unit?: FormattableUnit, opts?: FormatRelativeTimeOptions ): string formatNumber(value: number, opts?: FormatNumberOptions): string formatNumberToParts( value: number, opts?: FormatNumberOptions ): Intl.NumberFormatPart[] formatPlural( value: number | string, opts?: FormatPluralOptions ): ReturnType<Intl.PluralRules['select']> formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>> ): string formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>> ): R formatList(values: Array<string>, opts?: FormatListOptions): string formatList( values: Array<string | T>, opts?: FormatListOptions ): T | string | Array<string | T> formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[] formatDisplayName( value: string, opts?: FormatDisplayNameOptions ): string | undefined } type IntlShape = IntlConfig & IntlFormatters The definition above shows what the intl object will look like. It's made up of two parts: IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.IntlFormatters: The imperative formatting API described below. ","version":"Next","tagName":"h2"},{"title":"locale, formats, and messages​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#locale-formats-and-messages","content":" The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage. ","version":"Next","tagName":"h3"},{"title":"defaultLocale and defaultFormats​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#defaultlocale-and-defaultformats","content":" Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish. ","version":"Next","tagName":"h3"},{"title":"onError​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#onerror","content":" Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"defaultRichTextElements​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#defaultrichtextelements","content":" A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context. ","version":"Next","tagName":"h3"},{"title":"fallbackOnEmptyString​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#fallbackonemptystring","content":" Defaults to true. This boolean option can be useful if you want to intentionally provide empty values for certain locales via empty strings. When fallbackOnEmptyString is false, empty strings will be returned instead of triggering the fallback procedure. This behaviour can be leveraged to "skip" content in specific locales. See this issue for more context. ","version":"Next","tagName":"h3"},{"title":"formatDate​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatdate","content":" function formatDate( value: number | Date, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatDate(Date.now(), { year: 'numeric', month: 'numeric', day: 'numeric', }) Result ","version":"Next","tagName":"h2"},{"title":"formatTime​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formattime","content":" function formatTime( value: number | Date, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string, but it differs from formatDate by having the following default options: { hour: 'numeric', minute: 'numeric', } It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatTime(Date.now()) // "4:03 PM" Result ","version":"Next","tagName":"h2"},{"title":"formatRelativeTime​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatrelativetime","content":" browser support This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them. type Unit = | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year' type RelativeTimeFormatOptions = { numeric?: 'always' | 'auto' style?: 'long' | 'short' | 'narrow' } function formatRelativeTime( value: number, unit: Unit, options?: Intl.RelativeTimeFormatOptions & { format?: string } ): string This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions. Live Editor intl.formatRelativeTime(0) Result Live Editor intl.formatRelativeTime(-24, 'hour', {style: 'narrow'}) Result ","version":"Next","tagName":"h2"},{"title":"formatNumber​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatnumber","content":" This function uses Intl.NumberFormat options. function formatNumber( value: number, options?: Intl.NumberFormatOptions & {format?: string} ): string This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions. Live Editor intl.formatNumber(1000, {style: 'currency', currency: 'USD'}) Result Formatting Number using unit Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and @formatjs/intl types allow users to pass in a sanctioned unit: Live Editor intl.formatNumber(1000, { style: 'unit', unit: 'kilobyte', unitDisplay: 'narrow', }) Result Live Editor intl.formatNumber(1000, { unit: 'fahrenheit', unitDisplay: 'long', style: 'unit', }) Result ","version":"Next","tagName":"h2"},{"title":"formatPlural​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatplural","content":" type PluralFormatOptions = { type?: 'cardinal' | 'ordinal' = 'cardinal' } function formatPlural( value: number, options?: Intl.PluralFormatOptions ): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other' This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions. This is a low-level utility whose output could be provided to a switch statement to select a particular string to display. Live Editor intl.formatPlural(1) Result Live Editor intl.formatPlural(3, {style: 'ordinal'}) Result Live Editor intl.formatPlural(4, {style: 'ordinal'}) Result multiple language support This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead. ","version":"Next","tagName":"h2"},{"title":"formatList​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatlist","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. type ListFormatOptions = { type?: 'disjunction' | 'conjunction' | 'unit' style?: 'long' | 'short' | 'narrow' } function formatList( elements: (string | React.ReactNode)[], options?: Intl.ListFormatOptions ): string | React.ReactNode[] This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en: Live Editor intl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'}) Result Live Editor intl.formatList(['5 hours', '3 minutes'], {type: 'unit'}) Result ","version":"Next","tagName":"h2"},{"title":"formatDisplayName​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatdisplayname","content":" browser support This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them. type FormatDisplayNameOptions = { style?: 'narrow' | 'short' | 'long' type?: 'language' | 'region' | 'script' | 'currency' fallback?: 'code' | 'none' } function formatDisplayName( value: string | number | Record<string, unknown>, options: FormatDisplayNameOptions ): string | undefined Usage examples: Live Editor intl.formatDisplayName('zh-Hans-SG', {type: 'language'}) Result Live Editor // ISO-15924 four letters script code to localized display name intl.formatDisplayName('Deva', {type: 'script'}) Result Live Editor // ISO-4217 currency code to localized display name intl.formatDisplayName('CNY', {type: 'currency'}) Result Live Editor // ISO-3166 two letters region code to localized display name intl.formatDisplayName('UN', {type: 'region'}) Result ","version":"Next","tagName":"h2"},{"title":"formatMessage​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatmessage","content":" ","version":"Next","tagName":"h2"},{"title":"Message Syntax​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#message-syntax","content":" String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime. Simple Message: Hello, {name} Complex Message: Hello, {name}, you have {itemCount, plural, =0 {no items} one {# item} other {# items} }. See: The Message Syntax Guide. ","version":"Next","tagName":"h3"},{"title":"Message Descriptor​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#message-descriptor","content":" React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) type MessageDescriptor = { id: string defaultMessage?: string description?: string | object } Extracting Message Descriptor You can extract inline-declared messages from source files using our CLI. ","version":"Next","tagName":"h3"},{"title":"Message Formatting Fallbacks​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#message-formatting-fallbacks","content":" The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm: Lookup and format the translated message at id, passed to <IntlProvider>.Fallback to formatting the defaultMessage.Fallback to source of translated message at id.Fallback to source of defaultMessage.Fallback to the literal message id. Above, "source" refers to using the template as is, without any substitutions made. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#usage","content":" type MessageFormatPrimitiveValue = string | number | boolean | null | undefined function formatMessage( descriptor: MessageDescriptor, values?: Record<string, MessageFormatPrimitiveValue> ): string function formatMessage( descriptor: MessageDescriptor, values?: Record< string, MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn > ): string | React.ReactNode[] This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message. If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details. Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: 'Eric'}) } Result with ReactElement Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: <b>Eric</b>}) } Result with rich text formatting Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, <bold>{name}</bold>!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, { name: 'Eric', bold: str => <b>{str}</b>, }) } Result The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin. simple message Messages can be simple strings without placeholders, and that's the most common type of message. ","version":"Next","tagName":"h3"},{"title":"defineMessages/defineMessage​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#definemessagesdefinemessage","content":" interface MessageDescriptor { id?: string description?: string | object defaultMessage?: string } function defineMessages( messageDescriptors: Record<string, MessageDescriptor> ): Record<string, MessageDescriptor> function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor These functions are exported by the @formatjs/intl package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in. import {defineMessages, defineMessage} from '@formatjs/intl' const messages = defineMessages({ greeting: { id: 'app.home.greeting', description: 'Message to greet the user.', defaultMessage: 'Hello, {name}!', }, }) const msg = defineMessage({ id: 'single', defaultMessage: 'single message', description: 'header', }) ","version":"Next","tagName":"h2"},{"title":"Overview","type":0,"sectionRef":"#","url":"/docs/react-intl","content":"","keywords":"","version":"Next"},{"title":"Runtime Requirements​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#runtime-requirements","content":" We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari. React Intl relies on these Intl APIs: Intl.NumberFormat: Available on IE11+Intl.DateTimeFormat: Available on IE11+Intl.PluralRules: This can be polyfilled using this package.Intl.RelativeTimeFormat: This can be polyfilled using this package.(Optional) Intl.DisplayNames: Required if you use formatDisplayNameor FormattedDisplayName. This can be polyfilled using this package. If you need to support older browsers, we recommend you do the following: If you're supporting browsers that do not have Intl, include this polyfill in your build. Polyfill Intl.NumberFormat with @formatjs/intl-numberformat. Polyfill Intl.DateTimeFormat with @formatjs/intl-datetimeformat If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build. If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 12-), include this polyfill in your build along with individual CLDR data for each locale you support. If you need Intl.DisplayNames, include this polyfill in your build along with individual CLDR data for each locale you support. ","version":"Next","tagName":"h2"},{"title":"Node.js​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#nodejs","content":" full-icu​ Starting with Node.js 13.0.0 full-icu is supported by default. If using React Intl in an earlier version of Node.js, your node binary has to either: Get compiled with full-icu using these instructions OR Uses full-icu npm package If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly. ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#react-native","content":" If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details: https://github.com/formatjs/formatjs/issues/1356https://github.com/formatjs/formatjs/issues/992 React Native on iOS​ If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in Runtime Requirements to polyfill those APIs accordingly. ","version":"Next","tagName":"h3"},{"title":"The react-intl Package​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#the-react-intl-package","content":" Install the react-intl npm package via npm: npmyarn npm i -S react-intl The react-intl npm package distributes the following modules (links from unpkg): CommonJS: unbundled dependencies, "main" in package.json, warnings in dev.ES6: unbundled dependencies, "module" in package.json, warnings in dev. ","version":"Next","tagName":"h2"},{"title":"Module Bundlers​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#module-bundlers","content":" We've made React Intl work well with module bundlers like: Browserify, Webpack, or Rollup which can be used to bundle React Intl for the browser: The "browser" field in package.json is specified so that only basic English locale data is included when bundling. This way when using the "main" module in Node all locale data is loaded, but ignored when bundled for the browser. An ES6 version of React Intl is provided as "jsnext:main" and "module" in package.json and can be used with Rollup. Development-time warnings are wrapped with process.env.NODE_ENV !== 'production', this allows you to specify NODE_ENV when bundling and minifying to have these code blocks removed. ","version":"Next","tagName":"h3"},{"title":"The React Intl Module​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#the-react-intl-module","content":" Whether you use the ES6, CommonJS, or UMD version of React Intl, they all provide the same named exports: injectIntldefineMessagesIntlProviderFormattedDateFormattedTimeFormattedRelativeTimeFormattedNumberFormattedPluralFormattedMessage react When using the UMD version of React Intl without a module system, it will expect react to exist on the global variable: React, and put the above named exports on the global variable: ReactIntl. ","version":"Next","tagName":"h2"},{"title":"Creating an I18n Context​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#creating-an-i18n-context","content":" Now with React Intl and its locale data loaded an i18n context can be created for your React app. React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree. All apps using React Intl must use the <IntlProvider> component. The most common usage is to wrap your root React component with <IntlProvider> and configure it with the user's current locale and the corresponding translated strings/messages: ReactDOM.render( <IntlProvider locale={usersLocale} messages={translationsForUsersLocale}> <App /> </IntlProvider>, document.getElementById('container') ) See: The <IntlProvider> docs for more details. ","version":"Next","tagName":"h2"},{"title":"Formatting Data​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#formatting-data","content":" React Intl has two ways to format data, through React components and its API. The components provide an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly. The API should be used when your React component needs to format data to a string value where a React element is not suitable; e.g., a title or aria attribute, or for side-effect in componentDidMount. React Intl's imperative API is accessed via injectIntl, a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.) Here's an example using <IntlProvider>, <Formatted*> components, and the imperative API to setup an i18n context and format data: import React from 'react'; import ReactDOM from 'react-dom'; import {IntlProvider, FormattedRelative, useIntl} from 'react-intl'; const MS_IN_DAY = 1e3 * 3600 * 24 const PostDate = ({date}) => { const intl = useIntl() return ( <span title={intl.formatDate(date)}> <FormattedRelativeTime value={(Date.now() - date)/MS_IN_DAY} unit="day"/> </span> ) }); const App = ({post}) => ( <div> <h1>{post.title}</h1> <p> <PostDate date={post.date} /> </p> <div>{post.body}</div> </div> ); ReactDOM.render( <IntlProvider locale={navigator.language}> <App post={{ title: 'Hello, World!', date: new Date(1459913574887), body: 'Amazing content.', }} /> </IntlProvider>, document.getElementById('container') ); Assuming navigator.language is "en-us": <div> <h1>Hello, World!</h1> <p><span title="4/5/2016">yesterday</span></p> <div>Amazing content.</div> </div> See: The API docs and Component docs for more details. ESM Build react-intl and its underlying libraries (@formatjs/icu-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries. ","version":"Next","tagName":"h2"},{"title":"Jest​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#jest","content":" Add transformIgnorePatterns to always include those libraries, e.g: { transformIgnorePatterns: [ '/node_modules/(?!intl-messageformat|@formatjs/icu-messageformat-parser).+\\\\.js$', ], } ","version":"Next","tagName":"h3"},{"title":"webpack​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#webpack","content":" If you're using babel-loader, or ts-loader, you can do 1 of the following: Add those libraries in include: { include: [ path.join(__dirname, 'node_modules/react-intl'), path.join(__dirname, 'node_modules/intl-messageformat'), path.join(__dirname, 'node_modules/@formatjs/icu-messageformat-parser'), ] } OR Add those libraries in exclude: exclude: /node_modules\\/(?!react-intl|intl-messageformat|@formatjs\\/icu-messageformat-parser)/, Core Concepts Formatters (Date, Number, Message, Relative)Provider and InjectorAPI and ComponentsMessage DescriptorMessage SyntaxDefining default messages for extractionCustom, named formats Example Apps There are several runnable example apps in this Git repo. These are a great way to see React Intl's core concepts in action in simplified applications. API Reference There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with Intl built-ins, React Intl's API, and its React components: ECMAScript Internationalization APIReact Intl APIReact Intl Components TypeScript Usage react-intl is written in TypeScript, thus having 1st-class TS support. In order to use react-intl in TypeScript, make sure your compilerOptions's lib config include ["esnext.intl", "es2017.intl", "es2018.intl"]. ","version":"Next","tagName":"h3"},{"title":"Typing message IDs and locale​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#typing-message-ids-and-locale","content":" By default, the type for the id prop of <FormattedMessage> and formatMessage is string. However, you can set a more restrictive type to get autocomplete and error checking. In order to do this, override the following global namespace with the union type of all of your message IDs. You can do this by including the following somewhere in your code: declare global { namespace FormatjsIntl { interface Message { ids: keyof typeof messages } } } Where messages is the object you would normally pass to <IntlProvider>, and would look something like: const messages = { greeting: 'Hello', planet: 'World', // ... } You can also override the following global to use a custom type for locale declare global { namespace FormatjsIntl { interface IntlConfig { locale: 'en' | 'fr' } } } Advanced Usage Our Advanced Usage has further guides for production setup in environments where performance is important. Supported Tooling ","version":"Next","tagName":"h2"},{"title":"Message extraction​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#message-extraction","content":" We've built @formatjs/cli that helps you extract messages from a list of files. It uses babel-plugin-formatjs under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below: import {defineMessages} from 'react-intl' defineMessages({ foo: { id: 'foo', defaultMessage: 'foo', description: 'bar', }, }) import {FormattedMessage} from 'react-intl' ;<FormattedMessage id="foo" defaultMessage="foo" description="bar" /> function Comp(props) { const {intl} = props return intl.formatMessage({ // The whole `intl.formatMessage` is required so we can extract id: 'foo', defaultMessage: 'foo', description: 'bar', }) } ","version":"Next","tagName":"h2"},{"title":"ESLint Plugin​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#eslint-plugin","content":" We've also built eslint-plugin-formatjs that helps enforcing specific rules on your messages if your translation vendor has restrictions. ","version":"Next","tagName":"h2"},{"title":"Upgrade Guide (v1 -> v2)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-2x","content":"","keywords":"","version":"Next"},{"title":"Use React 0.14 or 15​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#use-react-014-or-15","content":" React Intl v2 has a peer dependency on react@^0.14.0 || ^15.0.0-0 and now takes advantage of features and changes in React 0.14 and also works with React 15. ","version":"Next","tagName":"h2"},{"title":"Update How Locale Data is Added​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-how-locale-data-is-added","content":" The locale data modules in React Intl v2 have been refactored to provide data, instead of mutating React Intl's internal locale data registry. The react-intl/locale-data/* files are also decoupled from the ReactIntl global and instead provide UMD modules with a new ReactIntlLocaleData global. These changes, mean apps need update how they are registering the locale data they need in the browser. ","version":"Next","tagName":"h2"},{"title":"Add Call to addLocaleData() in Browser​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#add-call-to-addlocaledata-in-browser","content":" There is now an addLocaleData() function that needs to be called with the locale data that has been loaded. You can do the following in your main client JavaScript entry point: This assumes a locale data <script> is added based on the request; e.g., for French speaking users: <script src="react-intl/locale-data/fr.js"></script> Using <script src="react-intl/dist/react-intl.js> if ('ReactIntl' in window && 'ReactIntlLocaleData' in window) { Object.keys(ReactIntlLocaleData).forEach(lang => { ReactIntl.addLocaleData(ReactIntlLocaleData[lang]) }) } Using Browserify/Webpack to Load React Intl import {addLocaleData} from 'react-intl' if ('ReactIntlLocaleData' in window) { Object.keys(ReactIntlLocaleData).forEach(lang => { addLocaleData(ReactIntlLocaleData[lang]) }) } info This decoupling of the library from the locale data, allows for the files to be loaded via <script async>. When using async scripts, your client bootstrapping code will need to wait for the load event, including the code above. ","version":"Next","tagName":"h3"},{"title":"Remove Intl Mixin​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#remove-intl-mixin","content":" The IntlMixin has been removed from React Intl v2. The mixin did two things: it automatically propagated locales, formats, and messages throughout an app's hierarchy, and it provided an imperative API via format*() functions. These jobs are now handled by <IntlProvider> and injectIntl(), respectively: ","version":"Next","tagName":"h2"},{"title":"Update to IntlProvider​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-to-intlprovider","content":" In React Intl v1, you would add the IntlMixin to your root component; e.g., <App>. Remove the IntlMixin and instead wrap your root component with <IntlProvider>: import ReactDOM from 'react-dom' import {IntlProvider} from 'react-intl' ReactDOM.render( <IntlProvider locale="en"> <App /> </IntlProvider>, document.getElementById('container') ) info The locale prop is singular, required, and only accepts a string value. This is a simplification of the plural locales prop used by the IntlMixin. ","version":"Next","tagName":"h3"},{"title":"Update to injectIntl()​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-to-injectintl","content":" The IntlMixin also provided the imperative API for custom components to use the format*() methods; e.g., formatDate() to get formatted strings for using in places like title and aria attribute. Remove the IntlMixin and instead use the injectIntl() Hight Order Component (HOC) factory function to inject the imperative API via props. Here's an example of a custom <RelativeTime> stateless component which uses injectIntl() and the imperative formatDate() API: import React from 'react' import {injectIntl, FormattedRelative} from 'react-intl' const to2Digits = num => `${num < 10 ? `0${num}` : num}` const RelativeTime = ({date, intl}) => { date = new Date(date) let year = date.getFullYear() let month = date.getMonth() + 1 let day = date.getDate() let formattedDate = intl.formatDate(date, { year: 'long', month: 'numeric', day: 'numeric', }) return ( <time dateTime={`${year}-${to2Digits(month)}-${to2Digits(day)}`} title={formattedDate} > <FormattedRelative value={date} /> </time> ) } export default injectIntl(RelativeTime) injectIntl() is similar to a connect() HOC factory function you might find in a Flux framework to connect a component to a store. ","version":"Next","tagName":"h3"},{"title":"Change How Messages are Formatted​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#change-how-messages-are-formatted","content":" The way string messages are formatted in React Intl v2 has changed significantly! This is the most disruptive set of change when upgrading from v1 to v2; but it enables many great new features. React Intl v2 introduces a new Message Descriptor concept which can be used to define an app's default string messages. A Message Descriptor is an object with the following properties, id is the only required prop: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) info This upgrade guide will focus on using Message Descriptors that only contain an id property. ","version":"Next","tagName":"h2"},{"title":"Flatten messages Object​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#flatten-messages-object","content":" React Intl v2 no longer supports nested messages objects, instead the collection of translated string messages passed to <IntlProvider> must be flat. This is an explicit design choice which simplifies while increasing flexibility. React Intl v2 does not apply any special semantics to strings with dots; e.g., "namespaced.string_id". Apps using a nested messages object structure could use the following function to flatten their object according to React Intl v1's semantics: function flattenMessages(nestedMessages, prefix = '') { return Object.keys(nestedMessages).reduce((messages, key) => { let value = nestedMessages[key] let prefixedKey = prefix ? `${prefix}.${key}` : key if (typeof value === 'string') { messages[prefixedKey] = value } else { Object.assign(messages, flattenMessages(value, prefixedKey)) } return messages }, {}) } let messages = flattenMessages(nestedMessages) info Message ids can still contain "."s, so the ids themselves remain the same, it's only the messages object structure that needs to change. ","version":"Next","tagName":"h3"},{"title":"Replace getIntlMessage() Calls with Message Descriptors​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#replace-getintlmessage-calls-with-message-descriptors","content":" The getIntlMessage() method that was provided by the IntlMixin has been removed in React Intl v2. It was simply a helper that interpreted a message id string with "."s by looking up the translated message in a nested messages object. With the removal of IntlMixin and the change to a flat messages object, this method has been removed. All calls to getIntlMessage() need to be replaced with a Message Descriptor. Replace: this.getIntlMessage('some.message.id') With: { id: 'some.message.id' } ","version":"Next","tagName":"h3"},{"title":"Update formatMessage() Calls​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-formatmessage-calls","content":" A typical pattern when calling formatMessage() is to nest a call to getIntlMessage(). These can be easily updated: 1.0: let message = this.formatMessage(this.getIntlMessage('some.message.id'), values) 2.0: let message = this.props.intl.formatMessage({id: 'some.message.id'}, values) info In React Intl v2, the formatMessage() function is injected via injectIntl(). ","version":"Next","tagName":"h3"},{"title":"Update FormattedMessage and FormattedHTMLMessage Instances​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-formattedmessage-and-formattedhtmlmessage-instances","content":" The props for these two components have completely changed in React Intl v2. Instead of taking a message prop and treating all other props as values to fill in placeholders in a message, <FormattedMessage> and <FormattedHTMLMessage> now the same props as a Message Descriptor plus a new values prop. The new values prop groups all of the message's placeholder values together into an object. The following example shows up to update a <FormattedMessage> instance to use the new props and remove the call to getIntlMessage(): 1.0: <FormattedMessage message={this.getIntlMessage('greeting')} name="Eric" /> 2.0: <FormattedMessage id="greeting" values={{name: 'Eric'}} /> ","version":"Next","tagName":"h3"},{"title":"Update How Relative Times are Formatted​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-how-relative-times-are-formatted","content":" Minor changes have been made to how the "now" reference time is specified when formatting relative times in React Intl v2. It's uncommon to specify this value outside of test code, so it might not exist in your app. ","version":"Next","tagName":"h2"},{"title":"Rename FormattedRelative's now Prop to initialNow​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#rename-formattedrelatives-now-prop-to-initialnow","content":" A new feature has been added to <FormattedRelative> instances in React Intl v2, they now "tick" and stay up to date. Since time moves forward, it was confusing to have a prop named now, so it has been renamed to initialNow. Any <FormattedRelative> instances that use now should update to prop name to initialNow: 1.0: <FormattedRelative value={date} now={otherDate} /> 2.0: <FormattedRelative value={date} initialNow={otherDate} /> info The <IntlProvider> component also has a initialNow prop which can be assigned a value to stabilize the "now" reference time for all <FormattedRelative> instances. This is useful for universal/isomorphic apps to proper React checksums between the server and client initial render. ","version":"Next","tagName":"h3"},{"title":"Merge formatRelative()'s Second and Third Arguments​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#merge-formatrelatives-second-and-third-arguments","content":" The signature of the formatRelative() function has been aligned with the other format*() functions and in React Intl v2, it only accepts two arguments: value and options. To specify a "now" reference time, add it to the options argument, and remove the third formatOptions argument: 1.0: let relative = this.formatRelative(date, {units: 'hour'}, {now: otherDate}) 2.0: let relative = this.props.intl.formatRelative(date, { units: 'hour', now: otherDate, }) info In React Intl v2, the formatRelative() function is injected via injectIntl(). ","version":"Next","tagName":"h3"},{"title":"Upgrade Guide (v3 -> v4)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-4x","content":"","keywords":"","version":"Next"},{"title":"Breaking API Changes​","type":1,"pageTitle":"Upgrade Guide (v3 -> v4)","url":"/docs/react-intl/upgrade-guide-4x#breaking-api-changes","content":" All tags specified must have corresponding values and will throw error if it's missing, e.g: new IntlMessageFormat('a<b>strong</b>').format({ b: (...chunks) => <strong>{chunks}</strong>, }) We don't allow formatting self-closing tags because we already use ICU {placeholder} syntax for that.XML/HTML tags are escaped using apostrophe just like other ICU constructs.Remove dependency on DOMParser and restrictions on void element like <link>. This effectively means you don't need to polyfill DOMParser in Node anymore.FormattedHTMLMessage & intl.formatHTMLMessage have been removed since FormattedMessage now fully supports embedded HTML tag. ","version":"Next","tagName":"h2"},{"title":"Why are we doing those changes?​","type":1,"pageTitle":"Upgrade Guide (v3 -> v4)","url":"/docs/react-intl/upgrade-guide-4x#why-are-we-doing-those-changes","content":" FormattedHTMLMessage & intl.formatHTMLMessage were originally created when React was fairly new. These components helped ease migration over from raw HTML to JSX. Given that current popularity of React right now and the fact that FormattedMessage allow rendering embedded HTML tag, this is no longer needed.Initially during the 1st iteration of embedded HTML support, we allow any tag that doesn’t have a corresponding formatter to be rendered as raw HTML. We’ve received feedbacks internally that allowing embedded HTML tag to be rendered as-is without sanitization is a XSS security risk. Therefore, in order to allow raw HTML tag you have to opt-in by escaping them using apostrophe. We will update our linter to check for this as well. ","version":"Next","tagName":"h2"},{"title":"Migrating off embedded HTML in messages​","type":1,"pageTitle":"Upgrade Guide (v3 -> v4)","url":"/docs/react-intl/upgrade-guide-4x#migrating-off-embedded-html-in-messages","content":" In order to restore the old behavior of FormattedHTMLMessage & intl.formatHTMLMessage, we suggest you use the rich text format feature as below: Old way: intl.formatHTMLMessage('This is a <a href="foo">link</a>') New way: intl.formatMessage('This is a <a>link</a>', { a: (...chunks) => sanitizeHTML(`<a href="foo">${chunks.join('')}</a>`), }) This forces developers to always sanitize their rendered HTML & chunks, thus minimizing XSS. ","version":"Next","tagName":"h2"},{"title":"Upgrade Guide (v4 -> v5)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-5x","content":"","keywords":"","version":"Next"},{"title":"Breaking API Changes​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#breaking-api-changes","content":" Rich text formatting callback function is no longer variadic. Before: new IntlMessageFormat('a<b>strong</b>').format({ b: (...chunks) => <strong>{chunks}</strong>, }) After: new IntlMessageFormat('a<b>strong</b>').format({ b: chunks => <strong>{chunks}</strong>, }) FormattedMessage render prop is no longer variadic. Before: <FormattedMessage defaultMessage="a<b>strong</b>"> {(...chunks) => <b>{chunks}</b>} </FormattedMessage> After: <FormattedMessage defaultMessage="a<b>strong</b>"> {chunks => <b>{chunks}</b>} </FormattedMessage> Using FormattedMessage without a intl context will fail fast. ","version":"Next","tagName":"h2"},{"title":"Why are we doing those changes?​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#why-are-we-doing-those-changes","content":" ","version":"Next","tagName":"h2"},{"title":"Rich text formatting callback function is no longer variadic​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#rich-text-formatting-callback-function-is-no-longer-variadic","content":" We received feedback from the community that variadic callback function isn't really ergonomic.There's also an issue where React chunks do not come with keys, thus causing warning in React during development.The chunks by themselves are not enough to render duplicate tags, such as <a>link</a> and another <a>link</a> where you want to render 2 different hrefs for the <a> tag. In this case a: chunks => <a>{chunks}</a> isn't enough especially when the contents are the same. In the future we can set another argument that might contain metadata to distinguish between the 2 elements. ","version":"Next","tagName":"h3"},{"title":"FormattedMessage render prop is no longer variadic​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#formattedmessage-render-prop-is-no-longer-variadic","content":" Same reasons as above. ","version":"Next","tagName":"h3"},{"title":"Using FormattedMessage without a intl context will fail fast​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#using-formattedmessage-without-a-intl-context-will-fail-fast","content":" This also comes from Dropbox internal developer feedback. FormattedMessage has a default English renderer that masks Provider setup issues which causes them to not be handled during testing phase. ","version":"Next","tagName":"h3"},{"title":"Components","type":0,"sectionRef":"#","url":"/docs/react-intl/components","content":"","keywords":"","version":"Next"},{"title":"Why Components?​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#why-components","content":" Beyond providing an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly: Render React elements that seamlessly compose with other React components.Support rich-text string/message formatting in <FormattedMessage>.Implement advanced features like <FormattedRelativeTime>'s updating over time.Provide TypeScript type definitions. ","version":"Next","tagName":"h2"},{"title":"IntlProvider​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#intlprovider","content":" React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree. caution All apps using React Intl must use the <IntlProvider> or <RawIntlProvider> component. This component is used to setup the i18n context for a tree. Usually, this component will wrap an app's root component so that the entire app will be within the configured i18n context. The following are the i18n configuration props that can be set: interface IntlConfig { locale: string formats: CustomFormats messages: Record<string, string> | Record<string, MessageFormatElement[]> defaultLocale: string defaultFormats: CustomFormats timeZone?: string textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements wrapRichTextChunksInFragment?: boolean defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>> onError(err: string): void } ","version":"Next","tagName":"h2"},{"title":"locale, formats, and messages​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#locale-formats-and-messages","content":" The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage. ","version":"Next","tagName":"h3"},{"title":"defaultLocale and defaultFormats​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#defaultlocale-and-defaultformats","content":" Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish. ","version":"Next","tagName":"h3"},{"title":"textComponent​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#textcomponent","content":" Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info. ","version":"Next","tagName":"h3"},{"title":"onError​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#onerror","content":" Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"onWarn​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#onwarn","content":" Allows the user to provide a custom warning handler. By default, warning messages are logged using console.warning if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"wrapRichTextChunksInFragment​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#wraprichtextchunksinfragment","content":" When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that. ","version":"Next","tagName":"h3"},{"title":"defaultRichTextElements​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#defaultrichtextelements","content":" A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context. These configuration props are combined with the <IntlProvider>'s component-specific props: Props: props: IntlConfig & { children: ReactNode, } Finally, child elements must be supplied to <IntlProvider>. Example: const App = ({importantDate}) => ( <div> <FormattedDate value={importantDate} year="numeric" month="long" day="numeric" weekday="long" /> </div> ) ReactDOM.render( <IntlProvider locale={navigator.language}> <App importantDate={new Date(1459913574887)} /> </IntlProvider>, document.getElementById('container') ) Assuming navigator.language is "fr": <div>mardi 5 avril 2016</div> ","version":"Next","tagName":"h3"},{"title":"RawIntlProvider​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#rawintlprovider","content":" This is the underlying React.Context.Provider object that IntlProvider use. It can be used in conjunction with createIntl: import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl({ locale: 'fr-FR', messages: {} }, cache) // Pass it to IntlProvider <RawIntlProvider value={intl}>{foo}</RawIntlProvider> ","version":"Next","tagName":"h2"},{"title":"FormattedDate​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddate","content":" This component uses the formatDate and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above. Props: props: Intl.DateTimeFormatOptions & { value: any, format: string, children: (formattedDate: string) => ReactElement, } By default <FormattedDate> will render the formatted date into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedDate value={new Date(1459832991883)} /> Result Example with Options: Live Editor <FormattedDate value={new Date(1459832991883)} year="numeric" month="long" day="2-digit" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedDateParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddateparts","content":" browser support This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11. This component provides more customization to FormattedDate by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here Props: props: Intl.DateTimeFormatOptions & { value: any, format: string, children: (parts: Intl.DateTimeFormatPart[]) => ReactElement, } Live Editor <FormattedDateParts value={new Date(1459832991883)} year="numeric" month="long" day="2-digit" > {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedDateParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedTime​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedtime","content":" This component uses the formatTime and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above, with the following defaults: { hour: 'numeric', minute: 'numeric', } Props: props: DateTimeFormatOptions & { value: any, format: string, children: (formattedDate: string) => ReactElement, } By default <FormattedTime> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedTime value={new Date(1459832991883)} /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedTimeParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedtimeparts","content":" browser support This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11. This component provides more customization to FormattedTime by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here Props: props: Intl.DateTimeFormatOptions & { value: any, format: string, children: (parts: Intl.DateTimeFormatPart[]) => ReactElement, } Live Editor <FormattedTimeParts value={new Date(1459832991883)}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedTimeParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedDateTimeRange​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddatetimerange","content":" browser support This requires stage-3 API Intl.RelativeTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them. This component uses the formatDateTimeRange and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above Props: props: DateTimeFormatOptions & { from: number | Date, to: number | Date, children: (formattedDate: string) => ReactElement, } By default <FormattedDateTimeRange> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedDateTimeRange from={new Date('2020-1-1')} to={new Date('2020-1-15')} /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedRelativeTime​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedrelativetime","content":" browser support This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them. This component uses the formatRelativeTime API and has props that correspond to the following relative formatting options: type RelativeTimeFormatOptions = { numeric?: 'always' | 'auto' style?: 'long' | 'short' | 'narrow' } Prop Types: props: RelativeTimeFormatOptions & { value: number, unit: Unit, format: string, updateIntervalInSeconds: number, children: (formattedDate: string) => ReactElement, } By default <FormattedRelativeTime> will render the formatted relative time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedRelativeTime value={0} numeric="auto" updateIntervalInSeconds={1} /> Result maximum interval You can adjust the maximum interval that the component will re-render by setting the updateIntervalInSeconds. A falsy value will turn off auto-updating. The updating is smart and will schedule the next update for the next interesting moment. An interesting moment is defined as the next non-fractional value for that unit. For example: Live Editor <FormattedRelativeTime value={-50} updateIntervalInSeconds={1} /> Result This will initially renders 59 seconds ago, after 1 second, will render 1 minute ago, and will not re-render until a full minute goes by, it'll render 2 minutes ago. It will not try to render 1.2 minutes ago. limitation updateIntervalInSeconds cannot be enabled for unit longer than hour (so not for day, week, quarter, year). This is primarily because it doesn't make sense to schedule a timeout in days, and the number of ms in a day is larger than the max timeout that setTimeout accepts. ","version":"Next","tagName":"h2"},{"title":"FormattedNumber​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattednumber","content":" This component uses the formatNumber and Intl.NumberFormat APIs and has props that correspond to Intl.NumberFormatOptions. Props: props: NumberFormatOptions & { value: number, format: string, children: (formattedNumber: string) => ReactElement, } By default <FormattedNumber> will render the formatted number into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedNumber value={1000} /> Result Example Formatting Currency Values Live Editor <FormattedNumber value={1000} style="currency" currency="USD" /> Result Formatting Number using unit Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and react-intl types allow users to pass in a sanctioned unit. For example: Live Editor <FormattedNumber value={1000} style="unit" unit="kilobyte" unitDisplay="narrow" /> Result Live Editor <FormattedNumber value={1000} unit="fahrenheit" unitDisplay="long" style="unit" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedNumberParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattednumberparts","content":" browser support This requires Intl.NumberFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11. This component provides more customization to FormattedNumber by allowing children function to have access to underlying parts of the formatted number. The available parts are listed here. Props: props: NumberFormatOptions & { value: number, format: string, children: (parts: Intl.NumberFormatPart[]) => ReactElement, } Example: Live Editor <FormattedNumberParts value={1000}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedNumberParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedPlural​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedplural","content":" This component uses the formatPlural API and Intl.PluralRules has props that correspond to Intl.PluralRulesOptions. Props: props: PluralFormatOptions & { value: any, other: ReactElement, zero: ReactElement, one: ReactElement, two: ReactElement, few: ReactElement, many: ReactElement, children: (formattedPlural: ReactElement) => ReactElement, } By default <FormattedPlural> will select a plural category (zero, one, two, few, many, or other) and render the corresponding React element into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedPlural value={10} one="message" other="messages" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedList​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedlist","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. This component uses formatList API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions. Props: props: ListFormatOptions & { children: (chunksOrString: string | React.ReactElement[]) => ReactElement, } Example: When the locale is en: Live Editor <FormattedList type="conjunction" value={['Me', 'myself', 'I']} /> Result Live Editor <FormattedList type="conjunction" value={['Me', <b>myself</b>, 'I']} /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedListParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedlistparts","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. This component uses formatListToParts API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions. Props: props: ListFormatOptions & { children: (chunks: Array<React.ReactElement | string>) => ReactElement, } Example: When the locale is en: Live Editor <FormattedListParts type="conjunction" value={['Me', 'myself', 'I']}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> {parts[3].value} <small>{parts[4].value}</small> </> )} </FormattedListParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedDisplayName​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddisplayname","content":" browser support This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them. This component uses formatDisplayName and Intl.DisplayNameshas props that correspond to DisplayNameOptions. You might need a polyfill. Props: props: FormatDisplayNameOptions & { value: string | number | Record<string, unknown>, } Example: When the locale is en: Live Editor <FormattedDisplayName type="language" value="zh-Hans-SG" /> Result Live Editor <FormattedDisplayName type="currency" value="JPY" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedMessage​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedmessage","content":" This component uses the formatMessage API and has props that correspond to a Message Descriptor. Props: props: MessageDescriptor & { values: object, tagName: string, children: (chunks: ReactElement) => ReactElement, } ","version":"Next","tagName":"h2"},{"title":"Message Syntax​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#message-syntax","content":" String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime. Simple Message: Hello, {name} Complex Message: Hello, {name}, you have {itemCount, plural, =0 {no items} one {# item} other {# items} }. See: The Message Syntax Guide. ","version":"Next","tagName":"h3"},{"title":"Message Descriptor​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#message-descriptor","content":" React Intl has a Message Descriptor concept which is used to define your app's default messages/strings. <FormattedMessage> have props which correspond to a Message Descriptor. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) type MessageDescriptor = { id?: string defaultMessage?: string description?: string } compile message descriptors The babel-plugin-formatjs and @formatjs/ts-transformer packages can be used to compile Message Descriptors defined in JavaScript source files into AST for performance. ","version":"Next","tagName":"h3"},{"title":"Message Formatting Fallbacks​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#message-formatting-fallbacks","content":" The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm: Lookup and format the translated message at id, passed to <IntlProvider>.Fallback to formatting the defaultMessage.Fallback to translated message at id's source.Fallback to defaultMessage source.Fallback to the literal message id. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#usage","content":" By default <FormattedMessage> will render the formatted string into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), specify a different tagName (e.g., 'div'), or pass a function as the child. Example: Live Editor <FormattedMessage id="app.greeting" description="Greeting to welcome the user to the app" defaultMessage="Hello, {name}!" values={{ name: 'Eric', }} /> Result Example: function as the child Live Editor <FormattedMessage id="title">{txt => <h1>{txt}</h1>}</FormattedMessage> Result simple message Messages can be simple strings without placeholders, and that's the most common type of message. This case is highly-optimized, but still has the benefits of the fallback procedure. ","version":"Next","tagName":"h3"},{"title":"Rich Text Formatting​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#rich-text-formatting","content":" <FormattedMessage> also supports rich-text formatting by specifying a XML tag in the message & resolving that tag in the values prop. Here's an example: Live Editor <FormattedMessage id="app.greeting" description="Greeting to welcome the user to the app" defaultMessage="Hello, <b>Eric</b> {icon}" values={{ b: chunks => <b>{chunks}</b>, icon: <svg />, }} /> Result By allowing embedding XML tag we want to make sure contextual information is not lost when you need to style part of the string. In a more complicated example like: Live Editor <FormattedMessage id="foo" defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>" values={{ a: chunks => ( <a class="external_link" target="_blank" href="https://www.example.com/shoe" > {chunks} </a> ), cta: chunks => <strong class="important">{chunks}</strong>, }} /> Result ","version":"Next","tagName":"h3"},{"title":"Function as the child​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#function-as-the-child","content":" Since rich text formatting allows embedding ReactElement, in function as the child scenario, the function will receive the formatted message chunks as a single parameter. Live Editor <FormattedMessage id="foo" defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>" values={{ a: chunks => ( <a class="external_link" target="_blank" href="https://www.example.com/shoe" > {chunks} </a> ), cta: chunks => <strong class="important">{chunks}</strong>, }} > {chunks => <h2>{chunks}</h2>} </FormattedMessage> Result All the rich text gets translated together which yields higher quality output. This brings feature-parity with other translation libs as well, such as fluent by Mozilla (using overlays concept). Extending this also allows users to potentially utilizing other rich text format, like Markdown. ","version":"Next","tagName":"h3"},{"title":"babel-plugin-formatjs","type":0,"sectionRef":"#","url":"/docs/tooling/babel-plugin","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#installation","content":" npmyarn npm i babel-plugin-formatjs ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#usage","content":" This Babel plugin only visits ES6 modules which import React Intl. The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package. ","version":"Next","tagName":"h2"},{"title":"Via babel.config.json (Recommended)​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#via-babelconfigjson-recommended","content":" babel.config.json { "plugins": [ [ "formatjs", { "idInterpolationPattern": "[sha512:contenthash:base64:6]", "ast": true } ] ] } ","version":"Next","tagName":"h3"},{"title":"Via Node API​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#via-node-api","content":" The extract message descriptors are available via the metadata property on the object returned from Babel's transform() API: require('@babel/core').transform('code', { plugins: ['formatjs'], }) // => { code, map, ast, metadata['formatjs'].messages, metadata['formatjs'].meta }; ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#options","content":" ","version":"Next","tagName":"h2"},{"title":"overrideIdFn​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#overrideidfn","content":" A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages. ","version":"Next","tagName":"h3"},{"title":"idInterpolationPattern​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#idinterpolationpattern","content":" If certain message descriptors don't have id, this pattern will be used to automaticallygenerate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings. ","version":"Next","tagName":"h3"},{"title":"removeDefaultMessage​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#removedefaultmessage","content":" Remove defaultMessage field in generated js after extraction. ","version":"Next","tagName":"h3"},{"title":"additionalComponentNames​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#additionalcomponentnames","content":" Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe. ","version":"Next","tagName":"h3"},{"title":"additionalFunctionNames​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#additionalfunctionnames","content":" Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t. ","version":"Next","tagName":"h3"},{"title":"pragma​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#pragma","content":" parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" id="bar" /> and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file. ","version":"Next","tagName":"h3"},{"title":"ast​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#ast","content":" Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true. ","version":"Next","tagName":"h3"},{"title":"Upgrade Guide (v2 -> v3)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-3x","content":"","keywords":"","version":"Next"},{"title":"Breaking API Changes​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#breaking-api-changes","content":" addLocaleData has been removed. See Migrate to using native Intl APIs for more details.ReactIntlLocaleData has been removed. See Migrate to using native Intl APIs for more details.intlShape has been removed. See TypeScript Support for more details.Change default textComponent in IntlProvider to React.Fragment. In order to keep the old behavior, you can explicitly set textComponent to span. <IntlProvider textComponent="span" /> FormattedRelative has been renamed to FormattedRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.formatRelative has been renamed to formatRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.Message Format syntax changes. See Message Format Syntax Changes for more details.IntlProvider no longer inherits from upstream IntlProvider. ","version":"Next","tagName":"h2"},{"title":"Use React 16.3 and upwards​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#use-react-163-and-upwards","content":" React Intl v3 supports the new context API, fixing all kinds of tree update problems 🎉In addition it makes use of the new lifecycle hooks (and gets rid of the deprecated ones). It also supports the new React.forwardRef() enabling users to directly access refs using the standard ref prop (see beneath for further information). ","version":"Next","tagName":"h2"},{"title":"Migrate withRef to forwardRef​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#migrate-withref-to-forwardref","content":" With the update to React >= 16.3 we got the option to use the new React.forwardRef() feature and because of this deprecated the use of the withRef option for the injectIntl HOC in favour of forwardRef. When forwardRef is set to true, you can now simply pretend the HOC wasn't there at all. Intl v2: import React from 'react' import {injectIntl} from 'react-intl' class MyComponent extends React.Component { doSomething = () => console.log(this.state || null) render() { return <div>Hello World</div> } } export default injectIntl(MyComponent, {withRef: true}) // somewhere else class Parent extends React.Component { componentDidMount() { this.myComponentRef.getWrappedInstance().doSomething() } render() { return ( <MyComponent ref={ref => { this.myComponentRef = ref }} /> ) } } Intl v3: import React from 'react' import {injectIntl} from 'react-intl' class MyComponent extends React.Component { doSomething = () => console.log(this.state || null) render() { return <div>Hello World</div> } } export default injectIntl(MyComponent, {forwardRef: true}) // somewhere else class Parent extends React.Component { myComponentRef = React.createRef() componentDidMount() { this.myComponentRef.doSomething() // no need to call getWrappedInstance() } render() { return <MyComponent ref={this.myComponentRef} /> } } ","version":"Next","tagName":"h2"},{"title":"New useIntl hook as an alternative of injectIntl HOC​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#new-useintl-hook-as-an-alternative-of-injectintl-hoc","content":" This v3 release also supports the latest React hook API for user with React >= 16.8. You can now take useIntl hook as an alternative to injectIntl HOC on function components. Both methods allow you to access the intl instance, here is a quick comparison: // injectIntl import {injectIntl} from 'react-intl' const MyComponentWithHOC = injectIntl(({intl, ...props}) => { // do something }) // useIntl import {useIntl} from 'react-intl' const MyComponentWithHook = props => { const intl = useIntl() // do something } To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks. ","version":"Next","tagName":"h2"},{"title":"Migrate to using native Intl APIs​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#migrate-to-using-native-intl-apis","content":" React Intl v3 no longer comes with CLDR data and rely on native Intl API instead. Specifically the new APIs we're relying on are: Intl.PluralRules: This can be polyfilled using this package.Intl.RelativeTimeFormat: This can be polyfilled using this package. This shift is meant to future-proof React Intl as these APIs are all stable and being implemented in modern browsers. This also means we no longer package and consume CLDRs in this package. If you previously were using addLocaleData to support older browsers, we recommend you do the following: If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build.If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 13-), include this polyfill in your build along with individual CLDR data for each locale you support. require('@formatjs/intl-pluralrules/polyfill') require('@formatjs/intl-pluralrules/locale-data/de') // Add locale data for de require('@formatjs/intl-relativetimeformat/polyfill') require('@formatjs/intl-relativetimeformat/locale-data/de') // Add locale data for de When using React Intl in Node.js, your node binary has to either: Get compiled with full-icu using these instructions OR Uses full-icu npm package ","version":"Next","tagName":"h2"},{"title":"TypeScript Support​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#typescript-support","content":" react-intl has been rewritten in TypeScript and thus has native TypeScript support. Therefore, we've also removed prop-types dependency and expose IntlShape as an interface instead. All types should be available from top level index file without importing from specific subfiles. For example: import {IntlShape} from 'react-intl' // Correct import {IntlShape} from 'react-intl/lib/types' // Incorrect If we're missing any interface top level support, please let us know and/or submitting a PR is greatly appreciated :) info You might need to make a few changes to your code if you were relying on the now deprecated @types/react-intl package. The most common example is InjectedIntlProps which must be replaced with WrappedComponentProps. ","version":"Next","tagName":"h2"},{"title":"FormattedRelativeTime​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#formattedrelativetime","content":" When we introduced FormattedRelative, the spec for Intl.RelativeTimeFormat was still unstable. It has now reached stage 3 and multiple browsers have implemented it. However, its API is different from FormattedRelative so we've adjusted its API to match the spec which means it's not backwards compatible. All units (such as day-short) becomes a combination of unit & style: <FormattedRelative units="second-short"/> // will be <FormattedRelativeTime unit="second" style="short"/> style becomes numeric (which is the default): <FormattedRelative style="numeric"/> // will be <FormattedRelativeTime /> <FormattedRelative style="best fit"/> // will be <FormattedRelativeTime numeric="auto"/> Type of value is no longer Date, but rather delta in the specified unit: <FormattedRelative value={Date.now() - 1000} units="second-narrow"/> // will be <FormattedRelativeTime value={-1} unit="second" style="narrow" /> <FormattedRelative value={Date.now() + 2000} units="second-narrow"/> // will be <FormattedRelativeTime value={2} unit="second" style="narrow" /> updateInterval becomes updateIntervalInSeconds and will only take the time delta in seconds. Update behavior remains the same, e.g: <FormattedRelativeTime value={2} numeric="auto" unit="second" style="narrow" updateIntervalInSeconds={1} /> // Initially prints: `in 2s` // 1 second later: `in 1s` // 1 second later: `now` // 1 second later: `1s ago` // 60 seconds later: `1m ago` initialNow has been removed. Similarly, the functional counterpart of this component which is formatRelative has been renamed to formatRelativeTime and its parameters have been changed to reflect this component's props accordingly. Implementing FormattedRelative behavior You can use @formatjs/intl-utils to get close to the previous behavior like this: import {selectUnit} from '@formatjs/intl-utils' const {value, unit} = selectUnit(Date.now() - 48 * 3600 * 1000) // render ;<FormattedRelativeTime value={value} unit={unit} /> ","version":"Next","tagName":"h2"},{"title":"Enhanced FormattedMessage & formatMessage rich text formatting​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#enhanced-formattedmessage--formatmessage-rich-text-formatting","content":" In v2, in order to do rich text formatting (embedding a ReactElement), you had to do this: <FormattedMessage defaultMessage="To buy a shoe, { link } and { cta }" values={{ link: ( <a class="external_link" target="_blank" href="https://www.shoe.com/"> visit our website </a> ), cta: <strong class="important">eat a shoe</strong>, }} /> Now you can do: <FormattedMessage defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>eat a shoe</cta>" values={{ a: msg => ( <a class="external_link" target="_blank" href="https://www.shoe.com/"> {msg} </a> ), cta: msg => <strong class="important">{msg}</strong>, }} /> The change solves several issues: Contextual information was lost when you need to style part of the string: In this example above, link effectively is a blackbox placeholder to a translator. It can be a person, an animal, or a timestamp. Conveying contextual information via description & placeholder variable is often not enough since the variable can get sufficiently complicated.This brings feature-parity with other translation libs, such as fluent by Mozilla (using Overlays). If previously in cases where you pass in a ReactElement to a placeholder we highly recommend that you rethink the structure so that as much text is declared as possible: Before <FormattedMessage defaultMessage="Hello, {name} is {awesome} and {fun}" values={{ name: <b>John</b>, awesome: <span style="font-weight: bold;">awesome</span> fun: <span>fun and <FormattedTime value={Date.now()}/></span> }} /> After <FormattedMessage defaultMessage="Hello, <b>John</b> is <custom>awesome</custom> and <more>fun and {ts, time}</more>" values={{ b: name => <b>{name}</b>, custom: str => <span style="font-weight: bold;">{str}</span>, more: chunks => <span>{chunks}</span>, }} /> ","version":"Next","tagName":"h2"},{"title":"ESM Build​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#esm-build","content":" react-intl and its underlying libraries (intl-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat, intl-format-cache, intl-utils) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries. ","version":"Next","tagName":"h2"},{"title":"Jest​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#jest","content":" Add transformIgnorePatterns to always include those libraries, e.g: { transformIgnorePatterns: [ '/node_modules/(?!intl-messageformat|intl-messageformat-parser).+\\\\.js$', ], } ","version":"Next","tagName":"h3"},{"title":"webpack​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#webpack","content":" If you're using babel-loader, add those libraries in include, e.g: include: [ path.join(__dirname, "node_modules/react-intl"), path.join(__dirname, "node_modules/intl-messageformat"), path.join(__dirname, "node_modules/intl-messageformat-parser"), ], ","version":"Next","tagName":"h3"},{"title":"Creating intl without using Provider​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#creating-intl-without-using-provider","content":" We've added a new API called createIntl that allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example: import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl({ locale: 'fr-FR', messages: {} }, cache) // Call imperatively intl.formatNumber(20) // Pass it to IntlProvider <RawIntlProvider value={intl}>{foo}</RawIntlProvider> This is especially beneficial in SSR where you can reuse the same intl object across requests. ","version":"Next","tagName":"h2"},{"title":"Message Format Syntax Changes​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#message-format-syntax-changes","content":" We've rewritten our parser to be more faithful to ICU Message Format, in order to potentially support skeleton. So far the backwards-incompatible changes are: ","version":"Next","tagName":"h2"},{"title":"Escape character has been changed to apostrophe (').​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#escape-character-has-been-changed-to-apostrophe-","content":" Previously while we were using ICU message format syntax, our escape char was backslash (\\). This however creates issues with strict ICU translation vendors that support other implementations like ICU4J/ICU4C. Thanks to @pyrocat101 we've changed this behavior to be spec-compliant. This means: // Before <FormattedMessage defaultMessage="\\\\{foo\\\\}" /> //prints out "{foo}" // After <FormattedMessage defaultMessage="'{foo}'" /> //prints out "{foo}" We highly recommend reading the spec to learn more about how quote/escaping works here under Quoting/Escaping section. ","version":"Next","tagName":"h3"},{"title":"Placeholder argument syntax change​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#placeholder-argument-syntax-change","content":" Placeholder argument can no longer have - (e.g: this is a {placeholder-var} is invalid but this is a {placeholder_var} is). ","version":"Next","tagName":"h3"},{"title":"Testing​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#testing","content":" We've removed IntlProvider.getChildContext for testing and now you can use createIntl to create a standalone intl object outside of React and use that for testing purposes. See Testing with React Intl for more details. ","version":"Next","tagName":"h2"},{"title":"Imperative API","type":0,"sectionRef":"#","url":"/docs/react-intl/api","content":"","keywords":"","version":"Next"},{"title":"Why Imperative API?​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#why-imperative-api","content":" While our components provide a seamless integration with React, the imperative API are recommended (sometimes required) in several use cases: Setting text attributes such as title, aria-label and the like where a React component cannot be used (e.g <img title/>)Formatting text/datetime... in non-React environment such as Node, Server API, Redux store, testing...High performance scenarios where the number of React components rendered becomes the bottleneck (e.g Finance stock portfolio rendering, virtual tables with a lot of cells...) ","version":"Next","tagName":"h2"},{"title":"The intl object​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#the-intl-object","content":" The core of react-intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated. tip The intl object should be reused as much as possible for performance. There are a few ways to get access to the intl object: useIntl hook: Once you've declared your IntlProvider, you can get access to the intl object via calling this hook in your functional React componentinjectIntl HOC: In class-based React components, you can wrap them with the injectIntl HOC and intl should be available as a prop.createIntl: In a non-React environment (Node, vue, angular, testing... you name it), you can directly create a intl object by calling this function with the same configuration as the IntlProvider. ","version":"Next","tagName":"h2"},{"title":"useIntl hook​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#useintl-hook","content":" If a component can be expressed in a form of function component, using useIntl hook can be handy. This useIntl hook does not expect any option as its argument when being called. Typically, here is how you would like to use: import React from 'react' import {useIntl, FormattedDate} from 'react-intl' const FunctionComponent: React.FC<{date: number | Date}> = ({date}) => { const intl = useIntl() return ( <span title={intl.formatDate(date)}> <FormattedDate value={date} /> </span> ) } export default FunctionComponent To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks. ","version":"Next","tagName":"h2"},{"title":"injectIntl HOC​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#injectintl-hoc","content":" type WrappedComponentProps<IntlPropName extends string = 'intl'> = { [k in IntlPropName]: IntlShape } type WithIntlProps<P> = Omit<P, keyof WrappedComponentProps> & { forwardedRef?: React.Ref<any> } function injectIntl< IntlPropName extends string = 'intl', P extends WrappedComponentProps<IntlPropName> = WrappedComponentProps<any>, >( WrappedComponent: React.ComponentType<P>, options?: Opts<IntlPropName> ): React.ComponentType<WithIntlProps<P>> & { WrappedComponent: typeof WrappedComponent } This function is exported by the react-intl package and is a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.) By default, the formatting API will be provided to the wrapped component via props.intl, but this can be overridden when specifying options.intlPropName. The value of the prop will be of type IntlShape, defined in the next section. import React from 'react' import {injectIntl, FormattedDate} from 'react-intl' interface Props { date: Date | number } const FunctionalComponent: React.FC<Props> = props => { const { date, intl, // Injected by `injectIntl` } = props return ( <span title={intl.formatDate(date)}> <FormattedDate value={date} /> </span> ) } export default injectIntl(FunctionalComponent) ","version":"Next","tagName":"h2"},{"title":"createIntl​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#createintl","content":" This allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example: import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl({ locale: 'fr-FR', messages: {} }, cache) // Call imperatively intl.formatNumber(20) // Pass it to IntlProvider <RawIntlProvider value={intl}>{foo}</RawIntlProvider> ","version":"Next","tagName":"h2"},{"title":"createIntlCache​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#createintlcache","content":" Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache. ","version":"Next","tagName":"h2"},{"title":"IntlShape​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#intlshape","content":" interface IntlConfig { locale: string timeZone?: string formats: CustomFormats textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements messages: Record<string, string> | Record<string, MessageFormatElement[]> defaultLocale: string defaultFormats: CustomFormats onError(err: string): void onWarn(warning: string): void } interface IntlFormatters { formatDate(value: number | Date | string, opts?: FormatDateOptions): string formatTime(value: number | Date | string, opts?: FormatDateOptions): string formatDateToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatTimeToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatRelativeTime( value: number, unit?: FormattableUnit, opts?: FormatRelativeTimeOptions ): string formatNumber(value: number, opts?: FormatNumberOptions): string formatNumberToParts( value: number, opts?: FormatNumberOptions ): Intl.NumberFormatPart[] formatPlural( value: number | string, opts?: FormatPluralOptions ): ReturnType<Intl.PluralRules['select']> formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>> ): string formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>> ): R formatList(values: Array<string>, opts?: FormatListOptions): string formatList( values: Array<string | T>, opts?: FormatListOptions ): T | string | Array<string | T> formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[] formatDisplayName( value: string, opts?: FormatDisplayNameOptions ): string | undefined } type IntlShape = IntlConfig & IntlFormatters This interface is exported by the react-intl package that can be used in conjunction with the injectIntl HOC factory function. The definition above shows what the props.intl object will look like that's injected to your component via injectIntl. It's made up of two parts: IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.IntlFormatters: The imperative formatting API described below. ","version":"Next","tagName":"h2"},{"title":"locale, formats, and messages​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#locale-formats-and-messages","content":" The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage. ","version":"Next","tagName":"h3"},{"title":"defaultLocale and defaultFormats​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#defaultlocale-and-defaultformats","content":" Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish. ","version":"Next","tagName":"h3"},{"title":"textComponent​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#textcomponent","content":" Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info. ","version":"Next","tagName":"h3"},{"title":"onError​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#onerror","content":" Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"wrapRichTextChunksInFragment​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#wraprichtextchunksinfragment","content":" When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that. ","version":"Next","tagName":"h3"},{"title":"defaultRichTextElements​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#defaultrichtextelements","content":" A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context. ","version":"Next","tagName":"h3"},{"title":"formatDate​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatdate","content":" function formatDate( value: number | Date | string, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatDate(Date.now(), { year: 'numeric', month: 'numeric', day: 'numeric', }) Result ","version":"Next","tagName":"h2"},{"title":"formatTime​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formattime","content":" function formatTime( value: number | Date | string, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string, but it differs from formatDate by having the following default options: { hour: 'numeric', minute: 'numeric', } It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatTime(Date.now()) /* "4:03 PM" */ Result ","version":"Next","tagName":"h2"},{"title":"formatDateTimeRange​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatdatetimerange","content":" browser support This requires Intl.DateTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them. function formatDateTimeRange( from: number | Date | string, to: number | Date | string, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date/time range string. Both from & to must be values which can be parsed as a date (i.e., isFinite(new Date(value))). It expects 2 values (a from Date & a to Date) and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatDateTimeRange(new Date('2020-1-1'), new Date('2020-1-15')) Result ","version":"Next","tagName":"h2"},{"title":"formatRelativeTime​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatrelativetime","content":" browser support This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them. type Unit = | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year' type RelativeTimeFormatOptions = { numeric?: 'always' | 'auto' style?: 'long' | 'short' | 'narrow' } function formatRelativeTime( value: number, unit: Unit, options?: Intl.RelativeTimeFormatOptions & { format?: string } ): string This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions. Live Editor intl.formatRelativeTime(0) Result Live Editor intl.formatRelativeTime(-24, 'hour', {style: 'narrow'}) Result ","version":"Next","tagName":"h2"},{"title":"formatNumber​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatnumber","content":" This function uses Intl.NumberFormat options. function formatNumber( value: number, options?: Intl.NumberFormatOptions & {format?: string} ): string This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions. Live Editor intl.formatNumber(1000, {style: 'currency', currency: 'USD'}) Result Formatting Number using unit Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and react-intl types allow users to pass in a sanctioned unit: Live Editor intl.formatNumber(1000, { style: 'unit', unit: 'kilobyte', unitDisplay: 'narrow', }) Result Live Editor intl.formatNumber(1000, { unit: 'fahrenheit', unitDisplay: 'long', style: 'unit', }) Result ","version":"Next","tagName":"h2"},{"title":"formatPlural​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatplural","content":" type PluralFormatOptions = { type?: 'cardinal' | 'ordinal' = 'cardinal' } function formatPlural( value: number, options?: Intl.PluralFormatOptions ): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other' This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions. This is a low-level utility whose output could be provided to a switch statement to select a particular string to display. Live Editor intl.formatPlural(1) Result Live Editor intl.formatPlural(3, {style: 'ordinal'}) Result Live Editor intl.formatPlural(4, {style: 'ordinal'}) Result multiple language support This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead. ","version":"Next","tagName":"h2"},{"title":"formatList​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatlist","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. type ListFormatOptions = { type?: 'disjunction' | 'conjunction' | 'unit' style?: 'long' | 'short' | 'narrow' } function formatList( elements: (string | React.ReactNode)[], options?: Intl.ListFormatOptions ): string | React.ReactNode[] This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en: Live Editor intl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'}) Result Live Editor intl.formatList(['5 hours', '3 minutes'], {type: 'unit'}) Result ","version":"Next","tagName":"h2"},{"title":"formatDisplayName​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatdisplayname","content":" browser support This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them. type FormatDisplayNameOptions = { style?: 'narrow' | 'short' | 'long' type?: 'language' | 'region' | 'script' | 'currency' fallback?: 'code' | 'none' } function formatDisplayName( value: string | number | Record<string, unknown>, options?: FormatDisplayNameOptions ): string | undefined Usage examples: Live Editor intl.formatDisplayName('zh-Hans-SG', {type: 'language'}) Result Live Editor // ISO-15924 four letters script code to localized display name intl.formatDisplayName('Deva', {type: 'script'}) Result Live Editor // ISO-4217 currency code to localized display name intl.formatDisplayName('CNY', {type: 'currency'}) Result Live Editor // ISO-3166 two letters region code to localized display name intl.formatDisplayName('UN', {type: 'region'}) Result ","version":"Next","tagName":"h2"},{"title":"formatMessage​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatmessage","content":" ","version":"Next","tagName":"h2"},{"title":"Message Syntax​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#message-syntax","content":" String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime. Simple Message: Hello, {name} Complex Message: Hello, {name}, you have {itemCount, plural, =0 {no items} one {# item} other {# items} }. See: The Message Syntax Guide. ","version":"Next","tagName":"h3"},{"title":"Message Descriptor​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#message-descriptor","content":" React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) type MessageDescriptor = { id: string defaultMessage?: string description?: string | object } Extracting Message Descriptor You can extract inline-declared messages from source files using our CLI. ","version":"Next","tagName":"h3"},{"title":"Message Formatting Fallbacks​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#message-formatting-fallbacks","content":" The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm: Lookup and format the translated message at id, passed to <IntlProvider>.Fallback to formatting the defaultMessage.Fallback to source of translated message at id.Fallback to source of defaultMessage.Fallback to the literal message id. Above, "source" refers to using the template as is, without any substitutions made. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#usage","content":" type MessageFormatPrimitiveValue = string | number | boolean | null | undefined function formatMessage( descriptor: MessageDescriptor, values?: Record<string, MessageFormatPrimitiveValue> ): string function formatMessage( descriptor: MessageDescriptor, values?: Record< string, MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn > ): string | React.ReactNode[] This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message. If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details. Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: 'Eric'}) } Result with ReactElement Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: <b>Eric</b>}) } Result with rich text formatting Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, <bold>{name}</bold>!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, { name: 'Eric', bold: str => <b>{str}</b>, }) } Result The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin. simple message Messages can be simple strings without placeholders, and that's the most common type of message. ","version":"Next","tagName":"h3"},{"title":"defineMessages/defineMessage​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#definemessagesdefinemessage","content":" interface MessageDescriptor { id?: string description?: string | object defaultMessage?: string } function defineMessages( messageDescriptors: Record<string, MessageDescriptor> ): Record<string, MessageDescriptor> function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor These functions are exported by the react-intl package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in. import {defineMessages, defineMessage} from 'react-intl' const messages = defineMessages({ greeting: { id: 'app.home.greeting', description: 'Message to greet the user.', defaultMessage: 'Hello, {name}!', }, }) const msg = defineMessage({ id: 'single', defaultMessage: 'single message', description: 'header', }) ","version":"Next","tagName":"h2"},{"title":"swc-plugin","type":0,"sectionRef":"#","url":"/docs/tooling/swc-plugin","content":"swc-plugin This has been migrated over to the swc repo itself. You can find the plugin here.","keywords":"","version":"Next"},{"title":"CLI","type":0,"sectionRef":"#","url":"/docs/tooling/cli","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#installation","content":" npmyarn npm i -D @formatjs/cli Add the following command to your package.json scripts: { "scripts": { "extract": "formatjs extract", "compile": "formatjs compile" } } We've built this CLI that helps you extract messages from a list of files. It uses @formatjs/ts-transformer under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below: import {defineMessages, defineMessage} from 'react-intl' defineMessages({ foo: { id: 'foo', defaultMessage: 'foo', description: 'bar', }, }) defineMessage({ id: 'single', defaultMessage: 'single message', description: 'header', }) import {FormattedMessage} from 'react-intl' ;<FormattedMessage id="foo" defaultMessage="foo" description="bar" /> function Comp(props) { const {intl} = props return intl.formatMessage({ // The whole `intl.formatMessage` is required so we can extract id: 'foo', defaultMessage: 'foo', description: 'bar', }) } ","version":"Next","tagName":"h2"},{"title":"Extraction​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#extraction","content":" npmyarn npm run extract -- --help # Usage: formatjs extract [options] [files...] # Extract string messages from React components that use react-intl. # The input language is expected to be TypeScript or ES2017 with JSX. For example: npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang.json caution You should always quote (" or ') your glob pattern (like "src/**/*") to avoid auto shell expansion of those glob, which varies depending on your shell (zsh vs fish vs bash). ","version":"Next","tagName":"h2"},{"title":"--format [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--format-path","content":" Path to a formatter file that controls the shape of JSON file from --out-file. The formatter file must export a function called format with the signature. type FormatFn = <T = Record<string, MessageDescriptor>>( msgs: Record<string, MessageDescriptor> ) => T This is especially useful to convert from our extracted format to a TMS-specific format. See our builtin formatters for examples. ","version":"Next","tagName":"h3"},{"title":"--out-file [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--out-file-path","content":" The target file path where the plugin will output an aggregated .json file of allthe translations from the files supplied. This flag will ignore --messages-dir ","version":"Next","tagName":"h3"},{"title":"--id-interpolation-pattern [pattern]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--id-interpolation-pattern-pattern","content":" If certain message descriptors don't have id, this pattern will be used to automatically generate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings. ","version":"Next","tagName":"h3"},{"title":"--extract-source-location​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--extract-source-location","content":" Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. (default: false) ","version":"Next","tagName":"h3"},{"title":"--additional-component-names [comma-separated-names]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--additional-component-names-comma-separated-names","content":" Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage is imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe. ","version":"Next","tagName":"h3"},{"title":"--additional-function-names [comma-separated-names]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--additional-function-names-comma-separated-names","content":" Additional function names to extract messages from, e.g: ['$t']. ","version":"Next","tagName":"h3"},{"title":"--ignore [files]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--ignore-files","content":" List of glob paths to not extract translations from. ","version":"Next","tagName":"h3"},{"title":"--throws​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--throws","content":" Whether to throw an exception when we fail to process any file in the batch. ","version":"Next","tagName":"h3"},{"title":"--pragma [pragma]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--pragma-pragma","content":" Parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" id="bar" /> and with option {pragma: "intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file. ","version":"Next","tagName":"h3"},{"title":"--preserve-whitespace​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--preserve-whitespace","content":" Whether to preserve whitespace and newlines in output. We typically remove consecutive whitespaces and newlines since those often gets abused for styling purposes. ","version":"Next","tagName":"h3"},{"title":"--flatten​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--flatten","content":" Whether to hoist selectors & flatten sentences as much as possible. E.g: I have {count, plural, one{a dog} other{many dogs}} becomes {count, plural, one{I have a dog} other{I have many dogs}} The goal is to provide as many full sentences as possible since fragmented sentences are not translator-friendly. ","version":"Next","tagName":"h3"},{"title":"Verification​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#verification","content":" Verify translation files to make sure keys are translated and messages are structurally compatible with source locale. npmyarn npm run formatjs verify [options] <translationFiles> ","version":"Next","tagName":"h2"},{"title":"--source-locale ​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--source-locale-sourcelocale","content":" The source locale of the translation files. There must be a file named <sourceLocale>.json in the list of translation files. This is used as source to verify other translations against. ","version":"Next","tagName":"h3"},{"title":"--missing-keys​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--missing-keys","content":" Whether to check for missing keys in target locale compared to source locale. This basically guarantees that no messages are untranslated. ","version":"Next","tagName":"h3"},{"title":"--structural-equality​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--structural-equality","content":" Whether to check for structural equality of messages between source and target locale. This makes sure translations are formattable and are not missing any tokens. ","version":"Next","tagName":"h3"},{"title":"Compilation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#compilation","content":" Compile extracted files from formatjs extract to a react-intl consumable JSON file. This also does ICU message verification. See Message Distribution for more details. npmyarn npm run compile -- --help ","version":"Next","tagName":"h2"},{"title":"--format [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--format-path-1","content":" Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature: type CompileFn = <T = Record<string, MessageDescriptor>>( msgs: T ) => Record<string, string> This is especially useful to convert from a TMS-specific format back to react-intl format. See our builtin formatters for examples. ","version":"Next","tagName":"h3"},{"title":"--out-file ​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--out-file-output","content":" The target file that contains compiled messages. ","version":"Next","tagName":"h3"},{"title":"--ast​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--ast","content":" Whether to compile message into AST instead of just string. See Advanced Usage ","version":"Next","tagName":"h3"},{"title":"--pseudo-locale ​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--pseudo-locale-pseudolocale","content":" Whether we should compile messages into pseudo locales instead. Available pseudo-locales: Given the English message my name is {name} Locale\tMessagexx-LS\tmy name is {name}SSSSSSSSSSSSSSSSSSSSSSSSS xx-AC\tMY NAME IS {name} xx-HA\t[javascript]my name is {name} en-XA\t[ḿẏ ƞȧȧḿḗḗ īş {name}] en-XB\tɯʎ uɐɯǝ ıs {name} caution Requires --ast ","version":"Next","tagName":"h3"},{"title":"Extraction and compilation with a single script​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#extraction-and-compilation-with-a-single-script","content":" In some environments you may want to simply extract your messages to a file ready for use with react-intl without using an intermediary extracted message file format. This could be useful for quickly and easily creating the file for the original language that uses the default messages. This could also be useful if you use a Translation Management System (TMS) that is best suited to working with the compiled files. Keep in mind that the compiled file does not contain message descriptions so it is harder to work with for translators. Ideally you want to find or write a custom formatter you can use to extract messages into a file format that works with your TMS. In order to achieve extraction and compilation in a single script, you can simply set up a script for that in package.json like in this example: "scripts": { "extract": "formatjs extract", "compile": "formatjs compile", "extract-compile": "formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' && formatjs compile 'temp.json' --out-file lang/en.json && rm temp.json" } ","version":"Next","tagName":"h2"},{"title":"Breakdown of the script​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#breakdown-of-the-script","content":" The extract-compile example script consists of three operations performed one after the other. formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' The first script extracts messages from all typescript files that are located in subfolders of src. You may need to ignore certain files that could trigger errors or warnings in the script, such as --ignore myFolder/myFile.ts formatjs compile 'temp.json' --out-file lang/en.json The second script compiles the messages from temp.json into the file lang/en.json. This file is ready to be consumed by react-intl. rm temp.json The last script deletes the temp.json extracted file. Feel free remove this from the script if you wish to keep this file around. ","version":"Next","tagName":"h3"},{"title":"The resulting files​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#the-resulting-files","content":" Here you can see the difference between the extracted (using the default formatter) and the compiled file formats. In the script above, temp.json is the extracted file and en.json is the compiled file. Extracted messagesCompiled messages { "hak27d": { "defaultMessage": "Control Panel", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Delete user {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "New Password", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirm Password", "description": "placeholder text" } } ","version":"Next","tagName":"h3"},{"title":"Folder Compilation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#folder-compilation","content":" Batch compile a folder with extracted files from formatjs extract to a folder containing react-intl consumable JSON files. This also does ICU message verification. See Message Distribution for more details. npmyarn npm run formatjs compile-folder [options] <folder> <outFolder> Folder structure should be in the form of <folder>/<locale>.json and the output would be <outFolder>/<locale>.json. ","version":"Next","tagName":"h2"},{"title":"--format [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--format-path-2","content":" Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature: type CompileFn = <T = Record<string, MessageDescriptor>>( msgs: T ) => Record<string, string> This is especially useful to convert from a TMS-specific format back to react-intl format ","version":"Next","tagName":"h3"},{"title":"--ast​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--ast-1","content":" Whether to compile message into AST instead of just string. See Advanced Usage ","version":"Next","tagName":"h3"},{"title":"--skip-errors​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--skip-errors","content":" Whether to continue compiling messages after encountering an error parsing one of them. Any keys with errors will not be included in the output file. ","version":"Next","tagName":"h3"},{"title":"Builtin Formatters​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#builtin-formatters","content":" We provide the following built-in formatters to integrate with 3rd party TMSes: TMS\t--formatBabelEdit\tsimple Crowdin Chrome JSON\tcrowdin Lingohub\tsimple Localize's Simple JSON\tsimple Localizely\tsimple locize\tsimple Lokalise Structured JSON\tlokalise Phrase\tsimple POEditor Key-Value JSON\tsimple SimpleLocalize\tsimple Smartling ICU JSON\tsmartling Transifex's Structured JSON\ttransifex caution The formats of extract & compile have to be the same, which means if you extract --format smartling, you have to compile --format smartling as well & vice versa. ","version":"Next","tagName":"h2"},{"title":"Custom Formatters​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#custom-formatters","content":" You can provide your own formatter by using our interfaces: import {FormatFn, CompileFn, Comparator} from '@formatjs/cli' interface VendorJson {} // [Optional] Format @formatjs/cli structure to vendor's structure export const format: FormatFn<VendorJson> = () => {} // [Optional] Format vendor's structure to @formatjs/cli structure export const compile: CompileFn<VendorJson> = () => {} // [Optional] Sort the messages in a specific order during serialization export const compareMessages: Comparator = () => {} Take a look at our builtin formatter code for some examples. ","version":"Next","tagName":"h2"},{"title":"Node API​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#node-api","content":" Install @formatjs/cli-lib instead to use programmatically npmyarn npm i -D @formatjs/cli-lib ","version":"Next","tagName":"h2"},{"title":"Extraction​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#extraction-1","content":" import {extract} from '@formatjs/cli-lib' const resultAsString: Promise<string> = extract(files, { idInterpolationPattern: '[sha512:contenthash:base64:6]', }) ","version":"Next","tagName":"h3"},{"title":"Compilation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#compilation-1","content":" import {compile} from '@formatjs/cli-lib' const resultAsString: Promise<string> = compile(files, { ast: true, }) ","version":"Next","tagName":"h3"},{"title":"Custom Formatter​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#custom-formatter","content":" import {FormatFn, CompileFn, Comparator} from '@formatjs/cli-lib' export const format: FormatFn = msgs => msgs // Sort key reverse alphabetically export const compareMessages = (el1, el2) => { return el1.key < el2.key ? 1 : -1 } export const compile: CompileFn = msgs => { const results: Record<string, string> = {} for (const k in msgs) { results[k] = msgs[k].defaultMessage! } return results } ","version":"Next","tagName":"h3"},{"title":"Vue Plugin for formatjs","type":0,"sectionRef":"#","url":"/docs/vue-intl","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#installation","content":" npmyarn npm i -S vue-intl ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#usage","content":" Initialize VueIntl plugin with the same IntlConfig documented in @formatjs/intl. import {createIntl} from 'vue-intl' const app = createApp(App) app.use( createIntl({ locale: 'en', defaultLocale: 'en', messages: { foo: 'bar', }, }) ) From there you can use our APIs in 2 ways: ","version":"Next","tagName":"h2"},{"title":"inject​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#inject","content":" By specifying inject: {intl: intlKey}, you can use the full IntlFormatters API documented in @formatjs/intl. Note: intlKey needs to be imported from vue-intl. ","version":"Next","tagName":"h3"},{"title":"Composition API​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#composition-api","content":" We also support Vue's Composition API with provideIntl & useIntl. import {createIntl} from '@formatjs/intl' import {provideIntl, useIntl} from 'vue-intl' const Ancestor = { setup() { provideIntl( createIntl({ locale: 'en', defaultLocale: 'en', messages: { foo: 'Composed', }, }) ) }, render() { return h(Descendant) }, } const Descendant = { setup() { const intl = useIntl() return () => h( 'p', {}, intl.formatMessage({ id: 'foo', defaultMessage: 'Hello', }) ) }, } ","version":"Next","tagName":"h3"},{"title":"Methods​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#methods","content":" You can also use our formatters in Vue template by prepending $ like below: <template> <p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p> </template> We currently support: $formatMessage$formatDate$formatTime$formatRelativeTime$formatTimeRange$formatDisplayName$formatList See @formatjs/intl for the full list of API signatures. ","version":"Next","tagName":"h3"},{"title":"Tooling​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#tooling","content":" formatjs toolchain fully supports vue: eslint-plugin-formatjs: This fully supports .vue and JS/TS.@formatjs/cli: We now support extracting messages from .vue SFC files.babel-plugin-formatjs: Compile messages during bundling for babel.@formatjs/ts-transformer: Compile messages during bundling for TypeScript. ","version":"Next","tagName":"h2"},{"title":"Caveats​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#caveats","content":" ","version":"Next","tagName":"h2"},{"title":"Using ICU in Vue SFC​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#using-icu-in-vue-sfc","content":" Since }} & {{ are special tokens in .vue <template>, this can cause potential conflict with ICU MessageFormat syntax, e.g: <template> <p> {{ $formatMessage({ defaultMessage: '{count, selectordinal, offset:1 one {#} other {# more}}', }) }} </p> </template> Notice the {# more}} where it ends with }}. This will cause parsing issue in your vue template. In order to work around this issue, we recommend using space to turn }} into } }. <template> <p> {{ $formatMessage({ defaultMessage: '{count, selectordinal, offset:1 one {#} other {# more} }', }) }} </p> </template> ","version":"Next","tagName":"h3"},{"title":"ts-transformer","type":0,"sectionRef":"#","url":"/docs/tooling/ts-transformer","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#installation","content":" npmyarn npm i @formatjs/ts-transformer ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#usage","content":" The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package. ","version":"Next","tagName":"h2"},{"title":"Via ts-loader​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-ts-loader","content":" import {transform} from '@formatjs/ts-transformer' module.exports = { ...otherConfigs, module: { rules: [ { test: /\\.tsx?$/, use: [ { loader: 'ts-loader', options: { getCustomTransformers() { return { before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), ], } }, }, }, ], }, ], }, } ","version":"Next","tagName":"h3"},{"title":"Via ts-jest in jest.config.js​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-ts-jest-in-jestconfigjs","content":" caution This requires ts-jest@26.4.0 or later // jest.config.js module.exports = { // [...] globals: { 'ts-jest': { astTransformers: { before: [ { path: '@formatjs/ts-transformer/ts-jest-integration', options: { // options overrideIdFn: '[sha512:contenthash:base64:6]', ast: true, }, }, ], }, }, }, } ","version":"Next","tagName":"h3"},{"title":"Via ts-patch​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-ts-patch","content":" { "compilerOptions": { "plugins": [ { "transform": "@formatjs/ts-transformer", "import": "transform", "type": "config", "overrideIdFn": "[sha512:contenthash:base64:6]", "ast": true } ] } } ","version":"Next","tagName":"h3"},{"title":"Via rollup-plugin-typescript2​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-rollup-plugin-typescript2","content":" // rollup.config.js import typescript from 'rollup-plugin-typescript2' import {transform} from '@formatjs/ts-transformer' export default { input: './main.ts', plugins: [ typescript({ transformers: () => ({ before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', ast: true, }), ], }), }), ], } ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#options","content":" ","version":"Next","tagName":"h2"},{"title":"overrideIdFn​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#overrideidfn","content":" A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages. Alternatively, overrideIdFn can be a template string, which is used only if the message ID is empty. ","version":"Next","tagName":"h3"},{"title":"removeDefaultMessage​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#removedefaultmessage","content":" Remove defaultMessage field in generated js after extraction. ","version":"Next","tagName":"h3"},{"title":"extractSourceLocation​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#extractsourcelocation","content":" Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. Defaults to false. ","version":"Next","tagName":"h3"},{"title":"additionalComponentNames​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#additionalcomponentnames","content":" Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe. ","version":"Next","tagName":"h3"},{"title":"additionalFunctionNames​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#additionalfunctionnames","content":" Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t. ","version":"Next","tagName":"h3"},{"title":"pragma​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#pragma","content":" parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" id="bar" /> and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file. ","version":"Next","tagName":"h3"},{"title":"ast​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#ast","content":" Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true. ","version":"Next","tagName":"h3"},{"title":"onMsgExtracted(filePath: string, msgs: MessageDescriptor[])​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#onmsgextractedfilepath-string-msgs-messagedescriptor","content":" Callback that gets triggered whenever a message is encountered. ","version":"Next","tagName":"h3"},{"title":"onMetaExtracted(filePath: string, meta: Record)​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#onmetaextractedfilepath-string-meta-recordstring-string","content":" Callback that gets triggered whenever a pragme meta is encountered. ","version":"Next","tagName":"h3"},{"title":"preserveWhitespace​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#preservewhitespace","content":" Whether to preserve whitespace and newlines. Take a look at compile.ts for example in integration. ","version":"Next","tagName":"h3"},{"title":"eslint-plugin-formatjs","type":0,"sectionRef":"#","url":"/docs/tooling/linter","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#usage","content":" npmyarn npm i -D eslint-plugin-formatjs Then in your eslint config: import formatjs from 'eslint-plugin-formatjs' export default [ // other configs... { plugins: { formatjs, }, rules: { 'formatjs/no-offset': 'error', }, }, ] ","version":"Next","tagName":"h2"},{"title":"React​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#react","content":" Currently this uses intl.formatMessage, defineMessage, defineMessages, <FormattedMessage> from react-intl as hooks to verify the message. Therefore, in your code use 1 of the following mechanisms: import {defineMessages, defineMessage} from 'react-intl' const messages = defineMessages({ foo: { defaultMessage: 'foo', description: 'bar', }, }) defineMessage({ defaultMessage: 'single message', }) import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" description="bar" /> function foo() { intl.formatMessage({ defaultMessage: 'foo', }) } ","version":"Next","tagName":"h3"},{"title":"Vue​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#vue","content":" This will check against intl.formatMessage, $formatMessage function calls in both your JS/TS & your SFC .vue files. For example: <template> <p> {{ $formatMessage({ defaultMessage: 'today is {now, date}', }) }} </p> </template> ","version":"Next","tagName":"h3"},{"title":"Shared Settings​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#shared-settings","content":" These settings are applied globally to all formatjs rules once specified. See Shared Settings for more details on how to set them. ","version":"Next","tagName":"h2"},{"title":"formatjs.additionalFunctionNames​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#formatjsadditionalfunctionnames","content":" Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional function names to check besides formatMessage & $formatMessage. ","version":"Next","tagName":"h3"},{"title":"formatjs.additionalComponentNames​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#formatjsadditionalcomponentnames","content":" Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional component names to check besides FormattedMessage. ","version":"Next","tagName":"h3"},{"title":"Shareable Configs​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#shareable-configs","content":" The plugin provides the following two shareable configs: recommendedstrict By using these, you can simplify your configuration while still using a set of rules that aligns with your quality standards. ","version":"Next","tagName":"h2"},{"title":"Example​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#example","content":" import formatjs from 'eslint-plugin-formatjs' export default [ formatjs.configs.recommended, // Other configs... ] ","version":"Next","tagName":"h3"},{"title":"Available Rules​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#available-rules","content":" ","version":"Next","tagName":"h2"},{"title":"blocklist-elements​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#blocklist-elements","content":" This blocklists usage of specific elements in ICU message. Why​ Certain translation vendors cannot handle things like selectordinal Available elements​ enum Element { // literal text, like `defaultMessage: 'some text'` literal = 'literal', // placeholder, like `defaultMessage: '{placeholder} var'` argument = 'argument', // number, like `defaultMessage: '{placeholder, number} var'` number = 'number', // date, like `defaultMessage: '{placeholder, date} var'` date = 'date', // time, like `defaultMessage: '{placeholder, time} var'` time = 'time', // select, like `defaultMessage: '{var, select, foo{one} bar{two}} var'` select = 'select', // selectordinal, like `defaultMessage: '{var, selectordinal, one{one} other{two}} var'` selectordinal = 'selectordinal', // plural, like `defaultMessage: '{var, plural, one{one} other{two}} var'` plural = 'plural', } Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/blocklist-elements': [2, ['selectordinal']], }, }, ] ","version":"Next","tagName":"h3"},{"title":"enforce-description​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-description","content":" This enforces description in the message descriptor. Why​ Description provides helpful context for translators import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'foo', description: 'bar', }, // FAILS bar: { defaultMessage: 'bar', }, }) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-description': ['error', 'literal'], }, }, ] Setting literal forces description to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects description to always be a literal ","version":"Next","tagName":"h3"},{"title":"enforce-default-message​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-default-message","content":" This enforces defaultMessage in the message descriptor. Why​ Can be useful in case we want to extract messages for translations from source code. This way can make sure people won't forget about defaultMessage import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'This is default message', description: 'bar', }, // FAILS bar: { description: 'bar', }, }) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-default-message': ['error', 'literal'], }, }, ] Setting literal forces defaultMessage to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects defaultMessage to always be a literal ","version":"Next","tagName":"h3"},{"title":"enforce-placeholders​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-placeholders","content":" Makes sure all values are passed in if message has placeholders (number/date/time/plural/select/selectordinal). This requires values to be passed in as literal object (not a variable). // WORKS, no error <FormattedMessage defaultMessage="this is a {placeholder}" values={{placeholder: 'dog'}} /> // WORKS, no error intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }, {placeholder: 'dog'}) // WORKS, error bc no values were provided <FormattedMessage defaultMessage="this is a {placeholder}" /> // WORKS, error bc no values were provided intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }) // WORKS, error bc `placeholder` is not passed in <FormattedMessage defaultMessage="this is a {placeholder}" values={{foo: 1}} /> // WORKS, error bc `placeholder` is not passed in intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }, {foo: 1}) // DOESN'T WORK <FormattedMessage defaultMessage="this is a {placeholder}" values={someVar} /> // DOESN'T WORK intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }, values) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-placeholders': [ 'error', { ignoreList: ['foo'], }, ], }, }, ] ignoreList: List of placeholder names to ignore. This works with defaultRichTextElements in react-intl so we don't provide false positive for ambient global tag formatting ","version":"Next","tagName":"h3"},{"title":"enforce-plural-rules​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-plural-rules","content":" Enforce certain plural rules to always be specified/forbidden in a message. Why​ It is recommended to always specify other as fallback in the message.Some translation vendors only accept certain rules. Available rules​ enum LDML { zero = 'zero', one = 'one', two = 'two', few = 'few', many = 'many', other = 'other', } Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-plural-rules': [ 2, { one: true, other: true, zero: false, }, ], }, }, ] ","version":"Next","tagName":"h3"},{"title":"no-camel-case​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-camel-case","content":" This make sure placeholders are not camel-case. Why​ This is to prevent case-sensitivity issue in certain translation vendors. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'foo {snake_case} {nothing}', }, // FAILS bar: { defaultMessage: 'foo {camelCase}', }, }) ","version":"Next","tagName":"h3"},{"title":"no-missing-icu-plural-one-placeholders​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-missing-icu-plural-one-placeholders","content":" Messages that look like {thing, plural, one {1 thing} other {# things}} will need to be changed to {thing, plural, one {# thing} other {# things}} Why​ one is a category for any number that behaves like 1. So in some languages, for example Ukrainian, Russian and Polish, one → numbers that end in 1 (like 1, 21, 151) but that don’t end in 11 (like 11, 111, 10311). More info ","version":"Next","tagName":"h3"},{"title":"no-emoji​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-emoji","content":" This prevents usage of emojis (or above a certain Unicode version) in message import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-emoji': ['error'], }, }, // OR { plugins: { formatjs, }, rules: { 'formatjs/no-emoji': ['error', {versionAbove: '12.0'}], }, }, ] Why​ Certain translation vendors cannot handle emojis.Cross-platform encoding for emojis are faulty. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'Smileys & People', }, // WORKS with option {versionAbove: '12.0'} foo_bar: { defaultMessage: '😃 Smileys & People', }, // FAILS bar: { defaultMessage: '😃 Smileys & People', }, // FAILS with option {versionAbove: '12.0'} bar_foo: { defaultMessage: '🥹 Smileys & People', }, }) ","version":"Next","tagName":"h3"},{"title":"no-literal-string-in-jsx​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-literal-string-in-jsx","content":" This prevents untranslated strings in JSX. Why​ It is easy to forget wrapping JSX text in translation functions or components.It is easy to forget wrapping certain accessibility attributes (e.g. aria-label) in translation functions. // WORKS <Button> <FormattedMessage defaultMessage="Submit" /> </Button> // WORKS <Button> {customTranslateFn("Submit")} </Button> // WORKS <input aria-label={intl.formatMessage({defaultMessage: "Label"})} /> // WORKS <img src="/example.png" alt={intl.formatMessage({defaultMessage: "Image description"})} /> // FAILS <Button>Submit</Button> // FAILS <Button>{'Submit'}</Button> // FAILS <Button>{`Te` + 's' + t}</Button> // FAILS <input aria-label="Untranslated label" /> // FAILS <img src="/example.png" alt="Image description" /> // FAILS <input aria-label={`Untranslated label`} /> This linter reports text literals or string expressions, including string concatenation expressions in the JSX children. It also checks certain JSX attributes that you can customize. Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-literal-string-in-jsx': [ 2, { // Include or exclude additional prop checks (merged with the default checks) props: { include: [ // picomatch style glob pattern for tag name and prop name. // check `name` prop of `UI.Button` tag. ['UI.Button', 'name'], // check `message` of any component. ['*', 'message'], ], // Exclude will always override include. exclude: [ // do not check `message` of the `Foo` tag. ['Foo', 'message'], // do not check aria-label and aria-description of `Bar` tag. ['Bar', 'aria-{label,description}'], ], }, }, ], }, }, ] The default prop checks are: { include: [ // check aria attributes that the screen reader announces. ['*', 'aria-{label,description,details,errormessage}'], // check placeholder and title attribute of all native DOM elements. ['[a-z]*([a-z0-9])', '(placeholder|title)'], // check alt attribute of the img tag. ['img', 'alt'], ], exclude: [] } ","version":"Next","tagName":"h3"},{"title":"no-literal-string-in-object​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-literal-string-in-object","content":" This prevents untranslated strings in chosen object properties. Why​ It is easy to forget wrapping literal strings in translation functions, when they are defined in an object field like {label: "Untranslated label"}. const options = () => [ // FAILS {value: 'chocolate', label: 'Chocolate'}, // WORKS { value: 'strawberry', label: intl.formatMessage({defaultMessage: 'Strawberry'}), }, // WORKS, custom translation function { value: 'mint', label: customTranslateFn('Mint'), }, // FAILS, string concatenation { value: 'coconut', label: 'Coconut' + intl.formatMessage({defaultMessage: 'Ice Cream'}), }, // FAILS, template literal { value: 'mango', label: `Mango ${intl.formatMessage({defaultMessage: 'Ice Cream'})}`, }, // FAILS, conditional rendering { value: 'recommended', label: feelLikeSour ? intl.formatMessage({defaultMessage: 'Lime'}) : 'Vanilla', }, ] const MyComponent = () => <Select options={options()} /> This linter reports text literals or string expressions, including string concatenation expressions in the object properties that you can customize. Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-literal-string-in-object': [ 'warn', { // The object properties to check for untranslated literal strings, default: ['label'] include: ['label'], }, ], }, }, ] ","version":"Next","tagName":"h3"},{"title":"no-multiple-whitespaces​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-multiple-whitespaces","content":" This prevents usage of multiple consecutive whitespaces in message. Why​ Consecutive whitespaces are handled differently in different locales.Prevents \\ linebreaks in JS string which results in awkward whitespaces. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'Smileys & People', }, // FAILS bar: { defaultMessage: 'Smileys & People', }, // FAILS baz: { defaultMessage: 'this message is too long \\ so I wanna line break it.', }, }) ","version":"Next","tagName":"h3"},{"title":"no-multiple-plurals​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-multiple-plurals","content":" This prevents specifying multiple plurals in your message. Why​ Nested plurals are hard to translate across languages so some translation vendors don't allow it. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: '{p1, plural, one{one}}', }, // FAILS bar: { defaultMessage: '{p1, plural, one{one}} {p2, plural, one{two}}', } // ALSO FAILS bar2: { defaultMessage: '{p1, plural, one{{p2, plural, one{two}}}}', } }) ","version":"Next","tagName":"h3"},{"title":"no-offset​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-offset","content":" This prevents specifying offset in plural rules in your message. Why​ Offset has complicated logic implication so some translation vendors don't allow it. import {defineMessages} from 'react-intl' const messages = defineMessages({ // PASS foo: { defaultMessage: '{var, plural, one{one} other{other}}', }, // FAILS bar: { defaultMessage: '{var, plural, offset:1 one{one} other{other}}', }, }) ","version":"Next","tagName":"h3"},{"title":"enforce-id​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-id","content":" This enforces generated ID to be set in MessageDescriptor. Why​ Pipelines can enforce automatic/manual ID generation at the linter level (autofix to insert autogen ID) so this guarantees that. import {defineMessages} from 'react-intl'; const messages = defineMessages({ // PASS foo: { id: '19shaf' defaultMessage: '{var, plural, one{one} other{other}}', }, // FAILS bar: { id: 'something', defaultMessage: '{var, plural, offset:1 one{one} other{other}}', }, // FAILS bar: { defaultMessage: '{var, plural, offset:1 one{one} other{other}}', }, }); Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-id': [ 'error', { idInterpolationPattern: '[sha512:contenthash:base64:6]', }, ], }, }, ] idInterpolationPattern: Pattern to verify ID againstidWhitelist: An array of strings with regular expressions. This array allows allowlist custom ids for messages. For example '\\\\.' allows any id which has dot; '^payment_.*' - allows any custom id which has prefix payment_. Be aware that any backslash \\ provided via string must be escaped with an additional backslash. ","version":"Next","tagName":"h3"},{"title":"no-invalid-icu​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-invalid-icu","content":" This bans strings inside defaultMessage that are syntactically invalid. Why​ It's easy to miss strings that look correct to you as a developer but which are actually syntactically invalid ICU strings. For instance, the following would cause an eslint error: formatMessage( { defaultMessage: '{count, plural one {#} other {# more}}', //Missing a comma! }, { count: 1, } ) ","version":"Next","tagName":"h3"},{"title":"no-id​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-id","content":" This bans explicit ID in MessageDescriptor. Why​ We generally encourage automatic ID generation due to these reasons. This makes sure no explicit IDs are set. ","version":"Next","tagName":"h3"},{"title":"no-complex-selectors​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-complex-selectors","content":" Make sure a sentence is not too complex. Complexity is determined by how many strings are produced when we try to flatten the sentence given its selectors. For example: I have {count, plural, one{a dog} other{many dogs}} has the complexity of 2 because flattening the plural selector results in 2 sentences: I have a dog & I have many dogs. Default complexity limit is 20 (using Smartling as a reference) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-complex-selectors': [ 'error', { limit: 3, }, ], }, }, ] ","version":"Next","tagName":"h3"},{"title":"no-useless-message​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-useless-message","content":" This bans messages that do not require translation. Why​ Messages like {test} is not actionable by translators. The code should just directly reference test. ","version":"Next","tagName":"h3"},{"title":"prefer-formatted-message​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#prefer-formatted-message","content":" Use <FormattedMessage> instead of the imperative intl.formatMessage(...) if applicable. // Bad <p> {intl.formatMessage({defaultMessage: 'hello'})} </p> // Good <p> <FormattedMessage defaultMessage="hello" /> </p> Why​ Consistent coding style in JSX and less syntax clutter. ","version":"Next","tagName":"h3"},{"title":"prefer-pound-in-plural​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#prefer-pound-in-plural","content":" Use # in the plural argument to reference the count instead of repeating the argument. // Bad I have {count} { count, plural, one {apple} other {apples} } } // Good I have { count, plural, one {# apple} other {# apples} } } // Bad I have { count, plural, one {{count} apple} other {{count} apples} } } // Good I have { count, plural, one {# apple} other {# apples} } } // Bad I won the {ranking}{ count, selectordinal, one {st} two {nd} few {rd} other {th} } place. // Good I won the {ranking}{ count, selectordinal, one {#st} two {#nd} few {#rd} other {#th} } place. Why​ More concise message.Ensures that the count are correctly formatted as numbers. ","version":"Next","tagName":"h3"}],"options":{"id":"default"}} \ No newline at end of file diff --git a/search-doc.json b/search-doc.json deleted file mode 100644 index 8fe95f9df..000000000 --- a/search-doc.json +++ /dev/null @@ -1 +0,0 @@ -{"searchDocs":[{"title":"Basic Internationalization Principles","type":0,"sectionRef":"#","url":"/docs/core-concepts/basic-internationalization-principles","content":"","keywords":"","version":"Next"},{"title":"What Is Internationalization and Why Does It Matter?​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#what-is-internationalization-and-why-does-it-matter","content":" Internationalized software supports the languages and cultural customs of people throughout the world. The Web reaches all parts of the world. Internationalized web apps provide a great user experience for people everywhere. Localized software adapts to a specific language and culture by translating text into the user's language and formatting data in accordance with the user's expectations. An app is typically localized for a small set of locales. The ECMA-402 JavaScript internationalization specification has an excellent overview. ","version":"Next","tagName":"h2"},{"title":"Locales: Language and Region​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#locales-language-and-region","content":" A "locale" refers to the lingual and cultural expectations for a region. It is represented using a "locale code" defined in UTS LDML. This code is comprised of several parts separated by hyphens (-). The first part is a short string representing the language. The second, optional, part is a short string representing the region. Additionally, various extensions and variants can be specified. Typically, web apps are localized to just the language or language-region combination. Examples of such locale codes are: en for Englishen-US for English as spoken in the United Statesen-GB for English as spoken in the United Kingdomes-AR for Spanish as spoken in Argentinaar-001 for Arabic as spoken throughout the worldar-AE for Arabic as spoken in United Arab Emirates Most internationalized apps only support a small list of locales. ","version":"Next","tagName":"h2"},{"title":"Translating Strings​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#translating-strings","content":" You likely have some text in your application that is in a natural language such as English or Japanese. In order to support other locales, you will need to translate these strings. FormatJS provides a mechanism to let you write the core "software" of your application without special code for different translations. The considerations for each locale are encapsulated in your translated strings and our libraries. const messages = { en: { GREETING: 'Hello {name}', }, fr: { GREETING: 'Bonjour {name}', }, } We use the ICU Message syntax which is also used in Java, C, PHP and various other platforms. ","version":"Next","tagName":"h2"},{"title":"Bundling Translated Strings​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#bundling-translated-strings","content":" It is common to organize your translations primarily by locale, because you only need the translations for the user's current locale. Our template and component library integrations are designed to work with the translations for a single locale. If your app is complex, you can further subdivide your translations, such as by page or section of the site. ","version":"Next","tagName":"h2"},{"title":"Structure of Code​","type":1,"pageTitle":"Basic Internationalization Principles","url":"/docs/core-concepts/basic-internationalization-principles#structure-of-code","content":" The actual formatting and presentation of data and translated strings typically takes these steps: Determine the user's locale, as described in Runtime Environments guide.Setup one of FormatJS's integrations with the following data: the user's current localetranslated strings for that localeoptionally, any custom formats Call the template engine, passing the data that needs formatting. ","version":"Next","tagName":"h2"},{"title":"Application Workflow","type":0,"sectionRef":"#","url":"/docs/getting-started/application-workflow","content":"","keywords":"","version":"Next"},{"title":"Simple application workflow with a local translation tool​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#simple-application-workflow-with-a-local-translation-tool","content":" projectRoot |-- src | |-- App.js |-- extracted | |-- en.json |-- lang | |-- fr.json | |-- de.json |-- package.json |-- .eslintrc.js The extracted translation files live in the extracted folder since they have a different internal structure (e.g. they contain additional information like the comments). The translation files produced during the translation process are stored in the lang folder. ","version":"Next","tagName":"h2"},{"title":"The workflow​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#the-workflow","content":" The workflow looks like this: Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.Edit: Edit the translations, save when done.The changes immediately show up in your build ","version":"Next","tagName":"h3"},{"title":"Complex application workflow with a cloud based translation service​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#complex-application-workflow-with-a-cloud-based-translation-service","content":" ","version":"Next","tagName":"h2"},{"title":"Project Structure​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#project-structure","content":" A minimal i18n-friendly project can have the following structure: projectRoot |-- src | |-- App.js |-- lang | |-- en-US.json | |-- fr.json |-- package.json |-- .eslintrc.js where lang folder is where the aggregated strings file from your application would live. Integration with 3rd-party translation vendor can consume the en-US.json file and produce fr.json or other locale files accordingly. ","version":"Next","tagName":"h3"},{"title":"Pipeline​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#pipeline","content":" A generic translation pipeline looks something like this: Extraction: This step aggregates all defaultMessages from your application into a single JSON file along with description, ready to be translated.Upload Messages: This step uploads the JSON file to your translation vendor.Download Translations: This step either polls your translation vendor or hook into your vendor to download translated messages in the set of locales that you configured.Commit: This commits back translation messages to the codebase. ","version":"Next","tagName":"h3"},{"title":"Where formatjs comes in​","type":1,"pageTitle":"Application Workflow","url":"/docs/getting-started/application-workflow#where-formatjs-comes-in","content":" The goal of this project is not to provide a solution for the whole pipeline, but rather focus on Developer Experience via tooling and best practices so devs are i18n-aware. This includes: Declaring i18n-friendly messagesLinter that enforces such messagesCLI for extraction & compilationPolyfills for a stable i18n runtime environmentsBundler plugin for compiling TypeScript/JavaScript ","version":"Next","tagName":"h2"},{"title":"Message Declaration","type":0,"sectionRef":"#","url":"/docs/getting-started/message-declaration","content":"","keywords":"","version":"Next"},{"title":"Using imperative API intl.formatMessage​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#using-imperative-api-intlformatmessage","content":" // Method must be exactly `intl.formatMessage` intl.formatMessage( { description: 'A message', // Description should be a string literal defaultMessage: 'My name is {name}', // Message should be a string literal }, { name: userName, } // Values should be an object literal, but not necessarily every value inside ) ","version":"Next","tagName":"h2"},{"title":"Using React API ​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#using-react-api-formattedmessage","content":" import {FormattedMessage} from 'react-intl' ;<FormattedMessage description="A message" // Description should be a string literal defaultMessage="My name is {name}" // Message should be a string literal values={ { name: userName, } // Values should be an object literal, but not necessarily every value inside } /> ","version":"Next","tagName":"h2"},{"title":"Using Vue API & template methods such as $formatMessage​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#using-vue-api--template-methods-such-as-formatmessage","content":" <template> <p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p> </template> ","version":"Next","tagName":"h2"},{"title":"Pre-declaring using defineMessage for later consumption (less recommended)​","type":1,"pageTitle":"Message Declaration","url":"/docs/getting-started/message-declaration#pre-declaring-using-definemessage-for-later-consumption-less-recommended","content":" import {defineMessage} from 'react-intl' const message = defineMessage({ description: 'A message', // Description should be a string literal defaultMessage: 'My name is {name}', // Message should be a string literal }) intl.formatMessage(message, {name: 'John'}) // My name is John <FormattedMessage {...message} values={{ name: 'John', }} /> // My name is John caution We rely on AST to extract messages from the codebase, so make sure you call intl.formatMessage(), use our builtin React components, use our Vue methods or configure --additionalFunctionNames/--additionalComponentNames in our CLI properly. caution You can declare a message without immediately formatting it with defineMessage and our extractor would still be able to extract it. However, our enforce-placeholders linter rule won't be able to analyze it. ","version":"Next","tagName":"h2"},{"title":"Installation","type":0,"sectionRef":"#","url":"/docs/getting-started/installation","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#installation","content":" npmyarn npm i -S react react-intl ","version":"Next","tagName":"h2"},{"title":"Minimal Application​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#minimal-application","content":" After following the step above, you should be able to get a minimal application like this running: NodeReactVue3 import * as React from 'react' import {IntlProvider, FormattedMessage, FormattedNumber} from 'react-intl' // Translated messages in French with matching IDs to what you declared const messagesInFrench = { myMessage: "Aujourd'hui, nous sommes le {ts, date, ::yyyyMMdd}", } export default function App() { return ( <IntlProvider messages={messagesInFrench} locale="fr" defaultLocale="en"> <p> <FormattedMessage id="myMessage" defaultMessage="Today is {ts, date, ::yyyyMMdd}" values={{ts: Date.now()}} /> <br /> <FormattedNumber value={19} style="currency" currency="EUR" /> </p> </IntlProvider> ) } Output <p> Aujourd'hui, nous sommes le 23/07/2020 <br /> 19,00 € </p> ","version":"Next","tagName":"h2"},{"title":"Adding our babel-plugin/TypeScript Transformer for compilation​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#adding-our-babel-plugintypescript-transformer-for-compilation","content":" Our tooling supports babel, ts-loader, ts-jest, rollup-plugin-typescript2 & ts-patch for message compilation: ","version":"Next","tagName":"h2"},{"title":"Babel​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#babel","content":" If you're using babel, add babel-plugin-formatjs to your dependencies: npmyarn npm i -D babel-plugin-formatjs and add it to your babel.config.js or .babelrc: { "plugins": [ [ "formatjs", { "idInterpolationPattern": "[sha512:contenthash:base64:6]", "ast": true } ] ] } ","version":"Next","tagName":"h3"},{"title":"ts-loader​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#ts-loader","content":" npmyarn npm i -D @formatjs/ts-transformer import {transform} from '@formatjs/ts-transformer' module.exports = { ...otherConfigs, module: { rules: [ { test: /\\.tsx?$/, use: [ { loader: 'ts-loader', options: { getCustomTransformers() { return { before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), ], } }, }, }, ], }, ], }, } ","version":"Next","tagName":"h3"},{"title":"ts-jest in jest.config.js​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#ts-jest-in-jestconfigjs","content":" npmyarn npm i -D @formatjs/ts-transformer Take a look at ts-jest guide on how to incorporate custom AST Transformers. ","version":"Next","tagName":"h3"},{"title":"ts-patch​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#ts-patch","content":" npmyarn npm i -D @formatjs/ts-transformer { "compilerOptions": { "plugins": [ { "transform": "@formatjs/ts-transformer", "import": "transform", "type": "config", "overrideIdFn": "[sha512:contenthash:base64:6]", "ast": true } ] } } ","version":"Next","tagName":"h3"},{"title":"rollup-plugin-typescript2​","type":1,"pageTitle":"Installation","url":"/docs/getting-started/installation#rollup-plugin-typescript2","content":" npmyarn npm i -D @formatjs/ts-transformer // rollup.config.js import typescript from 'rollup-plugin-typescript2' import {transform} from '@formatjs/ts-transformer' export default { input: './main.ts', plugins: [ typescript({ transformers: () => ({ before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', ast: true, }), ], }), }), ], } ","version":"Next","tagName":"h3"},{"title":"Message Syntax","type":0,"sectionRef":"#","url":"/docs/core-concepts/icu-syntax","content":"","keywords":"","version":"Next"},{"title":"Basic Principles​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#basic-principles","content":" The simplest transform for the message is a literal string. Hello everyone All other transforms are done using replacements called "arguments". They are enclosed in curly braces ({ and }) and refer to a value in the input data. ","version":"Next","tagName":"h2"},{"title":"Simple Argument​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#simple-argument","content":" You can use a {key} argument for placing a value into the message. The key is looked up in the input data, and the string is interpolated with its value. ICU Message Hello {who} Values as JSON Result ","version":"Next","tagName":"h2"},{"title":"Formatted Argument​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#formatted-argument","content":" Values can also be formatted based on their type. You use a {key, type, format} argument to do that. The elements of the argument are: key is where in the input data to find the datatype is optional, and is how to interpret the value (see below)format is optional, and is a further refinement on how to display that type of data ICU Message I have {numCats, number} cats. Values as JSON Result ","version":"Next","tagName":"h2"},{"title":"number Type​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#number-type","content":" This type is used to format numbers in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument: ICU Message I have {numCats, number} cats. Values as JSON Result ICU Message Almost {pctBlack, number, ::percent} of them are black. Values as JSON Result Internally it uses the Intl.NumberFormat API. You can define custom values for the format element, which are passed to the Intl.NumberFormat constructor. Sometimes embedding how the number will be formatted provides great context to translators. We also support ICU Number Skeletons using the same syntax: ICU Message The price of this bagel is {num, number, ::sign-always compact-short currency/GBP} Values as JSON Result You can read more about this here. For fine control over decimal precision, you can use the Fraction Precision # and 0 symbols, which specify the number of decimal places to display: ICU Message The duration is {num, number, ::.##} seconds Values as JSON Result Note that the # symbol doesn't render trailing zeroes, as seen in this example: ICU Message The duration is {num, number, ::.##} seconds Values as JSON Result To render trailing zeroes, use the 0 symbol: ICU Message The very precise number is {num, number, ::.00} Values as JSON Result For more details, see Fraction Precision. ","version":"Next","tagName":"h3"},{"title":"date Type​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#date-type","content":" This type is used to format dates in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument: short is used to format dates in the shortest possible waymedium is used to format dates with short textual representation of the monthlong is used to format dates with long textual representation of the monthfull is used to format dates with the most detail ICU Message Sale begins {start, date, medium} Values as JSON Result Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor. ","version":"Next","tagName":"h3"},{"title":"time Type​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#time-type","content":" This type is used to format times in a way that is sensitive to the locale. It understands the following values for the optional format element of the argument: short is used to format times with hours and minutesmedium is used to format times with hours, minutes, and secondslong is used to format times with hours, minutes, seconds, and timezonefull is the same as long ICU Message Coupon expires at {expire, time, short} Values as JSON Result Internally it uses the Intl.DateTimeFormat API. You can define custom values for the format element, which are passed to the Intl.DateTimeFormat constructor. ","version":"Next","tagName":"h3"},{"title":"Supported DateTime Skeleton​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#supported-datetime-skeleton","content":" Similar to number type, we also support ICU DateTime skeleton. ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, we only support the following patterns Symbol\tMeaning\tNotesG\tEra designator y\tyear M\tmonth in year L\tstand-alone month in year d\tday in month E\tday of week e\tlocal day of week\te..eee is not supported c\tstand-alone local day of week\tc..ccc is not supported a\tAM/PM marker h\tHour [1-12] H\tHour [0-23] K\tHour [0-11] k\tHour [1-24] m\tMinute s\tSecond z\tTime Zone\t ","version":"Next","tagName":"h3"},{"title":"{select} Format​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#select-format","content":" The {key, select, matches} is used to choose output by matching a value to one of many choices. (It is similar to the switch statement available in some programming languages.) The key is looked up in the input data. The corresponding value is matched to one of matches and the corresponding output is returned. The key argument must follow Unicode Pattern_Syntax. The matches is a space-separated list of matches. The format of a match is match {output}. (A match is similar to the case statement of the switch found in some programming languages.) The match is a literal value. If it is the same as the value for key then the corresponding output will be used. output is itself a message, so it can be a literal string or also have more arguments nested inside of it. The other match is special and is used if nothing else matches. (This is similar to the default case of the switch found in some programming languages.) danger other is required as per icu4j implementation. We will throw an error if select is used without other. ICU Message {gender, select, male {He will respond shortly.} female {She will respond shortly.} other {They will respond shortly.} } Values as JSON Result Here's an example of nested arguments. ICU Message {isTaxed, select, yes {An additional {tax, number, percent} tax will be collected.} other {No taxes apply.} } Values as JSON Result ","version":"Next","tagName":"h3"},{"title":"{plural} Format​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#plural-format","content":" The {key, plural, matches} is used to choose output based on the pluralization rules of the current locale. It is very similar to the {select} format above except that the value is expected to be a number and is mapped to a plural category. The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories. zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)one: This category is used for languages that have grammar specialized specifically for one (singular) item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)two: This category is used for languages that have grammar specialized specifically for two (dual) items. (Examples are Arabic and Welsh.)few: This category is used for languages that have grammar specialized specifically for a small number (paucal) of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.=value: This is used to match a specific value regardless of the plural categories of the current locale. info Don't use =1 in place of one. one doesn't always mean 1 but rather means singular, which can match to more than number 1 in certain locales. Some locales considered all numbers ends with 1 (like 1, 11, 111) to be singular. danger other is required as per icu4j implementation. We will throw an error if plural is used without other. ICU Message {itemCount, plural, one {Cart: {itemCount, number} item} other {Cart: {itemCount, number} items} } Values as JSON Result ICU Message {itemCount, plural, =0 {You have no items.} one {You have {itemCount, number} item.} other {You have {itemCount, number} items.} } Values as JSON Result In the output of the match, you can use the # special token as a placeholder for the numeric value and it'll be formatted as if it were {key, number}. This is the style we prefer to use. ICU Message {itemCount, plural, =0 {You have no items.} one {You have # item.} other {You have # items.} } Values as JSON Result ","version":"Next","tagName":"h3"},{"title":"{selectordinal} Format​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#selectordinal-format","content":" The {key, selectordinal, matches} is used to choose output based on the ordinal pluralization rules (1st, 2nd, 3rd, etc.) of the current locale. It is very similar to the {plural} format above except that the value is mapped to an ordinal plural category. The match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories. zero: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)one: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)two: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)few: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.many: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)other: This category is used if the value doesn't match one of the other plural categories. Note that this is used for "plural" for languages (such as English) that have a simple "singular" versus "plural" dichotomy.=value: This is used to match a specific value regardless of the plural categories of the current locale. danger other is required as per icu4j implementation. We will throw an error if selectordinal is used without other. In the output of the match, the # special token can be used as a placeholder for the numeric value and will be formatted as if it were {key, number}. ICU Message It's my cat's {year, selectordinal, one {#st} two {#nd} few {#rd} other {#th} } birthday! Values as JSON Result ","version":"Next","tagName":"h3"},{"title":"Rich Text Formatting​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#rich-text-formatting","content":" We also support embedded rich text formatting in our message using tags. This allows developers to embed as much text as possible so sentences don't have to be broken up into chunksNOTE: This is not XML/HTML tag ICU Message Our price is <boldThis>{price, number, ::currency/USD precision-integer}</boldThis> with <link>{pct, number, ::percent} discount</link> Values as JSON Result Custom Behavior It is expected that the system using embedded rich text formatting will have methods to handle these placeholders external to this library. The tags will be part of the generated output and can either be post-processed by your own tooling or use the defaultRichTextElements configuration. ","version":"Next","tagName":"h2"},{"title":"Quoting / Escaping​","type":1,"pageTitle":"Message Syntax","url":"/docs/core-concepts/icu-syntax#quoting--escaping","content":" The ASCII apostrophe ' (U+0027) can be used to escape syntax characters in the text portion of the message, which mimics the behavior of ICU's quoting/escaping. ICU Message This is not an interpolation: '{word} Values as JSON Result ICU Message These are not interpolations: '{word1} {word2}' Values as JSON Result ICU Message '<notATag> Values as JSON Result ICU Message '<notATag>hello</notATag>' Values as JSON Result Two consecutive ASCII apostrophes represents one ASCII apostrophe, similar to %% in printf represents one %. However, we recommend using curly apostrophe ’ (U+2019) for human-readable strings and only use ASCII apostrophe '(U+0027) in ICU message syntax. ICU Message This '{isn''t}' obvious. Values as JSON Result ","version":"Next","tagName":"h2"},{"title":"Message Extraction","type":0,"sectionRef":"#","url":"/docs/getting-started/message-extraction","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#installation","content":" npmyarn npm i -D @formatjs/cli ","version":"Next","tagName":"h2"},{"title":"Extraction​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#extraction","content":" Add the following command to your package.json scripts: { "scripts": { "extract": "formatjs extract" } } and execute with npm: npmyarn npm run extract -- 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' ID Interpolation Pattern Make sure this pattern matches idInterpolationPattern when you use babel-plugin-formatjs or @formatjs/ts-transformer in Bundling with formatjs or you'll get a MISSING_TRANSLATION error. Given a file that has the following messages: ReactVue3 import * as React from 'react' import {FormattedMessage, useIntl, injectIntl} from 'react-intl' class PasswordChangeWithIntl extends React.Component { render() { const {intl} = this.props return ( <li> <input placeholder={intl.formatMessage({ defaultMessage: 'New Password', description: 'placeholder text', })} /> <input placeholder={intl.formatMessage({ id: 'explicit-id', defaultMessage: 'Confirm Password', description: 'placeholder text', })} /> </li> ) } } const PasswordChange = injectIntl(PasswordChangeWithIntl) export function List(props) { const intl = useIntl() return ( <section> <header> <FormattedMessage defaultMessage="Control Panel" description="title of control panel section" /> </header> <ul> <li> <button> <FormattedMessage defaultMessage="Delete user {name}" description="Delete button" values={{ name: props.name, }} /> </button> </li> <PasswordChange /> </ul> </section> ) } running the above command will create a file called lang/en.json: { "hak27d": { "defaultMessage": "Control Panel", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Delete user {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "New Password", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirm Password", "description": "placeholder text" } } Message ID During extraction, we'll preserve explicit declared IDs and insert a hash as an ID for messages without. We recommend against explicit IDs since it can cause collision. ","version":"Next","tagName":"h2"},{"title":"Automatic ID Generation​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#automatic-id-generation","content":" Since manual IDs are discouraged, we've provided a babel plugin and a TypeScript AST transformer that will automatically insert message IDs in your transpiled code. For more details please visit Bundling with formatjs. ","version":"Next","tagName":"h2"},{"title":"Translation Management System (TMS) Integration​","type":1,"pageTitle":"Message Extraction","url":"/docs/getting-started/message-extraction#translation-management-system-tms-integration","content":" The default format generated from @formatjs/cli might not work with the specific TMS/vendor you're working with. You can specify a custom formatter with --format <formatFile> that allows you to convert that format into something tailored to your TMS. For example: If your vendor accepts the format like { "[id]": { "string": "[message]", "comment": "[description]" } } you can run npmyarn npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]' --format formatter.js where formatter.js is: exports.format = function (msgs) { const results = {} for (const [id, msg] of Object.entries(msgs)) { results[id] = { string: msg.defaultMessage, comment: msg.description, } } return results } We also provide several builtin formatters to integrate with 3rd party TMSes so feel free to create PRs to add more. TMS\t--formatBabelEdit\tsimple Crowdin Chrome JSON\tcrowdin Lingohub\tsimple Localize's Simple JSON\tsimple Localizely\tsimple locize\tsimple Lokalise Structured JSON\tlokalise Phrase Strings\tsimple POEditor Key-Value JSON\tsimple SimpleLocalize JSON\tsimple Smartling ICU JSON\tsmartling Transifex's Structured JSON\ttransifex ","version":"Next","tagName":"h2"},{"title":"Message Distribution","type":0,"sectionRef":"#","url":"/docs/getting-started/message-distribution","content":"","keywords":"","version":"Next"},{"title":"Compiling Messages​","type":1,"pageTitle":"Message Distribution","url":"/docs/getting-started/message-distribution#compiling-messages","content":" Let's take the example from Message Extraction, assuming we are working with the French version and the file is called lang/fr.json: { "hak27d": { "defaultMessage": "Panneau de configuration", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Supprimer l'utilisateur {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "nouveau mot de passe", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirmez le mot de passe", "description": "placeholder text" } } We can use @formatjs/cli to compile this into a react-intl consumable JSON file: Add the following command to your package.json scripts: { "scripts": { "compile": "formatjs compile" } } and execute with npm: npmyarn npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json Parsing messages into AST We recommending compiling your messages into AST as it allows us to skip parsing them during runtime. This makes your app more performant. ","version":"Next","tagName":"h2"},{"title":"Translation Management System (TMS) Integration​","type":1,"pageTitle":"Message Distribution","url":"/docs/getting-started/message-distribution#translation-management-system-tms-integration","content":" If your TMS/vendor has a different JSON format you can specify a custom formatter with --format <formatFile> that converts that into Record<string,string> so @formatjs/cli can understand. For example: If your vendor accepts the format like { "[id]": { "string": "[message]", "comment": "[description]" } } you can run npmyarn npm run compile -- lang/fr.json --ast --out-file compiled-lang/fr.json --format formatter.js where formatter.js is: exports.compile = function (msgs) { const results = {} for (const [id, msg] of Object.entries(msgs)) { results[id] = msg.string } return results } In the future we will provide formatters that work with popular TMSes by default. ","version":"Next","tagName":"h2"},{"title":"Distribution​","type":1,"pageTitle":"Message Distribution","url":"/docs/getting-started/message-distribution#distribution","content":" While every application has a separate distribution pipeline, the common theme is the ability to map a locale to its translation file. In this example we'll assume your pipeline can understand dynamic import: NodeReactVue3 import * as React from 'react' import * as ReactDOM from 'react-dom' import {IntlProvider} from 'react-intl' function loadLocaleData(locale: string) { switch (locale) { case 'fr': return import('compiled-lang/fr.json') default: return import('compiled-lang/en.json') } } function App(props) { return ( <IntlProvider locale={props.locale} defaultLocale="en" messages={props.messages} > <MainApp /> </IntlProvider> ) } async function bootstrapApplication(locale, mainDiv) { const messages = await loadLocaleData(locale) ReactDOM.render(<App locale={locale} messages={messages} />, mainDiv) } ","version":"Next","tagName":"h2"},{"title":"Advanced Usage","type":0,"sectionRef":"#","url":"/docs/guides/advanced-usage","content":"","keywords":"","version":"Next"},{"title":"Pre-compiling messages​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#pre-compiling-messages","content":" You can also pre-compile all messages into AST using @formatjs/cli compile command and pass that into IntlProvider. This is especially faster since it saves us time parsing string into AST. The use cases for this support are: Server-side rendering or pre-compiling where you can cache the AST and don't have to pay compilation costs multiple time.Desktop apps using Electron or CEF where you can preload/precompile things in advanced before runtime. Caching Since this approach uses AST as the data source, changes to @formatjs/icu-messageformat-parser's AST will require cache invalidation. Asset Size AST is also slightly larger in size than regular string messages but can be efficiently compressed. ","version":"Next","tagName":"h2"},{"title":"react-intl without parser (40% smaller)​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#react-intl-without-parser-40-smaller","content":" If you've made sure all your messages & defaultMessages are precompiled as above, you can resolve @formatjs/icu-messageformat-parser to @formatjs/icu-messageformat-parser/no-parser during bundling to get a much smaller bundler (~40% less). For example: ","version":"Next","tagName":"h2"},{"title":"webpack.config.js​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#webpackconfigjs","content":" module.exports = { //... resolve: { alias: { '@formatjs/icu-messageformat-parser': '@formatjs/icu-messageformat-parser/no-parser', }, }, } ","version":"Next","tagName":"h3"},{"title":"rollup.config.js​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#rollupconfigjs","content":" import alias from '@rollup/plugin-alias' module.exports = { //... plugins: [ alias({ entries: { '@formatjs/icu-messageformat-parser': '@formatjs/icu-messageformat-parser/no-parser', }, }), ], } In the future, we'll gear towards making this the default behavior. ","version":"Next","tagName":"h3"},{"title":"Imperative APIs​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#imperative-apis","content":" Imperative APIs (e.g formatMessage...) are generally faster than Formatted component since it does not create extra ReactElement nodes. They should have the exact same capabilities as Formatted components. ","version":"Next","tagName":"h2"},{"title":"More examples​","type":1,"pageTitle":"Advanced Usage","url":"/docs/guides/advanced-usage#more-examples","content":" Head over to https://github.com/formatjs/formatjs/tree/main/packages/react-intl/examples for more examples on how to use our libraries. ","version":"Next","tagName":"h2"},{"title":"Develop with formatjs","type":0,"sectionRef":"#","url":"/docs/guides/develop","content":"","keywords":"","version":"Next"},{"title":"Linter Installation​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#linter-installation","content":" npmyarn npm i -D eslint-plugin-formatjs eslint Then in your eslint config: { "plugins": ["formatjs"], "rules": { "formatjs/no-offset": "error" } } Head over to eslint-plugin-formatjs for more details on our rules. ","version":"Next","tagName":"h2"},{"title":"Error Codes​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#error-codes","content":" react-intl is designed to fail fast when there's a configuration issue but fall back to defaultLocale when there's a translation issues. Below are the list of errors that we emit out that can be caught during testing: ","version":"Next","tagName":"h2"},{"title":"FORMAT_ERROR​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#format_error","content":" Issue when we try to format a sentence but some of the placeholder values are malformed, e.g passing in a string for a Date or such. ","version":"Next","tagName":"h3"},{"title":"UNSUPPORTED_FORMATTER​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#unsupported_formatter","content":" We trigger this error when a custom format is being declared but there's no corresponding formatter with it. For example: intl.formatMessage({ defaultMessage: 'the price is {p, number, customCurrency}', }) and there's no formatter for customCurrency. ","version":"Next","tagName":"h3"},{"title":"INVALID_CONFIG​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#invalid_config","content":" When some config values are misconfigured such as missing locale. ","version":"Next","tagName":"h3"},{"title":"MISSING_DATA​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#missing_data","content":" When some native Intl APIs don't support certain locales, or missing locale-data when polyfills are setup. This typically happens when you're running on an older browsers/Node, or try to use newer APIs in browsers that have not supported them. ","version":"Next","tagName":"h3"},{"title":"MISSING_TRANSLATION​","type":1,"pageTitle":"Develop with formatjs","url":"/docs/guides/develop#missing_translation","content":" This gets triggered whenever we try to look up a translated message in messages for a given id and it's not there and there is no fallback defaultMessage for the given id. verbosity This error will be triggered very often since it happens for every message that does not have a translation. Therefore if you do log it remotely there should be throttling in place. ","version":"Next","tagName":"h3"},{"title":"Runtime Requirements","type":0,"sectionRef":"#","url":"/docs/guides/runtime-requirements","content":"","keywords":"","version":"Next"},{"title":"Browser​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#browser","content":" Browser Support We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari. If you need older browser support, take a look at polyfill-library that also uses formatjs but pre-bundle other polyfills that we use. React Intl relies on these Intl APIs: Intl.NumberFormat: Available on IE11+Intl.DateTimeFormat: Available on IE11+Intl.PluralRules: This can be polyfilled using this package.(Optional) Intl.RelativeTimeFormat: Required if you use formatRelativeTimeor FormattedRelativeTime. This can be polyfilled using this package.(Optional) Intl.DisplayNames: Required if you use formatDisplayNameor FormattedDisplayName. This can be polyfilled using this package. We officially support IE11 along with 2 most recent versions of Edge, Chrome & Firefox. ","version":"Next","tagName":"h2"},{"title":"Node.js​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#nodejs","content":" ","version":"Next","tagName":"h2"},{"title":"full-icu​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#full-icu","content":" Starting with Node.js 13.0.0 full-icu is supported by default. If using React Intl in an earlier version of Node.js, your node binary has to either: Get compiled with full-icu using these instructions OR Uses full-icu npm package If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly. ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#react-native","content":" If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details: https://github.com/formatjs/formatjs/issues/1356https://github.com/formatjs/formatjs/issues/992 ","version":"Next","tagName":"h2"},{"title":"React Native on iOS​","type":1,"pageTitle":"Runtime Requirements","url":"/docs/guides/runtime-requirements#react-native-on-ios","content":" If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in polyfills to polyfill the following APIs (in this order): Intl.getCanonicalLocalesIntl.LocaleIntl.PluralRulesIntl.NumberFormatIntl.DateTimeFormat ","version":"Next","tagName":"h3"},{"title":"Bundling with formatjs","type":0,"sectionRef":"#","url":"/docs/guides/bundler-plugins","content":"","keywords":"","version":"Next"},{"title":"Using babel-plugin-formatjs​","type":1,"pageTitle":"Bundling with formatjs","url":"/docs/guides/bundler-plugins#using-babel-plugin-formatjs","content":" npmyarn npm i -D babel-plugin-formatjs Let's take this simple example: import {FormattedMessage} from 'react-intl' <FormattedMessage description="A message" defaultMessage="My name is {name}" values={{ name: userName, }} /> During runtime this will throw an Error saying ID is required. In order to inject an ID in the transpiled JS, you can use our babel-plugin-formatjs similarly as below: babel.config.json { "plugins": [ [ "formatjs", { "idInterpolationPattern": "[sha512:contenthash:base64:6]", "ast": true } ] ] } This will produce the following JS const {FormattedMessage} = require('react-intl') React.createElement(FormattedMessage, { id: '179jda', defaultMessage: 'My name is {name}', values: { name: userName, }, }) description Our plugin also removes description because it's only for translator, not end-user. ","version":"Next","tagName":"h2"},{"title":"Using @formatjs/ts-transformer​","type":1,"pageTitle":"Bundling with formatjs","url":"/docs/guides/bundler-plugins#using-formatjsts-transformer","content":" npmyarn npm i -D @formatjs/ts-transformer If you're using TypeScript, in order to enable custom AST transformer you should consider using ts-patch, ts-loader or similar. Let's take this simple example: import {FormattedMessage} from 'react-intl' <FormattedMessage description="A message" defaultMessage="My name is {name}" values={{ name: userName, }} /> ","version":"Next","tagName":"h2"},{"title":"ts-loader​","type":1,"pageTitle":"Bundling with formatjs","url":"/docs/guides/bundler-plugins#ts-loader","content":" You can add this in your webpack config ts-loader. import {transform} from '@formatjs/ts-transformer' // webpack config module.exports = { rules: [ { test: /\\.tsx?$/, use: [ { loader: 'ts-loader', options: { getCustomTransformers() { return { before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), ], } }, }, }, ], exclude: /node_modules/, }, ], } This will produce the following JS const {FormattedMessage} = require('react-intl') React.createElement(FormattedMessage, { id: '179jda', defaultMessage: 'My name is {name}', values: { name: userName, }, }) description Our transformer also removes description because it's only for translator, not end-user. ","version":"Next","tagName":"h3"},{"title":"ICU MessageFormat Parser","type":0,"sectionRef":"#","url":"/docs/icu-messageformat-parser","content":"","keywords":"","version":"Next"},{"title":"Overview​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#overview","content":" This package implements a parser in JavaScript that parses the industry standard ICU Message strings — used for internationalization — into an AST. The produced AST can then be used by a compiler, like intl-messageformat, to produce localized formatted strings for display to users. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#usage","content":" import {parse} from '@formatjs/icu-messageformat-parser' const ast = parse(`this is {count, plural, one{# dog} other{# dogs} }`) ","version":"Next","tagName":"h2"},{"title":"Example​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#example","content":" Live Editor <pre> {JSON.stringify( IcuMessageFormatParser.parse( `On {takenDate, date, short} <bold>{name}</bold> took {numPhotos, plural, =0 {no photos.} =1 {one photo.} other {# photos.} }` ), undefined, 2 )} </pre> Result ","version":"Next","tagName":"h3"},{"title":"Supported DateTime Skeleton​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#supported-datetime-skeleton","content":" ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns Symbol\tMeaning\tNotesG\tEra designator y\tyear M\tmonth in year L\tstand-alone month in year d\tday in month E\tday of week e\tlocal day of week\te..eee is not supported c\tstand-alone local day of week\tc..ccc is not supported a\tAM/PM marker h\tHour [1-12] H\tHour [0-23] K\tHour [0-11] k\tHour [1-24] m\tMinute s\tSecond z\tTime Zone\t ","version":"Next","tagName":"h2"},{"title":"Benchmarks​","type":1,"pageTitle":"ICU MessageFormat Parser","url":"/docs/icu-messageformat-parser#benchmarks","content":" complex_msg AST length 10861 normal_msg AST length 1665 simple_msg AST length 364 string_msg AST length 131 complex_msg x 29,940 ops/sec ±1.23% (89 runs sampled) normal_msg x 253,612 ops/sec ±1.01% (92 runs sampled) simple_msg x 1,805,642 ops/sec ±0.70% (94 runs sampled) string_msg x 2,694,133 ops/sec ±1.05% (95 runs sampled) ","version":"Next","tagName":"h2"},{"title":"Distributing i18n-friendly libraries","type":0,"sectionRef":"#","url":"/docs/guides/distribute-libraries","content":"","keywords":"","version":"Next"},{"title":"High level concept​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#high-level-concept","content":" Translated strings are basically assets, just like CSS, static configuration or images. The high level structure typically contains several layers: Reusable Components/Libraries that have translated strings, which can be nested.Consuming higher-level applications that consumes those components/libraries. Each feature/library would be in charge of: Declaring its messages.Integrating with the translation pipeline.Declaring its translated & aggregated strings using either a manifest like package.json or a convention (always output to a specific location) or both. ","version":"Next","tagName":"h2"},{"title":"Declaring in package.json​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#declaring-in-packagejson","content":" This is similar to using style attribute to declare CSS. You can declare something like { "name": "my-library", "version": "1.0.0", "lang": "my-strings", "supportedLocales": ["en", "en-GB", "ja"] } where my-strings is the folder containing your translated strings in your supportedLocales: my-strings |- en.json |- en-GB.json |- ja.json Consuming application can walk through node_modules looking for package.json files with these fields and aggregate the strings together into a single bundle (or multiple bundles) and serve those JSON however it chooses to. This provides flexibility to output translations to any location you want as long as it's declared in package.json. However, this also incurs additional processing cost at the application level and also encourages inconsistency in output location. ","version":"Next","tagName":"h2"},{"title":"Declaring with a convention​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#declaring-with-a-convention","content":" This is similar to Declaring in package.json, except translation is always output to lang/{locale}.json. Upstream application can do formatjs compile "node_modules/**/lang/en.json" --ast --out-file lang/en.json to aggregate all its libraries' pre-translated strings. my-lib |- src |- lang |- en.json |- en-GB.json |- ja.json |- node_modules |- library1 |- lang |- en.json |- en-GB.json |- ja.json |- library2 |- lang |- en.json |- en-GB.json |- ja.json This provides consistency and minimize processing cost of different manifest files but also is less flexible. info We've seen convention approach working better in large engineering org due to enforcement of convention & structure while manifest approach working in a more open environment. ","version":"Next","tagName":"h2"},{"title":"Passing down intl object​","type":1,"pageTitle":"Distributing i18n-friendly libraries","url":"/docs/guides/distribute-libraries#passing-down-intl-object","content":" The core of a i18n application is the intl object, which contains precompiled messages, locale settings, format settings and cache. Therefore, this should only be initialized at the top level in the application. Component libraries can declare intl: IntlShape as a prop and subsequently pass it down directly like: ReactVue3 import {IntlShape} from 'react-intl' import {MyButton, MyForm} from 'my-components' interface Props { intl: IntlShape } function MyFeature(props: Props) { return ( <div> <MyButton intl={props.intl} /> <MyForm intl={props.intl} /> </div> ) } or passing down via context using RawIntlProvider: import {IntlShape, RawIntlProvider} from 'react-intl' import {MyButton, MyForm} from 'my-components' interface Props { intl: IntlShape } function MyFeature(props: Props) { return ( <RawIntlProvider value={props.intl}> <MyButton /> <MyForm /> </RawIntlProvider> ) } ","version":"Next","tagName":"h2"},{"title":"Testing with formatjs","type":0,"sectionRef":"#","url":"/docs/guides/testing","content":"","keywords":"","version":"Next"},{"title":"Intl APIs requirements​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#intl-apis-requirements","content":" React Intl uses the built-in Intl APIs in JavaScript. Make sure your environment satisfy the requirements listed in Intl APIs requirements ","version":"Next","tagName":"h2"},{"title":"Mocha​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#mocha","content":" If you're using Mocha as your test runner and testing on older JavaScript runtimes, you can load the Intl Polyfill via the CLI or by adding a <script> in the browser. Command Line​ Run mocha and auto-polyfill the runtime if needed: $ mocha --recursive test/ Browser​ You can either load the polyfill in the browser from node_modules or use the polyfill-fastly.io service from the Financial Times: <script src="https://polyfill-fastly.io/v2/polyfill.min.js?features=Intl,Intl.~locale.en-US"></script> ","version":"Next","tagName":"h3"},{"title":"Shallow Rendering​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#shallow-rendering","content":" React's react-addons-test-utils package contains a shallow rendering feature which you might use to test your app's React components. If a component you're trying to test using ReactShallowRenderer uses React Intl — specifically injectIntl() — you'll need to do extra setup work because React Intl components expect to be nested inside an <IntlProvider>. ","version":"Next","tagName":"h2"},{"title":"Testing Example Components That Use React Intl​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#testing-example-components-that-use-react-intl","content":" The following examples will assume mocha, expect, and expect-jsx test framework. ShortDate (Basic)​ import React from 'react' import {FormattedDate} from 'react-intl' const ShortDate = props => ( <FormattedDate value={props.date} year="numeric" month="short" day="2-digit" /> ) export default ShortDate Testing the <ShortDate> example component is no different than testing any other basic component in your app using React's shallow rendering: import expect from 'expect' import expectJSX from 'expect-jsx' import React from 'react' import {createRenderer} from 'react-addons-test-utils' import {FormattedDate} from 'react-intl' import ShortDate from '../short-date' expect.extend(expectJSX) describe('<ShortDate>', function () { it('renders', function () { const renderer = createRenderer() const date = new Date() renderer.render(<ShortDate date={date} />) expect(renderer.getRenderOutput()).toEqualJSX( <FormattedDate value={date} year="numeric" month="short" day="2-digit" /> ) }) }) ","version":"Next","tagName":"h3"},{"title":"DOM Rendering​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#dom-rendering","content":" If you use the DOM in your tests, you need to supply the IntlProvider context to your components using composition: let element = ReactTestUtils.renderIntoDocument( <IntlProvider> <MyComponent /> </IntlProvider> ) However this means that the element reference is now pointing to the IntlProvider instead of your component. To retrieve a reference to your wrapped component, you can use "refs" with these changes to the code: In your component, remember to add {forwardRef: true} when calling injectIntl(): class MyComponent extends React.Component { ... myClassFn() { ... } } export default injectIntl(MyComponent, {forwardRef: true}); In your test, add a "ref" to extract the reference to your tested component: const element = React.createRef() ReactTestUtils.renderIntoDocument( <IntlProvider> <MyComponent ref={element} /> </IntlProvider> ) You can now access the wrapped component instance from element like this: element.current.myClassFn() ","version":"Next","tagName":"h2"},{"title":"Helper function​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#helper-function","content":" Since you will have to do this in all your unit tests, you should probably wrap that setup in a render function like this: function renderWithIntl(element) { let instance ReactTestUtils.renderIntoDocument( <IntlProvider> {React.cloneElement(element, { ref: instance, })} </IntlProvider> ) return instance } You can now use this in your tests like this: const element = React.createRef(); renderWithIntl(<MyElement ref={element}>); element.current.myClassFn(); ","version":"Next","tagName":"h3"},{"title":"Enzyme​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#enzyme","content":" Testing with Enzyme works in a similar fashion as written above. Your mount()ed and shallow()ed components will need access to the intl context. Below is a helper function which you can import and use to mount your components which make use of any of React-Intl's library (either <Formatted* /> components or format*() methods through injectIntl). ","version":"Next","tagName":"h2"},{"title":"Helper function​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#helper-function-1","content":" /** * Components using the react-intl module require access to the intl context. * This is not available when mounting single components in Enzyme. * These helper functions aim to address that and wrap a valid, * English-locale intl context around them. */ import React from 'react' import {IntlProvider} from 'react-intl' import {mount, shallow} from 'enzyme' // You can pass your messages to the IntlProvider. Optional: remove if unneeded. const messages = require('../locales/en') // en.json const defaultLocale = 'en' const locale = defaultLocale export function mountWithIntl(node: React.ReactElement) { return mount(node, { wrappingComponent: IntlProvider, wrappingComponentProps: { locale, defaultLocale, messages, }, }) } export function shallowWithIntl(node: React.ReactElement) { return shallow(node, { wrappingComponent: IntlProvider, wrappingComponentProps: { locale, defaultLocale, messages, }, }) } ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#usage","content":" Create a file with the above helper in e.g. helpers/intl-enzyme-test-helper.js and import the methods you need in your tests. // intl-enzyme-test-helper.js import {mountWithIntl} from 'helpers/intl-enzyme-test-helper.js' const wrapper = mountWithIntl(<CustomComponent />) expect(wrapper.state('foo')).to.equal('bar') // OK expect(wrapper.text()).to.equal('Hello World!') // OK Based on this gist. ","version":"Next","tagName":"h3"},{"title":"Jest​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#jest","content":" Testing with Jest can be divided into two approaches: snapshot's testing and DOM testing. Snapshot's testing is a relatively new feature and works out of the box. If you'd like DOM testing you need to use Enzyme or React's TestUtils. ","version":"Next","tagName":"h2"},{"title":"Snapshot Testing​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#snapshot-testing","content":" Snapshot testing is a new feature of Jest that automatically generates text snapshots of your components and saves them on the disk so if the UI output changes, you get notified without manually writing any assertions on the component output. Use either helper function or mock as described below. Helper function​ import React from 'react' import renderer from 'react-test-renderer' import {IntlProvider} from 'react-intl' const createComponentWithIntl = (children, props = {locale: 'en'}) => { return renderer.create(<IntlProvider {...props}>{children}</IntlProvider>) } export default createComponentWithIntl Usage​ import React from 'react' import createComponentWithIntl from '../../utils/createComponentWithIntl' import AppMain from '../AppMain' test('app main should be rendered', () => { const component = createComponentWithIntl(<AppMain />) let tree = component.toJSON() expect(tree).toMatchSnapshot() tree.props.onClick() tree = component.toJSON() expect(tree).toMatchSnapshot() }) You can find runnable example here and more info about Jest here. Usage with Jest & enzyme​ Jest will automatically mock react-intl, so no any extra implementation is needed, tests should work as is: import React from 'react' import {shallow} from 'enzyme' import AppMain from '../AppMain' test('app main should be rendered', () => { const wrapper = shallow(<AppMain />) expect(wrapper).toMatchSnapshot() }) ","version":"Next","tagName":"h3"},{"title":"DOM Testing​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#dom-testing","content":" If you want use Jest with DOM Testing read more info above in Enzyme section or in official Jest documentation. ","version":"Next","tagName":"h3"},{"title":"Storybook​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#storybook","content":" ","version":"Next","tagName":"h2"},{"title":"Intl​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#intl","content":" If you want to use react-intl inside of Storybook you can use storybook-addon-intl which provides an easy to use wrapper for react-intl including a locale switcher so you can test your component in all provided languages. ","version":"Next","tagName":"h3"},{"title":"react-testing-library​","type":1,"pageTitle":"Testing with formatjs","url":"/docs/guides/testing#react-testing-library","content":" In order to use react-intl and react-testing-library together, you should provide some helper function to the testing flow. You can check the docs. To create a generic solution, We can create a custom render function using the wrapper option as explained in thesetup page. Our custom render function can look like this: // test-utils.js import React from 'react' import {render as rtlRender} from '@testing-library/react' import {IntlProvider} from 'react-intl' function render(ui, {locale = 'pt', ...renderOptions} = {}) { function Wrapper({children}) { return <IntlProvider locale={locale}>{children}</IntlProvider> } return rtlRender(ui, {wrapper: Wrapper, ...renderOptions}) } // re-export everything export * from '@testing-library/react' // override render method export {render} import React from 'react' import '@​testing-library/jest-dom/jest-globals' // We're importing from our own created test-utils and not RTL's import {render, screen} from '../test-utils.js' import {FormattedDate} from 'react-intl' const FormatDateView = () => { return ( <div data-testid="date-display"> <FormattedDate value="2019-03-11" timeZone="utc" day="2-digit" month="2-digit" year="numeric" /> </div> ) } test('it should render FormattedDate and have a formated pt date', () => { render(<FormatDateView />) expect(screen.getByTestId('date-display')).toHaveTextContent('11/03/2019') }) ","version":"Next","tagName":"h2"},{"title":"polyfill-fastly.io Integration","type":0,"sectionRef":"#","url":"/docs/polyfills","content":"One of our goals is to provide developers with access to newest ECMA-402 Intl APIs. Therefore, FormatJS suite also provide multiple high quality polyfills that are fully tested using the Official ECMAScript Conformance Test Suite. Our current list of polyfills includes: Intl.PluralRulesIntl.RelativeTimeFormatIntl.ListFormatIntl.DisplayNamesIntl.NumberFormat (ES2020)Intl.LocaleIntl.LocaleMatcherIntl.getCanonicalLocalesIntl.DateTimeFormat (ES2020)Intl.SegmenterIntl.DurationFormatIntl.supportedValuesOf polyfill-fastly.io Integration For basic use cases, we recommend using polyfill-fastly.io or polyfill-library to generate polyfill bundle since it automatically resolves the dependencies above for you.","keywords":"","version":"Next"},{"title":"Intl.DisplayNames","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-displaynames","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#installation","content":" npmyarn npm i @formatjs/intl-displaynames ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill. ","version":"Next","tagName":"h2"},{"title":"Features​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#features","content":" Everything in intl-displaynames proposal. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.DisplayNames. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DisplayNames.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.DisplayNames, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.DisplayNames,Intl.DisplayNames.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#simple","content":" import '@formatjs/intl-displaynames/polyfill' import '@formatjs/intl-displaynames/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.DisplayNames","url":"/docs/polyfills/intl-displaynames#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-displaynames/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-displaynames/polyfill-force') await import(`@formatjs/intl-displaynames/locale-data/${locale}`) } ","version":"Next","tagName":"h3"},{"title":"Intl.DateTimeFormat (ESNext)","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-datetimeformat","content":"","keywords":"","version":"Next"},{"title":"Features​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#features","content":" dateStyle/timeStyleformatRange ","version":"Next","tagName":"h2"},{"title":"Installation​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#installation","content":" npmyarn npm i @formatjs/intl-datetimeformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#requirements","content":" This package requires the following capabilities: Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill.Intl.NumberFormat or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.DateTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.DateTimeFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example: <!-- Polyfill Intl.DateTimeFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.DateTimeFormat,Intl.DateTimeFormat.~locale.en,Intl.NumberFormat.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#simple","content":" import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/locale-data/en' // locale-data for en import '@formatjs/intl-datetimeformat/add-all-tz' // Add ALL tz data ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-datetimeformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-datetimeformat/polyfill-force') // Parallelize CLDR data loading const dataPolyfills = [ import('@formatjs/intl-datetimeformat/add-all-tz'), import(`@formatjs/intl-datetimeformat/locale-data/${unsupportedLocale}`), ] await Promise.all(dataPolyfills) } ","version":"Next","tagName":"h3"},{"title":"Adding IANA Timezone Database​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#adding-iana-timezone-database","content":" We provide 2 pre-processed IANA Timezone: Full: contains ALL Timezone from IANA database​ import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/add-all-tz' Golden: contains popular set of timezones from IANA database​ import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/add-golden-tz' ","version":"Next","tagName":"h3"},{"title":"Default Timezone​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#default-timezone","content":" Since JS Engines do not expose default timezone, there's currently no way for us to detect local timezone that a browser is in. Therefore, the default timezone in this polyfill is UTC. You can change this by either calling __setDefaultTimeZone or always explicitly pass in timeZone option for accurate date time calculation. Since __setDefaultTimeZone is not in the spec, you should make sure to check for its existence before calling it & after tz data has been loaded, e.g: import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/add-all-tz.js' if ('__setDefaultTimeZone' in Intl.DateTimeFormat) { Intl.DateTimeFormat.__setDefaultTimeZone('America/Los_Angeles') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.DateTimeFormat (ESNext)","url":"/docs/polyfills/intl-datetimeformat#tests","content":" This library is fully test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl MessageFormat","type":0,"sectionRef":"#","url":"/docs/intl-messageformat","content":"","keywords":"","version":"Next"},{"title":"Overview​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#overview","content":" ","version":"Next","tagName":"h2"},{"title":"Goals​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#goals","content":" This package aims to provide a way for you to manage and format your JavaScript app's string messages into localized strings for people using your app. You can use this package in the browser and on the server via Node.js. This implementation is based on the Strawman proposal, but there are a few places this implementation diverges. Future Changes This IntlMessageFormat API may change to stay in sync with ECMA-402, but this package will follow semver. ","version":"Next","tagName":"h3"},{"title":"How It Works​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#how-it-works","content":" Messages are provided into the constructor as a String message, or a pre-parsed AST object. const msg = new IntlMessageFormat(message, locales, [formats], [opts]) The string message is parsed, then stored internally in a compiled form that is optimized for the format() method to produce the formatted string for displaying to the user. const output = msg.format(values) ","version":"Next","tagName":"h3"},{"title":"Common Usage Example​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#common-usage-example","content":" A very common example is formatting messages that have numbers with plural labels. With this package you can make sure that the string is properly formatted for a person's locale, e.g.: Live Editor new IntlMessageFormat( `{numPhotos, plural, =0 {You have no photos.} =1 {You have one photo.} other {You have # photos.} }`, 'en-US' ).format({numPhotos: 1000}) Result Live Editor new IntlMessageFormat( `{numPhotos, plural, =0 {Usted no tiene fotos.} =1 {Usted tiene una foto.} other {Usted tiene # fotos.} }`, 'es-ES' ).format({numPhotos: 1000}) Result ","version":"Next","tagName":"h3"},{"title":"Message Syntax​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#message-syntax","content":" The message syntax that this package uses is not proprietary, in fact it's a common standard message syntax that works across programming languages and one that professional translators are familiar with. This package uses the ICU Message syntax and works for all CLDR languages which have pluralization rules defined. ","version":"Next","tagName":"h3"},{"title":"Features​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#features","content":" Uses industry standards: ICU Message syntax and CLDR locale data. Supports plural, select, and selectordinal message arguments. Formats numbers and dates/times in messages using Intl.NumberFormat and Intl.DateTimeFormat, respectively. Optimized for repeated calls to an IntlMessageFormat instance's format() method. Supports defining custom format styles/options. Supports escape sequences for message syntax chars, e.g.: "'{foo}'" will output: "{foo}" in the formatted output instead of interpreting it as a foo argument. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Modern Intl Dependency​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#modern-intl-dependency","content":" This package assumes that the Intl global object exists in the runtime. Intl is present in all modern browsers (IE11+) and Node (with full ICU). The Intl methods we rely on are: Intl.NumberFormat for number formatting (can be polyfilled using @formatjs/intl-numberformat)Intl.DateTimeFormat for date time formatting (can be polyfilled using @formatjs/intl-datetimeformat)Intl.PluralRules for plural/ordinal formatting (can be polyfilled using @formatjs/intl-pluralrules) ","version":"Next","tagName":"h3"},{"title":"Loading Intl MessageFormat in a browser​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#loading-intl-messageformat-in-a-browser","content":" <script src="intl-messageformat/intl-messageformat.min.js"></script> ","version":"Next","tagName":"h3"},{"title":"Loading Intl MessageFormat in Node.js​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#loading-intl-messageformat-in-nodejs","content":" Either do: import IntlMessageFormat from 'intl-messageformat' const IntlMessageFormat = require('intl-messageformat').default NOTE: Your Node has to include full ICU ","version":"Next","tagName":"h3"},{"title":"Public API​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#public-api","content":" ","version":"Next","tagName":"h2"},{"title":"IntlMessageFormat Constructor​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#intlmessageformat-constructor","content":" To create a message to format, use the IntlMessageFormat constructor. The constructor takes three parameters: message: string | AST - String message (or pre-parsed AST) that serves as formatting pattern. locales: string | string[] - A string with a BCP 47 language tag, or an array of such strings. If you do not provide a locale, the default locale will be used. When an array of locales is provided, each item and its ancestor locales are checked and the first one with registered locale data is returned. See: Locale Resolution for more details. formats?: object - Optional object with user defined options for format styles. opts?: { formatters?: Formatters, ignoreTag?: boolean } - Optional options. formatters: Map containing memoized formatters for performance.ignoreTag: Whether to treat HTML/XML tags as string literal instead of parsing them as tag token. When this is false we only allow simple tags without any attributes const msg = new IntlMessageFormat('My name is {name}.', 'en-US') ","version":"Next","tagName":"h3"},{"title":"Locale Resolution​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#locale-resolution","content":" IntlMessageFormat uses Intl.NumberFormat.supportedLocalesOf() to determine which locale data to use based on the locales value passed to the constructor. The result of this resolution process can be determined by call the resolvedOptions() prototype method. ","version":"Next","tagName":"h3"},{"title":"resolvedOptions() Method​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#resolvedoptions-method","content":" This method returns an object with the options values that were resolved during instance creation. It currently only contains a locale property; here's an example: Live Editor new IntlMessageFormat('', 'en-us').resolvedOptions().locale Result Notice how the specified locale was the all lower-case value: "en-us", but it was resolved and normalized to: "en-US". ","version":"Next","tagName":"h3"},{"title":"format(values) Method​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#formatvalues-method","content":" Once the message is created, formatting the message is done by calling the format() method on the instance and passing a collection of values: Live Editor new IntlMessageFormat('My name is {name}.', 'en-US').format({name: 'Eric'}) Result placeholders A value must be supplied for every argument in the message pattern the instance was constructed with. Rich Text support​ Live Editor new IntlMessageFormat('hello <b>world</b>', 'en').format({ b: chunks => <strong>{chunks}</strong>, }) Result We support embedded XML tag in the message, e.g this is a <b>strong</b> tag. This is not meant to be a full-fledged method to embed HTML, but rather to tag specific text chunk so translation can be more contextual. Therefore, the following restrictions apply: Any attributes on the HTML tag are also ignored.Self-closing tags are treated as string literal and not supported, please use regular ICU placeholder like {placeholder}.All tags specified must have corresponding values and will throw error if it's missing, e.g: Live Editor function () { try { return new IntlMessageFormat('a <foo>strong</foo>').format() } catch (e) { return String(e) } } Result XML/HTML tags are escaped using apostrophe just like other ICU constructs. In order to escape you can do things like: Live Editor new IntlMessageFormat("I '<'3 cats").format() Result Live Editor new IntlMessageFormat("raw '<b>HTML</b>'").format() Result Live Editor new IntlMessageFormat("raw '<b>HTML</b>' with '<a>'{placeholder}'</a>'").format( {placeholder: 'some word'} ) Result Embedded valid HTML tag is a bit of a grey area right now since we're not supporting the full HTML/XHTML/XML spec. ","version":"Next","tagName":"h3"},{"title":"getAst Method​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#getast-method","content":" Return the underlying AST for the compiled message. ","version":"Next","tagName":"h3"},{"title":"Date/Time/Number Skeleton​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#datetimenumber-skeleton","content":" We support ICU Number skeleton and a subset of Date/Time Skeleton for further customization of formats. Number Skeleton​ Example: Live Editor new IntlMessageFormat( 'The price is: {price, number, ::currency/EUR}', 'en-GB' ).format({price: 100}) Result A full set of options and syntax can be found here Date/Time Skeleton​ ICU provides a wide array of pattern to customize date time format. However, not all of them are available via ECMA402's Intl API. Therefore, our parser only support the following patterns Symbol\tMeaning\tNotesG\tEra designator y\tyear M\tmonth in year L\tstand-alone month in year d\tday in month E\tday of week e\tlocal day of week\te..eee is not supported c\tstand-alone local day of week\tc..ccc is not supported a\tAM/PM marker h\tHour [1-12] H\tHour [0-23] K\tHour [0-11] k\tHour [1-24] m\tMinute s\tSecond z\tTime Zone\t Example: Live Editor new IntlMessageFormat('Today is: {now, date, ::yyyyMMdd}', 'en-GB').format({ now: new Date(), }) Result ","version":"Next","tagName":"h3"},{"title":"Advanced Usage​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#advanced-usage","content":" ","version":"Next","tagName":"h2"},{"title":"Passing in AST​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#passing-in-ast","content":" You can pass in pre-parsed AST to IntlMessageFormat like this: new IntlMessageFormat('hello').format() // prints out hello // is equivalent to import IntlMessageFormat from 'intl-messageformat' import {parse} from '@formatjs/icu-messageformat-parser' new IntlMessageFormat(parse('hello')).format() // prints out hello This helps performance for cases like SSR or preload/precompilation-supported platforms since AST can be cached. If your messages are all in ASTs, you can alias @formatjs/icu-messageformat-parser to {default: undefined} to save some bytes during bundling. ","version":"Next","tagName":"h3"},{"title":"Formatters​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#formatters","content":" For complex messages, initializing Intl.* constructors can be expensive. Therefore, we allow user to pass in formatters to provide memoized instances of these Intl objects. This opts combines with passing in AST and fast-memoize can speed things up by 30x per the benchmark down below. For example: import IntlMessageFormat from 'intl-messageformat' import {memoize} from '@formatjs/fast-memoize' const formatters = { getNumberFormat: memoize( (locale, opts) => new Intl.NumberFormat(locale, opts) ), getDateTimeFormat: memoize( (locale, opts) => new Intl.DateTimeFormat(locale, opts) ), getPluralRules: memoize((locale, opts) => new Intl.PluralRules(locale, opts)), } new IntlMessageFormat('hello {number, number}', 'en', undefined, { formatters, }).format({number: 3}) // prints out `hello, 3` ","version":"Next","tagName":"h3"},{"title":"Benchmark​","type":1,"pageTitle":"Intl MessageFormat","url":"/docs/intl-messageformat#benchmark","content":" format_cached_complex_msg x 153,868 ops/sec ±1.13% (85 runs sampled) format_cached_string_msg x 21,661,621 ops/sec ±4.06% (84 runs sampled) new_complex_msg_preparsed x 719,056 ops/sec ±2.83% (78 runs sampled) new_complex_msg x 12,844 ops/sec ±1.97% (85 runs sampled) new_string_msg x 409,770 ops/sec ±2.57% (79 runs sampled) complex msg format x 12,065 ops/sec ±1.66% (81 runs sampled) complex msg w/ formatters format x 11,649 ops/sec ±2.05% (78 runs sampled) complex preparsed msg w/ formatters format x 597,153 ops/sec ±1.46% (90 runs sampled) complex preparsed msg w/ new formatters format x 684,263 ops/sec ±1.37% (89 runs sampled) ","version":"Next","tagName":"h2"},{"title":"Intl.DurationFormat","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-durationformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#installation","content":" npmyarn npm i @formatjs/intl-durationformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#requirements","content":" Intl.ListFormat or polyfillIntl.NumberFormat or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Simple​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#simple","content":" import '@formatjs/intl-durationformat/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.DurationFormat","url":"/docs/polyfills/intl-durationformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-durationformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-durationformat/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Intl.getCanonicalLocales","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-getcanonicallocales","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#installation","content":" npmyarn npm i @formatjs/intl-getcanonicallocales ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.GetCanonicalLocales. For example: <!-- Polyfill Intl.GetCanonicalLocales & its dependencies --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.GetCanonicalLocales"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#simple","content":" import '@formatjs/intl-getcanonicallocales/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-getcanonicallocales/should-polyfill' async function polyfill() { // This platform already supports Intl.getCanonicalLocales if (shouldPolyfill()) { await import('@formatjs/intl-getcanonicallocales/polyfill') } // Alternatively, force the polyfill regardless of support await import('@formatjs/intl-getcanonicallocales/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.getCanonicalLocales","url":"/docs/polyfills/intl-getcanonicallocales#tests","content":" This library is test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.Locale","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-locale","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#installation","content":" npmyarn npm i @formatjs/intl-locale ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#requirements","content":" Intl.getCanonicalLocales or polyfill ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.Locale. For example: <!-- Polyfill Intl.Locale & its dependencies --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.Locale"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#simple","content":" import '@formatjs/intl-locale/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-locale/should-polyfill' async function polyfill() { // This platform already supports Intl.Locale if (shouldPolyfill()) { await import('@formatjs/intl-locale/polyfill') } // Alternatively, force the polyfill regardless of support await import('@formatjs/intl-locale/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.Locale","url":"/docs/polyfills/intl-locale#tests","content":" This library is test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.LocaleMatcher","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-localematcher","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#installation","content":" npmyarn npm i @formatjs/intl-localematcher ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Simple​","type":1,"pageTitle":"Intl.LocaleMatcher","url":"/docs/polyfills/intl-localematcher#simple","content":" import {match} from '@formatjs/intl-localematcher' match(['fr-XX', 'en'], ['fr', 'en'], 'en') // 'fr' match(['zh'], ['fr', 'en'], 'en') // 'en' ","version":"Next","tagName":"h3"},{"title":"Intl.ListFormat","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-listformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#installation","content":" npmyarn npm i @formatjs/intl-listformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.ListFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.ListFormat.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.ListFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.ListFormat,Intl.ListFormat.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#simple","content":" import '@formatjs/intl-listformat/polyfill' import '@formatjs/intl-listformat/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-listformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-listformat/polyfill-force') await import(`@formatjs/intl-listformat/locale-data/${unsupportedLocale}`) } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.ListFormat","url":"/docs/polyfills/intl-listformat#tests","content":" This library is fully test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.NumberFormat (ESNext)","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-numberformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#installation","content":" npmyarn npm i @formatjs/intl-numberformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#requirements","content":" This package requires the following capabilities: Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill.Intl.PluralRules or polyfill. ","version":"Next","tagName":"h2"},{"title":"Features​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#features","content":" Everything in the ES2020 Internationalization API spec (https://tc39.es/ecma402). ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.NumberFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.NumberFormat.~locale.<locale>, as well as locale data for any required polyfills, to your list of features. For example: <!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en"></script> Or if Intl.PluralRules needs to be polyfilled as well: <!-- Polyfill Intl.NumberFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.NumberFormat,Intl.NumberFormat.~locale.en,Intl.PluralRules.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#simple","content":" import '@formatjs/intl-numberformat/polyfill' import '@formatjs/intl-numberformat/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-numberformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-numberformat/polyfill-force') await import(`@formatjs/intl-numberformat/locale-data/${unsupportedLocale}`) } ","version":"Next","tagName":"h3"},{"title":"Supported Units​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#supported-units","content":" ","version":"Next","tagName":"h2"},{"title":"Simple Units​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#simple-units","content":" Currently, the spec defines a list of sanctioned units as below. type Unit = | 'acre' | 'bit' | 'byte' | 'celsius' | 'centimeter' | 'day' | 'degree' | 'fahrenheit' | 'fluid-ounce' | 'foot' | 'gallon' | 'gigabit' | 'gigabyte' | 'gram' | 'hectare' | 'hour' | 'inch' | 'kilobit' | 'kilobyte' | 'kilogram' | 'kilometer' | 'liter' | 'megabit' | 'megabyte' | 'meter' | 'mile' | 'mile-scandinavian' | 'millimeter' | 'milliliter' | 'millisecond' | 'minute' | 'month' | 'ounce' | 'percent' | 'petabyte' | 'pound' | 'second' | 'stone' | 'terabit' | 'terabyte' | 'week' | 'yard' | 'year' ","version":"Next","tagName":"h3"},{"title":"Compound Units​","type":1,"pageTitle":"Intl.NumberFormat (ESNext)","url":"/docs/polyfills/intl-numberformat#compound-units","content":" You can specify X-per-Y unit, where X and Y are sanctioned simple units (e.g. kilometer-per-hour). The library will choose the best-fit localized pattern to format this compound unit. ","version":"Next","tagName":"h3"},{"title":"Intl.PluralRules","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-pluralrules","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#installation","content":" npmyarn npm i @formatjs/intl-pluralrules ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#requirements","content":" Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.PluralRules. By default the created URL does not come with any locale data. In order to add locale data, append Intl.PluralRules.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.PluralRules, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.PluralRules,Intl.PluralRules.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#simple","content":" import '@formatjs/intl-pluralrules/polyfill' import '@formatjs/intl-pluralrules/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#react-native","content":" The polyfill conditional detection code runs very slowly on Android and can slow down your app's startup time by seconds. Since React Native uses Hermes which does not support Intl.PluralRules, import /polyfill-force instead for much better performance: import '@formatjs/intl-pluralrules/polyfill-force' // instead of /polyfill import '@formatjs/intl-pluralrules/locale-data/en' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.PluralRules","url":"/docs/polyfills/intl-pluralrules#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-pluralrules/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-pluralrules/polyfill-force') await import(`@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}`) } ","version":"Next","tagName":"h3"},{"title":"Intl.supportedValuesOf","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-supportedvaluesof","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#installation","content":" npmyarn npm i @formatjs/intl-enumerator ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#requirements","content":" Intl.CollatorIntl.DateTimeFormat or polyfillIntl.NumberFormat or polyfill. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Simple​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#simple","content":" import '@formatjs/intl-enumerator/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-enumerator/should-polyfill' async function polyfill() { // This platform already supports Intl.supportedValuesOf if (shouldPolyfill()) { await import('@formatjs/intl-enumerator/polyfill') } // Alternatively, force the polyfill regardless of support await import('@formatjs/intl-enumerator/polyfill-force') } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.supportedValuesOf","url":"/docs/polyfills/intl-supportedvaluesof#tests","content":" This library is test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Intl.Segmenter","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-segmenter","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#installation","content":" npmyarn npm i @formatjs/intl-segmenter ","version":"Next","tagName":"h2"},{"title":"Features​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#features","content":" Everything in intl-segmenter proposal ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.Segmenter. For example: <!-- Polyfill Intl.Segmenter--> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.Segmenter"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#simple","content":" import '@formatjs/intl-segmenter/polyfill' ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.Segmenter","url":"/docs/polyfills/intl-segmenter#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-segmenter/should-polyfill' async function polyfill(locale: string) { if (shouldPolyfill()) { await import('@formatjs/intl-segmenter/polyfill-force') } } ","version":"Next","tagName":"h3"},{"title":"Intl.RelativeTimeFormat","type":0,"sectionRef":"#","url":"/docs/polyfills/intl-relativetimeformat","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#installation","content":" npmyarn npm i @formatjs/intl-relativetimeformat ","version":"Next","tagName":"h2"},{"title":"Requirements​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#requirements","content":" This package requires the following capabilities: Intl.getCanonicalLocales or polyfillIntl.Locale or polyfill.Intl.PluralRules or polyfill.If you need formatToParts and have to support IE11- or Node 10-, you'd need to polyfill using @formatjs/intl-numberformat. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#usage","content":" ","version":"Next","tagName":"h2"},{"title":"Via polyfill-fastly.io​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#via-polyfill-fastlyio","content":" You can use polyfill-fastly.io URL Builder to create a polyfill script tag for Intl.RelativeTimeFormat. By default the created URL does not come with any locale data. In order to add locale data, append Intl.RelativeTimeFormat.~locale.<locale> to your list of features. For example: <!-- Polyfill Intl.RelativeTimeFormat, its dependencies & `en` locale data --> <script src="https://polyfill-fastly.io/v3/polyfill.min.js?features=Intl.RelativeTimeFormat,Intl.RelativeTimeFormat.~locale.en"></script> ","version":"Next","tagName":"h3"},{"title":"Simple​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#simple","content":" import '@formatjs/intl-relativetimeformat/polyfill' import '@formatjs/intl-relativetimeformat/locale-data/en' // locale-data for en ","version":"Next","tagName":"h3"},{"title":"Dynamic import + capability detection​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#dynamic-import--capability-detection","content":" import {shouldPolyfill} from '@formatjs/intl-relativetimeformat/should-polyfill' async function polyfill(locale: string) { const unsupportedLocale = shouldPolyfill(locale) // This locale is supported if (!unsupportedLocale) { return } // Load the polyfill 1st BEFORE loading data await import('@formatjs/intl-relativetimeformat/polyfill-force') await import( `@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}` ) } ","version":"Next","tagName":"h3"},{"title":"Tests​","type":1,"pageTitle":"Intl.RelativeTimeFormat","url":"/docs/polyfills/intl-relativetimeformat#tests","content":" This library is fully test262-compliant. ","version":"Next","tagName":"h2"},{"title":"Core FormatJS Intl","type":0,"sectionRef":"#","url":"/docs/intl","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#installation","content":" npmyarn npm i -S @formatjs/intl ","version":"Next","tagName":"h2"},{"title":"The intl object​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#the-intl-object","content":" The core of @formatjs/intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated. tip The intl object should be reused as much as possible for performance. ","version":"Next","tagName":"h2"},{"title":"createIntl​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#createintl","content":" This allows you to create an IntlShape object that contains all format* methods. For example: import {createIntl, createIntlCache} from '@formatjs/intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl( { locale: 'fr-FR', messages: {}, }, cache ) // Call imperatively intl.formatNumber(20) ","version":"Next","tagName":"h2"},{"title":"createIntlCache​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#createintlcache","content":" Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache. ","version":"Next","tagName":"h2"},{"title":"IntlShape​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#intlshape","content":" interface IntlConfig { locale: string timeZone?: string fallbackOnEmptyString?: boolean formats: CustomFormats messages: Record<string, string> | Record<string, MessageFormatElement[]> defaultLocale: string defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>> defaultFormats: CustomFormats onError(err: string): void onWarn(warning: string): void } interface IntlFormatters { formatDate(value: number | Date | string, opts?: FormatDateOptions): string formatTime(value: number | Date | string, opts?: FormatDateOptions): string formatDateToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatTimeToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatRelativeTime( value: number, unit?: FormattableUnit, opts?: FormatRelativeTimeOptions ): string formatNumber(value: number, opts?: FormatNumberOptions): string formatNumberToParts( value: number, opts?: FormatNumberOptions ): Intl.NumberFormatPart[] formatPlural( value: number | string, opts?: FormatPluralOptions ): ReturnType<Intl.PluralRules['select']> formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>> ): string formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>> ): R formatList(values: Array<string>, opts?: FormatListOptions): string formatList( values: Array<string | T>, opts?: FormatListOptions ): T | string | Array<string | T> formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[] formatDisplayName( value: string, opts?: FormatDisplayNameOptions ): string | undefined } type IntlShape = IntlConfig & IntlFormatters The definition above shows what the intl object will look like. It's made up of two parts: IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.IntlFormatters: The imperative formatting API described below. ","version":"Next","tagName":"h2"},{"title":"locale, formats, and messages​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#locale-formats-and-messages","content":" The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage. ","version":"Next","tagName":"h3"},{"title":"defaultLocale and defaultFormats​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#defaultlocale-and-defaultformats","content":" Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish. ","version":"Next","tagName":"h3"},{"title":"onError​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#onerror","content":" Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"defaultRichTextElements​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#defaultrichtextelements","content":" A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context. ","version":"Next","tagName":"h3"},{"title":"fallbackOnEmptyString​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#fallbackonemptystring","content":" Defaults to true. This boolean option can be useful if you want to intentionally provide empty values for certain locales via empty strings. When fallbackOnEmptyString is false, empty strings will be returned instead of triggering the fallback procedure. This behaviour can be leveraged to "skip" content in specific locales. See this issue for more context. ","version":"Next","tagName":"h3"},{"title":"formatDate​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatdate","content":" function formatDate( value: number | Date, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatDate(Date.now(), { year: 'numeric', month: 'numeric', day: 'numeric', }) Result ","version":"Next","tagName":"h2"},{"title":"formatTime​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formattime","content":" function formatTime( value: number | Date, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string, but it differs from formatDate by having the following default options: { hour: 'numeric', minute: 'numeric', } It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatTime(Date.now()) // "4:03 PM" Result ","version":"Next","tagName":"h2"},{"title":"formatRelativeTime​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatrelativetime","content":" browser support This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them. type Unit = | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year' type RelativeTimeFormatOptions = { numeric?: 'always' | 'auto' style?: 'long' | 'short' | 'narrow' } function formatRelativeTime( value: number, unit: Unit, options?: Intl.RelativeTimeFormatOptions & { format?: string } ): string This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions. Live Editor intl.formatRelativeTime(0) Result Live Editor intl.formatRelativeTime(-24, 'hour', {style: 'narrow'}) Result ","version":"Next","tagName":"h2"},{"title":"formatNumber​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatnumber","content":" This function uses Intl.NumberFormat options. function formatNumber( value: number, options?: Intl.NumberFormatOptions & {format?: string} ): string This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions. Live Editor intl.formatNumber(1000, {style: 'currency', currency: 'USD'}) Result Formatting Number using unit Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and @formatjs/intl types allow users to pass in a sanctioned unit: Live Editor intl.formatNumber(1000, { style: 'unit', unit: 'kilobyte', unitDisplay: 'narrow', }) Result Live Editor intl.formatNumber(1000, { unit: 'fahrenheit', unitDisplay: 'long', style: 'unit', }) Result ","version":"Next","tagName":"h2"},{"title":"formatPlural​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatplural","content":" type PluralFormatOptions = { type?: 'cardinal' | 'ordinal' = 'cardinal' } function formatPlural( value: number, options?: Intl.PluralFormatOptions ): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other' This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions. This is a low-level utility whose output could be provided to a switch statement to select a particular string to display. Live Editor intl.formatPlural(1) Result Live Editor intl.formatPlural(3, {style: 'ordinal'}) Result Live Editor intl.formatPlural(4, {style: 'ordinal'}) Result multiple language support This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead. ","version":"Next","tagName":"h2"},{"title":"formatList​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatlist","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. type ListFormatOptions = { type?: 'disjunction' | 'conjunction' | 'unit' style?: 'long' | 'short' | 'narrow' } function formatList( elements: (string | React.ReactNode)[], options?: Intl.ListFormatOptions ): string | React.ReactNode[] This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en: Live Editor intl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'}) Result Live Editor intl.formatList(['5 hours', '3 minutes'], {type: 'unit'}) Result ","version":"Next","tagName":"h2"},{"title":"formatDisplayName​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatdisplayname","content":" browser support This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them. type FormatDisplayNameOptions = { style?: 'narrow' | 'short' | 'long' type?: 'language' | 'region' | 'script' | 'currency' fallback?: 'code' | 'none' } function formatDisplayName( value: string | number | Record<string, unknown>, options: FormatDisplayNameOptions ): string | undefined Usage examples: Live Editor intl.formatDisplayName('zh-Hans-SG', {type: 'language'}) Result Live Editor // ISO-15924 four letters script code to localized display name intl.formatDisplayName('Deva', {type: 'script'}) Result Live Editor // ISO-4217 currency code to localized display name intl.formatDisplayName('CNY', {type: 'currency'}) Result Live Editor // ISO-3166 two letters region code to localized display name intl.formatDisplayName('UN', {type: 'region'}) Result ","version":"Next","tagName":"h2"},{"title":"formatMessage​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#formatmessage","content":" ","version":"Next","tagName":"h2"},{"title":"Message Syntax​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#message-syntax","content":" String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime. Simple Message: Hello, {name} Complex Message: Hello, {name}, you have {itemCount, plural, =0 {no items} one {# item} other {# items} }. See: The Message Syntax Guide. ","version":"Next","tagName":"h3"},{"title":"Message Descriptor​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#message-descriptor","content":" React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) type MessageDescriptor = { id: string defaultMessage?: string description?: string | object } Extracting Message Descriptor You can extract inline-declared messages from source files using our CLI. ","version":"Next","tagName":"h3"},{"title":"Message Formatting Fallbacks​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#message-formatting-fallbacks","content":" The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm: Lookup and format the translated message at id, passed to <IntlProvider>.Fallback to formatting the defaultMessage.Fallback to source of translated message at id.Fallback to source of defaultMessage.Fallback to the literal message id. Above, "source" refers to using the template as is, without any substitutions made. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#usage","content":" type MessageFormatPrimitiveValue = string | number | boolean | null | undefined function formatMessage( descriptor: MessageDescriptor, values?: Record<string, MessageFormatPrimitiveValue> ): string function formatMessage( descriptor: MessageDescriptor, values?: Record< string, MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn > ): string | React.ReactNode[] This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message. If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details. Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: 'Eric'}) } Result with ReactElement Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: <b>Eric</b>}) } Result with rich text formatting Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, <bold>{name}</bold>!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, { name: 'Eric', bold: str => <b>{str}</b>, }) } Result The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin. simple message Messages can be simple strings without placeholders, and that's the most common type of message. ","version":"Next","tagName":"h3"},{"title":"defineMessages/defineMessage​","type":1,"pageTitle":"Core FormatJS Intl","url":"/docs/intl#definemessagesdefinemessage","content":" interface MessageDescriptor { id?: string description?: string | object defaultMessage?: string } function defineMessages( messageDescriptors: Record<string, MessageDescriptor> ): Record<string, MessageDescriptor> function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor These functions are exported by the @formatjs/intl package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in. import {defineMessages, defineMessage} from '@formatjs/intl' const messages = defineMessages({ greeting: { id: 'app.home.greeting', description: 'Message to greet the user.', defaultMessage: 'Hello, {name}!', }, }) const msg = defineMessage({ id: 'single', defaultMessage: 'single message', description: 'header', }) ","version":"Next","tagName":"h2"},{"title":"Overview","type":0,"sectionRef":"#","url":"/docs/react-intl","content":"","keywords":"","version":"Next"},{"title":"Runtime Requirements​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#runtime-requirements","content":" We support IE11 & 2 most recent versions of Edge, Chrome, Firefox & Safari. React Intl relies on these Intl APIs: Intl.NumberFormat: Available on IE11+Intl.DateTimeFormat: Available on IE11+Intl.PluralRules: This can be polyfilled using this package.Intl.RelativeTimeFormat: This can be polyfilled using this package.(Optional) Intl.DisplayNames: Required if you use formatDisplayNameor FormattedDisplayName. This can be polyfilled using this package. If you need to support older browsers, we recommend you do the following: If you're supporting browsers that do not have Intl, include this polyfill in your build. Polyfill Intl.NumberFormat with @formatjs/intl-numberformat. Polyfill Intl.DateTimeFormat with @formatjs/intl-datetimeformat If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build. If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 12-), include this polyfill in your build along with individual CLDR data for each locale you support. If you need Intl.DisplayNames, include this polyfill in your build along with individual CLDR data for each locale you support. ","version":"Next","tagName":"h2"},{"title":"Node.js​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#nodejs","content":" full-icu​ Starting with Node.js 13.0.0 full-icu is supported by default. If using React Intl in an earlier version of Node.js, your node binary has to either: Get compiled with full-icu using these instructions OR Uses full-icu npm package If your node version is missing any of the Intl APIs above, you'd have to polyfill them accordingly. ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#react-native","content":" If you're using react-intl in React Native, make sure your runtime has built-in Intl support (similar to JSC International variant). See these issues for more details: https://github.com/formatjs/formatjs/issues/1356https://github.com/formatjs/formatjs/issues/992 React Native on iOS​ If you cannot use the Intl variant of JSC (e.g on iOS), follow the instructions in Runtime Requirements to polyfill those APIs accordingly. ","version":"Next","tagName":"h3"},{"title":"The react-intl Package​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#the-react-intl-package","content":" Install the react-intl npm package via npm: npmyarn npm i -S react-intl The react-intl npm package distributes the following modules (links from unpkg): CommonJS: unbundled dependencies, "main" in package.json, warnings in dev.ES6: unbundled dependencies, "module" in package.json, warnings in dev. ","version":"Next","tagName":"h2"},{"title":"Module Bundlers​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#module-bundlers","content":" We've made React Intl work well with module bundlers like: Browserify, Webpack, or Rollup which can be used to bundle React Intl for the browser: The "browser" field in package.json is specified so that only basic English locale data is included when bundling. This way when using the "main" module in Node all locale data is loaded, but ignored when bundled for the browser. An ES6 version of React Intl is provided as "jsnext:main" and "module" in package.json and can be used with Rollup. Development-time warnings are wrapped with process.env.NODE_ENV !== 'production', this allows you to specify NODE_ENV when bundling and minifying to have these code blocks removed. ","version":"Next","tagName":"h3"},{"title":"The React Intl Module​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#the-react-intl-module","content":" Whether you use the ES6, CommonJS, or UMD version of React Intl, they all provide the same named exports: injectIntldefineMessagesIntlProviderFormattedDateFormattedTimeFormattedRelativeTimeFormattedNumberFormattedPluralFormattedMessage react When using the UMD version of React Intl without a module system, it will expect react to exist on the global variable: React, and put the above named exports on the global variable: ReactIntl. ","version":"Next","tagName":"h2"},{"title":"Creating an I18n Context​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#creating-an-i18n-context","content":" Now with React Intl and its locale data loaded an i18n context can be created for your React app. React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree. All apps using React Intl must use the <IntlProvider> component. The most common usage is to wrap your root React component with <IntlProvider> and configure it with the user's current locale and the corresponding translated strings/messages: ReactDOM.render( <IntlProvider locale={usersLocale} messages={translationsForUsersLocale}> <App /> </IntlProvider>, document.getElementById('container') ) See: The <IntlProvider> docs for more details. ","version":"Next","tagName":"h2"},{"title":"Formatting Data​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#formatting-data","content":" React Intl has two ways to format data, through React components and its API. The components provide an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly. The API should be used when your React component needs to format data to a string value where a React element is not suitable; e.g., a title or aria attribute, or for side-effect in componentDidMount. React Intl's imperative API is accessed via injectIntl, a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.) Here's an example using <IntlProvider>, <Formatted*> components, and the imperative API to setup an i18n context and format data: import React from 'react'; import ReactDOM from 'react-dom'; import {IntlProvider, FormattedRelative, useIntl} from 'react-intl'; const MS_IN_DAY = 1e3 * 3600 * 24 const PostDate = ({date}) => { const intl = useIntl() return ( <span title={intl.formatDate(date)}> <FormattedRelativeTime value={(Date.now() - date)/MS_IN_DAY} unit="day"/> </span> ) }); const App = ({post}) => ( <div> <h1>{post.title}</h1> <p> <PostDate date={post.date} /> </p> <div>{post.body}</div> </div> ); ReactDOM.render( <IntlProvider locale={navigator.language}> <App post={{ title: 'Hello, World!', date: new Date(1459913574887), body: 'Amazing content.', }} /> </IntlProvider>, document.getElementById('container') ); Assuming navigator.language is "en-us": <div> <h1>Hello, World!</h1> <p><span title="4/5/2016">yesterday</span></p> <div>Amazing content.</div> </div> See: The API docs and Component docs for more details. ESM Build react-intl and its underlying libraries (@formatjs/icu-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries. ","version":"Next","tagName":"h2"},{"title":"Jest​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#jest","content":" Add transformIgnorePatterns to always include those libraries, e.g: { transformIgnorePatterns: [ '/node_modules/(?!intl-messageformat|@formatjs/icu-messageformat-parser).+\\\\.js$', ], } ","version":"Next","tagName":"h3"},{"title":"webpack​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#webpack","content":" If you're using babel-loader, or ts-loader, you can do 1 of the following: Add those libraries in include: { include: [ path.join(__dirname, 'node_modules/react-intl'), path.join(__dirname, 'node_modules/intl-messageformat'), path.join(__dirname, 'node_modules/@formatjs/icu-messageformat-parser'), ] } OR Add those libraries in exclude: exclude: /node_modules\\/(?!react-intl|intl-messageformat|@formatjs\\/icu-messageformat-parser)/, Core Concepts Formatters (Date, Number, Message, Relative)Provider and InjectorAPI and ComponentsMessage DescriptorMessage SyntaxDefining default messages for extractionCustom, named formats Example Apps There are several runnable example apps in this Git repo. These are a great way to see React Intl's core concepts in action in simplified applications. API Reference There are a few API layers that React Intl provides and is built on. When using React Intl you'll be interacting with Intl built-ins, React Intl's API, and its React components: ECMAScript Internationalization APIReact Intl APIReact Intl Components TypeScript Usage react-intl is written in TypeScript, thus having 1st-class TS support. In order to use react-intl in TypeScript, make sure your compilerOptions's lib config include ["esnext.intl", "es2017.intl", "es2018.intl"]. ","version":"Next","tagName":"h3"},{"title":"Typing message IDs and locale​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#typing-message-ids-and-locale","content":" By default, the type for the id prop of <FormattedMessage> and formatMessage is string. However, you can set a more restrictive type to get autocomplete and error checking. In order to do this, override the following global namespace with the union type of all of your message IDs. You can do this by including the following somewhere in your code: declare global { namespace FormatjsIntl { interface Message { ids: keyof typeof messages } } } Where messages is the object you would normally pass to <IntlProvider>, and would look something like: const messages = { greeting: 'Hello', planet: 'World', // ... } You can also override the following global to use a custom type for locale declare global { namespace FormatjsIntl { interface IntlConfig { locale: 'en' | 'fr' } } } Advanced Usage Our Advanced Usage has further guides for production setup in environments where performance is important. Supported Tooling ","version":"Next","tagName":"h2"},{"title":"Message extraction​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#message-extraction","content":" We've built @formatjs/cli that helps you extract messages from a list of files. It uses babel-plugin-formatjs under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below: import {defineMessages} from 'react-intl' defineMessages({ foo: { id: 'foo', defaultMessage: 'foo', description: 'bar', }, }) import {FormattedMessage} from 'react-intl' ;<FormattedMessage id="foo" defaultMessage="foo" description="bar" /> function Comp(props) { const {intl} = props return intl.formatMessage({ // The whole `intl.formatMessage` is required so we can extract id: 'foo', defaultMessage: 'foo', description: 'bar', }) } ","version":"Next","tagName":"h2"},{"title":"ESLint Plugin​","type":1,"pageTitle":"Overview","url":"/docs/react-intl#eslint-plugin","content":" We've also built eslint-plugin-formatjs that helps enforcing specific rules on your messages if your translation vendor has restrictions. ","version":"Next","tagName":"h2"},{"title":"Upgrade Guide (v1 -> v2)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-2x","content":"","keywords":"","version":"Next"},{"title":"Use React 0.14 or 15​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#use-react-014-or-15","content":" React Intl v2 has a peer dependency on react@^0.14.0 || ^15.0.0-0 and now takes advantage of features and changes in React 0.14 and also works with React 15. ","version":"Next","tagName":"h2"},{"title":"Update How Locale Data is Added​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-how-locale-data-is-added","content":" The locale data modules in React Intl v2 have been refactored to provide data, instead of mutating React Intl's internal locale data registry. The react-intl/locale-data/* files are also decoupled from the ReactIntl global and instead provide UMD modules with a new ReactIntlLocaleData global. These changes, mean apps need update how they are registering the locale data they need in the browser. ","version":"Next","tagName":"h2"},{"title":"Add Call to addLocaleData() in Browser​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#add-call-to-addlocaledata-in-browser","content":" There is now an addLocaleData() function that needs to be called with the locale data that has been loaded. You can do the following in your main client JavaScript entry point: This assumes a locale data <script> is added based on the request; e.g., for French speaking users: <script src="react-intl/locale-data/fr.js"></script> Using <script src="react-intl/dist/react-intl.js> if ('ReactIntl' in window && 'ReactIntlLocaleData' in window) { Object.keys(ReactIntlLocaleData).forEach(lang => { ReactIntl.addLocaleData(ReactIntlLocaleData[lang]) }) } Using Browserify/Webpack to Load React Intl import {addLocaleData} from 'react-intl' if ('ReactIntlLocaleData' in window) { Object.keys(ReactIntlLocaleData).forEach(lang => { addLocaleData(ReactIntlLocaleData[lang]) }) } info This decoupling of the library from the locale data, allows for the files to be loaded via <script async>. When using async scripts, your client bootstrapping code will need to wait for the load event, including the code above. ","version":"Next","tagName":"h3"},{"title":"Remove Intl Mixin​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#remove-intl-mixin","content":" The IntlMixin has been removed from React Intl v2. The mixin did two things: it automatically propagated locales, formats, and messages throughout an app's hierarchy, and it provided an imperative API via format*() functions. These jobs are now handled by <IntlProvider> and injectIntl(), respectively: ","version":"Next","tagName":"h2"},{"title":"Update to IntlProvider​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-to-intlprovider","content":" In React Intl v1, you would add the IntlMixin to your root component; e.g., <App>. Remove the IntlMixin and instead wrap your root component with <IntlProvider>: import ReactDOM from 'react-dom' import {IntlProvider} from 'react-intl' ReactDOM.render( <IntlProvider locale="en"> <App /> </IntlProvider>, document.getElementById('container') ) info The locale prop is singular, required, and only accepts a string value. This is a simplification of the plural locales prop used by the IntlMixin. ","version":"Next","tagName":"h3"},{"title":"Update to injectIntl()​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-to-injectintl","content":" The IntlMixin also provided the imperative API for custom components to use the format*() methods; e.g., formatDate() to get formatted strings for using in places like title and aria attribute. Remove the IntlMixin and instead use the injectIntl() Hight Order Component (HOC) factory function to inject the imperative API via props. Here's an example of a custom <RelativeTime> stateless component which uses injectIntl() and the imperative formatDate() API: import React from 'react' import {injectIntl, FormattedRelative} from 'react-intl' const to2Digits = num => `${num < 10 ? `0${num}` : num}` const RelativeTime = ({date, intl}) => { date = new Date(date) let year = date.getFullYear() let month = date.getMonth() + 1 let day = date.getDate() let formattedDate = intl.formatDate(date, { year: 'long', month: 'numeric', day: 'numeric', }) return ( <time dateTime={`${year}-${to2Digits(month)}-${to2Digits(day)}`} title={formattedDate} > <FormattedRelative value={date} /> </time> ) } export default injectIntl(RelativeTime) injectIntl() is similar to a connect() HOC factory function you might find in a Flux framework to connect a component to a store. ","version":"Next","tagName":"h3"},{"title":"Change How Messages are Formatted​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#change-how-messages-are-formatted","content":" The way string messages are formatted in React Intl v2 has changed significantly! This is the most disruptive set of change when upgrading from v1 to v2; but it enables many great new features. React Intl v2 introduces a new Message Descriptor concept which can be used to define an app's default string messages. A Message Descriptor is an object with the following properties, id is the only required prop: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) info This upgrade guide will focus on using Message Descriptors that only contain an id property. ","version":"Next","tagName":"h2"},{"title":"Flatten messages Object​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#flatten-messages-object","content":" React Intl v2 no longer supports nested messages objects, instead the collection of translated string messages passed to <IntlProvider> must be flat. This is an explicit design choice which simplifies while increasing flexibility. React Intl v2 does not apply any special semantics to strings with dots; e.g., "namespaced.string_id". Apps using a nested messages object structure could use the following function to flatten their object according to React Intl v1's semantics: function flattenMessages(nestedMessages, prefix = '') { return Object.keys(nestedMessages).reduce((messages, key) => { let value = nestedMessages[key] let prefixedKey = prefix ? `${prefix}.${key}` : key if (typeof value === 'string') { messages[prefixedKey] = value } else { Object.assign(messages, flattenMessages(value, prefixedKey)) } return messages }, {}) } let messages = flattenMessages(nestedMessages) info Message ids can still contain "."s, so the ids themselves remain the same, it's only the messages object structure that needs to change. ","version":"Next","tagName":"h3"},{"title":"Replace getIntlMessage() Calls with Message Descriptors​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#replace-getintlmessage-calls-with-message-descriptors","content":" The getIntlMessage() method that was provided by the IntlMixin has been removed in React Intl v2. It was simply a helper that interpreted a message id string with "."s by looking up the translated message in a nested messages object. With the removal of IntlMixin and the change to a flat messages object, this method has been removed. All calls to getIntlMessage() need to be replaced with a Message Descriptor. Replace: this.getIntlMessage('some.message.id') With: { id: 'some.message.id' } ","version":"Next","tagName":"h3"},{"title":"Update formatMessage() Calls​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-formatmessage-calls","content":" A typical pattern when calling formatMessage() is to nest a call to getIntlMessage(). These can be easily updated: 1.0: let message = this.formatMessage(this.getIntlMessage('some.message.id'), values) 2.0: let message = this.props.intl.formatMessage({id: 'some.message.id'}, values) info In React Intl v2, the formatMessage() function is injected via injectIntl(). ","version":"Next","tagName":"h3"},{"title":"Update FormattedMessage and FormattedHTMLMessage Instances​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-formattedmessage-and-formattedhtmlmessage-instances","content":" The props for these two components have completely changed in React Intl v2. Instead of taking a message prop and treating all other props as values to fill in placeholders in a message, <FormattedMessage> and <FormattedHTMLMessage> now the same props as a Message Descriptor plus a new values prop. The new values prop groups all of the message's placeholder values together into an object. The following example shows up to update a <FormattedMessage> instance to use the new props and remove the call to getIntlMessage(): 1.0: <FormattedMessage message={this.getIntlMessage('greeting')} name="Eric" /> 2.0: <FormattedMessage id="greeting" values={{name: 'Eric'}} /> ","version":"Next","tagName":"h3"},{"title":"Update How Relative Times are Formatted​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#update-how-relative-times-are-formatted","content":" Minor changes have been made to how the "now" reference time is specified when formatting relative times in React Intl v2. It's uncommon to specify this value outside of test code, so it might not exist in your app. ","version":"Next","tagName":"h2"},{"title":"Rename FormattedRelative's now Prop to initialNow​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#rename-formattedrelatives-now-prop-to-initialnow","content":" A new feature has been added to <FormattedRelative> instances in React Intl v2, they now "tick" and stay up to date. Since time moves forward, it was confusing to have a prop named now, so it has been renamed to initialNow. Any <FormattedRelative> instances that use now should update to prop name to initialNow: 1.0: <FormattedRelative value={date} now={otherDate} /> 2.0: <FormattedRelative value={date} initialNow={otherDate} /> info The <IntlProvider> component also has a initialNow prop which can be assigned a value to stabilize the "now" reference time for all <FormattedRelative> instances. This is useful for universal/isomorphic apps to proper React checksums between the server and client initial render. ","version":"Next","tagName":"h3"},{"title":"Merge formatRelative()'s Second and Third Arguments​","type":1,"pageTitle":"Upgrade Guide (v1 -> v2)","url":"/docs/react-intl/upgrade-guide-2x#merge-formatrelatives-second-and-third-arguments","content":" The signature of the formatRelative() function has been aligned with the other format*() functions and in React Intl v2, it only accepts two arguments: value and options. To specify a "now" reference time, add it to the options argument, and remove the third formatOptions argument: 1.0: let relative = this.formatRelative(date, {units: 'hour'}, {now: otherDate}) 2.0: let relative = this.props.intl.formatRelative(date, { units: 'hour', now: otherDate, }) info In React Intl v2, the formatRelative() function is injected via injectIntl(). ","version":"Next","tagName":"h3"},{"title":"Upgrade Guide (v3 -> v4)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-4x","content":"","keywords":"","version":"Next"},{"title":"Breaking API Changes​","type":1,"pageTitle":"Upgrade Guide (v3 -> v4)","url":"/docs/react-intl/upgrade-guide-4x#breaking-api-changes","content":" All tags specified must have corresponding values and will throw error if it's missing, e.g: new IntlMessageFormat('a<b>strong</b>').format({ b: (...chunks) => <strong>{chunks}</strong>, }) We don't allow formatting self-closing tags because we already use ICU {placeholder} syntax for that.XML/HTML tags are escaped using apostrophe just like other ICU constructs.Remove dependency on DOMParser and restrictions on void element like <link>. This effectively means you don't need to polyfill DOMParser in Node anymore.FormattedHTMLMessage & intl.formatHTMLMessage have been removed since FormattedMessage now fully supports embedded HTML tag. ","version":"Next","tagName":"h2"},{"title":"Why are we doing those changes?​","type":1,"pageTitle":"Upgrade Guide (v3 -> v4)","url":"/docs/react-intl/upgrade-guide-4x#why-are-we-doing-those-changes","content":" FormattedHTMLMessage & intl.formatHTMLMessage were originally created when React was fairly new. These components helped ease migration over from raw HTML to JSX. Given that current popularity of React right now and the fact that FormattedMessage allow rendering embedded HTML tag, this is no longer needed.Initially during the 1st iteration of embedded HTML support, we allow any tag that doesn’t have a corresponding formatter to be rendered as raw HTML. We’ve received feedbacks internally that allowing embedded HTML tag to be rendered as-is without sanitization is a XSS security risk. Therefore, in order to allow raw HTML tag you have to opt-in by escaping them using apostrophe. We will update our linter to check for this as well. ","version":"Next","tagName":"h2"},{"title":"Migrating off embedded HTML in messages​","type":1,"pageTitle":"Upgrade Guide (v3 -> v4)","url":"/docs/react-intl/upgrade-guide-4x#migrating-off-embedded-html-in-messages","content":" In order to restore the old behavior of FormattedHTMLMessage & intl.formatHTMLMessage, we suggest you use the rich text format feature as below: Old way: intl.formatHTMLMessage('This is a <a href="foo">link</a>') New way: intl.formatMessage('This is a <a>link</a>', { a: (...chunks) => sanitizeHTML(`<a href="foo">${chunks.join('')}</a>`), }) This forces developers to always sanitize their rendered HTML & chunks, thus minimizing XSS. ","version":"Next","tagName":"h2"},{"title":"Upgrade Guide (v4 -> v5)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-5x","content":"","keywords":"","version":"Next"},{"title":"Breaking API Changes​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#breaking-api-changes","content":" Rich text formatting callback function is no longer variadic. Before: new IntlMessageFormat('a<b>strong</b>').format({ b: (...chunks) => <strong>{chunks}</strong>, }) After: new IntlMessageFormat('a<b>strong</b>').format({ b: chunks => <strong>{chunks}</strong>, }) FormattedMessage render prop is no longer variadic. Before: <FormattedMessage defaultMessage="a<b>strong</b>"> {(...chunks) => <b>{chunks}</b>} </FormattedMessage> After: <FormattedMessage defaultMessage="a<b>strong</b>"> {chunks => <b>{chunks}</b>} </FormattedMessage> Using FormattedMessage without a intl context will fail fast. ","version":"Next","tagName":"h2"},{"title":"Why are we doing those changes?​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#why-are-we-doing-those-changes","content":" ","version":"Next","tagName":"h2"},{"title":"Rich text formatting callback function is no longer variadic​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#rich-text-formatting-callback-function-is-no-longer-variadic","content":" We received feedback from the community that variadic callback function isn't really ergonomic.There's also an issue where React chunks do not come with keys, thus causing warning in React during development.The chunks by themselves are not enough to render duplicate tags, such as <a>link</a> and another <a>link</a> where you want to render 2 different hrefs for the <a> tag. In this case a: chunks => <a>{chunks}</a> isn't enough especially when the contents are the same. In the future we can set another argument that might contain metadata to distinguish between the 2 elements. ","version":"Next","tagName":"h3"},{"title":"FormattedMessage render prop is no longer variadic​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#formattedmessage-render-prop-is-no-longer-variadic","content":" Same reasons as above. ","version":"Next","tagName":"h3"},{"title":"Using FormattedMessage without a intl context will fail fast​","type":1,"pageTitle":"Upgrade Guide (v4 -> v5)","url":"/docs/react-intl/upgrade-guide-5x#using-formattedmessage-without-a-intl-context-will-fail-fast","content":" This also comes from Dropbox internal developer feedback. FormattedMessage has a default English renderer that masks Provider setup issues which causes them to not be handled during testing phase. ","version":"Next","tagName":"h3"},{"title":"Components","type":0,"sectionRef":"#","url":"/docs/react-intl/components","content":"","keywords":"","version":"Next"},{"title":"Why Components?​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#why-components","content":" Beyond providing an idiomatic-React way of integrating internationalization into a React app, and the <Formatted*> components have benefits over always using the imperative API directly: Render React elements that seamlessly compose with other React components.Support rich-text string/message formatting in <FormattedMessage>.Implement advanced features like <FormattedRelativeTime>'s updating over time.Provide TypeScript type definitions. ","version":"Next","tagName":"h2"},{"title":"IntlProvider​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#intlprovider","content":" React Intl uses the provider pattern to scope an i18n context to a tree of components. This allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the <Formatted*> components. This is the same concept as what Flux frameworks like Redux use to provide access to a store within a component tree. caution All apps using React Intl must use the <IntlProvider> or <RawIntlProvider> component. This component is used to setup the i18n context for a tree. Usually, this component will wrap an app's root component so that the entire app will be within the configured i18n context. The following are the i18n configuration props that can be set: interface IntlConfig { locale: string formats: CustomFormats messages: Record<string, string> | Record<string, MessageFormatElement[]> defaultLocale: string defaultFormats: CustomFormats timeZone?: string textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements wrapRichTextChunksInFragment?: boolean defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>> onError(err: string): void } ","version":"Next","tagName":"h2"},{"title":"locale, formats, and messages​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#locale-formats-and-messages","content":" The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage. ","version":"Next","tagName":"h3"},{"title":"defaultLocale and defaultFormats​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#defaultlocale-and-defaultformats","content":" Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish. ","version":"Next","tagName":"h3"},{"title":"textComponent​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#textcomponent","content":" Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info. ","version":"Next","tagName":"h3"},{"title":"onError​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#onerror","content":" Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"onWarn​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#onwarn","content":" Allows the user to provide a custom warning handler. By default, warning messages are logged using console.warning if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"wrapRichTextChunksInFragment​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#wraprichtextchunksinfragment","content":" When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that. ","version":"Next","tagName":"h3"},{"title":"defaultRichTextElements​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#defaultrichtextelements","content":" A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context. These configuration props are combined with the <IntlProvider>'s component-specific props: Props: props: IntlConfig & { children: ReactNode, } Finally, child elements must be supplied to <IntlProvider>. Example: const App = ({importantDate}) => ( <div> <FormattedDate value={importantDate} year="numeric" month="long" day="numeric" weekday="long" /> </div> ) ReactDOM.render( <IntlProvider locale={navigator.language}> <App importantDate={new Date(1459913574887)} /> </IntlProvider>, document.getElementById('container') ) Assuming navigator.language is "fr": <div>mardi 5 avril 2016</div> ","version":"Next","tagName":"h3"},{"title":"RawIntlProvider​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#rawintlprovider","content":" This is the underlying React.Context.Provider object that IntlProvider use. It can be used in conjunction with createIntl: import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl({ locale: 'fr-FR', messages: {} }, cache) // Pass it to IntlProvider <RawIntlProvider value={intl}>{foo}</RawIntlProvider> ","version":"Next","tagName":"h2"},{"title":"FormattedDate​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddate","content":" This component uses the formatDate and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above. Props: props: Intl.DateTimeFormatOptions & { value: any, format: string, children: (formattedDate: string) => ReactElement, } By default <FormattedDate> will render the formatted date into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedDate value={new Date(1459832991883)} /> Result Example with Options: Live Editor <FormattedDate value={new Date(1459832991883)} year="numeric" month="long" day="2-digit" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedDateParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddateparts","content":" browser support This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11. This component provides more customization to FormattedDate by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here Props: props: Intl.DateTimeFormatOptions & { value: any, format: string, children: (parts: Intl.DateTimeFormatPart[]) => ReactElement, } Live Editor <FormattedDateParts value={new Date(1459832991883)} year="numeric" month="long" day="2-digit" > {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedDateParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedTime​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedtime","content":" This component uses the formatTime and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above, with the following defaults: { hour: 'numeric', minute: 'numeric', } Props: props: DateTimeFormatOptions & { value: any, format: string, children: (formattedDate: string) => ReactElement, } By default <FormattedTime> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedTime value={new Date(1459832991883)} /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedTimeParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedtimeparts","content":" browser support This requires Intl.DateTimeFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11. This component provides more customization to FormattedTime by allowing children function to have access to underlying parts of the formatted date. The available parts are listed here Props: props: Intl.DateTimeFormatOptions & { value: any, format: string, children: (parts: Intl.DateTimeFormatPart[]) => ReactElement, } Live Editor <FormattedTimeParts value={new Date(1459832991883)}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedTimeParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedDateTimeRange​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddatetimerange","content":" browser support This requires stage-3 API Intl.RelativeTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them. This component uses the formatDateTimeRange and Intl.DateTimeFormat APIs and has props that correspond to the DateTimeFormatOptions specified above Props: props: DateTimeFormatOptions & { from: number | Date, to: number | Date, children: (formattedDate: string) => ReactElement, } By default <FormattedDateTimeRange> will render the formatted time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedDateTimeRange from={new Date('2020-1-1')} to={new Date('2020-1-15')} /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedRelativeTime​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedrelativetime","content":" browser support This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them. This component uses the formatRelativeTime API and has props that correspond to the following relative formatting options: type RelativeTimeFormatOptions = { numeric?: 'always' | 'auto' style?: 'long' | 'short' | 'narrow' } Prop Types: props: RelativeTimeFormatOptions & { value: number, unit: Unit, format: string, updateIntervalInSeconds: number, children: (formattedDate: string) => ReactElement, } By default <FormattedRelativeTime> will render the formatted relative time into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedRelativeTime value={0} numeric="auto" updateIntervalInSeconds={1} /> Result maximum interval You can adjust the maximum interval that the component will re-render by setting the updateIntervalInSeconds. A falsy value will turn off auto-updating. The updating is smart and will schedule the next update for the next interesting moment. An interesting moment is defined as the next non-fractional value for that unit. For example: Live Editor <FormattedRelativeTime value={-50} updateIntervalInSeconds={1} /> Result This will initially renders 59 seconds ago, after 1 second, will render 1 minute ago, and will not re-render until a full minute goes by, it'll render 2 minutes ago. It will not try to render 1.2 minutes ago. limitation updateIntervalInSeconds cannot be enabled for unit longer than hour (so not for day, week, quarter, year). This is primarily because it doesn't make sense to schedule a timeout in days, and the number of ms in a day is larger than the max timeout that setTimeout accepts. ","version":"Next","tagName":"h2"},{"title":"FormattedNumber​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattednumber","content":" This component uses the formatNumber and Intl.NumberFormat APIs and has props that correspond to Intl.NumberFormatOptions. Props: props: NumberFormatOptions & { value: number, format: string, children: (formattedNumber: string) => ReactElement, } By default <FormattedNumber> will render the formatted number into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedNumber value={1000} /> Result Example Formatting Currency Values Live Editor <FormattedNumber value={1000} style="currency" currency="USD" /> Result Formatting Number using unit Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and react-intl types allow users to pass in a sanctioned unit. For example: Live Editor <FormattedNumber value={1000} style="unit" unit="kilobyte" unitDisplay="narrow" /> Result Live Editor <FormattedNumber value={1000} unit="fahrenheit" unitDisplay="long" style="unit" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedNumberParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattednumberparts","content":" browser support This requires Intl.NumberFormat.prototype.formatToParts which is not available in IE11. Please use our polyfill if you plan to support IE11. This component provides more customization to FormattedNumber by allowing children function to have access to underlying parts of the formatted number. The available parts are listed here. Props: props: NumberFormatOptions & { value: number, format: string, children: (parts: Intl.NumberFormatPart[]) => ReactElement, } Example: Live Editor <FormattedNumberParts value={1000}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> </> )} </FormattedNumberParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedPlural​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedplural","content":" This component uses the formatPlural API and Intl.PluralRules has props that correspond to Intl.PluralRulesOptions. Props: props: PluralFormatOptions & { value: any, other: ReactElement, zero: ReactElement, one: ReactElement, two: ReactElement, few: ReactElement, many: ReactElement, children: (formattedPlural: ReactElement) => ReactElement, } By default <FormattedPlural> will select a plural category (zero, one, two, few, many, or other) and render the corresponding React element into a React.Fragment. If you need to customize rendering, you can either wrap it with another React element (recommended), or pass a function as the child. Example: Live Editor <FormattedPlural value={10} one="message" other="messages" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedList​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedlist","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. This component uses formatList API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions. Props: props: ListFormatOptions & { children: (chunksOrString: string | React.ReactElement[]) => ReactElement, } Example: When the locale is en: Live Editor <FormattedList type="conjunction" value={['Me', 'myself', 'I']} /> Result Live Editor <FormattedList type="conjunction" value={['Me', <b>myself</b>, 'I']} /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedListParts​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedlistparts","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. This component uses formatListToParts API and Intl.ListFormat. Its props corresponds to Intl.ListFormatOptions. Props: props: ListFormatOptions & { children: (chunks: Array<React.ReactElement | string>) => ReactElement, } Example: When the locale is en: Live Editor <FormattedListParts type="conjunction" value={['Me', 'myself', 'I']}> {parts => ( <> <b>{parts[0].value}</b> {parts[1].value} <small>{parts[2].value}</small> {parts[3].value} <small>{parts[4].value}</small> </> )} </FormattedListParts> Result ","version":"Next","tagName":"h2"},{"title":"FormattedDisplayName​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formatteddisplayname","content":" browser support This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them. This component uses formatDisplayName and Intl.DisplayNameshas props that correspond to DisplayNameOptions. You might need a polyfill. Props: props: FormatDisplayNameOptions & { value: string | number | Record<string, unknown>, } Example: When the locale is en: Live Editor <FormattedDisplayName type="language" value="zh-Hans-SG" /> Result Live Editor <FormattedDisplayName type="currency" value="JPY" /> Result ","version":"Next","tagName":"h2"},{"title":"FormattedMessage​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#formattedmessage","content":" This component uses the formatMessage API and has props that correspond to a Message Descriptor. Props: props: MessageDescriptor & { values: object, tagName: string, children: (chunks: ReactElement) => ReactElement, } ","version":"Next","tagName":"h2"},{"title":"Message Syntax​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#message-syntax","content":" String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime. Simple Message: Hello, {name} Complex Message: Hello, {name}, you have {itemCount, plural, =0 {no items} one {# item} other {# items} }. See: The Message Syntax Guide. ","version":"Next","tagName":"h3"},{"title":"Message Descriptor​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#message-descriptor","content":" React Intl has a Message Descriptor concept which is used to define your app's default messages/strings. <FormattedMessage> have props which correspond to a Message Descriptor. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) type MessageDescriptor = { id?: string defaultMessage?: string description?: string } compile message descriptors The babel-plugin-formatjs and @formatjs/ts-transformer packages can be used to compile Message Descriptors defined in JavaScript source files into AST for performance. ","version":"Next","tagName":"h3"},{"title":"Message Formatting Fallbacks​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#message-formatting-fallbacks","content":" The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm: Lookup and format the translated message at id, passed to <IntlProvider>.Fallback to formatting the defaultMessage.Fallback to translated message at id's source.Fallback to defaultMessage source.Fallback to the literal message id. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#usage","content":" By default <FormattedMessage> will render the formatted string into a <React.Fragment>. If you need to customize rendering, you can either wrap it with another React element (recommended), specify a different tagName (e.g., 'div'), or pass a function as the child. Example: Live Editor <FormattedMessage id="app.greeting" description="Greeting to welcome the user to the app" defaultMessage="Hello, {name}!" values={{ name: 'Eric', }} /> Result Example: function as the child Live Editor <FormattedMessage id="title">{txt => <h1>{txt}</h1>}</FormattedMessage> Result simple message Messages can be simple strings without placeholders, and that's the most common type of message. This case is highly-optimized, but still has the benefits of the fallback procedure. ","version":"Next","tagName":"h3"},{"title":"Rich Text Formatting​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#rich-text-formatting","content":" <FormattedMessage> also supports rich-text formatting by specifying a XML tag in the message & resolving that tag in the values prop. Here's an example: Live Editor <FormattedMessage id="app.greeting" description="Greeting to welcome the user to the app" defaultMessage="Hello, <b>Eric</b> {icon}" values={{ b: chunks => <b>{chunks}</b>, icon: <svg />, }} /> Result By allowing embedding XML tag we want to make sure contextual information is not lost when you need to style part of the string. In a more complicated example like: Live Editor <FormattedMessage id="foo" defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>" values={{ a: chunks => ( <a class="external_link" target="_blank" href="https://www.example.com/shoe" > {chunks} </a> ), cta: chunks => <strong class="important">{chunks}</strong>, }} /> Result ","version":"Next","tagName":"h3"},{"title":"Function as the child​","type":1,"pageTitle":"Components","url":"/docs/react-intl/components#function-as-the-child","content":" Since rich text formatting allows embedding ReactElement, in function as the child scenario, the function will receive the formatted message chunks as a single parameter. Live Editor <FormattedMessage id="foo" defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>buy a shoe</cta>" values={{ a: chunks => ( <a class="external_link" target="_blank" href="https://www.example.com/shoe" > {chunks} </a> ), cta: chunks => <strong class="important">{chunks}</strong>, }} > {chunks => <h2>{chunks}</h2>} </FormattedMessage> Result All the rich text gets translated together which yields higher quality output. This brings feature-parity with other translation libs as well, such as fluent by Mozilla (using overlays concept). Extending this also allows users to potentially utilizing other rich text format, like Markdown. ","version":"Next","tagName":"h3"},{"title":"babel-plugin-formatjs","type":0,"sectionRef":"#","url":"/docs/tooling/babel-plugin","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#installation","content":" npmyarn npm i babel-plugin-formatjs ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#usage","content":" This Babel plugin only visits ES6 modules which import React Intl. The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package. ","version":"Next","tagName":"h2"},{"title":"Via babel.config.json (Recommended)​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#via-babelconfigjson-recommended","content":" babel.config.json { "plugins": [ [ "formatjs", { "idInterpolationPattern": "[sha512:contenthash:base64:6]", "ast": true } ] ] } ","version":"Next","tagName":"h3"},{"title":"Via Node API​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#via-node-api","content":" The extract message descriptors are available via the metadata property on the object returned from Babel's transform() API: require('@babel/core').transform('code', { plugins: ['formatjs'], }) // => { code, map, ast, metadata['formatjs'].messages, metadata['formatjs'].meta }; ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#options","content":" ","version":"Next","tagName":"h2"},{"title":"overrideIdFn​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#overrideidfn","content":" A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages. ","version":"Next","tagName":"h3"},{"title":"idInterpolationPattern​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#idinterpolationpattern","content":" If certain message descriptors don't have id, this pattern will be used to automaticallygenerate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings. ","version":"Next","tagName":"h3"},{"title":"removeDefaultMessage​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#removedefaultmessage","content":" Remove defaultMessage field in generated js after extraction. ","version":"Next","tagName":"h3"},{"title":"additionalComponentNames​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#additionalcomponentnames","content":" Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe. ","version":"Next","tagName":"h3"},{"title":"additionalFunctionNames​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#additionalfunctionnames","content":" Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t. ","version":"Next","tagName":"h3"},{"title":"pragma​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#pragma","content":" parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" id="bar" /> and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file. ","version":"Next","tagName":"h3"},{"title":"ast​","type":1,"pageTitle":"babel-plugin-formatjs","url":"/docs/tooling/babel-plugin#ast","content":" Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true. ","version":"Next","tagName":"h3"},{"title":"Upgrade Guide (v2 -> v3)","type":0,"sectionRef":"#","url":"/docs/react-intl/upgrade-guide-3x","content":"","keywords":"","version":"Next"},{"title":"Breaking API Changes​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#breaking-api-changes","content":" addLocaleData has been removed. See Migrate to using native Intl APIs for more details.ReactIntlLocaleData has been removed. See Migrate to using native Intl APIs for more details.intlShape has been removed. See TypeScript Support for more details.Change default textComponent in IntlProvider to React.Fragment. In order to keep the old behavior, you can explicitly set textComponent to span. <IntlProvider textComponent="span" /> FormattedRelative has been renamed to FormattedRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.formatRelative has been renamed to formatRelativeTime and its API has changed significantly. See FormattedRelativeTime for more details.Message Format syntax changes. See Message Format Syntax Changes for more details.IntlProvider no longer inherits from upstream IntlProvider. ","version":"Next","tagName":"h2"},{"title":"Use React 16.3 and upwards​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#use-react-163-and-upwards","content":" React Intl v3 supports the new context API, fixing all kinds of tree update problems 🎉In addition it makes use of the new lifecycle hooks (and gets rid of the deprecated ones). It also supports the new React.forwardRef() enabling users to directly access refs using the standard ref prop (see beneath for further information). ","version":"Next","tagName":"h2"},{"title":"Migrate withRef to forwardRef​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#migrate-withref-to-forwardref","content":" With the update to React >= 16.3 we got the option to use the new React.forwardRef() feature and because of this deprecated the use of the withRef option for the injectIntl HOC in favour of forwardRef. When forwardRef is set to true, you can now simply pretend the HOC wasn't there at all. Intl v2: import React from 'react' import {injectIntl} from 'react-intl' class MyComponent extends React.Component { doSomething = () => console.log(this.state || null) render() { return <div>Hello World</div> } } export default injectIntl(MyComponent, {withRef: true}) // somewhere else class Parent extends React.Component { componentDidMount() { this.myComponentRef.getWrappedInstance().doSomething() } render() { return ( <MyComponent ref={ref => { this.myComponentRef = ref }} /> ) } } Intl v3: import React from 'react' import {injectIntl} from 'react-intl' class MyComponent extends React.Component { doSomething = () => console.log(this.state || null) render() { return <div>Hello World</div> } } export default injectIntl(MyComponent, {forwardRef: true}) // somewhere else class Parent extends React.Component { myComponentRef = React.createRef() componentDidMount() { this.myComponentRef.doSomething() // no need to call getWrappedInstance() } render() { return <MyComponent ref={this.myComponentRef} /> } } ","version":"Next","tagName":"h2"},{"title":"New useIntl hook as an alternative of injectIntl HOC​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#new-useintl-hook-as-an-alternative-of-injectintl-hoc","content":" This v3 release also supports the latest React hook API for user with React >= 16.8. You can now take useIntl hook as an alternative to injectIntl HOC on function components. Both methods allow you to access the intl instance, here is a quick comparison: // injectIntl import {injectIntl} from 'react-intl' const MyComponentWithHOC = injectIntl(({intl, ...props}) => { // do something }) // useIntl import {useIntl} from 'react-intl' const MyComponentWithHook = props => { const intl = useIntl() // do something } To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks. ","version":"Next","tagName":"h2"},{"title":"Migrate to using native Intl APIs​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#migrate-to-using-native-intl-apis","content":" React Intl v3 no longer comes with CLDR data and rely on native Intl API instead. Specifically the new APIs we're relying on are: Intl.PluralRules: This can be polyfilled using this package.Intl.RelativeTimeFormat: This can be polyfilled using this package. This shift is meant to future-proof React Intl as these APIs are all stable and being implemented in modern browsers. This also means we no longer package and consume CLDRs in this package. If you previously were using addLocaleData to support older browsers, we recommend you do the following: If you're supporting browsers that do not have Intl.PluralRules (e.g IE11 & Safari 12-), include this polyfill in your build.If you're supporting browsers that do not have Intl.RelativeTimeFormat (e.g IE11, Edge, Safari 13-), include this polyfill in your build along with individual CLDR data for each locale you support. require('@formatjs/intl-pluralrules/polyfill') require('@formatjs/intl-pluralrules/locale-data/de') // Add locale data for de require('@formatjs/intl-relativetimeformat/polyfill') require('@formatjs/intl-relativetimeformat/locale-data/de') // Add locale data for de When using React Intl in Node.js, your node binary has to either: Get compiled with full-icu using these instructions OR Uses full-icu npm package ","version":"Next","tagName":"h2"},{"title":"TypeScript Support​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#typescript-support","content":" react-intl has been rewritten in TypeScript and thus has native TypeScript support. Therefore, we've also removed prop-types dependency and expose IntlShape as an interface instead. All types should be available from top level index file without importing from specific subfiles. For example: import {IntlShape} from 'react-intl' // Correct import {IntlShape} from 'react-intl/lib/types' // Incorrect If we're missing any interface top level support, please let us know and/or submitting a PR is greatly appreciated :) info You might need to make a few changes to your code if you were relying on the now deprecated @types/react-intl package. The most common example is InjectedIntlProps which must be replaced with WrappedComponentProps. ","version":"Next","tagName":"h2"},{"title":"FormattedRelativeTime​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#formattedrelativetime","content":" When we introduced FormattedRelative, the spec for Intl.RelativeTimeFormat was still unstable. It has now reached stage 3 and multiple browsers have implemented it. However, its API is different from FormattedRelative so we've adjusted its API to match the spec which means it's not backwards compatible. All units (such as day-short) becomes a combination of unit & style: <FormattedRelative units="second-short"/> // will be <FormattedRelativeTime unit="second" style="short"/> style becomes numeric (which is the default): <FormattedRelative style="numeric"/> // will be <FormattedRelativeTime /> <FormattedRelative style="best fit"/> // will be <FormattedRelativeTime numeric="auto"/> Type of value is no longer Date, but rather delta in the specified unit: <FormattedRelative value={Date.now() - 1000} units="second-narrow"/> // will be <FormattedRelativeTime value={-1} unit="second" style="narrow" /> <FormattedRelative value={Date.now() + 2000} units="second-narrow"/> // will be <FormattedRelativeTime value={2} unit="second" style="narrow" /> updateInterval becomes updateIntervalInSeconds and will only take the time delta in seconds. Update behavior remains the same, e.g: <FormattedRelativeTime value={2} numeric="auto" unit="second" style="narrow" updateIntervalInSeconds={1} /> // Initially prints: `in 2s` // 1 second later: `in 1s` // 1 second later: `now` // 1 second later: `1s ago` // 60 seconds later: `1m ago` initialNow has been removed. Similarly, the functional counterpart of this component which is formatRelative has been renamed to formatRelativeTime and its parameters have been changed to reflect this component's props accordingly. Implementing FormattedRelative behavior You can use @formatjs/intl-utils to get close to the previous behavior like this: import {selectUnit} from '@formatjs/intl-utils' const {value, unit} = selectUnit(Date.now() - 48 * 3600 * 1000) // render ;<FormattedRelativeTime value={value} unit={unit} /> ","version":"Next","tagName":"h2"},{"title":"Enhanced FormattedMessage & formatMessage rich text formatting​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#enhanced-formattedmessage--formatmessage-rich-text-formatting","content":" In v2, in order to do rich text formatting (embedding a ReactElement), you had to do this: <FormattedMessage defaultMessage="To buy a shoe, { link } and { cta }" values={{ link: ( <a class="external_link" target="_blank" href="https://www.shoe.com/"> visit our website </a> ), cta: <strong class="important">eat a shoe</strong>, }} /> Now you can do: <FormattedMessage defaultMessage="To buy a shoe, <a>visit our website</a> and <cta>eat a shoe</cta>" values={{ a: msg => ( <a class="external_link" target="_blank" href="https://www.shoe.com/"> {msg} </a> ), cta: msg => <strong class="important">{msg}</strong>, }} /> The change solves several issues: Contextual information was lost when you need to style part of the string: In this example above, link effectively is a blackbox placeholder to a translator. It can be a person, an animal, or a timestamp. Conveying contextual information via description & placeholder variable is often not enough since the variable can get sufficiently complicated.This brings feature-parity with other translation libs, such as fluent by Mozilla (using Overlays). If previously in cases where you pass in a ReactElement to a placeholder we highly recommend that you rethink the structure so that as much text is declared as possible: Before <FormattedMessage defaultMessage="Hello, {name} is {awesome} and {fun}" values={{ name: <b>John</b>, awesome: <span style="font-weight: bold;">awesome</span> fun: <span>fun and <FormattedTime value={Date.now()}/></span> }} /> After <FormattedMessage defaultMessage="Hello, <b>John</b> is <custom>awesome</custom> and <more>fun and {ts, time}</more>" values={{ b: name => <b>{name}</b>, custom: str => <span style="font-weight: bold;">{str}</span>, more: chunks => <span>{chunks}</span>, }} /> ","version":"Next","tagName":"h2"},{"title":"ESM Build​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#esm-build","content":" react-intl and its underlying libraries (intl-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat, intl-format-cache, intl-utils) export ESM artifacts. This means you should configure your build toolchain to transpile those libraries. ","version":"Next","tagName":"h2"},{"title":"Jest​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#jest","content":" Add transformIgnorePatterns to always include those libraries, e.g: { transformIgnorePatterns: [ '/node_modules/(?!intl-messageformat|intl-messageformat-parser).+\\\\.js$', ], } ","version":"Next","tagName":"h3"},{"title":"webpack​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#webpack","content":" If you're using babel-loader, add those libraries in include, e.g: include: [ path.join(__dirname, "node_modules/react-intl"), path.join(__dirname, "node_modules/intl-messageformat"), path.join(__dirname, "node_modules/intl-messageformat-parser"), ], ","version":"Next","tagName":"h3"},{"title":"Creating intl without using Provider​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#creating-intl-without-using-provider","content":" We've added a new API called createIntl that allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example: import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl({ locale: 'fr-FR', messages: {} }, cache) // Call imperatively intl.formatNumber(20) // Pass it to IntlProvider <RawIntlProvider value={intl}>{foo}</RawIntlProvider> This is especially beneficial in SSR where you can reuse the same intl object across requests. ","version":"Next","tagName":"h2"},{"title":"Message Format Syntax Changes​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#message-format-syntax-changes","content":" We've rewritten our parser to be more faithful to ICU Message Format, in order to potentially support skeleton. So far the backwards-incompatible changes are: ","version":"Next","tagName":"h2"},{"title":"Escape character has been changed to apostrophe (').​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#escape-character-has-been-changed-to-apostrophe-","content":" Previously while we were using ICU message format syntax, our escape char was backslash (\\). This however creates issues with strict ICU translation vendors that support other implementations like ICU4J/ICU4C. Thanks to @pyrocat101 we've changed this behavior to be spec-compliant. This means: // Before <FormattedMessage defaultMessage="\\\\{foo\\\\}" /> //prints out "{foo}" // After <FormattedMessage defaultMessage="'{foo}'" /> //prints out "{foo}" We highly recommend reading the spec to learn more about how quote/escaping works here under Quoting/Escaping section. ","version":"Next","tagName":"h3"},{"title":"Placeholder argument syntax change​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#placeholder-argument-syntax-change","content":" Placeholder argument can no longer have - (e.g: this is a {placeholder-var} is invalid but this is a {placeholder_var} is). ","version":"Next","tagName":"h3"},{"title":"Testing​","type":1,"pageTitle":"Upgrade Guide (v2 -> v3)","url":"/docs/react-intl/upgrade-guide-3x#testing","content":" We've removed IntlProvider.getChildContext for testing and now you can use createIntl to create a standalone intl object outside of React and use that for testing purposes. See Testing with React Intl for more details. ","version":"Next","tagName":"h2"},{"title":"Imperative API","type":0,"sectionRef":"#","url":"/docs/react-intl/api","content":"","keywords":"","version":"Next"},{"title":"Why Imperative API?​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#why-imperative-api","content":" While our components provide a seamless integration with React, the imperative API are recommended (sometimes required) in several use cases: Setting text attributes such as title, aria-label and the like where a React component cannot be used (e.g <img title/>)Formatting text/datetime... in non-React environment such as Node, Server API, Redux store, testing...High performance scenarios where the number of React components rendered becomes the bottleneck (e.g Finance stock portfolio rendering, virtual tables with a lot of cells...) ","version":"Next","tagName":"h2"},{"title":"The intl object​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#the-intl-object","content":" The core of react-intl is the intl object (of type IntlShape), which is the instance to store a cache of all Intl.* APIs, configurations, compiled messages and such. The lifecycle of the intl object is typically tied to the locale & the list of messages that it contains, which means when you switch locale, this object should be recreated. tip The intl object should be reused as much as possible for performance. There are a few ways to get access to the intl object: useIntl hook: Once you've declared your IntlProvider, you can get access to the intl object via calling this hook in your functional React componentinjectIntl HOC: In class-based React components, you can wrap them with the injectIntl HOC and intl should be available as a prop.createIntl: In a non-React environment (Node, vue, angular, testing... you name it), you can directly create a intl object by calling this function with the same configuration as the IntlProvider. ","version":"Next","tagName":"h2"},{"title":"useIntl hook​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#useintl-hook","content":" If a component can be expressed in a form of function component, using useIntl hook can be handy. This useIntl hook does not expect any option as its argument when being called. Typically, here is how you would like to use: import React from 'react' import {useIntl, FormattedDate} from 'react-intl' const FunctionComponent: React.FC<{date: number | Date}> = ({date}) => { const intl = useIntl() return ( <span title={intl.formatDate(date)}> <FormattedDate value={date} /> </span> ) } export default FunctionComponent To keep the API surface clean and simple, we only provide useIntl hook in the package. If preferable, user can wrap this built-in hook to make customized hook like useFormatMessage easily. Please visit React's official website for more general introduction on React hooks. ","version":"Next","tagName":"h2"},{"title":"injectIntl HOC​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#injectintl-hoc","content":" type WrappedComponentProps<IntlPropName extends string = 'intl'> = { [k in IntlPropName]: IntlShape } type WithIntlProps<P> = Omit<P, keyof WrappedComponentProps> & { forwardedRef?: React.Ref<any> } function injectIntl< IntlPropName extends string = 'intl', P extends WrappedComponentProps<IntlPropName> = WrappedComponentProps<any>, >( WrappedComponent: React.ComponentType<P>, options?: Opts<IntlPropName> ): React.ComponentType<WithIntlProps<P>> & { WrappedComponent: typeof WrappedComponent } This function is exported by the react-intl package and is a High-Order Component (HOC) factory. It will wrap the passed-in React component with another React component which provides the imperative formatting API into the wrapped component via its props. (This is similar to the connect-to-stores pattern found in many Flux implementations.) By default, the formatting API will be provided to the wrapped component via props.intl, but this can be overridden when specifying options.intlPropName. The value of the prop will be of type IntlShape, defined in the next section. import React from 'react' import {injectIntl, FormattedDate} from 'react-intl' interface Props { date: Date | number } const FunctionalComponent: React.FC<Props> = props => { const { date, intl, // Injected by `injectIntl` } = props return ( <span title={intl.formatDate(date)}> <FormattedDate value={date} /> </span> ) } export default injectIntl(FunctionalComponent) ","version":"Next","tagName":"h2"},{"title":"createIntl​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#createintl","content":" This allows you to create an IntlShape object without using Provider. This allows you to format things outside of React lifecycle while reusing the same intl object. For example: import {createIntl, createIntlCache, RawIntlProvider} from 'react-intl' // This is optional but highly recommended // since it prevents memory leak const cache = createIntlCache() const intl = createIntl({ locale: 'fr-FR', messages: {} }, cache) // Call imperatively intl.formatNumber(20) // Pass it to IntlProvider <RawIntlProvider value={intl}>{foo}</RawIntlProvider> ","version":"Next","tagName":"h2"},{"title":"createIntlCache​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#createintlcache","content":" Creates a cache instance to be used globally across locales. This memoizes previously created Intl.* constructors for performance and is only an in-memory cache. ","version":"Next","tagName":"h2"},{"title":"IntlShape​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#intlshape","content":" interface IntlConfig { locale: string timeZone?: string formats: CustomFormats textComponent?: React.ComponentType | keyof React.JSX.IntrinsicElements messages: Record<string, string> | Record<string, MessageFormatElement[]> defaultLocale: string defaultFormats: CustomFormats onError(err: string): void onWarn(warning: string): void } interface IntlFormatters { formatDate(value: number | Date | string, opts?: FormatDateOptions): string formatTime(value: number | Date | string, opts?: FormatDateOptions): string formatDateToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatTimeToParts( value: number | Date | string, opts?: FormatDateOptions ): Intl.DateTimeFormatPart[] formatRelativeTime( value: number, unit?: FormattableUnit, opts?: FormatRelativeTimeOptions ): string formatNumber(value: number, opts?: FormatNumberOptions): string formatNumberToParts( value: number, opts?: FormatNumberOptions ): Intl.NumberFormatPart[] formatPlural( value: number | string, opts?: FormatPluralOptions ): ReturnType<Intl.PluralRules['select']> formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | FormatXMLElementFn<string, string>> ): string formatMessage( descriptor: MessageDescriptor, values?: Record<string, PrimitiveType | T | FormatXMLElementFn<T, R>> ): R formatList(values: Array<string>, opts?: FormatListOptions): string formatList( values: Array<string | T>, opts?: FormatListOptions ): T | string | Array<string | T> formatListToParts(values: Array<string | T>, opts?: FormatListOptions): Part[] formatDisplayName( value: string, opts?: FormatDisplayNameOptions ): string | undefined } type IntlShape = IntlConfig & IntlFormatters This interface is exported by the react-intl package that can be used in conjunction with the injectIntl HOC factory function. The definition above shows what the props.intl object will look like that's injected to your component via injectIntl. It's made up of two parts: IntlConfig: The intl metadata passed as props into the parent <IntlProvider>.IntlFormatters: The imperative formatting API described below. ","version":"Next","tagName":"h2"},{"title":"locale, formats, and messages​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#locale-formats-and-messages","content":" The user's current locale and what the app should be rendered in. While defaultLocale and defaultFormats are for fallbacks or during development and represent the app's default. Notice how there is no defaultMessages, that's because each Message Descriptor provides a defaultMessage. ","version":"Next","tagName":"h3"},{"title":"defaultLocale and defaultFormats​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#defaultlocale-and-defaultformats","content":" Default locale & formats for when a message is not translated (missing from messages). defaultLocale should be the locale that defaultMessages are declared in so that a sentence is coherent in a single locale. Without defaultLocale and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish. ","version":"Next","tagName":"h3"},{"title":"textComponent​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#textcomponent","content":" Provides a way to configure the default wrapper for React Intl's <Formatted*> components. If not specified, <React.Fragment> is used. Before V3, span was used instead; check the migration guide for more info. ","version":"Next","tagName":"h3"},{"title":"onError​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#onerror","content":" Allows the user to provide a custom error handler. By default, error messages are logged using console.error if NODE_ENV is not set to production. ","version":"Next","tagName":"h3"},{"title":"wrapRichTextChunksInFragment​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#wraprichtextchunksinfragment","content":" When formatting rich text message, the output we produced is of type Array<string | React.ReactElement>, which will trigger key error. This wraps the output in a single React.Fragment to suppress that. ","version":"Next","tagName":"h3"},{"title":"defaultRichTextElements​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#defaultrichtextelements","content":" A map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as <b>, <p>... or enforcing certain Design System in the codebase (e.g standardized <a> or <button>...). See https://github.com/formatjs/formatjs/issues/1752 for more context. ","version":"Next","tagName":"h3"},{"title":"formatDate​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatdate","content":" function formatDate( value: number | Date | string, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string. It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatDate(Date.now(), { year: 'numeric', month: 'numeric', day: 'numeric', }) Result ","version":"Next","tagName":"h2"},{"title":"formatTime​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formattime","content":" function formatTime( value: number | Date | string, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date string, but it differs from formatDate by having the following default options: { hour: 'numeric', minute: 'numeric', } It expects a value which can be parsed as a date (i.e., isFinite(new Date(value))), and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatTime(Date.now()) /* "4:03 PM" */ Result ","version":"Next","tagName":"h2"},{"title":"formatDateTimeRange​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatdatetimerange","content":" browser support This requires Intl.DateTimeFormat.prototype.formatRange which has limited browser support. Please use our polyfill if you plan to support them. function formatDateTimeRange( from: number | Date | string, to: number | Date | string, options?: Intl.DateTimeFormatOptions & {format?: string} ): string This function will return a formatted date/time range string. Both from & to must be values which can be parsed as a date (i.e., isFinite(new Date(value))). It expects 2 values (a from Date & a to Date) and accepts options that conform to DateTimeFormatOptions. Live Editor intl.formatDateTimeRange(new Date('2020-1-1'), new Date('2020-1-15')) Result ","version":"Next","tagName":"h2"},{"title":"formatRelativeTime​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatrelativetime","content":" browser support This requires Intl.RelativeTimeFormat which has limited browser support. Please use our polyfill if you plan to support them. type Unit = | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year' type RelativeTimeFormatOptions = { numeric?: 'always' | 'auto' style?: 'long' | 'short' | 'narrow' } function formatRelativeTime( value: number, unit: Unit, options?: Intl.RelativeTimeFormatOptions & { format?: string } ): string This function will return a formatted relative time string (e.g., "1 hour ago"). It expects a value which is a number, a unit and options that conform to Intl.RelativeTimeFormatOptions. Live Editor intl.formatRelativeTime(0) Result Live Editor intl.formatRelativeTime(-24, 'hour', {style: 'narrow'}) Result ","version":"Next","tagName":"h2"},{"title":"formatNumber​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatnumber","content":" This function uses Intl.NumberFormat options. function formatNumber( value: number, options?: Intl.NumberFormatOptions & {format?: string} ): string This function will return a formatted number string. It expects a value which can be parsed as a number, and accepts options that conform to NumberFormatOptions. Live Editor intl.formatNumber(1000, {style: 'currency', currency: 'USD'}) Result Formatting Number using unit Currently this is part of ES2020 NumberFormat. We've provided a polyfill here and react-intl types allow users to pass in a sanctioned unit: Live Editor intl.formatNumber(1000, { style: 'unit', unit: 'kilobyte', unitDisplay: 'narrow', }) Result Live Editor intl.formatNumber(1000, { unit: 'fahrenheit', unitDisplay: 'long', style: 'unit', }) Result ","version":"Next","tagName":"h2"},{"title":"formatPlural​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatplural","content":" type PluralFormatOptions = { type?: 'cardinal' | 'ordinal' = 'cardinal' } function formatPlural( value: number, options?: Intl.PluralFormatOptions ): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other' This function will return a plural category string: "zero", "one", "two", "few", "many", or "other". It expects a value which can be parsed as a number, and accepts options that conform to PluralFormatOptions. This is a low-level utility whose output could be provided to a switch statement to select a particular string to display. Live Editor intl.formatPlural(1) Result Live Editor intl.formatPlural(3, {style: 'ordinal'}) Result Live Editor intl.formatPlural(4, {style: 'ordinal'}) Result multiple language support This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead. ","version":"Next","tagName":"h2"},{"title":"formatList​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatlist","content":" browser support This requires Intl.ListFormat which has limited browser support. Please use our polyfill if you plan to support them. type ListFormatOptions = { type?: 'disjunction' | 'conjunction' | 'unit' style?: 'long' | 'short' | 'narrow' } function formatList( elements: (string | React.ReactNode)[], options?: Intl.ListFormatOptions ): string | React.ReactNode[] This function allows you to join list of things together in an i18n-safe way. For example, when the locale is en: Live Editor intl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'}) Result Live Editor intl.formatList(['5 hours', '3 minutes'], {type: 'unit'}) Result ","version":"Next","tagName":"h2"},{"title":"formatDisplayName​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatdisplayname","content":" browser support This requires Intl.DisplayNames which has limited browser support. Please use our polyfill if you plan to support them. type FormatDisplayNameOptions = { style?: 'narrow' | 'short' | 'long' type?: 'language' | 'region' | 'script' | 'currency' fallback?: 'code' | 'none' } function formatDisplayName( value: string | number | Record<string, unknown>, options?: FormatDisplayNameOptions ): string | undefined Usage examples: Live Editor intl.formatDisplayName('zh-Hans-SG', {type: 'language'}) Result Live Editor // ISO-15924 four letters script code to localized display name intl.formatDisplayName('Deva', {type: 'script'}) Result Live Editor // ISO-4217 currency code to localized display name intl.formatDisplayName('CNY', {type: 'currency'}) Result Live Editor // ISO-3166 two letters region code to localized display name intl.formatDisplayName('UN', {type: 'region'}) Result ","version":"Next","tagName":"h2"},{"title":"formatMessage​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#formatmessage","content":" ","version":"Next","tagName":"h2"},{"title":"Message Syntax​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#message-syntax","content":" String/Message formatting is a paramount feature of React Intl and it builds on ICU Message Formatting by using the ICU Message Syntax. This message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime. Simple Message: Hello, {name} Complex Message: Hello, {name}, you have {itemCount, plural, =0 {no items} one {# item} other {# items} }. See: The Message Syntax Guide. ","version":"Next","tagName":"h3"},{"title":"Message Descriptor​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#message-descriptor","content":" React Intl has a Message Descriptor concept which is used to define your app's default messages/strings and is passed into formatMessage. The Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties: id: A unique, stable identifier for the messagedescription: Context for the translator about how it's used in the UIdefaultMessage: The default message (probably in English) type MessageDescriptor = { id: string defaultMessage?: string description?: string | object } Extracting Message Descriptor You can extract inline-declared messages from source files using our CLI. ","version":"Next","tagName":"h3"},{"title":"Message Formatting Fallbacks​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#message-formatting-fallbacks","content":" The message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails; at the very least a non-empty string should always be returned. Here's the message formatting fallback algorithm: Lookup and format the translated message at id, passed to <IntlProvider>.Fallback to formatting the defaultMessage.Fallback to source of translated message at id.Fallback to source of defaultMessage.Fallback to the literal message id. Above, "source" refers to using the template as is, without any substitutions made. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#usage","content":" type MessageFormatPrimitiveValue = string | number | boolean | null | undefined function formatMessage( descriptor: MessageDescriptor, values?: Record<string, MessageFormatPrimitiveValue> ): string function formatMessage( descriptor: MessageDescriptor, values?: Record< string, MessageFormatPrimitiveValue | React.ReactElement | FormatXMLElementFn > ): string | React.ReactNode[] This function will return a formatted message string. It expects a MessageDescriptor with at least an id property, and accepts a shallow values object which are used to fill placeholders in the message. If a translated message with the id has been passed to the <IntlProvider> via its messages prop it will be formatted, otherwise it will fallback to formatting defaultMessage. See: Message Formatting Fallbacks for more details. Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: 'Eric'}) } Result with ReactElement Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, {name}!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, {name: <b>Eric</b>}) } Result with rich text formatting Live Editor function () { const messages = defineMessages({ greeting: { id: 'app.greeting', defaultMessage: 'Hello, <bold>{name}</bold>!', description: 'Greeting to welcome the user to the app', }, }) return intl.formatMessage(messages.greeting, { name: 'Eric', bold: str => <b>{str}</b>, }) } Result The message we defined using defineMessages to support extraction via babel-plugin-formatjs, but it doesn't have to be if you're not using the Babel plugin. simple message Messages can be simple strings without placeholders, and that's the most common type of message. ","version":"Next","tagName":"h3"},{"title":"defineMessages/defineMessage​","type":1,"pageTitle":"Imperative API","url":"/docs/react-intl/api#definemessagesdefinemessage","content":" interface MessageDescriptor { id?: string description?: string | object defaultMessage?: string } function defineMessages( messageDescriptors: Record<string, MessageDescriptor> ): Record<string, MessageDescriptor> function defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor These functions are exported by the react-intl package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files. This function simply returns the Message Descriptor map object that's passed-in. import {defineMessages, defineMessage} from 'react-intl' const messages = defineMessages({ greeting: { id: 'app.home.greeting', description: 'Message to greet the user.', defaultMessage: 'Hello, {name}!', }, }) const msg = defineMessage({ id: 'single', defaultMessage: 'single message', description: 'header', }) ","version":"Next","tagName":"h2"},{"title":"swc-plugin","type":0,"sectionRef":"#","url":"/docs/tooling/swc-plugin","content":"swc-plugin This has been migrated over to the swc repo itself. You can find the plugin here.","keywords":"","version":"Next"},{"title":"CLI","type":0,"sectionRef":"#","url":"/docs/tooling/cli","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#installation","content":" npmyarn npm i -D @formatjs/cli Add the following command to your package.json scripts: { "scripts": { "extract": "formatjs extract", "compile": "formatjs compile" } } We've built this CLI that helps you extract messages from a list of files. It uses @formatjs/ts-transformer under the hood and should be able to extract messages if you're declaring using 1 of the mechanisms below: import {defineMessages, defineMessage} from 'react-intl' defineMessages({ foo: { id: 'foo', defaultMessage: 'foo', description: 'bar', }, }) defineMessage({ id: 'single', defaultMessage: 'single message', description: 'header', }) import {FormattedMessage} from 'react-intl' ;<FormattedMessage id="foo" defaultMessage="foo" description="bar" /> function Comp(props) { const {intl} = props return intl.formatMessage({ // The whole `intl.formatMessage` is required so we can extract id: 'foo', defaultMessage: 'foo', description: 'bar', }) } ","version":"Next","tagName":"h2"},{"title":"Extraction​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#extraction","content":" npmyarn npm run extract -- --help # Usage: formatjs extract [options] [files...] # Extract string messages from React components that use react-intl. # The input language is expected to be TypeScript or ES2017 with JSX. For example: npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang.json caution You should always quote (" or ') your glob pattern (like "src/**/*") to avoid auto shell expansion of those glob, which varies depending on your shell (zsh vs fish vs bash). ","version":"Next","tagName":"h2"},{"title":"--format [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--format-path","content":" Path to a formatter file that controls the shape of JSON file from --out-file. The formatter file must export a function called format with the signature. type FormatFn = <T = Record<string, MessageDescriptor>>( msgs: Record<string, MessageDescriptor> ) => T This is especially useful to convert from our extracted format to a TMS-specific format. See our builtin formatters for examples. ","version":"Next","tagName":"h3"},{"title":"--out-file [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--out-file-path","content":" The target file path where the plugin will output an aggregated .json file of allthe translations from the files supplied. This flag will ignore --messages-dir ","version":"Next","tagName":"h3"},{"title":"--id-interpolation-pattern [pattern]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--id-interpolation-pattern-pattern","content":" If certain message descriptors don't have id, this pattern will be used to automatically generate IDs for them. Default to [sha512:contenthash:base64:6]. See nodejs crypto createHash for hash algorithms & nodejs buffer docs for digest encodings. ","version":"Next","tagName":"h3"},{"title":"--extract-source-location​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--extract-source-location","content":" Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. (default: false) ","version":"Next","tagName":"h3"},{"title":"--additional-component-names [comma-separated-names]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--additional-component-names-comma-separated-names","content":" Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage is imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe. ","version":"Next","tagName":"h3"},{"title":"--additional-function-names [comma-separated-names]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--additional-function-names-comma-separated-names","content":" Additional function names to extract messages from, e.g: ['$t']. ","version":"Next","tagName":"h3"},{"title":"--ignore [files]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--ignore-files","content":" List of glob paths to not extract translations from. ","version":"Next","tagName":"h3"},{"title":"--throws​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--throws","content":" Whether to throw an exception when we fail to process any file in the batch. ","version":"Next","tagName":"h3"},{"title":"--pragma [pragma]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--pragma-pragma","content":" Parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" id="bar" /> and with option {pragma: "intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file. ","version":"Next","tagName":"h3"},{"title":"--preserve-whitespace​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--preserve-whitespace","content":" Whether to preserve whitespace and newlines in output. We typically remove consecutive whitespaces and newlines since those often gets abused for styling purposes. ","version":"Next","tagName":"h3"},{"title":"--flatten​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--flatten","content":" Whether to hoist selectors & flatten sentences as much as possible. E.g: I have {count, plural, one{a dog} other{many dogs}} becomes {count, plural, one{I have a dog} other{I have many dogs}} The goal is to provide as many full sentences as possible since fragmented sentences are not translator-friendly. ","version":"Next","tagName":"h3"},{"title":"Verification​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#verification","content":" Verify translation files to make sure keys are translated and messages are structurally compatible with source locale. npmyarn npm run formatjs verify [options] <translationFiles> ","version":"Next","tagName":"h2"},{"title":"--source-locale ​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--source-locale-sourcelocale","content":" The source locale of the translation files. There must be a file named <sourceLocale>.json in the list of translation files. This is used as source to verify other translations against. ","version":"Next","tagName":"h3"},{"title":"--missing-keys​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--missing-keys","content":" Whether to check for missing keys in target locale compared to source locale. This basically guarantees that no messages are untranslated. ","version":"Next","tagName":"h3"},{"title":"--structural-equality​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--structural-equality","content":" Whether to check for structural equality of messages between source and target locale. This makes sure translations are formattable and are not missing any tokens. ","version":"Next","tagName":"h3"},{"title":"Compilation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#compilation","content":" Compile extracted files from formatjs extract to a react-intl consumable JSON file. This also does ICU message verification. See Message Distribution for more details. npmyarn npm run compile -- --help ","version":"Next","tagName":"h2"},{"title":"--format [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--format-path-1","content":" Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature: type CompileFn = <T = Record<string, MessageDescriptor>>( msgs: T ) => Record<string, string> This is especially useful to convert from a TMS-specific format back to react-intl format. See our builtin formatters for examples. ","version":"Next","tagName":"h3"},{"title":"--out-file ​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--out-file-output","content":" The target file that contains compiled messages. ","version":"Next","tagName":"h3"},{"title":"--ast​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--ast","content":" Whether to compile message into AST instead of just string. See Advanced Usage ","version":"Next","tagName":"h3"},{"title":"--pseudo-locale ​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--pseudo-locale-pseudolocale","content":" Whether we should compile messages into pseudo locales instead. Available pseudo-locales: Given the English message my name is {name} Locale\tMessagexx-LS\tmy name is {name}SSSSSSSSSSSSSSSSSSSSSSSSS xx-AC\tMY NAME IS {name} xx-HA\t[javascript]my name is {name} en-XA\t[ḿẏ ƞȧȧḿḗḗ īş {name}] en-XB\tɯʎ uɐɯǝ ıs {name} caution Requires --ast ","version":"Next","tagName":"h3"},{"title":"Extraction and compilation with a single script​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#extraction-and-compilation-with-a-single-script","content":" In some environments you may want to simply extract your messages to a file ready for use with react-intl without using an intermediary extracted message file format. This could be useful for quickly and easily creating the file for the original language that uses the default messages. This could also be useful if you use a Translation Management System (TMS) that is best suited to working with the compiled files. Keep in mind that the compiled file does not contain message descriptions so it is harder to work with for translators. Ideally you want to find or write a custom formatter you can use to extract messages into a file format that works with your TMS. In order to achieve extraction and compilation in a single script, you can simply set up a script for that in package.json like in this example: "scripts": { "extract": "formatjs extract", "compile": "formatjs compile", "extract-compile": "formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' && formatjs compile 'temp.json' --out-file lang/en.json && rm temp.json" } ","version":"Next","tagName":"h2"},{"title":"Breakdown of the script​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#breakdown-of-the-script","content":" The extract-compile example script consists of three operations performed one after the other. formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' The first script extracts messages from all typescript files that are located in subfolders of src. You may need to ignore certain files that could trigger errors or warnings in the script, such as --ignore myFolder/myFile.ts formatjs compile 'temp.json' --out-file lang/en.json The second script compiles the messages from temp.json into the file lang/en.json. This file is ready to be consumed by react-intl. rm temp.json The last script deletes the temp.json extracted file. Feel free remove this from the script if you wish to keep this file around. ","version":"Next","tagName":"h3"},{"title":"The resulting files​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#the-resulting-files","content":" Here you can see the difference between the extracted (using the default formatter) and the compiled file formats. In the script above, temp.json is the extracted file and en.json is the compiled file. Extracted messagesCompiled messages { "hak27d": { "defaultMessage": "Control Panel", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Delete user {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "New Password", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirm Password", "description": "placeholder text" } } ","version":"Next","tagName":"h3"},{"title":"Folder Compilation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#folder-compilation","content":" Batch compile a folder with extracted files from formatjs extract to a folder containing react-intl consumable JSON files. This also does ICU message verification. See Message Distribution for more details. npmyarn npm run formatjs compile-folder [options] <folder> <outFolder> Folder structure should be in the form of <folder>/<locale>.json and the output would be <outFolder>/<locale>.json. ","version":"Next","tagName":"h2"},{"title":"--format [path]​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--format-path-2","content":" Path to a formatter file that converts <translation_file> to Record<string, string> so we can compile. The file must export a function named compile with the signature: type CompileFn = <T = Record<string, MessageDescriptor>>( msgs: T ) => Record<string, string> This is especially useful to convert from a TMS-specific format back to react-intl format ","version":"Next","tagName":"h3"},{"title":"--ast​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--ast-1","content":" Whether to compile message into AST instead of just string. See Advanced Usage ","version":"Next","tagName":"h3"},{"title":"--skip-errors​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#--skip-errors","content":" Whether to continue compiling messages after encountering an error parsing one of them. Any keys with errors will not be included in the output file. ","version":"Next","tagName":"h3"},{"title":"Builtin Formatters​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#builtin-formatters","content":" We provide the following built-in formatters to integrate with 3rd party TMSes: TMS\t--formatBabelEdit\tsimple Crowdin Chrome JSON\tcrowdin Lingohub\tsimple Localize's Simple JSON\tsimple Localizely\tsimple locize\tsimple Lokalise Structured JSON\tlokalise Phrase\tsimple POEditor Key-Value JSON\tsimple SimpleLocalize\tsimple Smartling ICU JSON\tsmartling Transifex's Structured JSON\ttransifex caution The formats of extract & compile have to be the same, which means if you extract --format smartling, you have to compile --format smartling as well & vice versa. ","version":"Next","tagName":"h2"},{"title":"Custom Formatters​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#custom-formatters","content":" You can provide your own formatter by using our interfaces: import {FormatFn, CompileFn, Comparator} from '@formatjs/cli' interface VendorJson {} // [Optional] Format @formatjs/cli structure to vendor's structure export const format: FormatFn<VendorJson> = () => {} // [Optional] Format vendor's structure to @formatjs/cli structure export const compile: CompileFn<VendorJson> = () => {} // [Optional] Sort the messages in a specific order during serialization export const compareMessages: Comparator = () => {} Take a look at our builtin formatter code for some examples. ","version":"Next","tagName":"h2"},{"title":"Node API​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#node-api","content":" Install @formatjs/cli-lib instead to use programmatically npmyarn npm i -D @formatjs/cli-lib ","version":"Next","tagName":"h2"},{"title":"Extraction​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#extraction-1","content":" import {extract} from '@formatjs/cli-lib' const resultAsString: Promise<string> = extract(files, { idInterpolationPattern: '[sha512:contenthash:base64:6]', }) ","version":"Next","tagName":"h3"},{"title":"Compilation​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#compilation-1","content":" import {compile} from '@formatjs/cli-lib' const resultAsString: Promise<string> = compile(files, { ast: true, }) ","version":"Next","tagName":"h3"},{"title":"Custom Formatter​","type":1,"pageTitle":"CLI","url":"/docs/tooling/cli#custom-formatter","content":" import {FormatFn, CompileFn, Comparator} from '@formatjs/cli-lib' export const format: FormatFn = msgs => msgs // Sort key reverse alphabetically export const compareMessages = (el1, el2) => { return el1.key < el2.key ? 1 : -1 } export const compile: CompileFn = msgs => { const results: Record<string, string> = {} for (const k in msgs) { results[k] = msgs[k].defaultMessage! } return results } ","version":"Next","tagName":"h3"},{"title":"Vue Plugin for formatjs","type":0,"sectionRef":"#","url":"/docs/vue-intl","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#installation","content":" npmyarn npm i -S vue-intl ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#usage","content":" Initialize VueIntl plugin with the same IntlConfig documented in @formatjs/intl. import {createIntl} from 'vue-intl' const app = createApp(App) app.use( createIntl({ locale: 'en', defaultLocale: 'en', messages: { foo: 'bar', }, }) ) From there you can use our APIs in 2 ways: ","version":"Next","tagName":"h2"},{"title":"inject​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#inject","content":" By specifying inject: {intl: intlKey}, you can use the full IntlFormatters API documented in @formatjs/intl. Note: intlKey needs to be imported from vue-intl. ","version":"Next","tagName":"h3"},{"title":"Composition API​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#composition-api","content":" We also support Vue's Composition API with provideIntl & useIntl. import {createIntl} from '@formatjs/intl' import {provideIntl, useIntl} from 'vue-intl' const Ancestor = { setup() { provideIntl( createIntl({ locale: 'en', defaultLocale: 'en', messages: { foo: 'Composed', }, }) ) }, render() { return h(Descendant) }, } const Descendant = { setup() { const intl = useIntl() return () => h( 'p', {}, intl.formatMessage({ id: 'foo', defaultMessage: 'Hello', }) ) }, } ","version":"Next","tagName":"h3"},{"title":"Methods​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#methods","content":" You can also use our formatters in Vue template by prepending $ like below: <template> <p>{{ $formatNumber(3, {style: 'currency', currency: 'USD'}) }}</p> </template> We currently support: $formatMessage$formatDate$formatTime$formatRelativeTime$formatTimeRange$formatDisplayName$formatList See @formatjs/intl for the full list of API signatures. ","version":"Next","tagName":"h3"},{"title":"Tooling​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#tooling","content":" formatjs toolchain fully supports vue: eslint-plugin-formatjs: This fully supports .vue and JS/TS.@formatjs/cli: We now support extracting messages from .vue SFC files.babel-plugin-formatjs: Compile messages during bundling for babel.@formatjs/ts-transformer: Compile messages during bundling for TypeScript. ","version":"Next","tagName":"h2"},{"title":"Caveats​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#caveats","content":" ","version":"Next","tagName":"h2"},{"title":"Using ICU in Vue SFC​","type":1,"pageTitle":"Vue Plugin for formatjs","url":"/docs/vue-intl#using-icu-in-vue-sfc","content":" Since }} & {{ are special tokens in .vue <template>, this can cause potential conflict with ICU MessageFormat syntax, e.g: <template> <p> {{ $formatMessage({ defaultMessage: '{count, selectordinal, offset:1 one {#} other {# more}}', }) }} </p> </template> Notice the {# more}} where it ends with }}. This will cause parsing issue in your vue template. In order to work around this issue, we recommend using space to turn }} into } }. <template> <p> {{ $formatMessage({ defaultMessage: '{count, selectordinal, offset:1 one {#} other {# more} }', }) }} </p> </template> ","version":"Next","tagName":"h3"},{"title":"ts-transformer","type":0,"sectionRef":"#","url":"/docs/tooling/ts-transformer","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#installation","content":" npmyarn npm i @formatjs/ts-transformer ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#usage","content":" The default message descriptors for the app's default language will be processed from: defineMessages(), defineMessage(), intl.formatMessage and <FormattedMessage>; all of which are named exports of the React Intl package. ","version":"Next","tagName":"h2"},{"title":"Via ts-loader​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-ts-loader","content":" import {transform} from '@formatjs/ts-transformer' module.exports = { ...otherConfigs, module: { rules: [ { test: /\\.tsx?$/, use: [ { loader: 'ts-loader', options: { getCustomTransformers() { return { before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', }), ], } }, }, }, ], }, ], }, } ","version":"Next","tagName":"h3"},{"title":"Via ts-jest in jest.config.js​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-ts-jest-in-jestconfigjs","content":" caution This requires ts-jest@26.4.0 or later // jest.config.js module.exports = { // [...] globals: { 'ts-jest': { astTransformers: { before: [ { path: '@formatjs/ts-transformer/ts-jest-integration', options: { // options overrideIdFn: '[sha512:contenthash:base64:6]', ast: true, }, }, ], }, }, }, } ","version":"Next","tagName":"h3"},{"title":"Via ts-patch​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-ts-patch","content":" { "compilerOptions": { "plugins": [ { "transform": "@formatjs/ts-transformer", "import": "transform", "type": "config", "overrideIdFn": "[sha512:contenthash:base64:6]", "ast": true } ] } } ","version":"Next","tagName":"h3"},{"title":"Via rollup-plugin-typescript2​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#via-rollup-plugin-typescript2","content":" // rollup.config.js import typescript from 'rollup-plugin-typescript2' import {transform} from '@formatjs/ts-transformer' export default { input: './main.ts', plugins: [ typescript({ transformers: () => ({ before: [ transform({ overrideIdFn: '[sha512:contenthash:base64:6]', ast: true, }), ], }), }), ], } ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#options","content":" ","version":"Next","tagName":"h2"},{"title":"overrideIdFn​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#overrideidfn","content":" A function with the signature (id: string, defaultMessage: string, description: string|object) => string which allows you to override the ID both in the extracted javascript and messages. Alternatively, overrideIdFn can be a template string, which is used only if the message ID is empty. ","version":"Next","tagName":"h3"},{"title":"removeDefaultMessage​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#removedefaultmessage","content":" Remove defaultMessage field in generated js after extraction. ","version":"Next","tagName":"h3"},{"title":"extractSourceLocation​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#extractsourcelocation","content":" Whether the metadata about the location of the message in the source file should be extracted. If true, then file, start, and end fields will exist for each extracted message descriptors. Defaults to false. ","version":"Next","tagName":"h3"},{"title":"additionalComponentNames​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#additionalcomponentnames","content":" Additional component names to extract messages from, e.g: ['FormattedFooBarMessage']. NOTE: By default we check for the fact that FormattedMessage are imported from moduleSourceName to make sure variable alias works. This option does not do that so it's less safe. ","version":"Next","tagName":"h3"},{"title":"additionalFunctionNames​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#additionalfunctionnames","content":" Additional function names to extract messages from, e.g: ['$formatMessage']. Use this if you prefer to alias formatMessage to something shorter like $t. ","version":"Next","tagName":"h3"},{"title":"pragma​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#pragma","content":" parse specific additional custom pragma. This allows you to tag certain file with metadata such as project. For example with this file: // @intl-meta project:my-custom-project import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" id="bar" /> and with option {pragma: "@intl-meta"}, we'll parse out // @intl-meta project:my-custom-project into {project: 'my-custom-project'} in the result file. ","version":"Next","tagName":"h3"},{"title":"ast​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#ast","content":" Pre-parse defaultMessage into AST for faster runtime perf. This flag doesn't do anything when removeDefaultMessage is true. ","version":"Next","tagName":"h3"},{"title":"onMsgExtracted(filePath: string, msgs: MessageDescriptor[])​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#onmsgextractedfilepath-string-msgs-messagedescriptor","content":" Callback that gets triggered whenever a message is encountered. ","version":"Next","tagName":"h3"},{"title":"onMetaExtracted(filePath: string, meta: Record)​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#onmetaextractedfilepath-string-meta-recordstring-string","content":" Callback that gets triggered whenever a pragme meta is encountered. ","version":"Next","tagName":"h3"},{"title":"preserveWhitespace​","type":1,"pageTitle":"ts-transformer","url":"/docs/tooling/ts-transformer#preservewhitespace","content":" Whether to preserve whitespace and newlines. Take a look at compile.ts for example in integration. ","version":"Next","tagName":"h3"},{"title":"eslint-plugin-formatjs","type":0,"sectionRef":"#","url":"/docs/tooling/linter","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#usage","content":" npmyarn npm i -D eslint-plugin-formatjs Then in your eslint config: import formatjs from 'eslint-plugin-formatjs' export default [ // other configs... { plugins: { formatjs, }, rules: { 'formatjs/no-offset': 'error', }, }, ] ","version":"Next","tagName":"h2"},{"title":"React​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#react","content":" Currently this uses intl.formatMessage, defineMessage, defineMessages, <FormattedMessage> from react-intl as hooks to verify the message. Therefore, in your code use 1 of the following mechanisms: import {defineMessages, defineMessage} from 'react-intl' const messages = defineMessages({ foo: { defaultMessage: 'foo', description: 'bar', }, }) defineMessage({ defaultMessage: 'single message', }) import {FormattedMessage} from 'react-intl' ;<FormattedMessage defaultMessage="foo" description="bar" /> function foo() { intl.formatMessage({ defaultMessage: 'foo', }) } ","version":"Next","tagName":"h3"},{"title":"Vue​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#vue","content":" This will check against intl.formatMessage, $formatMessage function calls in both your JS/TS & your SFC .vue files. For example: <template> <p> {{ $formatMessage({ defaultMessage: 'today is {now, date}', }) }} </p> </template> ","version":"Next","tagName":"h3"},{"title":"Shared Settings​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#shared-settings","content":" These settings are applied globally to all formatjs rules once specified. See Shared Settings for more details on how to set them. ","version":"Next","tagName":"h2"},{"title":"formatjs.additionalFunctionNames​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#formatjsadditionalfunctionnames","content":" Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional function names to check besides formatMessage & $formatMessage. ","version":"Next","tagName":"h3"},{"title":"formatjs.additionalComponentNames​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#formatjsadditionalcomponentnames","content":" Similar to babel-plugin-formatjs & @formatjs/ts-transformer, this allows you to specify additional component names to check besides FormattedMessage. ","version":"Next","tagName":"h3"},{"title":"Shareable Configs​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#shareable-configs","content":" The plugin provides the following two shareable configs: recommendedstrict By using these, you can simplify your configuration while still using a set of rules that aligns with your quality standards. ","version":"Next","tagName":"h2"},{"title":"Example​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#example","content":" import formatjs from 'eslint-plugin-formatjs' export default [ formatjs.configs.recommended, // Other configs... ] ","version":"Next","tagName":"h3"},{"title":"Available Rules​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#available-rules","content":" ","version":"Next","tagName":"h2"},{"title":"blocklist-elements​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#blocklist-elements","content":" This blocklists usage of specific elements in ICU message. Why​ Certain translation vendors cannot handle things like selectordinal Available elements​ enum Element { // literal text, like `defaultMessage: 'some text'` literal = 'literal', // placeholder, like `defaultMessage: '{placeholder} var'` argument = 'argument', // number, like `defaultMessage: '{placeholder, number} var'` number = 'number', // date, like `defaultMessage: '{placeholder, date} var'` date = 'date', // time, like `defaultMessage: '{placeholder, time} var'` time = 'time', // select, like `defaultMessage: '{var, select, foo{one} bar{two}} var'` select = 'select', // selectordinal, like `defaultMessage: '{var, selectordinal, one{one} other{two}} var'` selectordinal = 'selectordinal', // plural, like `defaultMessage: '{var, plural, one{one} other{two}} var'` plural = 'plural', } Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/blocklist-elements': [2, ['selectordinal']], }, }, ] ","version":"Next","tagName":"h3"},{"title":"enforce-description​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-description","content":" This enforces description in the message descriptor. Why​ Description provides helpful context for translators import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'foo', description: 'bar', }, // FAILS bar: { defaultMessage: 'bar', }, }) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-description': ['error', 'literal'], }, }, ] Setting literal forces description to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects description to always be a literal ","version":"Next","tagName":"h3"},{"title":"enforce-default-message​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-default-message","content":" This enforces defaultMessage in the message descriptor. Why​ Can be useful in case we want to extract messages for translations from source code. This way can make sure people won't forget about defaultMessage import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'This is default message', description: 'bar', }, // FAILS bar: { description: 'bar', }, }) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-default-message': ['error', 'literal'], }, }, ] Setting literal forces defaultMessage to always be a string literal instead of function calls or variables. This is helpful for extraction tools that expects defaultMessage to always be a literal ","version":"Next","tagName":"h3"},{"title":"enforce-placeholders​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-placeholders","content":" Makes sure all values are passed in if message has placeholders (number/date/time/plural/select/selectordinal). This requires values to be passed in as literal object (not a variable). // WORKS, no error <FormattedMessage defaultMessage="this is a {placeholder}" values={{placeholder: 'dog'}} /> // WORKS, no error intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }, {placeholder: 'dog'}) // WORKS, error bc no values were provided <FormattedMessage defaultMessage="this is a {placeholder}" /> // WORKS, error bc no values were provided intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }) // WORKS, error bc `placeholder` is not passed in <FormattedMessage defaultMessage="this is a {placeholder}" values={{foo: 1}} /> // WORKS, error bc `placeholder` is not passed in intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }, {foo: 1}) // DOESN'T WORK <FormattedMessage defaultMessage="this is a {placeholder}" values={someVar} /> // DOESN'T WORK intl.formatMessage({ defaultMessage: 'this is a {placeholder}' }, values) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-placeholders': [ 'error', { ignoreList: ['foo'], }, ], }, }, ] ignoreList: List of placeholder names to ignore. This works with defaultRichTextElements in react-intl so we don't provide false positive for ambient global tag formatting ","version":"Next","tagName":"h3"},{"title":"enforce-plural-rules​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-plural-rules","content":" Enforce certain plural rules to always be specified/forbidden in a message. Why​ It is recommended to always specify other as fallback in the message.Some translation vendors only accept certain rules. Available rules​ enum LDML { zero = 'zero', one = 'one', two = 'two', few = 'few', many = 'many', other = 'other', } Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-plural-rules': [ 2, { one: true, other: true, zero: false, }, ], }, }, ] ","version":"Next","tagName":"h3"},{"title":"no-camel-case​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-camel-case","content":" This make sure placeholders are not camel-case. Why​ This is to prevent case-sensitivity issue in certain translation vendors. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'foo {snake_case} {nothing}', }, // FAILS bar: { defaultMessage: 'foo {camelCase}', }, }) ","version":"Next","tagName":"h3"},{"title":"no-missing-icu-plural-one-placeholders​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-missing-icu-plural-one-placeholders","content":" Messages that look like {thing, plural, one {1 thing} other {# things}} will need to be changed to {thing, plural, one {# thing} other {# things}} Why​ one is a category for any number that behaves like 1. So in some languages, for example Ukrainian, Russian and Polish, one → numbers that end in 1 (like 1, 21, 151) but that don’t end in 11 (like 11, 111, 10311). More info ","version":"Next","tagName":"h3"},{"title":"no-emoji​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-emoji","content":" This prevents usage of emojis (or above a certain Unicode version) in message import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-emoji': ['error'], }, }, // OR { plugins: { formatjs, }, rules: { 'formatjs/no-emoji': ['error', {versionAbove: '12.0'}], }, }, ] Why​ Certain translation vendors cannot handle emojis.Cross-platform encoding for emojis are faulty. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'Smileys & People', }, // WORKS with option {versionAbove: '12.0'} foo_bar: { defaultMessage: '😃 Smileys & People', }, // FAILS bar: { defaultMessage: '😃 Smileys & People', }, // FAILS with option {versionAbove: '12.0'} bar_foo: { defaultMessage: '🥹 Smileys & People', }, }) ","version":"Next","tagName":"h3"},{"title":"no-literal-string-in-jsx​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-literal-string-in-jsx","content":" This prevents untranslated strings in JSX. Why​ It is easy to forget wrapping JSX text in translation functions or components.It is easy to forget wrapping certain accessibility attributes (e.g. aria-label) in translation functions. // WORKS <Button> <FormattedMessage defaultMessage="Submit" /> </Button> // WORKS <Button> {customTranslateFn("Submit")} </Button> // WORKS <input aria-label={intl.formatMessage({defaultMessage: "Label"})} /> // WORKS <img src="/example.png" alt={intl.formatMessage({defaultMessage: "Image description"})} /> // FAILS <Button>Submit</Button> // FAILS <Button>{'Submit'}</Button> // FAILS <Button>{`Te` + 's' + t}</Button> // FAILS <input aria-label="Untranslated label" /> // FAILS <img src="/example.png" alt="Image description" /> // FAILS <input aria-label={`Untranslated label`} /> This linter reports text literals or string expressions, including string concatenation expressions in the JSX children. It also checks certain JSX attributes that you can customize. Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-literal-string-in-jsx': [ 2, { // Include or exclude additional prop checks (merged with the default checks) props: { include: [ // picomatch style glob pattern for tag name and prop name. // check `name` prop of `UI.Button` tag. ['UI.Button', 'name'], // check `message` of any component. ['*', 'message'], ], // Exclude will always override include. exclude: [ // do not check `message` of the `Foo` tag. ['Foo', 'message'], // do not check aria-label and aria-description of `Bar` tag. ['Bar', 'aria-{label,description}'], ], }, }, ], }, }, ] The default prop checks are: { include: [ // check aria attributes that the screen reader announces. ['*', 'aria-{label,description,details,errormessage}'], // check placeholder and title attribute of all native DOM elements. ['[a-z]*([a-z0-9])', '(placeholder|title)'], // check alt attribute of the img tag. ['img', 'alt'], ], exclude: [] } ","version":"Next","tagName":"h3"},{"title":"no-literal-string-in-object​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-literal-string-in-object","content":" This prevents untranslated strings in chosen object properties. Why​ It is easy to forget wrapping literal strings in translation functions, when they are defined in an object field like {label: "Untranslated label"}. const options = () => [ // FAILS {value: 'chocolate', label: 'Chocolate'}, // WORKS { value: 'strawberry', label: intl.formatMessage({defaultMessage: 'Strawberry'}), }, // WORKS, custom translation function { value: 'mint', label: customTranslateFn('Mint'), }, // FAILS, string concatenation { value: 'coconut', label: 'Coconut' + intl.formatMessage({defaultMessage: 'Ice Cream'}), }, // FAILS, template literal { value: 'mango', label: `Mango ${intl.formatMessage({defaultMessage: 'Ice Cream'})}`, }, // FAILS, conditional rendering { value: 'recommended', label: feelLikeSour ? intl.formatMessage({defaultMessage: 'Lime'}) : 'Vanilla', }, ] const MyComponent = () => <Select options={options()} /> This linter reports text literals or string expressions, including string concatenation expressions in the object properties that you can customize. Example​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-literal-string-in-object': [ 'warn', { // The object properties to check for untranslated literal strings, default: ['label'] include: ['label'], }, ], }, }, ] ","version":"Next","tagName":"h3"},{"title":"no-multiple-whitespaces​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-multiple-whitespaces","content":" This prevents usage of multiple consecutive whitespaces in message. Why​ Consecutive whitespaces are handled differently in different locales.Prevents \\ linebreaks in JS string which results in awkward whitespaces. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: 'Smileys & People', }, // FAILS bar: { defaultMessage: 'Smileys & People', }, // FAILS baz: { defaultMessage: 'this message is too long \\ so I wanna line break it.', }, }) ","version":"Next","tagName":"h3"},{"title":"no-multiple-plurals​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-multiple-plurals","content":" This prevents specifying multiple plurals in your message. Why​ Nested plurals are hard to translate across languages so some translation vendors don't allow it. import {defineMessages} from 'react-intl' const messages = defineMessages({ // WORKS foo: { defaultMessage: '{p1, plural, one{one}}', }, // FAILS bar: { defaultMessage: '{p1, plural, one{one}} {p2, plural, one{two}}', } // ALSO FAILS bar2: { defaultMessage: '{p1, plural, one{{p2, plural, one{two}}}}', } }) ","version":"Next","tagName":"h3"},{"title":"no-offset​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-offset","content":" This prevents specifying offset in plural rules in your message. Why​ Offset has complicated logic implication so some translation vendors don't allow it. import {defineMessages} from 'react-intl' const messages = defineMessages({ // PASS foo: { defaultMessage: '{var, plural, one{one} other{other}}', }, // FAILS bar: { defaultMessage: '{var, plural, offset:1 one{one} other{other}}', }, }) ","version":"Next","tagName":"h3"},{"title":"enforce-id​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#enforce-id","content":" This enforces generated ID to be set in MessageDescriptor. Why​ Pipelines can enforce automatic/manual ID generation at the linter level (autofix to insert autogen ID) so this guarantees that. import {defineMessages} from 'react-intl'; const messages = defineMessages({ // PASS foo: { id: '19shaf' defaultMessage: '{var, plural, one{one} other{other}}', }, // FAILS bar: { id: 'something', defaultMessage: '{var, plural, offset:1 one{one} other{other}}', }, // FAILS bar: { defaultMessage: '{var, plural, offset:1 one{one} other{other}}', }, }); Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/enforce-id': [ 'error', { idInterpolationPattern: '[sha512:contenthash:base64:6]', }, ], }, }, ] idInterpolationPattern: Pattern to verify ID againstidWhitelist: An array of strings with regular expressions. This array allows allowlist custom ids for messages. For example '\\\\.' allows any id which has dot; '^payment_.*' - allows any custom id which has prefix payment_. Be aware that any backslash \\ provided via string must be escaped with an additional backslash. ","version":"Next","tagName":"h3"},{"title":"no-invalid-icu​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-invalid-icu","content":" This bans strings inside defaultMessage that are syntactically invalid. Why​ It's easy to miss strings that look correct to you as a developer but which are actually syntactically invalid ICU strings. For instance, the following would cause an eslint error: formatMessage( { defaultMessage: '{count, plural one {#} other {# more}}', //Missing a comma! }, { count: 1, } ) ","version":"Next","tagName":"h3"},{"title":"no-id​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-id","content":" This bans explicit ID in MessageDescriptor. Why​ We generally encourage automatic ID generation due to these reasons. This makes sure no explicit IDs are set. ","version":"Next","tagName":"h3"},{"title":"no-complex-selectors​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-complex-selectors","content":" Make sure a sentence is not too complex. Complexity is determined by how many strings are produced when we try to flatten the sentence given its selectors. For example: I have {count, plural, one{a dog} other{many dogs}} has the complexity of 2 because flattening the plural selector results in 2 sentences: I have a dog & I have many dogs. Default complexity limit is 20 (using Smartling as a reference) Options​ import formatjs from 'eslint-plugin-formatjs' export default [ { plugins: { formatjs, }, rules: { 'formatjs/no-complex-selectors': [ 'error', { limit: 3, }, ], }, }, ] ","version":"Next","tagName":"h3"},{"title":"no-useless-message​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#no-useless-message","content":" This bans messages that do not require translation. Why​ Messages like {test} is not actionable by translators. The code should just directly reference test. ","version":"Next","tagName":"h3"},{"title":"prefer-formatted-message​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#prefer-formatted-message","content":" Use <FormattedMessage> instead of the imperative intl.formatMessage(...) if applicable. // Bad <p> {intl.formatMessage({defaultMessage: 'hello'})} </p> // Good <p> <FormattedMessage defaultMessage="hello" /> </p> Why​ Consistent coding style in JSX and less syntax clutter. ","version":"Next","tagName":"h3"},{"title":"prefer-pound-in-plural​","type":1,"pageTitle":"eslint-plugin-formatjs","url":"/docs/tooling/linter#prefer-pound-in-plural","content":" Use # in the plural argument to reference the count instead of repeating the argument. // Bad I have {count} { count, plural, one {apple} other {apples} } } // Good I have { count, plural, one {# apple} other {# apples} } } // Bad I have { count, plural, one {{count} apple} other {{count} apples} } } // Good I have { count, plural, one {# apple} other {# apples} } } // Bad I won the {ranking}{ count, selectordinal, one {st} two {nd} few {rd} other {th} } place. // Good I won the {ranking}{ count, selectordinal, one {#st} two {#nd} few {#rd} other {#th} } place. Why​ More concise message.Ensures that the count are correctly formatted as numbers. ","version":"Next","tagName":"h3"}],"options":{"id":"default"}} \ No newline at end of file diff --git a/search/index.html b/search/index.html new file mode 100755 index 000000000..5f97bb0e2 --- /dev/null +++ b/search/index.html @@ -0,0 +1,20 @@ + + + + + + + + + +Search the documentation | Format.JS + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml old mode 100644 new mode 100755 index c1bb3633a..cc37fad36 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://formatjs.github.io/docs/core-concepts/basic-internationalization-principlesweekly0.5https://formatjs.github.io/docs/core-concepts/icu-syntaxweekly0.5https://formatjs.github.io/docs/getting-started/application-workflowweekly0.5https://formatjs.github.io/docs/getting-started/installationweekly0.5https://formatjs.github.io/docs/getting-started/message-declarationweekly0.5https://formatjs.github.io/docs/getting-started/message-distributionweekly0.5https://formatjs.github.io/docs/getting-started/message-extractionweekly0.5https://formatjs.github.io/docs/guides/advanced-usageweekly0.5https://formatjs.github.io/docs/guides/bundler-pluginsweekly0.5https://formatjs.github.io/docs/guides/developweekly0.5https://formatjs.github.io/docs/guides/distribute-librariesweekly0.5https://formatjs.github.io/docs/guides/runtime-requirementsweekly0.5https://formatjs.github.io/docs/guides/testingweekly0.5https://formatjs.github.io/docs/icu-messageformat-parserweekly0.5https://formatjs.github.io/docs/intlweekly0.5https://formatjs.github.io/docs/intl-messageformatweekly0.5https://formatjs.github.io/docs/polyfillsweekly0.5https://formatjs.github.io/docs/polyfills/intl-datetimeformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-displaynamesweekly0.5https://formatjs.github.io/docs/polyfills/intl-durationformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-getcanonicallocalesweekly0.5https://formatjs.github.io/docs/polyfills/intl-listformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-localeweekly0.5https://formatjs.github.io/docs/polyfills/intl-localematcherweekly0.5https://formatjs.github.io/docs/polyfills/intl-numberformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-pluralrulesweekly0.5https://formatjs.github.io/docs/polyfills/intl-relativetimeformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-segmenterweekly0.5https://formatjs.github.io/docs/polyfills/intl-supportedvaluesofweekly0.5https://formatjs.github.io/docs/react-intlweekly0.5https://formatjs.github.io/docs/react-intl/apiweekly0.5https://formatjs.github.io/docs/react-intl/componentsweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-2xweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-3xweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-4xweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-5xweekly0.5https://formatjs.github.io/docs/tooling/babel-pluginweekly0.5https://formatjs.github.io/docs/tooling/cliweekly0.5https://formatjs.github.io/docs/tooling/linterweekly0.5https://formatjs.github.io/docs/tooling/swc-pluginweekly0.5https://formatjs.github.io/docs/tooling/ts-transformerweekly0.5https://formatjs.github.io/docs/vue-intlweekly0.5https://formatjs.github.io/weekly0.5 \ No newline at end of file +https://formatjs.github.io/weekly0.5https://formatjs.github.io/searchweekly0.5https://formatjs.github.io/docs/core-concepts/basic-internationalization-principlesweekly0.5https://formatjs.github.io/docs/core-concepts/icu-syntaxweekly0.5https://formatjs.github.io/docs/getting-started/application-workflowweekly0.5https://formatjs.github.io/docs/getting-started/installationweekly0.5https://formatjs.github.io/docs/getting-started/message-declarationweekly0.5https://formatjs.github.io/docs/getting-started/message-distributionweekly0.5https://formatjs.github.io/docs/getting-started/message-extractionweekly0.5https://formatjs.github.io/docs/guides/advanced-usageweekly0.5https://formatjs.github.io/docs/guides/bundler-pluginsweekly0.5https://formatjs.github.io/docs/guides/developweekly0.5https://formatjs.github.io/docs/guides/distribute-librariesweekly0.5https://formatjs.github.io/docs/guides/runtime-requirementsweekly0.5https://formatjs.github.io/docs/guides/testingweekly0.5https://formatjs.github.io/docs/icu-messageformat-parserweekly0.5https://formatjs.github.io/docs/intlweekly0.5https://formatjs.github.io/docs/intl-messageformatweekly0.5https://formatjs.github.io/docs/polyfillsweekly0.5https://formatjs.github.io/docs/polyfills/intl-datetimeformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-displaynamesweekly0.5https://formatjs.github.io/docs/polyfills/intl-getcanonicallocalesweekly0.5https://formatjs.github.io/docs/polyfills/intl-listformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-localeweekly0.5https://formatjs.github.io/docs/polyfills/intl-localematcherweekly0.5https://formatjs.github.io/docs/polyfills/intl-numberformatweekly0.5https://formatjs.github.io/docs/polyfills/intl-pluralrulesweekly0.5https://formatjs.github.io/docs/polyfills/intl-relativetimeformatweekly0.5https://formatjs.github.io/docs/react-intlweekly0.5https://formatjs.github.io/docs/react-intl/apiweekly0.5https://formatjs.github.io/docs/react-intl/componentsweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-2xweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-3xweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-4xweekly0.5https://formatjs.github.io/docs/react-intl/upgrade-guide-5xweekly0.5https://formatjs.github.io/docs/tooling/babel-pluginweekly0.5https://formatjs.github.io/docs/tooling/cliweekly0.5https://formatjs.github.io/docs/tooling/linterweekly0.5https://formatjs.github.io/docs/tooling/ts-transformerweekly0.5https://formatjs.github.io/docs/vue-intlweekly0.5 \ No newline at end of file