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 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 grandes cantidades de datos? ¿Qué pasa con un diccionario o el almacenamiento de datos en variables?
Respuestas:
En resumen: me parece una localización de recursos (diferentes tipos como etiquetas estáticas, texto, etc.). En términos generales, los cambios en el contenido del archivo de recursos no deberían requerir una reconstrucción de la aplicación.
La desventaja de almacenar recursos en clases es que cada cambio / modificación requerirá una reconstrucción de la aplicación win-form.
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 no recuerdo mal. Para 64 bits, debería ser aún más grande. De todos modos, para almacenar el texto estático, debería ser más que suficiente.
Por lo tanto, en mi opinión, esto no debería 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 tipada de recuperar los recursos disponibles del proyecto.
Algunas referencias sobre respuestas SE sobre localización y recursos:
Referencias de MSDN :
fuente
Creo que prácticamente lo mencionaste todo.
Si desea algo flexible, donde no necesita recompilar, entonces la base de datos podría ser su mejor opción.
Pero de lo contrario, iría con .resx, ya que este es el estándar.
Guardar texto dentro de archivos de clase es una idea bastante mala.
fuente
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 cualquier fuente o archivo de texto que desee, y compilar el archivo binario .resources ya sea manualmente o como parte de un paso de compilación. (consulte "Recursos en archivos .resrouces" en el enlace anterior).
De cualquier manera, hay un poco más de trabajo para incluirlos en su proyecto y compilación, pero ambos tienen la ventaja de tener soporte para múltiples idiomas, al igual que el archivo .resx.
fuente
En C #, es casi seguro que sea mejor usar un archivo de recursos (que es un archivo XML). Esto le brinda los siguientes beneficios:
fuente
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
Luego implementé una clase para recuperar recursos. Mi objetivo era tener una forma fuertemente tipada de extraer recursos. También quería hacer comprobable la unidad de recuperación de recursos. He extraído una interfaz para la recuperación de recursos:
IResource
.Cada vez que quería usar recursos, recibía una implementación a través del contenedor IoC.
Finalmente, cuando se trataba de usar el recurso, tendría algo en la línea de:
En la línea anterior, utilicé la expresión lambda que me permitió ver todos los recursos disponibles a través de intellisense.
Cuando se trataba de pruebas unitarias, me burlaría
IResource
y establecería expectativas al respecto.Por ejemplo:
Observe también 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:
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 adelante.
fuente
Acabo de hacer algo similar después de este tutorial de CodeProject: enlace
Es para hacer 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 para los que creo archivos de recursos)
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
Sólo algo más en qué pensar
fuente
Portable Object (.po) es muy popular y prácticamente un estándar fuera del mundo .NET. Lo vi usado en algunos proyectos de C # (por ejemplo, https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core ). No hay soporte oficial para él, pero el formato no es tan complejo y hay algunas bibliotecas para ello: https://github.com/neris/NGettext
El formato es definitivamente más simple que .resx ya que no está basado en XML. También tiene muchas herramientas para ello, 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 sin formato con alguna convención de nomenclatura de archivos comoLocale.{languagecode2-country/regioncode2}
. Luego podría 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. Las herramientas también son decentes: https://github.com/tom-englert/ResXResourceManager
fuente