aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/Roles/Translatable.pm
blob: 803cf7a1a60974cd9dcfb7809ef890aeb97df3bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package FixMyStreet::Roles::Translatable;

use Moo::Role;

sub translate_around {
    my ($orig, $self) = (shift, shift);
    my $fallback = $self->$orig(@_);
    (my $col = (caller(2))[3]) =~ s/.*:://;
    $self->_translate($col, $fallback);
}

sub translate_column {
    my ($self, $col) = (shift, shift);
    my $fallback = $self->$col(@_);
    $self->_translate($col, $fallback);
}

sub _translate {
    my ($self, $col, $fallback) = @_;

    my $schema = $self->result_source->schema;
    my $table = lc $self->result_source->source_name;
    my $id = $self->id;

    # Deal with the fact problem table has denormalized copy of category string
    if ($table eq 'problem' && $col eq 'category') {
        my $body_id = $self->bodies_str_ids->[0];
        return $fallback unless $body_id && $body_id =~ /^[0-9]+$/;
        my $contact = $schema->resultset("Contact")->find( {
            body_id => $body_id,
            category => $fallback,
        } );
        return $fallback unless $contact; # Shouldn't happen, but some tests
        $table = 'contact';
        $id = $contact->id;
    }

    if (ref $schema) {
        my $translation = $schema->resultset('Translation')->find({
            lang => $schema->lang,
            tbl => $table,
            object_id => $id,
            col => $col
        });
        return $translation->msgstr if $translation;
    } else {
        warn "Can't use translation on this call to $table.$col";
    }
    return $fallback;
};

# These next two functions (translation_for and and_translation_for) are
# convenience methods for use in the translation interface in the admin.
# They shouldn't be used else where as they don't take account of things
# like denormalised strings (e.g report category)
sub translation_for {
    my ($self, $col, $lang) = @_;

    my $schema = $self->result_source->schema;

    my $props = {
        tbl => lc $self->result_source->source_name,
        object_id => $self->id,
        col => $col
    };

    if ($lang) {
        $props->{lang} = $lang;
    }

    my $translations = $schema->resultset('Translation')->search($props);

    return $lang ? $translations->first : $translations;
}

sub add_translation_for {
    my ($self, $col, $lang, $msgstr) = @_;

    my $schema = $self->result_source->schema;

    my $props = {
        tbl => lc $self->result_source->source_name,
        object_id => $self->id,
        col => $col,
        lang => $lang,
        msgstr => $msgstr,
    };

    my $translation = $schema->resultset('Translation')->update_or_create(
        $props,
        { key => 'translation_tbl_object_id_col_lang_key' }
    );

    return $translation;
}

1;