@3cr/viewer-browser 0.0.247 → 0.0.292

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 (519) hide show
  1. package/.circleci/config.yml +53 -0
  2. package/README.md +79 -74
  3. package/components.d.ts +94 -36
  4. package/dist/Viewer3CR.js +663 -47
  5. package/dist/Viewer3CR.mjs +108285 -37154
  6. package/dist/Viewer3CR.umd.js +663 -47
  7. package/index.html +35 -33
  8. package/package.json +27 -8
  9. package/playground/img.png +0 -0
  10. package/playground/index.html +6 -2
  11. package/src/App.vue +41 -97
  12. package/src/__tests__/app.spec.ts +2 -1
  13. package/src/__tests__/main.spec.ts +14 -14
  14. package/src/assets/_palette.scss +112 -0
  15. package/src/assets/_settings.scss +64 -0
  16. package/src/assets/_typography.scss +187 -0
  17. package/src/assets/images/cloud-storage.svg +22 -0
  18. package/src/assets/images/courtney.png +0 -0
  19. package/src/assets/images/dark/magic-wand.svg +32 -0
  20. package/src/assets/images/dark-theme.svg +33 -0
  21. package/src/assets/images/dot.svg +5 -0
  22. package/src/assets/images/dr-miles.png +0 -0
  23. package/src/assets/images/illustration.svg +118 -0
  24. package/src/assets/images/intro.svg +30 -0
  25. package/src/assets/{magic_wand.svg → images/light/magic-wand.svg} +22 -14
  26. package/src/assets/images/light-theme.svg +33 -0
  27. package/src/assets/images/system-theme.svg +51 -0
  28. package/src/assets/images/totalSegmentator.png +0 -0
  29. package/src/assets/logos/3dicom/black/black.svg +30 -0
  30. package/src/assets/logos/3dicom/colour/colour.svg +18 -0
  31. package/src/assets/logos/3dicom/colour/colour_single.svg +18 -0
  32. package/src/assets/logos/3dicom/wordmark/patients/patients.svg +29 -0
  33. package/src/assets/logos/3dicom/wordmark/powered-by/powered-by.svg +41 -0
  34. package/src/assets/logos/3dicom/wordmark/practitioners/practitioner.svg +34 -0
  35. package/src/assets/logos/3dicom/wordmark/research/research.svg +29 -0
  36. package/src/assets/logos/license/black/black.svg +22 -0
  37. package/src/assets/logos/license/white/white.svg +22 -0
  38. package/src/assets/styles.scss +435 -12
  39. package/src/components/ShFlatIconBtn.vue +36 -0
  40. package/src/components/ShPlainIconBtn.vue +42 -0
  41. package/src/components/ShSelect.vue +48 -0
  42. package/src/components/ShTextField.vue +39 -0
  43. package/src/components/ShTextarea.vue +39 -0
  44. package/src/components/__tests__/ShFlatIconBtn.spec.ts +32 -0
  45. package/src/components/__tests__/ShPlainIconBtn.spec.ts +37 -0
  46. package/src/components/__tests__/ShSelect.spec.ts +30 -0
  47. package/src/components/__tests__/ShTextField.spec.ts +30 -0
  48. package/src/components/__tests__/ShTextarea.spec.ts +30 -0
  49. package/src/components/demo/CloudDropZone.vue +105 -0
  50. package/src/components/demo/DemoAvatarDropdownMenu.vue +343 -0
  51. package/src/components/demo/DemoInfoModal.vue +60 -0
  52. package/src/components/demo/DemoNotificationNavigationDrawer.vue +118 -0
  53. package/src/components/demo/DemoPurchaseCreditsModal.vue +141 -0
  54. package/src/components/demo/DemoUpgradeCloudStorageModal.vue +74 -0
  55. package/src/components/demo/DemoUpgradePlanModal.vue +17 -0
  56. package/src/components/demo/UploadDicomToCloudModal.vue +225 -0
  57. package/src/components/demo/__tests__/CloudDropZone.spec.ts +132 -0
  58. package/src/components/demo/__tests__/DemoAvatarDropdownMenu.spec.ts +16 -0
  59. package/src/components/demo/{licence/__tests__/DemoLicenceEnableCloudStorageModal.spec.ts → __tests__/DemoEnableCloudStorageModal.spec.ts} +11 -11
  60. package/src/components/demo/{licence/__tests__/DemoLicenceInfoModal.spec.ts → __tests__/DemoInfoModal.spec.ts} +11 -8
  61. package/src/components/demo/__tests__/DemoNotificationNavigationDrawer.spec.ts +56 -0
  62. package/src/components/demo/__tests__/UploadDicomToCloudModal.spec.ts +320 -0
  63. package/src/components/demo/__tests__/demo-payload.spec.ts +10 -0
  64. package/src/components/demo/demo-notifications.ts +45 -0
  65. package/src/components/demo/demo-payload.ts +9 -0
  66. package/src/components/demo/fileReader.ts +47 -0
  67. package/src/{composables/useViewerOptions.ts → components/demo/mockDemoViewerStlDecimator.ts} +8 -12
  68. package/src/components/intro/ViewerIntro.vue +56 -0
  69. package/src/components/intro/ViewerTour.vue +53 -0
  70. package/src/components/intro/tour/Tour.vue +205 -0
  71. package/src/components/intro/tour/step.ts +6 -0
  72. package/src/components/modal/ActionRail.vue +4 -0
  73. package/src/components/modal/Viewer3cr.vue +224 -0
  74. package/src/components/modal/Viewer3crWebGL.vue +65 -0
  75. package/src/components/modal/ViewerActionRail.vue +10 -27
  76. package/src/components/modal/ViewerMain.vue +83 -0
  77. package/src/components/modal/ViewerNavigationDrawer.vue +269 -68
  78. package/src/components/modal/ViewerScanView.vue +223 -67
  79. package/src/components/modal/__tests__/{MftpWebGL3DRModal.spec.ts → Viewer3cr.spec.ts} +154 -53
  80. package/src/components/modal/__tests__/{WebGL3DR.spec.ts → Viewer3crWebGL.spec.ts} +11 -11
  81. package/src/components/modal/__tests__/ViewerNavigationDrawer.spec.ts +271 -11
  82. package/src/components/modal/__tests__/ViewerScanView.spec.ts +15 -7
  83. package/src/components/modal/actions/Action.vue +3 -8
  84. package/src/components/modal/actions/Flip3dAction.vue +31 -16
  85. package/src/components/modal/actions/FlipHorizontalAction.vue +14 -5
  86. package/src/components/modal/actions/FlipVerticalAction.vue +14 -5
  87. package/src/components/modal/actions/FullscreenAction.vue +9 -5
  88. package/src/components/modal/actions/PanAction.vue +11 -51
  89. package/src/components/modal/actions/ResetViewAction.vue +10 -8
  90. package/src/components/modal/actions/Rotate2dAction.vue +25 -15
  91. package/src/components/modal/actions/Slice3dAction.vue +22 -10
  92. package/src/components/modal/actions/ZoomAction.vue +21 -13
  93. package/src/components/modal/actions/__tests__/Action.spec.ts +2 -2
  94. package/src/components/modal/actions/__tests__/Flip3dAction.spec.ts +58 -14
  95. package/src/components/modal/actions/__tests__/FlipHorizontalAction.spec.ts +15 -5
  96. package/src/components/modal/actions/__tests__/FlipVerticalAction.spec.ts +15 -5
  97. package/src/components/modal/actions/__tests__/FullscreenAction.spec.ts +7 -5
  98. package/src/components/modal/actions/__tests__/PanAction.spec.ts +13 -32
  99. package/src/components/modal/actions/__tests__/ResetViewAction.spec.ts +5 -3
  100. package/src/components/modal/actions/__tests__/Rotate2dAction.spec.ts +13 -6
  101. package/src/components/modal/actions/__tests__/Slice3dAction.spec.ts +1 -1
  102. package/src/components/modal/actions/__tests__/ZoomAction.spec.ts +25 -11
  103. package/src/components/modal/app-bars/ViewerActionBar.vue +224 -0
  104. package/src/components/modal/app-bars/ViewerAppBar.vue +126 -0
  105. package/src/components/modal/app-bars/__tests__/ViewerActionBar.spec.ts +176 -0
  106. package/src/components/modal/app-bars/__tests__/ViewerAppBar.spec.ts +99 -0
  107. package/src/components/modal/layouts/Layout1x3ClipPath.vue +35 -0
  108. package/src/components/modal/layouts/Layout2x2ClipPath.vue +35 -0
  109. package/src/components/modal/layouts/LayoutFullscreenClipPath.vue +29 -0
  110. package/src/components/modal/layouts/__tests__/Layout1x3ClipPath.spec.ts +15 -0
  111. package/src/components/modal/layouts/__tests__/Layout2x2ClipPath.spec.ts +15 -0
  112. package/src/components/modal/layouts/__tests__/LayoutFullscreenClipPath.spec.ts +15 -0
  113. package/src/components/modal/layouts/composables/__tests__/useLayout1x3.spec.ts +40 -0
  114. package/src/components/modal/layouts/composables/__tests__/useLayout2x2.spec.ts +40 -0
  115. package/src/components/modal/layouts/composables/__tests__/useLayoutFullscreen.spec.ts +40 -0
  116. package/src/components/modal/layouts/composables/useLayout1x3.ts +46 -0
  117. package/src/components/modal/layouts/composables/useLayout2x2.ts +46 -0
  118. package/src/components/modal/layouts/composables/useLayoutFullscreen.ts +24 -0
  119. package/src/components/modal/menus/AutoAnnotateMenu.vue +67 -0
  120. package/src/components/modal/menus/AvatarDropdownMenu.vue +66 -0
  121. package/src/components/modal/menus/HelpMenu.vue +47 -0
  122. package/src/components/modal/menus/SettingsMenu.vue +242 -92
  123. package/src/components/modal/menus/ShareMenu.vue +58 -0
  124. package/src/components/modal/menus/__tests__/AutoAnnotateMenu.spec.ts +80 -0
  125. package/src/components/modal/menus/__tests__/AvatarDropdownMenu.spec.ts +49 -0
  126. package/src/components/modal/menus/__tests__/HelpMenu.spec.ts +12 -0
  127. package/src/components/modal/menus/__tests__/SettingsMenu.spec.ts +163 -57
  128. package/src/components/modal/modal/AboutModal.vue +61 -0
  129. package/src/components/modal/modal/AiModelList.vue +70 -0
  130. package/src/components/modal/{AskAI.vue → modal/AskAiModal.vue} +26 -34
  131. package/src/components/modal/modal/AutoAnnotateModal.vue +136 -0
  132. package/src/components/modal/modal/CloseViewerModal.vue +108 -0
  133. package/src/components/modal/modal/DataOverlayGeneralModal.vue +122 -0
  134. package/src/components/modal/modal/DataOverlayMeasurementModal.vue +59 -0
  135. package/src/components/modal/modal/DataOverlayModal.vue +121 -0
  136. package/src/components/modal/modal/ShareModal.vue +201 -0
  137. package/src/components/modal/modal/UploadsDrawer.vue +165 -0
  138. package/src/components/modal/modal/WhatsNewModal.vue +45 -0
  139. package/src/components/modal/modal/__tests__/AboutModal.spec.ts +60 -0
  140. package/src/components/modal/modal/__tests__/AiModelList.spec.ts +50 -0
  141. package/src/components/modal/{__tests__ → modal/__tests__}/AskAI.spec.ts +8 -7
  142. package/src/components/modal/modal/__tests__/AutoAnnotateModal.spec.ts +29 -0
  143. package/src/components/modal/modal/__tests__/CloseViewerModal.spec.ts +60 -0
  144. package/src/components/modal/modal/__tests__/DataOverlayGeneralModal.spec.ts +55 -0
  145. package/src/components/modal/modal/__tests__/DataOverlayMeasurementModal.spec.ts +82 -0
  146. package/src/components/modal/modal/__tests__/DataOverlayModal.spec.ts +94 -0
  147. package/src/components/modal/modal/__tests__/ShareModal.spec.ts +262 -0
  148. package/src/components/modal/modal/__tests__/UploadsDrawer.spec.ts +174 -0
  149. package/src/components/modal/modal/__tests__/WhatsNewModal.spec.ts +29 -0
  150. package/src/components/modal/snackbars/AnnotationGeneratedSnackbar.vue +34 -0
  151. package/src/components/modal/snackbars/ImagesSharedSnackbar.vue +26 -0
  152. package/src/components/modal/snackbars/LinkCopiedSnackbar.vue +26 -0
  153. package/src/components/modal/snackbars/__tests__/AnnotationGeneratedSnackbar.spec.ts +43 -0
  154. package/src/components/modal/snackbars/__tests__/ImagesSharedSnackbar.spec.ts +22 -0
  155. package/src/components/modal/snackbars/__tests__/LinkCopiedSnackbar.spec.ts +21 -0
  156. package/src/components/navigation/annotation/AnnotationCreateModal.vue +114 -0
  157. package/src/components/navigation/annotation/AnnotationCreateSnackbar.vue +20 -0
  158. package/src/components/navigation/annotation/AnnotationDataTable.vue +157 -0
  159. package/src/components/navigation/annotation/AnnotationDeleteModal.vue +48 -0
  160. package/src/components/navigation/annotation/AnnotationDeleteSnackbar.vue +25 -0
  161. package/src/components/navigation/annotation/AnnotationForm.vue +277 -0
  162. package/src/components/navigation/annotation/AnnotationIcon.vue +45 -0
  163. package/src/components/navigation/annotation/AnnotationInfo.vue +141 -0
  164. package/src/components/navigation/annotation/AnnotationMenu.vue +99 -0
  165. package/src/components/navigation/annotation/AnnotationPanel.vue +30 -0
  166. package/src/components/navigation/annotation/AnnotationTools.vue +104 -0
  167. package/src/components/navigation/annotation/AnnotationUpdateModal.vue +78 -0
  168. package/src/components/navigation/annotation/AnnotationVisibilityBtn.vue +52 -0
  169. package/src/components/navigation/annotation/DrawerTitle.vue +25 -0
  170. package/src/components/navigation/annotation/__tests__/AnnotationCreateModal.spec.ts +178 -0
  171. package/src/components/navigation/annotation/__tests__/AnnotationCreateSnackbar.spec.ts +31 -0
  172. package/src/components/navigation/annotation/__tests__/AnnotationDataTable.spec.ts +79 -0
  173. package/src/components/navigation/annotation/__tests__/AnnotationDeleteSnackbar.spec.ts +66 -0
  174. package/src/components/navigation/annotation/__tests__/AnnotationForm.spec.ts +261 -0
  175. package/src/components/navigation/annotation/__tests__/AnnotationIcon.spec.ts +13 -0
  176. package/src/components/navigation/annotation/__tests__/AnnotationTools.spec.ts +116 -0
  177. package/src/components/navigation/display/DisplayPanel.vue +156 -0
  178. package/src/components/{views/__tests__/DisplaySettings.spec.ts → navigation/display/__tests__/DisplayPanel.spec.ts} +14 -3
  179. package/src/components/navigation/history/HistoryModal.vue +140 -0
  180. package/src/components/navigation/mcad/McadAddObjectBtn.vue +41 -0
  181. package/src/components/navigation/mcad/McadDataTable.vue +78 -0
  182. package/src/components/navigation/mcad/McadDataTableItems.vue +382 -0
  183. package/src/components/navigation/mcad/McadDeleteModal.vue +44 -0
  184. package/src/components/navigation/mcad/McadDropZone.vue +148 -0
  185. package/src/components/navigation/mcad/McadFloating.vue +193 -0
  186. package/src/components/navigation/mcad/McadIcon.vue +34 -0
  187. package/src/components/navigation/mcad/McadInvert.vue +91 -0
  188. package/src/components/navigation/mcad/McadLockBtn.vue +62 -0
  189. package/src/components/navigation/mcad/McadMenu.vue +248 -0
  190. package/src/components/navigation/mcad/McadOpacity.vue +79 -0
  191. package/src/components/navigation/mcad/McadPanel.vue +31 -0
  192. package/src/components/navigation/mcad/McadToggleSortBtn.vue +18 -0
  193. package/src/components/navigation/mcad/McadToggleVisibilityBtn.vue +46 -0
  194. package/src/components/navigation/mcad/McadUpdateModal.vue +108 -0
  195. package/src/components/navigation/mcad/McadVisibilityBtn.vue +46 -0
  196. package/src/components/navigation/mcad/__tests__/McadAddObjectBtn.spec.ts +73 -0
  197. package/src/components/navigation/mcad/__tests__/McadDataTable.spec.ts +27 -0
  198. package/src/components/navigation/mcad/__tests__/McadDataTableItems.spec.ts +621 -0
  199. package/src/components/navigation/mcad/__tests__/McadDeleteModal.spec.ts +67 -0
  200. package/src/components/navigation/mcad/__tests__/McadDropZone.spec.ts +109 -0
  201. package/src/components/navigation/mcad/__tests__/McadIcon.spec.ts +13 -0
  202. package/src/components/navigation/mcad/__tests__/McadInvert.spec.ts +45 -0
  203. package/src/components/navigation/mcad/__tests__/McadLockBtn.spec.ts +38 -0
  204. package/src/components/navigation/mcad/__tests__/McadMenu.spec.ts +258 -0
  205. package/src/components/navigation/mcad/__tests__/McadOpacity.spec.ts +68 -0
  206. package/src/components/navigation/mcad/__tests__/McadToggleSortBtn.spec.ts +36 -0
  207. package/src/components/navigation/mcad/__tests__/McadToggleVisibilityBtn.spec.ts +53 -0
  208. package/src/components/navigation/mcad/__tests__/McadUpdateModal.spec.ts +122 -0
  209. package/src/components/navigation/mcad/__tests__/McadVisibilityBtn.spec.ts +45 -0
  210. package/src/components/navigation/measurement/MeasurementAngleSnackbar.vue +18 -0
  211. package/src/components/navigation/measurement/MeasurementDataTable.vue +162 -0
  212. package/src/components/navigation/measurement/MeasurementDeleteModal.vue +49 -0
  213. package/src/components/navigation/measurement/MeasurementDeleteSnackbar.vue +40 -0
  214. package/src/components/navigation/measurement/MeasurementIcon.vue +41 -0
  215. package/src/components/navigation/measurement/MeasurementInfo.vue +25 -0
  216. package/src/components/navigation/measurement/MeasurementInfoAngle.vue +36 -0
  217. package/src/components/navigation/measurement/MeasurementInfoLength.vue +37 -0
  218. package/src/components/navigation/measurement/MeasurementInfoPolygon.vue +58 -0
  219. package/src/components/navigation/measurement/MeasurementLengthSnackbar.vue +18 -0
  220. package/src/components/navigation/measurement/MeasurementMenu.vue +97 -0
  221. package/src/components/navigation/measurement/MeasurementPanel.vue +30 -0
  222. package/src/components/navigation/measurement/MeasurementPolygonSnackbar.vue +18 -0
  223. package/src/components/navigation/measurement/MeasurementTools.vue +101 -0
  224. package/src/components/navigation/measurement/MeasurementVisibilityBtn.vue +53 -0
  225. package/src/components/navigation/measurement/__tests__/MeasurementAngleSnackbar.spec.ts +34 -0
  226. package/src/components/navigation/measurement/__tests__/MeasurementDataTable.spec.ts +79 -0
  227. package/src/components/navigation/measurement/__tests__/MeasurementDeleteSnackbar.spec.ts +51 -0
  228. package/src/components/navigation/measurement/__tests__/MeasurementInfo.spec.ts +77 -0
  229. package/src/components/navigation/measurement/__tests__/MeasurementLengthSnackbar.spec.ts +35 -0
  230. package/src/components/navigation/measurement/__tests__/MeasurementPolygonSnackbar.spec.ts +35 -0
  231. package/src/components/navigation/measurement/__tests__/MeasurementTools.spec.ts +87 -0
  232. package/src/components/shared/ColourPalette.vue +72 -0
  233. package/src/components/shared/DoubleSliderSelector.vue +66 -28
  234. package/src/components/shared/HorizontalSliderSelector.vue +80 -0
  235. package/src/components/shared/KeyboardShortcuts.vue +184 -0
  236. package/src/components/shared/LoadingSpinner.vue +508 -144
  237. package/src/components/shared/MultiLoginError.vue +98 -0
  238. package/src/components/shared/NotificationToaster.vue +112 -0
  239. package/src/components/shared/UpdateSnackbar.vue +22 -9
  240. package/src/components/shared/ValueSelector.vue +10 -10
  241. package/src/components/shared/VerticalSliderSelector.vue +45 -44
  242. package/src/components/shared/__tests__/ColourPalette.spec.ts +21 -0
  243. package/src/components/shared/__tests__/DoubleSliderSelector.spec.ts +58 -46
  244. package/src/components/shared/__tests__/HorizontalSliderSelector.spec.ts +35 -0
  245. package/src/components/shared/__tests__/KeyboardShortcuts.spec.ts +50 -0
  246. package/src/components/shared/__tests__/MultiLoginError.spec.ts +50 -0
  247. package/src/components/shared/__tests__/NotificationToaster.spec.ts +65 -0
  248. package/src/components/shared/__tests__/UpdateSnackbar.spec.ts +7 -7
  249. package/src/components/shared/__tests__/ValueSelector.spec.ts +6 -0
  250. package/src/composables/__tests__/useDebounce.spec.ts +17 -0
  251. package/src/composables/__tests__/useMovingAverage.spec.ts +40 -0
  252. package/src/composables/__tests__/useNavigationCube.spec.ts +79 -0
  253. package/src/{functions/__tests__/notification.spec.ts → composables/__tests__/useNotificationHandler.spec.ts} +74 -17
  254. package/src/composables/__tests__/useToolGroup.spec.ts +41 -0
  255. package/src/composables/__tests__/useViewName.spec.ts +29 -0
  256. package/src/composables/useBoundingBox.ts +32 -0
  257. package/src/composables/useEventListener.ts +7 -9
  258. package/src/composables/useMedia.ts +27 -0
  259. package/src/composables/useNavigationCube.ts +80 -0
  260. package/src/composables/useNotificationHandler.ts +82 -0
  261. package/src/composables/useResizeObserver.ts +31 -0
  262. package/src/composables/useToolGroup.ts +36 -0
  263. package/src/composables/useViewName.ts +34 -0
  264. package/src/composables/useViewer3cr.ts +3 -2
  265. package/src/config.ts +1 -1
  266. package/src/constants.ts +8 -0
  267. package/src/functions/HotkeyScope.ts +87 -0
  268. package/src/functions/__tests__/HotkeyScope.spec.ts +49 -0
  269. package/src/functions/__tests__/colours.spec.ts +42 -0
  270. package/src/functions/__tests__/fileReader.spec.ts +130 -0
  271. package/src/functions/__tests__/modelHelper.spec.ts +1 -0
  272. package/src/functions/__tests__/tsHelper.spec.ts +7 -0
  273. package/src/functions/chunker.ts +21 -0
  274. package/src/functions/colours.ts +45 -0
  275. package/src/functions/fileReader.ts +48 -0
  276. package/src/functions/guards/__tests__/isDataOverlayAngle.spec.ts +21 -0
  277. package/src/functions/guards/__tests__/isDataOverlayLength.spec.ts +21 -0
  278. package/src/functions/guards/__tests__/isDataOverlayPolygon.spec.ts +21 -0
  279. package/src/functions/guards/isDataOverlayAngle.ts +3 -4
  280. package/src/functions/guards/isDataOverlayLength.ts +3 -4
  281. package/src/functions/guards/isDataOverlayPolygon.ts +3 -4
  282. package/src/functions/openUrl.ts +3 -0
  283. package/src/functions/{__tests__ → parsers/__tests__}/parseAction.spec.ts +1 -1
  284. package/src/functions/{__tests__ → parsers/__tests__}/parseCallToAction.spec.ts +1 -1
  285. package/src/functions/{__tests__ → parsers/__tests__}/parseDataOverlay.spec.ts +1 -1
  286. package/src/functions/{__tests__ → parsers/__tests__}/parseDataOverlayData.spec.ts +1 -1
  287. package/src/functions/{__tests__ → parsers/__tests__}/parseDataOverlayEvent.spec.ts +3 -3
  288. package/src/functions/{__tests__ → parsers/__tests__}/parseMcadEvent.spec.ts +3 -3
  289. package/src/functions/{parseAction.ts → parsers/parseAction.ts} +1 -2
  290. package/src/functions/{parseCallToAction.ts → parsers/parseCallToAction.ts} +2 -2
  291. package/src/functions/{parseDataOverlay.ts → parsers/parseDataOverlay.ts} +3 -3
  292. package/src/functions/parsers/parseDataOverlayData.ts +9 -0
  293. package/src/functions/parsers/parseDataOverlayEvent.ts +19 -0
  294. package/src/functions/parsers/parseMcadEvent.ts +9 -0
  295. package/src/functions/platform.ts +7 -0
  296. package/src/functions/translateTooltipShortcut.ts +35 -0
  297. package/src/functions/tsHelper.ts +3 -0
  298. package/src/main.ts +68 -43
  299. package/src/models/__tests__/iso-languages.spec.ts +23 -0
  300. package/src/models/__tests__/scanState.spec.ts +14 -38
  301. package/src/models/iso-languages.ts +1609 -0
  302. package/src/models/progress.ts +23 -0
  303. package/src/models/scanState.ts +56 -100
  304. package/src/plugins/__tests__/pinia.spec.ts +7 -0
  305. package/src/plugins/__tests__/vue-i18n.spec.ts +7 -0
  306. package/src/plugins/__tests__/vuetify.spec.ts +3 -3
  307. package/src/plugins/locales/en.json +442 -0
  308. package/src/plugins/material-symbols/aliases.ts +43 -0
  309. package/src/plugins/material-symbols/material-symbols-filled.ts +11 -0
  310. package/src/plugins/material-symbols/material-symbols-outlined.ts +9 -0
  311. package/src/plugins/pinia.ts +3 -0
  312. package/src/plugins/vue-i18n.ts +9 -0
  313. package/src/plugins/vuetify.ts +157 -25
  314. package/src/services/__tests__/features.service.spec.ts +14 -0
  315. package/src/services/__tests__/gpt.service.spec.ts +64 -3
  316. package/src/services/__tests__/viewer-3cr.service.spec.ts +616 -192
  317. package/src/services/features.service.ts +32 -0
  318. package/src/services/gpt.service.ts +5 -2
  319. package/src/services/viewer-3cr.service.ts +374 -307
  320. package/src/stores/__tests__/data-overlay.store.spec.ts +92 -0
  321. package/src/stores/__tests__/demo.store.spec.ts +196 -0
  322. package/src/stores/__tests__/drawer.store.spec.ts +27 -0
  323. package/src/stores/__tests__/intro.store.spec.ts +102 -0
  324. package/src/stores/__tests__/language.store.spec.ts +83 -0
  325. package/src/stores/__tests__/mcad-floating.store.spec.ts +339 -0
  326. package/src/stores/__tests__/mcad.store.spec.ts +88 -0
  327. package/src/stores/__tests__/save.store.spec.ts +51 -0
  328. package/src/stores/__tests__/theme.store.spec.ts +18 -0
  329. package/src/stores/__tests__/tool.store.spec.ts +53 -0
  330. package/src/stores/__tests__/upload.store.spec.ts +19 -0
  331. package/src/stores/__tests__/viewer.store.spec.ts +20 -0
  332. package/src/stores/data-overlay.store.ts +93 -0
  333. package/src/stores/demo.store.ts +284 -0
  334. package/src/stores/drawer.store.ts +23 -0
  335. package/src/stores/intro.store.ts +35 -0
  336. package/src/stores/language.store.ts +59 -0
  337. package/src/stores/mcad-floating.store.ts +141 -0
  338. package/src/stores/mcad.store.ts +53 -0
  339. package/src/stores/save.store.ts +59 -0
  340. package/src/stores/theme.store.ts +45 -0
  341. package/src/stores/tool.store.ts +41 -0
  342. package/src/stores/upload.store.ts +19 -0
  343. package/src/stores/viewer.store.ts +34 -0
  344. package/src/tools/__tests__/annotation-create.tool.spec.ts +90 -0
  345. package/src/tools/__tests__/annotation-move.tool.spec.ts +107 -0
  346. package/src/tools/__tests__/data-overlay.tool.spec.ts +127 -0
  347. package/src/tools/__tests__/mcad-move.tool.spec.ts +106 -0
  348. package/src/tools/__tests__/mcad-rotate.tool.spec.ts +103 -0
  349. package/src/tools/__tests__/mcad-scale.tool.spec.ts +8 -0
  350. package/src/tools/__tests__/mcad-select.tool.spec.ts +63 -0
  351. package/src/tools/__tests__/measurement-angle.tool.spec.ts +26 -0
  352. package/src/tools/__tests__/measurement-length.tool.spec.ts +26 -0
  353. package/src/tools/__tests__/measurement-polygon.tool.spec.ts +26 -0
  354. package/src/tools/annotation-create.tool.ts +48 -0
  355. package/src/tools/annotation-move.tool.ts +48 -0
  356. package/src/tools/data-overlay.tool.ts +45 -48
  357. package/src/tools/mcad-move.tool.ts +47 -0
  358. package/src/tools/mcad-rotate.tool.ts +47 -0
  359. package/src/tools/mcad-scale-tool.ts +10 -0
  360. package/src/tools/mcad-select-tool.ts +32 -0
  361. package/src/tools/measurement-angle.tool.ts +20 -0
  362. package/src/tools/measurement-length.tool.ts +20 -0
  363. package/src/tools/measurement-polygon.tool.ts +20 -0
  364. package/src/types/feature.ts +6 -0
  365. package/src/types/viewer-tool.ts +5 -0
  366. package/test/MockImportOriginal.ts +7 -0
  367. package/test/assertions/beTypeOrNull.ts +24 -0
  368. package/test/fakers/action-data.faker.ts +1 -1
  369. package/test/fakers/action.faker.ts +1 -1
  370. package/test/fakers/call-to-action.faker.ts +1 -1
  371. package/test/fakers/data-overlay-angle.faker.ts +1 -1
  372. package/test/fakers/data-overlay-annotation.faker.ts +1 -1
  373. package/test/fakers/data-overlay-data.faker.ts +18 -15
  374. package/test/fakers/data-overlay-interaction.faker.ts +25 -17
  375. package/test/fakers/data-overlay-length.faker.ts +1 -1
  376. package/test/fakers/data-overlay-mcad.faker.ts +4 -3
  377. package/test/fakers/data-overlay-polygon.faker.ts +1 -1
  378. package/test/fakers/feature.faker.ts +13 -0
  379. package/test/fakers/file.faker.ts +11 -0
  380. package/test/fakers/gpt-question.faker.ts +1 -1
  381. package/test/fakers/gpt-response.faker.ts +1 -1
  382. package/test/fakers/mcad-object-interaction.faker.ts +4 -4
  383. package/test/fakers/orientation.faker.ts +1 -1
  384. package/test/fakers/segment-angle.faker.ts +1 -1
  385. package/test/fakers/upload.faker.ts +14 -0
  386. package/test/getAnimationFrame.ts +3 -0
  387. package/test/plugins/findByTestId.ts +13 -6
  388. package/test/plugins/pinia.ts +20 -0
  389. package/test/plugins/vitest.d.ts +8 -0
  390. package/test/plugins/vue-i18n.ts +22 -0
  391. package/test/plugins/vuetify.ts +10 -0
  392. package/test/setup.ts +37 -12
  393. package/tsconfig.json +1 -1
  394. package/vite.config.mts +48 -18
  395. package/vitest.config.mts +12 -3
  396. package/src/assets/images/MainBackdrop.svg +0 -48
  397. package/src/assets/images/dark/Singular-Health-Disc-Mono.svg +0 -9
  398. package/src/assets/images/dark/demo-icon-small.png +0 -0
  399. package/src/assets/images/dark/demo-logo-small.svg +0 -27
  400. package/src/assets/images/dark/demo-logo.svg +0 -1
  401. package/src/assets/images/light/Singular-Health-Disc-Mono.svg +0 -9
  402. package/src/assets/logos/3dicom/white-mini.svg +0 -20
  403. package/src/components/demo/DemoModal.vue +0 -44
  404. package/src/components/demo/DemoPatientModal.vue +0 -52
  405. package/src/components/demo/__tests__/DemoModal.spec.ts +0 -26
  406. package/src/components/demo/__tests__/DemoPatientModal.spec.ts +0 -38
  407. package/src/components/demo/__tests__/options.spec.ts +0 -25
  408. package/src/components/demo/licence/DemoLicenceEnableCloudStorageModal.vue +0 -64
  409. package/src/components/demo/licence/DemoLicenceInfoModal.vue +0 -49
  410. package/src/components/demo/licence/DemoLicenceSendToPartyModal.vue +0 -178
  411. package/src/components/demo/licence/DemoLicenceShareToMobileModal.vue +0 -102
  412. package/src/components/demo/licence/__tests__/DemoLicenceSendToPartyModal.spec.ts +0 -36
  413. package/src/components/demo/licence/__tests__/DemoLicenceShareToMobileModal.spec.ts +0 -52
  414. package/src/components/demo/options.ts +0 -170
  415. package/src/components/demo/patient/DemoPatientEnableCloudStorageModal.vue +0 -64
  416. package/src/components/demo/patient/DemoPatientInfoModal.vue +0 -49
  417. package/src/components/demo/patient/DemoPatientSendToPartyModal.vue +0 -177
  418. package/src/components/demo/patient/DemoPatientShareToMobileModal.vue +0 -102
  419. package/src/components/demo/patient/__tests__/DemoPatientEnableCloudStorageModal.spec.ts +0 -38
  420. package/src/components/demo/patient/__tests__/DemoPatientInfoModal.spec.ts +0 -38
  421. package/src/components/demo/patient/__tests__/DemoPatientSendToPartyModal.spec.ts +0 -36
  422. package/src/components/demo/patient/__tests__/DemoPatientShareToMobileModal.spec.ts +0 -52
  423. package/src/components/modal/CloseViewerModal.vue +0 -69
  424. package/src/components/modal/MftpWebGL3DRModal.vue +0 -336
  425. package/src/components/modal/ViewerNavigationDrawerContent.vue +0 -168
  426. package/src/components/modal/ViewerNavigationDrawerFooter.vue +0 -131
  427. package/src/components/modal/ViewerNavigationDrawerHeader.vue +0 -33
  428. package/src/components/modal/WebGL3DR.vue +0 -91
  429. package/src/components/modal/__tests__/CloseViewerModal.spec.ts +0 -70
  430. package/src/components/modal/__tests__/ViewerNavigationDrawerContent.spec.ts +0 -11
  431. package/src/components/modal/__tests__/ViewerNavigationDrawerFooter.spec.ts +0 -46
  432. package/src/components/modal/__tests__/ViewerNavigationDrawerHeader.spec.ts +0 -40
  433. package/src/components/modal/actions/NavigationCubeAction.vue +0 -26
  434. package/src/components/modal/actions/__tests__/NavigationCubeAction.spec.ts +0 -25
  435. package/src/components/modal/buttons/AutoAnnotateBtn.vue +0 -197
  436. package/src/components/modal/buttons/__tests__/AutoAnnotateBtn.spec.ts +0 -28
  437. package/src/components/modal/menus/FileMenu.vue +0 -73
  438. package/src/components/modal/menus/__tests__/FileMenu.spec.ts +0 -110
  439. package/src/components/navigation/mcad/McadGlobalActions.vue +0 -20
  440. package/src/components/navigation/mcad/McadGlobalOpacitySlider.vue +0 -103
  441. package/src/components/navigation/mcad/McadGlobalScanViewBtn.vue +0 -28
  442. package/src/components/navigation/mcad/McadGlobalVisibilityBtn.vue +0 -38
  443. package/src/components/views/AnnotationTreeView.vue +0 -236
  444. package/src/components/views/DisplaySettings.vue +0 -94
  445. package/src/components/views/MarkupTreeView.vue +0 -201
  446. package/src/components/views/McadObjectTreeView.vue +0 -129
  447. package/src/components/views/__tests__/AnnotationTreeView.spec.ts +0 -62
  448. package/src/components/views/__tests__/MarkupTreeView.spec.ts +0 -41
  449. package/src/components/views/__tests__/McadObjectTreeView.spec.ts +0 -47
  450. package/src/components/views/modals/DataOverlayGeneralModal.vue +0 -71
  451. package/src/components/views/modals/DataOverlayMarkupModal.vue +0 -60
  452. package/src/components/views/modals/DataOverlayModal.vue +0 -88
  453. package/src/components/views/shared/MaskIcon.vue +0 -44
  454. package/src/components/views/shared/ObjectColor.vue +0 -31
  455. package/src/components/views/shared/ObjectLabel.vue +0 -30
  456. package/src/components/views/shared/Opacity.vue +0 -65
  457. package/src/components/views/shared/VisibilityBtn.vue +0 -25
  458. package/src/components/views/shared/__tests__/MaskIcon.spec.ts +0 -10
  459. package/src/components/views/shared/__tests__/ObjectColor.spec.ts +0 -10
  460. package/src/components/views/shared/__tests__/ObjectLabel.spec.ts +0 -10
  461. package/src/components/views/shared/__tests__/Opacity.spec.ts +0 -24
  462. package/src/components/views/shared/__tests__/VisibilityBtn.spec.ts +0 -11
  463. package/src/components/views/types/annotation-tree-view-item-child-action.ts +0 -6
  464. package/src/components/views/types/annotation-tree-view-item-child.ts +0 -9
  465. package/src/components/views/types/annotation-tree-view-item.ts +0 -13
  466. package/src/components/views/types/markup-tree-view-item-child.ts +0 -6
  467. package/src/components/views/types/markup-tree-view-item.ts +0 -14
  468. package/src/components/views/types/mcad-object-tree-view-item.ts +0 -13
  469. package/src/composables/__tests__/useAnnotations.spec.ts +0 -35
  470. package/src/composables/__tests__/useIntroJs.spec.ts +0 -51
  471. package/src/composables/__tests__/useMarkups.spec.ts +0 -39
  472. package/src/composables/__tests__/useMcadObjects.spec.ts +0 -36
  473. package/src/composables/__tests__/useNavigationCubeObserver.spec.ts +0 -61
  474. package/src/composables/useAnnotations.ts +0 -37
  475. package/src/composables/useIntroJs.ts +0 -142
  476. package/src/composables/useMarkups.ts +0 -41
  477. package/src/composables/useMcadObjects.ts +0 -32
  478. package/src/composables/useNavigationCubeObserver.ts +0 -114
  479. package/src/composables/useVersion3cr.ts +0 -7
  480. package/src/functions/__tests__/layoutOverlayStyle.spec.ts +0 -325
  481. package/src/functions/layoutOverlayStyle.ts +0 -84
  482. package/src/functions/notification.ts +0 -82
  483. package/src/functions/parseDataOverlayData.ts +0 -10
  484. package/src/functions/parseDataOverlayEvent.ts +0 -17
  485. package/src/functions/parseMcadEvent.ts +0 -10
  486. package/src/functions/rgbaToCss.ts +0 -13
  487. package/src/models/__tests__/loadViewerOptions.spec.ts +0 -72
  488. package/src/models/__tests__/loadViewerPayload.spec.ts +0 -10
  489. package/src/models/callbacks.ts +0 -4
  490. package/src/models/loadViewerOptions.ts +0 -79
  491. package/src/models/loadViewerPayload.ts +0 -17
  492. package/src/plugins/__tests__/usePlugins.spec.ts +0 -12
  493. package/src/plugins/usePlugins.ts +0 -8
  494. package/src/types/action-data.ts +0 -4
  495. package/src/types/action.ts +0 -13
  496. package/src/types/call-to-action.ts +0 -9
  497. package/src/types/colour.ts +0 -6
  498. package/src/types/data-overlay-angle.ts +0 -16
  499. package/src/types/data-overlay-annotation.ts +0 -18
  500. package/src/types/data-overlay-data.ts +0 -15
  501. package/src/types/data-overlay-event.ts +0 -5
  502. package/src/types/data-overlay-info.ts +0 -18
  503. package/src/types/data-overlay-interaction.ts +0 -15
  504. package/src/types/data-overlay-length.ts +0 -16
  505. package/src/types/data-overlay-markup.ts +0 -7
  506. package/src/types/data-overlay-mcad.ts +0 -20
  507. package/src/types/data-overlay-polygon.ts +0 -18
  508. package/src/types/data-overlay.ts +0 -16
  509. package/src/types/demo-type.ts +0 -4
  510. package/src/types/gpt-question.ts +0 -4
  511. package/src/types/gpt-response-payload.ts +0 -6
  512. package/src/types/mcad-object-interaction.ts +0 -15
  513. package/src/types/segment-angle.ts +0 -5
  514. package/src/types/vector2.ts +0 -4
  515. package/src/types/vector3.ts +0 -5
  516. package/test/fakers/data-overlay-info.faker.ts +0 -29
  517. /package/src/assets/logos/3dicom/{white.svg → white/white.svg} +0 -0
  518. /package/src/assets/{images/light/Singular-Health-Trademark-mono.svg → logos/singular-health/black/black.svg} +0 -0
  519. /package/src/assets/{images/dark/Singular-Health-Trademark-mono.svg → logos/singular-health/white/white.svg} +0 -0
