# Label bug in module configuration page (Ignition 8.1.48)

**URL:** <https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207>\
**Category:** Module Development\
**Created:** [February 26, 2026, 5:21pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207 "2026-02-26T17:21:47Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [February 26, 2026, 5:21pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/1 "2026-02-26T17:21:47Z")

</div>

I’m working on developing the configuration page for my module and when configuring the second page I came across this problem with my labels.

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/1/413a127b710edf66dead56f71036c92b1f478ce0.png)

I am using a UserMfaRecord.properties file for them and I think I did everything the same way I did for the first page but somehow I can’t seem to get the labels to have the correct name. I got the category to work properly using a different .properties file (the same one I used for my first page), but when I tried using it for the labels it still didn’t change a thing. Here’s the code:

```python
 public static class UserMfaRecord extends PersistentRecord {  
        
        public static final RecordMeta<UserMfaRecord> META = new RecordMeta<UserMfaRecord>(
                UserMfaRecord.class, "UserMfaRecord")
                .setNounKey("UserMfaRecord.Noun")
                .setNounPluralKey("UserMfaRecord.Noun.Plural");

         public interface IRecordListener<T> {

             void onRecordCreated(T record);
         }

         private static final List<IRecordListener<UserMfaRecord>> listeners = new ArrayList<>();

         public static void addRecordListener(IRecordListener<UserMfaRecord> listener) {
             listeners.add(listener);
         }

         public UserMfaRecord() {
             super();
             notifyCustomListeners(this);
         }

         public static void notifyCustomListeners(UserMfaRecord record) {
             for (IRecordListener<UserMfaRecord> listener : listeners) {
                 listener.onRecordCreated(record);
            }
         }
      

        public static final IdentityField Id = new IdentityField(META);

        public static final StringField User = new StringField(META, "User", SFieldFlags.SPRIMARY_KEY, 
        SFieldFlags.SMANDATORY, SFieldFlags.SDESCRIPTIVE);

        // public static final EncodedStringField Password
        // = new EncodedStringField(META, "Password", SFieldFlags.SMANDATORY, SFieldFlags.SDESCRIPTIVE);
        public static final EnumField<MfaOptions> MfaOption
                = new EnumField<>(META, "MfaOption", MfaOptions.class, SFieldFlags.SMANDATORY, SFieldFlags.SDESCRIPTIVE);

        public static final Category USER_DATA
                = new Category("KeycloakSettingsRecord.Category.USER_DATA", 1000)
                        .include(User, MfaOption);

        static {
            User.setUnique(true);
            MfaOption.setDefault(MfaOptions.SMS);

        }

```

And here’s the properties file: UserMfaRecord.properties

```python
User.Name=Username
MfaOption.Name=Mfa Option

```

If anyone has any tips I’d really appreciate the help!

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [February 26, 2026, 5:23pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/2 "2026-02-26T17:23:59Z")

</div>

Have you fully restarted the gateway?

There's a longstanding bug (that we're, at this point, never going to fix) where repeated calls to initialize bundles end up in a weird state where things don't quite work correctly.

---

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [February 26, 2026, 7:11pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/3 "2026-02-26T19:11:39Z")

</div>

Yes! I realized that was happening and started restarting the gateway every time I changed any labels or tried any fixes for this issue, but nothing changed. Do you know what else it could be?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [February 26, 2026, 7:21pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/4 "2026-02-26T19:21:11Z")

</div>

