Crowdin dynamic update (#268)

* #264 i18n dropdown ui

* #264 improve i18n configuration to use hardcoded english as default

* #264 sync language english to crowdin when merged to main

---------

Co-authored-by: neil <neil@neils-MacBook-Pro.local>
This commit is contained in:
Neil 2023-03-07 11:12:11 +08:00 committed by GitHub
parent cdf01642ac
commit a7a63ad030
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 148 additions and 914 deletions

View file

@ -12,6 +12,9 @@ on:
debug:
required: true
type: string
sync-translation:
required: false
type: string
outputs:
s3-electron-dist-key:
description: 'The S3 build key includes the installer files: [zip, dmg, etc, yml] from electron'
@ -83,6 +86,7 @@ jobs:
if: inputs.s3-prefix != 'release'
run: tea -SE xc dist
env:
SYNC_I18N: 1
PUBLIC_MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_PROJECT_TOKEN }}
DEBUG_BUILD: ${{ inputs.debug }}
PUBLIC_VERSION: ${{ steps.gui-version.outputs.version }}
@ -97,6 +101,7 @@ jobs:
if: inputs.s3-prefix == 'release'
run: tea -SE xc dist
env:
SYNC_I18N: 1
PUBLIC_MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_PROJECT_TOKEN }}
DEBUG_BUILD: ${{ inputs.debug }}
PUBLIC_VERSION: ${{ steps.gui-version.outputs.version }}
@ -130,6 +135,13 @@ jobs:
aws s3 cp artifacts.tgz $S3_KEY
echo key=$S3_KEY >> $GITHUB_OUTPUT
- name: sync translation
if: inputs.sync-translation == '1'
run: |
cd modules/desktop && node scripts/update-crowdin-source.cjs
env:
CROWDIN_API_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }}
notarize-mac-installers:
if: inputs.s3-prefix != 'release'
# TODO: run only for mac, create separate Job for linux

View file

@ -38,6 +38,7 @@ jobs:
platform: ${{ matrix.platform }}
s3-prefix: main
debug: 1
sync-translation: 1
secrets: inherit
upload:
needs: [build_desktop]

View file

@ -33,9 +33,12 @@ pnpm test
```
## Intuition Building Links
## i18n
- [Rust module system is weird?](https://www.sheshbabu.com/posts/rust-module-system/)
Default locale is `english` it is defined in `src/libs/translations/translations.json`. Include all new keys there then this will automatically sync to crowdin once merged to `main`.
Data from [crowdin](https://crowdin.com) our translation app/community will only be loaded when env var `SYNC_I18N` exists. Currently only configured on top of the GHA CI/CD workflows.
## Intuition Building Links
<p align="center">
<img src="https://github.com/Dax89/electron-sveltekit/blob/master/icon.png" width="256">

View file

@ -1,36 +0,0 @@
const fs = require("fs");
const _ = require("lodash");
const translations = require("../src/libs/translations/translations.json");
const englishRaw = translations["en"];
delete englishRaw.lang;
function flattenObject(o, prefix = "", result = {}, keepNull = true) {
if (_.isString(o) || _.isNumber(o) || _.isBoolean(o) || (keepNull && _.isNull(o))) {
result[prefix] = o;
return result;
}
if (_.isArray(o) || _.isPlainObject(o)) {
for (let i in o) {
let pref = prefix;
if (_.isArray(o)) {
pref = pref + `[${i}]`;
} else {
if (_.isEmpty(prefix)) {
pref = i;
} else {
pref = prefix + "." + i;
}
}
flattenObject(o[i], pref, result, keepNull);
}
return result;
}
return result;
}
const flattenedEnglish = flattenObject(englishRaw);
fs.writeFileSync("./copy.json", JSON.stringify(flattenedEnglish, null, 2), "utf-8");

View file

@ -0,0 +1,100 @@
const fs = require("fs");
const _ = require("lodash");
const translations = require("../src/libs/translations/translations.json");
const axios = require("axios");
const token = process.env.CROWDIN_API_TOKEN;
const projectId = 570715;
const fileId = 7;
const headers = {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
};
const englishRaw = translations["en"];
delete englishRaw.lang;
function flattenObject(o, prefix = "", result = {}, keepNull = true) {
if (_.isString(o) || _.isNumber(o) || _.isBoolean(o) || (keepNull && _.isNull(o))) {
result[prefix] = o;
return result;
}
if (_.isArray(o) || _.isPlainObject(o)) {
for (let i in o) {
let pref = prefix;
if (_.isArray(o)) {
pref = pref + `[${i}]`;
} else {
if (_.isEmpty(prefix)) {
pref = i;
} else {
pref = prefix + "." + i;
}
}
flattenObject(o[i], pref, result, keepNull);
}
return result;
}
return result;
}
const flattenedEnglish = flattenObject(englishRaw);
const getStrings = async () => {
const { data } = await axios({
method: "GET",
url: `https://api.crowdin.com/api/v2/projects/${projectId}/strings?limit=500`,
headers
});
return data.data;
};
async function main() {
const data = await getStrings();
for (const key in flattenedEnglish) {
const found = data.find((data) => data.data.identifier === `"${key}"`);
if (found && found.data.text !== flattenedEnglish[key]) {
console.log("update!", key, found.data.text, flattenedEnglish[key]);
await updateString(found.data.id, flattenedEnglish[key]);
} else if (!found) {
// insert add
await createString(key, flattenedEnglish[key]);
}
}
}
async function createString(key, text) {
await axios({
method: "POST",
url: `https://api.crowdin.com/api/v2/projects/${projectId}/strings`,
headers,
data: {
text,
identifier: `"${key}"`,
fileId,
context: ` -> ${key}`,
isHidden: false,
maxLength: 0,
labelIds: []
}
});
}
async function updateString(stringId, value) {
const d = await axios({
method: "PATCH",
url: `https://api.crowdin.com/api/v2/projects/${projectId}/strings/${stringId}`,
headers,
data: [
{
value,
op: "replace",
path: "/text"
}
]
});
}
main();

