twitter_cldr 6.9.0 → 6.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -28
  3. data/lib/twitter_cldr/formatters/numbers/rbnf/rule_set.rb +1 -1
  4. data/lib/twitter_cldr/resources/calendars_importer.rb +48 -46
  5. data/lib/twitter_cldr/resources/cldr_data_builder.rb +36 -0
  6. data/lib/twitter_cldr/resources/cldr_document_set.rb +157 -0
  7. data/lib/twitter_cldr/resources/cldr_dtd.rb +110 -0
  8. data/lib/twitter_cldr/resources/cldr_locale.rb +78 -0
  9. data/lib/twitter_cldr/resources/list_formats_importer.rb +1 -1
  10. data/lib/twitter_cldr/resources/loader.rb +18 -1
  11. data/lib/twitter_cldr/resources/number_formats_importer.rb +1 -1
  12. data/lib/twitter_cldr/resources/readme_renderer.rb +6 -2
  13. data/lib/twitter_cldr/resources/requirements/cldr_requirement.rb +12 -61
  14. data/lib/twitter_cldr/resources/territories_importer.rb +1 -1
  15. data/lib/twitter_cldr/resources/timezones_importer.rb +1 -1
  16. data/lib/twitter_cldr/resources/unicode_property_aliases_importer.rb +2 -0
  17. data/lib/twitter_cldr/resources/units_importer.rb +1 -1
  18. data/lib/twitter_cldr/resources.rb +8 -3
  19. data/lib/twitter_cldr/shared/calendar.rb +1 -1
  20. data/lib/twitter_cldr/version.rb +1 -1
  21. data/resources/locales/ar/calendars.yml +2 -1
  22. data/resources/locales/az/calendars.yml +2 -1
  23. data/resources/locales/be/calendars.yml +2 -1
  24. data/resources/locales/bg/calendars.yml +2 -1
  25. data/resources/locales/bn/calendars.yml +2 -1
  26. data/resources/locales/bo/calendars.yml +68 -36
  27. data/resources/locales/bs/calendars.yml +1 -0
  28. data/resources/locales/cy/calendars.yml +1 -0
  29. data/resources/locales/el/calendars.yml +2 -1
  30. data/resources/locales/en/calendars.yml +75 -54
  31. data/resources/locales/en-001/calendars.yml +65 -53
  32. data/resources/locales/en-150/calendars.yml +65 -53
  33. data/resources/locales/en-AU/calendars.yml +4 -0
  34. data/resources/locales/en-CA/calendars.yml +66 -58
  35. data/resources/locales/en-GB/calendars.yml +7 -0
  36. data/resources/locales/en-IE/calendars.yml +65 -53
  37. data/resources/locales/en-IN/calendars.yml +65 -53
  38. data/resources/locales/en-NZ/calendars.yml +65 -53
  39. data/resources/locales/en-SG/calendars.yml +65 -53
  40. data/resources/locales/en-US/calendars.yml +75 -54
  41. data/resources/locales/en-ZA/calendars.yml +65 -53
  42. data/resources/locales/eo/calendars.yml +88 -61
  43. data/resources/locales/es/calendars.yml +2 -1
  44. data/resources/locales/es-419/calendars.yml +2 -1
  45. data/resources/locales/es-AR/calendars.yml +2 -1
  46. data/resources/locales/es-CO/calendars.yml +2 -1
  47. data/resources/locales/es-MX/calendars.yml +2 -1
  48. data/resources/locales/es-US/calendars.yml +2 -1
  49. data/resources/locales/fil/calendars.yml +4 -3
  50. data/resources/locales/ga/calendars.yml +4 -4
  51. data/resources/locales/gl/calendars.yml +2 -1
  52. data/resources/locales/hi/calendars.yml +2 -1
  53. data/resources/locales/hy/calendars.yml +4 -3
  54. data/resources/locales/ka/calendars.yml +2 -1
  55. data/resources/locales/kk/calendars.yml +2 -1
  56. data/resources/locales/km/calendars.yml +2 -1
  57. data/resources/locales/kn/calendars.yml +2 -1
  58. data/resources/locales/ko/calendars.yml +2 -1
  59. data/resources/locales/lo/calendars.yml +2 -1
  60. data/resources/locales/mk/calendars.yml +1 -1
  61. data/resources/locales/mr/calendars.yml +2 -1
  62. data/resources/locales/mt/calendars.yml +2 -1
  63. data/resources/locales/my/calendars.yml +2 -1
  64. data/resources/locales/pl/calendars.yml +2 -1
  65. data/resources/locales/pt/calendars.yml +35 -34
  66. data/resources/locales/pt-PT/calendars.yml +21 -20
  67. data/resources/locales/ru/calendars.yml +7 -7
  68. data/resources/locales/sk/calendars.yml +2 -1
  69. data/resources/locales/sl/calendars.yml +2 -1
  70. data/resources/locales/sr/calendars.yml +2 -0
  71. data/resources/locales/sr-Cyrl-ME/calendars.yml +3 -1
  72. data/resources/locales/sr-Latn-ME/calendars.yml +3 -1
  73. data/resources/locales/sw/calendars.yml +2 -1
  74. data/resources/locales/ta/calendars.yml +2 -1
  75. data/resources/locales/th/calendars.yml +1 -0
  76. data/resources/locales/tr/calendars.yml +2 -1
  77. data/resources/locales/ur/calendars.yml +2 -1
  78. data/resources/locales/xh/calendars.yml +46 -15
  79. data/resources/locales/zh-Hant/calendars.yml +4 -4
  80. data/resources/locales/zu/calendars.yml +3 -1
  81. data/spec/formatters/calendars/datetime_formatter_spec.rb +2 -2
  82. data/spec/localized/localized_array_spec.rb +3 -1
  83. data/spec/localized/localized_hash_spec.rb +1 -1
  84. data/spec/shared/calendar_spec.rb +25 -8
  85. data/spec/utils/yaml/yaml_spec.rb +2 -3
  86. metadata +7 -3
