this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Move percentage threshold to build time

Once listed, always listed

+119 -39
+38 -2
scripts/catalogs.js
··· 3 3 // Dependency from Lingui, not listed in package.json 4 4 import PO from 'pofile'; 5 5 6 + let listedLocales = []; 7 + try { 8 + listedLocales = JSON.parse( 9 + fs.readFileSync('src/data/listed-locales.json', 'utf8'), 10 + ); 11 + } catch (e) {} 12 + 6 13 const DEFAULT_LANG = 'en'; 7 14 const IGNORE_LANGS = [DEFAULT_LANG, 'pseudo-LOCALE']; 8 15 ··· 82 89 return { code, nativeName, name, completion }; 83 90 }); 84 91 92 + // Set listed: true if completion > PERCENTAGE_THRESHOLD 93 + const PERCENTAGE_THRESHOLD = 50; 94 + const listedCatalogs = fullCatalogs.map((catalog) => ({ 95 + ...catalog, 96 + // Once listed, always listed 97 + // A locale may exceed percentage threshold today, but not tomorrow 98 + // So it should't suddenly become unlisted 99 + listed: 100 + listedLocales.includes(catalog.code) || 101 + catalog.completion >= PERCENTAGE_THRESHOLD, 102 + })); 103 + 85 104 // Sort by completion 86 - const sortedCatalogs = [...fullCatalogs].sort( 105 + const sortedCatalogs = [...listedCatalogs].sort( 87 106 (a, b) => b.completion - a.completion, 88 107 ); 108 + 89 109 console.table(sortedCatalogs); 110 + console.log( 111 + `Total listed/unlisted: ${listedCatalogs.filter((c) => c.listed).length}/${ 112 + listedCatalogs.filter((c) => !c.listed).length 113 + }`, 114 + ); 90 115 91 116 const path = 'src/data/catalogs.json'; 92 - fs.writeFileSync(path, JSON.stringify(fullCatalogs, null, 2)); 117 + fs.writeFileSync(path, JSON.stringify(listedCatalogs, null, 2)); 93 118 console.log('File written:', path); 119 + 120 + const path2 = 'src/data/listed-locales.json'; 121 + const codes = listedCatalogs.filter((c) => c.listed).map((c) => c.code); 122 + if (codes.length >= listedLocales.length) { 123 + fs.writeFileSync(path2, JSON.stringify(codes, null, 2)); 124 + console.log('File written:', path2); 125 + } else { 126 + console.error( 127 + `Number of listed locales reduced from ${listedLocales.length} to ${codes.length}.`, 128 + ); 129 + }
+56 -28
src/data/catalogs.json
··· 3 3 "code": "ar-SA", 4 4 "nativeName": "العربية", 5 5 "name": "Arabic", 6 - "completion": 24 6 + "completion": 24, 7 + "listed": false 7 8 }, 8 9 { 9 10 "code": "ca-ES", 10 11 "nativeName": "català", 11 12 "name": "Catalan", 12 - "completion": 100 13 + "completion": 100, 14 + "listed": true 13 15 }, 14 16 { 15 17 "code": "cs-CZ", 16 18 "nativeName": "čeština", 17 19 "name": "Czech", 18 - "completion": 81 20 + "completion": 81, 21 + "listed": true 19 22 }, 20 23 { 21 24 "code": "de-DE", 22 25 "nativeName": "Deutsch", 23 26 "name": "German", 24 - "completion": 92 27 + "completion": 92, 28 + "listed": true 25 29 }, 26 30 { 27 31 "code": "eo-UY", 28 32 "nativeName": "Esperanto", 29 33 "name": "Esperanto", 30 - "completion": 99 34 + "completion": 99, 35 + "listed": true 31 36 }, 32 37 { 33 38 "code": "es-ES", 34 39 "nativeName": "español", 35 40 "name": "Spanish", 36 - "completion": 100 41 + "completion": 100, 42 + "listed": true 37 43 }, 38 44 { 39 45 "code": "eu-ES", 40 46 "nativeName": "euskara", 41 47 "name": "Basque", 42 - "completion": 98 48 + "completion": 98, 49 + "listed": true 43 50 }, 44 51 { 45 52 "code": "fa-IR", 46 53 "nativeName": "فارسی", 47 54 "name": "Persian", 48 - "completion": 71 55 + "completion": 71, 56 + "listed": true 49 57 }, 50 58 { 51 59 "code": "fi-FI", 52 60 "nativeName": "suomi", 53 61 "name": "Finnish", 54 - "completion": 100 62 + "completion": 100, 63 + "listed": true 55 64 }, 56 65 { 57 66 "code": "fr-FR", 58 67 "nativeName": "français", 59 68 "name": "French", 60 - "completion": 100 69 + "completion": 100, 70 + "listed": true 61 71 }, 62 72 { 63 73 "code": "gl-ES", 64 74 "nativeName": "galego", 65 75 "name": "Galician", 66 - "completion": 100 76 + "completion": 100, 77 + "listed": true 67 78 }, 68 79 { 69 80 "code": "he-IL", 70 81 "nativeName": "עברית", 71 82 "name": "Hebrew", 72 - "completion": 10 83 + "completion": 10, 84 + "listed": false 73 85 }, 74 86 { 75 87 "code": "it-IT", 76 88 "nativeName": "italiano", 77 89 "name": "Italian", 78 - "completion": 100 90 + "completion": 100, 91 + "listed": true 79 92 }, 80 93 { 81 94 "code": "ja-JP", 82 95 "nativeName": "日本語", 83 96 "name": "Japanese", 84 - "completion": 47 97 + "completion": 47, 98 + "listed": false 85 99 }, 86 100 { 87 101 "code": "kab", 88 102 "nativeName": "Taqbaylit", 89 103 "name": "Kabyle", 90 - "completion": 95 104 + "completion": 95, 105 + "listed": true 91 106 }, 92 107 { 93 108 "code": "ko-KR", 94 109 "nativeName": "한국어", 95 110 "name": "Korean", 96 - "completion": 88 111 + "completion": 88, 112 + "listed": true 97 113 }, 98 114 { 99 115 "code": "lt-LT", 100 116 "nativeName": "lietuvių", 101 117 "name": "Lithuanian", 102 - "completion": 98 118 + "completion": 98, 119 + "listed": true 103 120 }, 104 121 { 105 122 "code": "nb-NO", 106 123 "nativeName": "norsk bokmål", 107 124 "name": "Norwegian Bokmål", 108 - "completion": 49 125 + "completion": 49, 126 + "listed": false 109 127 }, 110 128 { 111 129 "code": "nl-NL", 112 130 "nativeName": "Nederlands", 113 131 "name": "Dutch", 114 - "completion": 75 132 + "completion": 75, 133 + "listed": true 115 134 }, 116 135 { 117 136 "code": "pl-PL", 118 137 "nativeName": "polski", 119 138 "name": "Polish", 120 - "completion": 67 139 + "completion": 67, 140 + "listed": true 121 141 }, 122 142 { 123 143 "code": "pt-BR", 124 144 "nativeName": "português", 125 145 "name": "Portuguese", 126 - "completion": 100 146 + "completion": 100, 147 + "listed": true 127 148 }, 128 149 { 129 150 "code": "pt-PT", 130 151 "nativeName": "português", 131 152 "name": "Portuguese", 132 - "completion": 100 153 + "completion": 100, 154 + "listed": true 133 155 }, 134 156 { 135 157 "code": "ru-RU", 136 158 "nativeName": "русский", 137 159 "name": "Russian", 138 - "completion": 100 160 + "completion": 100, 161 + "listed": true 139 162 }, 140 163 { 141 164 "code": "th-TH", 142 165 "nativeName": "ไทย", 143 166 "name": "Thai", 144 - "completion": 8 167 + "completion": 8, 168 + "listed": false 145 169 }, 146 170 { 147 171 "code": "tr-TR", 148 172 "nativeName": "Türkçe", 149 173 "name": "Turkish", 150 - "completion": 47 174 + "completion": 47, 175 + "listed": false 151 176 }, 152 177 { 153 178 "code": "uk-UA", 154 179 "nativeName": "українська", 155 180 "name": "Ukrainian", 156 - "completion": 92 181 + "completion": 92, 182 + "listed": true 157 183 }, 158 184 { 159 185 "code": "zh-CN", 160 186 "nativeName": "简体中文", 161 187 "name": "Simplified Chinese", 162 - "completion": 100 188 + "completion": 100, 189 + "listed": true 163 190 }, 164 191 { 165 192 "code": "zh-TW", 166 193 "nativeName": "繁體中文", 167 194 "name": "Traditional Chinese", 168 - "completion": 32 195 + "completion": 32, 196 + "listed": false 169 197 } 170 198 ]
+23
src/data/listed-locales.json
··· 1 + [ 2 + "ca-ES", 3 + "es-ES", 4 + "fi-FI", 5 + "gl-ES", 6 + "it-IT", 7 + "pt-BR", 8 + "pt-PT", 9 + "zh-CN", 10 + "eo-UY", 11 + "ru-RU", 12 + "eu-ES", 13 + "lt-LT", 14 + "kab", 15 + "de-DE", 16 + "uk-UA", 17 + "fr-FR", 18 + "ko-KR", 19 + "cs-CZ", 20 + "nl-NL", 21 + "fa-IR", 22 + "pl-PL" 23 + ]
+2 -9
src/locales.js
··· 3 3 export const DEFAULT_LANG = 'en'; 4 4 export const CATALOGS = catalogs; 5 5 6 - // Get locales that's >= X% translated 7 - const PERCENTAGE_THRESHOLD = 50; 8 - 9 6 const locales = [ 10 7 DEFAULT_LANG, 11 - ...catalogs 12 - .filter(({ completion }) => completion >= PERCENTAGE_THRESHOLD) 13 - .map(({ code }) => code), 8 + ...catalogs.filter(({ listed }) => listed).map(({ code }) => code), 14 9 ]; 15 10 export const LOCALES = locales; 16 11 17 12 let devLocales = []; 18 13 if (import.meta.env?.DEV || import.meta.env?.PHANPY_SHOW_DEV_LOCALES) { 19 - devLocales = catalogs 20 - .filter(({ completion }) => completion < PERCENTAGE_THRESHOLD) 21 - .map(({ code }) => code); 14 + devLocales = catalogs.filter(({ listed }) => !listed).map(({ code }) => code); 22 15 devLocales.push('pseudo-LOCALE'); 23 16 } 24 17 export const DEV_LOCALES = devLocales;