Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision dbda14c2

Von Moritz Bunkus vor mehr als 11 Jahren hinzugefügt

  • ID dbda14c263efd93aca3b7114015a47d86b8581e3
  • Vorgänger dfefe1cf
  • Nachfolger 3774d83b

Unterstützung für andere Datenbankencodings als Unicode/UTF-8 entfernt

Unterschiede anzeigen:

SL/AM.pm
1021 1021
    close(TEMPLATE);
1022 1022
  }
1023 1023

  
1024
  $content = Encode::decode('utf-8-strict', $content) if $::locale->is_utf8;
1024
  $content = Encode::decode('utf-8-strict', $content);
1025 1025

  
1026 1026
  $main::lxdebug->leave_sub();
1027 1027

  
......
1038 1038
  my $error = "";
1039 1039

  
1040 1040
  if (open(TEMPLATE, ">", $filename)) {
1041
    $content = Encode::encode('utf-8-strict', $content) if $::locale->is_utf8;
1041
    $content = Encode::encode('utf-8-strict', $content);
1042 1042
    $content =~ s/\r\n/\n/g;
1043 1043
    print(TEMPLATE $content);
1044 1044
    close(TEMPLATE);
SL/Auth.pm
251 251

  
252 252
  $main::lxdebug->message(LXDebug->DEBUG1, "Auth::dbconnect DSN: $dsn");
253 253

  
254
  $self->{dbh} = SL::DBConnect->connect($dsn, $cfg->{user}, $cfg->{password}, { pg_enable_utf8 => $::locale->is_utf8, AutoCommit => 1 });
254
  $self->{dbh} = SL::DBConnect->connect($dsn, $cfg->{user}, $cfg->{password}, { pg_enable_utf8 => 1, AutoCommit => 1 });
255 255

  
256 256
  if (!$may_fail && !$self->{dbh}) {
257 257
    $main::form->error($main::locale->text('The connection to the authentication database failed:') . "\n" . $DBI::errstr);
......
326 326

  
327 327
  $main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database DSN: $dsn");
328 328

  
329
  my $charset    = $::lx_office_conf{system}->{dbcharset};
330
  $charset     ||= Common::DEFAULT_CHARSET;
331
  my $encoding   = $Common::charset_to_db_encoding{$charset};
332
  $encoding    ||= 'UNICODE';
333

  
334
  my $dbh        = SL::DBConnect->connect($dsn, $params{superuser}, $params{superuser_password}, { pg_enable_utf8 => scalar($charset =~ m/^utf-?8$/i) });
329
  my $dbh = SL::DBConnect->connect($dsn, $params{superuser}, $params{superuser_password}, { pg_enable_utf8 => 1 });
335 330

  
336 331
  if (!$dbh) {
337 332
    $main::form->error($main::locale->text('The connection to the template database failed:') . "\n" . $DBI::errstr);
338 333
  }
339 334

  
340
  my $query = qq|CREATE DATABASE "$cfg->{db}" OWNER "$cfg->{user}" TEMPLATE "$params{template}" ENCODING '$encoding'|;
335
  my $query = qq|CREATE DATABASE "$cfg->{db}" OWNER "$cfg->{user}" TEMPLATE "$params{template}" ENCODING 'UNICODE'|;
341 336

  
342 337
  $main::lxdebug->message(LXDebug->DEBUG1(), "Auth::create_database query: $query");
343 338

  
......
349 344
    $query                 = qq|SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = 'template0'|;
350 345
    my ($cluster_encoding) = $dbh->selectrow_array($query);
351 346

  
352
    if ($cluster_encoding && ($cluster_encoding =~ m/^(?:UTF-?8|UNICODE)$/i) && ($encoding !~ m/^(?:UTF-?8|UNICODE)$/i)) {
353
      $error = $main::locale->text('Your PostgreSQL installationen uses UTF-8 as its encoding. Therefore you have to configure kivitendo to use UTF-8 as well.');
347
    if ($cluster_encoding && ($cluster_encoding !~ m/^(?:UTF-?8|UNICODE)$/i)) {
348
      $error = $::locale->text('Your PostgreSQL installationen does not use Unicode as its encoding. This is not supported anymore.');
354 349
    }
355 350

  
356 351
    $dbh->disconnect();
......
369 364
  my $self = shift;
370 365
  my $dbh  = $self->dbconnect();
371 366

  
372
  my $charset    = $::lx_office_conf{system}->{dbcharset};
373
  $charset     ||= Common::DEFAULT_CHARSET;
374

  
375 367
  $dbh->rollback();
376
  SL::DBUpgrade2->new(form => $::form)->process_query($dbh, 'sql/auth_db.sql', undef, $charset);
368
  SL::DBUpgrade2->new(form => $::form)->process_query($dbh, 'sql/auth_db.sql');
377 369

  
378 370
  $main::lxdebug->leave_sub();
379 371
}
SL/BackgroundJob/SelfTest.pm
124 124

  
125 125
  my ($output, $content_type) = $self->_prepare_report;
126 126

  
127
  my $mail              = Mailer->new(charset => $::locale->is_utf8 ? 'UTF-8' : Common->DEFAULT_CHARSET );
127
  my $mail              = Mailer->new;
128 128
  $mail->{from}         = $self->config->{email_from};
129 129
  $mail->{to}           = $email;
130 130
  $mail->{subject}      = $self->config->{email_subject};
SL/Common.pm
17 17

  
18 18
use SL::DBUtils;
19 19

  
20
use vars qw(@db_encodings %db_encoding_to_charset %charset_to_db_encoding);
21

  
22
@db_encodings = (
23
  { "label" => "ASCII",          "dbencoding" => "SQL_ASCII", "charset" => "ASCII" },
24
  { "label" => "UTF-8 Unicode",  "dbencoding" => "UNICODE",   "charset" => "UTF-8" },
25
  { "label" => "ISO 8859-1",     "dbencoding" => "LATIN1",    "charset" => "ISO-8859-1" },
26
  { "label" => "ISO 8859-2",     "dbencoding" => "LATIN2",    "charset" => "ISO-8859-2" },
27
  { "label" => "ISO 8859-3",     "dbencoding" => "LATIN3",    "charset" => "ISO-8859-3" },
28
  { "label" => "ISO 8859-4",     "dbencoding" => "LATIN4",    "charset" => "ISO-8859-4" },
29
  { "label" => "ISO 8859-5",     "dbencoding" => "LATIN5",    "charset" => "ISO-8859-5" },
30
  { "label" => "ISO 8859-15",    "dbencoding" => "LATIN9",    "charset" => "ISO-8859-15" },
31
  { "label" => "KOI8-R",         "dbencoding" => "KOI8",      "charset" => "KOI8-R" },
32
  { "label" => "Windows CP1251", "dbencoding" => "WIN",       "charset" => "CP1251" },
33
  { "label" => "Windows CP866",  "dbencoding" => "ALT",       "charset" => "CP866" },
34
);
35

  
36
%db_encoding_to_charset = map { $_->{dbencoding}, $_->{charset} } @db_encodings;
37
%charset_to_db_encoding = map { $_->{charset}, $_->{dbencoding} } @db_encodings;
38

  
39
use constant DEFAULT_CHARSET => 'ISO-8859-15';
40

  
41 20
sub unique_id {
42 21
  my ($a, $b) = gettimeofday();
43 22
  return "${a}-${b}-${$}";
SL/Controller/Base.pm
116 116
                        :                              'application/json';
117 117

  
118 118
      print $::form->create_http_response(content_type => $content_type,
119
                                          charset      => $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET());
119
                                          charset      => 'UTF-8');
120 120
    }
121 121
  }
122 122

  
SL/DB.pm
42 42
    driver           => 'Pg',
43 43
    european_dates   => ((SL::DBConnect->get_datestyle || '') =~ m/european/i) ? 1 : 0,
44 44
    connect_options  => {
45
      pg_enable_utf8 => $::locale && $::locale->is_utf8,
45
      pg_enable_utf8 => 1,
46 46
    },
47 47
  );
48 48

  
SL/DBConnect.pm
72 72
sub get_options {
73 73
  my $self    = shift;
74 74
  my $options = {
75
    pg_enable_utf8 => $::locale->is_utf8,
75
    pg_enable_utf8 => 1,
76 76
    @_
77 77
  };
78 78

  
SL/DBUpgrade2.pm
82 82
    next if ($control->{ignore});
83 83

  
84 84
    $control->{charset} = 'UTF-8' if $file =~ m/\.pl$/;
85
    $control->{charset} = $control->{charset} || $control->{encoding} || Common::DEFAULT_CHARSET;
85
    $control->{charset} = $control->{charset} || $control->{encoding} || 'UTF-8';
86 86

  
87 87
    if (!$control->{"tag"}) {
88 88
      _control_error($form, $file_name, $locale->text("Missing 'tag' field.")) ;
......
133 133
sub process_query {
134 134
  $::lxdebug->enter_sub();
135 135

  
136
  my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_;
136
  my ($self, $dbh, $filename, $version_or_control) = @_;
137 137

  
138 138
  my $form  = $self->{form};
139 139
  my $fh    = IO::File->new($filename, "r") or $form->error("$filename : $!\n");
......
141 141
  my $sth;
142 142
  my @quote_chars;
143 143

  
144
  my $file_charset = Common::DEFAULT_CHARSET;
144
  my $file_charset = 'UTF-8';
145 145
  while (<$fh>) {
146 146
    last if !/^--/;
147 147
    next if !/^--\s*\@(?:charset|encoding):\s*(.+)/;
......
150 150
  }
151 151
  $fh->seek(0, SEEK_SET);
152 152

  
153
  $db_charset ||= Common::DEFAULT_CHARSET;
154

  
155 153
  $dbh->begin_work();
156 154

  
157 155
  while (<$fh>) {
158
    $_ = SL::Iconv::convert($file_charset, $db_charset, $_);
156
    $_ = SL::Iconv::convert($file_charset, 'UTF-8', $_);
159 157

  
160 158
    # Remove DOS and Unix style line endings.
161 159
    chomp;
......
241 239
sub process_perl_script {
242 240
  $::lxdebug->enter_sub();
243 241

  
244
  my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_;
242
  my ($self, $dbh, $filename, $version_or_control) = @_;
245 243

  
246 244
  my %form_values = map { $_ => $::form->{$_} } qw(dbconnect dbdefault dbhost dbmbkiviunstable dbname dboptions dbpasswd dbport dbupdate dbuser login template_object version);
247 245

  
......
288 286
}
289 287

  
290 288
sub process_file {
291
  my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_;
289
  my ($self, $dbh, $filename, $version_or_control) = @_;
292 290

  
293 291
  if ($filename =~ m/sql$/) {
294
    $self->process_query($dbh, $filename, $version_or_control, $db_charset);
292
    $self->process_query($dbh, $filename, $version_or_control);
295 293
  } else {
296
    $self->process_perl_script($dbh, $filename, $version_or_control, $db_charset);
294
    $self->process_perl_script($dbh, $filename, $version_or_control);
297 295
  }
298 296
}
299 297

  
......
357 355

  
358 356
  return 0 if !@unapplied_scripts;
359 357

  
360
  my $db_charset           = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
361 358
  $self->{form}->{login} ||= 'admin';
362 359

  
363
  map { $_->{description} = SL::Iconv::convert($_->{charset}, $db_charset, $_->{description}) } values %{ $self->{all_controls} };
360
  map { $_->{description} = SL::Iconv::convert($_->{charset}, 'UTF-8', $_->{description}) } values %{ $self->{all_controls} };
364 361

  
365 362
  if ($called_from_admin) {
366 363
    $self->{form}->{title} = $::locale->text('Dataset upgrade');
......
373 370
    $::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}");
374 371
    print $self->{form}->parse_html_template("dbupgrade/upgrade_message2", $control);
375 372

  
376
    $self->process_file($dbh, "sql/Pg-upgrade2-auth/$control->{file}", $control, $db_charset);
373
    $self->process_file($dbh, "sql/Pg-upgrade2-auth/$control->{file}", $control);
377 374
  }
378 375

  
379 376
  print $self->{form}->parse_html_template("dbupgrade/footer", { is_admin => 1 }) if $called_from_admin;
......
617 614
found). Sets C<$Self-&gt;{all_controls}> to the list of database
618 615
scripts.
619 616

  
620
=item C<process_file $dbh, $filename, $version_or_control, $db_charset>
617
=item C<process_file $dbh, $filename, $version_or_control>
621 618

  
622 619
Applies a single database upgrade file. Calls L<process_perl_script>
623 620
for Perl update files and C<process_query> for SQL update
624 621
files. Requires an open database handle(C<$dbh>), the file name
625
(C<$filename>), a hash structure of the file's control fields as
626
produced by L<parse_dbupdate_controls> (C<$version_or_control>) and
627
the database charset (for on-the-fly charset recoding of the script if
628
required, C<$db_charset>).
622
(C<$filename>) and a hash structure of the file's control fields as
623
produced by L<parse_dbupdate_controls> (C<$version_or_control>).
629 624

  
630 625
Returns the result of the actual function called.
631 626

  
632
=item C<process_perl_script $dbh, $filename, $version_or_control, $db_charset>
627
=item C<process_perl_script $dbh, $filename, $version_or_control>
633 628

  
634 629
Applies a single Perl database upgrade file. Requires an open database
635
handle(C<$dbh>), the file name (C<$filename>), a hash structure of the
636
file's control fields as produced by L<parse_dbupdate_controls>
637
(C<$version_or_control>) and the database charset (for on-the-fly
638
charset recoding of the script if required, C<$db_charset>).
630
handle(C<$dbh>), the file name (C<$filename>) and a hash structure of
631
the file's control fields as produced by L<parse_dbupdate_controls>
632
(C<$version_or_control>).
639 633

  
640 634
Perl scripts are executed via L<eval>. If L<eval> returns falsish then
641 635
an error is expected. There are two special return values: If the
......
675 669
    }
676 670
  }
