【问题标题】:Translate date and time to languages not supported in java.util.Locale将日期和时间翻译成 java.util.Locale 不支持的语言
【发布时间】:2021-10-15 16:31:50
【问题描述】:

我有用英文表示日期和时间的文本。

例如:12 May, 2021 11:50 PM

我想将其翻译成 java.util.Locale API 本身不支持的各种语言。

此类语言的示例包括孟加拉语、马拉地语、旁遮普语、泰卢固语、泰米尔语、卡纳达语等。

例如,在孟加拉语中,上述文本将转换为:১২ই মে, ২০২১ এর ১১:৫০ PM

有没有简单的方法可以做到这一点?

非常感谢。

【问题讨论】:

  • 听起来你需要某种可以做到这一点的外部框架。

标签: java datetime locale translate


【解决方案1】:

TL;DR

对于孟加拉语 AKA 孟加拉语:

    Locale loc = Locale.forLanguageTag("bn"); // Bengali/Bangla
    DateTimeFormatter formatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                    .localizedBy(loc)
                    .withDecimalStyle(DecimalStyle.of(loc));

    LocalDateTime dateTime = LocalDateTime.of(2021, Month.MAY, 12, 23, 50);
    System.out.println(dateTime.format(formatter));

输出是:

১২ মে, ২০২১ ১১:৫০:০০ PM

详情

Java 确实支持您提到的语言。

我使用的localizedBy 方法是在Java 10 中引入的。它也承诺设置小数样式,因此对withDecimalStyle() 的调用应该不是必需的,但在我的Java 11 中是这样。我不知道这是一个错误还是什么。

您还提到了马拉地语:

    Locale loc = Locale.forLanguageTag("mr"); // Marathi

१२ मे, २०२१, ११:५०:०० म.उ。

对于提到的其余语言,我的 Java 11 似乎不知道要使用的数字。所以我们必须自己指定这些。只有我们只需要为 0(零)指定数字。然后 Java 解决剩下的问题。

    Locale loc = Locale.forLanguageTag("pa"); // Punjabi
    DateTimeFormatter formatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
                    .localizedBy(loc)
                    .withDecimalStyle(DecimalStyle.of(loc)
                            .withZeroDigit('\u0a66'));

੧੨ ਮਈ ੨੦੨੧, ੧੧:੫੦:੦੦ ਬਾ.ਦੁ.

提到的其余语言的规范是:

Language Langauge tag Zero digit Output
Telugu te '\u0c66' ౧౨ మే, ౨౦౨౧ ౧౧:౫౦:౦౦ PM
Tamil ta '\u0be6' ௧௨ மே, ௨௦௨௧, பிற்பகல் ௧௧:௫௦:௦௦
Kannada kn '\u0ce6' ಮೇ ೧೨, ೨೦೨೧ ೧೧:೫೦:೦೦ ಅಪರಾಹ್ನ

解析你的原始字符串

我不明白为什么你的日期和时间是英文文本。您应该将日期和时间保存在正确的日期时间对象中,例如我在上面使用的 LocalDateTime 对象。如果您无法避免获得String,请解析它。使用此格式化程序进行解析:

private static final DateTimeFormatter ENGLISH_PARSER
        = DateTimeFormatter.ofPattern("d MMM, uuuu h:mm a", Locale.ENGLISH);

除了我无法从您的示例中判断该字符串是否包含完整的月份名称,如 August 或缩写如 Aug (因为五月的全名中只有三个字母)。如果你得到完整的月份名称,你将需要MMMM 而不是MMM。无论如何解析如下:

    String dateTimeText = "12 May, 2021 11:50 PM";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeText, ENGLISH_PARSER);
    System.out.println(dateTime);

输出:

2021-05-12T23:50

【讨论】:

    【解决方案2】:
    1. 选项 1 是本地化/国际化。
    2. 选项 2 使用 Google Translate API。

    自己编码

    查看 UNICODE 表。 Link 用于翻译字符。

    将其与国际化/本地化结合起来。这些示例将有所帮助:

    就个人而言,我会创建一个属性文件(如上面的示例),其中包含每个字符/数字、月份等的键值对。然后,只需根据需要转换时间。

    使用谷歌翻译

    answer 解释了如何将 Google 翻译 API 用于相同目的。根据您的技术堆栈,您应该能够集成此 API。每月 300 个请求是免费的。

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多