Class: PennMARC::Language

Inherits:
Helper
  • Object
show all
Defined in:
lib/pennmarc/helpers/language.rb

Overview

Logic for extracting and translating Language values for a record. Penn practice is to verify the value present in the 008 control field as a three letter code. This code is then mapped to a display-friendly value using the a provided mapping hash.

Constant Summary collapse

UNDETERMINED_CODE =

Used when no value is present in the control field - still mapped

:und
LANGUAGE_SUBFIELDS =
%w[a b d e g h i j k m n p q r t].freeze

Constants included from Util

Util::TRAILING_PUNCTUATIONS_PATTERNS

Class Method Summary collapse

Methods included from Util

#append_relator, #append_trailing, #datafield_and_linked_alternate, #field_defined?, #field_or_its_linked_alternate?, #join_and_squish, #join_subfields, #linked_alternate, #linked_alternate_not_6_or_8, #no_subfield_value_matches?, #prefixed_subject_and_alternate, #relator, #relator_join_separator, #relator_term_subfield, #remove_paren_value_from_subfield_i, #subfield_defined?, #subfield_in?, #subfield_not_in?, #subfield_undefined?, #subfield_value?, #subfield_value_in?, #subfield_value_not_in?, #subfield_values, #subfield_values_for, #substring_after, #substring_before, #translate_relator, #trim_punctuation, #trim_trailing, #trim_trailing!, #valid_subject_genre_source_code?

Class Method Details

.show(record) ⇒ Array<String>

Get language values for display from the 546 field and related 880.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)

    language values and notes



17
18
19
20
21
22
23
# File 'lib/pennmarc/helpers/language.rb', line 17

def show(record)
  values = record.fields('546').map do |field|
    join_subfields field, &subfield_not_in?(%w[6 8])
  end
  language_values = values + linked_alternate(record, '546', &subfield_not_in?(%w[6 8]))
  language_values.uniq
end

.values(record, iso_639_2_mapping: Mappers.iso_639_2_language, iso_639_3_mapping: Mappers.iso_639_3_language) ⇒ Array<String>

Note:

In franklin, we extracted the language code from the 008 control field. After engaging cataloging unit representatives, we decided to also extract these values from the 041 field: Includes records for multilingual items, items that involve translation, and items where the medium of communication is a sign language. www.loc.gov/marc/bibliographic/bd041.html

Get language values for searching and faceting of a record. The values are extracted from subfields in the 041 field. Language facet and search values will typically be the same, with the exception of zxx, when no linguistic content is found.

Parameters:

  • record (MARC::Record)
  • iso_639_2_mapping (Hash) (defaults to: Mappers.iso_639_2_language)

    iso-639-2 spec hash for language code translation

  • iso_639_3_mapping (Hash) (defaults to: Mappers.iso_639_3_language)

    iso-639-3 spec hash for language code translation

Returns:

  • (Array<String>)

    array of language values



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/pennmarc/helpers/language.rb', line 38

def values(record, iso_639_2_mapping: Mappers.iso_639_2_language, iso_639_3_mapping: Mappers.iso_639_3_language)
  values = record.fields('041').filter_map { |field|
    mapper = subfield_value?(field, '2', /iso639-3/) ? iso_639_3_mapping : iso_639_2_mapping
    field.filter_map do |sf|
      next unless LANGUAGE_SUBFIELDS.include? sf.code

      mapper[sf.value&.to_sym]
    end
  }.flatten
  control_field = record['008']&.value
  values << iso_639_2_mapping[control_field[35..37]&.to_sym] if control_field.present?
  values.empty? ? values << iso_639_2_mapping[UNDETERMINED_CODE] : values.uniq
end