¿Cuáles son las alternativas al archivo resx?

7

Estoy desarrollando una aplicación para Windows y quiero almacenar todo el texto para etiquetas, botones de radio, botones, casillas de verificación y encabezados de columnas de cuadrículas en un solo lugar. He intentado usar un archivo de clase, un archivo xml, una tabla de base de datos y un archivo de recursos.

Descubrí que un archivo de clase es la mejor manera de almacenar todos estos textos, pero quiero saber si hay alguna otra forma alternativa. Si estoy usando un archivo de clase, tendré que volver a compilar el proyecto si algún texto cambia.

¿Funcionará correctamente un archivo de recursos para datos de grandes cantidades? ¿Qué pasa con un diccionario o el almacenamiento de datos en variables?

    
pregunta sandeep.gosavi 30.08.2013 - 15:25

7 respuestas

5

En resumen: Me parece una localización de recursos (diferentes tipos como etiquetas estáticas, texto, etc.). En general, los cambios en el contenido del archivo de recursos no deberían requerir una reconstrucción de la aplicación.

La desventaja para almacenar recursos en clases , es que cada cambio / modificación requerirá una reconstrucción de la aplicación win-form.

  

¿Funcionará correctamente un archivo de recursos para datos de grandes cantidades?

Creo que la limitación es la limitación del tamaño del archivo del sistema operativo y eso es 4 GB en sistemas de 32 bits, si recuerdo bien. Para 64 bits debería ser aún más grande. De todos modos, con el propósito de almacenar el texto estático, debería ser más que suficiente.

Por lo tanto, en mi opinión, esto no debe hacerse en ningún otro lugar si el texto será estático.

Un enfoque alternativo sería crear una clase para controlar el acceso a sus archivos de recursos. Esta clase podría usarse para almacenar las claves para acceder a sus archivos de recursos y una forma muy tipificada de recuperar los recursos disponibles del proyecto.

Algunas referencias en respuestas SE sobre localización y recursos:

Referencias de MSDN :

respondido por el EL Yusubov 30.08.2013 - 15:31
3

Creo que casi lo mencionaste todo.
Si desea algo flexible, donde no necesite recompilar, entonces el DB puede ser su mejor opción.
Pero de lo contrario, me gustaría ir con .resx, ya que este es el estándar.
Guardar texto dentro de los archivos de clase es una mala idea.

    
respondido por el Remy 30.08.2013 - 13:37
2

Además del formato .resx, también puede usar archivos .txt o .restext, que están en un formato más simple (y más fácil de leer y editar).

Creación de archivos de recursos para aplicaciones de escritorio (consulte la sección "Recursos en archivos de texto")

El formato es esencialmente name = value , con la capacidad de tener comentarios y compilación condicional.

Otra opción es usar la fuente o el archivo de texto que desee, y compilar el archivo binario .resources de forma manual o como parte de un paso de compilación. (Consulte "Recursos en archivos .resrouces" en el enlace de arriba).

De cualquier manera, hay un poco más de trabajo para incluirlos en tu proyecto y compilarlos, pero ambos tienen la ventaja de tener soporte para múltiples idiomas, como el archivo .resx.

    
respondido por el crashmstr 30.08.2013 - 14:01
2

En C #, es casi seguro que es mejor usar un archivo de recursos (que es un archivo XML). Esto le brinda los siguientes beneficios:

  • Elimina la necesidad de volver a compilar la solución completa para los cambios de texto.
  • Permite que la administración de cadenas sea realizada por alguien que no sea el codificador (los codificadores no son necesariamente las mejores personas para escribir mensajes de error / informativos del usuario).
  • Permite una localización bastante trivial.
respondido por el TZHX 30.08.2013 - 15:34
1

Antes tenía un requisito similar y almacené recursos en un archivo .resx, pero decidí usar clases para almacenar las claves.

Por ejemplo, supongamos que tengo recursos para la pantalla de retiro bancario.

He creado una clase simple en las líneas de

public class BankingWithdrawalResource
{
   public string WithdrawFunds { get; set; }
}

Luego implementé una clase para recuperar recursos. Mi objetivo era tener una forma fuertemente tipada de sacar recursos. También quería que las unidades de recuperación de recursos fueran comprobables. He extraído una interfaz para recuperar recursos: IResource .

Cada vez que quisiera usar recursos, obtendría una implementación a través del contenedor IoC.

var resource = Dependency.Resolve<IResource>();

Finalmente, cuando se trataba de usar el recurso, tendría algo en la línea de:

resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)

En la línea anterior, usé la expresión lambda que me permitió ver todos los recursos disponibles a través de intellisense.

Cuando se trataba de pruebas de unidad, me burlaba de IResource y establecía expectativas en él.

Por ejemplo:

resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();

También tenga en cuenta que hemos extraído una interfaz para la recuperación de recursos. Debido a esto, ahora podemos almacenar recursos en cualquier lugar que queramos. Por ejemplo:

public class DatabaseResource : IResource
{
   // Logic to retrieve resources from database
   // Won't cause recompilation
}

public class XmlResource : IResource
{
   // Logic to retrieve resources from xml files
}

public class DefaultResource : IResource
{
   // Will cause recompilation as resources are stored in .resx
}

Escribí arriba desde la parte superior de mi cabeza en el bloc de notas, así que si tienes algún problema, avísame y agregaré la implementación más tarde.

    
respondido por el CodeART 30.08.2013 - 15:59
1

Acabo de hacer algo similar siguiendo este tutorial de CodeProject: link

Es para convertir múltiples archivos de texto fácilmente actualizables en archivos de recursos que puede agregar a su proyecto para tener diferentes idiomas (en mi caso, un cuadro combinado me permite cambiar entre tantos idiomas como creo archivos de recursos para )

La ventaja de esto sobre los archivos .resx es que solo puede tener 1 por idioma por proyecto, en lugar de tener que tener 1 por idioma por formulario

Solo otra cosa que pensar

    
respondido por el iabbott 30.08.2013 - 13:51
0

Objeto portátil (.po) es muy popular y casi un estándar fuera del mundo .NET. Lo vi usado en unos pocos proyectos de C # (por ejemplo, enlace

El formato es definitivamente más simple que .resx, ya que no está basado en XML. Usted tiene muchas herramientas para ello también, por ejemplo. pootle, poedit y más ...

Otra opción es usar algún formato simple (o personalizado) como JSON / YAML / TOML, o incluso algo tan simple como Key=Value en texto plano con alguna convención de nomenclatura de archivos como Locale.{languagecode2-country/regioncode2} . Luego puede incrustarlo como un recurso en su ensamblaje :) Pero luego debe crear sus propias herramientas de traducción, o algún convertidor a / desde po / resx para trabajar con las herramientas existentes.

Aparte de eso, .resx es la forma oficial y la primera opción para elegir. Las herramientas también son decentes: enlace

    
respondido por el Konrad 07.12.2018 - 13:22

Lea otras preguntas en las etiquetas

Comentarios Recientes

system: la ejecución en contenedores es solo una alternativa al sistema de archivos tradicional, ya que cualquiera que ejecute Apache puede estar presente en una aplicación que se ejecutará sin problemas (haciendo cosas como rastrear contenido de archivos, contando páginas, etc.). No toma mucho esfuerzo ni tiempo ajustar el contenido de Apache para detener parte de la funcionalidad del sistema de archivos (en particular, para eliminar algunos de sus sistemas más utilizados, como directorios), pero aún necesitará... Lee mas