Skip to content

Commit 715eb13

Browse files
Only enable locale selector when multiple are available
Co-authored-by: Marcus Ortiz <[email protected]>
1 parent 8e4e47f commit 715eb13

File tree

16 files changed

+140
-33
lines changed

16 files changed

+140
-33
lines changed

src/App.vue

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@
2626
<slot :isTargetIDE="isTargetIDE">
2727
<router-view class="router-content" />
2828
<custom-footer v-if="hasCustomFooter" :data-color-scheme="preferredColorScheme" />
29-
<Footer v-else-if="!isTargetIDE" :enablei18n="enablei18n" />
29+
<Footer v-else-if="!isTargetIDE">
30+
<template #default="{ className }">
31+
<div v-if="enablei18n" :class="className">
32+
<LocaleSelector />
33+
</div>
34+
</template>
35+
</Footer>
3036
</slot>
3137
<slot name="footer" :isTargetIDE="isTargetIDE" />
3238
</div>
@@ -42,13 +48,15 @@ import { fetchThemeSettings, themeSettingsState, getSetting } from 'docc-render/
4248
import { objectToCustomProperties } from 'docc-render/utils/themes';
4349
import { AppTopID } from 'docc-render/constants/AppTopID';
4450
import SuggestLang from 'docc-render/components/SuggestLang.vue';
51+
import LocaleSelector from 'docc-render/components/LocaleSelector.vue';
4552
4653
export default {
4754
name: 'CoreApp',
4855
components: {
4956
Footer,
5057
InitialLoadingPlaceholder,
5158
SuggestLang,
59+
LocaleSelector,
5260
},
5361
provide() {
5462
return {
@@ -69,6 +77,7 @@ export default {
6977
computed: {
7078
currentColorScheme: ({ appState }) => appState.systemColorScheme,
7179
preferredColorScheme: ({ appState }) => appState.preferredColorScheme,
80+
availableLocales: ({ appState }) => appState.availableLocales,
7281
CSSCustomProperties: ({
7382
currentColorScheme,
7483
preferredColorScheme,
@@ -85,7 +94,9 @@ export default {
8594
),
8695
hasCustomHeader: () => !!window.customElements.get('custom-header'),
8796
hasCustomFooter: () => !!window.customElements.get('custom-footer'),
88-
enablei18n: () => getSetting(['features', 'docs', 'i18n', 'enable'], false),
97+
enablei18n: ({ availableLocales }) => (
98+
getSetting(['features', 'docs', 'i18n', 'enable'], false) && availableLocales.length > 1
99+
),
89100
},
90101
props: {
91102
enableThemeSettings: {

src/components/Article.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<script>
3535
import { PortalTarget } from 'portal-vue';
3636
37+
import AppStore from 'docc-render/stores/AppStore';
3738
import NavigationBar from 'theme/components/Tutorial/NavigationBar.vue';
3839
import metadata from 'theme/mixins/metadata.js';
3940
import Body from './Article/Body.vue';
@@ -166,6 +167,7 @@ export default {
166167
},
167168
},
168169
created() {
170+
AppStore.setAvailableLocales(this.metadata.availableLocales);
169171
this.store.reset();
170172
this.store.setReferences(this.references);
171173
},
@@ -174,6 +176,9 @@ export default {
174176
references(references) {
175177
this.store.setReferences(references);
176178
},
179+
'metadata.availableLocales': function availableLocalesWatcher(availableLocales) {
180+
AppStore.setAvailableLocales(availableLocales);
181+
},
177182
},
178183
SectionKind,
179184
};

src/components/DocumentationTopic.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ import metadata from 'theme/mixins/metadata.js';
151151
import { buildUrl } from 'docc-render/utils/url-helper';
152152
import { normalizeRelativePath } from 'docc-render/utils/assets';
153153
154+
import AppStore from 'docc-render/stores/AppStore';
154155
import Aside from 'docc-render/components/ContentNode/Aside.vue';
155156
import BetaLegalText from 'theme/components/DocumentationTopic/BetaLegalText.vue';
156157
import LanguageSwitcher from 'theme/components/DocumentationTopic/Summary/LanguageSwitcher.vue';
@@ -365,6 +366,10 @@ export default {
365366
required: false,
366367
validator: v => Object.prototype.hasOwnProperty.call(StandardColors, v),
367368
},
369+
availableLocales: {
370+
type: Array,
371+
required: false,
372+
},
368373
},
369374
provide() {
370375
// NOTE: this is not reactive: if this.identifier change, the provided value
@@ -533,6 +538,7 @@ export default {
533538
conformance,
534539
hasNoExpandedDocumentation,
535540
modules,
541+
availableLocales,
536542
platforms,
537543
required: isRequirement = false,
538544
roleHeading,
@@ -574,6 +580,7 @@ export default {
574580
downloadNotAvailableSummary,
575581
diffAvailability,
576582
hasNoExpandedDocumentation,
583+
availableLocales,
577584
hierarchy,
578585
role,
579586
identifier,
@@ -621,6 +628,7 @@ export default {
621628
});
622629
}
623630
631+
AppStore.setAvailableLocales(this.availableLocales || []);
624632
this.store.reset();
625633
this.store.setReferences(this.references);
626634
},
@@ -629,6 +637,9 @@ export default {
629637
references(references) {
630638
this.store.setReferences(references);
631639
},
640+
availableLocales(availableLocales) {
641+
AppStore.setAvailableLocales(availableLocales);
642+
},
632643
},
633644
};
634645
</script>

src/components/Footer.vue

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,16 @@
1313
<div class="row">
1414
<ColorSchemeToggle />
1515
</div>
16-
<div v-if="enablei18n" class="row">
17-
<LocaleSelector/>
18-
</div>
16+
<slot className="row"/>
1917
</footer>
2018
</template>
2119

2220
<script>
2321
import ColorSchemeToggle from 'docc-render/components/ColorSchemeToggle.vue';
24-
import LocaleSelector from 'docc-render/components/LocaleSelector.vue';
2522
2623
export default {
2724
name: 'Footer',
28-
components: { ColorSchemeToggle, LocaleSelector },
29-
props: {
30-
enablei18n: {
31-
type: Boolean,
32-
default: false,
33-
},
34-
},
25+
components: { ColorSchemeToggle },
3526
};
3627
</script>
3728

src/components/LocaleSelector.vue

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
<script>
3232
import ChevronThickIcon from 'theme/components/Icons/ChevronThickIcon.vue';
33-
import locales from 'theme/lang/locales.json';
33+
import appLocales from 'theme/lang/locales.json';
3434
import { updateLocale, getLocaleParam } from 'docc-render/utils/i18n-utils';
3535
import AppStore from 'docc-render/stores/AppStore';
3636
@@ -39,18 +39,19 @@ export default {
3939
components: {
4040
ChevronThickIcon,
4141
},
42-
data() {
43-
return {
44-
locales,
45-
};
46-
},
4742
methods: {
4843
updateRouter({ target: { value: slug } }) {
4944
this.$router.push(getLocaleParam(slug));
5045
AppStore.setPreferredLocale(slug);
5146
updateLocale(slug, this);
5247
},
5348
},
49+
computed: {
50+
availableLocales: () => AppStore.state.availableLocales,
51+
locales: ({ availableLocales }) => (
52+
appLocales.filter(({ code }) => availableLocales.includes(code))
53+
),
54+
},
5455
};
5556
5657
</script>

src/components/Tutorial.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<script>
3434
import { PortalTarget } from 'portal-vue';
3535
36+
import AppStore from 'docc-render/stores/AppStore';
3637
import CodeThemeStore from 'docc-render/stores/CodeThemeStore';
3738
import metadata from 'theme/mixins/metadata.js';
3839
import isClientMobile from 'docc-render/mixins/isClientMobile';
@@ -135,6 +136,7 @@ export default {
135136
},
136137
},
137138
created() {
139+
AppStore.setAvailableLocales(this.metadata.availableLocales);
138140
this.store.reset();
139141
this.store.setReferences(this.references);
140142
},
@@ -143,6 +145,9 @@ export default {
143145
references(references) {
144146
this.store.setReferences(references);
145147
},
148+
'metadata.availableLocales': function availableLocalesWatcher(availableLocales) {
149+
AppStore.setAvailableLocales(availableLocales);
150+
},
146151
},
147152
mounted() {
148153
this.$bridge.on('codeColors', this.handleCodeColorsChange);

src/components/TutorialsOverview.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
</template>
3636

3737
<script>
38+
import AppStore from 'docc-render/stores/AppStore';
3839
import TutorialsOverviewStore from 'docc-render/stores/TutorialsOverviewStore';
3940
import Nav from 'theme/components/TutorialsOverview/Nav.vue';
4041
import metadata from 'theme/mixins/metadata.js';
@@ -100,6 +101,7 @@ export default {
100101
};
101102
},
102103
created() {
104+
AppStore.setAvailableLocales(this.metadata.availableLocales);
103105
this.store.reset();
104106
this.store.setReferences(this.references);
105107
},
@@ -108,6 +110,9 @@ export default {
108110
references(references) {
109111
this.store.setReferences(references);
110112
},
113+
'metadata.availableLocales': function availableLocalesWatcher(availableLocales) {
114+
AppStore.setAvailableLocales(availableLocales);
115+
},
111116
},
112117
};
113118
</script>

src/lang/locales/en-US.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@
164164
"read-only": "Read-only",
165165
"error": {
166166
"unknown": "An unknown error occurred.",
167-
"image": "Image failed to load"
167+
"image": "Image failed to load",
168+
"not-found": "The page you're looking for can't be found."
168169
},
169170
"color-scheme": {
170171
"select": "Select a color scheme preference",

src/stores/AppStore.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import ColorScheme from 'docc-render/constants/ColorScheme';
1212
import ImageLoadingStrategy from 'docc-render/constants/ImageLoadingStrategy';
1313
import Settings from 'docc-render/utils/settings';
14+
import appLocales from 'theme/lang/locales.json';
1415

1516
const supportsAutoColorScheme = (typeof window.matchMedia !== 'undefined') && [
1617
ColorScheme.light,
@@ -28,6 +29,7 @@ export default {
2829
preferredLocale: Settings.preferredLocale,
2930
supportsAutoColorScheme,
3031
systemColorScheme: ColorScheme.light,
32+
availableLocales: [],
3133
},
3234
reset() {
3335
this.state.imageLoadingStrategy = process.env.VUE_APP_TARGET === 'ide'
@@ -43,6 +45,13 @@ export default {
4345
this.state.preferredColorScheme = value;
4446
Settings.preferredColorScheme = value;
4547
},
48+
setAllLocalesAreAvailable() {
49+
const allLocales = appLocales.map(locale => locale.code);
50+
this.state.availableLocales = allLocales;
51+
},
52+
setAvailableLocales(locales = []) {
53+
this.state.availableLocales = locales;
54+
},
4655
setPreferredLocale(locale) {
4756
this.state.preferredLocale = locale;
4857
Settings.preferredLocale = this.state.preferredLocale;

src/views/NotFound.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,20 @@
99
-->
1010

1111
<template>
12-
<GenericError message='The page you’re looking for can’t be found.'>
12+
<GenericError :message="$t('error.not-found')">
1313
<slot />
1414
</GenericError>
1515
</template>
1616

1717
<script>
1818
import GenericError from 'theme/components/GenericError.vue';
19+
import AppStore from 'docc-render/stores/AppStore';
1920
2021
export default {
2122
name: 'NotFound',
2223
components: { GenericError },
24+
created() {
25+
AppStore.setAllLocalesAreAvailable();
26+
},
2327
};
2428
</script>

0 commit comments

Comments
 (0)