অ্যাঙ্গুলার 2 এ ডেটপাইপে লোকেল কীভাবে সেট করবেন?


138

আমি ইউরোপীয় ফর্ম্যাট ব্যবহার করে তারিখটি প্রদর্শন করতে চাই dd/MM/yyyyতবে ডেট পাইপ শর্ট ডেট ফর্ম্যাটটি ব্যবহার করে এটি কেবল মার্কিন তারিখের শৈলী ব্যবহার করে প্রদর্শিত হয় MM/dd/yyyy
আমি ধরে নিচ্ছি যে ডিফল্ট লোকেলটি en_US। সম্ভবত আমি ডক্সে নিখোঁজ রয়েছি তবে আমি কীভাবে একটি Angular2 অ্যাপে ডিফল্ট লোকাল সেটিংস পরিবর্তন করতে পারি? অথবা ডেটপাইপে একটি কাস্টম ফর্ম্যাটটি পাস করার কোনও উপায় আছে?


1
আমি এটি জানতে চাই। আমি তারিখের পাইপ ডক্সটি পেয়েছি যা y এর m 'এবং d এর ফর্ম্যাট স্ট্রিংয়ের ক্রমটি ব্যাখ্যা করে যাতে লোকেল দ্বারা আদেশ সেট করার কারণে তা উপেক্ষা করা হয়। তবে কীভাবে লোকেল সেট করবেন (বা এমনকি পাবেন) তার কোনও ইঙ্গিতও নেই।
মার্ক ফার্মিলো

উত্তর:


275

Angular2 RC6 হিসাবে, আপনি কোনও সরবরাহকারী যুক্ত করে আপনার অ্যাপ্লিকেশন মডিউলে ডিফল্ট লোকাল সেট করতে পারেন:

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "en-US" }, //replace "en-US" with your locale
    //otherProviders...
  ]
})

মুদ্রা / তারিখ / নম্বর পাইপগুলির লোকেলটি বেছে নেওয়া উচিত। LOCALE_ID একটি ওপাক টোকেন , কৌনিক / মূল থেকে আমদানি করা।

import { LOCALE_ID } from '@angular/core';

আরও উন্নত ব্যবহারের ক্ষেত্রে আপনি কোনও পরিষেবা থেকে লোকেল তুলতে চাইতে পারেন। তারিখ পাইপ ব্যবহার করে উপাদান তৈরি করা হলে লোকেলগুলি একবারে সমাধান করা হবে:

{
  provide: LOCALE_ID,
  deps: [SettingsService],      //some service handling global settings
  useFactory: (settingsService) => settingsService.getLanguage()  //returns locale string
}

আশা করি এটা তোমার জন্য কাজ করবে।


43
আমি অবাক হয়েছি এটি এখনও কোথাও নথিভুক্ত করা হয় না। তারিখ পাইপ পৃষ্ঠায় নয় ( কৌণিক.ইও / ডকস / টিএস / স্লেস্ট / অ্যাপি / কমোন / ইনডেক্স / ডেট পাইপ- পাইপ এইচটিএমএল ), সাধারণ পাইপ পৃষ্ঠায় নয় .html ) এবং এই প্রশ্নটি আসলে গুগলে প্রথম হিট ( google.com/search?q=angular%202%20locales&rct=j )। দুর্দান্ত খুঁজে।
জেপি দশ বার্জ

2
কোডে পাইপ ব্যবহার করতে এখন আপনাকে অবশ্যই এটি রূপান্তর করতে হবে new CurrencyPipe('en-US');। আমার ইস্যু গুগল করার সময় এটি প্রথম ফলাফল হিসাবে প্রদর্শিত হিসাবে আশা করা যায় এটি কোনও কিছুর জন্য কার্যকর fully
অ্যাশ ব্লু

1
@ করোল্লা আপনি কি সেই পরিষেবাটিতে কিছুটা আলোকপাত করতে পারেন? অ্যাপটি চলাকালীন আমি লোকেলটি পরিবর্তন করতে চাই, এই পরিষেবাটি দিয়ে কি সম্ভব? এবং আমি কীভাবে এই ধরনের পরিষেবাটি প্রয়োগ করব?
মার্টিজন ভ্যান ডেন বার্গ

