我们需要开始为我们的计划添加国际化。值得庆幸的是,还不是全部,只是一些部分,但我希望我们的方式能够扩大规模,以覆盖整个计划。问题是,我们的程序基于插件,因此并非所有字符串都属于同一个位置。
据我了解,Java的ResourceBundle工作原理是这样的。您创建一个扩展的类ResourceBundle,称为MyProgramStrings,以及特定于语言的类,称为MyProgramStrings_fr,MyProgramStrings_es等等。每个类都将键(字符串)映射到值(任何对象)。从哪里获取数据取决于每个类,但它们的共同位置是属性文件。
您可以分两个阶段查找值:首先获得正确的包,然后在其中查询所需的字符串。
Locale locale = Locale.getDefault(); // or = new Locale("en", "GB");
ResourceBundle rb = ResourceBundle.getBundle("MyProgramStrings", locale);
String wotsitName = rb.getString("wotsit.name");
Run Code Online (Sandbox Code Playgroud)
然而,我们需要的是将多个语言环境的结果组合到一个资源空间中。例如,插件需要能够覆盖已定义的字符串,并在代码查找该字符串时返回新值。
我对这一切有点迷失。有人可以帮忙吗?
更新:大卫·沃特斯问:
我已将我的答案放在底部,但我有兴趣听听您如何解决这个问题。
好吧,我们还没有走得太远 - 长期 WIBNI 总是成为最新危机的受害者 - 但我们将其基于插件实现的接口,并约定资源具有与接口相同的完全限定名称。
所以一个接口UsersAPI可能有各种不同的实现。默认情况下,该接口上的方法getBundle()返回相当于 ResourceBundle.get("...UsersAPI", locale). 该文件可以被替换,或者如果需要更复杂的东西,UsersAPI 的实现可以覆盖该方法。
到目前为止,这满足了我们的需要,但我们仍在寻找基于插件的更灵活的解决方案。
我想从i18n包中检索消息信息(接缝中的messages.properties),但我不知道如何在我的xhtml中动态传递declare /传递jobCount变量
现有代码如下所示.
<s:decorate template="/layout/panel-name.xhtml">
<ui:define name="label">User has been assigned #{jobCount} jobs</ui:define>
</s:decorate>
Run Code Online (Sandbox Code Playgroud) 我在某个地方阅读(不再发现它)我可以在资源包中使用EL Expresions,然后在不更改*.xhtml文件的情况下使用它.
some.text=#{someBean.stepsLeft} more
Run Code Online (Sandbox Code Playgroud)
以不同语言切换变量的位置.但实际上它不会工作.我可以使用Interpolator类来处理解析或添加some.text.before some.text.after并让其中一个为空.如果可能的话,我宁愿使用它而不使用interpolator.interpolate().
我尝试使用 IntelliJ IDEA(11.1.3 社区版)创建一个新的 Gradle 项目。不幸的是,我遇到了这个错误:

