2012-11-04 26 views
2

我正在製作一個應用程序,我需要顯示持續時間字符串。的幾個例子:8秒如何使本地化的持續時間字符串?

  • 1小時左打破2分鐘,
  • 還剩2分打破

目前我有一個C++函數,其爲幾秒鐘內給出量/毫秒/分鐘給你一個字符串:

wxString getTimeStr(int value, 
        ETimeUnit time_unit, // milliseconds or seconds or minutes or hours 
        wxString const & lang) // english or russian 

它由很多依賴於語言,時間單位和現有價值條件。現在我正在考慮將應用程序移植到其他語言,爲每種新語言編寫C++代碼會有點痛苦。有沒有辦法使用標準函數來創建該字符串?

該應用程序使用wxWidgets以C++編寫,目前爲止僅適用於Windows。我不想使用平臺相關函數,儘管知道它們會很高興。

回答

1

我建議將你的功能分成兩部分。

第一部分將返回剩餘的時間作爲wxTimeSpan。

第二部分將wxTimeSpan轉換爲所需的語言並返回一個字符串。這是您需要爲每種語言更改的唯一部分。

爲了便於說明,我們假設

  • 我們只關心小時和分鐘
  • 克林貢人喜歡看小時/分鐘
  • 火神看到分鐘:小時
  • 俄羅斯有幾分鐘的形式的字

然後你的第二個函數會寫這樣的東西

// extract hours and residual minutes into CSV 

wxString csv = theTimeSpan.Format("%H,%M); 

// extract tokens for csv 
wxString hours, mins 
... 

if(lang == "Klingon") { 
    return hours + "/" + mins 
} else if (lang == "Vulcan") { 
    return mins + ":" + hours 
} else if (lang == "Russian") { 
    wxString min_name; 
    switch(mins.ToLong()) { 
    case 1: min_name = "---"; break; 
    ... 
    } 
return mins + " " + min_name; 
} 

可惜你不能使用的格式獲得一個任意的時間結構「,因爲在一個重要歧義,例如,小時的時間跨度數。它可以是總小時數(例如,50小時的時間間隔將是50)或者僅僅是時間跨度的小時部分,在這種情況下將是2,因爲50小時等於2天和2個小時。

wxTimeSpan通過以下方式解決了這種不明確性:如果確實存在H之前指定的D格式,那麼它將被解釋爲2.否則,它是50.同樣適用於所有其他格式說明符:如果他們遵循較大單位的說明符,則僅採用其餘部分,否則將使用完整值。

所以,你必須使用我的代碼示例中顯示的csv標記。

+0

好吧,wxTimeSpan很有用,但它不會解決最難的部分:將它移植到不同的語言,其中有不同的時間結構 – Juster

+0

沒有一個具體的例子很難解釋。請舉例說明兩種不同的「時間結構」 – ravenspoint

+0

,例如英語「1分鐘,2分鐘,...」,但在俄語中有更多形式的「分鐘」這個詞:「1минута,2минуты,。 ..,5минут「 – Juster

0

本地化問題的傳統方法是建立一個label name -> label value的地圖,並在值中使用佔位符。

  1. 在代碼中,你只能引用標籤名稱,並提供值的佔位
  2. 移植到另一種語言,你只需要在地圖

根據翻譯您可能需要一個簡單的佔位符機制(類似於snprintf),或者允許迷你語言根據簡單參數(例如區分單數和複數)在運行時創建值。

在這個例子中,這將是簡單的:

using LabelsType = std::map<LabelName, std::string>; 
using LangToLabelsType = std::map<Language, LabelsType>; 

注:我勸枚舉的語言,而不是一個簡單的字符串。

如果你在Linux上,我會推薦gettext,但我不確定它是否適用於Windows。不過,你可以查看它,看看它是如何工作的,它可以幫助你。

1

如果不爲不同的語言編寫不同的代碼,您將無法完美地完成任務。例如,我敢打賭,你現有的代碼不允許產生像「三分之三之前5分鐘」這樣的時間,但這些時間仍然用在德語(口語)中。而且即使沒有這樣的延伸,實際上可以認爲英語「三點半」被翻譯爲「一半到四點」。因此,如果使用官方時間不夠(如果是,請看wxLocale::GetInfo(wxLOCALE_TIME_FMT)),您確實需要編寫代碼來專門處理至少一些語言。

0

有時,最好是使程序更具技術性而不是更接近於自然語言。我也發現自己在這樣的情況下(使其看起來真的很酷)。客戶通常不關心這種情況。信息有時比其確切形式重要得多。

程序員有時應該選擇權衡 - 一種與編程語言/框架無關的元解決方案。換句話說,你應該重視解決方案的正確性和期望的正確性。

相關問題