如何制作结构化和本地化的资源?

时间:2012-01-09 12:42:16

标签: java android reflection resources

我想在代码中定义可能的错误消息 - 在资源中。将它们本地化是没有问题的。 但是我还需要为它们中的每一个定义它们将被显示/记录的位置。例如: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。这个问题不包含关于反思的一个词,但我认为解决方案很可能就在那个领域。所以我也用反射标记了它。

2 个答案:

答案 0 :(得分:0)

不知怎的,没有人回答......我自己也找到了解决办法。它不是一个新的,干净的解决方案。它只阐述了前面描述的那个。但它确实有效。

我只是将错误消息分为两类 - 仍然是英语和可本地化的。在代码中,我将它们倒入一个列表中。可本地化的消息将被本地化,英语将始终保持英语。坏消息是,如果所有三个分组(最多六个)阵列相互正确,则非常难以控制。

答案 1 :(得分:0)

我不确定我是否理解了你的问题,但写了一些东西,因为这可能对你有帮助。

您可以将永远不希望本地化的资源放在一起,而不是像“值”这样的文件夹。和

您希望本地化的资源必须放置到本地化匹配文件夹的文件夹,例如'values-ko_KR'。

此外,资源的ID必须在本地化而非一个之间有所不同。

然后,您可以将所有资源一起加载到一个地图中。

我误解了吗?