From a6a488f5a077a681c9d9342ea4029e27e02bd350 Mon Sep 17 00:00:00 2001 From: Marcus Ortiz Date: Fri, 19 Sep 2025 15:01:00 -0700 Subject: [PATCH 1/2] Prefer `availableLanguages` over `availableLocales` when available. --- src/components/Article.vue | 7 ++++- src/components/DocumentationTopic.vue | 11 ++++++- src/components/Tutorial.vue | 7 ++++- src/components/TutorialsOverview.vue | 7 ++++- tests/unit/components/Article.spec.js | 31 +++++++++++++++++++ .../components/DocumentationTopic.spec.js | 18 +++++++++++ tests/unit/components/Tutorial.spec.js | 31 +++++++++++++++++++ .../unit/components/TutorialsOverview.spec.js | 31 +++++++++++++++++++ 8 files changed, 139 insertions(+), 4 deletions(-) diff --git a/src/components/Article.vue b/src/components/Article.vue index f95bbc71e..8f1ebe8bd 100644 --- a/src/components/Article.vue +++ b/src/components/Article.vue @@ -167,7 +167,9 @@ export default { }, }, created() { - AppStore.setAvailableLocales(this.metadata.availableLocales); + AppStore.setAvailableLocales( + this.metadata.availableLanguages ?? this.metadata.availableLocales, + ); this.store.reset(); this.store.setReferences(this.references); }, @@ -179,6 +181,9 @@ export default { 'metadata.availableLocales': function availableLocalesWatcher(availableLocales) { AppStore.setAvailableLocales(availableLocales); }, + 'metadata.availableLanguages': function availableLanguagesWatcher(availableLanguages) { + AppStore.setAvailableLocales(availableLanguages); + }, }, SectionKind, }; diff --git a/src/components/DocumentationTopic.vue b/src/components/DocumentationTopic.vue index 23c110f9d..2146647aa 100644 --- a/src/components/DocumentationTopic.vue +++ b/src/components/DocumentationTopic.vue @@ -404,6 +404,10 @@ export default { required: false, validator: v => Object.prototype.hasOwnProperty.call(StandardColors, v), }, + availableLanguages: { + type: Array, + required: false, + }, availableLocales: { type: Array, required: false, @@ -624,6 +628,7 @@ export default { conformance, hasNoExpandedDocumentation, modules, + availableLanguages, availableLocales, platforms, required: isRequirement = false, @@ -666,6 +671,7 @@ export default { downloadNotAvailableSummary, diffAvailability, hasNoExpandedDocumentation, + availableLanguages, availableLocales, hierarchy, role, @@ -717,7 +723,7 @@ export default { }); } - AppStore.setAvailableLocales(this.availableLocales || []); + AppStore.setAvailableLocales(this.availableLanguages ?? this.availableLocales); this.store.reset(); this.store.setReferences(this.references); }, @@ -729,6 +735,9 @@ export default { references(references) { this.store.setReferences(references); }, + availableLanguages(availableLanguages) { + AppStore.setAvailableLocales(availableLanguages); + }, availableLocales(availableLocales) { AppStore.setAvailableLocales(availableLocales); }, diff --git a/src/components/Tutorial.vue b/src/components/Tutorial.vue index 4e3bcb583..f31545afb 100644 --- a/src/components/Tutorial.vue +++ b/src/components/Tutorial.vue @@ -135,7 +135,9 @@ export default { }, }, created() { - AppStore.setAvailableLocales(this.metadata.availableLocales); + AppStore.setAvailableLocales( + this.metadata.availableLanguages ?? this.metadata.availableLocales, + ); this.store.reset(); this.store.setReferences(this.references); }, @@ -147,6 +149,9 @@ export default { 'metadata.availableLocales': function availableLocalesWatcher(availableLocales) { AppStore.setAvailableLocales(availableLocales); }, + 'metadata.availableLanguages': function availableLanguagesWatcher(availableLanguages) { + AppStore.setAvailableLocales(availableLanguages); + }, }, mounted() { this.$bridge.on('codeColors', this.handleCodeColorsChange); diff --git a/src/components/TutorialsOverview.vue b/src/components/TutorialsOverview.vue index e0200182b..f5fd1c589 100644 --- a/src/components/TutorialsOverview.vue +++ b/src/components/TutorialsOverview.vue @@ -101,7 +101,9 @@ export default { }; }, created() { - AppStore.setAvailableLocales(this.metadata.availableLocales); + AppStore.setAvailableLocales( + this.metadata.availableLanguages ?? this.metadata.availableLocales, + ); this.store.reset(); this.store.setReferences(this.references); }, @@ -113,6 +115,9 @@ export default { 'metadata.availableLocales': function availableLocalesWatcher(availableLocales) { AppStore.setAvailableLocales(availableLocales); }, + 'metadata.availableLanguages': function availableLanguagesWatcher(availableLanguages) { + AppStore.setAvailableLocales(availableLanguages); + }, }, }; diff --git a/tests/unit/components/Article.spec.js b/tests/unit/components/Article.spec.js index 431ba7ae3..e6a53e1af 100644 --- a/tests/unit/components/Article.spec.js +++ b/tests/unit/components/Article.spec.js @@ -17,6 +17,7 @@ import Hero from 'docc-render/components/Article/Hero.vue'; import NavigationBar from 'docc-render/components/Tutorial/NavigationBar.vue'; import TopicStore from 'docc-render/stores/TopicStore'; import { PortalTarget } from 'portal-vue'; +import AppStore from 'docc-render/stores/AppStore'; const { SectionKind } = Article; @@ -199,6 +200,36 @@ describe('Article', () => { }); expect(wrapper.text()).toContain('Above Hero Text'); }); + + it('sets available langs/locales', async () => { + const locales = ['en-US', 'ja-JP']; + const langs = ['en', 'jp']; + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLocales: locales, + }, + }); + expect(AppStore.state.availableLocales).toEqual(locales); + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLanguages: langs, + }, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLanguages: langs, + availableLocales: locales, + }, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + }); }); describe('with `isTargetIDE`', () => { diff --git a/tests/unit/components/DocumentationTopic.spec.js b/tests/unit/components/DocumentationTopic.spec.js index c544df6be..29b59532d 100644 --- a/tests/unit/components/DocumentationTopic.spec.js +++ b/tests/unit/components/DocumentationTopic.spec.js @@ -20,6 +20,7 @@ import OnThisPageNav from '@/components/OnThisPageNav.vue'; import OnThisPageStickyContainer from '@/components/DocumentationTopic/OnThisPageStickyContainer.vue'; import Declaration from '@/components/DocumentationTopic/PrimaryContent/Declaration.vue'; +import AppStore from '@/stores/AppStore'; const { ON_THIS_PAGE_CONTAINER_BREAKPOINT } = DocumentationTopic.constants; @@ -1175,6 +1176,23 @@ describe('DocumentationTopic', () => { expect(mockStore.setReferences).toHaveBeenCalledWith(newReferences); }); + it('sets available languages/locales', async () => { + const locales = ['en-US', 'ja-JP']; + const langs = ['en', 'jp']; + + await wrapper.setProps({ availableLocales: locales }); + expect(AppStore.state.availableLocales).toEqual(locales); + + await wrapper.setProps({ availableLanguages: langs }); + expect(AppStore.state.availableLocales).toEqual(langs); + + await wrapper.setProps({ + availableLanguages: langs, + availableLocales: locales, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + }); + it('calls `store.updateReferences` when `indexState.includedArchiveIdentifiers` changes', async () => { const store = { state: { references: {} }, diff --git a/tests/unit/components/Tutorial.spec.js b/tests/unit/components/Tutorial.spec.js index 85f64c530..60af943bc 100644 --- a/tests/unit/components/Tutorial.spec.js +++ b/tests/unit/components/Tutorial.spec.js @@ -15,6 +15,7 @@ import Tutorial from 'docc-render/components/Tutorial.vue'; import SectionList from 'docc-render/components/Tutorial/SectionList.vue'; import NavigationBar from 'docc-render/components/Tutorial/NavigationBar.vue'; import TopicStore from 'docc-render/stores/TopicStore'; +import AppStore from 'docc-render/stores/AppStore'; const { Section, BreakpointEmitter, PortalTarget } = Tutorial.components; @@ -239,6 +240,36 @@ describe('Tutorial', () => { expect(target.exists()).toBe(true); expect(target.props()).toHaveProperty('name', 'modal-destination'); }); + + it('sets available langs/locales', async () => { + const locales = ['en-US', 'ja-JP']; + const langs = ['en', 'jp']; + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLocales: locales, + }, + }); + expect(AppStore.state.availableLocales).toEqual(locales); + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLanguages: langs, + }, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLanguages: langs, + availableLocales: locales, + }, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + }); }); describe('Tutorial without hero section', () => { diff --git a/tests/unit/components/TutorialsOverview.spec.js b/tests/unit/components/TutorialsOverview.spec.js index f3f0f9b22..4a9594b02 100644 --- a/tests/unit/components/TutorialsOverview.spec.js +++ b/tests/unit/components/TutorialsOverview.spec.js @@ -10,6 +10,7 @@ import { shallowMount } from '@vue/test-utils'; import TutorialsOverview from 'docc-render/components/TutorialsOverview.vue'; +import AppStore from 'docc-render/stores/AppStore'; const { Hero, @@ -118,4 +119,34 @@ describe('TutorialsOverview', () => { }); expect(wrapper.text()).toContain('Above Hero Content'); }); + + it('sets available langs/locales', async () => { + const locales = ['en-US', 'ja-JP']; + const langs = ['en', 'jp']; + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLocales: locales, + }, + }); + expect(AppStore.state.availableLocales).toEqual(locales); + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLanguages: langs, + }, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + + await wrapper.setProps({ + metadata: { + ...propsData.metadata, + availableLanguages: langs, + availableLocales: locales, + }, + }); + expect(AppStore.state.availableLocales).toEqual(langs); + }); }); From 138886b38bef668ee20ca89642c011d156e0f1d3 Mon Sep 17 00:00:00 2001 From: Marcus Ortiz Date: Fri, 19 Sep 2025 15:24:27 -0700 Subject: [PATCH 2/2] Ensure langs always get preference over locales. --- src/components/Article.vue | 2 +- src/components/DocumentationTopic.vue | 2 +- src/components/Tutorial.vue | 2 +- src/components/TutorialsOverview.vue | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Article.vue b/src/components/Article.vue index 8f1ebe8bd..1d31fe870 100644 --- a/src/components/Article.vue +++ b/src/components/Article.vue @@ -179,7 +179,7 @@ export default { this.store.setReferences(references); }, 'metadata.availableLocales': function availableLocalesWatcher(availableLocales) { - AppStore.setAvailableLocales(availableLocales); + AppStore.setAvailableLocales(this.metadata?.availableLanguages ?? availableLocales); }, 'metadata.availableLanguages': function availableLanguagesWatcher(availableLanguages) { AppStore.setAvailableLocales(availableLanguages); diff --git a/src/components/DocumentationTopic.vue b/src/components/DocumentationTopic.vue index 2146647aa..d7dd22134 100644 --- a/src/components/DocumentationTopic.vue +++ b/src/components/DocumentationTopic.vue @@ -739,7 +739,7 @@ export default { AppStore.setAvailableLocales(availableLanguages); }, availableLocales(availableLocales) { - AppStore.setAvailableLocales(availableLocales); + AppStore.setAvailableLocales(this.availableLanguages ?? availableLocales); }, }, }; diff --git a/src/components/Tutorial.vue b/src/components/Tutorial.vue index f31545afb..8d214e603 100644 --- a/src/components/Tutorial.vue +++ b/src/components/Tutorial.vue @@ -147,7 +147,7 @@ export default { this.store.setReferences(references); }, 'metadata.availableLocales': function availableLocalesWatcher(availableLocales) { - AppStore.setAvailableLocales(availableLocales); + AppStore.setAvailableLocales(this.metadata?.availableLanguages ?? availableLocales); }, 'metadata.availableLanguages': function availableLanguagesWatcher(availableLanguages) { AppStore.setAvailableLocales(availableLanguages); diff --git a/src/components/TutorialsOverview.vue b/src/components/TutorialsOverview.vue index f5fd1c589..309442cf1 100644 --- a/src/components/TutorialsOverview.vue +++ b/src/components/TutorialsOverview.vue @@ -113,7 +113,7 @@ export default { this.store.setReferences(references); }, 'metadata.availableLocales': function availableLocalesWatcher(availableLocales) { - AppStore.setAvailableLocales(availableLocales); + AppStore.setAvailableLocales(this.metadata?.availableLanguages ?? availableLocales); }, 'metadata.availableLanguages': function availableLanguagesWatcher(availableLanguages) { AppStore.setAvailableLocales(availableLanguages);