diff --git a/languages/example/rdf/display/everytime/PropertyConfig_es.n3 b/languages/example/rdf/display/everytime/PropertyConfig_es.n3 new file mode 100644 index 00000000..b28023df --- /dev/null +++ b/languages/example/rdf/display/everytime/PropertyConfig_es.n3 @@ -0,0 +1,44 @@ + "aconsejado en"@es . + "editor de"@es . + "la educaci\u00F3n y la formaci\u00F3n"@es . + "extensi\u00F3n y servicio a la comunidad"@es . + "servicio a la profesi\u00F3n"@es . + "tel\u00E9fono"@es . + "personas"@es . + "p\u00E1gina web"@es . + "actividades de investigaci\u00F3n"@es . + "en la serie de eventos"@es . + "recogida o editor de la serie de"@es . + "actividades docentes"@es . + "posiciones"@es . + "t\u00EDtulo preferido"@es . + "publicaciones seleccionadas"@es . + "nombre y apellidos"@es . + "revisor de"@es . + "autores"@es . + "asistido"@es . + "incluye eventos"@es . + "correo electr\u00F3nico principal"@es . + "investigador co-principal en"@es . + "fax"@es . + "contribuyente"@es . + "editores"@es . + "direcci\u00F3n de env\u00EDo"@es . + "fax"@es . + "organizador del"@es . + "investigador principal en"@es . + "correos electr\u00F3nicos adicionales"@es . + "asesorados"@es . + "premios y honores"@es . + "ingresos"@es . + "la recepci\u00F3n de"@es . + "investigador en"@es . + "premio o el honor de"@es . + "caso, dentro de"@es . + "actividades cl\u00EDnicas"@es . + "presentaciones"@es . + "relacionados por"@es . + "part\u00EDcipe"@es . + "jefe de"@es . + "miembro de"@es . + "tel\u00E9fono"@es . diff --git a/utilities/languageSupport/translateDisplayNames/display_name_common.rb b/utilities/languageSupport/translateDisplayNames/display_name_common.rb new file mode 100755 index 00000000..11d8de1b --- /dev/null +++ b/utilities/languageSupport/translateDisplayNames/display_name_common.rb @@ -0,0 +1,47 @@ +#!/usr/bin/ruby +=begin +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end + +require 'rubygems' +require 'rdf' +require 'rdf/rdfxml' +require 'rdf/ntriples' +require 'rdf/n3' + +include RDF + +DISPLAY_NAME_URI = RDF::URI.new("http://vitro.mannlib.cornell.edu/ns/vitro/ApplicationConfiguration#displayName") + +class UsageError < StandardError; end +class FilterError < StandardError; end + + +class DisplayNameCommon + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + def self.load_filter(filter_file) + return lambda{|s| true} unless filter_file + return eval(IO.read(filter_file)) + rescue + raise FilterError.new($!.message) + end + + def initialize(rdf_file, &filter) + @filter = filter.nil? ? lambda{true} : filter + @graph = Graph.load(rdf_file) + end + + def process(query, &filter) + solutions = query.execute(@graph) + solutions.filter!(&filter) + solutions.order(:prop) + end +end \ No newline at end of file diff --git a/utilities/languageSupport/translateDisplayNames/display_name_inserter.rb b/utilities/languageSupport/translateDisplayNames/display_name_inserter.rb new file mode 100644 index 00000000..895331f3 --- /dev/null +++ b/utilities/languageSupport/translateDisplayNames/display_name_inserter.rb @@ -0,0 +1,118 @@ +#!/usr/bin/ruby +=begin +-------------------------------------------------------------------------------- + +A utility that reads an RDF file, builds a model, sorts all of the URIs that have +display_names, and associates those URIs with the display_names in a supplied text file, one line +per display_name. + +These display_names are assigned the language specified on the command line, and the +resulting RDF statements are sent to standard output as N3. + +On the command line provide the path to the RDF file, the path to the display_names file, +and the desired language/locale. E.g.: + + display_name_inserter.rb ../../vivo-core-1.5-annotations.rdf display_names.file es_ES + +-------------------------------------------------------------------------------- +=end + +$: << File.dirname(File.expand_path(__FILE__)) +require 'rubygems' +require 'rdf' +require 'display_name_common' + +include RDF + +class DisplayNameInserter + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + + # + # Parse the arguments and complain if they don't make sense. + # + def sanity_check_arguments(args) + raise UsageError, "usage is: display_name_inserter.rb [filter_file] [ok]" unless (3..5).include?(args.length) + + if args[-1].downcase == 'ok' + ok = true + args.pop + else + ok = false + end + + n3_output_file = args.pop + raise UsageError, "File '#{n3_output_file}' already exists. specify 'ok' to overwrite it." if File.exist?(n3_output_file) && !ok + + rdf_file = args[0] + raise UsageError, "File '#{rdf_file}' does not exist." unless File.exist?(rdf_file) + + display_names_input_file = args[1] + raise UsageError, "File '#{display_names_input_file}' does not exist." unless File.exist?(display_names_input_file) + + locale = args[2] + raise UsageError, "Locale should be like 'ab' or 'ab-CD'." unless /^[a-z]{2}(-[A-Z]{2})?$/ =~ locale + + filter_file = args[3] + raise UsageError, "File '#{filter_file}' does not exist." if filter_file && !File.exist?(filter_file) + filter = DisplayNameCommon.load_filter(filter_file) + + return rdf_file, display_names_input_file, locale, filter, n3_output_file + end + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + def initialize(args) + @rdf_file, @display_names_input_file, @locale, @filter, @n3_output_file = sanity_check_arguments(args) + rescue UsageError => e + puts "\n----------------\nUsage error\n----------------\n\n#{e}\n\n----------------\n\n" + exit + rescue FilterError => e + puts "\n----------------\nFilter file is invalid\n----------------\n\n#{e}\n\n----------------\n\n" + exit + end + + def process() + query = Query.new({ + :prop => { + DISPLAY_NAME_URI => :display_name, + } + }) + + solutions = DisplayNameCommon.new(@rdf_file).process(query, &@filter) + + display_names = IO.readlines(@display_names_input_file) + + raise "Number of display_names (#{display_names.length}) doesn't match number of URIs (#{solutions.length})" unless display_names.length == solutions.length + + graph = Graph.new + solutions.zip(display_names).each do |data| + s = data[0].prop + p = DISPLAY_NAME_URI + o = Literal.new(data[1].chomp, :language => @locale) + graph << Statement.new(s, p, o) + end + + File.open(@n3_output_file, 'w') do |f| + f.puts graph.dump(:ntriples) + end + end +end + +# +# +# ------------------------------------------------------------------------------------ +# Standalone calling. +# +# Do this if this program was called from the command line. That is, if the command +# expands to the path of this file. +# ------------------------------------------------------------------------------------ +# + +if File.expand_path($0) == File.expand_path(__FILE__) + inserter = DisplayNameInserter.new(ARGV) + inserter.process() +end diff --git a/utilities/languageSupport/translateDisplayNames/display_name_stripper.rb b/utilities/languageSupport/translateDisplayNames/display_name_stripper.rb new file mode 100755 index 00000000..1eefbf96 --- /dev/null +++ b/utilities/languageSupport/translateDisplayNames/display_name_stripper.rb @@ -0,0 +1,101 @@ +#!/usr/bin/ruby +=begin +-------------------------------------------------------------------------------- + +A utility that reads an RDF file, builds a model, sorts all of the URIs that have +display_names, and produces a file of those display_names, one per line. The idea is that this +file could be translated, and the result could be put into RDF by display_name_inserter.rb + +This required the RDF.rb gem: sudo gem install rdf + +On the command line provide the path to the RDF file. E.g.: + + display_name_stripper.rb '../../PropertyConfig.n3' + +-------------------------------------------------------------------------------- +=end + +$: << File.dirname(File.expand_path(__FILE__)) +require 'rubygems' +require 'rdf' +require 'display_name_common' +require 'rdf/n3' + +include RDF + +class DisplayNameStripper + # ------------------------------------------------------------------------------------ + private + # ------------------------------------------------------------------------------------ + + # + # Parse the arguments and complain if they don't make sense. + # + def sanity_check_arguments(args) + raise UsageError, "usage is: display_name_stripper.rb [filter_file] [ok]" unless (2..3).include?(args.length) + + if args[-1].downcase == 'ok' + ok = true + args.pop + else + ok = false + end + + output_file = args.pop + raise UsageError, "File '#{output_file}' already exists. specify 'ok' to overwrite it." if File.exist?(output_file) && !ok + + rdf_file = args[0] + raise UsageError, "File '#{rdf_file}' does not exist." unless File.exist?(rdf_file) + + filter_file = args[1] + raise UsageError, "File '#{filter_file}' does not exist." if filter_file && !File.exist?(filter_file) + filter = DisplayNameCommon.load_filter(filter_file) + + return rdf_file, filter, output_file + end + + # ------------------------------------------------------------------------------------ + public + # ------------------------------------------------------------------------------------ + + def initialize(args) + @rdf_file, @filter, @display_names_output_file = sanity_check_arguments(args) + rescue UsageError => e + puts "\n----------------\nUsage error\n----------------\n\n#{e}\n\n----------------\n\n" + exit + rescue FilterError => e + puts "\n----------------\nFilter file is invalid\n----------------\n\n#{e}\n\n----------------\n\n" + exit + end + + def process() + query = Query.new({ + :prop => { + DISPLAY_NAME_URI => :display_name, + } + }) + + solutions = DisplayNameCommon.new(@rdf_file).process(query, &@filter) + + File.open(@display_names_output_file, 'w') do |f| + solutions.each do |s| + f.puts s.display_name + end + end + end +end + +# +# +# ------------------------------------------------------------------------------------ +# Standalone calling. +# +# Do this if this program was called from the command line. That is, if the command +# expands to the path of this file. +# ------------------------------------------------------------------------------------ +# + +if File.expand_path($0) == File.expand_path(__FILE__) + stripper = DisplayNameStripper.new(ARGV) + stripper.process() +end