@@ -0,0 +1,1609 @@
1
+ import { CountryNames } from '@3cr/viewer-types-ts';
2
+
3
+ export const ISO_LANGUAGES: Record<string, CountryNames> = {
4
+ ach: {
5
+ language: 'Acholi',
6
+ editorCode: 'ach',
7
+ crowdinLanguageCode: 'ach'
8
+ },
9
+ aa: {
10
+ language: 'Afar',
11
+ editorCode: 'aa',
12
+ crowdinLanguageCode: 'aa'
13
+ },
14
+ af: {
15
+ language: 'Afrikaans',
16
+ editorCode: 'af',
17
+ crowdinLanguageCode: 'af'
18
+ },
19
+ ak: {
20
+ language: 'Akan',
21
+ editorCode: 'ak',
22
+ crowdinLanguageCode: 'ak'
23
+ },
24
+ tw: {
25
+ language: 'Akan, Twi',
26
+ editorCode: 'tw',
27
+ crowdinLanguageCode: 'tw'
28
+ },
29
+ sq: {
30
+ language: 'Albanian',
31
+ editorCode: 'sq',
32
+ crowdinLanguageCode: 'sq'
33
+ },
34
+ am: {
35
+ language: 'Amharic',
36
+ editorCode: 'am',
37
+ crowdinLanguageCode: 'am'
38
+ },
39
+ ar: {
40
+ language: 'Arabic',
41
+ editorCode: 'ar',
42
+ crowdinLanguageCode: 'ar',
43
+ countryCode: 'ae'
44
+ },
45
+ 'ar-BH': {
46
+ language: 'Arabic, Bahrain',
47
+ editorCode: 'arbh',
48
+ crowdinLanguageCode: 'ar-BH'
49
+ },
50
+ 'ar-EG': {
51
+ language: 'Arabic, Egypt',
52
+ editorCode: 'areg',
53
+ crowdinLanguageCode: 'ar-EG'
54
+ },
55
+ 'ar-SA': {
56
+ language: 'Arabic, Saudi Arabia',
57
+ editorCode: 'arsa',
58
+ crowdinLanguageCode: 'ar-SA'
59
+ },
60
+ 'ar-YE': {
61
+ language: 'Arabic, Yemen',
62
+ editorCode: 'arye',
63
+ crowdinLanguageCode: 'ar-YE'
64
+ },
65
+ an: {
66
+ language: 'Aragonese',
67
+ editorCode: 'an',
68
+ crowdinLanguageCode: 'an'
69
+ },
70
+ 'hy-AM': {
71
+ language: 'Armenian',
72
+ editorCode: 'hy',
73
+ crowdinLanguageCode: 'hy-AM'
74
+ },
75
+ frp: {
76
+ language: 'Arpitan',
77
+ editorCode: 'frp',
78
+ crowdinLanguageCode: 'frp'
79
+ },
80
+ as: {
81
+ language: 'Assamese',
82
+ editorCode: 'as',
83
+ crowdinLanguageCode: 'as'
84
+ },
85
+ ast: {
86
+ language: 'Asturian',
87
+ editorCode: 'ast',
88
+ crowdinLanguageCode: 'ast'
89
+ },
90
+ tay: {
91
+ language: 'Atayal',
92
+ editorCode: 'tay',
93
+ crowdinLanguageCode: 'tay'
94
+ },
95
+ av: {
96
+ language: 'Avaric',
97
+ editorCode: 'av',
98
+ crowdinLanguageCode: 'av'
99
+ },
100
+ ae: {
101
+ language: 'Avestan',
102
+ editorCode: 'ae',
103
+ crowdinLanguageCode: 'ae'
104
+ },
105
+ ay: {
106
+ language: 'Aymara',
107
+ editorCode: 'ay',
108
+ crowdinLanguageCode: 'ay'
109
+ },
110
+ az: {
111
+ language: 'Azerbaijani',
112
+ editorCode: 'az',
113
+ crowdinLanguageCode: 'az'
114
+ },
115
+ ban: {
116
+ language: 'Balinese',
117
+ editorCode: 'ban',
118
+ crowdinLanguageCode: 'ban'
119
+ },
120
+ bal: {
121
+ language: 'Balochi',
122
+ editorCode: 'bal',
123
+ crowdinLanguageCode: 'bal'
124
+ },
125
+ bm: {
126
+ language: 'Bambara',
127
+ editorCode: 'bm',
128
+ crowdinLanguageCode: 'bm'
129
+ },
130
+ ba: {
131
+ language: 'Bashkir',
132
+ editorCode: 'ba',
133
+ crowdinLanguageCode: 'ba'
134
+ },
135
+ eu: {
136
+ language: 'Basque',
137
+ editorCode: 'eu',
138
+ crowdinLanguageCode: 'eu'
139
+ },
140
+ be: {
141
+ language: 'Belarusian',
142
+ editorCode: 'be',
143
+ crowdinLanguageCode: 'be'
144
+ },
145
+ bn: {
146
+ language: 'Bengali',
147
+ editorCode: 'bn',
148
+ crowdinLanguageCode: 'bn',
149
+ countryCode: 'bd'
150
+ },
151
+ 'bn-IN': {
152
+ language: 'Bengali, India',
153
+ editorCode: 'bnin',
154
+ crowdinLanguageCode: 'bn-IN'
155
+ },
156
+ ber: {
157
+ language: 'Berber',
158
+ editorCode: 'ber',
159
+ crowdinLanguageCode: 'ber'
160
+ },
161
+ bh: {
162
+ language: 'Bihari',
163
+ editorCode: 'bh',
164
+ crowdinLanguageCode: 'bh'
165
+ },
166
+ bfo: {
167
+ language: 'Birifor',
168
+ editorCode: 'bfo',
169
+ crowdinLanguageCode: 'bfo'
170
+ },
171
+ bi: {
172
+ language: 'Bislama',
173
+ editorCode: 'bi',
174
+ crowdinLanguageCode: 'bi'
175
+ },
176
+ bs: {
177
+ language: 'Bosnian',
178
+ editorCode: 'bs',
179
+ crowdinLanguageCode: 'bs'
180
+ },
181
+ 'br-FR': {
182
+ language: 'Breton',
183
+ editorCode: 'brfr',
184
+ crowdinLanguageCode: 'br-FR'
185
+ },
186
+ bg: {
187
+ language: 'Bulgarian',
188
+ editorCode: 'bg',
189
+ crowdinLanguageCode: 'bg'
190
+ },
191
+ my: {
192
+ language: 'Burmese',
193
+ editorCode: 'my',
194
+ crowdinLanguageCode: 'my'
195
+ },
196
+ ca: {
197
+ language: 'Catalan',
198
+ editorCode: 'ca',
199
+ crowdinLanguageCode: 'ca'
200
+ },
201
+ ceb: {
202
+ language: 'Cebuano',
203
+ editorCode: 'ceb',
204
+ crowdinLanguageCode: 'ceb'
205
+ },
206
+ ch: {
207
+ language: 'Chamorro',
208
+ editorCode: 'ch',
209
+ crowdinLanguageCode: 'ch'
210
+ },
211
+ ce: {
212
+ language: 'Chechen',
213
+ editorCode: 'ce',
214
+ crowdinLanguageCode: 'ce'
215
+ },
216
+ chr: {
217
+ language: 'Cherokee',
218
+ editorCode: 'chr',
219
+ crowdinLanguageCode: 'chr'
220
+ },
221
+ ny: {
222
+ language: 'Chewa',
223
+ editorCode: 'ny',
224
+ crowdinLanguageCode: 'ny'
225
+ },
226
+ 'zh-CN': {
227
+ language: 'Chinese Simplified',
228
+ editorCode: 'zhcn',
229
+ crowdinLanguageCode: 'zh-CN',
230
+ countryCode: 'cn'
231
+ },
232
+ 'zh-TW': {
233
+ language: 'Chinese Traditional',
234
+ editorCode: 'zhtw',
235
+ crowdinLanguageCode: 'zh-TW'
236
+ },
237
+ 'zh-HK': {
238
+ language: 'Chinese Traditional, Hong Kong',
239
+ editorCode: 'zhhk',
240
+ crowdinLanguageCode: 'zh-HK'
241
+ },
242
+ 'zh-MO': {
243
+ language: 'Chinese Traditional, Macau',
244
+ editorCode: 'zhmo',
245
+ crowdinLanguageCode: 'zh-MO'
246
+ },
247
+ 'zh-SG': {
248
+ language: 'Chinese Traditional, Singapore',
249
+ editorCode: 'zhsg',
250
+ crowdinLanguageCode: 'zh-SG'
251
+ },
252
+ cv: {
253
+ language: 'Chuvash',
254
+ editorCode: 'cv',
255
+ crowdinLanguageCode: 'cv'
256
+ },
257
+ kw: {
258
+ language: 'Cornish',
259
+ editorCode: 'kw',
260
+ crowdinLanguageCode: 'kw'
261
+ },
262
+ co: {
263
+ language: 'Corsican',
264
+ editorCode: 'co',
265
+ crowdinLanguageCode: 'co'
266
+ },
267
+ cr: {
268
+ language: 'Cree',
269
+ editorCode: 'cr',
270
+ crowdinLanguageCode: 'cr'
271
+ },
272
+ hr: {
273
+ language: 'Croatian',
274
+ editorCode: 'hr',
275
+ crowdinLanguageCode: 'hr'
276
+ },
277
+ cs: {
278
+ language: 'Czech',
279
+ editorCode: 'cs',
280
+ crowdinLanguageCode: 'cs'
281
+ },
282
+ da: {
283
+ language: 'Danish',
284
+ editorCode: 'da',
285
+ crowdinLanguageCode: 'da'
286
+ },
287
+ 'fa-AF': {
288
+ language: 'Dari',
289
+ editorCode: 'faaf',
290
+ crowdinLanguageCode: 'fa-AF'
291
+ },
292
+ dv: {
293
+ language: 'Dhivehi',
294
+ editorCode: 'dv',
295
+ crowdinLanguageCode: 'dv'
296
+ },
297
+ nl: {
298
+ language: 'Dutch',
299
+ editorCode: 'nl',
300
+ crowdinLanguageCode: 'nl'
301
+ },
302
+ 'nl-BE': {
303
+ language: 'Dutch, Belgium',
304
+ editorCode: 'nlbe',
305
+ crowdinLanguageCode: 'nl-BE'
306
+ },
307
+ 'nl-SR': {
308
+ language: 'Dutch, Suriname',
309
+ editorCode: 'nlsr',
310
+ crowdinLanguageCode: 'nl-SR'
311
+ },
312
+ dz: {
313
+ language: 'Dzongkha',
314
+ editorCode: 'dz',
315
+ crowdinLanguageCode: 'dz'
316
+ },
317
+ en: {
318
+ language: 'English',
319
+ editorCode: 'en',
320
+ crowdinLanguageCode: 'en',
321
+ countryCode: 'gb'
322
+ },
323
+ 'en-UD': {
324
+ language: 'English (upside down)',
325
+ editorCode: 'enud',
326
+ crowdinLanguageCode: 'en-UD'
327
+ },
328
+ ende: {
329
+ language: 'English German',
330
+ editorCode: 'ende',
331
+ crowdinLanguageCode: 'ende'
332
+ },
333
+ 'en-AR': {
334
+ language: 'English, Arabia',
335
+ editorCode: 'enar',
336
+ crowdinLanguageCode: 'en-AR'
337
+ },
338
+ 'en-AU': {
339
+ language: 'English, Australia',
340
+ editorCode: 'enau',
341
+ crowdinLanguageCode: 'en-AU',
342
+ countryCode: 'au'
343
+ },
344
+ 'en-BZ': {
345
+ language: 'English, Belize',
346
+ editorCode: 'enbz',
347
+ crowdinLanguageCode: 'en-BZ'
348
+ },
349
+ 'en-CA': {
350
+ language: 'English, Canada',
351
+ editorCode: 'enca',
352
+ crowdinLanguageCode: 'en-CA'
353
+ },
354
+ 'en-CB': {
355
+ language: 'English, Caribbean',
356
+ editorCode: 'encb',
357
+ crowdinLanguageCode: 'en-CB'
358
+ },
359
+ 'en-CN': {
360
+ language: 'English, China',
361
+ editorCode: 'encn',
362
+ crowdinLanguageCode: 'en-CN'
363
+ },
364
+ 'en-DK': {
365
+ language: 'English, Denmark',
366
+ editorCode: 'endk',
367
+ crowdinLanguageCode: 'en-DK'
368
+ },
369
+ 'en-HK': {
370
+ language: 'English, Hong Kong',
371
+ editorCode: 'enhk',
372
+ crowdinLanguageCode: 'en-HK'
373
+ },
374
+ 'en-IN': {
375
+ language: 'English, India',
376
+ editorCode: 'enin',
377
+ crowdinLanguageCode: 'en-IN'
378
+ },
379
+ 'en-ID': {
380
+ language: 'English, Indonesia',
381
+ editorCode: 'enid',
382
+ crowdinLanguageCode: 'en-ID'
383
+ },
384
+ 'en-IE': {
385
+ language: 'English, Ireland',
386
+ editorCode: 'enie',
387
+ crowdinLanguageCode: 'en-IE'
388
+ },
389
+ 'en-JM': {
390
+ language: 'English, Jamaica',
391
+ editorCode: 'enjm',
392
+ crowdinLanguageCode: 'en-JM'
393
+ },
394
+ 'en-JA': {
395
+ language: 'English, Japan',
396
+ editorCode: 'enja',
397
+ crowdinLanguageCode: 'en-JA'
398
+ },
399
+ 'en-MY': {
400
+ language: 'English, Malaysia',
401
+ editorCode: 'enmy',
402
+ crowdinLanguageCode: 'en-MY'
403
+ },
404
+ 'en-NZ': {
405
+ language: 'English, New Zealand',
406
+ editorCode: 'ennz',
407
+ crowdinLanguageCode: 'en-NZ'
408
+ },
409
+ 'en-NO': {
410
+ language: 'English, Norway',
411
+ editorCode: 'enno',
412
+ crowdinLanguageCode: 'en-NO'
413
+ },
414
+ 'en-PH': {
415
+ language: 'English, Philippines',
416
+ editorCode: 'enph',
417
+ crowdinLanguageCode: 'en-PH'
418
+ },
419
+ 'en-PR': {
420
+ language: 'English, Puerto Rico',
421
+ editorCode: 'enpr',
422
+ crowdinLanguageCode: 'en-PR'
423
+ },
424
+ 'en-SG': {
425
+ language: 'English, Singapore',
426
+ editorCode: 'ensg',
427
+ crowdinLanguageCode: 'en-SG'
428
+ },
429
+ 'en-ZA': {
430
+ language: 'English, South Africa',
431
+ editorCode: 'enza',
432
+ crowdinLanguageCode: 'en-ZA'
433
+ },
434
+ 'en-SE': {
435
+ language: 'English, Sweden',
436
+ editorCode: 'ense',
437
+ crowdinLanguageCode: 'en-SE'
438
+ },
439
+ 'en-GB': {
440
+ language: 'English, United Kingdom',
441
+ editorCode: 'engb',
442
+ crowdinLanguageCode: 'en-GB',
443
+ countryCode: 'gb'
444
+ },
445
+ 'en-US': {
446
+ language: 'English, United States',
447
+ editorCode: 'enus',
448
+ crowdinLanguageCode: 'en-US',
449
+ countryCode: 'us'
450
+ },
451
+ 'en-ZW': {
452
+ language: 'English, Zimbabwe',
453
+ editorCode: 'enzw',
454
+ crowdinLanguageCode: 'en-ZW'
455
+ },
456
+ eo: {
457
+ language: 'Esperanto',
458
+ editorCode: 'eo',
459
+ crowdinLanguageCode: 'eo'
460
+ },
461
+ et: {
462
+ language: 'Estonian',
463
+ editorCode: 'et',
464
+ crowdinLanguageCode: 'et'
465
+ },
466
+ ee: {
467
+ language: 'Ewe',
468
+ editorCode: 'ee',
469
+ crowdinLanguageCode: 'ee'
470
+ },
471
+ fo: {
472
+ language: 'Faroese',
473
+ editorCode: 'fo',
474
+ crowdinLanguageCode: 'fo'
475
+ },
476
+ fj: {
477
+ language: 'Fijian',
478
+ editorCode: 'fj',
479
+ crowdinLanguageCode: 'fj'
480
+ },
481
+ fil: {
482
+ language: 'Filipino',
483
+ editorCode: 'fil',
484
+ crowdinLanguageCode: 'fil'
485
+ },
486
+ fi: {
487
+ language: 'Finnish',
488
+ editorCode: 'fi',
489
+ crowdinLanguageCode: 'fi'
490
+ },
491
+ 'vls-BE': {
492
+ language: 'Flemish',
493
+ editorCode: 'vlsbe',
494
+ crowdinLanguageCode: 'vls-BE'
495
+ },
496
+ 'fra-DE': {
497
+ language: 'Franconian',
498
+ editorCode: 'frade',
499
+ crowdinLanguageCode: 'fra-DE'
500
+ },
501
+ fr: {
502
+ language: 'French',
503
+ editorCode: 'fr',
504
+ crowdinLanguageCode: 'fr',
505
+ countryCode: 'fr'
506
+ },
507
+ 'fr-BE': {
508
+ language: 'French, Belgium',
509
+ editorCode: 'frbe',
510
+ crowdinLanguageCode: 'fr-BE'
511
+ },
512
+ 'fr-CA': {
513
+ language: 'French, Canada',
514
+ editorCode: 'frca',
515
+ crowdinLanguageCode: 'fr-CA'
516
+ },
517
+ 'fr-LU': {
518
+ language: 'French, Luxembourg',
519
+ editorCode: 'frlu',
520
+ crowdinLanguageCode: 'fr-LU'
521
+ },
522
+ 'fr-QC': {
523
+ language: 'French, Quebec',
524
+ editorCode: 'frqc',
525
+ crowdinLanguageCode: 'fr-QC'
526
+ },
527
+ 'fr-CH': {
528
+ language: 'French, Switzerland',
529
+ editorCode: 'frch',
530
+ crowdinLanguageCode: 'fr-CH'
531
+ },
532
+ 'fy-NL': {
533
+ language: 'Frisian',
534
+ editorCode: 'fy',
535
+ crowdinLanguageCode: 'fy-NL'
536
+ },
537
+ 'fur-IT': {
538
+ language: 'Friulian',
539
+ editorCode: 'furit',
540
+ crowdinLanguageCode: 'fur-IT'
541
+ },
542
+ ff: {
543
+ language: 'Fula',
544
+ editorCode: 'ff',
545
+ crowdinLanguageCode: 'ff'
546
+ },
547
+ gaa: {
548
+ language: 'Ga',
549
+ editorCode: 'gaa',
550
+ crowdinLanguageCode: 'gaa'
551
+ },
552
+ gl: {
553
+ language: 'Galician',
554
+ editorCode: 'gl',
555
+ crowdinLanguageCode: 'gl'
556
+ },
557
+ ka: {
558
+ language: 'Georgian',
559
+ editorCode: 'ka',
560
+ crowdinLanguageCode: 'ka'
561
+ },
562
+ de: {
563
+ language: 'German',
564
+ editorCode: 'de',
565
+ crowdinLanguageCode: 'de',
566
+ countryCode: 'de'
567
+ },
568
+ 'de-AT': {
569
+ language: 'German, Austria',
570
+ editorCode: 'deat',
571
+ crowdinLanguageCode: 'de-AT'
572
+ },
573
+ 'de-BE': {
574
+ language: 'German, Belgium',
575
+ editorCode: 'debe',
576
+ crowdinLanguageCode: 'de-BE'
577
+ },
578
+ 'de-LI': {
579
+ language: 'German, Liechtenstein',
580
+ editorCode: 'deli',
581
+ crowdinLanguageCode: 'de-LI'
582
+ },
583
+ 'de-LU': {
584
+ language: 'German, Luxembourg',
585
+ editorCode: 'delu',
586
+ crowdinLanguageCode: 'de-LU'
587
+ },
588
+ 'de-CH': {
589
+ language: 'German, Switzerland',
590
+ editorCode: 'dech',
591
+ crowdinLanguageCode: 'de-CH'
592
+ },
593
+ 'en-git': {
594
+ language: 'GitHub Language',
595
+ editorCode: 'engit',
596
+ crowdinLanguageCode: 'en-git'
597
+ },
598
+ got: {
599
+ language: 'Gothic',
600
+ editorCode: 'got',
601
+ crowdinLanguageCode: 'got'
602
+ },
603
+ el: {
604
+ language: 'Greek',
605
+ editorCode: 'el',
606
+ crowdinLanguageCode: 'el'
607
+ },
608
+ 'el-CY': {
609
+ language: 'Greek, Cyprus',
610
+ editorCode: 'elcy',
611
+ crowdinLanguageCode: 'el-CY'
612
+ },
613
+ kl: {
614
+ language: 'Greenlandic',
615
+ editorCode: 'kl',
616
+ crowdinLanguageCode: 'kl'
617
+ },
618
+ gn: {
619
+ language: 'Guarani',
620
+ editorCode: 'gn',
621
+ crowdinLanguageCode: 'gn'
622
+ },
623
+ 'gu-IN': {
624
+ language: 'Gujarati',
625
+ editorCode: 'gu',
626
+ crowdinLanguageCode: 'gu-IN'
627
+ },
628
+ ht: {
629
+ language: 'Haitian Creole',
630
+ editorCode: 'ht',
631
+ crowdinLanguageCode: 'ht'
632
+ },
633
+ ha: {
634
+ language: 'Hausa',
635
+ editorCode: 'ha',
636
+ crowdinLanguageCode: 'ha'
637
+ },
638
+ haw: {
639
+ language: 'Hawaiian',
640
+ editorCode: 'haw',
641
+ crowdinLanguageCode: 'haw'
642
+ },
643
+ he: {
644
+ language: 'Hebrew',
645
+ editorCode: 'he',
646
+ crowdinLanguageCode: 'he'
647
+ },
648
+ hz: {
649
+ language: 'Herero',
650
+ editorCode: 'hz',
651
+ crowdinLanguageCode: 'hz'
652
+ },
653
+ hil: {
654
+ language: 'Hiligaynon',
655
+ editorCode: 'hil',
656
+ crowdinLanguageCode: 'hil'
657
+ },
658
+ hi: {
659
+ language: 'Hindi',
660
+ editorCode: 'hi',
661
+ crowdinLanguageCode: 'hi',
662
+ countryCode: 'in'
663
+ },
664
+ ho: {
665
+ language: 'Hiri Motu',
666
+ editorCode: 'ho',
667
+ crowdinLanguageCode: 'ho'
668
+ },
669
+ hmn: {
670
+ language: 'Hmong',
671
+ editorCode: 'hmn',
672
+ crowdinLanguageCode: 'hmn'
673
+ },
674
+ hu: {
675
+ language: 'Hungarian',
676
+ editorCode: 'hu',
677
+ crowdinLanguageCode: 'hu'
678
+ },
679
+ is: {
680
+ language: 'Icelandic',
681
+ editorCode: 'is',
682
+ crowdinLanguageCode: 'is'
683
+ },
684
+ ido: {
685
+ language: 'Ido',
686
+ editorCode: 'ido',
687
+ crowdinLanguageCode: 'ido'
688
+ },
689
+ ig: {
690
+ language: 'Igbo',
691
+ editorCode: 'ig',
692
+ crowdinLanguageCode: 'ig'
693
+ },
694
+ ilo: {
695
+ language: 'Ilokano',
696
+ editorCode: 'ilo',
697
+ crowdinLanguageCode: 'ilo'
698
+ },
699
+ id: {
700
+ language: 'Indonesian',
701
+ editorCode: 'id',
702
+ crowdinLanguageCode: 'id',
703
+ countryCode: 'id'
704
+ },
705
+ iu: {
706
+ language: 'Inuktitut',
707
+ editorCode: 'iu',
708
+ crowdinLanguageCode: 'iu'
709
+ },
710
+ 'ga-IE': {
711
+ language: 'Irish',
712
+ editorCode: 'ga',
713
+ crowdinLanguageCode: 'ga-IE'
714
+ },
715
+ it: {
716
+ language: 'Italian',
717
+ editorCode: 'it',
718
+ crowdinLanguageCode: 'it',
719
+ countryCode: 'it'
720
+ },
721
+ 'it-CH': {
722
+ language: 'Italian, Switzerland',
723
+ editorCode: 'itch',
724
+ crowdinLanguageCode: 'it-CH'
725
+ },
726
+ ja: {
727
+ language: 'Japanese',
728
+ editorCode: 'ja',
729
+ crowdinLanguageCode: 'ja',
730
+ countryCode: 'jp'
731
+ },
732
+ jv: {
733
+ language: 'Javanese',
734
+ editorCode: 'jv',
735
+ crowdinLanguageCode: 'jv'
736
+ },
737
+ quc: {
738
+ language: "K'iche'",
739
+ editorCode: 'quc',
740
+ crowdinLanguageCode: 'quc'
741
+ },
742
+ kab: {
743
+ language: 'Kabyle',
744
+ editorCode: 'kab',
745
+ crowdinLanguageCode: 'kab'
746
+ },
747
+ kn: {
748
+ language: 'Kannada',
749
+ editorCode: 'kn',
750
+ crowdinLanguageCode: 'kn'
751
+ },
752
+ pam: {
753
+ language: 'Kapampangan',
754
+ editorCode: 'pam',
755
+ crowdinLanguageCode: 'pam'
756
+ },
757
+ ks: {
758
+ language: 'Kashmiri',
759
+ editorCode: 'ks',
760
+ crowdinLanguageCode: 'ks'
761
+ },
762
+ 'ks-PK': {
763
+ language: 'Kashmiri, Pakistan',
764
+ editorCode: 'kspk',
765
+ crowdinLanguageCode: 'ks-PK'
766
+ },
767
+ csb: {
768
+ language: 'Kashubian',
769
+ editorCode: 'csb',
770
+ crowdinLanguageCode: 'csb'
771
+ },
772
+ kk: {
773
+ language: 'Kazakh',
774
+ editorCode: 'kk',
775
+ crowdinLanguageCode: 'kk'
776
+ },
777
+ km: {
778
+ language: 'Khmer',
779
+ editorCode: 'km',
780
+ crowdinLanguageCode: 'km'
781
+ },
782
+ rw: {
783
+ language: 'Kinyarwanda',
784
+ editorCode: 'rw',
785
+ crowdinLanguageCode: 'rw'
786
+ },
787
+ 'tlh-AA': {
788
+ language: 'Klingon',
789
+ editorCode: 'tlhaa',
790
+ crowdinLanguageCode: 'tlh-AA'
791
+ },
792
+ kv: {
793
+ language: 'Komi',
794
+ editorCode: 'kv',
795
+ crowdinLanguageCode: 'kv'
796
+ },
797
+ kg: {
798
+ language: 'Kongo',
799
+ editorCode: 'kg',
800
+ crowdinLanguageCode: 'kg'
801
+ },
802
+ kok: {
803
+ language: 'Konkani',
804
+ editorCode: 'kok',
805
+ crowdinLanguageCode: 'kok'
806
+ },
807
+ ko: {
808
+ language: 'Korean',
809
+ editorCode: 'ko',
810
+ crowdinLanguageCode: 'ko'
811
+ },
812
+ ku: {
813
+ language: 'Kurdish',
814
+ editorCode: 'ku',
815
+ crowdinLanguageCode: 'ku'
816
+ },
817
+ kmr: {
818
+ language: 'Kurmanji (Kurdish)',
819
+ editorCode: 'kmr',
820
+ crowdinLanguageCode: 'kmr'
821
+ },
822
+ kj: {
823
+ language: 'Kwanyama',
824
+ editorCode: 'kj',
825
+ crowdinLanguageCode: 'kj'
826
+ },
827
+ ky: {
828
+ language: 'Kyrgyz',
829
+ editorCode: 'ky',
830
+ crowdinLanguageCode: 'ky'
831
+ },
832
+ lol: {
833
+ language: 'Lao',
834
+ editorCode: 'lo',
835
+ crowdinLanguageCode: 'lol'
836
+ },
837
+ lo: {
838
+ language: 'Latin',
839
+ editorCode: 'lala',
840
+ crowdinLanguageCode: 'lo'
841
+ },
842
+ 'la-LA': {
843
+ language: 'Latvian',
844
+ editorCode: 'lv',
845
+ crowdinLanguageCode: 'la-LA'
846
+ },
847
+ lv: {
848
+ language: 'Ligurian',
849
+ editorCode: 'lij',
850
+ crowdinLanguageCode: 'lv'
851
+ },
852
+ lij: {
853
+ language: 'Limburgish',
854
+ editorCode: 'li',
855
+ crowdinLanguageCode: 'lij'
856
+ },
857
+ li: {
858
+ language: 'Lingala',
859
+ editorCode: 'ln',
860
+ crowdinLanguageCode: 'li'
861
+ },
862
+ ln: {
863
+ language: 'Lithuanian',
864
+ editorCode: 'lt',
865
+ crowdinLanguageCode: 'ln'
866
+ },
867
+ lt: {
868
+ language: 'Lojban',
869
+ editorCode: 'jbo',
870
+ crowdinLanguageCode: 'lt'
871
+ },
872
+ jbo: {
873
+ language: 'LOLCAT',
874
+ editorCode: 'lol',
875
+ crowdinLanguageCode: 'jbo'
876
+ },
877
+ nds: {
878
+ language: 'Low German',
879
+ editorCode: 'nds',
880
+ crowdinLanguageCode: 'nds'
881
+ },
882
+ 'dsb-DE': {
883
+ language: 'Lower Sorbian',
884
+ editorCode: 'dsbde',
885
+ crowdinLanguageCode: 'dsb-DE'
886
+ },
887
+ lg: {
888
+ language: 'Luganda',
889
+ editorCode: 'lg',
890
+ crowdinLanguageCode: 'lg'
891
+ },
892
+ luy: {
893
+ language: 'Luhya',
894
+ editorCode: 'luy',
895
+ crowdinLanguageCode: 'luy'
896
+ },
897
+ lb: {
898
+ language: 'Luxembourgish',
899
+ editorCode: 'lb',
900
+ crowdinLanguageCode: 'lb'
901
+ },
902
+ mk: {
903
+ language: 'Macedonian',
904
+ editorCode: 'mk',
905
+ crowdinLanguageCode: 'mk'
906
+ },
907
+ mai: {
908
+ language: 'Maithili',
909
+ editorCode: 'mai',
910
+ crowdinLanguageCode: 'mai'
911
+ },
912
+ mg: {
913
+ language: 'Malagasy',
914
+ editorCode: 'mg',
915
+ crowdinLanguageCode: 'mg'
916
+ },
917
+ ms: {
918
+ language: 'Malay',
919
+ editorCode: 'ms',
920
+ crowdinLanguageCode: 'ms'
921
+ },
922
+ 'ms-BN': {
923
+ language: 'Malay, Brunei',
924
+ editorCode: 'msbn',
925
+ crowdinLanguageCode: 'ms-BN'
926
+ },
927
+ 'ml-IN': {
928
+ language: 'Malayalam',
929
+ editorCode: 'mlin',
930
+ crowdinLanguageCode: 'ml-IN'
931
+ },
932
+ mt: {
933
+ language: 'Maltese',
934
+ editorCode: 'mt',
935
+ crowdinLanguageCode: 'mt'
936
+ },
937
+ gv: {
938
+ language: 'Manx',
939
+ editorCode: 'gv',
940
+ crowdinLanguageCode: 'gv'
941
+ },
942
+ mi: {
943
+ language: 'Maori',
944
+ editorCode: 'mi',
945
+ crowdinLanguageCode: 'mi'
946
+ },
947
+ arn: {
948
+ language: 'Mapudungun',
949
+ editorCode: 'arn',
950
+ crowdinLanguageCode: 'arn'
951
+ },
952
+ mr: {
953
+ language: 'Marathi',
954
+ editorCode: 'mr',
955
+ crowdinLanguageCode: 'mr'
956
+ },
957
+ mh: {
958
+ language: 'Marshallese',
959
+ editorCode: 'mh',
960
+ crowdinLanguageCode: 'mh'
961
+ },
962
+ moh: {
963
+ language: 'Mohawk',
964
+ editorCode: 'moh',
965
+ crowdinLanguageCode: 'moh'
966
+ },
967
+ mn: {
968
+ language: 'Mongolian',
969
+ editorCode: 'mn',
970
+ crowdinLanguageCode: 'mn'
971
+ },
972
+ 'sr-Cyrl-ME': {
973
+ language: 'Montenegrin (Cyrillic)',
974
+ editorCode: 'srcyrlme',
975
+ crowdinLanguageCode: 'sr-Cyrl-ME'
976
+ },
977
+ me: {
978
+ language: 'Montenegrin (Latin)',
979
+ editorCode: 'me',
980
+ crowdinLanguageCode: 'me'
981
+ },
982
+ mos: {
983
+ language: 'Mossi',
984
+ editorCode: 'mos',
985
+ crowdinLanguageCode: 'mos'
986
+ },
987
+ na: {
988
+ language: 'Nauru',
989
+ editorCode: 'na',
990
+ crowdinLanguageCode: 'na'
991
+ },
992
+ ng: {
993
+ language: 'Ndonga',
994
+ editorCode: 'ng',
995
+ crowdinLanguageCode: 'ng'
996
+ },
997
+ 'ne-NP': {
998
+ language: 'Nepali',
999
+ editorCode: 'nenp',
1000
+ crowdinLanguageCode: 'ne-NP'
1001
+ },
1002
+ 'ne-IN': {
1003
+ language: 'Nepali, India',
1004
+ editorCode: 'nein',
1005
+ crowdinLanguageCode: 'ne-IN'
1006
+ },
1007
+ pcm: {
1008
+ language: 'Nigerian Pidgin',
1009
+ editorCode: 'pcm',
1010
+ crowdinLanguageCode: 'pcm'
1011
+ },
1012
+ se: {
1013
+ language: 'Northern Sami',
1014
+ editorCode: 'se',
1015
+ crowdinLanguageCode: 'se'
1016
+ },
1017
+ nso: {
1018
+ language: 'Northern Sotho',
1019
+ editorCode: 'nso',
1020
+ crowdinLanguageCode: 'nso'
1021
+ },
1022
+ no: {
1023
+ language: 'Norwegian',
1024
+ editorCode: 'no',
1025
+ crowdinLanguageCode: 'no'
1026
+ },
1027
+ nb: {
1028
+ language: 'Norwegian Bokmal',
1029
+ editorCode: 'nb',
1030
+ crowdinLanguageCode: 'nb'
1031
+ },
1032
+ 'nn-NO': {
1033
+ language: 'Norwegian Nynorsk',
1034
+ editorCode: 'nnno',
1035
+ crowdinLanguageCode: 'nn-NO'
1036
+ },
1037
+ oc: {
1038
+ language: 'Occitan',
1039
+ editorCode: 'oc',
1040
+ crowdinLanguageCode: 'oc'
1041
+ },
1042
+ oj: {
1043
+ language: 'Ojibwe',
1044
+ editorCode: 'oj',
1045
+ crowdinLanguageCode: 'oj'
1046
+ },
1047
+ or: {
1048
+ language: 'Oriya',
1049
+ editorCode: 'or',
1050
+ crowdinLanguageCode: 'or'
1051
+ },
1052
+ om: {
1053
+ language: 'Oromo',
1054
+ editorCode: 'om',
1055
+ crowdinLanguageCode: 'om'
1056
+ },
1057
+ os: {
1058
+ language: 'Ossetian',
1059
+ editorCode: 'os',
1060
+ crowdinLanguageCode: 'os'
1061
+ },
1062
+ pi: {
1063
+ language: 'Pali',
1064
+ editorCode: 'pi',
1065
+ crowdinLanguageCode: 'pi'
1066
+ },
1067
+ pap: {
1068
+ language: 'Papiamento',
1069
+ editorCode: 'pap',
1070
+ crowdinLanguageCode: 'pap'
1071
+ },
1072
+ ps: {
1073
+ language: 'Pashto',
1074
+ editorCode: 'ps',
1075
+ crowdinLanguageCode: 'ps'
1076
+ },
1077
+ fa: {
1078
+ language: 'Persian',
1079
+ editorCode: 'fa',
1080
+ crowdinLanguageCode: 'fa'
1081
+ },
1082
+ 'en-PT': {
1083
+ language: 'Pirate English',
1084
+ editorCode: 'enpt',
1085
+ crowdinLanguageCode: 'en-PT'
1086
+ },
1087
+ pl: {
1088
+ language: 'Polish',
1089
+ editorCode: 'pl',
1090
+ crowdinLanguageCode: 'pl'
1091
+ },
1092
+ 'pt-PT': {
1093
+ language: 'Portuguese',
1094
+ editorCode: 'pt',
1095
+ crowdinLanguageCode: 'pt-PT',
1096
+ countryCode: 'pt'
1097
+ },
1098
+ 'pt-BR': {
1099
+ language: 'Portuguese, Brazilian',
1100
+ editorCode: 'ptbr',
1101
+ crowdinLanguageCode: 'pt-BR'
1102
+ },
1103
+ 'pa-IN': {
1104
+ language: 'Punjabi',
1105
+ editorCode: 'pain',
1106
+ crowdinLanguageCode: 'pa-IN'
1107
+ },
1108
+ 'pa-PK': {
1109
+ language: 'Punjabi, Pakistan',
1110
+ editorCode: 'papk',
1111
+ crowdinLanguageCode: 'pa-PK'
1112
+ },
1113
+ qu: {
1114
+ language: 'Quechua',
1115
+ editorCode: 'qu',
1116
+ crowdinLanguageCode: 'qu'
1117
+ },
1118
+ 'qya-AA': {
1119
+ language: 'Quenya',
1120
+ editorCode: 'qyaaa',
1121
+ crowdinLanguageCode: 'qya-AA'
1122
+ },
1123
+ ro: {
1124
+ language: 'Romanian',
1125
+ editorCode: 'ro',
1126
+ crowdinLanguageCode: 'ro'
1127
+ },
1128
+ 'rm-CH': {
1129
+ language: 'Romansh',
1130
+ editorCode: 'rmch',
1131
+ crowdinLanguageCode: 'rm-CH'
1132
+ },
1133
+ rn: {
1134
+ language: 'Rundi',
1135
+ editorCode: 'rn',
1136
+ crowdinLanguageCode: 'rn'
1137
+ },
1138
+ ru: {
1139
+ language: 'Russian',
1140
+ editorCode: 'ru',
1141
+ crowdinLanguageCode: 'ru'
1142
+ },
1143
+ 'ru-pr': {
1144
+ language: 'Russian (Proofreading)',
1145
+ editorCode: 'rupr',
1146
+ crowdinLanguageCode: 'ru-pr'
1147
+ },
1148
+ 'ru-BY': {
1149
+ language: 'Russian, Belarus',
1150
+ editorCode: 'ruby',
1151
+ crowdinLanguageCode: 'ru-BY'
1152
+ },
1153
+ 'ru-MD': {
1154
+ language: 'Russian, Moldova',
1155
+ editorCode: 'rumd',
1156
+ crowdinLanguageCode: 'ru-MD'
1157
+ },
1158
+ 'ru-UA': {
1159
+ language: 'Russian, Ukraine',
1160
+ editorCode: 'ruua',
1161
+ crowdinLanguageCode: 'ru-UA'
1162
+ },
1163
+ 'ry-UA': {
1164
+ language: 'Rusyn',
1165
+ editorCode: 'ryua',
1166
+ crowdinLanguageCode: 'ry-UA'
1167
+ },
1168
+ sah: {
1169
+ language: 'Sakha',
1170
+ editorCode: 'sah',
1171
+ crowdinLanguageCode: 'sah'
1172
+ },
1173
+ sg: {
1174
+ language: 'Sango',
1175
+ editorCode: 'sg',
1176
+ crowdinLanguageCode: 'sg'
1177
+ },
1178
+ sa: {
1179
+ language: 'Sanskrit',
1180
+ editorCode: 'sa',
1181
+ crowdinLanguageCode: 'sa'
1182
+ },
1183
+ sat: {
1184
+ language: 'Santali',
1185
+ editorCode: 'sat',
1186
+ crowdinLanguageCode: 'sat'
1187
+ },
1188
+ sc: {
1189
+ language: 'Sardinian',
1190
+ editorCode: 'sc',
1191
+ crowdinLanguageCode: 'sc'
1192
+ },
1193
+ sco: {
1194
+ language: 'Scots',
1195
+ editorCode: 'sco',
1196
+ crowdinLanguageCode: 'sco'
1197
+ },
1198
+ gd: {
1199
+ language: 'Scottish Gaelic',
1200
+ editorCode: 'gd',
1201
+ crowdinLanguageCode: 'gd'
1202
+ },
1203
+ sr: {
1204
+ language: 'Serbian (Cyrillic)',
1205
+ editorCode: 'sr',
1206
+ crowdinLanguageCode: 'sr'
1207
+ },
1208
+ 'sr-CS': {
1209
+ language: 'Serbian (Latin)',
1210
+ editorCode: 'srcs',
1211
+ crowdinLanguageCode: 'sr-CS'
1212
+ },
1213
+ sh: {
1214
+ language: 'Serbo-Croatian',
1215
+ editorCode: 'sh',
1216
+ crowdinLanguageCode: 'sh'
1217
+ },
1218
+ crs: {
1219
+ language: 'Seychellois Creole',
1220
+ editorCode: 'crs',
1221
+ crowdinLanguageCode: 'crs'
1222
+ },
1223
+ sn: {
1224
+ language: 'Shona',
1225
+ editorCode: 'sn',
1226
+ crowdinLanguageCode: 'sn'
1227
+ },
1228
+ ii: {
1229
+ language: 'Sichuan Yi',
1230
+ editorCode: 'ii',
1231
+ crowdinLanguageCode: 'ii'
1232
+ },
1233
+ sd: {
1234
+ language: 'Sindhi',
1235
+ editorCode: 'sd',
1236
+ crowdinLanguageCode: 'sd'
1237
+ },
1238
+ 'si-LK': {
1239
+ language: 'Sinhala',
1240
+ editorCode: 'silk',
1241
+ crowdinLanguageCode: 'si-LK'
1242
+ },
1243
+ sk: {
1244
+ language: 'Slovak',
1245
+ editorCode: 'sk',
1246
+ crowdinLanguageCode: 'sk'
1247
+ },
1248
+ sl: {
1249
+ language: 'Slovenian',
1250
+ editorCode: 'sl',
1251
+ crowdinLanguageCode: 'sl'
1252
+ },
1253
+ so: {
1254
+ language: 'Somali',
1255
+ editorCode: 'so',
1256
+ crowdinLanguageCode: 'so'
1257
+ },
1258
+ son: {
1259
+ language: 'Songhay',
1260
+ editorCode: 'son',
1261
+ crowdinLanguageCode: 'son'
1262
+ },
1263
+ ckb: {
1264
+ language: 'Sorani (Kurdish)',
1265
+ editorCode: 'ckb',
1266
+ crowdinLanguageCode: 'ckb'
1267
+ },
1268
+ nr: {
1269
+ language: 'Southern Ndebele',
1270
+ editorCode: 'nr',
1271
+ crowdinLanguageCode: 'nr'
1272
+ },
1273
+ sma: {
1274
+ language: 'Southern Sami',
1275
+ editorCode: 'sma',
1276
+ crowdinLanguageCode: 'sma'
1277
+ },
1278
+ st: {
1279
+ language: 'Southern Sotho',
1280
+ editorCode: 'st',
1281
+ crowdinLanguageCode: 'st'
1282
+ },
1283
+ 'es-ES': {
1284
+ language: 'Spanish',
1285
+ editorCode: 'es',
1286
+ crowdinLanguageCode: 'es-ES',
1287
+ countryCode: 'es'
1288
+ },
1289
+ 'es-EM': {
1290
+ language: 'Spanish (Modern)',
1291
+ editorCode: 'esem',
1292
+ crowdinLanguageCode: 'es-EM'
1293
+ },
1294
+ 'es-AR': {
1295
+ language: 'Spanish, Argentina',
1296
+ editorCode: 'esar',
1297
+ crowdinLanguageCode: 'es-AR'
1298
+ },
1299
+ 'es-BO': {
1300
+ language: 'Spanish, Bolivia',
1301
+ editorCode: 'esbo',
1302
+ crowdinLanguageCode: 'es-BO'
1303
+ },
1304
+ 'es-CL': {
1305
+ language: 'Spanish, Chile',
1306
+ editorCode: 'escl',
1307
+ crowdinLanguageCode: 'es-CL'
1308
+ },
1309
+ 'es-CO': {
1310
+ language: 'Spanish, Colombia',
1311
+ editorCode: 'esco',
1312
+ crowdinLanguageCode: 'es-CO'
1313
+ },
1314
+ 'es-CR': {
1315
+ language: 'Spanish, Costa Rica',
1316
+ editorCode: 'escr',
1317
+ crowdinLanguageCode: 'es-CR'
1318
+ },
1319
+ 'es-cu': {
1320
+ language: 'Spanish, Cuba',
1321
+ editorCode: 'escu',
1322
+ crowdinLanguageCode: 'es-cu'
1323
+ },
1324
+ 'es-DO': {
1325
+ language: 'Spanish, Dominican Republic',
1326
+ editorCode: 'esdo',
1327
+ crowdinLanguageCode: 'es-DO'
1328
+ },
1329
+ 'es-EC': {
1330
+ language: 'Spanish, Ecuador',
1331
+ editorCode: 'esec',
1332
+ crowdinLanguageCode: 'es-EC'
1333
+ },
1334
+ 'es-SV': {
1335
+ language: 'Spanish, El Salvador',
1336
+ editorCode: 'essv',
1337
+ crowdinLanguageCode: 'es-SV'
1338
+ },
1339
+ 'es-GT': {
1340
+ language: 'Spanish, Guatemala',
1341
+ editorCode: 'esgt',
1342
+ crowdinLanguageCode: 'es-GT'
1343
+ },
1344
+ 'es-HN': {
1345
+ language: 'Spanish, Honduras',
1346
+ editorCode: 'eshn',
1347
+ crowdinLanguageCode: 'es-HN'
1348
+ },
1349
+ 'es-MX': {
1350
+ language: 'Spanish, Mexico',
1351
+ editorCode: 'esmx',
1352
+ crowdinLanguageCode: 'es-MX'
1353
+ },
1354
+ 'es-NI': {
1355
+ language: 'Spanish, Nicaragua',
1356
+ editorCode: 'esni',
1357
+ crowdinLanguageCode: 'es-NI'
1358
+ },
1359
+ 'es-PA': {
1360
+ language: 'Spanish, Panama',
1361
+ editorCode: 'espa',
1362
+ crowdinLanguageCode: 'es-PA'
1363
+ },
1364
+ 'es-PY': {
1365
+ language: 'Spanish, Paraguay',
1366
+ editorCode: 'espy',
1367
+ crowdinLanguageCode: 'es-PY'
1368
+ },
1369
+ 'es-PE': {
1370
+ language: 'Spanish, Peru',
1371
+ editorCode: 'espe',
1372
+ crowdinLanguageCode: 'es-PE'
1373
+ },
1374
+ 'es-PR': {
1375
+ language: 'Spanish, Puerto Rico',
1376
+ editorCode: 'espr',
1377
+ crowdinLanguageCode: 'es-PR'
1378
+ },
1379
+ 'es-US': {
1380
+ language: 'Spanish, United States',
1381
+ editorCode: 'esus',
1382
+ crowdinLanguageCode: 'es-US'
1383
+ },
1384
+ 'es-UY': {
1385
+ language: 'Spanish, Uruguay',
1386
+ editorCode: 'esuy',
1387
+ crowdinLanguageCode: 'es-UY'
1388
+ },
1389
+ 'es-VE': {
1390
+ language: 'Spanish, Venezuela',
1391
+ editorCode: 'esve',
1392
+ crowdinLanguageCode: 'es-VE'
1393
+ },
1394
+ su: {
1395
+ language: 'Sundanese',
1396
+ editorCode: 'su',
1397
+ crowdinLanguageCode: 'su'
1398
+ },
1399
+ sw: {
1400
+ language: 'Swahili',
1401
+ editorCode: 'sw',
1402
+ crowdinLanguageCode: 'sw'
1403
+ },
1404
+ 'sw-KE': {
1405
+ language: 'Swahili, Kenya',
1406
+ editorCode: 'swke',
1407
+ crowdinLanguageCode: 'sw-KE'
1408
+ },
1409
+ 'sw-TZ': {
1410
+ language: 'Swahili, Tanzania',
1411
+ editorCode: 'swtz',
1412
+ crowdinLanguageCode: 'sw-TZ'
1413
+ },
1414
+ ss: {
1415
+ language: 'Swati',
1416
+ editorCode: 'ss',
1417
+ crowdinLanguageCode: 'ss'
1418
+ },
1419
+ 'sv-SE': {
1420
+ language: 'Swedish',
1421
+ editorCode: 'sv',
1422
+ crowdinLanguageCode: 'sv-SE'
1423
+ },
1424
+ svun: {
1425
+ language: 'Swedish (Unofficial)',
1426
+ editorCode: 'svun',
1427
+ crowdinLanguageCode: 'svun'
1428
+ },
1429
+ 'sv-FI': {
1430
+ language: 'Swedish, Finland',
1431
+ editorCode: 'svfi',
1432
+ crowdinLanguageCode: 'sv-FI'
1433
+ },
1434
+ syc: {
1435
+ language: 'Syriac',
1436
+ editorCode: 'syc',
1437
+ crowdinLanguageCode: 'syc'
1438
+ },
1439
+ tl: {
1440
+ language: 'Tagalog',
1441
+ editorCode: 'tl',
1442
+ crowdinLanguageCode: 'tl'
1443
+ },
1444
+ ty: {
1445
+ language: 'Tahitian',
1446
+ editorCode: 'ty',
1447
+ crowdinLanguageCode: 'ty'
1448
+ },
1449
+ tg: {
1450
+ language: 'Tajik',
1451
+ editorCode: 'tg',
1452
+ crowdinLanguageCode: 'tg'
1453
+ },
1454
+ tzl: {
1455
+ language: 'Talossan',
1456
+ editorCode: 'tzl',
1457
+ crowdinLanguageCode: 'tzl'
1458
+ },
1459
+ ta: {
1460
+ language: 'Tamil',
1461
+ editorCode: 'ta',
1462
+ crowdinLanguageCode: 'ta'
1463
+ },
1464
+ 'tt-RU': {
1465
+ language: 'Tatar',
1466
+ editorCode: 'ttru',
1467
+ crowdinLanguageCode: 'tt-RU'
1468
+ },
1469
+ te: {
1470
+ language: 'Telugu',
1471
+ editorCode: 'te',
1472
+ crowdinLanguageCode: 'te'
1473
+ },
1474
+ kdh: {
1475
+ language: 'Tem (Kotokoli)',
1476
+ editorCode: 'kdh',
1477
+ crowdinLanguageCode: 'kdh'
1478
+ },
1479
+ th: {
1480
+ language: 'Thai',
1481
+ editorCode: 'th',
1482
+ crowdinLanguageCode: 'th'
1483
+ },
1484
+ 'bo-BT': {
1485
+ language: 'Tibetan',
1486
+ editorCode: 'bobt',
1487
+ crowdinLanguageCode: 'bo-BT'
1488
+ },
1489
+ ti: {
1490
+ language: 'Tigrinya',
1491
+ editorCode: 'ti',
1492
+ crowdinLanguageCode: 'ti'
1493
+ },
1494
+ ts: {
1495
+ language: 'Tsonga',
1496
+ editorCode: 'ts',
1497
+ crowdinLanguageCode: 'ts'
1498
+ },
1499
+ tn: {
1500
+ language: 'Tswana',
1501
+ editorCode: 'tn',
1502
+ crowdinLanguageCode: 'tn'
1503
+ },
1504
+ tr: {
1505
+ language: 'Turkish',
1506
+ editorCode: 'tr',
1507
+ crowdinLanguageCode: 'tr'
1508
+ },
1509
+ 'tr-CY': {
1510
+ language: 'Turkish, Cyprus',
1511
+ editorCode: 'trcy',
1512
+ crowdinLanguageCode: 'tr-CY'
1513
+ },
1514
+ tk: {
1515
+ language: 'Turkmen',
1516
+ editorCode: 'tk',
1517
+ crowdinLanguageCode: 'tk'
1518
+ },
1519
+ uk: {
1520
+ language: 'Ukrainian',
1521
+ editorCode: 'uk',
1522
+ crowdinLanguageCode: 'uk'
1523
+ },
1524
+ 'hsb-DE': {
1525
+ language: 'Upper Sorbian',
1526
+ editorCode: 'hsbde',
1527
+ crowdinLanguageCode: 'hsb-DE'
1528
+ },
1529
+ 'ur-IN': {
1530
+ language: 'Urdu (India)',
1531
+ editorCode: 'urin',
1532
+ crowdinLanguageCode: 'ur-IN'
1533
+ },
1534
+ 'ur-PK': {
1535
+ language: 'Urdu (Pakistan)',
1536
+ editorCode: 'urpk',
1537
+ crowdinLanguageCode: 'ur-PK'
1538
+ },
1539
+ ug: {
1540
+ language: 'Uyghur',
1541
+ editorCode: 'ug',
1542
+ crowdinLanguageCode: 'ug'
1543
+ },
1544
+ uz: {
1545
+ language: 'Uzbek',
1546
+ editorCode: 'uz',
1547
+ crowdinLanguageCode: 'uz'
1548
+ },
1549
+ 'val-ES': {
1550
+ language: 'Valencian',
1551
+ editorCode: 'vales',
1552
+ crowdinLanguageCode: 'val-ES'
1553
+ },
1554
+ ve: {
1555
+ language: 'Venda',
1556
+ editorCode: 've',
1557
+ crowdinLanguageCode: 've'
1558
+ },
1559
+ vec: {
1560
+ language: 'Venetian',
1561
+ editorCode: 'vec',
1562
+ crowdinLanguageCode: 'vec'
1563
+ },
1564
+ vi: {
1565
+ language: 'Vietnamese',
1566
+ editorCode: 'vi',
1567
+ crowdinLanguageCode: 'vi'
1568
+ },
1569
+ wa: {
1570
+ language: 'Walloon',
1571
+ editorCode: 'wa',
1572
+ crowdinLanguageCode: 'wa'
1573
+ },
1574
+ cy: {
1575
+ language: 'Welsh',
1576
+ editorCode: 'cy',
1577
+ crowdinLanguageCode: 'cy'
1578
+ },
1579
+ wo: {
1580
+ language: 'Wolof',
1581
+ editorCode: 'wo',
1582
+ crowdinLanguageCode: 'wo'
1583
+ },
1584
+ xh: {
1585
+ language: 'Xhosa',
1586
+ editorCode: 'xh',
1587
+ crowdinLanguageCode: 'xh'
1588
+ },
1589
+ yi: {
1590
+ language: 'Yiddish',
1591
+ editorCode: 'yi',
1592
+ crowdinLanguageCode: 'yi'
1593
+ },
1594
+ yo: {
1595
+ language: 'Yoruba',
1596
+ editorCode: 'yo',
1597
+ crowdinLanguageCode: 'yo'
1598
+ },
1599
+ zea: {
1600
+ language: 'Zeelandic',
1601
+ editorCode: 'zea',
1602
+ crowdinLanguageCode: 'zea'
1603
+ },
1604
+ zu: {
1605
+ language: 'Zulu',
1606
+ editorCode: 'zu',
1607
+ crowdinLanguageCode: 'zu'
1608
+ }
1609
+ };