1
@ মার্তিজনভান্ডেনবার্গ, পরিষেবাটি কেবল লোকাল স্ট্রিং ফিরিয়ে দেয় - অভিনব কোনও কিছুই নয়। অ্যাপ চলাকালীন আমাদের লোকেল পরিবর্তন করার চেষ্টা করার মিশ্র ফলাফল রয়েছে results সমস্ত ক্ষেত্রে পরিচালনা করতে পুনরায় লোডিং পৃষ্ঠাটি শেষ হয়েছিল। YMMV।
করোল

1
আমি এই বিষয় নিয়ে অনেক লড়াই করতে এবং আমি আশা করি নিবন্ধ আমি এই সম্পর্কে লিখেছে কিছু লোক সাহায্য করতে পারেন: medium.com/dailyjs/dynamic-locales-in-angular-dd9a527ebe1f
মাইকেল কারেন

72

আপনি যদি একবার আপনার অ্যাপ্লিকেশনের জন্য ভাষা সেট করতে চান তবে LOCALE_ID এর সাথে সমাধানটি দুর্দান্ত। তবে এটি কাজ করে না, যদি আপনি রানটাইমের সময় ভাষা পরিবর্তন করতে চান। এই ক্ষেত্রে আপনি কাস্টম ডেট পাইপ প্রয়োগ করতে পারেন।

import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Pipe({
  name: 'localizedDate',
  pure: false
})
export class LocalizedDatePipe implements PipeTransform {

  constructor(private translateService: TranslateService) {
  }

  transform(value: any, pattern: string = 'mediumDate'): any {
    const datePipe: DatePipe = new DatePipe(this.translateService.currentLang);
    return datePipe.transform(value, pattern);
  }

}

এখন যদি আপনি অনুবাদ পরিষেবা ব্যবহার করে অ্যাপ্লিকেশন প্রদর্শনের ভাষা পরিবর্তন করেন ( এনজিএক্স-অনুবাদ দেখুন )

this.translateService.use('en');

আপনার অ্যাপ্লিকেশন মধ্যে ফর্ম্যাট স্বয়ংক্রিয়ভাবে আপডেট করা উচিত।

ব্যবহারের উদাহরণ:

<p>{{ 'note.created-at' | translate:{date: note.createdAt | localizedDate} }}</p>
<p>{{ 'note.updated-at' | translate:{date: note.updatedAt | localizedDate:'fullDate'} }}</p>

বা আমার সহজ "নোটস" প্রকল্পটি এখানে দেখুন

এখানে চিত্র বর্ণনা লিখুন


আমি টেমপ্লেট বিশ্লেষণ ত্রুটি পাচ্ছি; প্রস্তাবিত একইভাবে আমি ফিল্টার 'স্থানীয়করণের তারিখ' সংকলন করতে পারি না।
প্রসাদ শিন্দে

আপনি কি স্থানীয়ভাবে ডেট পাইপ সঠিকভাবে ঘোষণা করেছেন? পাইপ.মডিউল.টি আমার উদাহরণ প্রকল্পে দেখুন
মিলান হিলিনেক

হ্যাঁ, আমি আগেই এটি সমাধান করেছি, @ মিলান হিলিনাকের আমার মন্তব্যটি কেবল তখনই উত্তর দেওয়া উচিত ছিল। তবে যাইহোক আপনার তাত্ক্ষণিক প্রতিক্রিয়ার জন্য ধন্যবাদ। আপনি ভাল করছেন.
প্রসাদ শিন্ডে

এটি আমি যা খুঁজছিলাম স্পষ্টতই এটি। এটি লজ্জার বিষয় যে কাস্টম পাইপটি কেবল রানটাইমের সময়
লোকাল

