Search Unity

SmartFormat NullreferenceException

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

  1. Skjalg

    Skjalg

    Joined:
    May 25, 2009
    Posts:
    211
    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:
    8,282
    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:
    211
    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:
    8,282
    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:
    211
    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:
    8,282
    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:
    8,282
    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);