2011-06-09 5 views
6

¿Es posible dividir un gran Recursos (.resx) en varios archivos físicamente y seguir utilizando el mismo Syntex para obtener datosde Split grande recurso de archivo en varios archivos físicamente, mientras que el compilador lo tratan como uno

es decir

GlobalResource.resx

en

GlobalResource1.resx, GlobalResource2.resx, GlobalResource3.resx, ...

y todos los archivos se compilarán en uno y usar como

Resources.GlobalResource.errParamNameReq 

usándolo en Asp.net 3.5. tener un problema mientras trabajas en svn, cada vez que entra en conflicto mientras intentas registrarlo, así que pensé en dividirlo en muchos archivos mientras el compilador lo trata como uno solo.

+0

¿Por qué tiene conflictos cuando intentas registrarlo? – richard

+0

¿toma mucho tiempo para registrarse? –

Respuesta

2

Cada archivo de recursos tiene un archivo de código subyacente que se utiliza para declarar los elementos de recursos como propiedades estáticas. Además, las herramientas como Visual Studio utilizan mucha generación automática de códigos para sincronizar entre los datos del editor xml/resource y el código detrás del archivo. Es posible que sea posible dividir un recurso en más de un archivo, pero los efectos de la generación automática de código más adelante pueden causar incluso más problemas que simplemente fusionar los cambios. Una posible solución es crear diferentes archivos de recursos. Luego, tenga una clase que mantenga una colección de instancia ResourceManager para cada administrador de recursos. Algo como esto:

public class ResourceWrapper 
    { 
     private ICollection<ResourceManager> resourceManagers; 

     public ResourceWrapper(IEnumerable<ResourceManager> managers) 
     { 
      resourceManagers = new List<ResourceManager>(managers); 
     } 

     public string GetString(string key) 
     { 
      foreach (var resourceManager in resourceManagers) 
      { 
       string res = resourceManager.GetString(key); 
       if (res != null) 
       { 
        return res; 
       } 
      } 
      return null; 
     } 
     public string GetString(string key, CultureInfo culture) 
     { 
      foreach (var resourceManager in resourceManagers) 
      { 
       string res = resourceManager.GetString(key, culture); 
       if (res != null) 
       { 
        return res; 
       } 
      } 
      return null; 
     } 
    } 

Solo tiene que obtener todos los recursos y pasarlos al constructor. Es posible que desee conservar la instancia de contenedor una vez que se haya creado para evitar la creación de un administrador de recursos para cada archivo de recursos, lo que hará un archivo estático. El único problema con el código anterior es que no hay garantía de que 2 o más archivos de recursos definan la misma clave. Si esto sucede, el código devolverá la primera coincidencia solamente.

+0

usando el proyecto del sitio web asp.net, solo hay un archivo resx en la carpeta App_GlobalResources, no hay ningún archivo de clase relacionado con ese – Lalit

0

¿Está intentando dividirlo para evitar conflictos mientras se registra en svn? Si es así, entonces no estás resolviendo la causa raíz, sino los efectos de la misma.

Si es tan grande que cada vez que se registra, es probable que se encuentre con conflictos, trate de refactorizarlos a archivos más pequeños con nombres significativos. Y luego usa la solución de @Ivaylo. Cada recurso se cumple en una clase, el modelo del sitio web ASP.Net simplemente lo oculta.

Si crea un archivo llamado Resource1.resx en App_GlobalResources, obtiene Resources.Resource1 como clase en su código subyacente.

0

Que yo sepa, no hay forma de tener un archivo de recursos dividido en varios archivos para que pueda acceder a las entradas desde varios archivos resx a través de un acceso común, como Resources.MyAggregatedResources.Resource1. Seguramente sabe que puede poner tantos archivos de recursos en su carpeta App_GlobalResources como desee y acceder a todos ellos como Resources.ResourceFile1.Resource1, Resources.ResourceFile2.Resource1.

Todos los recursos que se agregan a los archivos resx se asignan automáticamente a las propiedades fuertemente tipadas en los archivos de código subyacente con el nombre resource.Designer.cs (Si no ve este archivo, active la opción "Mostrar todos los archivos" en la Solución Explorer (segundo botón)). El "mapeo" se implementa como la generación de código dentro de Visual Studio y, por lo tanto, no se puede modificar desde su proyecto.Necesita implementar su propia capa de abstracción sobre los recursos para devolver los valores de varios archivos de recursos y pasar el nombre del recurso como una cadena => no hay forma de verificar errores ortográficos o recursos faltantes en el tiempo de diseño y sin IntelliSense.

Una forma de implementar la funcionalidad que desea es actualizar su solución a .Net 4.0 y usar las propiedades dynamic que se resuelven en tiempo de ejecución. No obtendrá ningún soporte de IntelliSense para sus nombres de recursos, sin embargo, como en el caso de recursos estáticos ...

0

Encontrado este hilo buscará la manera de separar algunos recursos de texto grandes (archivos xml con imágenes), pero que no me ayudó ni tampoco cualquier otra cosa usando términos de búsqueda como "split resx ArchivoX múltiple"

durante la búsqueda aún más algunas semanas he encontrado http://forums.asp.net/t/937583.aspx?Maximum+string+length+in+resx+file, porque parece que yo no era capaz de guardar mis archivos XML en absoluto en el editor de recursos.

La solución fue utilizar la función "Agregar recurso -> Agregar archivo de texto nuevo" en el editor de recursos y nombrar el recurso exactamente como lo habría nombrado en la columna "nombre" en el editor de recursos. Luego pude pegar todo en el nuevo archivo de texto, que normalmente habría rellenado en la columna "valor".

Ahora tengo un archivo de texto por cada uno de esos recursos, útiles diffs, etc. No estoy seguro de que pertenezca exactamente a este hilo, pero quería compartirlo de todos modos.

Cuestiones relacionadas