Os pacotes de recursos no Java suportam a substituição de string de tempo de execução?
-
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."
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 + "]";
}
}