diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ab396d56..3729943ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Dates are in `YYYY-MM-DD` format and versions are in [semantic versioning](http: - [#509](https://github.com/wordplaydev/wordplay/issues/509) Fixed parsing regression from infinite loop fixes. - [#507](https://github.com/wordplaydev/wordplay/issues/507) Fixed Webpage stream replay bug. - [#216](https://github.com/wordplaydev/wordplay/issues/216) Improved design of view code and copy buttons. +- [#397](https://github.com/wordplaydev/wordplay/issues/397) Redesigned home page for clarity and navigability. - Added fade out sequence. - Fixed select all button. diff --git a/src/basis/Fonts.ts b/src/basis/Fonts.ts index 91b7a2264..4e69cfe0a 100644 --- a/src/basis/Fonts.ts +++ b/src/basis/Fonts.ts @@ -421,7 +421,7 @@ export class FontManager { const face = Faces[name]; // If preloaded, don't load it. - if (face.preloaded === true) return; + if (face !== undefined && face.preloaded === true) return; if (this.facesLoaded.get(name) === 'loaded') return; @@ -435,8 +435,8 @@ export class FontManager { face.ranges === undefined ? undefined : Array.isArray(face.ranges) - ? face.ranges - : [face.ranges]; + ? face.ranges + : [face.ranges]; // If the face has specific weights, load all of the individual ways, split by the ranges specified. if (Array.isArray(face.weights)) { @@ -447,7 +447,7 @@ export class FontManager { face.weights, false, ranges, - face.format + face.format, ), ]; if (face.italic) @@ -458,7 +458,7 @@ export class FontManager { face.weights, true, ranges, - face.format + face.format, ), ]; } @@ -472,7 +472,7 @@ export class FontManager { italic: face.italic, format: face.format, range: undefined, - }) + }), ); else { for (const range of ranges) @@ -483,7 +483,7 @@ export class FontManager { italic: face.italic, format: face.format, range: range, - }) + }), ); } } @@ -496,7 +496,7 @@ export class FontManager { this.facesLoaded.set( name, - loads.every((loaded) => loaded) ? 'loaded' : 'failed' + loads.every((loaded) => loaded) ? 'loaded' : 'failed', ); } @@ -505,7 +505,7 @@ export class FontManager { weights: FontWeight[], ital: boolean, ranges: string[] | undefined, - format: FontFormat + format: FontFormat, ): Promise[] { const promises: Promise[] = []; for (const weight of weights) { @@ -517,7 +517,7 @@ export class FontManager { italic: ital, format: format, range: undefined, - }) + }), ); else { for (const range of ranges) { @@ -528,7 +528,7 @@ export class FontManager { italic: ital, format: format, range: range, - }) + }), ); } } @@ -575,7 +575,7 @@ export class FontManager { ? font.weight.toString() : `${supportedFace.weights.min} ${supportedFace.weights.max}`, unicodeRange: font.range, - } + }, ); document.fonts.add(fontFace); @@ -590,5 +590,5 @@ const Fonts = new FontManager(); export default Fonts; export const SupportedFontsFamiliesType = SupportedFaces.map( - (font) => `"${font}"` + (font) => `"${font}"`, ).join(OR_SYMBOL); diff --git a/src/components/app/Action.svelte b/src/components/app/Action.svelte new file mode 100644 index 000000000..1077b2425 --- /dev/null +++ b/src/components/app/Action.svelte @@ -0,0 +1,15 @@ +
+ +
+ + diff --git a/src/components/app/Background.svelte b/src/components/app/Background.svelte index 2dd809f1a..17c5dee1e 100644 --- a/src/components/app/Background.svelte +++ b/src/components/app/Background.svelte @@ -26,7 +26,7 @@ const bounds = 0.2; const glyphs = new UnicodeString( - '😀മAあ韓नेئبअขማঅবাংབོދިεفગુע中رšՀꆈᓄქ' + '😀മAあ韓नेئبअขማঅবাংབོދިεفગુע中رšՀꆈᓄქ', ).getGraphemes(); let mounted = false; @@ -53,7 +53,7 @@ glyph.y = windowHeight * (1 + bounds); const element = document.querySelector( - `[data-id="${glyph.index}"]` + `[data-id="${glyph.index}"]`, ); if (element instanceof HTMLElement) { element.style.left = `${glyph.x}px`; @@ -73,7 +73,7 @@ // Compute a number of glyphs roughly proportional to the window size. const count = Math.min( 20, - Math.round(windowWidth * windowHeight) / 100000 + Math.round(windowWidth * windowHeight) / 100000, ); for (let i = 0; i < count; i++) random.push(glyphs[Math.floor(Math.random() * glyphs.length)]); diff --git a/src/components/app/BigLink.svelte b/src/components/app/BigLink.svelte index 54a85de5c..0e018468b 100644 --- a/src/components/app/BigLink.svelte +++ b/src/components/app/BigLink.svelte @@ -7,20 +7,22 @@ export let smaller = false; - + + {#if subtitle}
{subtitle}
{/if} diff --git a/src/components/app/Writing.svelte b/src/components/app/Writing.svelte index a5705bf15..be2dcb84d 100644 --- a/src/components/app/Writing.svelte +++ b/src/components/app/Writing.svelte @@ -1,11 +1,16 @@ - +
+
diff --git a/src/components/settings/LocaleChooser.svelte b/src/components/settings/LocaleChooser.svelte index a8740f7b6..fc4c4bc71 100644 --- a/src/components/settings/LocaleChooser.svelte +++ b/src/components/settings/LocaleChooser.svelte @@ -8,7 +8,6 @@ SupportedLocales, getLocaleLanguage, type SupportedLocale, - getLocaleLanguageName, EventuallySupportedLocales, } from '../../locale/Locale'; import Link from '../app/Link.svelte'; @@ -25,7 +24,7 @@ function select( locale: SupportedLocale, - action: 'remove' | 'replace' | 'add' + action: 'remove' | 'replace' | 'add', ) { selectedLocales = // If removing, only remove if there's more than one. @@ -34,17 +33,17 @@ ? selectedLocales.filter((l) => l !== locale) : selectedLocales : // If replacing, just choose the single locale - action === 'replace' - ? [locale] - : // Put the selected locale at the end, removing it from the beginning if included - [...selectedLocales.filter((l) => l !== locale), locale]; + action === 'replace' + ? [locale] + : // Put the selected locale at the end, removing it from the beginning if included + [...selectedLocales.filter((l) => l !== locale), locale]; // Set the layout and direction based on the preferred language. if (selectedLocales.length > 0) { Settings.setWritingLayout( getLanguageLayout( - getLocaleLanguage(selectedLocales[0]) as LanguageCode - ) + getLocaleLanguage(selectedLocales[0]) as LanguageCode, + ), ); // Save setLocales DB.Locales.setLocales(selectedLocales as SupportedLocale[]); @@ -56,13 +55,13 @@ description={$locales.get((l) => l.ui.dialog.locale)} button={{ tip: $locales.get((l) => l.ui.dialog.locale.button.show), - label: selectedLocales.map((l) => getLocaleLanguageName(l)).join(' + '), + label: selectedLocales.join(' + '), }} >

{concretize( $locales, - $locales.get((l) => l.ui.dialog.locale.subheader.selected) + $locales.get((l) => l.ui.dialog.locale.subheader.selected), ).toText()}

@@ -80,7 +79,7 @@

{concretize( $locales, - $locales.get((l) => l.ui.dialog.locale.subheader.supported) + $locales.get((l) => l.ui.dialog.locale.subheader.supported), ).toText()}

@@ -103,7 +102,7 @@

{concretize( $locales, - $locales.get((l) => l.ui.dialog.locale.subheader.coming) + $locales.get((l) => l.ui.dialog.locale.subheader.coming), ).toText()}

@@ -121,7 +120,7 @@ to="https://github.com/wordplaydev/wordplay/wiki/localize" >{concretize( $locales, - $locales.get((l) => l.ui.dialog.locale.subheader.help) + $locales.get((l) => l.ui.dialog.locale.subheader.help), ).toText()} diff --git a/src/components/settings/Settings.svelte b/src/components/settings/Settings.svelte index 509c37a90..2924cbf4e 100644 --- a/src/components/settings/Settings.svelte +++ b/src/components/settings/Settings.svelte @@ -19,7 +19,6 @@ import Mode from '../widgets/Mode.svelte'; import Dialog from '../widgets/Dialog.svelte'; import CreatorView from '../app/CreatorView.svelte'; - import Beta from '../../routes/Beta.svelte'; import { Creator } from '../../db/CreatorDatabase'; import { AnimationFactorIcons } from '@db/AnimationFactorSetting'; @@ -53,21 +52,6 @@
- - {$locales.get((l) => l.term.help)}/{$locales.get( - (l) => l.term.feedback, - )} .", + "value": "Create interactive stories with words, symbols, emojis, and code with us!", + "description": [ + "Wordplay is programming language that enables you to:", + "• Playfully animate words and emojis 🤪", + "• Use time 🕦, sound 🎤, websites 🔗, and physics 🌎", + "• Share 🤝 with friends, groups, or anyone", + "• Code in any world language 🌐", + "• Edit with mice 🖱️, touch 👆, and keyboards ⌨️", + "• Debug forwards ⏩ and backwards ⏪", + "• View with screens 🖥️ and screen readers 🔊", + "Free forever from the ." + ], "beta": [ - "Wordplay is in *beta*. That means that functionality might change or not work as intended, and localizations might be incomplete. Report bugs and share ideas in , or . See our <1.0 plans@https://github.com/wordplaydev/wordplay/milestones/1.0> and if you can!" + "Wordplay is in *beta*, so it might not work as intended or be complete. Report bugs and share ideas in , see our <1.0 plans@https://github.com/wordplaydev/wordplay/milestones/1.0>, and ." ], "link": { "learn": "Learn the language with a dramatic cast of characters", @@ -4424,7 +4433,15 @@ "projects": "Create and share peformances", "galleries": "Experience others' performances", "rights": "Responsibilities, ours and yours", - "about": "Why does this place exist?" + "about": "Why does this place exist?", + "community": { + "label": "Community", + "subtitle": "Chat with us on Discord." + }, + "contribute": { + "label": "Contribute", + "subtitle": "Help us make Wordplay." + } } }, "learn": { @@ -4618,7 +4635,7 @@ }, "donate": { "header": "Donate", - "prompt": "Enable more accessible, global programming", + "prompt": "Help us pay for bandwidth and compensate student and teacher contributors.", "content": [ "Wordplay is a free, community-based project supported by the . We rely on gifts from people who believe in our mission of accessible, language-inclusive, educational programming languages.", "Here are our current costs:", diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index a3762ac9f..8d502349f 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -4,13 +4,15 @@ import Background from '../components/app/Background.svelte'; import { locales } from '../db/Database'; import Writing from '../components/app/Writing.svelte'; - // import Speech from '../components/lore/Speech.svelte'; - // import Glyphs from '../lore/Glyphs'; - // import Emotion from '../lore/Emotion'; import MarkupHtmlView from '../components/concepts/MarkupHTMLView.svelte'; - import Beta from './Beta.svelte'; import Lead from '@components/app/Lead.svelte'; import Emoji from '@components/app/Emoji.svelte'; + import Action from '@components/app/Action.svelte'; + import { DOCUMENTATION_SYMBOL, EDIT_SYMBOL } from '@parser/Symbols'; + import Beta from './Beta.svelte'; + import Speech from '@components/lore/Speech.svelte'; + import Glyphs from '../lore/Glyphs'; + import Emotion from '../lore/Emotion'; @@ -20,75 +22,122 @@ - - +
💬{$locales.get((l) => l.wordplay)}
- l.ui.page.landing.value)} - /> - +
l.ui.page.landing.description)} />
- l.ui.page.landing.link.learn)} - >{$locales.get((l) => l.ui.page.learn.header)} - l.ui.page.landing.link.guide)} - >{$locales.get((l) => l.ui.page.guide.header)} - l.ui.page.landing.link.projects)} - >{$locales.get((l) => l.ui.page.projects.header)} - l.ui.page.landing.link.galleries)} - >{$locales.get((l) => l.ui.page.galleries.header)} l.ui.page.login.subtitle)} >{$locales.get((l) => l.ui.page.login.header)} - l.ui.page.landing.link.about)} - >{$locales.get((l) => l.ui.page.about.header)} - l.ui.page.landing.link.rights)} - >{$locales.get((l) => l.ui.page.rights.header)} - l.ui.page.donate.prompt)} - >{$locales.get((l) => l.ui.page.donate.header)} +
+
+ + l.ui.page.landing.link.projects)} + >{EDIT_SYMBOL} + {$locales.get((l) => l.ui.page.projects.header)} + + + l.ui.page.landing.link.galleries)} + >🎭 {$locales.get((l) => l.ui.page.galleries.header)} + + + l.ui.page.landing.link.learn)} + >🙋‍♀️ {$locales.get((l) => l.ui.page.learn.header)} + + + l.ui.page.landing.link.guide)} + >{DOCUMENTATION_SYMBOL} + {$locales.get((l) => l.ui.page.guide.header)} + +
+
+ + +
- + + .actions { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: var(--wordplay-spacing); + align-items: stretch; + } + + .details { + display: flex; + flex-direction: column; + gap: calc(var(--wordplay-spacing) * 2); + padding: calc(2 * var(--wordplay-spacing)); + min-height: 20em; + margin-left: auto; + margin-right: auto; + } + + .links { + display: flex; + flex-direction: row; + gap: var(--wordplay-spacing); + } + + .column { + display: flex; + flex-direction: column; + gap: calc(2 * var(--wordplay-spacing)); + flex-grow: 1; + flex-basis: 0; + } + diff --git a/src/routes/Beta.svelte b/src/routes/Beta.svelte index 4028a0525..ae29b1b1d 100644 --- a/src/routes/Beta.svelte +++ b/src/routes/Beta.svelte @@ -9,9 +9,11 @@ diff --git a/src/routes/login/Profile.svelte b/src/routes/login/Profile.svelte index d2134f5eb..b62b03417 100644 --- a/src/routes/login/Profile.svelte +++ b/src/routes/login/Profile.svelte @@ -14,6 +14,7 @@ import ChangePassword from './ChangePassword.svelte'; import DeleteAccount from './DeleteAccount.svelte'; import { goto } from '$app/navigation'; + import Action from '@components/app/Action.svelte'; export let user: User; @@ -44,22 +45,22 @@ >
-
+

