diff --git a/.changeset/selfish-kings-think.md b/.changeset/selfish-kings-think.md new file mode 100644 index 000000000..659dda493 --- /dev/null +++ b/.changeset/selfish-kings-think.md @@ -0,0 +1,6 @@ +--- +"@lingo.dev/_spec": patch +"lingo.dev": patch +--- + +Add MJML bucket support diff --git a/packages/cli/demo/mjml/en/example.mjml b/packages/cli/demo/mjml/en/example.mjml new file mode 100644 index 000000000..208530485 --- /dev/null +++ b/packages/cli/demo/mjml/en/example.mjml @@ -0,0 +1,89 @@ + + + + Welcome to Our Service + Get started with your new account today + + + + + + + + + + + + + + + Welcome to Our Platform! + + + Thank you for signing up. We're excited to have you on board. + + + To get started, please verify your email address by clicking the + button below. + + + + + + + + Verify Email Address! + + + + + + + + If you didn't create an account, you can safely ignore this email. + + + Need help? Contact our support team. + + + + + + + + + + + + + © 2024 Example Company. All rights reserved. + + + + + diff --git a/packages/cli/demo/mjml/es/example.mjml b/packages/cli/demo/mjml/es/example.mjml new file mode 100644 index 000000000..0f9e8ba38 --- /dev/null +++ b/packages/cli/demo/mjml/es/example.mjml @@ -0,0 +1,89 @@ + + + + Bienvenido a nuestro servicio + Comienza con tu nueva cuenta hoy + + + + + + + + + + + + + + + ¡Bienvenido a nuestra plataforma! + + + Gracias por registrarte. Estamos encantados de tenerte con nosotros. + + + Para comenzar, por favor verifica tu dirección de correo electrónico + haciendo clic en el botón de abajo. + + + + + + + + ¡Verificar dirección de correo! + + + + + + + + Si no creaste una cuenta, puedes ignorar este correo electrónico. + + + ¿Necesitas ayuda? Contacta a nuestro equipo de soporte. + + + + + + + + + + + + + © 2024 Example Company. Todos los derechos reservados. + + + + + diff --git a/packages/cli/demo/mjml/i18n.json b/packages/cli/demo/mjml/i18n.json new file mode 100644 index 000000000..eb0be68a7 --- /dev/null +++ b/packages/cli/demo/mjml/i18n.json @@ -0,0 +1,13 @@ +{ + "version": "1.10", + "locale": { + "source": "en", + "targets": ["es"] + }, + "buckets": { + "mjml": { + "include": ["./[locale]/example.mjml"] + } + }, + "$schema": "https://lingo.dev/schema/i18n.json" +} diff --git a/packages/cli/demo/mjml/i18n.lock b/packages/cli/demo/mjml/i18n.lock new file mode 100644 index 000000000..70b9c9e5c --- /dev/null +++ b/packages/cli/demo/mjml/i18n.lock @@ -0,0 +1,21 @@ +version: 1 +checksums: + c1acde0589961652d4caf8a39d080857: + mjml/mj-head/0/mj-title/0: c514a686b50f7158b2dd08ea65d3bc8a + mjml/mj-head/0/mj-preview/0: 4ce14f6062c814cbdcdf8b0a3cb094d3 + mjml/mj-body/0/mj-section/0/mj-column/0/mj-image/0#alt: 82d5c0d5994508210ee02d684819f4b8 + mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/0: b320b02942617a70dcbd1beac61da11a + mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/1: 028311348a5aeefea365fdf422a3fb21 + mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/2: 0dfdc9b80ee70fcc2b28d0e81e03fabc + mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0#title: 5c96f738bd6153ee07b72094cdfd2b98 + mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0#aria-label: 42dcab68d931f9145d9b6d76740a5c66 + mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0: dc8001d5c58294d22fe0b0e6118dbfb7 + mjml/mj-body/0/mj-section/3/mj-column/0/mj-text/0: a18f14ab69467cbdbe467df6255cfda7 + mjml/mj-body/0/mj-section/3/mj-column/0/mj-text/1: e83236e98aad1937bc99a47cff159caa + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/0#title: 180bd8aa700f6cedf65e0a2079503cea + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/0#alt: ac8afe226a7424849c247e6a9d566f64 + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/1#title: ea4c2a7a9a60cbb0f8f9632222a46abe + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/1#alt: ba3d4aed69a50759b53a0b7c319a3ad9 + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/2#title: 754efa5f98f51c510ff268e217877d8b + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/2#alt: c9555810826c30d571ffae869a236494 + mjml/mj-body/0/mj-section/4/mj-column/0/mj-text/0: 9ac6c625c7af33d70634846c8c9d11b0 diff --git a/packages/cli/i18n.json b/packages/cli/i18n.json index 52297d04b..5279adadc 100644 --- a/packages/cli/i18n.json +++ b/packages/cli/i18n.json @@ -51,6 +51,9 @@ "lockedKeys": ["meta/locked_key_1"], "ignoredKeys": ["meta/ignored_key_1"] }, + "mjml": { + "include": ["demo/mjml/[locale]/*.mjml"] + }, "po": { "include": ["demo/po/[locale]/*.po"] }, diff --git a/packages/cli/i18n.lock b/packages/cli/i18n.lock index 516844b10..00674a8dc 100644 --- a/packages/cli/i18n.lock +++ b/packages/cli/i18n.lock @@ -1,406 +1,24 @@ version: 1 checksums: - 2bc3a8ed319665fae7eff9afc672f20e: - sign_in_agreeement_text_1: fe31d6be8f7c461953810306846a88ca - sign_in_agreeement_text_2: 30bdc34e1f73b20445e5793728608b86 - 25add62e9340a686ce2995b840d8a439: - dashboard.title: c9380ea68c8c76ea451bd9613329a07c - greeting.message: 981df558575dc8a5f088978cc57a4018 - 77624f597c2092ea61483d71313398c3: - content/0: 542ac27a93aea7b38c98de00efce9dff - content/1: c9e612bc3fd041dd984ab3e7f2d77e24 - content/2: 90d70cbdec064800b09728d871e1110e - content/3: 799bacc2d503c917277a9359ae746c4e - content/4: 9e5a786192608844493dfbb6e4100886 - b3b7f970e3d2e81f9679d0f0de74e5bc: - simpleMessage: 6ab8c48d251e87acb707e43006d783f2 - messageWithPlaceholder: a4028aa70eaa7049318f039837199173 - pluralMessage: 5d99c6ef240b21489e9de37118d9abe9 - genderMessage: e28d61555c4f2a82e756da7c102fdd30 - nestedMessage: 5e0dca93f6b3f140941c1d47ff115314 - dateMessage: 8f8b3d41f4fb5849db8efce61cc983c9 - currencyMessage: b6a41e9a4ccac26e01621ef82c88c287 - percentMessage: e091023f926a93300645759e90848cf4 - listMessage: 12632bfd4b8c03f13bf7cd41a2c821ed - complexMessage: b30fe2a8990c467391296864126cb42d - escapeMessage: 88d90279078fafe7a29fda6f17f99c06 - multilineMessage: a54a797df1eded0bdb2d0e6078e5eb5d - htmlMessage: a9e1185f9b7d4cbb64151766e881e4a3 - 375aef6881d5301adf8d576799de2210: - md-section-0: fbd0792a448f7a2da57a5d06438bca96 - md-section-1: 9ebb7511694dd3d1fcbbc46f3ea97c09 - md-section-2: b1f47fd5a3de40fc5dc12d4e9b40a9c2 - md-section-3: b4369ef32c2eb07cfd73608f9c7e0a81 - fm-attr-title: 03ddeab99b6170d63191217de2e2c0f3 - fm-attr-file-name: 950367b45201943794aebfbdef8c8b05 - fm-attr-slug: 9532f11ad94e91f96c3f92a18dc63d81 - fm-attr-simple-relative-path: 5bea1a157e040ef84d5d82d4ca4b0d77 - fm-attr-dot-relative-path: 19c7a5a88779d53acf2a175a94a437d4 - fm-attr-absolute-path: 891c4483926b0c7c17d46b81d9669b5b - 57c97bf5698cf9ccf9f1dacc201e543e: - head/1#content: 002a014e7e8458b3b8ead3398d57ec44 - head/2#content: a06638e99921eb78065ac3a619ac1771 - head/3/0: b9e90bf1a63a5eecff1c04ce6a0ffbd1 - body/0#alt: 82d5c0d5994508210ee02d684819f4b8 - body/1#placeholder: cd95fbdd0533f2c2e8edf9d9bd9aa8df - body/2/0: c7a7930780dad5d71e767f37ac2326dd - body/3/0: d628cb097d9044ef378561f64e1f98fb - body/4/0: bd8287ef5208fab2c7135c96b23bc858 - body/5/0: d5163fc89999a2d44f228083101b8e69 - body/6/0: 2c2e22f8424a1031de89063bd0022e16 - body/7#title: b2c925267351b610426272f239c2b3a8 - body/7/0: 8f89131a66d4659be07cd5af2c7ea898 - body/8/0/0: c95388212de04c55465c62ac964c66a5 - body/8/1/0: dcc3550bcc74d7e7327412e513c8eb34 - body/8/1/1/0: d866e96d27f7542b7cb73e63412bef4e - body/8/2/0: 833024189888c53b1ac7252b130b3e54 - body/8/2/1/0: 65768b2b44b047d9b2a8973e86d27751 - body/9/0/0: cb17d94bae8411c39654b716b33ff80b - body/9/2/0/0: 86a93b8a12c5eb504c42299cee68665e - body/9/2/1/0: 01033784ac6d942fb1c7d61bbe97d473 - body/9/2/2/0: 30489e1eb5d7e0091b90dedf346f936d - body/9/3/0: 487177489aafc9c0243c57ef3850a2d9 - body/10/0: 2a7a34e28f3f10302250ae86500929b3 - body/11/0: c2913b21f14cb26095005282537fc860 - body/14/0/0: 19020b28e83ad145b1271abf4e06e0b1 - body/14/1/0: fe97144fbeb14993d9ede8955b29be05 - body/14/1/1/0: 7459744a63ef8af4e517a09024bd7c08 - 56f7f072bcab520858a247e873141e66: - greeting: 5a06f8dbe2138bc2d66dd20061d3358a - welcome_user: 9894020e8bf63cda177c90913974de4a - items_count.zero: 955c31a42e9ff663a49e69e944c8c537 - items_count.one: 154c8eed472b867c8d5af66d162abd2c - items_count.two: 8d5f050e1b4c80b1cb2dfd5960330dd6 - items_count.few: e76998d93901ca2dbd145315f0026099 - items_count.many: e76998d93901ca2dbd145315f0026099 - items_count.other: e76998d93901ca2dbd145315f0026099 - days_until_event.zero: c36f40b15661634b9d11a6704489bb2c - days_until_event.one: b42325bee976924c2ec6a2e318b1edfd - days_until_event.two: 7f8cb60480d1a0e81b8e0ae0a1d93616 - days_until_event.few: 8860d8b849df0fc9c05a0105686c870a - days_until_event.many: 8860d8b849df0fc9c05a0105686c870a - days_until_event.other: 8860d8b849df0fc9c05a0105686c870a - complex_format: 412e9a53af55fd61a80550c462dfcfcb - date_format: 53fd72141572ffcdb3ebd8e5e6c4388d - aeece0e59000b5e246fcd47641fde067: - title: 18b89a4c985977256f3f4aca14834f58 - description: 4759574560d93c33276f3c57a2d3f003 - field1: f01e599cced8b7d7105329947b5096de - field2: 591116d7c70944a65821b8ac01f30e6a - field3/field4: 18b89a4c985977256f3f4aca14834f58 - 0d1abbacc6d742097863ba4d910983a2: - home/title%2Fmain: 35d8cc80baa8d63dbc854b3674acdfe0 - home/description%2Fdev: c9e612bc3fd041dd984ab3e7f2d77e24 - home/i-am-a-developer: d8feacce28faea3fd4228a1ebcb11473 - home/welcome: 7306095503f36fcb4936811a16c47df4 - home/get_started: e7965bdd92d09d2ccf3ac251624227e3 - home/learn_more: f641a9737a376255c31a3ce6e0d1d802 - navigation/home: 104a3db3b671c04e167eafbe21e57881 - navigation/features: 341ff316a339b106a178f0b8d362951b - navigation/pricing: ce27f1aeacccc542a174c4b2bce022b0 - navigation/about: 944521eeeed2511833d2299931273c71 - navigation/contact: 9afa39bc47019ee6dec6c74b6273967c - navigation/login: 9fb886eff8d1d67d8bb79f5c3f78edde - navigation/signup: a6a0b995463f62ce6a12e37f1d05a9bd - navigation/dashboard: c9380ea68c8c76ea451bd9613329a07c - features/title: 7c7a85024b86e71e87e79fff6870abc5 - features/subtitle: ca32b522547678f6847ae7439e48e3b5 - features/feature_1/title: e65bd67323b805f267405c08e4fc412d - features/feature_1/description: 4d6546ae010e58c476f27879b13e2faa - features/feature_2/title: 6b5898be8657874b5f60ebda418a65f7 - features/feature_2/description: d6b652f2199fd2ebd7e69804a5e24d1b - features/feature_3/title: 9de5f240b7f51eecda6af80a6bdbb1bf - features/feature_3/description: 462066b864b5a21874f9c31c110361ed - features/feature_4/title: e3544a4823498d157686cd0c693809b4 - features/feature_4/description: 10efe7b9052744bfaf5248bb247c79da - pricing/title: 0929298fba7953f20a93b8213593713b - pricing/subtitle: 348d1668e2fa45cdd9b042c1fc9c7053 - pricing/monthly: 818f1192e32bb855597f930d3e78806e - pricing/yearly: 87f43e016c19cb25860f456549a2f431 - pricing/save: af1b6db6602422023a1d3ba63344df3d - pricing/plans/free/name: 0326365539c004f6088656f692602078 - pricing/plans/free/price: c8038ce413d90cb582293b26924bc735 - pricing/plans/free/description: 7ff94676a6c684308298cb0bfad6d49a - pricing/plans/free/features/0: f6078bf94554d405ff06c7e0c53cefc9 - pricing/plans/free/features/1: 2dc6cbdda575d6d562e7f3297ede0e0f - pricing/plans/free/features/2: 204fff311e75b72ed8e62221dce0546c - pricing/plans/free/features/3: 7d6e8763a664c739e4b1b17dcf6b3d24 - pricing/plans/pro/name: 0059ac0aac3f10a46b28c095e697cbbb - pricing/plans/pro/price: e74def9bd64d10e9a0a1106926a895ae - pricing/plans/pro/description: c8b70251766b98913b779b50e92eeb65 - pricing/plans/pro/features/0: 8be6ef15f208d43fb87c62e51af00da5 - pricing/plans/pro/features/1: ec3adcbe735ba24706889efd8752c1b0 - pricing/plans/pro/features/2: 7c20fc1aa298196670f2a91c6bb77957 - pricing/plans/pro/features/3: ba86ddd272252bf41fe76785628abff1 - pricing/plans/enterprise/name: c70474271708e5b27392fde87462fa26 - pricing/plans/enterprise/price: b7b89901f46267f532600a23cfc54ae2 - pricing/plans/enterprise/description: 186523f13794a3b5cb3dc50cf2a3540a - pricing/plans/enterprise/features/0: 816c99ef6f50b3471d212412715912fd - pricing/plans/enterprise/features/1: 2567aeac1b193b0b940e821fa90063d1 - pricing/plans/enterprise/features/2: 146588c6ba10edfeb4946f1abdef7742 - pricing/plans/enterprise/features/3: d499c4094672366e96f5dc38e82765cd - pricing/cta: 5c783951b0100a168bdd2161ff294833 - pricing/contact_sales: 96b007a10422b3b066647330a8d5adf9 - about/title: 8f89131a66d4659be07cd5af2c7ea898 - about/mission: bf81b7a1d23e9d8014e0d55984a6ba89 - about/story: 9f2954e52f013b9f1dbd444b8e90d95f - about/team/title: 3effd2afec9a044956080e5be8065fdd - about/team/members/ceo/name: e04ff15d1dbd70b46a8ab0ce36c39ccd - about/team/members/ceo/role: fd6855a2c35b6dd25a45700d13c109c2 - about/team/members/ceo/bio: 1f2c6b0aa3469367bec699ebb056bbe5 - about/team/members/cto/name: febee8e9ab40b2fe5106d72675228d00 - about/team/members/cto/role: 8969cd6bb5a49670ce1e4388839c0862 - about/team/members/cto/bio: 30c4d245d972ce06dabd0cae2b233aad - about/team/members/head_of_product/name: 2b2bff7382232cb0b641470f30f4fe18 - about/team/members/head_of_product/role: 05fba7c68234b0d185b845021a80d7ef - about/team/members/head_of_product/bio: e4561a5d58a1909620efbd858df86ed4 - contact/title: 2a75337dc9603915c4ec1d1905afb7b9 - contact/subtitle: 92943bc0b5f470330f85467fe82bc627 - contact/form/name: 9368b5a047572b6051f334af5aa76819 - contact/form/email: e7f34943a0c2fb849db1839ff6ef5cb5 - contact/form/subject: de5b885eb327b2f233f3b67aab4c4c0a - contact/form/message: f2f72126bd244cfc534eab395e054362 - contact/form/submit: 487177489aafc9c0243c57ef3850a2d9 - contact/success: d1929bed086d2177e153075050a259e7 - contact/error: 2db16f3221be8e8099ac3fee6d2cbf93 - auth/login/title: 88f0beb509622ce2f3a22128a9ec9ba5 - auth/login/email: e7f34943a0c2fb849db1839ff6ef5cb5 - auth/login/password: 223a61cf906ab9c40d22612c588dff48 - auth/login/forgot_password: 707454f0ef158b81060a11f2d9cbce57 - auth/login/submit: 9fb886eff8d1d67d8bb79f5c3f78edde - auth/login/no_account: 613efdc05ae6d04b7136d199645c56ac - auth/login/signup: a6a0b995463f62ce6a12e37f1d05a9bd - auth/signup/title: bc53a57281d2701563f94f3169518028 - auth/signup/name: f45991923345e8322c9ff8cd6b7e2b16 - auth/signup/email: e7f34943a0c2fb849db1839ff6ef5cb5 - auth/signup/password: 223a61cf906ab9c40d22612c588dff48 - auth/signup/confirm_password: b5cdb861d8deb598b0613d48098b82b6 - auth/signup/terms: 22fb0035ec539f1d7bc199fa9d611971 - auth/signup/terms_link: 5add91f519e39025708e54a7eb7a9fc5 - auth/signup/privacy_link: 7459744a63ef8af4e517a09024bd7c08 - auth/signup/submit: a6a0b995463f62ce6a12e37f1d05a9bd - auth/signup/has_account: 699043a787e26ec2ecad53f52df28d5b - auth/signup/login: 9fb886eff8d1d67d8bb79f5c3f78edde - auth/forgot_password/title: 93a0b939aac3e0d9e7df4ed63a7134ec - auth/forgot_password/email: e7f34943a0c2fb849db1839ff6ef5cb5 - auth/forgot_password/submit: f71dc8b110edfd74e603d62945dc5d64 - auth/forgot_password/back_to_login: 6bcc9859839f32dc2b4295e1565919a4 - dashboard/welcome: 82fa4700873c36043a045d691d306ed6 - dashboard/projects/title: 8b59e61cda8b09f7be64778e309ed0e0 - dashboard/projects/create: e4855ea534ccbd5bfcd3c10237432f3d - dashboard/projects/empty: 411e7ff8ea7a82c9492b1dc296303d10 - dashboard/projects/search: f61e73deb2e57b981691f336552856d4 - dashboard/stats/words_translated: eb213a0ff24b65dc52ca5b39be669c55 - dashboard/stats/languages: 2d2a54a7cbbf640ba2aff643a8a3c7c1 - dashboard/stats/files: aee803d2f576ac1200c73b691191a916 - dashboard/stats/last_updated: e1c731316d903fa762f5c302fa907756 - dashboard/recent_activity/title: d4b07b3b4faedbd20762ab8a665d979d - dashboard/recent_activity/empty: c7b64228ee16c8ee0142d331af70b079 - errors/not_found/title: 97612e6230bc7a1ebd99380bf561b732 - errors/not_found/message: 65ad307ba26227fe44343f17e52138de - errors/not_found/back_home: 377f3be7cfb6c1ffb55a75d90ce91f2f - errors/server_error/title: d574aa7e2d84d112dc79ac0e59d794cf - errors/server_error/message: 4bad29ff62b13c4ef76da30ed8c91e3f - errors/server_error/contact_support: 32a4dee2033635e334a5f4d34724e3e0 - errors/unauthorized/title: 556fa31baa40c7b7cd008f594de36a63 - errors/unauthorized/message: 759ca522663d8f628718332f756dd6c4 - errors/unauthorized/login: 9fb886eff8d1d67d8bb79f5c3f78edde - errors/forbidden/title: 589456a5c4103e29c44e9df16a4eaf82 - errors/forbidden/message: a602e7d4046ff33fb1e616839e4ebf3d - errors/forbidden/contact_admin: e4e638ecfe4485903a184820ac516bd4 - common/loading: 82b4ea7ed1439094d7c4be13aaba9a66 - common/save: f7a2929f33bc420195e59ac5a8bcd454 - common/cancel: 2e2a849c2223911717de8caa2c71bade - common/delete: 8bcf303dd10a645b5baacb02b47d72c9 - common/edit: eee7f39ff90b18852afc1671f21fbaa9 - common/view: 36a9b5e3dc153c036d320460d72a03c3 - common/search: 49dd6c21604b5e8d4153ff1aff2177e1 - common/filter: 626325a05e4c8800f7ede7012b0cadaf - common/sort: 8b928fb3b68d93ccda40bed22261e796 - common/next: 89ddbcf710eba274963494f312bdc8a9 - common/previous: 25c58dd62f190368a3d2c4c97b385ea9 - common/submit: 7c91ef5f747eea9f77a9c4f23e19fb2e - common/confirm: 90930b51154032f119fa75c1bd422d8b - common/yes: ec580fd11a45779b039466f1e35eed2a - common/no: 8c708225830b06df2d1141c536f2a0d6 - common/success: e7c9fe48ac87b4a2fbf184d02f06d798 - common/error: aa0e3e08c5dae936f353d1a9ef5e9fa9 - common/warning: f3cd3c6fc56e920f60d59bb4596cd4f7 - common/info: 0b59a25a921d0209230247cb3e13cdd0 - common/required: 04d7fb6f37ffe0a6ca97d49e2a8b6eb5 - common/optional: 396fb9a0472daf401c392bdc3e248943 - common/learn_more: e598091d132f890c37a6d4ed94f6d794 - common/show_more: 36b0433c56ba1e0f2deae76b8e04a557 - common/show_less: 377af19e130feb94abe6fc3d281b55fd - footer/copyright: e0a8180e2cb2d7501cb829f6bd5f2629 - footer/terms: 5add91f519e39025708e54a7eb7a9fc5 - footer/privacy: 7459744a63ef8af4e517a09024bd7c08 - footer/cookies: 3729dde157adf062b3f07301ae3cd596 - footer/contact: 2a75337dc9603915c4ec1d1905afb7b9 - footer/social/follow_us: 778f7a4744f77dbcbd31a8c778cb5209 - footer/social/twitter: ba3d4aed69a50759b53a0b7c319a3ad9 - footer/social/facebook: ac8afe226a7424849c247e6a9d566f64 - footer/social/linkedin: f29b78f253094277c2e9ef79d10b5e4f - footer/social/github: 6e1cf3c00fa6fbe24afcc78ea3b5f3e4 - 250a4a9b39c8b90557bd4f761e5f3cbb: - app.name: 972598469bf28a28203b84af0ea8e309 - common.cancel: 2e2a849c2223911717de8caa2c71bade - common.done: ffd408fa29d5bc9039ef8ea1b9b699bb - common.ok: e2d6579a83aba07c4180c21c5fe9893d - common.save: f7a2929f33bc420195e59ac5a8bcd454 - error.generic: c62a7718d9a1e9c4ffb707807550f836 - error.network: bc18e50c89e65882c2487c6991780277 - home.greeting: e6469f5b6b8aab5becf89382746dc444 - home.todayTasks: 58eb058faadb7d9817541a7be51e46c9 - home.viewAll: bd391a54df1af704b0842fcaea2fa14d - login.createAccount: 3c3c9666b2acc1404eaa89e34e17f946 - login.email: 0ee22bbbe989a0c61a18023407d12dc2 - login.forgotPassword: 87302ecbbfead42d1abecddd442ad77b - login.password: 223a61cf906ab9c40d22612c588dff48 - login.signIn: ec7b8f314fe9bc6591006707484ede61 - onboarding.description: bcf7b485d35b9bb1de76e350bd650211 - onboarding.getStarted: 1d5f030c4ec9c869e647ae060518b948 - onboarding.welcome: 3557d4c3e3740fd97f0921c371fbd22d - pluralized.items/one: 1be333e5f10c4a004ac3efac31b25886 - pluralized.items/other: ecb3f18dc6a5e7b3e1d9afe7ef62cf07 - settings.account: 01215c12fb1cdb93bd0c84c1382bef56 - settings.appearance: cdd8c41c5fb859234e8a603544fce631 - settings.darkMode: c81aa352f80642b6d57d1d52bcf5c2a2 - settings.logout: 0a29c741e0a1f63184ee7b85ce2da68c - settings.notifications: c52df856139b50dbb1cae7bfb1cf73bb - settings.title: 8df6777277469c1fd88cc18dde2f1cc3 - task.complete: 4e242ba7b6cae91dddb62db40bfa2539 - task.delete: e0aba7e92012cea3849235359c9dd2ab - task.due: befea6e44df8349e641ec4f871188a3b - cd761e96e923fc52320b39dc7a0089c8: - "%25(counter)s%20member/singular": 9ad7b9f2910c1d9cf11d67f48d4d0471 - "%25(counter)s%20member/plural": acd07817bec74961e42882533ada9202 - 50315facd0071939973b7e534c3743b6: - items_count/NSStringLocalizedFormatKey: 616c996ac6538f31d31937a9187f26c0 - items_count/items/NSStringFormatSpecTypeKey: 8cc03ef30ad5b2d8e27f3612627d932e - items_count/items/NSStringFormatValueTypeKey: 43427fccc66cbcc5b7e93b12f078b1d2 - items_count/items/zero: 955c31a42e9ff663a49e69e944c8c537 - items_count/items/one: 154c8eed472b867c8d5af66d162abd2c - items_count/items/two: 8d5f050e1b4c80b1cb2dfd5960330dd6 - items_count/items/few: 74e296c76396ac5c4b6e8f3bf3a6d02d - items_count/items/many: 74e296c76396ac5c4b6e8f3bf3a6d02d - items_count/items/other: 74e296c76396ac5c4b6e8f3bf3a6d02d - days_until_event/NSStringLocalizedFormatKey: 09e8eb287d7e597de0ff05a630b09396 - days_until_event/days/NSStringFormatSpecTypeKey: 8cc03ef30ad5b2d8e27f3612627d932e - days_until_event/days/NSStringFormatValueTypeKey: 43427fccc66cbcc5b7e93b12f078b1d2 - days_until_event/days/zero: c36f40b15661634b9d11a6704489bb2c - days_until_event/days/one: b42325bee976924c2ec6a2e318b1edfd - days_until_event/days/two: 7f8cb60480d1a0e81b8e0ae0a1d93616 - days_until_event/days/few: 2e421cd13245d454ae47fb1ef5833c6e - days_until_event/days/many: 2e421cd13245d454ae47fb1ef5833c6e - days_until_event/days/other: 2e421cd13245d454ae47fb1ef5833c6e - greeting: 5a06f8dbe2138bc2d66dd20061d3358a - welcome_user: 5e708a6af9b86f8aa4d9bd9ea571adad - complex_format: 9442e21617626db280d376872a8bae6f - date_format: c4137fde368529804b9c43edb293f521 - multiline_html: a2f5d47387c8011c0dccc58ceaa1cb8c - b05b783b3d24ee943d83ccd8e274814d: - home/title%2Fmain: ab3b60217dae94fc3f76ea0c161fe122 - home/description%2Fdev: c9e612bc3fd041dd984ab3e7f2d77e24 - home/i-am-a-developer: d8feacce28faea3fd4228a1ebcb11473 - 9c4e19808888b454eb5178a0ab79e392: - greeting: 5a06f8dbe2138bc2d66dd20061d3358a - welcome_user: 5e708a6af9b86f8aa4d9bd9ea571adad - complex_format: 9442e21617626db280d376872a8bae6f - date_format: c4137fde368529804b9c43edb293f521 - multiline_html: a2f5d47387c8011c0dccc58ceaa1cb8c - items_count_zero: 955c31a42e9ff663a49e69e944c8c537 - items_count_one: 154c8eed472b867c8d5af66d162abd2c - items_count_two: 8d5f050e1b4c80b1cb2dfd5960330dd6 - items_count_few: 74e296c76396ac5c4b6e8f3bf3a6d02d - items_count_many: 74e296c76396ac5c4b6e8f3bf3a6d02d - items_count_other: 74e296c76396ac5c4b6e8f3bf3a6d02d - days_until_event_zero: c36f40b15661634b9d11a6704489bb2c - days_until_event_one: b42325bee976924c2ec6a2e318b1edfd - days_until_event_two: 7f8cb60480d1a0e81b8e0ae0a1d93616 - days_until_event_few: 2e421cd13245d454ae47fb1ef5833c6e - days_until_event_many: 2e421cd13245d454ae47fb1ef5833c6e - days_until_event_other: 2e421cd13245d454ae47fb1ef5833c6e - 81c53af057228d439caa562136986947: - home/title%2Fmain: ab3b60217dae94fc3f76ea0c161fe122 - home/description%2Fdev: c9e612bc3fd041dd984ab3e7f2d77e24 - home/i-am-a-developer: d8feacce28faea3fd4228a1ebcb11473 - c3310a591ea9d93d5ea83856a1cde32d: - greeting: 5a06f8dbe2138bc2d66dd20061d3358a - welcome_user: 9894020e8bf63cda177c90913974de4a - items_count/zero: 955c31a42e9ff663a49e69e944c8c537 - items_count/one: 154c8eed472b867c8d5af66d162abd2c - items_count/two: 8d5f050e1b4c80b1cb2dfd5960330dd6 - items_count/few: e76998d93901ca2dbd145315f0026099 - items_count/many: e76998d93901ca2dbd145315f0026099 - items_count/other: e76998d93901ca2dbd145315f0026099 - days_until_event/zero: c36f40b15661634b9d11a6704489bb2c - days_until_event/one: b42325bee976924c2ec6a2e318b1edfd - days_until_event/two: 7f8cb60480d1a0e81b8e0ae0a1d93616 - days_until_event/few: 8860d8b849df0fc9c05a0105686c870a - days_until_event/many: 8860d8b849df0fc9c05a0105686c870a - days_until_event/other: 8860d8b849df0fc9c05a0105686c870a - complex_format: 412e9a53af55fd61a80550c462dfcfcb - date_format: 53fd72141572ffcdb3ebd8e5e6c4388d - e6566b2d0ffb4792b287da43da041eca: - greeting: 5a06f8dbe2138bc2d66dd20061d3358a - welcome_user: 9894020e8bf63cda177c90913974de4a - items_count/zero: 955c31a42e9ff663a49e69e944c8c537 - items_count/one: 154c8eed472b867c8d5af66d162abd2c - items_count/two: 8d5f050e1b4c80b1cb2dfd5960330dd6 - items_count/few: e76998d93901ca2dbd145315f0026099 - items_count/many: e76998d93901ca2dbd145315f0026099 - items_count/other: e76998d93901ca2dbd145315f0026099 - days_until_event/zero: c36f40b15661634b9d11a6704489bb2c - days_until_event/one: b42325bee976924c2ec6a2e318b1edfd - days_until_event/two: 7f8cb60480d1a0e81b8e0ae0a1d93616 - days_until_event/few: 8860d8b849df0fc9c05a0105686c870a - days_until_event/many: 8860d8b849df0fc9c05a0105686c870a - days_until_event/other: 8860d8b849df0fc9c05a0105686c870a - complex_format: 412e9a53af55fd61a80550c462dfcfcb - date_format: 53fd72141572ffcdb3ebd8e5e6c4388d - decd5fd51d99ea132f05fdfdb5d7eada: - sourceLanguage: a422f993d9220fc3488259e5e0426e80 - resources/core/hello/source: f01e599cced8b7d7105329947b5096de - resources/core/bye/source: 87fa86f9031290a9c591f91cff393930 - resources/core/expr/source: b96f42288414c31f9016040e21f7ff7f - resources/core/dupA/source: 59a5c5f4cf42c5d5e87fdbd711c2aab7 - resources/core/dupB/source: f4d018cabf6eeab3f1c879c1d8eed6de - resources/core/settings/groupUnits/cta/groupUnits/ctaTitle/source: 5a9263f67cc7632eb0e3938304b03cb8 - resources/core/settings/groupUnits/cta/groupUnits/ctaBody/source: ea0bce46ca0a7d95ea6be8ba24e10131 - resources/core/skeleton/source: 787b64864ffaef3e1c4b5657b3ce71b4 - resources/marketing/heroTitle/source: 7b843029e2f0de6821d39fd42595d9e8 - resources/marketing/heroSubtitle/source: aa6d22f1442eea0e9724d2f560329778 - 2be4c282da9773e3b7b07aaee059e5a1: - key1: 0468579ef2fbc83c9d520c2f2f1c5059 - key2: b48a4cb78277d72905362f8d2dfa1e88 - key3: 54a9e730e88fb16291b852274d433923 - key4: 10627fcc465897af0f5e1bba042685f9 - key5: b328c432cee108a87a92f05258b6a651 - key6/key7: 9da96ad1d5c544070ac5e268de77fb48 - 1d941f3fcb422e74ccb8adb0f899afad: - md-section-0: d53f61b8c8922fb62d9df5678d9b44a8 - md-section-1: 98aec271471bedce0e12b530c7060827 - md-section-2: 9e5a786192608844493dfbb6e4100886 - md-section-3: 1a5299c38bb20c1b8af0e64e33d7b2b0 - md-section-4: 51adf33450cab2ef392e93147386647c - md-section-5: e56cc804e3e06b5f5fb2484e88c18adc - md-section-6: 0ea86a3338305070c865e8fe138da890 - md-section-7: bbabf7f391569a72099001e3d81eb251 - md-section-8: 36cbfd93f42528edce4faac2ac3c2c12 - md-section-9: a1c50054ab23d70be8d453789b214580 - md-section-10: 51adf33450cab2ef392e93147386647c - md-section-11: cb596c9608828f7b87a0ab8fa37beb07 - fm-attr-title: f3469c4e3d3377c39a705c844930b3a5 - fm-attr-description: 2e988d98001e44997a3f5fa3fb487ca6 - fm-attr-author: ec8c8711fce61265a4fe296ce2ba3b6f - fm-attr-tags: 313ac6f17ee08e4f4a6a2ca95e5ae024 - cba6bb8409869d70442daa54e273a816: - welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 - error.validation: 09e95617fe980e06fe01dcb814145529 - button_text: 3cfba90b4600131e82fc4260c568d044 - save_button: d895276cde226e9225eca1e74aa799f4 - status_message: c5febb38cd2357e1ae0ac7824c52b11d + 8d96b892e6b2722deed5b45d9a3f5654: + mjml/mj-head/0/mj-title/0: c514a686b50f7158b2dd08ea65d3bc8a + mjml/mj-head/0/mj-preview/0: 4ce14f6062c814cbdcdf8b0a3cb094d3 + mjml/mj-body/0/mj-section/0/mj-column/0/mj-image/0#alt: 82d5c0d5994508210ee02d684819f4b8 + mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/0: b320b02942617a70dcbd1beac61da11a + mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/1: 028311348a5aeefea365fdf422a3fb21 + mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/2: 0dfdc9b80ee70fcc2b28d0e81e03fabc + mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0#title: 5c96f738bd6153ee07b72094cdfd2b98 + mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0#aria-label: 42dcab68d931f9145d9b6d76740a5c66 + mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0: dc8001d5c58294d22fe0b0e6118dbfb7 + mjml/mj-body/0/mj-section/3/mj-column/0/mj-text/0: a18f14ab69467cbdbe467df6255cfda7 + mjml/mj-body/0/mj-section/3/mj-column/0/mj-text/1: e83236e98aad1937bc99a47cff159caa + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/0#title: 180bd8aa700f6cedf65e0a2079503cea + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/0#alt: ac8afe226a7424849c247e6a9d566f64 + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/1#title: ea4c2a7a9a60cbb0f8f9632222a46abe + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/1#alt: ba3d4aed69a50759b53a0b7c319a3ad9 + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/2#title: 754efa5f98f51c510ff268e217877d8b + mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/2#alt: c9555810826c30d571ffae869a236494 + mjml/mj-body/0/mj-section/4/mj-column/0/mj-text/0: 9ac6c625c7af33d70634846c8c9d11b0 8a29de2ca48b6f70dc45a19eab5c4fce: sourceLanguage: cdbbce7452d5b27f1b4ad1eec67ea0fb resources%2Fmessages.properties%2Fwelcome_message%2Fsource: 0468579ef2fbc83c9d520c2f2f1c5059 @@ -408,6 +26,12 @@ checksums: resources%2Fmessages.properties%2Fbutton_text%2Fsource: 3cfba90b4600131e82fc4260c568d044 resources%2Fmessages.properties%2Fsave_button%2Fsource: d895276cde226e9225eca1e74aa799f4 resources%2Fmessages.properties%2Fstatus_message%2Fsource: c5febb38cd2357e1ae0ac7824c52b11d + cba6bb8409869d70442daa54e273a816: + welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 + error.validation: 09e95617fe980e06fe01dcb814145529 + button_text: 3cfba90b4600131e82fc4260c568d044 + save_button: d895276cde226e9225eca1e74aa799f4 + status_message: c5febb38cd2357e1ae0ac7824c52b11d ff69fd831da0e77f25d19bc16ecd1955: app_name: 7dc70110429d46e3685f385bd2cc941c welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 @@ -424,20 +48,30 @@ checksums: mixed_items/1: 9823a57cbe6e6e84c1d025ce24a1eec4 terms_of_use_raw: e3048f75742e66473369a83c10ea95c3 view_your_options: 416ed59ca3254f9da0d565c7c75f9033 - df547e152136431bbc29e26ae0eeabb4: - title: 0468579ef2fbc83c9d520c2f2f1c5059 - description: 49f8864eb0e53903f04532bf33e1e4fa - version: 54a9e730e88fb16291b852274d433923 - support_email: 10627fcc465897af0f5e1bba042685f9 - emoji: b328c432cee108a87a92f05258b6a651 - author/name: febee8e9ab40b2fe5106d72675228d00 - contributors/0/name: e80d4063a32adaad7b0a82b0bcc10551 - contributors/1/name: b2bca2fa3c890618e56d07473f26ead3 - messages/0: d1c3a9f35e377554a4ccaa467ca26614 - messages/1: 0468579ef2fbc83c9d520c2f2f1c5059 - config/theme/primary: 7535a3779d6934ea8ecf18f5cb5b93fd - mixed_array/0: 001b5b003d96c133534f5907abffdf77 - mixed_array/3/nested_message: 5f0782dfc5993e99890c0475bc295a30 + 26c0d1830ada5fc2893012ae36df612d: + welcome_message: 1308168cca4fa5d8d7a0cf24e55e93fc + button_save: f7a2929f33bc420195e59ac5a8bcd454 + error_invalid_email: 8de4bc8832b11b380bc4cbcedc16e48b + product_name: d3d99b147cc363dc6db8a48e8a13d4c1 + new_feature: 7cd986af1fe5e89abe7ecffba5413110 + 0f98b7647666155847e3e788a431b083: + text_0: e4d2da607604b3fda41eef5e0dd35faa + text_1: 69eb28c44f7168b1df0455ad2a62588c + text_2: bff335b01588a8db802bd193c725ec11 + text_3: 0744639a7ac440afe0d792ea79c54512 + text_4: b4cc462fb3a00d2f60deefe548c10a33 + text_5: d0fd310aef9cf3c5827f1db4b0c098a1 + text_6: 85bb1f6fb66b5ab65a9c61469183236e + text_7: bdbc827b3d224e03394dfd56304500f2 + text_8: 5e8497af456decf6cf716c0a23f1dbc2 + text_9: d572e25ed81420669e65c03925da1001 + text_10: 2cf6537fb69cdd2eb030e55bf4223b93 + text_11: ec7b8f314fe9bc6591006707484ede61 + text_12: c2460fb2a7887fdf2d68db2b553a4338 + text_13: 3abe623951250bd24a9d7799415761ab + text_14: 988be328b82702586f2cd541858710fe + text_15: b2328773b0ef0699fd5791055c5cf9e2 + text_16: 92acabd12cd9b63c825294c54fcbc806 92012b8cd020f7be41f85bab88f5d251: welcome_message: 9c56d00796c3c7facba6a25275de5b7b login_button: 0029e5a35676c0051e761fcd046ef9ee @@ -451,123 +85,6 @@ checksums: greeting_with_name: 218521f06746e82ba44d68c8a5bb210c item_count: d8d083b56bc155cf0997ea6ae989b83f user_status: 903b5a6edde5368dd9089accdc1b1f9d - 60e3fb38a8f4172248a877262283854c: - app.title: 7dc70110429d46e3685f385bd2cc941c - app.description: e13baa1e885129d9328e216ff534761b - user.greeting: 0468579ef2fbc83c9d520c2f2f1c5059 - user.farewell: 118794a2b84f7bfb4b4ce602ed463b0f - error.message: a3cd2f01c073f1f5ff436d4b132d39cf - error.notFound: 97612e6230bc7a1ebd99380bf561b732 - database.host: da86e4fc0c04d82c87006dc71cea7e97 - notification.success: 3b7a8b0aa23977592d4270ea136a390c - notification.warning: c38895f731311cefacee9e8d7d10fc49 - 85a42d442df1a15336ea9c1ccb451a18: - Welcome/singular: 3180ad6b8de344b781637750259e0f53 - Home/singular: 104a3db3b671c04e167eafbe21e57881 - You%20have%20%25d%20message/singular: 1691abfe2c5d017cda86e298d34f3524 - You%20have%20%25d%20message/plural: 2d37831bf51cc2cf75e812c0e61c6861 - Save/singular: f7a2929f33bc420195e59ac5a8bcd454 - Cancel/singular: 2e2a849c2223911717de8caa2c71bade - Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9 - Name/singular: 9368b5a047572b6051f334af5aa76819 - Email%20Address/singular: 0ee22bbbe989a0c61a18023407d12dc2 - Message/singular: f2f72126bd244cfc534eab395e054362 - Loading.../singular: 82b4ea7ed1439094d7c4be13aaba9a66 - Success!%20Changes%20saved./singular: 906371aaeec474803e22ae959605dad8 - Error%3A%20Request%20failed./singular: cdeaab2374e34c0e396cdb2596a9824e - Add%20to%20Cart/singular: c93a29ccf502ff71bf08924dcdea9179 - Out%20of%20Stock/singular: 6673fc95c2cee3c713e0d60c8184e289 - Price%3A%20%24%25s/singular: a860f7b395e4a9d916a48717f9f8837a - fb1f33e873b2ca499a48c636071081ae: - navigation/home: 104a3db3b671c04e167eafbe21e57881 - navigation/about: 8f89131a66d4659be07cd5af2c7ea898 - navigation/contact: 2a75337dc9603915c4ec1d1905afb7b9 - navigation/services: 999f32026e64978cb3ec794a496b0bb8 - forms/title: ac85dea7c7f0bf1cd7d48cc1b4da3acc - forms/nameLabel: 03c6ae7996d5841f743cd406b4eff72d - forms/emailLabel: 0ee22bbbe989a0c61a18023407d12dc2 - forms/messageLabel: 1e460d0909502d0e94b9be562643af0d - forms/submitButton: 487177489aafc9c0243c57ef3850a2d9 - forms/successMessage: a0a7aa980dffa31d4d194af718a917b3 - 11b3ea8486d8e09d2bf06db1811e0490: - welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 - ae4fae82257615e5c22b34de033c7eeb: - welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 - login_button: 0029e5a35676c0051e761fcd046ef9ee - error_message: a3cd2f01c073f1f5ff436d4b132d39cf - user_profile_title: bee775ff7216747b2111e93cefa57ddc - quote_example: c519c83fe2629c0e9a6e7a14f64b6317 - newline_example: ae9313a2231a16f17e2367a4e5b322ee - backslash_example: acf69a7273edf9f932f66027f699bbbe - mixed_escapes: 9285b600baf307f7c060e20dc5778fad - tab_example: 1451b8323511459dac68316a2594bb82 - multiline_literal: a4c5d1c388a06e29d96833e4d2f14a26 - multiline_mixed: f5d741606567d78281bc455074eb8f6c - multiline_with_quotes: c82ec05ec488644808917b9c958da8cc - after_comment: b7c19db10622cb67d4dd28270e85a428 - after_multiline_comment: 759d0ffce80451996a5a45b33a0870cc - long_value: a54e8485e571c671e35865ba72cbcaf5 - unicode_example: 2de42b1aef6d20b314928b9c2554759d - emoji: 1b387c2b5ce6c2cd608081ebcb5e6a94 - accents: 8c054e17f9b960d9317ca110a6fedf8c - spaces_only: 8af60e2ee58a2e1e42071066e9c225da - many_quotes: e2ff57b8058ab2c03c5b07cf901a7a48 - missing_semicolon: b2b5f0c3f552a348188de51bd4fcf511 - settings_title: 8df6777277469c1fd88cc18dde2f1cc3 - save_button: f7a2929f33bc420195e59ac5a8bcd454 - 48bbac9fb7941a5da53508f37bfade60: - title: 7dc70110429d46e3685f385bd2cc941c - description: 0468579ef2fbc83c9d520c2f2f1c5059 - welcome_message: d1c3a9f35e377554a4ccaa467ca26614 - user_profile/display_name: febee8e9ab40b2fe5106d72675228d00 - user_profile/bio: 155ddcb7c93493ac72a37074eea0a653 - navigation_items/0: 104a3db3b671c04e167eafbe21e57881 - navigation_items/1: 944521eeeed2511833d2299931273c71 - navigation_items/2: 9afa39bc47019ee6dec6c74b6273967c - product/name: ed21de171d538a49db999c47875f75a5 - product/tagline: b7ac41680e82d75ae7f5774f7ceef1b4 - product/features/0: c916ba887951a02793ff851853fd964f - product/features/1: 1c60a04d6890c6ec910a7f2e6ec0ae7b - complex_structure/level_one/level_two/message: b53034560bf657106e5aaea9160e357e - 32707dfb19e6dfad9a1af32087b6f9f3: - welcome_message/NSStringLocalizedFormatKey: f142738692c027d95dce521e7cb29c82 - welcome_message/user_count/NSStringFormatSpecTypeKey: 8cc03ef30ad5b2d8e27f3612627d932e - welcome_message/user_count/NSStringFormatValueTypeKey: fe9efa39a6fd9f10358f43f00e0ab82b - welcome_message/user_count/zero: 3d4643c483a49c2f61e17aaa8620e71e - welcome_message/user_count/one: 3b547431ab12f0fba84307e6a81109d8 - welcome_message/user_count/other: cb01ae522c991a2ad651b4049339c48a - notification_count/NSStringLocalizedFormatKey: e01fd796051132b678d7574a11e9a944 - notification_count/count/NSStringFormatSpecTypeKey: 8cc03ef30ad5b2d8e27f3612627d932e - notification_count/count/NSStringFormatValueTypeKey: fe9efa39a6fd9f10358f43f00e0ab82b - notification_count/count/zero: ac0137deebf6e2b972c6c714dd8658ee - notification_count/count/other: 9b350a78e1c499b9ab69eb330162c8ee - d5ff4a01e7a8f148b46bb86afc0e9ace: - "0": 0468579ef2fbc83c9d520c2f2f1c5059 - "1": d1c3a9f35e377554a4ccaa467ca26614 - "2": 769caedbdc5246bb9fee615739534bbd - 3/welcome_message: 8778dc41547a2778d0f9482da989fc00 - 4/error_text: a3cd2f01c073f1f5ff436d4b132d39cf - 5/navigation/home: 104a3db3b671c04e167eafbe21e57881 - 5/navigation/about: 944521eeeed2511833d2299931273c71 - 5/navigation/contact: 9afa39bc47019ee6dec6c74b6273967c - 6/forms/login/username_label: 2ee65bc2dd2f12cf2672f95b2a054bf8 - 6/forms/login/password_label: 223a61cf906ab9c40d22612c588dff48 - 6/forms/login/submit_button: ec7b8f314fe9bc6591006707484ede61 - 7/mixed_content/title: 8df6777277469c1fd88cc18dde2f1cc3 - 7/mixed_content/description: 063afcd2ea84a82a1acc8f5c9fd8e42f - f96a3f7181c8ce89f928d418873259aa: - welcome: 0468579ef2fbc83c9d520c2f2f1c5059 - description: 49f8864eb0e53903f04532bf33e1e4fa - button/submit: 7c91ef5f747eea9f77a9c4f23e19fb2e - button/cancel: 2e2a849c2223911717de8caa2c71bade - messages/0: 97a8db12c3955a85c4f50e3951c91a40 - messages/1: 986a434e3895c8ee0b267df95cc40051 - 26c0d1830ada5fc2893012ae36df612d: - welcome_message: 1308168cca4fa5d8d7a0cf24e55e93fc - button_save: f7a2929f33bc420195e59ac5a8bcd454 - error_invalid_email: 8de4bc8832b11b380bc4cbcedc16e48b - product_name: d3d99b147cc363dc6db8a48e8a13d4c1 - new_feature: 7cd986af1fe5e89abe7ecffba5413110 9549584f354a859ae39756a4d4e546a6: head/0: 7d39787547365ee4194f29f3f54e5c05 head/1#content: 49f8864eb0e53903f04532bf33e1e4fa @@ -586,256 +103,6 @@ checksums: body/8#title: d656021ba5f485fa1a82f8aac6ecc5de body/8: 1c6856488bd34ad87fcacce2d8e66a0b body/9: 862964e6cd73cdffdcac622406c6bac9 - 43e407a3798eb45c648586dfaabcc0bf: - meta/title: a4bdd0dee24f8318f3300dcae130a353 - meta/description: 609213841f122e494f62262618ee4761 - meta/author: f3f7164b5963b4da6cd31a2ec0251630 - content/0: 8a8520492d23503da5691602e60bd22a - content/1: 1fc859854cda505b2a94a04c8b09ab43 - content/2: 8add667f2a1d5d791a64b50bde54fa59 - content/3: e6e34c4c92eda512ec209266abe8e074 - content/4: 07f1896ad050b9606d7674f70d847818 - content/5: bd4d40a4f0cc92ac8a880c8d9ce8b43d - content/6: 3036a07a887121ea080427d84fc80912 - content/7: f555318416c5c5388c1d961ef02f5955 - content/8: 90e02688ab103de60e42c70ece7efc4d - content/9: 8c5be3cd002a3a194c991821e0182e08 - content/10: 3495801a7461ac5ea8d78369873a5409 - content/11: d444739ce3d48afb7976067c67149a9e - content/12: 5f02c0a3b6385f80bdd08cf7e2d8c04d - content/13: 0a15fd446b87d907f58c303aece0882b - content/14: 778ed0aa1f81768280a23afe559c55f7 - content/15: fa244af2d8e558d6c3644ff8c1a64562 - content/16: 14f593e7cf3b3df84a21e17db318912e - content/17: 5f42d26a42aa29be063019eea27ad07c - content/18: 48bb7e89e72d68d6de12f5cdac64fc18 - e6d8e00051ea40ca138a9549ed52e1c6: - navigation/home: 104a3db3b671c04e167eafbe21e57881 - navigation/about: 7ed93e7bbfca42a405d61ea3c2791aae - navigation/contact: 9afa39bc47019ee6dec6c74b6273967c - navigation/services: 8ea10b45b9abab2a3bfc3c07e1c9cdc6 - navigation/forms/title: cd1568dd5f8241c9429dc634de250ef4 - navigation/forms/name_label: b00c01deec0af9a441331a5134210de1 - navigation/forms/email_label: 3ba3f099b1b9be6c35ad797da660cb9f - navigation/forms/message_label: f2f72126bd244cfc534eab395e054362 - navigation/forms/submit_button: da352018f0db23d97405e3e44ccfe50d - navigation/forms/success_message: a0a7aa980dffa31d4d194af718a917b3 - navigation/inflections/gender/f: 1cdef9a43e68074eae7dce0248f7e5a9 - navigation/inflections/gender/m: 91f7f601c08b37b397f14f952416623f - navigation/inflections/gender/n: cab8f0be0df82bac41435dee4d2eb1df - navigation/inflections/gender/female: f4adbe8df79a872d3c16329a7e7a361a - navigation/inflections/gender/male: 9ebdcb660f503bb2618ae7ae086617e2 - navigation/inflections/gender/neuter: 603743850a2510aaa6a5eb9dbfbe7416 - navigation/inflections/gender/F: f4adbe8df79a872d3c16329a7e7a361a - navigation/inflections/gender/M: 9ebdcb660f503bb2618ae7ae086617e2 - navigation/inflections/gender/N: 603743850a2510aaa6a5eb9dbfbe7416 - navigation/inflections/gender/default: 453a466f60641d9934bbee33dc4cd2b6 - date/abbr_day_names/0: b29e2b72f74643194654961775178fec - date/abbr_day_names/1: b750502bab403473852a20cea73dcf2c - date/abbr_day_names/2: 4786ce2a2427ad9183ef1a6f7385fb24 - date/abbr_day_names/3: ce25e3f9bfc6cfdc6017f791045da079 - date/abbr_day_names/4: 4029492def3bd66fa5a9d1c693743b62 - date/abbr_day_names/5: 0f0718f17b758ea9d5167c120c230be6 - date/abbr_day_names/6: 3b32ac0f13383ecdf580b4db09773fda - date/abbr_month_names/1: 268e5f1e700c23c50b88e8c6aa754c88 - date/abbr_month_names/2: c111dae80531454da886782893e71541 - date/abbr_month_names/3: 3055ece906ba97d9b5050b4385d873a9 - date/abbr_month_names/4: 7a76ba706f71adc981bc050190ccc63f - date/abbr_month_names/5: 320223c5afaaf28560a3a84d3527d51c - date/abbr_month_names/6: 47f51f7cecc9bd30eef853748a40f2e7 - date/abbr_month_names/7: 5088467e6b771d6f02e1d4ea3550dd96 - date/abbr_month_names/8: 160006d60703204ab06369352f5f2520 - date/abbr_month_names/9: 91cac5f11e31c9907ea26a79fe5df889 - date/abbr_month_names/10: 384ae5bd38358c3f8db4560d59405c70 - date/abbr_month_names/11: a87c80252a5b03a82a0d16c510b5ed12 - date/abbr_month_names/12: 2a7ffd15bea3a6fdb664dff36b0e8043 - date/formats/default: df39f2ed8e14212ef5664e0603460e76 - date/formats/long: 60dc8afda933eee168c7eb73bda1a296 - date/formats/short: 05eb7bb8ee06c9de1435ba4cd1d81dcf - date/formats/time: 1407af7bd151a6fa95e2d51497454cc2 - date/formats/time_with_seconds: f02992d40da922a1382859c45cb0231e - 1254631a73b754e11a1b9ca8f7362025: - item_count/variations/plural: 021a2f0c489893d720d30fe4277ccdb5 - notification_message/stringUnit: d14316154e233634917e317452c5f42c - notification_message/substitutions/count_items/variations/plural: 3db7a8a0078bc1a87ccdb095af3164a5 - welcome_message/stringUnit: 0468579ef2fbc83c9d520c2f2f1c5059 - ee8bbe4c9de58af9c4d5e1f4373f4db1: - plural_comments_thread/variations/plural: 97a71bd34c84a4a5743d658937695acb - plural_complex_sentence/variations/plural: 2a1d1e020670dc56bbe319866dbbfca9 - plural_download_speed/variations/plural: a25c6b896b06a81f76a9191dfa683d3c - plural_likes_with_names/variations/plural: 705a39beb4051cf029164df7abb2f6c5 - plural_mixed_types/variations/plural: a03ccdfcc3f45d988184cacfd80aea67 - plural_participants/variations/plural: 750a9c917be84adc814b814faed3121b - plural_positional_args/variations/plural: f66423f9ca6b02f4d83586cc814646cb - plural_storage_usage/variations/plural: b40ad5e569a937206e120b1aa027fc10 - plural_time_remaining/variations/plural: 6486a72fb367e941f1ed953a1184f824 - plural_unread_notifications/variations/plural: 9065c55c8f0f4cef2ae8a15d30916cbc - plural_with_float/variations/plural: 0d8ec56f120924931e39048ad7ffccc2 - plural_with_high_precision/variations/plural: ada7f82e4097be81131932cc9b2ea1a9 - plural_with_long_long/variations/plural: cd071f3cb70733a5a28a0105166dff99 - plural_with_one_variable/variations/plural: 6b55e11ccfb8b87cc6fb537d04963788 - plural_with_percentage/variations/plural: e93584fd51ed05cae53ebe2781ea1ae0 - plural_with_two_variables/variations/plural: f1c5ad7dfbbb0a9995eae3111a0c5b8a - plural_with_units/variations/plural: c9d1e24dbab0890d89001aac962946c9 - plural_with_zero/variations/plural: 42a48519f0960f5531673eb5cc16259b - simple_plural/variations/plural: dcaae1387d28339af1fff9e8cfe4ebb9 - simple_string/stringUnit: ed0d4b1cde20d045f9f8c5007c784b0b - 0f98b7647666155847e3e788a431b083: - text_0: e4d2da607604b3fda41eef5e0dd35faa - text_1: 69eb28c44f7168b1df0455ad2a62588c - text_2: bff335b01588a8db802bd193c725ec11 - text_3: 0744639a7ac440afe0d792ea79c54512 - text_4: b4cc462fb3a00d2f60deefe548c10a33 - text_5: d0fd310aef9cf3c5827f1db4b0c098a1 - text_6: 85bb1f6fb66b5ab65a9c61469183236e - text_7: bdbc827b3d224e03394dfd56304500f2 - text_8: 5e8497af456decf6cf716c0a23f1dbc2 - text_9: d572e25ed81420669e65c03925da1001 - text_10: 2cf6537fb69cdd2eb030e55bf4223b93 - text_11: ec7b8f314fe9bc6591006707484ede61 - text_12: c2460fb2a7887fdf2d68db2b553a4338 - text_13: 3abe623951250bd24a9d7799415761ab - text_14: 988be328b82702586f2cd541858710fe - text_15: b2328773b0ef0699fd5791055c5cf9e2 - text_16: 92acabd12cd9b63c825294c54fcbc806 - a661dac7c4e5e7b85a84760d221260ae: - title: 0468579ef2fbc83c9d520c2f2f1c5059 - description: fded006c54f10b76105c14ce3048c154 - version: 54a9e730e88fb16291b852274d433923 - support_email: 10627fcc465897af0f5e1bba042685f9 - emoji: b328c432cee108a87a92f05258b6a651 - author/name: febee8e9ab40b2fe5106d72675228d00 - contributors/0/name: e80d4063a32adaad7b0a82b0bcc10551 - contributors/1/name: b2bca2fa3c890618e56d07473f26ead3 - messages/0: d1c3a9f35e377554a4ccaa467ca26614 - messages/1: 0468579ef2fbc83c9d520c2f2f1c5059 - config/theme/primary: 7535a3779d6934ea8ecf18f5cb5b93fd - mixed_array/0: 001b5b003d96c133534f5907abffdf77 - mixed_array/3/nested_message: 5f0782dfc5993e99890c0475bc295a30 - locked_key_1: 73fc105de1aefc3f0a97d187a80cf0a4 - 18ac35cad2b3022d734493a5fce7cddc: - navigation: 104a3db3b671c04e167eafbe21e57881 - buttons/submit: 7c91ef5f747eea9f77a9c4f23e19fb2e - buttons/cancel: 2e2a849c2223911717de8caa2c71bade - messages/welcome: 1308168cca4fa5d8d7a0cf24e55e93fc - messages/error: 53a2b5f5e7d83c737c8e02fe18fb4bdb - forms/login/title: f4f219abeb5a465ecb1c7efaf50246de - forms/login/fields/username: 2ee65bc2dd2f12cf2672f95b2a054bf8 - forms/login/fields/password: 223a61cf906ab9c40d22612c588dff48 - 3b3843fdc86f8dbbb17471b5db8a26d9: - heading-0: e19079d431e6b75a7d74e9c35639ea5a - paragraph-0: 6757b797fc6d8c5ec5628f2619274e28 - paragraph-1: cc37b30c1aca11f64dc096264761368e - paragraph-2: 50e2b92b9e711ae7758f8edcc1767102 - paragraph-3: 7bc573b304cf3a3414dd60f85eea4e36 - heading-1: 80779abd23399c676227609057093235 - paragraph-4: dfd87f4dde3d3e12fa6781966432465f - item-0: ad9b7460be42c194e4771cf5281d5fd0 - item-1: 7d67473952061a571de034013964c5b6 - item-2: 91cffca4db2b901a3a0310ca2ab17ed9 - item-3: 56b97b82cc030c511847d1850af088a0 - item-4: 05dc0a811ee5b04941c826293471367d - item-5: b1701133f7e62467e354a5fc526ea951 - heading-2: ff6e4ea57280ef5a42ebbe2cf9e3273b - paragraph-5: 3e11ad608af106c15eed82d0e5d07712 - item-6: 2b1ab56131399aab1842fc3a81dd170e - item-7: 8aedf70e351d5e5bb41ad66ad5ad18d8 - item-8: 1d0eccad0413a69da0d45c481aa754e9 - paragraph-6: e2a208aa62fd61821848519fa2abc211 - heading-3: 2761eb3f80a7da53d2cd899f33641e98 - paragraph-7: f341db1f3167bd074937f4399c3a1158 - th-0: 58f5f3f37862b6312a2f20ec1a1fd0e8 - th-1: e17686a22ffad04cc7bb70524ed4478b - td-0: 97813c8ae67d69575fd04e35a88aed0c - td-1: 117451569b718867c43b26d9ee3c4e8f - td-2: e801c1eaca53c3aa702b747ed750fdd1 - td-3: ffd3eec5497af36d7b4e4185bad1313a - td-4: 03d20ebc4966301ceba02199a24e02dc - td-5: 86d0ae6fea0fbb119722ed3841f8385a - td-6: 6d26991f040628f6002efa192bebb9c2 - heading-4: c8b45e4d54115ec279a2a6bde4b8a725 - paragraph-8: 933c68ed0598328263d1146641d0ab2c - fence-0: ffdb698812040ead47e2039dfa22d9d7 - paragraph-9: fe471cd364c38cc79a7638b4a5ffb528 - heading-5: 4cbc75f1ae6830a190eb70628c4e4b54 - paragraph-10: bc6097c6af86133a3972bdb7a5343dd2 - fence-1: 31a1aab989ce9935c98e672182bffbbe - heading-6: fe53e9de958685ab7c70d0a973c0a146 - paragraph-11: 69f77475eb830f1aa357f45db29f809e - item-9: 90f2650aad06503472c46ce2612b9bc8 - item-10: a392737d0507463d40d1a8ff7502607c - item-11: 7ed6e23ffae34636a417daf72b3a5b6b - item-12: 0f93e7285aafb5c9929b29973f047026 - item-13: 9dacb7c56bc894e4bcad39f41265e3a0 - item-14: 496e1d7de5d7ff53f1af813a2ba46d7f - item-15: 1bd4ec30282cfc0bdf7d5f3559990a1c - item-16: 46c9eec1392a8d9f33170569e342bf7b - heading-7: aa8d69ad456402762aeb915a67cfa698 - paragraph-12: 275eb44389d498dab93e38ed2889e5d9 - paragraph-13: f05f450fffcb17520c441ab9789f40ce - paragraph-14: 915fe5ce4ded772d7844df222ebd9d3e - paragraph-15: 3fae115ccac303b7cd908b49b8509217 - heading-8: 2fdf7c243436eba4bd1fe5ebd605ab96 - paragraph-16: fc0f77d45ad1e1764d2793706eb8a049 - paragraph-17: 6b4340d30988a714d34f0df9b3e18889 - paragraph-18: a59d117938ed65f303209da2b23ad35a - paragraph-19: 28e8b27fb60b305a9caac04d8a92a038 - tagName-0: 0421db688c4d19bb542014733d553a43 - paragraph-20: 83951ea4c30a9b5057ff046e3a0bfc07 - paragraph-21: 8d2152d9e84fff4b3cd98d1fb305be8f - heading-9: 6fe6489310962f6bc8ad13279106568b - item-17: 0539fa4e65545d8a334abf6e0aee57ab - item-18: a41ccc6f28eec377fb19a95b0b6db7a8 - item-19: 45aa24cef8a5d9b037d898917a862563 - paragraph-22: 59bf7b09d603b846c2cdd63cd878f20a - paragraph-23: 9e30a94d9122095ac52a52ed2a864a26 - paragraph-24: 3b28910e425d79f9fd23ada6d6f33bff - paragraph-25: 05d9c0fe6c099b1e20ebdb2320a28257 - paragraph-26: 04e7322f2d3ffb2d73ff2f64b71637c8 - paragraph-27: 65ef9814c2d07fd3d54d9f7bee1bba6c - badge-0: c2d5d8760d96802e1b9a7bac290b1cfc - paragraph-28: df1f854bcdb047d98a68cd39704a8981 - fm-attr-title: e19079d431e6b75a7d74e9c35639ea5a - fm-attr-description: 82574f93a40b35a16a4c9fc5c2ab58cf - fm-attr-author: a51ec27845d1fc7cf13c810f0e2d42ab - 6da152a30ab05dbd1785c179224a09c9: - 1#00:00:01,000-00:00:03,500: 5a2215cdfd6d9e9162efbdee57b89c27 - 2#00:00:04,000-00:00:06,500: ecb7d6cb214b6db6d02e6e98cdfea178 - 3#00:00:07,000-00:00:09,500: 3eee55196aea6ac13fb19eae7e7ffaf6 - 4#00:00:10,000-00:00:12,500: a6cc802efe3431c7a986ac5d42d62ce1 - 5#00:00:13,000-00:00:15,500: f73ef0a42ea51efb4e1e5fd2276ef243 - 7a5e07095171dd2f59dbcb8d4109574c: - "1": 5c0212aca9c84332df0190d13e929623 - "2": d39d54116929959bf76f43655e7bebc9 - "3": 960c83d6eeed679ee9fb1b2be2f9934b - "5": 78569dd2f0e7cd872659850ef2f9c19a - "6": 5c5a850ec695512b6182630c563eeed9 - d67e3f776169ba16208faf8320e4318f: - 0#1-3.5#1: 5df3c06b74cfc8558e85ff75a30a9162 - 1#4-7.2#subtitle-2: 0de65f1d2616b6959aa79ac5beb6e84c - 2#8.5-12#3: 3351244c032529a099f1191477d9e488 - 3#13-16.5#: b9341abc965d5178a96d9bc4e8e2c59a - 4#17-20#final-cue: 0b67e089cd3f39b8520d7a2be9f34362 - b23a0b1bf493252238c751dd2d6cf17c: - root/title: 0468579ef2fbc83c9d520c2f2f1c5059 - root/description/summary: f2c85bf6eeebeea33609e04598201bb6 - root/description/details: 2ee85b8f2f0f1bc008d9cf1f916cb09c - root/image/%24/src: 3ce26f0a5486adf10e1b7eee1b866a70 - root/image/%24/alt: 94058fbed56fffaef2e9bbea59ba4a54 - root/image/%24/title: 60487c71b570d9dedca6fddd4a75d16a - root/link/_: e598091d132f890c37a6d4ed94f6d794 - root/link/%24/href: 285d79d2783cf0769ab9e767362c1499 - root/link/%24/label: 26ce69aad587f70d47e7606436bf1d6d - root/button/_: 7c91ef5f747eea9f77a9c4f23e19fb2e - root/button/%24/type: fa8748b22d5bac98fdcd57e3d6594cf3 - root/button/%24/value: 7c91ef5f747eea9f77a9c4f23e19fb2e - root/button/%24/placeholder: 7b5d59cee6952db66043a4b289b51884 - root/section/article/paragraph/sentence: 28ca53c71a2e3e3de79c892a9b193b1a - root/meta/%24/name: d097029e873a4b19132e2603bd2c9fe4 - root/meta/%24/content: 0811ae3ab84aa87205383c3d8ac42bf3 - root/message/greeting: 85559fc839c5181b7958654e62c987d5 - root/message/body: ed0d4b1cde20d045f9f8c5007c784b0b - root/message/signature: 181c8c304980949e101865098f548705 61124498fe2038e02d0c86102e68efb6: head/1#content: 87c1cace5dae97b8d8e7e33935d38648 head/2#content: b5e67d04e51169a06100e8073a2af399 @@ -1018,3 +285,384 @@ checksums: body/2/1/4/1: 7eac03268a7a1f9c7c838f8d848240e3 body/3/0: 5d4ada1ab4dda0067307ed27db717f55 body/3/1: 327405ed3e27fd2c1781b18f71fb5219 + df547e152136431bbc29e26ae0eeabb4: + title: 0468579ef2fbc83c9d520c2f2f1c5059 + description: 49f8864eb0e53903f04532bf33e1e4fa + version: 54a9e730e88fb16291b852274d433923 + support_email: 10627fcc465897af0f5e1bba042685f9 + emoji: b328c432cee108a87a92f05258b6a651 + author/name: febee8e9ab40b2fe5106d72675228d00 + contributors/0/name: e80d4063a32adaad7b0a82b0bcc10551 + contributors/1/name: b2bca2fa3c890618e56d07473f26ead3 + messages/0: d1c3a9f35e377554a4ccaa467ca26614 + messages/1: 0468579ef2fbc83c9d520c2f2f1c5059 + config/theme/primary: 7535a3779d6934ea8ecf18f5cb5b93fd + mixed_array/0: 001b5b003d96c133534f5907abffdf77 + mixed_array/3/nested_message: 5f0782dfc5993e99890c0475bc295a30 + 2be4c282da9773e3b7b07aaee059e5a1: + key1: 0468579ef2fbc83c9d520c2f2f1c5059 + key2: b48a4cb78277d72905362f8d2dfa1e88 + key3: 54a9e730e88fb16291b852274d433923 + key4: 10627fcc465897af0f5e1bba042685f9 + key5: b328c432cee108a87a92f05258b6a651 + key6/key7: 9da96ad1d5c544070ac5e268de77fb48 + a661dac7c4e5e7b85a84760d221260ae: + title: 0468579ef2fbc83c9d520c2f2f1c5059 + description: fded006c54f10b76105c14ce3048c154 + version: 54a9e730e88fb16291b852274d433923 + support_email: 10627fcc465897af0f5e1bba042685f9 + emoji: b328c432cee108a87a92f05258b6a651 + author/name: febee8e9ab40b2fe5106d72675228d00 + contributors/0/name: e80d4063a32adaad7b0a82b0bcc10551 + contributors/1/name: b2bca2fa3c890618e56d07473f26ead3 + messages/0: d1c3a9f35e377554a4ccaa467ca26614 + messages/1: 0468579ef2fbc83c9d520c2f2f1c5059 + config/theme/primary: 7535a3779d6934ea8ecf18f5cb5b93fd + mixed_array/0: 001b5b003d96c133534f5907abffdf77 + mixed_array/3/nested_message: 5f0782dfc5993e99890c0475bc295a30 + locked_key_1: 73fc105de1aefc3f0a97d187a80cf0a4 + 18ac35cad2b3022d734493a5fce7cddc: + navigation: 104a3db3b671c04e167eafbe21e57881 + buttons/submit: 7c91ef5f747eea9f77a9c4f23e19fb2e + buttons/cancel: 2e2a849c2223911717de8caa2c71bade + messages/welcome: 1308168cca4fa5d8d7a0cf24e55e93fc + messages/error: 53a2b5f5e7d83c737c8e02fe18fb4bdb + forms/login/title: f4f219abeb5a465ecb1c7efaf50246de + forms/login/fields/username: 2ee65bc2dd2f12cf2672f95b2a054bf8 + forms/login/fields/password: 223a61cf906ab9c40d22612c588dff48 + 3b3843fdc86f8dbbb17471b5db8a26d9: + heading-0: e19079d431e6b75a7d74e9c35639ea5a + paragraph-0: 6757b797fc6d8c5ec5628f2619274e28 + paragraph-1: cc37b30c1aca11f64dc096264761368e + paragraph-2: 50e2b92b9e711ae7758f8edcc1767102 + paragraph-3: 7bc573b304cf3a3414dd60f85eea4e36 + heading-1: 80779abd23399c676227609057093235 + paragraph-4: dfd87f4dde3d3e12fa6781966432465f + item-0: ad9b7460be42c194e4771cf5281d5fd0 + item-1: 7d67473952061a571de034013964c5b6 + item-2: 91cffca4db2b901a3a0310ca2ab17ed9 + item-3: 56b97b82cc030c511847d1850af088a0 + item-4: 05dc0a811ee5b04941c826293471367d + item-5: b1701133f7e62467e354a5fc526ea951 + heading-2: ff6e4ea57280ef5a42ebbe2cf9e3273b + paragraph-5: 3e11ad608af106c15eed82d0e5d07712 + item-6: 2b1ab56131399aab1842fc3a81dd170e + item-7: 8aedf70e351d5e5bb41ad66ad5ad18d8 + item-8: 1d0eccad0413a69da0d45c481aa754e9 + paragraph-6: e2a208aa62fd61821848519fa2abc211 + heading-3: 2761eb3f80a7da53d2cd899f33641e98 + paragraph-7: f341db1f3167bd074937f4399c3a1158 + th-0: 58f5f3f37862b6312a2f20ec1a1fd0e8 + th-1: e17686a22ffad04cc7bb70524ed4478b + td-0: 97813c8ae67d69575fd04e35a88aed0c + td-1: 117451569b718867c43b26d9ee3c4e8f + td-2: e801c1eaca53c3aa702b747ed750fdd1 + td-3: ffd3eec5497af36d7b4e4185bad1313a + td-4: 03d20ebc4966301ceba02199a24e02dc + td-5: 86d0ae6fea0fbb119722ed3841f8385a + td-6: 6d26991f040628f6002efa192bebb9c2 + heading-4: c8b45e4d54115ec279a2a6bde4b8a725 + paragraph-8: 933c68ed0598328263d1146641d0ab2c + fence-0: ffdb698812040ead47e2039dfa22d9d7 + paragraph-9: fe471cd364c38cc79a7638b4a5ffb528 + heading-5: 4cbc75f1ae6830a190eb70628c4e4b54 + paragraph-10: bc6097c6af86133a3972bdb7a5343dd2 + fence-1: 31a1aab989ce9935c98e672182bffbbe + heading-6: fe53e9de958685ab7c70d0a973c0a146 + paragraph-11: 69f77475eb830f1aa357f45db29f809e + item-9: 90f2650aad06503472c46ce2612b9bc8 + item-10: a392737d0507463d40d1a8ff7502607c + item-11: 7ed6e23ffae34636a417daf72b3a5b6b + item-12: 0f93e7285aafb5c9929b29973f047026 + item-13: 9dacb7c56bc894e4bcad39f41265e3a0 + item-14: 496e1d7de5d7ff53f1af813a2ba46d7f + item-15: 1bd4ec30282cfc0bdf7d5f3559990a1c + item-16: 46c9eec1392a8d9f33170569e342bf7b + heading-7: aa8d69ad456402762aeb915a67cfa698 + paragraph-12: 275eb44389d498dab93e38ed2889e5d9 + paragraph-13: f05f450fffcb17520c441ab9789f40ce + paragraph-14: 915fe5ce4ded772d7844df222ebd9d3e + paragraph-15: 3fae115ccac303b7cd908b49b8509217 + heading-8: 2fdf7c243436eba4bd1fe5ebd605ab96 + paragraph-16: fc0f77d45ad1e1764d2793706eb8a049 + paragraph-17: 6b4340d30988a714d34f0df9b3e18889 + paragraph-18: a59d117938ed65f303209da2b23ad35a + paragraph-19: 28e8b27fb60b305a9caac04d8a92a038 + tagName-0: 0421db688c4d19bb542014733d553a43 + paragraph-20: 83951ea4c30a9b5057ff046e3a0bfc07 + paragraph-21: 8d2152d9e84fff4b3cd98d1fb305be8f + heading-9: 6fe6489310962f6bc8ad13279106568b + item-17: 0539fa4e65545d8a334abf6e0aee57ab + item-18: a41ccc6f28eec377fb19a95b0b6db7a8 + item-19: 45aa24cef8a5d9b037d898917a862563 + paragraph-22: 59bf7b09d603b846c2cdd63cd878f20a + paragraph-23: 9e30a94d9122095ac52a52ed2a864a26 + paragraph-24: 3b28910e425d79f9fd23ada6d6f33bff + paragraph-25: 05d9c0fe6c099b1e20ebdb2320a28257 + paragraph-26: 04e7322f2d3ffb2d73ff2f64b71637c8 + paragraph-27: 65ef9814c2d07fd3d54d9f7bee1bba6c + badge-0: c2d5d8760d96802e1b9a7bac290b1cfc + paragraph-28: df1f854bcdb047d98a68cd39704a8981 + fm-attr-title: e19079d431e6b75a7d74e9c35639ea5a + fm-attr-description: 82574f93a40b35a16a4c9fc5c2ab58cf + fm-attr-author: a51ec27845d1fc7cf13c810f0e2d42ab + 1d941f3fcb422e74ccb8adb0f899afad: + md-section-0: d53f61b8c8922fb62d9df5678d9b44a8 + md-section-1: 98aec271471bedce0e12b530c7060827 + md-section-2: 9e5a786192608844493dfbb6e4100886 + md-section-3: 1a5299c38bb20c1b8af0e64e33d7b2b0 + md-section-4: 51adf33450cab2ef392e93147386647c + md-section-5: e56cc804e3e06b5f5fb2484e88c18adc + md-section-6: 0ea86a3338305070c865e8fe138da890 + md-section-7: bbabf7f391569a72099001e3d81eb251 + md-section-8: 36cbfd93f42528edce4faac2ac3c2c12 + md-section-9: a1c50054ab23d70be8d453789b214580 + md-section-10: 51adf33450cab2ef392e93147386647c + md-section-11: cb596c9608828f7b87a0ab8fa37beb07 + fm-attr-title: f3469c4e3d3377c39a705c844930b3a5 + fm-attr-description: 2e988d98001e44997a3f5fa3fb487ca6 + fm-attr-author: ec8c8711fce61265a4fe296ce2ba3b6f + fm-attr-tags: 313ac6f17ee08e4f4a6a2ca95e5ae024 + 43e407a3798eb45c648586dfaabcc0bf: + meta/title: a4bdd0dee24f8318f3300dcae130a353 + meta/description: 609213841f122e494f62262618ee4761 + meta/author: f3f7164b5963b4da6cd31a2ec0251630 + content/0: 8a8520492d23503da5691602e60bd22a + content/1: 1fc859854cda505b2a94a04c8b09ab43 + content/2: 8add667f2a1d5d791a64b50bde54fa59 + content/3: e6e34c4c92eda512ec209266abe8e074 + content/4: 07f1896ad050b9606d7674f70d847818 + content/5: bd4d40a4f0cc92ac8a880c8d9ce8b43d + content/6: 3036a07a887121ea080427d84fc80912 + content/7: f555318416c5c5388c1d961ef02f5955 + content/8: 90e02688ab103de60e42c70ece7efc4d + content/9: 8c5be3cd002a3a194c991821e0182e08 + content/10: 3495801a7461ac5ea8d78369873a5409 + content/11: d444739ce3d48afb7976067c67149a9e + content/12: 5f02c0a3b6385f80bdd08cf7e2d8c04d + content/13: 0a15fd446b87d907f58c303aece0882b + content/14: 778ed0aa1f81768280a23afe559c55f7 + content/15: fa244af2d8e558d6c3644ff8c1a64562 + content/16: 14f593e7cf3b3df84a21e17db318912e + content/17: 5f42d26a42aa29be063019eea27ad07c + content/18: 48bb7e89e72d68d6de12f5cdac64fc18 + 85a42d442df1a15336ea9c1ccb451a18: + Welcome/singular: 3180ad6b8de344b781637750259e0f53 + Home/singular: 104a3db3b671c04e167eafbe21e57881 + You%20have%20%25d%20message/singular: 1691abfe2c5d017cda86e298d34f3524 + You%20have%20%25d%20message/plural: 2d37831bf51cc2cf75e812c0e61c6861 + Save/singular: f7a2929f33bc420195e59ac5a8bcd454 + Cancel/singular: 2e2a849c2223911717de8caa2c71bade + Delete/singular: 8bcf303dd10a645b5baacb02b47d72c9 + Name/singular: 9368b5a047572b6051f334af5aa76819 + Email%20Address/singular: 0ee22bbbe989a0c61a18023407d12dc2 + Message/singular: f2f72126bd244cfc534eab395e054362 + Loading.../singular: 82b4ea7ed1439094d7c4be13aaba9a66 + Success!%20Changes%20saved./singular: 906371aaeec474803e22ae959605dad8 + Error%3A%20Request%20failed./singular: cdeaab2374e34c0e396cdb2596a9824e + Add%20to%20Cart/singular: c93a29ccf502ff71bf08924dcdea9179 + Out%20of%20Stock/singular: 6673fc95c2cee3c713e0d60c8184e289 + Price%3A%20%24%25s/singular: a860f7b395e4a9d916a48717f9f8837a + 60e3fb38a8f4172248a877262283854c: + app.title: 7dc70110429d46e3685f385bd2cc941c + app.description: e13baa1e885129d9328e216ff534761b + user.greeting: 0468579ef2fbc83c9d520c2f2f1c5059 + user.farewell: 118794a2b84f7bfb4b4ce602ed463b0f + error.message: a3cd2f01c073f1f5ff436d4b132d39cf + error.notFound: 97612e6230bc7a1ebd99380bf561b732 + database.host: da86e4fc0c04d82c87006dc71cea7e97 + notification.success: 3b7a8b0aa23977592d4270ea136a390c + notification.warning: c38895f731311cefacee9e8d7d10fc49 + 6da152a30ab05dbd1785c179224a09c9: + 1#00:00:01,000-00:00:03,500: 5a2215cdfd6d9e9162efbdee57b89c27 + 2#00:00:04,000-00:00:06,500: ecb7d6cb214b6db6d02e6e98cdfea178 + 3#00:00:07,000-00:00:09,500: 3eee55196aea6ac13fb19eae7e7ffaf6 + 4#00:00:10,000-00:00:12,500: a6cc802efe3431c7a986ac5d42d62ce1 + 5#00:00:13,000-00:00:15,500: f73ef0a42ea51efb4e1e5fd2276ef243 + 7a5e07095171dd2f59dbcb8d4109574c: + "1": 5c0212aca9c84332df0190d13e929623 + "2": d39d54116929959bf76f43655e7bebc9 + "3": 960c83d6eeed679ee9fb1b2be2f9934b + "5": 78569dd2f0e7cd872659850ef2f9c19a + "6": 5c5a850ec695512b6182630c563eeed9 + fb1f33e873b2ca499a48c636071081ae: + navigation/home: 104a3db3b671c04e167eafbe21e57881 + navigation/about: 8f89131a66d4659be07cd5af2c7ea898 + navigation/contact: 2a75337dc9603915c4ec1d1905afb7b9 + navigation/services: 999f32026e64978cb3ec794a496b0bb8 + forms/title: ac85dea7c7f0bf1cd7d48cc1b4da3acc + forms/nameLabel: 03c6ae7996d5841f743cd406b4eff72d + forms/emailLabel: 0ee22bbbe989a0c61a18023407d12dc2 + forms/messageLabel: 1e460d0909502d0e94b9be562643af0d + forms/submitButton: 487177489aafc9c0243c57ef3850a2d9 + forms/successMessage: a0a7aa980dffa31d4d194af718a917b3 + d67e3f776169ba16208faf8320e4318f: + 0#1-3.5#1: 5df3c06b74cfc8558e85ff75a30a9162 + 1#4-7.2#subtitle-2: 0de65f1d2616b6959aa79ac5beb6e84c + 2#8.5-12#3: 3351244c032529a099f1191477d9e488 + 3#13-16.5#: b9341abc965d5178a96d9bc4e8e2c59a + 4#17-20#final-cue: 0b67e089cd3f39b8520d7a2be9f34362 + ae4fae82257615e5c22b34de033c7eeb: + welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 + login_button: 0029e5a35676c0051e761fcd046ef9ee + error_message: a3cd2f01c073f1f5ff436d4b132d39cf + user_profile_title: bee775ff7216747b2111e93cefa57ddc + quote_example: c519c83fe2629c0e9a6e7a14f64b6317 + newline_example: ae9313a2231a16f17e2367a4e5b322ee + backslash_example: acf69a7273edf9f932f66027f699bbbe + mixed_escapes: 9285b600baf307f7c060e20dc5778fad + tab_example: 1451b8323511459dac68316a2594bb82 + multiline_literal: a4c5d1c388a06e29d96833e4d2f14a26 + multiline_mixed: f5d741606567d78281bc455074eb8f6c + multiline_with_quotes: c82ec05ec488644808917b9c958da8cc + after_comment: b7c19db10622cb67d4dd28270e85a428 + after_multiline_comment: 759d0ffce80451996a5a45b33a0870cc + long_value: a54e8485e571c671e35865ba72cbcaf5 + unicode_example: 2de42b1aef6d20b314928b9c2554759d + emoji: 1b387c2b5ce6c2cd608081ebcb5e6a94 + accents: 8c054e17f9b960d9317ca110a6fedf8c + spaces_only: 8af60e2ee58a2e1e42071066e9c225da + many_quotes: e2ff57b8058ab2c03c5b07cf901a7a48 + missing_semicolon: b2b5f0c3f552a348188de51bd4fcf511 + settings_title: 8df6777277469c1fd88cc18dde2f1cc3 + save_button: f7a2929f33bc420195e59ac5a8bcd454 + 32707dfb19e6dfad9a1af32087b6f9f3: + welcome_message/NSStringLocalizedFormatKey: f142738692c027d95dce521e7cb29c82 + welcome_message/user_count/NSStringFormatSpecTypeKey: 8cc03ef30ad5b2d8e27f3612627d932e + welcome_message/user_count/NSStringFormatValueTypeKey: fe9efa39a6fd9f10358f43f00e0ab82b + welcome_message/user_count/zero: 3d4643c483a49c2f61e17aaa8620e71e + welcome_message/user_count/one: 3b547431ab12f0fba84307e6a81109d8 + welcome_message/user_count/other: cb01ae522c991a2ad651b4049339c48a + notification_count/NSStringLocalizedFormatKey: e01fd796051132b678d7574a11e9a944 + notification_count/count/NSStringFormatSpecTypeKey: 8cc03ef30ad5b2d8e27f3612627d932e + notification_count/count/NSStringFormatValueTypeKey: fe9efa39a6fd9f10358f43f00e0ab82b + notification_count/count/zero: ac0137deebf6e2b972c6c714dd8658ee + notification_count/count/other: 9b350a78e1c499b9ab69eb330162c8ee + 11b3ea8486d8e09d2bf06db1811e0490: + welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059 + 1254631a73b754e11a1b9ca8f7362025: + item_count/variations/plural: 021a2f0c489893d720d30fe4277ccdb5 + notification_message/stringUnit: d14316154e233634917e317452c5f42c + notification_message/substitutions/count_items/variations/plural: 3db7a8a0078bc1a87ccdb095af3164a5 + welcome_message/stringUnit: 0468579ef2fbc83c9d520c2f2f1c5059 + ee8bbe4c9de58af9c4d5e1f4373f4db1: + plural_comments_thread/variations/plural: 97a71bd34c84a4a5743d658937695acb + plural_complex_sentence/variations/plural: 2a1d1e020670dc56bbe319866dbbfca9 + plural_download_speed/variations/plural: a25c6b896b06a81f76a9191dfa683d3c + plural_likes_with_names/variations/plural: 705a39beb4051cf029164df7abb2f6c5 + plural_mixed_types/variations/plural: a03ccdfcc3f45d988184cacfd80aea67 + plural_participants/variations/plural: 750a9c917be84adc814b814faed3121b + plural_positional_args/variations/plural: f66423f9ca6b02f4d83586cc814646cb + plural_storage_usage/variations/plural: b40ad5e569a937206e120b1aa027fc10 + plural_time_remaining/variations/plural: 6486a72fb367e941f1ed953a1184f824 + plural_unread_notifications/variations/plural: 9065c55c8f0f4cef2ae8a15d30916cbc + plural_with_float/variations/plural: 0d8ec56f120924931e39048ad7ffccc2 + plural_with_high_precision/variations/plural: ada7f82e4097be81131932cc9b2ea1a9 + plural_with_long_long/variations/plural: cd071f3cb70733a5a28a0105166dff99 + plural_with_one_variable/variations/plural: 6b55e11ccfb8b87cc6fb537d04963788 + plural_with_percentage/variations/plural: e93584fd51ed05cae53ebe2781ea1ae0 + plural_with_two_variables/variations/plural: f1c5ad7dfbbb0a9995eae3111a0c5b8a + plural_with_units/variations/plural: c9d1e24dbab0890d89001aac962946c9 + plural_with_zero/variations/plural: 42a48519f0960f5531673eb5cc16259b + simple_plural/variations/plural: dcaae1387d28339af1fff9e8cfe4ebb9 + simple_string/stringUnit: ed0d4b1cde20d045f9f8c5007c784b0b + b23a0b1bf493252238c751dd2d6cf17c: + root/title: 0468579ef2fbc83c9d520c2f2f1c5059 + root/description/summary: f2c85bf6eeebeea33609e04598201bb6 + root/description/details: 2ee85b8f2f0f1bc008d9cf1f916cb09c + root/image/%24/src: 3ce26f0a5486adf10e1b7eee1b866a70 + root/image/%24/alt: 94058fbed56fffaef2e9bbea59ba4a54 + root/image/%24/title: 60487c71b570d9dedca6fddd4a75d16a + root/link/_: e598091d132f890c37a6d4ed94f6d794 + root/link/%24/href: 285d79d2783cf0769ab9e767362c1499 + root/link/%24/label: 26ce69aad587f70d47e7606436bf1d6d + root/button/_: 7c91ef5f747eea9f77a9c4f23e19fb2e + root/button/%24/type: fa8748b22d5bac98fdcd57e3d6594cf3 + root/button/%24/value: 7c91ef5f747eea9f77a9c4f23e19fb2e + root/button/%24/placeholder: 7b5d59cee6952db66043a4b289b51884 + root/section/article/paragraph/sentence: 28ca53c71a2e3e3de79c892a9b193b1a + root/meta/%24/name: d097029e873a4b19132e2603bd2c9fe4 + root/meta/%24/content: 0811ae3ab84aa87205383c3d8ac42bf3 + root/message/greeting: 85559fc839c5181b7958654e62c987d5 + root/message/body: ed0d4b1cde20d045f9f8c5007c784b0b + root/message/signature: 181c8c304980949e101865098f548705 + 48bbac9fb7941a5da53508f37bfade60: + title: 7dc70110429d46e3685f385bd2cc941c + description: 0468579ef2fbc83c9d520c2f2f1c5059 + welcome_message: d1c3a9f35e377554a4ccaa467ca26614 + user_profile/display_name: febee8e9ab40b2fe5106d72675228d00 + user_profile/bio: 155ddcb7c93493ac72a37074eea0a653 + navigation_items/0: 104a3db3b671c04e167eafbe21e57881 + navigation_items/1: 944521eeeed2511833d2299931273c71 + navigation_items/2: 9afa39bc47019ee6dec6c74b6273967c + product/name: ed21de171d538a49db999c47875f75a5 + product/tagline: b7ac41680e82d75ae7f5774f7ceef1b4 + product/features/0: c916ba887951a02793ff851853fd964f + product/features/1: 1c60a04d6890c6ec910a7f2e6ec0ae7b + complex_structure/level_one/level_two/message: b53034560bf657106e5aaea9160e357e + e6d8e00051ea40ca138a9549ed52e1c6: + navigation/home: 104a3db3b671c04e167eafbe21e57881 + navigation/about: 7ed93e7bbfca42a405d61ea3c2791aae + navigation/contact: 9afa39bc47019ee6dec6c74b6273967c + navigation/services: 8ea10b45b9abab2a3bfc3c07e1c9cdc6 + navigation/forms/title: cd1568dd5f8241c9429dc634de250ef4 + navigation/forms/name_label: b00c01deec0af9a441331a5134210de1 + navigation/forms/email_label: 3ba3f099b1b9be6c35ad797da660cb9f + navigation/forms/message_label: f2f72126bd244cfc534eab395e054362 + navigation/forms/submit_button: da352018f0db23d97405e3e44ccfe50d + navigation/forms/success_message: a0a7aa980dffa31d4d194af718a917b3 + navigation/inflections/gender/f: 1cdef9a43e68074eae7dce0248f7e5a9 + navigation/inflections/gender/m: 91f7f601c08b37b397f14f952416623f + navigation/inflections/gender/n: cab8f0be0df82bac41435dee4d2eb1df + navigation/inflections/gender/female: f4adbe8df79a872d3c16329a7e7a361a + navigation/inflections/gender/male: 9ebdcb660f503bb2618ae7ae086617e2 + navigation/inflections/gender/neuter: 603743850a2510aaa6a5eb9dbfbe7416 + navigation/inflections/gender/F: f4adbe8df79a872d3c16329a7e7a361a + navigation/inflections/gender/M: 9ebdcb660f503bb2618ae7ae086617e2 + navigation/inflections/gender/N: 603743850a2510aaa6a5eb9dbfbe7416 + navigation/inflections/gender/default: 453a466f60641d9934bbee33dc4cd2b6 + date/abbr_day_names/0: b29e2b72f74643194654961775178fec + date/abbr_day_names/1: b750502bab403473852a20cea73dcf2c + date/abbr_day_names/2: 4786ce2a2427ad9183ef1a6f7385fb24 + date/abbr_day_names/3: ce25e3f9bfc6cfdc6017f791045da079 + date/abbr_day_names/4: 4029492def3bd66fa5a9d1c693743b62 + date/abbr_day_names/5: 0f0718f17b758ea9d5167c120c230be6 + date/abbr_day_names/6: 3b32ac0f13383ecdf580b4db09773fda + date/abbr_month_names/1: 268e5f1e700c23c50b88e8c6aa754c88 + date/abbr_month_names/2: c111dae80531454da886782893e71541 + date/abbr_month_names/3: 3055ece906ba97d9b5050b4385d873a9 + date/abbr_month_names/4: 7a76ba706f71adc981bc050190ccc63f + date/abbr_month_names/5: 320223c5afaaf28560a3a84d3527d51c + date/abbr_month_names/6: 47f51f7cecc9bd30eef853748a40f2e7 + date/abbr_month_names/7: 5088467e6b771d6f02e1d4ea3550dd96 + date/abbr_month_names/8: 160006d60703204ab06369352f5f2520 + date/abbr_month_names/9: 91cac5f11e31c9907ea26a79fe5df889 + date/abbr_month_names/10: 384ae5bd38358c3f8db4560d59405c70 + date/abbr_month_names/11: a87c80252a5b03a82a0d16c510b5ed12 + date/abbr_month_names/12: 2a7ffd15bea3a6fdb664dff36b0e8043 + date/formats/default: df39f2ed8e14212ef5664e0603460e76 + date/formats/long: 60dc8afda933eee168c7eb73bda1a296 + date/formats/short: 05eb7bb8ee06c9de1435ba4cd1d81dcf + date/formats/time: 1407af7bd151a6fa95e2d51497454cc2 + date/formats/time_with_seconds: f02992d40da922a1382859c45cb0231e + d5ff4a01e7a8f148b46bb86afc0e9ace: + "0": 0468579ef2fbc83c9d520c2f2f1c5059 + "1": d1c3a9f35e377554a4ccaa467ca26614 + "2": 769caedbdc5246bb9fee615739534bbd + 3/welcome_message: 8778dc41547a2778d0f9482da989fc00 + 4/error_text: a3cd2f01c073f1f5ff436d4b132d39cf + 5/navigation/home: 104a3db3b671c04e167eafbe21e57881 + 5/navigation/about: 944521eeeed2511833d2299931273c71 + 5/navigation/contact: 9afa39bc47019ee6dec6c74b6273967c + 6/forms/login/username_label: 2ee65bc2dd2f12cf2672f95b2a054bf8 + 6/forms/login/password_label: 223a61cf906ab9c40d22612c588dff48 + 6/forms/login/submit_button: ec7b8f314fe9bc6591006707484ede61 + 7/mixed_content/title: 8df6777277469c1fd88cc18dde2f1cc3 + 7/mixed_content/description: 063afcd2ea84a82a1acc8f5c9fd8e42f + f96a3f7181c8ce89f928d418873259aa: + welcome: 0468579ef2fbc83c9d520c2f2f1c5059 + description: 49f8864eb0e53903f04532bf33e1e4fa + button/submit: 7c91ef5f747eea9f77a9c4f23e19fb2e + button/cancel: 2e2a849c2223911717de8caa2c71bade + messages/0: 97a8db12c3955a85c4f50e3951c91a40 + messages/1: 986a434e3895c8ee0b267df95cc40051 diff --git a/packages/cli/src/cli/loaders/index.ts b/packages/cli/src/cli/loaders/index.ts index f26458a5e..c722eb06f 100644 --- a/packages/cli/src/cli/loaders/index.ts +++ b/packages/cli/src/cli/loaders/index.ts @@ -15,6 +15,7 @@ import createCsvLoader from "./csv"; import createHtmlLoader from "./html"; import createMarkdownLoader from "./markdown"; import createMarkdocLoader from "./markdoc"; +import createMjmlLoader from "./mjml"; import createPropertiesLoader from "./properties"; import createXcodeStringsLoader from "./xcode-strings"; import createXcodeStringsdictLoader from "./xcode-stringsdict"; @@ -190,6 +191,17 @@ export default function createBucketLoader( createSyncLoader(), createUnlocalizableLoader(options.returnUnlocalizedKeys), ); + case "mjml": + return composeLoaders( + createTextFileLoader(bucketPathPattern), + createFormatterLoader(options.formatter, "html", bucketPathPattern), + createLockedPatternsLoader(lockedPatterns), + createMjmlLoader(), + createLockedKeysLoader(lockedKeys || []), + createIgnoredKeysLoader(ignoredKeys || []), + createSyncLoader(), + createUnlocalizableLoader(options.returnUnlocalizedKeys), + ); case "po": return composeLoaders( createTextFileLoader(bucketPathPattern), diff --git a/packages/cli/src/cli/loaders/mjml.spec.ts b/packages/cli/src/cli/loaders/mjml.spec.ts new file mode 100644 index 000000000..ccf40884d --- /dev/null +++ b/packages/cli/src/cli/loaders/mjml.spec.ts @@ -0,0 +1,700 @@ +import { describe, test, expect } from "vitest"; +import createMjmlLoader from "./mjml"; + +// Helper function to find a key by matching content or partial path +function findKeyByContent(result: Record, contentOrPath: string): string | undefined { + // First try exact match + if (result[contentOrPath]) { + return contentOrPath; + } + + // Try to find by content value + const byValue = Object.keys(result).find(key => result[key] === contentOrPath); + if (byValue) return byValue; + + // Try to find by partial path (e.g., "mj-text" finds first mj-text key) + const byPartialPath = Object.keys(result).find(key => key.includes(contentOrPath)); + if (byPartialPath) return byPartialPath; + + return undefined; +} + +// Helper to find key by path pattern and element type +function findKeyByPattern(result: Record, pattern: string, elementType: string): string | undefined { + // Match keys that contain the pattern and element type + return Object.keys(result).find(key => + key.includes(pattern) && key.includes(elementType) + ); +} + +describe("mjml loader", () => { + test("should extract text from mj-text component", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Hello World + + + +`; + + const result = await loader.pull("en", input); + + // Find the mj-text key (now uses content-based hash) + const textKey = findKeyByContent(result, "Hello World"); + expect(textKey).toBeDefined(); + expect(result[textKey!]).toBe("Hello World"); + }); + + test("content-based hash keys should be deterministic across multiple pulls", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Hello World + Click Me + + + +`; + + // Pull twice and compare keys + const result1 = await loader.pull("en", input); + const result2 = await loader.pull("en", input); + + console.log("First pull keys:", Object.keys(result1)); + console.log("Second pull keys:", Object.keys(result2)); + + // Keys should be identical + expect(Object.keys(result1).sort()).toEqual(Object.keys(result2).sort()); + // Values should be identical + expect(result1).toEqual(result2); + }); + + test("should extract text from mj-button component", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Click Me + + + +`; + + const result = await loader.pull("en", input); + + // Content-based hashing - find the actual key + const buttonKeys = Object.keys(result).filter(k => k.includes('mj-button')); + expect(buttonKeys.length).toBe(1); + expect(result[buttonKeys[0]]).toBe("Click Me"); + }); + + test("should extract alt attribute from mj-image component", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-image/0#alt"]).toBe("A beautiful image"); + }); + + test("should extract title attribute from mj-button", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Click + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-button/0"]).toBe("Click"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-button/0#title"]).toBe("Hover text"); + }); + + test("should extract multiple text components", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + First paragraph + Second paragraph + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0"]).toBe("First paragraph"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/1"]).toBe("Second paragraph"); + }); + + test("should extract from nested sections and columns", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Column 1 + + + Column 2 + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0"]).toBe("Column 1"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/1/mj-text/0"]).toBe("Column 2"); + }); + + test("should push translated content back to MJML", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Hello World + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0": "Hola Mundo", + }; + + const output = await loader.push("es", translations, input); + + expect(output).toContain("Hola Mundo"); + expect(output).toContain(""); + expect(output).toContain(""); + }); + + test("should push translated attributes back to MJML", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-image/0#alt": "Una imagen hermosa", + }; + + const output = await loader.push("es", translations, input); + + expect(output).toContain("Una imagen hermosa"); + expect(output).toContain('alt="Una imagen hermosa"'); + }); + + test("should handle mj-title component", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + Email Title + + + + + Content + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-head/0/mj-title/0"]).toBe("Email Title"); + }); + + test("should handle mj-preview component", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + This is the preview text + + + + + Content + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-head/0/mj-preview/0"]).toBe("This is the preview text"); + }); + + test("should handle empty text content", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0"]).toBeUndefined(); + }); + + test("should extract text from HTML elements inside mj-table", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + First steps + + How to get started? + Read the guide + and learn more. + + + + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-table/0/tr/0/td/0/p/0"]).toBe("First steps"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-table/0/tr/0/td/0/p/1"]).toContain("How to get started?"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-table/0/tr/0/td/0/p/1"]).toContain('Read the guide'); + }); + + test("should translate HTML elements inside mj-table", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + First steps + + + + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-table/0/tr/0/td/0/p/0": "Primeros pasos", + }; + + const output = await loader.push("es", translations, input); + + expect(output).toContain("Primeros pasos"); + expect(output).not.toContain("First steps"); + }); + + test("should handle whitespace-only text content", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0"]).toBeUndefined(); + }); + + test("should preserve trailing whitespace in mixed HTML content", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + Get started with GitProtect.io + + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0": "Comience con GitProtect.io", + }; + + const output = await loader.push("es", translations, input); + + // Should have space between "con" and "" + expect(output).toContain("Comience con GitProtect.io"); + // Should NOT have missing space (this would be wrong) + expect(output).not.toContain("Comience con"); + }); + + test("should preserve Razor variables in text content", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + Hello @Model.Name + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0": "Hola @Model.Name", + }; + + const output = await loader.push("es", translations, input); + + expect(output).toContain("Hola @Model.Name"); + // Verify variable name not translated + expect(output).not.toContain("@Modelo.Nombre"); + }); + + test("should not extract content from mj-raw blocks", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + @foreach (var x in Model.Items) { + Item text + } + + + +`; + + const result = await loader.pull("en", input); + + // Should NOT extract mj-raw content + const allValues = Object.values(result); + expect(allValues.find((v) => v.includes("@foreach"))).toBeUndefined(); + expect(allValues.find((v) => v.includes("}"))).toBeUndefined(); + + // Should extract mj-text content + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0"]).toBe("Item text"); + }); + + test("should preserve Razor expressions in attributes", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-image/0#alt": "Logo de la empresa", + }; + + const output = await loader.push("es", translations, input); + + // Verify Razor expression preserved in src + expect(output).toContain("@System.Net.WebUtility.HtmlEncode"); + expect(output).toContain("Model.LogoUrl"); + // Verify translated alt attribute + expect(output).toContain("Logo de la empresa"); + }); + + test("should extract from mj-navbar-link components", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + Home + About + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-navbar/0/mj-navbar-link/0"]).toBe("Home"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-navbar/0/mj-navbar-link/1"]).toBe("About"); + }); + + test("should extract from mj-accordion components", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + + FAQ 1 + Answer to question 1 + + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-accordion/0/mj-accordion-element/0/mj-accordion-title/0"]).toBe("FAQ 1"); + expect(result["mjml/mj-body/0/mj-section/0/mj-column/0/mj-accordion/0/mj-accordion-element/0/mj-accordion-text/0"]).toBe("Answer to question 1"); + }); + + test("should handle HTML with inline Razor variables", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + Welcome back, @Model.FirstName! + Your last login was @Model.LastLoginDate. + + + + +`; + + await loader.pull("en", input); + + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0": + "Bienvenido de nuevo, @Model.FirstName! Tu último inicio de sesión fue @Model.LastLoginDate.", + }; + + const output = await loader.push("es", translations, input); + + expect(output).toContain("Bienvenido de nuevo"); + expect(output).toContain("@Model.FirstName"); + expect(output).toContain("@Model.LastLoginDate"); + }); + + test("should handle mj-wrapper structure", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + Wrapped content + + + + +`; + + const result = await loader.pull("en", input); + + expect(result["mjml/mj-body/0/mj-wrapper/0/mj-section/0/mj-column/0/mj-text/0"]).toBe("Wrapped content"); + }); + + test("should preserve space between text and inline tag (real CloudServiceCreated bug)", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + const input = ` + + + + + + Get started with GitProtect.io by Xopero ONE + + + + +`; + + const pulled = await loader.pull("en", input); + + // Translator translates, keeping the HTML structure + const translations = { + "mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0": "Comience con GitProtect.io by Xopero ONE", + }; + + const output = await loader.push("es", translations, input); + + // Critical: space must be preserved before + expect(output).toContain("Comience con "); + // This would be the bug: missing space + expect(output).not.toContain("Comience con"); + + // Verify the full text is correct + expect(output).toContain("Comience con GitProtect.io by Xopero ONE"); + }); + + test("should preserve trailing space when span ends with space (exact CloudServiceCreated structure)", async () => { + const loader = createMjmlLoader(); + loader.setDefaultLocale("en"); + + // This is the EXACT structure from CloudServiceCreated.mjml line 148-149 + const input = ` + + + + + + Get started with GitProtect.io by Xopero ONE + + + + +`; + + const pulled = await loader.pull("en", input); + const key = "mjml/mj-body/0/mj-section/0/mj-column/0/mj-text/0"; + + // Check what was extracted + console.log("Extracted:", JSON.stringify(pulled[key])); + + // The extracted value should preserve the space + expect(pulled[key]).toContain("Get started with "); + + // Translator provides Spanish without wrapper + const translations = { + [key]: "Comience con GitProtect.io by Xopero ONE", + }; + + const output = await loader.push("es", translations, input); + + // The output should have space before + // Either as: Comience con + // Or as: Comience con + expect(output).toMatch(/Comience con (<\/span>)?/); + expect(output).not.toContain("Comience con"); + }); +}); diff --git a/packages/cli/src/cli/loaders/mjml.ts b/packages/cli/src/cli/loaders/mjml.ts new file mode 100644 index 000000000..f36674200 --- /dev/null +++ b/packages/cli/src/cli/loaders/mjml.ts @@ -0,0 +1,332 @@ +import { parseStringPromise, Builder } from "xml2js"; +import * as htmlparser2 from "htmlparser2"; +import { DomHandler } from "domhandler"; +import * as DomSerializer from "dom-serializer"; +import { ILoader } from "./_types"; +import { createLoader } from "./_utils"; + +const LOCALIZABLE_COMPONENTS = [ + "mj-text", + "mj-button", + "mj-title", + "mj-preview", + "mj-navbar-link", + "mj-accordion-title", + "mj-accordion-text", + "p", + "h1", "h2", "h3", "h4", "h5", "h6", + "li", +]; + +const LOCALIZABLE_ATTRIBUTES: Record = { + "mj-image": ["alt", "title"], + "mj-button": ["title", "aria-label"], + "mj-social-element": ["title", "alt"], + "img": ["alt", "title"], + "a": ["title", "aria-label"], +}; + +export default function createMjmlLoader(): ILoader< + string, + Record +> { + return createLoader({ + async pull(locale, input) { + const result: Record = {}; + + try { + const parsed = await parseStringPromise(input, { + explicitArray: true, + explicitChildren: true, + preserveChildrenOrder: true, + charsAsChildren: true, + includeWhiteChars: true, + mergeAttrs: false, + trim: false, + attrkey: "$", + charkey: "_", + childkey: "$$", + }); + + if (!parsed || typeof parsed !== "object") { + console.error("Failed to parse MJML: invalid parsed structure"); + return result; + } + + const rootKey = Object.keys(parsed).find(key => !key.startsWith("_") && !key.startsWith("$")); + const rootNode = rootKey ? parsed[rootKey] : parsed; + const rootPath = rootNode["#name"] || rootKey || ""; + + traverse(rootNode, (node, path, componentName) => { + if (typeof node !== "object") return; + + const localizableAttrs = LOCALIZABLE_ATTRIBUTES[componentName]; + if (localizableAttrs && node.$) { + localizableAttrs.forEach((attr) => { + const attrValue = node.$[attr]; + if (attrValue) { + result[`${path}#${attr}`] = attrValue; + } + }); + } + + if (LOCALIZABLE_COMPONENTS.includes(componentName)) { + const innerHTML = getInnerHTML(node); + if (innerHTML) { + result[path] = innerHTML; + return "SKIP_CHILDREN"; + } + } + + return undefined; + }, rootPath); + } catch (error) { + console.error("Failed to parse MJML:", error); + } + + return result; + }, + + async push(locale, data, originalInput) { + try { + const parsed = await parseStringPromise(originalInput || "", { + explicitArray: true, + explicitChildren: true, + preserveChildrenOrder: true, + charsAsChildren: true, + includeWhiteChars: true, + mergeAttrs: false, + trim: false, + attrkey: "$", + charkey: "_", + childkey: "$$", + }); + + if (!parsed || typeof parsed !== "object") { + console.error("Failed to parse MJML for push: invalid parsed structure"); + return originalInput || ""; + } + + const rootKey = Object.keys(parsed).find(key => !key.startsWith("_") && !key.startsWith("$")); + const rootNode = rootKey ? parsed[rootKey] : parsed; + const rootPath = rootNode["#name"] || rootKey || ""; + + traverse(rootNode, (node, path, componentName) => { + if (typeof node !== "object") return; + + const localizableAttrs = LOCALIZABLE_ATTRIBUTES[componentName]; + if (localizableAttrs && node.$) { + localizableAttrs.forEach((attr) => { + const attrKey = `${path}#${attr}`; + if (data[attrKey] !== undefined) { + node.$[attr] = data[attrKey]; + } + }); + } + + if (LOCALIZABLE_COMPONENTS.includes(componentName) && data[path]) { + setInnerHTML(node, data[path]); + return "SKIP_CHILDREN"; + } + + return undefined; + }, rootPath); + + return serializeMjml(parsed); + } catch (error) { + console.error("Failed to build MJML:", error); + return ""; + } + }, + }); +} + +function traverse( + node: any, + visitor: (node: any, path: string, componentName: string) => string | undefined, + path: string = "", +) { + if (!node || typeof node !== "object") { + return; + } + + const children = node.$$; + if (!Array.isArray(children)) { + return; + } + + const elementCounts = new Map(); + + children.forEach((child: any) => { + const elementName = child["#name"]; + + if (!elementName || elementName.startsWith("__")) { + return; + } + + const currentIndex = elementCounts.get(elementName) || 0; + elementCounts.set(elementName, currentIndex + 1); + + const currentPath = path + ? `${path}/${elementName}/${currentIndex}` + : `${elementName}/${currentIndex}`; + + const result = visitor(child, currentPath, elementName); + + if (result !== "SKIP_CHILDREN") { + traverse(child, visitor, currentPath); + } + }); +} + +function getInnerHTML(node: any): string | null { + if (!node.$$ || !Array.isArray(node.$$)) { + return null; + } + + let html = ""; + node.$$.forEach((child: any) => { + html += serializeXmlNode(child); + }); + + return html.trim() || null; +} + +function setInnerHTML(node: any, htmlContent: string): void { + const handler = new DomHandler(); + const parser = new htmlparser2.Parser(handler); + parser.write(htmlContent); + parser.end(); + + const newChildren: any[] = []; + + for (const domNode of handler.dom) { + const xmlNode = convertDomToXmlNode(domNode); + if (xmlNode) { + newChildren.push(xmlNode); + } + } + + node.$$ = newChildren; + node._ = htmlContent; +} + +function serializeXmlNode(node: any): string { + const name = node["#name"]; + + if (name === "__text__") { + return node._ || ""; + } + + if (name === "__cdata") { + return ``; + } + + if (!name || name.startsWith("__")) { + return ""; + } + + const attrs = node.$ || {}; + const attrString = Object.entries(attrs) + .map(([key, value]) => ` ${key}="${escapeAttributeValue(String(value))}"`) + .join(""); + + const children = node.$$ || []; + if (children.length === 0) { + const textContent = node._ || ""; + if (textContent) { + return `<${name}${attrString}>${textContent}${name}>`; + } + return `<${name}${attrString} />`; + } + + const childContent = children.map(serializeXmlNode).join(""); + return `<${name}${attrString}>${childContent}${name}>`; +} + +function convertDomToXmlNode(domNode: any): any { + if (domNode.type === "text") { + return { + "#name": "__text__", + "_": domNode.data, + }; + } + + if (domNode.type === "tag") { + const xmlNode: any = { + "#name": domNode.name, + "$": domNode.attribs || {}, + "$$": [], + }; + + if (domNode.children && domNode.children.length > 0) { + for (const child of domNode.children) { + const xmlChild = convertDomToXmlNode(child); + if (xmlChild) { + xmlNode.$$.push(xmlChild); + } + } + } + + return xmlNode; + } + + return null; +} + +function serializeMjml(parsed: any): string { + const xmlDec = '\n'; + + const rootKey = Object.keys(parsed).find(key => !key.startsWith("_") && !key.startsWith("$")); + const rootNode = rootKey ? parsed[rootKey] : parsed; + + const body = serializeElement(rootNode); + return xmlDec + body; +} + +function serializeElement(node: any, indent: string = ""): string { + if (!node) { + return ""; + } + + const name = node["#name"] ?? "mjml"; + + if (name === "__text__") { + return node._ ?? ""; + } + + if (name === "__cdata") { + return ``; + } + + if (name === "__comment__") { + return ``; + } + + const attributes = node.$ ?? {}; + const attrString = Object.entries(attributes) + .map(([key, value]) => ` ${key}="${escapeAttributeValue(String(value))}"`) + .join(""); + + const children = Array.isArray(node.$$) ? node.$$ : []; + + if (children.length === 0) { + const textContent = node._ ?? ""; + if (textContent) { + return `${indent}<${name}${attrString}>${textContent}${name}>`; + } + return `${indent}<${name}${attrString} />`; + } + + const childContent = children.map((child: any) => serializeElement(child, indent)).join(""); + return `${indent}<${name}${attrString}>${childContent}${name}>`; +} + +function escapeAttributeValue(value: string): string { + return value + .replace(/&/g, "&") + .replace(/"/g, """) + .replace(//g, ">") + .replace(/'/g, "'"); +} diff --git a/packages/spec/src/formats.ts b/packages/spec/src/formats.ts index e5acd58cd..e5715fd1f 100644 --- a/packages/spec/src/formats.ts +++ b/packages/spec/src/formats.ts @@ -12,6 +12,7 @@ export const bucketTypes = [ "markdown", "markdoc", "mdx", + "mjml", "xcode-strings", "xcode-stringsdict", "xcode-xcstrings",
First steps
+ How to get started? + Read the guide + and learn more. +