[WEBCASTS] Christmas Windows Phone Sessions

ACTUALIZACIÓN: Por problemas de agenda personal, mi webcast sobre Nokia Imaging SDK del Miércoles 11 se retrasa hasta el Viernes 13 a las 18:00 (GMT+1) Siento el cambio!

Cuando te mueves en el mundillo de la comunidad, no es raro que un buen día al despertarte, te encuentres con un correo que te invita a participar en un nuevo sarao… y tampoco es raro que te tires de cabeza a ello sin pensarlo dos veces.

De esta forma nace un evento navideño sobre Windows Phone, las Christmas Windows Phone Sessions. En esta ocasión, en vez de organizar un evento presencial como la Windows Phone Week Spain, lo que vamos a hacer es montar 12 webcasts a lo largo del mes de Diciembre, para que los puedas ver desde el calor de tu hogar, con una taza de chocolate caliente, la chimenea encendida y un trozo de turrón del “blando” en la mano jejeje.

Para tremenda misión navideña nos reunimos Alejandro Campos, autor intelectual del delito, Santiago Porras, más conocido como Pixel Kid, Roberto Luis Bisbé, Anywhere anytime, Rafa Serna, desde Santander con amor, Javier Suarez, el generador de sevilla y un menda, el mote me lo podéis poner en los comentarios jeje.

Christmas-Windows-Phone-Sessions-Poster-small

Con esta plantilla, que ya conocerás si eres habitual del mundillo de Windows Phone, podrás disfrutar de 12 charlas sobre la plataforma móvil que más triunfa alrededor del mundo (y no es que lo diga yo, que también) desde migraciones de wp7 a wp8, pasando por efectos de imágenes, diseño y hasta NFC o Azure Mobile Services… vamos una agenda completita:

Introducción al diseño de Apps para Windows Phone

Santiago Porras

02/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572295&Culture=es-ES&community=0

Desde Windows Phone 7 a Windows Phone 8

Roberto Luis Bisbé

03/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572301&Culture=es-ES&community=0

Desarrollando con MVVM

Josué Yeray

04/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572307&Culture=es-ES&community=0

Phone 8 Update 3. Cambios para los desarrolladores

Javier Suárez Ruiz

05/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572313&Culture=es-ES&community=0

Optimiza tus apps de Windows Phone 8

Alejandro Campos Magencio

09/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572318&Culture=es-ES&community=0

¡¡¡NFC a tope!!!

Rafa Serna

10/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572322&Culture=es-ES&community=0

Efectos alucinantes con Nokia Imaging SDK

Josué Yeray

13/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572324&Culture=es-ES&community=0

Descubriendo Windows Phone App Studio

Javier Suárez Ruiz

12/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572328&Culture=es-ES&community=0

Diseño de Apps exclusivas para Windows Phone

Santiago Porras

16/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572334&Culture=es-ES&community=0

Azure Mobile Services, desde las trincheras

Rafa Serna

17/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572338&Culture=es-ES&community=0

Cimbalino Toolkit y Multilingual Toolkit

Josué Yeray

18/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572342&Culture=es-ES&community=0

Distribución empresarial en Windows Phone 8

Javier Suárez Ruiz

19/12/2013

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032572345&Culture=es-ES&community=0

Puedes ver el post oficial del evento en este post de MSDN.

Espero que asistas, que te lo pases muy bien y sobre todo, que sea de provecho!

P.D.: Prometo hacer mis webcast, al menos, con un gorro de papa noel… ya veremos si incluyo la barba y todo!

Feliz navidad a todos!

[Windows Phone 8] Cimbalino Toolkit: Trabajando con XAML

Cimbalino Toolkit: ApplicationBar y Servicios

Hoy vamos a continuar hablando un poco más sobre las cosas que nos ofrece este estupendo Toolkit para Windows Phone 8. En concreto, vamos a descubrir unas buenas utilidades que incorpora, y que nos ahorrarán escribir mucho código.