677 671

  
678
=item C<process_query $dbh, $filename, $version_or_control, $db_charset>
672
=item C<process_query $dbh, $filename, $version_or_control>
679 673

  
680 674
Applies a single SQL database upgrade file. Requires an open database
681
handle(C<$dbh>), the file name (C<$filename>), a hash structure of the
682
ofile's control fields as produced by L<parse_dbupdate_controls>
683
(C<$version_or_control>) and the database charset (for on-the-fly
684
charset recoding of the script if required, C<$db_charset>).
675
handle(C<$dbh>), the file name (C<$filename>), and a hash structure of
676
the file's control fields as produced by L<parse_dbupdate_controls>
677
(C<$version_or_control>).
685 678

  
686 679
=item C<sort_dbupdate_controls>
687 680

  
SL/DBUpgrade2/Base.pm
59 59

  
60 60
  my $error = $handle ? $handle->errstr : $self->dbh->errstr;
61 61

  
62
  return $::locale->is_utf8 ? Encode::decode('utf-8', $error) : $error;
62
  return Encode::decode('utf-8', $error);
63 63
}
64 64

  
65 65
sub check_coa {
SL/DN.pm
369 369

  
370 370
  my $template     = SL::Template::create(type => 'PlainText', form => $form, myconfig => $myconfig);
371 371
  my $mail         = Mailer->new();
372
  $mail->{charset} = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
373 372
  $mail->{from}    = $myconfig->{email};
374 373
  $mail->{to}      = $ref->{recipient};
375 374
  $mail->{subject} = $template->parse_block($ref->{email_subject});
SL/FCGIFixes.pm
25 25

  
26 26
sub fix_print_and_internal_encoding_after_0_68 {
27 27
  return if version->new("$FCGI::VERSION")->numify <= version->new("0.68")->numify;
28
  return if lc($::lx_office_conf{system}->{dbcharset}) !~ m/^(?:utf-?8|unicode)$/;
29 28

  
30 29
  my $encoder             = Encode::find_encoding('UTF-8');
31 30
  my $original_fcgi_print = \&FCGI::Stream::PRINT;
SL/Form.pm
447 447
  $::lxdebug->enter_sub;
448 448

  
449 449
  my ($self, %params) = @_;
450
  my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
451 450
  my @header;
452 451

  
453 452
  $::lxdebug->leave_sub and return if !$ENV{HTTP_USER_AGENT} || $self->{header}++;
......
499 498
  );
500 499

  
501 500
  # output
502
  print $self->create_http_response(content_type => 'text/html', charset => $db_charset);
501
  print $self->create_http_response(content_type => 'text/html', charset => 'UTF-8');
503 502
  print $doctypes{$params{doctype} || 'transitional'}, $/;
504 503
  print <<EOT;
505 504
<html>
506 505
 <head>
507
  <meta http-equiv="Content-Type" content="text/html; charset=$db_charset">
506
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
508 507
  <title>$self->{titlebar}</title>
509 508
EOT
510 509
  print "  $_\n" for @header;
......
543 542

  
544 543
  my ($self) = @_;
545 544

  
546
  my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
547
  my $output     = $::request->{cgi}->header('-charset' => $db_charset);
545
  my $output = $::request->{cgi}->header('-charset' => 'UTF-8');
548 546

  
549 547
  $main::lxdebug->leave_sub();
550 548

  
......
616 614
    map { $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys %::myconfig;
617 615
  }
618 616

  
619
  $additional_params->{"conf_dbcharset"}              = $::lx_office_conf{system}->{dbcharset};
620 617
  $additional_params->{"conf_webdav"}                 = $::lx_office_conf{features}->{webdav};
621 618
  $additional_params->{"conf_latex_templates"}        = $::lx_office_conf{print_templates}->{latex};
622 619
  $additional_params->{"conf_opendocument_templates"} = $::lx_office_conf{print_templates}->{opendocument};
......
1100 1097

  
1101 1098
      map { $mail->{$_} = $self->{$_} }
1102 1099
        qw(cc bcc subject message version format);
1103
      $mail->{charset} = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
1104 1100
      $mail->{to} = $self->{EMAIL_RECIPIENT} ? $self->{EMAIL_RECIPIENT} : $self->{email};
1105 1101
      $mail->{from}   = qq|"$myconfig->{name}" <$myconfig->{email}>|;
1106 1102
      $mail->{fileid} = time() . '.' . $$ . '.';
SL/Iconv.pm
33 33

  
34 34
  my ($from_charset, $to_charset, $text) = @_;
35 35

  
36
  $from_charset ||= Common::DEFAULT_CHARSET;
37
  $to_charset   ||= Common::DEFAULT_CHARSET;
36
  $from_charset ||= 'UTF-8';
37
  $to_charset   ||= 'UTF-8';
38 38

  
39 39
  my $converter = _get_converter($from_charset, $to_charset);
40 40
  $text         = $converter->convert($text);
SL/Locale.pm
77 77
  my $self     = shift;
78 78
  my $country  = shift;
79 79

  
80
  $self->{charset}     = Common::DEFAULT_CHARSET;
81 80
  $self->{countrycode} = $country;
82 81

  
83 82
  if ($country && -d "locale/$country") {
......
87 86
      eval($code);
88 87
      close(IN);
89 88
    }
90

  
91
    if (open IN, "<", "locale/$country/charset") {
92
      $self->{charset} = <IN>;
93
      close IN;
94

  
95
      chomp $self->{charset};
96
    }
97 89
  }
98 90

  
99
  my $db_charset            = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
100
  $self->{is_utf8}          = (any { lc($::lx_office_conf{system}->{dbcharset} || '') eq $_ } qw(utf8 utf-8 unicode)) ? 1 : 0;
101

  
102
  if ($self->{is_utf8}) {
103
    binmode STDOUT, ":utf8";
104
    binmode STDERR, ":utf8";
105
  }
91
  binmode STDOUT, ":utf8";
92
  binmode STDERR, ":utf8";
106 93

  
107
  $self->{iconv}            = SL::Iconv->new($self->{charset}, $db_charset);
108
  $self->{iconv_reverse}    = SL::Iconv->new($db_charset,      $self->{charset});
109
  $self->{iconv_english}    = SL::Iconv->new('ASCII',          $db_charset);
110
  $self->{iconv_iso8859}    = SL::Iconv->new('ISO-8859-15',    $db_charset);
111
  $self->{iconv_to_iso8859} = SL::Iconv->new($db_charset,      'ISO-8859-15');
112
  $self->{iconv_utf8}       = SL::Iconv->new('UTF-8',          $db_charset);
94
  $self->{iconv}            = SL::Iconv->new('UTF-8',       'UTF-8');
95
  $self->{iconv_reverse}    = SL::Iconv->new('UTF-8',       'UTF-8');
96
  $self->{iconv_english}    = SL::Iconv->new('ASCII',       'UTF-8');
97
  $self->{iconv_iso8859}    = SL::Iconv->new('ISO-8859-15', 'UTF-8');
98
  $self->{iconv_to_iso8859} = SL::Iconv->new('UTF-8',       'ISO-8859-15');
99
  $self->{iconv_utf8}       = SL::Iconv->new('UTF-8',       'UTF-8');
113 100

  
114 101
  $self->_read_special_chars_file($country);
115 102

  
......
121 108
    (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec));
122 109
}
123 110

  
124
sub is_utf8 {
125
  my $self   = shift;
126
  my $handle = shift;
127
  return $self->{is_utf8} && (!$handle || $handle->is_utf8);
128
}
129

  
130 111
sub _handle_markup {
131 112
  my $self    = shift;
132 113
  my $str     = shift;
......
514 495
  $self->{raw_io_active} = 1;
515 496
  binmode $fh, ":raw";
516 497
  $code->();
517
  binmode $fh, ":utf8" if $self->is_utf8;
498
  binmode $fh, ":utf8";
518 499
  $self->{raw_io_active} = 0;
519 500
}
520 501

  
......
623 604

  
624 605
TODO: Describe get_local_time_zone
625 606

  
626
=item C<is_utf8>
627

  
628
TODO: Describe is_utf8
629

  
630 607
=item C<lang_to_locale>
631 608

  
632 609
TODO: Describe lang_to_locale
SL/Mailer.pm
190 190
  }
191 191

  
192 192
  # Set defaults & headers
193
  $self->{charset}     ||=  Common::DEFAULT_CHARSET;
193
  $self->{charset}       =  'UTF-8';
194 194
  $self->{contenttype} ||=  "text/plain";
