An error occurred while processing the template.
Java method "com.liferay.portal.json.JSONFactoryImpl.createJSONObject(String)" threw an exception when invoked on com.liferay.portal.json.JSONFactoryImpl object "com.liferay.portal.json.JSONFactoryImpl@2ad66ae2"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: navigationJSONObject = jsonFactoryUti...  [in template "17855804202317#32484267#LEARN-ARTICLE-NAV" at line 4, column 9]
----
1<#assign 
2	groupFriendlyURL = themeDisplay.getScopeGroup().getFriendlyURL() 
3	groupPathFriendlyURLPublic = themeDisplay.getPathFriendlyURLPublic() + groupFriendlyURL 
4	navigationJSONObject = jsonFactoryUtil.createJSONObject(navigation.getData()) 
5	navigationMenuItems = 
6
7			"Analytics Cloud": { 
8				"image": "/documents/d${groupFriendlyURL}/analytics_c-svg", 
9				"title": "Analytics Cloud", 
10				"url": "analytics-cloud" 
11			}, 
12			"Commerce": { 
13				"image": "/documents/d${groupFriendlyURL}/commerce_product-svg", 
14				"title": "Commerce", 
15				"url": "commerce" 
16			}, 
17			"DXP": { 
18				"image": "/documents/d${groupFriendlyURL}/dxp_p-svg", 
19				"title": "DXP / Portal", 
20				"url": "dxp" 
21			}, 
22			"Liferay Cloud": { 
23				"image": "/documents/d${groupFriendlyURL}/dxp_c-svg", 
24				"title": "Liferay Cloud", 
25				"url": "liferay-cloud" 
26			}, 
27			"Reference": { 
28				"image": "/documents/d${groupFriendlyURL}/reference-svg", 
29				"title": "Reference", 
30				"url": "reference" 
31
32
33 
34	breadcrumbJSONArray = navigationJSONObject.getJSONArray("breadcrumb") 
35	childrenJSONArray = navigationJSONObject.getJSONArray("children") 
36	parentJSONObject = navigationJSONObject.getJSONObject("parent") 
37	productJSONObject = breadcrumbJSONArray.getJSONObject(breadcrumbJSONArray.length()-1)!navigationJSONObject.getJSONObject("self") 
38	siblingsJSONArray = navigationJSONObject.getJSONArray("siblings") 
39/> 
40 
41<div class="learn-article-nav"> 
42	<#if productJSONObject?has_content && productJSONObject.getString("title")?has_content && navigationMenuItems[productJSONObject.getString("title")]?has_content && navigationMenuItems[productJSONObject.getString("title")].title?has_content> 
43		<div 
44			class="dropdown learn-article-nav-root learn-dropdown" 
45
46			<div class="learn-article-nav-item"> 
47				<div class="d-flex"> 
48					<div class="learn-article-nav-image"> 
49						<img 
50							class="lexicon-icon lexicon-icon-caret-bottom product-icon" 
51							role="presentation" 
52							src='${navigationMenuItems[productJSONObject.getString("title")].image}' 
53							viewBox="0 0 512 512" 
54						/> 
55					</div> 
56 
57					<span class="learn-article-nav-text">${navigationMenuItems[productJSONObject.getString("title")].title}</span> 
58				</div> 
59 
60				<div id="dropdown-icon"> 
61					<svg 
62						class="lexicon-icon lexicon-icon-caret-bottom" 
63						role="presentation" 
64						viewBox="0 0 512 512" 
65
66						<use xlink:href="/o/admin-theme/images/clay/icons.svg#caret-bottom"></use> 
67					</svg> 
68				</div> 
69			</div> 
70 
71			<ul class="dropdown-menu learn-dropdown-menu"> 
72				<#list navigationMenuItems as key, value> 
73					<li> 
74						<a 
75							class="dropdown-item learn-article-nav-item" 
76							href="/w/${navigationMenuItems[key].url}/index" 
77							tabindex="4" 
78
79							<span class="d-flex"> 
80								<span class="learn-article-nav-image"> 
81									<img 
82										class="lexicon-icon lexicon-icon-caret-bottom product-icon mt-0 mr-2" 
83										role="presentation" 
84										src="${value.image}"height: 25px; margin-left: 5px; max-width: none; width: 25px; 
85										viewBox="0 0 512 512" 
86									/> 
87								</span> 
88								<span class="learn-article-nav-text">${value.title}</span> 
89							</span> 
90 
91							<#if navigationMenuItems[productJSONObject.getString("title")].url == value.url> 
92								<span> 
93									<@clay["icon"] symbol="check" /> 
94								</span> 
95							</#if> 
96						</a> 
97					</li> 
98				</#list> 
99			</ul> 
100		</div> 
101	</#if> 
102 
103	<div class="learn-article-nav-content"> 
104		<#if parentJSONObject?has_content && parentJSONObject.getString("url")?has_content> 
105			<div class="learn-article-nav-item learn-article-nav-parent liferay-nav-item p-2"> 
106				<div class="mr-2"> 
107					<a 
108						href='${parentJSONObject.getString("url")}' 
109
110						<svg 
111							class="lexicon-icon lexicon-icon-angle-left" 
112							role="presentation" 
113							viewBox="0 0 512 512" 
114
115							<use xlink:href="/o/admin-theme/images/clay/icons.svg#angle-left"></use> 
116						</svg> 
117					</a> 
118				</div> 
119 
120				<span>${parentJSONObject.getString("title")}</span> 
121			</div> 
122		</#if> 
123 
124		<#if childrenJSONArray.length() gt 0> 
125			<ul class="m-0 p-2"> 
126				<#list 0..childrenJSONArray.length()-1 as i> 
127					<li class="learn-article-nav-item"> 
128						<a 
129							class='liferay-nav-item ${(navigationJSONObject.getJSONObject("self").url == childrenJSONArray.getJSONObject(i).url)?then("selected", "")}' 
130							href="${childrenJSONArray.getJSONObject(i).url}" 
131
132							<span>${childrenJSONArray.getJSONObject(i).getString("title")}</span> 
133						</a> 
134					</li> 
135				</#list> 
136			</ul> 
137		<#elseif siblingsJSONArray.length() gt 0> 
138			<ul class="m-0 p-2"> 
139				<#list 0..siblingsJSONArray.length()-1 as i> 
140					<li class="learn-article-nav-item"> 
141						<a 
142							class='liferay-nav-item ${(navigationJSONObject.getJSONObject("self").url == siblingsJSONArray.getJSONObject(i).url)?then("selected", "")}' 
143							href="${siblingsJSONArray.getJSONObject(i).url}" 
144
145							<span>${siblingsJSONArray.getJSONObject(i).getString("title")}</span> 
146						</a> 
147					</li> 
148				</#list> 
149			</ul> 
150		</#if> 
151	</div> 
152</div> 

Renamed Language Keys

In Liferay DXP/Portal 7.4, module language keys were centralized to a module called portal-language-lang.

Source location:

liferay-[dxp|portal]/modules/apps/portal-language/portal-language-lang

Liferay’s modules use the portal-language-lang language keys. Most key names are preserved, but many keys have been refactored into multiple new keys that accommodate module-specific values.

Where modules used language keys with the same name but different values, portal-language-lang provides new language keys with module-specific suffixes. For example, the portal-store-gcs and portal-store-s3 modules had language keys named bucket-name-help. These modules now use language keys that start with bucket-name-help, but end with a module-specific suffix.

Module-specific Suffix Example:

ModuleLanguage Key
portal-store-gcsbucket-name-help[gcs]
portal-store-s3bucket-name-help[s3]

In other cases, portal-language-lang provides improved language key values in language keys whose names reflect the new values. For example, the dynamic-data-lists-lang and dynamic-data-mapping-lang modules had language keys named changeable-default-language-description. New language keys have the improved module-specific values.

Improved Name Example:

ModuleLanguage Key
dynamic-data-lists-langif-checked,-the-default-language-of-data-definitions-will-be-changeable
dynamic-data-mapping-langif-checked,-the-default-language-of-dynamic-data-mapping-structures-will-be-changeable

If you extended an affected module and your extension overrides language translations, update your language key overrides to use the new names.

Language Key Map

Here are the new language key names and the affected modules:

Old KeyNew KeyAffected Modules
active-helpallow-site-administrators-to-create-sites-from-this-site-templatelayout-set-prototype-web,

portal-search-elasticsearch7-api
api-key-descriptionset-the-api-key-for-the-google-cloud-natural-language-apiasset-auto-tagger-google-cloud-natural-language-impl,

commerce-lang,

document-library-asset-auto-tagger-google-cloud-vision,

document-library-asset-auto-tagger-microsoft-cognitive-services,

layout-reports-web
application-name (preserved)nameoauth2-provider-web
are-you-sure-you-want-to-delete-this-role (preserved)are-you-sure-you-want-to-delete-this-role?-task-assignments-may-be-deletedroles-admin-web
asset-entry-typeasset-typeasset-publisher-web
autogenerate-structure-key-descriptioncheck-this-if-dynamic-data-mapping-structure-keys-should-always-be-autogenerateddynamic-data-mapping-lang,

journal-lang
autogenerate-template-key-descriptioncheck-this-if-dynamic-data-mapping-template-keys-should-always-be-autogenerateddynamic-data-mapping-lang,

journal-lang
bucket-name-helpbucket-name-help[gcs]portal-store-gcs
bucket-name-helpbucket-name-help[s3]portal-store-s3
changeable-default-language-descriptionif-checked,-the-default-language-of-data-definitions-will-be-changeabledynamic-data-lists-lang
changeable-default-language-descriptionif-checked,-the-default-language-of-dynamic-data-mapping-structures-will-be-changeabledynamic-data-mapping-lang
changeable-default-language-descriptionif-checked,-the-default-language-of-kaleo-forms-will-be-changeableportal-workflow-kaleo-forms-lang
changeable-default-language-descriptionif-checked,-the-default-language-of-web-content-articles-will-be-changeablejournal-lang
client-id-helpclient-id-help[oauth2]oauth2-provider-web
client-id-helpclient-id-help[sso-google]portal-security-sso-google-api
client-secret-helpclient-secret-help[oauth2]oauth2-provider-web
client-secret-helpclient-secret-help[sso-google]portal-security-sso-google-api
connect-to-liferay-analytics-cloud-helpin-order-to-perform-an-ab-test,-your-liferay-dxp-instance-has-to-be-connectedsegments-lang
connect-to-liferay-analytics-cloud-helpliferay-dxp-instance-has-to-be-connected-with-analytics-cloud-to-view-content-performance-metrics-and-build-a-successful-content-strategyanalytics-reports-web
connection-id-helpconnection-id-help[elasticsearch]portal-search-elasticsearch7-api
connection-id-helpconnection-id-help[web]portal-search-web
directory-indexing-helpcan-user-with-view-permission-browse-the-asset-library-document-library-files-and-foldersdepot-web
directory-indexing-helpcan-user-with-view-permission-browse-the-site-document-library-files-and-folderssite-admin-web
email-from-address-descriptionset-the-address-from-which-asset-entry-added-emails-will-be-sentasset-publisher-web
email-from-address-descriptionset-the-sender-address-on-the-one-time-password-emailmulti-factor-authentication-email-otp-api
email-from-addressemail-from-field[template]multi-factor-authentication-email-otp-api
enabled-class-namesenabled-class-names[google-cloud-natural-language]asset-auto-tagger-google-cloud-natural-language-impl
enabled-class-namesenabled-class-names[opennlp]asset-auto-tagger-opennlp-impl
enabled-descriptionenabled-description[google-cloud-translation]translation-google-cloud-translator
enabled-descriptionenabled-description[google-cloud-vision]document-library-asset-auto-tagger-google-cloud-vision
enabled-descriptionenabled-description[microsoft-cognitive-services]document-library-asset-auto-tagger-microsoft-cognitive-services
enabled-descriptionenabled-description[tensorflow]document-library-asset-auto-tagger-tensorflow
enabled-helpenabled-help[cas]portal-security-sso-cas-api
enabled-helpenabled-help[learning-to-rank]portal-search-learning-to-rank
enabled-helpenabled-help[ntlm]portal-security-sso-google-api
enabled-helpenabled-help[openid]portal-security-sso-openid-connect-api
enabled-helpenabled-help[sso-google]portal-security-sso-google-api
enabled-helpenabled-help[view-count]view-count-api
enabled (preserved)enable-auto-tagging-of-assets-on-this-asset-librarydepot-web
enabled (preserved)enable-auto-tagging-of-assets-on-this-siteasset-auto-tagger-web
enabled (preserved)enabled[asset-auto-tagger-service]asset-auto-tagger-service
enabled (preserved)enabled[tensorflow]document-library-asset-auto-tagger-tensorflow
federated-search-key-helpenter-the-key-of-an-alternate-search-this-widget-is-participating-on-if-not-set-widget-participates-on-default-searchportal-search-web
federated-search-key-helpenter-the-key-of-an-alternate-search-this-widget-is-participating-onportal-search-similar-results-web
import-from-ldap-helpa-user-may-be-authenticated-by-cas-and-not-yet-exist-in-the-portalportal-security-sso-cas-api
import-user-sync-strategy (preserved)import-user-synchronization-strategyportal-security-ldap-api
in-order-to-perform-an-ab-test-your-site-has-to-be-synced-to-liferay-analytics-cloudin-order-to-perform-an-ab-test,-your-site-has-to-be-synced-to-liferay-analytics-cloudsegments-lang
library-path (preserved)library-path-(optional)sharepoint-soap-repository
mapping-descriptionmapping-description[oauth2]oauth2-provider-scope-impl
mapping (preserved)mapping[oauth2]oauth2-provider-scope-impl
maximum-file-size-small-imagemaximum-file-size-of-small-imagejournal-api
maximum-number-of-tags-per-assetNo replacementasset-auto-tagger-web
maximum-number-of-tags-per-assetmaximum-number-of-tagsasset-auto-tagger-service
monitoring-configuration-name (preserved)monitoring-configuration-name[elasticsearch]portal-search-elasticsearch-monitoring-web
no-account-selectedto-add-a-product-to-an-order,-first-select-an-accountcommerce-lang
no-entries-for-x-have-been-added-yet (preserved)to-add-a-product-to-an-order,-first-select-an-accountconfiguration-admin-web
not-containsdoes-not-containdata-engine-lang
numeric-field-type-descriptionit-only-accepts-numbersdata-engine-lang
osgi-jaxrs-name-descriptionif-this-configuration-should-apply-to-a-specific-application,-then-specify-it-here.-otherwise,-leave-blank-or-enter-defaultoauth2-provider-scope-impl
osgi-jaxrs-name-descriptionset-the-name-for-this-jaxrs-instanceoauth2-provider-rest
osgi-jaxrs-namenameoauth2-provider-rest
osgi-jaxrs-nameosgi-jaxrs-application-nameoauth2-provider-scope-impl
paragraph-field-type-descriptionadd-a-title-and/or-a-body-text-in-your-formdata-engine-lang
paragraph-field-type-descriptionadd-text,-image,-video,-and-moredynamic-data-mapping-lang
please-enter-a-unique-friendly-url (preserved)please-enter-a-unique-friendly-url.-x-and-x-has-the-same-friendly-urlsite-admin-webportal-reports-engine-console-web
proxy-host-helpset-the-proxy-host-the-client-uses-to-connectportal-store-s3
proxy-host-helpset-the-proxy-host-to-be-used-for-the-client-connectionportal-search-elasticsearch7-api
proxy-password-helpset-the-password-for-connecting-to-the-proxyportal-search-elasticsearch7-api
proxy-password-helpset-the-proxy-password-to-use-if-connecting-through-a-proxyportal-store-s3
proxy-port-helpset-the-proxy-port-the-client-uses-to-connectportal-store-s3
proxy-port-helpset-the-proxy-port-to-be-used-for-the-client-connectionportal-search-elasticsearch7-api
redirect-url (preserved)redirect-url[oauth]portal-security-sso-facebook-connect-api
require-verified-account (preserved)verified-account-requiredportal-security-sso-facebook-connect-api
sync-to-analytics-cloud-helpin-order-to-perform-an-ab-test,-your-site-has-to-be-synced-to-liferay-analytics-cloudsegments-lang
sync-to-analytics-cloud-helpsync-your-liferay-dxp-instance-with-analytics-cloud-to-view-content-performance-metrics-and-build-a-successful-content-strategyanalytics-reports-web
the-password-you-entered-for-the-current-password-does-not-match-your-current-password (preserved)the-password-you-entered-for-the-current-password-does-not-match-your-current-password.-please-try-againusers-admin-web/
this-configuration-is-not-saved-yet (preserved)this-configuration-is-not-saved-yet.-the-values-shown-are-the-defaultconfiguration-admin-web/
timeout (preserved)timeout[socket-connection-so]antivirus-clamd-scanner
unable-to-validate-referenced-journal-articleunable-to-validate-referenced-web-content-articlejournal-lang
user-account-setup-failedNo replacementmulti-factor-authentication-timebased-otp-web
workflow-in-use-remove-assignement-to-x-xworkflow-is-in-use.-remove-its-assignment-to-x-xportal-workflow-lang,

portal-workflow-kaleo-designer-lang
workflow-in-use-remove-assignements-to-x-and-x-xworkflow-is-in-use.-remove-its-assignments-to-x-and-x-xportal-workflow-lang,

portal-workflow-kaleo-designer-lang
workflow-in-use-remove-assignements-to-x-x-and-x-more-xworkflow-is-in-use.-remove-its-assignment-to-x-x-and-x-more-xportal-workflow-lang,

portal-workflow-kaleo-designer-lang
x-by-x (preserved)x,-by-xportal-workflow-lang
your-user-x-could-not-be-logged-in (preserved)your-user-x-could-not-be-signed-inlogin-authentication-opensso-web