Pero vamos por pasos, primero vamos a presentar a un buen amigo: System.Windows.Interactivity. Seguro que muchos lo recordaréis de otros entornos como “WPF o morir”, “Silverlight shadow” o “Mi XAML se comió a tu HTML5”. Por si no es así, aquí va un curso de choque rápido sobre System.Windows.Interactivity.

System.Windows.Interactivity en diez segundos

Este ensamblado, nos permite añadir interacción a XAML sin necesidad de escribir código asociado a un evento o a un comando. Incluye dos tipos básicos: los Triggers y los Behaviors.

  • Los Triggers, nos permiten asociar una acción a un evento por código. Esta acciones las definimos creando una clase que herede de TriggerAction<T>, de esta forma, podemos añadir código al lanzamiento del evento OnSelectionChanged o Tap de una lista, sin tener que escribir code behind ni comandos en las viewmodels.
  • Los Behaviors aportan comportamiento a un control. Se definen creando una clase que herede de Behavior<T>. Al crearse el objeto, el behavior se engancha y en su código podemos tener acceso a todo el control que se ha adjuntado, podemos suscribirnos a sus eventos y modificar sus propiedades.

La principal diferencia entre ambos tipos es que, en uno (Trigger) podemos ejecutar la acción con cualquier evento que definamos y normalmente será  una acción que no modificará al propio control. Sin embargo, el otro (Behavior) ejecutará código sobre el control y su contenido.

Independientemente de usar uno u otro, esto vendrá dado por nuestras necesidades, la ventaja común es que nos permiten crear pequeñas porciones de funcionalidad, que podemos agregar a un control existente, sin tener que reescribirlo completamente.

Bien, ahora que ya nos hemos refrescado la memoria y estamos todos seguros de lo que es un Trigger y un Behavior, ¿Qué tiene esto que ver con Cimbalino? Bueno, pues tiene que ver que el bueno de Pedro Lamas se ha creado un buen número de Behaviors y TriggerActions para simplificarnos la vida, mucho muchísimo. ¿Necesitas mostrar un mensaje al usuario cuando realice cierta acción? ¿Quieres que se abra la página de review de la Store al pulsar un botón? ¿Te gustaría dar acceso a tu usuario a configurar elementos de conexión como WiFi, Bluetooth, Modo vuelo…? Pues todo esto y alguna cosa más, encontrarás en el Toolkit Cimbalino.

Behaviors

Cimbalino incluye 4 behaviors de serie. Dos de ellos referentes al ApplicationBar con capacidad de Bindings que vimos en el artículo anterior, un MultiBinding y un AutoFocus.

El MultiBindingBehavior nos permite enlazar a una misma propiedad varias fuentes de datos. De esta forma podríamos enlazar en un mismo TextBlock el nombre y apellidos de un usuario, o varias partes de una dirección postal, su uso es muy sencillo, definimos el behavior y, dentro de este, los distintos bindings que queremos realizar:

<TextBlock>
    <i:Interaction.Behaviors>
        <behaviors:MultiBindingBehavior PropertyName=«Text»>
            <behaviors:MultiBindingItem Value=»{Binding Coin}«/>
            <behaviors:MultiBindingItem Value=»{Binding Total}«/>
        </behaviors:MultiBindingBehavior>
    </i:Interaction.Behaviors>
</TextBlock>

Este código XAML enlaza las propiedades Coin y Total a la propiedad Text de nuestro TextBlock. Pero si ejecutamos, veremos que el output que obtenemos es “Object[]” simplemente. Esto ocurre porque, precisamente, el resultado del MultiBindingBehavior es un array de objetos. Tenemos que indicarle de alguna forma como tratar esos objetos para producir un resultado final. Podemos hacer esto mediante el uso de un Converter:

public class StringConcatenationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return string.Empty;

        var val = (object[])value;
        string result = string.Empty;
        val.ToList().ForEach(str => result = string.Format(«{0} {1}», result, str));
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Básicamente lo que hacemos en este converter es obtener el array de objetos y recorrerlo concatenando sus valores. Ten en cuenta que este caso, un ejemplo, se basa en cadenas, pero podrías estar pasando diferentes tipos de datos, por lo que tendría más lógica.