195 195
  $self->{headers}       =  [
196 196
    Subject              => $self->{subject},
SL/Mailer/Sendmail.pm
18 18

  
19 19
  Rose::Object::init(@_);
20 20

  
21
  my $email         =  $::locale->is_utf8 ? Encode::encode('utf-8', $self->myconfig->{email}) : $self->myconfig->{email};
21
  my $email         =  Encode::encode('utf-8', $self->myconfig->{email});
22 22
  $email            =~ s/[^\w\.\-\+=@]//ig;
23 23

  
24 24
  my %temp_form     = ( %{ $self->form }, myconfig_email => $email );
......
27 27
  $sendmail         = $template->parse_block($sendmail);
28 28

  
29 29
  $self->{sendmail} = IO::File->new("|$sendmail") || die "sendmail($sendmail): $!";
30
  $self->{sendmail}->binmode(':utf8') if $::locale->is_utf8;
30
  $self->{sendmail}->binmode(':utf8');
31 31
}
32 32

  
33 33
sub start_mail {
SL/MoreCommon.pm
155 155
sub uri_encode {
156 156
  my ($str) = @_;
157 157

  
158
  $str =  Encode::encode('utf-8-strict', $str) if $::locale->is_utf8;
158
  $str =  Encode::encode('utf-8-strict', $str);
159 159
  $str =~ s/([^a-zA-Z0-9_.:-])/sprintf("%%%02x", ord($1))/ge;
160 160

  
161 161
  return $str;
......
168 168
  $str =~ s/\\$//;
169 169

  
170 170
  $str =~ s/%([0-9a-fA-Z]{2})/pack("C",hex($1))/eg;
171
  $str =  Encode::decode('utf-8-strict', $str) if $::locale->is_utf8;
171
  $str =  Encode::decode('utf-8-strict', $str);
172 172

  
173 173
  return $str;
174 174
}
SL/Presenter.pm
251 251

  
252 252
=item * C<LXCONFIG> -- all parameters from C<config/kivitendo.conf>
253 253
with the same name they appear in the file (first level is the
254
section, second the actual variable, e.g. C<system.dbcharset>,
254
section, second the actual variable, e.g. C<system.language>,
255 255
C<features.webdav> etc)
256 256

  
257 257
=item * C<LXDEBUG> -- C<$::lxdebug>
SL/ReportGenerator.pm
441 441
  my $num_columns     = scalar @visible_columns;
442 442
  my $num_header_rows = 1;
443 443

  
444
  my $font_encoding   = $::lx_office_conf{system}->{dbcharset} || 'ISO-8859-15';
444
  my $font_encoding   = 'UTF-8';
445 445

  
446 446
  foreach my $name (@visible_columns) {
447 447
    push @column_props, { 'justify' => $self->{columns}->{$name}->{align} eq 'right' ? 'right' : 'left' };
......
703 703
  my ($self, $text, $do_unquote) = @_;
704 704

  
705 705
  $text = $main::locale->unquote_special_chars('HTML', $text) if $do_unquote;
706
  $text = Encode::encode('UTF-8', $text) if $::locale->is_utf8;
706
  $text = Encode::encode('UTF-8', $text);
707 707

  
708 708
  return $text;
709 709
}
SL/Request.pm
126 126
      $content_type   = "text/plain";
127 127
      $boundary_found = 1;
128 128
      $need_cr        = 0;
129
      $encoding       = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
129
      $encoding       = 'UTF-8';
130 130
      $transfer_encoding = undef;
131 131
      last if $last_boundary;
132 132
      next;
......
255 255
  $::lxdebug->enter_sub;
256 256

  
257 257
  my ($target) = @_;
258
  my $db_charset   = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
259 258

  
260 259
  # yes i know, copying all those values around isn't terribly efficient, but
261 260
  # the old version of dumping everything into form and then launching a
......
284 283
    }
285 284
  }
286 285

  
287
  my $encoding     = delete $temp_target->{INPUT_ENCODING} || $db_charset;
286
  my $encoding     = delete $temp_target->{INPUT_ENCODING} || 'UTF-8';
288 287

  
289
  _recode_recursively(SL::Iconv->new($encoding, $db_charset), $temp_target => $target) if keys %$target;
288
  _recode_recursively(SL::Iconv->new($encoding, 'UTF-8'), $temp_target => $target) if keys %$target;
290 289

  
291 290
  if ($target->{RESTORE_FORM_FROM_SESSION_ID}) {
292 291
    my %temp_form;
SL/Template/LaTeX.pm
338 338
    $self->{"error"} = "$form->{templates}/$form->{IN}: $!";
339 339
    return 0;
340 340
  }
341
  binmode IN, ":utf8" if $::locale->is_utf8;
341
  binmode IN, ":utf8";
342 342
  my @lines = <IN>;
343 343
  close(IN);
344 344

  
......
374 374
    return 0;
375 375
  }
376 376

  
377
  if ($::locale->is_utf8) {
378
    binmode OUT, ":utf8";
379
    print OUT Unicode::Normalize::normalize('C', $new_contents);
380

  
381
  } else {
382
    print OUT $new_contents;
383
  }
377
  binmode OUT, ":utf8";
378
  print OUT Unicode::Normalize::normalize('C', $new_contents);
384 379

  
385 380
  if ($form->{"format"} =~ /postscript/i) {
386 381
    return $self->convert_to_postscript();
SL/Template/OpenDocument.pm
22 22
  my $self = $type->SUPER::new(@_);
23 23

  
24 24
  $self->{"rnd"}   = int(rand(1000000));
25
  $self->{"iconv"} = SL::Iconv->new($::lx_office_conf{system}->{dbcharset}, "UTF-8");
26 25

  
27 26
  $self->set_tag_style('&lt;%', '%&gt;');
28 27
  $self->{quot_re} = '&quot;';
......
575 574
sub format_string {
576 575
  my ($self, $variable) = @_;
577 576
  my $form = $self->{"form"};
578
  my $iconv = $self->{"iconv"};
579 577

  
580 578
  $variable = $main::locale->quote_special_chars('Template/OpenDocument', $variable);
581 579

  
......
591 589
    $variable =~ s|\&lt;/${key}\&gt;|</text:span>|gi;
592 590
  }
593 591

  
594
  return $iconv->convert($variable);
592
  return $variable;
595 593
}
596 594

  
597 595
sub get_mime_type() {
SL/Template/Plugin/HTMLFixes.pm
21 21
sub url {
22 22
    my ($self, $text) = @_;
23 23
    return undef unless defined $text;
24
    $text =  Encode::encode('utf-8-strict', $text) if $::locale && $::locale->is_utf8;
24
    $text =  Encode::encode('utf-8-strict', $text);
25 25
    $text =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
26 26
    return $text;
27 27
}
SL/User.pm
258 258
  $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}, SL::DBConnect->get_options)
259 259
    or $form->dberror;
260 260

  
261
  my $db_charset = $Common::db_encoding_to_charset{$form->{encoding}};
262
  $db_charset ||= Common::DEFAULT_CHARSET;
263

  
264 261
  my $dbupdater = SL::DBUpgrade2->new(form => $form);
265 262
  # create the tables
266
  $dbupdater->process_query($dbh, "sql/lx-office.sql", undef, $db_charset);
263
  $dbupdater->process_query($dbh, "sql/lx-office.sql");
267 264

  
268 265
  # load chart of accounts
269
  $dbupdater->process_query($dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset);
266
  $dbupdater->process_query($dbh, "sql/$form->{chart}-chart.sql");
270 267

  
271 268
  my $query = qq|UPDATE defaults SET coa = ?, accounting_method = ?, profit_determination = ?, inventory_system = ?, curr = ?|;
272 269
  do_query($form, $dbh, $query, map { $form->{$_} } qw(chart accounting_method profit_determination inventory_system defaultcurrency));
......
399 396
    closedir(SQLDIR);
400 397
  }
401 398

  
402
  my $db_charset = $::lx_office_conf{system}->{dbcharset};
403
  $db_charset ||= Common::DEFAULT_CHARSET;
404

  
405 399
  my $dbupdater = SL::DBUpgrade2->new(form => $form);
406 400

  
407 401
  foreach my $db (split(/ /, $form->{dbupdate})) {
......
441 435

  
442 436
      # apply upgrade
443 437
      $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $upgradescript");
444
      $dbupdater->process_file($dbh, "sql/Pg-upgrade/$upgradescript", $str_maxdb, $db_charset);
438
      $dbupdater->process_file($dbh, "sql/Pg-upgrade/$upgradescript", $str_maxdb);
445 439

  
446 440
      $version = $maxdb;
447 441

  
......
466 460
  my $dbupdater       = $params{updater};
467 461
  my $db              = $params{database};
468 462
  my $rc              = -2;
469
  my $db_charset      = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
470 463

  
471
  map { $_->{description} = SL::Iconv::convert($_->{charset}, $db_charset, $_->{description}) } values %{ $dbupdater->{all_controls} };
464
  map { $_->{description} = SL::Iconv::convert($_->{charset}, 'UTF-8', $_->{description}) } values %{ $dbupdater->{all_controls} };
472 465

  
473 466
  &dbconnect_vars($form, $db);
474 467

  
......
487 480
    $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}");
488 481
    print $form->parse_html_template("dbupgrade/upgrade_message2", $control);
489 482

  
490
    $dbupdater->process_file($dbh, "sql/Pg-upgrade2/$control->{file}", $control, $db_charset);
483
    $dbupdater->process_file($dbh, "sql/Pg-upgrade2/$control->{file}", $control);
491 484
  }
492 485

  
493 486
  $rc = 0;
