parent
4ac37e239f
commit
ec307bc019
4 changed files with 277 additions and 26 deletions
@ -0,0 +1,186 @@ |
|||||||
|
package AN::Tools::Words; |
||||||
|
# |
||||||
|
# This module contains methods used to handle storage related tasks |
||||||
|
# |
||||||
|
|
||||||
|
use strict; |
||||||
|
use warnings; |
||||||
|
use Data::Dumper; |
||||||
|
use XML::LibXML; |
||||||
|
use Encode; |
||||||
|
|
||||||
|
our $VERSION = "3.0.0"; |
||||||
|
my $THIS_FILE = "Words.pm"; |
||||||
|
|
||||||
|
# Setup for UTF-8 mode. |
||||||
|
# use utf8; |
||||||
|
# $ENV{'PERL_UNICODE'} = 1; |
||||||
|
|
||||||
|
### Methods; |
||||||
|
# read |
||||||
|
|
||||||
|
=pod |
||||||
|
|
||||||
|
=encoding utf8 |
||||||
|
|
||||||
|
=head1 NAME |
||||||
|
|
||||||
|
AN::Tools::Words |
||||||
|
|
||||||
|
Provides all methods related to generating translated strings for users. |
||||||
|
|
||||||
|
=head1 SYNOPSIS |
||||||
|
|
||||||
|
use AN::Tools::Words; |
||||||
|
|
||||||
|
# Get a common object handle on all AN::Tools modules. |
||||||
|
my $an = AN::Tools->new(); |
||||||
|
|
||||||
|
# Access to methods using '$an->Words->X'. |
||||||
|
# |
||||||
|
# Example using 'read()'; |
||||||
|
my $foo_path = $an->Words->read({file => $an->data->{path}{words}{'an-tools.xml'}}); |
||||||
|
|
||||||
|
=head1 METHODS |
||||||
|
|
||||||
|
Methods in this module; |
||||||
|
|
||||||
|
=cut |
||||||
|
sub new |
||||||
|
{ |
||||||
|
my $class = shift; |
||||||
|
my $self = {}; |
||||||
|
|
||||||
|
bless $self, $class; |
||||||
|
|
||||||
|
return ($self); |
||||||
|
} |
||||||
|
|
||||||
|
# Get a handle on the AN::Tools object. I know that technically that is a sibling module, but it makes more |
||||||
|
# sense in this case to think of it as a parent. |
||||||
|
sub parent |
||||||
|
{ |
||||||
|
my $self = shift; |
||||||
|
my $parent = shift; |
||||||
|
|
||||||
|
$self->{HANDLE}{TOOLS} = $parent if $parent; |
||||||
|
|
||||||
|
return ($self->{HANDLE}{TOOLS}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
############################################################################################################# |
||||||
|
# Public methods # |
||||||
|
############################################################################################################# |
||||||
|
|
||||||
|
|
||||||
|
=head2 read |
||||||
|
|
||||||
|
This reads in a words file containing translated strings used to generated output for the user. |
||||||
|
|
||||||
|
Example to read 'C<an-tools.xml>'; |
||||||
|
|
||||||
|
my $words_file = $an->data->{path}{words}{'an-words.xml'}; |
||||||
|
my $an->Words->read({file => $words_file}) or die "Failed to read: [$words_file]. Does the file exist?\n"; |
||||||
|
|
||||||
|
Successful read will return '0'. Non-0 is an error; |
||||||
|
0 = OK |
||||||
|
1 = Invalid file name or path |
||||||
|
2 = File not found |
||||||
|
3 = File not readable |
||||||
|
4 = File found, but did not contain strings. |
||||||
|
|
||||||
|
NOTE: Read works are stored in 'C<< $an->data->{words}{<file_name>}{language}{<language>}{string} >>'. Metadata, like what languages are provided, are stored under 'C<< $an->data->{words}{<file_name>}{meta}{...} >>'. |
||||||
|
|
||||||
|
Parameters; |
||||||
|
|
||||||
|
=head3 file |
||||||
|
|
||||||
|
This is the file to read. |
||||||
|
|
||||||
|
=cut |
||||||
|
sub read |
||||||
|
{ |
||||||
|
my $self = shift; |
||||||
|
my $parameter = shift; |
||||||
|
my $an = $self->parent; |
||||||
|
|
||||||
|
# Setup default values |
||||||
|
my $file = defined $parameter->{file} ? $parameter->{file} : 0; |
||||||
|
my $return_code = 0; |
||||||
|
|
||||||
|
if (not $file) |
||||||
|
{ |
||||||
|
# TODO: Log the problem, do not translate. |
||||||
|
print $THIS_FILE." ".__LINE__."; AN::Tools::Words->read()' called without a file name to read.\n"; |
||||||
|
$return_code = 1; |
||||||
|
} |
||||||
|
elsif (not -e $file) |
||||||
|
{ |
||||||
|
# TODO: Log the problem, do not translate. |
||||||
|
print $THIS_FILE." ".__LINE__."; AN::Tools::Words->read()' asked to read: [$file] which was not found.\n"; |
||||||
|
$return_code = 2; |
||||||
|
} |
||||||
|
elsif (not -r $file) |
||||||
|
{ |
||||||
|
# TODO: Log the problem, do not translate. |
||||||
|
print $THIS_FILE." ".__LINE__."; AN::Tools::Words->read()' asked to read: [$file] which was not readable by: [".getpwuid($<)."/".getpwuid($>)."] (uid/euid: [".$<."/".$>."]).\n"; |
||||||
|
$return_code = 3; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
# Read the file with XML::LibXML |
||||||
|
my $parser = XML::LibXML->new(); |
||||||
|
my $dom = XML::LibXML->load_xml({location => $file}); |
||||||
|
print "===========================================================\n"; |
||||||
|
print Dumper $dom; |
||||||
|
print "===========================================================\n"; |
||||||
|
|
||||||
|
# my $data = ""; |
||||||
|
# eval { $data = $xml->XMLin($file, KeyAttr => {node => 'name'}, ForceArray => 1) }; |
||||||
|
# if ($@) |
||||||
|
# { |
||||||
|
# chomp $@; |
||||||
|
# print $THIS_FILE." ".__LINE__."; [ Error ] - The was a problem reading: [$file]. The error was:\n"; |
||||||
|
# print "===========================================================\n"; |
||||||
|
# print $@."\n"; |
||||||
|
# print "===========================================================\n"; |
||||||
|
# $return_code = 4; |
||||||
|
# } |
||||||
|
# else |
||||||
|
# { |
||||||
|
# print "===========================================================\n"; |
||||||
|
# #print Dumper $data; |
||||||
|
# print Dumper $data->{language}; |
||||||
|
# print "===========================================================\n"; |
||||||
|
# |
||||||
|
# # Read the meta data |
||||||
|
# my $meta_found = 0; |
||||||
|
# my $version = $data->{meta}->[0]->{version}->[0]; |
||||||
|
# my $languages = $data->{meta}->[0]->{languages}->[0]; |
||||||
|
# #print $THIS_FILE." ".__LINE__."; [ Debug ] - Version: [$version], languages: [$languages]\n"; |
||||||
|
# |
||||||
|
# my $this_language = ""; |
||||||
|
# foreach my $hash_ref (@{$data->{language}}) |
||||||
|
# { |
||||||
|
# $this_language = $hash_ref->{name}; |
||||||
|
# my $long_name = $hash_ref->{long_name}; |
||||||
|
# print $THIS_FILE." ".__LINE__."; [ Debug ] - this_language: [$this_language], long_name: [$long_name]\n"; |
||||||
|
# } |
||||||
|
# } |
||||||
|
} |
||||||
|
|
||||||
|
return($return_code); |
||||||
|
} |
||||||
|
|
||||||
|
# =head3 |
||||||
|
# |
||||||
|
# Private Functions; |
||||||
|
# |
||||||
|
# =cut |
||||||
|
|
||||||
|
############################################################################################################# |
||||||
|
# Private functions # |
||||||
|
############################################################################################################# |
||||||
|
|
||||||
|
1; |
@ -0,0 +1,37 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
|
||||||
|
<!-- |
||||||
|
Company: Alteeve's Niche, Inc. |
||||||
|
License: GPL v2+ |
||||||
|
Author: Madison Kelly <mkelly@alteeve.ca> |
||||||
|
|
||||||
|
This is the AN::Tools master 'words' file. |
||||||
|
--> |
||||||
|
|
||||||
|
<words> |
||||||
|
<meta> |
||||||
|
<version>3.0.0</version> |
||||||
|
<languages>en_CA,jp</languages> |
||||||
|
</meta> |
||||||
|
<!-- Canadian English --> |
||||||
|
<language name="en_CA" long_name="Canadian English" description="Created by Madison Kelly (mkelly@alteeve.ca) for the AN::Tools suite of perl modules"> |
||||||
|
|
||||||
|
<!-- Test words. Do NOT change unless you update 't/Words.t' or tests will needlessly fail. --> |
||||||
|
<key name="t_0000">Test</key> |
||||||
|
<key name="t_0001">Test replace: [#!variable!test!#].</key> |
||||||
|
<key name="t_0002">Test Out of order: [#!variable!second!#] replace: [#!variable!first!#].</key> |
||||||
|
<!-- Do not use 't_0003'. It is used to test failures caused by calling a non-existent key. --> |
||||||
|
<key name="t_0004">#!FREE!#</key> |
||||||
|
|
||||||
|
</language> |
||||||
|
<!-- 日本語 --> |
||||||
|
<language name="jp" long_name="日本語" description=">Created by Madison Kelly (mkelly@alteeve.ca) for the AN::Tools suite of perl modules."> |
||||||
|
|
||||||
|
<!-- Test words. Do NOT change unless you update 't/Words.t' or tests will needlessly fail. --> |
||||||
|
<key name="t_0000">テスト</key> |
||||||
|
<key name="t_0001">テスト いれかえる: [#!variable!test!#]。</key> |
||||||
|
<key name="t_0002">テスト、 整理: [#!variable!second!#]/[#!variable!first!#]。</key> |
||||||
|
<!-- Do not use 't_0003'. It is used to test failures caused by calling a non-existent key. --> |
||||||
|
<key name="t_0004">#!FREE!#</key> |
||||||
|
</language> |
||||||
|
</words> |
Loading…
Reference in new issue