View file

@ -2,6 +2,7 @@ const otaClient = require("@crowdin/ota-client");
const _ = require("lodash");
const fs = require("fs");
const path = require("path");
const defaultEnTranslation = require("../src/libs/translations/translations.json");
// this read only hash is from crowdin
const hash = "cf849610ca66250f0954379ct4t";
@ -10,6 +11,8 @@ const client = new otaClient.default(hash);
async function main() {
console.log("getting latest translation!");
if (!process.env.SYNC_I18N) return;
const [languagesList, translationsRaw] = await Promise.all([
client.getLanguageObjects(),
client.getStrings()
@ -33,7 +36,20 @@ async function main() {
}, {});
const translationsPath = path.join(__dirname, "../src/libs/translations/translations.json");
await fs.writeFileSync(translationsPath, JSON.stringify(translations, null, 2), "utf-8");
defaultEnTranslation.en.lang = translations.en.lang;
await fs.writeFileSync(
translationsPath,
JSON.stringify(
{
...translations,
...defaultEnTranslation
},
null,
2
),
"utf-8"
);
}
main();

View file

@ -2,8 +2,11 @@
import { t, locales, locale } from '$libs/translations';
</script>
<select bind:value="{$locale}" class="bg-black text-sm text-gray">
{#each $locales as value}
<option value="{value}">{$t(`lang.${value}`)}</option>
{/each}
</select>
<section class="flex items-center border border-gray h-8 mt-1 mr-1 px-2 w-48 rounded-sm">
<i class="icon-world text-gray mt-2"></i>
<select bind:value="{$locale}" class="bg-black text-sm text-gray flex-grow">
{#each $locales as value}
<option value="{value}">{$t(`lang.${value}`)}</option>
{/each}
</select>
</section>

View file

@ -1,252 +1,7 @@
{
"ar": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "tea ثَبَّتَ"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"zh-CN": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "装 tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"nl": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "installeer tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"en": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
"en": "English"
},
"cli": {
"install": "install tea"
@ -311,629 +66,5 @@
"popularity": "popularity",
"most-recent": "most recent"
}
},
"fr": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "installer le tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"de": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "tea installieren"
},
"store-search-placeholder": "Suche im Tea-laden",
"search": "suchen",
"home": {
"discover-title": "Entdecken",
"asset-title": "Asset-Typ",
"tutorials-title": "TUTORIALS",
"os-news-title": "Open-Source-Nachrichten"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "Installieren",
"installed-label": "eingerichtet",
"installing-label": "installieren",
"reinstall-label": "neu installieren",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "datenschutz-Bestimmungen"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sortierreihenfolge",
"popularity": "popularität",
"most-recent": "neueste"
}
},
"it": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "installare il tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"ja": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "tea をインストール"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"ko": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "tea 설치"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"pt-PT": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "instalar tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"ru": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "установить tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
},
"es-ES": {
"lang": {
"ar": "Arabic",
"zh-CN": "Chinese Simplified",
"nl": "Dutch",
"en": "English",
"fr": "French",
"de": "German",
"it": "Italian",
"ja": "Japanese",
"ko": "Korean",
"pt-PT": "Portuguese",
"ru": "Russian",
"es-ES": "Spanish"
},
"cli": {
"install": "instalar tea"
},
"store-search-placeholder": "search the tea store",
"search": "search",
"home": {
"discover-title": "DISCOVER",
"asset-title": "ASSET TYPE",
"tutorials-title": "TUTORIALS",
"os-news-title": "OPEN-SOURCE NEWS"
},
"package": {
"top-list-title": "Top packages this week",
"browse-cta": "Browse packages",
"what-title": "What are packages?",
"short-description": "Collections of files aggregated to form larger frameworks & functions. Think Python or Node.js.",
"foundation-essentials-title": "FOUNDATION ESSENTIALS",
"view-all-cta": "View all packages",
"install-label": "install",
"installed-label": "installed",
"installing-label": "installing",
"reinstall-label": "re-install",
"my-installs-title": "my installs",
"check-for-updates": "check for updates",
"details": "details",
"install-tea-label": "Install tea cli",
"update-tea-label": "Update now",
"install-tea-cli": "This app requires our command-line interface",
"update-tea-cli": "An update is available for tea cli"
},
"script": {
"top-list-title": "Top scripts this week",
"view-all-cta": "View all scripts",
"use-label": "use",
"browse-cta": "Browse scripts",
"what-title": "What are scripts?",
"short-description": "Invisible applications that chain packages together in order to perform cool actions on your computer."
},
"post": {
"workshops-title": "workshops to get started",
"article-more-cta": "Read more articles",
"read-more-cta": "read more"
},
"footer": {
"quick-links-title": "quick links",
"about-tea-store": "about the tea store",
"report-a-problem": "report a problem",
"visit-website": "visit tea.xyz",
"terms-services": "terms & services",
"privacy-policy": "privacy-policy"
},
"documentation": {
"title": "documentation",
"featured-courses-title": "featured courses",
"workshops": "workshops"
},
"view-all": "view all",
"sorting": {
"label": "sort order",
"popularity": "popularity",
"most-recent": "most recent"
}
}
}

