@@ -4,9 +4,10 @@ import { useSnackbar } from 'notistack'
44import { Collapse } from 'react-collapse'
55import scrollParent from 'scrollparent'
66import tw , { css } from 'twin.macro'
7+ import { supportedLanguages } from '../../../../common/constant'
78
89import logger from '../../../../common/logger'
9- import { TranslateResult } from '../../../../common/types'
10+ import { SupportLanguageKeys , TranslateResult } from '../../../../common/types'
1011import IconButton from '../../../../components/IconButton'
1112import ArrowRight from '../../../../components/svg/ArrowRight'
1213import ClipboardCopy from '../../../../components/svg/ClipboardCopy'
@@ -23,6 +24,7 @@ const TranslationItem: React.FC<{
2324 const [ loading , setLoading ] = useState ( true )
2425 const [ error , setError ] = useState < string > ( )
2526 const [ result , setResult ] = useState < string [ ] > ( )
27+ const [ overrideLang , setOverrideLang ] = useState < string > ( )
2628 const [ dirty , setDirty ] = useState ( 0 )
2729 const [ collapse , setCollapse ] = useState ( true )
2830 const { enqueueSnackbar } = useSnackbar ( )
@@ -66,12 +68,16 @@ const TranslationItem: React.FC<{
6668 useEffect ( ( ) => {
6769 if ( ! config ) return
6870
71+ setResult ( undefined )
72+ setLoading ( true )
73+ setError ( undefined )
74+
6975 const res = client . send (
7076 'translate' ,
7177 {
7278 text : cleanText ( job . text ) ,
7379 id : job . id ,
74- targetLang : config . targetLang ,
80+ targetLang : overrideLang || config . targetLang ,
7581 } ,
7682 true ,
7783 ) as Promise < TranslateResult >
@@ -89,6 +95,7 @@ const TranslationItem: React.FC<{
8995 result . push ( ...item . text . split ( '\n' ) )
9096 } )
9197
98+ setError ( undefined )
9299 setResult ( result )
93100 setLoading ( false )
94101 } )
@@ -102,7 +109,7 @@ const TranslationItem: React.FC<{
102109 setLoading ( false )
103110 enqueueSnackbar ( `翻译失败:${ err . message } ` , { variant : 'error' } )
104111 } )
105- } , [ job , config , enqueueSnackbar , dirty ] )
112+ } , [ job , config , enqueueSnackbar , dirty , overrideLang ] )
106113
107114 return (
108115 < div tw = "p-3 text-gray-800 space-y-3 select-text" >
@@ -131,19 +138,19 @@ const TranslationItem: React.FC<{
131138 </ Collapse >
132139 </ div >
133140
134- { loading ? (
135- < div tw = "rounded bg-yellow-50 p-3 space-y-2 leading-normal" >
136- 翻译中…
137- </ div >
138- ) : undefined }
141+ < div tw = "rounded bg-yellow-50 p-3 space-y-2 leading-normal" >
142+ { error ? < span > { error } </ span > : undefined }
139143
140- { result ? (
141- < div tw = "rounded bg-yellow-50 p-3 space-y-2 leading-normal" >
142- { result . map ( ( item , index ) => (
143- < div key = { index } > { item } </ div >
144- ) ) }
145- </ div >
146- ) : undefined }
144+ { loading ? < span > { '翻译中…' } </ span > : undefined }
145+
146+ { result ? (
147+ < >
148+ { result . map ( ( item , index ) => (
149+ < div key = { index } > { item } </ div >
150+ ) ) }
151+ </ >
152+ ) : undefined }
153+ </ div >
147154 </ div >
148155 < div
149156 css = { [
@@ -154,12 +161,34 @@ const TranslationItem: React.FC<{
154161 }
155162 ` ,
156163 ] } >
157- < div >
164+ < div
165+ tw = "flex items-center space-x-3"
166+ css = { css `
167+ height : 35px ;
168+ ` } >
158169 { job . sourceLang && (
159- < div tw = "px-2 py-1 bg-green-50 text-green-600 text-sm rounded" >
170+ < div tw = "px-3 py-0 h-full flex items-center bg-green-50 text-green-600 text-sm rounded" >
160171 { job . sourceLang }
161172 </ div >
162173 ) }
174+ < div tw = "h-full" >
175+ { config ? (
176+ < select
177+ tw = "px-2 py-0 h-full rounded-md truncate border-none bg-blue-50 text-gray-800"
178+ css = { css `
179+ width : 100px ;
180+ ` }
181+ name = "target-lang"
182+ value = { overrideLang || config . targetLang }
183+ onChange = { ( e ) => setOverrideLang ( e . target . value ) } >
184+ { Object . keys ( supportedLanguages ) . map ( ( lang , index ) => (
185+ < option value = { lang } key = { index } >
186+ { supportedLanguages [ lang as SupportLanguageKeys ] }
187+ </ option >
188+ ) ) }
189+ </ select >
190+ ) : undefined }
191+ </ div >
163192 </ div >
164193 < div >
165194 { result ? (
0 commit comments