Com afegir una aplicació a SaltOS

Per afegir una aplicació en SaltOS, cal fer els següents passos:

  • Crear el fitxer XML de l'aplicació (xml/example.xml per exemple)
  • Afegir les taules que farà servir l'aplicació (xml/dbschema.xml)
  • Afegir l'aplicació en tbl_aplicaciones (xml/dbstatic.xml)
  • Afegir els permisos per a l'aplicació en tbl_aplicaciones_p (xml/db_static.xml)
  • Afegir l'aplicació al menú (xml/menu.xml)
  • Afegir les icones de l'aplicació (xml/iconset.xml)
  • Afegir els textos de l'aplicació (xml/lang/es_ES.xml, per exemple si només es vol en Espanyol d'Espanya)

Crear el fitxer XML de l'aplicació

El fitxer XML que defineix una aplicació, pot contenir els següents nodes:

  • <list>
  • <form>
  • <insert>
  • <update>
  • <delete>
  • <pdf>
  • <excel>

Encara que no cal que els contingui tots. Per exemple, si s'observa l'aplicació de xml/documentos.xml, aquesta no inclou els nodes <pdf>  ni <excel>, Però, l'aplicació xml/partes.xml si que inclou totes aquestes opcions.

Node <list>

Aquest node defineix com és el llistat de l'aplicació. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <list>
  	<title lang="true">list</title>
  	<actions include="xml/common/actions.xml" replace="true"/>
  	<width>100%</width>
  	<fields>
  		<field>
  			<name>id</name>
  			<label lang="true">id</label>
  			<tip>My tip message</tip>
  			<width>100px</width>
  			<sort>true</sort>
  			<order>id</order>
  			<orderasc>id</orderasc>
  			<orderdesc>id</orderdesc>
  			<size>20</size>
  			<class>mycssclass</class>
  		</field>
  		<field>
  			.
  			.
  			.
  		</field>
  		.
  		.
  		.
  	</fields>
  	<javascript>
  		.
  		.
  		.
  	</javascript>
  	<styles>
  		.
  		.
  		.
  	</styles>
  	<quick>
  		<row>
  			<field>
  				<type>button</type>
  				<value lang="true">create</value>
  				<tip lang="true">create</tip>
  				<onclick>create()</onclick>
  				<icon>create</icon>
  				<class>nowrap contextmenu</class>
  				<class2>shortcut_ctrl_insert</class2>
  				<disabled global="page" eval="true">check_user($page,"create")?"false":"true"</disabled>
  			</field>
  			<field>
  				<type>separator</type>
  				<width>100%</width>
  			</field>
  			<field ifeval="!ismobile() &amp;&amp; check_filter(array('campo1'=>'','comentarios'=>''))">
  				<type>label</type>
  				<label lang="true">usedfilter</label>
  				<class>nowrap</class>
  				<class2>info</class2>
  			</field>
  			<field>
  				<name>buscar</name>
  				<label lang="true">buscar</label>
  				<type>text</type>
  				<width>240px</width>
  				<value global="comentarios" eval="true">$comentarios=getParam("comentarios")</value>
  				<onchange>copy_value("comentarios","buscar");</onchange>
  				<onkey>if(is_enterkey(event)) { copy_value("comentarios","buscar");buscar(); }</onkey>
  				<focus>true</focus>
  				<speech>true</speech>
  				<class3>shortcut_ctrl_f</class3>
  			</field>
  			<field>
  				<type>button</type>
  				<value lang="true">buscar</value>
  				<tip lang="true">buscartip</tip>
  				<onclick>buscar()</onclick>
  				<icon>find</icon>
  				<class>nowrap</class>
  			</field>
  			<field>
  				<type>button</type>
  				<value lang="true">limpiar</value>
  				<tip lang="true">limpiartip</tip>
  				<onclick>limpiar()</onclick>
  				<icon>refresh</icon>
  				<class>nowrap contextmenu</class>
  			</field>
  		</row>
  	</quick>
  	<form>
  		<name>list</name>
  		<action></action>
  		<method>get</method>
  		<fields>
  			<title lang="true">filter</title>
  			<buttons>true</buttons>
  			<row>
  				<field include="xml/common/hiddenslist.xml" replace="true" />
  				<field>
  					<name>id_usuario</name>
  					<label lang="true">username</label>
  					<type>text</type>
  					<width>240px</width>
  					<value global="id_usuario" eval="true">$id_usuario=getParam("id_usuario")</value>
  					<colspan>3</colspan>
  				</field>
  				<field>
  					<type>separator</type>
  					<width>10px</width>
  				</field>
  				<field>
  					<name>id_cliente</name>
  					<label lang="true">cliente</label>
  					<type>text</type>
  					<width>240px</width>
  					<value global="id_cliente" eval="true">$id_cliente=getParam("id_cliente")</value>
  					<colspan>4</colspan>
  					<onchange>myjsfunction()</onchange>
  				</field>
  			</row>
  			<row>
  				.
  				.
  				.
  			</row>
  			.
  			.
  			.
  		</fields>
  		<buttons include="xml/common/buttonslist.xml" />
  	</form>
  	<pager include="xml/common/pagerlist.xml"/>
  	<query global="page,comentarios" eval="true">"
  	SELECT id,
  		campo1,
  		campo2,
  		campo3,
  		campo4,
  		campo5,
  	FROM (SELECT a.*
  		FROM tbl_example a
  		LEFT JOIN tbl_registros_i e ON e.id_aplicacion='".page2id($page)."' AND e.id_registro=a.id
  		LEFT JOIN tbl_usuarios b ON e.id_usuario=b.id
  		WHERE a.id IN (SELECT id_registro
  			FROM tbl_indexing
  			WHERE id_aplicacion='".page2id($page)."'
  			AND ".make_fulltext_query("search",$comentarios,"tbl_indexing")."
  		)
  	) d
  	WHERE ".check_sql($page,"list")</query>
  	<order global="order" eval="true">$order</order>
  	<limit global="limit" eval="true">$limit</limit>
  	<offset global="offset" eval="true">$offset</offset>
  </list>

