/o//commerce-media/accounts/-1/images/18643925?download=true

ECL Translation
DXP App
Data Modeling, Process & Business Logic
18643875
The portlet allows, at the press of a button, Liferay content to be sent to the translation platform of ECL Translation Services where it will be translated by a team of professional translators.
The portlet assigns an ID to each request and counts the number of words of the content.
As soon as ECL completes the translation, the person who requested it will be notified by email at which point the translation can be retrieved from the portlet itself.
Once approved, the translation is uploaded automatically in the location of the requested language, preserving the original format.

The portlet also features:
- A list to check all translations sent, received and being processed.
- An interactive chat between the customer and the translation team.

ECL will send a regular report showing the number of translation requests made including the following details as a minimum:
- ID of the content, date sent, date received, name of the requester, languages requested, number of words and cost of the translation.

To use the portlet it is necessary to pre-programme it using the credentials of an ECL translation platform user, which can be requested by contacting: admin@eclanguages.eu El portlet permite, con sólo pulsar un botón, enviar los contenidos de Liferay a la plataforma de traducción de ECL Translation Services, donde serán traducidos por un equipo de traductores profesionales.
El portlet asigna un ID. a cada petición y recuenta el número de palabras del contenido.
En el momento en que ECL finaliza la traducción, el peticionario recibe una notificación vía email, y puede recuperar la traducción des del propio portlet.
Una vez validada, la traducción se carga automáticamente en la ubicación del idioma solicitado conservando el formato original.

A demás el portlet dispone de:
- Listado desde el que consultar las traducciones enviadas, las recibidas y las que están en proceso.
- Chat interactivo cliente><equipo de traducción.

ECL enviaría periódicamente un informe con la relación de peticiones de traducción realizadas que incluye, como mínimo:
- Id del contenido, fecha de envío, fecha de recepción, nombre del peticionario, idiomas solicitados, número de palabras, y coste de la traducción.

