scratch-l10n 6.0.75 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (806) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/editor/blocks/pt-br.json +1 -1
  3. package/editor/extensions/ab.json +20 -0
  4. package/editor/extensions/af.json +20 -0
  5. package/editor/extensions/am.json +20 -0
  6. package/editor/extensions/an.json +20 -0
  7. package/editor/extensions/ar.json +20 -0
  8. package/editor/extensions/ast.json +20 -0
  9. package/editor/extensions/az.json +20 -0
  10. package/editor/extensions/be.json +20 -0
  11. package/editor/extensions/bg.json +20 -0
  12. package/editor/extensions/bn.json +20 -0
  13. package/editor/extensions/ca.json +20 -0
  14. package/editor/extensions/ckb.json +20 -0
  15. package/editor/extensions/cs.json +20 -0
  16. package/editor/extensions/cy.json +20 -0
  17. package/editor/extensions/da.json +20 -0
  18. package/editor/extensions/de.json +20 -0
  19. package/editor/extensions/el.json +20 -0
  20. package/editor/extensions/en.json +20 -0
  21. package/editor/extensions/eo.json +20 -0
  22. package/editor/extensions/es-419.json +20 -0
  23. package/editor/extensions/es.json +20 -0
  24. package/editor/extensions/et.json +20 -0
  25. package/editor/extensions/eu.json +20 -0
  26. package/editor/extensions/fa.json +20 -0
  27. package/editor/extensions/fi.json +20 -0
  28. package/editor/extensions/fil.json +20 -0
  29. package/editor/extensions/fr.json +20 -0
  30. package/editor/extensions/fy.json +20 -0
  31. package/editor/extensions/ga.json +20 -0
  32. package/editor/extensions/gd.json +20 -0
  33. package/editor/extensions/gl.json +20 -0
  34. package/editor/extensions/ha.json +20 -0
  35. package/editor/extensions/he.json +20 -0
  36. package/editor/extensions/hi.json +20 -0
  37. package/editor/extensions/hr.json +20 -0
  38. package/editor/extensions/ht.json +20 -0
  39. package/editor/extensions/hu.json +20 -0
  40. package/editor/extensions/hy.json +20 -0
  41. package/editor/extensions/id.json +20 -0
  42. package/editor/extensions/is.json +20 -0
  43. package/editor/extensions/it.json +20 -0
  44. package/editor/extensions/ja-Hira.json +20 -0
  45. package/editor/extensions/ja.json +20 -0
  46. package/editor/extensions/ka.json +20 -0
  47. package/editor/extensions/kk.json +20 -0
  48. package/editor/extensions/km.json +20 -0
  49. package/editor/extensions/ko.json +20 -0
  50. package/editor/extensions/ku.json +20 -0
  51. package/editor/extensions/lt.json +20 -0
  52. package/editor/extensions/lv.json +20 -0
  53. package/editor/extensions/mi.json +20 -0
  54. package/editor/extensions/mn.json +20 -0
  55. package/editor/extensions/nb.json +20 -0
  56. package/editor/extensions/nl.json +20 -0
  57. package/editor/extensions/nn.json +20 -0
  58. package/editor/extensions/nso.json +20 -0
  59. package/editor/extensions/oc.json +20 -0
  60. package/editor/extensions/or.json +20 -0
  61. package/editor/extensions/pl.json +20 -0
  62. package/editor/extensions/pt-br.json +20 -0
  63. package/editor/extensions/pt.json +20 -0
  64. package/editor/extensions/qu.json +20 -0
  65. package/editor/extensions/rap.json +20 -0
  66. package/editor/extensions/ro.json +20 -0
  67. package/editor/extensions/ru.json +20 -0
  68. package/editor/extensions/sk.json +20 -0
  69. package/editor/extensions/sl.json +20 -0
  70. package/editor/extensions/sr.json +20 -0
  71. package/editor/extensions/sv.json +20 -0
  72. package/editor/extensions/sw.json +20 -0
  73. package/editor/extensions/th.json +20 -0
  74. package/editor/extensions/tn.json +20 -0
  75. package/editor/extensions/tr.json +20 -0
  76. package/editor/extensions/uk.json +20 -0
  77. package/editor/extensions/uz.json +20 -0
  78. package/editor/extensions/vi.json +20 -0
  79. package/editor/extensions/xh.json +20 -0
  80. package/editor/extensions/zh-cn.json +20 -0
  81. package/editor/extensions/zh-tw.json +20 -0
  82. package/editor/extensions/zu.json +20 -0
  83. package/editor/interface/ab.json +24 -12
  84. package/editor/interface/af.json +24 -12
  85. package/editor/interface/am.json +24 -12
  86. package/editor/interface/an.json +24 -12
  87. package/editor/interface/ar.json +32 -20
  88. package/editor/interface/ast.json +24 -12
  89. package/editor/interface/az.json +24 -12
  90. package/editor/interface/be.json +24 -12
  91. package/editor/interface/bg.json +24 -12
  92. package/editor/interface/bn.json +24 -12
  93. package/editor/interface/ca.json +24 -12
  94. package/editor/interface/ckb.json +24 -12
  95. package/editor/interface/cs.json +41 -29
  96. package/editor/interface/cy.json +24 -12
  97. package/editor/interface/da.json +24 -12
  98. package/editor/interface/de.json +24 -12
  99. package/editor/interface/el.json +24 -12
  100. package/editor/interface/en.json +24 -12
  101. package/editor/interface/eo.json +24 -12
  102. package/editor/interface/es-419.json +24 -12
  103. package/editor/interface/es.json +55 -43
  104. package/editor/interface/et.json +24 -12
  105. package/editor/interface/eu.json +24 -12
  106. package/editor/interface/fa.json +24 -12
  107. package/editor/interface/fi.json +56 -44
  108. package/editor/interface/fil.json +24 -12
  109. package/editor/interface/fr.json +24 -12
  110. package/editor/interface/fy.json +24 -12
  111. package/editor/interface/ga.json +24 -12
  112. package/editor/interface/gd.json +24 -12
  113. package/editor/interface/gl.json +24 -12
  114. package/editor/interface/ha.json +24 -12
  115. package/editor/interface/he.json +24 -12
  116. package/editor/interface/hi.json +24 -12
  117. package/editor/interface/hr.json +24 -12
  118. package/editor/interface/ht.json +24 -12
  119. package/editor/interface/hu.json +24 -12
  120. package/editor/interface/hy.json +24 -12
  121. package/editor/interface/id.json +24 -12
  122. package/editor/interface/is.json +24 -12
  123. package/editor/interface/it.json +24 -12
  124. package/editor/interface/ja-Hira.json +24 -12
  125. package/editor/interface/ja.json +33 -21
  126. package/editor/interface/ka.json +24 -12
  127. package/editor/interface/kk.json +24 -12
  128. package/editor/interface/km.json +24 -12
  129. package/editor/interface/ko.json +24 -12
  130. package/editor/interface/ku.json +24 -12
  131. package/editor/interface/lt.json +24 -12
  132. package/editor/interface/lv.json +24 -12
  133. package/editor/interface/mi.json +24 -12
  134. package/editor/interface/mn.json +24 -12
  135. package/editor/interface/nb.json +24 -12
  136. package/editor/interface/nl.json +24 -12
  137. package/editor/interface/nn.json +24 -12
  138. package/editor/interface/nso.json +24 -12
  139. package/editor/interface/oc.json +24 -12
  140. package/editor/interface/or.json +24 -12
  141. package/editor/interface/pl.json +24 -12
  142. package/editor/interface/pt-br.json +35 -23
  143. package/editor/interface/pt.json +24 -12
  144. package/editor/interface/qu.json +24 -12
  145. package/editor/interface/rap.json +24 -12
  146. package/editor/interface/ro.json +54 -42
  147. package/editor/interface/ru.json +24 -12
  148. package/editor/interface/sk.json +24 -12
  149. package/editor/interface/sl.json +24 -12
  150. package/editor/interface/sr.json +24 -12
  151. package/editor/interface/sv.json +24 -12
  152. package/editor/interface/sw.json +24 -12
  153. package/editor/interface/th.json +24 -12
  154. package/editor/interface/tn.json +24 -12
  155. package/editor/interface/tr.json +24 -12
  156. package/editor/interface/uk.json +24 -12
  157. package/editor/interface/uz.json +24 -12
  158. package/editor/interface/vi.json +24 -12
  159. package/editor/interface/xh.json +24 -12
  160. package/editor/interface/zh-cn.json +24 -12
  161. package/editor/interface/zh-tw.json +54 -42
  162. package/editor/interface/zu.json +24 -12
  163. package/locales/blocks-msgs.js +1 -1
  164. package/locales/editor-msgs.js +3688 -1128
  165. package/locales/extensions-msgs.js +1600 -0
  166. package/locales/interface-msgs.js +2088 -1128
  167. package/package.json +1 -1
  168. package/scripts/lib/pull-and-validate.mts +142 -0
  169. package/scripts/lib/validate.mts +44 -17
  170. package/scripts/tx-pull-editor.mts +13 -35
  171. package/scripts/tx-pull-www.mts +23 -60
  172. package/scripts/validate-translations.mts +4 -5
  173. package/scripts/validate-www.mts +4 -5
  174. package/www/scratch-website.about-l10njson/ab.json +6 -32
  175. package/www/scratch-website.about-l10njson/af.json +6 -32
  176. package/www/scratch-website.about-l10njson/am.json +6 -32
  177. package/www/scratch-website.about-l10njson/an.json +6 -32
  178. package/www/scratch-website.about-l10njson/ar.json +6 -32
  179. package/www/scratch-website.about-l10njson/ast.json +6 -32
  180. package/www/scratch-website.about-l10njson/az.json +6 -32
  181. package/www/scratch-website.about-l10njson/be.json +6 -32
  182. package/www/scratch-website.about-l10njson/bg.json +6 -32
  183. package/www/scratch-website.about-l10njson/bn.json +6 -32
  184. package/www/scratch-website.about-l10njson/ca.json +6 -32
  185. package/www/scratch-website.about-l10njson/ckb.json +6 -32
  186. package/www/scratch-website.about-l10njson/cs.json +6 -32
  187. package/www/scratch-website.about-l10njson/cy.json +6 -32
  188. package/www/scratch-website.about-l10njson/da.json +6 -32
  189. package/www/scratch-website.about-l10njson/de.json +6 -32
  190. package/www/scratch-website.about-l10njson/el.json +6 -32
  191. package/www/scratch-website.about-l10njson/en.json +6 -32
  192. package/www/scratch-website.about-l10njson/eo.json +6 -32
  193. package/www/scratch-website.about-l10njson/es-419.json +6 -32
  194. package/www/scratch-website.about-l10njson/es.json +6 -32
  195. package/www/scratch-website.about-l10njson/et.json +6 -32
  196. package/www/scratch-website.about-l10njson/eu.json +6 -32
  197. package/www/scratch-website.about-l10njson/fa.json +6 -32
  198. package/www/scratch-website.about-l10njson/fi.json +7 -33
  199. package/www/scratch-website.about-l10njson/fil.json +6 -32
  200. package/www/scratch-website.about-l10njson/fr.json +6 -32
  201. package/www/scratch-website.about-l10njson/fy.json +6 -32
  202. package/www/scratch-website.about-l10njson/ga.json +6 -32
  203. package/www/scratch-website.about-l10njson/gd.json +6 -32
  204. package/www/scratch-website.about-l10njson/gl.json +6 -32
  205. package/www/scratch-website.about-l10njson/ha.json +6 -32
  206. package/www/scratch-website.about-l10njson/he.json +6 -32
  207. package/www/scratch-website.about-l10njson/hi.json +6 -32
  208. package/www/scratch-website.about-l10njson/hr.json +6 -32
  209. package/www/scratch-website.about-l10njson/ht.json +6 -32
  210. package/www/scratch-website.about-l10njson/hu.json +6 -32
  211. package/www/scratch-website.about-l10njson/hy.json +6 -32
  212. package/www/scratch-website.about-l10njson/id.json +6 -32
  213. package/www/scratch-website.about-l10njson/is.json +6 -32
  214. package/www/scratch-website.about-l10njson/it.json +6 -32
  215. package/www/scratch-website.about-l10njson/ja-Hira.json +6 -32
  216. package/www/scratch-website.about-l10njson/ja.json +6 -32
  217. package/www/scratch-website.about-l10njson/ka.json +6 -32
  218. package/www/scratch-website.about-l10njson/kk.json +6 -32
  219. package/www/scratch-website.about-l10njson/km.json +6 -32
  220. package/www/scratch-website.about-l10njson/ko.json +6 -32
  221. package/www/scratch-website.about-l10njson/ku.json +6 -32
  222. package/www/scratch-website.about-l10njson/lt.json +6 -32
  223. package/www/scratch-website.about-l10njson/lv.json +6 -32
  224. package/www/scratch-website.about-l10njson/mi.json +6 -32
  225. package/www/scratch-website.about-l10njson/mn.json +6 -32
  226. package/www/scratch-website.about-l10njson/nb.json +6 -32
  227. package/www/scratch-website.about-l10njson/nl.json +6 -32
  228. package/www/scratch-website.about-l10njson/nn.json +7 -33
  229. package/www/scratch-website.about-l10njson/nso.json +6 -32
  230. package/www/scratch-website.about-l10njson/oc.json +6 -32
  231. package/www/scratch-website.about-l10njson/or.json +6 -32
  232. package/www/scratch-website.about-l10njson/pl.json +6 -32
  233. package/www/scratch-website.about-l10njson/pt-br.json +6 -32
  234. package/www/scratch-website.about-l10njson/pt.json +6 -32
  235. package/www/scratch-website.about-l10njson/qu.json +6 -32
  236. package/www/scratch-website.about-l10njson/rap.json +6 -32
  237. package/www/scratch-website.about-l10njson/ro.json +6 -32
  238. package/www/scratch-website.about-l10njson/ru.json +6 -32
  239. package/www/scratch-website.about-l10njson/sk.json +6 -32
  240. package/www/scratch-website.about-l10njson/sl.json +6 -32
  241. package/www/scratch-website.about-l10njson/sr.json +6 -32
  242. package/www/scratch-website.about-l10njson/sv.json +6 -32
  243. package/www/scratch-website.about-l10njson/sw.json +6 -32
  244. package/www/scratch-website.about-l10njson/th.json +6 -32
  245. package/www/scratch-website.about-l10njson/tn.json +6 -32
  246. package/www/scratch-website.about-l10njson/tr.json +6 -32
  247. package/www/scratch-website.about-l10njson/uk.json +6 -32
  248. package/www/scratch-website.about-l10njson/uz.json +6 -32
  249. package/www/scratch-website.about-l10njson/vi.json +7 -33
  250. package/www/scratch-website.about-l10njson/xh.json +6 -32
  251. package/www/scratch-website.about-l10njson/zh-cn.json +6 -32
  252. package/www/scratch-website.about-l10njson/zh-tw.json +6 -32
  253. package/www/scratch-website.about-l10njson/zu.json +6 -32
  254. package/www/scratch-website.annual-report-2019-l10njson/fi.json +1 -1
  255. package/www/scratch-website.annual-report-2019-l10njson/lt.json +2 -2
  256. package/www/scratch-website.annual-report-2019-l10njson/mi.json +1 -1
  257. package/www/scratch-website.annual-report-2019-l10njson/vi.json +3 -3
  258. package/www/scratch-website.annual-report-2020-l10njson/lt.json +1 -1
  259. package/www/scratch-website.annual-report-2020-l10njson/mi.json +1 -1
  260. package/www/scratch-website.annual-report-2020-l10njson/vi.json +3 -3
  261. package/www/scratch-website.annual-report-2021-l10njson/fi.json +1 -1
  262. package/www/scratch-website.annual-report-2021-l10njson/hi.json +163 -163
  263. package/www/scratch-website.annual-report-2021-l10njson/lt.json +2 -2
  264. package/www/scratch-website.annual-report-2021-l10njson/mi.json +1 -1
  265. package/www/scratch-website.annual-report-2021-l10njson/vi.json +114 -114
  266. package/www/scratch-website.become-a-scratcher-l10njson/es.json +9 -9
  267. package/www/scratch-website.become-a-scratcher-l10njson/he.json +6 -6
  268. package/www/scratch-website.become-a-scratcher-l10njson/pt-br.json +2 -2
  269. package/www/scratch-website.contact-us-l10njson/ab.json +3 -4
  270. package/www/scratch-website.contact-us-l10njson/af.json +3 -4
  271. package/www/scratch-website.contact-us-l10njson/am.json +3 -4
  272. package/www/scratch-website.contact-us-l10njson/an.json +3 -4
  273. package/www/scratch-website.contact-us-l10njson/ar.json +3 -4
  274. package/www/scratch-website.contact-us-l10njson/ast.json +3 -4
  275. package/www/scratch-website.contact-us-l10njson/az.json +3 -4
  276. package/www/scratch-website.contact-us-l10njson/be.json +3 -4
  277. package/www/scratch-website.contact-us-l10njson/bg.json +3 -4
  278. package/www/scratch-website.contact-us-l10njson/bn.json +3 -4
  279. package/www/scratch-website.contact-us-l10njson/ca.json +3 -4
  280. package/www/scratch-website.contact-us-l10njson/ckb.json +3 -4
  281. package/www/scratch-website.contact-us-l10njson/cs.json +2 -3
  282. package/www/scratch-website.contact-us-l10njson/cy.json +3 -4
  283. package/www/scratch-website.contact-us-l10njson/da.json +3 -4
  284. package/www/scratch-website.contact-us-l10njson/de.json +3 -4
  285. package/www/scratch-website.contact-us-l10njson/el.json +3 -4
  286. package/www/scratch-website.contact-us-l10njson/en.json +3 -4
  287. package/www/scratch-website.contact-us-l10njson/eo.json +3 -4
  288. package/www/scratch-website.contact-us-l10njson/es-419.json +3 -4
  289. package/www/scratch-website.contact-us-l10njson/es.json +3 -4
  290. package/www/scratch-website.contact-us-l10njson/et.json +3 -4
  291. package/www/scratch-website.contact-us-l10njson/eu.json +3 -4
  292. package/www/scratch-website.contact-us-l10njson/fa.json +3 -4
  293. package/www/scratch-website.contact-us-l10njson/fi.json +3 -4
  294. package/www/scratch-website.contact-us-l10njson/fil.json +3 -4
  295. package/www/scratch-website.contact-us-l10njson/fr.json +3 -4
  296. package/www/scratch-website.contact-us-l10njson/fy.json +3 -4
  297. package/www/scratch-website.contact-us-l10njson/ga.json +3 -4
  298. package/www/scratch-website.contact-us-l10njson/gd.json +3 -4
  299. package/www/scratch-website.contact-us-l10njson/gl.json +3 -4
  300. package/www/scratch-website.contact-us-l10njson/ha.json +3 -4
  301. package/www/scratch-website.contact-us-l10njson/he.json +3 -4
  302. package/www/scratch-website.contact-us-l10njson/hi.json +3 -4
  303. package/www/scratch-website.contact-us-l10njson/hr.json +3 -4
  304. package/www/scratch-website.contact-us-l10njson/ht.json +3 -4
  305. package/www/scratch-website.contact-us-l10njson/hu.json +3 -4
  306. package/www/scratch-website.contact-us-l10njson/hy.json +3 -4
  307. package/www/scratch-website.contact-us-l10njson/id.json +3 -4
  308. package/www/scratch-website.contact-us-l10njson/is.json +3 -4
  309. package/www/scratch-website.contact-us-l10njson/it.json +3 -4
  310. package/www/scratch-website.contact-us-l10njson/ja-Hira.json +3 -4
  311. package/www/scratch-website.contact-us-l10njson/ja.json +3 -4
  312. package/www/scratch-website.contact-us-l10njson/ka.json +3 -4
  313. package/www/scratch-website.contact-us-l10njson/kk.json +3 -4
  314. package/www/scratch-website.contact-us-l10njson/km.json +3 -4
  315. package/www/scratch-website.contact-us-l10njson/ko.json +3 -4
  316. package/www/scratch-website.contact-us-l10njson/ku.json +3 -4
  317. package/www/scratch-website.contact-us-l10njson/lt.json +3 -4
  318. package/www/scratch-website.contact-us-l10njson/lv.json +3 -4
  319. package/www/scratch-website.contact-us-l10njson/mi.json +3 -4
  320. package/www/scratch-website.contact-us-l10njson/mn.json +3 -4
  321. package/www/scratch-website.contact-us-l10njson/nb.json +3 -4
  322. package/www/scratch-website.contact-us-l10njson/nl.json +3 -4
  323. package/www/scratch-website.contact-us-l10njson/nn.json +3 -4
  324. package/www/scratch-website.contact-us-l10njson/nso.json +3 -4
  325. package/www/scratch-website.contact-us-l10njson/oc.json +3 -4
  326. package/www/scratch-website.contact-us-l10njson/or.json +3 -4
  327. package/www/scratch-website.contact-us-l10njson/pl.json +3 -4
  328. package/www/scratch-website.contact-us-l10njson/pt-br.json +3 -4
  329. package/www/scratch-website.contact-us-l10njson/pt.json +3 -4
  330. package/www/scratch-website.contact-us-l10njson/qu.json +3 -4
  331. package/www/scratch-website.contact-us-l10njson/rap.json +3 -4
  332. package/www/scratch-website.contact-us-l10njson/ro.json +3 -4
  333. package/www/scratch-website.contact-us-l10njson/ru.json +3 -4
  334. package/www/scratch-website.contact-us-l10njson/sk.json +3 -4
  335. package/www/scratch-website.contact-us-l10njson/sl.json +3 -4
  336. package/www/scratch-website.contact-us-l10njson/sr.json +3 -4
  337. package/www/scratch-website.contact-us-l10njson/sv.json +3 -4
  338. package/www/scratch-website.contact-us-l10njson/sw.json +3 -4
  339. package/www/scratch-website.contact-us-l10njson/th.json +3 -4
  340. package/www/scratch-website.contact-us-l10njson/tn.json +3 -4
  341. package/www/scratch-website.contact-us-l10njson/tr.json +3 -4
  342. package/www/scratch-website.contact-us-l10njson/uk.json +3 -4
  343. package/www/scratch-website.contact-us-l10njson/uz.json +3 -4
  344. package/www/scratch-website.contact-us-l10njson/vi.json +10 -11
  345. package/www/scratch-website.contact-us-l10njson/xh.json +3 -4
  346. package/www/scratch-website.contact-us-l10njson/zh-cn.json +3 -4
  347. package/www/scratch-website.contact-us-l10njson/zh-tw.json +3 -4
  348. package/www/scratch-website.contact-us-l10njson/zu.json +3 -4
  349. package/www/scratch-website.cookies-l10njson/hi.json +9 -9
  350. package/www/scratch-website.cookies-l10njson/ja-Hira.json +2 -2
  351. package/www/scratch-website.credits-l10njson/fi.json +10 -10
  352. package/www/scratch-website.credits-l10njson/he.json +1 -1
  353. package/www/scratch-website.credits-l10njson/mi.json +1 -1
  354. package/www/scratch-website.credits-l10njson/vi.json +1 -1
  355. package/www/scratch-website.dmca-l10njson/cs.json +3 -3
  356. package/www/scratch-website.dmca-l10njson/es-419.json +3 -3
  357. package/www/scratch-website.dmca-l10njson/es.json +3 -3
  358. package/www/scratch-website.dmca-l10njson/fi.json +3 -3
  359. package/www/scratch-website.dmca-l10njson/ja-Hira.json +3 -3
  360. package/www/scratch-website.dmca-l10njson/ja.json +4 -4
  361. package/www/scratch-website.dmca-l10njson/pt-br.json +2 -2
  362. package/www/scratch-website.dmca-l10njson/pt.json +2 -2
  363. package/www/scratch-website.dmca-l10njson/sk.json +3 -3
  364. package/www/scratch-website.download-l10njson/vi.json +1 -1
  365. package/www/scratch-website.download-scratch-link-l10njson/fi.json +8 -8
  366. package/www/scratch-website.download-scratch2-l10njson/vi.json +1 -1
  367. package/www/scratch-website.educator-landing-l10njson/vi.json +1 -1
  368. package/www/scratch-website.ev3-l10njson/sk.json +3 -3
  369. package/www/scratch-website.faq-l10njson/ab.json +3 -12
  370. package/www/scratch-website.faq-l10njson/af.json +3 -12
  371. package/www/scratch-website.faq-l10njson/am.json +3 -12
  372. package/www/scratch-website.faq-l10njson/an.json +3 -12
  373. package/www/scratch-website.faq-l10njson/ar.json +3 -12
  374. package/www/scratch-website.faq-l10njson/ast.json +3 -12
  375. package/www/scratch-website.faq-l10njson/az.json +3 -12
  376. package/www/scratch-website.faq-l10njson/be.json +3 -12
  377. package/www/scratch-website.faq-l10njson/bg.json +3 -12
  378. package/www/scratch-website.faq-l10njson/bn.json +3 -12
  379. package/www/scratch-website.faq-l10njson/ca.json +3 -12
  380. package/www/scratch-website.faq-l10njson/ckb.json +3 -12
  381. package/www/scratch-website.faq-l10njson/cs.json +3 -12
  382. package/www/scratch-website.faq-l10njson/cy.json +3 -12
  383. package/www/scratch-website.faq-l10njson/da.json +3 -12
  384. package/www/scratch-website.faq-l10njson/de.json +3 -12
  385. package/www/scratch-website.faq-l10njson/el.json +3 -12
  386. package/www/scratch-website.faq-l10njson/en.json +3 -12
  387. package/www/scratch-website.faq-l10njson/eo.json +3 -12
  388. package/www/scratch-website.faq-l10njson/es-419.json +3 -12
  389. package/www/scratch-website.faq-l10njson/es.json +3 -12
  390. package/www/scratch-website.faq-l10njson/et.json +3 -12
  391. package/www/scratch-website.faq-l10njson/eu.json +3 -12
  392. package/www/scratch-website.faq-l10njson/fa.json +3 -12
  393. package/www/scratch-website.faq-l10njson/fi.json +3 -12
  394. package/www/scratch-website.faq-l10njson/fil.json +3 -12
  395. package/www/scratch-website.faq-l10njson/fr.json +3 -12
  396. package/www/scratch-website.faq-l10njson/fy.json +3 -12
  397. package/www/scratch-website.faq-l10njson/ga.json +3 -12
  398. package/www/scratch-website.faq-l10njson/gd.json +3 -12
  399. package/www/scratch-website.faq-l10njson/gl.json +3 -12
  400. package/www/scratch-website.faq-l10njson/ha.json +3 -12
  401. package/www/scratch-website.faq-l10njson/he.json +3 -12
  402. package/www/scratch-website.faq-l10njson/hi.json +3 -12
  403. package/www/scratch-website.faq-l10njson/hr.json +3 -12
  404. package/www/scratch-website.faq-l10njson/ht.json +3 -12
  405. package/www/scratch-website.faq-l10njson/hu.json +3 -12
  406. package/www/scratch-website.faq-l10njson/hy.json +3 -12
  407. package/www/scratch-website.faq-l10njson/id.json +3 -12
  408. package/www/scratch-website.faq-l10njson/is.json +3 -12
  409. package/www/scratch-website.faq-l10njson/it.json +3 -12
  410. package/www/scratch-website.faq-l10njson/ja-Hira.json +3 -12
  411. package/www/scratch-website.faq-l10njson/ja.json +3 -12
  412. package/www/scratch-website.faq-l10njson/ka.json +3 -12
  413. package/www/scratch-website.faq-l10njson/kk.json +3 -12
  414. package/www/scratch-website.faq-l10njson/km.json +3 -12
  415. package/www/scratch-website.faq-l10njson/ko.json +3 -12
  416. package/www/scratch-website.faq-l10njson/ku.json +3 -12
  417. package/www/scratch-website.faq-l10njson/lt.json +7 -16
  418. package/www/scratch-website.faq-l10njson/lv.json +3 -12
  419. package/www/scratch-website.faq-l10njson/mi.json +3 -12
  420. package/www/scratch-website.faq-l10njson/mn.json +3 -12
  421. package/www/scratch-website.faq-l10njson/nb.json +3 -12
  422. package/www/scratch-website.faq-l10njson/nl.json +3 -12
  423. package/www/scratch-website.faq-l10njson/nn.json +3 -12
  424. package/www/scratch-website.faq-l10njson/nso.json +3 -12
  425. package/www/scratch-website.faq-l10njson/oc.json +3 -12
  426. package/www/scratch-website.faq-l10njson/or.json +3 -12
  427. package/www/scratch-website.faq-l10njson/pl.json +3 -12
  428. package/www/scratch-website.faq-l10njson/pt-br.json +6 -15
  429. package/www/scratch-website.faq-l10njson/pt.json +3 -12
  430. package/www/scratch-website.faq-l10njson/qu.json +3 -12
  431. package/www/scratch-website.faq-l10njson/rap.json +3 -12
  432. package/www/scratch-website.faq-l10njson/ro.json +3 -12
  433. package/www/scratch-website.faq-l10njson/ru.json +3 -12
  434. package/www/scratch-website.faq-l10njson/sk.json +3 -12
  435. package/www/scratch-website.faq-l10njson/sl.json +3 -12
  436. package/www/scratch-website.faq-l10njson/sr.json +3 -12
  437. package/www/scratch-website.faq-l10njson/sv.json +3 -12
  438. package/www/scratch-website.faq-l10njson/sw.json +3 -12
  439. package/www/scratch-website.faq-l10njson/th.json +3 -12
  440. package/www/scratch-website.faq-l10njson/tn.json +3 -12
  441. package/www/scratch-website.faq-l10njson/tr.json +3 -12
  442. package/www/scratch-website.faq-l10njson/uk.json +3 -12
  443. package/www/scratch-website.faq-l10njson/uz.json +3 -12
  444. package/www/scratch-website.faq-l10njson/vi.json +7 -16
  445. package/www/scratch-website.faq-l10njson/xh.json +3 -12
  446. package/www/scratch-website.faq-l10njson/zh-cn.json +3 -12
  447. package/www/scratch-website.faq-l10njson/zh-tw.json +3 -12
  448. package/www/scratch-website.faq-l10njson/zu.json +3 -12
  449. package/www/scratch-website.general-l10njson/ab.json +7 -9
  450. package/www/scratch-website.general-l10njson/af.json +7 -9
  451. package/www/scratch-website.general-l10njson/am.json +7 -9
  452. package/www/scratch-website.general-l10njson/an.json +7 -9
  453. package/www/scratch-website.general-l10njson/ar.json +7 -9
  454. package/www/scratch-website.general-l10njson/ast.json +7 -9
  455. package/www/scratch-website.general-l10njson/az.json +7 -9
  456. package/www/scratch-website.general-l10njson/be.json +7 -9
  457. package/www/scratch-website.general-l10njson/bg.json +7 -9
  458. package/www/scratch-website.general-l10njson/bn.json +7 -9
  459. package/www/scratch-website.general-l10njson/ca.json +7 -9
  460. package/www/scratch-website.general-l10njson/ckb.json +7 -9
  461. package/www/scratch-website.general-l10njson/cs.json +26 -28
  462. package/www/scratch-website.general-l10njson/cy.json +7 -9
  463. package/www/scratch-website.general-l10njson/da.json +7 -9
  464. package/www/scratch-website.general-l10njson/de.json +7 -9
  465. package/www/scratch-website.general-l10njson/el.json +7 -9
  466. package/www/scratch-website.general-l10njson/en.json +7 -9
  467. package/www/scratch-website.general-l10njson/eo.json +7 -9
  468. package/www/scratch-website.general-l10njson/es-419.json +32 -34
  469. package/www/scratch-website.general-l10njson/es.json +38 -40
  470. package/www/scratch-website.general-l10njson/et.json +7 -9
  471. package/www/scratch-website.general-l10njson/eu.json +7 -9
  472. package/www/scratch-website.general-l10njson/fa.json +7 -9
  473. package/www/scratch-website.general-l10njson/fi.json +43 -45
  474. package/www/scratch-website.general-l10njson/fil.json +7 -9
  475. package/www/scratch-website.general-l10njson/fr.json +6 -8
  476. package/www/scratch-website.general-l10njson/fy.json +7 -9
  477. package/www/scratch-website.general-l10njson/ga.json +7 -9
  478. package/www/scratch-website.general-l10njson/gd.json +7 -9
  479. package/www/scratch-website.general-l10njson/gl.json +7 -9
  480. package/www/scratch-website.general-l10njson/ha.json +7 -9
  481. package/www/scratch-website.general-l10njson/he.json +8 -10
  482. package/www/scratch-website.general-l10njson/hi.json +7 -9
  483. package/www/scratch-website.general-l10njson/hr.json +7 -9
  484. package/www/scratch-website.general-l10njson/ht.json +7 -9
  485. package/www/scratch-website.general-l10njson/hu.json +7 -9
  486. package/www/scratch-website.general-l10njson/hy.json +7 -9
  487. package/www/scratch-website.general-l10njson/id.json +7 -9
  488. package/www/scratch-website.general-l10njson/is.json +7 -9
  489. package/www/scratch-website.general-l10njson/it.json +7 -9
  490. package/www/scratch-website.general-l10njson/ja-Hira.json +23 -25
  491. package/www/scratch-website.general-l10njson/ja.json +23 -25
  492. package/www/scratch-website.general-l10njson/ka.json +7 -9
  493. package/www/scratch-website.general-l10njson/kk.json +7 -9
  494. package/www/scratch-website.general-l10njson/km.json +7 -9
  495. package/www/scratch-website.general-l10njson/ko.json +39 -41
  496. package/www/scratch-website.general-l10njson/ku.json +7 -9
  497. package/www/scratch-website.general-l10njson/lt.json +7 -9
  498. package/www/scratch-website.general-l10njson/lv.json +7 -9
  499. package/www/scratch-website.general-l10njson/mi.json +30 -32
  500. package/www/scratch-website.general-l10njson/mn.json +7 -9
  501. package/www/scratch-website.general-l10njson/nb.json +7 -9
  502. package/www/scratch-website.general-l10njson/nl.json +7 -9
  503. package/www/scratch-website.general-l10njson/nn.json +7 -9
  504. package/www/scratch-website.general-l10njson/nso.json +7 -9
  505. package/www/scratch-website.general-l10njson/oc.json +7 -9
  506. package/www/scratch-website.general-l10njson/or.json +7 -9
  507. package/www/scratch-website.general-l10njson/pl.json +6 -8
  508. package/www/scratch-website.general-l10njson/pt-br.json +26 -28
  509. package/www/scratch-website.general-l10njson/pt.json +9 -11
  510. package/www/scratch-website.general-l10njson/qu.json +7 -9
  511. package/www/scratch-website.general-l10njson/rap.json +7 -9
  512. package/www/scratch-website.general-l10njson/ro.json +7 -9
  513. package/www/scratch-website.general-l10njson/ru.json +7 -9
  514. package/www/scratch-website.general-l10njson/sk.json +7 -9
  515. package/www/scratch-website.general-l10njson/sl.json +7 -9
  516. package/www/scratch-website.general-l10njson/sr.json +7 -9
  517. package/www/scratch-website.general-l10njson/sv.json +7 -9
  518. package/www/scratch-website.general-l10njson/sw.json +7 -9
  519. package/www/scratch-website.general-l10njson/th.json +7 -9
  520. package/www/scratch-website.general-l10njson/tn.json +7 -9
  521. package/www/scratch-website.general-l10njson/tr.json +7 -9
  522. package/www/scratch-website.general-l10njson/uk.json +7 -9
  523. package/www/scratch-website.general-l10njson/uz.json +7 -9
  524. package/www/scratch-website.general-l10njson/vi.json +21 -23
  525. package/www/scratch-website.general-l10njson/xh.json +7 -9
  526. package/www/scratch-website.general-l10njson/zh-cn.json +7 -9
  527. package/www/scratch-website.general-l10njson/zh-tw.json +7 -9
  528. package/www/scratch-website.general-l10njson/zu.json +7 -9
  529. package/www/scratch-website.guidelines-l10njson/cs.json +23 -23
  530. package/www/scratch-website.guidelines-l10njson/es-419.json +23 -23
  531. package/www/scratch-website.guidelines-l10njson/es.json +24 -24
  532. package/www/scratch-website.guidelines-l10njson/fi.json +23 -23
  533. package/www/scratch-website.ideas-l10njson/cs.json +31 -31
  534. package/www/scratch-website.ideas-l10njson/fi.json +1 -1
  535. package/www/scratch-website.ideas-l10njson/vi.json +6 -6
  536. package/www/scratch-website.messages-l10njson/cs.json +2 -2
  537. package/www/scratch-website.messages-l10njson/es-419.json +2 -2
  538. package/www/scratch-website.messages-l10njson/es.json +2 -2
  539. package/www/scratch-website.messages-l10njson/he.json +4 -4
  540. package/www/scratch-website.messages-l10njson/it.json +1 -1
  541. package/www/scratch-website.messages-l10njson/ja.json +2 -2
  542. package/www/scratch-website.messages-l10njson/pt-br.json +1 -1
  543. package/www/scratch-website.messages-l10njson/vi.json +2 -2
  544. package/www/scratch-website.parents-l10njson/es-419.json +1 -1
  545. package/www/scratch-website.parents-l10njson/es.json +1 -1
  546. package/www/scratch-website.parents-l10njson/vi.json +3 -3
  547. package/www/scratch-website.preview-l10njson/ab.json +16 -2
  548. package/www/scratch-website.preview-l10njson/af.json +16 -2
  549. package/www/scratch-website.preview-l10njson/am.json +16 -2
  550. package/www/scratch-website.preview-l10njson/an.json +16 -2
  551. package/www/scratch-website.preview-l10njson/ar.json +16 -2
  552. package/www/scratch-website.preview-l10njson/ast.json +16 -2
  553. package/www/scratch-website.preview-l10njson/az.json +16 -2
  554. package/www/scratch-website.preview-l10njson/be.json +16 -2
  555. package/www/scratch-website.preview-l10njson/bg.json +16 -2
  556. package/www/scratch-website.preview-l10njson/bn.json +16 -2
  557. package/www/scratch-website.preview-l10njson/ca.json +16 -2
  558. package/www/scratch-website.preview-l10njson/ckb.json +16 -2
  559. package/www/scratch-website.preview-l10njson/cs.json +29 -15
  560. package/www/scratch-website.preview-l10njson/cy.json +16 -2
  561. package/www/scratch-website.preview-l10njson/da.json +16 -2
  562. package/www/scratch-website.preview-l10njson/de.json +16 -2
  563. package/www/scratch-website.preview-l10njson/el.json +16 -2
  564. package/www/scratch-website.preview-l10njson/en.json +16 -2
  565. package/www/scratch-website.preview-l10njson/eo.json +16 -2
  566. package/www/scratch-website.preview-l10njson/es-419.json +18 -4
  567. package/www/scratch-website.preview-l10njson/es.json +18 -4
  568. package/www/scratch-website.preview-l10njson/et.json +16 -2
  569. package/www/scratch-website.preview-l10njson/eu.json +16 -2
  570. package/www/scratch-website.preview-l10njson/fa.json +21 -7
  571. package/www/scratch-website.preview-l10njson/fi.json +17 -3
  572. package/www/scratch-website.preview-l10njson/fil.json +16 -2
  573. package/www/scratch-website.preview-l10njson/fr.json +16 -2
  574. package/www/scratch-website.preview-l10njson/fy.json +16 -2
  575. package/www/scratch-website.preview-l10njson/ga.json +16 -2
  576. package/www/scratch-website.preview-l10njson/gd.json +16 -2
  577. package/www/scratch-website.preview-l10njson/gl.json +16 -2
  578. package/www/scratch-website.preview-l10njson/ha.json +16 -2
  579. package/www/scratch-website.preview-l10njson/he.json +31 -17
  580. package/www/scratch-website.preview-l10njson/hi.json +16 -2
  581. package/www/scratch-website.preview-l10njson/hr.json +16 -2
  582. package/www/scratch-website.preview-l10njson/ht.json +16 -2
  583. package/www/scratch-website.preview-l10njson/hu.json +16 -2
  584. package/www/scratch-website.preview-l10njson/hy.json +16 -2
  585. package/www/scratch-website.preview-l10njson/id.json +16 -2
  586. package/www/scratch-website.preview-l10njson/is.json +16 -2
  587. package/www/scratch-website.preview-l10njson/it.json +16 -2
  588. package/www/scratch-website.preview-l10njson/ja-Hira.json +16 -2
  589. package/www/scratch-website.preview-l10njson/ja.json +16 -2
  590. package/www/scratch-website.preview-l10njson/ka.json +16 -2
  591. package/www/scratch-website.preview-l10njson/kk.json +16 -2
  592. package/www/scratch-website.preview-l10njson/km.json +16 -2
  593. package/www/scratch-website.preview-l10njson/ko.json +16 -2
  594. package/www/scratch-website.preview-l10njson/ku.json +16 -2
  595. package/www/scratch-website.preview-l10njson/lt.json +16 -2
  596. package/www/scratch-website.preview-l10njson/lv.json +16 -2
  597. package/www/scratch-website.preview-l10njson/mi.json +16 -2
  598. package/www/scratch-website.preview-l10njson/mn.json +16 -2
  599. package/www/scratch-website.preview-l10njson/nb.json +16 -2
  600. package/www/scratch-website.preview-l10njson/nl.json +16 -2
  601. package/www/scratch-website.preview-l10njson/nn.json +16 -2
  602. package/www/scratch-website.preview-l10njson/nso.json +16 -2
  603. package/www/scratch-website.preview-l10njson/oc.json +16 -2
  604. package/www/scratch-website.preview-l10njson/or.json +16 -2
  605. package/www/scratch-website.preview-l10njson/pl.json +16 -2
  606. package/www/scratch-website.preview-l10njson/pt-br.json +19 -5
  607. package/www/scratch-website.preview-l10njson/pt.json +16 -2
  608. package/www/scratch-website.preview-l10njson/qu.json +16 -2
  609. package/www/scratch-website.preview-l10njson/rap.json +16 -2
  610. package/www/scratch-website.preview-l10njson/ro.json +16 -2
  611. package/www/scratch-website.preview-l10njson/ru.json +16 -2
  612. package/www/scratch-website.preview-l10njson/sk.json +16 -2
  613. package/www/scratch-website.preview-l10njson/sl.json +16 -2
  614. package/www/scratch-website.preview-l10njson/sr.json +16 -2
  615. package/www/scratch-website.preview-l10njson/sv.json +16 -2
  616. package/www/scratch-website.preview-l10njson/sw.json +16 -2
  617. package/www/scratch-website.preview-l10njson/th.json +16 -2
  618. package/www/scratch-website.preview-l10njson/tn.json +16 -2
  619. package/www/scratch-website.preview-l10njson/tr.json +16 -2
  620. package/www/scratch-website.preview-l10njson/uk.json +16 -2
  621. package/www/scratch-website.preview-l10njson/uz.json +16 -2
  622. package/www/scratch-website.preview-l10njson/vi.json +18 -4
  623. package/www/scratch-website.preview-l10njson/xh.json +16 -2
  624. package/www/scratch-website.preview-l10njson/zh-cn.json +16 -2
  625. package/www/scratch-website.preview-l10njson/zh-tw.json +16 -2
  626. package/www/scratch-website.preview-l10njson/zu.json +16 -2
  627. package/www/scratch-website.privacypolicy-apps-l10njson/hi.json +25 -25
  628. package/www/scratch-website.privacypolicy-apps-l10njson/vi.json +1 -1
  629. package/www/scratch-website.privacypolicy-l10njson/hi.json +3 -3
  630. package/www/scratch-website.privacypolicy-l10njson/pt-br.json +26 -26
  631. package/www/scratch-website.privacypolicy-l10njson/vi.json +1 -1
  632. package/www/scratch-website.sec-l10njson/lt.json +10 -10
  633. package/www/scratch-website.splash-l10njson/ab.json +0 -1
  634. package/www/scratch-website.splash-l10njson/af.json +0 -1
  635. package/www/scratch-website.splash-l10njson/am.json +0 -1
  636. package/www/scratch-website.splash-l10njson/an.json +0 -1
  637. package/www/scratch-website.splash-l10njson/ar.json +0 -1
  638. package/www/scratch-website.splash-l10njson/ast.json +0 -1
  639. package/www/scratch-website.splash-l10njson/az.json +0 -1
  640. package/www/scratch-website.splash-l10njson/be.json +2 -3
  641. package/www/scratch-website.splash-l10njson/bg.json +0 -1
  642. package/www/scratch-website.splash-l10njson/bn.json +0 -1
  643. package/www/scratch-website.splash-l10njson/ca.json +0 -1
  644. package/www/scratch-website.splash-l10njson/ckb.json +0 -1
  645. package/www/scratch-website.splash-l10njson/cs.json +1 -2
  646. package/www/scratch-website.splash-l10njson/cy.json +0 -1
  647. package/www/scratch-website.splash-l10njson/da.json +0 -1
  648. package/www/scratch-website.splash-l10njson/de.json +0 -1
  649. package/www/scratch-website.splash-l10njson/el.json +0 -1
  650. package/www/scratch-website.splash-l10njson/en.json +0 -1
  651. package/www/scratch-website.splash-l10njson/eo.json +0 -1
  652. package/www/scratch-website.splash-l10njson/es-419.json +1 -2
  653. package/www/scratch-website.splash-l10njson/es.json +1 -2
  654. package/www/scratch-website.splash-l10njson/et.json +0 -1
  655. package/www/scratch-website.splash-l10njson/eu.json +0 -1
  656. package/www/scratch-website.splash-l10njson/fa.json +0 -1
  657. package/www/scratch-website.splash-l10njson/fi.json +2 -3
  658. package/www/scratch-website.splash-l10njson/fil.json +0 -1
  659. package/www/scratch-website.splash-l10njson/fr.json +0 -1
  660. package/www/scratch-website.splash-l10njson/fy.json +0 -1
  661. package/www/scratch-website.splash-l10njson/ga.json +0 -1
  662. package/www/scratch-website.splash-l10njson/gd.json +0 -1
  663. package/www/scratch-website.splash-l10njson/gl.json +0 -1
  664. package/www/scratch-website.splash-l10njson/ha.json +0 -1
  665. package/www/scratch-website.splash-l10njson/he.json +1 -2
  666. package/www/scratch-website.splash-l10njson/hi.json +0 -1
  667. package/www/scratch-website.splash-l10njson/hr.json +0 -1
  668. package/www/scratch-website.splash-l10njson/ht.json +0 -1
  669. package/www/scratch-website.splash-l10njson/hu.json +0 -1
  670. package/www/scratch-website.splash-l10njson/hy.json +0 -1
  671. package/www/scratch-website.splash-l10njson/id.json +0 -1
  672. package/www/scratch-website.splash-l10njson/is.json +0 -1
  673. package/www/scratch-website.splash-l10njson/it.json +1 -2
  674. package/www/scratch-website.splash-l10njson/ja-Hira.json +0 -1
  675. package/www/scratch-website.splash-l10njson/ja.json +0 -1
  676. package/www/scratch-website.splash-l10njson/ka.json +0 -1
  677. package/www/scratch-website.splash-l10njson/kk.json +0 -1
  678. package/www/scratch-website.splash-l10njson/km.json +0 -1
  679. package/www/scratch-website.splash-l10njson/ko.json +0 -1
  680. package/www/scratch-website.splash-l10njson/ku.json +0 -1
  681. package/www/scratch-website.splash-l10njson/lt.json +0 -1
  682. package/www/scratch-website.splash-l10njson/lv.json +0 -1
  683. package/www/scratch-website.splash-l10njson/mi.json +2 -3
  684. package/www/scratch-website.splash-l10njson/mn.json +0 -1
  685. package/www/scratch-website.splash-l10njson/nb.json +0 -1
  686. package/www/scratch-website.splash-l10njson/nl.json +0 -1
  687. package/www/scratch-website.splash-l10njson/nn.json +0 -1
  688. package/www/scratch-website.splash-l10njson/nso.json +0 -1
  689. package/www/scratch-website.splash-l10njson/oc.json +0 -1
  690. package/www/scratch-website.splash-l10njson/or.json +0 -1
  691. package/www/scratch-website.splash-l10njson/pl.json +0 -1
  692. package/www/scratch-website.splash-l10njson/pt-br.json +1 -2
  693. package/www/scratch-website.splash-l10njson/pt.json +0 -1
  694. package/www/scratch-website.splash-l10njson/qu.json +0 -1
  695. package/www/scratch-website.splash-l10njson/rap.json +0 -1
  696. package/www/scratch-website.splash-l10njson/ro.json +0 -1
  697. package/www/scratch-website.splash-l10njson/ru.json +0 -1
  698. package/www/scratch-website.splash-l10njson/sk.json +0 -1
  699. package/www/scratch-website.splash-l10njson/sl.json +0 -1
  700. package/www/scratch-website.splash-l10njson/sr.json +0 -1
  701. package/www/scratch-website.splash-l10njson/sv.json +0 -1
  702. package/www/scratch-website.splash-l10njson/sw.json +0 -1
  703. package/www/scratch-website.splash-l10njson/th.json +0 -1
  704. package/www/scratch-website.splash-l10njson/tn.json +0 -1
  705. package/www/scratch-website.splash-l10njson/tr.json +0 -1
  706. package/www/scratch-website.splash-l10njson/uk.json +0 -1
  707. package/www/scratch-website.splash-l10njson/uz.json +0 -1
  708. package/www/scratch-website.splash-l10njson/vi.json +6 -7
  709. package/www/scratch-website.splash-l10njson/xh.json +0 -1
  710. package/www/scratch-website.splash-l10njson/zh-cn.json +0 -1
  711. package/www/scratch-website.splash-l10njson/zh-tw.json +0 -1
  712. package/www/scratch-website.splash-l10njson/zu.json +0 -1
  713. package/www/scratch-website.starter-projects-l10njson/cs.json +7 -7
  714. package/www/scratch-website.starter-projects-l10njson/es-419.json +7 -7
  715. package/www/scratch-website.starter-projects-l10njson/es.json +7 -7
  716. package/www/scratch-website.starter-projects-l10njson/fi.json +6 -6
  717. package/www/scratch-website.starter-projects-l10njson/ru.json +2 -2
  718. package/www/scratch-website.starter-projects-l10njson/vi.json +4 -4
  719. package/www/scratch-website.studio-l10njson/ab.json +1 -0
  720. package/www/scratch-website.studio-l10njson/af.json +1 -0
  721. package/www/scratch-website.studio-l10njson/am.json +1 -0
  722. package/www/scratch-website.studio-l10njson/an.json +1 -0
  723. package/www/scratch-website.studio-l10njson/ar.json +1 -0
  724. package/www/scratch-website.studio-l10njson/ast.json +1 -0
  725. package/www/scratch-website.studio-l10njson/az.json +1 -0
  726. package/www/scratch-website.studio-l10njson/be.json +1 -0
  727. package/www/scratch-website.studio-l10njson/bg.json +1 -0
  728. package/www/scratch-website.studio-l10njson/bn.json +1 -0
  729. package/www/scratch-website.studio-l10njson/ca.json +1 -0
  730. package/www/scratch-website.studio-l10njson/ckb.json +1 -0
  731. package/www/scratch-website.studio-l10njson/cs.json +59 -58
  732. package/www/scratch-website.studio-l10njson/cy.json +1 -0
  733. package/www/scratch-website.studio-l10njson/da.json +1 -0
  734. package/www/scratch-website.studio-l10njson/de.json +1 -0
  735. package/www/scratch-website.studio-l10njson/el.json +1 -0
  736. package/www/scratch-website.studio-l10njson/en.json +1 -0
  737. package/www/scratch-website.studio-l10njson/eo.json +1 -0
  738. package/www/scratch-website.studio-l10njson/es-419.json +1 -0
  739. package/www/scratch-website.studio-l10njson/es.json +1 -0
  740. package/www/scratch-website.studio-l10njson/et.json +1 -0
  741. package/www/scratch-website.studio-l10njson/eu.json +1 -0
  742. package/www/scratch-website.studio-l10njson/fa.json +1 -0
  743. package/www/scratch-website.studio-l10njson/fi.json +3 -2
  744. package/www/scratch-website.studio-l10njson/fil.json +1 -0
  745. package/www/scratch-website.studio-l10njson/fr.json +1 -0
  746. package/www/scratch-website.studio-l10njson/fy.json +1 -0
  747. package/www/scratch-website.studio-l10njson/ga.json +1 -0
  748. package/www/scratch-website.studio-l10njson/gd.json +1 -0
  749. package/www/scratch-website.studio-l10njson/gl.json +1 -0
  750. package/www/scratch-website.studio-l10njson/ha.json +1 -0
  751. package/www/scratch-website.studio-l10njson/he.json +1 -0
  752. package/www/scratch-website.studio-l10njson/hi.json +1 -0
  753. package/www/scratch-website.studio-l10njson/hr.json +1 -0
  754. package/www/scratch-website.studio-l10njson/ht.json +1 -0
  755. package/www/scratch-website.studio-l10njson/hu.json +1 -0
  756. package/www/scratch-website.studio-l10njson/hy.json +1 -0
  757. package/www/scratch-website.studio-l10njson/id.json +1 -0
  758. package/www/scratch-website.studio-l10njson/is.json +1 -0
  759. package/www/scratch-website.studio-l10njson/it.json +1 -0
  760. package/www/scratch-website.studio-l10njson/ja-Hira.json +1 -0
  761. package/www/scratch-website.studio-l10njson/ja.json +1 -0
  762. package/www/scratch-website.studio-l10njson/ka.json +1 -0
  763. package/www/scratch-website.studio-l10njson/kk.json +1 -0
  764. package/www/scratch-website.studio-l10njson/km.json +1 -0
  765. package/www/scratch-website.studio-l10njson/ko.json +1 -0
  766. package/www/scratch-website.studio-l10njson/ku.json +1 -0
  767. package/www/scratch-website.studio-l10njson/lt.json +1 -0
  768. package/www/scratch-website.studio-l10njson/lv.json +1 -0
  769. package/www/scratch-website.studio-l10njson/mi.json +1 -0
  770. package/www/scratch-website.studio-l10njson/mn.json +1 -0
  771. package/www/scratch-website.studio-l10njson/nb.json +1 -0
  772. package/www/scratch-website.studio-l10njson/nl.json +1 -0
  773. package/www/scratch-website.studio-l10njson/nn.json +1 -0
  774. package/www/scratch-website.studio-l10njson/nso.json +1 -0
  775. package/www/scratch-website.studio-l10njson/oc.json +1 -0
  776. package/www/scratch-website.studio-l10njson/or.json +1 -0
  777. package/www/scratch-website.studio-l10njson/pl.json +1 -0
  778. package/www/scratch-website.studio-l10njson/pt-br.json +1 -0
  779. package/www/scratch-website.studio-l10njson/pt.json +1 -0
  780. package/www/scratch-website.studio-l10njson/qu.json +1 -0
  781. package/www/scratch-website.studio-l10njson/rap.json +1 -0
  782. package/www/scratch-website.studio-l10njson/ro.json +1 -0
  783. package/www/scratch-website.studio-l10njson/ru.json +1 -0
  784. package/www/scratch-website.studio-l10njson/sk.json +1 -0
  785. package/www/scratch-website.studio-l10njson/sl.json +1 -0
  786. package/www/scratch-website.studio-l10njson/sr.json +1 -0
  787. package/www/scratch-website.studio-l10njson/sv.json +1 -0
  788. package/www/scratch-website.studio-l10njson/sw.json +1 -0
  789. package/www/scratch-website.studio-l10njson/th.json +1 -0
  790. package/www/scratch-website.studio-l10njson/tn.json +1 -0
  791. package/www/scratch-website.studio-l10njson/tr.json +1 -0
  792. package/www/scratch-website.studio-l10njson/uk.json +1 -0
  793. package/www/scratch-website.studio-l10njson/uz.json +1 -0
  794. package/www/scratch-website.studio-l10njson/vi.json +7 -6
  795. package/www/scratch-website.studio-l10njson/xh.json +1 -0
  796. package/www/scratch-website.studio-l10njson/zh-cn.json +1 -0
  797. package/www/scratch-website.studio-l10njson/zh-tw.json +1 -0
  798. package/www/scratch-website.studio-l10njson/zu.json +1 -0
  799. package/www/scratch-website.teacher-faq-l10njson/cy.json +1 -1
  800. package/www/scratch-website.teacher-faq-l10njson/it.json +2 -2
  801. package/www/scratch-website.teacher-faq-l10njson/pt-br.json +11 -11
  802. package/www/scratch-website.teacherregistration-l10njson/cs.json +16 -16
  803. package/www/scratch-website.teacherregistration-l10njson/es-419.json +11 -11
  804. package/www/scratch-website.teacherregistration-l10njson/es.json +11 -11
  805. package/www/scratch-website.teacherregistration-l10njson/ru.json +1 -1
  806. package/www/scratch-website.wedo2-legacy-l10njson/zh-tw.json +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scratch-l10n",