@@ -0,0 +1,110 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ module TwitterCldr
7
+ module Resources
8
+
9
+ class CldrDTD
10
+ class Attr
11
+ attr_reader :name, :element_name, :dtd
12
+
13
+ def initialize(name, element_name, dtd)
14
+ @name = name
15
+ @element_name = element_name
16
+ @dtd = dtd
17
+ end
18
+
19
+ def values
20
+ @values ||= begin
21
+ attr_line_idx = schema.find_index do |line|
22
+ line.include?("<!ATTLIST #{element_name} #{name} ")
23
+ end
24
+
25
+ return [] unless attr_line_idx
26
+
27
+ attr_line = schema[attr_line_idx]
28
+
29
+ if comment = find_match_comment_after(attr_line_idx + 1)
30
+ parse_match(comment)
31
+ else
32
+ start_idx = attr_line.index('(')
33
+ return [] unless start_idx
34
+
35
+ finish_idx = attr_line.rindex(')')
36
+ attr_line[(start_idx + 1)...finish_idx].split('|').map(&:strip)
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def find_match_comment_after(idx)
44
+ loop do
45
+ return nil if idx > schema.size
46
+
47
+ if schema[idx].strip.start_with?('<!--@MATCH')
48
+ break
49
+ elsif schema[idx].strip.start_with?('<!--')
50
+ idx += 1
51
+ else
52
+ return nil
53
+ end
54
+ end
55
+
56
+ schema[idx]
57
+ end
58
+
59
+ def parse_match(str)
60
+ m = str.match(/<!--@MATCH:([^\/]+)\/(.*)-->/)
61
+ return [] unless m
62
+
63
+ type, args = m.captures
64
+
65
+ case type
66
+ when 'literal'
67
+ args.split(',').map(&:strip)
68
+ when 'range'
69
+ start, finish = args.split('~')
70
+ ((start.to_i)..(finish.to_i)).to_a
71
+ end
72
+ end
73
+
74
+ def schema
75
+ dtd.schema
76
+ end
77
+ end
78
+
79
+ attr_reader :cldr_requirement
80
+
81
+ def initialize(cldr_requirement)
82
+ @cldr_requirement = cldr_requirement
83
+ end
84
+
85
+ def find_attr(element_name, attr_name)
86
+ elements[element_name] ||= {}
87
+ elements[element_name][attr_name] ||= Attr.new(
88
+ attr_name, element_name, self
89
+ )
90
+ end
91
+
92
+ def schema
93
+ @schema ||= File.read(schema_path).split("\n")
94
+ end
95
+
96
+ private
97
+
98
+ def elements
99
+ @elements ||= {}
100
+ end
101
+
102
+ def schema_path
103
+ @schema_path ||= File.join(
104
+ cldr_requirement.common_path, 'dtd', 'ldml.dtd'
105
+ )
106
+ end
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Twitter, Inc
4
+ # http://www.apache.org/licenses/LICENSE-2.0
5
+
6
+ require 'nokogiri'
7
+
8
+ module TwitterCldr
9
+ module Resources
10
+
11
+ class CldrLocale
12
+ attr_reader :base_locale, :cldr_requirement
13
+
14
+ def initialize(base_locale, cldr_requirement)
15
+ @base_locale = base_locale
16
+ @cldr_requirement = cldr_requirement
17
+ end
18
+
19
+ def ancestors
20
+ @ancestors ||= [].tap do |ancestry|
21
+ locale = from_fs(base_locale)
22
+ ancestry << locale
23
+
24
+ loop do
25
+ cur = from_fs(ancestry.last)
26
+
27
+ if parents = parent_locales[cur]
28
+ ancestry << to_fs(parents)
29
+ elsif I18n::Locale::Tag.tag(cur).self_and_parents.count > 1
30
+ ancestry << I18n::Locale::Tag.tag(cur).self_and_parents.last.to_sym
31
+ else
32
+ parents = TwitterCldr::Shared::Locale
33
+ .parse(cur)
34
+ .permutations
35
+ .select do |loc|
36
+ File.exist?(File.join(cldr_requirement.common_path, 'main', "#{loc}.xml"))
37
+ end
38
+
39
+ ancestry.concat(parents - [cur])
40
+ break
41
+ end
42
+ end
43
+
44
+ ancestry << "root"
45
+ ancestry.freeze
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def to_fs(locale)
52
+ locale.to_s.gsub('_', '-').to_sym
53
+ end
54
+
55
+ def from_fs(locale)
56
+ locale.to_s.gsub('-', '_')
57
+ end
58
+
59
+ def parent_locales
60
+ @parent_locales ||= supplemental_data.xpath('//parentLocales/parentLocale').each_with_object({}) do |node, ret|
61
+ parent = node.attr('parent')
62
+ locales = node.attr('locales').split(' ')
63
+
64
+ locales.each do |locale|
65
+ ret[locale] = parent
66
+ end
67
+ end
68
+ end
69
+
70
+ def supplemental_data
71
+ @supplemental_data ||= Nokogiri.XML(
72
+ File.read(File.join(cldr_requirement.common_path, 'supplemental', 'supplementalData.xml'))
73
+ )
74
+ end
75
+ end
76
+
77
+ end
78
+ end
@@ -49,7 +49,7 @@ module TwitterCldr
49
49
  # locales, we fill in any missing parts at the minor risk of being slightly wrong
50
50
  # when formatting lists. In my opinion, it's far better to produce a slightly wrong
51
51
  # string than to error or produce an entirely empty string.
52
- data = requirements[:cldr].merge_each_ancestor(locale) do |ancestor_locale|
52
+ data = requirements[:cldr].build_data(locale) do |ancestor_locale|
53
53
  ListFormats.new(ancestor_locale, requirements[:cldr]).to_h
54
54
  end
55
55
 
@@ -3,6 +3,8 @@
3
3
  # Copyright 2012 Twitter, Inc
4
4
  # http://www.apache.org/licenses/LICENSE-2.0
5
5
 
6
+ require 'yaml'
7
+
6
8
  module TwitterCldr
7
9
  module Resources
8
10
 
@@ -10,7 +12,18 @@ module TwitterCldr
10
12
 
11
13
  class Loader
12
14
 
15
+ class << self
16
+ def load_yaml(yaml, permitted_classes: [])
17
+ if Psych::VERSION >= '4'
18
+ YAML.safe_load(yaml, permitted_classes: permitted_classes)
19
+ else
20
+ YAML.safe_load(yaml, permitted_classes)
21
+ end
22
+ end
23
+ end
24
+
13
25
  VALID_EXTS = %w(.yml .dump).freeze
26
+ PERMITTED_YAML_CLASSES = [Range, Regexp, Symbol, Time].freeze
14
27
 
15
28
  def get_resource(*path)
16
29
  resources_cache[resource_file_path(path)]
@@ -105,7 +118,7 @@ module TwitterCldr
105
118
  end
106
119
 
107
120
  def load_yaml_resource(path, merge_custom = true)
108
- base = YAML.load(read_resource_file(path))
121
+ base = load_yaml(read_resource_file(path), permitted_classes: PERMITTED_YAML_CLASSES)
109
122
  custom_path = File.join("custom", path)
110
123
 
111
124
  if merge_custom && custom_resource_exists?(custom_path) && !TwitterCldr.disable_custom_locale_resources
@@ -115,6 +128,10 @@ module TwitterCldr
115
128
  base
116
129
  end
117
130
 
131
+ def load_yaml(yaml, permitted_classes: [])
132
+ self.class.load_yaml(yaml, permitted_classes: permitted_classes)
133
+ end
134
+
118
135
  def load_marshalled_resource(path, _merge_custom = :unused)
119
136
  Marshal.load(read_resource_file(path))
120
137
  end
@@ -36,7 +36,7 @@ module TwitterCldr
36
36
  end
37
37
 
38
38
  def import_locale(locale)
39
- data = requirements[:cldr].merge_each_ancestor(locale) do |ancestor_locale|
39
+ data = requirements[:cldr].build_data(locale) do |ancestor_locale|
40
40
  NumberFormats.new(ancestor_locale, requirements[:cldr]).to_h
41
41
  end
42
42
 
@@ -4,6 +4,7 @@
4
4
  # http://www.apache.org/licenses/LICENSE-2.0
5
5
 
6
6
  require 'erb'
7
+ require 'yaml'
7
8
 
8
9
  module TwitterCldr
9
10
  module Resources
@@ -79,8 +80,6 @@ module TwitterCldr
79
80
  end
80
81
  end
81
82
 
82
- private
83
-
84
83
  def line_num_from_stack_trace(trace)
85
84
  trace[0].split(":")[1].to_i # kind of a hack...
86
85
  end
@@ -101,6 +100,11 @@ module TwitterCldr
101
100
  ret
102
101
  end
103
102
  end
103
+
104
+ def tested_ruby_versions
105
+ workflow = YAML.load_file(File.join(*%w(.github workflows unit_tests.yml)))
106
+ workflow["jobs"]["build"]["strategy"]["matrix"]["ruby-version"].join(", ")
107
+ end
104
108
  end
105
109
 
106
110
  end
@@ -42,15 +42,6 @@ module TwitterCldr
42
42
  File.join(source_path, 'common')
43
43
  end
44
44
 
45
- def merge_each_ancestor(locale, merge_root: true)
46
- locales = locale_chain(locale)
47
- locales << :root if merge_root
48
-
49
- locales.inject({}) do |result, ancestor_locale|
50
- deep_merge(yield(ancestor_locale), result)
51
- end
52
- end
53
-
54
45
  def alt?(node)
55
46
  !node.attribute('alt').nil?
56
47
  end
@@ -62,49 +53,26 @@ module TwitterCldr
62
53
  )
63
54
  end
64
55
 
65
- private
66
-
67
- def locale_chain(locale)
68
- locale = from_fs(locale)
69
- ancestry = [locale]
70
-
71
- loop do
72
- cur = from_fs(ancestry.last)
73
-
74
- if parents = parent_locales[cur]
75
- ancestry << to_fs(parents)
76
- elsif I18n::Locale::Tag.tag(cur).self_and_parents.count > 1
77
- ancestry << I18n::Locale::Tag.tag(cur).self_and_parents.last.to_sym
78
- else
79
- parents = TwitterCldr::Shared::Locale
80
- .parse(cur)
81
- .permutations
82
- .select do |loc|
83
- File.exist?(File.join(common_path, 'main', "#{loc}.xml"))
84
- end
85
-
86
- ancestry += parents - [cur]
87
- break
88
- end
89
- end
90
-
91
- ancestry
56
+ def build_data(locale, &block)
57
+ CldrDataBuilder.new(locale_for(locale)).merge_each_ancestor(&block)
92
58
  end
93
59
 
94
- def to_fs(locale)
95
- locale.to_s.gsub('_', '-').to_sym
60
+ def docset(path, root_locale)
61
+ CldrDocumentSet.new(path, locale_for(root_locale), self)
96
62
  end
97
63
 
98
- def from_fs(locale)
99
- locale.to_s.gsub('-', '_')
64
+ def dtd
65
+ @dtd ||= CldrDTD.new(self)
100
66
  end
101
67
 
102
- DEEP_MERGER = proc do |key, v1, v2|
103
- Hash === v1 && Hash === v2 ? v1.merge(v2, &DEEP_MERGER) : (v2 || v1)
68
+ private
69
+
70
+ def locale_for(locale)
71
+ locales[locale] ||= CldrLocale.new(locale, self)
104
72
  end
105
73
 
106
- def deep_merge(h1, h2)
107
- h1.merge(h2, &DEEP_MERGER)
74
+ def locales
75
+ @locales ||= {}
108
76
  end
109
77
 
110
78
  def cldr_url
@@ -134,23 +102,6 @@ module TwitterCldr
134
102
  end
135
103
  end
136
104
  end
137
-
138
- def parent_locales
139
- @parent_locales ||= supplemental_data.xpath('//parentLocales/parentLocale').each_with_object({}) do |node, ret|
140
- parent = node.attr('parent')
141
- locales = node.attr('locales').split(' ')
142
-
143
- locales.each do |locale|
144
- ret[locale] = parent
145
- end
146
- end
147
- end
148
-
149
- def supplemental_data
150
- @supplemental_data ||= Nokogiri.XML(
151
- File.read(File.join(common_path, 'supplemental', 'supplementalData.xml'))
152
- )
153
- end
154
105
  end
155
106
 
156
107
  end
@@ -26,7 +26,7 @@ module TwitterCldr
26
26
  end
27
27
 
28
28
  def import_locale(locale)
29
- data = requirements[:cldr].merge_each_ancestor(locale) do |ancestor_locale|
29
+ data = requirements[:cldr].build_data(locale) do |ancestor_locale|
30
30
  TerritoryData.new(ancestor_locale, requirements[:cldr]).to_h
31
31
  end
32
32
 
@@ -38,7 +38,7 @@ module TwitterCldr
38
38
  end
39
39
 
40
40
  def import_locale(locale)
41
- data = requirements[:cldr].merge_each_ancestor(locale) do |ancestor_locale|
41
+ data = requirements[:cldr].build_data(locale) do |ancestor_locale|
42
42
  TimezoneData.new(ancestor_locale, requirements[:cldr]).to_h
43
43
  end
44
44
 
@@ -17,6 +17,8 @@ module TwitterCldr
17
17
  private
18
18
 
19
19
  def execute