> [@isabela.parreiras](#):
>
> And here’s the properties file: UserMfaRecord.properties

For the sake of it, does it resolve the keys if you repeat the prefix again on the actual key literals?  
As in:

```python
UserMfaRecord.User.Name=Username
UserMfaRecord.MfaOption.Name=Mfa Option

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [February 26, 2026, 7:29pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/5 "2026-02-26T19:29:28Z")

</div>

```java
fieldNameKey = field.getRecordMeta().getUserClass().getSimpleName() + "." + field.getFieldName() + ".Name";
fieldDescriptionKey = field.getRecordMeta().getUserClass().getSimpleName() + "." + field.getFieldName() + ".Desc";`

```

* * *

> [@isabela.parreiras](#):
>
> started restarting the gateway every time I changed any labels

I have no idea if this will help, but you could try running this (for development only!) in your gateway hook once:

```python
org.apache.wicket.Application.get().getResourceSettings().getLocalizer().setEnableCache(false);

```

---

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [February 26, 2026, 9:24pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/6 "2026-02-26T21:24:54Z")

</div>

Yeah I tried that, it also didn’t work.

---

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [February 26, 2026, 9:25pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/7 "2026-02-26T21:25:37Z")

</div>

Sorry I didn’t really understand, where exactly should I run it?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [February 26, 2026, 9:47pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/8 "2026-02-26T21:47:39Z")

</div>

In your module's `GatewayHook`, in the `setup` or `startup` methods, you could try running that snippet. It should, in theory, tell Wicket not to do any caching of localization data, which might help with the "having to restart the gateway every time" problem.

Won't help with the actual observed issue here, though, I don't think.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [February 27, 2026, 12:23am UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/9 "2026-02-27T00:23:17Z")

</div>

I've found that BundleUtil works best when called in the gateway hook's **constructor** , not in any of the lifecycle methods. FWIW.

(Crucial for v8.3, fwiw.)

---

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [March 2, 2026, 6:27pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/10 "2026-03-02T18:27:33Z")

</div>

Thank you. Do you have any ideas as to how I could solve the other issue? It’s more pressing atm and I’ve honeslty run out of things to try.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [March 2, 2026, 7:16pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/11 "2026-03-02T19:16:11Z")

</div>

Not really. You'll have to go through and make sure you're mounting all the correct bundles at the correct locations. There's plenty of existing modules that have multiple bundle keys and mount them correctly, so I don't think there's an underlying bug (besides the aforementioned caching/staleness issue).

If you really can't get it working, theoretically you could override `RecordActionTable` and hardcode or otherwise provide your own labels for the elements, but I wouldn't jump at that idea.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [March 3, 2026, 12:45am UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/12 "2026-03-03T00:45:55Z")

</div>

Have you drilled into your `.modl` and ensured that the `.properties` files are included? The `PersistentRecord` subclasses must have their props files in the same package in the jar.

---

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [March 4, 2026, 5:41pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/13 "2026-03-04T17:41:49Z")

</div>

Yes! Here’s an example of a field, could you please let me know if you spot anything wrong?

```python
public static class EmailConfigRecord extends PersistentRecord {

        public static final RecordMeta<EmailConfigRecord> META = new RecordMeta<>(
                EmailConfigRecord.class, "EmailConfigRecord")
                .setNounKey("EmailConfigRecord.Noun")
                .setNounPluralKey("EmailConfigRecord.Noun.Plural");

        public static final IdentityField Id = new IdentityField(META);

        public static final StringField EmailFrom = new StringField(META, "EmailFrom");

```

and here’s the .properties file

```python
EmailFrom.Name=From Address

```

here’s what’s like in the gatewathook:

```python
BundleUtil.get().addBundle("EmailConfigRecord", getClass(), "Keycloak");

```

and here on the setup method:

```python
context.getSchemaUpdater().updatePersistentRecords(KeycloakSettingsRecord.EmailConfigRecord.META);

```

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [March 4, 2026, 5:51pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/14 "2026-03-04T17:51:25Z")

</div>

> [@isabela.parreiras](#):
>
> here’s what’s like in the gatewathook:
> 
> ```python
> BundleUtil.get().addBundle("EmailConfigRecord", getClass(), "Keycloak");
> 
> ```

No, that loads a properties file that ties to the hook class, and would be expected to be in the hook's package. You need a properties file for each subclass of `PersistentRecord`, with the same base file name as the class file, and in the same package as the class file.

The schema updater will find and add those bundles for you, and you cannot change that behavior.

Use `BundleUtil` for wicket and other translatables **other than** persistent record elements.

It also appears that your PR subclass is a **nested** class. I'm not sure that is supported.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [March 4, 2026, 5:56pm UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/15 "2026-03-04T17:56:42Z")

</div>

> [@pturmel](#):
>
> It also appears that your PR subclass is a **nested** class. I'm not sure that is supported.

Ooh, yeah, good catch. I can guarantee that 100% of the `PersistentRecord` implementations in the Ignition codebase were top level classes, so it would not surprise me at all if nested classes break our lookup and we just never knew about it.

---

<div class="post-metadata">

**Author:** ![isabela.parreiras](https://avatars.discourse-cdn.com/v4/letter/i/9fc348/32.png) [@isabela.parreiras](https://forum.inductiveautomation.com/u/isabela.parreiras)\
**Post date:** [March 6, 2026, 12:43am UTC](https://forum.inductiveautomation.com/t/label-bug-in-module-configuration-page-ignition-8-1-48/114207/16 "2026-03-06T00:43:03Z")

</div>

Thank you so much! This completely solved the problem, I really appreciate the help!