Node <form>

Aquest node defineix com és el formulari de l'aplicació. Depenent de si és un formulari per fer una consulta, per crear un nou registre o per actualitzar a un registre existent, s'hauran de configurar les diferents vistes en els nodes <view>, <insert>  i <update>. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <form>
  	<views>
  		<view>
  			<title lang="true">formview</title>
  			<query>
  				<query include="xml/common/qpermview.xml" replace="true" />
  				<query include="xml/common/qdefaultview.xml" replace="true" />
  				<comments_old include="xml/common/qcommentsold.xml" />
  				<files_old include="xml/common/qfilesold.xml" />
  				<control include="xml/common/qcontrol.xml"/>
  				<folders include="xml/common/qfolders.xml" />
  			</query>
  		</view>
  		<insert>
  			<title lang="true">forminsert</title>
  			<query>
  				<query include="xml/common/qpermcreate.xml" replace="true" />
  				<default>SELECT '0' id,'0' id_cliente,'0' id_proyecto</default>
  				<files_new include="xml/common/qfilesnew.xml" replace="true"/>
  				<folders include="xml/common/qfolders.xml" />
  			</query>
  		</insert>
  		<update>
  			<title lang="true">formupdate</title>
  			<query>
  				<query include="xml/common/qpermupdate.xml" replace="true" />
  				<query include="xml/common/qdefaultview.xml" replace="true" />
  				<comments_old include="xml/common/qcommentsold.xml" />
  				<files_old include="xml/common/qfilesold.xml" />
  				<comments_new include="xml/common/qcommentnew.xml" replace="true"/>
  				<files_new include="xml/common/qfilesnew.xml" replace="true"/>
  				<control include="xml/common/qcontrol.xml"/>
  				<folders include="xml/common/qfolders.xml" />
  			</query>
  		</update>
  	</views>
  	<name>form</name>
  	<action></action>
  	<method>post</method>
  	<hiddens include="xml/common/hiddensform.xml" />
  	<fields>
  		<default>
  			<fieldset>
  				<title lang="true">defaultdata</title>
  				<quick global="id" eval="true">$id>=0?"false":"true"</quick>
  				<buttons>true</buttons>
  				<row>
  					<field>
  						<name>id</name>
  						<type>hidden</type>
  					</field>
  					<field>
  						<name>id_cliente</name>
  						<label lang="true">cliente</label>
  						<type>select</type>
  						<width>240px</width>
  						<query eval="true">make_extra_query_with_perms("clientes","tbl_clientes","nombre")." UNION ..."</query>
  						<focus global="id" eval="true">$id>=0?"true":"false"</focus>
  						<readonly global="id" eval="true">$id>=0?"false":"true"</readonly>
  						<onchange>update_proyectos()</onchange>
  						<link>openapp('clientes',-abs(ID))</link>
  						<icon>view</icon>
  					</field>
  				</row>
  				<row>
  					<field>
  						<name>id_proyecto</name>
  						<label lang="true">proyecto</label>
  						<type>select</type>
  						<width>240px</width>
  						<query eval="true">"SELECT '' value,'".LANG_ESCAPE("sinproyecto")."' label"</query>
  						<readonly global="id" eval="true">$id>=0?"false":"true"</readonly>
  						<colspan>3</colspan>
  						<link>openapp('proyectos',-abs(ID))</link>
  						<icon>view</icon>
  					</field>
  				</row>
  				<row>
  					<field>
  						<name>nombre</name>
  						<label lang="true">nombre</label>
  						<type>text</type>
  						<width>240px</width>
  						<readonly global="id" eval="true">$id>=0?"false":"true"</readonly>
  						<required>true</required>
  						<speech>true</speech>
  					</field>
  				</row>
  				<row>
  					<field>
  						<type>separator</type>
  					</field>
  				</row>
  				<row>
  					<field>
  						<name>descripcion</name>
  						<label lang="true">descripcion</label>
  						<type>textarea</type>
  						<width>600px</width>
  						<height>120px</height>
  						<colspan>6</colspan>
  						<readonly global="id" eval="true">$id>=0?"false":"true"</readonly>
  						<required>true</required>
  					</field>
  				</row>
  			</fieldset>
  		</default>
  		<comments_old include="xml/common/commentsold.xml"/>
  		<files_old include="xml/common/filesold.xml" />
  		<comments_new include="xml/common/commentnew.xml"/>
  		<files_new include="xml/common/filesnew.xml"/>
  		<control include="xml/common/control.xml" />
  		<folders include="xml/common/folders.xml" />
  	</fields>
  	<quick include="xml/common/quickform.xml" />
  	<buttons include="xml/common/buttonsform.xml" />
  	<javascript>
  		<javascript include="xml/common/jsform.xml" replace="true"/>
  		<cache>
  			<include>js/updateproyectos.js</include>
  		</cache>
  	</javascript>
  </form>

