Todas las entradas de: Javier Iglesias

Acerca de Javier Iglesias

Desarrollador de aplicaciones informáticas, diseñador Web y SEO

Localización .Net Core 6 con recursos en ensamblado

Este post es para intentar explicar como utilizar recursos de localización que se encuentran en un ensamblado distinto.

Funciona para .Net Core 6.

Los ficheros de recurso serán de 2 tipos, uno con el modificador de acceso público y otro sin generación de código.

El principal podrá ser el que tiene el modificador «Public»:

El secundario podrá ser el que tiene el modificador «Sin generación de código»:

Todo lo anterior es en lo referente a nuestro ensamblado de recursos (dll).

En el proyecto principal, además de agregar la referencia a nuestro ensamblado deberemos ir a la parte donde se configura los servicios de .net core, en este caso «Program.cs»

Después del sitio donde se añade el servicio de ControllerWithViews

builder.Services
.AddControllersWithViews()
.AddRazorRuntimeCompilation();
//Localization
var supportedCultures = new List
{
new CultureInfo("en"),
new CultureInfo("es")
};
builder.Services.AddLocalization();
builder.Services.Configure(
opts =>
{
opts.DefaultRequestCulture = new RequestCulture(supportedCultures[0]);
opts.SupportedCultures = supportedCultures;
opts.SupportedUICultures = supportedCultures;
opts.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
return new ProviderCultureResult(supportedCultures[0].Name);
}));
});

Y después de hacer el build implementar el middleware:

var app = builder.Build();
var options = app.Services.GetService>();
app.UseRequestLocalization(options.Value);

Por último quedaría usarlo, por ejemplo en el controller:

public IActionResult Index()
{
var texto_traducido = Res.HomeAppDescription;
return View();
}

O en la vista:

@inject IStringLocalizer Localizer
<p>Mi traducción es: @Res.HomeAppDescription</p>

ASP.Net Core no refresca los cambios en las vistas

Si vienes de trabajar con ASP.Net MVC en cualquiera de sus otras versiones (incluso .Net Core 1.x), seguro que realizabas cambios en las vistas y al refrescar el navegador veías los cambios.

Esto que parecía tan fácil hasta ahora cambia con asp.net core, te lo ponen difícil, ya que comprobarás como al crear un nuevo proyecto desde 0 y empieces a trabajar los cambios no tienen efecto al realizar el refresco.

Para solucionar esto hay que hacer lo siguiente:

  1. Añadir el paquete «Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation» desde Nuget
  2. Ir al fichero Startup.cs y en el método de configuración de servicios (ConfigureServices) añadir la siguiente línea
services.AddControllersWithViews().AddRazorRuntimeCompilation();

Reemplazar cadenas en todas las tablas y columnas de una base de datos SQL Server

Si en algún momento necesitas cambiar algún texto en todas sus apariciones dentro de una base de datos puedes utilizar el siguiente scritp SQL:

SET NOCOUNT ON 

DECLARE @stringToFind VARCHAR(100) 
DECLARE @stringToReplace VARCHAR(100) 
DECLARE @schema sysname 
DECLARE @table sysname 
DECLARE @count INT 
DECLARE @sqlCommand VARCHAR(8000) 
DECLARE @where VARCHAR(8000) 
DECLARE @columnName sysname 
DECLARE @object_id INT 
                     
SET @stringToFind = 'cadena_antigua' 
SET @stringToReplace = 'cadena_nueva' 
                        
DECLARE TAB_CURSOR CURSOR  FOR 
SELECT   B.NAME      AS SCHEMANAME, 
         A.NAME      AS TABLENAME, 
         A.OBJECT_ID 
FROM     sys.objects A 
         INNER JOIN sys.schemas B 
           ON A.SCHEMA_ID = B.SCHEMA_ID 
WHERE    TYPE = 'U' 
ORDER BY 1 
          
OPEN TAB_CURSOR 

FETCH NEXT FROM TAB_CURSOR 
INTO @schema, 
     @table, 
     @object_id 
      
WHILE @@FETCH_STATUS = 0 
  BEGIN 
    DECLARE COL_CURSOR CURSOR FOR 
    SELECT A.NAME 
    FROM   sys.columns A 
           INNER JOIN sys.types B 
             ON A.SYSTEM_TYPE_ID = B.SYSTEM_TYPE_ID 
    WHERE  OBJECT_ID = @object_id 
           AND IS_COMPUTED = 0 
           AND B.NAME IN ('char','nchar','nvarchar','varchar','text','ntext') 

    OPEN COL_CURSOR 
     
    FETCH NEXT FROM COL_CURSOR 
    INTO @columnName 
     
    WHILE @@FETCH_STATUS = 0 
      BEGIN 
        SET @sqlCommand = 'UPDATE ' + @schema + '.' + @table + ' SET [' + @columnName 
                           + '] = REPLACE(convert(nvarchar(max),[' + @columnName + ']),''' 
                           + @stringToFind + ''',''' + @stringToReplace + ''')' 
         
        SET @where = ' WHERE [' + @columnName + '] LIKE ''%' + @stringToFind + '%''' 
         
        EXEC( @sqlCommand + @where) 
         
        SET @count = @@ROWCOUNT 
         
        IF @count > 0 
          BEGIN 
            PRINT @sqlCommand + @where 
            PRINT 'Updated: ' + CONVERT(VARCHAR(10),@count) 
            PRINT '----------------------------------------------------' 
          END 
         
        FETCH NEXT FROM COL_CURSOR 
        INTO @columnName 
      END 
     
    CLOSE COL_CURSOR 
    DEALLOCATE COL_CURSOR 
     
    FETCH NEXT FROM TAB_CURSOR 
    INTO @schema, 
         @table, 
         @object_id 
  END 
   
CLOSE TAB_CURSOR 
DEALLOCATE TAB_CURSOR 

Ayudando a la Pequeña y Mediana Empresa

Es posible que en el trabajo diario de tu empresa hayas echado en falta alguna herramienta y/o aplicación informática que mejoraría la productividad, que te ayudaría en la toma de decisiones, que facilitaría tu trabajo o cualquier otra ventaja.

También es posible que incluso hayas consultado presupuestos con alguna compañía o persona de desarrollo de software y que por sus elevados costes no se haya podido iniciar.

Y en el peor de los casos es muy probable que te hayas embaucado en un proyecto de este tipo y que te hayan dejado a medias algún trabajo, incluso después de constantes aumentos de costes y una sucesión interminable de errores en la aplicación desarrollada.

Si tu situación es cualquiera de las expuestas y sigues pensando que una aplicación a medida de tu negocio ofrecería a tu empresa muchas ventajas, te recomiendo que sigas leyendo para conocer lo que considero necesario antes de que puedas meterte en un lío innecesario.

Cosas que debes tener en cuenta antes de iniciar un proyecto de software a medida dentro de tu empresa

Antes de iniciar un proyecto con un desarrollo a medida para tu proyecto deberías de tener en cuenta algunos hechos fundamentales y que no siempre se tienen en cuenta:

Lo excesivamente barato suele salir caro

Como pasa en todos los sectores existen personas y empresas de todo tipo. En este sector también: existen personas muy profesionales tanto en empresas como autónomos o FreeLancer, pero por desgracia también existen otras personas que venden duros a cuatro pesetas y ese precisamente es el inicio de todos los problemas. Mi consejo es el siguiente: Desconfía de aquellos que te van a realizar un proyecto a medida a precio de ganga ya que seguramente el proyecto acabará sin terminar y habrás realizado una inversión inútil.

No siempre la mejor solución es una empresa

En una empresa tú no hablas directamente con la persona o personas que están haciendo realmente tu aplicación. Tu idea o concepto se puede perder o diluir a través de las numerosas personas intermediarias hasta que llegan al que realmente tiene que hacer el trabajo: que no es otro que el programador. La metodología puesta de moda años atrás en la que un analista (una persona que no tiene porque saber programar y de hecho en muchas empresas así es) obtiene los requisitos y crea un documento que luego tendrán que entender los programadores está totalmente desfasado en mi opinión y creo que es un modelo que implica muchos costes intermedios.

En una empresa no sabes la persona que realmente te hará el trabajo… todos hemos sido becarios alguna vez y nos han asignado nuestro primer proyecto ¿De verdad quieres que te toque a ti ese becario?

La creación de aplicaciones a medida son costosas en tiempo

No esperes tener un proyecto desarrollado en una semana salvo que sea algo muy sencillo. La mayor parte de las veces el desarrollo puede superar los meses de trabajo.

Las especificaciones de un proyecto siempre cambian

Un proyecto siempre es dinámico, es muy difícil encontrar un proyecto en el que los requisitos o especificaciones no se modifiquen. Por eso tanto el cliente como el desarrollador de software deben estar abiertos a posibles cambios.

 

 

7 razones para contratar un freelance

Últimamente está aumentando la contratación de freelance, autónomos, trabajadores por cuenta propia,etc. por parte de numerosas empresas. Contratar un freelance …. ¿Cuál es la razón de esta tendencia?.

Existen multitud de beneficios que puede aportar un profesional de este tipo:

Experiencia

El perfil habitual de freelance es el de una persona experimentada que ha trabajado en varias industrias, agencias, sectores y/o empresas. De este modo puede ofrecer múltiples puntos de vista sobre un mismo problema, ideas nuevas o aportar conocimientos de su sector.

Comunicación

Con un profesional freelance la comunicación es directa. ¿que quiere esto decir?… pues muy sencillo: no necesita de intermediarios como gerentes o gestores que pueden estropear la comunicación. Por lo general es el propio trabajador freelance quien hace todas las tareas. Además un profesional freelance es, entre otras cosas, un comercial que puede asesorar de primera mano a sus clientes sobre como abordar los trabajos.

Económico

Costes menores: un trabajador freelance suele trabajar  desde casa. Todo esto repercute en los costes ya que un autónomo de este tipo no tiene gastos de local. Además si un empresario contrata a un  empleado tiene que hacer frente a una nómina con sus consiguientes gatos fiscales incluso cuando el trabajador no tenga carga de trabajo o esté  en períodos de formación. Todo esto se puede ahorrar contratando un freelance.

Flexibilidad

Recurrir a un freelance puntualmente para cubrir  ciertas necesidades de negocio que, aún siendo importantes, no son el  principal objetivo de negocio permite externalizar servicios. Esto permite una alta flexibilidad. Por ejemplo: sería absurdo contratar como empleado a un fontanero en  nómina cuando quieres realizar una reforma puntual en tu local o reparar cierta avería.

Rapidez

El freelance tiene rapidez de respuesta, no tener que rendir cuentas a nadie salvo a su cliente simplifica mucho las cosas. Él es su propio jefe de proyecto. El cliente de un autónomo solamente dispondrá de un teléfono para hablar sobre su proyecto.

Motivación

El trabajador freelance está en general altamente motivado. Dedica casi el 100% de su tiempo a realizar un proyecto, son responsables con su trabajo y tiene un gran compromiso con el cliente.

Implicación

Si una empresa apuesta por un profesional de este tipo durante largo tiempo éste podrá adquirir el conocimiento de negocio necesario para ofrecer trabajos de mayor calidad y en menor cantidad de tiempo.

Asegurar release siempre en la publicación .Net

La publicación de una aplicación .Net permite utilizar la configuración Debug y Release y dependerá casi siempre de lo que tengamos seleccionado en el momento de la publicación.

Sin embargo, en muchas ocasiones solo nos interesará publicar con la configuración Release.
Sobre todo cuando tengamos en nuestro código sentencias condicionales del tipo:

#if DEBUG

#else

#endif

Para asegurarnos de que siempre utilizaremos la configuración release deberíamos editar el archivo csproj de nuestro proyecto e introducir lo siguiente justo antes del cierre de la etiqueta :

&amp;amp;amp;lt;Target Name=&amp;amp;amp;quot;BeforePublish&amp;amp;amp;quot;&amp;amp;amp;gt;
	&amp;amp;amp;lt;Error Condition=&amp;amp;amp;quot;'$(Configuration)' == 'Debug'&amp;amp;amp;quot; Text=&amp;amp;amp;quot;¡Estás intentando publicar la configuración Debug!&amp;amp;amp;quot; /&amp;amp;amp;gt;
  &amp;amp;amp;lt;/Target&amp;amp;amp;gt;