View file

@ -40,4 +40,5 @@
<glyph glyph-name="exclamation-circle" unicode="&#69;" d="M256 475c40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110 0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29z m37-356l0 54c0 3-1 5-3 7-2 2-4 3-6 3l-55 0c-3 0-5-1-7-3-2-2-3-4-3-7l0-54c0-2 1-5 3-6 2-2 4-3 7-3l55 0c2 0 4 1 6 2 2 2 3 4 3 7z m-1 98l5 178c0 2-1 4-3 5-2 2-4 2-7 2l-62 0c-3 0-5 0-7-2-2-1-3-3-3-5l5-178c0-1 1-3 3-5 1-1 4-2 6-2l53 0c3 0 5 1 7 2 2 2 3 4 3 5z"/>
<glyph glyph-name="check-circle" unicode="&#70;" d="M403 302c0 6-1 10-5 13l-26 26c-3 4-8 6-13 6-5 0-9-2-12-6l-117-116-65 64c-3 4-7 6-12 6-5 0-10-2-13-6l-26-25c-4-4-5-8-5-13 0-6 1-10 5-13l103-104c4-3 8-5 13-5 5 0 10 2 13 5l155 155c4 4 5 8 5 13z m72-46c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph glyph-name="tea-x-btn" unicode="&#71;" d="M512 463l-49 49-207-207-207 207-49-49 207-207-207-207 49-49 207 207 207-207 49 49-207 207z"/>
<glyph glyph-name="world" unicode="&#72;" d="M248 512c-137 0-248-111-248-248 0-137 111-248 248-248 137 0 248 111 248 248 0 137-111 248-248 248z m216-240l-96 0c-1 35-8 69-19 100 22 9 42 21 60 35 32-36 53-83 55-135z m-225-224c-26 23-49 51-65 85 21 6 43 10 66 11l0-96c0 0-1 0-1 0z m18 432c30-26 55-59 71-98-23-8-47-13-72-14l0 112c0 0 1 0 1 0z m26-3c45-8 84-28 115-58-17-13-35-24-55-32-14 35-35 65-60 90z m-43 3l0-112c-25 1-49 6-72 14 16 39 41 72 71 98 0 0 1 0 1 0z m-87-93c-20 8-38 19-55 32 31 30 70 50 115 58-25-25-46-55-60-90z m9-20c24-9 51-14 78-15l0-80-96 0c1 34 7 66 18 95z m78-111l0-96c-25-1-50-5-73-13-13 33-22 70-23 109z m-27-205c-40 7-76 24-105 49 16 11 33 20 51 27 14-29 32-54 54-76z m43-3l0 96c23-1 45-5 66-11-16-34-39-62-65-85 0 0-1 0-1 0z m81 79c18-7 35-16 51-27-29-25-65-42-105-49 22 22 40 47 54 76z m-8 20c-23 8-48 12-73 13l0 96 96 0c-1-39-10-76-23-109z m-73 125l0 80c27 1 54 6 78 15 11-29 17-62 18-95l-96 0z m-169 135c18-14 38-26 60-35-11-31-18-65-19-100l-96 0c2 52 23 99 55 135z m-55-151l96 0c1-41 10-79 24-114-20-8-39-19-56-31-38 37-62 88-64 145z m368-145c-17 12-36 23-56 31 14 35 23 73 24 114l96 0c-2-57-26-108-64-145z"/>
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -136,3 +136,6 @@
.icon-tea-x-btn:before {
content: "\47";
}
.icon-world:before {
content: "\48";
}