{"id":4541,"date":"2023-08-24T09:58:33","date_gmt":"2023-08-24T00:58:33","guid":{"rendered":"https:\/\/blog.criware.com\/?p=4541"},"modified":"2024-05-17T18:53:18","modified_gmt":"2024-05-17T09:53:18","slug":"localization-pipeline-in-unreal","status":"publish","type":"post","link":"https:\/\/blog.criware.com\/index.php\/2023\/08\/24\/localization-pipeline-in-unreal\/","title":{"rendered":"Localization Pipeline in Unreal"},"content":{"rendered":"<p>ADX\u2019s authoring tool comes with useful features to manage localization. Assets with prefix and\/or suffix are supported, multi-lingual Cues are set automatically, and even Tracks can be language-dependent&#8230;<\/p>\n<p>As we will see in this post, when using ADX with Unreal, you can easily create a pipeline to switch the assets automatically to the right language.<\/p>\n<h2 style=\"font-size: 150%; font-weight: bold; margin-top: 40px;\">Preparing the ACB<\/h2>\n<p>For a comprehensive guide on how to manage dialogue with Atom Craft, check our <a href=\"https:\/\/blog.criware.com\/index.php\/2017\/04\/27\/implementing-audio-dialogue-in-atomcraft\/\">previous <\/a>post. In short, here are the steps to export a multi-lingual ACB from AtomCraft.<\/p>\n<ul>\n<li>First add the languages you need in the <em>Project Tree<\/em> under the <em>Language Settings<\/em> folder.<\/li>\n<li>Once they are configured, select a <em>WorkUnit<\/em> and right-click on the <em>Material Root Folder<\/em>. Select <em>Create a folder for Localization<\/em>. Atom Craft will automatically create a dedicated hierarchy to manage the localized assets.<\/li>\n<li>Drag &amp; drop your assets in their respective folders.<\/li>\n<li>Then, create your dialogue Cues.<\/li>\n<\/ul>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/01-Atom-Craft-Loc-Setup.png\" alt=\"01 Atom Craft Loc Setup\" width=\"1089\" height=\"397\" class=\"alignnone size-full wp-image-4546\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/01-Atom-Craft-Loc-Setup.png 1089w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/01-Atom-Craft-Loc-Setup-300x109.png 300w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/01-Atom-Craft-Loc-Setup-768x280.png 768w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/01-Atom-Craft-Loc-Setup-1024x373.png 1024w\" sizes=\"auto, (max-width: 1089px) 100vw, 1089px\" \/>\n<\/p>\n<p>With your Cues ready you can build your ACB files:<\/p>\n<ul>\n<li>Right-click on the CueSheet containing your dialogue Cues.<\/li>\n<li>Click on <em>Build Atom CueSheet Binary.<\/em><\/li>\n<li>In the build window, select the language for which you want to build.<\/li>\n<li>Once the build completed, you will have one ACB for each language.<\/li>\n<\/ul>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/02-Build-ACB.png\" alt=\"02 Build ACB\" width=\"1005\" height=\"698\" class=\"alignnone size-full wp-image-4547\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/02-Build-ACB.png 1005w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/02-Build-ACB-300x208.png 300w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/02-Build-ACB-768x533.png 768w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/02-Build-ACB-392x272.png 392w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/02-Build-ACB-130x90.png 130w\" sizes=\"auto, (max-width: 1005px) 100vw, 1005px\" \/><\/p>\n<h2 style=\"font-size: 150%; font-weight: bold; margin-top: 40px;\">Localization in Unreal Engine<\/h2>\n<p>You can now open your Unreal project. The first thing is to setup our languages for the localization.<\/p>\n<ul>\n<li>Open the <em>Localization Dashboard <\/em>via the <em>Window<\/em> menu.<\/li>\n<li>Scroll to the bottom of the dashboard and, in the <em>Cultures<\/em> section, click <em>on Add New Culture<\/em>.<\/li>\n<li>Add the same languages than in your AtomCraft project.<\/li>\n<li>Finally, click on <em>Compile Text<\/em> to update the list of languages internally.<\/li>\n<\/ul>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/03-Loc-Dashboard.png\" alt=\"03 Loc Dashboard\" width=\"1337\" height=\"731\" class=\"alignnone size-full wp-image-4549\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/03-Loc-Dashboard.png 1337w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/03-Loc-Dashboard-300x164.png 300w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/03-Loc-Dashboard-768x420.png 768w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/03-Loc-Dashboard-1024x560.png 1024w\" sizes=\"auto, (max-width: 1337px) 100vw, 1337px\" \/>\n<\/p>\n<p>With our languages ready, it is time to import the ACB.<\/p>\n<ul>\n<li>In the Content browser, create a folder for your audio assets.<\/li>\n<li>Import the localized ACB that will be used for your reference language (e.g., English) and create the assets for the corresponding Cues.<\/li>\n<li>Right-click on your ACB asset, select <em>Asset Localization<\/em>, <em>Create Localized Asset<\/em>, <em>English<\/em>.<\/li>\n<li>Repeat the last operation for each language.<\/li>\n<\/ul>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/04-Asset-Loc.png\" alt=\"04 Asset Loc\" width=\"1066\" height=\"681\" class=\"alignnone size-full wp-image-4550\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/04-Asset-Loc.png 1066w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/04-Asset-Loc-300x192.png 300w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/04-Asset-Loc-768x491.png 768w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/04-Asset-Loc-1024x654.png 1024w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/>\n<\/p>\n<p>You will notice that this creates a new folder hierarchy under Content\/L10N\/ with subfolders for each language, each mirroring the organization of your audio assets.<\/p>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/05-L10N-Folder.png\" alt=\"05 L10N Folder\" width=\"501\" height=\"504\" class=\"alignnone size-full wp-image-4551\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/05-L10N-Folder.png 501w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/05-L10N-Folder-150x150.png 150w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/05-L10N-Folder-298x300.png 298w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/>\n<\/p>\n<ul>\n<li>In the last folder of this hierarchy, you will find your ACB file, which was copied during the process.<\/li>\n<li>Delete this ACB file for every language, as it is unnecessary.<\/li>\n<\/ul>\n<p>The purpose of the workflow above is to create all the appropriate folders, but you could also create them manually.<\/p>\n<ul>\n<li>Now you can drag and drop each of your localized ACB files in their respective folders to create the localized assets.<\/li>\n<\/ul>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/06-Localized-Assets.png\" alt=\"06 Localized Assets\" width=\"1142\" height=\"504\" class=\"alignnone size-full wp-image-4552\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/06-Localized-Assets.png 1142w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/06-Localized-Assets-300x132.png 300w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/06-Localized-Assets-768x339.png 768w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/06-Localized-Assets-1024x452.png 1024w\" sizes=\"auto, (max-width: 1142px) 100vw, 1142px\" \/>\n<\/p>\n<p>From this point on, when using Cue assets and Cue Sheet assets, you must use the assets created in the audio asset folder you originally created (which only contains your reference language assets). When an asset is loaded, the appropriate localised version will be loaded according to the language setting. Note that if you were to accidentally use the assets in the L10N folder directly, the language of the asset would not change when switching between languages.<\/p>\n<p>Finally, in Unreal, to change the language setting you can:<\/p>\n<ul>\n<li>Use the <em>Set Current Culture<\/em> node in Blueprints.<\/li>\n<li>Or call the <em>SetCurrentCulture<\/em> function in C++.<\/li>\n<\/ul>\n<p>The assets loaded after this operation will be the localized asset corresponding to the language specified earlier.<\/p>\n<p>Here is an example in Blueprint, where clicking on a button sets our language, and reloads the current level:<\/p>\n<p style=\"text-align: center;\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/07-BP.png\" alt=\"07 BP\" width=\"1451\" height=\"689\" class=\"alignnone size-full wp-image-4553\" srcset=\"https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/07-BP.png 1451w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/07-BP-300x142.png 300w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/07-BP-768x365.png 768w, https:\/\/blog.criware.com\/wp-content\/uploads\/2023\/08\/07-BP-1024x486.png 1024w\" sizes=\"auto, (max-width: 1451px) 100vw, 1451px\" \/>\n<\/p>\n<p>&nbsp;<\/p>\n<p>Note that one limitation of this system is that it will not change assets already loaded, and it will only change the language when running a packaged game.<\/p>\n<p>The advantage of this pipeline is that it works automatically out-of-the-box. However if it is too restrictive for your needs, it will be relatively easy to build a custom solution since Atom Craft exports individual ACB in each language.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ADX\u2019s authoring tool comes with useful features to manage localization. Assets with prefix and\/or suffix are supported, multi-lingual Cues are<\/p>\n","protected":false},"author":2,"featured_media":5402,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[5,7],"tags":[],"class_list":["post-4541","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-adx","category-tutorials"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/posts\/4541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/comments?post=4541"}],"version-history":[{"count":7,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/posts\/4541\/revisions"}],"predecessor-version":[{"id":5401,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/posts\/4541\/revisions\/5401"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/media\/5402"}],"wp:attachment":[{"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/media?parent=4541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/categories?post=4541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.criware.com\/index.php\/wp-json\/wp\/v2\/tags?post=4541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}