0
0

世界の1月から12月

Posted at

多言語対応は、大変だけど月名ぐらいはすぐやれるよってお話です。

私が公開している Android アプリでは、言語リソースとしては、日本語と英語しか用意できておりませんが、月名を表示する部分では、DateUtils を使用して、なんちゃって多言語対応を行なっています。

以下のスクリーンショットのように月名を表示する部分がユーザーの言語設定に合わせて変化します。左から、日本語、英語、ドイツ語、スペイン語、フランス語、イタリア語の月名(省略形)です。
languages_sized.png

ソースコード

// 月名の取得
val cal = Calendar.getInstance()
val monthName = Array(12) { month ->
   cal.set(2024, month, 1)
   DateUtils.formatDateTime(this, cal.timeInMillis,
      DateUtils.FORMAT_SHOW_DATE
            or DateUtils.FORMAT_NO_MONTH_DAY
            or DateUtils.FORMAT_ABBREV_MONTH
            or DateUtils.FORMAT_NO_YEAR
   )
}

解説

このコードは、Calendar クラスと DateUtils クラスを使用して、省略された月名を取得するための処理を行っています。

各月(1月から12月)の省略された月名を生成し、monthName 配列に格納します。たとえば、ユーザーの言語設定が英語の場合は、monthName[0] は "Jan" となり、monthName[1] は "Feb" になります。

以下、具体的に何をしているかを説明します。

1. カレンダーのインスタンスを取得

val cal = Calendar.getInstance()

Calendar.getInstance() を使って、現在の日付と時間を持つカレンダーのインスタンスを作成します。

2. 月名の配列を生成

val monthName = Array(12) { month -> 
   // 中略
}

Array(12) を使って12個の要素を持つ配列を作成します。この配列は month というインデックスを使って、0 から 11 まで、ループします。

3. 各月のカレンダーを設定

cal.set(2024, month, 1)

cal.set(2024, month, 1) は、カレンダーの年月日を2024年の指定した月の1日に設定します。month は0から11の値を持ち、それぞれ1月から12月に対応します。

4. 月名のフォーマット

DateUtils.formatDateTime(this, cal.timeInMillis,
   DateUtils.FORMAT_SHOW_DATE
       or DateUtils.FORMAT_NO_MONTH_DAY
       or DateUtils.FORMAT_ABBREV_MONTH
       or DateUtils.FORMAT_NO_YEAR
)

DateUtils.formatDateTime() を使用して、cal.timeInMillis(ミリ秒で表された時間)を省略された月名にフォーマットします。このメソッドにはいくつかのフラグが指定されています。省略形ではなく、通常の月名を取得したい場合は、FORMAT_ABBREV_MONTH を削除してください。

  • FORMAT_SHOW_DATE: 日付を表示
  • FORMAT_NO_MONTH_DAY: 日を非表示
  • FORMAT_ABBREV_MONTH: 月名を省略形で表示(例: "Jan", "Feb")
  • FORMAT_NO_YEAR: 年を非表示

thisContext を指し、ActivityFragment 内で実行されていると仮定しています。

さいごに

月名だけ、多言語対応してもなぁとは思いますが、やらないよりはいいかなってかんじで実装しています。

スクリーンショットのアプリは、これなので動作を見たい方は、使ってやってください。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0