¿Cuáles son las alternativas al archivo resx?

9

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?

sandeep.gosavi
fuente
1
@ sandeep.gosavi: Usted dijo que los archivos de clase son la mejor manera de almacenar información y solicitó una alternativa. La forma alternativa es usar un archivo de recursos. Su pregunta es muy vaga y no muestra casi ningún esfuerzo de investigación por su parte.
Ramhound
2
@ sandeep.gosavi: así que dale las opciones. Estás pidiendo la "mejor manera" pero ya la tienes.
Ramhound
1
Relacionado, pero no duplicado: Diseño de clase para objeto internacionalizado , Internacionalización: ¿En qué pensar? y estrategias efectivas para la localización en .NET . Sé que la publicación no hace referencia explícita a I18N, pero si grazna como un pato ...
Dan Pichelman
1
No cruce la publicación stackoverflow.com/q/18531904/839601 . La pregunta de desbordamiento de pila podría haberse migrado. Solo necesitabas haberlo marcado.
ChrisF

Respuestas:

5

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.

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

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 :

Yusubov
fuente
1
¿Le importaría explicar más sobre lo que hacen estos recursos y por qué los recomienda como respuesta a la pregunta que se hace? "Enlace de sólo responde" no están muy bienvenida en la pila de Cambio
mosquito
@Yusubov: He revisado sus enlaces, el recurso es una buena opción, pero estoy buscando cualquier otra opción.
sandeep.gosavi
1
La respuesta no tiene solo enlaces, tiene una declaración con la opinión propuesta de la solución que funcionará.
Yusubov
@ sandeep.gosavi: En mi humilde opinión, elegir los archivos de recursos como solución funcionará para su aplicación de formularios de win. Alternativa, puede crear una clase que controle el acceso a sus recursos externos.
Yusubov
@Yusubov: ¿qué es IMHO?
sandeep.gosavi
3

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.

Remy
fuente
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 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.

crashmstr
fuente
2

En C #, es casi seguro que sea 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 la gestión de cadenas por parte de alguien que no sea el codificador (los codificadores no son necesariamente las mejores personas para escribir mensajes informativos o de error del usuario).
  • Permite una localización bastante trivial.
TZHX
fuente
Entonces, ¿cuál es la alternativa para los archivos .resx?
Tohid
"Elimina la necesidad de volver a compilar la solución completa para los cambios de texto". - no, cuando el recurso está incrustado
Konrad
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 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.

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, 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 IResourcey establecería expectativas al respecto.

Por ejemplo:

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

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:

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 adelante.

CodeART
fuente
La desventaja de almacenar recursos en las clases es que cada cambio / modificación requerirá una reconstrucción de la aplicación win-form
Yusubov
Estoy un poco confundido, corrígeme si estoy equivocado. Lo que entendí es que está almacenando datos en un archivo de recursos y para recuperarlos, está usando la clase.
sandeep.gosavi
1
No cambiará las clases ya que cambiar las clases significa cambiar las claves de recursos. Si está cambiando las claves de recursos, significa que no lo pensó por primera vez. Lo que podría estar cambiando son las entradas reales en el archivo de recursos, el archivo xml o la base de datos. Esto recompilará la aplicación. Si sus requisitos no permiten la recompilación, deje la mayor parte de mi ejemplo tal como está e implemente un proveedor de recursos para la base de datos u otra fuente que no haga que la aplicación se vuelva a compilar.
CodeART
1
@ sandeep.gosavi Tengo una clase para almacenar claves de recursos y tengo una clase para recuperar recursos. La ventaja es que ya no tengo que usar "cadenas mágicas" cada vez que extraigo un recurso, sino que obtengo una lista de recursos disponibles a través de intellisense. También puedo reemplazar fácilmente mi proveedor de recursos (de resx a la base de datos). Finalmente es fácilmente comprobable.
CodeART
1
ok lo tengo ¿Pueden proporcionarme un código de demostración, porque soy nuevo en
dotnet?
1

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

iabbott
fuente
1

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=Valueen texto sin formato con alguna convención de nomenclatura de archivos como Locale.{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

Konrad
fuente