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

SmartFormat NullreferenceException

Discussion in 'Localization Tools' started by Skjalg, Mar 3, 2021.

  1. Skjalg

    Skjalg

    Joined:
    May 25, 2009
    Posts:
    208
    If I click on the checkbox in a localization table that says "Smart" I get this error.

    upload_2021-3-3_23-19-5.png


    NullReferenceException: Object reference not set to an instance of an object
    UnityEngine.Localization.SmartFormat.Core.Parsing.Parser.ParseFormat (System.String format, System.Collections.Generic.List`1[T] formatterExtensionNames) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Smart Format/Core/Parsing/Parser.cs:437)
    UnityEngine.Localization.SmartFormat.SmartFormatter.Format (System.IFormatProvider provider, System.String format, System.Object[] args) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Smart Format/SmartFormatter.cs:168)
    UnityEngine.Localization.SmartFormat.SmartFormatter.Format (System.String format, System.Object[] args) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Smart Format/SmartFormatter.cs:153)
    UnityEngine.Localization.Settings.LocalizedStringDatabase.ProcessUntranslatedText (System.String key, System.Int64 KeyId, UnityEngine.Localization.Tables.TableReference tableReference, UnityEngine.Localization.Tables.StringTable table, UnityEngine.Localization.Locale locale) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Settings/Database/LocalizedStringDatabase.cs:188)
    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.Object[] arguments) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Settings/Database/LocalizedStringDatabase.cs:117)
    UnityEngine.Localization.LocalizedString.RefreshString () (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Localized Reference/LocalizedString.cs:159)
    UnityEngine.Localization.LocalizedString.AutomaticLoadingCompleted (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1[TObject] loadOperation) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Localized Reference/LocalizedString.cs:296)
    UnityEngine.Localization.LocalizedString.HandleLocaleChange (UnityEngine.Localization.Locale _) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Localized Reference/LocalizedString.cs:284)
    UnityEngine.Localization.LocalizedString.ForceUpdate () (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Localized Reference/LocalizedString.cs:218)
    UnityEngine.Localization.LocalizedString.add_StringChanged (UnityEngine.Localization.LocalizedString+ChangeHandler value) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Localized Reference/LocalizedString.cs:116)
    UnityEngine.Localization.Components.LocalizeStringEvent.RegisterChangeHandler () (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Component Localizers/LocalizeStringEvent.cs:107)
    UnityEngine.Localization.Components.LocalizeStringEvent.OnEnable () (at Library/PackageCache/com.unity.localization@0.10.0-preview/Runtime/Component Localizers/LocalizeStringEvent.cs:87)


    Is there some kind of setup I am missing?
     
  2. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    That seems to indicate that the Settings are null in the Parser. Its a serialised field that should not be null.
    What happens if you look at the settings in the inspector?
    Can you see a value for this?
    Screen Shot 2021-03-03 at 22.30.42.png

    Can you share the Localization Settings.asset file ?

    One way to fix this is to delete the Settings file and recreate it although it would be nice to figure out what actually caused this issue ;)
     
  3. Skjalg

    Skjalg

    Joined:
    May 25, 2009
    Posts:
    208
    Here you go!

    upload_2021-3-3_23-47-51.png


    Code (CSharp):
    1. %YAML 1.1
    2. %TAG !u! tag:unity3d.com,2011:
    3. --- !u!114 &11400000
    4. MonoBehaviour:
    5.   m_ObjectHideFlags: 0
    6.   m_CorrespondingSourceObject: {fileID: 0}
    7.   m_PrefabInstance: {fileID: 0}
    8.   m_PrefabAsset: {fileID: 0}
    9.   m_GameObject: {fileID: 0}
    10.   m_Enabled: 1
    11.   m_EditorHideFlags: 0
    12.   m_Script: {fileID: 11500000, guid: a07b5cd0b1b829245bc8c4b6978793e8, type: 3}
    13.   m_Name: Localization Settings
    14.   m_EditorClassIdentifier:
    15.   m_StartupSelectors:
    16.   - id: 0
    17.   - id: 1
    18.   - id: 2
    19.   m_AvailableLocales:
    20.     id: 3
    21.   m_AssetDatabase:
    22.     id: 4
    23.   m_StringDatabase:
    24.     id: 5
    25.   references:
    26.     version: 1
    27.     00000000:
    28.       type: {class: CommandLineLocaleSelector, ns: UnityEngine.Localization.Settings,
    29.         asm: Unity.Localization}
    30.       data:
    31.         m_CommandLineArgument: -language =
    32.     00000001:
    33.       type: {class: SystemLocaleSelector, ns: UnityEngine.Localization.Settings, asm: Unity.Localization}
    34.       data:
    35.         dummyObject: 0
    36.     00000002:
    37.       type: {class: SpecificLocaleSelector, ns: UnityEngine.Localization.Settings,
    38.         asm: Unity.Localization}
    39.       data:
    40.         m_LocaleId:
    41.           m_Code: en
    42.     00000003:
    43.       type: {class: LocalesProvider, ns: UnityEngine.Localization.Settings, asm: Unity.Localization}
    44.       data:
    45.         dummyObject: 0
    46.     00000004:
    47.       type: {class: LocalizedAssetDatabase, ns: UnityEngine.Localization.Settings,
    48.         asm: Unity.Localization}
    49.       data:
    50.         m_DefaultTableReference:
    51.           m_TableCollectionName: FakeLocaleTest
    52.     00000005:
    53.       type: {class: LocalizedStringDatabase, ns: UnityEngine.Localization.Settings,
    54.         asm: Unity.Localization}
    55.       data:
    56.         m_DefaultTableReference:
    57.           m_TableCollectionName: FakeLocaleTest
    58.         m_NoTranslationFoundFormat: '{0}'
    59.         m_SmartFormat:
    60.           id: 6
    61.     00000006:
    62.       type: {class: SmartFormatter, ns: UnityEngine.Localization.SmartFormat, asm: Unity.Localization}
    63.       data:
    64.         m_Settings:
    65.           id: 7
    66.         m_Parser:
    67.           id: 8
    68.         m_Sources:
    69.         - id: 9
    70.         - id: 10
    71.         - id: 11
    72.         - id: 12
    73.         - id: 13
    74.         m_Formatters:
    75.         - id: 14
    76.         - id: 14
    77.         - id: 14
    78.         - id: 14
    79.         - id: 14
    80.         - id: 14
    81.         - id: 14
    82.         - id: 14
    83.     00000007:
    84.       type: {class: SmartSettings, ns: UnityEngine.Localization.SmartFormat.Core.Settings,
    85.         asm: Unity.Localization}
    86.       data:
    87.         m_FormatErrorAction: 2
    88.         m_ParseErrorAction: 2
    89.         m_CaseSensitivity: 0
    90.         m_ConvertCharacterStringLiterals: 1
    91.     00000008:
    92.       type: {class: Parser, ns: UnityEngine.Localization.SmartFormat.Core.Parsing,
    93.         asm: Unity.Localization}
    94.       data:
    95.         m_OpeningBrace: 123
    96.         m_ClosingBrace: 125
    97.         m_Settings:
    98.           id: 14
    99.         m_AlphanumericSelectors: 7
    100.         m_AllowedSelectorChars: "\x02"
    101.         m_Operators: INVALID_UTF8_STRING
    102.         m_AlternativeEscaping: 0
    103.         m_AlternativeEscapeChar: 0
    104.     00000009:
    105.       type: {class: ListFormatter, ns: UnityEngine.Localization.SmartFormat.Extensions,
    106.         asm: Unity.Localization}
    107.       data:
    108.         m_Names:
    109.         - list
    110.         - l
    111.         -
    112.         m_SmartSettings:
    113.           id: 14
    114.     0000000A:
    115.       type: {class: DictionarySource, ns: UnityEngine.Localization.SmartFormat.Extensions,
    116.         asm: Unity.Localization}
    117.       data:
    118.         dummyObject: 0
    119.     0000000B:
    120.       type: {class: XmlSource, ns: UnityEngine.Localization.SmartFormat.Extensions,
    121.         asm: Unity.Localization}
    122.       data:
    123.         dummyObject: 0
    124.     0000000C:
    125.       type: {class: ReflectionSource, ns: UnityEngine.Localization.SmartFormat.Extensions,
    126.         asm: Unity.Localization}
    127.       data:
    128.         dummyObject: 0
    129.     0000000D:
    130.       type: {class: DefaultSource, ns: UnityEngine.Localization.SmartFormat.Extensions,
    131.         asm: Unity.Localization}
    132.       data:
    133.         dummyObject: 0
    134.     0000000E:
    135.       type: {class: , ns: , asm: }
    136.  
     
  4. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Oh yeah it's totally broken. All the formatters have gone and there's a strange utf8 error. Any idea how you got into this situation? I suspect it's a serializereference bug.
    Delete the settings and creating a new one will fix it.
     
  5. Skjalg

    Skjalg

    Joined:
    May 25, 2009
    Posts:
    208
    Yeah that fixed it :) thanks!

    Just one thing though, adding a list formatter by using the + icon there produces an error
    upload_2021-3-4_10-21-15.png


    Code (CSharp):
    1. MissingMethodException: Default constructor not found for type UnityEngine.Localization.SmartFormat.Extensions.ListFormatter
    2. System.RuntimeType.CreateInstanceMono (System.Boolean nonPublic) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
    3. System.RuntimeType.CreateInstanceSlow (System.Boolean publicOnly, System.Boolean skipCheckThis, System.Boolean fillCache, System.Threading.StackCrawlMark& stackMark) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
    4. System.RuntimeType.CreateInstanceDefaultCtor (System.Boolean publicOnly, System.Boolean skipCheckThis, System.Boolean fillCache, System.Threading.StackCrawlMark& stackMark) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
    5. System.Activator.CreateInstance (System.Type type, System.Boolean nonPublic) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
    6. System.Activator.CreateInstance (System.Type type) (at <eae584ce26bc40229c1b1aa476bfa589>:0)
    7. UnityEditor.Localization.UI.Toolkit.ManagedReferenceReorderableList.AddManagedItem (UnityEditor.Localization.UI.Toolkit.ReorderableList list, System.Type type, System.Int32 index) (at Library/PackageCache/com.unity.localization@0.10.0-preview/Editor/UI/Utility/ManagedReferenceReorderableList.cs:100)
    8. UnityEditor.Localization.UI.Toolkit.ManagedReferenceReorderableList+<>c__DisplayClass12_1.<ShowAddItemMenu>b__0 () (at Library/PackageCache/com.unity.localization@0.10.0-preview/Editor/UI/Utility/ManagedReferenceReorderableList.cs:84)
    9. UnityEditor.GenericMenu.CatchMenu (System.Object userData, System.String[] options, System.Int32 selected) (at <208995a09fe148f5a6f6c571838c154f>:0)
    10.  
     
  6. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    Ah I actually just discovered that one myself. I created a bug report for it.
     
    Skjalg likes this.
  7. karl_jones

    karl_jones

    Unity Technologies

    Joined:
    May 5, 2015
    Posts:
    7,845
    This is quite a simple fix so if you need a workaround it can be fixed by modifying the file:
    com.unity.localization/Packages/com.unity.localization/Editor/UI/Smart Format/SmartFormatterPropertyField.cs

    Add this to line 32
    Code (csharp):
    1. formatters.AddCallback = (l, i) => ShowAddMenu(l, i, property);