3
- "version": "6.0.75",
3
+ "version": "6.1.1",
4
4
  "description": "Localization for the Scratch 3.0 components",
5
5
  "main": "./dist/l10n.js",
6
6
  "browser": "./src/index.mjs",
@@ -0,0 +1,142 @@
1
+ import locales, { localeMap } from '../../src/supported-locales.mjs'
2
+ import { poolMap } from './concurrent.mts'
3
+ import { ProgressLogger } from './progress-logger.mts'
4
+ import { TransifexStringsKeyValueJson } from './transifex-formats.mts'
5
+ import { txPull, txResources } from './transifex.mts'
6
+ import { filterInvalidTranslations, TransifexEditorString } from './validate.mts'
7
+
8
+ const CONCURRENCY_LIMIT = 36
9
+ const SOURCE_LOCALE = 'en' // TODO: don't hardcode this
10
+
11
+ /**
12
+ * @param resources - A list of Transifex resource names
13
+ * @param selectedLocales - A list of Scratch locale codes
14
+ * @returns The list of all resource/locale combinations to pull. The source locale is always excluded.
15
+ */
16
+ const expandResourceFiles = (resources: string[], selectedLocales: string[]) => {
17
+ const files = []
18
+ for (const resource of resources) {
19
+ for (const locale of selectedLocales) {
20
+ if (locale === SOURCE_LOCALE) {
21
+ continue
22
+ }
23
+ files.push({ resource: resource, locale: locale })
24
+ }
25
+ }
26
+ return files
27
+ }
28
+
29
+ /**
30
+ * Pull and validate a single Transifex "file" (resource + locale).
31
+ * @param o - The options for pulling and validating a single file.
32
+ * @param o.allStrings - All pulled strings so far, used to get source strings for validation
33
+ * @param o.project - The Transifex project to pull from
34
+ * @param o.resource - The Transifex resource to pull from
35
+ * @param o.locale - The locale to pull
36
+ * @param o.mode - The mode to use when pulling (e.g., "reviewed")
37
+ * @returns A list of messages about errors encountered during validation, if any.
38
+ */
39
+ async function pullAndValidateFile({
40
+ allStrings,
41
+ project,
42
+ resource,
43
+ locale,
44
+ mode,
45
+ }: {
46
+ allStrings: Record<string, Record<string, TransifexStringsKeyValueJson>>
47
+ project: string
48
+ resource: string
49
+ locale: string
50
+ mode?: string
51
+ }) {
52
+ const messages: string[] = []
53
+ const txLocale = localeMap[locale] || locale
54
+ const fileContent = await txPull<TransifexEditorString>(project, resource, txLocale, mode)
55
+
56
+ // if fileContent has message & description, we only want the message
57
+ const translations: TransifexStringsKeyValueJson = {}
58
+ for (const key of Object.keys(fileContent)) {
59
+ const tx = fileContent[key]
60
+ if (typeof tx === 'string') {
61
+ translations[key] = tx
62
+ } else {
63
+ translations[key] = tx.message
64
+ }
65
+ }
66
+
67
+ if (!(resource in allStrings)) {
68
+ allStrings[resource] = {}
69
+ }
70
+ allStrings[resource][locale] = translations
71
+
72
+ // may or may not be the same as `translations`
73
+ const sourceStrings = allStrings[resource][SOURCE_LOCALE]
74
+
75
+ // some of the validation checks may still be relevant even if locale === SOURCE_LOCALE
76
+ // console.log({ resource, locale, translations, sourceStrings })
77
+ messages.push(...filterInvalidTranslations(locale, translations, sourceStrings))
78
+
79
+ return messages
80
+ }
81
+
82
+ /**
83
+ * Pull one or more resource(s) from a transifex project and validate the strings.
84
+ * Return any error messages from the validation process along with all valid strings.
85
+ * @param o - The options for pulling, validating, and saving translations.
86
+ * @param o.project - The Transifex project to pull translations from.
87
+ * @param o.mode - The mode to use when pulling translations (e.g., "reviewed").
88
+ * @param o.resources - The resources within the project to pull translations for.
89
+ * @param o.selectedLocales - The locales to pull translations for. Defaults to all supported locales.
90
+ * @returns Translation strings and a list of messages about errors encountered during validation, if any.
91
+ */
92
+ export async function pullAndValidateProject({
93
+ project,
94
+ resources,
95
+ mode,
96
+ selectedLocales,
97
+ }: {
98
+ project: string
99
+ mode?: string
100
+ resources?: string[]
101
+ selectedLocales?: string | string[]
102
+ }) {
103
+ const selectedResources = resources ?? (await txResources(project))
104
+ selectedLocales =
105
+ typeof selectedLocales === 'string' ? [selectedLocales] : (selectedLocales ?? Object.keys(locales))
106
+
107
+ const files = expandResourceFiles(selectedResources, selectedLocales)
108
+
109
+ const allStrings: Record<string, Record<string, TransifexStringsKeyValueJson>> = {}
110
+ const messages: string[] = []
111
+
112
+ const progress = new ProgressLogger(selectedResources.length + files.length)
113
+
114
+ const handleFile = async (resource: string, locale: string) => {
115
+ try {
116
+ const fileMessages = await pullAndValidateFile({
117
+ allStrings,
118
+ project,
119
+ resource,
120
+ locale,
121
+ mode,
122
+ })
123
+ for (const message of fileMessages) {
124
+ // `message` already contains locale and/or string info if appropriate
125
+ messages.push(`resource ${resource} / ${message}`)
126
+ }
127
+ } finally {
128
+ progress.increment()
129
+ }
130
+ }
131
+
132
+ // Ensure source locale is available for validation
133
+ await poolMap(selectedResources, CONCURRENCY_LIMIT, async resource => handleFile(resource, SOURCE_LOCALE))
134
+
135
+ // Non-source locales
136
+ await poolMap(files, CONCURRENCY_LIMIT, async ({ resource, locale }) => handleFile(resource, locale))
137
+
138
+ return {
139
+ allStrings,
140
+ messages,
141
+ }
142
+ }
@@ -1,4 +1,3 @@
1
- import assert from 'assert'
2
1
  import parse from 'format-message-parse'
