diff --git a/modules/auth/cms_authentication_module.e b/modules/auth/cms_authentication_module.e
index e0a7c55..3787b75 100644
--- a/modules/auth/cms_authentication_module.e
+++ b/modules/auth/cms_authentication_module.e
@@ -9,10 +9,10 @@ class
inherit
CMS_MODULE
redefine
- setup_hooks
+ setup_hooks,
+ permissions
end
-
CMS_HOOK_AUTO_REGISTER
CMS_HOOK_VALUE_TABLE_ALTER
@@ -52,6 +52,13 @@ feature -- Access
name: STRING = "auth"
+ permissions: LIST [READABLE_STRING_8]
+ -- List of permission ids, used by this module, and declared.
+ do
+ Result := Precursor
+ Result.force ("account register")
+ end
+
feature -- Access: docs
root_dir: PATH
@@ -228,6 +235,7 @@ feature -- Handler
end
else
create {FORBIDDEN_ERROR_CMS_RESPONSE} r.make (req, res, api)
+ r.set_main_content ("You can also contact the webmaster to ask for an account.")
end
r.execute
diff --git a/modules/node/content/cms_node.e b/modules/node/content/cms_node.e
index f7a755c..0368c0e 100644
--- a/modules/node/content/cms_node.e
+++ b/modules/node/content/cms_node.e
@@ -11,8 +11,10 @@ deferred class
inherit
CMS_CONTENT
+ rename
+ has_identifier as has_id
redefine
- debug_output
+ debug_output, has_id
end
REFACTORING_HELPER
@@ -63,6 +65,12 @@ feature -- Conversion
feature -- Access
+ identifier: detachable IMMUTABLE_STRING_32
+ -- Optional identifier.
+ do
+ create Result.make_from_string_general (id.out)
+ end
+
id: INTEGER_64 assign set_id
-- Unique id.
--| Should we use NATURAL_64 instead?
diff --git a/modules/node/handler/cms_node_type_webform_manager.e b/modules/node/handler/cms_node_type_webform_manager.e
index 6e5ae7b..db5aac4 100644
--- a/modules/node/handler/cms_node_type_webform_manager.e
+++ b/modules/node/handler/cms_node_type_webform_manager.e
@@ -92,246 +92,15 @@ feature -- Forms ...
f.extend (fset)
- -- Path alias
+ -- Path alias
populate_form_with_taxonomy (response, f, a_node)
populate_form_with_path_alias (response, f, a_node)
end
- populate_form_with_taxonomy (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable CMS_NODE)
- local
- ti: detachable WSF_FORM_TEXT_INPUT
- th: WSF_FORM_HIDDEN_INPUT
- w_set: WSF_FORM_FIELD_SET
- w_select: WSF_FORM_SELECT
- w_opt: WSF_FORM_SELECT_OPTION
- w_cb: WSF_FORM_CHECKBOX_INPUT
- w_voc_set: WSF_FORM_FIELD_SET
- s: STRING_32
- voc: CMS_VOCABULARY
- t: detachable CMS_TERM
- l_terms: detachable CMS_TERM_COLLECTION
- l_has_edit_permission: BOOLEAN
+ populate_form_with_taxonomy (response: CMS_RESPONSE; f: CMS_FORM; a_content: detachable CMS_CONTENT)
do
- if
- attached {CMS_TAXONOMY_API} response.api.module_api ({CMS_TAXONOMY_MODULE}) as l_taxonomy_api and then
- attached l_taxonomy_api.vocabularies_for_type (content_type.name) as l_vocs and then not l_vocs.is_empty
- then
-
- l_has_edit_permission := response.has_permissions (<<"update any taxonomy", "update " + content_type.name + " taxonomy">>)
-
- -- Handle Taxonomy fields, if any associated with `content_type'.
- create w_set.make
- w_set.add_css_class ("taxonomy")
- l_vocs.sort
- across
- l_vocs as vocs_ic
- loop
- voc := vocs_ic.item
- create th.make_with_text ({STRING_32} "taxonomy_vocabularies[" + voc.id.out + "]", voc.name)
- w_set.extend (th)
-
- l_terms := Void
- if a_node /= Void and then a_node.has_id then
- l_terms := l_taxonomy_api.terms_of_entity (a_node.content_type, a_node.id.out, voc)
- if l_terms /= Void then
- l_terms.sort
- end
- end
- create w_voc_set.make
- w_set.extend (w_voc_set)
-
- if voc.is_tags then
- w_voc_set.set_legend (response.translation (voc.name, Void))
-
- create ti.make ({STRING_32} "taxonomy_" + voc.id.out)
- w_voc_set.extend (ti)
- if voc.is_term_required then
- ti.enable_required
- end
- if attached voc.description as l_desc then
- ti.set_description (response.html_encoded (response.translation (l_desc, Void)))
- else
- ti.set_description (response.html_encoded (response.translation (voc.name, Void)))
- end
- ti.set_size (70)
- if l_terms /= Void then
- create s.make_empty
- across
- l_terms as ic
- loop
- t := ic.item
- if not s.is_empty then
- s.append_character (',')
- s.append_character (' ')
- end
- if ic.item.text.has (' ') then
- s.append_character ('"')
- s.append (t.text)
- s.append_character ('"')
- else
- s.append (t.text)
- end
- end
- ti.set_text_value (s)
- end
- if not l_has_edit_permission then
- ti.set_is_readonly (True)
- end
- else
- l_taxonomy_api.fill_vocabularies_with_terms (voc)
- if not voc.terms.is_empty then
- if voc.multiple_terms_allowed then
- if attached voc.description as l_desc then
- w_voc_set.set_legend (response.html_encoded (l_desc))
- else
- w_voc_set.set_legend (response.html_encoded (voc.name))
- end
- across
- voc as voc_terms_ic
- loop
- t := voc_terms_ic.item
- create w_cb.make_with_value ({STRING_32} "taxonomy_" + voc.id.out + "[]", t.text)
- w_cb.set_title (t.text)
- w_voc_set.extend (w_cb)
- if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
- w_cb.set_checked (True)
- end
- if not l_has_edit_permission then
- w_cb.set_is_readonly (True)
- end
- end
- else
- create w_select.make ({STRING_32} "taxonomy_" + voc.id.out)
- w_voc_set.extend (w_select)
-
- if attached voc.description as l_desc then
- w_select.set_description (response.html_encoded (l_desc))
- else
- w_select.set_description (response.html_encoded (voc.name))
- end
- w_voc_set.set_legend (response.html_encoded (voc.name))
-
- across
- voc as voc_terms_ic
- loop
- t := voc_terms_ic.item
- create w_opt.make (response.html_encoded (t.text), response.html_encoded (t.text))
- w_select.add_option (w_opt)
-
- if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
- w_opt.set_is_selected (True)
- end
- end
- if not l_has_edit_permission then
- w_select.set_is_readonly (True)
- end
- end
- end
- end
- end
-
- f.submit_actions.extend (agent taxonomy_submit_action (response, l_taxonomy_api, l_vocs, a_node, ?))
-
- if
- attached f.fields_by_name ("title") as l_title_fields and then
- attached l_title_fields.first as l_title_field
- then
- f.insert_after (w_set, l_title_field)
- else
- f.extend (w_set)
- end
- end
- end
-
- taxonomy_submit_action (a_response: CMS_RESPONSE; a_taxonomy_api: CMS_TAXONOMY_API; a_vocs: CMS_VOCABULARY_COLLECTION; a_node: detachable CMS_NODE fd: WSF_FORM_DATA)
- require
- vocs_not_empty: not a_vocs.is_empty
- local
- l_voc_name: READABLE_STRING_32
- l_terms_to_remove: ARRAYED_LIST [CMS_TERM]
- l_new_terms: LIST [READABLE_STRING_32]
- l_text: READABLE_STRING_GENERAL
- l_found: BOOLEAN
- t: detachable CMS_TERM
- vid: INTEGER_64
- do
- if
- a_node /= Void and then a_node.has_id and then
- attached fd.table_item ("taxonomy_vocabularies") as fd_vocs
- then
- if a_response.has_permissions (<<{STRING_32} "update any taxonomy", {STRING_32} "update " + content_type.name + " taxonomy">>) then
- across
- fd_vocs.values as ic
- loop
- vid := ic.key.to_integer_64
- l_voc_name := ic.item.string_representation
-
- if attached a_vocs.item_by_id (vid) as voc then
- if attached fd.string_item ("taxonomy_" + vid.out) as l_string then
- l_new_terms := a_taxonomy_api.splitted_string (l_string, ',')
- elseif attached fd.table_item ("taxonomy_" + vid.out) as fd_terms then
- create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (fd_terms.count)
- across
- fd_terms as t_ic
- loop
- l_new_terms.force (t_ic.item.string_representation)
- end
- else
- create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (0)
- end
-
- create l_terms_to_remove.make (0)
- if attached a_taxonomy_api.terms_of_entity (content_type.name, a_node.id.out, voc) as l_existing_terms then
- across
- l_existing_terms as t_ic
- loop
- l_text := t_ic.item.text
- from
- l_found := False
- l_new_terms.start
- until
- l_new_terms.after
- loop
- if l_new_terms.item.same_string_general (l_text) then
- -- Already associated with term `t_ic.text'.
- l_found := True
- l_new_terms.remove
- else
- l_new_terms.forth
- end
- end
- if not l_found then
- -- Remove term
- l_terms_to_remove.force (t_ic.item)
- end
- end
- across
- l_terms_to_remove as t_ic
- loop
- a_taxonomy_api.unassociate_term_from_entity (t_ic.item, content_type.name, a_node.id.out)
- end
- end
- across
- l_new_terms as t_ic
- loop
- t := a_taxonomy_api.term_by_text (t_ic.item, voc)
- if
- t = Void and voc.is_tags
- then
- -- Create new term!
- create t.make (t_ic.item)
- a_taxonomy_api.save_term (t, voc)
- if a_taxonomy_api.has_error then
- t := Void
- end
- end
- if t /= Void then
- a_taxonomy_api.associate_term_with_entity (t, content_type.name, a_node.id.out)
- end
- end
- end
- end
- end
+ if attached {CMS_TAXONOMY_API} response.api.module_api ({CMS_TAXONOMY_MODULE}) as l_taxonomy_api then
+ l_taxonomy_api.populate_edit_form (response, f, content_type.name, a_content)
end
end
@@ -573,7 +342,7 @@ feature -- Output
vocs as ic
loop
if
- attached l_taxonomy_api.terms_of_entity (content_type.name, a_node.id.out, ic.item) as l_terms and then
+ attached l_taxonomy_api.terms_of_content (a_node, ic.item) as l_terms and then
not l_terms.is_empty
then
a_output.append ("
")
diff --git a/modules/taxonomy/cms_taxonomy_api.e b/modules/taxonomy/cms_taxonomy_api.e
index 677dbdf..5c9ffe6 100644
--- a/modules/taxonomy/cms_taxonomy_api.e
+++ b/modules/taxonomy/cms_taxonomy_api.e
@@ -109,6 +109,17 @@ feature -- Access node
Result := taxonomy_storage.term_count_from_vocabulary (a_vocab)
end
+ terms_of_content (a_content: CMS_CONTENT; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM_COLLECTION
+ -- Terms related to `a_content', and if `a_vocabulary' is set
+ -- constrain to be part of `a_vocabulary'.
+ require
+ content_with_identifier: a_content.has_identifier
+ do
+ if attached a_content.identifier as l_id then
+ Result := terms_of_entity (a_content.content_type, l_id, a_vocabulary)
+ end
+ end
+
terms_of_entity (a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM_COLLECTION
-- Terms related to `(a_type_name,a_entity)', and if `a_vocabulary' is set
-- constrain to be part of `a_vocabulary'.
@@ -179,6 +190,30 @@ feature -- Write
error_handler.append (taxonomy_storage.error_handler)
end
+ associate_term_with_content (a_term: CMS_TERM; a_content: CMS_CONTENT)
+ -- Associate term `a_term' with `a_content'.
+ require
+ content_with_identifier: a_content.has_identifier
+ do
+ reset_error
+ if attached a_content.identifier as l_id then
+ taxonomy_storage.associate_term_with_entity (a_term, a_content.content_type, l_id)
+ error_handler.append (taxonomy_storage.error_handler)
+ end
+ end
+
+ unassociate_term_from_content (a_term: CMS_TERM; a_content: CMS_CONTENT)
+ -- Unassociate term `a_term' from `a_content'.
+ require
+ content_with_identifier: a_content.has_identifier
+ do
+ reset_error
+ if attached a_content.identifier as l_id then
+ taxonomy_storage.unassociate_term_from_entity (a_term, a_content.content_type, l_id)
+ error_handler.append (taxonomy_storage.error_handler)
+ end
+ end
+
associate_term_with_entity (a_term: CMS_TERM; a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL)
-- Associate term `a_term' with `(a_type_name, a_entity)'.
do
@@ -215,6 +250,244 @@ feature -- Write
error_handler.append (taxonomy_storage.error_handler)
end
+feature -- Web forms
+
+ populate_edit_form (a_response: CMS_RESPONSE; a_form: CMS_FORM; a_content_type_name: READABLE_STRING_8; a_content: detachable CMS_CONTENT)
+ local
+ ti: detachable WSF_FORM_TEXT_INPUT
+ th: WSF_FORM_HIDDEN_INPUT
+ w_set: WSF_FORM_FIELD_SET
+ w_select: WSF_FORM_SELECT
+ w_opt: WSF_FORM_SELECT_OPTION
+ w_cb: WSF_FORM_CHECKBOX_INPUT
+ w_voc_set: WSF_FORM_FIELD_SET
+ s: STRING_32
+ voc: CMS_VOCABULARY
+ t: detachable CMS_TERM
+ l_terms: detachable CMS_TERM_COLLECTION
+ l_has_edit_permission: BOOLEAN
+ do
+ if
+ attached vocabularies_for_type (a_content_type_name) as l_vocs and then not l_vocs.is_empty
+ then
+ l_has_edit_permission := a_response.has_permissions (<<"update any taxonomy", "update " + a_content_type_name + " taxonomy">>)
+
+ -- Handle Taxonomy fields, if any associated with `content_type'.
+ create w_set.make
+ w_set.add_css_class ("taxonomy")
+ l_vocs.sort
+ across
+ l_vocs as vocs_ic
+ loop
+ voc := vocs_ic.item
+ create th.make_with_text ({STRING_32} "taxonomy_vocabularies[" + voc.id.out + "]", voc.name)
+ w_set.extend (th)
+
+ l_terms := Void
+ if a_content /= Void then
+ l_terms := terms_of_content (a_content, voc)
+ if l_terms /= Void then
+ l_terms.sort
+ end
+ end
+ create w_voc_set.make
+ w_set.extend (w_voc_set)
+
+ if voc.is_tags then
+ w_voc_set.set_legend (cms_api.translation (voc.name, Void))
+
+ create ti.make ({STRING_32} "taxonomy_" + voc.id.out)
+ w_voc_set.extend (ti)
+ if voc.is_term_required then
+ ti.enable_required
+ end
+ if attached voc.description as l_desc then
+ ti.set_description (cms_api.html_encoded (cms_api.translation (l_desc, Void)))
+ else
+ ti.set_description (a_response.html_encoded (cms_api.translation (voc.name, Void)))
+ end
+ ti.set_size (70)
+ if l_terms /= Void then
+ create s.make_empty
+ across
+ l_terms as ic
+ loop
+ t := ic.item
+ if not s.is_empty then
+ s.append_character (',')
+ s.append_character (' ')
+ end
+ if ic.item.text.has (' ') then
+ s.append_character ('"')
+ s.append (t.text)
+ s.append_character ('"')
+ else
+ s.append (t.text)
+ end
+ end
+ ti.set_text_value (s)
+ end
+ if not l_has_edit_permission then
+ ti.set_is_readonly (True)
+ end
+ else
+ fill_vocabularies_with_terms (voc)
+ if not voc.terms.is_empty then
+ if voc.multiple_terms_allowed then
+ if attached voc.description as l_desc then
+ w_voc_set.set_legend (cms_api.html_encoded (l_desc))
+ else
+ w_voc_set.set_legend (cms_api.html_encoded (voc.name))
+ end
+ across
+ voc as voc_terms_ic
+ loop
+ t := voc_terms_ic.item
+ create w_cb.make_with_value ({STRING_32} "taxonomy_" + voc.id.out + "[]", t.text)
+ w_cb.set_title (t.text)
+ w_voc_set.extend (w_cb)
+ if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
+ w_cb.set_checked (True)
+ end
+ if not l_has_edit_permission then
+ w_cb.set_is_readonly (True)
+ end
+ end
+ else
+ create w_select.make ({STRING_32} "taxonomy_" + voc.id.out)
+ w_voc_set.extend (w_select)
+
+ if attached voc.description as l_desc then
+ w_select.set_description (cms_api.html_encoded (l_desc))
+ else
+ w_select.set_description (cms_api.html_encoded (voc.name))
+ end
+ w_voc_set.set_legend (cms_api.html_encoded (voc.name))
+
+ across
+ voc as voc_terms_ic
+ loop
+ t := voc_terms_ic.item
+ create w_opt.make (cms_api.html_encoded (t.text), cms_api.html_encoded (t.text))
+ w_select.add_option (w_opt)
+
+ if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
+ w_opt.set_is_selected (True)
+ end
+ end
+ if not l_has_edit_permission then
+ w_select.set_is_readonly (True)
+ end
+ end
+ end
+ end
+ end
+
+ a_form.submit_actions.extend (agent taxonomy_submit_action (a_response, Current, l_vocs, a_content, ?))
+
+ if
+ attached a_form.fields_by_name ("title") as l_title_fields and then
+ attached l_title_fields.first as l_title_field
+ then
+ a_form.insert_after (w_set, l_title_field)
+ else
+ a_form.extend (w_set)
+ end
+ end
+ end
+
+ taxonomy_submit_action (a_response: CMS_RESPONSE; a_taxonomy_api: CMS_TAXONOMY_API; a_vocs: CMS_VOCABULARY_COLLECTION; a_content: detachable CMS_CONTENT fd: WSF_FORM_DATA)
+ require
+ vocs_not_empty: not a_vocs.is_empty
+ local
+ l_voc_name: READABLE_STRING_32
+ l_terms_to_remove: ARRAYED_LIST [CMS_TERM]
+ l_new_terms: LIST [READABLE_STRING_32]
+ l_text: READABLE_STRING_GENERAL
+ l_found: BOOLEAN
+ t: detachable CMS_TERM
+ vid: INTEGER_64
+ do
+ if
+ a_content /= Void and then a_content.has_identifier and then
+ attached fd.table_item ("taxonomy_vocabularies") as fd_vocs
+ then
+ if a_response.has_permissions (<<{STRING_32} "update any taxonomy", {STRING_32} "update " + a_content.content_type + " taxonomy">>) then
+ across
+ fd_vocs.values as ic
+ loop
+ vid := ic.key.to_integer_64
+ l_voc_name := ic.item.string_representation
+
+ if attached a_vocs.item_by_id (vid) as voc then
+ if attached fd.string_item ("taxonomy_" + vid.out) as l_string then
+ l_new_terms := a_taxonomy_api.splitted_string (l_string, ',')
+ elseif attached fd.table_item ("taxonomy_" + vid.out) as fd_terms then
+ create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (fd_terms.count)
+ across
+ fd_terms as t_ic
+ loop
+ l_new_terms.force (t_ic.item.string_representation)
+ end
+ else
+ create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (0)
+ end
+
+ create l_terms_to_remove.make (0)
+ if attached a_taxonomy_api.terms_of_content (a_content, voc) as l_existing_terms then
+ across
+ l_existing_terms as t_ic
+ loop
+ l_text := t_ic.item.text
+ from
+ l_found := False
+ l_new_terms.start
+ until
+ l_new_terms.after
+ loop
+ if l_new_terms.item.same_string_general (l_text) then
+ -- Already associated with term `t_ic.text'.
+ l_found := True
+ l_new_terms.remove
+ else
+ l_new_terms.forth
+ end
+ end
+ if not l_found then
+ -- Remove term
+ l_terms_to_remove.force (t_ic.item)
+ end
+ end
+ across
+ l_terms_to_remove as t_ic
+ loop
+ a_taxonomy_api.unassociate_term_from_content (t_ic.item, a_content)
+ end
+ end
+ across
+ l_new_terms as t_ic
+ loop
+ t := a_taxonomy_api.term_by_text (t_ic.item, voc)
+ if
+ t = Void and voc.is_tags
+ then
+ -- Create new term!
+ create t.make (t_ic.item)
+ a_taxonomy_api.save_term (t, voc)
+ if a_taxonomy_api.has_error then
+ t := Void
+ end
+ end
+ if t /= Void then
+ a_taxonomy_api.associate_term_with_content (t, a_content)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
feature -- Helpers
splitted_string (s: READABLE_STRING_32; sep: CHARACTER): LIST [READABLE_STRING_32]
diff --git a/src/service/cms_api.e b/src/service/cms_api.e
index d3a6e4e..ce43c95 100644
--- a/src/service/cms_api.e
+++ b/src/service/cms_api.e
@@ -292,6 +292,26 @@ feature -- Logging
end
end
+feature -- Internationalization (i18n)
+
+ translation (a_text: READABLE_STRING_GENERAL; opts: detachable CMS_API_OPTIONS): STRING_32
+ -- Translated text `a_text' according to expected context (lang, ...)
+ -- and adapt according to options eventually set by `opts'.
+ do
+ to_implement ("Implement i18n support [2015-may]")
+ Result := a_text.as_string_32
+ end
+
+ formatted_string (a_text: READABLE_STRING_GENERAL; args: TUPLE): STRING_32
+ -- Format `a_text' using arguments `args'.
+ --| ex: formatted_string ("hello $1, see page $title.", ["bob", "contact"] -> "hello bob, see page contact"
+ local
+ l_formatter: CMS_STRING_FORMATTER
+ do
+ create l_formatter
+ Result := l_formatter.formatted_string (a_text, args)
+ end
+
feature -- Emails
new_email (a_to_address: READABLE_STRING_8; a_subject: READABLE_STRING_8; a_content: READABLE_STRING_8): CMS_EMAIL
diff --git a/src/service/content/cms_content.e b/src/service/content/cms_content.e
index e6c9444..62acafb 100644
--- a/src/service/content/cms_content.e
+++ b/src/service/content/cms_content.e
@@ -13,6 +13,11 @@ inherit
feature -- Access
+ identifier: detachable READABLE_STRING_32
+ -- Optional identifier.
+ deferred
+ end
+
title: detachable READABLE_STRING_32
-- Title associated with Current content.
deferred
@@ -37,6 +42,14 @@ feature -- Access
feature -- Status report
+ has_identifier: BOOLEAN
+ -- Current content has identifier?
+ do
+ Result := identifier /= Void
+ ensure
+ Result implies identifier /= Void
+ end
+
is_typed_as (a_content_type: READABLE_STRING_GENERAL): BOOLEAN
-- Is current node of type `a_content_type' ?
do
diff --git a/src/service/response/cms_response.e b/src/service/response/cms_response.e
index ec7daeb..751075c 100644
--- a/src/service/response/cms_response.e
+++ b/src/service/response/cms_response.e
@@ -113,26 +113,6 @@ feature -- Access
end
end
-feature -- Internationalization (i18n)
-
- translation (a_text: READABLE_STRING_GENERAL; opts: detachable CMS_API_OPTIONS): STRING_32
- -- Translated text `a_text' according to expected context (lang, ...)
- -- and adapt according to options eventually set by `opts'.
- do
- to_implement ("Implement i18n support [2015-may]")
- Result := a_text.as_string_32
- end
-
- formatted_string (a_text: READABLE_STRING_GENERAL; args: TUPLE): STRING_32
- -- Format `a_text' using arguments `args'.
- --| ex: formatted_string ("hello $1, see page $title.", ["bob", "contact"] -> "hello bob, see page contact"
- local
- l_formatter: CMS_STRING_FORMATTER
- do
- create l_formatter
- Result := l_formatter.formatted_string (a_text, args)
- end
-
feature -- API
api: CMS_API
@@ -896,6 +876,22 @@ feature -- Menu: change
m.extend (lnk)
end
+feature -- Internationalization (i18n)
+
+ translation (a_text: READABLE_STRING_GENERAL; opts: detachable CMS_API_OPTIONS): STRING_32
+ -- Translated text `a_text' according to expected context (lang, ...)
+ -- and adapt according to options eventually set by `opts'.
+ do
+ Result := api.translation (a_text, opts)
+ end
+
+ formatted_string (a_text: READABLE_STRING_GENERAL; args: TUPLE): STRING_32
+ -- Format `a_text' using arguments `args'.
+ --| ex: formatted_string ("hello $1, see page $title.", ["bob", "contact"] -> "hello bob, see page contact"
+ do
+ Result := api.formatted_string (a_text, args)
+ end
+
feature -- Message
add_message (a_msg: READABLE_STRING_8; a_category: detachable READABLE_STRING_8)