Simplemente tenemos que añadir este StringConcatenationConverter a la propiedad Converter del MultiBindingBehavior y veremos el resultado correctamente:

image

El AutoFocusBehavior va a facilitarnos mucho la vida en páginas en las que el usuario pueda meter datos en varios TextBox. Este Behavior lo definimos a nivel de página y permite que configuremos dos opciones:

<i:Interaction.Behaviors>
    <behaviors:AutoFocusBehavior SelectAllOnFocus=«True»
                                 CycleNavigation=«True»/>
</i:Interaction.Behaviors>

SelectAllOnFocus, indica si se debe seleccionar todo el texto que contenga el TextBox cuando le llegue el foco. CycleNavigation indica si, cuando lleguemos al último TextBox de la página, debemos regresar al primero. Además tenemos un evento y un comando, AfterAutoFocus y AfterAutoFocusCommand, que nos permiten ejecutar código después de que un control reciba el foco. Para establecer el orden en que los TextBox de una página reciben el foco solo tenemos que indicar la propiedad TabIndex de cada uno. Cuando el usuario pulse el enter del teclado en pantalla, se saltará al siguiente en la lista. Fácil, ¿no?

TriggerActions

Además de estos behaviors, Cimbalino incluye un gran número de TriggerActions, dispuestas a ser usadas directamente en nuestro código XAML:

  • ClipboardAction, nos permite indicar el origen del texto y lo copia al portapapeles cuando se ejecute el trigger.
  • ConnectionSettingsAction, nos permite indicar el tipo de conexión y al lanzarse el trigger se abre la pantalla de configuración del sistema.
    • WiFi
    • Cellular
    • Bluetooth
    • Airplane Mode
  • EmailComposerAction, permite componer un email y enviarlo sin necesidad de escribir código C#.
  • MessageBoxAction, muestra un mensaje en pantalla.
  • SearchAction, lanza la busqueda del sistema con el texto que indiquemos.
  • WebBrowserAction, lanza el navegador del sistema con la url que indiquemos.
  • ShareStatusAction, comparte un texto en las redes sociales.
  • MarketplaceReviewAction, lanza la página de revisión de nuestra aplicación en el sistema.
  • Muchos más…

A continuación os pongo unos ejemplos de como funcionan algunas de estas TriggerActions:

SearchAction
<Button Content=«Search term ‘Dr Who'»>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName=«Click»>
            <actions:SearchAction SearchQuery=«Dr Who»/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

ConnectionSettingsAction
<Button Content=«Open Bluetooth settings»>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName=«Click»>
            <actions:ConnectionSettingsAction ConnectionSettingsType=«Bluetooth»/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

EmailComposerAction
<Button Content=«Send email»>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName=«Click»>
            <actions:EmailComposeAction To=«josueyeray@gmail.com» Subject=«Hola» Body=«Mira mama, sin C#»/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

Muy sencillo de usar y sobretodo, una forma genial de simplificar nuestro código con ciertas tareas que no necesitan re implementarse una y otra vez en cada aplicación.

Conclusión

Como hemos podido ver, los Behaviors y las TriggerActions que incorpora Cimbalino pueden facilitarnos mucho el desarrollo, así que no los dejéis de probar. Para que os sea más fácil, aquí os dejo un ejemplo con algunos Behaviors y TriggerActions implementados. Espero que os sea de utilidad.

Un saludo y Happy Coding!

Las Store de Windows y Windows Phone se unifican

Hola a todos!

Hoy Microsoft ha anunciado que, a partir de ya mismo, se van a unificar las tiendas de Windows y Windows Phone, desde la perspectiva del desarrollador. ¿Qué quiere decir esto? Pues que solo vamos a necesitar registrarnos en un portal, solo tendremos que realizar un pago, y que podremos publicar aplicaciones para ambos sistemas (Windows Store – Windows Phone).