bin/mozilla/sepa.pl
489 489

  
490 490
  my $sepa_xml   = SL::SEPA::XML->new('company'     => $defaults->company,
491 491
                                      'creditor_id' => $defaults->sepa_creditor_id,
492
                                      'src_charset' => $::lx_office_conf{system}->{dbcharset} || 'ISO-8859-15',
492
                                      'src_charset' => 'UTF-8',
493 493
                                      'message_id'  => $message_id,
494 494
                                      'grouped'     => 1,
495 495
                                      'collection'  => $vc eq 'customer',
bin/mozilla/ustva.pl
903 903

  
904 904
      $form->{attachment_filename} =~ s|.*/||;
905 905

  
906
      # TODO: set Output to UTF-8 or system Preference
907
      #$form->{"iconv"} = Text::Iconv->new($myconfig{dbcharset}, "UTF-8");
908
      #my $iconv = $self->{"iconv"};
909
      #$iconv->convert($variable);
910 906
      if ($form->{period} =~ /^[4]\d$/ ){
911 907
        my %periods = ( # Lx => taxbird
912 908
                     '41' => '12',
config/kivitendo.conf.default
65 65
# and "en" (English, not perfect) are available.
66 66
language = de
67 67

  
68
# The database charset. Must match the encoding of the database cluster you want to
69
# connect to. (Used on the shell command to create a database "pg_createcluster". Option "-e <encoding>".)
70
dbcharset = UTF-8
71

  
72 68
[features]
73 69
# Activate certain optional features and modules.
74 70
webdav = 0
doc/UPGRADE
18 18

  
19 19
* Perl v5.10.1 oder neuer wird zwingend vorausgesetzt.
20 20

  
21
* Die Datenbank muss zwingend Unicode als Encoding nutzen. Daher wird
22
  auch die Konfigurationsvariable "system.dbcharset" nicht mehr
23
  unterstützt.
24

  
21 25
* Einführung von Mandanten. Früher war die Konfiguration der
22 26
  Datenbanken für jeden Benutzer getrennt vorzunehmen. Mit diesem
23 27
  Release wurden Mandanten eingeführt: ein Mandant bekommt einen Namen
doc/changelog
67 67
  Die alte URL wird weiterhin funktionieren und lediglich auf die neue
68 68
  URL umleiten.
69 69

  
70
- Datenbanken, die nicht Unicode als Encoding nutzen, werden nicht
71
  mehr unterstützt. Die Konfigurationsvariable "system.dbcharset"
72
  wurde entfernt.
73

  
70 74
- Upgrades von alten SQL-Ledger-Versionen im Allgemeinen sowie
71 75
  Upgrades von alten kivitendo-Versionen, die Benutzer noch über die
72 76
  Datei "users/members" verwaltet haben, werden nicht mehr
doc/dokumentation.xml
381 381
port     = 5432
382 382
db       = kivitendo_auth
383 383
user     = postgres
384
password =
385

  
386
[system]
387
dbcharset = UTF-8</programlisting>
384
password =</programlisting>
388 385

  
389 386
        <para>Nutzt man wiederkehrende Rechnungen, kann man unter
390 387
        <varname>[periodic_invoices]</varname> den Login eines Benutzers
......
428 425
      <para>PostgreSQL muss auf verschiedene Weisen angepasst werden.</para>
429 426

  
430 427
      <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
431
        <title>Zeichensätze/die Verwendung von UTF-8</title>
428
        <title>Zeichensätze/die Verwendung von Unicode/UTF-8</title>
432 429

  
433
	<para>Bei aktuellen Serverinstallationen braucht man hier meist nicht
434
	eingreifen</para>
430
	      <para>kivitendo setzt zwingend voraus, dass die Datenbank Unicode/UTF-8 als Encoding einsetzt. Bei aktuellen Serverinstallationen
431
	      braucht man hier meist nicht einzugreifen.</para>
435 432

  
436
        <para>Dieses kann überprüft werden: ist das Encoding der Datenbank
437
	“template1” “UTF8”, so braucht man nichts weiteres diesbezüglich
438
	unternehmen. Zum Testen:
433
        <para>Das Encoding des Datenbankservers kann überprüft werden. Ist das Encoding der Datenbank "template1" "Unicode" bzw. "UTF-8", so
434
        braucht man nichts weiteres diesbezüglich unternehmen. Zum Testen:</para>
439 435

  
440 436
        <programlisting>su postgres
441 437
echo '\l' | psql
442 438
exit </programlisting>
443 439

  
444
        Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
445
        UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
440
        <para>Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
441
        Unicode-Encoding anzulegen und diesen zu verwenden. Unter Debian und
446 442
        Ubuntu kann dies z.B. für PostgreSQL 8.2 mit dem folgenden Befehl
447 443
        getan werden:</para>
448 444

  
......
453 449

  
454 450
        <para>Unter anderen Distributionen gibt es ähnliche Methoden.</para>
455 451

  
456
        <para>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
457
        ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
458
        kivitendo mit ISO-8859-15 als Encoding betrieben werden.</para>
459

  
460 452
        <para>Das Encoding einer Datenbank kann in <command>psql</command> mit
461 453
        <literal>\l</literal> geprüft werden.</para>
462 454
      </sect2>
......
1243 1235
        <para>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
1244 1236
        den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
1245 1237
        Beispielen ist dies ‘<literal>kivitendo</literal>’).</para>
1246

  
1247
        <para>Wenn Sie für die kivitendo-Installation nicht Unicode (UTF-8) sondern den europäischen Schriftsatz ISO-8859-15 benutzen
1248
        wollen, so müssen Sie vor dem Anlegen der Datenbank in der Datei <filename>config/kivitendo.conf</filename> die Variable
1249
        <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf den Wert ‘<literal>ISO-8859-15</literal>’ setzen.</para>
1250

  
1251
        <para>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
1252
        verwenden müssen, da diese Einstellungen momentan global in kivitendo
1253
        vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
1254
        Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
1255
        angelegt worden sein.</para>
1256 1238
      </sect2>
1257 1239

  
1258 1240
      <sect2 id="Gruppen-anlegen">
......
1681 1663
      <literal>print_templates</literal> auf ‘<literal>1</literal>’ stehen.
1682 1664
      Dieses ist die Standardeinstellung.</para>
1683 1665

  
1684
      <para>Weiterhin muss in der Datei
1685
      <filename>config/kivitendo.conf</filename> die Variable
1686
      <literal>dbcharset</literal> im Abschnitt <literal>system</literal> auf
1687
      die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
1688
      Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
1689
      "UTF-8".</para>
1690

  
1691 1666
      <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
1692 1667
      weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
1693 1668
      OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
......
5474 5449
        <para>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
5475 5450
        den kritischen Pfaden, unter 0,15 sonst.</para>
5476 5451
      </sect2>
5477

  
5478
      <sect2 id="devel.fcgi.known-issues">
5479
        <title>Bekannte Probleme</title>
5480

  
5481
        <sect3 id="devel.fcgi.known-issues.encoding">
5482
          <title>Encoding Awareness</title>
5483

  
5484
          <para>UTF-8 kodierte Installationen sind sehr anfällig gegen
5485
          fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
5486
          falsch kodierte Zeichen eher unwissend, und geben sie einfach
5487
          weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
5488
          das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
5489
          beseitigen.</para>
5490
        </sect3>
5491
      </sect2>
5492 5452
    </sect1>
5493 5453

  
5494 5454
    <sect1 id="db-upgrade-files" xreflabel="Datenbank-Upgradedateien">
......
5781 5741
        point.</para>
5782 5742
      </sect2>
5783 5743

  
5744
      <sect2 id="translations-languages.character-set"
5745
             xreflabel="Character set">
5746
        <title>Character set</title>
5747

  
5748
        <para>All files included in a language pack must use UTF-8 as their encoding.</para>
5749
      </sect2>
5750

  
5784 5751
      <sect2 id="translations-languages.file-structure"
5785 5752
             xreflabel="File structure">
5786 5753
        <title>File structure</title>
......
5817 5784
            </listitem>
5818 5785
          </varlistentry>
5819 5786

  
5820
          <varlistentry>
5821
            <term>charset</term>
5822

  
5823
            <listitem>
5824
              <para>This file should be present.</para>
5825

  
5826
              <para>The <filename>charset</filename> file describes which
5827
              charset a language package is written in and applies to all
5828
              other language files in the package. It is possible to write
5829
              some language packages without an explicit charset, but it is
5830
              still strongly recommended. You'll never know in what
5831
              environment your language package will be used, and neither
5832
              UTF-8 nor Latin1 are guaranteed.</para>
5833

  
5834
              <para>The whole content of this file is a string that can be
5835
              recognized as a valid charset encoding. Example:</para>
5836

  
5837
              <programlisting>UTF-8</programlisting>
5838
            </listitem>
5839
          </varlistentry>
5840

  
5841 5787
          <varlistentry>
5842 5788
            <term>all</term>
5843 5789

  
doc/html/ch02s04.html
52 52
port     = 5432
53 53
db       = kivitendo_auth
54 54
user     = postgres
55
password =
56

  
57
[system]
58
dbcharset = UTF-8</pre><p>Nutzt man wiederkehrende Rechnungen, kann man unter
55
password =</pre><p>Nutzt man wiederkehrende Rechnungen, kann man unter
59 56
        <code class="varname">[periodic_invoices]</code> den Login eines Benutzers
60 57
        angeben, der nach Erstellung der Rechnungen eine entsprechende E-Mail
61 58
        mit Informationen über die erstellten Rechnungen bekommt.</p><p>kivitendo bringt eine eigene Komponente zur zeitgesteuerten Ausführung bestimmter Aufgaben mit, den <a class="link" href="ch02s07.html" title="2.7. Der Task-Server">Taskserver</a>. Er wird u.a. für Features wie die <a class="link" href="ch03.html#features.periodic-invoices" title="3.1. Wiederkehrende Rechnungen">wiederkehrenden Rechnungen</a> benötigt, erledigt aber auch andere erforderliche Aufgaben
doc/html/ch02s05.html
1 1
<html><head>
2 2
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3
   <title>2.5. Anpassung der PostgreSQL-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s04.html" title="2.4. kivitendo-Konfigurationsdatei"><link rel="next" href="ch02s06.html" title="2.6. Webserver-Konfiguration"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.5. Anpassung der PostgreSQL-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Zurück</a>&nbsp;</td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s06.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.5. Anpassung der PostgreSQL-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Anpassung-der-PostgreSQL-Konfiguration"></a>2.5. Anpassung der PostgreSQL-Konfiguration</h2></div></div></div><p>PostgreSQL muss auf verschiedene Weisen angepasst werden.</p><div class="sect2" title="2.5.1. Zeichensätze/die Verwendung von UTF-8"><div class="titlepage"><div><div><h3 class="title"><a name="Zeichens%C3%A4tze-die-Verwendung-von-UTF-8"></a>2.5.1. Zeichensätze/die Verwendung von UTF-8</h3></div></div></div><p>Bei aktuellen Serverinstallationen braucht man hier meist nicht
4
	eingreifen</p><p>Dieses kann überprüft werden: ist das Encoding der Datenbank
5
	“template1” “UTF8”, so braucht man nichts weiteres diesbezüglich
6
	unternehmen. Zum Testen:
7

  
8
        </p><pre class="programlisting">su postgres
3
   <title>2.5. Anpassung der PostgreSQL-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s04.html" title="2.4. kivitendo-Konfigurationsdatei"><link rel="next" href="ch02s06.html" title="2.6. Webserver-Konfiguration"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.5. Anpassung der PostgreSQL-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s04.html">Zurück</a>&nbsp;</td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s06.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.5. Anpassung der PostgreSQL-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Anpassung-der-PostgreSQL-Konfiguration"></a>2.5. Anpassung der PostgreSQL-Konfiguration</h2></div></div></div><p>PostgreSQL muss auf verschiedene Weisen angepasst werden.</p><div class="sect2" title="2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8"><div class="titlepage"><div><div><h3 class="title"><a name="Zeichens%C3%A4tze-die-Verwendung-von-UTF-8"></a>2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8</h3></div></div></div><p>kivitendo setzt zwingend voraus, dass die Datenbank Unicode/UTF-8 als Encoding einsetzt. Bei aktuellen Serverinstallationen
4
	      braucht man hier meist nicht einzugreifen.</p><p>Das Encoding des Datenbankservers kann überprüft werden. Ist das Encoding der Datenbank "template1" "Unicode" bzw. "UTF-8", so
5
        braucht man nichts weiteres diesbezüglich unternehmen. Zum Testen:</p><pre class="programlisting">su postgres
9 6
echo '\l' | psql
10
exit </pre><p>
11

  
12
        Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
13
        UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
7
exit </pre><p>Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
8
        Unicode-Encoding anzulegen und diesen zu verwenden. Unter Debian und
14 9
        Ubuntu kann dies z.B. für PostgreSQL 8.2 mit dem folgenden Befehl
15 10
        getan werden:</p><pre class="programlisting">pg_createcluster --locale=de_DE.UTF-8 --encoding=UTF-8 8.2 clustername</pre><p>Die Datenbankversionsnummer muss an die tatsächlich verwendete
16
        Versionsnummer angepasst werden.</p><p>Unter anderen Distributionen gibt es ähnliche Methoden.</p><p>Wurde PostgreSQL nicht mit UTF-8 als Encoding initialisiert und
17
        ist ein Neuanlegen eines weiteren Clusters nicht möglich, so kann
18
        kivitendo mit ISO-8859-15 als Encoding betrieben werden.</p><p>Das Encoding einer Datenbank kann in <span class="command"><strong>psql</strong></span> mit
11
        Versionsnummer angepasst werden.</p><p>Unter anderen Distributionen gibt es ähnliche Methoden.</p><p>Das Encoding einer Datenbank kann in <span class="command"><strong>psql</strong></span> mit
19 12
        <code class="literal">\l</code> geprüft werden.</p></div><div class="sect2" title="2.5.2. Änderungen an Konfigurationsdateien"><div class="titlepage"><div><div><h3 class="title"><a name="%C3%84nderungen-an-Konfigurationsdateien"></a>2.5.2. Änderungen an Konfigurationsdateien</h3></div></div></div><p>In der Datei <code class="filename">postgresql.conf</code>, die je nach
20 13
        Distribution in verschiedenen Verzeichnissen liegen kann (z.B.
21 14
        <code class="filename">/var/lib/pgsql/data/</code> oder
doc/html/ch02s06.html
1 1
<html><head>
2 2
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3
   <title>2.6. Webserver-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s05.html" title="2.5. Anpassung der PostgreSQL-Konfiguration"><link rel="next" href="ch02s07.html" title="2.7. Der Task-Server"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.6. Webserver-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Zurück</a>&nbsp;</td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s07.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.6. Webserver-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Apache-Konfiguration"></a>2.6. Webserver-Konfiguration</h2></div></div></div><div class="sect2" title="2.6.1. Grundkonfiguration mittels CGI"><div class="titlepage"><div><div><h3 class="title"><a name="d0e690"></a>2.6.1. Grundkonfiguration mittels CGI</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Für einen deutlichen Performanceschub sorgt die Ausführung
3
   <title>2.6. Webserver-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s05.html" title="2.5. Anpassung der PostgreSQL-Konfiguration"><link rel="next" href="ch02s07.html" title="2.7. Der Task-Server"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.6. Webserver-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Zurück</a>&nbsp;</td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch02s07.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.6. Webserver-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Apache-Konfiguration"></a>2.6. Webserver-Konfiguration</h2></div></div></div><div class="sect2" title="2.6.1. Grundkonfiguration mittels CGI"><div class="titlepage"><div><div><h3 class="title"><a name="d0e689"></a>2.6.1. Grundkonfiguration mittels CGI</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Für einen deutlichen Performanceschub sorgt die Ausführung
4 4
          mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
5 5
          <a class="xref" href="ch02s06.html#Apache-Konfiguration.FCGI" title="2.6.2. Konfiguration für FastCGI/FCGI">Konfiguration für FastCGI/FCGI</a> beschrieben.</p></td></tr></table></div><p>Der Zugriff auf das Programmverzeichnis muss in der Apache
6 6
        Webserverkonfigurationsdatei <code class="literal">httpd.conf</code> eingestellt
doc/html/ch02s07.html
29 29
        Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
30 30
        einzubinden. Da das bei neueren Linux-Distributionen aber nicht
31 31
        zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
32
        anstelle eines symbolischen Links verwendet werden können.</p><div class="sect3" title="2.7.2.1. SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e888"></a>2.7.2.1. SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)</h4></div></div></div><p>Kopieren Sie die Datei
32
        anstelle eines symbolischen Links verwendet werden können.</p><div class="sect3" title="2.7.2.1. SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e887"></a>2.7.2.1. SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)</h4></div></div></div><p>Kopieren Sie die Datei
33 33
          <code class="filename">scripts/boot/system-v/kivitendo-server</code>
34 34
          nach <code class="filename">/etc/init.d/kivitendo-server</code>. Passen
35 35
          Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
......
37 37
          Boot-Prozess ein. Dies ist distributionsabhängig:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Debian-basierende Systeme:</p><pre class="programlisting">update-rc.d kivitendo-task-server defaults
38 38
# Nur bei Debian Squeeze und neuer:
39 39
insserv kivitendo-task-server</pre></li><li class="listitem"><p>Ältere OpenSUSE und ältere Fedora Core:</p><pre class="programlisting">chkconfig --add kivitendo-task-server</pre></li></ul></div><p>Danach kann der Task-Server mit dem folgenden Befehl gestartet
40
          werden:</p><pre class="programlisting">/etc/init.d/kivitendo-task-server start</pre></div><div class="sect3" title="2.7.2.2. Upstart-basierende Systeme (z.B. Ubuntu)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e917"></a>2.7.2.2. Upstart-basierende Systeme (z.B. Ubuntu)</h4></div></div></div><p>Kopieren Sie die Datei
40
          werden:</p><pre class="programlisting">/etc/init.d/kivitendo-task-server start</pre></div><div class="sect3" title="2.7.2.2. Upstart-basierende Systeme (z.B. Ubuntu)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e916"></a>2.7.2.2. Upstart-basierende Systeme (z.B. Ubuntu)</h4></div></div></div><p>Kopieren Sie die Datei
41 41
          <code class="filename">scripts/boot/upstart/kivitendo-task-server.conf</code>
42 42
          nach <code class="filename">/etc/init/kivitendo-task-server.conf</code>.
43 43
          Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
44 44
          <code class="literal">exec ....</code>).</p><p>Danach kann der Task-Server mit dem folgenden Befehl gestartet