Node <insert>

Aquest node defineix la llista de consultes necessàries per fer un insert, és a dir, per crear un registre. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <insert>
  	<query include="xml/common/qpermcreate.xml" replace="true"/>
  	<query include="xml/common/autonombre.xml" replace="true"/>
  	<query match="default" prefix="true" global="page" preeval="true" eval="true">preeval_insert_query(page2table($page))</query>
  	<query include="xml/common/qcontrolinsert.xml" replace="true"/>
  	<query include="xml/common/qfilesinsert.xml" replace="true"/>
  	<query include="xml/common/qfoldersinsert.xml" replace="true"/>
  </insert>

Node <update>

Aquest node defineix la llista de consultes necessàries per fer un update, és a dir, per modificar un registre. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <update>
  	<query include="xml/common/qpermupdate.xml" replace="true"/>
  	<query match="default" prefix="true" global="page" preeval="true" eval="true">preeval_update_query(page2table($page))</query>
  	<query include="xml/common/qcontrolupdate.xml" replace="true"/>
  	<query include="xml/common/qfilesdelete.xml" replace="true" />
  	<query include="xml/common/qfilesupdate.xml" replace="true"/>
  	<query include="xml/common/qcommentsdelete.xml" replace="true" />
  	<query include="xml/common/qcommentsinsert.xml" replace="true" />
  	<query include="xml/common/qfoldersupdate.xml" replace="true"/>
  </update>

Node <delete>

