Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbc6014d

Browse files
committed
docs: docs support i18n.md
1 parent4136348 commitbc6014d

File tree

64 files changed

+5808
-203
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+5808
-203
lines changed

‎docs/src/controller/index.ts‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,31 @@ export class Index {
2424
this.ctx.body=error
2525
}
2626
}
27+
28+
@Get('/zh/*')
29+
asynchandlerZh():Promise<void>{
30+
try{
31+
conststream=awaitrender<Readable>(this.ctx,{
32+
stream:false,
33+
prefix:'/zh'
34+
})
35+
this.ctx.body=stream
36+
}catch(error){
37+
console.log(error)
38+
this.ctx.body=error
39+
}
40+
}
41+
@Get('/en/*')
42+
asynchandlerEn():Promise<void>{
43+
try{
44+
conststream=awaitrender<Readable>(this.ctx,{
45+
stream:false,
46+
prefix:'/en'
47+
})
48+
this.ctx.body=stream
49+
}catch(error){
50+
console.log(error)
51+
this.ctx.body=error
52+
}
53+
}
2754
}

‎docs/web/components/footer/index.vue‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,26 @@
2626

2727
<script lang="ts">
2828
import {defineComponent }from'vue'
29-
import {webSiteConfig }from'../../config/index'
29+
import {getWebSiteConfig }from'../../config/index'
30+
import {getCurrentLanguage }from'../../config/i18n'
31+
3032
exportdefaultdefineComponent({
3133
props: ['data'],
3234
data () {
3335
return {
34-
footerItems:webSiteConfig.footer.items
36+
currentLanguage:getCurrentLanguage(),
37+
footerItems: []asany[]
3538
}
3639
},
37-
methods: {}
40+
created() {
41+
this.updateConfig()
42+
},
43+
methods: {
44+
updateConfig() {
45+
const config=getWebSiteConfig(this.currentLanguage)
46+
this.footerItems=config.footer.items
47+
}
48+
}
3849
})
3950
</script>
4051

‎docs/web/components/header/index.less‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,81 @@
9999
flex-wrap:nowrap;
100100
width:100%;
101101
justify-content:space-evenly;
102+
align-items:center;
102103
a {
103104
padding:3px15px;
104105
}
105106
}
107+
108+
.language-switcher {
109+
position:relative;
110+
display:inline-block;
111+
112+
.language-current {
113+
padding:3px15px;
114+
font-size:14px;
115+
font-weight:700;
116+
color:#000;
117+
cursor:pointer;
118+
display:flex;
119+
align-items:center;
120+
user-select:none;
121+
122+
&:hover {
123+
color:rgb(4,195,142);
124+
}
125+
126+
.language-arrow {
127+
margin-left:5px;
128+
font-size:10px;
129+
transition: transform0.3s;
130+
}
131+
132+
&:hover.language-arrow {
133+
transform:rotate(180deg);
134+
}
135+
}
136+
137+
.language-menu {
138+
position:absolute;
139+
top:100%;
140+
right:0;
141+
background:white;
142+
border:1pxsolid#e0e0e0;
143+
border-radius:4px;
144+
box-shadow:02px8pxrgba(0,0,0,0.1);
145+
min-width:120px;
146+
z-index:1000;
147+
148+
.language-option {
149+
padding:8px15px;
150+
font-size:14px;
151+
color:#000;
152+
cursor:pointer;
153+
white-space:nowrap;
154+
155+
&:hover {
156+
background-color:#f5f5f5;
157+
color:rgb(4,195,142);
158+
}
159+
160+
&.active {
161+
background-color:rgb(4,195,142);
162+
color:white;
163+
}
164+
165+
&:first-child {
166+
border-top-left-radius:4px;
167+
border-top-right-radius:4px;
168+
}
169+
170+
&:last-child {
171+
border-bottom-left-radius:4px;
172+
border-bottom-right-radius:4px;
173+
}
174+
}
175+
}
176+
}
106177
.nav_left {
107178
flex:1;
108179
}

‎docs/web/components/header/index.vue‎

