22

D3 でローカリゼーションを行う方法を探しています

値を見つけました

d3_time_days = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
d3_time_dayAbbreviations = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], 
d3_time_months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], 
d3_time_monthAbbreviations = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];

D3内にありますが、D3のローカル/プライベートであるため、(明らかに)アクセスできません。

どんなヒントも素晴らしいでしょう、ありがとう:)


更新 1:

再コンパイルだけが魔法を行うことができるようですが、購入することはできません-そのため、縮小版で編集をハードコーディングすることになりました-残念です...


更新 2:

fx moment.jsのように、D3 が「その場で」ローカリゼーション設定を受け入れるようにする方法を検討します。

moment.lang('da', {
    months : "Januar_Februar_Marts_April_Maj_Juni_Juli_August_September_Oktober_November_December".split("_"),
    monthsShort : "Jan_Feb_Mar_Apr_Maj_Jun_Jul_Aug_Sep_Okt_Nov_Dec".split("_"),
    weekdays : "Søndag_Mandag_Tirsdag_Onsdag_Torsdag_Fredag_Lørdag".split("_"),
    weekdaysShort : "Søn_Man_Tir_Ons_Tor_Fre_Lør".split("_"),
    weekdaysMin : "Sø_Ma_Ti_On_To_Fr_Lø".split("_"),
    ordinal : '%d.',
    week : {
        dow : 1, // Monday is the first day of the week.
        doy : 4  // The week that contains Jan 4th is the first week of the year.
    }
});
4

7 に答える 7

21

@Adrian Salazarの答えを正しくするのに時間がかかったので、追加したいと思っただけです。「すぐに使える」d3時間スケールで軸を実行している場合。timeFormat.multi でロケールに設定できます

var localeFormatter = d3.locale({
    "decimal": ",",
    "thousands": ".",
    "grouping": [3],
    "currency": ["€", ""],
    "dateTime": "%a %b %e %X %Y",
    "date": "%d-%m-%Y",
    "time": "%H:%M:%S",
    "periods": ["AM", "PM"],
    "days": ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag"],
    "shortDays": ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"],
    "months": ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
    "shortMonths": ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"]
})

var tickFormat = localeFormatter.timeFormat.multi([
    ["%H:%M", function(d) { return d.getMinutes(); }],
    ["%H:%M", function(d) { return d.getHours(); }],
    ["%a %d", function(d) { return d.getDay() && d.getDate() != 1; }],
    ["%b %d", function(d) { return d.getDate() != 1; }],
    ["%B", function(d) { return d.getMonth(); }],
    ["%Y", function() { return true; }]
]);

axis.tickFormat(tickFormat);
于 2014-09-02T14:51:06.413 に答える
9

カスタム d3 時間フォーマッタを作成し、moment.js を使用してローカライズできます。たとえば、ローカライズされた日付で軸を作成するには:

var x = d3.time.scale();

var myTimeFormatter = function(date) {
    return moment(date).format("LL");
};

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .tickFormat(myTimeFormatter);

次にmoment.lang、追加の言語のサポートを追加し、現在の言語を切り替えるために使用します。詳細については、 http://momentjs.com/docs/#/i18nを参照してください。

于 2013-12-07T01:02:15.577 に答える
2

複数のファイル: Lib を再コンパイルし、10,000 行のコードからなる複数のファイルを提供します。違いは 5 行のみです... これはベスト プラクティスですか?

オンザフライの変更に対するパッチ: locale-string は非公開であるため、D3.js にパッチを適用できます (またはパッチを適用する必要があります)。残念ながら、パッチを適用したライブラリは更新プロセスを複雑にします。オンザフライのローカリゼーションの例は、国際化と実行時のローカリゼーションで示されています

公式コミット: Mike Bostock は、彼によるlocale-branch へのコミットがあることに迅速に対応しました。初稿のようですが、参考になれば幸いです。

問題

于 2013-11-30T10:29:26.873 に答える
1

私はこれをしました、そしてそれはうまくいきました

var monthss = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
var x = d3.time.scale()
    .range([0, width]);
var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .ticks(d3.time.months)
    .tickFormat(function(d,i) { 
      if(i<monthss.length){
        return monthss[i];
      }
      return monthss[i-monthss.length]
     });

if's は、私が 2 年を描くからです。これが役立つことを願っています。

于 2015-12-17T11:03:09.107 に答える