Skip to content

Commit 85adecc

Browse files
authored
[General] Improvements in language selector when installing game (#1127)
1 parent 489825a commit 85adecc

File tree

1 file changed

+46
-5
lines changed
  • src/screens/Library/components/InstallModal

1 file changed

+46
-5
lines changed

src/screens/Library/components/InstallModal/index.tsx

+46-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
install,
77
writeConfig
88
} from 'src/helpers'
9-
import React, { useContext, useEffect, useState } from 'react'
9+
import React, { useContext, useEffect, useMemo, useState } from 'react'
1010

1111
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
1212
import { faFolderOpen, faXmark } from '@fortawesome/free-solid-svg-icons'
@@ -43,6 +43,24 @@ type Props = {
4343

4444
const storage: Storage = window.localStorage
4545

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+
4664
export default function InstallModal({
4765
appName,
4866
backdropClick,
@@ -52,6 +70,7 @@ export default function InstallModal({
5270
storage.getItem(appName) || '{}'
5371
) as InstallProgress
5472

73+
const { i18n } = useTranslation()
5574
const { libraryStatus, handleGameStatus, platform } =
5675
useContext(ContextProvider)
5776
const gameStatus: GameStatus = libraryStatus.filter(
@@ -160,7 +179,9 @@ export default function InstallModal({
160179
setGameInfo(gameInfo)
161180
if (gameInfo.manifest?.languages) {
162181
setInstallLanguages(gameInfo.manifest.languages)
163-
setInstallLanguage(gameInfo.manifest.languages[0])
182+
setInstallLanguage(
183+
getInstallLanguage(gameInfo.manifest.languages, i18n.languages)
184+
)
164185
}
165186
setIsLinuxNative(gameData.is_linux_native && isLinux)
166187
setIsMacNative(gameData.is_mac_native && isMac)
@@ -170,7 +191,9 @@ export default function InstallModal({
170191
appName
171192
)) as string[]
172193
setInstallLanguages(installer_languages)
173-
setInstallLanguage(installer_languages[0])
194+
setInstallLanguage(
195+
getInstallLanguage(installer_languages, i18n.languages)
196+
)
174197
}
175198
const regexp = new RegExp(/[:|/|*|?|<|>|\\|&|{|}|%|$|@|`|!||+|']/, 'gi')
176199
const fixedTitle = gameInfo.game.title
@@ -181,7 +204,7 @@ export default function InstallModal({
181204
setWinePrefix(sugestedWinePrefix)
182205
}
183206
getInfo()
184-
}, [appName])
207+
}, [appName, i18n.languages])
185208

186209
const haveDLCs = gameInfo?.game?.owned_dlc?.length > 0
187210
const DLCList = gameInfo?.game?.owned_dlc
@@ -215,6 +238,24 @@ export default function InstallModal({
215238
}
216239
}
217240

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+
218259
return (
219260
<span className="modalContainer">
220261
{gameInfo?.game?.title ? (
@@ -255,7 +296,7 @@ export default function InstallModal({
255296
{installLanguages &&
256297
installLanguages.map((value) => (
257298
<option value={value} key={value}>
258-
{value}
299+
{getLanguageName(value)}
259300
</option>
260301
))}
261302
</select>

0 commit comments

Comments
 (0)