- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这几天一直在琢磨这个想法,不知道有没有人想过这样做。我想尝试创建一个 ResourceBundle,我可以使用枚举访问它的值。这种方法的好处是我的键将被很好地定义,并且希望我的 IDE 可以选择类型并为我自动完成变量名称。换句话说,我正在寻找一种改进的 ListResourceBundle。
本质上,这就是我所追求的......
我有一个枚举,它由像这样设置的各种包组成:
interface Bundle {
String getBundleName();
EnumResourceBundle<??????> getEnumResourceBundle();
}
enum Bundles implements Bundle {
BUNDLE1("com.example.Bundle1", Keys.class);
private final String bundleName;
private final EnumResouceBundle<??????> bundle;
/**
* I understand here I need to do some cast with ResourceBundle.getBundle(bundleName);
* in order to have it back-track through parents properly. I'm fiddling with this
* right now using either what I specified earlier (saving bundleName and then
* retrieving the ResourceBundle as needed), and saving a reference to the
* ResourceBundle.
*/
private <E extends Enum<E> & Key> Bundles(String bundleName, Class<E> clazz) {
this.bundleName = bundleName;
this.bundle = new EnumResourceBundle<??????>(clazz);
}
@Override
public String getBundleName() {
return bundleName;
}
@Override
public EnumResourceBundle<??????> getEnumResourceBundle() {
return bundle;
}
}
interface Key {
String getValue();
}
enum Keys implements Key {
KEY1("This is a key"),
KEY2("This is another key");
private final String value;
private Keys(String value) {
this.value = value;
}
@Override
public String getKey() {
return value;
}
}
class EnumResourceBundle<E extends Enum<E> & Key> extends ResourceBundle {
// Can also store Object in case we need it
private final EnumMap<E, Object> lookup;
public EnumResourceBundle(Class<E> clazz) {
lookup = new EnumMap<>(clazz);
}
public String getString(E key) {
return (String)lookup.get(key);
}
}
所以我的总体目标是让代码看起来像这样:
public static void main(String[] args) {
Bundles.CLIENT.getEnumResourceBundle().getString(Keys.KEY1);
Bundles.CLIENT.getEnumResourceBundle().getString(Keys.KEY2);
// or Bundles.CLIENT.getString(Keys.KEY1);
}
我还想为格式化替换(%s、%d、...)提供支持。
我意识到不可能从一个类中回溯一个类型,这对我没有帮助,因为我已经实例化了 Bundles#bundle,所以我想知道我是否可以以某种方式声明 EnumResourceBundle,其中通用类型是一个实现了 Key 接口(interface)的枚举。任何想法、帮助或想法将不胜感激。在求助于命名常量之前,我真的很想看看能否让它像这样工作。
更新:我有一个想法,也许我也可以尝试更改 EnumResourceBundle#getString(E) 以取而代之,但这并不能保证它是枚举中指定的有效键,或与此相关的任何枚举。再一次,我不确定在子 EnumResourceBundle 中使用父枚举 Key 时该方法如何工作,所以 Key 可能是更好的选择。
最佳答案
我以前做过类似的事情,但我用另一种方法来处理它,它非常简单。
我刚刚创建了一个接受枚举的枚举翻译器类,然后将枚举名称映射到属性文件中的值。
我使用了一个资源包,然后翻译看起来像(根据内存):
<T extends enum>String translate(T e) {
return resources.getString(e.getClass().getName()+"."+e.getName());
}
<T extends enum>String format(T e, Object... params) {
return MessageFormat.format(translate(e), params);
}
现在对于任何枚举,您只需将字符串添加到文件中即可:
com.example.MyEnum.FOO = This is a foo
com.example.MyEnum.BAR = Bar this!
如果你想确保传递的类是正确的枚举,你可以为这些枚举定义一个共享接口(interface),或者你可以将它变成一个在类类型上定义了 T 的类,然后生成它的实例对于您希望能够翻译的每个枚举。然后,您可以通过执行 new EnumFormatter() 来为任何枚举创建一个翻译器类。使 format()
protected 将允许您通过在 EnumFormatter 中实现为每个枚举类型提供特定的可执行格式。
使用类的想法甚至可以让您更进一步,当您创建类时,您可以指定它所针对的枚举和属性文件。然后它可以立即扫描属性文件并确保枚举中的每个值都有一个映射 - 如果缺少一个则抛出异常。这将有助于确保尽早检测到属性文件中的任何缺失值。
关于java - 在 Java 中使用枚举来表示 ResourceBundle 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20771575/
当我尝试加载属性文件时,我看到以下异常: Caused by: java.util.MissingResourceException: Can't find bundle for base name
jasper Reports是否可以在运行时加载ResourceBundle(对于i18n)? 我想从jrxml文件创建报告(例如c:\reports\report.jrxml) 我的标签位于(c:\
我目前正在使用 resourceBundle 变量来获取 JSF 代码中的文本值,例如像这样: 有什么方法可以将消息键放在一个变量中,并将其作为动态参数提供给资源包?我希望能够做这样的事情: 最
我需要一个正则表达式来匹配 ResourceBundle 的文件名,遵循格式 name_lo_CA_le.properties .它应该只匹配文件名中包含区域设置部分的包,并且名称部分不应有下划线。
我正在设置 ResourceBundle,但得到了与 Oracle 文档不符的奇怪结果。 https://docs.oracle.com/cd/E23095_01/Platform.93/ATGPro
我创建了 jar 文件,该文件作为小程序从 ASP.Net Web 表单应用程序中嵌入并调用。 我使用 ResourceBundle 从属性加载本地化字符串。 我创建了 3 个属性文件: locali
我正在尝试关于 RersourceBundles 的“学习 Java”示例。 我正在使用 Windows 7 和 NetBeans 示例代码为: import java.util.*; public
我的 Android 应用程序依赖于第 3 方代码。此代码使用资源包并将它们放在其 src 目录下名为 resourcebundles 的目录中。然后在他们的代码中,他们这样做: ResourceBu
我有一个文件夹,其中包含一些我想要加载到 ResourceBundle 中的 .properties 文件。在我的代码中,我尝试传递资源文件夹的路径。但是,这不起作用,因为资源位于另一个构建路径中。为
假设我有一些 ResourceBundle 实例: ResourceBundle bundle = getBundle(); ... some more code that does stuf
我创建了以下ResourceBundle在 Java 中,它从正确的 MessegesBundle_en_GB.properties 文件中读取: ResourceBundle labels =
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
我正试图掌握 Java 应用程序的内部化,如图所示 here .我不能。我创建了一个扩展 ListResourceBundle 的类,并尝试检索 key 。不过,我一直有异常(exception)。如
背景 我正在使用 Maven 开发 Java Web 应用程序。我已经按照以下路径和格式创建了 ResourceBundle:src/main/resources/i18n/LanguageBundl
这个问题在这里已经有了答案: List all available ResourceBundle Files (1 个回答) 关闭 4 个月前。 我的 Java 应用程序已本地化为多个语言环境。对于
我对属性文件中的德语“变音符号”有疑问。现在我完全明白我必须转义超出 ISO-8859-1 范围的字符,并且我过去为此使用了 native 到 ascii 的转换。 但为什么像“ü”这样的元音变音也搞
我们需要开始将国际化添加到我们的程序中。值得庆幸的是,这还不是全部,只是一小部分,但我希望我们这样做的方式能够扩大到可能涵盖整个项目。问题是,我们的程序是基于插件的,所以并不是所有的字符串都属于同一个
设置 假设我有 2 个字符串文件: Strings_en.properties Strings_fr.properties 假设英语是默认语言,并且所有字符串都存在,而法语滞后并且缺少一些字符串。 期
显然 ResourceBundle 在它找到的文件中需要一个类似于语法的属性文件。 我们有一种情况想要使用整个文件(在我们的例子中是 HTML 文件)作为“值”。这意味着我们没有这样的 key 。好吧
我正在使用 ResourceBundle 和 Locale 来查找属性值。很简单,代码如下所示: public static String getPropertyValue(Locale loca
我是一名优秀的程序员,十分优秀!