locales-coverage-comment.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. const fs = require("fs");
  2. const THRESSHOLD = 85;
  3. const crowdinMap = {
  4. "ar-SA": "en-ar",
  5. "el-GR": "en-el",
  6. "fi-FI": "en-fi",
  7. "ja-JP": "en-ja",
  8. "bg-BG": "en-bg",
  9. "ca-ES": "en-ca",
  10. "de-DE": "en-de",
  11. "es-ES": "en-es",
  12. "fa-IR": "en-fa",
  13. "fr-FR": "en-fr",
  14. "he-IL": "en-he",
  15. "hi-IN": "en-hi",
  16. "hu-HU": "en-hu",
  17. "id-ID": "en-id",
  18. "it-IT": "en-it",
  19. "ko-KR": "en-ko",
  20. "my-MM": "en-my",
  21. "nb-NO": "en-nb",
  22. "nl-NL": "en-nl",
  23. "nn-NO": "en-nnno",
  24. "pl-PL": "en-pl",
  25. "pt-PT": "en-pt",
  26. "ro-RO": "en-ro",
  27. "ru-RU": "en-ru",
  28. "sk-SK": "en-sk",
  29. "sv-SE": "en-sv",
  30. "tr-TR": "en-tr",
  31. "uk-UA": "en-uk",
  32. "zh-CN": "en-zhcn",
  33. "zh-TW": "en-zhtw",
  34. };
  35. const flags = {
  36. "ar-SA": "🇸🇦",
  37. "bg-BG": "🇧🇬",
  38. "ca-ES": "🇪🇸",
  39. "de-DE": "🇩🇪",
  40. "el-GR": "🇬🇷",
  41. "es-ES": "🇪🇸",
  42. "fa-IR": "🇮🇷",
  43. "fi-FI": "🇫🇮",
  44. "fr-FR": "🇫🇷",
  45. "he-IL": "🇮🇱",
  46. "hi-IN": "🇮🇳",
  47. "hu-HU": "🇭🇺",
  48. "id-ID": "🇮🇩",
  49. "it-IT": "🇮🇹",
  50. "ja-JP": "🇯🇵",
  51. "ko-KR": "🇰🇷",
  52. "my-MM": "🇲🇲",
  53. "nb-NO": "🇳🇴",
  54. "nl-NL": "🇳🇱",
  55. "nn-NO": "🇳🇴",
  56. "pl-PL": "🇵🇱",
  57. "pt-PT": "🇵🇹",
  58. "ro-RO": "🇷🇴",
  59. "ru-RU": "🇷🇺",
  60. "sk-SK": "🇸🇰",
  61. "sv-SE": "🇸🇪",
  62. "tr-TR": "🇹🇷",
  63. "uk-UA": "🇺🇦",
  64. "zh-CN": "🇨🇳",
  65. "zh-TW": "🇹🇼",
  66. };
  67. const languages = {
  68. "ar-SA": "العربية",
  69. "bg-BG": "Български",
  70. "ca-ES": "Catalan",
  71. "de-DE": "Deutsch",
  72. "el-GR": "Ελληνικά",
  73. "es-ES": "Español",
  74. "fa-IR": "فارسی",
  75. "fi-FI": "Suomi",
  76. "fr-FR": "Français",
  77. "he-IL": "עברית",
  78. "hi-IN": "हिन्दी",
  79. "hu-HU": "Magyar",
  80. "id-ID": "Bahasa Indonesia",
  81. "it-IT": "Italiano",
  82. "ja-JP": "日本語",
  83. "ko-KR": "한국어",
  84. "my-MM": "Burmese",
  85. "nb-NO": "Norsk bokmål",
  86. "nl-NL": "Nederlands",
  87. "nn-NO": "Norsk nynorsk",
  88. "pl-PL": "Polski",
  89. "pt-PT": "Português",
  90. "ro-RO": "Română",
  91. "ru-RU": "Русский",
  92. "sk-SK": "Slovenčina",
  93. "sv-SE": "Svenska",
  94. "tr-TR": "Türkçe",
  95. "uk-UA": "Українська",
  96. "zh-CN": "简体中文",
  97. "zh-TW": "繁體中文",
  98. };
  99. const percentages = fs.readFileSync(
  100. `${__dirname}/../src/locales/percentages.json`,
  101. );
  102. const rowData = JSON.parse(percentages);
  103. const coverages = Object.entries(rowData)
  104. .sort(([, a], [, b]) => b - a)
  105. .reduce((r, [k, v]) => ({ ...r, [k]: v }), {});
  106. const printHeader = () => {
  107. let result = "| | Flag | Locale | % |\n";
  108. result += "| --: | :--: | -- | --: |";
  109. return result;
  110. };
  111. const printRow = (id, locale, coverage) => {
  112. let result = `| ${id} | `;
  113. result += `${locale in flags ? flags[locale] : ""} | `;
  114. const language = locale in languages ? languages[locale] : locale;
  115. if (locale in crowdinMap && crowdinMap[locale]) {
  116. result += `[${language}](https://crowdin.com/translate/excalidraw/10/${crowdinMap[locale]}) | `;
  117. } else {
  118. result += `${language} | `;
  119. }
  120. result += `${coverage} |`;
  121. return result;
  122. };
  123. let passId = 1;
  124. let notPassId = 1;
  125. const over = [];
  126. const under = [];
  127. for (const coverage in coverages) {
  128. if (coverage === "en") {
  129. continue;
  130. }
  131. const per = coverages[coverage];
  132. if (per > THRESSHOLD) {
  133. over.push(printRow(passId, coverage, per));
  134. passId++;
  135. } else {
  136. under.push(printRow(notPassId, coverage, per));
  137. notPassId++;
  138. }
  139. }
  140. console.info("## Languages check");
  141. console.info("");
  142. console.info(
  143. `Our translations for every languages should be at least **${THRESSHOLD}%** to appear on Excalidraw. Join our project in [Crowdin](https://crowdin.com/project/excalidraw) and help us translate it in your language.`,
  144. );
  145. console.info("");
  146. console.info("### Languages over the threshold");
  147. console.info("");
  148. console.info(printHeader());
  149. for (const row of over) {
  150. console.info(row);
  151. }
  152. console.info("");
  153. console.info("### Languages below the threshold");
  154. console.info("");
  155. console.info(printHeader());
  156. for (const row of under) {
  157. console.info(row);
  158. }