{$locales.get((l) => l.ui.page.login.prompt.play)}

{$locales.get((l) => l.ui.page.projects.header)}

-
-
+ +

{$locales.get((l) => l.ui.page.login.prompt.name)}

rename(name)} emoji={user.displayName ?? ''} /> -
-
+ + l.ui.page.login.prompt.logout)} /> @@ -77,21 +78,21 @@ )}…

-
+ {#if !creator.isUsername()} -
+ -
+ {:else} -
+ -
+ {/if} -
+ {#if moderator} -
+ You're a moderator. Go moderate? -
+ {/if}
@@ -103,14 +104,6 @@ gap: var(--wordplay-spacing); } - .action { - min-width: 15em; - width: calc(50% - var(--wordplay-spacing)); - padding: var(--wordplay-spacing); - border: var(--wordplay-border-color) solid var(--wordplay-border-width); - border-radius: var(--wordplay-border-radius); - } - .emoji { display: inline-block; font-family: 'Noto Color Emoji'; diff --git a/static/locales/es-MX/es-MX.json b/static/locales/es-MX/es-MX.json index 14b5485ce..bdb81560e 100644 --- a/static/locales/es-MX/es-MX.json +++ b/static/locales/es-MX/es-MX.json @@ -4428,11 +4428,18 @@ "message": "¿Dónde estamos? ¿Podemos ir a casa?" }, "landing": { - "call": [ - "¡Hola! ¿Quieres dar vida a las palabras con nosotras? 😊" + "value": "¡Crea historias interactivas con palabras, símbolos, emojis y codifica con nosotros!", + "description": [ + "Wordplay es un lenguaje de programación que te permite:", + "• Anima palabras y emojis de forma divertida 🤪︎", + "• Utilice el tiempo 🕦︎, el sonido 🎤︎, los sitios web 🔗︎ y la física 🌎︎", + "• Comparte 🤝︎ con amigos, grupos o cualquier persona", + "• Código en cualquier idioma del mundo 🌐︎", + "• Edite con mouse 🖱︎️, toque 👆︎ y teclados ⌨︎️", + "• Depurar hacia adelante ⏩︎ y hacia atrás ⏪︎", + "• Ver con pantallas 🖥︎️ y lectores de pantalla 🔊", + "• Gratis para siempre de la Universidad de Washington↗." ], - "value": "Aprende a programar animando palabras, emojis y símbolos de los idiomas del mundo, sin importar tus habilidades.", - "description": "Wordplay es un lenguaje de programación innovador 🖥️ con edición de bloques y texto 📝, entradas juguetonas como el tiempo 🕦, sonido 🎤, páginas web 🔗 y física 🌎, depuración instantánea de viaje en el tiempo ⏪ y documentación completa 🗂️. Todo en una lista en crecimiento de los idiomas del mundo 🌐, siguiendo los últimos estándares de accesibilidad web ♿️. Comparte con amigos, grupos privados o el mundo ↗️. Gratis para siempre desde la .", "beta": [ "Wordplay está en *beta*. Esto significa que la funcionalidad puede cambiar o no funcionar como se espera.", "¡Pero también significa que queremos tus comentarios! Informa sobre errores y comparte ideas en , o . Consulta nuestros y si puedes hacerlo." @@ -4443,7 +4450,15 @@ "guide": "$?", "projects": "Crea y comparte actuaciones", "galleries": "Experimenta actuaciones de otros", - "rights": "Responsabilidades, las nuestras y las tuyas" + "rights": "Responsabilidades, las nuestras y las tuyas", + "community": { + "label": "Comunidad", + "subtitle": "Chatea con nosotras en Discord." + }, + "contribute": { + "label": "Contribuir", + "subtitle": "Ayúdanos a hacer Wordplay." + } } }, "learn": { diff --git a/static/locales/example/example.json b/static/locales/example/example.json index fd4c29251..dfb93b789 100644 --- a/static/locales/example/example.json +++ b/static/locales/example/example.json @@ -2683,7 +2683,6 @@ "message": "$?" }, "landing": { - "call": ["$?"], "value": "$?", "description": "$?", "beta": ["$?"], @@ -2693,7 +2692,15 @@ "guide": "$?", "projects": "$?", "galleries": "$?", - "rights": "$?" + "rights": "$?", + "community": { + "label": "$?", + "subtitle": "$?" + }, + "contribute": { + "label": "$?", + "subtitle": "$?" + } } }, "learn": { diff --git a/static/locales/ko-KR/ko-KR.json b/static/locales/ko-KR/ko-KR.json index ef137de62..21435ecc5 100644 --- a/static/locales/ko-KR/ko-KR.json +++ b/static/locales/ko-KR/ko-KR.json @@ -3184,9 +3184,18 @@ "message": "$?" }, "landing": { - "call": ["$?"], - "value": "$?", - "description": "$?", + "value": "단어, 기호, 이모티콘, 코드를 사용하여 대화형 스토리를 만들어보세요!", + "description": [ + "Wordplay는 다음을 수행할 수 있는 프로그래밍 언어입니다", + "• 단어와 이모티콘에 장난스럽게 애니메이션을 적용해보세요 🤪︎", + "• 시간 🕦︎, 소리 🎤︎, 웹사이트 🔗︎, 물리학 🌎︎을 활용하세요.", + "• 친구, 그룹 또는 누구와도 🤝︎ 공유하세요", + "• 모든 세계 언어로 코드를 작성하세요 🌐︎", + "• 마우스 🖱︎️, 터치 👆︎, 키보드 ⌨︎️로 편집하세요", + "• 디버그 앞으로 ⏩︎ 및 뒤로 ⏪︎", + "• 화면🖥︎️ 및 화면 리더로 보기 🔊", + "워싱턴 대학교↗에서 영원히 무료입니다." + ], "beta": ["$?"], "link": { "about": "$?", @@ -3194,7 +3203,15 @@ "guide": "$?", "projects": "$?", "galleries": "$?", - "rights": "$?" + "rights": "$?", + "community": { + "label": "지역 사회", + "subtitle": "Discord에서 우리와 채팅하세요" + }, + "contribute": { + "label": "기여하다", + "subtitle": "워드플레이를 만들 수 있도록 도와주세요." + } } }, "learn": { diff --git a/static/locales/zh-CN/zh-CN.json b/static/locales/zh-CN/zh-CN.json index 0530a57b9..33c37c705 100644 --- a/static/locales/zh-CN/zh-CN.json +++ b/static/locales/zh-CN/zh-CN.json @@ -4249,9 +4249,18 @@ "message": "这是什么地方?我们能回家吗?" }, "landing": { - "call": ["嗨!想要与我们一起赋予文字生命吗?😊"], - "value": "$! 無論您的能力如何,都可以透過世界語言中的動畫單字、表情符號和符號來學習編碼。", - "description": "$! Wordplay 是一種創新的程式語言 🖥️,具有區塊和文字編輯 📝、時間 🕦、聲音 🎤、網頁 🔗 和物理 🌎 等有趣的輸入、即時時間旅行調試 ⏪ 以及全面的文檔 🗂️。 所有這些都在不斷增長的世界語言清單中🌐,遵循最新的網路可訪問性標準♿️。 與朋友、私人團體或全世界分享↗️。 永遠免費來自。", + "value": "与我们一起用文字、符号、表情符号和代码创建互动故事!", + "description": [ + "Wordplay 是一种编程语言,它使您能够:", + "• 以有趣的方式为文字和表情符号制作动画 🤪︎", + "• 使用时间 🕦︎、声音 🎤︎、网站 🔗︎ 和物理 🌎︎", + "• 与朋友、群组或任何人分享 🤝︎", + "• 使用任何世界语言编写代码 🌐︎", + "• 使用鼠标 🖱︎️、触摸 👆︎ 和键盘 ⌨︎️ 编辑", + "• 向前调试 ⏩︎ 和向后调试 ⏪︎", + "• 使用屏幕 🖥︎️ 和屏幕阅读器查看 🔊", + "华盛顿大学永久免费↗。" + ], "beta": [ "Wordplay 处于*测试阶段*。这意味着功能可能会更改或无法按预期工作,并且本地化可能不完整。", "但这也意味着我们需要您的反馈!请在 上报告错误并分享想法。如果您能帮助,请查看我们的 <1.0 计划@https://github.com/wordplaydev/wordplay/milestones/1.0> 和 <贡献信息@https://github.com/wordplaydev/wordplay/wiki/contribute>。" @@ -4262,7 +4271,15 @@ "guide": "$?", "projects": "创建并分享表演", "galleries": "体验他人的表演", - "rights": "责任,我们的和你们的" + "rights": "责任,我们的和你们的", + "community": { + "label": "社区", + "subtitle": "在 Discord 上与我们聊天。" + }, + "contribute": { + "label": "贡献", + "subtitle": "帮助我们制作 Wordplay。" + } } }, "learn": { diff --git a/static/locales/zh-TW/zh-TW.json b/static/locales/zh-TW/zh-TW.json index 72f66105a..6b2d98332 100644 --- a/static/locales/zh-TW/zh-TW.json +++ b/static/locales/zh-TW/zh-TW.json @@ -4230,9 +4230,18 @@ "message": "這是什麼地方?我們能回家嗎?" }, "landing": { - "call": ["嗨!想要與我們一起賦予文字生命嗎?😊"], - "value": "$! 無論您的能力如何,都可以透過世界語言中的動畫單字、表情符號和符號來學習編碼。", - "description": "$! Wordplay 是一種創新的程式語言🖥️,具有區塊和文字編輯📝、時間🕦、聲音🎤、網頁🔗 和實體🌎 等有趣的輸入、即時時間旅行調試⏪ 以及無所不包的文檔🗂️ 。 ischool.uw.edu/>。", + "value": "與我們一起使用文字、符號、表情符號和代碼來創建互動故事!", + "description": [ + "Wordplay 是一種程式語言,讓您能夠:", + "• 有趣的動畫單字和表情符號🤪︎", + "• 使用時間 🕦︎、聲音 🎤︎、網站 🔗︎ 和物理 🌎︎", + "• 與朋友、群組或任何人分享🤝︎", + "• 任何世界語言的代碼🌐︎", + "• 使用滑鼠🖱︎️、觸摸👆︎和鍵盤⌨︎️進行編輯", + "• 向前除錯 ⏩︎ 和向後除錯 ⏪︎", + "• 使用螢幕🖥︎️和螢幕閱讀器查看🔊", + "• 永遠擺脫華盛頓大學↗的束縛。" + ], "beta": [ "Wordplay 處於測試階段。它的功能可能會更改或無法按預期工作,並且本地化可能不完整。", "但這也意味著我們需要您的回饋!請在 上報告錯誤並分享想法。 contribute>。" @@ -4243,7 +4252,15 @@ "guide": "$?", "projects": "創作並分享表演", "galleries": "體驗他人的表演", - "rights": "責任,我們的和你們的" + "rights": "責任,我們的和你們的", + "community": { + "label": "社群", + "subtitle": "在 Discord 上與我們聊天。" + }, + "contribute": { + "label": "貢獻", + "subtitle": "幫助我們製作文字遊戲。" + } } }, "learn": { diff --git a/static/schemas/Locale.json b/static/schemas/Locale.json index 5ade95f18..e57b9986e 100644 --- a/static/schemas/Locale.json +++ b/static/schemas/Locale.json @@ -9357,15 +9357,18 @@ }, "type": "array" }, - "call": { - "description": "What function says as a call to action", - "items": { - "$ref": "#/definitions/Template" - }, - "type": "array" - }, "description": { - "$ref": "#/definitions/Template", + "anyOf": [ + { + "$ref": "#/definitions/Template" + }, + { + "items": { + "$ref": "#/definitions/Template" + }, + "type": "array" + } + ], "description": "A description of the platform's features" }, "link": { @@ -9376,6 +9379,40 @@ "description": "What content is on the about page", "type": "string" }, + "community": { + "additionalProperties": false, + "description": "The community link", + "properties": { + "label": { + "type": "string" + }, + "subtitle": { + "type": "string" + } + }, + "required": [ + "label", + "subtitle" + ], + "type": "object" + }, + "contribute": { + "additionalProperties": false, + "description": "The contributor link", + "properties": { + "label": { + "type": "string" + }, + "subtitle": { + "type": "string" + } + }, + "required": [ + "label", + "subtitle" + ], + "type": "object" + }, "galleries": { "description": "What content is on the galleries page", "type": "string" @@ -9403,7 +9440,9 @@ "guide", "projects", "galleries", - "rights" + "rights", + "community", + "contribute" ], "type": "object" }, @@ -9413,7 +9452,6 @@ } }, "required": [ - "call", "value", "description", "beta",