我想在代码中定义可能的错误消息 - 在资源中。将它们本地化是没有问题的。 但是我还需要为它们中的每一个定义它们将被显示/记录的位置。例如:screen,localLog,serverLog。 如果没有本地化,我可以这样做:
<!-- every error has a message and boolean keys that allows or not to write the message
to places serverLog/localLog/Screen -->
<string-array name="error_names">
<item >no_net</item>
</string-array>
<string-array name="error_messages">
<item >There is no internet connection. Check the cables. If they are OK, call your provider.</item>
</string-array>
<string-array name="output_keys">
<item >010</item>
</string-array>
我会为错误消息创建一个类,并将所有这些消息加载到静态映射中
public class ErrorMessage {
private String messageText;
private String errorName;
private ArrayList<String> messageOutputs;
static List<String> messagesPossibleOutputs=Arrays.asList("Server","LocalLog","TV");
static public HashMap<String,ErrorMessage> messagesMap;
static public int downloadMessages(Context context){
String messages[]=context.getResources().getStringArray(R.array.error_messages);
String errorNames[]=context.getResources().getStringArray(R.array.error_names);
String outputKeys[]=context.getResources().getStringArray(R.array.output_keys
messagesMap=new HashMap<String,ErrorMessage>();
for(int i=0; i<messages.length; i++){
ErrorMessage curErrorMessage=new ErrorMessage();
curErrorMessage.errorName=errorNames[i];
curErrorMessage.messageText=messages[i];
curErrorMessage.messageOutputs=new ArrayList();
for(int iKey=0; iKey<outputKeys[i].length();iKey++){
String curChar=outputKeys[i].substring(iKey, iKey+1);
if(curChar.equals("1")){
curErrorMessage.messageOutputs.add(messagesPossibleOutputs.get(iKey));
}
}
messagesMap.put(curErrorMessage.errorName,curErrorMessage );
}
}
这不是一个干净的解决方案,只是我想到的最好的解决方案。但它甚至还不够好!因为如果我想本地化消息(也应该这样做),我必须在每种语言变体中重复/翻译整个字符串数组。只有一些本地化的消息。技术问题仍然是英语。所以,重复一切都很糟糕。
XML资源无济于事,因为我需要在每种语言变体中再次重复它。所以,情况更糟。
拜托,您能否建议一些更智能的结构来阅读资源?和/或其他一些定义结构化和本地化资源的方法?
P.S。这个问题不包含关于反思的一个词,但我认为解决方案很可能就在那个领域。所以我也用反射标记了它。
答案 0 :(得分:0)
不知怎的,没有人回答......我自己也找到了解决办法。它不是一个新的,干净的解决方案。它只阐述了前面描述的那个。但它确实有效。
我只是将错误消息分为两类 - 仍然是英语和可本地化的。在代码中,我将它们倒入一个列表中。可本地化的消息将被本地化,英语将始终保持英语。坏消息是,如果所有三个分组(最多六个)阵列相互正确,则非常难以控制。
答案 1 :(得分:0)
我不确定我是否理解了你的问题,但写了一些东西,因为这可能对你有帮助。
您可以将永远不希望本地化的资源放在一起,而不是像“值”这样的文件夹。和
您希望本地化的资源必须放置到本地化匹配文件夹的文件夹,例如'values-ko_KR'。
此外,资源的ID必须在本地化而非一个之间有所不同。
然后,您可以将所有资源一起加载到一个地图中。
我误解了吗?