2
এটি কাজ করে তবে মনোযোগ দিন যে একটি "অপরিষ্কার" পাইপ ব্যবহার করা "খাঁটি" এর চেয়ে ধীর। যেমন কৌণিক নির্দেশিকা বলেছেন: কৌণিক প্রতিটি উপাদান পরিবর্তন সনাক্তকরণ চক্রের সময় একটি অপরিষ্কার পাইপ কার্যকর করে। অপরিষ্কার পাইপকে প্রায়শই বলা হয়, প্রতিবার কী-স্ট্রোক বা মাউস-চাল হিসাবে। সেই উদ্বেগকে মাথায় রেখে মহান যত্ন সহ একটি অপরিষ্কার পাইপ প্রয়োগ করুন। একটি ব্যয়বহুল, দীর্ঘ-চলমান পাইপ ব্যবহারকারীর অভিজ্ঞতা নষ্ট করতে পারে।
লুকা রিতোসা

64

সঙ্গে angular5উপরে উত্তর আর কাজ করে!

নিম্নলিখিত কোড:

app.module.ts

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
    //otherProviders...
  ]
})

নিম্নলিখিত ত্রুটি বাড়ে:

ত্রুটি: "ডি-এট" লোকেলের জন্য স্থানীয় ডেটা অনুপস্থিত।

সঙ্গে angular5আপনি লোড রেজিস্টার আপনার নিজের উপর ব্যবহৃত লোকেল ফাইল করতে হবে।

app.module.ts

import { NgModule, LOCALE_ID } from '@angular/core';
import { registerLocaleData } from '@angular/common';
import localeDeAt from '@angular/common/locales/de-at';

registerLocaleData(localeDeAt);

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
    //otherProviders...
  ]
})

নথিপত্র


প্রকৃতপক্ষে যদি আপনাকে এন-ইউএস ব্যতীত অন্য কোনও স্থানীয় লোকের প্রয়োজন হয় তবে আপনার এটি নিবন্ধ করা উচিত। উত্তরের জন্য ধন্যবাদ, @ জাগু
মিক্কারিন

1
ঠিক আছে যে আমাকে অন্য মাথাব্যথা প্রতিরোধ .. Thx! ডকটি কিছুটা জটিল, যেহেতু আমি যদিও এটি registerLocaleDataযথেষ্ট ছিলাম, ভাল তা নয়।
বিপদ 89

1
অয়ন 4 এর সেরা উত্তর!
parrycima

22

আপনি যদি ব্যবহার TranslateServiceকরেন তবে @ngx-translate/coreনীচে একটি নতুন পাইপ তৈরি না করে একটি সংস্করণ যা রানটাইমটিতে গতিশীল পরিবর্তন করতে চলেছে (কৌণিক on তে পরীক্ষা করা হয়েছে)। ডেটপাইপের localeপ্যারামিটার ( ডক্স ) ব্যবহার করে :

প্রথমে আপনি আপনার অ্যাপ্লিকেশনটিতে যে স্থানীয় অবস্থানগুলি ব্যবহার করেন তা ঘোষণা করুন app.component.ts:

import localeIt from '@angular/common/locales/it';
import localeEnGb from '@angular/common/locales/en-GB';
.
.
.
ngOnInit() {
    registerLocaleData(localeIt, 'it-IT');
    registerLocaleData(localeEnGb, 'en-GB');
}

তারপরে, আপনার পাইপটি গতিশীলভাবে ব্যবহার করুন:

myComponent.component.html

<span>{{ dueDate | date: 'shortDate' : '' : translateService.currentLang }}</span>

myComponent.component.ts

 constructor(public translateService: TranslateService) { ... }

2
এটি আশ্চর্যজনকভাবে দুর্দান্ত। এমনকি আপনার জন্য @ এনজিএক্স-অনুবাদ করার দরকার নেই। টেম্পলেটটিতে বিবৃতিটি কী করে তা আপনি ব্যাখ্যা করতে পারেন?
লামা