Lines changed: 75 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<divclass="header">
33
<divclass="header__left">
4-
<router-linkclass="logo"to="/">
4+
<router-linkclass="logo":to="`/${currentLanguage}/`">
55
<imgsrc="/images/logo.jpeg"alt="">
66
</router-link>
77
</div>
@@ -11,22 +11,43 @@
1111
<router-linkv-for="item in (isMobile ? headerItems.slice(0, 3) : headerItems)":key="item.path":to="item.path">
1212
{{ item.label }}
1313
</router-link>
14-
<atarget="__black"href="https://github.com/zhangyuang/ssr">
15-
Github
14+
<atarget="_blank"href="https://github.com/zhangyuang/ssr">
15+
{{ t('header.github') }}
1616
</a>
17-
<atarget="__black"href="http://doc.ssr-fc.com/docs/features$sponsor">
18-
项目捐赠
17+
<atarget="_blank":href="`/${currentLanguage}/docs/features$sponsor`">
18+
{{ t('header.donation') }}
19+
</a>
20+
21+
<!-- Language Switcher-->
22+
<divclass="language-switcher"v-if="!isMobile">
23+
<divclass="language-current"@click="toggleLanguageMenu">
24+
{{ getCurrentLanguageDisplay() }}
25+
<spanclass="language-arrow">▼</span>
26+
</div>
27+
<divclass="language-menu"v-show="showLanguageMenu">
28+
<div
29+
v-for="lang in availableLanguages"
30+
:key="lang.code"
31+
class="language-option"
32+
:class="{ active: lang.code === currentLanguage }"
33+
@click="switchToLanguage(lang.code)"
34+
>
35+
{{ lang.nativeName }}
36+
</div>
37+
</div>
38+
</div>
39+
40+
<av-if="!isMobile"href="https://github.com/zhangyuang/ssr"target="_blank">
41+
<imgsrc="https://img.shields.io/github/stars/zhangyuang/ssr.svg?color=000"alt="Node"style="width:80px">
1942
</a>
20-
<av-if="!isMobile"href="https://github.com/zhangyuang/ssr"target="_blank"><img
21-
src="https://img.shields.io/github/stars/zhangyuang/ssr.svg?color=000"alt="Node"style="width:80px"></a>
22-
2343
</div>
2444
</div>
2545
</template>
2646

2747
<script lang="ts">
2848
import {defineComponent }from'vue'
29-
import {webSiteConfig }from'@/config/index'
49+
import {getWebSiteConfig }from'@/config/index'
50+
import {getCurrentLanguage,t,switchLanguage,i18nConfig }from'@/config/i18n'
3051
importsearchBoxfrom'../searchBox/index.vue'
3152
3253
exportdefaultdefineComponent({
@@ -36,13 +57,56 @@ export default defineComponent({
3657
inject: ['asyncData'],
3758
data() {
3859
return {
39-
headerItems:webSiteConfig.header.items,
40-
isMobile:true
60+
currentLanguage:getCurrentLanguage(),
61+
headerItems: []asany[],
62+
isMobile:true,
63+
showLanguageMenu:false,
64+
availableLanguages:i18nConfig.languages
4165
}
4266
},
4367
created() {
4468
const { isMobile }=this.asyncData.value
4569
this.isMobile=isMobile
70+
this.updateConfig()
71+
72+
// Close language menu when clicking outside
73+
if (typeofwindow!=='undefined') {
74+
document.addEventListener('click',this.handleDocumentClick)
75+
}
76+
},
77+
beforeUnmount() {
78+
if (typeofwindow!=='undefined') {
79+
document.removeEventListener('click',this.handleDocumentClick)
80+
}
81+
},
82+
methods: {
83+
updateConfig() {
84+
const config=getWebSiteConfig(this.currentLanguage)
85+
this.headerItems=config.header.items
86+
},
87+
t(key:string) {
88+
returnt(key,this.currentLanguage)
89+
},
90+
getCurrentLanguageDisplay() {
91+
const lang=this.availableLanguages.find(l=>l.code===this.currentLanguage)
92+
returnlang?lang.nativeName:'English'
93+
},
94+
toggleLanguageMenu() {
95+
this.showLanguageMenu=!this.showLanguageMenu
96+
},
97+
switchToLanguage(langCode:string) {
98+
if (langCode!==this.currentLanguage) {
99+
switchLanguage(langCode)
100+
}
101+
this.showLanguageMenu=false
102+
},
103+
handleDocumentClick(event:Event) {
104+
const target=event.targetasHTMLElement
105+
const languageSwitcher=target.closest('.language-switcher')
106+
if (!languageSwitcher) {
107+
this.showLanguageMenu=false
108+
}
109+
}
46110
}
47111
})
48112
</script>

‎docs/web/components/menu/index.vue‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
<script lang="ts">
2929
import {defineComponent }from'vue'
30+
import {getCurrentLanguage }from'@/config/i18n'
3031
3132
exportdefaultdefineComponent({
3233
inject: ['asyncData'],
@@ -37,7 +38,8 @@ export default defineComponent({
3738
},
3839
watch: {
3940
$route (val) {
40-
const path=val.path.replace('/docs/','').replace('$','/')
41+
const lang=getCurrentLanguage()
42+
const path=val.path.replace(`/${lang}/docs/`,'').replace(/\$/g,'/')
4143
this.createMenu({
4244
config:this.asyncData.value.config,
4345
pagePath:path

‎docs/web/components/searchBox/matchQuery/index.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import{config}from'@/pages/docs/config'
2+
import{getCurrentLanguage}from'~/web/config/i18n'
23
import{handleMarkdown}from'./markdownUtils'
34

45
interfaceISearchItem{
@@ -27,7 +28,7 @@ const standardConfig: IFileConfig[] = []
2728
// 读取文件内容
2829
constreadFile=async(path:string)=>{
2930
try{
30-
return(awaitimport(`../../../markdown/${path}.md`)).default
31+
return(awaitimport(`@/markdown/${getCurrentLanguage()}/${path}.md`)).default
3132
}catch(e){
3233
console.log('readFile error:',e,'.path:',path)
3334
return''

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp