I am a game dev myself and I also offer game localization as a freelancer (EN->DE) and I wish every client would provide enough information and answer questions, as you state in your video! Because I would like to make suitable and good translations :)
Thanks for this. I need to start localizing, and this video gave me most of the info I need. One thing I would add is to have the keys as an enum or something similar so you can only select feasible values, to reduce the occurrence of not linking strings properly.
As a translator I would actively discourage any dev from using machine translation for their games (especially in their entirety). The best way you can make sure that your translation and localisation is good and natural is to choose a native speaker of the target language. They will know what sounds natural, and not choose translations which are synonyms, but not right in the context. (For example, 'quit' and 'leave' might both mean the same thing, but any English native knows that in game context, you always use 'quit').
Thanks. Learned a lot and will definately need this later on. Common terms in the desired language are a thing in itself. I have an German example from your video: 'Power' is translated to "Leistung". This is not wrong, but not common and somewhat out of context. If you say in English 'I've got the power!', then you don't say in German "Ich habe die Leistung". "Leistung" is more regarding to mechanical power, like from your car or how you performed to a test. Instead you say "Ich habe die Kraft!" But this is a whole statement, not just a single term. Single term as an attribute here is translated to "Stärke". You could even not translate it, because 'Power' has a very common understanding worldwide, but this would be inconsistently to the other translations. So what I'm trying to second is that a special native gaming language translator/editor is super important, like Auro mentioned in the video. Otherwise it can disturb or break your game immersion.
How do you have the data separated by columns? Because Unity doesn't understand this way of data recording, it requires all data in one column, separated by commas. So, how?
If you open a .csv file in Excel, it will show it in columns but in actuality it's just "one column" separated with commas. If you open it in Notepad, you will see what it actually looks like. Also, there are many ways to import data into Unity. I2 localization asset handles the .csv importing for my localization file. But I have also previously created my own .csv and .tsv (this is handy if your data contains commas) import systems.
Hey, I'm a translator interested in localization. I didn't get those dynamic strings (i have zero coding knowledge :D) such as "UI.ENDSCREEN.LOSE"? Which part made it dynamic actually? sorry if it sounds ridiculous 😅😅
Hey! By dynamic string I meant that the text is not hard-coded within the code but instead uses an ID ("UI.ENDSCREEN.LOSE") that is then replaced with the right text and in the right language when it is time to show that text in the game. As a translator the exact details probably aren't very relevant, but when you get the translation file, it will most likely include these ID's within the file and they can give some context where those lines will be shown within the game.
Hmm weird, the game does not know the LocalizationManager. It gives me the error: The type or namespace name 'LocalizationManager' could not be found (are you missing a using directive or an assembly reference?) - do I need to include a library for it? Or do I have to make a localization manager script myself? Should it come with the localization package? - Edit: nevermind, I think it is because I use another localization package, the one that nowadays comes with unity.
Good tutorial but I am struggling with this tool a little bit. For example when i am generating csv spread sheet it is showing some errors in unity. It is generated in the end but it is not as prepared by columns like in your video. everything is in one cell. :/ strange.
Hmmh weird... What if you create the csv yourself to make sure it has the right amount of columns and then import it? If the issue persists, opening the csv in notepad to check if it has commas between the columns would be a good thing to check
@@AuroDev Hi Auro. Thanks. I uploaded my game trailer in English and Russian. Is there a way to ckeck it? Because if I change languages, I see the game description in Russian but not the trailer.
@@DualGenStudios If the description changes, the trailer should also change. I remember having some delays with the trailers updating before so I'd give it a moment and then maybe also test with another device.
In this video, there's a text using "totalScore", how do i implement it in code, I did what you asked, $"{totalScore}", but after using the key it is showing as it is, it is not replacing the total score with the int value
@@AuroDev Sorry, i forgot to tell you that i'm writing the key as Debug.Log("TEST"); Now, the "TEST" key contains string "Test number is {test}" which is coming from the Google sheets, and the int test value is dynamically assigned(at runtime), for now, i'm using call back, but it works some time, sometime it show {test} as it is.
Great video! I just didn't understand something. If I2 Localization asset translates all the words, then why should we get help from translators? Isn't it better to get help from them in the first place? Also, I have another question. How do you change UI game objects to dynamic strings? For example, for the "Start" button, do you use "UI.main.play" as the name of the game object? Thank you!
Thanks! The l2 itself doesn't know what the words are in different languages. Translators are needed for that. But after that l2 can handle the "code" side of things, ie replacing english text with text of another language when the player switches language. The name of the gameobject doesn't matter, but you will need to add the I2 localize component to the game object. Then in the component you can set the "UI.main.play" so the text in the gameobject will be replaced by that dynamic string.
@@AuroDev Oh, I see. So it handles the code side of the process. In my game, I don't have random text like "You won" but I need to translate buttons in menus to other languages. I think even in this case, that asset is helpful. Thanks for the explanation!
I'm trying so hard to figure out how to do this with a dialog system. I use a txt file and I just have a trigger enter which pulls a line from my text files and it gets populated on a dialog box on the screen. I can't wrap my head around how I can do it with dynamic strings....I would love a video on setting up a dialog system to work like this.. ANYBODY????
I've just started my dev journey and this is super helpful. Do you recommend translating the steam page also, maybe just the description box? Most videos i've watched don't mention it :(
Awesome! Yes, I would highly recommend translating your Steam page also! I've done it with all the languages I support in the game. I don't have any data to say how big of an effect it has, but Steam recommends it and logically thinking it should bring in some extra sales.
Good question! I googled which unicode blocks include the most commonly used Chinese characters and then included those in my Chinese font asset. In the localization asset you can specify a range of unicode characters so you don't need to list all of them there character by character.
Thank you for sharing this. It was a very interesting watch. Though I would not recommend people to use hard coded key in their code. Instead I would recommend them to create a custom class (or MB) which contains the key as parameters which can have a custom property drawer (or Editor) for preview. You will have more flexibility that way. At 03:25, I didn't catch the difference. Won't you get the same string in the end?
That sounds like a smart thing to do! At 03:25 I was trying to make a point regarding the word order. If you combine 2 strings with a variable in the middle, the word order is locked in place. Since the word order can differ based on the language, you will need to "unlock" the word order if you are going to localize your game.
Awesome! Really happy to hear that :) I haven't gotten around to setting up a discord server yet, but I have been thinking about it. So maybe at some point in near future I will have one!
Why does everyone insist on making one spreadsheet with all languages! How can I subcontract that out to multiple people and not have to merge all these changes!
The way I did it is to have that one big spreadsheet that the game uses and then split it into smaller language-specific ones that I use to approach translators with. Ofc merging all the docs at the end is then needed.
@@CyberAngel67 Well, that felt like a comfortable way for me to do it at least :) I like having all the localization strings in the same document so I can make adjustments to all languages at the same time and I can also easily compare the translations if needed.
I don't use Facebook much so I won't use that for communication. But you should be able to send a message request to me on Twitter twitter.com/RedbeakGames
I haven't had to deal with them as a dev :) At least so far with my game there has been no need to adjust words based on the gender (or likely I just haven't realized it).
Hey, sorry to hear the video wasn't helpful! I haven't tried Unity's own localization package, but I would assume many of the steps are still the same (using dynamic strings, working with translators, enabling different alphabets etc). But yeah, if you are using Unity's own localization package, it would definitely be a good idea to check a tutorial that's specific to that package.
Thanks man. Best tutorial on this asset I've found. Best of luck in your projects.
I am a game dev myself and I also offer game localization as a freelancer (EN->DE) and I wish every client would provide enough information and answer questions, as you state in your video! Because I would like to make suitable and good translations :)
I wish every translator asked questions! :)
Dope Video! Thank you for the easy script examples in the video.
Great video! Super informative and thorough. I'll definitely be referencing this when I'm ready for localizing my game!
Happy to hear that! Best of luck with your game! :)
I just discovered your channel and I really like your videos :)
Happy to hear that! Welcome aboard :)
Thanks for this. I need to start localizing, and this video gave me most of the info I need. One thing I would add is to have the keys as an enum or something similar so you can only select feasible values, to reduce the occurrence of not linking strings properly.
As a translator I would actively discourage any dev from using machine translation for their games (especially in their entirety). The best way you can make sure that your translation and localisation is good and natural is to choose a native speaker of the target language. They will know what sounds natural, and not choose translations which are synonyms, but not right in the context. (For example, 'quit' and 'leave' might both mean the same thing, but any English native knows that in game context, you always use 'quit').
Thanks. Learned a lot and will definately need this later on.
Common terms in the desired language are a thing in itself.
I have an German example from your video:
'Power' is translated to "Leistung".
This is not wrong, but not common and somewhat out of context.
If you say in English 'I've got the power!', then you don't say in German "Ich habe die Leistung".
"Leistung" is more regarding to mechanical power, like from your car or how you performed to a test.
Instead you say "Ich habe die Kraft!" But this is a whole statement, not just a single term.
Single term as an attribute here is translated to "Stärke".
You could even not translate it, because 'Power' has a very common understanding worldwide, but this would be inconsistently to the other translations.
So what I'm trying to second is that a special native gaming language translator/editor is super important, like Auro mentioned in the video.
Otherwise it can disturb or break your game immersion.
That's an interesting and good example on the importance of context!
How do you have the data separated by columns? Because Unity doesn't understand this way of data recording, it requires all data in one column, separated by commas. So, how?
If you open a .csv file in Excel, it will show it in columns but in actuality it's just "one column" separated with commas. If you open it in Notepad, you will see what it actually looks like.
Also, there are many ways to import data into Unity. I2 localization asset handles the .csv importing for my localization file. But I have also previously created my own .csv and .tsv (this is handy if your data contains commas) import systems.
Hey, I'm a translator interested in localization. I didn't get those dynamic strings (i have zero coding knowledge :D) such as "UI.ENDSCREEN.LOSE"? Which part made it dynamic actually? sorry if it sounds ridiculous 😅😅
Hey! By dynamic string I meant that the text is not hard-coded within the code but instead uses an ID ("UI.ENDSCREEN.LOSE") that is then replaced with the right text and in the right language when it is time to show that text in the game. As a translator the exact details probably aren't very relevant, but when you get the translation file, it will most likely include these ID's within the file and they can give some context where those lines will be shown within the game.
Hmm weird, the game does not know the LocalizationManager. It gives me the error: The type or namespace name 'LocalizationManager' could not be found (are you missing a using directive or an assembly reference?) - do I need to include a library for it? Or do I have to make a localization manager script myself? Should it come with the localization package? - Edit: nevermind, I think it is because I use another localization package, the one that nowadays comes with unity.
Ah yeah, the LocalizationManager is for I2 localization asset that I am using. Haven't tried the Unity one, but I'm sure it is great also.
Thank you so much for making this video.
Good tutorial but I am struggling with this tool a little bit. For example when i am generating csv spread sheet it is showing some errors in unity. It is generated in the end but it is not as prepared by columns like in your video. everything is in one cell. :/ strange.
Hmmh weird... What if you create the csv yourself to make sure it has the right amount of columns and then import it? If the issue persists, opening the csv in notepad to check if it has commas between the columns would be a good thing to check
How do I localize a game where the text is all hand drawn pixel art and drawn directly on the assets?
In that case you would need to localize the images, which can be a lot of work. At least the I2 localization asset I am using can localize images too.
Great video, I'm changing jobs, and I'm thinking of localizing games to Latam Spanish, this is great info for me.
Happy to hear that! Best of luck with the job switch :)
Amazing video as I am about to start my freelancing journey as translator (Eng - Hindi).
Best of luck with your journey! :)
Hi Auro. One question. Can videos (trailers in the Steam Store be localized)?
Yep, they can!
@@AuroDev Hi Auro. Thanks. I uploaded my game trailer in English and Russian. Is there a way to ckeck it? Because if I change languages, I see the game description in Russian but not the trailer.
@@DualGenStudios If the description changes, the trailer should also change. I remember having some delays with the trailers updating before so I'd give it a moment and then maybe also test with another device.
@@AuroDev Oh, that's a good idea. Thank you.
In this video, there's a text using "totalScore", how do i implement it in code, I did what you asked, $"{totalScore}", but after using the key it is showing as it is, it is not replacing the total score with the int value
Hmmh, not sure what the issue might be. I just tried this and it worked:
int test = 5;
Debug.Log($"Test number is {test}");
@@AuroDev Sorry, i forgot to tell you that i'm writing the key as Debug.Log("TEST");
Now, the "TEST" key contains string "Test number is {test}" which is coming from the Google sheets, and the int test value is dynamically assigned(at runtime), for now, i'm using call back, but it works some time, sometime it show {test} as it is.
Good video! Just to be clear, is I2 Localization mostly for game developers or can localizers directly use it to work on games?
Thanks
Thank you! I2 Localization is just for game developers so no need to worry about it as a translator! :)
@@AuroDev Thank you very much :)
Great video! I just didn't understand something. If I2 Localization asset translates all the words, then why should we get help from translators? Isn't it better to get help from them in the first place?
Also, I have another question. How do you change UI game objects to dynamic strings? For example, for the "Start" button, do you use "UI.main.play" as the name of the game object?
Thank you!
Thanks! The l2 itself doesn't know what the words are in different languages. Translators are needed for that. But after that l2 can handle the "code" side of things, ie replacing english text with text of another language when the player switches language.
The name of the gameobject doesn't matter, but you will need to add the I2 localize component to the game object. Then in the component you can set the "UI.main.play" so the text in the gameobject will be replaced by that dynamic string.
@@AuroDev Oh, I see. So it handles the code side of the process. In my game, I don't have random text like "You won" but I need to translate buttons in menus to other languages. I think even in this case, that asset is helpful. Thanks for the explanation!
I'm trying so hard to figure out how to do this with a dialog system. I use a txt file and I just have a trigger enter which pulls a line from my text files and it gets populated on a dialog box on the screen. I can't wrap my head around how I can do it with dynamic strings....I would love a video on setting up a dialog system to work like this.. ANYBODY????
Excellent, thanks you!
Can I use this method to localize an existing game?
Sure!
Thanks man, you help me a lot!
Happy to hear that! :)
I've just started my dev journey and this is super helpful. Do you recommend translating the steam page also, maybe just the description box? Most videos i've watched don't mention it :(
Awesome! Yes, I would highly recommend translating your Steam page also! I've done it with all the languages I support in the game. I don't have any data to say how big of an effect it has, but Steam recommends it and logically thinking it should bring in some extra sales.
@@AuroDev Thanks for the reply!
I’ve translated my page’s short description and ‘about this game’ description, even before localizing.
How did you deal with getting more Chinese chars for the custom names?
Good question! I googled which unicode blocks include the most commonly used Chinese characters and then included those in my Chinese font asset. In the localization asset you can specify a range of unicode characters so you don't need to list all of them there character by character.
Thank you for sharing this. It was a very interesting watch.
Though I would not recommend people to use hard coded key in their code.
Instead I would recommend them to create a custom class (or MB) which contains the key as parameters which can have a custom property drawer (or Editor) for preview. You will have more flexibility that way.
At 03:25, I didn't catch the difference. Won't you get the same string in the end?
That sounds like a smart thing to do! At 03:25 I was trying to make a point regarding the word order. If you combine 2 strings with a variable in the middle, the word order is locked in place. Since the word order can differ based on the language, you will need to "unlock" the word order if you are going to localize your game.
Дякую автору відео, за корисну інформацію
Your channel is amazing watched all videos and love it! Do you also have a discord sever, would love to join and talk about our games! :)
Awesome! Really happy to hear that :) I haven't gotten around to setting up a discord server yet, but I have been thinking about it. So maybe at some point in near future I will have one!
Why does everyone insist on making one spreadsheet with all languages! How can I subcontract that out to multiple people and not have to merge all these changes!
The way I did it is to have that one big spreadsheet that the game uses and then split it into smaller language-specific ones that I use to approach translators with. Ofc merging all the docs at the end is then needed.
@@AuroDev exactly my point.... WHY!!!!!
@@CyberAngel67 Well, that felt like a comfortable way for me to do it at least :) I like having all the localization strings in the same document so I can make adjustments to all languages at the same time and I can also easily compare the translations if needed.
your twitter acc don't work can i contact you in facebook?
I don't use Facebook much so I won't use that for communication. But you should be able to send a message request to me on Twitter twitter.com/RedbeakGames
Quitten drives me crazy.. it is Beenden :-)
Hah, sorry! If it's any consolation, my actual game uses Beenden :)
@@AuroDev haha gg. keep on the good work :-P (for explanation of my pain: Quitten are some kind of fruit :-D) )
can i contact you in twitter?
Yes. twitter.com/RedbeakGames
You didn’t talk about separate gendered strings ! 😭
I haven't had to deal with them as a dev :) At least so far with my game there has been no need to adjust words based on the gender (or likely I just haven't realized it).
unity has its own localisation package.. so this is not very helpful for the majority of people
Hey, sorry to hear the video wasn't helpful! I haven't tried Unity's own localization package, but I would assume many of the steps are still the same (using dynamic strings, working with translators, enabling different alphabets etc). But yeah, if you are using Unity's own localization package, it would definitely be a good idea to check a tutorial that's specific to that package.
А это твоя собака?
Yes :)