Para poder utilizar el portlet es necesario configurarlo previamente con las credenciales de un usuario de la plataforma de traducción de ECL, que se puede solicitar contactando con: admin@eclanguages.eu
DEVELOPER
Er trad een fout op tijdens de verwerking van de sjabloon.
The string doesn't match the expected date/time/date-time format. The string to parse was: "21-11-24 18:38". The expected format was: "MM/dd/yy h:mm a".
The nested reason given follows:
Unparseable date: "21-11-24 18:38"

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${CPDefinition_displayDate.getData()?...  [in template "3192443#3192485#null" at line 53, column 20]
	~ Reached through: #nested  [in template "3192443#3192485#null" in macro "section" at line 204, column 17]
	~ Reached through: @section title=languageUtil.get(local...  [in template "3192443#3192485#null" at line 49, column 1]
----
1<#assign 
2	channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${themeDisplay.getScopeGroupId()}'") 
3 
4	product = restClient.get( 
5		"/headless-commerce-delivery-catalog/v1.0/channels/" + channel.items[0].id + 
6		"/products/" + CPDefinition_cProductId.getData() + 
7		"?accountId=-1&nestedFields=categories,productSpecifications,skus&skus.accountId=-1&skus.currencyCode=USD" 
8
9 
10	catalogName = product.catalogName!"" 
11	categories = product.categories![] 
12	productSpecifications = product.productSpecifications![] 
13 
14	liferayVersions = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "liferay-version")) 
15	platformOffering = categories?filter(item -> stringUtil.equals(item.vocabulary, "marketplace-liferay-platform-offering")) 
16
17 
18<#assign publisherDetailsResponse = restClient.get("/c/publisherdetailses?filter=publisherName eq '${catalogName}'") /> 
19<#assign redirectPath="https://marketplace.liferay.com/e/publisher-details/29282497"/> 
20 
21<#if publisherDetailsResponse.items?has_content> 
22	<#assign 
23		publisherDetails = publisherDetailsResponse.items[0] 
24		profileImageURL = publisherDetails.publisherProfileImage?replace("https://", "http://") 
25	/> 
26</#if> 
27 
28<#assign 
29	cpuValue = getSpecificationValue("cpu") 
30	developerName = getSpecificationValue("developer-name", catalogName) 
31	publisherURL = (getSpecificationValue("publisherwebsiteurl")?trim?replace(" ", ""))!"" 
32	ramValue = getSpecificationValue("ram") 
33	supportEmail = getSpecificationValue("supportemailaddress") 
34	supportPhone = getSpecificationValue("supportphone") 
35	type = getSpecificationValue("type")?lower_case 
36
37<@section title = languageUtil.get(locale, "developer")> 
38	<#if publisherDetails?has_content> 
39	  <a class="bg-neutral-8" href="${redirectPath}/${publisherDetails.id}"> 
40		   ${developerName} 
41		</a> 
42	<#else> 
43	  <a class="bg-neutral-8" 	href="/?developer-name=${developerName}"> 
44			 ${developerName} 
45		</a> 
46	</#if> 
47</@section> 
48 
49<@section title = languageUtil.get(locale, "publisher-date", "Publisher Date")> 
50	<#setting date_format = "MMMM d, yyyy"> 
51 
52	<#if CPDefinition_displayDate.getData()?has_content> 
53		<p>${CPDefinition_displayDate.getData()?date("MM/dd/yy h:mm a")?string("MMMM d, yyyy")}</p> 
54	</#if> 
55</@section> 
56 
57<@section title = languageUtil.get(locale, "deployment-method", "Deployment Method")> 
58	<#list platformOffering as offering> 
59		<p>${offering.name}</p> 
60	</#list> 
61</@section> 
62 
63<@section title = languageUtil.get(locale, "app-type", "App Type")> 
64 	<#if type == 'client-extension'> Client Extension </#if> 
65 	<#if type == 'cloud'> Cloud </#if> 
66 	<#if type == 'composite-app'> Composite App </#if> 
67 	<#if type == 'dxp'> DXP </#if> 
68 	<#if type == 'low-code-configuration'> Low Code Configuration </#if> 
69</@section> 
70 
71<@section title = languageUtil.get(locale, "version")> 
72	${getSpecificationValue("latest-version", "1.0.0")} 
73</@section> 
74 
75<#if liferayVersions?has_content> 
76	<@section title = languageUtil.get(locale, "supported-versions", "Supported Versions")> 
77		<#list liferayVersions as version> 
78			${version.value}<#if version?has_next>, </#if> 
79		</#list> 
80	</@section> 
81</#if> 
82 
83<#if cpuValue?has_content> 
84	<@section title = languageUtil.get(locale, "resource-requirements", "Resource Requirements")> 
85		<p> 
86			<#if cpuValue?has_content> 
87				${cpuValue} 
88				<#assign cpuNumber = cpuValue?number?default(0) /> 
89				<#if cpuValue?eval gt 1> 
90					CPUS 
91				</#if> 
92				<#if cpuValue?eval lt 2> 
93					CPU 
94				</#if> 
95			</#if>, <#if ramValue?has_content>${ramValue} GB RAM</#if> 
96		</p> 
97	</@section> 
98</#if> 
99 
100<@section title = languageUtil.get(locale, "standard-price", "Standard Price")> 
101	<div> 
102		<#assign purchasableSkus = [] /> 
103 
104		<#list product.skus as sku> 
105			<#if sku.purchasable?? && sku.purchasable> 
106				<#assign purchasableSkus = purchasableSkus + [sku] /> 
107			</#if> 
108		</#list> 
109 
110		<#assign standardSku = {} /> 
111 
112		<#list purchasableSkus as sku> 
113			<#assign matched = false /> 
114 
115			<#list sku.skuOptions as opt> 
116				<#if stringUtil.equals(opt.skuOptionValueKey, "standard")> 
117					<#assign 
118						matched = true 
119						standardSku = sku 
120					/> 
121 
122					<#break> 
123				</#if> 
124			</#list> 
125			<#if matched><#break></#if> 
126		</#list> 
127 
128		<#if standardSku.price?? && standardSku.price.price?eval gt 0> 
129			<div class="bg-neutral-8">${standardSku.price.priceFormatted!""}</div> 
130		<#else> 
131			${languageUtil.get(locale, "free", "Free")} 
132		</#if> 
133	</div> 
134</@section> 
135 
136<@section title = languageUtil.get(locale, "help-and-support", "Help and Support")> 
137	<div class="d-flex flex-column mt-4"> 
138		<div class="d-flex"> 
139			<span class="help-and-support-link-icon"> 
140				<@clay["icon"] symbol="document" /> 
141			</span> 
142 
143			<a class="d-flex w-100 justify-content-between help-and-support-link" href="https://www.liferay.com/en/legal/marketplace-terms-of-service" target="_blank"> 
144				<span class="copy-text ml-1 help-and-support-link"> 
145					${languageUtil.get(locale, "terms-and-conditions", "Terms & Conditions")} 
146				</span> 
147 
148				<@clay["icon"] 
149					className="help-and-support-link-arrow link-arrow ml-auto" 
150					height="12" 
151					symbol="angle-right" 
152				/> 
153			</a> 
154		</div> 
155 
156		<div class="d-flex"> 
157			<span class="help-and-support-link-icon"> 
158				<@clay["icon"] symbol="document" /> 
159			</span> 
160 
161			<a class="d-flex w-100 justify-content-between help-and-support-link" href="javascript:void(0)" onClick="openModal()"> 
162				<span class="copy-text ml-1 help-and-support-link"> 
163					${languageUtil.get(locale, "publisher-contact-info", "Publisher Contact Info")} 
164				</span> 
165 
166				<@clay["icon"] 
167					className="help-and-support-link-arrow link-arrow ml-auto" 
168					height="12" 
169					symbol="angle-right" 
170				/> 
171			</a> 
172		</div> 
173	</div> 
174</@section> 
175 
176<@section 
177	showLine = false 
178	title = languageUtil.get(locale, "share-link") 
179
180	<a class="align-items-center copy-text d-flex font-weight-bold ml-1 text-decoration-none text-primary" href="#copy-share-link" onclick="copyToClipboard(Liferay.ThemeDisplay.getCanonicalURL())"> 
181		<span class="help-and-support-link-icon mr-1"> 
182			<@clay["icon"] symbol="link" /> 
183		</span> 
184		Copy & Share 
185	</a> 
186</@section> 
187 
188<#function getSpecificationValue key default=""> 
189	<#local spec = productSpecifications?filter(productSpecification -> 
190		stringUtil.equals(productSpecification.specificationKey, key)) /> 
191 
192	<#return (spec?first.value)!default /> 
193</#function> 
194 
195<#macro section 
196	title 
197	showLine=true 
198
199	<p> 
200		<strong>${title}</strong> 
201	</p> 
202 
203	<div> 
204		<#nested> 
205	</div> 
206 
207	<#if showLine> 
208		<hr /> 
209	</#if> 
210</#macro> 
211 
212<script ${nonceAttribute}> 
213	function modalBody() { 
214		return ` 
215			<div class="align-items-center d-flex flex-row mb-3"> 
216				<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
217					<#if profileImageURL?? && profileImageURL?length gt 0> 
218						<img src="${profileImageURL}" alt="Publisher Image" style="width: 100%; height: 100%; object-fit: cover; border-radius: 50%;" /> 
219					<#else> 
220						<@clay["icon"] 
221							style="fill:#6B6C7E;" 
222							symbol="picture" 
223						/> 
224					</#if> 
225				</span> 
226 
227				<div class="d-flex flex-column"> 
228					<h3 class="font-weight-bold mb-0"> 
229						${catalogName} 
230					</h3> 
231				</div> 
232			</div> 
233 
234			<#if publisherURL?has_content> 
235				<div class="align-items-center d-flex flex-row mb-3"> 
236				<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
237						<@clay["icon"] 
238							style="fill:#6B6C7E;" 
239							symbol="globe" 
240						/> 
241					</span> 
242 
243					<div class="d-flex flex-column"> 
244						<span class="text-black-50">${languageUtil.get(locale, "publisher-website", "Publisher Website")}</span> 
245 
246						<a href="${publisherURL}" target="_blank" class="font-weight-bold"> 
247							${publisherURL} 
248						</a> 
249					</div> 
250				</div> 
251			</#if> 
252 
253			<#if supportEmail?has_content> 
254				<div class="align-items-center d-flex flex-row mb-3"> 
255					<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
256						<@clay["icon"] style="fill:#6B6C7E;"symbol="envelope-closed" /> 
257					</span> 
258 
259					<div class="d-flex flex-column"> 
260						<span class="text-black-50">${languageUtil.get(locale, "support-email", "Support Email")}</span> 
261 
262						<a class="font-weight-bold" href="mailto:${supportEmail}" target="_blank"> 
263							${supportEmail} 
264						</a> 
265					</div> 
266				</div> 
267			</#if> 
268 
269			<#if supportPhone?has_content> 
270				<div class="d-flex flex-row align-items-center mb-3"> 
271					<span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;"> 
272						<@clay["icon"] 
273							style="fill:#6B6C7E;" 
274							symbol="phone" 
275						/> 
276					</span> 
277 
278					<div class="d-flex flex-column"> 
279						<span class="text-black-50">${languageUtil.get(locale, "phone")}</span> 
280 
281						<a class="font-weight-bold" href="tel:${supportPhone}" target="_blank"> 
282							${supportPhone} 
283						</a> 
284					</div> 
285				</div> 
286			</#if> 
287		`; 
288
289 
290	function openModal() { 
291		Liferay.Util.openModal({ 
292			bodyHTML: modalBody(), 
293			center: true, 
294			headerHTML: "<h2>Publisher Support Contact Info</h2>", 
295			size: "md" 
296		}); 
297
298</script> 
299 
300<script ${nonceAttribute}> 
301	function copyToClipboard(text) { 
302		if (navigator && navigator.clipboard && navigator.clipboard.writeText) { 
303			navigator.clipboard.writeText(text); 
304 
305			Liferay.Util.openToast({ message: "Copied link to the clipboard" }); 
306
307
308</script> 
309 
310<style ${nonceAttribute}> 
311	.copy-text { 
312		color: #282934; 
313		font-size: 16px; 
314
315 
316	.help-and-support-link { 
317		color: inherit; 
318		text-decoration: none; 
319
320 
321	.help-and-support-link-arrow { 
322		fill: rgb(133, 140, 148); 
323
324 
325	.help-and-support-link:hover { 
326		color: inherit; 
327		text-decoration: none; 
328
329 
330	.help-and-support-link-icon { 
331		color: rgb(133, 140, 148); 
332
333 
334	.help-and-support-svg mask, 
335	.link-arrow mask { 
336		mask-type: alpha; 
337
338</style> 
DEVELOPER
21-11-24 18:38
Published date
21-11-24 18:38
Published Date
21-11-24 18:38
SUPPORTED OFFERINGS
Liferay PaaS
Supported Versions
7.0
Resource Requirements
Edition
EE
PRICE
Free
help & support
SHARE LINK
Copy & Share

HTML Example

A paragraph is a self-contained unit of a discourse in writing dealing with a particular point or idea. Paragraphs are usually an expected part of formal writing, used to organize longer prose.