Os pacotes de recursos no Java suportam a substituição de string de tempo de execução?

StackOverflow https://stackoverflow.com/questions/2451049

  •  20-09-2019
  •  | 
  •  

Pergunta

Você pode fazer o seguinte com um Java Resourcebundle?

No arquivo de propriedades ...

example.dynamicresource=You currently have {0} accounts.

Em tempo de execução...

int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);

Para dar o resultado de

"Você atualmente tem 3 contas."

Foi útil?

Solução

Não sem usar o MessageFormat classe, como:

String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);

Outras dicas

Por conta deles, ResourceBundle não suporta espaços reservados para propriedades. A idéia usual é pegar a corda que você recebe do pacote e colocá -la em um MessageFormat, e, em seguida, use isso para obter sua mensagem parametrizada.

Se você está usando JSP/JSTL, então você pode combinar <fmt:message> e <fmt:param> Para fazer isso, que usa ResourceBundle e MessageFormat debaixo das cobertas.

Se você estiver usando Primavera, então tem o ResourceBundleMessageSource que faz algo semelhante, e pode ser usado em qualquer lugar do seu programa. este MessageSource abstração (combinada com MessageSourceAccessor) é muito mais agradável de usar do que ResourceBundle.

Existem várias maneiras, dependendo da tecnologia de visualização que você está usando. Se você está usando Java "Plain Vanilla" (por exemplo, Swing), use MessageFormat API conforme respondido antes. Se você estiver usando uma estrutura de aplicação da web (o que é verdadeiro, se eu julgar seu histórico de perguntas aqui corretamente), o caminho depende da tecnologia View e/ou da estrutura do MVC que você está usando. Se for, por exemplo fmt:message por esta.

<fmt:message key="example.dynamicresource">
    <fmt:param value="${bean.accountCount}">
</fmt:message>

Se for, por exemplo, JSF, você pode usar h:outputFormat por esta.

<h:outputFormat value="#{bundle['example.dynamicresource']}">
    <f:param value="#{bean.accountCount}">
</h:outputFormat>

O melhor lugar é apenas consultar a documentação da tecnologia/estrutura que você está usando (ou informar aqui para que possamos dar respostas mais adequadas e mais detalhadas).

Suportes têm um bom utilitário chamado MessageResources o que faz exatamente o que você pede ....

por exemplo

MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);

LimitaçãoEle permite apenas o máximo de 3 parâmetros (ou seja, atributo de recurso, param1, ..., param3).

Eu sugiro usar MessageFormat (Se você deseja usar mais de 3 valores de parâmetros), conforme sugerido por David Sykes.

Ps a getResources o método está disponível apenas nos suportes Action classe.

Eu não acho que você possa fazer isso funcionar para o arquivo de propriedades não inglesas.

Meu arquivo message.properties tem a seguinte linha:

info.fomat.log.message.start = começando a analisar a mensagem de log em {0} formato.

E meu arquivo message_fr_fr.properties possui a seguinte linha:

info.fomat.log.message.start = A Partir d'Analyzer LE Message Connecter {0} formato.

Este código funciona apenas para o inglês

String.Format ((String) Mensagens .getString (globalConstants.message_format_start), globalconstants.str_json));

Isso faz NÃO Substitua o espaço reservado pelo valor quando meu idioma / localidade for francês :-(

Mesmo messageFormat.fomat () não é bom

Não acredito que o ResourceBundle possa fazer isso por conta própria, mas a string pode:

String.format(bundle.getString("example.dynamicresource"), accountCount);

Lembre -se disso ao usar MessageFormat.format() Você precisa usar uma cotação dupla ('') em seu pacote de recursos, se você deseja expressar uma única cotação (').

MessageFormat#Format funcionará para o caso como:

greetingTo=Have Param, saying hello {0}

Você pode declarar dois métodos como este, onde o RB é uma instância do ResourceBundle:

/**This is a method that takes the param to substitute the placeholder**/
public String getString(String key, Object... params  ) {
    try {
        return MessageFormat.format(this.RB.getString(key), params);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
}

/**Without a param, this will derectly delegate to ResourceBundle#getString**/
public String getString(String key) {
    try {
        return this.RB.getString(key);
    } catch (MissingResourceException e) {
        return "[" + key + "]";
    }
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top