20
+ FileUtils.mkdir_p(output_path)
21
+
20
22
  File.write(
21
23
  File.join(output_path, 'property_value_aliases.yml'),
22
24
  YAML.dump(parse_property_value_aliases)
@@ -36,7 +36,7 @@ module TwitterCldr
36
36
  end
37
37
 
38
38
  def import_locale(locale)
39
- data = requirements[:cldr].merge_each_ancestor(locale) do |ancestor_locale|
39
+ data = requirements[:cldr].build_data(locale) do |ancestor_locale|
40
40
  Units.new(ancestor_locale, requirements[:cldr]).to_h
41
41
  end
42
42
 
@@ -10,6 +10,10 @@ module TwitterCldr
10
10
  autoload :BidiTestImporter, 'twitter_cldr/resources/bidi_test_importer'
11
11
  autoload :CalendarsImporter, 'twitter_cldr/resources/calendars_importer'
12
12
  autoload :CasefolderClassGenerator, 'twitter_cldr/resources/casefolder_class_generator'
13
+ autoload :CldrDataBuilder, 'twitter_cldr/resources/cldr_data_builder'
14
+ autoload :CldrDocumentSet, 'twitter_cldr/resources/cldr_document_set'
15
+ autoload :CldrDTD, 'twitter_cldr/resources/cldr_dtd'
16
+ autoload :CldrLocale, 'twitter_cldr/resources/cldr_locale'
13
17
  autoload :CollationTestsImporter, 'twitter_cldr/resources/collation_tests_importer'
14
18
  autoload :CollationTriesImporter, 'twitter_cldr/resources/collation_tries_importer'
15
19
  autoload :CurrencySymbolsImporter, 'twitter_cldr/resources/currency_symbols_importer'
@@ -25,6 +29,7 @@ module TwitterCldr
25
29
  autoload :ParentLocalesImporter, 'twitter_cldr/resources/parent_locales_importer'
26
30
  autoload :PostalCodesImporter, 'twitter_cldr/resources/postal_codes_importer'
27
31
  autoload :Properties, 'twitter_cldr/resources/properties'
32
+ autoload :ResourceLoadError, 'twitter_cldr/resources/loader'
28
33
  autoload :SegmentDictionariesImporter, 'twitter_cldr/resources/segment_dictionaries_importer'
29
34
  autoload :SegmentRulesImporter, 'twitter_cldr/resources/segment_rules_importer'
30
35
  autoload :SegmentTestsImporter, 'twitter_cldr/resources/segment_tests_importer'
@@ -54,6 +59,8 @@ module TwitterCldr
54
59
  AliasesImporter,
55
60
  Bcp47TimezoneMetadataImporter,
56
61
  BidiTestImporter,
62
+ ValidityDataImporter,
63
+ UnicodePropertyAliasesImporter,
57
64
  CalendarsImporter,
58
65
  CasefolderClassGenerator,
59
66
  CollationTestsImporter,
@@ -79,9 +86,7 @@ module TwitterCldr
79
86
  TransformTestsImporter,
80
87
  TransformsImporter,
81
88
  UnicodeDataImporter,
82
- UnicodePropertyAliasesImporter,
83
- UnitsImporter,
84
- ValidityDataImporter,
89
+ UnitsImporter
85
90
  ]
86
91
  end
87
92
 
@@ -7,7 +7,7 @@ module TwitterCldr
7
7
  module Shared
8
8
  class Calendar
9
9
 
10
- DEFAULT_FORMAT = :'stand-alone'
10
+ DEFAULT_FORMAT = :format
11
11
 
12
12
  NAMES_FORMS = [:wide, :narrow, :short, :abbreviated]
13
13
  ERAS_NAMES_FORMS = [:abbr, :name]
@@ -4,5 +4,5 @@
4
4
  # http://www.apache.org/licenses/LICENSE-2.0
5
5
 
6
6
  module TwitterCldr
7
- VERSION = '6.9.0'
7
+ VERSION = '6.11.2'
8
8
  end
@@ -129,7 +129,8 @@
129
129
  0: "قبل الحقبة الحالية"
130
130
  1: "بعد الميلاد"
131
131
  :narrow:
132
- 0: ""
132
+ 0: BCE
133
+ 1: CE
133
134
  :fields:
134
135
  :day: يوم
135
136
  :day-narrow: يوم
@@ -126,7 +126,8 @@
126
126
  0: "bizim eradan əvvəl"
127
127
  1: "bizim era"
128
128
  :narrow:
129
- 0: ""
129
+ 0: BCE
130
+ 1: CE
130
131
  :fields:
131
132
  :day: Gün
132
133
  :day-narrow: Gün
@@ -127,7 +127,8 @@
127
127
  0: "да нашай эры"
128
128
  1: "нашай эры"
129
129
  :narrow:
130
- 0: ""
130
+ 0: BCE
131
+ 1: CE
131
132
  :fields:
132
133
  :day: дзень
133
134
  :day-narrow: д.
@@ -134,7 +134,8 @@
134
134
  0: "преди новата ера"
135
135
  1: "след новата ера"
136
136
  :narrow:
137
- 0: ""
137
+ 0: BCE
138
+ 1: CE
138
139
  :fields:
139
140
  :day: ден
140
141
  :day-narrow: д
@@ -129,7 +129,8 @@
129
129
  0: খ্রিষ্টপূর্বাব্দ
130
130
  1: খ্রিষ্টাব্দ
131
131
  :narrow:
132
- 0: ""
132
+ 0: BCE
133
+ 1: CE
133
134
  :fields:
134
135
  :day: দিন
135
136
  :day-narrow: দিন