mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-10-25 00:44:38 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			165 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const fs = require("fs");
 | |
| 
 | |
| const THRESSHOLD = 85;
 | |
| 
 | |
| const crowdinMap = {
 | |
|   "ar-SA": "en-ar",
 | |
|   "bg-BG": "en-bg",
 | |
|   "ca-ES": "en-ca",
 | |
|   "de-DE": "en-de",
 | |
|   "el-GR": "en-el",
 | |
|   "es-ES": "en-es",
 | |
|   "fa-IR": "en-fa",
 | |
|   "fi-FI": "en-fi",
 | |
|   "fr-FR": "en-fr",
 | |
|   "he-IL": "en-he",
 | |
|   "hi-IN": "en-hi",
 | |
|   "hu-HU": "en-hu",
 | |
|   "id-ID": "en-id",
 | |
|   "it-IT": "en-it",
 | |
|   "ja-JP": "en-ja",
 | |
|   "kab-KAB": "en-kab",
 | |
|   "ko-KR": "en-ko",
 | |
|   "my-MM": "en-my",
 | |
|   "nb-NO": "en-nb",
 | |
|   "nl-NL": "en-nl",
 | |
|   "nn-NO": "en-nnno",
 | |
|   "oc-FR": "en-oc",
 | |
|   "pa-IN": "en-pain",
 | |
|   "pl-PL": "en-pl",
 | |
|   "pt-BR": "en-ptbr",
 | |
|   "pt-PT": "en-pt",
 | |
|   "ro-RO": "en-ro",
 | |
|   "ru-RU": "en-ru",
 | |
|   "sk-SK": "en-sk",
 | |
|   "sv-SE": "en-sv",
 | |
|   "tr-TR": "en-tr",
 | |
|   "uk-UA": "en-uk",
 | |
|   "zh-CN": "en-zhcn",
 | |
|   "zh-TW": "en-zhtw",
 | |
| };
 | |
| 
 | |
| const flags = {
 | |
|   "ar-SA": "🇸🇦",
 | |
|   "bg-BG": "🇧🇬",
 | |
|   "ca-ES": "🏳",
 | |
|   "de-DE": "🇩🇪",
 | |
|   "el-GR": "🇬🇷",
 | |
|   "es-ES": "🇪🇸",
 | |
|   "fa-IR": "🇮🇷",
 | |
|   "fi-FI": "🇫🇮",
 | |
|   "fr-FR": "🇫🇷",
 | |
|   "he-IL": "🇮🇱",
 | |
|   "hi-IN": "🇮🇳",
 | |
|   "hu-HU": "🇭🇺",
 | |
|   "id-ID": "🇮🇩",
 | |
|   "it-IT": "🇮🇹",
 | |
|   "ja-JP": "🇯🇵",
 | |
|   "kab-KAB": "🏳",
 | |
|   "ko-KR": "🇰🇷",
 | |
|   "my-MM": "🇲🇲",
 | |
|   "nb-NO": "🇳🇴",
 | |
|   "nl-NL": "🇳🇱",
 | |
|   "nn-NO": "🇳🇴",
 | |
|   "oc-FR": "🏳",
 | |
|   "pa-IN": "🇮🇳",
 | |
|   "pl-PL": "🇵🇱",
 | |
|   "pt-BR": "🇧🇷",
 | |
|   "pt-PT": "🇵🇹",
 | |
|   "ro-RO": "🇷🇴",
 | |
|   "ru-RU": "🇷🇺",
 | |
|   "sk-SK": "🇸🇰",
 | |
|   "sv-SE": "🇸🇪",
 | |
|   "tr-TR": "🇹🇷",
 | |
|   "uk-UA": "🇺🇦",
 | |
|   "zh-CN": "🇨🇳",
 | |
|   "zh-TW": "🇹🇼",
 | |
| };
 | |
| 
 | |
