Patreon Logo Support us on Patreon to keep GamingOnLinux alive. This ensures all of our main content remains free for everyone. Just good, fresh content! Alternatively, you can donate through PayPal Logo PayPal. You can also buy games using our partner links for GOG and Humble Store.
Title: How to force game language on Lutris??
Some games don't have an option for to set the language manually; they use some system data...

I discovered that the steam game [ENSLAVED](https://store.steampowered.com/app/245280/ENSLAVED_Odyssey_to_the_West_Premium_Edition/) is actually [b]DRMFREE[/b!!! I am able to load and play it from one of my Lutris prefixes (the EA APP prefix), but the game only load in English and I want to play it in Spanish.
If I run it via Steam, is works in Spanish... SO, I am missing something here..
This topic has an answer marked - jump to answer.
Ehvis 6 Jun 2022
User Avatar
  • Supporter Plus
Use the system options to set the environment variable LANG to something appropriate for what you want and see if that works.
Quoting: EhvisUse the system options to set the environment variable LANG to something appropriate for what you want and see if that works.
Like this?
External Media: You need to be logged in to view this.


It doesn't work.
Ehvis 8 Jun 2022
User Avatar
  • Supporter Plus
Replace LC_ALL with LANG.
still no luck.
x_wing 8 Jun 2022
I know this will sound a little bit hacky but: If the language is set by an environment variable we can check that by the program environment. So, run the game, search the PID and cat /proc/${PID}/environ.
How to do that, exactly? step by step, please
x_wing 8 Jun 2022
Quoting: Comandante ÑoñardoHow to do that, exactly? step by step, please
  • Search for your game bin name (browse local files from Steam)

  • Start your game with any language different to spanish

  • Minimimize and open a terminal

  • run: ps -A | grep YOUR_GAME_BIN_NAME

  • Copy the number you see in the first column

  • run: cat /proc/${NUMBER}/environ

  • Copy that output to a file



Then follow this steps with your game running with spanish and then compare the both files you got. If the game language is set by an environment variable, you should be able to see it.

Anyway, I just tested this procedure with one of my games and I couldn't find any env variable that sets the name. So, reading a little bit on the Steam docs I can see that Steam api has an [specific function](https://partner.steamgames.com/doc/api/ISteamApps#GetCurrentGameLanguage) that selects the game language. If every Steam game works this way, then your best chance to setup the correct game name will be by using [goldberg emulator](https://github.com/su6ur6an/goldberg_emulator) and [setup language.txt](https://github.com/su6ur6an/goldberg_emulator/blob/master/Readme_release.txt) with the correct output.

BTW, the latest binary release of goldberg emulator it's quite old, you may have to compile the emulator for you distro.

Last edited by x_wing on 8 Jun 2022 at 11:02 pm UTC
Order "Run" not found.

Edit;
Ups!

SHELL=/bin/bashSESSION_MANAGER=local/Benitez-PC:@/tmp/.ICE-unix/2034,unix/Benitez-PC:/tmp/.ICE-unix/2034QT_ACCESSIBILITY=1XDG_CONFIG_DIRS=/etc/xdg/xdg-cinnamon:/etc/xdgXDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session1GNOME_DESKTOP_SESSION_ID=this-is-deprecatedGTK_IM_MODULE=ibusGTK2_MODULES=overlay-scrollbarLANGUAGE=es_AR:esQT4_IM_MODULE=ibusMANDATORY_PATH=/usr/share/gconf/cinnamon.mandatory.pathSSH_AUTH_SOCK=/run/user/1001/keyring/ssh__GL_SHADER_DISK_CACHE_PATH=/mnt/epic-games-store/Enslaved/Binaries/Win32XMODIFIERS=@im=ibusDESKTOP_SESSION=cinnamonSSH_AGENT_PID=2149WINE_MONO_CACHE_DIR=/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/monoGST_PLUGIN_SYSTEM_PATH_1_0=/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/lib64/gstreamer-1.0/:/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/lib/gstreamer-1.0/GTK_MODULES=gail:atk-bridgeXDG_SEAT=seat0PWD=/mnt/epic-games-store/Enslaved/Binaries/Win32XDG_SESSION_DESKTOP=cinnamonLOGNAME=carlosXDG_SESSION_TYPE=x11DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1GPG_AGENT_INFO=/run/user/1001/gnupg/S.gpg-agent:0:1WINEESYNC=1XAUTHORITY=/home/carlos/.XauthorityXDG_GREETER_DATA_DIR=/var/lib/lightdm-data/carlosLUTRIS_GAME_UUID=fdcd8cec-d19c-4245-bce2-317aa68c704fGDM_LANG=es_ARWINEARCH=win64HOME=/home/carlosLANG=es_ES.utf-8WINEPREFIX=/mnt/InstalledGames/Lutris/ea-desktopXDG_CURRENT_DESKTOP=X-CinnamonDXVK_LOG_LEVEL=noneXDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0DXVK_ENABLE_NVAPI=1CLUTTER_IM_MODULE=ibusWINEDLLOVERRIDES=d3d10core,d3d11,d3d12,d3d9,d3dcompiler_33,d3dcompiler_34,d3dcompiler_35,d3dcompiler_36,d3dcompiler_37,d3dcompiler_38,d3dcompiler_39,d3dcompiler_40,d3dcompiler_41,d3dcompiler_42,d3dcompiler_43,d3dcompiler_46,d3dcompiler_47,d3dx10,d3dx10_33,d3dx10_34,d3dx10_35,d3dx10_36,d3dx10_37,d3dx10_38,d3dx10_39,d3dx10_40,d3dx10_41,d3dx10_42,d3dx10_43,d3dx11_42,d3dx11_43,d3dx9_24,d3dx9_25,d3dx9_26,d3dx9_27,d3dx9_28,d3dx9_29,d3dx9_30,d3dx9_31,d3dx9_32,d3dx9_33,d3dx9_34,d3dx9_35,d3dx9_36,d3dx9_37,d3dx9_38,d3dx9_39,d3dx9_40,d3dx9_41,d3dx9_42,d3dx9_43,dxgi,nvapi,nvapi64,nvml=n;winemenubuilder=XDG_SESSION_CLASS=user__GL_SHADER_DISK_CACHE=1GTK_OVERLAY_SCROLLING=0DEFAULTS_PATH=/usr/share/gconf/cinnamon.default.pathPROTON_EAC_RUNTIME=/home/carlos/.local/share/lutris/runtime/eac_runtimeUSER=carlosWINE_LARGE_ADDRESS_AWARE=1game_name=EnslavedDISPLAY=:0SHLVL=0WINE_GECKO_CACHE_DIR=/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/geckoQT_IM_MODULE=ibusXDG_VTNR=7XDG_SESSION_ID=c3WINEDEBUG=-allLD_LIBRARY_PATH=/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/lib:/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/lib64:/usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu:/lib/x86_64-linux-gnu:/lib/i386-linux-gnu:/usr/lib:/lib:/usr/lib/i386-linux-gnu/sse2:/usr/lib/i386-linux-gnu/i686/sse2:/usr/lib/x86_64-linux-gnu/libfakeroot:/lib64:/home/carlos/.local/share/lutris/runtime/Ubuntu-18.04-i686:/home/carlos/.local/share/lutris/runtime/steam/i386/lib/i386-linux-gnu:/home/carlos/.local/share/lutris/runtime/steam/i386/lib:/home/carlos/.local/share/lutris/runtime/steam/i386/usr/lib/i386-linux-gnu:/home/carlos/.local/share/lutris/runtime/steam/i386/usr/lib:/home/carlos/.local/share/lutris/runtime/Ubuntu-18.04-x86_64:/home/carlos/.local/share/lutris/runtime/steam/amd64/lib/x86_64-linux-gnu:/home/carlos/.local/share/lutris/runtime/steam/amd64/lib:/home/carlos/.local/share/lutris/runtime/steam/amd64/usr/lib/x86_64-linux-gnu:/home/carlos/.local/share/lutris/runtime/steam/amd64/usr/libXDG_RUNTIME_DIR=/run/user/1001VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.jsonXDG_DATA_DIRS=/usr/share/gnome:/usr/share/cinnamon:/home/carlos/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/sharePATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/carlos/.local/binGDMSESSION=cinnamonDBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/busWINE=/home/carlos/.local/share/lutris/runners/wine/lutris-6.4-x86_64/bin/wineGIO_LAUNCHED_DESKTOP_FILE_PID=6752GIO_LAUNCHED_DESKTOP_FILE=/home/carlos/Escritorio/net.lutris.Lutris.desktopWINEFSYNC=0DXVK_NVAPIHACK=0WINE_FULLSCREEN_FSR=1PROTON_BATTLEYE_RUNTIME=/home/carlos/.local/share/lutris/runtime/battleye_runtimeLD_PRELOAD=/usr/$LIB/libgamemodeauto.so.0WINELOADERNOEXEC=1

Last edited by Comandante Ñoñardo on 9 Jun 2022 at 6:20 pm UTC
I tried this game on a Windows 10 PC (copy and pasting the Enslaved folder and running enslaved.exe) and the problem persist, so the game in not 100% DRMFREE, because it seems the language is tied to the steam client.
x_wing 22 Jun 2022
Quoting: Comandante ÑoñardoI tried this game on a Windows 10 PC (copy and pasting the Enslaved folder and running enslaved.exe) and the problem persist, so the game in not 100% DRMFREE, because it seems the language is tied to the steam client.
I finally end up buying this game for the sake of trying to figure out what is going on with the install.

So, during this weekend I was able to validate you assumption: the language selection is definitely tied to the steam api dll. This means that using goldberg emulator should do the trick... but it doesn't on linux as it makes the game crash for some reason (there is some weird debugging function call that I'm not sure why is there).

