2009-10-29 14 views
7

Ho riscontrato un problema nell'implementazione di una build personalizzata cross-domain in Dojo. La situazione è la seguente: ho un abbastanza grande applicazione, con un buon numero di fasci di localizzazione, in modo fondamentalmente le strutture di directory è come
nucleo \ (il mio modulo)
NLS \
fr \
it \
....
Quando si genera il mio modulo, il risultato è un grande file core.js/core.xd.js, che, bien sur, non contiene le localizzazioni. Nelle directory nls di localizzazione (en/fr/etc) trovo dopo la compilazione ogni bundle creato/minificato, e un file più grande per ogni lingua, core_fr.js/core_en.fs, che contiene solo stringhe relative Dojo/Dijit.Creazione personalizzata Dojo con NLS/localizzazione

quindi il mio script di build è

  layers: [ 
      { 
    resourceName: "core", 
      name: "../core/trusted.js", 
      dependencies: [ 
         "dojo.i18n", 
         //data 
         "dojox.data.JsonRestStore", 
         "dojox.data.XmlStore", 
         "dojox.rpc.Service", 
         "dojox.form.FileInput", 
         ... 
         "core.controller.Fusebox"       
], 
        prefixes: [ 
       ["dijit","../dijit"], 
      ["dojox","../dojox"], 
        ["core", "../core"] 
        ] 

Nella classe core.controller.Fusebox provo a caricare 1 nls

dojo["requireLocalization"]("core", "FuseboxContent"); 

qui morirà, ma con

availableFlatLocales is undefined 
[Break on this error] var locales = availableFlatLocales.split(",");\r\n 

La mia configurazione nel file html è:

// version build 
    var djConfig = { 
    baseUrl: 'https://..../', 
    modulePaths: { 'core': 'core'}, 
    useXDomain: true, 
    xdWaitSeconds: 10, 
    parseOnLoad: true, 
    afterOnLoad: true, 
// debugAtAllCosts: true, 
    isDebug: true, 
    locale: "fr" 
    }; 

e poi

<script type="text/javascript" src="http://xd.woopic.com/dojoroot/1.3.2-xd/dojo/dojo.xd.js.uncompressed.js"></script> 
<script type="text/javascript" src="https://..../core/trusted.js.uncompressed.js"></script> 

ho usato il compresso per il debug, naturalmente. Il problema è che, durante il runtime, Dojo prova a caricare i miei bundle e non riesce a trovarli, e vorrei incorporarli nel mio file layer, quindi non sarà richiesto alcun carico aggiuntivo. Questo obiettivo può essere raggiunto? E mentre ci siamo, ci sono siti/esempi di lavoro con localizzazioni cross-domain? AGGIORNAMENTO: ho continuato la mia analisi e il problema sembra dipendere dal fatto che sto caricando dinamicamente nls, quindi il parser di compilazione non riesce a trovare le chiamate requireLocalization(). Pertanto il file nls del progetto contiene solo contenuti correlati a dojo/dijit. Tuttavia, ho aggiunto alcuni carichi di bundle in un file fittizio e il contenuto di core/nls è ancora ignorato dal builder.

Grazie per qualsiasi informazione, sono praticamente alla fine delle mie ricerche, non c'è molto in rete su questo argomento.

+0

Non sono un esperto di problemi xd, ma ero curioso di vedere le voci nls in modulePaths. Non dovrebbero essere necessari. Li stai usando e fa qualche differenza se li elimini? – peller

+0

Li ho rimossi, nessuna modifica, le localizzazioni non sono ancora state caricate. Penso che siano lì per via di alcune ragioni legacy ... ma avevi ragione sono la semplicità. Ho aggiornato il post di conseguenza. – aciobanu

risposta

5

Ho avuto un problema simile pochi giorni fa. Innanzitutto, è possibile aggirare l'errore impostando le impostazioni locali disponibili come 4 ° parametro della chiamata requireLocalization.

ad es.

dojo.requireLocalization("core", "FuseboxContent", null, "en,fr"); 

anche se non dovresti farlo.

Hai provato a includere la localizzazione come segue?

dojo.requireLocalization("core", "FuseboxContent"); // and not dojo["require..."] 
+0

Beh, lo faccio perché caricherò dinamicamente i file nls, quindi in questo modo non entrerò nel modo del costruttore. Ho risolto il problema nel fatto che il builder non fonde i bundle nel file [modulename] _fr.xd.js, dove unisce le localizzazioni dojo/dijit. Quindi, nella fase xd, quando esegue il preloadLocalisation alla fine del layer, le mie localizzazioni non vengono caricate. Ho creato un file fittizio che richiede tutte le localizzazioni per vedere se in questo modo le "vedrà" e le costruirà, inutilmente. – aciobanu