3
2
  import {
4
3
  TransifexStringChrome,
@@ -84,24 +83,52 @@ export const validMessage = (message: TransifexEditorString, source: TransifexEd
84
83
  }
85
84
 
86
85
  /**
87
- * @param translation - the translations to validate and their corresponding source strings
88
- * @param translation.locale - the Transifex locale, for error reporting
89
- * @param translation.translations - the translations to validate
86
+ * Validate and filter translations.
87
+ * WARNING: Modifies the translations object in place by replacing invalid translations with source strings.
88
+ * @param locale - the Transifex locale, for error reporting
89
+ * @param translations - the translations to validate and filter
90
90
  * @param source - the source strings for the translations
91
+ * @returns a list of messages about errors encountered during validation. Every removed translation will have a
92
+ * message. Some messages may not correspond to removed translations (e.g., when the number of keys differ).
91
93
  */
92
- export const validateTranslations = (
93
- { locale, translations }: { locale: string; translations: TransifexEditorStrings },
94
+ export const filterInvalidTranslations = (
95
+ locale: string,
96
+ translations: TransifexEditorStrings,
94
97
  source: TransifexEditorStrings,
95
- ) => {
96
- const transKeys = Object.keys(translations)
98
+ ): string[] => {
99
+ const messages: string[] = []
100
+
97
101
  const sourceKeys = Object.keys(source)
98
- assert.strictEqual(transKeys.length, sourceKeys.length, `locale ${locale} has a different number of message keys`)
99
- transKeys.forEach(item => assert(sourceKeys.includes(item), `locale ${locale} has key ${item} not in the source`))
100
- sourceKeys.forEach(item => assert(transKeys.includes(item), `locale ${locale} is missing key ${item}`))
101
- sourceKeys.forEach(item =>
102
- assert(
103
- validMessage(translations[item], source[item]),
104
- `locale ${locale} / item ${item}: message validation failed:\n msg: ${getMessageText(translations[item])}\n src: ${getMessageText(source[item])}`,
105
- ),
106
- )
102
+
103
+ const transKeys = Object.keys(translations).filter(item => {
104
+ if (!sourceKeys.includes(item)) {
105
+ messages.push(`locale ${locale} has key ${item} not in the source`)
106
+ delete translations[item]
107
+ return false
108
+ }
109
+ return true
110
+ })
111
+
112
+ sourceKeys.forEach(item => {
113
+ if (!transKeys.includes(item)) {
114
+ messages.push(`locale ${locale} is missing key ${item}`)
115
+ }
116
+ })
117
+
118
+ transKeys.forEach(item => {
119
+ if (!validMessage(translations[item], source[item])) {
120
+ messages.push(
121
+ [
122
+ `locale ${locale} / item ${item}: message validation failed:`,
123
+ ` msg: ${getMessageText(translations[item])}`,
124
+ ` src: ${getMessageText(source[item])}`,
125
+ ].join('\n'),
126
+ )
127
+
128
+ // fall back to source message
129
+ translations[item] = source[item]
130
+ }
131
+ })
132
+
133
+ return messages
107
134
  }
@@ -8,11 +8,7 @@
8
8
  */
9
9
  import fs from 'fs'
10
10
  import path from 'path'
11
- import locales, { localeMap } from '../src/supported-locales.mjs'
12
- import { poolMap } from './lib/concurrent.mts'
13
- import { TransifexStringsKeyValueJson } from './lib/transifex-formats.mts'
14
- import { txPull } from './lib/transifex.mts'
15
- import { TransifexEditorStrings, validateTranslations } from './lib/validate.mts'
11
+ import { pullAndValidateProject } from './lib/pull-and-validate.mts'
16
12
 
17
13
  const args = process.argv.slice(2)
18
14
 
@@ -37,38 +33,20 @@ const PROJECT = args[0]
37
33
  const RESOURCE = args[1]
38
34
  const OUTPUT_DIR = path.resolve(args[2])
39
35
  const MODE = 'reviewed'
40
- const CONCURRENCY_LIMIT = 36
41
36
 
42
- const getLocaleData = async function (locale: string) {
43
- const txLocale = localeMap[locale] || locale
44
- const data = (await txPull(PROJECT, RESOURCE, txLocale, MODE)) as TransifexEditorStrings
45
- return {
46
- locale: locale,
47
- translations: data,
48
- }
49
- }
37
+ const validationResults = await pullAndValidateProject({
38
+ project: PROJECT,
39
+ resources: [RESOURCE],
40
+ mode: MODE,
41
+ })
50
42
 
51
- const pullTranslations = async function () {
52
- const values = await poolMap(Object.keys(locales), CONCURRENCY_LIMIT, getLocaleData)
53
- const source = values.find(elt => elt.locale === 'en')?.translations
54
- if (!source) {
55
- throw new Error('Could not find source strings')
43
+ for (const resource of Object.values(validationResults.allStrings)) {
44
+ for (const [locale, strings] of Object.entries(resource)) {
45
+ const file = JSON.stringify(strings, null, 4)
46
+ fs.writeFileSync(`${OUTPUT_DIR}/${locale}.json`, file)
56
47
  }
57
- values.forEach(translation => {
58
- validateTranslations({ locale: translation.locale, translations: translation.translations }, source)
59
- // if translation has message & description, we only want the message
60
- const txs: TransifexStringsKeyValueJson = {}
61
- for (const key of Object.keys(translation.translations)) {
62
- const tx = translation.translations[key]
63
- if (typeof tx === 'string') {
64
- txs[key] = tx
65
- } else {
66
- txs[key] = tx.message
67
- }
68
- }
69
- const file = JSON.stringify(txs, null, 4)
70
- fs.writeFileSync(`${OUTPUT_DIR}/${translation.locale}.json`, file)
71
- })
72
48
  }
73
49
 
74
- await pullTranslations()
50
+ if (validationResults.messages.length > 0) {
51
+ console.error(validationResults.messages.join('\n\n'))
52
+ }
@@ -9,10 +9,7 @@
9
9
  import fs from 'fs/promises'
10
10
  import { mkdirp } from 'mkdirp'
11
11
  import path from 'path'
12
- import locales, { localeMap } from '../src/supported-locales.mjs'
13
- import { poolMap } from './lib/concurrent.mts'
14
- import { ProgressLogger } from './lib/progress-logger.mjs'
15
- import { txPull, txResources } from './lib/transifex.mts'
12
+ import { pullAndValidateProject } from './lib/pull-and-validate.mts'
16
13
 
17
14
  const args = process.argv.slice(2)
18
15
 
@@ -37,68 +34,34 @@ if (!process.env.TX_TOKEN || args.length < 1) {
37
34
  const PROJECT = 'scratch-website'
38
35
  const OUTPUT_DIR = path.resolve(args[0])
39
36
  // const MODE = {mode: 'reviewed'}; // default is everything for www
40
- const CONCURRENCY_LIMIT = 36
41
37
 
42
- const lang = args.length === 2 ? args[1] : ''
38
+ const lang = args.length === 2 ? args[1] : undefined
39
+ const validationResults = await pullAndValidateProject({
40
+ project: PROJECT,
41
+ selectedLocales: lang,
42
+ })
43
43
 
44
- const getLocaleData = async function (item: { locale: string; resource: string }) {
45
- const locale = item.locale
46
- const resource = item.resource
47
- const txLocale = localeMap[locale] || locale
44
+ for (const [resourceName, resource] of Object.entries(validationResults.allStrings)) {
45
+ for (const [locale, translations] of Object.entries(resource)) {
46
+ const txOutdir = `${OUTPUT_DIR}/${PROJECT}.${resourceName}`
47
+ const fileName = `${txOutdir}/${locale}.json`
48
48
 
49
- const translations = await txPull(PROJECT, resource, txLocale)
50
-
51
- const txOutdir = `${OUTPUT_DIR}/${PROJECT}.${resource}`
52
- const fileName = `${txOutdir}/${locale}.json`
53
-
54
- try {
55
- mkdirp.sync(txOutdir)
56
- await fs.writeFile(fileName, JSON.stringify(translations, null, 4))
57
-
58
- return {
59
- resource,
60
- locale,
61
- fileName,
62
- }
63
- } catch (e) {
64
- ;(e as Error).cause = {
65
- resource,
66
- locale,
67
- translations,
68
- txOutdir,
69
- fileName,
70
- }
71
- throw e
72
- }
73
- }
74
-
75
- const expandResourceFiles = (resources: string[]) => {
76
- const items = []
77
- for (const resource of resources) {
78
- if (lang) {
79
- items.push({ resource: resource, locale: lang })
80
- } else {
81
- for (const locale of Object.keys(locales)) {
82
- items.push({ resource: resource, locale: locale })
49
+ try {
50
+ mkdirp.sync(txOutdir)
51
+ await fs.writeFile(fileName, JSON.stringify(translations, null, 4))
52
+ } catch (e) {
53
+ ;(e as Error).cause = {
54
+ resourceName,
55
+ locale,
56
+ translations,
57
+ txOutdir,
58
+ fileName,
83
59
  }
60
+ throw e
84
61
  }
85
62
  }
86
- return items
87
63
  }
88
64
 
89
- const pullTranslations = async function () {
90
- const resources = await txResources(PROJECT)
91
- const allFiles = expandResourceFiles(resources)
92
-
93
- const progress = new ProgressLogger(allFiles.length)
94
-
95
- await poolMap(allFiles, CONCURRENCY_LIMIT, async item => {
96
- try {
97
- await getLocaleData(item)
98
- } finally {
99
- progress.increment()
100
- }
101
- })
65
+ if (validationResults.messages.length > 0) {
66
+ console.error(validationResults.messages.join('\n\n'))
102
67
  }
103
-
104
- await pullTranslations()
@@ -7,7 +7,7 @@ import async from 'async'
7
7
  import fs from 'fs'
8
8
  import path from 'path'
9
9
  import locales from '../src/supported-locales.mjs'
10
- import { TransifexEditorStrings, validateTranslations } from './lib/validate.mts'
10
+ import { filterInvalidTranslations, TransifexEditorStrings } from './lib/validate.mts'
11
11
 
12
12
  const args = process.argv.slice(2)
13
13
  const usage = `
@@ -31,11 +31,10 @@ const validate = (locale: string, callback: async.ErrorCallback) => {
31
31
  if (err) callback(err)
32
32
  // let this throw an error if invalid json
33
33
  const strings = JSON.parse(data) as TransifexEditorStrings
34
- const translations = {
35
- locale: locale,
36
- translations: strings,
34
+ const messages = filterInvalidTranslations(locale, strings, source)
35
+ if (messages.length > 0) {
36
+ callback(new Error(`Locale ${locale} has validation errors:\n${messages.join('\n')}`))
37
37
  }
38
- validateTranslations(translations, source)
39
38
  })
40
39
  }
41
40
 
@@ -9,7 +9,7 @@ import glob from 'glob'
9
9
  import path from 'path'
10
10
  import locales from '../src/supported-locales.mjs'
11
11
  import { TransifexStringsKeyValueJson, TransifexStrings } from './lib/transifex-formats.mts'
12
- import { validateTranslations } from './lib/validate.mts'
12
+ import { filterInvalidTranslations } from './lib/validate.mts'
13
13
 
14
14
  const args = process.argv.slice(2)
15
15
  const usage = `
@@ -37,11 +37,10 @@ const validate = (localeData: LocaleData, callback: async.ErrorCallback) => {
37
37
  if (err) callback(err)
38
38
  // let this throw an error if invalid json
39
39
  const strings = JSON.parse(data) as TransifexStringsKeyValueJson
40
- const translations = {
41
- locale: localeData.locale,
42
- translations: strings,
40
+ const messages = filterInvalidTranslations(localeData.locale, strings, localeData.sourceData)
41
+ if (messages.length > 0) {
42
+ callback(new Error(`Locale ${localeData.locale} has validation errors:\n${messages.join('\n')}`))
43
43
  }
44
- validateTranslations(translations, localeData.sourceData)
45
44
  })
46
45
  }
47
46
 
@@ -5,37 +5,11 @@
5
5
  "about.foundationText": "Scratch Афонд",
6
6
  "about.introParents": "Аҭаацәа рзы аинформациа",
7
7
  "about.introEducators": "Арҵаҩцәа рзы аинформациа",
8
- "about.whoUsesScratch": "Зхы иазырхәода Scrath?",
9
- "about.whoUsesScratchDescription": "Scratch аԥҵара азхәыцын ахәыҷқәа 8 инаркны 16 шықәса зхыҵуа рзы, аха иахьа рхы иадырхәоит хәыҷи дыуи зегьы. Миллионла ауаа иаԥырҵоит Scratch – апроектқәа иеиуеиԥшым аҭагылазаашьақәеи аҭыԥқәеи рҿы – аҩны, ашколқәа, амузеиқәа, абиблиотекақәа рҿы уҳәа убас егь..",
10
- "about.aroundTheWorld": "Адунеи зегь аҟны",
11
- "about.aroundTheWorldDescription": "Scratch is used in more than {countryCount} different countries and territories and is available in more than {languageCount} languages. To change languages, click the menu at the bottom of the page. Or, in the Project Editor, click the globe at the top of the page. To add or improve a translation, see the {translationLink} page.",
12
- "about.translationLinkText": "аиҭага",
13
- "about.quotes": "Ацитатақәа",
14
- "about.quotesDescription": " Scratch акоманда иаиуеит ирацәаны асалам шәҟқәа аҿари, аҭаацәеи, арҵаҩцәеи рҟынтәи. Ишәҭахума еилышәкаарц ауаа ирыҩуа? Ашәҟқәеи, дара ирнуи аилкааразы шәхы иашәырхә азхьарԥш {quotesLink}.",
15
- "about.quotesLinkText": "ацитатақәа",
16
- "about.learnMore": "Scratch иазкны иҵегьы",
17
- "about.learnMoreFaq": "Лассы-лассы изызҵаауа",
18
- "about.learnMoreParents": "Аҭаацәа рзы аинформациа",
19
- "about.learnMoreEducators": "Information for Educators",
20
- "about.learnMoreAnnualReport": "Есышықәсатәи аҳасабырба",
21
- "about.literacy": "Ишәҵала акод аиқәыршәашьа, еиқәшәыршәала акод, аҵара азы",
22
- "about.literacyImageDescription": "An image of Mitch Resnick giving a TED talk titled \"Let's Teach Kids to Code.\" A play button is in the center of the image.",
23
- "about.literacyDescription": "In this <a>TED talk</a>, Scratch founder Mitch Resnick describes why the ability to code computer programs is an important part of literacy in today’s society. When people learn to code in Scratch, they learn important strategies for solving problems, designing projects, and communicating ideas.",
24
- "about.schools": "Scratch ашколқәа рҿы",
25
- "about.schoolsDescription": "Students are learning with Scratch at all levels (from elementary school to college) and across disciplines (such as math, computer science, language arts, social studies). Educator resources are available on the {scratchForEducatorsLink} page.",
26
- "about.scratchForEducatorsLinkText": "Scratch For Educators",
27
- "about.scratchedLinkText": "ScratchEd асаит",
28
- "about.research": "Аҭҵаарақәа",
29
- "about.researchDescription": "The {lifelongKindergartenGroupLink} and collaborators are {researchLink} how young people create, collaborate, and learn with Scratch. For an overview, see the article {codingAtACrossroadsLink} and the book {lifelongKindergartenBookLink}. To find out more about the use of Scratch, see the {statisticsLink} page and the Scratch {annualReportLink}.",
30
- "about.researchLinkText": "researching",
31
- "about.statisticsLinkText": "астатистика",
32
- "about.lifelongKindergartenGroupLinkText": "Lifelong Kindergarten агәыԥ",
33
- "about.codingAtACrossroadsLinkText": "Coding at a Crossroads",
34
- "about.lifelongKindergartenBookLinkText": "Lifelong Kindergarten",
35
- "about.annualReportLinkText": "Есышықәсатәи аҳасабырба",
36
- "about.support": "Адгылареи ԥарала ацхыраареи",
37
- "about.supportDescription": "Scratch is available for free, thanks to support from our {donorsLink}. This support helps us provide kids around the world with opportunities to imagine, create, and share. You can support Scratch by making a donation {donateLink}.",
38
- "about.donorsLinkText": "адонорцәа",
39
- "about.donateLinkText": "абра",
8
+ "about.introLearnMore": "Learn more at Scratch Foundation",
9
+ "about.support": "Support Scratch",
10
+ "about.supportDescription1": "Scratch is available for free, thanks to our {supportersLink}. This support helps us provide young people around the world with opportunities to imagine, create, and share.",
11
+ "about.supportDescription2": "Every dollar donated gives one child access to free, playful, and powerful creative learning through the Scratch community.",
12
+ "about.supportDescription3": "Join us in helping kids everywhere create what they imagine.",
13
+ "about.supportersLinkText": "supporters",
40
14
  "about.donateButton": "Ацхыраара аҟаҵара"
41
15
  }
@@ -5,37 +5,11 @@
5
5
  "about.foundationText": "Scratch Stigting",
6
6
  "about.introParents": "Inligting vir ouers",
7
7
  "about.introEducators": "Inligting vir opvoeders",
8
- "about.whoUsesScratch": "Wie gebruik Scratch?",
9
- "about.whoUsesScratchDescription": "Scratch is spesifiek ontwerp vir ouderdomme 8 tot 16 maar word deur mense van alle ouderdomme gebruik. Miljoene mense skep Scratch-projekte in allerhande plekke, insluitend huise, skole, museums, biblioteke en gemeenskapsentra.",
10
- "about.aroundTheWorld": "Regoor die wêreld",
11
- "about.aroundTheWorldDescription": "Scratch word gebruik in meer as {countryCount}verskillende lande en streke en is beskikbaar in meer as {languageCount} tale. Klik die kieslys onderaan die bladsy, of klik die aardbol bo-aan die Projekredigeerder bladsy om die taal te verander. Sien die {translationLink} om 'n vertaling toe te voeg of te verbeter.",
12
- "about.translationLinkText": "vertaling",
13
- "about.quotes": "Aanhalings",
14
- "about.quotesDescription": "The Scratch Team has received many emails from youth, parents, and educators expressing thanks for Scratch. Want to see what people are saying? You can read a collection of the {quotesLink} we've received.",
15
- "about.quotesLinkText": "aanhalings",
16
- "about.learnMore": "Meer inligting oor Scratch",
17
- "about.learnMoreFaq": "Gereelde vrae",
18
- "about.learnMoreParents": "Inligting vir ouers",
19
- "about.learnMoreEducators": "Inligting vir Opvoeders",
20
- "about.learnMoreAnnualReport": "Jaarverslag",
21
- "about.literacy": "Leer om te Programmeer, Programmeer om te Leer",
22
- "about.literacyImageDescription": "An image of Mitch Resnick giving a TED talk titled \"Let's Teach Kids to Code.\" A play button is in the center of the image.",
23
- "about.literacyDescription": "In this <a>TED talk</a>, Scratch founder Mitch Resnick describes why the ability to code computer programs is an important part of literacy in today’s society. When people learn to code in Scratch, they learn important strategies for solving problems, designing projects, and communicating ideas.",
24
- "about.schools": "Scratch in skole",
25
- "about.schoolsDescription": "Students are learning with Scratch at all levels (from elementary school to college) and across disciplines (such as math, computer science, language arts, social studies). Educator resources are available on the {scratchForEducatorsLink} page.",
26
- "about.scratchForEducatorsLinkText": "Scratch vir Opvoeders",
27
- "about.scratchedLinkText": "ScratchEd webwerf",
28
- "about.research": "Navorsing",
29
- "about.researchDescription": "The {lifelongKindergartenGroupLink} and collaborators are {researchLink} how young people create, collaborate, and learn with Scratch. For an overview, see the article {codingAtACrossroadsLink} and the book {lifelongKindergartenBookLink}. To find out more about the use of Scratch, see the {statisticsLink} page and the Scratch {annualReportLink}.",
30
- "about.researchLinkText": "navorsing",
31
- "about.statisticsLinkText": "Statistieke",
32
- "about.lifelongKindergartenGroupLinkText": "Lewenslange Kleuterskoolgroep",
33
- "about.codingAtACrossroadsLinkText": "Programmering by 'n Kruispad",
34
- "about.lifelongKindergartenBookLinkText": "Lewenslange Kleuterskool",
35
- "about.annualReportLinkText": "Jaarverslag",
36
- "about.support": "Ondersteuning en Befondsing",
37
- "about.supportDescription": "Scratch is gratis beskikbaar danksy steun van ons {donorsLink}. Hierdie ondersteuning help ons om aan kinders regoor die wêreld die geleentheid te bied om te verbeel, skep en deel. U kan Sckratch ondersteun deur 'n skenking te maak {donateLink}.",
38
- "about.donorsLinkText": "skenkers",
39
- "about.donateLinkText": "hier",
8
+ "about.introLearnMore": "Learn more at Scratch Foundation",
9
+ "about.support": "Support Scratch",
10
+ "about.supportDescription1": "Scratch is available for free, thanks to our {supportersLink}. This support helps us provide young people around the world with opportunities to imagine, create, and share.",
11
+ "about.supportDescription2": "Every dollar donated gives one child access to free, playful, and powerful creative learning through the Scratch community.",
12
+ "about.supportDescription3": "Join us in helping kids everywhere create what they imagine.",
13
+ "about.supportersLinkText": "supporters",
40
14
  "about.donateButton": "Skenk"
41
15
  }
@@ -5,37 +5,11 @@
5
5
  "about.foundationText": "Scratch Foundation",
6
6
  "about.introParents": "መረጃ ለወላጆች ",
7
7
  "about.introEducators": "መረጃ ለአስተማሪዎች",
8
- "about.whoUsesScratch": "ማን እስክራችን ይጠቀማል?",
9
- "about.whoUsesScratchDescription": "ስክራች እድሚያቸው ከ 8 - 16 ለሆኑ ልጆች የተሰራ ቢሆንም፤ በማንኛውም እድሜ ላሉ የሚሆን ነው። ብዙ ሰዎች በቤታቸው ፥ በት/ቤት፥ በመፅሃፍት ቤት፤ እና ቤሌሎች ቦታዎችህ ስክራችህ እየተጠቀሙ ነው።",
10
- "about.aroundTheWorld": "በአለም ዙሪያ",
11
- "about.aroundTheWorldDescription": "Scratch is used in more than {countryCount} different countries and territories and is available in more than {languageCount} languages. To change languages, click the menu at the bottom of the page. Or, in the Project Editor, click the globe at the top of the page. To add or improve a translation, see the {translationLink} page.",
12
- "about.translationLinkText": "ትርጉም",
13
- "about.quotes": "ጥቅሶች",
14
- "about.quotesDescription": "የስክራች ቡድን ብዙ የምስጋና ኢሜሎችን ከታዳጊዎች፣ ከወላጆችና ከአስተማሪዎች ተቀብሏል። የሰዎቹን መልስ ማየት ትፈልጋላችሁ? የተቀበልነውን ስብስብ እዚህ፡{quotesLink} ማንበብ ትችላላችሁ።",
15
- "about.quotesLinkText": "ቃሎች",
16
- "about.learnMore": "ሰለእስክራች የበለጠ ይወቁ",
17
- "about.learnMoreFaq": "ተደጋግሞ የሚነሱ ጥያቄዎች",
18
- "about.learnMoreParents": "መረጃ ለወላጆች ",
19
- "about.learnMoreEducators": "Information for Educators",
20
- "about.learnMoreAnnualReport": "Annual Report",
21
- "about.literacy": "ኮድ መፃፍ ይማሩ፤ ለመማር ኮድ ያድርጉ።",
22
- "about.literacyImageDescription": "An image of Mitch Resnick giving a TED talk titled \"Let's Teach Kids to Code.\" A play button is in the center of the image.",
23
- "about.literacyDescription": "In this <a>TED talk</a>, Scratch founder Mitch Resnick describes why the ability to code computer programs is an important part of literacy in today’s society. When people learn to code in Scratch, they learn important strategies for solving problems, designing projects, and communicating ideas.",
24
- "about.schools": "ስክራች በት/ቤቶች ውስጥ",
25
- "about.schoolsDescription": "Students are learning with Scratch at all levels (from elementary school to college) and across disciplines (such as math, computer science, language arts, social studies). Educator resources are available on the {scratchForEducatorsLink} page.",
26
- "about.scratchForEducatorsLinkText": "Scratch For Educators",
27
- "about.scratchedLinkText": "ScratchEd ድረ-ገፅ",
28
- "about.research": "ምርምር",
29
- "about.researchDescription": "The {lifelongKindergartenGroupLink} and collaborators are {researchLink} how young people create, collaborate, and learn with Scratch. For an overview, see the article {codingAtACrossroadsLink} and the book {lifelongKindergartenBookLink}. To find out more about the use of Scratch, see the {statisticsLink} page and the Scratch {annualReportLink}.",
30
- "about.researchLinkText": "researching",
31
- "about.statisticsLinkText": "ስታቲስቲክስ",
32
- "about.lifelongKindergartenGroupLinkText": "Lifelong Kindergarten group",
33
- "about.codingAtACrossroadsLinkText": "Coding at a Crossroads",
34
- "about.lifelongKindergartenBookLinkText": "ላይፍሎንግ ኪንደርጋርተን",
35
- "about.annualReportLinkText": "Annual Report",
36
- "about.support": "ድጋፍ እና የገንዘብ እርዳታ ",
37
- "about.supportDescription": "Scratch is available for free, thanks to support from our {donorsLink}. This support helps us provide kids around the world with opportunities to imagine, create, and share. You can support Scratch by making a donation {donateLink}.",
38
- "about.donorsLinkText": "donors",
39
- "about.donateLinkText": "እዚህ",
8
+ "about.introLearnMore": "Learn more at Scratch Foundation",
9
+ "about.support": "Support Scratch",
10
+ "about.supportDescription1": "Scratch is available for free, thanks to our {supportersLink}. This support helps us provide young people around the world with opportunities to imagine, create, and share.",
11
+ "about.supportDescription2": "Every dollar donated gives one child access to free, playful, and powerful creative learning through the Scratch community.",
12
+ "about.supportDescription3": "Join us in helping kids everywhere create what they imagine.",
13
+ "about.supportersLinkText": "supporters",
40
14
  "about.donateButton": "ለScratch ለመለገስ"
41
15
  }
@@ -5,37 +5,11 @@
5
5
  "about.foundationText": "Fundación Scratch",
6
6
  "about.introParents": "Información pa pais",
7
7
  "about.introEducators": "Información pa educadores",
8
- "about.whoUsesScratch": "Quí usan Scratch?",
9
- "about.whoUsesScratchDescription": "Scratch ye diseñado especialment pa edatz entre os 8 y 16 anyos, pero lo usan personas de todas as edatz. I hai millons de personas creyando prochectos en Scratch en una amplia variedat d'entornos, incluindo fogars, escuelas, museos, bibliotecas y centros comunitarios.",
10
- "about.aroundTheWorld": "Arredol d'o mundo",
11
- "about.aroundTheWorldDescription": "Scratch s'utiliza en mas de {countryCount} países y territorios diferents y ye disponible en mas de {languageCount} idiomas. Pa cambiar d'idioma, preta en o menú d'a parte inferior d'a pachina. U, en o Editor de Prochectos, preta en o globo terraquio d'a parte superior d'a pachina. Pa anyadir u amillorar una traducción, consulte la pachina {translationLink}.",
12
- "about.translationLinkText": "traducción",
13
- "about.quotes": "Citas",
14
- "about.quotesDescription": "L'Equipo de Scratch ha recibiu muitos correus de parte de chovens, pais y docents dando-nos as gracias por creyar Scratch. Quiers veyer o que diz a chent? Puetz leyer una colección d'as {quotesLink} que hemos recibiu.",
15
- "about.quotesLinkText": "citas",
16
- "about.learnMore": "Aprende mas sobre Scratch",
17
- "about.learnMoreFaq": "Preguntas Freqüents (FAQ)",
18
- "about.learnMoreParents": "Información pa pais",
19
- "about.learnMoreEducators": "Información pa educadors",
20
- "about.learnMoreAnnualReport": "Informe anyal",
21
- "about.literacy": "Aprende a programar, programar pa aprender",
22
- "about.literacyImageDescription": "Una imachen de Mitch Resnick dando una charra TED titulau \"Amostremos a los ninos a codificar\". En o centro d'a imachen amaneixe un botón de reproducción.",
23
- "about.literacyDescription": "En esta <a>charra TED</a>, lo fundador de Scratch, Mitch Resnick, describe per qué la capacidat de codificar programas informaticos ye una parte important de l'alfabetización en a sociedat actual. Cuan la chent aprende a programar con Scratch, aprende estratechias importants pa resolver problemas, disenyar prochectos y comunicar ideyas.",
24
- "about.schools": "Scratch en as escuelas",
25
- "about.schoolsDescription": "Os estudiants aprenden con Scratch en totz os libels (dende a escuela primaria dica a universidat) y en todas as disciplinas (como que matematicas, informatica, luenga y literatura, estudios socials). Os recursos pa educadors son disponibles en a pachina {scratchForEducatorsLink}.",
26
- "about.scratchForEducatorsLinkText": "Scratch pa educadors",
27
- "about.scratchedLinkText": "pachina web de ScratchEd",
28
- "about.research": "Investigación",
29
- "about.researchDescription": "Lo {lifelongKindergartenGroupLink} y los colaboradors son {researchLink} cómo los chovens creyan, colaboran y aprenden con Scratch. Pa obtener una visión cheneral, consulte l'articlo {codingAtACrossroadsLink} y lo libro {lifelongKindergartenBookLink}. Pa saber mas sobre l'uso de Scratch, consulte la pachina {statisticsLink} y lo {annualReportLink} de Scratch.",
30
- "about.researchLinkText": "investigando",
31
- "about.statisticsLinkText": "estatisticas",
32
- "about.lifelongKindergartenGroupLinkText": " Grupo de Lifelong Kindergarten \"chardín de infancia Lifelong\"",
33
- "about.codingAtACrossroadsLinkText": "Codificación en Crossroads \"cruzillata\"",
34
- "about.lifelongKindergartenBookLinkText": "Chardín de infancia Lifelong",
35
- "about.annualReportLinkText": "Informe anyal",
36
- "about.support": "Emparo y financiamiento",
37
- "about.supportDescription": "Scratch ye disponible de forma gratuita, gracias a l'emparo d'o nuestro {donorsLink}. Este emparo nos aduya a proporcionar a los ninos arredol d'o mundo oportunidatz pa imachinar, creyar y compartir. Puetz emparar a Scratch fendo una donación {donateLink}.",
38
- "about.donorsLinkText": "donants",
39
- "about.donateLinkText": "aquí",
8
+ "about.introLearnMore": "Learn more at Scratch Foundation",
9
+ "about.support": "Support Scratch",
10
+ "about.supportDescription1": "Scratch is available for free, thanks to our {supportersLink}. This support helps us provide young people around the world with opportunities to imagine, create, and share.",
11
+ "about.supportDescription2": "Every dollar donated gives one child access to free, playful, and powerful creative learning through the Scratch community.",
12
+ "about.supportDescription3": "Join us in helping kids everywhere create what they imagine.",
13
+ "about.supportersLinkText": "supporters",
40
14
  "about.donateButton": "Donar"
41
15
  }