IDE 日志显示此错误:
2012-08-19 06:48:50,873 [735372] 警告 - .plugins.gradle.util.GradleLog - java.util.MissingResourceException:找不到基本名称 i18n.GradleBundle 的包,语言环境 en_CA
没有什么大惊喜。
我不确定 IntelliJ IDEA 如何确定要使用的语言环境,但它正确地确定了我住在加拿大。我试图通过在idea.shshell 脚本中将以下命令行标志传递给 JVM 来将语言环境更改为 en_US :
# Adam 的自定义参数: LOCALE_ARGS="-Duser.language=en -Duser.country=US -Duser.variant=US" ALL_JVM_ARGS="$LOCALE_ARGS $VM_OPTIONS $COMMON_JVM_ARGS $IDE_JVM_ARGS $AGENT $REQUIRED_JVM_ARGS"
不幸的是,它仍然坚持使用 en_CA。
如何更改 IntelliJ IDEA 使用的语言环境?
我有一个jsp,我使用spring s:message标签
<s:message code="application.success" arguments="${applicationRefId}" />
Run Code Online (Sandbox Code Playgroud)
applicationRefId是添加到模型的长变量.
在我的资源包中,我已定期定义消息代码
application.success=Application {0} successfully submitted
Run Code Online (Sandbox Code Playgroud)
但这导致了
Application 74,311 successfully submitted
Run Code Online (Sandbox Code Playgroud)
这里我的long值用逗号格式化.我有两个问题 - 为什么默认情况下会发生这种格式化,我该如何防止它?
在Visual Studio .NET项目中,您可以创建包含可以本地化的资源的.resx文件.开箱即用的Visual Studio可识别字符串,图像,图标,音频,文件以及其他名为"其他"的内容,我并不理解.
我想知道的是 - 我可以扩展Visual Studio并在此处添加自定义类型 - 例如"Messages"(消息不仅包含文本,还包含严重性和其他标志)?当然,我需要为Visual Studio提供我自己的编辑器并处理必要的代码隐藏生成等 - 但这一切都是可行的.也就是说,如果Visual Studio允许这种可扩展性.可以?如果是,我在哪里可以找到任何文件?
PS我正在使用Visual Studio 2012.
resources resourcebundle embedded-resource visual-studio visual-studio-2012
我目前在纯Java程序中使用ResourceBundles。现在,我想在Android应用程序中使用相同的文件。当文件放置在例如/ sdcard /时,它可以按预期工作。有没有办法直接从已知的android文件夹结构中加载它们?例如从资产没有手动应对它们到SD卡?
这适用于sdcard:
File file = new File("/sdcard/");
URL[] urls = new URL[0];
try {
urls = new URL[]{file.toURI().toURL()};
} catch (MalformedURLException e) {
e.printStackTrace();
}
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle("test", Locale.DEFAULT, loader);
Run Code Online (Sandbox Code Playgroud)
该网址不适用于assests文件夹:
urls = new URL[]{new URL("file:///android_asset/test/")};
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助。
好的,这是社区帮助的时间,经过数小时和数小时的搜索.
我有一个静态库,并使用这个很棒的脚本生成我的静态框架,其中包括通用静态库,我也创建了一个包含ReadingsCoreDataModel.momd的包,其中包含ReadingsCoreDataModel.mom.好的,我提供给我的客户端iOS应用程序,所有构建正确并启动应用程序纠结到我的框架并使用捆绑包,我在我的静态库中有一个单独的WEEDataStore类,由另一个名为Worker的类使用,检查,NSManagedObjectModel不是nil并且看起来要正确加载,NSPersistentStoreCoordinator不是nil,NSManagedObjectContext不是nil.
在WEEDataStore中,我有一个save方法,我从静态库中的Worker类调用它.
在我的ReadingsCoreDataModel.momd中,我创建了一个具有名称读数和类WEEReadings的实体.
我在Worker类中执行以下操作
WEEReadings* readingsEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Readings" inManagedObjectContext:[[WEEDataStore sharedInstance] managedContext]];
[readingsEntity appendWithReadingsModel:self.readingsModel];
[[WEEDataStore sharedInstance] save];
Run Code Online (Sandbox Code Playgroud)
结果是得到以下错误
CoreData: warning: Unable to load class named 'WEEReadings' for entity 'Readings'. Class not found, using default NSManagedObject instead.
2014-12-13 20:11:30.080 TestClient[6854:2487108] -[NSManagedObject appendWithReadingsModel:]: unrecognized selector sent to instance 0x1700ccda0
2014-12-13 20:11:30.084 TestClient[6854:2487108] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject appendWithReadingsModel:]: unrecognized selector sent to instance 0x1700ccda0'
Run Code Online (Sandbox Code Playgroud)
我几乎已经阅读了所有类似的错误,大多数使用Swift进行故障排除,或者使用模型进行拼写错误,其他建议使用与应用程序名称相同的型号名称,我不认为我可以这样做或者它与错误有关.
我的静态库中的所有标题都是Project,除了暴露给客户端的那些标题添加为Public.还尝试将它们全部添加为公共但它没有任何区别.
所有核心数据操作都是内部的.
看起来核心数据模型已正确加载但无法找到我的类,它肯定包含在框架中包含的静态库中.
在我注册疯人之前的任何想法?
如在如何忽略系统默认区域设置以检索resourceBundle中所述,您可以在Java 8或更早版本中配置为不通过以下方式回退到默认区域设置:
ResourceBundle.getBundle("MyResources",
new Locale("en", "US"),
ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_PROPERTIES))
Run Code Online (Sandbox Code Playgroud)
在Java 9 的ResourceBundle.Control使用抛出一个UnsupportedOperationException名为模块使用时:ResourceBundle.Control是不是在一个名为模块的支持.
如何实现/配置自定义"MyResourcesProvider [Impl]"以实现与ResourceBundle.Control.getNoFallbackControl提供的相同的行为?
我们的 iOS 应用程序有一个自定义包,其中包含一个资产目录(.car 文件)。这是自 iOS 9 以来的设置。直到现在,在 Xcode 11 上使用 iOS 13 获取图像资源并使用它们一直不是问题(不确定当应用程序使用 xcode 10 构建并在 iOS 13 上运行时它是否有效)。
使用以下代码获取包:
let bundlePath = Bundle.main.path(forResource: "TheResource", ofType: "bundle")!
var bundle = Bundle(path: bundlePath)
现在,当我打印这个bundle变量时,我得到以下信息:
(lldb) po bundle
? Optional<NSBundle>
- some : NSBundle </Users/xyz/Library/Developer/CoreSimulator/Devices/SE8C7E9D-76AF-4564-B21B-78DC990F3D2E/data/Containers/Bundle/Application/PD422A04-B4C8-42F0-A5CB-9465AC70D3A2/abc.app/TheResource.bundle> (not yet loaded)
Run Code Online (Sandbox Code Playgroud)
(lldb) po bundle.loadAndReturnError()
Error Domain=NSCocoaErrorDomain Code=4 "The bundle “TheResource” couldn’t be loaded because its executable couldn’t be located." UserInfo={NSLocalizedFailureReason=The bundle’s executable couldn’t be located., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSBundlePath=/Users/xyz/Library/Developer/CoreSimulator/Devices/SE8C7E9D-76AF-4564-B21B-78DC990F3D2E/data/Containers/Bundle/Application/PD422A04-B4C8-42F0-A5CB-9465AC70D3A2/abc.app/TheResource.bundle, NSLocalizedDescription=The bundle …Run Code Online (Sandbox Code Playgroud)