¿Qué ganamos con esto? Bien, en primer lugar ahorraremos dinero. Hasta ahora, este era el estado de los pagos para hacerse desarrollador:

  • Usuario individual:
    • Windows Phone Store: 19$
    • Windows Store: 49$
  • Empresa:
    • Windows Phone Store: 19$
    • Windows Store: 99$

Pero a partir de hoy, quedará de la siguiente forma:

  • Usuario individual (Windows Store + Windows Phone Store) 19$
  • Empresa (Windows Store + Windows Phone Store) 99$

En el caso de un desarrollador individual, la ventaja es clara: Hasta hoy, nos costaba 68$ al año mantener las dos cuentas, a partir de ahora solo 19$. Las empresas ahorran solo 19$.

Y ¿Qué pasa si ya tengo cuenta en la store de Windows Phone? Pues que estás de suerte: Ahora ya tienes cuenta en la Windows Store también, así, sin hacer nada más!

Y ¿Si tengo cuenta en la Windows Store? Pues lo mismo: Ahora ya puedes publicar apps para Windows Phone y registrar dispositivos para desarrollo.

Vale… Pero ¿Y Si tengo cuenta en las dos? Pues vaya, ya has pagado las dos store… así que Microsoft te regalará un Token para que renueves gratis las cuentas cuando caduquen!!

Creo que es una gran oportunidad así que… vamos todos a publicar apps!!

Post oficial de Windows Phone dev blog: http://blogs.windows.com/windows_phone/b/wpdev/archive/2013/11/06/unifying-developer-registration-windows-and-windows-phone.aspx

Un saludo y Happy Coding!!

 

[Windows Phone 8] Multilingual App Toolkit

Hola a todos!

En nuestro repaso por los toolkits de desarrollo para Windows Phone, hoy quiero hacer un alto en el camino para hablar del Multilingual App Toolkit.

Un punto básico para mejorar las descargas de nuestras aplicaciones, es el de traducirlas a varios idiomas. Al menos el Inglés es un requisito casi imprescindible. Aunque en España Windows Phone no tiene una gran presencia, en latino américa si que la tiene, por lo que el español es también una gran opción. Una vez tenidos en cuenta estos dos grupos de idiomas, podemos plantearnos implementar otros idiomas que, aunque quizás no tan numerosos en su público, nos permitirán fidelizar usuarios. Podemos en este sentido buscar los países de habla no inglesa ni española en busca de aquellos con una mayor cuota de mercado de Windows Phone. Países como Polonia, con más del 20% de cuota de mercado o Brasil, donde el Lumia 520 está arrasando, son objetivos claros.

Una vez identificados los idiomas que deseamos incluir en nuestra aplicación, podemos ponernos manos a la obra. Tenemos dos tareas importantes que realizar:

  • Implementar el soporte para múltiples idiomas en nuestra aplicación.
  • Conseguir traducciones de nuestros textos a cada idioma que queramos soportar.

En ambos casos, el Multilingual App Toolkit nos ayudará. Para la segunda tarea, conseguir las traducciones, es aconsejable evitar las traducciones automáticas. Aún son bastante malas y en muchos casos podemos encontrarnos con que un término puede resultar ofensivo, o que una frase que en español tiene sentido, en portugués no lo tiene. ¿Qué podemos hacer entonces? Pues confiar en la comunidad. En concreto, los MVPs de Windows Phone estamos repartidos por todo el mundo y, dentro de nuestra disponibilidad de tiempo, estamos dispuestos a ayudar a traducir o buscar quien pueda ayudar. Así, si necesitáis traducciones, podéis enviarme un email a josueyeray@gmail.com y yo puedo poneros en contacto con los MVPs de Windows Phone de la región para la que necesitáis la traducción, que estarán encantados de ayudar.

Y para esta tarea, Multilingual App Toolkit juega un papel fundamental, pues facilita el distribuir un archivo de textos y que nos lo devuelvan traducido. Vamos a ver como usarlo.

