Skip to content

Commit

Permalink
Bug 14100: Generic solution for language overlay - Item types
Browse files Browse the repository at this point in the history
Test plan:
1/ update the Schema (misc/devel/update_dbix_class_files.pl)
2/ Translate templates for some languages (es-DE, de-DE for instance)
3/ Enable them in the pref (search for 'lang') for the staff interface
4/ Go on the item type admin page (admin/itemtypes.pl)
5/ Edit one
6/ Click on the 'translate for other languages' link
7/ You are now on the interface to translate the item type's description
in the languages you want. So translate some :)
8/ Go back on the item type list view (admin/itemtypes.pl)
9/ You should see the original description (non translated)
10/ Switch the language
11/ You should see the translated description in the correct language.
If the description is non translated, the original description is
displayed.

12/ On the different page where the item type is displayed, confirm that
the translated description appears.

Think further / Todo:
1/ Update all occurrences of the item type's description (DONE)
2/ Implement for authorised values
3/ Implement for syspref value (at least textarea)
4/ Implement for branch names
5/ Centralize all the translation on a single page in the admin area
...
N/ Implement a webservice to centralize all the translations and give
the ability to sync the item types/authorised values description with
the rest of the world (push and pull).

Signed-off-by: Josef Moravec <[email protected]>

Signed-off-by: Katrin Fischer <[email protected]>
Signed-off-by: Tomas Cohen Arazi <[email protected]>
  • Loading branch information