| const languages = {
 | |
|   "ar-SA": "العربية",
 | |
|   "bg-BG": "Български",
 | |
|   "ca-ES": "Català",
 | |
|   "de-DE": "Deutsch",
 | |
|   "el-GR": "Ελληνικά",
 | |
|   "es-ES": "Español",
 | |
|   "fa-IR": "فارسی",
 | |
|   "fi-FI": "Suomi",
 | |
|   "fr-FR": "Français",
 | |
|   "he-IL": "עברית",
 | |
|   "hi-IN": "हिन्दी",
 | |
|   "hu-HU": "Magyar",
 | |
|   "id-ID": "Bahasa Indonesia",
 | |
|   "it-IT": "Italiano",
 | |
|   "ja-JP": "日本語",
 | |
|   "kab-KAB": "Taqbaylit",
 | |
|   "ko-KR": "한국어",
 | |
|   "my-MM": "Burmese",
 | |
|   "nb-NO": "Norsk bokmål",
 | |
|   "nl-NL": "Nederlands",
 | |
|   "nn-NO": "Norsk nynorsk",
 | |
|   "oc-FR": "Occitan",
 | |
|   "pa-IN": "ਪੰਜਾਬੀ",
 | |
|   "pl-PL": "Polski",
 | |
|   "pt-BR": "Português Brasileiro",
 | |
|   "pt-PT": "Português",
 | |
|   "ro-RO": "Română",
 | |
|   "ru-RU": "Русский",
 | |
|   "sk-SK": "Slovenčina",
 | |
|   "sv-SE": "Svenska",
 | |
|   "tr-TR": "Türkçe",
 | |
|   "uk-UA": "Українська",
 | |
|   "zh-CN": "简体中文",
 | |
|   "zh-TW": "繁體中文",
 | |
| };
 | |
| 
 | |
| const percentages = fs.readFileSync(
 | |
|   `${__dirname}/../src/locales/percentages.json`,
 | |
| );
 | |
| const rowData = JSON.parse(percentages);
 | |
| 
 | |
| const coverages = Object.entries(rowData)
 | |
|   .sort(([, a], [, b]) => b - a)
 | |
|   .reduce((r, [k, v]) => ({ ...r, [k]: v }), {});
 | |
| 
 | |
| const boldIf = (text, condition) => (condition ? `**${text}**` : text);
 | |
| 
 | |
| const printHeader = () => {
 | |
|   let result = "| | Flag | Locale | % |\n";
 | |
|   result += "| :--: | :--: | -- | :--: |";
 | |
|   return result;
 | |
| };
 | |
| 
 | |
| const printRow = (id, locale, coverage) => {
 | |
|   const isOver = coverage >= THRESSHOLD;
 | |
|   let result = `| ${isOver ? id : "..."} | `;
 | |
|   result += `${locale in flags ? flags[locale] : ""} | `;
 | |
|   const language = locale in languages ? languages[locale] : locale;
 | |
|   if (locale in crowdinMap && crowdinMap[locale]) {
 | |
|     result += `[${boldIf(
 | |
|       language,
 | |
|       isOver,
 | |
|     )}](https://crowdin.com/translate/excalidraw/10/${crowdinMap[locale]}) | `;
 | |
|   } else {
 | |
|     result += `${boldIf(language, isOver)} | `;
 | |
|   }
 | |
|   result += `${coverage === 100 ? "💯" : boldIf(coverage, isOver)} |`;
 | |
|   return result;
 | |
| };
 | |
| 
 | |
| console.info(
 | |
|   `Each language must be at least **${THRESSHOLD}%** translated in order to appear on Excalidraw. Join us on [Crowdin](https://crowdin.com/project/excalidraw) and help us translate your own language. **Can't find yours yet?** Open an [issue](https://github.com/excalidraw/excalidraw/issues/new) and we'll add it to the list.`,
 | |
| );
 | |
| console.info("\n\r");
 | |
| console.info(printHeader());
 | |
| let index = 1;
 | |
| for (const coverage in coverages) {
 | |
|   if (coverage === "en") {
 | |
|     continue;
 | |
|   }
 | |
|   console.info(printRow(index, coverage, coverages[coverage]));
 | |
|   index++;
 | |
| }
 | |
| console.info("\n\r");
 | |
| console.info("\\* Languages in **bold** are going to appear on production.");
 | 