En primer lugar vamos a crear un nuevo proyecto de Windows Phone 8. Con todo proyecto nuevo, en la carpeta resources de la aplicación, se incluye un archivo RESX llamado AppResources.resx. Este es el archivo donde pondremos todos los textos de la aplicación. Es deseable, si queremos luego obtener traducciones de otras personas, que este archivo contenga los textos en inglés. Si luego queremos traducir al polaco, mucha gente podrá hacerlo, pero si el idioma original es el español, encontraremos más dificultades para encontrar a alguien que sepa español y polaco.

Así que dentro de este archivo de recursos pondremos nuestros textos. Si lo abrimos, veremos una estructura de tabla con tres columnas:

  • Name: El nombre que identifica el recurso.
  • Value: El valor del recurso, el texto a mostrar.
  • Comment: Un comentario, que puede indicar donde usamos este recurso, por ejemplo.

image

De esta forma, podemos ir añadiendo recursos cada vez que deseemos mostrar un texto en la aplicación. Es importante que usemos este sistema desde el principio del desarrollo. Si lo dejamos para el final, se convertirá en una tarea tediosa y se nos puede pasar un texto. Si un solo texto está sin traducir, la aplicación fallará la certificación por la regla 4.4 – Language Validation. Por lo que lo más aconsejable es llevar a cabo esta tarea desde un primer momento y nunca usar textos directamente desde XAML.

Bien, pero ¿Como accedemos a estos recursos desde un TextBlock en XAML? Pues usando la clase, que también se incluye por defecto, LocalizedStrings. Esta clase está incluida como un recurso estático en el archivo App.xaml, con el mismo nombre. Usando este recurso y la propiedad Name del archivo RESX, podremos acceder a los textos desde XAML:

<Grid x:Name=«ContentPanel» Grid.Row=«1» Margin=«12,0,12,0»>
    <TextBlock Text=»{Binding LocalizedResources.LargeText, Source={StaticResource LocalizedStrings}}«
               TextWrapping=«Wrap»></TextBlock>
</Grid>

Si ejecutamos la aplicación, veremos el contenido del recurso LargeText en nuestro textblock. Lo bueno de esta solución es que, dependiendo del idioma del dispositivo, automáticamente se decidirá que archivo de recursos usar, con lo que no tenemos que preocuparnos más por como gestionar el cambio de idiomas.

Ahora, llega el momento de localizar nuestra aplicación a varios idiomas. Como hemos hecho el archivo principal en inglés, vamos a localizarla a español. En primer lugar tendremos que descargar el Multilingual App Toolkit (MAT) aquí. Es importante que escojamos el mismo idioma de descarga que el de nuestro Visual Studio, para evitar problemas de compatibilidad. En mi caso, tengo Visual Studio en inglés, así que descargue el MAT en inglés. Es recomendable que cerremos Visual Studio mientras instalamos el MAT, pues añade opciones a Visual Studio y podríamos tener que reiniciar si no lo tenemos cerrado.

Una vez que tengamos MAT instalado, podemos volver a abrir Visual Studio y nuestro proyecto. En el menú TOOLS encontraremos una nueva opción llamada “Enable Multilingual App Toolkit”, al hacer click sobre ella se añadirá un nuevo archivo a nuestra carpeta resources, con extensión xlf, llamado igual que nuestro archivo RESX (AppResources) con el texto qps-ploc y la extensión mencionada. Este es un archivo de pseudo idioma que usaremos más adelante para comprobar que nuestra aplicación está correctamente localizada. Pero primero, vamos a añadir un nuevo idioma a nuestra aplicación. Para ello hacemos click derecho sobre el proyecto y en el menú desplegable escogemos la opción “Add translation lenguages”, que abrirá una ventana donde podremos seleccionar todos los idiomas nuevos que queramos añadir a nuestra aplicación. En nuestro ejemplo, buscamos Spanish (es) y lo seleccionamos, veremos que a su lado tiene una flecha, que indica que podemos desplegarlo. Si seleccionamos este nodo, nuestra aplicación incluirá la cultura independiente “es”, independientemente del país, si desplegamos y seleccionamos un país concreto, solo se soportará el idioma para ese país determinado:

image