45
          werden:</p><pre class="programlisting">service kivitendo-task-server start</pre></div><div class="sect3" title="2.7.2.3. systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e935"></a>2.7.2.3. systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)</h4></div></div></div><p>Verlinken Sie die Datei <code class="filename">scripts/boot/systemd/kivitendo-task-server.service</code> nach
45
          werden:</p><pre class="programlisting">service kivitendo-task-server start</pre></div><div class="sect3" title="2.7.2.3. systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e934"></a>2.7.2.3. systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)</h4></div></div></div><p>Verlinken Sie die Datei <code class="filename">scripts/boot/systemd/kivitendo-task-server.service</code> nach
46 46
          <code class="filename">/etc/systemd/system/</code>. Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
47 47
          <code class="literal">ExecStart=....</code> und <code class="literal">ExecStop=...</code>). Binden Sie das Script in den Boot-Prozess ein.
48 48
          </p><p>Alle hierzu benötigten Befehle sehen so aus:</p><pre class="programlisting">cd /var/www/kivitendo-erp/scripts/boot/systemd
doc/html/ch02s09.html
30 30
        allen denjenigen Gruppen, die zum Einen dem Mandanten zugeordnet sind und in denen der Benutzer zum Anderen Mitglied ist, </p><p>Die Reihenfolge, in der Datenbanken, Mandanten, Gruppen und Benutzer angelegt werden, kann im Prinzip beliebig gewählt
31 31
        werden. Die folgende Reihenfolge beinhaltet die wenigsten Arbeitsschritte:</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>Datenbank anlegen</p></li><li class="listitem"><p>Gruppen anlegen</p></li><li class="listitem"><p>Benutzer anlegen und Gruppen als Mitglied zuordnen</p></li><li class="listitem"><p>Mandanten anlegen und Gruppen sowie Benutzer zuweisen</p></li></ol></div></div><div class="sect2" title="2.9.3. Datenbanken anlegen"><div class="titlepage"><div><div><h3 class="title"><a name="Datenbanken-anlegen"></a>2.9.3. Datenbanken anlegen</h3></div></div></div><p>Zuerst muss eine Datenbank angelegt werden. Verwenden Sie für
32 32
        den Datenbankzugriff den vorhin angelegten Benutzer (in unseren
33
        Beispielen ist dies ‘<code class="literal">kivitendo</code>’).</p><p>Wenn Sie für die kivitendo-Installation nicht Unicode (UTF-8) sondern den europäischen Schriftsatz ISO-8859-15 benutzen
34
        wollen, so müssen Sie vor dem Anlegen der Datenbank in der Datei <code class="filename">config/kivitendo.conf</code> die Variable
35
        <code class="literal">dbcharset</code> im Abschnitt <code class="literal">system</code> auf den Wert ‘<code class="literal">ISO-8859-15</code>’ setzen.</p><p>Bitte beachten Sie, dass alle Datenbanken den selben Zeichensatz
36
        verwenden müssen, da diese Einstellungen momentan global in kivitendo
37
        vorgenommen wird und nicht nach Datenbank unterschieden werden kann.
38
        Auch die Authentifizierungsdatenbank muss mit diesem Zeichensatz
39
        angelegt worden sein.</p></div><div class="sect2" title="2.9.4. Gruppen anlegen"><div class="titlepage"><div><div><h3 class="title"><a name="Gruppen-anlegen"></a>2.9.4. Gruppen anlegen</h3></div></div></div><p>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
33
        Beispielen ist dies ‘<code class="literal">kivitendo</code>’).</p></div><div class="sect2" title="2.9.4. Gruppen anlegen"><div class="titlepage"><div><div><h3 class="title"><a name="Gruppen-anlegen"></a>2.9.4. Gruppen anlegen</h3></div></div></div><p>Eine Gruppe wird in der Gruppenverwaltung angelegt. Ihr muss ein
40 34
        Name gegeben werden, eine Beschreibung ist hingegen optional. Nach dem
41 35
        Anlegen können Sie die verschiedenen Bereiche wählen, auf die
42 36
        Mitglieder dieser Gruppe Zugriff haben sollen.</p><p>Benutzergruppen werden zwar in der Authentifizierungsdatenbank gespeichert, gelten aber nicht automatisch für alle
doc/html/ch02s12.html
8 8
      <code class="filename">config/kivitendo.conf</code> die Variable
9 9
      <code class="literal">opendocument</code> im Abschnitt
10 10
      <code class="literal">print_templates</code> auf ‘<code class="literal">1</code>’ stehen.
11
      Dieses ist die Standardeinstellung.</p><p>Weiterhin muss in der Datei
12
      <code class="filename">config/kivitendo.conf</code> die Variable
13
      <code class="literal">dbcharset</code> im Abschnitt <code class="literal">system</code> auf
14
      die Zeichenkodierung gesetzt werden, die auch bei der Speicherung der
15
      Daten in der Datenbank verwendet wird. Diese ist in den meisten Fällen
16
      "UTF-8".</p><p>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
11
      Dieses ist die Standardeinstellung.</p><p>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
17 12
      weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
18 13
      OpenOffice.org benötigt. Soll dieses Feature genutzt werden, so muss
19 14
      neben OpenOffice.org ab Version 2 auch der “X virtual frame buffer”
doc/html/ch03s02.html
560 560
                        <code class="varname">invdate</code>
561 561
                     </span></dt><dd><p>Rechnungsdatum</p></dd><dt><span class="term">
562 562
                        <code class="varname">invnumber</code>
563
                     </span></dt><dd><p>Rechnungsnummer</p></dd></dl></div></div></div><div class="sect2" title="3.2.10. Variablen in anderen Vorlagen"><div class="titlepage"><div><div><h3 class="title"><a name="dokumentenvorlagen-und-variablen.andere-vorlagen"></a>3.2.10. Variablen in anderen Vorlagen</h3></div></div></div><div class="sect3" title="3.2.10.1. Einführung"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4674"></a>3.2.10.1. Einführung</h4></div></div></div><p>Die Variablen in anderen Vorlagen sind ähnlich wie in der
