Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

Question FormattingException: Error parsing format string: Could not evaluate the selector "0" at 10

Discussion in 'Localization Tools' started by denis_bogdanov, Feb 7, 2022.

  1. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Hello!
    What am I doing wrong?


    Code (CSharp):
    1.    var table = UnityEngine.Localization.Settings.LocalizationSettings.StringDatabase.GetLocalizedStringAsync(Loc.MAIN_TABLE, "board_mistakes");
    2.         table.Completed += (x) =>
    3.         {
    4.             mistakeText.text = Smart.Format(x.Result, value) + "/" + maxMistake;
    5.         };
    throw error

    Code (CSharp):
    1. FormattingException: Error parsing format string: Could not evaluate the selector "0" at 10
    2. Mistakes {0}
    3. ----------^
    4. UnityEngine.Localization.SmartFormat.SmartFormatter.FormatError (UnityEngine.Localization.SmartFormat.Core.Parsing.FormatItem errorItem, System.Exception innerException, System.Int32 startIndex, UnityEngine.Localization.SmartFormat.Core.Formatting.FormattingInfo formattingInfo) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Smart Format/SmartFormatter.cs:347)
    5. UnityEngine.Localization.SmartFormat.SmartFormatter.Format (UnityEngine.Localization.SmartFormat.Core.Formatting.FormattingInfo formattingInfo) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Smart Format/SmartFormatter.cs:319)
    6. UnityEngine.Localization.SmartFormat.SmartFormatter.Format (UnityEngine.Localization.SmartFormat.Core.Formatting.FormatDetails formatDetails, UnityEngine.Localization.SmartFormat.Core.Parsing.Format format, System.Object current) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Smart Format/SmartFormatter.cs:286)
    7. UnityEngine.Localization.SmartFormat.SmartFormatter.FormatWithCache (UnityEngine.Localization.SmartFormat.Core.Formatting.FormatCache& cache, System.String format, System.IFormatProvider formatProvider, System.Collections.Generic.IList`1[T] args) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Smart Format/SmartFormatter.cs:257)
    8. UnityEngine.Localization.Tables.StringTableEntry.GetLocalizedString (System.IFormatProvider formatProvider, System.Collections.Generic.IList`1[T] args, UnityEngine.Localization.Pseudo.PseudoLocale pseudoLocale) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Tables/StringTable.cs:176)
    9. UnityEngine.Localization.Settings.LocalizedStringDatabase.GenerateLocalizedString (UnityEngine.Localization.Tables.StringTable table, UnityEngine.Localization.Tables.StringTableEntry entry, UnityEngine.Localization.Tables.TableReference tableReference, UnityEngine.Localization.Tables.TableEntryReference tableEntryReference, UnityEngine.Localization.Locale locale, System.Collections.Generic.IList`1[T] arguments) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Settings/Database/LocalizedStringDatabase.cs:244)
    10. UnityEngine.Localization.GetLocalizedStringOperation.Execute () (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Operations/GetLocalizedStringOperation.cs:55)
    11. UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1[TObject].InvokeExecute () (at Library/PackageCache/com.unity.addressables@1.19.15/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:474)
    12. UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1[TObject].Start (UnityEngine.ResourceManagement.ResourceManager rm, UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle dependency, DelegateList`1[T] updateCallbacks) (at Library/PackageCache/com.unity.addressables@1.19.15/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:469)
    13. UnityEngine.ResourceManagement.ResourceManager.StartOperation[TObject] (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1[TObject] operation, UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle dependency) (at Library/PackageCache/com.unity.addressables@1.19.15/Runtime/ResourceManager/ResourceManager.cs:460)
    14. UnityEngine.Localization.Settings.LocalizedStringDatabase.GetLocalizedStringAsync (UnityEngine.Localization.Tables.TableReference tableReference, UnityEngine.Localization.Tables.TableEntryReference tableEntryReference, System.Collections.Generic.IList`1[T] arguments, UnityEngine.Localization.Locale locale, UnityEngine.Localization.Settings.FallbackBehavior fallbackBehavior, UnityEngine.Localization.SmartFormat.PersistentVariables.IVariableGroup localVariables) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Settings/Database/LocalizedStringDatabase.cs:215)
    15. UnityEngine.Localization.Settings.LocalizedStringDatabase.GetLocalizedStringAsync (UnityEngine.Localization.Tables.TableReference tableReference, UnityEngine.Localization.Tables.TableEntryReference tableEntryReference, UnityEngine.Localization.Locale locale, UnityEngine.Localization.Settings.FallbackBehavior fallbackBehavior, System.Object[] arguments) (at Library/PackageCache/com.unity.localization@1.1.1/Runtime/Settings/Database/LocalizedStringDatabase.cs:171)
     

    Attached Files:

  2. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Your smart string expects an argument for the placeholder {0} but when you call Get localized string you don't pass in any arguments for it to use.
    Don't call Smart.Format directly, that's already being done for you before the string is returned.
    Do something like
    GetLocalizedStringAsync(Loc.MAIN_TABLE, "board_mistakes", value)
     
    denis_bogdanov likes this.
  3. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135

    It works, thank you.

    One more question.


    I disabled the Smart checkbox in the editor window and just want to get a string. Throw error

    Code (CSharp):
    1.  
    2. FormatException: Input string was not in the correct format for String.Format. Ensure that the string is marked as Smart if you intended to use Smart Format.
    3. `Mistakes {0}
    Is this normal?
     
  4. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Did you pass an argument into GetLocalizedString?
    If its not makred as smart it will use String.Format and that error will be thrown if the argument was invalid.
     
  5. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135

    No

    Smart = false( editor window) . Code:
    Code (CSharp):
    1.  var table = UnityEngine.Localization.Settings.LocalizationSettings.StringDatabase.GetLocalizedStringAsync(Loc.MAIN_TABLE, "board_mistakes");
    2.         table.Completed += (x) =>
    3.         {
    4.             mistakeText.text = string.Format(x.Result, value) + "/" + maxMistake;
    5.         };
    throw error

    Code (CSharp):
    1. FormatException: Input string was not in the correct format for String.Format. Ensure that the string is marked as Smart if you intended to use Smart Format.
    2. `Mistakes {0}
     
    Last edited: Feb 8, 2022
  6. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    That should not be happening. Can you file a bug report so we can look into it? I cant see any reason it would be happening.
     
  7. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Done
    Case 1402860
     
    karl_jones likes this.
  8. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    QA Team can't reproduce the problem, but I have it all the time.
    I created new projects in unity 2020.3.32f1, 2020.3.31f1, 2020.3.30f1 and I can reproduce the problem everywhere, but the projects sent to QA team do not reproduce the problem

    Once again:
    I want to get an entry with "{0}"
    Smart = "false" in the localization editor window
    Code (CSharp):
    1.        var op = UnityEngine.Localization.Settings.LocalizationSettings.StringDatabase.GetLocalizedStringAsync("Main", "board_mistakes");
    2.             op.Completed += (x) =>
    3.             {        
    4.             };
    5.  

    throw error:
    Code (CSharp):
    1.     FormatException: Input string was not in the correct format for String.Format. Ensure that the string is marked as Smart if you intended to use Smart Format.
    2.     `Mistakes {0}
    3.  

    but with:
    Code (CSharp):
    1.   var op= LocalizationSettings.StringDatabase.GetTableAsync("Main");
    2.             op.Completed += (x) =>
    3.             {
    4.                 var result = x.Result;
    5.                 var entry = result.GetEntry("board_mistakes");
    6.             };
    everything is great.
     
  9. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    What version of the Localization package are you using? Are you using 1.2.1?
     
  10. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Yes 1.2.1, latest version
     

    Attached Files:

  11. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    QA have managed to reproduce it. I just took a quick look and was also able to reproduce it. The issue is to do with our usage of
    params object[] arguments
    . We check if the arguments are not null, if so then we use String.Format on them but we should be checking the size of the arguments as well as the null state. You can work around this now by passing in null arguments yourself like so:

    Code (csharp):
    1. var entry = LocalizationSettings.StringDatabase.GetLocalizedStringAsync("Test", "test_format", null);
    We will get this fixed in a future version, unfortunately, it won't make our next release 1.3.
     
    denis_bogdanov likes this.
  12. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Wonderful!:)
     
    karl_jones likes this.
  13. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135


    A small question

    Does the localization package have any limitations for WebGL?

    Thanks in advance
     
  14. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    The only limitation on webgl is that we don't support the synchronous API because it uses Addressables WaitForCompletion which does not support webgl. You can work around this by using preloading so that the async operations complete immediately
     
    denis_bogdanov likes this.
  15. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135

    May I clarify

    for WebGL:

    1) InitializeSynchronously should be "false"
    Screenshot_1.png


    2) PreloadAllTables should be "true"

    Screenshot_3.png

    3) Always use:

    var op = LocalizationSettings.StringDatabase.GetLocalizedStringAsync(table, key);
    var op= LocalizationSettings.StringDatabase.GetTableAsync(table);

    Instead of

    var str = LocalizationSettings.StringDatabase.GetLocalizedString(table, key);
    var str = LocalizationSettings.StringDatabase.GetTable(table);

    --------------------------------------

    Did I understand it correctly?
     
  16. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Yes that's correct.
     
    denis_bogdanov likes this.
  17. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Thank you!!!
     
  18. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Hello!

    Works great! But I have a problem

    Language does not change, always English.

    How I tried to fix the problem:

    1. set browser language - fr, ru, it - did not help
    2. set windows system language - fr, ru, it - did not help
    3. changed the value <html lang="en-us"> to <html lang="fr-FR"><html lang="ru-RU"><html lang="it-IT"> - did not help

    Am I doing something wrong?
    How to change language in WebGL with localization package?

    Thanks in advance.
     

    Attached Files:

  19. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Could you please file a bug report? I Don't think we currently detect the browser language.
     
  20. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Done
    (Case 1421135)

    Is it possible to determine the browser language through unity?
     
    karl_jones likes this.
  21. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    I'm not sure you currently can, but I'm sure we could find a way to make it work in the future.
     
    denis_bogdanov likes this.
  22. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    One more question)

    How do you get a Locale using Application.systemLanguage?

    Something like this:
    Code (CSharp):
    1. var locale =LocalizationSettings.GetLocaleByLanguage(Application.systemLanguage);
    2.  
    3. LocalizationSettings.SelectedLocale = locale;
     
  23. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    We have implicit conversations for the SystemLanguage enum to LocaleIdentifier so you can just do:

    Code (csharp):
    1. LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
    You should not need to assign the system language to the SelectedLocale though, this is what the SystemLocaleSelector is for. It uses the system language to select the Locale at startup.
    https://docs.unity3d.com/Packages/c...ual/LocalizationSettings.html#locale-selector
    If its not selecting the correct language then that is the bug. We do have custom code in it for Android and iOS so probably need something for WebGL. By default, we prioritize the CultureInfo over Application.systemLanguage as it contains more information, such as the region.
     
    denis_bogdanov likes this.
  24. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    But "System Locale Selector" doesn't work in WebGL, that's why I need
    Code (CSharp):
    1. LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
    It has been chosen:
    Screenshot_3.png
     
  25. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Yes, that looks like the bug. System Locale selector needs fixing. Using Application.systemLanguage may work for you here but it's not the solution. It's not able to differentiate between regional versions, e.g you have Spanish(Spain) and Spanish(Mexico), it will only be able to pick Spanish(Spain) and so users in Mexico will get the wrong version of Spanish.
     
    denis_bogdanov likes this.
  26. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Hello again:)

    I tested:
    Code (CSharp):
    1.    var locale = LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
    2.         Debug.Log(locale);
    3.         LocalizationSettings.SelectedLocale = locale;
    with French and Russian.
    Result: locale is null.
    Screenshot_4.png

    Full Code:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5. using UnityEngine.Localization;
    6. using UnityEngine.Localization.Settings;
    7. using TMPro;
    8.  
    9. public class TestLocalization : MonoBehaviour
    10. {
    11.     public Button button_en;
    12.     public Button button_fr;
    13.     public Button button_ru;
    14.  
    15.     public Locale localeEN;
    16.     public Locale localeFR;
    17.     public Locale localeRU;
    18.  
    19.     public TextMeshProUGUI textA;
    20.     public TextMeshProUGUI textLog;
    21.  
    22.     int index;
    23.  
    24.     ///////////////////////////////////////////////////////////////////////////////////////////////////
    25.  
    26.     void Start()
    27.     {
    28.         Application.logMessageReceived += OnLog;
    29.  
    30.         button_en.onClick.AddListener(SetEN);
    31.         button_fr.onClick.AddListener(SetFR);
    32.         button_ru.onClick.AddListener(SetRU);
    33.  
    34.         textA.text = Application.systemLanguage.ToString();
    35.  
    36.         StartCoroutine(WaitFor());
    37.     }
    38.  
    39. //Localization Settings - System Locale Selector used.
    40.     IEnumerator WaitFor()
    41.     {
    42.         while (!LocalizationSettings.InitializationOperation.IsDone)
    43.             yield return null;
    44.  
    45.         Debug.Log(Application.systemLanguage);
    46.         Debug.Log(LocalizationSettings.SelectedLocale);
    47.  
    48.         var locale = LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
    49.  
    50.         Debug.Log(locale);
    51.  
    52.         LocalizationSettings.SelectedLocale = locale;
    53.  
    54.  
    55.         StartCoroutine(SetForce());
    56.     }
    57.  
    58.     IEnumerator SetForce()
    59.     {
    60.         yield return new WaitForSeconds(5f);
    61.         SetFR();
    62.     }
    63.  
    64.  
    65.     void OnLog(string condition, string stackTrace, LogType type)
    66.     {
    67.         index++;
    68.  
    69.         textLog.text = textLog.text + "\n" + index + ". " + condition;
    70.     }
    71.  
    72.     ////////////////////////////////////////////////////////////////////////////////////////
    73.  
    74.     void SetEN()
    75.     {
    76.         LocalizationSettings.SelectedLocale = localeEN;
    77.         Debug.Log("Force: " + LocalizationSettings.SelectedLocale);
    78.     }
    79.  
    80.     void SetRU()
    81.     {
    82.         LocalizationSettings.SelectedLocale = localeRU;
    83.         Debug.Log("Force: " + LocalizationSettings.SelectedLocale);
    84.     }
    85.  
    86.     void SetFR()
    87.     {
    88.         LocalizationSettings.SelectedLocale = localeFR;
    89.         Debug.Log("Force: " + LocalizationSettings.SelectedLocale);
    90.     }
    91.  
    92. }
    93.  
    var locale = LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
    Doesnt work in the build Webgl and Editor. Always return null.

    Currently, the only way to change the language is to set by force.

    I did it this way:
    Code (CSharp):
    1.     [SerializeField] List<AvailableLocales> availableLocales;
    2.  
    3.     [System.Serializable]
    4.     public class AvailableLocales
    5.     {
    6.         public SystemLanguage systemLanguage;
    7.         public Locale locale;
    8.     }
    9.  
    10.    //Localization Settings - System Locale Selector used.
    11.     public async Task Init()
    12.     {
    13.         // await LocalizationSettings.InitializationOperation.Task;
    14.         while (!LocalizationSettings.InitializationOperation.IsDone)
    15.             await Task.Yield();
    16.  
    17.         var systemLanguage = Application.systemLanguage;
    18.         var target = availableLocales.Find(q => q.systemLanguage == systemLanguage);
    19.         if (target != null)
    20.         {
    21.             LocalizationSettings.SelectedLocale = target.locale;
    22.             await LocalizationSettings.InitializationOperation.Task; //???????????
    23.         }
    24.  
    25.         GameLog.Print(GameLog.LOC, "Locale", LocalizationSettings.SelectedLocale.ToString());
    26.  
    27.         if (onLocalizationChanged != null)
    28.             onLocalizationChanged();
    29.  
    30.         GameLog.Print(GameLog.LOC, "Localization Done");
    31.         localizationDone = true;
    32.     }
    -------------------------------------------------------------
    I have a few questions:

    1) Am I doing something wrong with
    "LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);" ?
    2) When you change the locale, do you need to use "await" as in the example
    Code (CSharp):
    1.       if (target != null)
    2.         {
    3.             LocalizationSettings.SelectedLocale = target.locale;
    4.             await LocalizationSettings.InitializationOperation.Task; //???????????
    5.         }
    6.  
    3) In the WebGl build:

    await LocalizationSettings.InitializationOperation.Task;
    or
    while (!LocalizationSettings.InitializationOperation.IsDone)
    await Task.Yield();

    Will it work correctly? Or is it better to use IEnumerator.

    Thanks in advance
     
    Last edited: Apr 20, 2022
  27. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    This should be enough. You don't need to use a while loop to keep checking it.

    It depends. Are you preloading any tables? If so then yes as this is where the preloading occurs and we only preload the table for the SelectedLocale, we dont load languages that are not being used.

    await LocalizationSettings.InitializationOperation.Task;
    should be fine.

    Although a coroutine is fine. You dont need to spin on it, just doing
    yield return LocalizationSettings.InitializationOperation
    is enough.
     
    denis_bogdanov likes this.
  28. denis_bogdanov

    denis_bogdanov

    Joined:
    Apr 20, 2015
    Posts:
    135
    Thank you.

    And about
    Code (CSharp):
    1. LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
    Does this function return null because it's a bug in WebGL?
     
  29. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    It's possible. We have some fixes for this area coming in 1.3, this should be available in 1-2 weeks. If the problem still persists in 1.3 then please file a bug report.
     
    denis_bogdanov likes this.
  30. Stephanommg

    Stephanommg

    Joined:
    Aug 18, 2014
    Posts:
    72
    I am getting this error when I do

    Code (CSharp):
    1. LocalizationSettings.StringDatabase.GetAllTables(locale).WaitForCompletion();
    And only for one language.
     
  31. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    What does the error say and what does the text for that language look like?
     
  32. Stephanommg

    Stephanommg

    Joined:
    Aug 18, 2014
    Posts:
    72
    I don't remember how to reproduce do issue. I am learning Localization and doing a lot of tests, and code changes. So I don't remember what the error says beyond what is described in the title of this post. The text language was "Titulo {0} um {1}".

    However, the use of GetAllTables(locale).WaitForCompletion() is still causing trouble and it seems it is the source of the previous error. It seems it is not actually waiting (I solved it by forcing synchronization with coroutines). I am currently using it followed by LocalizationSettings.SelectedLocale = locale; and it gives me these errors (although it correctly changes the language):

    System.NullReferenceException: Object reference not set to an instance of an object
    at UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1[TObject].Execute () [0x00070] in D:\Unity\Teste\Library\PackageCache\com.unity.addressables@1.19.19\Runtime\ResourceManager\AsyncOperations\ProviderOperation.cs:232
    UnityEngine.Localization.Settings.LocalizedDatabase`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:GetAllTables (UnityEngine.Localization.Locale)
    LangTest:setLanguage (UnityEngine.Localization.Locale) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:50)
    LangTest:changeLang (int) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:44)
    LangTest:changeLang () (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:26)
    UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

    and


    OperationException : GroupOperation failed because one of its dependencies failed
    System.NullReferenceException: Object reference not set to an instance of an object
    at UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1[TObject].Execute () [0x00070] in D:\Unity\Teste\Library\PackageCache\com.unity.addressables@1.19.19\Runtime\ResourceManager\AsyncOperations\ProviderOperation.cs:232
    UnityEngine.Localization.Settings.LocalizedDatabase`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:GetAllTables (UnityEngine.Localization.Locale)
    LangTest:setLanguage (UnityEngine.Localization.Locale) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:50)
    LangTest:changeLang (int) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:44)
    LangTest:changeLang () (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:26)
    UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

    and


    ResourceManagerException : ProvideResources failed
    OperationException : GroupOperation failed because one of its dependencies failed
    System.NullReferenceException: Object reference not set to an instance of an object
    at UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1[TObject].Execute () [0x00070] in D:\Unity\Teste\Library\PackageCache\com.unity.addressables@1.19.19\Runtime\ResourceManager\AsyncOperations\ProviderOperation.cs:232
    UnityEngine.Localization.Settings.LocalizedDatabase`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:GetAllTables (UnityEngine.Localization.Locale)
    LangTest:setLanguage (UnityEngine.Localization.Locale) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:50)
    LangTest:changeLang (int) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:44)
    LangTest:changeLang () (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:26)
    UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

    and


    OperationException : ChainOperation failed because dependent operation failed
    ResourceManagerException : ProvideResources failed
    OperationException : GroupOperation failed because one of its dependencies failed
    System.NullReferenceException: Object reference not set to an instance of an object
    at UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1[TObject].Execute () [0x00070] in D:\Unity\Teste\Library\PackageCache\com.unity.addressables@1.19.19\Runtime\ResourceManager\AsyncOperations\ProviderOperation.cs:232
    UnityEngine.ResourceManagement.ChainOperationTypelessDepedency`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>:OnWrappedCompleted (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>)
    DelegateList`1<UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>>:Invoke (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>) (at Library/PackageCache/com.unity.addressables@1.19.19/Runtime/ResourceManager/Util/DelegateList.cs:69)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>:WaitForCompletion ()
    LangTest:setLanguage (UnityEngine.Localization.Locale) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:50)
    LangTest:changeLang (int) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:44)
    LangTest:changeLang () (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:26)
    UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)


    and


    OperationException : ChainOperation failed because dependent operation failed

    UnityEngine.Localization.LoadAllTablesOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:LoadingCompleted (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>)
    DelegateList`1<UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>>:Invoke (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>) (at Library/PackageCache/com.unity.addressables@1.19.19/Runtime/ResourceManager/Util/DelegateList.cs:69)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.Localization.Tables.StringTable>>:WaitForCompletion ()
    LangTest:setLanguage (UnityEngine.Localization.Locale) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:50)
    LangTest:changeLang (int) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:44)
    LangTest:changeLang () (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:26)
    UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)


    and


    NullReferenceException: Object reference not set to an instance of an object
    UnityEngine.Localization.Settings.LocalizedDatabase`2[TTable,TEntry].RegisterTablesOperation (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1[TObject] tablesOperation) (at Library/PackageCache/com.unity.localization@1.3.2/Runtime/Settings/Database/LocalizedDatabase.cs:179)
    DelegateList`1[T].Invoke (T res) (at Library/PackageCache/com.unity.addressables@1.19.19/Runtime/ResourceManager/Util/DelegateList.cs:69)
    UnityEngine.Debug:LogException(Exception)
    DelegateList`1:Invoke(AsyncOperationHandle`1) (at Library/PackageCache/com.unity.addressables@1.19.19/Runtime/ResourceManager/Util/DelegateList.cs:73)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1:WaitForCompletion()
    LangTest:setLanguage(Locale) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:50)
    LangTest:changeLang(Int32) (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:44)
    LangTest:changeLang() (at Assets/MAIN_PROJECT/Resources2/LangTest.cs:26)
    UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)
     
  33. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    What version of the package are you using? Can you try 1.4.3. if it's not visible in the package manager you can edit the manifest.json file in the packages folder.
     
  34. Stephanommg

    Stephanommg

    Joined:
    Aug 18, 2014
    Posts:
    72
    I am using version 1.3.2. So all I have to do is to replace the 1.3.2 by 1.4.3 in this file? I did this but it shows as if it was out of date. It also gave me errors in the player.
     
  35. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    What errors do you get?
     
  36. Stephanommg

    Stephanommg

    Joined:
    Aug 18, 2014
    Posts:
    72
    A bit of context first:

    I am trying to read a string table from a csv using this approach https://forum.unity.com/threads/creating-stringtable-at-runtime.999439/

    So I need to call the getAllTables to load the csv. I am currently using 2 languages built on the Unity Editor, and 1 language (I mean a string table) defined in a csv. I have a test program in which I switch the languages.

    About the error:
    First I get a No translation found when the game starts and the custom language is tried to be loaded. Then if I switch languages and set the custom language back, I get these:

    System.NullReferenceException: The Table "" does not have a SharedTableData.
    at UnityEngine.Localization.Tables.LocalizationTable.VerifySharedTableDataIsNotNull () [0x00011] in D:\Unity\Teste\Library\PackageCache\com.unity.localization@1.4.3\Runtime\Tables\LocalizationTable.cs:154
    at UnityEngine.Localization.Tables.LocalizationTable.FindKeyId (System.String key, System.Boolean addKey) [0x00001] in D:\Unity\Teste\Library\PackageCache\com.unity.localization@1.4.3\Runtime\Tables\LocalizationTable.cs:147
    at UnityEngine.Localization.Tables.DetailedLocalizationTable`1[TEntry].AddEntry (System.String key, System.String localized) [0x00001] in D:\Unity\Teste\Library\PackageCache\com.unity.localization@1.4.3\Runtime\Tables\DetailedLocalizationTable.cs:398
    at CsvTableProvider.ImportTable (System.String filePath) [0x0005c] in D:\Unity\Teste\Assets\MAIN_PROJECT\Resources2\LangTest.cs:193
    at CsvTableProvider.Provide (UnityEngine.ResourceManagement.ResourceProviders.ProvideHandle provideHandle) [0x0000f] in D:\Unity\Teste\Assets\MAIN_PROJECT\Resources2\LangTest.cs:155
    at UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1[TObject].Execute () [0x00070] in D:\Unity\Teste\Library\PackageCache\com.unity.addressables@1.20.5\Runtime\ResourceManager\AsyncOperations\ProviderOperation.cs:244
    UnityEngine.StackTraceUtility:ExtractStackTrace ()
    UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
    UnityEngine.Logger:Log (UnityEngine.LogType,object)
    UnityEngine.Debug:LogError (object)
    UnityEngine.AddressableAssets.AddressablesImpl:LogException (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/AddressablesImpl.cs:219)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:set_OperationException (System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:348)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:Complete (UnityEngine.Localization.Tables.StringTable,bool,System.Exception,bool) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:488)
    UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1<UnityEngine.Localization.Tables.StringTable>:providerCompleted<UnityEngine.Localization.Tables.StringTable> (UnityEngine.Localization.Tables.StringTable,bool,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/ProviderOperation.cs:191)
    UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1<UnityEngine.Localization.Tables.StringTable>:Execute () (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/ProviderOperation.cs:248)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:InvokeExecute () (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:536)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:Start (UnityEngine.ResourceManagement.ResourceManager,UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle,DelegateList`1<single>) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:531)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:UnityEngine.ResourceManagement.AsyncOperations.IAsyncOperation.Start (UnityEngine.ResourceManagement.ResourceManager,UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle,DelegateList`1<single>) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:598)
    UnityEngine.ResourceManagement.ResourceManager:StartOperation (UnityEngine.ResourceManagement.AsyncOperations.IAsyncOperation,UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceManager.cs:536)
    UnityEngine.ResourceManagement.ResourceManager:provideResource (UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation,System.Type,bool) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceManager.cs:454)
    UnityEngine.ResourceManagement.ResourceManager:provideResource<UnityEngine.Localization.Tables.StringTable> (UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceManager.cs:516)
    UnityEngine.AddressableAssets.AddressablesImpl:LoadAssetAsync<UnityEngine.Localization.Tables.StringTable> (UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/AddressablesImpl.cs:553)
    UnityEngine.AddressableAssets.Addressables:LoadAssetAsync<UnityEngine.Localization.Tables.StringTable> (UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/Addressables.cs:899)
    UnityEngine.Localization.AddressablesInterface:LoadTableFromLocationInternal<UnityEngine.Localization.Tables.StringTable> (UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Addressables/AddressablesInterface.cs:88)
    UnityEngine.Localization.AddressablesInterface:LoadTableFromLocation<UnityEngine.Localization.Tables.StringTable> (UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Addressables/AddressablesInterface.cs:78)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:LoadTableResource (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation>>) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:142)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:DefaultLoadTableByName () (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:124)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:FindTableByName (string) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:92)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:LoadTableByGuid (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.SharedTableData>) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:80)
    DelegateList`1<UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.SharedTableData>>:Invoke (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.SharedTableData>) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/Util/DelegateList.cs:75)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.SharedTableData>:InvokeCompletionEvent () (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:395)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.SharedTableData>:Complete (UnityEngine.Localization.Tables.SharedTableData,bool,System.Exception,bool) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:508)
    UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1<UnityEngine.Localization.Tables.SharedTableData>:providerCompleted<object> (object,bool,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/ProviderOperation.cs:191)
    UnityEngine.ResourceManagement.ResourceProviders.ProvideHandle:Complete<object> (object,bool,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceProviders/IResourceProvider.cs:144)
    UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider/InternalOp:CompleteOperation () (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceProviders/BundledAssetProvider.cs:217)
    UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider/InternalOp:ActionComplete (UnityEngine.AsyncOperation) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceProviders/BundledAssetProvider.cs:179)
    UnityEngine.AsyncOperation:InvokeCompletionEvent ()

    (Filename: D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/AddressablesImpl.cs Line: 219)

    OperationException : Unknown error in AsyncOperation : UnityEngine.Localization.Operations.LoadTableOperation`2[UnityEngine.Localization.Tables.StringTable,UnityEngine.Localization.Tables.StringTableEntry], result='', status='Failed'
    UnityEngine.StackTraceUtility:ExtractStackTrace ()
    UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
    UnityEngine.Logger:Log (UnityEngine.LogType,object)
    UnityEngine.Debug:LogError (object)
    UnityEngine.AddressableAssets.AddressablesImpl:LogException (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/AddressablesImpl.cs:219)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:set_OperationException (System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:348)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:Complete (UnityEngine.Localization.Tables.StringTable,bool,System.Exception,bool) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:486)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:Complete (UnityEngine.Localization.Tables.StringTable,bool,string,bool) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:451)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.StringTable>:Complete (UnityEngine.Localization.Tables.StringTable,bool,string) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:435)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:TableLoaded (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.StringTable>) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:166)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:LoadTableResource (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<System.Collections.Generic.IList`1<UnityEngine.ResourceManagement.ResourceLocations.IResourceLocation>>) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:145)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:DefaultLoadTableByName () (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:124)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:FindTableByName (string) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:92)
    UnityEngine.Localization.Operations.LoadTableOperation`2<UnityEngine.Localization.Tables.StringTable, UnityEngine.Localization.Tables.StringTableEntry>:LoadTableByGuid (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.SharedTableData>) (at D:/Unity/Teste/Library/PackageCache/com.unity.localization@1.4.3/Runtime/Operations/LoadTableOperation.cs:80)
    DelegateList`1<UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.SharedTableData>>:Invoke (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1<UnityEngine.Localization.Tables.SharedTableData>) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/Util/DelegateList.cs:75)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.SharedTableData>:InvokeCompletionEvent () (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:395)
    UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1<UnityEngine.Localization.Tables.SharedTableData>:Complete (UnityEngine.Localization.Tables.SharedTableData,bool,System.Exception,bool) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:508)
    UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation`1<UnityEngine.Localization.Tables.SharedTableData>:providerCompleted<object> (object,bool,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/AsyncOperations/ProviderOperation.cs:191)
    UnityEngine.ResourceManagement.ResourceProviders.ProvideHandle:Complete<object> (object,bool,System.Exception) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceProviders/IResourceProvider.cs:144)
    UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider/InternalOp:CompleteOperation () (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceProviders/BundledAssetProvider.cs:217)
    UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider/InternalOp:ActionComplete (UnityEngine.AsyncOperation) (at D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/ResourceManager/ResourceProviders/BundledAssetProvider.cs:179)
    UnityEngine.AsyncOperation:InvokeCompletionEvent ()

    (Filename: D:/Unity/Teste/Library/PackageCache/com.unity.addressables@1.20.5/Runtime/AddressablesImpl.cs Line: 219)
     
  37. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
  38. Stephanommg

    Stephanommg

    Joined:
    Aug 18, 2014
    Posts:
    72
    I am not using the approach you posted because I am not using version 1.4.3. I am using the approach of the user that created the post. Here is all code (it is meant for testing so there is trash altogether):


    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.AddressableAssets;
    5. using UnityEngine.Localization;
    6. using UnityEngine.Localization.Components;
    7. using UnityEngine.Localization.Settings;
    8. using UnityEngine.Localization.SmartFormat.PersistentVariables;
    9. using UnityEngine.Localization.Tables;
    10. using UnityEngine.Localization.Settings;
    11. using UnityEngine.ResourceManagement.AsyncOperations;
    12. using UnityEngine.ResourceManagement.ResourceProviders;
    13. using System;
    14. using UnityEngine.ResourceManagement.ResourceLocations;
    15. using System.IO;
    16. using UnityEngine.AddressableAssets.ResourceLocators;
    17. using UnityEngine.ResourceManagement.Util;
    18. using System.Linq;
    19.  
    20. public class LangTest : MonoBehaviour
    21. {
    22.     public TMPro.TextMeshProUGUI auxTxt;
    23.     private List<Locale> customLocales = new List<Locale>();
    24.  
    25.     public void changeLang() {
    26.         changeLang((LocalizationSettings.AvailableLocales.Locales.IndexOf(LocalizationSettings.SelectedLocale) + 1) % LocalizationSettings.AvailableLocales.Locales.Count);
    27.     }
    28.     public void changeLang(int locIdx) {
    29.         if (LocalizationSettings.InitializationOperation.IsDone) {
    30.             LocalizeStringEvent s = GetComponent<LocalizeStringEvent>();
    31.             //usando variaveis
    32.             //if (s.StringReference.TryGetValue("var", out var value))
    33.             //    (value as StringVariable).Value = Random.value.ToString();
    34.             //s.StringReference = new LocalizedString("UI", "Char Panel Title");
    35.  
    36.             ////entrada dinamica
    37.             //var uiTable = LocalizationSettings.StringDatabase.GetTable("Dialogue", LocalizationSettings.AvailableLocales.Locales[locIdx]);
    38.             //string str = uiTable.GetEntry("Ana_conv1").GetLocalizedString("A1", -1);
    39.             //auxTxt.text = str;
    40.  
    41.             //usando argumentos
    42.             s.StringReference.Arguments[0] = UnityEngine.Random.value.ToString();
    43.             s.StringReference.Arguments[1] = UnityEngine.Random.value.ToString()+"!";
    44.             PlayerPrefs.SetString("language", LocalizationSettings.AvailableLocales.Locales[locIdx].Identifier.ToString());
    45.             setLanguage(LocalizationSettings.AvailableLocales.Locales[locIdx]);
    46.  
    47.         }
    48.     }
    49.     public void setLanguage(Locale locale) {
    50.         //if (!isOriginal(locale)) {
    51.         //    LocalizationSettings.StringDatabase.GetAllTables(locale).WaitForCompletion(); //loads custom lang string table data
    52.         //}
    53.         LocalizationSettings.SelectedLocale = locale;
    54.     }
    55.     public bool isOriginal(Locale locale) {
    56.         return !customLocales.Contains(locale);
    57.     }
    58.  
    59.     IEnumerator Start() {
    60.         yield return Addressables.InitializeAsync();
    61.  
    62.         LocalizeStringEvent s = GetComponent<LocalizeStringEvent>();
    63.         s.StringReference.Arguments = new List<object>();
    64.         s.StringReference.Arguments.Add("kkk");
    65.         s.StringReference.Arguments.Add("aaa");
    66.         yield return StartCoroutine(createOriginalCSVs_coroutine());
    67.         createCustomLocales();
    68.  
    69.         var tables = getAllTables(LocalizationSettings.SelectedLocale);
    70.         foreach (var table in tables)
    71.             Addressables.ResourceManager.ResourceProviders.Add(new CsvTableProvider(table.SharedData));
    72.         Addressables.AddResourceLocator(new CsvResourceLocator());
    73.         initLanguage();
    74.     }
    75.     private void initLanguage() {
    76.         if (PlayerPrefs.HasKey("language"))
    77.             setLanguage(LocalizationSettings.AvailableLocales.Locales.Find(x => x.Identifier.ToString() == PlayerPrefs.GetString("language")));
    78.     }
    79.     IEnumerator createOriginalCSVs_coroutine() {
    80.         yield return Addressables.InitializeAsync();
    81.         createOriginalInCSVs();
    82.     }
    83.     public void createOriginalInCSVs() {
    84.         string baseDir = originalLangDir();
    85.         foreach (var locale in LocalizationSettings.AvailableLocales.Locales) {
    86.             var tables = getAllTables(locale);
    87.             foreach (var table in tables) {
    88.                 string dir = Path.Combine(baseDir, table.name.Substring(table.name.IndexOf("_") + 1));
    89.                 Directory.CreateDirectory(dir);
    90.                 string filePath = Path.Combine(dir, table.name + ".csv");
    91.                 using (var writer = File.CreateText(filePath)) {
    92.                     foreach (var entry in table.Values) {
    93.                         string entryStr = entry.Key + ";" + entry.LocalizedValue;
    94.                         writer.WriteLine(entryStr);
    95.                     }
    96.                 }
    97.             }
    98.         }
    99.     }
    100.     private IList<StringTable> getAllTables(Locale locale) {
    101.         return LocalizationSettings.StringDatabase.GetAllTables(locale).WaitForCompletion();
    102.         //List<StringTable> tables = new List<StringTable>();
    103.         //tables.Add(LocalizationSettings.StringDatabase.GetTable("UI", locale));
    104.         //tables.Add(LocalizationSettings.StringDatabase.GetTable("Dialogue", locale));
    105.         //return tables;
    106.     }
    107.     private void createCustomLocales() {
    108.         string baseDir = customLangDir();
    109.         string[] langNames = Directory.GetDirectories(baseDir).Select(Path.GetFileName).ToArray();
    110.         foreach (string name in langNames) {
    111.             Locale locale = Locale.CreateLocale(name);
    112.             locale.LocaleName = name;
    113.             LocalizationSettings.AvailableLocales.AddLocale(locale);
    114.             customLocales.Add(locale);
    115.         }
    116.     }
    117.     public static string originalLangDir() {
    118.         return Path.Combine(Application.streamingAssetsPath, "Language", "Original");
    119.     }
    120.     public static string customLangDir() {
    121.         return Path.Combine(Application.streamingAssetsPath, "Language", "Custom");
    122.     }
    123. }
    124. public class CsvResourceLocator : IResourceLocator {
    125.     public string LocatorId => nameof(CsvResourceLocator);
    126.  
    127.     public IEnumerable<object> Keys => new object[0];
    128.  
    129.     public bool Locate(object key, Type type, out IList<IResourceLocation> locations) {
    130.         if (!typeof(StringTable).IsAssignableFrom(type)) {
    131.             locations = null;
    132.             return false;
    133.         }
    134.  
    135.         locations = new List<IResourceLocation>();
    136.  
    137.         IResourceLocation[] noDependencies = new ResourceLocationBase[0];
    138.         locations.Add(new ResourceLocationBase(key as string, key as string, typeof(CsvTableProvider).FullName, type, noDependencies));
    139.  
    140.  
    141.         return true;
    142.     }
    143. }
    144. public class CsvTableProvider : ResourceProviderBase {
    145.     private SharedTableData _sharedDataTable;
    146.  
    147.     public CsvTableProvider(SharedTableData sharedDataTable) {
    148.         _sharedDataTable = sharedDataTable;
    149.     }
    150.  
    151.     public override void Provide(ProvideHandle provideHandle) {
    152.  
    153.         string filePath = ResourceLocationCsvPath(provideHandle.Location);
    154.  
    155.         StringTable st = ImportTable(filePath);
    156.  
    157.         object result;
    158.         if (provideHandle.Type.IsArray) {
    159.             result = ResourceManagerConfig.CreateArrayResult(provideHandle.Type, new UnityEngine.Object[] { st });
    160.         } else if (provideHandle.Type.IsGenericType && typeof(IList<>) == provideHandle.Type.GetGenericTypeDefinition()) {
    161.             result = ResourceManagerConfig.CreateListResult(provideHandle.Type, new UnityEngine.Object[] { st });
    162.         } else {
    163.             result = st;
    164.         }
    165.         provideHandle.Complete(result, result != null, result == null ? new Exception($"Unable to load asset of type {provideHandle.Type} from location {provideHandle.Location}.") : null);
    166.     }
    167.  
    168.  
    169.     public override bool CanProvide(Type t, IResourceLocation location) {
    170.         string path = ResourceLocationCsvPath(location);
    171.  
    172.         return
    173.             t.Equals(typeof(StringTable))
    174.             && (path != null);
    175.     }
    176.  
    177.  
    178.     private StringTable ImportTable(string filePath) {
    179.         string fname = Path.GetFileNameWithoutExtension(filePath);
    180.         string id = fname.Substring(fname.IndexOf("_") + 1);
    181.         Locale newLocale = Locale.CreateLocale(id);
    182.  
    183.         newLocale.LocaleName = id;
    184.  
    185.         List<(string key, string value)> entries = ReadCsvEntries(filePath);
    186.  
    187.         StringTable stringTable = ScriptableObject.CreateInstance<StringTable>();
    188.         stringTable.LocaleIdentifier = newLocale.Identifier;
    189.         stringTable.SharedData = _sharedDataTable;
    190.  
    191.  
    192.         for (int i = 0; i < entries.Count; i++) {
    193.             var e = stringTable.AddEntry(
    194.                 entries[i].key,
    195.                 entries[i].value);
    196.             e.IsSmart = true;
    197.         }
    198.  
    199.  
    200.         return stringTable;
    201.     }
    202.  
    203.     private List<(string, string)> ReadCsvEntries(string filePath) {
    204.  
    205.         List<(string, string)> entries = new List<(string, string)>();
    206.         using (var stream = new StreamReader(filePath)) {
    207.             string line;
    208.             while ((line = stream.ReadLine()) != null) {
    209.                 int sep = line.IndexOf(";");
    210.                 entries.Add((line.Substring(0, sep), line.Substring(sep + 1)));
    211.             }
    212.         }
    213.         return entries;
    214.     }
    215.  
    216.     private string ResourceLocationCsvPath(IResourceLocation location) {
    217.         if (_sharedDataTable.TableCollectionName.Length >= location.PrimaryKey.Length)
    218.             return null;
    219.  
    220.         string fileName = location.PrimaryKey;//.Substring(_sharedDataTable.TableCollectionName.Length + 1); //Expected StringTable PrimaryKey format: "{Collection.Name}_{CultureName}"
    221.         string filePath = Path.Combine(LangTest.customLangDir(), fileName.Substring(fileName.IndexOf("_")+1), fileName + ".csv");
    222.  
    223.         return File.Exists(filePath) ? filePath : null;
    224.  
    225.     }
    226.  
    227. }
    The problem is with
    Code (CSharp):
    1. return LocalizationSettings.StringDatabase.GetAllTables(locale).WaitForCompletion();
    on line 101.
     
  39. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    The error message coming from VerifySharedTableDataIsNotNull looks like an old bug we have since fixed.
    I recommend you upgrade to the latest patch release 1.4.4. If it is not visible in the package manager you can edit the manifest.json file in the project Packages folder.
    This also means you can make use of the table providers and patchers which are much simpler to use than this approach.

    You can also remove some of the code in the changeLang method, we have a PlayerPrefs selector which will store the chosen language for you.
     
  40. Stephanommg

    Stephanommg

    Joined:
    Aug 18, 2014
    Posts:
    72
    Thank you. As I said before, it didn't work well to simply change the package name. So I am considering updating Unity. What is the least version required for version 1.4?
     
  41. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    2019.4. if you are already using the package then you should be able to update without updating unity unless you are on a very old version (pre 1.0).