En el caso del español, es recomendable escoger la cultura independiente “es”, de esta forma, no tendremos que realizar una localización para cada país. Presionamos OK y un nuevo archivo XLF se añade a nuestra carpeta resources: AppResources.es.xlf. En este archivo debemos incorporar las traducciones en español de nuestros textos. Si hacemos doble click sobre este nuevo archivo, se abrirá el Multilingual editor, una aplicación independiente de Visual Studio, que se instala junto con el MAT y que nos permite editar los textos de los archivos de recursos:

image

El uso de esta aplicación es muy sencillo. En la parte inferior tenemos una lista de todos los textos. Si los seleccionamos, en la parte central veremos, en el primer cuadro de texto, el original y nuestra traducción podremos escribirla en el segundo cuadro de texto. Cuando empecemos a escribir en el segundo cuadro de texto, el estado cambiará de rojo (New) a amarillo (Translated). Y voila! ya está traducida la aplicación. Solo tenemos que guardar los cambios que hayamos realizado y lanzar nuestra aplicación en el emulador, cambiando el idioma de este a la cultura que deseemos probar, y veremos que automáticamente los textos aparecen en el idioma seleccionado.

Ahora, ¿Como podemos enviarle a alguien los textos para que los traduzca? Pues muy fácil! Simplemente tenemos que crear el archivo XLF en nuestro proyecto, con la opción “Add translation languages” y luego, enviar ese archivo XLF a la persona que corresponda. Esta podrá abrir el archivo desde el editor del MAT, sin necesidad de tener nuestro código, traducir las distintas cadenas de texto y devolvernos el archivo traducido. Nosotros solo tenemos que volver a copiar este archivo sobre nuestro XLF original y listo! Ya tenemos nuestra aplicación traducida. Además, como la persona que ha traducido ha podido poner comentarios y tiene un tracking del estado, podemos ver fácilmente si está todo correcto, si algún texto está mal o no se entiende… Vamos, que tenemos un montón de opciones!

Yeray, ¿La gente hace esto gratis? Bien, normalmente los MVPs tenemos un trabajo que nos da de comer, y en nuestro tiempo libre, intentamos poner nuestro granito de arena para ayudar a la comunidad. Entre otras cosas, si alguien nos pide que ayudemos con una traducción, intentamos ayudar, pero es importante observar ciertas normas:

  • Es posible que quien te traduzca los textos no gane nada y además use parte de su tiempo libre, se paciente si alguien tarda más en hacerlo, ten en cuenta que está usando su tiempo libre.
  • Observa el dicho “De bien nacidos es ser agradecidos”, Ya que te están ayudando a tener unas buenas traducciones, que te parece poner en la página de Acerca de/Créditos el nombre y un enlace de quien tradujo ese idioma? incluso lo puedes incluir en el archivo de recursos, dos keys TranslatorLink, TranslatorName, así la persona solo tiene que poner su nombre y un enlace a twitter o a su blog. Todos ganamos. Tu tienes tu traducción y yo publicito mi blog un poco.
  • Guarda el contacto de las personas que te han ayudado, en un futuro, para una actualización o una nueva app, puedes contar con ellos, también puedes darles las gracias si observar un aumento de las descargas después de la traducción. Ya que esto se hace de forma altruista, siempre mola que has tenido un impacto. Y da muchos ánimos.
  • Recuerda que todos somos humanos y nos podemos equivocar. Si ocurre una equivocación en una traducción, no montes en cólera, habla con quien hizo la traducción y comenta el error, será sencillo de corregir y no tendrá mayores consecuencias.
  • Si te haces rico, asquerosamente rico, acuérdate de MVPs traductores sin fronteras jejeje.

Y listo! hasta aquí con el tema de Multilingual App Toolkit de hoy, espero que os haya gustado el artículo, sirva para que más gente se decida a localizar sus aplicaciones y salir del mercado local que, como sabemos, en España es casi inexistente. Aquí tenéis el ejemplo que he usado y que os puede ayudar a empezar a usar MAT.

Un saludo y Happy Coding!