joubu authored and tomascohen committed Oct 27, 2015
1 parent 66e9384 commit 0f63f89
Show file tree
Hide file tree
Showing 19 changed files with 581 additions and 90 deletions.
9 changes: 4 additions & 5 deletions C4/Items.pm
Original file line number Diff line number Diff line change
Expand Up @@ -3027,13 +3027,12 @@ sub PrepareItemrecordDisplay {

#----- itemtypes
} elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
my $sth = $dbh->prepare( "SELECT itemtype,description FROM itemtypes ORDER BY description" );
$sth->execute;
my $itemtypes = GetItemTypes( style => 'array' );
push @authorised_values, ""
unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) {
push @authorised_values, $itemtype;
$authorised_lib{$itemtype} = $description;
for my $itemtype ( @$itemtypes ) {
push @authorised_values, $itemtype->{itemtype};
$authorised_lib{$itemtype->{itemtype}} = $itemtype->{translated_description};
}
#---- class_sources
} elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) {
Expand Down
49 changes: 40 additions & 9 deletions C4/Koha.pm
Original file line number Diff line number Diff line change
Expand Up @@ -254,15 +254,30 @@ sub GetItemTypes {
my ( %params ) = @_;
my $style = defined( $params{'style'} ) ? $params{'style'} : 'hash';

my $language = C4::Languages::getlanguage();
# returns a reference to a hash of references to itemtypes...
my %itemtypes;
my $dbh = C4::Context->dbh;
my $query = qq|
SELECT *
my $query = q|
SELECT
itemtypes.itemtype,
itemtypes.description,
itemtypes.rentalcharge,
itemtypes.notforloan,
itemtypes.imageurl,
itemtypes.summary,
itemtypes.checkinmsg,
itemtypes.checkinmsgtype,
itemtypes.sip_media_type,
COALESCE( localization.translation, itemtypes.description ) AS translated_description
FROM itemtypes
LEFT JOIN localization ON itemtypes.itemtype = localization.code
AND localization.entity = 'itemtypes'
AND localization.lang = ?
ORDER BY itemtype
|;
my $sth = $dbh->prepare($query);
$sth->execute;
$sth->execute( $language );

if ( $style eq 'hash' ) {
while ( my $IT = $sth->fetchrow_hashref ) {
Expand Down Expand Up @@ -540,14 +555,30 @@ Defaults to intranet.

sub getitemtypeinfo {
my ($itemtype, $interface) = @_;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare("select * from itemtypes where itemtype=?");
$sth->execute($itemtype);
my $res = $sth->fetchrow_hashref;
my $dbh = C4::Context->dbh;
my $language = C4::Languages::getlanguage();
my $it = $dbh->selectrow_hashref(q|
SELECT
itemtypes.itemtype,
itemtypes.description,
itemtypes.rentalcharge,
itemtypes.notforloan,
itemtypes.imageurl,
itemtypes.summary,
itemtypes.checkinmsg,
itemtypes.checkinmsgtype,
itemtypes.sip_media_type,
COALESCE( localization.translation, itemtypes.description ) AS translated_description
FROM itemtypes
LEFT JOIN localization ON itemtypes.itemtype = localization.code
AND localization.entity = 'itemtypes'
AND localization.lang = ?
WHERE itemtypes.itemtype = ?
|, undef, $language, $itemtype );

$res->{imageurl} = getitemtypeimagelocation( ( ( defined $interface && $interface eq 'opac' ) ? 'opac' : 'intranet' ), $res->{imageurl} );
$it->{imageurl} = getitemtypeimagelocation( ( ( defined $interface && $interface eq 'opac' ) ? 'opac' : 'intranet' ), $it->{imageurl} );

return $res;
return $it;
}

=head2 getitemtypeimagedir
Expand Down
12 changes: 3 additions & 9 deletions C4/Search.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1873,15 +1873,9 @@ sub searchResults {
#Build itemtype hash
#find itemtype & itemtype image
my %itemtypes;
$bsth =
$dbh->prepare(
"SELECT itemtype,description,imageurl,summary,notforloan FROM itemtypes"
);
$bsth->execute();
while ( my $bdata = $bsth->fetchrow_hashref ) {
foreach (qw(description imageurl summary notforloan)) {
$itemtypes{ $bdata->{'itemtype'} }->{$_} = $bdata->{$_};
}
my $itemtypes = GetItemTypes( style => 'array' );
for my $itemtype ( @$itemtypes ) {
$itemtypes{ $itemtype->{itemtype} } = $itemtype;
}

#search item field code
Expand Down
28 changes: 28 additions & 0 deletions Koha/Localization.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package Koha::Localization;

# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

use Modern::Perl;

use Koha::Database;

use base qw(Koha::Object);

sub type {
return 'Localization';
}

1;
34 changes: 34 additions & 0 deletions Koha/Localizations.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package Koha::Localizations;

# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

use Modern::Perl;

use Koha::Database;

use Koha::Localization;

use base qw(Koha::Objects);

sub type {
return 'Localization';
}

sub object_class {
return 'Koha::Localization';
}

1;
7 changes: 2 additions & 5 deletions Koha/Template/Plugin/ItemTypes.pm
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,8 @@ use C4::Koha;
sub GetDescription {
my ( $self, $itemtype ) = @_;

my $query = "SELECT description FROM itemtypes WHERE itemtype = ?";
my $sth = C4::Context->dbh->prepare($query);
$sth->execute($itemtype);
my $d = $sth->fetchrow_hashref();
return $d->{description}
my $itemtype = C4::Koha::getitemtypeinfo( $itemtype );
return $itemtype->{translated_description};

}

Expand Down
50 changes: 35 additions & 15 deletions admin/itemtypes.pl
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,7 @@ =head1 admin/itemtypes.pl
use C4::Auth;
use C4::Output;

sub StringSearch {
my ( $searchstring, $type ) = @_;
my $dbh = C4::Context->dbh;
$searchstring =~ s/\'/\\\'/g;
my @data = split( ' ', $searchstring );
my $sth = $dbh->prepare(
"SELECT * FROM itemtypes WHERE (description LIKE ?) ORDER BY itemtype"
);
$sth->execute("$data[0]%");
return $sth->fetchall_arrayref({}); # return ref-to-array of ref-to-hashes
# like [ fetchrow_hashref(), fetchrow_hashref() ... ]
}
use Koha::Localizations;

my $input = new CGI;
my $searchfield = $input->param('description');
Expand Down Expand Up @@ -99,8 +88,26 @@ sub StringSearch {
#---- if primkey exists, it's a modify action, so read values to modify...
my $data;
if ($itemtype) {
my $sth = $dbh->prepare("select * from itemtypes where itemtype=?");
$sth->execute($itemtype);
my $sth = $dbh->prepare(q|
SELECT
itemtypes.itemtype,
itemtypes.description,
itemtypes.rentalcharge,
itemtypes.notforloan,
itemtypes.imageurl,
itemtypes.summary,
itemtypes.checkinmsg,
itemtypes.checkinmsgtype,
itemtypes.sip_media_type,
COALESCE( localization.translation, itemtypes.description ) AS translated_description
FROM itemtypes
LEFT JOIN localization ON itemtypes.itemtype = localization.code
AND localization.entity='itemtypes'
AND localization.lang = ?
WHERE itemtype = ?
|);
my $language = C4::Languages::getlanguage();
$sth->execute($language, $itemtype);
$data = $sth->fetchrow_hashref;
}

Expand Down Expand Up @@ -259,11 +266,24 @@ sub StringSearch {
}

if ( $op eq 'list' ) {
my ($results) = StringSearch( $searchfield, 'web' );
my $results = C4::Koha::GetItemTypes( style => 'array' );
my @loop;
foreach my $itemtype ( @{$results} ) {
$itemtype->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtype->{imageurl} );
$itemtype->{rentalcharge} = sprintf( '%.2f', $itemtype->{rentalcharge} );

my @translated_descriptions = Koha::Localizations->search(
{ entity => 'itemtypes',
code => $itemtype->{itemtype},
}
);
$itemtype->{translated_descriptions} = [ map {
{
lang => $_->lang,
translation => $_->translation,
}
} @translated_descriptions ];

push( @loop, $itemtype );
}

Expand Down
64 changes: 64 additions & 0 deletions admin/localization.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/usr/bin/perl

# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.


use Modern::Perl;

use C4::Auth;
use C4::Output;

use Koha::Localization;
use Koha::Localizations;

use CGI qw( -utf8 );

my $query = new CGI;

my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
{ template_name => "admin/localization.tt",
authnotrequired => 0,
flagsrequired => { parameters => 'parameters_remaining_permissions' },
query => $query,
type => "intranet",
debug => 1,
}
);

my $entity = $query->param('entity');
my $code = $query->param('code');
my $rs = Koha::Localizations->search( { entity => $entity, code => $code } );
my @translations;
while ( my $s = $rs->next ) {
push @translations,
{ id => $s->localization_id,
entity => $s->entity,
code => $s->code,
lang => $s->lang,
translation => $s->translation,
};
}

my $translated_languages = C4::Languages::getTranslatedLanguages( 'intranet', C4::Context->preference('template') );

$template->param(
translations => \@translations,
languages => $translated_languages,
entity => $entity,
code => $code,
);

output_html_with_http_headers $query, $cookie, $template->output;
16 changes: 5 additions & 11 deletions authorities/authorities.pl
Original file line number Diff line number Diff line change
Expand Up @@ -83,23 +83,17 @@ sub build_authorized_values_list {
push @authorised_values, $branchcode;
$authorised_lib{$branchcode} = $branchname;
}

#----- itemtypes
}
elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
my $sth =
$dbh->prepare(
"select itemtype,description from itemtypes order by description");
$sth->execute;
push @authorised_values, ""
unless ( $tagslib->{$tag}->{$subfield}->{mandatory}
&& ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) );

my $itemtype;

while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) {
push @authorised_values, $itemtype;
$authorised_lib{$itemtype} = $description;
my $itemtypes = GetItemTypes( style => 'array' );
for my $itemtype ( @$itemtypes ) {
push @authorised_values, $itemtype->{itemtype};
$authorised_lib{$itemtype->{itemtype}} = $itemtype->{translated_description};
}
$value = $itemtype unless ($value);

Expand Down
2 changes: 1 addition & 1 deletion catalogue/search.pl
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ =head3 Additional Notes
my %row =( number=>$cnt++,
ccl => "$itype_or_itemtype,phr",
code => $thisitemtype,
description => $itemtypes->{$thisitemtype}->{'description'},
description => $itemtypes->{$thisitemtype}->{translated_description},
imageurl=> getitemtypeimagelocation( 'intranet', $itemtypes->{$thisitemtype}->{'imageurl'} ),
);
push @itypesloop, \%row;
Expand Down
17 changes: 5 additions & 12 deletions cataloguing/addbiblio.pl
Original file line number Diff line number Diff line change
Expand Up @@ -184,26 +184,19 @@ sub build_authorized_values_list {
$authorised_lib{$thisbranch} = $branches->{$thisbranch}->{'branchname'};
}

#----- itemtypes
}
elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
my $sth =
$dbh->prepare(
"select itemtype,description from itemtypes order by description");
$sth->execute;
push @authorised_values, ""
unless ( $tagslib->{$tag}->{$subfield}->{mandatory}
&& ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) );

my $itemtype;

while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) {
push @authorised_values, $itemtype;
$authorised_lib{$itemtype} = $description;
my $itemtypes = GetItemTypes( style => 'array' );
for my $itemtype ( @$itemtypes ) {
push @authorised_values, $itemtype->{itemtype};
$authorised_lib{$itemtype->{itemtype}} = $itemtype->{translated_description};
}
$value = $itemtype unless ($value);

#---- class_sources
}
elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) {
push @authorised_values, ""
Expand Down
Loading

0 comments on commit 0f63f89

Please sign in to comment.