2
@ আল্লামা, নির্ধারিত তারিখ (যে তারিখটি আপনি বিন্যাস করতে চান) | তারিখ: 'শর্টডেট' ('ফর্ম্যাট' অনুসারে ডেট পাইপের 1 ম প্যারামিটার) : '' (2 য় প্যারামিটার => টাইমজোন, "যখন সরবরাহ করা হয় না, শেষ ব্যবহারকারীর স্থানীয় সিস্টেমের সময় অঞ্চল ব্যবহার করে"।) : ট্রান্সলেটস সার্ভিস.কন্ট্রালং (তৃতীয় প্যারামিটার) => স্থানীয়), এই তারিখের পাইপটিকে ছানা দিন
ডিয়েগো

আপনি যদি স্বনির্ধারিত বিন্যাস আছে? তাও কি স্থানীয়করণ হবে?
ওয়াইল্ডহ্যামার

12

আমি ডেট_পাইপ.সেটে একবার দেখেছি এবং এর দুটি বিট তথ্য রয়েছে যা আগ্রহী। উপরের নিকটে নিম্নলিখিত দুটি লাইন রয়েছে:

// TODO: move to a global configurable location along with other i18n components.
var defaultLocale: string = 'en-US';

নীচের দিকে এই লাইনটি রয়েছে:

return DateFormatter.format(value, defaultLocale, pattern);

এটি আমার কাছে পরামর্শ দেয় যে ডেট পাইপটি বর্তমানে 'এন-ইউএস' হওয়ার জন্য হার্ড-কোডড।

আমি ভুল হলে আমাকে আলোকিত করুন।



আপনি নীচে করোলার উত্তরটি পরীক্ষা করতে চাইতে পারেন। এটি আরও আধুনিক and এবং একটি দুর্দান্ত সমাধান সরবরাহ করে।
মার্ক ল্যাঙ্গার

9

App.module.ts এ নিম্নলিখিত আমদানি যুক্ত করুন। সেখানে LOCALE এর বিকল্প একটি তালিকা রয়েছে এখানে

import es from '@angular/common/locales/es';
import { registerLocaleData } from '@angular/common';
registerLocaleData(es);

তারপরে সরবরাহকারী যুক্ত করুন

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "es-ES" }, //your locale
  ]
})

এইচটিএমএলে পাইপ ব্যবহার করুন। এটির জন্য কৌনিক ডকুমেন্টেশন এখানে ।

{{ dateObject | date: 'medium' }}

জাস্টো নেস্টিটাবা এস্তো!
অ্যালেক্সাভিচগুলি

5

আপনি এরকম কিছু করুন:

{{ dateObj | date:'shortDate' }}

অথবা

{{ dateObj | date:'ddmmy' }}

দেখুন: https://angular.io/docs/ts/latest/api/common/index/DatePype-pipe.html


দুঃখিত, যদি এটি আমার প্রশ্নে পরিষ্কার না হয়ে থাকে তবে ঠিক এটিই করছি কিন্তু প্যাটার্ন 'শর্ট ডেট' দিয়ে এবং এটি কেবল মার্কিন স্টাইলে প্রদর্শিত হয়। সময়ের স্টাইল ঠিক আছে।
এনএসবিএম

দ্বিতীয় উদাহরণটি একটি ফর্ম্যাটটি ডেটপাইপে পাস করে দেখায়, এটিই আপনি চান না?
ল্যাংলি

চেষ্টা করেছেন কিন্তু কাজ করে না। তারিখটি স্বাধীনভাবে কেবল '5' নম্বরটি দেখান।
এনএসবিএম

3

আমি একই সমস্যা নিয়ে লড়াই করছি এবং এটি ব্যবহার করে আমার পক্ষে কাজ করিনি

{{dateObj | date:'ydM'}}

সুতরাং, আমি একটি সমাধান চেষ্টা করেছি, সেরা সমাধান নয় তবে এটি কার্যকর হয়েছে:

{{dateObj | date:'d'}}/{{dateObj | date:'M'}}/{{dateObj | date:'y'}}

আমি সর্বদা একটি কাস্টম পাইপ তৈরি করতে পারি।


3

এওটি নিয়ে যাদের সমস্যা রয়েছে তাদের একটি ইউজফ্যাক্টরি দিয়ে আপনার কিছুটা আলাদাভাবে করা দরকার:

export function getCulture() {
    return 'fr-CA';
}

@NgModule({
  providers: [
    { provide: LOCALE_ID, useFactory: getCulture },
    //otherProviders...
  ]
})

4
angular5 থেকে আপনি প্রদানকারীর অ্যারের মধ্যে একটি চর্বি তীর অভিব্যক্তি ব্যবহার করতে পারেন
iuliust

{ provide: LOCALE_ID, useFactory: () => 'fr-CA'}আমার জন্য কৌশলটি করেছেন;)
জোক্সিমেদিনা

0

গুগল পাইপটি অনুলিপি করে লোকেল পরিবর্তন হয়েছে এবং এটি আমার দেশের পক্ষে কাজ করে এটি সম্ভবত এটি তারা সমস্ত লোকেলের জন্য এটি শেষ করেনি। নীচে কোড দেওয়া আছে।

import {
    isDate,
    isNumber,
    isPresent,
    Date,
    DateWrapper,
    CONST,
    isBlank,
    FunctionWrapper
} from 'angular2/src/facade/lang';
import {DateFormatter} from 'angular2/src/facade/intl';
import {PipeTransform, WrappedValue, Pipe, Injectable} from 'angular2/core';
import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection';


var defaultLocale: string = 'hr';

@CONST()
@Pipe({ name: 'mydate', pure: true })
@Injectable()
export class DatetimeTempPipe implements PipeTransform {
    /** @internal */
    static _ALIASES: { [key: string]: String } = {
        'medium': 'yMMMdjms',
        'short': 'yMdjm',
        'fullDate': 'yMMMMEEEEd',
        'longDate': 'yMMMMd',
        'mediumDate': 'yMMMd',
        'shortDate': 'yMd',
        'mediumTime': 'jms',
        'shortTime': 'jm'
    };


    transform(value: any, args: any[]): string {
        if (isBlank(value)) return null;

        if (!this.supports(value)) {
            console.log("DOES NOT SUPPORT THIS DUEYE ERROR");
        }

        var pattern: string = isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
        if (isNumber(value)) {
            value = DateWrapper.fromMillis(value);
        }
        if (StringMapWrapper.contains(DatetimeTempPipe._ALIASES, pattern)) {
            pattern = <string>StringMapWrapper.get(DatetimeTempPipe._ALIASES, pattern);
        }
        return DateFormatter.format(value, defaultLocale, pattern);
    }

    supports(obj: any): boolean { return isDate(obj) || isNumber(obj); }
}

0

ঠিক আছে, আমি এই সমাধানটি খুব সহজ, ব্যবহার করে প্রস্তাব করছি ngx-translate

import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Pipe({
  name: 'localizedDate',
  pure: false
})
export class LocalizedDatePipe implements PipeTransform {

  constructor(private translateService: TranslateService) {
}

  transform(value: any): any {
    const date = new Date(value);

    const options = { weekday: 'long',
                  year: 'numeric',
                  month: 'long',
                  day: 'numeric',
                  hour: '2-digit',
                  minute: '2-digit',
                  second: '2-digit'
                    };

    return date.toLocaleString(this.translateService.currentLang, options);
  }

}

-1

এটি কিছুটা দেরিতে হতে পারে তবে আমার ক্ষেত্রে (কৌণিক 6), আমি ডেট পাইপের উপরে একটি সাধারণ পাইপ তৈরি করেছি, এরকম কিছু:

private _regionSub: Subscription;
private _localeId: string;

constructor(private _datePipe: DatePipe, private _store: Store<any>) {
  this._localeId = 'en-AU';
  this._regionSub = this._store.pipe(select(selectLocaleId))
    .subscribe((localeId: string) => {
      this._localeId = localeId || 'en-AU';
    });
}

ngOnDestroy() { // Unsubscribe }

transform(value: string | number, format?: string): string {
  const dateFormat = format || getLocaleDateFormat(this._localeId, FormatWidth.Short);
  return this._datePipe.transform(value, dateFormat, undefined, this._localeId);
}

সেরা সমাধান নাও হতে পারে, তবে সহজ এবং কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.