与佛教年的Antd Datepicker

发布于 2025-02-12 22:38:24 字数 630 浏览 0 评论 0 原文

摘要:

  • 我已经设法将泰国语言环境应用于我的antd datepicker,但该年份的显示是无效的。必须是泰国地区的佛教年(=基督教年 + 543年)。

(请参阅

。 em>我尝试过的内容:

  • 我已经阅读了 https://ant.design/components/date-picker/ 修改面板

一些代码:

// App.js
import React from 'react'
import {DatePicker} from 'antd'
import 'moment/locale/th'
import locale from 'antd/lib/locale-provider/th_TH'


function App() {
  return <DatePicker locale={locale}/>
}
  
export default App

Summary:

  • I've managed to apply the Thai locale for my Antd DatePicker but the year display is invalid. It has to be buddhist year (=christian year + 543) for a Thai locale.

(see the image at https://i.sstatic.net/336b7.jpg)

What I’ve tried:

Some code:

// App.js
import React from 'react'
import {DatePicker} from 'antd'
import 'moment/locale/th'
import locale from 'antd/lib/locale-provider/th_TH'


function App() {
  return <DatePicker locale={locale}/>
}
  
export default App

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

像极了他 2025-02-19 22:38:24

我的情况相同,客户希望以CE格式以DB的形式显示佛教年格式。

我最终在DOM中手动转换它们。

这是我的代码

mixins \ calendar.js

import _ from "lodash";

export default {
  data() {
    // debounce 5ms
    this.convertCalendarToBuddhistYear = _.debounce(
      this.convertCalendarToBuddhistYear,
      5
    );

    return {};
  },

  methods: {
    /**
     * Change calendar picker to Buddhist Year format
     */
    convertCalendarToBuddhistYear() {
      if (this.$i18n.locale == "en") return;

      const calendars = document.querySelectorAll(".ant-calendar");

      for (let index = 0; index < calendars.length; index++) {
        const calendar = calendars[index];
        calendar.onclick = (e) => {
          // Append child node for panel header
          this.__appendChildNodeInPanelHeader();

          // Conver year text in calendar panel
          this.__convertYearInPanel();
        };
      }

      this.__appendChildNodeInPanelHeader();
    },

    __appendChildNodeInPanelHeader() {
      const selector = [
        ".ant-calendar-month-panel-year-select-content:not(.be)",
        ".ant-calendar-year-select:not(.be)",
        ".ant-calendar-year-panel-decade-select-content:not(.be)",
        ".ant-calendar-decade-panel-century:not(.be)",
      ].join(",");

      const elements = document.querySelectorAll(selector);

      for (let index2 = 0; index2 < elements.length; index2++) {
        const element = elements[index2];
        const nextElement = element.nextSibling;
        const year = element.innerHTML
          .split("-")
          .map((a) => +a + 543)
          .join("-");

        if (!nextElement?.classList.contains("be")) {
          // Create clone element and chnage text to BE
          const clone = element.cloneNode(true);

          clone.innerHTML = year;
          clone.classList.add("be");
          element.style.display = "none";
          clone.onclick = () => {
            element.click();
          };
          element.after(clone);
        } else {
          // Update clone text BE
          nextElement.innerHTML = year;
        }
      }
    },

    __convertYearInPanel() {
      const selector = [
        ".ant-calendar-year-panel-year:not(.be)",
        ".ant-calendar-decade-panel-decade:not(.be)",
      ].join(",");

      const elements = document.querySelectorAll(selector);

      for (let index = 0; index < elements.length; index++) {
        const element = elements[index];

        const year = element.innerHTML
          .split("-")
          .map((a) => +a + 543)
          .join("-");

        element.innerHTML = year;
        element.classList.add("be");
      }
    },
  },
};

datepicker.vue

<a-date-picker
  :show-time="
    showTime
      ? { format: $i18n.locale === 'en' ? 'hh:mm a' : 'HH:mm a' }
      : false
  "
  @openChange="onOpenChange"
>
</a-date-picker>

methods: {
  onOpenChange(open) {
    if (open) {
      this.convertCalendarToBuddhistYear();
    }
  },
}

I have the same situation, the client want to show Buddhist Year format for the value sent in DB much in CE format.

I ended up with converting them manually in DOM.

here is my code

mixins\calendar.js

import _ from "lodash";

export default {
  data() {
    // debounce 5ms
    this.convertCalendarToBuddhistYear = _.debounce(
      this.convertCalendarToBuddhistYear,
      5
    );

    return {};
  },

  methods: {
    /**
     * Change calendar picker to Buddhist Year format
     */
    convertCalendarToBuddhistYear() {
      if (this.$i18n.locale == "en") return;

      const calendars = document.querySelectorAll(".ant-calendar");

      for (let index = 0; index < calendars.length; index++) {
        const calendar = calendars[index];
        calendar.onclick = (e) => {
          // Append child node for panel header
          this.__appendChildNodeInPanelHeader();

          // Conver year text in calendar panel
          this.__convertYearInPanel();
        };
      }

      this.__appendChildNodeInPanelHeader();
    },

    __appendChildNodeInPanelHeader() {
      const selector = [
        ".ant-calendar-month-panel-year-select-content:not(.be)",
        ".ant-calendar-year-select:not(.be)",
        ".ant-calendar-year-panel-decade-select-content:not(.be)",
        ".ant-calendar-decade-panel-century:not(.be)",
      ].join(",");

      const elements = document.querySelectorAll(selector);

      for (let index2 = 0; index2 < elements.length; index2++) {
        const element = elements[index2];
        const nextElement = element.nextSibling;
        const year = element.innerHTML
          .split("-")
          .map((a) => +a + 543)
          .join("-");

        if (!nextElement?.classList.contains("be")) {
          // Create clone element and chnage text to BE
          const clone = element.cloneNode(true);

          clone.innerHTML = year;
          clone.classList.add("be");
          element.style.display = "none";
          clone.onclick = () => {
            element.click();
          };
          element.after(clone);
        } else {
          // Update clone text BE
          nextElement.innerHTML = year;
        }
      }
    },

    __convertYearInPanel() {
      const selector = [
        ".ant-calendar-year-panel-year:not(.be)",
        ".ant-calendar-decade-panel-decade:not(.be)",
      ].join(",");

      const elements = document.querySelectorAll(selector);

      for (let index = 0; index < elements.length; index++) {
        const element = elements[index];

        const year = element.innerHTML
          .split("-")
          .map((a) => +a + 543)
          .join("-");

        element.innerHTML = year;
        element.classList.add("be");
      }
    },
  },
};

DatePicker.vue

<a-date-picker
  :show-time="
    showTime
      ? { format: $i18n.locale === 'en' ? 'hh:mm a' : 'HH:mm a' }
      : false
  "
  @openChange="onOpenChange"
>
</a-date-picker>

methods: {
  onOpenChange(open) {
    if (open) {
      this.convertCalendarToBuddhistYear();
    }
  },
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文