Utilizo un archivo JSON para frases comunes para no tener que escribirlas y tal vez en el futuro puedan traducirse. Entonces, por ejemplo, en mi código principal, quiero decir You don't have the permission to use ${command_name}. Esto funciona perfectamente bien codificado en mi archivo .js pero, en última instancia, quiero que esté en un archivo JSON, que no permite insertar ninguna variable.

¿Alguien sabe una solución a mi problema?

EDITAR: Gracias por las sugerencias. Supongo que string.replace sería mi mejor opción aquí. Ojalá hubiera alguna característica incorporada que convirtiera las variables en una cadena JSON en variables declaradas en ese archivo JS.

3
Galaxy 8 sep. 2018 a las 22:37

5 respuestas

La mejor respuesta

No puede tratar literales de cadena de plantilla en archivos JSON como en el "código" Javascript. Lo dijiste tú mismo. Pero: podría usar un motor de plantillas para esto, o simplemente String.replace().

Ejemplo para un motor de plantillas: https://github.com/janl/mustache.js

Con Moustache (como ejemplo) su código se verá así

var trans = {
  command_name: "dump"
};

var output = Mustache.render("You don't have the permission to use {{command_name}}", trans);

Con simple String.replace():

var str = "You don't have the permission to use %command_name%";

console.log(str.replace('%command_name%', 'dump'));
2
madflow 8 sep. 2018 a las 19:53

Básicamente, puede implementar una función parse que, dado un texto y un diccionario, podría reemplazar cualquier aparición de cada tecla del diccionario:

const parse = (template, textMap) => {
  let output = template

  for (let [id, text] of Object.entries(textMap)) {
    output = output.replace(new RegExp(`\\$\{${id}}`, 'mg'), text)
  }

  return output
}

const textMap = {
  commandName: 'grep',
  foo: 'hello',
  bar: 'world'
}

const parsed = parse('command "${commandName}" said "${foo} ${bar}"', textMap)

console.log(parsed)

Por cierto, le sugiero que use un motor de plantillas de cadenas existente como string-template para evitar reinventar la rueda.

0
Matías Fidemraizer 8 sep. 2018 a las 20:39

Simplemente puede usar marcadores de posición. La siguiente función reemplaza los marcadores de posición con valores definidos por el usuario:

const messages = {
  msgName: 'Foo is :foo: and bar is :bar:!'
}

function _(key, placeholders) {
  return messages[key].replace(/:(\w+):/g, function(__, item) {
    return placeholders[item] || item;
  });
}

Uso:

_('msgName', { foo: 'one', bar: 'two' })
// "Foo is one and bar is two!"

Es solo un ejemplo. ¡Puede cambiar el estilo de los marcadores de posición y el comportamiento de la función de la manera que desee!

1
undefined 8 sep. 2018 a las 19:53

./name.json

{
    command: "this is the output of 'command'"
}

./Node.js

cost names = require('./name.json');

console.log('name === ', name.command);
// name === this is the output of 'command'
0
MrPickles 8 sep. 2018 a las 19:52

Puede usar el config módulo npm y separar sus archivos JSON de acuerdo con su entorno.

0
Kunal 8 sep. 2018 a las 19:45