I’ve recently made a keyboard for a conlang of mine and it won’t install with the language tag that I had assigned it to (qst-Zzzz-AA), instead defaulting to et-EE. Trying to add it manually in post gives the “Unable to install keyboard language; Windows has a limit of 4 custom ‘transient’ languages, and you may have reached this limit.” message.
I’ve looked around on my own a bit and from what I’ve gathered from my own system, I don’t have any such transient languages installed. I can have it installed with other tags that work, or just leave it at et-EE, but it doesn’t feel completely genuine that way.
Also FYI, I’ve tried setting the language code to ‘und’, no difference.
Output from get-winuserlanguagelist:
LanguageTag : et
Autonym : eesti
EnglishName : Estonian
LocalizedName : Estonian
ScriptName : Latin
InputMethodTips : {0425:00000425}
Spellchecking : True
Handwriting : False
LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin
InputMethodTips : {0409:00000409}
Spellchecking : True
Handwriting : False
LanguageTag : ja
Autonym : 日本語
EnglishName : Japanese
LocalizedName : Japanese
ScriptName : Japanese
InputMethodTips : {0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}}
Spellchecking : True
Handwriting : True
Output from reg query “hkcu\control panel\international\user profile” /s:
Could you check if there are any disabled keyboards in Keyman Configuration?
As of currently, the keyboard that I’m trying to work with is the only one that I have installed on Keyman, so there should be no conflicts involving those. I have uninstalled and then reinstalled the keyboard with some changes in an attempt to fix the issue, but no luck.
Usually, the transient language notice only shows up if there are 4 transient languages assigned. Have you gone through our article?
As part of trying to fix the issue, I had gone through the article, and the outputs from the commands can be seen in the initial post (I had no Keyman keyboards installed when I ran the commands as a demonstration). No transient languages from what I’m seeing, so I don’t know what’s causing it to fail. Associating it with another language is currently the only way of circumventing this.
Also, some additional details as these could be relevant:
I’m using Keyman 18.0.236, so currently one version behind the latest stable release.
I cannot add a language which has LCID 0x1000, ran into this while experimenting around/trying to diagnose the transient language issue.
“qst” is a private use code and a reasonable choice for a constructed language. I wondered if adding Zzzz (unencoded script) and/or AA (private use code) is confusing Windows. I tried making a keyboard with “qst” alone as the language tag, but when I tried installing on a Windows 11 machine, I got the same message as you describe.
I don’t think you can use qst. Unless there is a language code for your conlang you probably need to use und. Some of our keyboards use und for undetermined. For example, the (Cypro-Minaon)[Cypro-Minoan keyboard] keyboard uses und. Similarly, if the script is not defined in ISO 15924, then Zzzz is the script code you would use. A Toki Pona keyboard (Sitelen Pona (Lentan, UCSUR) keyboard) uses Zzzz). You would probably then end up with this language tag: und-Zzzz
I tried again and did get my test keyboard using qst to install. I found that I had to go into Windows Settings for Language & Region to delete information from previously installed keyboards. I wonder if you can try this:
Using Keyman Configuration (from the Keyman icon in the system tray on the task bar), remove all the Keyman keyboards (with various language tags) that you’ve experimented with
Using the Language & Region option in Windows Settings, remove all the entries under Preferred Languages except the main language for your computer, for example, “English (United States)” in my case. Windows seems to keep these around, even when you’ve removed the Keyman keyboard.
Restart the computer.
Try installing your keyboard (with “qst” or “qst-Zzzz” as the language tag).
I did the things that you had done as described, but no success - still failed to install with the language tag.
Now, I also have a laptop running on Windows 11, so I decided to may as well try on that and it installed without any issues there. Guess it’s some kind of issue with my main computer then…
I didn’t find any clues as to what could be making Keyman fail on my own, but I did find something else. Windows has 2 languages in the installable languages list that use transient IDs - Osage and ADLaM. Installing those through the Windows Settings worked without issue, but trying to do the same on Keyman… doesn’t work, even when I have the Windows keyboards installed. Odd, but that’s not the point here. Transient languages work on my computer fine, it’s that Keyman doesn’t handle it correctly.
Eventually I had some ideas pop up in my head and was like “…what if I just take the clunky way out of this…?”
So, in HKCU\Control Panel\International\User Profile, I added the desired language tag to the Languages multi-string value, then created the key for said language tag. In the key, I added the TransientLangId DWORD, setting its value to 0x00002000 in my case. I also added a dummy input method to make sure the language doesn’t inexplicably vanish on me, for that I made another DWORD, in my case the name was 2000:FFF02000, value set to 1.
After all that, I then attempted installing the Keyman keyboard again with the language tag and… it successfully installed. Sure, solved on my end, but it’s a bit of a hassle to do it for every keyboard that requires a transient ID. That and if I get rid of the registry changes that I made earlier, Keyman will start failing again with that language tag.
Take this information as you will, was bit of a doozy for me to try to find a way through this.
Hope this helps!
Thank you for the detail in describing your issue. As you have discovered Microsoft only supported a number of languages LCID and after that it uses transient language IDs. However, when using the API calls everything does not always get added as expected. There are a number of things that are checked that is priority microsoft code. Two examples
For Tigrinya and some languages, it is not possible to have the same Language code against different regions.
Microsoft also does the following: If the lang-tag has a suppress-script entry in language-subtag-registry, then the script is not required in language registration otherwise, script is always required.
At the moment I am not sure either of these is what is occurring for you but rather giving some insight into why adding the transient language ID might fail Lorna’s post above gives insight there. I will try look into in the next few days.
Back to your last post when after you added the transient ID
Once you added the HKCU\Control Panel\International\User Profile
And installed the keyboard do you get an entry with the {TIPGUID} and the {LangugeProfileGUID} ? It would be helpful to know.
Like this Registry after installing Cameroon Qwerty which uses a transient LCID. HKEY_CURRENT_USER\Control Panel\International\User Profile\aal-Latn-CM CachedLanguageName REG_SZ Afade (aal-Latn-CM) TransientLangId REG_DWORD 0x2800 2800:{FE0420F1-38D1-4B4C-96BF-E7E20A74CFB7}{C5443C88-1631-4DB8-96B2-8DDA9D9270E6} REG_DWORD 0x1
So the input method ID for Keyman is there {FE0420F1-38D1-4B4C-96BF-E7E20A74CFB7} and the {LangueProfileGUID}{C5443C88-1631-4DB8-96B2-8DDA9D9270E6}
This is also match in HKEY_CURRENT_USER\SOFTWARE\Keyman\Keyman Engine\Active Keyboards\sil_cameroon_qwerty\Languages HKEY_CURRENT_USER\SOFTWARE\Keyman\Keyman Engine\Active Keyboards\sil_cameroon_qwerty\Languages aal-Latn-CM REG_SZ 2800:{FE0420F1-38D1-4B4C-96BF-E7E20A74CFB7}{C5443C88-1631-4DB8-96B2-8DDA9D9270E6}
[…] do you get an entry with the {TIPGUID} and the {LanguageProfileGUID}?
An entry with the GUIDs did get made for both HKEY_CURRENT_USER\Control Panel\International\User Profile and HKEY_CURRENT_USER\SOFTWARE\Keyman\Keyman Engine\Active Keyboards after the keyboard was installed.