Aquest node defineix la llista de consultes necessàries per fer un delete, és a dir, per esborrar un registre. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <delete>
  	<query include="xml/common/qpermdelete.xml" replace="true"/>
  	<query include="xml/common/qdelete.xml" replace="true" />
  	<query include="xml/common/qdeletecomments.xml" replace="true" />
  	<query include="xml/common/qdeletefiles.xml" replace="true" />
  	<query include="xml/common/qcontroldelete.xml" replace="true"/>
  	<query include="xml/common/qfoldersdelete.xml" replace="true"/>
  </delete>

Node <pdf>

Aquest node defineix la consulta i el disseny gràfic necessari per generar un PDF. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <pdf>
  	<constructor>"P","mm","A4"</constructor>
  	<margins>50,30,30,30</margins>
  	<query>"SELECT CASE id_cliente ... FROM (SELECT a.*,
  	".make_extra_query_with_login("b.")." usuario, ...
  	FROM tbl_partes a
  	LEFT JOIN tbl_registros_i e ON e.id_aplicacion='".page2id(getParam("page"))."' AND e.id_registro=a.id
  	LEFT JOIN tbl_usuarios b ON e.id_usuario=b.id LEFT JOIN tbl_clientes c ON a.id_cliente=c.id
  	LEFT JOIN tbl_proyectos p ON a.id_proyecto=p.id) d
  	WHERE ROUND(id) IN (".check_ids(getParam("id")).")"</query>
  	<foreach>
  		<!-- TEMPLATE -->
  		<header>
  			<!-- LOGO -->
  			<margins>0,0,0,0</margins>
  			<image>CONFIG("logo_left"),CONFIG("logo_top"), ...)</image>
  			<!-- PONER MARCA DE AGUA -->
  			<font>"normal","B",CONFIG("water_partes_size"),"#eeeeee"</font>
  			<text>CONFIG("water_partes_posx"),CONFIG("water_partes_posy"), ...</text>
  			<margins>50,30,30,30</margins>
  			<setxy>30,50</setxy>
  		</header>
  		<footer>
  			<margins>0,0,0,0</margins>
  			<!-- PONER PIE DE PAGINA -->
  			<font>"normal","",6,CONFIG("color_text2")</font>
  			<pageno>30,279,150,0,"R",LANG("paginaspc"),LANG("spcdespc")</pageno>
  			<margins>50,30,30,30</margins>
  		</footer>
  		<!-- BEGIN -->
  		<newpage></newpage>
  		<color>CONFIG("color_line"),"#000000"</color>
  		<!-- VOLCAR DATOS -->
  		<setxy>30,50</setxy>
  		<getxy>"x","y"</getxy>
  		<font>"normal","B",8,CONFIG("color_text1")</font>
  		<textarea>30,$row["y"],25,4,"R",LANG("parte")</textarea>
  		<font>"normal","",8,CONFIG("color_text2")</font>
  		<textarea>55,$row["y"],75,4,"L",$row["id"]</textarea>
  		<font>"normal","B",8,CONFIG("color_text1")</font>
  		<textarea>105,$row["y"],25,4,"R",LANG("userinsert")</textarea>
  		<font>"normal","",8,CONFIG("color_text2")</font>
  		<textarea>130,$row["y"],75,4,"L",$row["usuario"]</textarea>
  		.
  		.
  		.
  	</foreach>
  	<output>encode_bad_chars(str_replace(".","",strpos(check_ids(getParam("id")),",")===false?execute_query("
  	SELECT CONCAT('".LANG_ESCAPE("parte")."',' ',LPAD(id,".intval(CONFIG("zero_padding_digits")).",0),' ',tarea) subject
  	FROM tbl_partes WHERE id IN (".check_ids(getParam("id")).")"):LANG("partes"))).getDefault("exts/pdfext",".pdf")</output>
  </pdf>

Node <excel>

Aquest node defineix la consulta necessària per generar un fitxer en format Excel. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <excel>
  	<query require="php/listsim.php" global="page" eval="true">"
  	SELECT
  		CONCAT(''',LPAD(a.id,".intval(CONFIG("zero_padding_digits")).",0)) '".LANG_ESCAPE("codigo")."',
  		CASE a.id_cliente WHEN '0' THEN '".LANG_ESCAPE("sincliente")."' ELSE c.nombre END '".LANG_ESCAPE("cliente")."',
  		CASE a.id_proyecto WHEN '0' THEN '".LANG_ESCAPE("sinproyecto")."' ELSE p.nombre END '".LANG_ESCAPE("proyecto")."',
  		tarea '".LANG_ESCAPE("tarea")."',
  		fecha '".LANG_ESCAPE("date")."',
  		horas '".LANG_ESCAPE("horas")."',
  		precio '".LANG_ESCAPE("precio")."',
  		total '".LANG_ESCAPE("total")."',
  		CASE liquidado WHEN 1 THEN '".LANG_ESCAPE("yes")."' ELSE '".LANG_ESCAPE("no")."' END '".LANG_ESCAPE("liquidado")."',
  		fecha2 '".LANG_ESCAPE("dateliq")."'
  	FROM tbl_partes a
  	LEFT JOIN tbl_clientes c ON a.id_cliente=c.id
  	LEFT JOIN tbl_proyectos p ON a.id_proyecto=p.id
  	WHERE a.id IN (".list_simulator($page).")"</query>
  </excel>

Node <javascript>

Aquest node, apareix en els nodes <list>  i <form>  i permet definir que codis JavaScript es vol executar per a aquesta pantalla. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <javascript>
  	<javascript include="xml/common/jslist.xml" replace="true" />
  	<function>myfunction(args) { alert(args); }</function>
  	<inline>alert('myfunction executed now');</inline>
  	<include>js/myjsfile.js</include>
  </javascript>

Node <styles>

Aquest node, apareix en els nodes <list>  i <form>  i permet definir que codis CSS es vol incloure per a aquesta pantalla. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <styles>
  	<inline>.mystyle { color:#336699; };</inline>
  	<include>css/mycssfile.css</include>
  </styles>

Afegir les taules que farà servir l'aplicació (xml/dbschema.xml)

Aquest fitxer defineix l'esquema de la base de dades que farà servir SaltOS. Quan es modifica aquest fitxer, SaltOS busca que diferències hi ha entre l'esquema especificat en aquest fitxer i l'esquema que hi ha a la base de dades. Quan troba canvis, fa les consultes SQL necessàries per modificar l'esquema sense perdre dades. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <tables>
  	.
  	.
  	.
  	<table>
  		<name>tbl_documentos</name>
  		<fields>
  			<field>
  				<name>id</name>
  				<type>/*MYSQL INT(11) *//*SQLITE INTEGER */</type>
  				<pkey>true</pkey>
  			</field>
  			<field>
  				<name>id_cliente</name>
  				<type>INT(11)</type>
  				<fkey>tbl_clientes</fkey>
  			</field>
  			<field>
  				<name>nombre</name>
  				<type>VARCHAR(255)</type>
  			</field>
  			<field>
  				<name>descripcion</name>
  				<type>TEXT</type>
  			</field>
  			<field>
  				<name>id_proyecto</name>
  				<type>INT(11)</type>
  				<fkey>tbl_proyectos</fkey>
  			</field>
  		</fields>
  	</table>
  	.
  	.
  	.
  </tables>

Afegir l'aplicació en tbl_aplicaciones (xml/dbstatic.xml)

Aquest fitxer defineix les dades de les taules mestres d'SaltOS. Quan es modifica aquest fitxer, SaltOS actualitza les taules mestres amb les noves dades. En aquest cas, s'explica com afegir una aplicació a la taula mestra tbl_aplicaciones. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <tbl_aplicaciones>
  	.
  	.
  	.
  	<row>
  		<id>100</id>
  		<codigo>examples</codigo>
  		<nombre>Ejemplos</nombre>
  		<tabla>tbl_example</tabla>
  		<campo>nombre</campo>
  	</row>
  	.
  	.
  	.
  </tbl_aplicaciones>

Afegir els permisos per a l'aplicació en tbl_aplicaciones_p (xml/db_static.xml)

Aquest fitxer defineix les dades de les taules mestres d'SaltOS. Quan es modifica aquest fitxer, SaltOS actualitza les taules mestres amb les noves dades. En aquest cas, s'explica com afegir una aplicació a la taula mestra tbl_aplicaciones_p que permet SaltOS relacionar que permisos pot tenir cada aplicació, tal com es mostra a la pestanya de permisos de les aplicacions d'usuaris i grups. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <tbl_aplicaciones_p>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>10</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>3</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>1</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>8</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>4</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>5</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>11</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>12</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>13</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>14</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>2</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>9</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>6</id_permiso>
  	</row>
  	<row>
  		<id_aplicacion>6</id_aplicacion>
  		<id_permiso>7</id_permiso>
  	</row>
  </tbl_aplicaciones_p>

La llista de permisos aquesta definida en la taula tbl_permisos que es troba també en el fitxer xml/dbstatic.xml. Si es vol afegir més permisos, n'hi haurà prou amb afegir el permís a la tbl_permisos i crear a la taula tbl_aplicaciones_p la relació entre el nou permís i la nova aplicació.

Afegir l'aplicació al menú (xml/menu.xml)

Aquest fitxer defineix el menú de SaltOS. Conté l'especificació de com ha de ser la capçalera de SaltOS i l'especificació de com ha de ser el menú de l'esquerra d'SaltOS. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <group>
  	<label lang="true">gestiongeneral</label>
  	<name>gestiongeneral</name>
  	<class>menu</class>
  	.
  	.
  	.
  	<temp global="temp" eval="true">$temp="example"</temp>
  	<option include="xml/common/menuoptionslist.xml" replace="true"/>
  	<option include="xml/common/menuoptionsquery.xml" replace="true"/>
  	<option include="xml/common/menuoptionscreate.xml" replace="true"/>
  	<option include="xml/common/menuoptionsfilter.xml" replace="true"/>
  	<option include="xml/common/menuoptionsreset.xml" replace="true"/>
  	.
  	.
  	.
  	<temp global="temp" eval="true">$temp="about"</temp>
  	<option include="xml/common/menuoptionslist.xml" replace="true"/>
  	<temp global="temp" eval="true">$temp="logout"</temp>
  	<option include="xml/common/menuoptionslist.xml" replace="true"/>
  </group>

En aquest exemple, s'ha afegit l'aplicació Example en el grup d'aplicacions General. Si es vol afegir o fins i tot crear un altre grup, n'hi haurà prou amb seguir el mateix format que l'exemple anterior.

Afegir les icones de l'aplicació (xml/iconset.xml)

Aquest fitxer defineix les icones de SaltOS. Actualment, conté 3 grups per a cada un dels estils d'icones que SaltOS disposa. A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <highcontrast>
  	.
  	.
  	.
  	<example>lib/highcontrast/actions/document-open.png</example>
  	.
  	.
  	.
  </highcontrast>
  <crystal>
  	.
  	.
  	.
  	<example>lib/crystal/apps/mydocuments.png</example>
  	.
  	.
  	.
  </crystal>
  <silk>
  	.
  	.
  	.
  	<example>lib/silk/icons/table_multiple.png</example>
  	.
  	.
  	.
  </silk>
  

Afegir els textos de l'aplicació (xml/lang/*.xml)

Aquest fitxer defineix els textos que farà servir SaltOS en els nodes que s'especifiqui l'atribut lang="True". A continuació es mostra un fragment (modificat) amb les opcions que pot contenir:

  <dir>ltr</dir>
  <default>common</default>
  <common>
  	.
  	.
  	.
  </common>
  <login>
  	.
  	.
  	.
  </login>
  <menu>
  	.
  	.
  	.
  	<documentos>Documentos</documentos>
  	.
  	.
  	.
  </menu>
  .
  .
  .
  <documentos>
  	<list>Listado de documentos</list>
  	<create>Nuevo documento</create>
  	<formview>Detalle del documento</formview>
  	<forminsert>Alta de un nuevo documento</forminsert>
  	<formupdate>Modificación del documento</formupdate>
  	<defaultdata>Datos del documento</defaultdata>
  </documentos>
  .
  .
  .

Aquest fitxer, també aquesta explicat en la FAQ sobre com traduir textos en SaltOS.


Línies de XML
60,895
Línies de PHP
18,637
Línies de JS
11,620
Línies de XSLT
2,498
Línies de CSV
1,919
Línies de CSS
577