I then decided to check a little bit the game files structure and found some config files with language selection (and even with the language menu selection) but I couldn't figure out how make this work (the Steam exe is probably tied to the Steam api). Which forced me to start playing around with the files that looked like the language and, fortunately, that gave the expected results, which allowed me to create this shitty script:

 
#!/bin/sh

USAGE="Usage: ./EnslavedLangSw.sh [LANGUAGE|--restore]\nLANGUAGE options:\n DEU\n ESN\n ITA\n FRA\n\n --restore Restores language backups (i.e. rollbacks to english)"

if [ $# -lt 1 ]
then
echo "Invalid arguments!"
echo $USAGE
return 1;
fi

LANGUAGES="DEU ESN ITA FRA"
VALID_LANG=0

BASE_PATH="."
DIR_CHECK="$BASE_PATH/Binaries/Win32/Enslaved.exe"
COOKED_DIR="$BASE_PATH/MonkeyGame/CookedPC/Maps"
LOCALIZATION_DIR="$BASE_PATH/Engine/Localization"
MONKEY_LOC_DIR="$BASE_PATH/MonkeyGame/Localization"
MONKEY_COOK_DIR="$BASE_PATH/MonkeyGame/CookedPC/Packages/Audio"
MONKEY_MAPS_DIR="$BASE_PATH/MonkeyGame/CookedPC/Maps"
MOVIE_LOADING="$BASE_PATH/MonkeyGame/Movies/loading%-%.bik"
MOVIE_DLC1_TXT="$BASE_PATH/MonkeyGame/Movies/DLC1_loadingTruffles%-%.txt"
MOVIE_DLC1_BIK="$BASE_PATH/MonkeyGame/Movies/DLC1_loadingTruffles%-%.bik"
MOVIE_SAVEDATA="$BASE_PATH/MonkeyGame/Movies/Savedata%-%.bik"

RestoreBackup()
{
if [ ! -d "$LOCALIZATION_DIR/../BKP" ]
then
echo "Can't find backup. Did you ever run this script?"
exit 1
fi

rm -rf $LOCALIZATION_DIR/INT
mv -f $LOCALIZATION_DIR/../BKP $LOCALIZATION_DIR/INT
rm -rf $MONKEY_LOC_DIR/INT
mv -f $MONKEY_LOC_DIR/../BKP $MONKEY_LOC_DIR/INT
rm -rf $MONKEY_COOK_DIR/INT
mv -f $MONKEY_COOK_DIR/../../../BKP_COOK $MONKEY_COOK_DIR/INT
for file in $(find $MONKEY_MAPS_DIR | grep "bkp$")
do
        TARGET=$(echo $file | sed "s/\(.\)\.bkp/\1/")
        mv $file $TARGET
done

LOADING_TARGET=$(echo $MOVIE_LOADING | sed "s/%-%//")

mv $LOADING_TARGET.bkp $LOADING_TARGET

DLC1_TXT_TARGET=$(echo $MOVIE_DLC1_TXT | sed "s/%-%//")

mv $DLC1_TXT_TARGET.bkp $DLC1_TXT_TARGET

DLC1_BIK_TARGET=$(echo $MOVIE_DLC1_BIK | sed "s/%-%//")

mv $DLC1_BIK_TARGET.bkp $DLC1_BIK_TARGET

SAVEDATA_TARGET=$(echo $MOVIE_SAVEDATA | sed "s/%-%//")

mv $SAVEDATA_TARGET.bkp $SAVEDATA_TARGET

}

if [ ! -f $DIR_CHECK ]
then
echo "Invalid directory. You must run this script in the installation directory of Enslaved."
exit 1
fi

if [ $1 = "--restore" ]
then
RestoreBackup
exit 0
fi

for LNG in $LANGUAGES
do
VALID_LANG=$([ $LNG = $1 -o $VALID_LANG -eq 1 ] && echo 1 || echo 0)
done

if [ $VALID_LANG -eq 0 ]
then
echo "Language not supported. This script only supports: $LANGUAGES"
exit 1
fi

echo "Translating...\n"

echo "Moving Engine Localization Dir..."
mv $LOCALIZATION_DIR/INT $LOCALIZATION_DIR/../BKP
cp -r $LOCALIZATION_DIR/$1 $LOCALIZATION_DIR/INT
for file in $(ls $LOCALIZATION_DIR/INT)
do
TARGET=$(echo $file | sed "s/\(.*\)\.$1/\1\.int/i")
mv $LOCALIZATION_DIR/INT/$file $LOCALIZATION_DIR/INT/$TARGET
done

echo "Moving Monkey Localization Dir..."
mv $MONKEY_LOC_DIR/INT $MONKEY_LOC_DIR/../BKP
cp -r $MONKEY_LOC_DIR/$1 $MONKEY_LOC_DIR/INT
for file in $(ls $MONKEY_LOC_DIR/INT)
do
        TARGET=$(echo $file | sed "s/\(.*\)\.$1/\1\.int/i")
mv $MONKEY_LOC_DIR/INT/$file $MONKEY_LOC_DIR/INT/$TARGET
done

echo "Moving Monkey Cooked Audio..."
mv $MONKEY_COOK_DIR/INT $MONKEY_COOK_DIR/../../../BKP_COOK
cp -r $MONKEY_COOK_DIR/$1 $MONKEY_COOK_DIR/INT
for file in $(ls $MONKEY_COOK_DIR/INT)
do
TARGET=$(echo $file | sed "s/\(.*\)_$1.upk/\1.upk/")
mv $MONKEY_COOK_DIR/INT/$file $MONKEY_COOK_DIR/INT/$TARGET
done

echo "Moving Monkey Maps..."
for file in $(find $MONKEY_MAPS_DIR | grep "$1.upk$")
do
TARGET=$(echo $file | sed "s/\(.\)$1.upk/\1INT.upk/")
mv $TARGET $TARGET.bkp
cp $file $TARGET
done

LOADING_TARGET=$(echo $MOVIE_LOADING | sed "s/%-%//")
LOADING_SOURCE=$(echo $MOVIE_LOADING | sed "s/%-%/_$1/")

mv $LOADING_TARGET $LOADING_TARGET.bkp
cp $LOADING_SOURCE $LOADING_TARGET

DLC1_TXT_TARGET=$(echo $MOVIE_DLC1_TXT | sed "s/%-%//")
DLC1_TXT_SOURCE=$(echo $MOVIE_DLC1_TXT | sed "s/%-%/_$1/")

mv $DLC1_TXT_TARGET $DLC1_TXT_TARGET.bkp
cp $DLC1_TXT_SOURCE $DLC1_TXT_TARGET

DLC1_BIK_TARGET=$(echo $MOVIE_DLC1_BIK | sed "s/%-%//")
DLC1_BIK_SOURCE=$(echo $MOVIE_DLC1_BIK | sed "s/%-%/_$1/")

mv $DLC1_BIK_TARGET $DLC1_BIK_TARGET.bkp
cp $DLC1_BIK_SOURCE $DLC1_BIK_TARGET

SAVEDATA_TARGET=$(echo $MOVIE_SAVEDATA | sed "s/%-%//")
SAVEDATA_SOURCE=$(echo $MOVIE_SAVEDATA | sed "s/%-%/_$1/")

mv $SAVEDATA_TARGET $SAVEDATA_TARGET.bkp
cp $SAVEDATA_SOURCE $SAVEDATA_TARGET

exit 0

In order to use it:
  • Open the installation directory of Enslaved in a terminal

  • Run the script as: ./EnslavedLangSw.sh ESN

  • Run the game and enjoy the full spanish experience



Note 1: The script can switch to the other fully supported languages (i.e. DEU, ITA & FRA)

Note 2: By only modifying the localization directory (see $LOCALIZATION_DIR) you can keep English voices with your local preferred language as subtitles (you must enable subtitles in the game menu)

Note 3: Once you run the script to switch language, you can rollback the changes by running ./EnslavedLangSw.sh --restore

Note 4: If you switch languages twice without restoring to English between switches, restore will no work anymore

Last edited by x_wing on 22 Jun 2022 at 2:16 pm UTC
You rock, X-wing! You solved it! :woot:
With your script, the game is perfectly playable in my language.

Note that some cinematics still have English audio, because they are .bik files with several audio streams inside that must be re-encoded and is outside the range of any script (I guess I can edit the files and play with the audio streams)...

Anyway! Your fix make the game playable DRMFREE in my language (until the publisher decide to release it on GOG in, I don't know, 30 years)
While you're here, please consider supporting GamingOnLinux on:

Reward Tiers: Patreon Logo Patreon. Plain Donations: PayPal Logo PayPal.

This ensures all of our main content remains totally free for everyone! Patreon supporters can also remove all adverts and sponsors! Supporting us helps bring good, fresh content. Without your continued support, we simply could not continue!

You can find even more ways to support us on this dedicated page any time. If you already are, thank you!
Login / Register