563
                     </span></dt><dd><p>Rechnungsnummer</p></dd></dl></div></div></div><div class="sect2" title="3.2.10. Variablen in anderen Vorlagen"><div class="titlepage"><div><div><h3 class="title"><a name="dokumentenvorlagen-und-variablen.andere-vorlagen"></a>3.2.10. Variablen in anderen Vorlagen</h3></div></div></div><div class="sect3" title="3.2.10.1. Einführung"><div class="titlepage"><div><div><h4 class="title"><a name="d0e4646"></a>3.2.10.1. Einführung</h4></div></div></div><p>Die Variablen in anderen Vorlagen sind ähnlich wie in der
564 564
          Rechnung. Allerdings heißen die Variablen, die mit
565 565
          <code class="varname">inv</code> beginnen, jetzt anders. Bei den Angeboten
566 566
          fangen sie mit <code class="varname">quo</code> für "quotation" an:
doc/html/ch04.html
1 1
<html><head>
2 2
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3
   <title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s03.html" title="3.3. Excel-Vorlagen"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Zurück</a>&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e5281"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5287"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
3
   <title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s03.html" title="3.3. Excel-Vorlagen"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Zurück</a>&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e5253"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5259"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
4 4
        "main", der von überall erreichbar ist. Darüber hinaus sind bareword
5 5
        globs global und die meisten speziellen Variablen sind...
6 6
        speziell.</p><p>Daraus ergeben sich folgende Formen:</p><div class="variablelist"><dl><dt><span class="term">
......
25 25
              <code class="varname">$PACKAGE::form</code>.</p></dd><dt><span class="term">
26 26
                     <code class="literal">local $form</code>
27 27
                  </span></dt><dd><p>Alle Änderungen an <code class="varname">$form</code> werden am Ende
28
              des scopes zurückgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5388"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
28
              des scopes zurückgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5360"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
29 29
               <span class="productname">SQL-Ledger</span>™ hat fast alles im globalen
30 30
        namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
31 31
        Unter <span class="productname">FCGI</span>™ müssen diese Sachen aber wieder
......
39 39
        dies hat, seit der Einführung, u.a. schon so manche langwierige
40 40
        Bug-Suche verkürzt. Da globale Variablen aber implizit mit Package
41 41
        angegeben werden, werden die nicht geprüft, und somit kann sich
42
        schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5421"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
42
        schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5393"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
43 43
        globale Variablen, die kanonisch sind, d.h. sie haben bestimmte
44 44
        vorgegebenen Eigenschaften, und alles andere sollte anderweitig
45 45
        umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
......
62 62
                     <code class="varname">$::request</code>
63 63
                  </p></li></ul></div><p>Damit diese nicht erneut als Müllhalde missbraucht werden, im
64 64
        Folgenden eine kurze Erläuterung der bestimmten vorgegebenen
65
        Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5485"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
65
        Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5457"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
66 66
              "<code class="classname">Form</code>"</p></li><li class="listitem"><p>Wird nach jedem Request gelöscht</p></li><li class="listitem"><p>Muss auch in Tests und Konsolenscripts vorhanden
67 67
              sein.</p></li><li class="listitem"><p>Enthält am Anfang eines Requests die Requestparameter vom
68 68
              User</p></li><li class="listitem"><p>Kann zwar intern über Requestgrenzen ein Datenbankhandle
......
110 110
  push @{ $form-&gt;{TEMPLATE_ARRAYS}{number} },          $form-&gt;{"partnumber_$i"};
111 111
  push @{ $form-&gt;{TEMPLATE_ARRAYS}{description} },     $form-&gt;{"description_$i"};
112 112
  # ...
113
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5569"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird spätestens benötigt wenn auf die Datenbank
113
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5541"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird spätestens benötigt wenn auf die Datenbank
114 114
              zugegriffen wird</p></li><li class="listitem"><p>Wird bei jedem Request neu erstellt.</p></li><li class="listitem"><p>Enthält die Userdaten des aktuellen Logins</p></li><li class="listitem"><p>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
115 115
              extern serialisiert werden, weil da auch der Datenbankzugriff
116 116
              für diesen user drinsteht.</p></li><li class="listitem"><p>Enthält unter anderem Listenbegrenzung vclimit,
......
122 122
          überwiegend die Daten, die sich unter <span class="guimenu">Programm</span>
123 123
          -&gt; <span class="guimenuitem">Einstellungen</span> befinden, bzw. die
124 124
          Informationen über den Benutzer die über die
125
          Administrator-Schnittstelle eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5608"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch für Tests und Scripte immer verfügbar
125
          Administrator-Schnittstelle eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5580"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch für Tests und Scripte immer verfügbar
126 126
              sein.</p></li><li class="listitem"><p>Cached intern über Requestgrenzen hinweg benutzte
127 127
              Locales</p></li></ul></div><p>Lokalisierung für den aktuellen User. Alle Übersetzungen,
128
          Zahlen- und Datumsformatierungen laufen über dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5626"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verfügbar sein, in nahezu allen
128
          Zahlen- und Datumsformatierungen laufen über dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5598"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verfügbar sein, in nahezu allen
129 129
              Funktionen</p></li></ul></div><p>
130 130
                  <code class="varname">$::lxdebug</code> stellt Debuggingfunktionen
131 131
          bereit, wie "<code class="function">enter_sub</code>" und
......
135 135
          "<code class="function">message</code>" und "<code class="function">dump</code>" mit
136 136
          denen man flott Informationen ins Log (tmp/kivitendo-debug.log)
137 137
          packen kann.</p><p>Beispielsweise so:</p><pre class="programlisting">$main::lxdebug-&gt;message(0, 'Meine Konfig:' . Dumper (%::myconfig));
