6
6
install ,
7
7
writeConfig
8
8
} from 'src/helpers'
9
- import React , { useContext , useEffect , useState } from 'react'
9
+ import React , { useContext , useEffect , useMemo , useState } from 'react'
10
10
11
11
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
12
12
import { faFolderOpen , faXmark } from '@fortawesome/free-solid-svg-icons'
@@ -43,6 +43,24 @@ type Props = {
43
43
44
44
const storage : Storage = window . localStorage
45
45
46
+ function getInstallLanguage (
47
+ availableLanguages : string [ ] ,
48
+ preferredLanguages : readonly string [ ]
49
+ ) {
50
+ const foundPreffered = preferredLanguages . find ( ( plang ) =>
51
+ availableLanguages . some ( ( alang ) => alang . startsWith ( plang ) )
52
+ )
53
+ if ( foundPreffered ) {
54
+ const foundAvailable = availableLanguages . find ( ( alang ) =>
55
+ alang . startsWith ( foundPreffered )
56
+ )
57
+ if ( foundAvailable ) {
58
+ return foundAvailable
59
+ }
60
+ }
61
+ return availableLanguages [ 0 ]
62
+ }
63
+
46
64
export default function InstallModal ( {
47
65
appName,
48
66
backdropClick,
@@ -52,6 +70,7 @@ export default function InstallModal({
52
70
storage . getItem ( appName ) || '{}'
53
71
) as InstallProgress
54
72
73
+ const { i18n } = useTranslation ( )
55
74
const { libraryStatus, handleGameStatus, platform } =
56
75
useContext ( ContextProvider )
57
76
const gameStatus : GameStatus = libraryStatus . filter (
@@ -160,7 +179,9 @@ export default function InstallModal({
160
179
setGameInfo ( gameInfo )
161
180
if ( gameInfo . manifest ?. languages ) {
162
181
setInstallLanguages ( gameInfo . manifest . languages )
163
- setInstallLanguage ( gameInfo . manifest . languages [ 0 ] )
182
+ setInstallLanguage (
183
+ getInstallLanguage ( gameInfo . manifest . languages , i18n . languages )
184
+ )
164
185
}
165
186
setIsLinuxNative ( gameData . is_linux_native && isLinux )
166
187
setIsMacNative ( gameData . is_mac_native && isMac )
@@ -170,7 +191,9 @@ export default function InstallModal({
170
191
appName
171
192
) ) as string [ ]
172
193
setInstallLanguages ( installer_languages )
173
- setInstallLanguage ( installer_languages [ 0 ] )
194
+ setInstallLanguage (
195
+ getInstallLanguage ( installer_languages , i18n . languages )
196
+ )
174
197
}
175
198
const regexp = new RegExp ( / [: | / | * | ? | < | > | \\ | & | { | } | % | $ | @ | ` | ! | ™ | + | ' ] / , 'gi' )
176
199
const fixedTitle = gameInfo . game . title
@@ -181,7 +204,7 @@ export default function InstallModal({
181
204
setWinePrefix ( sugestedWinePrefix )
182
205
}
183
206
getInfo ( )
184
- } , [ appName ] )
207
+ } , [ appName , i18n . languages ] )
185
208
186
209
const haveDLCs = gameInfo ?. game ?. owned_dlc ?. length > 0
187
210
const DLCList = gameInfo ?. game ?. owned_dlc
@@ -215,6 +238,24 @@ export default function InstallModal({
215
238
}
216
239
}
217
240
241
+ const getLanguageName = useMemo ( ( ) => {
242
+ return ( language : string ) => {
243
+ try {
244
+ const locale = language . replace ( '_' , '-' )
245
+ const displayNames = new Intl . DisplayNames (
246
+ [ locale , ...i18n . languages , 'en' ] ,
247
+ {
248
+ type : 'language' ,
249
+ style : 'long'
250
+ }
251
+ )
252
+ return displayNames . of ( locale )
253
+ } catch ( e ) {
254
+ return language
255
+ }
256
+ }
257
+ } , [ i18n . language ] )
258
+
218
259
return (
219
260
< span className = "modalContainer" >
220
261
{ gameInfo ?. game ?. title ? (
@@ -255,7 +296,7 @@ export default function InstallModal({
255
296
{ installLanguages &&
256
297
installLanguages . map ( ( value ) => (
257
298
< option value = { value } key = { value } >
258
- { value }
299
+ { getLanguageName ( value ) }
259
300
</ option >
260
301
) ) }
261
302
</ select >
0 commit comments