- SYS.DBMS_DEBUG_VC2COLL is a handy pre-defined TABLE OF VARCHAR2(1000)
- SYS.KU$_VCNT is TABLE OF VARCHAR2(4000)
Both are granted to public.
Thanks to Eddie Awad's blog for these.
Applications can be translated from a primary language into other languages. Each translation results in the creation of a new translated application. Each translation requires a mapping which identifies the target language as well as the translated application ID. Translated applications cannot be edited directly in the Application Builder.I have never used this method, but I have worked on a number of APEX applications that can be translated into other languages by other means. Essentially this is a matter of "soft-coding" all boilerplate such as region titles and item labels - holding them as data in tables and selecting the appropriate values at run time.
Once the translation mappings are established the translatable text within the application is seeded into a translation repository. This repository can then be exported to an XLIFF for translation.
Once the XLIFF file is populated with the translations, one file per language, the XLIFF file is uploaded back into the translation repository. The final step is to publish each translated application from the translation repository.
A translated application will require synchronization when the primary application has been modified since the translated version was last published. Even modifications to application logic will require synchronization. To synchronize, seed and publish the translated application.
|101||P1_EMPNO||ES||Identificación del empleado|
|101||P1_EMPNO||FR||Identifiant des employés|
function label_text (p_app_id number, p_item_name varchar2, p_language varchar2)
<label for="#CURRENT_ITEM_NAME#">"LABEL_TEXT""LABEL_TEXT" is a reference to an APEX shortcut which we can now define using PL/SQL function body:
return translate_pkg.label_text(:APP_ALIAS,'#CURRENT_ITEM_NAME#',:AI_LANGUAGE)(AI_LANGUAGE is an application item defining the user's preferred language.) All we now need to do is use the new label template on all our page items and leave the item's label attribute blank.
<items> <item type="editor" node="TableNode" vertical="true"> <title><![CDATA[Child Tables]]></title> <query> <sql><![CDATA[select cons.table_name, cons.constraint_name from all_constraints cons where cons.constraint_type = 'R' and cons.r_constraint_name in (select pk.constraint_name from all_constraints pk where owner = :OBJECT_OWNER and table_name = :OBJECT_NAME and constraint_type in ('P','U'))]]> </sql> </query> </item> </items>
<items> <item type="editor" node="ViewNode" vertical="true"> <title><![CDATA[ERRORS]]></title> <query> <sql><![CDATA[SELECT ATTRIBUTE, LINE || ':' ||POSITION "LINE:POSITION", TEXT FROM All_Errors WHERE type = 'VIEW' AND owner = :OBJECT_OWNER AND name = :OBJECT_NAME ORDER BY SEQUENCE ASC ]]></sql> </query> </item> </items>