138
$main::lxdebug-&gt;message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form-&gt;{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5663"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
138
$main::lxdebug-&gt;message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form-&gt;{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5635"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
139 139
                  <code class="varname">$::auth</code> stellt Funktionen bereit um die
140 140
          Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
141 141
          vom aktuellen User abhängen wird das Objekt aus
142 142
          Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem
143 143
          Request kurz resettet.</p><p>Dieses Objekt kapselt auch den gerade aktiven Mandanten. Dessen Einstellungen können über
144 144
          <code class="literal">$::auth-&gt;client</code> abgefragt werden; Rückgabewert ist ein Hash mit den Werten aus der Tabelle
145
          <code class="literal">auth.clients</code>.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5692"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
145
          <code class="literal">auth.clients</code>.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5664"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
146 146
              "<code class="classname">SL::LxOfficeConf</code>"</p></li><li class="listitem"><p>Global gecached</p></li><li class="listitem"><p>Repräsentation der
147 147
              <code class="filename">config/kivitendo.conf[.default]</code>-Dateien</p></li></ul></div><p>Globale Konfiguration. Configdateien werden zum Start gelesen
148 148
          und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass
......
152 152
file = /tmp/kivitendo-debug.log</pre><p>ist der Key <code class="varname">file</code> im Programm als
153 153
          <code class="varname">$::lx_office_conf-&gt;{debug}{file}</code>
154 154
          erreichbar.</p><div class="warning" title="Warnung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Warnung]" src="system/docbook-xsl/images/warning.png"></td><th align="left">Warnung</th></tr><tr><td align="left" valign="top"><p>Zugriff auf die Konfiguration erfolgt im Moment über
155
            Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5728"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
155
            Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5700"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
156 156
              "<code class="classname">SL::InstanceConfiguration</code>"</p></li><li class="listitem"><p>wird pro Request neu erstellt</p></li></ul></div><p>Funktioniert wie <code class="varname">$::lx_office_conf</code>,
157 157
          speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
158 158
          ist hier eine Mandantendatenbank. Beispielsweise überprüft
159 159
          </p><pre class="programlisting">$::instance_conf-&gt;get_inventory_system eq 'perpetual'</pre><p>
160
          ob die berüchtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5749"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
160
          ob die berüchtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5721"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
161 161
              "<code class="varname">SL::Dispatcher</code>"</p></li><li class="listitem"><p>wird pro Serverprozess erstellt.</p></li><li class="listitem"><p>enthält Informationen über die technische Verbindung zum
162 162
              Server</p></li></ul></div><p>Der dritte Punkt ist auch der einzige Grund warum das Objekt
163 163
          global gespeichert wird. Wird vermutlich irgendwann in einem anderen
164
          Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5767"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl später Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
164
          Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5739"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl später Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
165 165
                  <code class="varname">$::request</code> ist ein generischer Platz um
166 166
          Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
167 167
          at a distance benutzt werden, sondern um lokales memoizing zu
......
174 174
              <code class="varname">$::request</code>
175 175
                     </p></li><li class="listitem"><p>Muss ich von anderen Teilen des Programms lesend drauf
176 176
              zugreifen? Dann <code class="varname">$::request</code>, aber Zugriff über
177
              Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5809"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
178
        entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5814"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil cookie Methoden nicht als
177
              Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e5781"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
178
        entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5786"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil cookie Methoden nicht als
179 179
              Klassenfunktionen funktionieren</p></li><li class="listitem"><p>Aufruf als Klasse erzeugt Dummyobjekt was im
180 180
              Klassennamespace gehalten wird und über Requestgrenzen
181 181
              leaked</p></li><li class="listitem"><p>liegt jetzt unter
182 182
              <code class="varname">$::request-&gt;{cgi}</code>
183
                     </p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5830"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil einige Funktionen in Schleifen zum Teil
183
                     </p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5802"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil einige Funktionen in Schleifen zum Teil
184 184
              ein paar hundert mal pro Request eine Liste der Einheiten
185 185
              brauchen, und de als Parameter durch einen Riesenstack von
186 186
              Funktionen geschleift werden müssten.</p></li><li class="listitem"><p>Liegt jetzt unter
187 187
              <code class="varname">$::request-&gt;{cache}{all_units}</code>
188 188
                     </p></li><li class="listitem"><p>Wird nur in
189 189
              <code class="function">AM-&gt;retrieve_all_units()</code> gesetzt oder
190
              gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5849"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
190
              gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5821"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
191 191
              abzufangen.</p></li><li class="listitem"><p>Wurde entfernt, weil callsub nur einen Bruchteil der
192 192
              möglichen Rekursioenen darstellt, und da nie welche
193 193
              auftreten.</p></li><li class="listitem"><p>komplette recursion protection wurde entfernt.</p></li></ul></div></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Zurück</a>&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s02.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">3.3. Excel-Vorlagen&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top">&nbsp;4.2. Entwicklung unter FastCGI</td></tr></table></div></body></html>
doc/html/ch04s02.html
34 34
        4GB Arbeitsspeicher und Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0
35 35
        sind es je nach Menge der definierten Variablen 1-2s. Ab der
36 36
        Moose/Rose::DB Version sind es 5-6s.</p><p>Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in
37
        den kritischen Pfaden, unter 0,15 sonst.</p></div><div class="sect2" title="4.2.5. Bekannte Probleme"><div class="titlepage"><div><div><h3 class="title"><a name="devel.fcgi.known-issues"></a>4.2.5. Bekannte Probleme</h3></div></div></div><div class="sect3" title="4.2.5.1. Encoding Awareness"><div class="titlepage"><div><div><h4 class="title"><a name="devel.fcgi.known-issues.encoding"></a>4.2.5.1. Encoding Awareness</h4></div></div></div><p>UTF-8 kodierte Installationen sind sehr anfällig gegen
38
          fehlerhfate Encodings unter FCGI. latin9 Installationen behandeln
39
          falsch kodierte Zeichen eher unwissend, und geben sie einfach
40
          weiter. UTF-8 verweigert bei fehlerhaften Programmpfaden kurzerhand
41
          das Ausliefern. Es wird noch daran gearbeitet, alle Fehler da zu
42
          beseitigen.</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04.html">Zurück</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch04.html">Nach oben</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s03.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">Kapitel 4. Entwicklerdokumentation&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top">&nbsp;4.3. SQL-Upgradedateien</td></tr></table></div></body></html>
37
        den kritischen Pfaden, unter 0,15 sonst.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04.html">Zurück</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch04.html">Nach oben</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s03.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">Kapitel 4. Entwicklerdokumentation&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top">&nbsp;4.3. SQL-Upgradedateien</td></tr></table></div></body></html>
doc/html/ch04s04.html
5 5
        are built. Currently the only language fully supported is German, and
6 6
        since most of the internal messages are held in English the English
7 7
        version is usable too.</p><p>A stub version of French is included but not functunal at this
8
        point.</p></div><div class="sect2" title="4.4.2. File structure"><div class="titlepage"><div><div><h3 class="title"><a name="translations-languages.file-structure"></a>4.4.2. File structure</h3></div></div></div><p>The structure of locales in kivitendo is:</p><pre class="programlisting">kivitendo/locale/&lt;langcode&gt;/</pre><p>where &lt;langcode&gt; stands for an abbreviation of the
8
        point.</p></div><div class="sect2" title="4.4.2. Character set"><div class="titlepage"><div><div><h3 class="title"><a name="translations-languages.character-set"></a>4.4.2. Character set</h3></div></div></div><p>All files included in a language pack must use UTF-8 as their encoding.</p></div><div class="sect2" title="4.4.3. File structure"><div class="titlepage"><div><div><h3 class="title"><a name="translations-languages.file-structure"></a>4.4.3. File structure</h3></div></div></div><p>The structure of locales in kivitendo is:</p><pre class="programlisting">kivitendo/locale/&lt;langcode&gt;/</pre><p>where &lt;langcode&gt; stands for an abbreviation of the
9 9
        language package. The builtin packages use two letter <a class="ulink" href="http://en.wikipedia.org/wiki/ISO_639-1" target="_top">ISO 639-1</a> codes,
10 10
        but the actual name is not relevant for the program and can easily be
11 11
        extended to <a class="ulink" href="http://en.wikipedia.org/wiki/IETF_language_tag" target="_top">IETF language
......
14 14
        recognized:</p><div class="variablelist"><dl><dt><span class="term">LANGUAGE</span></dt><dd><p>This file is mandatory.</p><p>The <code class="filename">LANGUAGE</code> file contains the self
15 15
              descripted name of the language. It should contain a native
16 16
              representation first, and in parenthesis an english translation
17
              after that. Example:</p><pre class="programlisting">Deutsch (German)</pre></dd><dt><span class="term">charset</span></dt><dd><p>This file should be present.</p><p>The <code class="filename">charset</code> file describes which
18
              charset a language package is written in and applies to all
19
              other language files in the package. It is possible to write
20
              some language packages without an explicit charset, but it is
21
              still strongly recommended. You'll never know in what
22
              environment your language package will be used, and neither
23
              UTF-8 nor Latin1 are guaranteed.</p><p>The whole content of this file is a string that can be
24
              recognized as a valid charset encoding. Example:</p><pre class="programlisting">UTF-8</pre></dd><dt><span class="term">all</span></dt><dd><p>This file is mandatory.</p><p>The central translation file. It is essentially an inline
17
              after that. Example:</p><pre class="programlisting">Deutsch (German)</pre></dd><dt><span class="term">all</span></dt><dd><p>This file is mandatory.</p><p>The central translation file. It is essentially an inline
25 18
              Perl script autogenerated by <span class="command"><strong>locales.pl</strong></span>. To
26 19
              generate it, generate the directory and the two files mentioned
27 20
              above, and execute the following command:</p><pre class="programlisting">scripts/locales.pl &lt;langcode&gt;</pre><p>Otherwise you can simply copy one of the other languages.
doc/html/index.html
1 1
<html><head>
2 2
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3
   <title>kivitendo 3.0.0: Installation, Konfiguration, Entwicklung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="next" href="ch01.html" title="Kapitel 1. Aktuelle Hinweise"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">kivitendo 3.0.0: Installation, Konfiguration, Entwicklung</th></tr><tr><td width="20%" align="left">&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01.html">Weiter</a></td></tr></table><hr></div><div lang="de" class="book" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><div class="titlepage"><div><div><h1 class="title"><a name="kivitendo-documentation"></a>kivitendo 3.0.0: Installation, Konfiguration, Entwicklung</h1></div></div><hr></div><div class="toc"><p><b>Inhaltsverzeichnis</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Aktuelle Hinweise</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Installation und Grundkonfiguration</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#Installation-%C3%9Cbersicht">2.1. Übersicht</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">2.2. Benötigte Software und Pakete</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#Betriebssystem">2.2.1. Betriebssystem</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#Pakete">2.2.2. Benötigte Perl-Pakete installieren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">2.3. Manuelle Installation des Programmpaketes</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">2.4. kivitendo-Konfigurationsdatei</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s04.html#config.config-file.introduction">2.4.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.sections-parameters">2.4.2. Abschnitte und Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.prior-versions">2.4.3. Versionen vor 2.6.3</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s05.html">2.5. Anpassung der PostgreSQL-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s05.html#Zeichens%C3%A4tze-die-Verwendung-von-UTF-8">2.5.1. Zeichensätze/die Verwendung von UTF-8</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#%C3%84nderungen-an-Konfigurationsdateien">2.5.2. Änderungen an Konfigurationsdateien</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-servergespeicherte-Prozeduren">2.5.3. Erweiterung für servergespeicherte Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Datenbankbenutzer-anlegen">2.5.4. Datenbankbenutzer anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s06.html">2.6. Webserver-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s06.html#d0e690">2.6.1. Grundkonfiguration mittels CGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#Apache-Konfiguration.FCGI">2.6.2. Konfiguration für FastCGI/FCGI</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s07.html">2.7. Der Task-Server</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-des-Task-Servers">2.7.1. Verfügbare und notwendige Konfigurationsoptionen</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Einbinden-in-den-Boot-Prozess">2.7.2. Automatisches Starten des Task-Servers beim Booten</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle">2.7.3. Wie der Task-Server gestartet und beendet wird</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle2">2.7.4. Task-Server mit mehreren Mandanten</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s08.html">2.8. Benutzerauthentifizierung und Administratorpasswort</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s08.html#Grundlagen-zur-Benutzerauthentifizierung">2.8.1. Grundlagen zur Benutzerauthentifizierung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Administratorpasswort">2.8.2. Administratorpasswort</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Authentifizierungsdatenbank">2.8.3. Authentifizierungsdatenbank</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Passwort%C3%BCberpr%C3%BCfung">2.8.4. Passwortüberprüfung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Name-des-Session-Cookies">2.8.5. Name des Session-Cookies</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Anlegen-der-Authentifizierungsdatenbank">2.8.6. Anlegen der Authentifizierungsdatenbank</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s09.html">2.9. Mandanten-, Benutzer- und Gruppenverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s09.html#Zusammenh%C3%A4nge">2.9.1. Zusammenhänge</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-Benutzer-Gruppen">2.9.2. Mandanten, Benutzer und Gruppen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Datenbanken-anlegen">2.9.3. Datenbanken anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Gruppen-anlegen">2.9.4. Gruppen anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Benutzer-anlegen">2.9.5. Benutzer anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-anlegen">2.9.6. Mandanten anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s10.html">2.10. E-Mail-Versand aus kivitendo heraus</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s10.html#config.sending-email.sendmail">2.10.1. Versand über lokalen E-Mail-Server</a></span></dt><dt><span class="sect2"><a href="ch02s10.html#config.sending-email.smtp">2.10.2. Versand über einen SMTP-Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s11.html">2.11. Drucken mit kivitendo</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s11.html#Vorlagenverzeichnis-anlegen">2.11.1. Vorlagenverzeichnis anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#Vorlagen-Standard">2.11.2. Standard</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#f-tex">2.11.3. f-tex</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#Vorlagen-RB">2.11.4. RB</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#allgemeine-hinweise-zu-latex">2.11.5. Allgemeine Hinweise zu LaTeX Vorlagen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s12.html">2.12. OpenDocument-Vorlagen</a></span></dt><dt><span class="sect1"><a href="ch02s13.html">2.13. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
3
   <title>kivitendo 3.0.0: Installation, Konfiguration, Entwicklung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><link rel="next" href="ch01.html" title="Kapitel 1. Aktuelle Hinweise"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">kivitendo 3.0.0: Installation, Konfiguration, Entwicklung</th></tr><tr><td width="20%" align="left">&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch01.html">Weiter</a></td></tr></table><hr></div><div lang="de" class="book" title="kivitendo 3.0.0: Installation, Konfiguration, Entwicklung"><div class="titlepage"><div><div><h1 class="title"><a name="kivitendo-documentation"></a>kivitendo 3.0.0: Installation, Konfiguration, Entwicklung</h1></div></div><hr></div><div class="toc"><p><b>Inhaltsverzeichnis</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Aktuelle Hinweise</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Installation und Grundkonfiguration</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#Installation-%C3%9Cbersicht">2.1. Übersicht</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">2.2. Benötigte Software und Pakete</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#Betriebssystem">2.2.1. Betriebssystem</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#Pakete">2.2.2. Benötigte Perl-Pakete installieren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">2.3. Manuelle Installation des Programmpaketes</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">2.4. kivitendo-Konfigurationsdatei</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s04.html#config.config-file.introduction">2.4.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.sections-parameters">2.4.2. Abschnitte und Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.prior-versions">2.4.3. Versionen vor 2.6.3</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s05.html">2.5. Anpassung der PostgreSQL-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s05.html#Zeichens%C3%A4tze-die-Verwendung-von-UTF-8">2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#%C3%84nderungen-an-Konfigurationsdateien">2.5.2. Änderungen an Konfigurationsdateien</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-servergespeicherte-Prozeduren">2.5.3. Erweiterung für servergespeicherte Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Datenbankbenutzer-anlegen">2.5.4. Datenbankbenutzer anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s06.html">2.6. Webserver-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s06.html#d0e689">2.6.1. Grundkonfiguration mittels CGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#Apache-Konfiguration.FCGI">2.6.2. Konfiguration für FastCGI/FCGI</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s07.html">2.7. Der Task-Server</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-des-Task-Servers">2.7.1. Verfügbare und notwendige Konfigurationsoptionen</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Einbinden-in-den-Boot-Prozess">2.7.2. Automatisches Starten des Task-Servers beim Booten</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle">2.7.3. Wie der Task-Server gestartet und beendet wird</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle2">2.7.4. Task-Server mit mehreren Mandanten</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s08.html">2.8. Benutzerauthentifizierung und Administratorpasswort</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s08.html#Grundlagen-zur-Benutzerauthentifizierung">2.8.1. Grundlagen zur Benutzerauthentifizierung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Administratorpasswort">2.8.2. Administratorpasswort</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Authentifizierungsdatenbank">2.8.3. Authentifizierungsdatenbank</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Passwort%C3%BCberpr%C3%BCfung">2.8.4. Passwortüberprüfung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Name-des-Session-Cookies">2.8.5. Name des Session-Cookies</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Anlegen-der-Authentifizierungsdatenbank">2.8.6. Anlegen der Authentifizierungsdatenbank</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s09.html">2.9. Mandanten-, Benutzer- und Gruppenverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s09.html#Zusammenh%C3%A4nge">2.9.1. Zusammenhänge</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-Benutzer-Gruppen">2.9.2. Mandanten, Benutzer und Gruppen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Datenbanken-anlegen">2.9.3. Datenbanken anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Gruppen-anlegen">2.9.4. Gruppen anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Benutzer-anlegen">2.9.5. Benutzer anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-anlegen">2.9.6. Mandanten anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s10.html">2.10. E-Mail-Versand aus kivitendo heraus</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s10.html#config.sending-email.sendmail">2.10.1. Versand über lokalen E-Mail-Server</a></span></dt><dt><span class="sect2"><a href="ch02s10.html#config.sending-email.smtp">2.10.2. Versand über einen SMTP-Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s11.html">2.11. Drucken mit kivitendo</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s11.html#Vorlagenverzeichnis-anlegen">2.11.1. Vorlagenverzeichnis anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#Vorlagen-Standard">2.11.2. Standard</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#f-tex">2.11.3. f-tex</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#Vorlagen-RB">2.11.4. RB</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#allgemeine-hinweise-zu-latex">2.11.5. Allgemeine Hinweise zu LaTeX Vorlagen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s12.html">2.12. OpenDocument-Vorlagen</a></span></dt><dt><span class="sect1"><a href="ch02s13.html">2.13. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
4 4
      EUR</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s13.html#config.eur.introduction">2.13.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s13.html#config.eur.parameters">2.13.2. Konfigurationsparameter</a></span></dt><dt><span class="sect2"><a href="ch02s13.html#config.eur.setting-parameters">2.13.3. Festlegen der Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s13.html#config.eur.inventory-system-perpetual">2.13.4. Bemerkungen zu Bestandsmethode</a></span></dt><dt><span class="sect2"><a href="ch02s13.html#config.eur.knonw-issues">2.13.5. Bekannte Probleme</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s14.html">2.14. SKR04 19% Umstellung für innergemeinschaftlichen Erwerb</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s14.html#config.skr04-update-3804.introduction">2.14.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s14.html#config.skr04-update-3804.create-chart">2.14.2. Konto 3804 manuell anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s15.html">2.15. Einstellungen pro Mandant</a></span></dt><dt><span class="sect1"><a href="ch02s16.html">2.16. kivitendo ERP verwenden</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Features und Funktionen</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#features.periodic-invoices">3.1. Wiederkehrende Rechnungen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.introduction">3.1.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.configuration">3.1.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.variables">3.1.3. Spezielle Variablen</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.reports">3.1.4. Auflisten</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.task-server">3.1.5. Erzeugung der eigentlichen Rechnungen</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.create-for-current-month">3.1.6. Erste Rechnung für aktuellen Monat erstellen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s02.html">3.2. Dokumentenvorlagen und verfügbare Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.einf%C3%BChrung">3.2.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.variablen-ausgeben">3.2.2. Variablen ausgeben</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">3.2.3. Verwendung in Druckbefehlen</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.tag-style">3.2.4. Anfang und Ende der Tags verändern</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.zuordnung-dateinamen">3.2.5. Zuordnung von den Dateinamen zu den Funktionen</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.dateinamen-erweitert">3.2.6. Sprache, Drucker und E-Mail</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.allgemeine-variablen">3.2.7. Allgemeine Variablen, die in allen Vorlagen vorhanden
5 5
        sind</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.invoice">3.2.8. Variablen in Rechnungen</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.dunning">3.2.9. Variablen in Mahnungen und Rechnungen über Mahngebühren</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.andere-vorlagen">3.2.10. Variablen in anderen Vorlagen</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.bloecke">3.2.11. Blöcke, bedingte Anweisungen und Schleifen</a></span></dt><dt><span class="sect2"><a href="ch03s02.html#dokumentenvorlagen-und-variablen.markup">3.2.12. Markup-Code zur Textformatierung innerhalb von
6
        Formularen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">3.3. Excel-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#excel-templates.summary">3.3.1. Zusammenfassung</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#excel-templates.usage">3.3.2. Bedienung</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#excel-templates.syntax">3.3.3. Variablensyntax</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#excel-templates.limitations">3.3.4. Einschränkungen</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Entwicklerdokumentation</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#devel.globals">4.1. Globale Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04.html#d0e5287">4.1.1. Wie sehen globale Variablen in Perl aus?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e5388">4.1.2. Warum sind globale Variablen ein Problem?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e5421">4.1.3. Kanonische globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e5809">4.1.4. Ehemalige globale Variablen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s02.html">4.2. Entwicklung unter FastCGI</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.general">4.2.1. Allgemeines</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.exiting">4.2.2. Programmende und Ausnahmen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.globals">4.2.3. Globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.performance">4.2.4. Performance und Statistiken</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.known-issues">4.2.5. Bekannte Probleme</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s03.html">4.3. SQL-Upgradedateien</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.introduction">4.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format">4.3.2. Format der Kontrollinformationen</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format-perl-files">4.3.3. Format von in Perl geschriebenen Datenbankupgradescripten</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.dbupgrade-tool">4.3.4. Hilfsscript dbupgrade2_tool.pl</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s04.html">4.4. Translations and languages</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s04.html#translations-languages.introduction">4.4.1. Introduction</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.file-structure">4.4.2. File structure</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s05.html">4.5. Die kivitendo-Test-Suite</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.intro">4.5.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.prerequisites">4.5.2. Voraussetzungen</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.execution">4.5.3. 
6
        Formularen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">3.3. Excel-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#excel-templates.summary">3.3.1. Zusammenfassung</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#excel-templates.usage">3.3.2. Bedienung</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#excel-templates.syntax">3.3.3. Variablensyntax</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#excel-templates.limitations">3.3.4. Einschränkungen</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Entwicklerdokumentation</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#devel.globals">4.1. Globale Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04.html#d0e5259">4.1.1. Wie sehen globale Variablen in Perl aus?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e5360">4.1.2. Warum sind globale Variablen ein Problem?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e5393">4.1.3. Kanonische globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e5781">4.1.4. Ehemalige globale Variablen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s02.html">4.2. Entwicklung unter FastCGI</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.general">4.2.1. Allgemeines</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.exiting">4.2.2. Programmende und Ausnahmen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.globals">4.2.3. Globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.performance">4.2.4. Performance und Statistiken</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s03.html">4.3. SQL-Upgradedateien</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.introduction">4.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format">4.3.2. Format der Kontrollinformationen</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format-perl-files">4.3.3. Format von in Perl geschriebenen Datenbankupgradescripten</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.dbupgrade-tool">4.3.4. Hilfsscript dbupgrade2_tool.pl</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s04.html">4.4. Translations and languages</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s04.html#translations-languages.introduction">4.4.1. Introduction</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.character-set">4.4.2. Character set</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.file-structure">4.4.3. File structure</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s05.html">4.5. Die kivitendo-Test-Suite</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.intro">4.5.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.prerequisites">4.5.2. Voraussetzungen</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.execution">4.5.3. 
7 7
          Existierende Tests ausführen
8 8
        </a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.meaning_of_scripts">4.5.4. 
9 9
          Bedeutung der verschiedenen Test-Scripte
locale/de/all
1 1
#!/usr/bin/perl
2 2
# -*- coding: utf-8; -*-
3
# vim: fenc=UTF-8
3
# vim: fenc=utf-8
4 4

  
5 5
use utf8;
6 6

  
......
2457 2457
  'You should create a backup of the database before proceeding because the backup might not be reversible.' => 'Sie sollten eine Sicherungskopie der Datenbank erstellen, bevor Sie fortfahren, da die Aktualisierung unter Umständen nicht umkehrbar ist.',
2458 2458
  'You\'re not editing a file.' => 'Sie bearbeiten momentan keine Datei.',
2459 2459
  'You\'ve already chosen the following limitations:' => 'Sie haben bereits die folgenden Einschr&auml;nkungen vorgenommen:',
2460
  'Your PostgreSQL installationen uses UTF-8 as its encoding. Therefore you have to configure kivitendo to use UTF-8 as well.' => 'Ihre PostgreSQL-Installation benutzt UTF-8 als Zeichensatz. Sie müssen deshalb kivitendo so konfigurieren, dass es ebenfalls UTF-8 als Zeichensatz benutzt.',
2460
  'Your PostgreSQL installationen does not use Unicode as its encoding. This is not supported anymore.' => 'Ihre PostgreSQL-Installation benutzt ein anderes Encoding als Unicode. Dies wird nicht mehr unterstützt.',
2461 2461
  'Your TODO list'              => 'Ihre Aufgabenliste',
2462 2462
  'Your account number'         => 'Ihre Kontonummer',
2463 2463
  'Your bank'                   => 'Der Name Ihrer Bank',
locale/de/charset
1
UTF-8
locale/en/charset
1
UTF-8
scripts/dbupgrade2_tool.pl
349 349
    exit 0;
350 350
  }
351 351

  
352
  my $db_charset = $::lx_office_conf{system}->{dbcharset};
353
  $db_charset ||= Common::DEFAULT_CHARSET();
354

  
355 352
  foreach my $control (@upgradescripts) {
356 353
    $control->{file} =~ /\.(sql|pl)$/;
357 354
    my $file_type = $1;
......
360 357
    print "Applying upgrade $control->{file}\n";
361 358

  
362 359
    if ($file_type eq "sql") {
363
      $dbupgrader->process_query($dbh, "sql/Pg-upgrade2/$control->{file}", $control, $db_charset);
360
      $dbupgrader->process_query($dbh, "sql/Pg-upgrade2/$control->{file}", $control);
364 361
    } else {
365
      $dbupgrader->process_perl_script($dbh, "sql/Pg-upgrade2/$control->{file}", $control, $db_charset);
362
      $dbupgrader->process_perl_script($dbh, "sql/Pg-upgrade2/$control->{file}", $control);
366 363
    }
367 364
  }
368 365

  
scripts/locales.pl
120 120
  unlink "$locales_dir/lost";
121 121
}
122 122

  
123
my $charset = slurp("$locales_dir/charset") || 'utf-8';
124
chomp $charset;
125

  
126 123
my %old_texts = %{ $self->{texts} || {} };
127 124

  
128 125
handle_file(@{ $_ })       for @progfiles;
......
717 714

  
718 715
  open my $fh, '>:encoding(utf8)', $file or die "$! : $file";
719 716

  
720
  $charset =~ s/\r?\n//g;
721
  my $emacs_charset = lc $charset;
722

  
723
  print $fh "#!/usr/bin/perl\n# -*- coding: $emacs_charset; -*-\n# vim: fenc=$charset\n\nuse utf8;\n\n";
717
  print $fh "#!/usr/bin/perl\n# -*- coding: utf-8; -*-\n# vim: fenc=utf-8\n\nuse utf8;\n\n";
724 718
  print $fh $header, "\n" if $header;
725 719
  print $fh "$data_name = $delim[0]\n" if $data_name;
726 720

  

Auch abrufbar als: Unified diff